Compare commits

...
282 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
Edson Passos 51f82ba988 New Crowdin updates (#316) 2022-06-08 19:57:45 -03:00
Edson Passos 327bcf3980 v2.17.0 2022-06-08 19:45:19 -03:00
Edson Passos 5c3bb558cf feat(lang): new Crowdin updates (#295) 2022-06-08 19:27:22 -03:00
RoinujNosde c726e2bb3c feature: adds coordinates to Land 2022-06-07 14:27:17 -03:00
Edson Passos af6c72eda9 fix: war end via request 2022-06-05 12:53:56 -03:00
RoinujNosde d48c17f1f9 feature: adds permission FEE_BYPASS to ranks
removes simpleclans.member.bypass-fee
2022-05-31 19:14:00 -03:00
RoinujNosde 93eef5c727 fix: catches exceptions when creating Discord channels 2022-05-22 22:01:01 -03:00
RoinujNosde 714aa10701 fix: adds groups (Vault) to the global storage, instead of per world 2022-05-20 19:53:50 -03:00
Minat0_ b2d271b23b fix: don't confuse auto-group-groupname and auto-groups 2022-05-18 17:54:57 +03:00
RoinujNosde 7dad746269 fix: possibly improves performance of ClanPlayer lookup 2022-05-17 20:28:30 -03:00
RoinujNosde 37399cd50b fix: refactored ConfirmationPrompts 2022-05-10 20:03:09 -03:00
RoinujNosde 132eac98e2 fix: doesn't try saving Players with duplicate names 2022-05-09 20:21:15 -03:00
RoinujNosde ba68e8f70a fix: doesn't try saving Players with null names 2022-05-08 18:48:25 -03:00
RoinujNosde 0d3542b4aa Merge remote-tracking branch 'origin/dev' into dev 2022-05-08 17:40:28 -03:00
RoinujNosde 94eed8710c fix!: removed PlotSquared3Provider
Maven repo is down
2022-05-08 17:40:06 -03:00
RoinujNosde 0d3d4981c0 fix: removed PlotSquared3Provider
Maven repo is down
2022-05-08 17:35:56 -03:00
Minat0_ 73fa75fccc fix!: Log "API" when player is offline (#310) 2022-05-08 16:44:17 -03:00
RoinujNosde a855b51617 fix: pending invites could bypass the max members limit 2022-05-03 20:32:39 -03:00
RoinujNosde 83e7ad4ae1 fix: duplicate usernames logic 2022-05-02 21:24:18 -03:00
RoinujNosde 05cddb7e7f feature: adds ClanPlayerTeleportEvent 2022-04-08 14:23:05 -03:00
RoinujNosde 8d1ed8cf41 fix: refactored DBCore, added caller's stack trace to db exceptions 2022-04-05 20:00:33 -03:00
RoinujNosde f8862299f2 fix: optimizes player lookup by using Bukkit#getOfflinePlayers #306 2022-04-02 20:35:09 -03:00
RoinujNosde 1de339addc fix: parsing placeholders that return new placeholders 2022-03-30 19:23:39 -03:00
RoinujNosde e929b58cd7 fix: player not removed from Discord channel on kick #305 2022-03-17 18:55:42 -03:00
RoinujNosde 237755b5d5 fix: remove colors from logged chat messages 2022-03-13 20:02:47 -03:00
RoinujNosde c648343cdc fix: stop setting player locale on insert
The player has not set a language yet
2022-03-13 00:02:19 -03:00
RoinujNosde f34b9273cc fix: setting server's default language as the player's 2022-03-12 23:44:00 -03:00
Minat0_andRoinujNosde d07bc160e6 fix: Strips only Spy and Discord chats (#304)
Co-authored-by: RoinujNosde <edsonpassosjr@outlook.com>
2022-03-12 23:24:31 -03:00
RoinujNosde 6f1f919977 fix: NoSuchFieldException on PlayerHeadCacheTask 2022-03-11 18:13:11 -03:00
Edson Passos 12a5aa92bb fix: disallows 'k' format in tags by default 2022-03-08 12:11:28 -03:00
RoinujNosde 5d7ad0808d fix: checks for valid alphabet even for players with bypass permission 2022-03-06 10:58:02 -03:00
RoinujNosde ac0e2f2116 fix: checks for spaces in tag when ACCEPT_OTHER_ALPHABETS_LETTERS is enabled 2022-03-06 10:57:10 -03:00
Edson Passos 2d553234a3 Update maven.yml 2022-03-06 01:03:38 -03:00
RoinujNosde e4588fe1ef fix: error parsing username regex 2022-03-05 22:29:09 -03:00
RoinujNosde 4221cc2fa1 fix: teleporting to highest block if home is set on a slab #301 2022-03-05 22:18:49 -03:00
RoinujNosde 5db69775a3 feature: adds username regex to config 2022-03-04 20:40:40 -03:00
Minat0_ 88f61a150f Lack of permissions when auto-create is false (#300)
* fix: Lack of permissions when auto-create is false
2022-03-03 20:06:23 -03:00
Edson Passos f0df4435be Bump version 2022-03-02 15:09:53 -03:00
Minat0_andEdson Passos 05c0f734b5 Disband command requires confirmation (#299)
* build: Add maven dependency plugin

* feature: Disband command requires confirmation

* fix: Don't create clans (event) if auto-creation is false

* Updates env variable for testing purpose

* Makes confirm and decline methods abstract

* Testing dependency plugin config

Co-authored-by: Edson Passos <edsonpassosjr@outlook.com>
2022-03-02 17:03:49 +03:00
Edson Passos 4f0b721d49 Updates SCMessage with ChatEvent changes #298 2022-03-02 07:57:11 -03:00
RoinujNosde 3ebb041a3f Merge remote-tracking branch 'origin/dev' into dev 2022-02-26 22:13:47 -03:00
RoinujNosde 3b8dc4992d fix: first time players marked as "not played before" 2022-02-26 22:13:28 -03:00
Edson Passos 16be0c12a0 Fixes line breaks in changelog 2022-02-24 22:36:27 -03:00
Edson Passos 18c7c41ac4 Updated badges and repo info 2022-02-24 22:26:21 -03:00
Edson Passos cb201eb4b8 Update publish_reposilite.yml 2022-02-24 22:01:47 -03:00
Edson Passos 7a8ac9509b Bump version 2022-02-24 21:45:33 -03:00
Edson Passos 587bd9b445 Merge pull request #296 from RoinujNosde/dev
2.16.2
2022-02-24 21:42:42 -03:00
Edson Passos 6419e16eb0 Merge branch 'master' into dev 2022-02-24 21:38:59 -03:00
RoinujNosde 59d2bfc5f8 fix: middle-click actions stopped working on 1.18 #294 2022-02-24 20:37:52 -03:00
Edson Passos e452441380 Adds 1.18 to curseforge supported versions 2022-02-24 19:00:52 -03:00
Edson Passos 4d8fc0f0e5 Updates distributionManagement 2022-02-24 16:01:42 -03:00
Edson Passos 6bbb12e901 Create publish_reposilite.yml 2022-02-24 13:07:10 -03:00
RoinujNosde 002939f2df fix: bad usage of > in javadocs 2022-02-20 15:53:02 -03:00
RoinujNosde 6f27da4bdb fix: bad usage of > in javadocs 2022-02-20 15:48:58 -03:00
RoinujNosde 268f4752d6 feature: adds javadoc plugin 2022-02-20 15:32:15 -03:00
RoinujNosde 204858dee7 fix: uses - instead of space as commit hash separator 2022-02-20 14:18:27 -03:00
RoinujNosde a0ced58a02 feature: adds commit hash to version 2022-02-20 14:15:08 -03:00
RoinujNosde b8cbf831b3 fix: sc_players.name unique constraint not being respected in some cases 2022-02-19 22:59:45 -03:00
RoinujNosde d6ec0c3a3d fix: removes duplicate methods getHealthString and getHungerString 2022-02-19 22:10:51 -03:00
RoinujNosde bf3fc03f93 fix: checks if player name is null before processing death 2022-02-19 21:58:54 -03:00
Edson Passos 52348096a0 Merge pull request #293 from RoinujNosde/l10n_dev
New Crowdin updates
2022-02-18 11:06:29 -03:00
Edson Passos 00a48b24dd New translations messages.properties (Lithuanian) 2022-02-18 11:04:44 -03:00
Edson Passos c9aae0d781 Adds Lithuanian translation (#292)
* New translations messages.properties (Russian)

* New translations messages.properties (Norwegian)

* New translations messages.properties (Lithuanian)
2022-02-18 09:35:12 -03:00
Edson Passos d0bba163a0 New Crowdin updates (#284) 2022-02-18 09:31:32 -03:00
Edson Passos cd0e75483a Merge pull request #290 from Tomut0/dev
Some fixes on messages.properties
2022-02-16 09:40:08 -03:00
Edson Passos 2c365c5d54 Updates insufficient balance message 2022-02-16 09:38:53 -03:00
Minat0_ 9704562353 fix: Fixes "your.clan.doesnt.have.minimum.linked.player" message key 2022-02-16 11:51:43 +03:00
Minat0_ 836fc9d6a0 fix: Returns needed money as argument of "not.sufficient.money" key 2022-02-15 19:54:43 +03:00
Minat0_ cd01b0cd47 fix: Added missing message when player creates a discord channel 2022-02-15 19:54:43 +03:00
Minat0_ d797ab0908 feature: Leaders can create discord channel (#288)
* fix: CNFE on ChatManager#getDiscordHook

* Makes possible to turn off automatic discord channels creation
2022-02-14 22:32:42 -03:00
RoinujNosde fd58f4abda feature: chat listener priority can be changed via config #286 2022-02-03 18:52:34 -03:00
RoinujNosde 6653c6f8c0 feature: staffers can bypass the teleport timer 2022-02-02 19:09:45 -03:00
RoinujNosde 4dee178403 fix: removed PlotSquared5Provider 2022-02-02 18:55:01 -03:00
RoinujNosde 908451c65c feature: %rel_simpleclans_color% is configurable 2022-01-31 19:08:17 -03:00
RoinujNosde d468bd0df2 fix: temporarily removed PlotSquared5Provider as its maven repo is unavailable 2022-01-30 15:26:07 -03:00
RoinujNosde 3779585645 fix: incompatibility with UltimateChat's latest version
Added missing enum ConfigField.TAG_SEPARATOR_char (deprecated)
2022-01-30 14:36:15 -03:00
RoinujNosde c346fdf967 fix: removes player's own name from kick completion #263 2022-01-29 22:36:18 -03:00
Minat0_ 240a782774 Fixes missing clanTag argument at exception 2022-01-30 02:02:47 +03:00
Edson PassosandMinat0_ dce26a784f 2.16.1 (#283)
Adds Landlord 4 support
Fixes bug on create land event
Fixes a bug where JDA was loaded earlier than SC's DiscordHook
Fixes resetKdr not resetting ally kills
LanguageChooser now uses _ instead of -
Adds %clean-tag% placeholder for chat messages
Fixes bb settings
Fixes Vault groups getting removed only on join
Probably adds support for older GriefPrevention versions
Possibly fixes bug on home item on ClanDetailsFrame (staff)
Fixes unban command not saving changes
Strips colors from chat messages
Adds missing language keys
Fixes disallowed tags setting
Adds feature to limit past clans
Hides the player's own clan from some completions
Adds placeholder for bank bb messages
Adds bb commands for staff
Fixes player' permission was not deleted after kicking from the clan
Place command now supports offline players
Fixes not kicking a member if there is at least one leader
Adds sender to DisbandClanEvent
Fixes opening double chests - war and land sharing
Adds method to validate min, max on values
HEX support message on server startup
Bumps discordsrv to 1.24.1-SNAPSHOT
DiscordHook improvements and bug fixes
Messages updated
Removes floody debugs from ProtectionManager

Co-authored-by: Minat0_ <42711312+Tomut0@users.noreply.github.com>
2022-01-23 17:25:06 -03:00
RoinujNosde 3cac8067a6 Removes floody debugs from ProtectionManager 2022-01-23 17:04:08 -03:00
Edson Passos 993578f13e New Crowdin updates (#266) 2022-01-23 16:49:15 -03:00
Minat0_ 96da1b3936 DiscordHook improvement and fixing (#281)
Removes invalid channels on startup
Updates role after channel creation
Creating a channel on player' linking, joining
New setting - min-linked-players-to-create
Throws new exception ChannelExistsException
Makes DiscordHook#deleteChannel return boolean
2022-01-23 14:43:32 -03:00
RoinujNosde 2fc8a1aa1b Bumps discordsrv to 1.24.1-SNAPSHOT 2022-01-16 22:44:32 -03:00
Edson Passos b4cf94dab2 Merge pull request #279 from Tomut0/fix-discord-clan-creation
Fixes skipping channel creation conditions
2022-01-16 18:19:15 -03:00
Minat0_ a793e933ae Checking resolved 2022-01-17 00:07:10 +03:00
Minat0_ a0ec61cec7 Fixes skipping channel creation conditions, part 3
Capitalizes TAG_SEPARATOR_CHAR
2022-01-16 18:56:14 +03:00
Edson Passos 10b24b99a2 Testing cache setting 2022-01-13 23:43:32 -03:00
RoinujNosde 4ed174970e Merge remote-tracking branch 'origin/dev' into dev 2022-01-13 23:33:36 -03:00
RoinujNosde f7b4f5dfd9 Bumps discordsrv to 1.24.0 2022-01-13 23:33:21 -03:00
Edson Passos 8b7d8e4a72 Merge pull request #280 from Tomut0/dev
HEX support message on server startup
2022-01-12 20:11:17 -03:00
Minat0_ 8ab89cd03f HEX support message on server startup 2022-01-13 01:25:29 +03:00
RoinujNosde 47a5948157 Merge remote-tracking branch 'origin/dev' into dev 2022-01-11 19:38:53 -03:00
RoinujNosde 48e3da9716 Adds method to validate min, max on values
Overrides context resolvers from ACF to check for finite numbers (float and double)
2022-01-11 19:38:16 -03:00
Minat0_ 05ec2241f0 Revert "Replaces deprecated getItemInHand"
This reverts commit 71ad4ce160.
2022-01-10 18:25:16 +03:00
Minat0_ 4c881f4601 Fixes skipping channel creation conditions, part 2 2022-01-10 18:18:13 +03:00
Minat0_ 71ad4ce160 Replaces deprecated getItemInHand 2022-01-10 18:08:52 +03:00
Minat0_ 3c2d5c9b81 Fixes skipping channel creation conditions
Updates PaperLib to the latest
2022-01-10 17:26:27 +03:00
Edson Passos b0a0f951fa Merge pull request #278 from RoinujNosde/fix-leader-role
Fixes adding the leader role to anyone
2022-01-09 16:50:23 -03:00
Minat0_ 408647161e Fixes adding the leader role to anyone 2022-01-09 22:34:12 +03:00
RoinujNosde 55f95b405e Possibly fixes opening double chests - war and land sharing 2022-01-04 19:03:18 -03:00
RoinujNosde 0aeb153293 Adds sender to DisbandClanEvent #271 2021-12-10 19:02:02 -03:00
Edson Passos cdc185c8e7 Merge pull request #272 from RoinujNosde/Tomut0-patch-1
Fixes not kicking a member if there is at least one leader
2021-12-09 13:34:41 -03:00
Minat0_ 1f128e8368 Fixes not kicking a member if there is at least one leader
### Example:
Clan 1:
* Minat0_ (Leader)
* RoinujNosde (Member)

Following the current code logic: let's kick RoinujNosde (Member) -> check if clan leaders size == 1 (true) -> send message, return.
The solution is to *check* if this player is a leader and clan leaders size. ☕
2021-12-09 11:53:42 +03:00
RoinujNosde 2e68e7fe2f Place command now supports offline players 2021-11-29 18:16:47 -03:00
Minat0_ 388d17fe99 Fixes player' permission was not deleted after kicking from the clan (#269) 2021-11-19 15:58:38 -03:00
RoinujNosde 89d59a39d9 Adds bb commands for staff #265 2021-11-07 12:15:40 -03:00
Edson Passos d88c14359a New Crowdin updates (#261) 2021-11-07 11:45:53 -03:00
RoinujNosde ae40b35325 Adds placeholder for bank bb messages #246 2021-11-07 11:44:37 -03:00
RoinujNosde 6a410354e5 Hides the player's own clan from some completions
#263
2021-11-07 11:29:52 -03:00
Minat0_ 96c2b8c718 Adds feature to limit past clans (#264)
* Adds a view limit of past clans

* Removes Helper#toMessage

* Removes Helper#stripTrailing
2021-11-02 13:07:36 -03:00
RoinujNosde 4bf0e69734 Fixes disallowed tags setting #262 2021-10-18 21:24:43 -03:00
RoinujNosde 6803b001ce Adds missing language keys 2021-10-12 18:21:14 -03:00
Edson Passos 366863b63e New Crowdin updates (#254) 2021-10-12 18:02:53 -03:00
RoinujNosde 5c391e33c4 Strips colors from chat messages 2021-10-10 19:38:49 -03:00
RoinujNosde 448cc6093e Fixes unban command not saving changes 2021-10-08 23:33:40 -03:00
RoinujNosde 9d910759cb Possibly fixes bug on home item on ClanDetailsFrame (staff) 2021-10-06 13:42:45 -03:00
RoinujNosde cdc1808078 Fixes NoClassDefFoundError on older GriefPrevention versions 2021-09-29 21:38:06 -03:00
RoinujNosde 87541f9742 Probably adds support for older GriefPrevention versions #258 2021-09-28 23:43:44 -03:00
RoinujNosde 54f3f4ba40 Fixes Vault groups getting removed only on join #259 2021-09-28 23:34:22 -03:00
Edson Passos 4e8850e734 Fixes bb settings 2021-09-25 16:27:20 -03:00
RoinujNosde 9e55a00d68 Adds %clean-tag% placeholder for chat messages 2021-09-19 18:05:10 -03:00
Edson Passos f898631ace Merge pull request #256 from mehmet-27/patch-1
Update LanguageSelectorFrame.java
2021-09-19 16:29:36 -03:00
Mehmet f71a84a70e Update LanguageSelectorFrame.java
underscores should be used in languages shown as desired in the config
2021-09-19 22:15:22 +03:00
RoinujNosde b51f27e68b Merge remote-tracking branch 'origin/dev' into dev 2021-09-18 18:27:23 -03:00
RoinujNosde ad38548440 Fixes resetKdr not resetting ally kills 2021-09-18 18:26:28 -03:00
Edson Passos f69207f0d4 Probably fixes a bug, where JDA was loaded earlier than SC's DiscordHook. (#255) 2021-09-17 18:11:59 -03:00
Minat0_ 9fb42b7093 Probably fixes a bug, where JDA was loaded earlier than SC's DiscordHook. 2021-09-17 23:21:52 +03:00
RoinujNosde bf0670cb88 Fixes bug on create land event 2021-09-17 14:19:30 -03:00
RoinujNosde d4507f41fa Adds Landlord 4 support 2021-09-16 19:36:00 -03:00
Edson Passos 41a978a278 Added 1.17 to curseforge workflow 2021-09-13 20:54:29 -03:00
Edson Passos 6ad79b6879 Merge pull request #253 from RoinujNosde/dev
2.16.0
2021-09-13 20:28:55 -03:00
Edson Passos 30cc1759e9 Merge branch 'master' into dev 2021-09-13 20:24:30 -03:00
Edson Passos 3bae27db2d New Crowdin updates (#252) 2021-09-13 20:11:38 -03:00
RoinujNosde 33ea872e4d Bump version 2021-09-13 20:10:38 -03:00
RoinujNosde 558f13dccb Merge remote-tracking branch 'origin/dev' into dev 2021-09-12 10:27:40 -03:00
RoinujNosde 08aae94637 Changes tasks to be sync 2021-09-12 10:27:18 -03:00
Thiago GebrimandEdson Passos c25bd8206c Adição do R antes do $ para ficar: "R$" (#250)
* Adição do R antes do $ para ficar: "R$", pois PT-BR fica mais certo, e tradução de algumas mensagens.

* Changed currency symbol position

Co-authored-by: Edson Passos <edsonpassosjr@outlook.com>
2021-09-09 19:59:10 -03:00
Edson Passos da397676f6 New Crowdin updates (#245) 2021-09-09 19:38:41 -03:00
RoinujNosde 4a56f9e87a Merge remote-tracking branch 'origin/dev' into dev 2021-09-07 19:22:32 -03:00
RoinujNosde 51241b3ae5 Adds /clan list balance command
Permission: simpleclans.anyone.list.balance - default false
2021-09-07 19:22:23 -03:00
Minat0_ e66e187566 Running checks on different Java versions (#248) 2021-09-04 23:59:02 -03:00
RoinujNosde 031227ddaf Merge remote-tracking branch 'origin/dev' into dev 2021-09-04 21:27:51 -03:00
RoinujNosde c3b9c68d45 Creates a ClanPlayer object on placeholder request 2021-09-04 21:27:41 -03:00
Minat0_ 37ffb93808 Adds new metrics for discord chat feature (#247)
* Adds new metrics for discord chat feature
Marks CommandHelper as deprecated

* Deletes CommandHelper.java && DamageRecord.java because of non-usage
2021-09-04 18:51:29 +03:00
RoinujNosde 84dd6a4cbd Adds command /clan resign confirm #163
This will bypass the conversation to confirm the resign
2021-09-03 23:55:14 -03:00
RoinujNosde 8eaa86ae45 Marks annoying provider messages as debug
Logs when a provider is registered
Adds debug messages for ProtectionManager#can()
Checks if getPlot exists on PlotSquared5Provider
2021-09-03 20:13:49 -03:00
Mehmet 55e82dab5f Toggle Clan Invitation (#244)
#57
2021-08-30 18:57:58 -03:00
Edson Passos 0f1e016483 New Crowdin updates (#239) 2021-08-30 18:43:31 -03:00
Minat0_ 3a8a316f3d GitBook: [master] 15 pages modified 2021-08-30 16:40:00 +00:00
Minat0_ f350025796 GitBook: [master] no pages and one asset modified 2021-08-30 16:20:46 +00:00
Minat0_ 36bbb91b61 GitBook: [master] 15 pages and one asset modified 2021-08-30 15:45:02 +00:00
Minat0_ f468a28476 GitBook: [master] no pages and 6 assets modified 2021-08-30 15:13:28 +00:00
RoinujNosde 115e1c5083 Checks if user has already played in the server before saving to db 2021-08-28 20:40:46 -03:00
RoinujNosde 420d8fae8e Added debug messages to some conditions 2021-08-28 19:20:20 -03:00
RoinujNosde fef3763039 Fixes empty tag brackets 2021-08-28 19:11:53 -03:00
RoinujNosde ebe79fe340 Fixes casting exception on config default values 2021-08-28 13:50:41 -03:00
Edson Passos 4a40e4c03d Merge pull request #242 from Tomut0/abandon-conversation
Returns message after conversation expiring
2021-08-27 23:45:50 -03:00
Minat0_ 47d4a215fb Returns message after conversation expiring
Fixes getting null of all players on PlayerListFrame
Updates JavaDoc
Updates messages.properties
2021-08-28 04:50:53 +03:00
Minat0_ ad22a4c75c ChatManager implementation | Refactoring (#215)
Adds integration with Discord
Removes deprecated methods in Helper.java
New config value: settings.global-friendly-fire
Using ACF commands for ally/clan chat
ClanPlayer#setMuted and ClanPlayer#setMutedAlly was moved to ClanPlayer#mute
You may use HEX colors at chat format. 😎
This PR also solves Spy: ally chat has the same format as clan chat #160 and adds spy chat for DiscordChat.
Updates maven dependencies: bStats, JetBrain Annotations and JUnit.
Adds a message, if player tries to join to the same chat (ally/clan)
Adds a message, if chat is disabled (ally/clan)
Adds a message, if player tries to leave the chat, in which it is not located
Adds a message, if staff sends message trough discord to minecraft and he is not located in current clan.
Adds a message, if admin player tries to demote someone, who is not a leader.
2021-08-26 23:26:25 -03:00
RoinujNosde 9811e2e1db Implements relational placeholder color
%rel_simpleclans_color%
This returns GREEN when both players are in the same clan, RED for rivals, AQUA for allies
2021-08-19 13:52:02 -03:00
Edson Passos f81318d458 Merge pull request #236 from RoinujNosde/l10n_dev
New Crowdin updates
2021-08-06 10:56:57 -03:00
RoinujNosde 4d0c39c0dc Suppresses exceptions on GriefPreventionProvider #237 2021-08-03 18:43:26 -03:00
Edson Passos 74752b4341 New translations messages.properties (Spanish) 2021-08-02 01:14:01 -03:00
RoinujNosde 099cf2e8d1 Merge remote-tracking branch 'origin/dev' into dev 2021-07-26 19:52:42 -03:00
RoinujNosde b4447054fb Replaces Threads with BukkitTasks on MySQLCore 2021-07-26 19:52:29 -03:00
Edson Passos 387ea7fb7b New translations messages.properties (Vietnamese) 2021-07-22 16:33:18 -03:00
Edson Passos 5a2efab233 New translations messages.properties (Vietnamese) 2021-07-21 16:37:44 -03:00
Edson Passos 7b415e883f New translations messages.properties (Hungarian) 2021-07-15 16:21:28 -03:00
Edson Passos 339bacf6d4 New translations messages.properties (Portuguese) 2021-07-14 16:19:02 -03:00
Edson Passos 650d8d4d50 New translations messages.properties (Swedish) 2021-07-13 15:57:06 -03:00
Edson Passos c1a3a5a5fe New translations messages.properties (Chinese Simplified) 2021-07-12 10:37:40 -03:00
Edson Passos ca550c13c4 Merge pull request #235 from Tomut0/dev
Fixes StaffCommands#demote for permanent feature
2021-07-11 17:30:52 -03:00
Minat0_ 4738fcae97 Fixes StaffCommands#demote for permanent feature 2021-07-11 23:22:43 +03:00
255 changed files with 13104 additions and 7276 deletions

No files matched your search

+25 -17
View File
@@ -1,29 +1,37 @@
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven
name: Java CI Dev Build
name: CI
on:
push:
branches: [ dev ]
branches: [ master ]
pull_request:
branches: [ dev ]
branches: [ master ]
jobs:
build:
strategy:
fail-fast: true
max-parallel: 4
matrix:
java-version: [ 16, 17 ]
runs-on: ubuntu-latest
name: Java ${{ matrix.java-version }}
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Upload a Build Artifact
uses: actions/upload-artifact@v2
with:
name: SimpleClans
path: target/SimpleClans.jar
- name: Checkout
uses: actions/checkout@v3
- name: "Set up JDK ${{ matrix.java-version }}"
uses: actions/setup-java@v3
with:
java-version: "${{ matrix.java-version }}"
distribution: 'adopt'
cache: 'maven'
- name: Build with Maven
run: ./mvnw -B -U package --file pom.xml
- name: Upload Build Artifact
if: "${{ matrix.java-version == 16 }}"
uses: actions/upload-artifact@v3
with:
name: SimpleClans
path: target/SimpleClans.jar
+10 -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,8 @@ jobs:
game_endpoint: minecraft
file_path: target/SimpleClans.jar
changelog: ${{ github.event.release.body }}
changelog_type: markdown
display_name: ${{ github.event.release.tag_name }}
game_versions: 7915,7667,7330,7105,6588,630,591,585,531
game_versions: 8849,8503,7915,7667,7330,7105,6588,630,591,585,531
release_type: release
relations: vault:optionalDependency,worldguard:optionalDependency,grief-prevention:optionalDependency
+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
+29
View File
@@ -0,0 +1,29 @@
name: Publish to Reposilite
on:
push:
branches:
- master
workflow_dispatch:
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
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: ./mvnw -B package --file pom.xml
- name: Publish to Reposilite
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))
+8 -7
View File
@@ -5,7 +5,7 @@ SimpleClans
Full featured clan system for PVP Minecraft Servers!
[![Build Status](https://travis-ci.com/RoinujNosde/SimpleClans.svg?branch=master)](https://travis-ci.com/RoinujNosde/SimpleClans)
[![Build Status](https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fci.roinujnosde.me%2Fjob%2FSimpleClans%2F)](https://ci.roinujnosde.me/job/SimpleClans/)
[![Spiget Downloads](https://img.shields.io/spiget/downloads/71242)](https://www.spigotmc.org/resources/simpleclans.71242/)
[![Issues](https://img.shields.io/github/issues/RoinujNosde/SimpleClans.svg)](https://github.com/RoinujNosde/SimpleClans/issues)
[![Crowdin](https://badges.crowdin.net/simpleclans/localized.svg)](https://crowdin.com/project/simpleclans)
@@ -50,8 +50,8 @@ Including SimpleClans with Maven:
```xml
<repositories>
<repository>
<id>codemc-repo</id>
<url>https://repo.codemc.org/repository/maven-public</url>
<id>roinujnosde-repo</id>
<url>https://repo.roinujnosde.me/releases/</url>
</repository>
</repositories>
```
@@ -60,7 +60,7 @@ Including SimpleClans with Maven:
<dependency>
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<version>2.15.0</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>
@@ -70,15 +70,16 @@ Using Gradle:
```groovy
repositories {
maven {
url "https://repo.codemc.org/repository/maven-public"
url "https://repo.roinujnosde.me/releases/"
}
}
dependencies {
compileOnly "net.sacredlabyrinth.phaed.simpleclans:SimpleClans:2.15.0"
compileOnly "net.sacredlabyrinth.phaed.simpleclans:SimpleClans:2.18.1"
}
```
Feel free to learn our [Javadoc](https://ci.roinujnosde.me/job/SimpleClans/Javadoc/).
##### Latest version:
[![](https://jitpack.io/v/roinujnosde/simpleclans.svg?label=Maven)]()
[![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
* [Examples of how to use the API](https://simpleclans.gitbook.io/simpleclans/other/simpleclans-api)
-35
View File
@@ -1,35 +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="MavenCustomPomFilePath">
<option name="mavenPomFileUrl" value="file://$MODULE_DIR$/dependency-reduced-pom.xml" />
</component>
<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$/src/main/java">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
</content>
<content url="file://$MODULE_DIR$/src/main/resources">
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
</content>
<content url="file://$MODULE_DIR$/src/test/java">
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
</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: com.github.MilkBowl:VaultAPI:1.7" 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: me.clip:placeholderapi:2.10.9" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains:annotations:16.0.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.4.0" 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: io.papermc:paperlib:1.0.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bstats:bstats-bukkit:1.7" 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.plotsquared:PlotSquared-Core:5.13.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.plotsquared:PlotSquared-Bukkit:5.13.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.plotsquared:plotsquared-api:3.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.plotsquared:plotsquared-bukkitapi:3.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%
-331
View File
@@ -1,331 +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.15.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.bukkit</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>
<relocation>
<pattern>org.reflections</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.reflections</shadedPattern>
</relocation>
<relocation>
<pattern>javassist</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.javassist</shadedPattern>
</relocation>
</relocations>
<artifactSet>
<excludes>
<exclude>org.jetbrains:annotations</exclude>
</excludes>
</artifactSet>
</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>IntellectualSites</id>
<url>https://mvn.intellectualsites.com/content/groups/public/</url>
</repository>
<repository>
<id>plotsquared</id>
<url>https://plotsquared.com/mvn/</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>16.0.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.0</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.plotsquared</groupId>
<artifactId>PlotSquared-Core</artifactId>
<version>5.13.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.plotsquared</groupId>
<artifactId>PlotSquared-Bukkit</artifactId>
<version>5.13.3</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>PlotSquared-Core</artifactId>
<groupId>*</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.plotsquared</groupId>
<artifactId>plotsquared-api</artifactId>
<version>3.1</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>*</artifactId>
<groupId>com.sk89q.worldedit</groupId>
</exclusion>
<exclusion>
<artifactId>snakeyaml</artifactId>
<groupId>org.yaml</groupId>
</exclusion>
<exclusion>
<artifactId>gson</artifactId>
<groupId>com.google.code.gson</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.plotsquared</groupId>
<artifactId>plotsquared-bukkitapi</artifactId>
<version>3.1</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>*</artifactId>
<groupId>com.sk89q.worldedit</groupId>
</exclusion>
<exclusion>
<artifactId>Core</artifactId>
<groupId>PlotSquared</groupId>
</exclusion>
<exclusion>
<artifactId>VaultAPI</artifactId>
<groupId>net.milkbowl.vault</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>codemc-releases</id>
<url>https://repo.codemc.io/repository/maven-releases/</url>
</repository>
<snapshotRepository>
<id>codemc-snapshots</id>
<url>https://repo.codemc.io/repository/maven-snapshots/</url>
</snapshotRepository>
</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%
+121 -83
View File
@@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<version>2.15.3</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,25 +45,25 @@
<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>
<pattern>org.bstats.bukkit</pattern>
<pattern>org.bstats</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.metrics</shadedPattern>
</relocation>
<relocation>
@@ -85,12 +83,8 @@
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.xseries</shadedPattern>
</relocation>
<relocation>
<pattern>org.reflections</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.reflections</shadedPattern>
</relocation>
<relocation>
<pattern>javassist</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.javassist</shadedPattern>
<pattern>com.google.gson</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.gson</shadedPattern>
</relocation>
</relocations>
<artifactSet>
@@ -98,6 +92,13 @@
<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>
@@ -108,6 +109,74 @@
</execution>
</executions>
</plugin>
<!-- Dependency plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.6.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>4.9.10</version>
<executions>
<execution>
<goals>
<goal>revision</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
<configuration>
<dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<goals>
<goal>javadoc</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
<configuration>
<release>16</release>
<doclint>all,-missing</doclint>
</configuration>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.1.2</version>
</plugin>
</plugins>
</build>
<!-- Dependencies -->
@@ -123,17 +192,18 @@
<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>
<artifactId>bstats-bukkit</artifactId>
<version>1.7</version>
<version>2.2.1</version>
<scope>compile</scope>
</dependency>
<dependency>
@@ -145,34 +215,23 @@
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>16.0.2</version>
<version>22.0.0</version>
</dependency>
<dependency>
<groupId>io.papermc</groupId>
<artifactId>paperlib</artifactId>
<version>1.0.5</version>
<version>1.0.8-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>co.aikar</groupId>
<artifactId>acf-paper</artifactId>
<version>0.5.0-SNAPSHOT</version>
<version>0.5.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.github.cryptomorin</groupId>
<artifactId>XSeries</artifactId>
<version>7.2.1</version>
</dependency>
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
<version>0.9.12</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.4.0</version>
<scope>test</scope>
<version>8.3.0</version>
</dependency>
<dependency>
<groupId>com.sk89q.worldguard</groupId>
@@ -183,54 +242,33 @@
<dependency>
<groupId>com.github.TechFortress</groupId>
<artifactId>GriefPrevention</artifactId>
<version>16.17.1</version>
<version>16.18.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.plotsquared</groupId>
<artifactId>PlotSquared-Core</artifactId>
<version>5.13.3</version>
<groupId>com.discordsrv</groupId>
<artifactId>discordsrv</artifactId>
<version>1.24.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.plotsquared</groupId>
<artifactId>PlotSquared-Bukkit</artifactId>
<version>5.13.3</version>
<groupId>biz.princeps</groupId>
<artifactId>landlord-latest</artifactId>
<version>4.351</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>*</groupId>
<artifactId>PlotSquared-Core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.plotsquared</groupId>
<artifactId>plotsquared-api</artifactId>
<version>3.1</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>com.sk89q.worldedit</groupId>
<artifactId>*</artifactId>
</exclusion>
</exclusions>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.1</version>
</dependency>
<!-- Test frameworks -->
<dependency>
<groupId>com.plotsquared</groupId>
<artifactId>plotsquared-bukkitapi</artifactId>
<version>3.1</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>com.sk89q.worldedit</groupId>
<artifactId>*</artifactId>
</exclusion>
<exclusion>
<groupId>PlotSquared</groupId>
<artifactId>Core</artifactId>
</exclusion>
</exclusions>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>
</dependencies>
@@ -261,12 +299,12 @@
<url>https://maven.enginehub.org/repo/</url>
</repository>
<repository>
<id>IntellectualSites</id>
<url>https://mvn.intellectualsites.com/content/groups/public/</url>
<id>Scarsz-Nexus</id>
<url>https://nexus.scarsz.me/content/groups/public/</url>
</repository>
<repository>
<id>plotsquared</id>
<url>https://plotsquared.com/mvn/</url>
<id>eldonexus</id>
<url>https://eldonexus.de/repository/maven-public</url>
</repository>
<repository>
<id>jitpack.io</id>
@@ -282,12 +320,12 @@
<distributionManagement>
<repository>
<id>codemc-releases</id>
<url>https://repo.codemc.io/repository/maven-releases/</url>
<id>reposilite</id>
<url>https://repo.roinujnosde.me/releases/</url>
</repository>
<snapshotRepository>
<id>codemc-snapshots</id>
<url>https://repo.codemc.io/repository/maven-snapshots/</url>
<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;
@@ -523,6 +522,9 @@ public class ChatBlock {
/**
* Outputs a single line out, crops overflow
*
* @param receiver the receiver
* @param msg the message
*/
public static void saySingle(CommandSender receiver, String msg) {
if (receiver == null) {
@@ -534,6 +536,9 @@ public class ChatBlock {
/**
* Outputs a message to a user
*
* @param receiver the receiver
* @param msg the message
*/
public static void sendMessage(@Nullable CommandSender receiver, @NotNull String msg) {
if (receiver == null) {
@@ -541,11 +546,6 @@ public class ChatBlock {
}
receiver.sendMessage(ChatUtils.parseColors(msg));
// String[] message = colorize(wordWrap(msg));
//
// for (String out : message) {
// receiver.sendMessage(out);
// }
}
public static void sendMessage(@Nullable ClanPlayer receiver, @NotNull String msg) {
@@ -553,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
@@ -566,13 +561,19 @@ 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;
}
/**
* Send blank line
* Sends a blank line
*
* @param receiver the receiver
*/
public static void sendBlank(CommandSender receiver) {
if (receiver == null) {
@@ -1,15 +1,17 @@
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.*;
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.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -28,6 +30,7 @@ import static net.sacredlabyrinth.phaed.simpleclans.EconomyResponse.*;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.events.ClanBalanceUpdateEvent.Cause;
import static net.sacredlabyrinth.phaed.simpleclans.loggers.BankLogger.Operation.*;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.*;
/**
@@ -51,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<>();
@@ -74,7 +77,7 @@ public class Clan implements Serializable, Comparable<Clan> {
this.lastUsed = (new Date()).getTime();
this.verified = verified;
this.capeUrl = "";
if (SimpleClans.getInstance().getSettingsManager().isClanFFOnByDefault()) {
if (SimpleClans.getInstance().getSettingsManager().is(CLAN_FF_ON_BY_DEFAULT)) {
friendlyFire = true;
}
}
@@ -110,23 +113,23 @@ 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 {
player.sendMessage(AQUA + lang("not.sufficient.money", player));
player.sendMessage(AQUA + lang("not.sufficient.money", player, amount));
}
} else {
player.sendMessage(AQUA + lang("not.sufficient.money", player));
player.sendMessage(AQUA + lang("not.sufficient.money", player, amount));
}
}
/**
* Deposits money to the clan
*/
public EconomyResponse deposit(@Nullable CommandSender sender, @NotNull Cause cause, double amount) {
public EconomyResponse deposit(@NotNull BankOperator sender, @NotNull Cause cause, double amount) {
EconomyResponse response = null;
if (amount < 0) {
@@ -147,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 {
@@ -160,7 +163,7 @@ public class Clan implements Serializable, Comparable<Clan> {
/**
* Withdraws money from the clan
*/
public EconomyResponse withdraw(@Nullable CommandSender sender, @NotNull Cause cause, double amount) {
public EconomyResponse withdraw(@NotNull BankOperator sender, @NotNull Cause cause, double amount) {
EconomyResponse response = null;
if (amount < 0) {
@@ -248,14 +251,15 @@ public class Clan implements Serializable, Comparable<Clan> {
*
* @param balance the balance to set
*/
public void setBalance(double balance) {
setBalance(null, Cause.API, SET, balance);
private void setBalance(double balance) {
setBalance(BankOperator.INTERNAL, Cause.INTERNAL, SET, balance);
}
public EconomyResponse setBalance(@Nullable CommandSender updater, @NotNull Cause cause, @NotNull BankLogger.Operation operation, double balance) {
public EconomyResponse setBalance(@NotNull BankOperator operator, @NotNull Cause cause,
@NotNull BankLogger.Operation operation, double balance) {
EconomyResponse response = SUCCESS;
ClanBalanceUpdateEvent event = new ClanBalanceUpdateEvent(updater, this, getBalance(), balance, cause);
ClanBalanceUpdateEvent event = new ClanBalanceUpdateEvent(operator, this, getBalance(), balance, cause);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
response = CANCELLED;
@@ -264,7 +268,7 @@ public class Clan implements Serializable, Comparable<Clan> {
this.balance = event.getNewBalance();
if (cause != Cause.LOADING) {
if (operation == SET) {
SimpleClans.getInstance().getBankLogger().log(new BankLog(updater, this, response, SET, cause, balance));
SimpleClans.getInstance().getBankLogger().log(new BankLog(operator, this, response, SET, cause, balance));
}
SimpleClans.getInstance().getStorageManager().updateClan(this);
}
@@ -289,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
*
@@ -333,17 +336,17 @@ public class Clan implements Serializable, Comparable<Clan> {
/**
* Returns the max number of days the clan can be inactive
* A number <= 0 means it won't be purged
* A {@literal <=} 0 means it won't be purged
*/
public int getMaxInactiveDays() {
if (this.isPermanent()) {
if (isPermanent()) {
return -1;
}
int verifiedClanInactiveDays = SimpleClans.getInstance().getSettingsManager().getPurgeClan();
int unverifiedClanInactiveDays = SimpleClans.getInstance().getSettingsManager().getPurgeUnverified();
int verifiedClanInactiveDays = SimpleClans.getInstance().getSettingsManager().getInt(PURGE_INACTIVE_CLAN_DAYS);
int unverifiedClanInactiveDays = SimpleClans.getInstance().getSettingsManager().getInt(PURGE_UNVERIFIED_CLAN_DAYS);
return this.isVerified() ? verifiedClanInactiveDays : unverifiedClanInactiveDays;
return isVerified() ? verifiedClanInactiveDays : unverifiedClanInactiveDays;
}
/**
@@ -381,17 +384,22 @@ public class Clan implements Serializable, Comparable<Clan> {
* @return confirmation
*/
public boolean isMember(Player player) {
return this.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 this.members.contains(playerUniqueId.toString());
public boolean isMember(UUID uuid) {
for (ClanPlayer cp : members) {
if (cp.getUniqueId().equals(uuid)) {
return true;
}
}
return false;
}
@SuppressWarnings("deprecation")
@@ -484,12 +492,15 @@ 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
*/
public void addBbWithoutSaving(String msg) {
while (bb.size() > SimpleClans.getInstance().getSettingsManager().getBbSize()) {
while (bb.size() > SimpleClans.getInstance().getSettingsManager().getInt(BB_SIZE)) {
bb.remove(0);
}
@@ -518,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 (!this.members.contains(uuid)) {
this.members.add(uuid);
if (!members.contains(cp)) {
members.add(cp);
}
}
/**
* (used internally)
*/
public void removeMember(UUID playerUniqueId) {
this.members.remove(playerUniqueId.toString());
public void removeMember(UUID uuid) {
members.removeIf(cp -> cp.getUniqueId().equals(uuid));
}
/**
@@ -542,7 +546,7 @@ public class Clan implements Serializable, Comparable<Clan> {
*/
@Placeholder("size")
public int getSize() {
return this.members.size();
return members.size();
}
/**
@@ -560,12 +564,7 @@ public class Clan implements Serializable, Comparable<Clan> {
}
private boolean removeRival(String rival) {
if (!rivals.contains(rival)) {
return false;
}
rivals.remove(rival);
return true;
return rivals.remove(rival);
}
/**
@@ -588,7 +587,7 @@ public class Clan implements Serializable, Comparable<Clan> {
*/
@Placeholder("is_verified")
public boolean isVerified() {
return !SimpleClans.getInstance().getSettingsManager().isRequireVerification() || verified;
return !SimpleClans.getInstance().getSettingsManager().is(REQUIRE_VERIFICATION) || verified;
}
@@ -636,7 +635,7 @@ public class Clan implements Serializable, Comparable<Clan> {
* @return the packedBb
*/
public String getPackedBb() {
return Helper.toMessage(bb, "|");
return String.join("|", bb);
}
/**
@@ -645,7 +644,7 @@ public class Clan implements Serializable, Comparable<Clan> {
* @param packedBb the packedBb to set
*/
public void setPackedBb(String packedBb) {
this.bb = Helper.fromArray(packedBb.split("[|]"));
bb = Helper.fromArrayToList(packedBb.split("[|]"));
}
/**
@@ -654,7 +653,7 @@ public class Clan implements Serializable, Comparable<Clan> {
* @return the packedAllies
*/
public String getPackedAllies() {
return Helper.toMessage(allies, "|");
return String.join("|", allies);
}
/**
@@ -663,7 +662,7 @@ public class Clan implements Serializable, Comparable<Clan> {
* @param packedAllies the packedAllies to set
*/
public void setPackedAllies(String packedAllies) {
this.allies = Helper.fromArray(packedAllies.split("[|]"));
allies = Helper.fromArrayToList(packedAllies.split("[|]"));
}
/**
@@ -672,7 +671,7 @@ public class Clan implements Serializable, Comparable<Clan> {
* @return the packedRivals
*/
public String getPackedRivals() {
return Helper.toMessage(rivals, "|");
return String.join("|", rivals);
}
/**
@@ -681,7 +680,7 @@ public class Clan implements Serializable, Comparable<Clan> {
* @param packedRivals the packedRivals to set
*/
public void setPackedRivals(String packedRivals) {
this.rivals = Helper.fromArray(packedRivals.split("[|]"));
rivals = Helper.fromArrayToList(packedRivals.split("[|]"));
}
/**
@@ -689,23 +688,13 @@ public class Clan implements Serializable, Comparable<Clan> {
* tags
*/
public String getAllyString(String sep, @Nullable CommandSender viewer) {
StringBuilder out = new StringBuilder();
String coloredAllies = getAllies().stream().
map(allyTag -> SimpleClans.getInstance().getClanManager().getClan(allyTag)).
filter(Objects::nonNull).
map(Clan::getColorTag).
collect(Collectors.joining(sep));
for (String allyTag : getAllies()) {
Clan ally = SimpleClans.getInstance().getClanManager().getClan(allyTag);
if (ally != null) {
out.append(ally.getColorTag()).append(sep);
}
}
out = new StringBuilder(Helper.stripTrailing(out.toString(), sep));
if (out.toString().trim().isEmpty()) {
return lang("none", viewer);
}
return ChatUtils.parseColors(out.toString());
return coloredAllies.isEmpty() ? lang("none", viewer) : coloredAllies;
}
/**
@@ -721,29 +710,14 @@ public class Clan implements Serializable, Comparable<Clan> {
* tags
*/
public String getRivalString(String sep, @Nullable CommandSender viewer) {
StringBuilder out = new StringBuilder();
String coloredRivals = getRivals().stream().
map(rivalTag -> SimpleClans.getInstance().getClanManager().getClan(rivalTag)).
filter(Objects::nonNull).
map(rival -> isWarring(rival) ? DARK_RED + "[" + rival.getTag() + "]" : rival.getColorTag()).
map(ChatUtils::parseColors).
collect(Collectors.joining(sep));
for (String rivalTag : getRivals()) {
Clan rival = SimpleClans.getInstance().getClanManager().getClan(rivalTag);
if (rival != null) {
if (isWarring(rivalTag)) {
out.append(DARK_RED).append("[").append(ChatUtils.stripColors(rival.getColorTag()))
.append("]").append(sep);
} else {
out.append(rival.getColorTag()).append(sep);
}
}
}
out = new StringBuilder(Helper.stripTrailing(out.toString(), sep));
if (out.toString().trim().isEmpty()) {
return lang("none", viewer);
}
return ChatUtils.parseColors(out.toString());
return coloredRivals.isEmpty() ? lang("none", viewer) : coloredRivals;
}
/**
@@ -760,20 +734,8 @@ public class Clan implements Serializable, Comparable<Clan> {
* @return the formatted leaders string
*/
public String getLeadersString(String prefix, String sep) {
StringBuilder out = new StringBuilder();
for (String member : members) {
ClanPlayer cp = SimpleClans.getInstance().getClanManager().getClanPlayer(UUID.fromString(member));
if (cp == null) {
continue;
}
if (cp.isLeader()) {
out.append(prefix).append(cp.getName()).append(sep);
}
}
return Helper.stripTrailing(out.toString(), sep);
return members.stream().filter(ClanPlayer::isLeader).map(ClanPlayer::getName).
collect(Collectors.joining(sep, prefix, ""));
}
/**
@@ -812,16 +774,10 @@ public class Clan implements Serializable, Comparable<Clan> {
* @return the fee payers
*/
public Set<ClanPlayer> getFeePayers() {
Set<ClanPlayer> feePayers = new HashSet<>();
getNonLeaders().forEach(cp -> {
OfflinePlayer op = Bukkit.getOfflinePlayer(cp.getUniqueId());
if (!SimpleClans.getInstance().getPermissionsManager().has(null, op, "simpleclans.member.bypass-fee")) {
feePayers.add(cp);
}
});
return feePayers;
return getMembers().stream().filter(cp -> !cp.isLeader()).filter(cp -> {
Rank rank = getRank(cp.getRankId());
return rank == null || !rank.getPermissions().contains(RankPermission.FEE_BYPASS.toString());
}).collect(Collectors.toSet());
}
/**
@@ -830,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);
}
/**
@@ -852,19 +796,7 @@ 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());
}
/**
@@ -874,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());
}
/**
@@ -896,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());
}
/**
@@ -950,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();
}
@@ -982,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();
}
@@ -1005,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();
}
@@ -1081,9 +969,9 @@ public class Clan implements Serializable, Comparable<Clan> {
public boolean reachedRivalLimit() {
int rivalCount = rivals.size();
int clanCount = SimpleClans.getInstance().getClanManager().getRivableClanCount() - 1;
int rivalPercent = SimpleClans.getInstance().getSettingsManager().getRivalLimitPercent();
double rivalPercent = SimpleClans.getInstance().getSettingsManager().getPercent(RIVAL_LIMIT_PERCENT);
double limit = ((double) clanCount) * (((double) rivalPercent) / ((double) 100));
double limit = ((double) clanCount) * (rivalPercent / ((double) 100));
return rivalCount > limit;
}
@@ -1095,7 +983,8 @@ public class Clan implements Serializable, Comparable<Clan> {
cp.removePastClan(getColorTag());
cp.setClan(this);
cp.setLeader(false);
cp.setTrusted(SimpleClans.getInstance().getSettingsManager().isClanTrustByDefault());
cp.setJoinDate(new Date().getTime());
cp.setTrusted(SimpleClans.getInstance().getSettingsManager().is(CLAN_TRUST_MEMBERS_BY_DEFAULT));
if (defaultRank != null) {
cp.setRank(defaultRank);
}
@@ -1215,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());
@@ -1266,13 +1155,7 @@ public class Clan implements Serializable, Comparable<Clan> {
*/
@Placeholder("is_anyonline")
public boolean isAnyOnline() {
for (String member : members) {
if (Helper.isOnline(UUID.fromString(member))) {
return true;
}
}
return false;
return members.stream().anyMatch(cp -> cp.toPlayer() != null);
}
/**
@@ -1285,7 +1168,7 @@ public class Clan implements Serializable, Comparable<Clan> {
List<ClanPlayer> online = getOnlineLeaders();
online.remove(cp);
double minimum = SimpleClans.getInstance().getSettingsManager().getPercentageOnlineToDemote();
double minimum = SimpleClans.getInstance().getSettingsManager().getPercent(CLAN_PERCENTAGE_ONLINE_TO_DEMOTE);
// all leaders minus the one being demoted
double totalLeaders = getLeaders().size() - 1;
double onlineLeaders = online.size();
@@ -1310,7 +1193,7 @@ public class Clan implements Serializable, Comparable<Clan> {
List<ClanPlayer> leaders = getLeaders();
for (ClanPlayer leader : leaders) {
if (!Helper.isOnline(leader.getUniqueId())) {
if (leader.toPlayer() == null) {
return false;
}
}
@@ -1330,7 +1213,7 @@ public class Clan implements Serializable, Comparable<Clan> {
continue;
}
if (!Helper.isOnline(leader.getName())) {
if (leader.toPlayer() == null) {
return false;
}
}
@@ -1349,7 +1232,7 @@ public class Clan implements Serializable, Comparable<Clan> {
continue;
}
if (!Helper.isOnline(leader.getUniqueId())) {
if (leader.toPlayer() == null) {
return false;
}
}
@@ -1369,35 +1252,27 @@ public class Clan implements Serializable, Comparable<Clan> {
* Announce message to a whole clan
*/
public void clanAnnounce(String playerName, String msg) {
String message = SimpleClans.getInstance().getSettingsManager().getClanChatAnnouncementColor() + msg;
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().getClanChatAnnouncementColor() + msg;
String message = SimpleClans.getInstance().getSettingsManager().getColored(CLANCHAT_ANNOUNCEMENT_COLOR) + msg;
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);
}
/**
@@ -1405,8 +1280,8 @@ public class Clan implements Serializable, Comparable<Clan> {
*/
public void addBb(String announcerName, String msg) {
if (isVerified()) {
addBb(SimpleClans.getInstance().getSettingsManager().getBbColor() + msg);
clanAnnounce(announcerName, SimpleClans.getInstance().getSettingsManager().getBbAccentColor() + "* " + SimpleClans.getInstance().getSettingsManager().getBbColor() + ChatUtils.parseColors(msg));
addBb(msg);
clanAnnounce(announcerName, SimpleClans.getInstance().getSettingsManager().getColored(BB_PREFIX) + ChatUtils.parseColors(msg));
}
}
@@ -1415,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().getBbColor() + msg, updateLastUsed);
clanAnnounce(announcerName, SimpleClans.getInstance().getSettingsManager().getBbAccentColor() + "* " + SimpleClans.getInstance().getSettingsManager().getBbColor() + ChatUtils.parseColors(msg));
addBb(msg, updateLastUsed);
clanAnnounce(announcerName, SimpleClans.getInstance().getSettingsManager().getColored(BB_PREFIX) + ChatUtils.parseColors(msg));
}
}
@@ -1433,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().getBbAccentColor();
String pageHeadingsColor = SimpleClans.getInstance().getSettingsManager().getPageHeadingsColor();
ChatBlock.saySingle(player, lang("bulletin.board.header", bbAccentColor, pageHeadingsColor, getName()));
List<String> localBb;
if (maxSize == -1) {
localBb = bb;
maxSize = SimpleClans.getInstance().getSettingsManager().getBbSize();
} 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().getBbColor();
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);
}
/**
@@ -1473,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().getBbAccentColor();
String bbColor = SimpleClans.getInstance().getSettingsManager().getBbColor();
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;
}
}
@@ -1498,24 +1380,25 @@ public class Clan implements Serializable, Comparable<Clan> {
Collection<ClanPlayer> clanPlayers = SimpleClans.getInstance().getClanManager().getAllClanPlayers();
List<Clan> clans = SimpleClans.getInstance().getClanManager().getClans();
if (this.isPermanent() && !force) {
ChatBlock.sendMessage(sender, RED + lang("cannot.disband.permanent"));
if (isPermanent() && !force) {
ChatBlock.sendMessage(sender, RED + lang("cannot.disband.permanent", sender));
return;
}
if (announce) {
if (SimpleClans.getInstance().getSettingsManager().isDisableMessages() && sender != null) {
this.clanAnnounce(sender.getName(), AQUA + lang("clan.has.been.disbanded", this.getName()));
if (SimpleClans.getInstance().getSettingsManager().is(DISABLE_MESSAGES) && sender != null) {
clanAnnounce(sender.getName(), AQUA + lang("clan.has.been.disbanded", getName()));
} else {
SimpleClans.getInstance().getClanManager().serverAnnounce(AQUA + lang("clan.has.been.disbanded", this.getName()));
SimpleClans.getInstance().getClanManager().serverAnnounce(AQUA + lang("clan.has.been.disbanded", getName()));
}
}
SimpleClans.getInstance().getPermissionsManager().removeClanPermissions(this);
for (ClanPlayer cp : clanPlayers) {
if (cp.getTag().equals(getTag())) {
SimpleClans.getInstance().getPermissionsManager().removeClanPermissions(this);
cp.setClan(null);
cp.setJoinDate(0);
cp.setRank(null);
if (isVerified()) {
cp.addPastClan(getColorTag() + (cp.isLeader() ? DARK_RED + "*" : ""));
}
@@ -1524,28 +1407,29 @@ public class Clan implements Serializable, Comparable<Clan> {
}
}
Bukkit.getPluginManager().callEvent(new DisbandClanEvent(this));
Bukkit.getPluginManager().callEvent(new DisbandClanEvent(sender, this));
clans.remove(this);
for (Clan c : clans) {
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(), () -> {
SimpleClans.getInstance().getClanManager().removeClan(this.getTag());
SimpleClans.getInstance().getClanManager().removeClan(getTag());
SimpleClans.getInstance().getStorageManager().deleteClan(this);
}, 1);
}
@@ -1589,8 +1473,8 @@ public class Clan implements Serializable, Comparable<Clan> {
warring.add(targetClan.getTag());
flags.put(WARRING_KEY, warring);
if (requestPlayer != null) {
this.addBb(requestPlayer.getName(), AQUA + lang("you.are.at.war",
this.getName(), targetClan.getColorTag()));
addBb(requestPlayer.getName(), lang("you.are.at.war",
getName(), targetClan.getColorTag()));
}
SimpleClans.getInstance().getStorageManager().updateClan(this);
}
@@ -1663,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);
}
@@ -1681,35 +1567,20 @@ public class Clan implements Serializable, Comparable<Clan> {
double z = flags.getNumber("homeZ").doubleValue();
float yaw = flags.getNumber("homeYaw").floatValue();
float pitch = flags.getNumber("homePitch").floatValue();
Location location = new Location(world, x, y, z, yaw, pitch);
if (!Helper.isAir(location.getBlock().getType(), location.clone().add(0, 1, 0).getBlock().getType())) {
location.setY(world.getHighestBlockYAt(location) + 1);
}
return location;
return new Location(world, x, y, z, yaw, pitch);
}
public String getTagLabel(boolean isLeader) {
SimpleClans plugin = SimpleClans.getInstance();
SettingsManager sm = SimpleClans.getInstance().getSettingsManager();
String bracketColor = isLeader ? sm.getColored(TAG_BRACKET_LEADER_COLOR) : sm.getColored(TAG_BRACKET_COLOR);
String bracketDefaultColor = sm.getColored(TAG_DEFAULT_COLOR);
String bracketLeft = sm.getColored(TAG_BRACKET_LEFT);
String bracketRight = sm.getColored(TAG_BRACKET_RIGHT);
String tagSeparatorColor = isLeader ? sm.getColored(TAG_SEPARATOR_LEADER_COLOR) : sm.getColored(TAG_SEPARATOR_COLOR);
String tagSeparator = sm.getString(TAG_SEPARATOR_CHAR);
if (isLeader) {
return plugin.getSettingsManager().getTagBracketLeaderColor() +
plugin.getSettingsManager().getTagBracketLeft() +
plugin.getSettingsManager().getTagDefaultColor() +
getColorTag() +
plugin.getSettingsManager().getTagBracketLeaderColor() +
plugin.getSettingsManager().getTagBracketRight() +
plugin.getSettingsManager().getTagSeparatorLeaderColor() +
plugin.getSettingsManager().getTagSeparator();
} else {
return plugin.getSettingsManager().getTagBracketColor() +
plugin.getSettingsManager().getTagBracketLeft() +
plugin.getSettingsManager().getTagDefaultColor() +
getColorTag() +
plugin.getSettingsManager().getTagBracketColor() +
plugin.getSettingsManager().getTagBracketRight() +
plugin.getSettingsManager().getTagSeparatorColor() +
plugin.getSettingsManager().getTagSeparator();
}
return bracketColor + bracketLeft + bracketDefaultColor + getColorTag() + bracketColor + bracketRight + tagSeparatorColor + tagSeparator;
}
/**
@@ -2,6 +2,7 @@ package net.sacredlabyrinth.phaed.simpleclans;
import net.sacredlabyrinth.phaed.simpleclans.hooks.papi.Placeholder;
import net.sacredlabyrinth.phaed.simpleclans.managers.ProtectionManager.Action;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@@ -16,8 +17,10 @@ import java.sql.Timestamp;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
/**
* @author phaed
@@ -35,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);
@@ -45,6 +48,7 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
private @Nullable Locale locale;
/**
*
*/
@@ -64,17 +68,17 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
* @param uuid the Player's UUID
*/
public ClanPlayer(UUID uuid) {
this.uniqueId = uuid;
uniqueId = uuid;
Player onlinePlayer = SimpleClans.getInstance().getServer().getPlayer(uuid);
if (onlinePlayer != null) {
this.displayName = onlinePlayer.getName();
displayName = onlinePlayer.getName();
} else {
OfflinePlayer offlinePlayer = SimpleClans.getInstance().getServer().getOfflinePlayer(uuid);
this.displayName = offlinePlayer.getName() != null ? offlinePlayer.getName() : "null";
displayName = offlinePlayer.getName() != null ? offlinePlayer.getName() : "null";
}
this.lastSeen = (new Date()).getTime();
this.joinDate = (new Date()).getTime();
this.tag = "";
lastSeen = (new Date()).getTime();
joinDate = (new Date()).getTime();
tag = "";
}
@Override
@@ -89,12 +93,12 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
}
ClanPlayer other = (ClanPlayer) obj;
return other.getName().equals(this.getName());
return other.getName().equals(getName());
}
@Override
public int compareTo(ClanPlayer other) {
return this.getUniqueId().compareTo(other.getUniqueId());
return getUniqueId().compareTo(other.getUniqueId());
}
@Override
@@ -137,7 +141,7 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
* @param name the name to set
*/
public void setName(String name) {
this.displayName = name;
displayName = name;
}
/**
@@ -223,7 +227,7 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
* Updates last seen date to today
*/
public void updateLastSeen() {
this.lastSeen = (new Date()).getTime();
lastSeen = (new Date()).getTime();
}
/**
@@ -431,11 +435,11 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
*/
@Placeholder("weighted_kills")
public double getWeightedKills() {
SimpleClans plugin = SimpleClans.getInstance();
double kills = ((double) getRivalKills() * plugin.getSettingsManager().getKwRival()) +
((double) getNeutralKills() * plugin.getSettingsManager().getKwNeutral()) +
((double) getAllyKills() * plugin.getSettingsManager().getKwAlly()) +
((double) getCivilianKills() * plugin.getSettingsManager().getKwCivilian());
SettingsManager settings = SimpleClans.getInstance().getSettingsManager();
double kills = getRivalKills() * settings.getDouble(KILL_WEIGHTS_RIVAL) +
getNeutralKills() * settings.getDouble(KILL_WEIGHTS_NEUTRAL) +
getAllyKills() * settings.getDouble(KILL_WEIGHTS_ALLY) +
getCivilianKills() * settings.getDouble(KILL_WEIGHTS_CIVILIAN);
if (kills < 0) {
return 0;
}
@@ -484,7 +488,7 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
return "";
}
return new java.text.SimpleDateFormat("MMM dd, ''yy h:mm a").format(new Date(this.joinDate));
return new java.text.SimpleDateFormat("MMM dd, ''yy h:mm a").format(new Date(joinDate));
}
/**
@@ -505,11 +509,10 @@ 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(this.lastSeen));
return new java.text.SimpleDateFormat("MMM dd, ''yy h:mm a").format(new Date(lastSeen));
}
/**
@@ -527,31 +530,24 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
* @return the PackedPastClans
*/
public String getPackedPastClans() {
StringBuilder packedPastClans = new StringBuilder();
Set<String> pt = getPastClans();
for (String pastClan : pt) {
packedPastClans.append(pastClan).append("|");
}
return Helper.stripTrailing(packedPastClans.toString(), "|");
return String.join("|", getPastClans());
}
/**
* (used internally)
*
* @param PackedPastClans the PackedPastClans to set
* @param packedPastClans the packedPastClans to set
*/
public void setPackedPastClans(String PackedPastClans) {
this.pastClans = Helper.fromArray2(PackedPastClans.split("[|]"));
public void setPackedPastClans(String packedPastClans) {
String[] clans = packedPastClans.split("\\|");
Collections.addAll(pastClans, clans);
}
/**
* Adds a past clan to the player (does not update the clanplayer to db)
*/
public void addPastClan(String tag) {
this.getPastClans().add(tag);
getPastClans().add(tag);
}
/**
@@ -560,7 +556,7 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
* @param tag is the clan's colored tag
*/
public void removePastClan(String tag) {
this.getPastClans().remove(tag);
getPastClans().remove(tag);
}
/**
@@ -579,19 +575,15 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
*/
@NotNull
public String getPastClansString(String sep, @Nullable Player viewer) {
StringBuilder out = new StringBuilder();
for (String pastClan : getPastClans()) {
out.append(pastClan).append(sep);
}
out = new StringBuilder(Helper.stripTrailing(out.toString(), sep));
if (out.toString().trim().isEmpty()) {
if (getPastClans().isEmpty()) {
return lang("none", viewer);
}
return out.toString();
SettingsManager settings = SimpleClans.getInstance().getSettingsManager();
return getPastClans().stream().
sorted(Collections.reverseOrder()).
limit(settings.getInt(PAST_CLANS_LIMIT)).
collect(Collectors.joining(sep));
}
/**
@@ -624,9 +616,9 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
/**
* Sets the resign times (does not update to db)
*/
public void setResignTimes(Map<String, Long> resignTimes) {
public void setResignTimes(@Nullable Map<String, Long> resignTimes) {
if (resignTimes != null) {
final int cooldown = SimpleClans.getInstance().getSettingsManager().getRejoinCooldown();
final int cooldown = SimpleClans.getInstance().getSettingsManager().getInt(REJOIN_COOLDOWN);
resignTimes.forEach((k, v) -> {
long timePassed = Instant.ofEpochMilli(v).until(Instant.now(), ChronoUnit.MINUTES);
if (timePassed < cooldown) {
@@ -661,9 +653,9 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
*/
public void setClan(@Nullable Clan clan) {
if (clan == null) {
this.tag = "";
tag = "";
} else {
this.tag = clan.getTag();
tag = clan.getTag();
}
this.clan = clan;
@@ -739,7 +731,8 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
if (channelName != null) {
return Channel.valueOf(channelName);
}
} catch (IllegalArgumentException ignored) {}
} catch (IllegalArgumentException ignored) {
}
return Channel.NONE;
}
@@ -759,13 +752,16 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
}
@Deprecated
public void setGlobalChat(boolean globalChat) {}
public void setGlobalChat(boolean globalChat) {
}
@Deprecated
public void setAllyChat(boolean allyChat) {}
public void setAllyChat(boolean allyChat) {
}
@Deprecated
public void setClanChat(boolean clanChat) {}
public void setClanChat(boolean clanChat) {
}
public void setChannel(@NotNull Channel channel) {
flags.put("channel", channel.toString());
@@ -781,13 +777,23 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
SimpleClans.getInstance().getStorageManager().updateClanPlayer(this);
}
public boolean isInviteEnabled() {
return flags.getBoolean("invite", true);
}
public void setInviteEnabled(boolean inviteEnabled) {
flags.put("invite", inviteEnabled);
SimpleClans.getInstance().getStorageManager().updateClanPlayer(this);
}
@Deprecated
public boolean isCapeEnabled() {
return false;
}
@Deprecated
public void setCapeEnabled(boolean capeEnabled) {}
public void setCapeEnabled(boolean capeEnabled) {
}
@Placeholder("is_tag_enabled")
public boolean isTagEnabled() {
@@ -798,7 +804,7 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
flags.put("hide-tag", tagEnabled);
SimpleClans.getInstance().getStorageManager().updateClanPlayer(this);
SimpleClans.getInstance().getClanManager().updateDisplayName(this.toPlayer());
SimpleClans.getInstance().getClanManager().updateDisplayName(toPlayer());
}
@Deprecated
@@ -817,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", "");
@@ -839,10 +850,7 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
flags.put("rank", rank == null ? "" : rank);
}
public @NotNull Locale getLocale() {
if (locale == null) {
return SimpleClans.getInstance().getSettingsManager().getLanguage();
}
public @Nullable Locale getLocale() {
return locale;
}
@@ -858,10 +866,29 @@ public class ClanPlayer implements Serializable, Comparable<ClanPlayer> {
}
}
public void mute(Channel channel, boolean b) {
switch (channel) {
case CLAN:
clanChatMute = b;
break;
case ALLY:
allyChatMute = b;
}
}
/**
* @deprecated use {@link ClanPlayer#mute(Channel, boolean)}
*/
@Deprecated
public void setMuted(boolean b) {
clanChatMute = b;
}
/**
* @deprecated use {@link ClanPlayer#mute(Channel, boolean)}
*/
@Deprecated
public void setMutedAlly(boolean b) {
allyChatMute = b;
}
@@ -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
}
@@ -1,60 +0,0 @@
package net.sacredlabyrinth.phaed.simpleclans;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandMap;
import org.bukkit.command.PluginCommand;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.SimplePluginManager;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.Arrays;
public class CommandHelper {
private CommandHelper() {
}
public static void registerCommand(String... aliases) {
if (aliases != null) {
PluginCommand command = getCommand(aliases[0], SimpleClans.getInstance());
if (command != null) {
command.setAliases(Arrays.asList(aliases));
getCommandMap().register(SimpleClans.getInstance().getDescription().getName(), command);
}
}
}
private static PluginCommand getCommand(String name, Plugin plugin) {
PluginCommand command = null;
try {
Constructor<PluginCommand> c = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class);
c.setAccessible(true);
command = c.newInstance(name, plugin);
} catch (Exception e) {
e.printStackTrace();
}
return command;
}
private static CommandMap getCommandMap() {
CommandMap commandMap = null;
try {
if (Bukkit.getPluginManager() instanceof SimplePluginManager) {
Field f = SimplePluginManager.class.getDeclaredField("commandMap");
f.setAccessible(true);
commandMap = (CommandMap) f.get(Bukkit.getPluginManager());
}
} catch (Exception e) {
e.printStackTrace();
}
return commandMap;
}
}
@@ -1,65 +0,0 @@
package net.sacredlabyrinth.phaed.simpleclans;
import java.util.Date;
/**
* @author phaed
*/
public class DamageRecord {
private String victim;
private String attacker;
private Date time;
/**
* @param victim
* @param attacker
*/
public DamageRecord(String victim, String attacker) {
this.victim = victim;
this.attacker = attacker;
this.time = new Date();
}
/**
* @return the victim
*/
public String getVictim() {
return victim;
}
/**
* @param victim the victim to set
*/
public void setVictim(String victim) {
this.victim = victim;
}
/**
* @return the attacker
*/
public String getAttacker() {
return attacker;
}
/**
* @param attacker the attacker to set
*/
public void setAttacker(String attacker) {
this.attacker = attacker;
}
/**
* @return the time
*/
public Date getTime() {
return new Date(time.getTime());
}
/**
* @param time the time to set
*/
public void setTime(Date time) {
this.time = new Date(time.getTime());
}
}
@@ -75,9 +75,11 @@ 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 > 1 day)
* @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
*/
public static String formatTime(Long seconds, int depth) {
@@ -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();
}
}
File diff suppressed because it is too large. Load diff
@@ -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;
}
@@ -21,6 +21,7 @@ public enum RankPermission {
COORDS("simpleclans.member.coords", PermissionLevel.TRUSTED),
FEE_ENABLE("simpleclans.leader.fee", PermissionLevel.LEADER),
FEE_SET("simpleclans.leader.fee", PermissionLevel.LEADER),
FEE_BYPASS("", PermissionLevel.LEADER),
REGROUP_HOME("simpleclans.leader.regroup.home", PermissionLevel.LEADER),
REGROUP_ME("simpleclans.leader.regroup.me", PermissionLevel.LEADER),
HOME_SET("simpleclans.leader.home-set", PermissionLevel.LEADER),
@@ -6,6 +6,8 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.REQUEST_MAX;
/**
* @author phaed
*/
@@ -18,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,
@@ -178,6 +179,6 @@ public final class Request {
}
public boolean reachedRequestLimit() {
return askCount > SimpleClans.getInstance().getSettingsManager().getMaxAsksPerRequest();
return askCount > SimpleClans.getInstance().getSettingsManager().getInt(REQUEST_MAX);
}
}
@@ -3,19 +3,25 @@ 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.managers.*;
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;
import org.bstats.charts.SimplePie;
import org.bstats.charts.SingleLineChart;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginManager;
@@ -31,6 +37,9 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.Bukkit.getPluginManager;
/**
* @author Phaed
*/
@@ -49,10 +58,13 @@ public class SimpleClans extends JavaPlugin {
private PermissionsManager permissionsManager;
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
@@ -63,7 +75,7 @@ public class SimpleClans extends JavaPlugin {
}
public static void debug(String msg) {
if (getInstance().getSettingsManager().isDebugging()) {
if (getInstance().getSettingsManager().is(DEBUG)) {
logger.log(Level.INFO, msg);
}
}
@@ -88,24 +100,28 @@ public class SimpleClans extends JavaPlugin {
public void onEnable() {
instance = this;
new LanguageMigration(this).migrate();
settingsManager = new SettingsManager();
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();
migrateChatFormat();
chatManager = new ChatManager(this);
registerEvents();
permissionsManager.loadPermissions();
commandManager = new SCCommandManager(this);
bankLogger = new CSVBankLogger(this);
tagValidator = new TagValidator(settingsManager, permissionsManager);
logStatus();
startTasks();
startMetrics();
@@ -114,30 +130,25 @@ public class SimpleClans extends JavaPlugin {
}
private void logStatus() {
getLogger().info("Multithreading: " + SimpleClans.getInstance().getSettingsManager().getUseThreads());
getLogger().info("BungeeCord: " + SimpleClans.getInstance().getSettingsManager().getUseBungeeCord());
getLogger().info("Multithreading: " + settingsManager.is(PERFORMANCE_USE_THREADS));
getLogger().info("BungeeCord: " + settingsManager.is(PERFORMANCE_USE_BUNGEECORD));
getLogger().info("HEX support: " + ChatUtils.HEX_COLOR_SUPPORT);
getLogger().info("Help us translate SimpleClans to your language! " +
"Access https://crowdin.com/project/simpleclans/");
}
private void registerEvents() {
PluginManager pm = getServer().getPluginManager();
pm.registerEvents(new PlayerDeath(), this);
pm.registerEvents(new SCPlayerListener(), this);
pm.registerEvents(new PlayerDeath(this), this);
pm.registerEvents(new SCPlayerListener(this), this);
pm.registerEvents(new InventoryController(), this);
pm.registerEvents(new TamableMobsSharing(this), this);
pm.registerEvents(new PvPOnlyInWar(this), this);
pm.registerEvents(new FriendlyFire(this), this);
}
private void migrateChatFormat() {
ChatFormatMigration chatFormatMigration = new ChatFormatMigration();
chatFormatMigration.migrateAllyChat();
chatFormatMigration.migrateClanChat();
}
private void hookIntoPAPI() {
if (getServer().getPluginManager().getPlugin("PlaceholderAPI") != null) {
if (getPluginManager().getPlugin("PlaceholderAPI") != null) {
getLogger().info("PlaceholderAPI found. Registering hook...");
new SimpleClansExpansion(this).register();
}
@@ -149,43 +160,43 @@ public class SimpleClans extends JavaPlugin {
ClanManager cm = getClanManager();
String on = "enabled";
String off = "disabled";
metrics.addCustomChart(new Metrics.SingleLineChart("clans", () -> cm.getClans().size()));
metrics.addCustomChart(new Metrics.SingleLineChart("clan_players", () -> cm.getAllClanPlayers().size()));
metrics.addCustomChart(new Metrics.SimplePie("language", () -> sm.getLanguage().toString()));
metrics.addCustomChart(new Metrics.SimplePie("machine_language", () -> Locale.getDefault().toString()));
metrics.addCustomChart(new Metrics.SimplePie("language_chooser", () -> sm.isLanguagePerPlayer() ? on : off));
metrics.addCustomChart(new Metrics.SimplePie("database", () -> sm.isUseMysql() ? "MySQL" : "SQLite"));
metrics.addCustomChart(new Metrics.SimplePie("save_periodically", () -> sm.isSavePeriodically() ? on : off));
metrics.addCustomChart(new Metrics.SimplePie("save_interval", () -> String.valueOf(sm.getSaveInterval())));
metrics.addCustomChart(new Metrics.SimplePie("upkeep", () -> sm.isClanUpkeep() ? on : off));
metrics.addCustomChart(new Metrics.SimplePie("member_fee", () -> sm.isMemberFee() ? on : off));
metrics.addCustomChart(new Metrics.SimplePie("rejoin_cooldown", () -> sm.isRejoinCooldown() ? on : off));
metrics.addCustomChart(new Metrics.SimplePie("clan_verification", () -> sm.isRequireVerification() ? on : off));
metrics.addCustomChart(new Metrics.SimplePie("money_per_kill", () -> sm.isMoneyPerKill() ? on : off));
metrics.addCustomChart(new Metrics.SimplePie("threads", () -> sm.getUseThreads() ? on : off));
metrics.addCustomChart(new Metrics.SimplePie("bungeecord", () -> sm.getUseBungeeCord() ? on : off));
metrics.addCustomChart(new SingleLineChart("clans", () -> cm.getClans().size()));
metrics.addCustomChart(new SingleLineChart("clan_players", () -> cm.getAllClanPlayers().size()));
metrics.addCustomChart(new SimplePie("language", () -> sm.getLanguage().toString()));
metrics.addCustomChart(new SimplePie("machine_language", () -> Locale.getDefault().toString()));
metrics.addCustomChart(new SimplePie("language_chooser", () -> sm.is(LANGUAGE_SELECTOR) ? on : off));
metrics.addCustomChart(new SimplePie("database", () -> sm.is(MYSQL_ENABLE) ? "MySQL" : "SQLite"));
metrics.addCustomChart(new SimplePie("save_periodically", () -> sm.is(PERFORMANCE_SAVE_PERIODICALLY) ? on : off));
metrics.addCustomChart(new SimplePie("save_interval", () -> sm.getString(PERFORMANCE_SAVE_INTERVAL)));
metrics.addCustomChart(new SimplePie("upkeep", () -> sm.is(ECONOMY_UPKEEP_ENABLED) ? on : off));
metrics.addCustomChart(new SimplePie("member_fee", () -> sm.is(ECONOMY_MEMBER_FEE_ENABLED) ? on : off));
metrics.addCustomChart(new SimplePie("rejoin_cooldown", () -> sm.is(ENABLE_REJOIN_COOLDOWN) ? on : off));
metrics.addCustomChart(new SimplePie("clan_verification", () -> sm.is(REQUIRE_VERIFICATION) ? on : off));
metrics.addCustomChart(new SimplePie("money_per_kill", () -> sm.is(ECONOMY_MONEY_PER_KILL) ? on : off));
metrics.addCustomChart(new SimplePie("threads", () -> sm.is(PERFORMANCE_USE_THREADS) ? on : off));
metrics.addCustomChart(new SimplePie("bungeecord", () -> sm.is(PERFORMANCE_USE_BUNGEECORD) ? on : off));
metrics.addCustomChart(new SimplePie("discord_chat", () -> sm.is(DISCORDCHAT_ENABLE) ? on : off));
}
private void startTasks() {
if (getSettingsManager().isSavePeriodically()) {
if (getSettingsManager().is(PERFORMANCE_SAVE_PERIODICALLY)) {
new SaveDataTask().start();
}
if (getSettingsManager().isMemberFee()) {
if (getSettingsManager().is(ECONOMY_MEMBER_FEE_ENABLED)) {
new CollectFeeTask().start();
}
if (getSettingsManager().isClanUpkeep()) {
if (getSettingsManager().is(ECONOMY_UPKEEP_ENABLED)) {
new CollectUpkeepTask().start();
new UpkeepWarningTask().start();
}
if (getSettingsManager().isCachePlayerHeads()) {
if (getSettingsManager().is(PERFORMANCE_HEAD_CACHING)) {
new PlayerHeadCacheTask(this).start();
}
}
@Override
public void onDisable() {
if (getSettingsManager().isSavePeriodically()) {
if (getSettingsManager().is(PERFORMANCE_SAVE_PERIODICALLY)) {
getStorageManager().saveModified();
}
getStorageManager().closeConnection();
@@ -237,6 +248,14 @@ public class SimpleClans extends JavaPlugin {
return protectionManager;
}
public ChatManager getChatManager() {
return chatManager;
}
public ProxyManager getProxyManager() {
return proxyManager;
}
public BankLogger getBankLogger() {
return bankLogger;
}
@@ -256,13 +275,10 @@ public class SimpleClans extends JavaPlugin {
}
@Nullable
public static String optionalLang(@NotNull String key, @Nullable Player player, Object... arguments) {
Locale locale = getInstance().getSettingsManager().getLanguage();
if (player != null && instance.getSettingsManager().isLanguagePerPlayer()) {
Locale playerLocale = Helper.getLocale(player);
if (playerLocale != null) {
locale = playerLocale;
}
public static String optionalLang(@NotNull String key, @Nullable ClanPlayer clanPlayer, Object... arguments) {
Locale locale = instance.getSettingsManager().getLanguage();
if (clanPlayer != null && clanPlayer.getLocale() != null && instance.getSettingsManager().is(LANGUAGE_SELECTOR)) {
locale = clanPlayer.getLocale();
}
String lang = languageResource.getLang(key, locale);
@@ -277,13 +293,25 @@ public class SimpleClans extends JavaPlugin {
return MessageFormat.format(message, arguments);
}
@Nullable
public static String optionalLang(@NotNull String key, @Nullable Player player, Object... arguments) {
ClanPlayer clanPlayer = null;
if (player != null) {
clanPlayer = instance.getClanManager().getAnyClanPlayer(player.getUniqueId());
}
return optionalLang(key, clanPlayer, arguments);
}
@NotNull
public static String lang(@NotNull String key, @Nullable Player player, Object... arguments) {
String lang = optionalLang(key, player, arguments);
if (lang == null) {
return key;
}
return lang;
return (lang == null) ? key : lang;
}
@NotNull
public static String lang(@NotNull String key, @Nullable ClanPlayer clanPlayer, Object... arguments) {
String lang = optionalLang(key, clanPlayer, arguments);
return (lang == null) ? key : lang;
}
@NotNull
@@ -322,7 +350,12 @@ public class SimpleClans extends JavaPlugin {
return this.hasUUID;
}
@Deprecated
public void setUUID(boolean trueOrFalse) {
this.hasUUID = trueOrFalse;
}
public TagValidator getTagValidator() {
return tagValidator;
}
}
@@ -1,30 +1,31 @@
package net.sacredlabyrinth.phaed.simpleclans;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
import java.util.UUID;
public class TeleportState {
private final UUID playerUniqueId;
private final Location playerLocation;
private final OfflinePlayer offlinePlayer;
private final Location origin;
private final Location destination;
private int counter;
private final String clanName;
private boolean processing;
public TeleportState(Player player, Location destination, String clanName) {
public TeleportState(Player player, Location destination, String clanName, int counter) {
this.offlinePlayer = player;
this.destination = destination;
this.playerLocation = player.getLocation();
this.origin = player.getLocation();
this.clanName = clanName;
this.counter = SimpleClans.getInstance().getSettingsManager().getWaitSecs();
this.playerUniqueId = player.getUniqueId();
this.counter = counter;
}
public Location getLocation() {
return this.playerLocation;
return this.origin;
}
public boolean isTeleportTime() {
@@ -42,7 +43,7 @@ public class TeleportState {
* @return the player
*/
public @Nullable Player getPlayer() {
return SimpleClans.getInstance().getServer().getPlayer(this.playerUniqueId);
return offlinePlayer.getPlayer();
}
/**
@@ -74,7 +75,4 @@ public class TeleportState {
this.processing = processing;
}
public UUID getUniqueId() {
return this.playerUniqueId;
}
}
@@ -2,12 +2,9 @@ package net.sacredlabyrinth.phaed.simpleclans;
/**
* Possible vote values
*/
/**
*
* @author cc_madelg
*/
public enum VoteResult
{
public enum VoteResult {
ACCEPT, DENY
}
@@ -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<>();
@@ -0,0 +1,18 @@
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);
boolean canHandle(SCMessage.Source source);
}
@@ -0,0 +1,90 @@
package net.sacredlabyrinth.phaed.simpleclans.chat;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
public class SCMessage implements Cloneable {
private final Source source;
private final ClanPlayer.Channel channel;
private final ClanPlayer sender;
private List<ClanPlayer> receivers;
private String content;
/**
* Creates a message with initial parameters
*
* @param source The source of message
* @param channel The channel of clan player
* @param sender The clan player sender
* @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) {
this.source = source;
this.channel = channel;
this.sender = sender;
this.content = content;
this.receivers = receivers;
}
/**
* Creates a new SCMessage without receivers
*
* @see SCMessage#SCMessage(Source, ClanPlayer.Channel, ClanPlayer, String, List) instantiate with initial receievers
*/
public SCMessage(@NotNull Source source, @NotNull ClanPlayer.Channel channel, @NotNull ClanPlayer sender, String content) {
this(source, channel, sender, content, new ArrayList<>());
}
public ClanPlayer.Channel getChannel() {
return channel;
}
public ClanPlayer getSender() {
return sender;
}
public String getContent() {
return content;
}
public Source getSource() {
return source;
}
public List<ClanPlayer> getReceivers() {
return receivers;
}
public void setContent(@NotNull String content) {
this.content = content;
}
public void setReceivers(@NotNull List<ClanPlayer> receivers) {
this.receivers = receivers;
}
@Override
public SCMessage clone() {
try {
return (SCMessage) super.clone();
} catch (CloneNotSupportedException e) {
throw new Error(); //never thrown
}
}
/**
* The place where the message came from.
* Used by ChatHandlers to know which SCMessages they can handle.
*
* @see ChatHandler initiate the handler
*/
public enum Source {
SPIGOT, DISCORD, PROXY
}
}
@@ -0,0 +1,48 @@
package net.sacredlabyrinth.phaed.simpleclans.chat.handlers;
import github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel;
import github.scarsz.discordsrv.util.DiscordUtil;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.chat.ChatHandler;
import net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage;
import net.sacredlabyrinth.phaed.simpleclans.hooks.discord.DiscordHook;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
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_FORMAT_TO;
/**
* Handles delivering messages from {@link Source#SPIGOT} to {@link Source#DISCORD}.
*/
public class DiscordChatHandler implements ChatHandler {
@Override
public void sendMessage(@NotNull SCMessage message) {
if (message.getChannel() != CLAN) {
return;
}
String format = settingsManager.getString(DISCORDCHAT_FORMAT_TO);
String formattedMessage = ChatUtils.stripColors(chatManager.parseChatFormat(format, message));
Clan clan = message.getSender().getClan();
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));
}
@Override
public boolean canHandle(SCMessage.Source source) {
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);
}
}
@@ -0,0 +1,74 @@
package net.sacredlabyrinth.phaed.simpleclans.chat.handlers;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
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.events.ChatEvent;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.scheduler.BukkitRunnable;
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.PERFORMANCE_USE_BUNGEECORD;
import static org.bukkit.Bukkit.getPluginManager;
@SuppressWarnings("unused")
public class SpigotChatHandler implements ChatHandler {
@Override
public void sendMessage(SCMessage message) {
/*
TODO: Make it async, change Type to Channel in 3.0
*/
new BukkitRunnable() {
@Override
public void run() {
ChatEvent event = new ChatEvent(message.getContent(), message.getSender(), message.getReceivers(),
ChatEvent.Type.valueOf(message.getChannel().name()));
getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
message.setContent(stripColorsAndFormatsPerPermission(message.getSender(),event.getMessage()));
ConfigField configField = ConfigField.valueOf(String.format("%sCHAT_FORMAT",
message.getSource() == DISCORD ? "DISCORD" : message.getChannel()));
String format = settingsManager.getString(configField);
String formattedMessage = chatManager.parseChatFormat(format, message, event.getPlaceholders());
plugin.getLogger().info(ChatUtils.stripColors(formattedMessage));
for (ClanPlayer cp : message.getReceivers()) {
ChatBlock.sendMessage(cp, formattedMessage);
}
}
}.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 == PROXY && settingsManager.is(PERFORMANCE_USE_BUNGEECORD))
|| (source == DISCORD && chatManager.isDiscordHookEnabled());
}
}
@@ -0,0 +1,55 @@
package net.sacredlabyrinth.phaed.simpleclans.chat.handlers;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
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.*;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PERFORMANCE_USE_BUNGEECORD;
/**
* Handles delivering messages from {@link Source#SPIGOT} or {@link Source#DISCORD} to internal spy chat.
*/
public class SpyChatHandler implements ChatHandler {
@Override
public void sendMessage(SCMessage message) {
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> onlineSpies = getOnlineSpies();
// 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 == PROXY && settingsManager.is(PERFORMANCE_USE_BUNGEECORD))
|| (source == DISCORD && chatManager.isDiscordHookEnabled());
}
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());
}
}
@@ -6,6 +6,8 @@ import co.aikar.commands.CommandIssuer;
import co.aikar.commands.PaperCommandManager;
import co.aikar.locales.MessageKey;
import co.aikar.locales.MessageKeyProvider;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.Helper;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.commands.completions.AbstractAsyncCompletion;
import net.sacredlabyrinth.phaed.simpleclans.commands.completions.AbstractCompletion;
@@ -22,7 +24,6 @@ import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.reflections.Reflections;
import java.lang.reflect.Modifier;
import java.util.Arrays;
@@ -32,6 +33,7 @@ import java.util.logging.Level;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.optionalLang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
public class SCCommandManager extends PaperCommandManager {
private final SimpleClans plugin;
@@ -44,13 +46,14 @@ public class SCCommandManager extends PaperCommandManager {
}
private void configure() {
registerDependencies();
enableUnstableAPI("help");
registerDependencies();
addCommandReplacements();
registerContexts();
registerCommands();
registerConditions();
registerCompletions();
defaultHelpPerPage = plugin.getSettingsManager().getInt(HELP_SIZE);
}
private void registerDependencies() {
@@ -60,11 +63,13 @@ public class SCCommandManager extends PaperCommandManager {
registerDependency(PermissionsManager.class, plugin.getPermissionsManager());
registerDependency(RequestManager.class, plugin.getRequestManager());
registerDependency(ProtectionManager.class, plugin.getProtectionManager());
registerDependency(ChatManager.class, plugin.getChatManager());
}
private void registerCompletions() {
Reflections reflections = new Reflections("net.sacredlabyrinth.phaed.simpleclans.commands.completions");
Set<Class<? extends AbstractCompletion>> completions = reflections.getSubTypesOf(AbstractCompletion.class);
Set<Class<? extends AbstractCompletion>> completions =
Helper.getSubTypesOf("net.sacredlabyrinth.phaed.simpleclans.commands.completions",
AbstractCompletion.class);
plugin.getLogger().info(String.format("Registering %d command completions...", completions.size()));
for (Class<? extends AbstractCompletion> c : completions) {
if (Modifier.isAbstract(c.getModifiers())) {
@@ -90,8 +95,9 @@ public class SCCommandManager extends PaperCommandManager {
@SuppressWarnings("unchecked")
private void registerConditions() {
Reflections reflections = new Reflections("net.sacredlabyrinth.phaed.simpleclans.commands.conditions");
Set<Class<? extends AbstractCondition>> conditions = reflections.getSubTypesOf(AbstractCondition.class);
Set<Class<? extends AbstractCondition>> conditions =
Helper.getSubTypesOf("net.sacredlabyrinth.phaed.simpleclans.commands.conditions",
AbstractCondition.class);
plugin.getLogger().info(String.format("Registering %d command conditions...", conditions.size()));
for (Class<? extends AbstractCondition> c : conditions) {
if (Modifier.isAbstract(c.getModifiers())) {
@@ -116,8 +122,9 @@ public class SCCommandManager extends PaperCommandManager {
@SuppressWarnings({"rawtypes", "unchecked"})
private void registerContexts() {
Reflections reflections = new Reflections("net.sacredlabyrinth.phaed.simpleclans.commands.contexts");
Set<Class<? extends AbstractContextResolver>> resolvers = reflections.getSubTypesOf(AbstractContextResolver.class);
Set<Class<? extends AbstractContextResolver>> resolvers =
Helper.getSubTypesOf("net.sacredlabyrinth.phaed.simpleclans.commands.contexts",
AbstractContextResolver.class);
plugin.getLogger().info(String.format("Registering %d command contexts...", resolvers.size()));
for (Class<? extends AbstractContextResolver> cr : resolvers) {
if (Modifier.isAbstract(cr.getModifiers())) {
@@ -138,9 +145,8 @@ public class SCCommandManager extends PaperCommandManager {
}
private void registerCommands() {
boolean forceCommandPriority = plugin.getSettingsManager().isForceCommandPriority();
Reflections reflections = new Reflections("net.sacredlabyrinth.phaed.simpleclans.commands");
Set<Class<? extends BaseCommand>> commands = reflections.getSubTypesOf(BaseCommand.class);
boolean forceCommandPriority = plugin.getSettingsManager().is(COMMANDS_FORCE_PRIORITY);
Set<Class<? extends BaseCommand>> commands = Helper.getSubTypesOf("net.sacredlabyrinth.phaed.simpleclans.commands", BaseCommand.class);
plugin.getLogger().info(String.format("Registering %d base commands...", commands.size()));
for (Class<? extends BaseCommand> c : commands) {
//ACF already registers nested classes
@@ -160,16 +166,16 @@ public class SCCommandManager extends PaperCommandManager {
SettingsManager sm = plugin.getSettingsManager();
getCommandReplacements().addReplacements(
"basic_conditions", "not_blacklisted|not_banned",
"clan", sm.getCommandClan(),
"deny", sm.getCommandDeny() + "|deny",
"more", sm.getCommandMore(),
"ally_chat", sm.getCommandAlly(),
"accept", sm.getCommandAccept() + "|accept",
"clan_chat", sm.getCommandClanChat()
"clan", sm.getString(COMMANDS_CLAN),
"deny", sm.getString(COMMANDS_DENY) + "|deny",
"more", sm.getString(COMMANDS_MORE),
"ally_chat", sm.getString(COMMANDS_ALLY),
"accept", sm.getString(COMMANDS_ACCEPT) + "|accept",
"clan_chat", sm.getString(COMMANDS_CLAN_CHAT)
);
SUBCOMMANDS.forEach(s -> {
String command = optionalLang(s + ".command", null);
String command = optionalLang(s + ".command", (ClanPlayer) null);
if (command == null) {
command = s;
}
@@ -206,7 +212,6 @@ public class SCCommandManager extends PaperCommandManager {
};
//this.locales.loadLanguages();
}
return this.locales;
}
@@ -214,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");
"container", "permanent", "take", "give", "join", "leave", "mute", "confirm", "balance", "discord", "rename", "locale");
}
}
@@ -2,29 +2,67 @@ package net.sacredlabyrinth.phaed.simpleclans.commands.clan;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
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 org.bukkit.entity.Player;
import net.sacredlabyrinth.phaed.simpleclans.managers.StorageManager;
import static net.sacredlabyrinth.phaed.simpleclans.ClanPlayer.Channel.ALLY;
import static net.sacredlabyrinth.phaed.simpleclans.ClanPlayer.Channel.NONE;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.SPIGOT;
@CommandAlias("%ally_chat")
@Description("{@@command.description.ally}")
@CommandPermission("simpleclans.member.ally")
@Conditions("%basic_conditions|clan_member|rank:name=ALLY_CHAT")
@Conditions("%basic_conditions|clan_member|can_chat:type=ALLY|rank:name=ALLY_CHAT")
public class AllyChatCommand extends BaseCommand {
@Dependency
private ClanManager clanManager;
private ChatManager chatManager;
@Dependency
private SettingsManager settingsManager;
@Dependency
private StorageManager storageManager;
@Default
@HelpSearchTags("chat")
@CommandCompletion("@chat_subcommands")
public void sendMessage(Player player, @Name("message") String message) {
if (!settingsManager.isAllyChatEnable()) {
return;
}
clanManager.processAllyChat(player, message);
public void sendMessage(ClanPlayer cp, @Name("message") String message) {
chatManager.processChat(SPIGOT, ALLY, cp, message);
}
@Subcommand("%join")
public void join(ClanPlayer clanPlayer) {
if (clanPlayer.getChannel() == ALLY) {
ChatBlock.sendMessage(clanPlayer, lang("already.joined.ally.chat"));
return;
}
clanPlayer.setChannel(ALLY);
storageManager.updateClanPlayer(clanPlayer);
ChatBlock.sendMessage(clanPlayer, lang("joined.ally.chat"));
}
@Subcommand("%leave")
public void leave(ClanPlayer clanPlayer) {
if (clanPlayer.getChannel() == ALLY) {
clanPlayer.setChannel(NONE);
storageManager.updateClanPlayer(clanPlayer);
ChatBlock.sendMessage(clanPlayer, lang("left.ally.chat", clanPlayer));
} else {
ChatBlock.sendMessage(clanPlayer, lang("chat.didnt.join", clanPlayer));
}
}
@Subcommand("%mute")
public void mute(ClanPlayer clanPlayer) {
if (!clanPlayer.isMutedAlly()) {
clanPlayer.mute(ALLY, true);
ChatBlock.sendMessage(clanPlayer, lang("muted.ally.chat", clanPlayer));
} else {
clanPlayer.mute(ALLY, false);
ChatBlock.sendMessage(clanPlayer, lang("unmuted.ally.chat", clanPlayer));
}
}
}
@@ -5,16 +5,17 @@ import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.EconomyResponse;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.events.BankDepositEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.BankWithdrawEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.ClanBalanceUpdateEvent;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankLogger;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankOperator;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
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.COMMAND;
import static net.sacredlabyrinth.phaed.simpleclans.events.ClanBalanceUpdateEvent.Cause.REVERT;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.RED;
@@ -49,7 +50,6 @@ public class BankCommand extends BaseCommand {
processWithdraw(player, clan, amount);
}
@SuppressWarnings("deprecation")
private void processWithdraw(Player player, Clan clan, double amount) {
if (!clan.isAllowWithdraw()) {
String message = getCurrentCommandManager().getCommandReplacements()
@@ -58,24 +58,28 @@ public class BankCommand extends BaseCommand {
return;
}
amount = Math.abs(amount);
/*
TODO: Remove at SimpleClans 3.0
*/
BankWithdrawEvent event = new BankWithdrawEvent(player, clan, amount);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
switch (clan.withdraw(player, ClanBalanceUpdateEvent.Cause.COMMAND, amount)) {
case SUCCESS:
if (SimpleClans.getInstance().getPermissionsManager().playerGrantMoney(player, amount)) {
/*
* ——————————————————————————————————
*/
BankOperator operator = new BankOperator(player, permissions.playerGetMoney(player));
switch (clan.withdraw(operator, COMMAND, 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));
clan.addBb(player.getName(), lang("bb.clan.withdraw", amount, player.getName()));
} else {
clan.setBalance(player, ClanBalanceUpdateEvent.Cause.REVERT, BankLogger.Operation.WITHDRAW, clan.getBalance() + amount);
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));
}
}
@@ -95,7 +99,6 @@ public class BankCommand extends BaseCommand {
processDeposit(player, clan, amount);
}
@SuppressWarnings("deprecation")
private void processDeposit(Player player, Clan clan, double amount) {
if (!clan.isAllowDeposit()) {
String message = getCurrentCommandManager().getCommandReplacements()
@@ -104,23 +107,32 @@ public class BankCommand extends BaseCommand {
return;
}
amount = Math.abs(amount);
/*
TODO: Remove at SimpleClans 3.0
*/
BankDepositEvent event = new BankDepositEvent(player, clan, amount);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
/*
* ——————————————————————————————————
*/
if (!permissions.playerHasMoney(player, amount)) {
player.sendMessage(AQUA + lang("not.sufficient.money", player));
player.sendMessage(AQUA + lang("not.sufficient.money", player, amount));
return;
}
EconomyResponse response = clan.deposit(player, ClanBalanceUpdateEvent.Cause.COMMAND, amount);
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));
clan.addBb(player.getName(), lang("bb.clan.deposit", amount, player.getName()));
} else {
//Reverts the deposit if something went wrong with Vault
clan.setBalance(player, ClanBalanceUpdateEvent.Cause.REVERT, BankLogger.Operation.DEPOSIT, clan.getBalance() - amount);
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);
}
}
@@ -2,29 +2,64 @@ 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.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import org.bukkit.entity.Player;
import net.sacredlabyrinth.phaed.simpleclans.managers.ChatManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.StorageManager;
import static net.sacredlabyrinth.phaed.simpleclans.ClanPlayer.Channel.CLAN;
import static net.sacredlabyrinth.phaed.simpleclans.ClanPlayer.Channel.NONE;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.chat.SCMessage.Source.SPIGOT;
@CommandAlias("%clan_chat")
@Conditions("%basic_conditions|clan_member")
@Conditions("%basic_conditions|clan_member|can_chat:type=CLAN")
@CommandPermission("simpleclans.member.chat")
@Description("{@@command.description.chat}")
public class ChatCommand extends BaseCommand {
@Dependency
private ClanManager clanManager;
private ChatManager chatManager;
@Dependency
private SettingsManager settingsManager;
private StorageManager storageManager;
@Default
@HelpSearchTags("chat")
@CommandCompletion("@chat_subcommands")
public void sendMessage(Player player, ClanPlayer cp, @Name("message") String message) {
if (!settingsManager.getClanChatEnable()) {
public void sendMessage(ClanPlayer cp, @Name("message") String message) {
chatManager.processChat(SPIGOT, CLAN, cp, message);
}
@Subcommand("%join")
public void join(ClanPlayer clanPlayer) {
if (clanPlayer.getChannel() == CLAN) {
ChatBlock.sendMessage(clanPlayer, lang("already.joined.clan.chat"));
return;
}
clanManager.processClanChat(player, cp.getTag(), message);
clanPlayer.setChannel(CLAN);
storageManager.updateClanPlayer(clanPlayer);
ChatBlock.sendMessage(clanPlayer, lang("joined.clan.chat"));
}
@Subcommand("%leave")
public void leave(ClanPlayer clanPlayer) {
if (clanPlayer.getChannel() == CLAN) {
clanPlayer.setChannel(NONE);
storageManager.updateClanPlayer(clanPlayer);
ChatBlock.sendMessage(clanPlayer, lang("left.clan.chat", clanPlayer));
} else {
ChatBlock.sendMessage(clanPlayer, lang("chat.didnt.join", clanPlayer));
}
}
@Subcommand("%mute")
public void mute(ClanPlayer clanPlayer) {
if (!clanPlayer.isMuted()) {
clanPlayer.mute(CLAN, true);
ChatBlock.sendMessage(clanPlayer, lang("muted.clan.chat", clanPlayer));
} else {
clanPlayer.mute(CLAN, false);
ChatBlock.sendMessage(clanPlayer, lang("unmuted.clan.chat", clanPlayer));
}
}
}
@@ -10,14 +10,15 @@ 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.*;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.RED;
@@ -49,7 +50,7 @@ public class ClanCommands extends BaseCommand {
List<ClanPlayer> onlineLeaders = Helper.stripOffLinePlayers(requestClan.getLeaders());
if (settings.isWarRequestEnabled()) {
if (settings.is(WAR_START_REQUEST_ENABLED)) {
if (!onlineLeaders.isEmpty()) {
requestManager.addWarStartRequest(requester, targetClan, requestClan);
ChatBlock.sendMessage(player, AQUA + lang("leaders.have.been.asked.to.accept.the.war.request",
@@ -67,13 +68,13 @@ public class ClanCommands extends BaseCommand {
@Conditions("verified|rank:name=WAR_END")
@Description("{@@command.description.war.end}")
@CommandCompletion("@warring_clans")
public void endWar(Player player, ClanPlayer cp, Clan issuerClan, @Name("clan") ClanInput other) {
public void endWar(ClanPlayer cp, Clan issuerClan, @Name("clan") ClanInput other) {
Clan war = other.getClan();
if (issuerClan.isWarring(war.getTag())) {
requestManager.addWarEndRequest(cp, war, issuerClan);
ChatBlock.sendMessage(player, AQUA + lang("leaders.asked.to.end.rivalry", player, war.getName()));
ChatBlock.sendMessage(cp, AQUA + lang("leaders.asked.to.end.rivalry", cp, war.getName()));
} else {
ChatBlock.sendMessage(player, RED + lang("clans.not.at.war", player));
ChatBlock.sendMessage(cp, RED + lang("clans.not.at.war", cp));
}
}
@@ -90,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;
}
@@ -102,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);
}
@@ -131,6 +132,10 @@ 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()) {
ChatBlock.sendMessage(sender, RED + lang("invitedplayer.invite.off", sender));
return;
}
Player invitedPlayer = invited.getClanPlayer().toPlayer();
if (invitedPlayer == null) return;
if (!permissions.has(invitedPlayer, "simpleclans.member.can-join")) {
@@ -149,7 +154,7 @@ public class ClanCommands extends BaseCommand {
return;
}
if (clan.getSize() >= settings.getMaxMembers() && settings.getMaxMembers() > 0) {
if (clan.getSize() >= settings.getInt(CLAN_MAX_MEMBERS) && settings.getInt(CLAN_MAX_MEMBERS) > 0) {
ChatBlock.sendMessage(sender, RED + lang("the.clan.members.reached.limit", sender));
return;
}
@@ -180,7 +185,7 @@ public class ClanCommands extends BaseCommand {
@Description("{@@command.description.fee.set}")
public void setFee(Player player, Clan clan, @Name("fee") double fee) {
fee = Math.abs(fee);
double maxFee = settings.getMaxMemberFee();
double maxFee = settings.getDouble(ECONOMY_MAX_MEMBER_FEE);
if (fee > maxFee) {
ChatBlock.sendMessage(player, RED
+ lang("max.fee.allowed.is.0", player, maxFee));
@@ -188,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);
}
@@ -199,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);
}
@@ -208,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);
}
@@ -218,14 +223,14 @@ public class ClanCommands extends BaseCommand {
@Conditions("verified|rank:name=DESCRIPTION")
@Description("{@@command.description.description}")
public void setDescription(Player player, Clan clan, @Name("description") String description) {
if (description.length() < settings.getClanMinDescriptionLength()) {
if (description.length() < settings.getInt(CLAN_MIN_DESCRIPTION_LENGTH)) {
ChatBlock.sendMessage(player, RED + lang("your.clan.description.must.be.longer.than",
player, settings.getClanMinDescriptionLength()));
player, settings.getInt(CLAN_MIN_DESCRIPTION_LENGTH)));
return;
}
if (description.length() > settings.getClanMaxDescriptionLength()) {
if (description.length() > settings.getInt(CLAN_MAX_DESCRIPTION_LENGTH)) {
ChatBlock.sendMessage(player, RED + lang("your.clan.description.cannot.be.longer.than",
player, settings.getClanMaxDescriptionLength()));
player, settings.getInt(CLAN_MAX_DESCRIPTION_LENGTH)));
return;
}
clan.setDescription(description);
@@ -236,7 +241,7 @@ public class ClanCommands extends BaseCommand {
@Subcommand("%rival %add")
@CommandPermission("simpleclans.leader.rival")
@Conditions("verified|rivable|minimum_to_rival|rank:name=RIVAL_ADD")
@CommandCompletion("@clans")
@CommandCompletion("@clans:hide_own")
@Description("{@@command.description.rival.add}")
public void addRival(Player player, Clan issuerClan, @Conditions("verified|different") @Name("clan") ClanInput rival) {
Clan rivalInput = rival.getClan();
@@ -247,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));
@@ -281,7 +286,7 @@ public class ClanCommands extends BaseCommand {
@Subcommand("%ally %add")
@CommandPermission("simpleclans.leader.ally")
@Conditions("verified|rank:name=ALLY_ADD|minimum_to_ally")
@CommandCompletion("@clans")
@CommandCompletion("@clans:hide_own")
@Description("{@@command.description.ally.add}")
public void addAlly(Player player,
ClanPlayer cp,
@@ -292,7 +297,7 @@ public class ClanCommands extends BaseCommand {
ChatBlock.sendMessage(player, RED + lang("your.clans.are.already.allies", player));
return;
}
int maxAlliances = settings.getClanMaxAlliances();
int maxAlliances = settings.getInt(CLAN_MAX_ALLIANCES);
if (maxAlliances != -1) {
if (issuerClan.getAllies().size() >= maxAlliances) {
ChatBlock.sendMessage(player, lang("your.clan.reached.max.alliances", player));
@@ -324,15 +329,15 @@ 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()));
}
@Subcommand("%kick")
@CommandPermission("simpleclans.leader.kick")
@CommandCompletion("@clan_members")
@CommandCompletion("@clan_members:hide_own")
@Conditions("rank:name=KICK")
@Description("{@@command.description.kick}")
public void kick(@Conditions("clan_member") Player sender,
@@ -349,11 +354,31 @@ 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());
}
@Subcommand("%resign %confirm")
@CommandPermission("simpleclans.member.resign")
@Description("{@@command.description.resign}")
@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(), lang("0.has.resigned", player.getName()));
cp.addResignTime(clan.getTag());
clan.removePlayerFromClan(player.getUniqueId());
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()));
} else {
ChatBlock.sendMessage(cp, RED +
lang("last.leader.cannot.resign.you.must.appoint.another.leader.or.disband.the.clan", player));
}
}
@Subcommand("%resign")
@CommandPermission("simpleclans.member.resign")
@Description("{@@command.description.resign}")
@@ -4,16 +4,19 @@ 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;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.*;
@CommandAlias("%clan")
@@ -35,7 +38,7 @@ public class HomeCommands extends BaseCommand {
@Conditions("rank:name=REGROUP_ME")
@Description("{@@command.description.regroup.me}")
public void regroupMe(Player player, ClanPlayer cp, Clan clan) {
if (!settings.getAllowReGroupCommand()) {
if (!settings.is(ALLOW_REGROUP)) {
ChatBlock.sendMessage(player, RED + lang("insufficient.permissions", player));
return;
}
@@ -58,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) {
if (!settings.getAllowReGroupCommand()) {
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);
}
@@ -76,16 +74,11 @@ 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) {
Location loc = clan.getHomeLocation();
if (loc == null) {
ChatBlock.sendMessage(player, RED + lang("hombase.not.set", player));
return;
}
public void teleport(Player player, @Conditions("can_teleport") Clan clan, ClanPlayer cp) {
Location homeLocation = clan.getHomeLocation();
if (cm.purchaseHomeTeleport(player)) {
plugin.getTeleportManager().addPlayer(player, clan.getHomeLocation(), clan.getName());
plugin.getTeleportManager().addPlayer(player, homeLocation, clan.getName());
}
}
@@ -93,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) {
if (settings.isHomebaseSetOnce() && clan.getHomeLocation() != null &&
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));
}
@@ -109,12 +108,12 @@ public class HomeCommands extends BaseCommand {
@CommandPermission("simpleclans.leader.home-set")
@Description("{@@command.description.home.set}")
public void set(Player player, ClanPlayer cp, Clan clan) {
if (settings.isHomebaseSetOnce() && clan.getHomeLocation() != null &&
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;
}
if (settings.isSetBaseOnlyInLand()) {
if (settings.is(LAND_SET_BASE_ONLY_IN_LAND)) {
if (!protection.isOwner(player, player.getLocation())) {
ChatBlock.sendMessageKey(player, "you.can.only.set.base.in.your.land");
return;
@@ -14,9 +14,11 @@ import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.LAND_EDIT_ALL_LANDS;
@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 {
@@ -27,7 +29,7 @@ public class LandCommand extends BaseCommand {
private Set<Land> getLands(ClanPlayer cp, Location location) {
Player player = Objects.requireNonNull(cp.toPlayer());
if (settings.isEditAllLands()) {
if (settings.is(LAND_EDIT_ALL_LANDS)) {
return protection.getLands(player, location);
} else {
return protection.getLandsAt(location).stream().filter(l -> l.getOwners().contains(player.getUniqueId()))
@@ -47,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");
}
}
@@ -116,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,12 @@ 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.*;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import net.sacredlabyrinth.phaed.simpleclans.conversation.DisbandPrompt;
import net.sacredlabyrinth.phaed.simpleclans.conversation.SCConversation;
import net.sacredlabyrinth.phaed.simpleclans.hooks.discord.DiscordHook;
import net.sacredlabyrinth.phaed.simpleclans.hooks.discord.exceptions.DiscordHookException;
import net.sacredlabyrinth.phaed.simpleclans.managers.*;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
@@ -13,6 +15,8 @@ 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.AQUA;
import static org.bukkit.ChatColor.RED;
@@ -20,6 +24,8 @@ import static org.bukkit.ChatColor.RED;
@Conditions("%basic_conditions|leader")
public class LeaderCommands extends BaseCommand {
@Dependency
private SimpleClans plugin;
@Dependency
private StorageManager storage;
@Dependency
@@ -30,6 +36,8 @@ public class LeaderCommands extends BaseCommand {
private RequestManager requestManager;
@Dependency
private ClanManager cm;
@Dependency
private ChatManager chatManager;
@Subcommand("%demote")
@CommandCompletion("@clan_leaders")
@@ -48,13 +56,13 @@ public class LeaderCommands extends BaseCommand {
ChatBlock.sendMessage(player, RED + lang("player.is.not.a.leader.of.your.clan", player));
return;
}
if (clan.getLeaders().size() > 2 && settings.isConfirmationForDemote()) {
if (clan.getLeaders().size() > 2 && settings.is(CLAN_CONFIRMATION_FOR_DEMOTE)) {
requestManager.addDemoteRequest(cp, otherCp.getName(), clan);
ChatBlock.sendMessage(player, AQUA + lang("demotion.vote.has.been.requested.from.all.leaders",
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());
}
@@ -80,14 +88,14 @@ public class LeaderCommands extends BaseCommand {
ChatBlock.sendMessage(player, RED + lang("the.player.is.already.a.leader", player));
return;
}
if (settings.isConfirmationForPromote() && clan.getLeaders().size() > 1) {
requestManager.addPromoteRequest(cp, otherPl.getName(), clan);
if (settings.is(CLAN_CONFIRMATION_FOR_PROMOTE) && clan.getLeaders().size() > 1) {
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());
}
@@ -96,13 +104,13 @@ 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;
}
clan.disband(player, true, false);
new SCConversation(plugin, player, new DisbandPrompt()).begin();
}
@Subcommand("%verify")
@@ -113,18 +121,18 @@ public class LeaderCommands extends BaseCommand {
ChatBlock.sendMessageKey(player, "your.clan.already.verified");
return;
}
if (!settings.isePurchaseVerification()) {
if (!settings.is(ECONOMY_PURCHASE_CLAN_VERIFY)) {
ChatBlock.sendMessageKey(player, "staff.member.verify.clan");
return;
}
int minToVerify = settings.getMinToVerify();
if (minToVerify > clan.getAllMembers().size()) {
int minToVerify = settings.getInt(CLAN_MIN_TO_VERIFY);
if (minToVerify > clan.getMembers().size()) {
ChatBlock.sendMessage(player, lang("your.clan.must.have.members.to.verify", player, minToVerify));
return;
}
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));
}
}
@@ -147,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);
@@ -172,9 +180,69 @@ 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}")
@Conditions("verified")
public void discord(Player player, Clan clan) {
DiscordHook discordHook = chatManager.getDiscordHook();
if (discordHook == null) {
ChatBlock.sendMessageKey(player, "discordhook.is.disabled");
return;
}
double amount = settings.getDouble(ECONOMY_DISCORD_CREATION_PRICE);
if (settings.is(ECONOMY_PURCHASE_DISCORD_CREATE)) {
if (!permissions.playerHasMoney(player, amount)) {
player.sendMessage(AQUA + lang("not.sufficient.money", player, amount));
return;
}
if (!permissions.chargePlayer(player, amount, DISCORD_CREATION)) {
return;
}
}
try {
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));
}
}
}
}
@@ -157,7 +157,7 @@ public class RankCommand extends BaseCommand {
@Subcommand("%permissions")
public class PermissionsCommand extends BaseCommand {
private final String validPermissionsToMessage = Helper.toMessage(Helper.fromPermissionArray(), ",");
private final String validPermissionsToMessage = String.join(",", Helper.fromPermissionArray());
@Default
@CommandPermission("simpleclans.leader.rank.permissions.available")
@@ -178,7 +178,7 @@ public class RankCommand extends BaseCommand {
return;
}
ChatBlock.sendMessage(player, AQUA + lang("rank.0.permissions", player, rank.getDisplayName()));
ChatBlock.sendMessage(player, AQUA + Helper.toMessage(permissions.toArray(new String[0]), ","));
ChatBlock.sendMessage(player, AQUA + String.join(",", permissions));
}
@Subcommand("%add")
@@ -16,61 +16,68 @@ import static org.bukkit.ChatColor.AQUA;
@CommandAlias("%clan")
@Subcommand("%toggle")
@Conditions("%basic_conditions|verified")
@Conditions("%basic_conditions")
public class ToggleCommand extends BaseCommand {
@Dependency
private StorageManager storage;
@Subcommand("%bb")
@CommandPermission("simpleclans.member.bb-toggle")
@Description("{@@command.description.toggle.bb}")
public void bb(Player player, ClanPlayer cp) {
toggle(player, "bbon", "bboff", cp.isBbEnabled(), cp::setBbEnabled);
@Conditions("verified")
public class Verified extends BaseCommand {
@Subcommand("%bb")
@CommandPermission("simpleclans.member.bb-toggle")
@Description("{@@command.description.toggle.bb}")
public void bb(Player player, ClanPlayer cp) {
toggle(player, "bbon", "bboff", cp.isBbEnabled(), cp::setBbEnabled);
}
storage.updateClanPlayer(cp);
@Subcommand("%tag")
@CommandPermission("simpleclans.member.tag-toggle")
@Description("{@@command.description.toggle.tag}")
public void tag(Player player, ClanPlayer cp) {
toggle(player, "tagon", "tagoff", cp.isTagEnabled(), cp::setTagEnabled);
}
@Subcommand("%deposit")
@CommandPermission("simpleclans.leader.deposit-toggle")
@Conditions("leader")
@Description("{@@command.description.toggle.deposit}")
public void deposit(Player player, Clan clan) {
toggle(player, "depositon", "depositoff", clan.isAllowDeposit(),
clan::setAllowDeposit);
storage.updateClan(clan);
}
@Subcommand("%fee")
@CommandPermission("simpleclans.leader.fee")
@Conditions("rank:name=FEE_ENABLE|change_fee")
@Description("{@@command.description.toggle.fee}")
public void fee(Player player, Clan clan) {
toggle(player, "feeon", "feeoff", clan.isMemberFeeEnabled(),
clan::setMemberFeeEnabled);
storage.updateClan(clan);
}
@Subcommand("%withdraw")
@CommandPermission("simpleclans.leader.withdraw-toggle")
@Conditions("leader")
@Description("{@@command.description.toggle.withdraw}")
public void withdraw(Player player, Clan clan) {
toggle(player, "withdrawon", "withdrawoff", clan.isAllowWithdraw(),
clan::setAllowWithdraw);
storage.updateClan(clan);
}
}
@Subcommand("%tag")
@CommandPermission("simpleclans.member.tag-toggle")
@Description("{@@command.description.toggle.tag}")
public void tag(Player player, ClanPlayer cp) {
toggle(player, "tagon", "tagoff", cp.isTagEnabled(), cp::setTagEnabled);
storage.updateClanPlayer(cp);
}
@Subcommand("%deposit")
@CommandPermission("simpleclans.leader.deposit-toggle")
@Conditions("leader")
@Description("{@@command.description.toggle.deposit}")
public void deposit(Player player, Clan clan) {
toggle(player, "depositon", "depositoff", clan.isAllowDeposit(),
clan::setAllowDeposit);
storage.updateClan(clan);
}
@Subcommand("%fee")
@CommandPermission("simpleclans.leader.fee")
@Conditions("rank:name=FEE_ENABLE|change_fee")
@Description("{@@command.description.toggle.fee}")
public void fee(Player player, Clan clan) {
toggle(player, "feeon", "feeoff", clan.isMemberFeeEnabled(),
clan::setMemberFeeEnabled);
storage.updateClan(clan);
}
@Subcommand("%withdraw")
@CommandPermission("simpleclans.leader.withdraw-toggle")
@Conditions("leader")
@Description("{@@command.description.toggle.withdraw}")
public void withdraw(Player player, Clan clan) {
toggle(player, "withdrawon", "withdrawoff", clan.isAllowWithdraw(),
clan::setAllowWithdraw);
storage.updateClan(clan);
@Subcommand("%invite")
@CommandPermission("simpleclans.anyone.invite-toggle")
@Description("{@@command.description.toggle.invite}")
public void invite(Player player, ClanPlayer cp) {
toggle(player, "inviteon", "inviteoff", cp.isInviteEnabled(), cp::setInviteEnabled);
}
private void toggle(CommandSender sender, String onMessageKey, String offMessageKey, boolean status,
@@ -1,44 +0,0 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
@SuppressWarnings("unused")
public class ChatSubcommandsCompletion extends AbstractSyncCompletion {
public ChatSubcommandsCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public @NotNull String getId() {
return "chat_subcommands";
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext context) throws InvalidCommandArgument {
Player player = context.getPlayer();
if (player == null) {
return Collections.emptyList();
}
String leave = lang("leave", player);
List<String> subcommands = new ArrayList<>(Arrays.asList(lang("join", player), leave, lang("mute",
player)));
ClanPlayer cp = clanManager.getAnyClanPlayer(player.getUniqueId());
if (cp != null) {
if (cp.getChannel() == ClanPlayer.Channel.NONE) {
subcommands.remove(leave);
}
}
return subcommands;
}
}
@@ -10,8 +10,10 @@ import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@SuppressWarnings("unused")
public class ClanMembersCompletion extends AbstractSyncCompletion {
public ClanMembersCompletion(@NotNull SimpleClans plugin) {
super(plugin);
@@ -23,7 +25,11 @@ public class ClanMembersCompletion extends AbstractSyncCompletion {
if (player != null) {
Clan clan = clanManager.getClanByPlayerUniqueId(player.getUniqueId());
if (clan != null) {
return clan.getAllMembers().stream().map(ClanPlayer::getName).collect(Collectors.toList());
List<String> list = clan.getMembers().stream().map(ClanPlayer::getName).collect(Collectors.toList());
if (c.hasConfig("hide_own")) {
list.remove(player.getName());
}
return list;
}
}
return Collections.emptyList();
@@ -1,14 +1,16 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.CommandIssuer;
import co.aikar.commands.InvalidCommandArgument;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ClansCompletion extends AbstractSyncCompletion {
public ClansCompletion(@NotNull SimpleClans plugin) {
@@ -17,18 +19,28 @@ public class ClansCompletion extends AbstractSyncCompletion {
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext c) throws InvalidCommandArgument {
Stream<Clan> clans = clanManager.getClans().stream();
List<Clan> clans = clanManager.getClans();
if (c.hasConfig("has_home")) {
clans = clans.filter(clan -> clan.getHomeLocation() != null);
clans.removeIf(clan -> clan.getHomeLocation() == null);
}
if (c.hasConfig("unverified")) {
clans = clans.filter(clan -> !clan.isVerified());
clans.removeIf(Clan::isVerified);
}
return clans.map(Clan::getTag).collect(Collectors.toList());
if (c.hasConfig("hide_own")) {
Clan clan = getClan(c.getIssuer());
if (clan != null) {
clans.remove(clan);
}
}
return clans.stream().map(Clan::getTag).collect(Collectors.toList());
}
@Override
public @NotNull String getId() {
return "clans";
}
private @Nullable Clan getClan(CommandIssuer issuer) {
return clanManager.getClanByPlayerUniqueId(issuer.getUniqueId());
}
}
@@ -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";
}
}
@@ -11,6 +11,7 @@ import java.time.LocalDateTime;
import static java.time.temporal.ChronoUnit.MINUTES;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
@SuppressWarnings("unused")
public class CanChangeFeeCondition extends AbstractCommandCondition {
@@ -26,7 +27,7 @@ public class CanChangeFeeCondition extends AbstractCommandCondition {
LocalDateTime now = LocalDateTime.now();
LocalDateTime collectTime = getCollectTime();
long interval = now.until(collectTime, MINUTES);
if (interval <= settingsManager.geteMemberFeeLastMinuteChangeInterval() * HOUR_IN_MINUTES) {
if (interval <= settingsManager.getInt(ECONOMY_MEMBER_FEE_LAST_MINUTE_CHANGE_INTERVAL) * HOUR_IN_MINUTES) {
BukkitCommandIssuer issuer = context.getIssuer();
String error = lang("cannot.change.member.fee.now", issuer);
if (interval <= 60) {
@@ -40,8 +41,8 @@ public class CanChangeFeeCondition extends AbstractCommandCondition {
private LocalDateTime getCollectTime() {
LocalDateTime now = LocalDateTime.now();
LocalDateTime collectTime = now.withHour(settingsManager.getTasksCollectFeeHour())
.withMinute(settingsManager.getTasksCollectFeeMinute());
LocalDateTime collectTime = now.withHour(settingsManager.getInt(TASKS_COLLECT_FEE_HOUR))
.withMinute(settingsManager.getInt(TASKS_COLLECT_FEE_MINUTE));
if (collectTime.isBefore(now)) {
collectTime = collectTime.plusDays(1);
}
@@ -0,0 +1,31 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
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.SimpleClans;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField;
public class CanChatCondition extends AbstractCommandCondition {
public CanChatCondition(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context) throws InvalidCommandArgument {
String type = context.getConfigValue("type", (String) null).toUpperCase();
ConfigField chatEnabled = ConfigField.valueOf(type + "CHAT_ENABLE");
if (!settingsManager.is(chatEnabled)) {
throw new ConditionFailedException(lang(type.toLowerCase() + ".chat.disabled", context.getIssuer()));
}
}
@Override
public @NotNull String getId() {
return "can_chat";
}
}
@@ -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;
@@ -7,6 +7,8 @@ import net.sacredlabyrinth.phaed.simpleclans.commands.ClanInput;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.WAR_MAX_MEMBERS_DIFFERENCE;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.WAR_START_REQUEST_ENABLED;
public class CanWarTargetCondition extends AbstractParameterCondition<ClanInput> {
public CanWarTargetCondition(@NotNull SimpleClans plugin) {
@@ -32,8 +34,8 @@ public class CanWarTargetCondition extends AbstractParameterCondition<ClanInput>
throw new ConditionFailedException(lang("clans.already.at.war", issuer));
}
boolean isWarRequestEnabled = settingsManager.isWarRequestEnabled();
int maxDifference = settingsManager.getMembersOnlineMaxDifference();
boolean isWarRequestEnabled = settingsManager.is(WAR_START_REQUEST_ENABLED);
int maxDifference = settingsManager.getInt(WAR_MAX_MEMBERS_DIFFERENCE);
if (!isWarRequestEnabled && maxDifference >= 0) {
int difference = Math.abs(issuerClan.getOnlineMembers().size() - targetClan.getOnlineMembers().size());
@@ -1,10 +1,14 @@
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.SimpleClans;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.LAND_SHARING;
@SuppressWarnings("unused")
public class LandSharingCondition extends AbstractCommandCondition {
@@ -15,7 +19,7 @@ public class LandSharingCondition extends AbstractCommandCondition {
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context) throws InvalidCommandArgument {
if (!settingsManager.isLandSharing()) {
if (!settingsManager.is(LAND_SHARING)) {
throw new ConditionFailedException(lang("land.sharing.disabled", context.getIssuer()));
}
}
@@ -9,6 +9,7 @@ import org.bukkit.ChatColor;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.ECONOMY_MEMBER_FEE_ENABLED;
public class MemberFeeEnabledCondition extends AbstractCommandCondition {
public MemberFeeEnabledCondition(@NotNull SimpleClans plugin) {
@@ -17,7 +18,7 @@ public class MemberFeeEnabledCondition extends AbstractCommandCondition {
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context) throws InvalidCommandArgument {
if (!settingsManager.isMemberFee()) {
if (!settingsManager.is(ECONOMY_MEMBER_FEE_ENABLED)) {
throw new ConditionFailedException(ChatColor.RED + lang("disabled.command",
context.getIssuer().getIssuer()));
}
@@ -6,10 +6,10 @@ import co.aikar.commands.ConditionFailedException;
import co.aikar.commands.InvalidCommandArgument;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.CLAN_MIN_SIZE_TO_SET_ALLY;
import static org.bukkit.ChatColor.RED;
@SuppressWarnings("unused")
@@ -21,9 +21,9 @@ public class MinimumToAllyCondition extends AbstractCommandCondition {
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context) throws InvalidCommandArgument {
Clan clan = Conditions.assertClanMember(clanManager, context.getIssuer());
if (clan.getSize() < settingsManager.getClanMinSizeToAlly()) {
if (clan.getSize() < settingsManager.getInt(CLAN_MIN_SIZE_TO_SET_ALLY)) {
throw new ConditionFailedException(RED +
lang("minimum.to.make.alliance", context.getIssuer(), settingsManager.getClanMinSizeToAlly()));
lang("minimum.to.make.alliance", context.getIssuer(), settingsManager.getInt(CLAN_MIN_SIZE_TO_SET_ALLY)));
}
}
@@ -9,6 +9,7 @@ import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.CLAN_MIN_SIZE_TO_SET_RIVAL;
import static org.bukkit.ChatColor.RED;
@SuppressWarnings("unused")
@@ -21,9 +22,9 @@ public class MinimumToRivalCondition extends AbstractCommandCondition {
public void validateCondition(ConditionContext<BukkitCommandIssuer> context) throws InvalidCommandArgument {
BukkitCommandIssuer issuer = context.getIssuer();
Clan clan = Conditions.assertClanMember(clanManager, issuer);
if (clan.getSize() < settingsManager.getClanMinSizeToRival()) {
if (clan.getSize() < settingsManager.getInt(CLAN_MIN_SIZE_TO_SET_RIVAL)) {
throw new ConditionFailedException(RED + lang("min.players.rivalries", issuer,
settingsManager.getClanMinSizeToRival()));
settingsManager.getInt(CLAN_MIN_SIZE_TO_SET_RIVAL)));
}
}
@@ -9,6 +9,8 @@ import org.bukkit.World;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.BLACKLISTED_WORLDS;
@SuppressWarnings("unused")
public class NotBlacklistedCondition extends AbstractCommandCondition {
@@ -22,7 +24,7 @@ public class NotBlacklistedCondition extends AbstractCommandCondition {
if (player != null) {
World world = player.getLocation().getWorld();
if (world != null) {
if (settingsManager.isBlacklistedWorld(world.getName())) {
if (settingsManager.getStringList(BLACKLISTED_WORLDS).contains(world.getName())) {
throw new ConditionFailedException();
}
}
@@ -1,10 +1,12 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
import co.aikar.commands.*;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.debug;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.RED;
@@ -24,7 +26,9 @@ public class NotInClanCondition extends AbstractParameterCondition<ClanPlayerInp
public void validateCondition(ConditionContext<BukkitCommandIssuer> context,
BukkitCommandExecutionContext execContext, ClanPlayerInput value)
throws InvalidCommandArgument {
if (value.getClanPlayer().getClan() != null) {
ClanPlayer clanPlayer = value.getClanPlayer();
debug(String.format("NotInClanCondition -> %s %s", clanPlayer.getName(), clanPlayer.getUniqueId()));
if (clanPlayer.getClan() != null) {
throw new ConditionFailedException(RED + lang("the.player.is.already.member.of.another.clan",
execContext.getSender()));
}
@@ -1,12 +1,14 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
import co.aikar.commands.*;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.debug;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
@SuppressWarnings("unused")
@@ -23,7 +25,9 @@ public class OnlineCondition extends AbstractParameterCondition<ClanPlayerInput>
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context, BukkitCommandExecutionContext execContext, ClanPlayerInput value) throws InvalidCommandArgument {
Player player = value.getClanPlayer().toPlayer();
ClanPlayer clanPlayer = value.getClanPlayer();
debug(String.format("OnlineCondition -> %s %s", clanPlayer.getName(), clanPlayer.getUniqueId()));
Player player = clanPlayer.toPlayer();
if (player != null) {
boolean isVanished = VanishUtils.isVanished(execContext.getSender(), player);
@@ -8,6 +8,8 @@ import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.debug;
@SuppressWarnings("unused")
public class PlayerClanMemberCondition extends AbstractParameterCondition<Player> {
public PlayerClanMemberCondition(@NotNull SimpleClans plugin) {
@@ -23,6 +25,7 @@ public class PlayerClanMemberCondition extends AbstractParameterCondition<Player
public void validateCondition(ConditionContext<BukkitCommandIssuer> context,
BukkitCommandExecutionContext execContext,
Player value) throws InvalidCommandArgument {
debug(String.format("PlayerClanMemberCondition -> %s %s", value.getName(), value.getUniqueId()));
Conditions.assertClanMember(clanManager, context.getIssuer());
}
@@ -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";
}
}
@@ -2,27 +2,43 @@ package net.sacredlabyrinth.phaed.simpleclans.commands.contexts;
import co.aikar.commands.BukkitCommandExecutionContext;
import co.aikar.commands.InvalidCommandArgument;
import co.aikar.commands.MinecraftMessageKeys;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.regex.Pattern;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.USERNAME_REGEX;
@SuppressWarnings("unused")
public class ClanPlayerInputContextResolver extends AbstractInputOnlyContextResolver<ClanPlayerInput> {
private final Pattern validUsername;
public ClanPlayerInputContextResolver(@NotNull SimpleClans plugin) {
super(plugin);
validUsername = Pattern.compile(plugin.getSettingsManager().getString(USERNAME_REGEX));
}
@Override
public ClanPlayerInput getContext(BukkitCommandExecutionContext context) throws InvalidCommandArgument {
String arg = context.popFirstArg();
if (!validUsername.matcher(arg).matches()) {
throw new InvalidCommandArgument(MinecraftMessageKeys.IS_NOT_A_VALID_NAME, "{name}", arg);
}
ClanPlayer cp = clanManager.getAnyClanPlayer(arg);
if (cp == null) {
@SuppressWarnings("deprecation")
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(arg);
cp = clanManager.getCreateClanPlayer(offlinePlayer.getUniqueId());
Player player = Bukkit.getPlayer(arg);
if (player == null) {
throw new InvalidCommandArgument(lang("user.hasnt.played.before", context.getSender()));
}
cp = clanManager.getCreateClanPlayer(player.getUniqueId());
}
return new ClanPlayerInput(cp);
@@ -32,4 +48,5 @@ public class ClanPlayerInputContextResolver extends AbstractInputOnlyContextReso
public Class<ClanPlayerInput> getType() {
return ClanPlayerInput.class;
}
}
@@ -2,12 +2,12 @@ package net.sacredlabyrinth.phaed.simpleclans.commands.contexts;
import co.aikar.commands.BukkitCommandIssuer;
import co.aikar.commands.InvalidCommandArgument;
import co.aikar.commands.MessageKeys;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import static co.aikar.commands.MessageKeys.*;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
public class Contexts {
@@ -30,8 +30,17 @@ public class Contexts {
public static Player assertPlayer(@NotNull BukkitCommandIssuer issuer) {
Player player = issuer.getPlayer();
if (player == null) {
throw new InvalidCommandArgument(MessageKeys.NOT_ALLOWED_ON_CONSOLE, false);
throw new InvalidCommandArgument(NOT_ALLOWED_ON_CONSOLE, false);
}
return player;
}
public static void validateMinMax(Number val, Number minValue, Number maxValue) throws InvalidCommandArgument {
if (maxValue != null && val.doubleValue() > maxValue.doubleValue()) {
throw new InvalidCommandArgument(PLEASE_SPECIFY_AT_MOST, "{max}", String.valueOf(maxValue));
}
if (minValue != null && val.doubleValue() < minValue.doubleValue()) {
throw new InvalidCommandArgument(PLEASE_SPECIFY_AT_LEAST, "{min}", String.valueOf(minValue));
}
}
}
@@ -0,0 +1,16 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.contexts;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
@SuppressWarnings("unused")
public class DoubleContextResolver extends DoublePrimitiveContextResolver {
public DoubleContextResolver(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Class<Double> getType() {
return Double.class;
}
}
@@ -0,0 +1,39 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.contexts;
import co.aikar.commands.BukkitCommandExecutionContext;
import co.aikar.commands.InvalidCommandArgument;
import co.aikar.commands.MessageKeys;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.commands.contexts.Contexts.validateMinMax;
@SuppressWarnings("unused")
public class DoublePrimitiveContextResolver extends AbstractInputOnlyContextResolver<Double> {
public DoublePrimitiveContextResolver(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Double getContext(BukkitCommandExecutionContext context) throws InvalidCommandArgument {
String number = context.popFirstArg();
try {
double val = Double.parseDouble(number);
if (!Double.isFinite(val)) {
throw new NumberFormatException();
}
validateMinMax(val, Double.MIN_VALUE, Double.MAX_VALUE);
return val;
} catch (NumberFormatException e) {
throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER, "{num}", number);
}
}
@Override
public Class<Double> getType() {
return double.class;
}
}
@@ -0,0 +1,16 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.contexts;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
@SuppressWarnings("unused")
public class FloatContextResolver extends FloatPrimitiveContextResolver {
public FloatContextResolver(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Class<Float> getType() {
return Float.class;
}
}
@@ -0,0 +1,36 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.contexts;
import co.aikar.commands.BukkitCommandExecutionContext;
import co.aikar.commands.InvalidCommandArgument;
import co.aikar.commands.MessageKeys;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.commands.contexts.Contexts.validateMinMax;
@SuppressWarnings("unused")
public class FloatPrimitiveContextResolver extends AbstractInputOnlyContextResolver<Float> {
public FloatPrimitiveContextResolver(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Float getContext(BukkitCommandExecutionContext context) throws InvalidCommandArgument {
String number = context.popFirstArg();
try {
float val = Float.parseFloat(number);
if (!Float.isFinite(val)) {
throw new NumberFormatException();
}
validateMinMax(val, Float.MIN_VALUE, Float.MAX_VALUE);
return val;
} catch (NumberFormatException e) {
throw new InvalidCommandArgument(MessageKeys.MUST_BE_A_NUMBER, "{num}", number);
}
}
@Override
public Class<Float> getType() {
return float.class;
}
}
@@ -10,6 +10,8 @@ import org.jetbrains.annotations.NotNull;
import java.util.List;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PAGE_SEPARATOR;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.SERVER_NAME;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.DARK_GRAY;
@@ -38,9 +40,9 @@ public class Alliances extends Sendable {
private void sendHeader() {
ChatBlock.sendBlank(sender);
ChatBlock.saySingle(sender, sm.getServerName() + subColor + " " +
ChatBlock.saySingle(sender, sm.getColored(SERVER_NAME) + subColor + " " +
lang("alliances", sender) + " " + headColor +
Helper.generatePageSeparator(sm.getPageSep()));
Helper.generatePageSeparator(sm.getString(PAGE_SEPARATOR)));
ChatBlock.sendBlank(sender);
chatBlock.setAlignment("l", "l");
@@ -12,6 +12,7 @@ import java.util.Map;
import java.util.TreeMap;
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.WHITE;
@@ -32,8 +33,8 @@ public class ClanCoords extends Sendable {
Player p = cpm.toPlayer();
if (p != null) {
String name = (cpm.isLeader() ? sm.getPageLeaderColor() : (cpm.isTrusted() ?
sm.getPageTrustedColor() : sm.getPageUnTrustedColor())) + cpm.getName();
String name = (cpm.isLeader() ? sm.getColored(PAGE_LEADER_COLOR) : (cpm.isTrusted() ?
sm.getColored(PAGE_TRUSTED_COLOR) : sm.getColored(PAGE_UNTRUSTED_COLOR))) + cpm.getName();
Location loc = p.getLocation();
int distance = (int) Math.ceil(loc.toVector().distance(player.getLocation().toVector()));
String coords = loc.getBlockX() + " " + loc.getBlockY() + " " + loc.getBlockZ();
@@ -57,8 +58,8 @@ public class ClanCoords extends Sendable {
chatBlock.setAlignment("l", "c", "c", "c");
ChatBlock.sendBlank(player);
ChatBlock.saySingle(player, sm.getPageClanNameColor() + clan.getName() + subColor + " " +
lang("coords", player) + " " + headColor + Helper.generatePageSeparator(sm.getPageSep()));
ChatBlock.saySingle(player, sm.getColored(PAGE_CLAN_NAME_COLOR) + clan.getName() + subColor + " " +
lang("coords", player) + " " + headColor + Helper.generatePageSeparator(sm.getString(PAGE_SEPARATOR)));
ChatBlock.sendBlank(player);
chatBlock.addRow(" " + headColor + lang("name", player), lang("distance", player),
@@ -14,6 +14,7 @@ import java.util.List;
import java.util.stream.Collectors;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static net.sacredlabyrinth.phaed.simpleclans.utils.RankingNumberResolver.RankingType.ORDINAL;
import static org.bukkit.ChatColor.*;
@@ -52,7 +53,7 @@ public class ClanList extends Sendable {
@Nullable String order) {
boolean ascending = order == null || lang("list.order.asc").equalsIgnoreCase(order);
if (type == null) {
type = sm.getListDefaultOrderBy();
type = sm.getString(LIST_DEFAULT_ORDER_BY);
}
if (type.equalsIgnoreCase(lang("list.type.size"))) {
return new RankingNumberResolver<>(clans, Clan::getSize, order != null && ascending, ORDINAL);
@@ -73,15 +74,15 @@ public class ClanList extends Sendable {
@NotNull
private List<Clan> getListableClans() {
List<Clan> clans = plugin.getClanManager().getClans();
clans = clans.stream().filter(clan -> clan.isVerified() || sm.isShowUnverifiedOnList())
clans = clans.stream().filter(clan -> clan.isVerified() || sm.is(SHOW_UNVERIFIED_ON_LIST))
.collect(Collectors.toList());
return clans;
}
private void sendHeader(List<Clan> clans) {
ChatBlock.sendBlank(sender);
ChatBlock.saySingle(sender, sm.getServerName() + subColor + " " + lang("clans.lower", sender)
+ " " + headColor + Helper.generatePageSeparator(sm.getPageSep()));
ChatBlock.saySingle(sender, sm.getColored(SERVER_NAME) + subColor + " " + lang("clans.lower", sender)
+ " " + headColor + Helper.generatePageSeparator(sm.getString(PAGE_SEPARATOR)));
ChatBlock.sendBlank(sender);
ChatBlock.sendMessage(sender, headColor + lang("total.clans", sender) + " " + subColor + clans.size());
ChatBlock.sendBlank(sender);
@@ -91,12 +92,11 @@ public class ClanList extends Sendable {
lang("kdr", sender), lang("members", sender));
}
@SuppressWarnings("deprecation")
private void addLine(RankingNumberResolver<Clan, ? extends Comparable<?>> ranking, Clan clan) {
String tag = sm.getClanChatBracketColor() + sm.getClanChatTagBracketLeft()
+ sm.getTagDefaultColor() + clan.getColorTag() + sm.getClanChatBracketColor()
+ sm.getClanChatTagBracketRight();
String name = (clan.isVerified() ? sm.getPageClanNameColor() : GRAY) + clan.getName();
String tag = sm.getColored(CLANCHAT_BRACKET_COLOR) + sm.getString(CLANCHAT_BRACKET_LEFT)
+ sm.getColored(TAG_DEFAULT_COLOR) + clan.getColorTag() + sm.getColored(CLANCHAT_BRACKET_COLOR)
+ sm.getString(CLANCHAT_BRACKET_RIGHT);
String name = (clan.isVerified() ? sm.getColored(PAGE_CLAN_NAME_COLOR) : GRAY) + clan.getName();
String fullname = tag + " " + name;
String size = WHITE + "" + clan.getSize();
String kdr = clan.isVerified() ? YELLOW + "" + KDRFormat.format(clan.getTotalKDR()) : "";
@@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PAGE_LEADER_COLOR;
public class ClanProfile extends Sendable {
@@ -25,7 +26,7 @@ public class ClanProfile extends Sendable {
.replace("%clan_color_tag%", clan.getColorTag())
.replace("%clan_description%", getDescription())
.replace("%clan_status%", Helper.getFormattedClanStatus(clan, sender))
.replace("%clan_leaders%", clan.getLeadersString(sm.getPageLeaderColor(), subColor + ", "))
.replace("%clan_leaders%", clan.getLeadersString(sm.getColored(PAGE_LEADER_COLOR), subColor + ", "))
.replace("%clan_online_count%", String.valueOf(VanishUtils.getNonVanished(sender, clan).size()))
.replace("%clan_size%", String.valueOf(clan.getSize()))
.replace("%clan_kdr%", KDRFormat.format(clan.getTotalKDR()))
@@ -1,14 +1,15 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.data;
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;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.*;
public class ClanRoster extends Sendable {
@@ -33,12 +34,10 @@ 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 = VanishUtils.isVanished(sender, cp) ? WHITE + cp.getLastSeenDaysString(sender) : GREEN + lang("online", sender);
String name = (cp.isTrusted() ? sm.getPageTrustedColor() : sm.getPageUnTrustedColor()) + cp.getName();
String lastSeen = p != null && p.isOnline() && !VanishUtils.isVanished(sender, p) ? GREEN + lang("online", sender) : WHITE + cp.getLastSeenDaysString(sender);
chatBlock.addRow(" " + name, YELLOW + Helper.parseColors(cp.getRankDisplayName()) + RESET, lastSeen);
chatBlock.addRow(" " + name, YELLOW + ChatUtils.parseColors(cp.getRankDisplayName()) + RESET, lastSeen);
}
}
@@ -46,24 +45,22 @@ 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 = VanishUtils.isVanished(sender, cp) ? WHITE + cp.getLastSeenDaysString(sender) :
GREEN + lang("online", sender);
String name = sm.getPageLeaderColor() + cp.getName();
String lastSeen = p != null && p.isOnline() && !VanishUtils.isVanished(sender, p) ? GREEN + lang("online", sender)
: WHITE + cp.getLastSeenDaysString(sender);
chatBlock.addRow(" " + name, YELLOW + Helper.parseColors(cp.getRankDisplayName()) + RESET, lastSeen);
chatBlock.addRow(" " + name, YELLOW + ChatUtils.parseColors(cp.getRankDisplayName()) + RESET, lastSeen);
}
}
private void configureAndSendHeader() {
ChatBlock.sendBlank(sender);
ChatBlock.saySingle(sender, sm.getPageClanNameColor() + clan.getName() + subColor + " " +
lang("roster", sender) + " " + headColor + Helper.generatePageSeparator(sm.getPageSep()));
ChatBlock.saySingle(sender, sm.getColored(PAGE_CLAN_NAME_COLOR) + clan.getName() + subColor + " " +
lang("roster", sender) + " " + headColor + Helper.generatePageSeparator(sm.getString(PAGE_SEPARATOR)));
ChatBlock.sendBlank(sender);
ChatBlock.sendMessage(sender, headColor + lang("legend", sender) + " " + sm.getPageLeaderColor() +
lang("leader", sender) + headColor + ", " + sm.getPageTrustedColor() + lang("trusted", sender) +
headColor + ", " + sm.getPageUnTrustedColor() + lang("untrusted", sender));
ChatBlock.sendMessage(sender, headColor + lang("legend", sender) + " " + sm.getColored(PAGE_LEADER_COLOR) +
lang("leader", sender) + headColor + ", " + sm.getColored(PAGE_TRUSTED_COLOR) + lang("trusted", sender) +
headColor + ", " + sm.getColored(PAGE_UNTRUSTED_COLOR) + lang("untrusted", sender));
ChatBlock.sendBlank(sender);
chatBlock.setFlexibility(false, true, false, true);
@@ -9,6 +9,7 @@ import java.text.NumberFormat;
import java.util.List;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.*;
public class ClanStats extends Sendable {
@@ -36,15 +37,15 @@ public class ClanStats extends Sendable {
}
private void configureAndSendHeader() {
ChatBlock.saySingle(sender, sm.getPageClanNameColor() + clan.getName() + subColor + " " +
lang("stats", sender) + " " + headColor + Helper.generatePageSeparator(sm.getPageSep()));
ChatBlock.saySingle(sender, sm.getColored(PAGE_CLAN_NAME_COLOR) + clan.getName() + subColor + " " +
lang("stats", sender) + " " + headColor + Helper.generatePageSeparator(sm.getString(PAGE_SEPARATOR)));
ChatBlock.sendBlank(sender);
ChatBlock.sendMessage(sender, headColor + lang("kdr", sender) + " = " + subColor +
lang("kill.death.ratio", sender));
ChatBlock.sendMessage(sender, headColor + lang("weights", sender) + " = " + lang("rival", sender)
+ ": " + subColor + sm.getKwRival() + headColor + " " + lang("neutral", sender) + ": " + subColor +
sm.getKwNeutral() + headColor + " " + lang("civilian", sender) + ": " + subColor +
sm.getKwCivilian());
+ ": " + subColor + sm.getDouble(KILL_WEIGHTS_RIVAL) + headColor + " " + lang("neutral", sender) + ": " + subColor +
sm.getDouble(KILL_WEIGHTS_NEUTRAL) + headColor + " " + lang("civilian", sender) + ": " + subColor +
sm.getDouble(KILL_WEIGHTS_CIVILIAN));
ChatBlock.sendBlank(sender);
chatBlock.setFlexibility(true, false, false, false, false, false, false);
@@ -56,8 +57,8 @@ public class ClanStats extends Sendable {
private void addRows(List<ClanPlayer> clanPlayers) {
for (ClanPlayer cpm : clanPlayers) {
String name = (cpm.isLeader() ? sm.getPageLeaderColor() : (cpm.isTrusted() ? sm.getPageTrustedColor() :
sm.getPageUnTrustedColor())) + cpm.getName();
String name = (cpm.isLeader() ? sm.getColored(PAGE_LEADER_COLOR) : (cpm.isTrusted() ? sm.getColored(PAGE_TRUSTED_COLOR) :
sm.getColored(PAGE_UNTRUSTED_COLOR)) + cpm.getName());
String rival = NumberFormat.getInstance().format(cpm.getRivalKills());
String neutral = NumberFormat.getInstance().format(cpm.getNeutralKills());
String civilian = NumberFormat.getInstance().format(cpm.getCivilianKills());
@@ -11,6 +11,8 @@ import org.jetbrains.annotations.NotNull;
import java.util.Map;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PAGE_CLAN_NAME_COLOR;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PAGE_SEPARATOR;
public class Kills extends Sendable {
@@ -53,9 +55,9 @@ public class Kills extends Sendable {
chatBlock.setFlexibility(true, false);
chatBlock.setAlignment("l", "c");
chatBlock.addRow(" " + headColor + lang("victim", player), lang("killcount", player));
ChatBlock.saySingle(player, sm.getPageClanNameColor() + polled + subColor
ChatBlock.saySingle(player, sm.getColored(PAGE_CLAN_NAME_COLOR) + polled + subColor
+ " " + lang("kills", player) + " " + headColor +
Helper.generatePageSeparator(sm.getPageSep()));
Helper.generatePageSeparator(sm.getString(PAGE_SEPARATOR)));
ChatBlock.sendBlank(player);
}
}
@@ -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;
@@ -13,6 +14,7 @@ import java.math.BigDecimal;
import java.util.List;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.*;
public class Leaderboard extends Sendable {
@@ -36,10 +38,10 @@ 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.getPageLeaderColor() : (cp.isTrusted() ? sm.getPageTrustedColor() :
sm.getPageUnTrustedColor())) + cp.getName();
String name = (cp.isLeader() ? sm.getColored(PAGE_LEADER_COLOR) : (cp.isTrusted() ? sm.getColored(PAGE_TRUSTED_COLOR) :
sm.getColored(PAGE_UNTRUSTED_COLOR))) + cp.getName();
String lastSeen = online ? GREEN + lang("online", sender) : WHITE + cp.getLastSeenDaysString(sender);
String clanTag = WHITE + lang("free.agent", sender);
@@ -55,8 +57,8 @@ public class Leaderboard extends Sendable {
private void configureAndSendHeader() {
ChatBlock.sendBlank(sender);
ChatBlock.saySingle(sender, sm.getServerName() + subColor + " " + lang("leaderboard.command", sender)
+ " " + headColor + Helper.generatePageSeparator(sm.getPageSep()));
ChatBlock.saySingle(sender, sm.getColored(SERVER_NAME) + subColor + " " + lang("leaderboard.command", sender)
+ " " + headColor + Helper.generatePageSeparator(sm.getString(PAGE_SEPARATOR)));
ChatBlock.sendBlank(sender);
ChatBlock.sendMessage(sender, headColor + lang("total.clan.players.0", sender, subColor +
clanPlayers.size()));
@@ -11,6 +11,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.UUID;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.*;
public class Lookup extends Sendable {
@@ -51,7 +52,7 @@ public class Lookup extends Sendable {
.replace("%player_last_seen%", target.getLastSeenString(sender))
.replace("%player_past_clans%", target.getPastClansString(headColor + ", "))
.replace("%player_inactive_days%", String.valueOf(target.getInactiveDays()))
.replace("%player_max_inactive_days%", Helper.formatMaxInactiveDays(sm.getPurgePlayers()))
.replace("%player_max_inactive_days%", Helper.formatMaxInactiveDays(sm.getInt(PURGE_INACTIVE_PLAYER_DAYS)))
.replace("%kill_type_line%", getKillTypeLine());
sender.sendMessage(lookup);
} else {
@@ -81,15 +82,15 @@ public class Lookup extends Sendable {
return lang("free.agent", sender);
}
if (target.isLeader()) {
return sm.getPageLeaderColor() + lang("leader", sender);
return sm.getColored(PAGE_LEADER_COLOR) + lang("leader", sender);
}
if (target.isTrusted()) {
return sm.getPageTrustedColor() + lang("trusted", sender);
return sm.getColored(PAGE_TRUSTED_COLOR) + lang("trusted", sender);
}
if (!target.getRankId().isEmpty()) {
return sm.getPageTrustedColor() + lang("in.rank", sender);
return sm.getColored(PAGE_TRUSTED_COLOR) + lang("in.rank", sender);
}
return sm.getPageUnTrustedColor() + lang("untrusted", sender);
return sm.getColored(PAGE_UNTRUSTED_COLOR) + lang("untrusted", sender);
}
@NotNull
@@ -10,6 +10,8 @@ import org.jetbrains.annotations.NotNull;
import java.util.Map;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PAGE_SEPARATOR;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.SERVER_NAME;
import static org.bukkit.ChatColor.*;
public class MostKilled extends Sendable {
@@ -64,8 +66,8 @@ public class MostKilled extends Sendable {
chatBlock.addRow(" " + headColor + lang("victim", player), headColor +
lang("killcount", player), headColor + lang("attacker", player));
ChatBlock.saySingle(player, sm.getServerName() + subColor + " " + lang("mostkilled",
player) + " " + headColor + Helper.generatePageSeparator(sm.getPageSep()));
ChatBlock.saySingle(player, sm.getColored(SERVER_NAME) + subColor + " " + lang("mostkilled",
player) + " " + headColor + Helper.generatePageSeparator(sm.getString(PAGE_SEPARATOR)));
ChatBlock.sendBlank(player);
}
}
@@ -10,6 +10,8 @@ import org.jetbrains.annotations.NotNull;
import java.util.List;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.PAGE_SEPARATOR;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.SERVER_NAME;
import static org.bukkit.ChatColor.*;
public class Rivalries extends Sendable {
@@ -37,8 +39,8 @@ public class Rivalries extends Sendable {
private void sendHeader() {
ChatBlock.sendBlank(sender);
ChatBlock.saySingle(sender, sm.getServerName() + subColor + " " +
lang("rivalries", sender) + " " + headColor + Helper.generatePageSeparator(sm.getPageSep()));
ChatBlock.saySingle(sender, sm.getColored(SERVER_NAME) + subColor + " " +
lang("rivalries", sender) + " " + headColor + Helper.generatePageSeparator(sm.getString(PAGE_SEPARATOR)));
ChatBlock.sendBlank(sender);
ChatBlock.sendMessage(sender, headColor + lang("legend", sender) + DARK_RED + " [" +
lang("war", sender) + "]");
@@ -8,6 +8,7 @@ import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
public abstract class Sendable {
@@ -25,19 +26,19 @@ public abstract class Sendable {
sm = plugin.getSettingsManager();
cm = plugin.getClanManager();
this.sender = sender;
headColor = sm.getPageHeadingsColor();
subColor = sm.getPageSubTitleColor();
headColor = sm.getColored(PAGE_HEADINGS_COLOR);
subColor = sm.getColored(PAGE_SUBTITLE_COLOR);
}
protected void sendBlock() {
SettingsManager sm = plugin.getSettingsManager();
boolean more = chatBlock.sendBlock(sender, sm.getPageSize());
boolean more = chatBlock.sendBlock(sender, sm.getInt(PAGE_SIZE));
if (more) {
plugin.getStorageManager().addChatBlock(sender, chatBlock);
ChatBlock.sendBlank(sender);
ChatBlock.sendMessage(sender, sm.getPageHeadingsColor() + lang("view.next.page", sender,
sm.getCommandMore()));
ChatBlock.sendMessage(sender, sm.getColored(PAGE_HEADINGS_COLOR) + lang("view.next.page", sender,
sm.getString(COMMANDS_MORE)));
}
ChatBlock.sendBlank(sender);
}
@@ -9,6 +9,7 @@ import java.util.Collection;
import java.util.List;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.*;
public class Vitals extends Sendable {
@@ -38,8 +39,8 @@ public class Vitals extends Sendable {
private void configureAndSendHeader() {
ChatBlock.sendBlank(sender);
ChatBlock.saySingle(sender, sm.getPageClanNameColor() + clan.getName() + subColor + " " +
lang("vitals", sender) + " " + headColor + Helper.generatePageSeparator(sm.getPageSep()));
ChatBlock.saySingle(sender, sm.getColored(PAGE_CLAN_NAME_COLOR) + clan.getName() + subColor + " " +
lang("vitals", sender) + " " + headColor + Helper.generatePageSeparator(sm.getString(PAGE_SEPARATOR)));
ChatBlock.sendBlank(sender);
ChatBlock.sendMessage(sender, headColor + lang("weapons", sender) + ": " +
lang("0.s.sword.1.2.b.bow.3.4.a.arrow", sender, WHITE, DARK_GRAY, WHITE, DARK_GRAY, WHITE));
@@ -63,10 +64,10 @@ public class Vitals extends Sendable {
Player p = cpm.toPlayer();
if (p != null) {
String name = (cpm.isLeader() ? sm.getPageLeaderColor() : (cpm.isTrusted() ? sm.getPageTrustedColor()
: sm.getPageUnTrustedColor())) + cpm.getName();
String health = cm.getHealthString(p.getHealth());
String hunger = cm.getHungerString(p.getFoodLevel());
String name = (cpm.isLeader() ? sm.getColored(PAGE_LEADER_COLOR) : (cpm.isTrusted() ? sm.getColored(PAGE_TRUSTED_COLOR)
: sm.getColored(PAGE_UNTRUSTED_COLOR))) + cpm.getName();
String health = cm.getBar(p.getHealth());
String hunger = cm.getBar(p.getFoodLevel());
String armor = cm.getArmorString(p.getInventory());
String weapons = cm.getWeaponString(p.getInventory());
String food = cm.getFoodString(p.getInventory());
@@ -5,30 +5,34 @@ 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;
import java.text.MessageFormat;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.conversation.CreateClanNamePrompt.NAME_KEY;
import static net.sacredlabyrinth.phaed.simpleclans.conversation.CreateClanTagPrompt.TAG_KEY;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.*;
@CommandAlias("%clan")
@@ -48,10 +52,9 @@ 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.isEnableGUI()) {
if (sender instanceof Player && settings.is(ENABLE_GUI)) {
InventoryDrawer.open(new MainFrame((Player) sender));
} else {
help(sender, new CommandHelp(getCurrentCommandManager(),
@@ -59,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}")
@@ -119,7 +133,7 @@ public class GeneralCommands extends BaseCommand {
@Subcommand("%profile")
@CommandPermission("simpleclans.anyone.profile")
@CommandCompletion("@clans")
@CommandCompletion("@clans:hide_own")
@Description("{@@command.description.profile.other}")
public void profile(CommandSender sender, @Conditions("verified") @Name("clan") ClanInput clan) {
ClanProfile p = new ClanProfile(plugin, sender, clan.getClan());
@@ -127,7 +141,7 @@ public class GeneralCommands extends BaseCommand {
}
@Subcommand("%roster")
@CommandCompletion("@clans")
@CommandCompletion("@clans:hide_own")
@CommandPermission("simpleclans.anyone.roster")
@Description("{@@command.description.roster.other}")
public void roster(CommandSender sender, @Conditions("verified") @Name("clan") ClanInput clan) {
@@ -153,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.isAllowResetKdr()) {
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();
}
}
@@ -199,12 +226,12 @@ public class GeneralCommands extends BaseCommand {
return;
}
chatBlock.sendBlock(player, settings.getPageSize());
chatBlock.sendBlock(player, settings.getInt(PAGE_SIZE));
if (chatBlock.size() > 0) {
ChatBlock.sendBlank(player);
ChatBlock.sendMessage(player, settings.getPageHeadingsColor() + lang("view.next.page", player,
settings.getCommandMore()));
ChatBlock.sendMessage(player, settings.getColored(PAGE_HEADINGS_COLOR) + lang("view.next.page", player,
settings.getString(COMMANDS_MORE)));
}
ChatBlock.sendBlank(player);
}
@@ -233,6 +260,31 @@ public class GeneralCommands extends BaseCommand {
mk.send();
}
@Subcommand("%list %balance")
@CommandPermission("simpleclans.anyone.list.balance")
@Description("{@@command.description.list.balance}")
public void listBalance(CommandSender sender) {
List<Clan> clans = cm.getClans();
if (clans.isEmpty()) {
sender.sendMessage(RED + lang("no.clans.have.been.created", sender));
return;
}
clans.sort(Comparator.comparingDouble(Clan::getBalance).reversed());
sender.sendMessage(lang("clan.list.balance.header", sender, settings.getColored(SERVER_NAME), clans.size()));
String lineFormat = lang("clan.list.balance.line", sender);
String leftBracket = settings.getColored(TAG_BRACKET_COLOR) + settings.getColored(TAG_BRACKET_LEFT);
String rightBracket = settings.getColored(TAG_BRACKET_COLOR) + settings.getColored(TAG_BRACKET_RIGHT);
for (int i = 0; i < 10 && i < clans.size(); i++) {
Clan clan = clans.get(i);
String name = " " + (clan.isVerified() ? settings.getColored(PAGE_CLAN_NAME_COLOR) : GRAY) + clan.getName();
String line = MessageFormat.format(lineFormat, i + 1, leftBracket, clan.getColorTag(),
rightBracket, name, clan.getBalance());
sender.sendMessage(line);
}
}
@Subcommand("%list")
@CommandPermission("simpleclans.anyone.list")
@Description("{@@command.description.list}")
@@ -8,7 +8,10 @@ import net.sacredlabyrinth.phaed.simpleclans.EconomyResponse;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanInput;
import net.sacredlabyrinth.phaed.simpleclans.events.ClanBalanceUpdateEvent;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankLogger;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankOperator;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import static net.md_5.bungee.api.ChatColor.RED;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
@@ -19,6 +22,9 @@ import static org.bukkit.ChatColor.AQUA;
@Subcommand("%admin %bank")
public class BankCommand extends BaseCommand {
@Dependency
private PermissionsManager permissions;
@Subcommand("%status")
@CommandPermission("simpleclans.admin.bank.status")
@CommandCompletion("@clans")
@@ -35,12 +41,13 @@ public class BankCommand extends BaseCommand {
public void take(CommandSender sender, @Name("clan") ClanInput clanInput, @Name("amount") double amount) {
Clan clan = clanInput.getClan();
amount = Math.abs(amount);
BankOperator operator = new BankOperator(sender, sender instanceof Player ? permissions.playerGetMoney((Player) sender) : 0);
EconomyResponse economyResponse = clan.withdraw(sender, ClanBalanceUpdateEvent.Cause.COMMAND, amount);
EconomyResponse economyResponse = clan.withdraw(operator, ClanBalanceUpdateEvent.Cause.COMMAND, amount);
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));
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()));
@@ -55,11 +62,12 @@ public class BankCommand extends BaseCommand {
public void give(CommandSender sender, @Name("clan") ClanInput clanInput, @Name("amount") double amount) {
Clan clan = clanInput.getClan();
amount = Math.abs(amount);
BankOperator operator = new BankOperator(sender, sender instanceof Player ? permissions.playerGetMoney((Player) sender) : 0);
EconomyResponse economyResponse = clan.deposit(sender, ClanBalanceUpdateEvent.Cause.COMMAND, amount);
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));
clan.addBb(sender.getName(), lang("bb.clan.give", sender, amount, sender.getName()));
}
}
@@ -70,11 +78,12 @@ public class BankCommand extends BaseCommand {
public void set(CommandSender sender, @Name("clan") ClanInput clanInput, @Name("amount") double amount) {
Clan clan = clanInput.getClan();
amount = Math.abs(amount);
BankOperator operator = new BankOperator(sender, sender instanceof Player ? permissions.playerGetMoney((Player) sender) : 0);
EconomyResponse response = clan.setBalance(sender, ClanBalanceUpdateEvent.Cause.COMMAND, BankLogger.Operation.SET, amount);
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));
clan.addBb(sender.getName(), lang("bb.clan.set", sender, amount, sender.getName()));
}
}
}
@@ -0,0 +1,57 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.staff;
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.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 net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.RED;
@CommandAlias("%clan")
@Conditions("%basic_conditions")
@Subcommand("%mod %bb")
public class BbCommand extends BaseCommand {
@Dependency
private StorageManager storage;
@Dependency
private ClanManager cm;
@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);
}
@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();
ChatBlock.sendMessage(player, RED + lang("cleared.bb", player));
}
@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(lang("bulletin.board.message", player.getName(), msg));
clan.displayBb(player);
storage.updateClan(clan);
}
}
@@ -2,10 +2,11 @@ package net.sacredlabyrinth.phaed.simpleclans.commands.staff;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.*;
import co.aikar.commands.bukkit.contexts.OnlinePlayer;
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;
@@ -18,14 +19,15 @@ import net.sacredlabyrinth.phaed.simpleclans.utils.TagValidator;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
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;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.GLOBAL_FRIENDLY_FIRE;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.RED;
@@ -49,31 +51,32 @@ public class StaffCommands extends BaseCommand {
@CommandCompletion("@players @clans")
@HelpSearchTags("move put")
@Description("{@@command.description.place}")
public void place(CommandSender sender, @Name("player") OnlinePlayer onlinePlayer, @Name("clan") ClanInput clan) {
Player player = onlinePlayer.getPlayer();
ClanPlayer oldCp = cm.getClanPlayer(player);
Clan newClanInput = clan.getClan();
public void place(CommandSender sender, @Name("player") ClanPlayerInput cpInput, @Name("clan") ClanInput clanInput) {
UUID uuid = cpInput.getClanPlayer().getUniqueId();
ClanPlayer oldCp = cm.getClanPlayer(uuid);
Clan newClan = clanInput.getClan();
if (oldCp != null) {
Clan oldClan = Objects.requireNonNull(oldCp.getClan());
if (oldClan.equals(newClanInput)) {
if (oldClan.equals(newClan)) {
ChatBlock.sendMessage(sender, lang("player.already.in.this.clan", sender));
return;
}
if (!oldClan.isPermanent() && oldClan.isLeader(player) && oldClan.getLeaders().size() <= 1) {
if (!oldClan.isPermanent() && oldClan.isLeader(uuid) && oldClan.getLeaders().size() <= 1) {
ChatBlock.sendMessage(sender, RED + lang("you.cannot.move.the.last.leader", sender));
return;
} else {
oldClan.addBb(player.getName(), AQUA + lang("0.has.resigned", player.getName()));
oldClan.removePlayerFromClan(player.getUniqueId());
oldClan.addBb(oldCp.getName(), lang("0.has.resigned", oldCp.getName()));
oldClan.removePlayerFromClan(uuid);
}
}
ClanPlayer cp = Objects.requireNonNull(cm.getCreateClanPlayerUUID(player.getName()));
ClanPlayer cp = cm.getCreateClanPlayer(uuid);
newClanInput.addBb(AQUA + lang("joined.the.clan", player.getName()));
cm.serverAnnounce(lang("has.joined", player.getName(), newClanInput.getName()));
newClanInput.addPlayerToClan(cp);
newClan.addBb(lang("joined.the.clan", cp.getName()));
cm.serverAnnounce(lang("has.joined", cp.getName(), newClan.getName()));
newClan.addPlayerToClan(cp);
}
@Subcommand("%mod %modtag")
@@ -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());
}
@@ -154,8 +157,8 @@ public class StaffCommands extends BaseCommand {
@CommandPermission("simpleclans.mod.ban")
@CommandCompletion("@players")
@Description("{@@command.description.ban}")
public void ban(CommandSender sender, @Name("player") OfflinePlayer player) {
UUID uuid = player.getUniqueId();
public void ban(CommandSender sender, @Name("player") ClanPlayerInput player) {
UUID uuid = player.getClanPlayer().getUniqueId();
if (settings.isBanned(uuid)) {
ChatBlock.sendMessage(sender, RED + lang("this.player.is.already.banned", sender));
return;
@@ -174,8 +177,8 @@ public class StaffCommands extends BaseCommand {
@CommandPermission("simpleclans.mod.ban")
@CommandCompletion("@players")
@Description("{@@command.description.unban}")
public void unban(CommandSender sender, @Name("player") OfflinePlayer player) {
UUID uuid = player.getUniqueId();
public void unban(CommandSender sender, @Name("player") ClanPlayerInput player) {
UUID uuid = player.getClanPlayer().getUniqueId();
if (!settings.isBanned(uuid)) {
ChatBlock.sendMessage(sender, RED + lang("this.player.is.not.banned", sender));
return;
@@ -194,10 +197,10 @@ public class StaffCommands extends BaseCommand {
@CommandPermission("simpleclans.mod.globalff")
@Description("{@@command.description.globalff.allow}")
public void allowGlobalFf(CommandSender sender) {
if (settings.isGlobalff()) {
if (settings.is(GLOBAL_FRIENDLY_FIRE)) {
ChatBlock.sendMessage(sender, AQUA + lang("global.friendly.fire.is.already.being.allowed", sender));
} else {
settings.setGlobalff(true);
settings.set(GLOBAL_FRIENDLY_FIRE, true);
ChatBlock.sendMessage(sender, AQUA + lang("global.friendly.fire.is.set.to.allowed", sender));
}
}
@@ -206,11 +209,11 @@ public class StaffCommands extends BaseCommand {
@CommandPermission("simpleclans.mod.globalff")
@Description("{@@command.description.globalff.auto}")
public void autoGlobalFf(CommandSender sender) {
if (!settings.isGlobalff()) {
if (!settings.is(GLOBAL_FRIENDLY_FIRE)) {
ChatBlock.sendMessage(sender, AQUA +
lang("global.friendy.fire.is.already.being.managed.by.each.clan", sender));
} else {
settings.setGlobalff(false);
settings.set(GLOBAL_FRIENDLY_FIRE, false);
ChatBlock.sendMessage(sender, AQUA + lang("global.friendy.fire.is.now.managed.by.each.clan",
sender));
}
@@ -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));
@@ -257,12 +260,12 @@ public class StaffCommands extends BaseCommand {
public void kick(CommandSender sender, @Conditions("clan_member") @Name("player") ClanPlayerInput cp) {
ClanPlayer clanPlayer = cp.getClanPlayer();
Clan clan = Objects.requireNonNull(clanPlayer.getClan());
if (clan.getLeaders().size() == 1) {
if (clanPlayer.isLeader() && clan.getLeaders().size() == 1) {
ChatBlock.sendMessageKey(sender, "cannot.kick.last.leader");
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());
}
@@ -280,19 +283,20 @@ public class StaffCommands extends BaseCommand {
@CommandPermission("simpleclans.admin.promote")
@Description("{@@command.description.admin.promote}")
public void promote(CommandSender sender, @Conditions("online|clan_member") @Name("player") ClanPlayerInput promote) {
Player promotePl = Objects.requireNonNull(promote.getClanPlayer().toPlayer());
ClanPlayer clanPlayer = promote.getClanPlayer();
Player promotePl = Objects.requireNonNull(clanPlayer.toPlayer());
if (!permissions.has(promotePl, "simpleclans.leader.promotable")) {
ChatBlock.sendMessage(sender, RED + lang("the.player.does.not.have.the.permissions.to.lead.a.clan",
sender));
return;
}
Clan clan = Objects.requireNonNull(promote.getClanPlayer().getClan());
Clan clan = Objects.requireNonNull(clanPlayer.getClan());
if (clan.isLeader(promotePl)) {
ChatBlock.sendMessage(sender, RED + lang("the.player.is.already.a.leader", sender));
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));
}
@@ -304,13 +308,18 @@ public class StaffCommands extends BaseCommand {
public void demote(CommandSender sender, @Conditions("clan_member") @Name("leader") ClanPlayerInput other) {
ClanPlayer otherCp = other.getClanPlayer();
Clan clan = Objects.requireNonNull(otherCp.getClan());
if (clan.getLeaders().size() == 1) {
if (!otherCp.isLeader()) {
ChatBlock.sendMessage(sender, RED + lang("player.is.not.a.leader", sender));
return;
}
if (clan.getLeaders().size() == 1 && !clan.isPermanent()) {
ChatBlock.sendMessage(sender, RED + lang("you.cannot.demote.the.last.leader", sender));
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));
}
@@ -319,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));
}
@@ -328,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"));
}
}
@@ -0,0 +1,57 @@
package net.sacredlabyrinth.phaed.simpleclans.conversation;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.Prompt;
import org.bukkit.conversations.StringPrompt;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.RED;
abstract public class ConfirmationPrompt extends StringPrompt {
protected abstract Prompt confirm(ClanPlayer sender, Clan clan);
protected Prompt decline(ClanPlayer sender) {
return new MessagePromptImpl(RED + lang(getDeclineTextKey(), sender));
}
protected abstract String getPromptTextKey();
protected abstract String getDeclineTextKey();
@NotNull
@Override
public String getPromptText(@NotNull ConversationContext context) {
Player player = (Player) context.getForWhom();
List<String> options = Arrays.asList(lang("yes", player), lang("cancel", player));
return RED + lang(getPromptTextKey(), player, options);
}
@Override
public Prompt acceptInput(@NotNull ConversationContext cc, @Nullable String input) {
final SimpleClans plugin = (SimpleClans) cc.getPlugin();
Player player = (Player) cc.getForWhom();
String yes = lang("yes", player);
ClanManager cm = Objects.requireNonNull(plugin).getClanManager();
ClanPlayer cp = cm.getCreateClanPlayer(player.getUniqueId());
Clan clan = cp.getClan();
if (clan == null) {
return END_OF_CONVERSATION;
}
return yes.equalsIgnoreCase(input) ? confirm(cp, clan) : decline(cp);
}
}
@@ -5,9 +5,7 @@ import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.events.PreCreateClanEvent;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.Prompt;
import org.bukkit.conversations.StringPrompt;
@@ -17,6 +15,9 @@ import org.jetbrains.annotations.Nullable;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.conversation.CreateClanTagPrompt.TAG_KEY;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.RED;
public class CreateClanNamePrompt extends StringPrompt {
public static final String NAME_KEY = "name";
@@ -65,16 +66,15 @@ public class CreateClanNamePrompt extends StringPrompt {
plugin.getClanManager().createClan(player, tag, name);
Clan clan = plugin.getClanManager().getClan(tag);
clan.addBb(player.getName(), ChatColor.AQUA +
lang("clan.created", name));
clan.addBb(player.getName(), lang("clan.created", name));
plugin.getStorageManager().updateClan(clan);
if (plugin.getSettingsManager().isRequireVerification()) {
boolean verified = !plugin.getSettingsManager().isRequireVerification()
if (plugin.getSettingsManager().is(REQUIRE_VERIFICATION)) {
boolean verified = !plugin.getSettingsManager().is(REQUIRE_VERIFICATION)
|| plugin.getPermissionsManager().has(player, "simpleclans.mod.verify");
if (!verified) {
ChatBlock.sendMessage(player, ChatColor.AQUA +
ChatBlock.sendMessage(player, AQUA +
lang("get.your.clan.verified.to.access.advanced.features", player));
}
}
@@ -85,19 +85,19 @@ public class CreateClanNamePrompt extends StringPrompt {
private Prompt validateName(@NotNull SimpleClans plugin, @NotNull Player player, @NotNull String input) {
boolean bypass = plugin.getPermissionsManager().has(player, "simpleclans.mod.bypass");
if (!bypass) {
if (ChatUtils.stripColors(input).length() > plugin.getSettingsManager().getClanMaxLength()) {
return new MessagePromptImpl(ChatColor.RED +
if (ChatUtils.stripColors(input).length() > plugin.getSettingsManager().getInt(CLAN_MAX_LENGTH)) {
return new MessagePromptImpl(RED +
lang("your.clan.name.cannot.be.longer.than.characters", player,
plugin.getSettingsManager().getClanMaxLength()), this);
plugin.getSettingsManager().getInt(CLAN_MAX_LENGTH)), this);
}
if (ChatUtils.stripColors(input).length() <= plugin.getSettingsManager().getClanMinLength()) {
return new MessagePromptImpl(ChatColor.RED +
if (ChatUtils.stripColors(input).length() <= plugin.getSettingsManager().getInt(CLAN_MIN_LENGTH)) {
return new MessagePromptImpl(RED +
lang("your.clan.name.must.be.longer.than.characters", player,
plugin.getSettingsManager().getClanMinLength()), this);
plugin.getSettingsManager().getInt(CLAN_MIN_LENGTH)), this);
}
}
if (input.contains("&")) {
return new MessagePromptImpl(ChatColor.RED +
return new MessagePromptImpl(RED +
lang("your.clan.name.cannot.contain.color.codes", player), this);
}
@@ -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);
}
}
@@ -0,0 +1,32 @@
package net.sacredlabyrinth.phaed.simpleclans.conversation;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import org.bukkit.conversations.Prompt;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.RED;
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()));
}
@Override
protected String getPromptTextKey() {
return "disband.confirmation";
}
@Override
protected String getDeclineTextKey() {
return "disband.request.cancelled";
}
}
@@ -0,0 +1,30 @@
package net.sacredlabyrinth.phaed.simpleclans.conversation;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.conversations.Conversation;
import org.bukkit.conversations.InactivityConversationCanceller;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.RED;
public class InactivityCanceller extends InactivityConversationCanceller {
/**
* Creates an InactivityConversationCanceller.
*
* @param plugin The owning plugin.
* @param timeoutSeconds The number of seconds of inactivity to wait.
*/
public InactivityCanceller(@NotNull Plugin plugin, int timeoutSeconds) {
super(plugin, timeoutSeconds);
}
@Override
protected void cancelling(@NotNull Conversation conversation) {
Player forWhom = (Player) conversation.getForWhom();
forWhom.spigot().sendMessage(new TextComponent(RED + lang("you.did.not.answer.in.time", forWhom)));
}
}
@@ -1,13 +1,14 @@
package net.sacredlabyrinth.phaed.simpleclans.conversation;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.MessagePrompt;
import org.bukkit.conversations.Prompt;
import org.jetbrains.annotations.NotNull;
/**
* @author roinujnosde
*/
public class MessagePromptImpl extends org.bukkit.conversations.MessagePrompt {
public class MessagePromptImpl extends MessagePrompt {
private final String message;
private Prompt nextPrompt;
public MessagePromptImpl(String message) {
@@ -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";
}
}
@@ -2,17 +2,7 @@ package net.sacredlabyrinth.phaed.simpleclans.conversation;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import org.bukkit.conversations.ConversationContext;
import org.bukkit.conversations.Prompt;
import org.bukkit.conversations.StringPrompt;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.text.MessageFormat;
import java.util.Arrays;
import java.util.Objects;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.AQUA;
@@ -21,45 +11,31 @@ import static org.bukkit.ChatColor.RED;
/**
* @author roinujnosde
*/
public class ResignPrompt extends StringPrompt {
public class ResignPrompt extends ConfirmationPrompt {
@Override
public Prompt acceptInput(ConversationContext cc, String input) {
final SimpleClans plugin = (SimpleClans) cc.getPlugin();
protected Prompt confirm(ClanPlayer sender, Clan clan) {
if (clan.isPermanent() || !sender.isLeader() || clan.getLeaders().size() > 1) {
clan.addBb(sender.getName(), lang("0.has.resigned", sender.getName()));
sender.addResignTime(clan.getTag());
clan.removePlayerFromClan(sender.getUniqueId());
Player player = (Player) cc.getForWhom();
String yes = lang("yes", player);
ClanManager cm = Objects.requireNonNull(plugin).getClanManager();
ClanPlayer cp = cm.getCreateClanPlayer(player.getUniqueId());
Clan clan = cp.getClan();
if (clan == null) {
return END_OF_CONVERSATION;
}
if (yes.equalsIgnoreCase(input)) {
if (clan.isPermanent() || !clan.isLeader(player) || clan.getLeaders().size() > 1) {
clan.addBb(player.getName(), AQUA + lang("0.has.resigned", player.getName()));
cp.addResignTime(clan.getTag());
clan.removePlayerFromClan(player.getUniqueId());
return new MessagePromptImpl(AQUA + lang("resign.success", player));
} else if (clan.isLeader(player) && clan.getLeaders().size() == 1) {
clan.disband(player, true, false);
return new MessagePromptImpl(RED + lang("clan.has.been.disbanded", player, clan.getName()));
} else {
return new MessagePromptImpl(RED + lang("last.leader.cannot.resign.you.must.appoint.another.leader.or.disband.the.clan", player));
}
return new MessagePromptImpl(AQUA + lang("resign.success", sender));
} else if (sender.isLeader() && clan.getLeaders().size() == 1) {
clan.disband(sender.toPlayer(), true, false);
return new MessagePromptImpl(RED + lang("clan.has.been.disbanded", sender, clan.getName()));
} else {
return new MessagePromptImpl(RED + lang("resign.request.cancelled", player));
return new MessagePromptImpl(RED + lang("last.leader.cannot.resign.you.must.appoint.another.leader.or.disband.the.clan", sender));
}
}
@Override
public @NotNull String getPromptText(@NotNull ConversationContext cc) {
Player player = (Player) cc.getForWhom();
return RED + MessageFormat.format(
lang("resign.confirmation", player), Arrays.asList(
lang("yes", player), lang("cancel", player)));
protected String getPromptTextKey() {
return "resign.confirmation";
}
@Override
protected String getDeclineTextKey() {
return "resign.request.cancelled";
}
}
@@ -1,6 +1,9 @@
package net.sacredlabyrinth.phaed.simpleclans.conversation;
import org.bukkit.conversations.*;
import org.bukkit.conversations.Conversable;
import org.bukkit.conversations.Conversation;
import org.bukkit.conversations.ConversationCanceller;
import org.bukkit.conversations.Prompt;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
@@ -28,7 +31,7 @@ public class SCConversation extends Conversation {
public SCConversation(@NotNull Plugin plugin, @NotNull Conversable forWhom, @Nullable Prompt firstPrompt, @NotNull Map<Object, Object> initialSessionData, int timeout) {
super(plugin, forWhom, firstPrompt, initialSessionData);
this.setLocalEchoEnabled(true);
this.addConversationCanceller(new InactivityConversationCanceller(plugin, timeout));
this.addConversationCanceller(new InactivityCanceller(plugin, timeout));
}
@Override
@@ -46,6 +49,6 @@ public class SCConversation extends Conversation {
public void addConversationCanceller(@NotNull ConversationCanceller canceller) {
canceller.setConversation(this);
this.cancellers.add(canceller);
cancellers.add(canceller);
}
}
@@ -1,21 +1,25 @@
package net.sacredlabyrinth.phaed.simpleclans.events;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* @author RoinujNosde
*/
public class ChatEvent extends Event implements Cancellable {
/*
* Todo: refactor Type to Channel in 3.0
*/
private static final HandlerList HANDLER_LIST = new HandlerList();
private String message;
private final ClanPlayer sender;
@@ -23,7 +27,7 @@ public class ChatEvent extends Event implements Cancellable {
private final Map<String, String> placeholders = new HashMap<>();
private final Type type;
private boolean cancelled;
public ChatEvent(String message, ClanPlayer sender, List<ClanPlayer> receivers, Type type) {
if (message == null || sender == null || receivers == null || type == null) {
throw new IllegalArgumentException("none of the args can be null");
@@ -32,7 +36,7 @@ public class ChatEvent extends Event implements Cancellable {
this.sender = sender;
this.receivers = receivers;
this.type = type;
}
}
@Override
public boolean isCancelled() {
@@ -47,9 +51,10 @@ public class ChatEvent extends Event implements Cancellable {
public enum Type {
ALLY, CLAN
}
/**
* Gets the chat type
*
* @return the chat type
*/
public Type getType() {
@@ -69,10 +74,10 @@ public class ChatEvent extends Event implements Cancellable {
* Adds a placeholder and its value to the chat message
*
* @param placeholderName the placeholder name
* @param value the String to be replaced
* @param value the String to be replaced
* @throws IllegalArgumentException if one of the args are null; if one of
* the args are empty; if the placeholder name equals "clan", "nick-color",
* "player", "rank" or "message"
* the args are empty; if the placeholder name equals "clan", "nick-color",
* "player", "rank" or "message"
*/
public void addPlaceholder(String placeholderName, String value) {
if (placeholderName == null || value == null) {
@@ -107,6 +112,7 @@ public class ChatEvent extends Event implements Cancellable {
/**
* Changes the chat message
*
* @param message the new message
*/
public void setMessage(String message) {
Loaded 100 of 255 files, more files were not shown because too many files have changed in this diff. Show more