Compare commits

..
1 Commits
Author SHA1 Message Date
RoinujNosde 1c457ce552 feat: redirect commands to GUI 2022-11-29 19:51:33 -03:00
505 changed files with 26856 additions and 41665 deletions

No files matched your search

-1
View File
@@ -1 +0,0 @@
.gitea/CODEOWNERS linguist-detectable=false
+5
View File
@@ -0,0 +1,5 @@
root: ./wiki
structure:
readme: README.md
summary: SUMMARY.md
-3
View File
@@ -1,3 +0,0 @@
# Pull requests request review from the eligible staff team(s).
# One approval from either an Admin or Developer satisfies branch protection.
* @trueog/Admins @trueog/Developers
+30
View File
@@ -0,0 +1,30 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Run the command '...'
2. Click on a mob '....'
3. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Software (please complete the following information):**
- Server: [e.g. Spigot 1.12]
- Plugin version [e.g. 2.12.1]
**Additional context**
Add any other context about the problem here.
+20
View File
@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
+37
View File
@@ -0,0 +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: CI
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
strategy:
fail-fast: true
max-parallel: 4
matrix:
java-version: [ 8, 11, 16, 17 ]
runs-on: ubuntu-latest
name: Java ${{ matrix.java-version }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: "Set up JDK ${{ matrix.java-version }}"
uses: actions/setup-java@v2
with:
java-version: "${{ matrix.java-version }}"
distribution: 'adopt'
cache: 'maven'
- name: Build with Maven
run: mvn -B -U package --file pom.xml
- name: Upload Build Artifact
if: "${{ matrix.java-version == 8 }}"
uses: actions/upload-artifact@v2
with:
name: SimpleClans
path: target/SimpleClans.jar
+31
View File
@@ -0,0 +1,31 @@
name: Publish to CurseForge
on:
release:
types: [created]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v2
with:
java-version: 8
cache: 'maven'
distribution: 'adopt'
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Upload artifact
uses: itsmeow/curseforge-upload@v3
with:
token: ${{ secrets.CURSEFORGE_TOKEN }}
project_id: 380814
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: 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@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v2
with:
java-version: 8
cache: 'maven'
distribution: 'adopt'
- name: Build with Maven
run: mvn -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@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v2
with:
java-version: 8
server-id: reposilite # Value of the distributionManagement/repository/id field of the pom.xml
server-username: MAVEN_USERNAME
server-password: MAVEN_PASSWORD
cache: 'maven'
distribution: 'adopt'
- name: Build with Maven
run: mvn -B package --file pom.xml
- name: Publish to Reposilite
run: mvn -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
+6 -8
View File
@@ -1,11 +1,9 @@
.idea/
bin/
.classpath
.project
/target/
/.idea/
/bin/
/.classpath
/.project
/dependency-reduced-pom.xml
*.jar
build/
.gradle/
.settings
.factorypath
SimpleClans.iml
/unions.txt
-6
View File
@@ -1,6 +0,0 @@
[submodule "libs/Utilities-OG"]
path = libs/Utilities-OG
url = https://git.trueog.net/trueog/Utilities-OG
[submodule "libs/DiamondBank-OG"]
path = libs/DiamondBank-OG
url = https://git.trueog.net/trueog/DiamondBank-OG
+22
View File
@@ -0,0 +1,22 @@
# Use https://travis-ci.org/ for automatic testing
# This is a java project
language: java
script: mvn install
jdk: [openjdk8]
# if one build failed, exit testing
matrix:
fast_finish: true
addons:
artifacts: true
# Disable caching in order to get notified if there are some repo/dependency issues
## Cache maven dependencies
#sudo: false
#cache:
# directories:
# - '$HOME/.m2/repository'
+25 -116
View File
@@ -1,126 +1,35 @@
# Unions-OG Changelog
# Changelog
This changelog records only changes made by the Unions-OG soft fork relative
to upstream [SimpleClans](https://github.com/RoinujNosde/SimpleClans). Changes
inherited unchanged from SimpleClans are intentionally omitted.
## [2.18.0](https://github.com/RoinujNosde/SimpleClans/compare/v2.17.0...v2.18.0) (2022-10-14)
## [2.5.1] - 2026-08-15
- Inactivity purges removed. Unions and player data are no longer deleted on startup.
### Features
## [2.5] - 2026-08-13
* 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))
### Added
- Clickable chat buttons for request responses. Accept and deny regroup requests
now display green `[ACCEPT]` and red `[DENY]` buttons in chat that players can
click instead of typing commands. Hover text explains each button's action.
Command-based responses still work for full backward compatibility.
- Adventure/MiniMessage dependency for rich text rendering and interactive chat
components.
- Fix union commands and help menu
### Bug Fixes
## [2.4] - 2026-08-10
* 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))
### Added
- Unions decide by member vote. `disband`, `home set` and `war start` now open
a proposal that passes when half the members are in favour, is rejected once
half becomes unreachable, and expires after 7 days. Votes are stored in the
database, so members can vote when they next log in.
- `/union vote` shows the open proposal and its tally; `/union vote yes|no`
casts a vote. A vote screen in the GUI does the same, and is shown once on
login to members who have not voted.
- Disbanding a union splits its bank evenly between all members. Inert until
union bank accounts are enabled.
- `/clan`, `/clans`, `/factions`, `/guilds`, `/party`, `/tribe`, `/nation`,
`/crew`, `/squad` and `/gang` tell the player to use `/union` instead.
`/f`, `/faction` and `/guild` are left to Utilities-OG.
### Performance Improvements
### Changed
- Unions are flat. Every union command is member-level, and the three actions
above are the only ones needing more than one member's say-so.
- Folded `unionsog.leader.*` into `unionsog.member.*`, which is granted by
default. Union ally management is `unionsog.member.ally-set` and union
friendly fire is `unionsog.member.union-ff`, to avoid clashing with the
existing ally-chat and personal-friendly-fire nodes.
- Renamed clan to union across the API, config sections and message keys:
`Clan` is `Union`, `clan:` is `union:`, `clanchat:` is `unionchat:`.
Database identifiers and PlaceholderAPI placeholder names deliberately keep
their `clan` spelling.
- Renamed `/union clanff` to `/union unionff`.
- Chat and display formats accept `{union}`; `{clan}` still works.
- A union now ends with its last member.
- `/union war start` no longer asks the target union, so the member-count
guard always applies. Removed `war-and-protection.war-start.request-enabled`.
- Inter-union requests are answered by the first member of the asked union
rather than by its leaders.
- Set the union GUI title to "Union Management".
### Removed
- Ranks, promotion and demotion, with their commands, settings, events and GUI
screens.
- The leader role: no leader flag, leader-only command, tag colour, Discord
role or `sc_leader` LuckPerms group. The `sc_players.leader` column is kept
and always written `0` for data compatibility.
- The leaders-only land creation option.
- The in-game Crowdin translation prompts.
### Fixed
- `/union lookup` and `/union profile` no longer print a literal
`%player_rank%` or `%clan_leaders%`.
- Removed a stale `%rank%` token from the default chat formats.
- `/union unionff block` now requires union membership, matching
`/union unionff allow`.
- The legacy database importer no longer reads or writes leader relationships.
## [2.3] - Initial release
### Added
- `/union` and `/unions` as primary command aliases, keeping `/clan` and
`/clans`.
- `/u [message]` for union chat. Running `/u` alone toggles the channel.
- `/union color <color>` with named, legacy and hex color support.
- `simpleunions` PlaceholderAPI aliases alongside the legacy `simpleclans`
identifier, plus MiniPlaceholders support through Utilities-OG.
- A Union Banking preview in the main GUI.
- A configuration-gated legacy database migration from `unions_parties` and
`unions_players`. It never touches the source tables, requires empty
transactional destinations, is idempotent, and aborts startup on failure so
the server cannot run on partially migrated data.
### Changed
- Renamed the plugin and artifact to Unions-OG, moved the namespace to
`net.trueog.unionsog` and permission nodes to `unionsog.*`.
- Replaced Vault with DiamondBank-OG and its shard-based balances. Legacy
Vault-denominated union balances are zeroed once. Union-bank commands are
disabled until DiamondBank-OG provides union-owned accounts.
- Unions are treated as verified without the upstream verification workflow.
- Reserved `None` as a union name or tag, and made the no-union color-tag
placeholder return a stable `&8None`.
- Bulletin-board messages no longer show on login by default.
- Reordered the main GUI around the union overview, banking preview, lists,
leaderboards and administrative tools.
- Replaced the WorldGuard 6 reflection provider with the WorldEdit and
WorldGuard 7 APIs.
- Updated MySQL driver loading for Connector/J 8, MariaDB and JDBC service
discovery.
- Migrated the build from Maven to Gradle with a Java 17 toolchain,
reproducible shaded jars, and the Utilities-OG and DiamondBank-OG submodules.
### Removed
- The Vault dependency, along with the member-fee and upkeep tasks it backed.
- The legacy WorldGuard 6 provider.
- bStats telemetry.
## Fork baseline
The fork last merged upstream SimpleClans history through commit `0406c61b`
on 2026-03-30. Earlier SimpleClans release history belongs to the upstream
project.
* improved UUID lookup performance ([4ab53d1](https://github.com/RoinujNosde/SimpleClans/commit/4ab53d16135ecf5a4067b1a63d058da392dc5313))
+70 -125
View File
@@ -1,140 +1,85 @@
![Unions-OG Logo](https://i.imgur.com/9vgfVdX.png)
[![SimpleClans Logo](https://i.imgur.com/9vgfVdX.png)](https://www.spigotmc.org/resources/simpleclans.71242/)
# Unions-OG
SimpleClans
==========
A full-featured union system for PvP Minecraft servers.
Full featured clan system for PVP Minecraft Servers!
> [!IMPORTANT]
> Unions-OG is an unofficial soft fork of
> [SimpleClans](https://github.com/RoinujNosde/SimpleClans), maintained for the
> TrueOG Network. Upstream behavior is retained where practical, while
> branding, integrations, and selected gameplay behavior intentionally differ.
[![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)
[![Discord](https://img.shields.io/discord/719557355917934613?label=discord&logo=discord)](https://discord.gg/CkNwgdE)
[![bStats Servers](https://img.shields.io/bstats/servers/7131)](https://bstats.org/plugin/bukkit/SimpleClans/7131)
[![bStats Players](https://img.shields.io/bstats/players/7131)](https://bstats.org/plugin/bukkit/SimpleClans/7131)
Current fork version: **2.4**
- [Fork-only changelog](CHANGELOG.md)
- [PlaceholderAPI and MiniPlaceholders reference](placeholder-info.txt)
- [Upstream SimpleClans project](https://github.com/RoinujNosde/SimpleClans)
#### Download Link
## Main fork differences
* [Download from Spigot](https://www.spigotmc.org/resources/simpleclans.71242/)
### Flat unions
#### Documentation
Unions have no internal hierarchy. Ranks, promotion, demotion and the leader
role itself were removed, so every member holds the same powers.
* [Documentation](https://simpleclans.gitbook.io/simpleclans/)
* Commands & Permissions
* [Permissions](https://simpleclans.gitbook.io/simpleclans/commands-and-permissions/permissions)
* [Commands](https://simpleclans.gitbook.io/simpleclans/commands-and-permissions/commands)
* [Clan Alliances and Rivalries](https://simpleclans.gitbook.io/simpleclans/commands-and-permissions/aliances-and-rivalries)
* [Clan Ranks with Permissions](https://simpleclans.gitbook.io/simpleclans/commands-and-permissions/ranks-with-permissions)
* How to Setup
* [Configuration](https://simpleclans.gitbook.io/simpleclans/how-to-setup/configuration)
* [Translation](https://simpleclans.gitbook.io/simpleclans/how-to-setup/translation)
* [Clan Member Fee](https://simpleclans.gitbook.io/simpleclans/how-to-setup/member-fee)
* [Clan Upkeep](https://simpleclans.gitbook.io/simpleclans/how-to-setup/clan-upkeep)
* [Clan name above players head](https://simpleclans.gitbook.io/simpleclans/how-to-setup/clan-below-players-name)
* [Clan name on Tablist](https://simpleclans.gitbook.io/simpleclans/how-to-setup/clan-on-tablist)
* Plugins & Development
* [SimpleClans API Example](https://simpleclans.gitbook.io/simpleclans/other/simpleclans-api)
* [PlaceholderAPI Placeholders](https://simpleclans.gitbook.io/simpleclans/other/placeholderapi-support)
* [Land Protection Plugins](https://simpleclans.gitbook.io/simpleclans/other/land-claims)
#### Support & Suggestions
- Every union command is member-level. There is no leader flag, no rank
system, and no way to grant one member authority over another.
- A union ends with its last member: resigning, or being kicked or moved out
as the only member, disbands it.
* [Discord Support](https://discord.gg/CkNwgdE)
* [Bugs and Suggestions](https://github.com/RoinujNosde/SimpleClans/issues)
### Decisions by member consensus
Three actions need a vote of the union's own members instead of a leader's
say-so: **disband**, **home set**, and **war start**.
#### Developers
- A proposal passes as soon as half the members (rounded up) vote in favour,
and is rejected as soon as enough vote against that half can no longer be
reached.
- Votes are stored in the database, so a member who is offline when a
proposal opens can still vote the next time they log in. Proposals expire
after 7 days.
- A union can only have one proposal open at a time.
- Members vote with `/union vote yes|no`, or by clicking the vote buttons in
the union GUI. The GUI is presented once on login to members who have not
voted yet.
- `/union vote` on its own shows the open proposal and the running tally.
### Other differences
- Uses Unions-OG branding and union terminology throughout, including config
sections (`union:`, `unionchat:`) and message keys.
- Provides `/union` and `/unions`. Other group words — `/clan`, `/clans`,
`/factions`, `/guilds`, `/party`, `/tribe`, `/nation`, `/crew`, `/squad` and
`/gang` — are registered as signposts that tell the player to run the same command with
`/union` instead. `/f`, `/faction` and `/guild` belong to Utilities-OG,
which already redirects them.
- Uses `/u` for union chat; a bare `/u` toggles the union-chat channel.
- Adds `/union rename <name>` and `/union color <color>`, both open to any
member.
- Union-wide friendly fire is `/union unionff allow|block`, aliased as
`/union pvp on|off`. The per-player friendly fire opt-in (`/union ff`)
is removed, so friendly fire is decided only by the union setting or the
staff-wide `globalff` override.
- Supports both `simpleclans` and `simpleunions` placeholder identifiers in
PlaceholderAPI and MiniPlaceholders.
- Uses DiamondBank-OG instead of Vault for player economy access. Union-owned
bank accounts remain under development, so their commands are currently
disabled. Once enabled, disbanding a union splits its bank evenly between
all members.
- Treats unions as verified without requiring the upstream verification
workflow.
- Includes a configuration-gated, transactional importer for the legacy
unions database.
See the [changelog](CHANGELOG.md) for the complete list of changes maintained
by this fork. Upstream SimpleClans changes are intentionally not repeated
there.
## Documentation
The [Unions-OG wiki](wiki/) documents this fork, and is the reference to use.
- [Commands](wiki/commands-and-permissions/commands.md)
- [Permissions](wiki/commands-and-permissions/permissions.md)
- [Proposals and Voting](wiki/commands-and-permissions/proposals-and-voting.md)
- [Union Alliances and Rivalries](wiki/commands-and-permissions/alliances-and-rivalries.md)
- [Configuration](wiki/how-to-setup/configuration.md)
- [PlaceholderAPI Support](wiki/other/placeholderapi-support.md)
- [API example](wiki/other/unions-og-api.md)
> [!WARNING]
> The [upstream SimpleClans documentation](https://simpleclans.gitbook.io/simpleclans/)
> no longer describes this fork. Its pages on leaders, ranks, promotion,
> demotion, member fees and upkeep do **not** apply, and its command,
> permission and configuration names have all been renamed here.
For the unmodified upstream plugin and its public releases, use the
[SimpleClans Spigot page](https://www.spigotmc.org/resources/simpleclans.71242/).
That download is not an Unions-OG build.
## Building
The build requires Java 17. Clone with submodules, then run:
```bash
git submodule update --init --recursive
./gradlew build
Including SimpleClans with Maven:
```xml
<repositories>
<repository>
<id>roinujnosde-repo</id>
<url>https://repo.roinujnosde.me/releases/</url>
</repository>
</repositories>
```
```xml
<dependencies>
<dependency>
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<version>2.17.0</version> <!-- You can find the latest version at the bottom -->
<scope>provided</scope>
</dependency>
</dependencies>
```
The shaded plugin is produced under `build/libs/` with the
`Unions-OG-2.4.jar` name.
Using Gradle:
```groovy
repositories {
maven {
url "https://repo.roinujnosde.me/releases/"
}
}
dependencies {
compileOnly "net.sacredlabyrinth.phaed.simpleclans:SimpleClans:2.17.0"
}
```
## Developer compatibility
- Java and Gradle namespace: `net.trueog.unionsog`
- Bukkit main class: `net.trueog.unionsog.UnionsOG`
- API types use union naming: `Union`, `UnionPlayer`, `UnionManager`,
`Proposal`, `DisbandUnionEvent`
- Permission prefix: `unionsog.*`. Union actions all live under
`unionsog.member.*`, which is granted by default; there is no
`unionsog.leader.*` tree
- Command aliases: `union` and `unions`. Other group words are redirect-only
signposts, not aliases, and never execute a union command
- Placeholder identifiers: `simpleunions` and the retained `simpleclans`
compatibility identifier. Placeholder **names** deliberately keep their
upstream `clan` spelling (`%simpleunions_clan_name%`) so existing setups
keep resolving
- Database identifiers are unchanged for live-data compatibility: the table
prefix stays `sc_`, and the `clans` table and `leader` column are retained
even though the leader column is no longer used
- Chat and display formats accept `{union}`; the legacy `{clan}` token still
works
The old SimpleClans Maven coordinates and Java packages do not describe this
fork and should not be used as Unions-OG API coordinates.
## Credits and license
Unions-OG is derived from SimpleClans by its original and upstream
contributors. This fork remains licensed under the [GNU GPL v3](LICENSE).
Feel free to learn our [Javadoc](https://ci.roinujnosde.me/job/SimpleClans/Javadoc/).
##### Latest version:
[![Maven metadata URL](https://img.shields.io/maven-metadata/v?metadataUrl=https%3A%2F%2Frepo.roinujnosde.me%2Freleases%2Fnet%2Fsacredlabyrinth%2Fphaed%2Fsimpleclans%2FSimpleClans%2Fmaven-metadata.xml)](https://repo.roinujnosde.me/#/releases/net/sacredlabyrinth/phaed/simpleclans/SimpleClans)
##### API Examples
* [Examples of how to use the API](https://simpleclans.gitbook.io/simpleclans/other/simpleclans-api)
+145
View File
@@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.spigotmc:spigot-api:1.16.4-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-lang:commons-lang:2.6" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:21.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.md-5:bungeecord-chat:1.16-R0.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.MilkBowl:VaultAPI:1.7" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bukkit:bukkit:1.13.1-R0.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.googlecode.json-simple:json-simple:1.1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: junit:junit:4.10" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.hamcrest:hamcrest-core:1.1" level="project" />
<orderEntry type="library" name="Maven: org.bstats:bstats-bukkit:2.2.1" level="project" />
<orderEntry type="library" name="Maven: org.bstats:bstats-base:2.2.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: me.clip:placeholderapi:2.10.9" level="project" />
<orderEntry type="library" name="Maven: org.jetbrains:annotations:22.0.0" level="project" />
<orderEntry type="library" name="Maven: io.papermc:paperlib:1.0.8-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: co.aikar:acf-paper:0.5.1-SNAPSHOT" level="project" />
<orderEntry type="library" name="Maven: com.github.cryptomorin:XSeries:8.3.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.7.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldguard:worldguard-bukkit:7.0.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldguard:worldguard-core:7.0.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldguard.worldguard-libs:core:7.0.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldedit:worldedit-core:7.2.0-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q.worldedit.worldedit-libs:core:7.2.0-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: de.schlichtherle:truezip:6.8.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-profile-default_2.13:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.scala-lang:scala-library:2.13.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-http:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-kernel-spec:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-annotations:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.findbugs:annotations:3.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-cio:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-io:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-services:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-logging:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.inject:javax.inject:1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.httpcomponents:httpclient:4.5.10" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.httpcomponents:httpcore:4.4.12" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-odf:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-zipdriver:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-zip:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.bouncycastle:bcprov-jdk15on:1.63" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-tardriver:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-compress:1.19" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar-bzip2:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar-gzip:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-tar-xz:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.tukaani:xz:1.8" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-zip-raes:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-profile-base_2.13:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-access-swing:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-access:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-file:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-jar:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-driver-zip:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-comp-ibm437:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truevfs:truevfs-kernel-impl_2.13:0.12.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-console:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-default:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-swing:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-macosx:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-key-spec:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.truecommons:truecommons-shed:2.5.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.dev.jna:jna:4.1.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.mozilla:rhino-runtime:1.7.12" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: it.unimi.dsi:fastutil:8.2.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.antlr:antlr4-runtime:4.7.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.flywaydb:flyway-core:3.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sk89q:commandbook:2.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.TechFortress:GriefPrevention:16.17.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.discordsrv:discordsrv:1.24.1-SNAPSHOT" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.dv8tion:JDA:4.3.0_349" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.code.findbugs:jsr305:3.0.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.squareup.okhttp3:okhttp:3.13.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.squareup.okio:okio:1.17.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-collections4:4.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.10.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.10.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.fasterxml.jackson.core:jackson-core:2.10.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.neovisionaries:nv-websocket-client:2.14" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.sf.trove4j:trove4j:3.0.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: github.scarsz:configuralize:1.3.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.alexheretic:dynamics:4.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.alexheretic:fluent:2.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:slf4j-jdk14:1.7.25" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.slf4j:jcl-over-slf4j:1.7.25" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-io:commons-io:2.8.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-collections:commons-collections:3.2.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.commons:commons-lang3:3.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-codec:commons-codec:1.11" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.vdurmont:emoji-java:5.1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.json:json:20170516" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.zafarkhaja:java-semver:0.9.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.github.kevinsawicki:http-request:6.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.minidns:minidns-hla:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.minidns:minidns-dnssec:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.minidns:minidns-client:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.minidns:minidns-core:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.minidns:minidns-iterative-resolver:1.0.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-expression:5.2.7.RELEASE" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-core:5.2.7.RELEASE" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: dev.vankka:MCDiscordReserializer:4.2.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: dev.vankka:SimpleAST:2.2.7" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-api:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-key:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:examination-api:1.3.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:examination-string:1.3.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-legacy:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-gson:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-plain:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-bukkit:4.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-api:4.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-bungeecord:4.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-nbt:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-serializer-gson-legacy-impl:4.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-facet:4.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-platform-viaversion:4.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.kyori:adventure-text-minimessage:4.1.0-20210316.192746" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: biz.princeps:landlord-latest:4.351" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: biz.princeps:landlord-core:4.351" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: biz.princeps:landlord-api:4.351" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.zaxxer:HikariCP:4.0.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: io.github.bananapuncher714:nbteditor:7.16.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: de.eldoria:eldo-util:1.9.1" level="project" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:2.9.1" level="project" />
</component>
</module>
File diff suppressed because it is too large. Load diff
-4
View File
@@ -1,4 +0,0 @@
#!/usr/bin/bash
# Fetch all submodule content.
git submodule update --force --recursive --init
-181
View File
@@ -1,181 +0,0 @@
import org.gradle.kotlin.dsl.provideDelegate
/* ------------------------------ Plugins ------------------------------ */
plugins {
id("java") // Import Java plugin.
id("java-library") // Import Java Library plugin.
id("com.diffplug.spotless") version "8.1.0" // Import Spotless plugin.
id("com.gradleup.shadow") version "8.3.9" // Import Shadow plugin.
id("checkstyle") // Import Checkstyle plugin.
eclipse // Import Eclipse plugin.
kotlin("jvm") version "2.1.21" // Import Kotlin JVM plugin.
}
extra["kotlinAttribute"] = Attribute.of("kotlin-tag", Boolean::class.javaObjectType)
val kotlinAttribute: Attribute<Boolean> by rootProject.extra
/* --------------------------- JDK / Kotlin ---------------------------- */
java {
sourceCompatibility = JavaVersion.VERSION_17 // Compile with JDK 17 compatibility.
toolchain { // Select Java toolchain.
languageVersion.set(JavaLanguageVersion.of(17)) // Use JDK 17.
vendor.set(JvmVendorSpec.GRAAL_VM) // Use GraalVM CE.
}
}
kotlin { jvmToolchain(17) }
/* ----------------------------- Metadata ------------------------------ */
group = "net.trueog.unionsog" // Declare bundle identifier.
version = "2.5.1" // Declare plugin version (will be in .jar).
val apiVersion = "1.19" // Declare minecraft server target version.
/* ----------------------------- Resources ----------------------------- */
tasks.named<ProcessResources>("processResources") {
val props = mapOf("version" to version, "apiVersion" to apiVersion)
inputs.properties(props) // Indicates to rerun if version changes.
filesMatching("plugin.yml") { expand(props) }
from("LICENSE") { into("/") } // Bundle licenses into jarfiles.
}
/* ---------------------------- Repos ---------------------------------- */
repositories {
mavenCentral() // Import the Maven Central Maven Repository.
gradlePluginPortal() // Import the Gradle Plugin Portal Maven Repository.
maven { url = uri("https://repo.purpurmc.org/snapshots") } // Import the PurpurMC Maven Repository.
maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") }
maven { url = uri("https://repo.extendedclip.com/content/repositories/placeholderapi/") }
maven { url = uri("https://repo.codemc.org/repository/maven-public") }
maven { url = uri("https://repo.papermc.io/repository/maven-public/") }
maven { url = uri("https://repo.aikar.co/content/groups/aikar/") }
maven { url = uri("https://maven.enginehub.org/repo/") }
maven { url = uri("https://nexus.scarsz.me/content/groups/public/") }
maven { url = uri("https://eldonexus.de/repository/maven-public") }
maven { url = uri("https://jitpack.io") }
maven { url = uri("file://${System.getProperty("user.home")}/.m2/repository") }
System.getProperty("SELF_MAVEN_LOCAL_REPO")?.let {
val dir = file(it)
if (dir.isDirectory) {
println("Using SELF_MAVEN_LOCAL_REPO at: $it")
maven { url = uri("file://${dir.absolutePath}") }
} else {
logger.error("TrueOG Bootstrap not found, defaulting to ~/.m2 for mavenLocal()")
mavenLocal()
}
} ?: logger.error("TrueOG Bootstrap not found, defaulting to ~/.m2 for mavenLocal()")
}
/* ---------------------- Java project deps ---------------------------- */
dependencies {
compileOnly("org.purpurmc.purpur:purpur-api:1.19.4-R0.1-SNAPSHOT")
compileOnly("net.luckperms:api:5.5") // Import LuckPerms API.
compileOnlyApi(project(":libs:Utilities-OG")) // Import TrueOG Network Utilities-OG Java API (from source).
compileOnlyApi(project(":libs:DiamondBank-OG")) {
attributes { attribute(kotlinAttribute, true) }
} // Import TrueOG network DiamondBank-OG Kotlin API (from source).
compileOnly("me.clip:placeholderapi:2.11.3")
compileOnly("org.jetbrains:annotations:24.0.1")
implementation("io.papermc:paperlib:1.0.8-SNAPSHOT")
implementation("net.kyori:adventure-api:4.14.0")
implementation("net.kyori:adventure-text-minimessage:4.14.0")
implementation("net.kyori:adventure-platform-bukkit:4.3.0")
implementation("co.aikar:acf-paper:0.5.1-SNAPSHOT")
implementation("com.github.cryptomorin:XSeries:11.2.0.1")
compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.3.0-SNAPSHOT") { isTransitive = false }
compileOnly("com.sk89q.worldedit:worldedit-core:7.3.0-SNAPSHOT") { isTransitive = false }
compileOnly("com.sk89q.worldguard:worldguard-bukkit:7.0.8") { isTransitive = false }
compileOnly("com.sk89q.worldguard:worldguard-core:7.0.8") { isTransitive = false }
compileOnly("com.github.TechFortress:GriefPrevention:17.0.0")
compileOnly("com.discordsrv:discordsrv:1.28.0")
implementation("com.google.code.gson:gson:2.10.1")
testImplementation("org.purpurmc.purpur:purpur-api:1.19.4-R0.1-SNAPSHOT")
testImplementation("org.junit.jupiter:junit-jupiter-api:5.11.3")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.11.3")
testImplementation("org.junit.jupiter:junit-jupiter-params:5.11.3")
testImplementation("org.mockito:mockito-core:5.14.2")
testImplementation("org.mockito:mockito-junit-jupiter:5.14.2")
testImplementation("com.h2database:h2:2.3.232")
}
apply(from = "eclipse.gradle.kts") // Import eclipse classpath support script.
/* ---------------------- Reproducible jars ---------------------------- */
tasks.withType<AbstractArchiveTask>().configureEach { // Ensure reproducible .jars
isPreserveFileTimestamps = false
isReproducibleFileOrder = true
}
/* ----------------------------- Shadow -------------------------------- */
tasks.shadowJar {
relocate("io.papermc.lib", "net.trueog.unionsog.paperlib")
relocate("co.aikar.commands", "net.trueog.unionsog.acf")
relocate("co.aikar.locales", "net.trueog.unionsog.locales")
relocate("com.cryptomorin.xseries", "net.trueog.unionsog.xseries")
relocate("com.google.gson", "net.trueog.unionsog.gson")
dependencies { exclude(dependency("org.jetbrains:annotations:.*")) }
archiveBaseName.set("Unions-OG")
archiveClassifier.set("")
}
tasks.jar { archiveClassifier.set("part") } // Applies to root jarfile only.
tasks.build { dependsOn(tasks.spotlessApply, tasks.shadowJar, tasks.javadoc) } // Build depends on spotless and shadow.
/* --------------------------- Javac opts ------------------------------- */
tasks.withType<JavaCompile>().configureEach {
options.compilerArgs.add("-parameters") // Enable reflection for java code.
options.isFork = true // Run javac in its own process.
options.compilerArgs.add("-Xlint:deprecation") // Trigger deprecation warning messages.
options.encoding = "UTF-8" // Use UTF-8 file encoding.
}
tasks.test { useJUnitPlatform() }
/* ----------------------------- Auto Formatting ------------------------ */
spotless {
java {
eclipse().configFile("config/formatter/eclipse-java-formatter.xml") // Eclipse java formatting.
leadingTabsToSpaces() // Convert leftover leading tabs to spaces.
removeUnusedImports() // Remove imports that aren't being called.
}
kotlinGradle {
ktfmt().kotlinlangStyle().configure { it.setMaxWidth(120) } // JetBrains Kotlin formatting.
target("build.gradle.kts", "settings.gradle.kts") // Gradle files to format.
}
}
checkstyle {
toolVersion = "10.18.1" // Declare checkstyle version to use.
configFile = file("config/checkstyle/checkstyle.xml") // Point checkstyle to config file.
isIgnoreFailures = true // Don't fail the build if checkstyle does not pass.
isShowViolations = true // Show the violations in any IDE with the checkstyle plugin.
}
tasks.named("compileJava") {
dependsOn("spotlessApply") // Run spotless before compiling with the JDK.
}
tasks.named("spotlessCheck") {
dependsOn("spotlessApply") // Run spotless before checking if spotless ran.
}
/* ------------------------------ Eclipse SHIM ------------------------- */
// This can't be put in eclipse.gradle.kts because Gradle is weird.
subprojects {
apply(plugin = "java-library")
apply(plugin = "eclipse")
eclipse.project.name = "${project.name}-${rootProject.name}"
tasks.withType<Jar>().configureEach { archiveBaseName.set("${project.name}-${rootProject.name}") }
}
tasks.register<Copy>("copyToTestServer") {
val out = System.getenv("TEST_SERVER")?.let { file("$it/plugins") }
onlyIf { out != null }
dependsOn(tasks.shadowJar)
from(tasks.shadowJar)
into(out ?: layout.buildDirectory.dir("noop").get().asFile)
}
-34
View File
@@ -1,34 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
<property name="severity" value="error"/>
</module>
<module name="TreeWalker">
<module name="FinalLocalVariable"/>
<module name="AvoidStarImport"/>
<module name="Indentation">
<property name="severity" value="ignore"/>
</module>
</module>
<module name="RegexpSingleline">
<property name="format" value="\borg\.junit\.jupiter\.api\.Assertions\.fail\s*\(\s*&quot;Not yet implemented&quot;\s*\)\s*;"/>
<property name="message" value="Remove placeholder fail() and implement the test."/>
<property name="ignoreCase" value="true"/>
<property name="severity" value="warning"/>
</module>
<module name="RegexpSingleline">
<property name="format" value="(?&lt;!\w)fail\s*\(\s*&quot;Not yet implemented&quot;\s*\)\s*;"/>
<property name="message" value="Remove placeholder fail() and implement the test."/>
<property name="severity" value="warning"/>
</module>
</module>
-404
View File
@@ -1,404 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="23">
<profile kind="CodeFormatterProfile" name="TrueOG Network Formatting" version="23">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_record_components" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_switch_case_arrow_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.text_block_indentation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_permitted_types" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_annotations" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_not_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_permitted_types_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.javadoc_do_not_separate_block_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_constructor" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case_after_arrow" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_arrow" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.align_arrows_in_switch_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.align_selector_in_method_invocation_on_expression_first_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_case_with_arrow_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_colon" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_switch_case_with_arrow" value="20"/>
<setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assertion_message" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_permitted_types" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
</profile>
</profiles>
+412
View File
@@ -0,0 +1,412 @@
<?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.18.1-SNAPSHOT</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>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
</plugin>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<version>2.3.2</version>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<relocations>
<relocation>
<pattern>org.bstats</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.metrics</shadedPattern>
</relocation>
<relocation>
<pattern>io.papermc.lib</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.paperlib</shadedPattern>
</relocation>
<relocation>
<pattern>co.aikar.commands</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.acf</shadedPattern>
</relocation>
<relocation>
<pattern>co.aikar.locales</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.locales</shadedPattern>
</relocation>
<relocation>
<pattern>com.cryptomorin.xseries</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.xseries</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.gson</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.gson</shadedPattern>
</relocation>
</relocations>
<artifactSet>
<excludes>
<exclude>org.jetbrains:annotations</exclude>
</excludes>
</artifactSet>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-installed</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>${project.packaging}</type>
</artifactItem>
</artifactItems>
<outputDirectory>${env.TEST_SERVER}\plugins</outputDirectory>
<silent>true</silent>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>revision</goal>
</goals>
</execution>
</executions>
<configuration>
<dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
</configuration>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.3.2</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>javadoc</goal>
</goals>
</execution>
</executions>
<configuration>
<source>8</source>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>placeholderapi-repo</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
<repository>
<id>bstats-repo</id>
<url>https://repo.codemc.org/repository/maven-public</url>
</repository>
<repository>
<id>papermc</id>
<url>https://papermc.io/repo/repository/maven-public/</url>
</repository>
<repository>
<id>aikar</id>
<url>https://repo.aikar.co/content/groups/aikar/</url>
</repository>
<repository>
<id>sk89q-repo</id>
<url>https://maven.enginehub.org/repo/</url>
</repository>
<repository>
<id>Scarsz-Nexus</id>
<url>https://nexus.scarsz.me/content/groups/public/</url>
</repository>
<repository>
<id>eldonexus</id>
<url>https://eldonexus.de/repository/maven-public</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>commons-lang</artifactId>
<groupId>commons-lang</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
<exclusion>
<artifactId>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>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.10.9</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>22.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.2</version>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>apiguardian-api</artifactId>
<groupId>org.apiguardian</groupId>
</exclusion>
<exclusion>
<artifactId>opentest4j</artifactId>
<groupId>org.opentest4j</groupId>
</exclusion>
<exclusion>
<artifactId>junit-platform-commons</artifactId>
<groupId>org.junit.platform</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-bukkit</artifactId>
<version>7.0.4</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>worldedit-bukkit</artifactId>
<groupId>com.sk89q.worldedit</groupId>
</exclusion>
<exclusion>
<artifactId>worldguard-core</artifactId>
<groupId>com.sk89q.worldguard</groupId>
</exclusion>
<exclusion>
<artifactId>commandbook</artifactId>
<groupId>com.sk89q</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.TechFortress</groupId>
<artifactId>GriefPrevention</artifactId>
<version>16.17.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.discordsrv</groupId>
<artifactId>discordsrv</artifactId>
<version>1.24.1-SNAPSHOT</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>JDA</artifactId>
<groupId>net.dv8tion</groupId>
</exclusion>
<exclusion>
<artifactId>nv-websocket-client</artifactId>
<groupId>com.neovisionaries</groupId>
</exclusion>
<exclusion>
<artifactId>trove4j</artifactId>
<groupId>net.sf.trove4j</groupId>
</exclusion>
<exclusion>
<artifactId>configuralize</artifactId>
<groupId>github.scarsz</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-jdk14</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>jcl-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>commons-io</artifactId>
<groupId>commons-io</groupId>
</exclusion>
<exclusion>
<artifactId>commons-collections</artifactId>
<groupId>commons-collections</groupId>
</exclusion>
<exclusion>
<artifactId>commons-lang3</artifactId>
<groupId>org.apache.commons</groupId>
</exclusion>
<exclusion>
<artifactId>commons-codec</artifactId>
<groupId>commons-codec</groupId>
</exclusion>
<exclusion>
<artifactId>emoji-java</artifactId>
<groupId>com.vdurmont</groupId>
</exclusion>
<exclusion>
<artifactId>java-semver</artifactId>
<groupId>com.github.zafarkhaja</groupId>
</exclusion>
<exclusion>
<artifactId>http-request</artifactId>
<groupId>com.github.kevinsawicki</groupId>
</exclusion>
<exclusion>
<artifactId>minidns-hla</artifactId>
<groupId>org.minidns</groupId>
</exclusion>
<exclusion>
<artifactId>spring-expression</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>MCDiscordReserializer</artifactId>
<groupId>dev.vankka</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-api</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-text-serializer-legacy</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-text-serializer-gson</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-text-serializer-plain</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-platform-bukkit</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>adventure-text-minimessage</artifactId>
<groupId>net.kyori</groupId>
</exclusion>
<exclusion>
<artifactId>guava</artifactId>
<groupId>com.google.guava</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>biz.princeps</groupId>
<artifactId>landlord-latest</artifactId>
<version>4.351</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<artifactId>landlord-core</artifactId>
<groupId>biz.princeps</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<distributionManagement>
<repository>
<id>reposilite</id>
<url>https://repo.roinujnosde.me/releases/</url>
</repository>
<snapshotRepository>
<id>reposilite</id>
<url>https://repo.roinujnosde.me/snapshots/</url>
</snapshotRepository>
</distributionManagement>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
-151
View File
@@ -1,151 +0,0 @@
/* This is free and unencumbered software released into the public domain */
import org.gradle.plugins.ide.eclipse.model.EclipseModel
import java.nio.file.Files
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.transform.OutputKeys
import javax.xml.transform.TransformerFactory
import javax.xml.transform.dom.DOMSource
import javax.xml.transform.stream.StreamResult
val kotlinAttribute: Attribute<Boolean> by rootProject.extra
val kotlinPluginProjects = configurations
.getByName("compileClasspath")
.allDependencies
.filterIsInstance<ProjectDependency>()
.filter { it -> it.attributes.getAttribute(kotlinAttribute) != null }
.map { it.path }
kotlinPluginProjects.forEach { evaluationDependsOn(it) }
val ideLibs: Configuration by
configurations.creating {
isCanBeResolved = true
isCanBeConsumed = false
}
configure<EclipseModel> {
project {
name = "Template-OG-Plugin"
}
classpath {
plusConfigurations.add(ideLibs)
}
}
val ideLibDir = layout.buildDirectory.dir("ide-libs")
val hashRegex = Regex("-[0-9a-fA-F]{10}(?=\\.jar$)") // Black magic.
val copyTasks = mutableListOf<TaskProvider<Copy>>()
kotlinPluginProjects.forEach { path ->
val sub = project(path)
val shadowJarProv = sub.tasks.named("shadowJar")
val copyTask =
tasks.register<Copy>("ideCopy${sub.name.replaceFirstChar(Char::titlecase)}") {
dependsOn(shadowJarProv)
from(shadowJarProv)
into(ideLibDir)
rename { it.replace(hashRegex, "") } // Remove git commit hash from jarfile.
}
copyTasks += copyTask
}
/* Ensure the jars exist before .classpath is generated */
tasks.named("eclipseClasspath").configure { dependsOn(copyTasks) }
/* Supply those jars to the ideLibs configuration (after evaluation) */
afterEvaluate { dependencies { add("ideLibs", fileTree(ideLibDir) { include("*.jar") }) } }
val injectIdeLibs =
tasks.register("injectIdeLibs") {
dependsOn("eclipse") // run after all eclipse files are generated
doLast {
val cpFile = file(".classpath")
if (!cpFile.exists()) return@doLast
val jars = fileTree(ideLibDir.get()) { include("*.jar") }.files.sortedBy { it.name }
if (jars.isEmpty()) return@doLast
// Parse DOM
val dbf = DocumentBuilderFactory.newInstance()
val doc = dbf.newDocumentBuilder().parse(cpFile)
val root = doc.documentElement
// Helper to see if an entry already exists
fun exists(path: String): Boolean =
root.getElementsByTagName("classpathentry").let { list ->
(0 until list.length).any { i ->
val n = list.item(i)
val kind = n.attributes?.getNamedItem("kind")?.nodeValue
val p = n.attributes?.getNamedItem("path")?.nodeValue
kind == "lib" && p == path
}
}
// Remove any entry that points to ide-libs dir (folder or jars) to avoid dupes
val toRemove = mutableListOf<org.w3c.dom.Node>()
val list = root.getElementsByTagName("classpathentry")
val dirPath = ideLibDir.get().asFile.absolutePath
for (i in 0 until list.length) {
val n = list.item(i)
val kind = n.attributes?.getNamedItem("kind")?.nodeValue
val p = n.attributes?.getNamedItem("path")?.nodeValue ?: ""
if (kind == "lib" && (p == dirPath || p.startsWith("$dirPath/"))) {
toRemove += n
}
}
toRemove.forEach { root.removeChild(it) }
// Append our jar entries LAST
jars.forEach { f ->
val abs = f.absolutePath
if (!exists(abs)) {
val entry = doc.createElement("classpathentry")
entry.setAttribute("kind", "lib")
entry.setAttribute("path", abs)
root.appendChild(entry)
}
}
// Write back pretty
val tf =
TransformerFactory.newInstance().newTransformer().apply {
setOutputProperty(OutputKeys.INDENT, "yes")
setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "1")
setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no")
setOutputProperty(OutputKeys.ENCODING, "UTF-8")
}
Files.newBufferedWriter(cpFile.toPath()).use { w -> tf.transform(DOMSource(doc), StreamResult(w)) }
}
}
tasks.named("eclipse").configure { finalizedBy(injectIdeLibs) }
val eclipseModel = extensions.getByType<EclipseModel>()
fun Project.addResolvableEclipseConfigs() {
val jarAttr =
objects.named(org.gradle.api.attributes.LibraryElements::class, org.gradle.api.attributes.LibraryElements.JAR)
val apiAttr = objects.named(org.gradle.api.attributes.Usage::class, org.gradle.api.attributes.Usage.JAVA_API)
val compileOnlyRes =
configurations.create("eclipseCompileOnly") {
extendsFrom(configurations.getByName("compileOnly"))
isCanBeResolved = true
isCanBeConsumed = false
attributes.attribute(org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE, apiAttr)
attributes.attribute(org.gradle.api.attributes.LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, jarAttr)
}
val compileOnlyApiRes =
configurations.create("eclipseCompileOnlyApi") {
extendsFrom(configurations.getByName("compileOnlyApi"))
isCanBeResolved = true
isCanBeConsumed = false
attributes.attribute(org.gradle.api.attributes.Usage.USAGE_ATTRIBUTE, apiAttr)
attributes.attribute(org.gradle.api.attributes.LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, jarAttr)
}
eclipseModel.classpath.plusConfigurations.addAll(listOf(compileOnlyRes, compileOnlyApiRes))
}
addResolvableEclipseConfigs()
-2
View File
@@ -1,2 +0,0 @@
org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=1024m -Dfile.encoding=UTF-8
Binary file not shown.
-7
View File
@@ -1,7 +0,0 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
Vendored
-251
View File
@@ -1,251 +0,0 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed 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
#
# https://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.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
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
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
Vendored
-94
View File
@@ -1,94 +0,0 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
-194
View File
@@ -1,194 +0,0 @@
Unions-OG Placeholder Reference
===============================
Unions-OG registers legacy PlaceholderAPI placeholders when PlaceholderAPI is installed.
It also registers MiniPlaceholders through the Utilities-OG API when Utilities-OG is installed.
Identifiers
-----------
All placeholders use both identifiers:
- simpleclans
- simpleunions
In the syntax patterns below, replace {id} with either identifier.
Legacy PlaceholderAPI syntax:
- Player placeholder: %{id}_{player-placeholder}%
- Union placeholder: %{id}_clan_{union-placeholder}%
- Union compatibility alias: %{id}_union_{union-placeholder}%
- Relational color placeholder: %rel_{id}_color%
MiniPlaceholders syntax:
- Player placeholder: <{id}_{player-placeholder}>
- Union placeholder: <{id}_clan_{union-placeholder}>
- Union compatibility alias: <{id}_union_{union-placeholder}>
- Relational color placeholder: <{id}_rel_color>
MiniPlaceholders are audience placeholders unless marked relational. They require a player audience.
Relational MiniPlaceholders require a relational MiniPlaceholders context.
Boolean output follows PlaceholderAPI's boolean.true and boolean.false config values when PlaceholderAPI is loaded.
Without PlaceholderAPI, boolean placeholders return yes or no.
Player Placeholders
-------------------
These resolve against the requested player:
- name
- clean_name
- lastseendays
- total_kills
- rival_kills
- civilian_kills
- neutral_kills
- ally_kills
- is_friendlyfire_on
- deaths
- weighted_kills
- kdr
- topplayers_position
- join_date
- lastseen
- inactive_days
- in_clan
- tag
- tag_label
- is_trusted
- is_member
- clanchat_player_color
- allychat_player_color
- is_bb_enabled
- is_invite_enabled
- is_tag_enabled
- is_muted
- is_mutedally
Player compatibility aliases:
- in_union maps to in_clan
- unionchat_player_color maps to clanchat_player_color
Examples:
- %simpleclans_name%
- %simpleunions_in_union%
- <simpleclans_name>
- <simpleunions_in_union>
Union Placeholders
------------------
These resolve against the requested player's union:
- name
- balance
- balance_formatted
- tag
- color
- inactivedays
- friendly_fire
- allies_count
- founded
- color_tag
- size
- rivals_count
- is_permanent
- onlinemembers_count
- total_kdr
- topclans_position
- total_deaths
- average_wk
- total_kills
- total_rival
- total_neutral
- total_civilian
- total_ally
- is_anyonline
- is_unrivable
- allow_withdraw
- allow_deposit
Union compatibility aliases:
- Use union_ instead of clan_ for any union placeholder.
- topunions_position maps to topclans_position.
Examples:
- %simpleclans_clan_name%
- %simpleclans_union_name%
- %simpleunions_clan_color_tag%
- %simpleunions_union_topunions_position%
- <simpleclans_clan_name>
- <simpleclans_union_name>
- <simpleunions_clan_color_tag>
- <simpleunions_union_topunions_position>
Top Player Placeholders
-----------------------
Legacy PlaceholderAPI syntax:
- %{id}_topplayers_{position}_{player-placeholder}%
MiniPlaceholders syntax:
- <{id}_topplayers_{player-placeholder}:{position}>
The {position} value is 1-based. The {player-placeholder} value can be any player placeholder or player compatibility alias listed above.
Examples:
- %simpleclans_topplayers_1_name%
- %simpleunions_topplayers_3_kdr%
- <simpleclans_topplayers_name:1>
- <simpleunions_topplayers_kdr:3>
Top Union Placeholders
----------------------
Legacy PlaceholderAPI syntax:
- %{id}_topclans_{position}_clan_{union-placeholder}%
- %{id}_topunions_{position}_union_{union-placeholder}%
MiniPlaceholders syntax:
- <{id}_topclans_clan_{union-placeholder}:{position}>
- <{id}_topunions_union_{union-placeholder}:{position}>
The {position} value is 1-based. The {union-placeholder} value can be any union placeholder or union compatibility alias listed above.
Examples:
- %simpleclans_topclans_1_clan_name%
- %simpleclans_topunions_1_union_name%
- %simpleunions_topclans_5_clan_total_kdr%
- <simpleclans_topclans_clan_name:1>
- <simpleclans_topunions_union_name:1>
- <simpleunions_topclans_clan_total_kdr:5>
Relational Color Placeholder
----------------------------
The relational color placeholder returns a color code based on the relationship between two players:
- same union: &a
- ally: &b
- rival: &c
- unrelated: empty string
Legacy PlaceholderAPI syntax:
- %rel_simpleclans_color%
- %rel_simpleunions_color%
MiniPlaceholders syntax:
- <simpleclans_rel_color>
- <simpleunions_rel_color>
+309
View File
@@ -0,0 +1,309 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<version>2.18.1-SNAPSHOT</version>
<name>SimpleClans</name>
<url>https://www.spigotmc.org/resources/simpleclans.71242/</url>
<build>
<finalName>${project.name}</finalName>
<!-- Resources -->
<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>
<!-- Plugins -->
<plugins>
<!-- Compilation plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<showDeprecation>true</showDeprecation>
<showWarnings>true</showWarnings>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<!-- JAR creation plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
</plugin>
<!-- Release plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.3.2</version>
</plugin>
<!-- Shade plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<relocations>
<relocation>
<pattern>org.bstats</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.metrics</shadedPattern>
</relocation>
<relocation>
<pattern>io.papermc.lib</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.paperlib</shadedPattern>
</relocation>
<relocation>
<pattern>co.aikar.commands</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.acf</shadedPattern>
</relocation>
<relocation>
<pattern>co.aikar.locales</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.locales</shadedPattern>
</relocation>
<relocation>
<pattern>com.cryptomorin.xseries</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.xseries</shadedPattern>
</relocation>
<relocation>
<pattern>com.google.gson</pattern>
<shadedPattern>net.sacredlabyrinth.phaed.simpleclans.gson</shadedPattern>
</relocation>
</relocations>
<artifactSet>
<excludes>
<exclude>org.jetbrains:annotations</exclude>
</excludes>
</artifactSet>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Dependency plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-installed</id>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>${project.groupId}</groupId>
<artifactId>${project.artifactId}</artifactId>
<version>${project.version}</version>
<type>${project.packaging}</type>
</artifactItem>
</artifactItems>
<outputDirectory>${env.TEST_SERVER}\plugins</outputDirectory>
<silent>true</silent>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<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.3.2</version>
<executions>
<execution>
<goals>
<goal>javadoc</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
<configuration>
<source>8</source>
</configuration>
</plugin>
</plugins>
</build>
<!-- Dependencies -->
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.16.4-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.MilkBowl</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.7</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId>
<version>2.2.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
<version>2.10.9</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>22.0.0</version>
</dependency>
<dependency>
<groupId>io.papermc</groupId>
<artifactId>paperlib</artifactId>
<version>1.0.8-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>co.aikar</groupId>
<artifactId>acf-paper</artifactId>
<version>0.5.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.github.cryptomorin</groupId>
<artifactId>XSeries</artifactId>
<version>8.3.0</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-bukkit</artifactId>
<version>7.0.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.github.TechFortress</groupId>
<artifactId>GriefPrevention</artifactId>
<version>16.17.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.discordsrv</groupId>
<artifactId>discordsrv</artifactId>
<version>1.24.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>biz.princeps</groupId>
<artifactId>landlord-latest</artifactId>
<version>4.351</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.9.1</version>
</dependency>
</dependencies>
<!-- Repositories -->
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>placeholderapi-repo</id>
<url>https://repo.extendedclip.com/content/repositories/placeholderapi/</url>
</repository>
<repository>
<id>bstats-repo</id>
<url>https://repo.codemc.org/repository/maven-public</url>
</repository>
<repository>
<id>papermc</id>
<url>https://papermc.io/repo/repository/maven-public/</url>
</repository>
<repository>
<id>aikar</id>
<url>https://repo.aikar.co/content/groups/aikar/</url>
</repository>
<repository>
<id>sk89q-repo</id>
<url>https://maven.enginehub.org/repo/</url>
</repository>
<repository>
<id>Scarsz-Nexus</id>
<url>https://nexus.scarsz.me/content/groups/public/</url>
</repository>
<repository>
<id>eldonexus</id>
<url>https://eldonexus.de/repository/maven-public</url>
</repository>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- Upstream Distribution -->
<distributionManagement>
<repository>
<id>reposilite</id>
<url>https://repo.roinujnosde.me/releases/</url>
</repository>
<snapshotRepository>
<id>reposilite</id>
<url>https://repo.roinujnosde.me/snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
-13
View File
@@ -1,13 +0,0 @@
rootProject.name = "Unions-OG"
ProcessBuilder("sh", "bootstrap.sh").directory(rootDir).inheritIO().start().let {
if (it.waitFor() != 0) throw GradleException("bootstrap.sh failed")
}
file("libs")
.listFiles()
?.filter { it.isDirectory && !it.name.startsWith(".") }
?.forEach { dir ->
include(":libs:${dir.name}")
project(":libs:${dir.name}").projectDir = dir
}
+3
View File
@@ -0,0 +1,3 @@
Manifest-Version: 1.0
Main-Class: net.sacredlabyrinth.phaed.simpleclans.SimpleClans
@@ -1,6 +1,6 @@
package net.trueog.unionsog;
package net.sacredlabyrinth.phaed.simpleclans;
import net.trueog.unionsog.utils.ChatUtils;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull;
@@ -11,13 +11,12 @@ import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import static net.trueog.unionsog.UnionsOG.lang;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
/**
* @author phaed
*/
public class ChatBlock {
private static final int LINE_LENGTH = 319;
private final ArrayList<Boolean> columnFlexes = new ArrayList<>();
private final ArrayList<Integer> columnSizes = new ArrayList<>();
@@ -29,124 +28,86 @@ public class ChatBlock {
@Deprecated
public void setCropRight(boolean cropRight) {
this.cropRight = cropRight;
}
@Deprecated
public void setPadRight(boolean padRight) {
this.padRight = padRight;
}
public void setAlignment(String... columnAlignment) {
columnAlignments.addAll(Arrays.asList(columnAlignment));
}
public void setFlexibility(boolean... columnFlex) {
for (boolean flex : columnFlex) {
columnFlexes.add(flex);
}
}
@Deprecated
public void setColumnSizes(String prefix, double... columnPercentages) {
int ll = LINE_LENGTH;
if (prefix != null) {
ll = LINE_LENGTH - (int) msgLength(prefix);
}
for (double percentage : columnPercentages) {
columnSizes.add((int) Math.floor((percentage / 100) * ll));
}
}
@Deprecated
public boolean hasContent() {
return !rows.isEmpty();
}
public void addRow(String... contents) {
rows.add(contents);
}
public int size() {
return rows.size();
}
@Deprecated
public boolean isEmpty() {
return rows.isEmpty();
}
@Deprecated
public void clear() {
rows.clear();
}
@Deprecated
public boolean sendBlock(CommandSender player) {
return sendBlock(player, null, 0);
}
@Deprecated
public boolean sendBlock(CommandSender player, String prefix) {
return sendBlock(player, prefix, 0);
}
public boolean sendBlock(CommandSender player, int amount) {
return sendBlock(player, null, amount);
}
boolean sendBlock(CommandSender player, String prefix, int amount) {
if (player == null) {
return false;
}
if (rows.isEmpty()) {
return false;
}
if (amount == 0) {
amount = rows.size();
}
boolean prefix_used = prefix == null;
@@ -162,106 +123,65 @@ public class ChatBlock {
int colCount = rows.get(0).length;
if (colCount > 1) {
for (int i = 0; i < colCount; i++) {
columnSizes.add(getMaxWidth(i) + 4);
}
} else {
columnSizes.add(LINE_LENGTH);
}
}
List<String> messages = new ArrayList<>();
// size up all sections
for (int i = 0; i < amount; i++) {
if (rows.isEmpty()) {
continue;
}
List<String> measuredCols = new ArrayList<>();
String row[] = rows.pollFirst();
for (int sid = 0; sid < row.length; sid++) {
String col = "";
String section = row[sid];
double colsize = (columnSizes.size() >= (sid + 1)) ? columnSizes.get(sid) : 0;
String align = (columnAlignments.size() >= (sid + 1)) ? columnAlignments.get(sid) : "l";
if (align.equalsIgnoreCase("r")) {
if (msgLength(section) > colsize) {
col = cropLeftToFit(section, colsize);
} else if (msgLength(section) < colsize) {
col = paddLeftToFit(section, colsize);
}
} else if (align.equalsIgnoreCase("l")) {
if (msgLength(section) > colsize) {
if (cropRight) {
col = cropRightToFit(section, colsize);
} else {
col = section;
}
} else if (msgLength(section) < colsize) {
if (padRight) {
col = paddRightToFit(section, colsize);
} else {
col = section;
}
}
} else if (align.equalsIgnoreCase("c")) {
if (msgLength(section) > colsize) {
if (cropRight) {
col = cropRightToFit(section, colsize);
} else {
col = section;
}
} else if (msgLength(section) < colsize) {
col = centerInLineOf(section, colsize);
}
}
measuredCols.add(col);
}
// add in spacings
@@ -269,65 +189,46 @@ public class ChatBlock {
int availableSpacing = 12;
while (calculatedRowSize(measuredCols) < LINE_LENGTH && availableSpacing > 0) {
for (int j = 0; j < measuredCols.size(); j++) {
String col = measuredCols.get(j);
measuredCols.set(j, col + " ");
if (calculatedRowSize(measuredCols) >= LINE_LENGTH) {
break;
}
}
availableSpacing -= 4;
}
// cut off from flexible columns if too big
if (columnFlexes.size() == measuredCols.size()) {
while (calculatedRowSize(measuredCols) > LINE_LENGTH) {
boolean didFlex = false;
for (int j = 0; j < measuredCols.size(); j++) {
boolean flex = columnFlexes.get(j);
if (flex) {
String col = measuredCols.get(j);
if (col.length() > 0) {
measuredCols.set(j, col.substring(0, col.length() - 1));
didFlex = true;
}
}
if (calculatedRowSize(measuredCols) <= LINE_LENGTH) {
break;
}
}
if (!didFlex) {
break;
}
}
}
// concatenate final strings
@@ -335,82 +236,60 @@ public class ChatBlock {
String finalString = "";
for (String measured : measuredCols) {
finalString += measured;
}
// crop and print out
String msg = (prefix_used ? empty_prefix : prefix + " ") + finalString;
if (cropRight) {
msg = cropRightToFit(msg, LINE_LENGTH);
}
if (color.length() > 0) {
msg = color + msg;
}
messages.add(msg);
prefix_used = true;
}
player.sendMessage(messages.toArray(new String[0]));
return !rows.isEmpty();
}
private int calculatedRowSize(List<String> cols) {
int out = 0;
for (String col : cols) {
out += msgLength(col);
}
return out;
}
int getMaxWidth(int col) {
double maxWidth = 0;
for (String[] row : rows) {
maxWidth = Math.max(maxWidth, msgLength(row[col]));
}
return (int) maxWidth;
}
@Deprecated
public static String centerInLine(String msg) {
return centerInLineOf(msg, LINE_LENGTH);
}
private static String centerInLineOf(String msg, double lineLength) {
double length = msgLength(msg);
double diff = lineLength - length;
// if too big for line return it as is
if (diff < 0) {
return msg;
}
double sideSpace = diff / 2;
@@ -423,56 +302,40 @@ public class ChatBlock {
msg = paddRightToFit(msg, lineLength);
return msg;
return msg;
}
public static String makeEmpty(String str) {
if (str == null) {
return "";
}
return paddLeftToFit("", msgLength(str));
}
private static String cropRightToFit(String msg, double length) {
if (msg == null || msg.length() == 0 || length == 0) {
return "";
}
while (msgLength(msg) > length) {
msg = msg.substring(0, msg.length() - 2);
}
return msg;
}
private static String cropLeftToFit(String msg, double length) {
if (msg == null || msg.length() == 0 || length == 0) {
return "";
}
while (msgLength(msg) >= length) {
msg = msg.substring(1);
}
return msg;
}
/**
@@ -483,21 +346,15 @@ public class ChatBlock {
* @return the padded message
*/
private static String paddLeftToFit(String msg, double length) {
if (msgLength(msg) >= length) {
return msg;
}
while (msgLength(msg) < length) {
msg = " " + msg;
}
return msg;
}
/**
@@ -508,94 +365,60 @@ public class ChatBlock {
* @return the padded message
*/
private static String paddRightToFit(String msg, double length) {
if (msgLength(msg) >= length) {
return msg;
}
while (msgLength(msg) < length) {
msg += " ";
}
return msg;
}
/**
* Finds the length on the screen of a string. Ignores colors.
*/
private static double msgLength(String str) {
double length = 0;
str = ChatColor.stripColor(str);
// Loop through all the characters, skipping any color characters and their
// following color codes
// Loop through all the characters, skipping any color characters and their following color codes
for (int x = 0; x < str.length(); x++) {
int len = charLength(str.charAt(x));
if (len > 0) {
length += len;
} else {
x++;
}
}
return length;
}
/**
* Finds the visual length of the character on the screen.
*/
private static int charLength(char x) {
String normalized = StringSimplifier.simplifiedString(x + "");
if ("i.:,;|!".contains(normalized)) {
return 2;
} else if ("l'".contains(normalized)) {
return 3;
} else if ("tI[]".contains(normalized)) {
return 4;
} else if ("fk{}<>\"*()".contains(normalized)) {
return 5;
} else if ("abcdeghjmnopqrsuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ1234567890\\/#?$%-=_+&^".contains(normalized)) {
return 6;
} else if ("@~".contains(normalized)) {
return 7;
} else if (normalized.equals(" ")) {
return 4;
} else {
return 7;
}
}
/**
@@ -613,29 +436,24 @@ public class ChatBlock {
// While i is less than the length of the array of words
while (!split.isEmpty()) {
int len = 0;
// Create an array list to hold individual words
ArrayList<String> words = new ArrayList<>();
// go through the split array containing all the words, and adding them to the
// words array
// go through the split array containing all the words, and adding them to the words array
// until reaching the point where their width no longer fits on a chat line
while (!split.isEmpty() && split.get(0) != null && len <= LINE_LENGTH) {
double wordLength = msgLength(split.get(0)) + 4;
// If a word is too long for a line
if (wordLength > LINE_LENGTH) {
String[] tempArray = wordCut(len, split.remove(0));
words.add(tempArray[0]);
split.add(tempArray[1]);
}
// If the word is not too long to fit
@@ -643,76 +461,53 @@ public class ChatBlock {
len += wordLength;
if (len < LINE_LENGTH) {
words.add(split.remove(0));
}
}
// Merge the words into a sentence (that now fits into a single chat line) and
// add them to the output array.
// Merge the words into a sentence (that now fits into a single chat line) and add them to the output array.
String merged = combineSplit(words.toArray(new String[0]));
out.add(merged);
}
// Convert to an array and return
return out.toArray(new String[0]);
}
private static String combineSplit(String[] string) {
StringBuilder builder = new StringBuilder();
for (String aString : string) {
builder.append(aString);
builder.append(" ");
}
builder.deleteCharAt(builder.length() - " ".length());
return builder.toString();
}
/**
* Cuts apart a word that is too long to fit on one line
*/
private static String[] wordCut(int lengthBefore, String str) {
int length = lengthBefore;
// Loop through all the characters, skipping any color characters and their
// following color codes
// Loop through all the characters, skipping any color characters and their following color codes
String[] output = new String[2];
int x = 0;
while (length < LINE_LENGTH && x < str.length()) {
int len = charLength(str.charAt(x));
if (len > 0) {
length += len;
} else {
x++;
}
x++;
}
if (x > str.length()) {
x = str.length();
}
// Add the substring to the output after cutting it
@@ -723,76 +518,52 @@ public class ChatBlock {
output[1] = str.substring(x);
return output;
}
/**
* Outputs a single line out, crops overflow
*
* @param receiver the receiver
* @param msg the message
* @param msg the message
*/
public static void saySingle(CommandSender receiver, String msg) {
if (receiver == null) {
return;
}
receiver.sendMessage(colorize(new String[] { cropRightToFit(msg, LINE_LENGTH) })[0]);
receiver.sendMessage(colorize(new String[]{cropRightToFit(msg, LINE_LENGTH)})[0]);
}
/**
* Outputs a message to a user
*
* @param receiver the receiver
* @param msg the message
* @param msg the message
*/
public static void sendMessage(@Nullable CommandSender receiver, @NotNull String msg) {
if (receiver == null) {
return;
}
receiver.sendMessage(ChatUtils.parseColors(msg));
}
public static void sendMessage(@Nullable UnionPlayer receiver, @NotNull String msg) {
public static void sendMessage(@Nullable ClanPlayer receiver, @NotNull String msg) {
if (receiver == null) {
return;
}
UnionsOG.getInstance().getProxyManager().sendMessage(receiver.getName(), ChatUtils.parseColors(msg));
SimpleClans.getInstance().getProxyManager().sendMessage(receiver.getName(), ChatUtils.parseColors(msg));
}
// UnionCommands#setbanner, LandCommands#Allow/BlockCommand/verify,
// StaffCommands#kick, etc
// ClanCommands#setbanner, LandCommands#Allow/BlockCommand/verify, StaffCommands#kick, etc
public static void sendMessageKey(@Nullable CommandSender receiver, @NotNull String key, @NotNull Object... args) {
sendMessage(receiver, lang(key, receiver, args));
}
public static void sendMessageKey(@NotNull UnionPlayer unionPlayer, @NotNull String key, @NotNull Object... args) {
sendMessageKey(unionPlayer.toPlayer(), key, args);
}
@Deprecated
public void startColor(String color) {
this.color = color;
}
/**
@@ -801,15 +572,11 @@ public class ChatBlock {
* @param receiver the receiver
*/
public static void sendBlank(CommandSender receiver) {
if (receiver == null) {
return;
}
receiver.sendMessage(" ");
}
/**
@@ -817,41 +584,28 @@ public class ChatBlock {
*/
@Deprecated
public static String[] say(String message) {
return colorize(wordWrap(message));
}
@Deprecated
public static String[] getColorizedMessage(String msg) {
return colorize(wordWrap(msg));
}
private static String[] colorize(String[] message) {
try {
return colorizeBase(message);
} catch (Exception ex) {
return message;
}
}
@Deprecated
public static @Nullable String colorize(String message) {
return colorizeBase(new String[] { message })[0];
return colorizeBase(new String[]{message})[0];
}
private static @Nullable String[] colorizeBase(String[] message) {
if (message != null && message[0] != null && !message[0].isEmpty()) {
// Go through each line
@@ -860,38 +614,27 @@ public class ChatBlock {
int counter = 0;
for (String msg : message) {
// Loop through looking for a color code
for (int x = 0; x < msg.length(); x++) {
// If the char is color code
if (msg.codePointAt(x) == 167) {
// advance x to the next character
x += 1;
if (x < msg.length()) {
lastColor = ChatColor.COLOR_CHAR + "" + msg.charAt(x);
}
}
}
// Replace the message with the colorful message
message[counter] = prevColor + msg;
prevColor = lastColor;
counter++;
}
}
// noinspection ConstantConditions
//noinspection ConstantConditions
return message;
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,10 @@
package net.sacredlabyrinth.phaed.simpleclans;
/**
* Clan Requests
* @author phaed
*/
public enum ClanRequest
{
DEMOTE, PROMOTE, DISBAND, INVITE, CREATE_ALLY, BREAK_RIVALRY, START_WAR, END_WAR
}
@@ -1,10 +1,10 @@
package net.trueog.unionsog;
package net.sacredlabyrinth.phaed.simpleclans;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import static net.trueog.unionsog.UnionsOG.lang;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
/**
* @author phaed
@@ -13,190 +13,119 @@ import static net.trueog.unionsog.UnionsOG.lang;
public class Dates {
private Dates() {
}
public static double differenceInMonths(Timestamp date1, Timestamp date2) {
return differenceInMonths(new Date(date1.getTime()), new Date(date2.getTime()));
}
public static double differenceInYears(Timestamp date1, Timestamp date2) {
return differenceInYears(new Date(date1.getTime()), new Date(date2.getTime()));
}
public static double differenceInDays(Timestamp date1, Timestamp date2) {
return differenceInDays(new Date(date1.getTime()), new Date(date2.getTime()));
}
public static double differenceInHours(Timestamp date1, Timestamp date2) {
return differenceInHours(new Date(date1.getTime()), new Date(date2.getTime()));
}
public static double differenceInMinutes(Timestamp date1, Timestamp date2) {
return differenceInMinutes(new Date(date1.getTime()), new Date(date2.getTime()));
}
public static double differenceInSeconds(Timestamp date1, Timestamp date2) {
return differenceInSeconds(new Date(date1.getTime()), new Date(date2.getTime()));
}
public static double differenceInMonths(Date date1, Date date2) {
return differenceInYears(date1, date2) * 12;
}
public static double differenceInYears(Date date1, Date date2) {
double days = differenceInDays(date1, date2);
return days / 365.2425;
}
public static double differenceInDays(Date date1, Date date2) {
return differenceInHours(date1, date2) / 24.0;
}
public static double differenceInHours(Date date1, Date date2) {
return differenceInMinutes(date1, date2) / 60.0;
}
public static double differenceInMinutes(Date date1, Date date2) {
return differenceInSeconds(date1, date2) / 60.0;
}
public static double differenceInSeconds(Date date1, Date date2) {
return differenceInMilliseconds(date1, date2) / 1000.0;
}
private static double differenceInMilliseconds(Date date1, Date date2) {
return Math.abs(getTimeInMilliseconds(date1) - getTimeInMilliseconds(date2));
}
private static long getTimeInMilliseconds(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.getTimeInMillis() + cal.getTimeZone().getOffset(cal.getTimeInMillis());
}
/**
* <p>
* authors: RoboMWM, LaxWasHere
* </p>
*
* @author RoboMWM, LaxWasHere
* @param seconds the time in seconds
* @param depth Max amount of detail (e.g. only display days and hours if set
* to 1 and seconds {@literal >} 1 day)
* @return the string representation of the amount of time labeled as days,
* hours, minutes, seconds
* @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) {
if (seconds == null || seconds < 1) {
return lang("bb.moments");
}
if (seconds < 60) {
return seconds + lang("bb.seconds");
}
if (seconds < 3600) {
long count = (long) Math.ceil(seconds / 60f);
String res;
if (count > 1) {
res = count + lang("bb.minutes");
} else {
res = lang("bb.one.minute");
}
long remaining = seconds % 60;
if (depth > 0 && remaining >= 5) {
return res + ", " + formatTime(remaining, --depth);
}
return res;
}
if (seconds < 86400) {
long count = (long) Math.ceil(seconds / 3600f);
String res;
if (count > 1) {
res = count + lang("bb.hours");
} else {
res = lang("bb.one.hour");
}
if (depth > 0) {
return res + ", " + formatTime(seconds % 3600, --depth);
}
return res;
}
long count = (long) Math.ceil(seconds / 86400f);
String res;
if (count > 1) {
res = count + lang("bb.days");
} else {
res = lang("bb.one.day");
}
if (depth > 0) {
return res + ", " + formatTime(seconds % 86400, --depth);
}
return res;
}
}
@@ -1,4 +1,4 @@
package net.trueog.unionsog;
package net.sacredlabyrinth.phaed.simpleclans;
public enum EconomyResponse {
SUCCESS, NEGATIVE_VALUE, NOT_ENOUGH_BALANCE, CANCELLED
@@ -1,4 +1,4 @@
package net.trueog.unionsog;
package net.sacredlabyrinth.phaed.simpleclans;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
@@ -15,115 +15,73 @@ public class Flags {
private final JsonObject flags;
public Flags(@Nullable String json) {
if (json != null && !json.isEmpty()) {
flags = gson.fromJson(json, JsonObject.class);
} else {
flags = new JsonObject();
}
}
@NotNull
public List<String> getStringList(@NotNull String key) {
JsonElement object = flags.get(key);
ArrayList<String> list = new ArrayList<>();
if (object != null && object.isJsonArray()) {
for (JsonElement element : object.getAsJsonArray()) {
list.add(element.getAsString());
}
}
return list;
}
@Nullable
public String getString(@NotNull String key) {
JsonElement element = flags.get(key);
if (element == null || element.isJsonNull()) {
return null;
}
return element.getAsString();
}
@NotNull
public String getString(@NotNull String key, @NotNull String def) {
String string = getString(key);
if (string == null) {
return def;
}
return string;
}
@NotNull
public Number getNumber(@NotNull String key) {
JsonElement element = flags.get(key);
if (element == null || element.isJsonNull()) {
return 0;
}
return element.getAsNumber();
}
public boolean getBoolean(@NotNull String key) {
return getBoolean(key, false);
}
public boolean getBoolean(@NotNull String key, boolean def) {
JsonElement element = flags.get(key);
if (element == null || element.isJsonNull()) {
return def;
}
return element.getAsBoolean();
}
public void put(@NotNull String key, @NotNull List<?> value) {
flags.add(key, gson.toJsonTree(value));
}
public void put(@NotNull String key, @NotNull Object object) {
flags.add(key, gson.toJsonTree(object));
}
public String toJSONString() {
return flags.toString();
}
}
@@ -1,8 +1,10 @@
package net.trueog.unionsog;
package net.sacredlabyrinth.phaed.simpleclans;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;
import net.trueog.unionsog.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -27,8 +29,8 @@ import java.util.function.Predicate;
import java.util.logging.Level;
import java.util.stream.Collectors;
import static net.trueog.unionsog.UnionsOG.lang;
import static net.trueog.unionsog.utils.ChatUtils.stripColors;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils.stripColors;
/**
* @author phaed
@@ -37,104 +39,129 @@ import static net.trueog.unionsog.utils.ChatUtils.stripColors;
public final class Helper {
private static final Gson GSON = new Gson();
private static final Type RANKS_TYPE = TypeToken.getParameterized(List.class, Rank.class).getType();
private static final Type RESIGN_TYPE = TypeToken.getParameterized(Map.class, String.class, Long.class).getType();
private Helper() {
}
@NotNull
public static Locale forLanguageTag(@Nullable String languageTag) {
Locale defaultLanguage = UnionsOG.getInstance().getSettingsManager().getLanguage();
Locale defaultLanguage = SimpleClans.getInstance().getSettingsManager().getLanguage();
if (languageTag == null) {
return defaultLanguage;
}
return Locale.forLanguageTag(languageTag);
}
@Contract("null -> null")
@Nullable
public static String toLanguageTag(@Nullable Locale locale) {
return locale != null ? locale.toLanguageTag() : null;
}
public static Set<Path> getPathsIn(String path, Predicate<? super Path> filter) {
Set<Path> files = new LinkedHashSet<>();
String packagePath = path.replace(".", "/");
try {
URI uri = UnionsOG.class.getProtectionDomain().getCodeSource().getLocation().toURI();
URI uri = SimpleClans.class.getProtectionDomain().getCodeSource().getLocation().toURI();
FileSystem fileSystem = FileSystems.newFileSystem(URI.create("jar:" + uri), Collections.emptyMap());
files = Files.walk(fileSystem.getPath(packagePath)).filter(Objects::nonNull).filter(filter)
.collect(Collectors.toSet());
files = Files.walk(fileSystem.getPath(packagePath)).
filter(Objects::nonNull).
filter(filter).
collect(Collectors.toSet());
fileSystem.close();
} catch (URISyntaxException | IOException ex) {
UnionsOG.getInstance().getLogger().log(Level.WARNING,
"An error occurred while trying to load files: " + ex.getMessage(), ex);
SimpleClans.getInstance().getLogger().
log(Level.WARNING, "An error occurred while trying to load files: " + ex.getMessage(), ex);
}
return files;
}
public static Set<Class<?>> getClasses(String packageName) {
Set<Class<?>> classes = new LinkedHashSet<>();
Predicate<? super Path> filter = entry -> {
String path = entry.getFileName().toString();
return !path.contains("$") && path.endsWith(".class");
};
for (Path filesPath : getPathsIn(packageName, filter)) {
// Compatibility with different Java versions
String path = filesPath.toString();
if (path.charAt(0) == '/') {
path = path.substring(1);
}
String fileName = path.replace("/", ".").split(".class")[0];
try {
Class<?> clazz = Class.forName(fileName);
classes.add(clazz);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return classes;
}
@SuppressWarnings("unchecked")
public static <T> Set<Class<? extends T>> getSubTypesOf(String packageName, Class<?> type) {
return getClasses(packageName).stream().
filter(type::isAssignableFrom).
map(aClass -> ((Class<? extends T>) aClass)).
collect(Collectors.toSet());
}
return getClasses(packageName).stream().filter(type::isAssignableFrom)
.map(aClass -> ((Class<? extends T>) aClass)).collect(Collectors.toSet());
/**
* Parses a list of ranks from the specified Json String
*
* @param json the Json String
* @return a list of ranks or null if the JSON String is null/empty
*/
public static @Nullable List<Rank> ranksFromJson(@Nullable String json) {
if (json != null && !json.isEmpty()) {
JsonObject object = GSON.fromJson(json, JsonObject.class);
JsonElement ranks = object.get("ranks");
return GSON.fromJson(ranks, RANKS_TYPE);
}
return null;
}
/**
* Parses the default rank from the specified Json String
*
* @param json the Json String
* @return the default rank or null if not found and/or it does not exist
*/
public static @Nullable String defaultRankFromJson(@Nullable String json) {
if (json != null && !json.isEmpty()) {
JsonObject object = GSON.fromJson(json, JsonObject.class);
JsonElement defaultRank = object.get("defaultRank");
if (defaultRank != null && !defaultRank.isJsonNull()) {
return defaultRank.getAsString();
}
}
return null;
}
/**
* Converts a list of ranks and the default rank to a JSON String
*
* @param ranks the ranks
* @param defaultRank the default rank
* @return a JSON String
*/
public static String ranksToJson(List<Rank> ranks, @Nullable String defaultRank) {
if (ranks == null)
ranks = new ArrayList<>();
JsonObject object = new JsonObject();
object.add("ranks", GSON.toJsonTree(ranks));
object.addProperty("defaultRank", defaultRank);
return object.toString();
}
/**
@@ -144,9 +171,7 @@ public final class Helper {
* @return a JSON String
*/
public static String resignTimesToJson(Map<String, Long> resignTimes) {
return GSON.toJson(resignTimes);
}
/**
@@ -156,15 +181,10 @@ public final class Helper {
* @return a map
*/
public static @Nullable Map<String, Long> resignTimesFromJson(String json) {
if (json != null && !json.isEmpty()) {
return GSON.fromJson(json, RESIGN_TYPE);
}
return null;
}
/**
@@ -175,26 +195,17 @@ public final class Helper {
* @return the delay in seconds
*/
public static long getDelayTo(int hour, int minute) {
if (hour < 0 || hour > 23)
hour = 1;
if (minute < 0 || minute > 59)
minute = 0;
if (hour < 0 || hour > 23) hour = 1;
if (minute < 0 || minute > 59) minute = 0;
LocalDateTime now = LocalDateTime.now();
LocalDateTime d = LocalDateTime.of(now.toLocalDate(), LocalTime.of(hour, minute));
long delay;
if (now.isAfter(d)) {
delay = now.until(d.plusDays(1), ChronoUnit.SECONDS);
} else {
delay = now.until(d, ChronoUnit.SECONDS);
}
return delay;
}
/**
@@ -204,18 +215,14 @@ public final class Helper {
* @return
*/
public static String getColorName(String playerName) {
List<Player> players = UnionsOG.getInstance().getServer().matchPlayer(playerName);
List<Player> players = SimpleClans.getInstance().getServer().matchPlayer(playerName);
if (players.size() == 1) {
PermissionsManager pm = UnionsOG.getInstance().getPermissionsManager();
PermissionsManager pm = SimpleClans.getInstance().getPermissionsManager();
return pm.getPrefix(players.get(0)) + players.get(0).getName() + pm.getSuffix(players.get(0));
}
return playerName;
}
/**
@@ -225,12 +232,10 @@ public final class Helper {
* @return
*/
public static List<String> fromArrayToList(String... values) {
List<String> results = new ArrayList<>();
Collections.addAll(results, values);
results.remove("");
return results;
}
/**
@@ -241,24 +246,34 @@ public final class Helper {
*/
@Deprecated
public static Set<String> fromArrayToSet(String... values) {
HashSet<String> results = new HashSet<>();
Collections.addAll(results, values);
results.remove("");
return results;
}
/**
* Converts {@literal ArrayList<String>} to string array
* Converts {@literal ArrayList<String>} to string array
*
* @param list
* @return
*/
public static String[] toArray(List<String> list) {
return list.toArray(new String[0]);
}
/**
* Converts the Permission values array to a String array
*
* @return
*/
public static String[] fromPermissionArray() {
RankPermission[] permissions = RankPermission.values();
String[] sa = new String[permissions.length];
for (int i = 0; i < permissions.length; i++) {
sa[i] = permissions[i].toString();
}
return sa;
}
/**
@@ -268,9 +283,7 @@ public final class Helper {
* @return
*/
public static String cleanTag(String tag) {
return stripColors(tag).toLowerCase();
}
/**
@@ -280,41 +293,30 @@ public final class Helper {
* @return
*/
public static String generatePageSeparator(String sep) {
String out = "";
for (int i = 0; i < 320; i++) {
out += sep;
}
return out;
}
/**
* Remove offline players from a UnionPlayer array
* Remove offline players from a ClanPlayer array
*
* @param in
* @return
*/
public static List<UnionPlayer> stripOffLinePlayers(List<UnionPlayer> in) {
List<UnionPlayer> out = new ArrayList<>();
for (UnionPlayer cp : in) {
public static List<ClanPlayer> stripOffLinePlayers(List<ClanPlayer> in) {
List<ClanPlayer> out = new ArrayList<>();
for (ClanPlayer cp : in) {
if (cp.toPlayer() != null) {
out.add(cp);
}
}
return out;
}
/**
@@ -324,15 +326,10 @@ public final class Helper {
* @return
*/
public static String escapeQuotes(@Nullable String str) {
if (str == null) {
return "";
}
return str.replace("'", "''");
}
/**
@@ -342,9 +339,7 @@ public final class Helper {
* @return
*/
public static String toLocationString(Location loc) {
return loc.getBlockX() + " " + loc.getBlockY() + " " + loc.getBlockZ() + " " + loc.getWorld().getName();
}
/**
@@ -354,33 +349,41 @@ public final class Helper {
* @return the Map sorted
*/
public static <K, V extends Comparable<V>> Map<K, V> sortByValue(Map<K, V> map) {
LinkedList<Map.Entry<K, V>> entryList = new LinkedList<>(map.entrySet());
entryList.sort(Entry.comparingByValue());
Map<K, V> result = new LinkedHashMap<>();
for (Entry<K, V> entry : entryList) {
result.put(entry.getKey(), entry.getValue());
}
return result;
}
/**
* Formats max inactive days to an infinity symbol if it's negative or 0
*
* @param max inactive days
* @return formatted message
*/
public static String formatMaxInactiveDays(int max) {
if (max <= 0) {
return "∞";
} else {
return String.valueOf(max);
}
}
@NotNull
public static String getFormattedUnionStatus(Union union, CommandSender sender) {
public static String getFormattedClanStatus(Clan clan, CommandSender sender) {
ArrayList<String> statuses = new ArrayList<>();
if (union.isPermanent()) {
if (clan.isPermanent()) {
statuses.add(lang("permanent", sender));
}
return statuses.isEmpty() ? lang("none", sender) : String.join(", ", statuses);
if (clan.isVerified()) {
statuses.add(lang("verified", sender));
} else {
statuses.add(lang("unverified", sender));
}
return String.join(", ", statuses);
}
}
@@ -0,0 +1,42 @@
package net.sacredlabyrinth.phaed.simpleclans;
import java.time.LocalDateTime;
public class Kill {
private final ClanPlayer killer;
private final ClanPlayer victim;
private final LocalDateTime time;
public Kill(ClanPlayer killer, ClanPlayer victim, LocalDateTime time) {
this.killer = killer;
this.victim = victim;
this.time = time;
}
public ClanPlayer getKiller() {
return killer;
}
public ClanPlayer getVictim() {
return victim;
}
public LocalDateTime getTime() {
return time;
}
public enum Type {
CIVILIAN("c"), RIVAL("r"), NEUTRAL("n"), ALLY("a");
Type(String shortName) {
this.shortName = shortName;
}
private final String shortName;
public String getShortname() {
return shortName;
}
}
}
@@ -0,0 +1,5 @@
package net.sacredlabyrinth.phaed.simpleclans;
public enum PermissionLevel {
LEADER, TRUSTED
}
@@ -0,0 +1,107 @@
package net.sacredlabyrinth.phaed.simpleclans;
import org.jetbrains.annotations.Nullable;
import java.util.HashSet;
import java.util.Set;
/**
*
* @author RoinujNosde
*/
public class Rank implements Comparable<Rank> {
private String name;
private String displayName;
private Set<String> permissions;
public Rank(String name) {
setName(name);
permissions = new HashSet<>();
setDisplayName(displayName);
}
public Rank(String name, @Nullable String displayName, Set<String> permissions) {
setName(name);
setDisplayName(displayName);
setPermissions(permissions);
}
public void setName(String name) {
if (name == null || name.isEmpty()) {
throw new IllegalArgumentException("name cannot be null or empty");
}
this.name = name;
}
public void setDisplayName(@Nullable String displayName) {
if (displayName == null || displayName.isEmpty()) {
displayName = name;
}
this.displayName = displayName;
}
public void setPermissions(Set<String> permissions) {
if (permissions == null) {
permissions = new HashSet<>();
}
this.permissions = permissions;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Rank other = (Rank) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
/**
* Returns the rank's permissions
*
* @return
*/
public Set<String> getPermissions() {
return permissions;
}
/**
* Returns the rank's display name
*
* @return
*/
public String getDisplayName() {
return displayName;
}
/**
* Returns the rank's name
*
* @return
*/
public String getName() {
return name;
}
@Override
public int compareTo(Rank other) {
return Integer.compare(permissions.size(), other.permissions.size());
}
}
@@ -0,0 +1,90 @@
package net.sacredlabyrinth.phaed.simpleclans;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.Nullable;
/**
*
* @author RoinujNosde
*
*/
public enum RankPermission {
ALLY_ADD("simpleclans.leader.ally", PermissionLevel.LEADER),
ALLY_CHAT("simpleclans.member.ally", PermissionLevel.TRUSTED),
ALLY_REMOVE("simpleclans.leader.ally", PermissionLevel.LEADER),
BANK_BALANCE("simpleclans.member.bank", PermissionLevel.TRUSTED),
BANK_DEPOSIT("simpleclans.member.bank", PermissionLevel.LEADER),
BANK_WITHDRAW("simpleclans.member.bank", PermissionLevel.LEADER),
BB_ADD("simpleclans.member.bb-add", PermissionLevel.TRUSTED),
BB_CLEAR("simpleclans.leader.bb-clear", PermissionLevel.LEADER),
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),
HOME_TP("simpleclans.member.home", PermissionLevel.TRUSTED),
INVITE("simpleclans.leader.invite", PermissionLevel.LEADER),
KICK("simpleclans.leader.kick", PermissionLevel.LEADER),
MODTAG("simpleclans.leader.modtag", PermissionLevel.LEADER),
RANK_DISPLAYNAME("simpleclans.leader.rank.setdisplayname", PermissionLevel.LEADER),
RANK_LIST("simpleclans.leader.rank.list", PermissionLevel.LEADER),
RIVAL_ADD("simpleclans.leader.rival", PermissionLevel.LEADER),
RIVAL_REMOVE("simpleclans.leader.rival", PermissionLevel.LEADER),
WAR_END("simpleclans.leader.war", PermissionLevel.LEADER),
WAR_START("simpleclans.leader.war", PermissionLevel.LEADER),
STATS("simpleclans.member.stats", PermissionLevel.TRUSTED),
VITALS("simpleclans.member.vitals", PermissionLevel.TRUSTED),
KILLS("simpleclans.member.kills", PermissionLevel.TRUSTED),
DESCRIPTION("simpleclans.leader.description", PermissionLevel.LEADER),
MOSTKILLED("simpleclans.mod.mostkilled", PermissionLevel.TRUSTED),
FRIENDLYFIRE("simpleclans.leader.ff", PermissionLevel.LEADER),
SETBANNER("simpleclans.leader.setbanner", PermissionLevel.LEADER);
private final String bukkitPermission;
private final PermissionLevel permissionLevel;
RankPermission(String bukkitPermission, PermissionLevel permissionLevel) {
this.bukkitPermission = bukkitPermission;
this.permissionLevel = permissionLevel;
}
/**
*
* @return the Bukkit equivalent to this rank permission
*/
public String getBukkitPermission() {
return bukkitPermission;
}
/**
*
* @return the PermissionLevel
*
*/
public PermissionLevel getPermissionLevel() {
return permissionLevel;
}
@Override
public String toString() {
return super.toString().replace("_", ".").toLowerCase();
}
/**
*
* @param permission the permission
* @return true if this is a valid rank permission
*/
@Contract("null -> false")
public static boolean isValid(@Nullable String permission) {
for (RankPermission p : values()) {
if (p.toString().equalsIgnoreCase(permission)) {
return true;
}
}
return false;
}
}
@@ -1,267 +1,185 @@
package net.trueog.unionsog;
import org.bukkit.Location;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static net.trueog.unionsog.managers.SettingsManager.ConfigField.REQUEST_MAX;
/**
* @author phaed
*/
public final class Request {
private List<UnionPlayer> acceptors = new ArrayList<>();
private Union union;
private String msg;
private String target;
private UnionRequest type;
private UnionPlayer requester;
private int askCount;
private Location destination;
public Request(UnionRequest type, @Nullable List<UnionPlayer> acceptors, UnionPlayer requester, String target,
Union union, String msg)
{
this.type = type;
this.target = target;
this.union = union;
this.msg = msg;
if (acceptors != null) {
this.acceptors = acceptors;
}
this.requester = requester;
cleanVotes();
}
/**
* Where a {@link UnionRequest#REGROUP} would put the player it is asking, so
* that the teleport can wait for their answer.
*
* @return the destination, null for requests that do not teleport anybody
*/
public @Nullable Location getDestination() {
return destination;
}
/**
* @param destination the destination to set
*/
public void setDestination(@Nullable Location destination) {
this.destination = destination;
}
/**
* @return the type
*/
public UnionRequest getType() {
return type;
}
/**
* @param type the type to set
*/
public void setType(UnionRequest type) {
this.type = type;
}
/**
* @return the acceptors
*/
public List<UnionPlayer> getAcceptors() {
return Collections.unmodifiableList(acceptors);
}
/**
* @param acceptors the acceptors to set
*/
public void setAcceptors(List<UnionPlayer> acceptors) {
this.acceptors = acceptors;
}
/**
* @return the union
*/
public Union getUnion() {
return union;
}
/**
* @param union the union to set
*/
public void setUnion(Union union) {
this.union = union;
}
/**
* @return the msg
*/
public String getMsg() {
return msg;
}
/**
* @param msg the msg to set
*/
public void setMsg(String msg) {
this.msg = msg;
}
/**
* @return the target
*/
public String getTarget() {
return target;
}
/**
* @param target the target to set
*/
public void setTarget(String target) {
this.target = target;
}
public void vote(String playerName, VoteResult vote) {
for (UnionPlayer cp : acceptors) {
if (cp.getName().equalsIgnoreCase(playerName)) {
cp.setVote(vote);
}
}
}
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean votingFinished() {
for (UnionPlayer cp : acceptors) {
if (cp.getVote() == null) {
return false;
}
}
return true;
}
public List<String> getDenies() {
List<String> out = new ArrayList<>();
for (UnionPlayer cp : acceptors) {
if (cp.getVote() != null && cp.getVote().equals(VoteResult.DENY)) {
out.add(cp.getName());
}
}
return out;
}
public List<String> getAccepts() {
List<String> out = new ArrayList<>();
for (UnionPlayer cp : acceptors) {
if (cp.getVote() != null && cp.getVote().equals(VoteResult.ACCEPT)) {
out.add(cp.getName());
}
}
return out;
}
/**
* Cleans votes
*/
public void cleanVotes() {
for (UnionPlayer cp : acceptors) {
cp.setVote(null);
}
}
/**
* @return the requester
*/
public UnionPlayer getRequester() {
return requester;
}
/**
* @param requester the requester to set
*/
public void setRequester(UnionPlayer requester) {
this.requester = requester;
}
public void incrementAskCount() {
askCount += 1;
}
public boolean reachedRequestLimit() {
return askCount > UnionsOG.getInstance().getSettingsManager().getInt(REQUEST_MAX);
}
}
package net.sacredlabyrinth.phaed.simpleclans;
import org.jetbrains.annotations.Nullable;
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
*/
public final class Request {
private List<ClanPlayer> acceptors = new ArrayList<>();
private Clan clan;
private String msg;
private String target;
private ClanRequest type;
private ClanPlayer requester;
private int askCount;
public Request(SimpleClans plugin,
ClanRequest type,
@Nullable List<ClanPlayer> acceptors,
ClanPlayer requester,
String target,
Clan clan,
String msg) {
this.type = type;
this.target = target;
this.clan = clan;
this.msg = msg;
if (acceptors != null) {
this.acceptors = acceptors;
}
this.requester = requester;
cleanVotes();
}
/**
* @return the type
*/
public ClanRequest getType() {
return type;
}
/**
* @param type the type to set
*/
public void setType(ClanRequest type) {
this.type = type;
}
/**
* @return the acceptors
*/
public List<ClanPlayer> getAcceptors() {
return Collections.unmodifiableList(acceptors);
}
/**
* @param acceptors the acceptors to set
*/
public void setAcceptors(List<ClanPlayer> acceptors) {
this.acceptors = acceptors;
}
/**
* @return the clan
*/
public Clan getClan() {
return clan;
}
/**
* @param clan the clan to set
*/
public void setClan(Clan clan) {
this.clan = clan;
}
/**
* @return the msg
*/
public String getMsg() {
return msg;
}
/**
* @param msg the msg to set
*/
public void setMsg(String msg) {
this.msg = msg;
}
/**
* @return the target
*/
public String getTarget() {
return target;
}
/**
* @param target the target to set
*/
public void setTarget(String target) {
this.target = target;
}
public void vote(String playerName, VoteResult vote) {
for (ClanPlayer cp : acceptors) {
if (cp.getName().equalsIgnoreCase(playerName)) {
cp.setVote(vote);
}
}
}
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
public boolean votingFinished() {
for (ClanPlayer cp : acceptors) {
if (cp.getVote() == null) {
return false;
}
}
return true;
}
public List<String> getDenies() {
List<String> out = new ArrayList<>();
for (ClanPlayer cp : acceptors) {
if (cp.getVote() != null && cp.getVote().equals(VoteResult.DENY)) {
out.add(cp.getName());
}
}
return out;
}
public List<String> getAccepts() {
List<String> out = new ArrayList<>();
for (ClanPlayer cp : acceptors) {
if (cp.getVote() != null && cp.getVote().equals(VoteResult.ACCEPT)) {
out.add(cp.getName());
}
}
return out;
}
/**
* Cleans votes
*/
public void cleanVotes() {
for (ClanPlayer cp : acceptors) {
cp.setVote(null);
}
}
/**
* @return the requester
*/
public ClanPlayer getRequester() {
return requester;
}
/**
* @param requester the requester to set
*/
public void setRequester(ClanPlayer requester) {
this.requester = requester;
}
public void incrementAskCount() {
askCount += 1;
}
public boolean reachedRequestLimit() {
return askCount > SimpleClans.getInstance().getSettingsManager().getInt(REQUEST_MAX);
}
}
@@ -1,510 +1,357 @@
package net.trueog.unionsog;
import co.aikar.commands.BukkitCommandIssuer;
import net.trueog.unionsog.commands.GroupAliasCommand;
import net.trueog.unionsog.commands.SCCommandManager;
import net.trueog.unionsog.hooks.papi.UnionsOGExpansion;
import net.trueog.unionsog.hooks.papi.UnionsOGMiniPlaceholders;
import net.trueog.unionsog.language.LanguageResource;
import net.trueog.unionsog.listeners.*;
import net.trueog.unionsog.loggers.BankLogger;
import net.trueog.unionsog.loggers.CSVBankLogger;
import net.trueog.unionsog.managers.*;
import net.trueog.unionsog.migrations.BbMigration;
import net.trueog.unionsog.migrations.ChatFormatMigration;
import net.trueog.unionsog.migrations.LanguageMigration;
import net.trueog.unionsog.migrations.UnionBankZeroMigration;
import net.trueog.unionsog.migrations.legacy.LegacyUnionsDatabaseMigrationRunner.MigrationStartupException;
import net.trueog.unionsog.proxy.BungeeManager;
import net.trueog.unionsog.proxy.ProxyManager;
import net.trueog.unionsog.tasks.*;
import net.trueog.unionsog.ui.InventoryController;
import net.trueog.unionsog.utils.ChatUtils;
import net.trueog.unionsog.utils.TagValidator;
import net.trueog.unionsog.uuid.UUIDMigration;
import org.bukkit.command.CommandSender;
import org.bukkit.command.PluginCommand;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Pattern;
import static net.trueog.unionsog.managers.SettingsManager.ConfigField.*;
import static org.bukkit.Bukkit.getPluginManager;
/**
* @author Phaed
*/
public class UnionsOG extends JavaPlugin {
private final ArrayList<String> messages = new ArrayList<>();
private static UnionsOG instance;
private static LanguageResource languageResource;
private static final Logger logger = Logger.getLogger("Unions-OG");
private SCCommandManager commandManager;
private UnionManager unionManager;
private RequestManager requestManager;
private ProposalManager proposalManager;
private StorageManager storageManager;
private SettingsManager settingsManager;
private PermissionsManager permissionsManager;
private TeleportManager teleportManager;
private ProtectionManager protectionManager;
private ChatManager chatManager;
private ProxyManager proxyManager;
private boolean hasUUID;
private boolean startupComplete;
private static final Pattern ACF_PLACEHOLDER_PATTERN = Pattern.compile("\\{(?<key>[a-zA-Z]+?)}");
private BankLogger bankLogger;
private TagValidator tagValidator;
/**
* @return the logger
*/
@Deprecated
public static Logger getLog() {
return logger;
}
public static void debug(String msg) {
// instance may be null during tests
if (getInstance() == null || getInstance().getSettingsManager().is(DEBUG)) {
logger.log(Level.INFO, msg);
}
}
/**
* @return the instance
*/
public static UnionsOG getInstance() {
return instance;
}
@Deprecated
public static void log(String msg, Object... arg) {
if (arg == null || arg.length == 0) {
logger.log(Level.INFO, msg);
} else {
logger.log(Level.INFO, MessageFormat.format(msg, arg));
}
}
@Override
public void onEnable() {
instance = this;
new LanguageMigration(this).migrate();
settingsManager = new SettingsManager(this);
new BbMigration(settingsManager);
new ChatFormatMigration(settingsManager);
languageResource = new LanguageResource();
this.hasUUID = UUIDMigration.canReturnUUID();
permissionsManager = new PermissionsManager();
requestManager = new RequestManager();
unionManager = new UnionManager();
proxyManager = new BungeeManager(this);
try {
storageManager = new StorageManager();
} catch (MigrationStartupException ex) {
getLogger().log(Level.SEVERE, ex.getMessage(), ex);
getServer().getPluginManager().disablePlugin(this);
return;
}
proposalManager = new ProposalManager();
teleportManager = new TeleportManager();
protectionManager = new ProtectionManager();
protectionManager.registerListeners();
chatManager = new ChatManager(this);
registerEvents();
permissionsManager.loadPermissions();
commandManager = new SCCommandManager(this);
bankLogger = new CSVBankLogger(this);
// TODO: start - remove with UnionBankZeroMigration once union bank accounts
// exist.
new UnionBankZeroMigration(this).migrate();
// TODO: end
registerGroupAliases();
tagValidator = new TagValidator(settingsManager, permissionsManager);
logStatus();
startTasks();
hookIntoPAPI();
hookIntoMiniPlaceholders();
startupComplete = true;
}
/**
* Points other group plugins' command words at {@code /union}.
*/
private void registerGroupAliases() {
GroupAliasCommand executor = new GroupAliasCommand();
for (String alias : GroupAliasCommand.ALIASES) {
PluginCommand command = getCommand(alias);
if (command == null) {
getLogger().warning("Group alias /" + alias + " is not registered in plugin.yml, skipping it.");
continue;
}
command.setExecutor(executor);
command.setTabCompleter(executor);
}
}
private void logStatus() {
getLogger().info("Multithreading: " + settingsManager.is(PERFORMANCE_USE_THREADS));
getLogger().info("BungeeCord: " + settingsManager.is(PERFORMANCE_USE_BUNGEECORD));
getLogger().info("HEX support: " + ChatUtils.HEX_COLOR_SUPPORT);
}
private void registerEvents() {
PluginManager pm = getServer().getPluginManager();
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 hookIntoPAPI() {
if (getPluginManager().getPlugin("PlaceholderAPI") != null) {
getLogger().info("PlaceholderAPI found. Registering hook...");
new UnionsOGExpansion(this).register();
new UnionsOGExpansion(this, "simpleunions").register();
}
}
private void hookIntoMiniPlaceholders() {
if (getPluginManager().getPlugin("Utilities-OG") != null) {
getLogger().info("Utilities-OG found. Registering MiniPlaceholders...");
new UnionsOGMiniPlaceholders(this).register();
}
}
private void startTasks() {
if (getSettingsManager().is(PERFORMANCE_SAVE_PERIODICALLY)) {
new SaveDataTask().start();
}
if (getSettingsManager().is(PERFORMANCE_HEAD_CACHING)) {
new PlayerHeadCacheTask(this).start();
}
}
@Override
public void onDisable() {
if (storageManager != null) {
if (startupComplete && settingsManager != null && settingsManager.is(PERFORMANCE_SAVE_PERIODICALLY)) {
storageManager.saveModified();
}
storageManager.closeConnection();
}
if (!startupComplete) {
return;
}
permissionsManager.savePermissions();
settingsManager.loadAndSave();
}
/**
* @return the unionManager
*/
public UnionManager getUnionManager() {
return unionManager;
}
/**
* @return the requestManager
*/
public RequestManager getRequestManager() {
return requestManager;
}
/**
* @return the proposalManager
*/
public ProposalManager getProposalManager() {
return proposalManager;
}
/**
* @return the storageManager
*/
public StorageManager getStorageManager() {
return storageManager;
}
/**
* @return the settingsManager
*/
public SettingsManager getSettingsManager() {
return settingsManager;
}
/**
* @return the permissionsManager
*/
@NotNull
public PermissionsManager getPermissionsManager() {
return permissionsManager;
}
public SCCommandManager getCommandManager() {
return commandManager;
}
public ProtectionManager getProtectionManager() {
return protectionManager;
}
public ChatManager getChatManager() {
return chatManager;
}
public ProxyManager getProxyManager() {
return proxyManager;
}
public BankLogger getBankLogger() {
return bankLogger;
}
/**
* @param key the path within the language file
* @return the lang
*/
@Deprecated
public String getLang(@NotNull String key) {
return getLang(key, null);
}
@Deprecated
public String getLang(@NotNull String key, @Nullable Player player) {
return lang(key, player);
}
@Nullable
public static String optionalLang(@NotNull String key, @Nullable UnionPlayer unionPlayer, Object... arguments) {
Locale locale = instance.getSettingsManager().getLanguage();
if (unionPlayer != null && unionPlayer.getLocale() != null
&& instance.getSettingsManager().is(LANGUAGE_SELECTOR))
{
locale = unionPlayer.getLocale();
}
String lang = languageResource.getLang(key, locale);
if (lang == null) {
return null;
}
String message = ChatUtils.parseColors(lang);
// contains acf placeholders like {commandprefix}
if (ACF_PLACEHOLDER_PATTERN.matcher(message).find()) {
return message;
}
return MessageFormat.format(message, arguments);
}
@Nullable
public static String optionalLang(@NotNull String key, @Nullable Player player, Object... arguments) {
UnionPlayer unionPlayer = null;
if (player != null) {
unionPlayer = instance.getUnionManager().getAnyUnionPlayer(player.getUniqueId());
}
return optionalLang(key, unionPlayer, arguments);
}
@NotNull
public static String lang(@NotNull String key, @Nullable Player player, Object... arguments) {
String lang = optionalLang(key, player, arguments);
return (lang == null) ? key : lang;
}
@NotNull
public static String lang(@NotNull String key, @Nullable UnionPlayer unionPlayer, Object... arguments) {
String lang = optionalLang(key, unionPlayer, arguments);
return (lang == null) ? key : lang;
}
@NotNull
public static String lang(@NotNull String key, @Nullable CommandSender sender, Object... arguments) {
if (sender instanceof Player) {
return lang(key, (Player) sender, arguments);
} else {
return lang(key, (Player) null, arguments);
}
}
@NotNull
public static String lang(@NotNull String key, @Nullable BukkitCommandIssuer issuer, Object... arguments) {
if (issuer != null) {
return lang(key, issuer.getIssuer(), arguments);
}
return lang(key, arguments);
}
@NotNull
public static String lang(@NotNull String key, Object... arguments) {
return lang(key, (Player) null, arguments);
}
public TeleportManager getTeleportManager() {
return teleportManager;
}
@Deprecated
public List<String> getMessages() {
return messages;
}
@Deprecated
public boolean hasUUID() {
return this.hasUUID;
}
@Deprecated
public void setUUID(boolean trueOrFalse) {
this.hasUUID = trueOrFalse;
}
public TagValidator getTagValidator() {
return tagValidator;
}
}
package net.sacredlabyrinth.phaed.simpleclans;
import co.aikar.commands.BukkitCommandIssuer;
import net.sacredlabyrinth.phaed.simpleclans.commands.SCCommandManager;
import net.sacredlabyrinth.phaed.simpleclans.hooks.papi.SimpleClansExpansion;
import net.sacredlabyrinth.phaed.simpleclans.language.LanguageMigration;
import net.sacredlabyrinth.phaed.simpleclans.language.LanguageResource;
import net.sacredlabyrinth.phaed.simpleclans.listeners.*;
import net.sacredlabyrinth.phaed.simpleclans.loggers.BankLogger;
import net.sacredlabyrinth.phaed.simpleclans.loggers.CSVBankLogger;
import net.sacredlabyrinth.phaed.simpleclans.managers.*;
import net.sacredlabyrinth.phaed.simpleclans.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.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;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
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
*/
public class SimpleClans extends JavaPlugin {
private final ArrayList<String> messages = new ArrayList<>();
private static SimpleClans instance;
private static LanguageResource languageResource;
private static final Logger logger = Logger.getLogger("SimpleClans");
private SCCommandManager commandManager;
private ClanManager clanManager;
private RequestManager requestManager;
private StorageManager storageManager;
private SettingsManager settingsManager;
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;
/**
* @return the logger
*/
@Deprecated
public static Logger getLog() {
return logger;
}
public static void debug(String msg) {
if (getInstance().getSettingsManager().is(DEBUG)) {
logger.log(Level.INFO, msg);
}
}
/**
* @return the instance
*/
public static SimpleClans getInstance() {
return instance;
}
@Deprecated
public static void log(String msg, Object... arg) {
if (arg == null || arg.length == 0) {
logger.log(Level.INFO, msg);
} else {
logger.log(Level.INFO, MessageFormat.format(msg, arg));
}
}
@Override
public void onEnable() {
instance = this;
new LanguageMigration(this).migrate();
settingsManager = new SettingsManager(this);
languageResource = new LanguageResource();
this.hasUUID = UUIDMigration.canReturnUUID();
permissionsManager = new PermissionsManager();
requestManager = new RequestManager();
clanManager = new ClanManager();
proxyManager = new BungeeManager(this);
storageManager = new StorageManager();
teleportManager = new TeleportManager();
protectionManager = new ProtectionManager();
protectionManager.registerListeners();
chatManager = new ChatManager(this);
migrateChatFormat();
registerEvents();
permissionsManager.loadPermissions();
commandManager = new SCCommandManager(this);
bankLogger = new CSVBankLogger(this);
logStatus();
startTasks();
startMetrics();
hookIntoPAPI();
new UpdateChecker(this).check();
}
private void logStatus() {
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), 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 (getPluginManager().getPlugin("PlaceholderAPI") != null) {
getLogger().info("PlaceholderAPI found. Registering hook...");
new SimpleClansExpansion(this).register();
}
}
private void startMetrics() {
Metrics metrics = new Metrics(this, 7131);
SettingsManager sm = getSettingsManager();
ClanManager cm = getClanManager();
String on = "enabled";
String off = "disabled";
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().is(PERFORMANCE_SAVE_PERIODICALLY)) {
new SaveDataTask().start();
}
if (getSettingsManager().is(ECONOMY_MEMBER_FEE_ENABLED)) {
new CollectFeeTask().start();
}
if (getSettingsManager().is(ECONOMY_UPKEEP_ENABLED)) {
new CollectUpkeepTask().start();
new UpkeepWarningTask().start();
}
if (getSettingsManager().is(PERFORMANCE_HEAD_CACHING)) {
new PlayerHeadCacheTask(this).start();
}
}
@Override
public void onDisable() {
if (getSettingsManager().is(PERFORMANCE_SAVE_PERIODICALLY)) {
getStorageManager().saveModified();
}
getStorageManager().closeConnection();
getPermissionsManager().savePermissions();
getSettingsManager().loadAndSave();
}
/**
* @return the clanManager
*/
public ClanManager getClanManager() {
return clanManager;
}
/**
* @return the requestManager
*/
public RequestManager getRequestManager() {
return requestManager;
}
/**
* @return the storageManager
*/
public StorageManager getStorageManager() {
return storageManager;
}
/**
* @return the settingsManager
*/
public SettingsManager getSettingsManager() {
return settingsManager;
}
/**
* @return the permissionsManager
*/
@NotNull
public PermissionsManager getPermissionsManager() {
return permissionsManager;
}
public SCCommandManager getCommandManager() {
return commandManager;
}
public ProtectionManager getProtectionManager() {
return protectionManager;
}
public ChatManager getChatManager() {
return chatManager;
}
public ProxyManager getProxyManager() {
return proxyManager;
}
public BankLogger getBankLogger() {
return bankLogger;
}
/**
* @param key the path within the language file
* @return the lang
*/
@Deprecated
public String getLang(@NotNull String key) {
return getLang(key, null);
}
@Deprecated
public String getLang(@NotNull String key, @Nullable Player player) {
return lang(key, player);
}
@Nullable
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);
if (lang == null) {
return null;
}
String message = ChatUtils.parseColors(lang);
// contains acf placeholders like {commandprefix}
if (ACF_PLACEHOLDER_PATTERN.matcher(message).find()) {
return message;
}
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);
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
public static String lang(@NotNull String key, @Nullable CommandSender sender, Object... arguments) {
if (sender instanceof Player) {
return lang(key, (Player) sender, arguments);
} else {
return lang(key, (Player) null, arguments);
}
}
@NotNull
public static String lang(@NotNull String key, @Nullable BukkitCommandIssuer issuer, Object... arguments) {
if (issuer != null) {
return lang(key, issuer.getIssuer(), arguments);
}
return lang(key, arguments);
}
@NotNull
public static String lang(@NotNull String key, Object... arguments) {
return lang(key, (Player) null, arguments);
}
public TeleportManager getTeleportManager() {
return teleportManager;
}
@Deprecated
public List<String> getMessages() {
return messages;
}
@Deprecated
public boolean hasUUID() {
return this.hasUUID;
}
@Deprecated
public void setUUID(boolean trueOrFalse) {
this.hasUUID = trueOrFalse;
}
}
@@ -1,4 +1,4 @@
package net.trueog.unionsog;
package net.sacredlabyrinth.phaed.simpleclans;
import com.google.common.collect.ImmutableMap;
@@ -8,109 +8,76 @@ import java.util.regex.Pattern;
public class StringSimplifier {
private StringSimplifier() {
}
public static final char DEFAULT_REPLACE_CHAR = '-';
public static final String DEFAULT_REPLACE = String.valueOf(DEFAULT_REPLACE_CHAR);
private static final ImmutableMap<String, String> NONDIACRITICS = ImmutableMap.<String, String>builder()
// Remove crap strings with no sematics
//Remove crap strings with no sematics
.put(".", "").put("\"", "").put("'", "")
// Keep relevant characters as seperation
.put(" ", DEFAULT_REPLACE).put("]", DEFAULT_REPLACE).put("[", DEFAULT_REPLACE).put(")", DEFAULT_REPLACE)
.put("(", DEFAULT_REPLACE).put("=", DEFAULT_REPLACE).put("!", DEFAULT_REPLACE).put("/", DEFAULT_REPLACE)
.put("\\", DEFAULT_REPLACE).put("&", DEFAULT_REPLACE).put(",", DEFAULT_REPLACE).put("?", DEFAULT_REPLACE)
.put("°", DEFAULT_REPLACE) // Remove ?? is diacritic?
.put("|", DEFAULT_REPLACE).put("<", DEFAULT_REPLACE).put(">", DEFAULT_REPLACE).put(";", DEFAULT_REPLACE)
.put(":", DEFAULT_REPLACE).put("_", DEFAULT_REPLACE).put("#", DEFAULT_REPLACE).put("~", DEFAULT_REPLACE)
.put("+", DEFAULT_REPLACE).put("*", DEFAULT_REPLACE)
//Keep relevant characters as seperation
.put(" ", DEFAULT_REPLACE).put("]", DEFAULT_REPLACE).put("[", DEFAULT_REPLACE).put(")", DEFAULT_REPLACE).put("(", DEFAULT_REPLACE).put("=", DEFAULT_REPLACE).put("!", DEFAULT_REPLACE).put("/", DEFAULT_REPLACE).put("\\", DEFAULT_REPLACE).put("&", DEFAULT_REPLACE).put(",", DEFAULT_REPLACE).put("?", DEFAULT_REPLACE).put("°", DEFAULT_REPLACE) //Remove ?? is diacritic?
.put("|", DEFAULT_REPLACE).put("<", DEFAULT_REPLACE).put(">", DEFAULT_REPLACE).put(";", DEFAULT_REPLACE).put(":", DEFAULT_REPLACE).put("_", DEFAULT_REPLACE).put("#", DEFAULT_REPLACE).put("~", DEFAULT_REPLACE).put("+", DEFAULT_REPLACE).put("*", DEFAULT_REPLACE)
// Replace non-diacritics as their equivalent characters
//Replace non-diacritics as their equivalent characters
.put("\u0141", "l") // BiaLystock
.put("\u0142", "l") // Bialystock
.put("ß", "ss").put("æ", "ae").put("ø", "o").put("©", "c").put("\u00D0", "d") // All Ð ð from
// http://de.wikipedia.org/wiki/%C3%90
.put("\u00F0", "d").put("\u0110", "d").put("\u0111", "d").put("\u0189", "d").put("\u0256", "d")
.put("\u00DE", "th") // thorn Þ
.put("ß", "ss").put("æ", "ae").put("ø", "o").put("©", "c").put("\u00D0", "d") // All Ð ð from http://de.wikipedia.org/wiki/%C3%90
.put("\u00F0", "d").put("\u0110", "d").put("\u0111", "d").put("\u0189", "d").put("\u0256", "d").put("\u00DE", "th") // thorn Þ
.put("\u00FE", "th") // thorn þ
.build();
public static String simplifiedString(String orig) {
public static String simplifiedString(String orig) {
String str = orig;
if (str == null) {
return null;
}
str = stripDiacritics(str);
str = stripNonDiacritics(str);
if (str.length() == 0) {
// Ugly special case to work around non-existing empty strings
// in Oracle. Store original crapstring as simplified.
// It would return an empty string if Oracle could store it.
return orig;
}
return str.toLowerCase();
}
private static String stripNonDiacritics(String orig) {
StringBuffer ret = new StringBuffer();
String lastchar = null;
for (int i = 0; i < orig.length(); i++) {
String source = orig.substring(i, i + 1);
String replace = NONDIACRITICS.get(source);
String toReplace = replace == null ? String.valueOf(source) : replace;
if (DEFAULT_REPLACE.equals(lastchar) && DEFAULT_REPLACE.equals(toReplace)) {
toReplace = "";
} else {
lastchar = toReplace;
}
ret.append(toReplace);
}
if (ret.length() > 0 && DEFAULT_REPLACE_CHAR == ret.charAt(ret.length() - 1)) {
ret.deleteCharAt(ret.length() - 1);
}
return ret.toString();
}
/*
* Special regular expression character ranges relevant for simplification ->
* see http://docstore.mik.ua/orelly/perl/prog3/ch05_04.htm
* InCombiningDiacriticalMarks: special marks that are part of "normal" ä, ö, î
* etc.. IsSk: Symbol, Modifier see
* http://www.fileformat.info/info/unicode/category/Sk/list.htm IsLm: Letter,
* Modifier see http://www.fileformat.info/info/unicode/category/Lm/list.htm
Special regular expression character ranges relevant for simplification -> see http://docstore.mik.ua/orelly/perl/prog3/ch05_04.htm
InCombiningDiacriticalMarks: special marks that are part of "normal" ä, ö, î etc..
IsSk: Symbol, Modifier see http://www.fileformat.info/info/unicode/category/Sk/list.htm
IsLm: Letter, Modifier see http://www.fileformat.info/info/unicode/category/Lm/list.htm
*/
public static final Pattern DIACRITICS_AND_FRIENDS = Pattern
.compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+");
public static final Pattern DIACRITICS_AND_FRIENDS = Pattern.compile("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+");
private static String stripDiacritics(String str) {
str = Normalizer.normalize(str, Normalizer.Form.NFD);
str = DIACRITICS_AND_FRIENDS.matcher(str).replaceAll("");
return str;
}
}
@@ -1,46 +1,40 @@
package net.trueog.unionsog;
package net.sacredlabyrinth.phaed.simpleclans;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
public class TeleportState {
private final OfflinePlayer offlinePlayer;
private final Location origin;
private final Location destination;
private int counter;
private final String unionName;
private final String clanName;
private boolean processing;
public TeleportState(Player player, Location destination, String unionName, int counter) {
public TeleportState(Player player, Location destination, String clanName, int counter) {
this.offlinePlayer = player;
this.destination = destination;
this.origin = player.getLocation();
this.unionName = unionName;
this.clanName = clanName;
this.counter = counter;
}
public Location getLocation() {
return this.origin;
}
public boolean isTeleportTime() {
if (this.counter > 1) {
this.counter--;
return false;
}
return true;
}
/**
@@ -49,9 +43,7 @@ public class TeleportState {
* @return the player
*/
public @Nullable Player getPlayer() {
return offlinePlayer.getPlayer();
return offlinePlayer.getPlayer();
}
/**
@@ -60,39 +52,27 @@ public class TeleportState {
* @return the counter
*/
public int getCounter() {
return this.counter;
}
public void setCounter(int counter) {
this.counter = counter;
}
public String getUnionName() {
return this.unionName;
public String getClanName() {
return this.clanName;
}
public Location getDestination() {
return this.destination;
}
public boolean isProcessing() {
return this.processing;
}
public void setProcessing(boolean processing) {
this.processing = processing;
}
}
@@ -1,10 +1,10 @@
package net.trueog.unionsog;
/**
* Possible vote values
*
* @author cc_madelg
*/
public enum VoteResult {
ACCEPT, DENY
}
package net.sacredlabyrinth.phaed.simpleclans;
/**
* Possible vote values
*
* @author cc_madelg
*/
public enum VoteResult {
ACCEPT, DENY
}
@@ -0,0 +1,46 @@
package net.sacredlabyrinth.phaed.simpleclans;
import org.jetbrains.annotations.NotNull;
import java.util.*;
public class War {
private final Map<Clan, Integer> clans = new HashMap<>();
public War(@NotNull Clan clan1, @NotNull Clan clan2) {
clans.put(clan1, 0);
clans.put(clan2, 0);
}
public List<Clan> getClans() {
return new ArrayList<>(clans.keySet());
}
public int getTotalCasualties() {
return clans.values().stream().mapToInt(value -> value).sum();
}
public int getCasualties(@NotNull Clan clan) {
return clans.getOrDefault(clan, 0);
}
public void increaseCasualties(@NotNull Clan clan) {
clans.computeIfPresent(clan, (c, i) -> i + 1);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj instanceof War) {
return clans.equals(((War) obj).clans);
}
return false;
}
@Override
public int hashCode() {
return clans.hashCode();
}
}
@@ -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.SettingsManager;
public interface ChatHandler {
SimpleClans plugin = SimpleClans.getInstance();
SettingsManager settingsManager = plugin.getSettingsManager();
ChatManager chatManager = plugin.getChatManager();
void sendMessage(SCMessage message);
boolean canHandle(SCMessage.Source source);
}
@@ -1,6 +1,6 @@
package net.trueog.unionsog.chat;
package net.sacredlabyrinth.phaed.simpleclans.chat;
import net.trueog.unionsog.UnionPlayer;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -9,111 +9,82 @@ import java.util.List;
public class SCMessage implements Cloneable {
private final Source source;
private final UnionPlayer.Channel channel;
private final UnionPlayer sender;
private List<UnionPlayer> receivers;
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 union player
* @param sender The union player sender
* @param channel The channel of clan player
* @param sender The clan player sender
* @param content The content of message
* @param receivers The union players, who will receive the content
* @param receivers The clan players, who will receive the content
*/
public SCMessage(@NotNull Source source, @NotNull UnionPlayer.Channel channel, @NotNull UnionPlayer sender,
String content, @NotNull List<UnionPlayer> receivers)
{
public SCMessage(@NotNull Source source, @NotNull ClanPlayer.Channel channel,
@NotNull ClanPlayer sender, String content, @NotNull List<ClanPlayer> receivers) {
this.source = source;
this.channel = channel;
this.sender = sender;
this.content = content;
this.receivers = receivers;
}
/**
* Creates a new SCMessage without receivers
*
* @see SCMessage#SCMessage(Source, UnionPlayer.Channel, UnionPlayer, String,
* List) instantiate with initial receievers
* @see SCMessage#SCMessage(Source, ClanPlayer.Channel, ClanPlayer, String, List) instantiate with initial receievers
*/
public SCMessage(@NotNull Source source, @NotNull UnionPlayer.Channel channel, @NotNull UnionPlayer sender,
String content)
{
public SCMessage(@NotNull Source source, @NotNull ClanPlayer.Channel channel, @NotNull ClanPlayer sender, String content) {
this(source, channel, sender, content, new ArrayList<>());
}
public UnionPlayer.Channel getChannel() {
public ClanPlayer.Channel getChannel() {
return channel;
}
public UnionPlayer getSender() {
public ClanPlayer getSender() {
return sender;
}
public String getContent() {
return content;
}
public Source getSource() {
return source;
}
public List<UnionPlayer> getReceivers() {
public List<ClanPlayer> getReceivers() {
return receivers;
}
public void setContent(@NotNull String content) {
this.content = content;
}
public void setReceivers(@NotNull List<UnionPlayer> receivers) {
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
throw new Error(); //never thrown
}
}
/**
* The place where the message came from. Used by ChatHandlers to know which
* SCMessages they can handle.
* 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
}
}
@@ -1,58 +1,48 @@
package net.trueog.unionsog.chat.handlers;
package net.sacredlabyrinth.phaed.simpleclans.chat.handlers;
import github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel;
import github.scarsz.discordsrv.util.DiscordUtil;
import net.trueog.unionsog.Union;
import net.trueog.unionsog.chat.ChatHandler;
import net.trueog.unionsog.chat.SCMessage;
import net.trueog.unionsog.hooks.discord.DiscordHook;
import net.trueog.unionsog.utils.ChatUtils;
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.trueog.unionsog.UnionPlayer.Channel.UNION;
import static net.trueog.unionsog.chat.SCMessage.Source;
import static net.trueog.unionsog.chat.SCMessage.Source.SPIGOT;
import static net.trueog.unionsog.managers.SettingsManager.ConfigField.DISCORDCHAT_FORMAT_TO;
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}.
* 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() != UNION) {
if (message.getChannel() != CLAN) {
return;
}
String format = settingsManager.getString(DISCORDCHAT_FORMAT_TO);
String formattedMessage = ChatUtils.stripColors(chatManager.parseChatFormat(format, message));
Union union = message.getSender().getUnion();
if (union == null) {
Clan clan = message.getSender().getClan();
if (clan == null) {
return;
}
DiscordHook discordHook = Objects.requireNonNull(chatManager.getDiscordHook(), "DiscordHook cannot be null");
Optional<TextChannel> channel = discordHook.getCachedChannel(union.getTag());
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);
}
}
@@ -1,43 +1,36 @@
package net.trueog.unionsog.chat.handlers;
package net.sacredlabyrinth.phaed.simpleclans.chat.handlers;
import net.trueog.unionsog.ChatBlock;
import net.trueog.unionsog.UnionPlayer;
import net.trueog.unionsog.chat.ChatHandler;
import net.trueog.unionsog.chat.SCMessage;
import net.trueog.unionsog.events.ChatEvent;
import net.trueog.unionsog.utils.ChatUtils;
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.trueog.unionsog.chat.SCMessage.Source.*;
import static net.trueog.unionsog.managers.SettingsManager.ConfigField;
import static net.trueog.unionsog.managers.SettingsManager.ConfigField.PERFORMANCE_USE_BUNGEECORD;
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
*/
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()));
message.setContent(event.getMessage());
ConfigField configField = ConfigField.valueOf(String.format("%sCHAT_FORMAT",
message.getSource() == DISCORD ? "DISCORD" : message.getChannel()));
@@ -47,54 +40,16 @@ public class SpigotChatHandler implements ChatHandler {
plugin.getLogger().info(ChatUtils.stripColors(formattedMessage));
for (UnionPlayer cp : message.getReceivers()) {
for (ClanPlayer cp : message.getReceivers()) {
ChatBlock.sendMessage(cp, formattedMessage);
}
}
}.runTask(plugin);
}
private String stripColorsAndFormatsPerPermission(UnionPlayer sender, String message) {
if (!permissionsManager.has(sender.toPlayer(), "unionsog.member.chat.color")) {
message = stripColors(message);
}
if (!permissionsManager.has(sender.toPlayer(), "unionsog.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,54 @@
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.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 Bukkit.getOnlinePlayers().stream().
filter(Objects::nonNull).
filter(player -> plugin.getPermissionsManager().has(player, "simpleclans.admin.all-seeing-eye")).
map(player -> plugin.getClanManager().getCreateClanPlayer(player.getUniqueId())).
filter(Objects::nonNull).
filter(clanPlayer -> !clanPlayer.isMuted()).
collect(Collectors.toList());
}
}
@@ -0,0 +1,32 @@
package net.sacredlabyrinth.phaed.simpleclans.commands;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
public class ClanInput {
private final Clan clan;
public ClanInput(@NotNull Clan clan) {
this.clan = clan;
}
public Clan getClan() {
return clan;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ClanInput clanInput = (ClanInput) o;
return clan.equals(clanInput.clan);
}
@Override
public int hashCode() {
return Objects.hash(clan);
}
}
@@ -0,0 +1,32 @@
package net.sacredlabyrinth.phaed.simpleclans.commands;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import org.jetbrains.annotations.NotNull;
import java.util.Objects;
public class ClanPlayerInput {
private final ClanPlayer clanPlayer;
public ClanPlayerInput(@NotNull ClanPlayer clanPlayer) {
this.clanPlayer = clanPlayer;
}
public ClanPlayer getClanPlayer() {
return clanPlayer;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ClanPlayerInput that = (ClanPlayerInput) o;
return clanPlayer.equals(that.clanPlayer);
}
@Override
public int hashCode() {
return Objects.hash(clanPlayer);
}
}
@@ -1,4 +1,4 @@
package net.trueog.unionsog.commands;
package net.sacredlabyrinth.phaed.simpleclans.commands;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.BukkitLocales;
@@ -6,20 +6,20 @@ import co.aikar.commands.CommandIssuer;
import co.aikar.commands.PaperCommandManager;
import co.aikar.locales.MessageKey;
import co.aikar.locales.MessageKeyProvider;
import net.trueog.unionsog.UnionPlayer;
import net.trueog.unionsog.Helper;
import net.trueog.unionsog.UnionsOG;
import net.trueog.unionsog.commands.completions.AbstractAsyncCompletion;
import net.trueog.unionsog.commands.completions.AbstractCompletion;
import net.trueog.unionsog.commands.completions.AbstractStaticCompletion;
import net.trueog.unionsog.commands.completions.AbstractSyncCompletion;
import net.trueog.unionsog.commands.conditions.AbstractCommandCondition;
import net.trueog.unionsog.commands.conditions.AbstractCondition;
import net.trueog.unionsog.commands.conditions.AbstractParameterCondition;
import net.trueog.unionsog.commands.contexts.AbstractContextResolver;
import net.trueog.unionsog.commands.contexts.AbstractInputOnlyContextResolver;
import net.trueog.unionsog.commands.contexts.AbstractIssuerOnlyContextResolver;
import net.trueog.unionsog.managers.*;
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;
import net.sacredlabyrinth.phaed.simpleclans.commands.completions.AbstractStaticCompletion;
import net.sacredlabyrinth.phaed.simpleclans.commands.completions.AbstractSyncCompletion;
import net.sacredlabyrinth.phaed.simpleclans.commands.conditions.AbstractCommandCondition;
import net.sacredlabyrinth.phaed.simpleclans.commands.conditions.AbstractCondition;
import net.sacredlabyrinth.phaed.simpleclans.commands.conditions.AbstractParameterCondition;
import net.sacredlabyrinth.phaed.simpleclans.commands.contexts.AbstractContextResolver;
import net.sacredlabyrinth.phaed.simpleclans.commands.contexts.AbstractInputOnlyContextResolver;
import net.sacredlabyrinth.phaed.simpleclans.commands.contexts.AbstractIssuerOnlyContextResolver;
import net.sacredlabyrinth.phaed.simpleclans.managers.*;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -27,327 +27,203 @@ import org.jetbrains.annotations.Nullable;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import static net.trueog.unionsog.UnionsOG.lang;
import static net.trueog.unionsog.UnionsOG.optionalLang;
import static net.trueog.unionsog.managers.SettingsManager.ConfigField.*;
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 UnionsOG plugin;
private final SimpleClans plugin;
private static final List<String> SUBCOMMANDS;
private static final List<String> COMPLETIONS;
public SCCommandManager(@NotNull UnionsOG plugin) {
public SCCommandManager(@NotNull SimpleClans plugin) {
super(plugin);
this.plugin = plugin;
configure();
}
private void configure() {
enableUnstableAPI("help");
registerDependencies();
addReplacements();
addCommandReplacements();
registerContexts();
registerCommands();
registerConditions();
registerCompletions();
defaultHelpPerPage = plugin.getSettingsManager().getInt(HELP_SIZE);
}
private void registerDependencies() {
registerDependency(UnionManager.class, plugin.getUnionManager());
registerDependency(ClanManager.class, plugin.getClanManager());
registerDependency(SettingsManager.class, plugin.getSettingsManager());
registerDependency(StorageManager.class, plugin.getStorageManager());
registerDependency(PermissionsManager.class, plugin.getPermissionsManager());
registerDependency(RequestManager.class, plugin.getRequestManager());
registerDependency(ProtectionManager.class, plugin.getProtectionManager());
registerDependency(ChatManager.class, plugin.getChatManager());
registerDependency(ProposalManager.class, plugin.getProposalManager());
}
private void registerCompletions() {
Set<Class<? extends AbstractCompletion>> completions = Helper
.getSubTypesOf("net.trueog.unionsog.commands.completions", 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())) {
continue;
}
try {
AbstractCompletion obj = c.getConstructor(UnionsOG.class).newInstance(plugin);
AbstractCompletion obj = c.getConstructor(SimpleClans.class).newInstance(plugin);
if (obj instanceof AbstractStaticCompletion) {
getCommandCompletions().registerStaticCompletion(obj.getId(),
((AbstractStaticCompletion) obj).getCompletions());
}
if (obj instanceof AbstractAsyncCompletion) {
getCommandCompletions().registerAsyncCompletion(obj.getId(), (AbstractAsyncCompletion) obj);
}
if (obj instanceof AbstractSyncCompletion) {
getCommandCompletions().registerCompletion(obj.getId(), ((AbstractSyncCompletion) obj));
}
} catch (Exception ex) {
plugin.getLogger().log(Level.SEVERE, "Error registering completion", ex);
}
}
}
@SuppressWarnings("unchecked")
private void registerConditions() {
Set<Class<? extends AbstractCondition>> conditions = Helper
.getSubTypesOf("net.trueog.unionsog.commands.conditions", 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())) {
continue;
}
try {
AbstractCondition obj = c.getConstructor(UnionsOG.class).newInstance(plugin);
AbstractCondition obj = c.getConstructor(SimpleClans.class).newInstance(plugin);
if (obj instanceof AbstractParameterCondition) {
@SuppressWarnings("rawtypes")
AbstractParameterCondition condition = ((AbstractParameterCondition<?>) obj);
AbstractParameterCondition condition = (AbstractParameterCondition) obj;
getCommandConditions().addCondition(condition.getType(), condition.getId(), condition);
}
if (obj instanceof AbstractCommandCondition) {
AbstractCommandCondition condition = ((AbstractCommandCondition) obj);
AbstractCommandCondition condition = (AbstractCommandCondition) obj;
getCommandConditions().addCondition(condition.getId(), condition);
}
} catch (Exception ex) {
plugin.getLogger().log(Level.SEVERE, "Error registering condition", ex);
}
}
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@SuppressWarnings({"rawtypes", "unchecked"})
private void registerContexts() {
Set<Class<? extends AbstractContextResolver>> resolvers = Helper
.getSubTypesOf("net.trueog.unionsog.commands.contexts", 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())) {
continue;
}
try {
AbstractContextResolver obj = cr.getConstructor(UnionsOG.class).newInstance(plugin);
AbstractContextResolver obj = cr.getConstructor(SimpleClans.class).newInstance(plugin);
if (obj instanceof AbstractIssuerOnlyContextResolver) {
getCommandContexts().registerIssuerOnlyContext(obj.getType(),
((AbstractIssuerOnlyContextResolver) obj));
getCommandContexts().registerIssuerOnlyContext(obj.getType(), ((AbstractIssuerOnlyContextResolver) obj));
}
if (obj instanceof AbstractInputOnlyContextResolver) {
getCommandContexts().registerContext(obj.getType(), ((AbstractInputOnlyContextResolver<?>) obj));
}
} catch (Exception ex) {
plugin.getLogger().log(Level.SEVERE, "Error registering context", ex);
}
}
}
private void registerCommands() {
boolean forceCommandPriority = plugin.getSettingsManager().is(COMMANDS_FORCE_PRIORITY);
Set<Class<? extends BaseCommand>> commands = Helper.getSubTypesOf("net.trueog.unionsog.commands",
BaseCommand.class);
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
//ACF already registers nested classes
if (c.isMemberClass() || Modifier.isStatic(c.getModifiers())) {
continue;
}
// TODO: start - remove with UnionBankZeroMigration once union bank accounts
// exist. Union banks hold no real value yet, so their commands stay
// unregistered.
if (c == net.trueog.unionsog.commands.union.BankCommand.class
|| c == net.trueog.unionsog.commands.staff.BankCommand.class)
{
continue;
}
// TODO: end
try {
BaseCommand baseCommand = c.getConstructor().newInstance();
registerCommand(baseCommand, forceCommandPriority);
} catch (Exception ex) {
// A failure here drops every subcommand of the class, so name it.
plugin.getLogger().log(Level.SEVERE, "Error registering command class " + c.getName(), ex);
plugin.getLogger().log(Level.SEVERE, "Error registering command", ex);
}
}
}
private void addReplacements() {
private void addCommandReplacements() {
SettingsManager sm = plugin.getSettingsManager();
getCommandReplacements().addReplacements("basic_conditions", "not_blacklisted|not_banned", "union",
getUnionCommandAliases(sm), "deny", sm.getString(COMMANDS_DENY) + "|deny", "more",
sm.getString(COMMANDS_MORE), "ally_chat", sm.getString(COMMANDS_ALLY), "accept",
sm.getString(COMMANDS_ACCEPT) + "|accept", "union_chat", sm.getString(COMMANDS_UNION_CHAT));
SUBCOMMANDS.forEach(s -> processReplacement(s, "", ".command", true));
COMPLETIONS.forEach(s -> processReplacement(s, "compl:", ".completion", false));
getCommandReplacements().addReplacements(
"basic_conditions", "not_blacklisted|not_banned",
"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", (ClanPlayer) null);
if (command == null) {
command = s;
}
command = command.replace(" ", "");
String replacement = command.equals(s) ? s : command + "|" + s;
getCommandReplacements().addReplacement(s, replacement);
});
}
private String getUnionCommandAliases(SettingsManager sm) {
Set<String> aliases = new LinkedHashSet<>();
aliases.add(sm.getString(COMMANDS_UNION));
aliases.add("union");
aliases.add("unions");
// clan and clans are not aliases; GroupAliasCommand redirects them.
return String.join("|", aliases);
}
@Override
public BukkitLocales getLocales() {
if (this.locales == null) {
this.locales = new BukkitLocales(this) {
@Nullable
private Player getPlayer(CommandIssuer issuer) {
if (issuer != null) {
return Bukkit.getPlayer(issuer.getUniqueId());
}
return null;
}
@Override
@Nullable
public String getOptionalMessage(CommandIssuer issuer, MessageKey key) {
return optionalLang(key.getKey(), getPlayer(issuer));
}
@Override
@NotNull
public String getMessage(CommandIssuer issuer, MessageKeyProvider key) {
return lang(key.getMessageKey().getKey(), getPlayer(issuer));
}
};
// this.locales.loadLanguages();
//this.locales.loadLanguages();
}
return this.locales;
}
private void processReplacement(String key, String prefix, String suffix, boolean hasFallback) {
String replacement = optionalLang(key + suffix, (UnionPlayer) null);
if (replacement == null) {
replacement = key;
}
replacement = replacement.replace(" ", "");
if (hasFallback) {
replacement = replacement + "|" + key;
}
getCommandReplacements().addReplacement(prefix + key, replacement);
}
static {
SUBCOMMANDS = Arrays.asList("setbanner", "resetkdr", "place", "home", "war", "regroup", "mostkilled", "kills",
"globalff", "reload", "unban", "ban", "disband", "resign", "unionff", "pvp", "on", "off", "vote", "yes",
"no", "purge", "bank", "kick", "invite", "toggle", "modtag", "bb", "display", "clear", "rival", "ally",
"add", "remove", "stats", "coords", "vitals", "rivalries", "alliances", "leaderboard", "allow", "block",
"auto", "check", "delete", "me", "tag", "deposit", "withdraw", "set", "status", "tp", "all", "everyone",
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",
"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",
"land", "break", "interact", "place_block", "damage", "interact_entity", "container", "permanent",
"take", "give", "join", "leave", "mute", "confirm", "balance", "discord", "rename", "locale", "color");
COMPLETIONS = Arrays.asList("tag", "name");
"setdefault", "removedefault", "land", "break", "interact", "place_block", "damage", "interact_entity",
"container", "permanent", "take", "give", "join", "leave", "mute", "confirm", "balance", "discord");
}
}
@@ -0,0 +1,68 @@
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.ChatManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
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|can_chat:type=ALLY|rank:name=ALLY_CHAT")
public class AllyChatCommand extends BaseCommand {
@Dependency
private ChatManager chatManager;
@Dependency
private SettingsManager settingsManager;
@Dependency
private StorageManager storageManager;
@Default
@HelpSearchTags("chat")
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));
}
}
}
@@ -0,0 +1,141 @@
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.EconomyResponse;
import net.sacredlabyrinth.phaed.simpleclans.events.BankDepositEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.BankWithdrawEvent;
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.REVERT;
import static net.sacredlabyrinth.phaed.simpleclans.events.ClanBalanceUpdateEvent.Cause.COMMAND;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.RED;
@CommandAlias("%clan")
@Subcommand("%bank")
@Conditions("%basic_conditions|economy|verified")
public class BankCommand extends BaseCommand {
@Dependency
private PermissionsManager permissions;
@Subcommand("%status")
@CommandPermission("simpleclans.member.bank")
@Conditions("rank:name=BANK_BALANCE")
@Description("{@@command.description.bank.status}")
public void bankStatus(Player player, Clan clan) {
player.sendMessage(AQUA + lang("clan.balance", player, clan.getBalance()));
}
@Subcommand("%withdraw %all")
@CommandPermission("simpleclans.member.bank")
@Conditions("rank:name=BANK_WITHDRAW")
@Description("{@@command.description.bank.withdraw.all}")
public void bankWithdraw(Player player, Clan clan) {
processWithdraw(player, clan, clan.getBalance());
}
@Subcommand("%withdraw")
@CommandPermission("simpleclans.member.bank")
@Conditions("rank:name=BANK_WITHDRAW")
@Description("{@@command.description.bank.withdraw.amount}")
public void bankWithdraw(Player player, Clan clan, double amount) {
processWithdraw(player, clan, amount);
}
private void processWithdraw(Player player, Clan clan, double amount) {
if (!clan.isAllowWithdraw()) {
String message = getCurrentCommandManager().getCommandReplacements()
.replace(lang("withdraw.not.allowed", player));
ChatBlock.sendMessage(player, RED + message);
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;
}
/*
* ——————————————————————————————————
*/
BankOperator operator = new BankOperator(player, permissions.playerGetMoney(player));
switch (clan.withdraw(operator, COMMAND, amount)) {
case SUCCESS:
if (permissions.playerGrantMoney(player, amount)) {
player.sendMessage(AQUA + lang("player.clan.withdraw", player, amount));
clan.addBb(player.getName(), AQUA + lang("bb.clan.withdraw", amount, player.getName()));
} else {
clan.setBalance(operator, REVERT, BankLogger.Operation.WITHDRAW, clan.getBalance() + amount);
}
break;
case NOT_ENOUGH_BALANCE:
player.sendMessage(lang("clan.bank.not.enough.money", player));
break;
}
}
@Subcommand("%deposit %all")
@CommandPermission("simpleclans.member.bank")
@Conditions("rank:name=BANK_DEPOSIT")
@Description("{@@command.description.bank.deposit.all}")
public void bankDeposit(Player player, Clan clan) {
processDeposit(player, clan, permissions.playerGetMoney(player));
}
@Subcommand("%deposit")
@CommandPermission("simpleclans.member.bank")
@Conditions("rank:name=BANK_DEPOSIT")
@Description("{@@command.description.bank.deposit.amount}")
public void bankDeposit(Player player, Clan clan, double amount) {
processDeposit(player, clan, amount);
}
private void processDeposit(Player player, Clan clan, double amount) {
if (!clan.isAllowDeposit()) {
String message = getCurrentCommandManager().getCommandReplacements()
.replace(lang("deposit.not.allowed", player));
ChatBlock.sendMessage(player, RED + message);
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, amount));
return;
}
BankOperator operator = new BankOperator(player, permissions.playerGetMoney(player));
EconomyResponse response = clan.deposit(operator, COMMAND, amount);
if (response == EconomyResponse.SUCCESS) {
if (permissions.playerChargeMoney(player, amount)) {
player.sendMessage(AQUA + lang("player.clan.deposit", player, amount));
clan.addBb(player.getName(), AQUA + lang("bb.clan.deposit", amount, player.getName()));
} else {
//Reverts the deposit if something went wrong with Vault
clan.setBalance(operator, REVERT, BankLogger.Operation.DEPOSIT, clan.getBalance() - amount);
}
}
}
}
@@ -0,0 +1,52 @@
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.managers.ClanManager;
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.*;
@CommandAlias("%clan")
@Conditions("%basic_conditions|verified")
public class BbCommand extends BaseCommand {
@Dependency
private ClanManager cm;
@Dependency
private StorageManager storage;
@Subcommand("%bb")
@CommandPermission("simpleclans.member.bb")
@Description("{@@command.description.bb.display}")
public void display(Player sender) {
Clan clan = Objects.requireNonNull(cm.getClanByPlayerUniqueId(sender.getUniqueId()));
clan.displayBb(sender);
}
@Subcommand("%bb %clear")
@CommandPermission("simpleclans.leader.bb-clear")
@Conditions("rank:name=BB_CLEAR")
@Description("{@@command.description.bb.clear}")
public void clear(Player player) {
Clan clan = Objects.requireNonNull(cm.getClanByPlayerUniqueId(player.getUniqueId()));
clan.clearBb();
ChatBlock.sendMessage(player, RED + lang("cleared.bb", player));
}
@Subcommand("%bb %add")
@CommandPermission("simpleclans.member.bb-add")
@Conditions("rank:name=BB_ADD")
@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);
storage.updateClan(clan);
}
}
@@ -0,0 +1,66 @@
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.ChatManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
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|can_chat:type=CLAN")
@CommandPermission("simpleclans.member.chat")
@Description("{@@command.description.chat}")
public class ChatCommand extends BaseCommand {
@Dependency
private ChatManager chatManager;
@Dependency
private StorageManager storageManager;
@Default
@HelpSearchTags("chat")
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;
}
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));
}
}
}
@@ -0,0 +1,389 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.clan;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanInput;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import net.sacredlabyrinth.phaed.simpleclans.conversation.ResignPrompt;
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 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;
@CommandAlias("%clan")
@Conditions("%basic_conditions")
public class ClanCommands extends BaseCommand {
@Dependency
private SimpleClans plugin;
@Dependency
private SettingsManager settings;
@Dependency
private ClanManager cm;
@Dependency
private StorageManager storage;
@Dependency
private PermissionsManager permissions;
@Dependency
private RequestManager requestManager;
@Dependency
private ProtectionManager protectionManager;
@Subcommand("%war %start")
@CommandPermission("simpleclans.leader.war")
@Conditions("verified|rank:name=WAR_START")
@Description("{@@command.description.war.start}")
@CommandCompletion("@rivals")
public void startWar(Player player, ClanPlayer requester, Clan requestClan, @Conditions("can_war_target") @Name("clan") ClanInput targetClanInput) {
Clan targetClan = targetClanInput.getClan();
List<ClanPlayer> onlineLeaders = Helper.stripOffLinePlayers(requestClan.getLeaders());
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",
player, targetClan.getName()));
} else {
ChatBlock.sendMessage(player, RED + lang("at.least.one.leader.accept.the.alliance", player));
}
} else {
protectionManager.addWar(requester, requestClan, targetClan);
}
}
@Subcommand("%war %end")
@CommandPermission("simpleclans.leader.war")
@Conditions("verified|rank:name=WAR_END")
@Description("{@@command.description.war.end}")
@CommandCompletion("@warring_clans")
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(cp, AQUA + lang("leaders.asked.to.end.rivalry", cp, war.getName()));
} else {
ChatBlock.sendMessage(cp, RED + lang("clans.not.at.war", cp));
}
}
@Subcommand("%modtag")
@CommandPermission("simpleclans.leader.modtag")
@Conditions("verified|rank:name=MODTAG")
@Description("{@@command.description.modtag}")
public void modtag(Player player, Clan clan, @Single @Name("tag") String tag) {
TagChangeEvent event = new TagChangeEvent(player, clan, tag);
plugin.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
tag = event.getNewTag();
String cleanTag = Helper.cleanTag(tag);
TagValidator validator = new TagValidator(plugin, player, tag);
if (validator.getErrorMessage() != null) {
ChatBlock.sendMessage(player, validator.getErrorMessage());
return;
}
if (!cleanTag.equals(clan.getTag())) {
ChatBlock.sendMessage(player, RED + lang("you.can.only.modify.the.color.and.case.of.the.tag",
player));
return;
}
clan.addBb(player.getName(), AQUA + lang("tag.changed.to.0", ChatUtils.parseColors(tag)));
clan.changeClanTag(tag);
cm.updateDisplayName(player);
}
@Subcommand("%setbanner")
@CommandPermission("simpleclans.leader.setbanner")
@Conditions("verified|rank:name=SETBANNER")
@Description("{@@command.description.setbanner}")
public void setbanner(Player player, Clan clan) {
@SuppressWarnings("deprecation")
ItemStack hand = player.getItemInHand();
if (!hand.getType().toString().contains("BANNER")) {
ChatBlock.sendMessageKey(player, "you.must.hold.a.banner");
return;
}
clan.setBanner(hand);
storage.updateClan(clan);
ChatBlock.sendMessageKey(player, "you.changed.clan.banner");
}
@Subcommand("%invite")
@CommandPermission("simpleclans.leader.invite")
@CommandCompletion("@non_members:ignore_vanished")
@Conditions("rank:name=INVITE")
@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")) {
ChatBlock.sendMessage(sender, RED +
lang("the.player.doesn.t.not.have.the.permissions.to.join.clans", sender));
return;
}
if (invitedPlayer.getUniqueId().equals(sender.getUniqueId())) {
ChatBlock.sendMessage(sender, RED + lang("you.cannot.invite.yourself", sender));
return;
}
long minutesBeforeRejoin = cm.getMinutesBeforeRejoin(invited.getClanPlayer(), clan);
if (minutesBeforeRejoin != 0) {
ChatBlock.sendMessage(sender, RED +
lang("the.player.must.wait.0.before.joining.your.clan.again", sender, minutesBeforeRejoin));
return;
}
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;
}
if (!cm.purchaseInvite(sender)) {
return;
}
requestManager.addInviteRequest(cp, invitedPlayer.getName(), clan);
ChatBlock.sendMessage(sender, AQUA + lang("has.been.asked.to.join",
sender, invitedPlayer.getName(), clan.getName()));
}
@Subcommand("%fee %check")
@Conditions("member_fee_enabled|verified")
@CommandPermission("simpleclans.member.fee-check")
@Description("{@@command.description.fee.check}")
public void checkFee(Player player, Clan clan) {
ChatBlock.sendMessage(player, AQUA
+ lang("the.fee.is.0.and.its.current.value.is.1", player, clan.isMemberFeeEnabled() ?
lang("fee.enabled", player) : lang("fee.disabled", player),
clan.getMemberFee()
));
}
@Subcommand("%fee %set")
@CommandPermission("simpleclans.leader.fee")
@Conditions("rank:name=FEE_SET|change_fee")
@Description("{@@command.description.fee.set}")
public void setFee(Player player, Clan clan, @Name("fee") double fee) {
fee = Math.abs(fee);
double maxFee = settings.getDouble(ECONOMY_MAX_MEMBER_FEE);
if (fee > maxFee) {
ChatBlock.sendMessage(player, RED
+ lang("max.fee.allowed.is.0", player, maxFee));
return;
}
if (cm.purchaseMemberFeeSet(player)) {
clan.setMemberFee(fee);
clan.addBb(player.getName(), AQUA + lang("bb.fee.set", fee));
ChatBlock.sendMessage(player, AQUA + lang("fee.set", player));
storage.updateClan(clan);
}
}
@Subcommand("%clanff %allow")
@CommandPermission("simpleclans.leader.ff")
@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.setFriendlyFire(true);
storage.updateClan(clan);
}
@Subcommand("%clanff %block")
@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.setFriendlyFire(false);
storage.updateClan(clan);
}
@Subcommand("%description")
@CommandPermission("simpleclans.leader.description")
@Conditions("verified|rank:name=DESCRIPTION")
@Description("{@@command.description.description}")
public void setDescription(Player player, Clan clan, @Name("description") String description) {
if (description.length() < settings.getInt(CLAN_MIN_DESCRIPTION_LENGTH)) {
ChatBlock.sendMessage(player, RED + lang("your.clan.description.must.be.longer.than",
player, settings.getInt(CLAN_MIN_DESCRIPTION_LENGTH)));
return;
}
if (description.length() > settings.getInt(CLAN_MAX_DESCRIPTION_LENGTH)) {
ChatBlock.sendMessage(player, RED + lang("your.clan.description.cannot.be.longer.than",
player, settings.getInt(CLAN_MAX_DESCRIPTION_LENGTH)));
return;
}
clan.setDescription(description);
ChatBlock.sendMessage(player, AQUA + lang("description.changed", player));
storage.updateClan(clan);
}
@Subcommand("%rival %add")
@CommandPermission("simpleclans.leader.rival")
@Conditions("verified|rivable|minimum_to_rival|rank:name=RIVAL_ADD")
@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();
if (settings.isUnrivable(rivalInput.getTag())) {
ChatBlock.sendMessage(player, RED + lang("the.clan.cannot.be.rivaled", player));
return;
}
if (!issuerClan.reachedRivalLimit()) {
if (!issuerClan.isRival(rivalInput.getTag())) {
issuerClan.addRival(rivalInput);
rivalInput.addBb(player.getName(), AQUA + lang("has.initiated.a.rivalry", issuerClan.getName(),
rivalInput.getName()), false);
issuerClan.addBb(player.getName(), AQUA + lang("has.initiated.a.rivalry", player.getName(),
rivalInput.getName()));
} else {
ChatBlock.sendMessage(player, RED + lang("your.clans.are.already.rivals", player));
}
} else {
ChatBlock.sendMessage(player, RED + lang("rival.limit.reached", player));
}
}
@Subcommand("%rival %remove")
@CommandPermission("simpleclans.leader.rival")
@Conditions("verified|rank:name=RIVAL_REMOVE")
@CommandCompletion("@rivals")
@Description("{@@command.description.rival.remove}")
public void removeRival(Player player,
ClanPlayer cp,
Clan issuerClan,
@Conditions("different") @Name("clan") ClanInput rival) {
Clan rivalInput = rival.getClan();
if (issuerClan.isRival(rivalInput.getTag())) {
requestManager.addRivalryBreakRequest(cp, rivalInput, issuerClan);
ChatBlock.sendMessage(player, AQUA + lang("leaders.asked.to.end.rivalry", player,
rivalInput.getName()));
} else {
ChatBlock.sendMessage(player, RED + lang("your.clans.are.not.rivals", player));
}
}
@Subcommand("%ally %add")
@CommandPermission("simpleclans.leader.ally")
@Conditions("verified|rank:name=ALLY_ADD|minimum_to_ally")
@CommandCompletion("@clans:hide_own")
@Description("{@@command.description.ally.add}")
public void addAlly(Player player,
ClanPlayer cp,
Clan issuerClan,
@Conditions("verified|different") @Name("clan") ClanInput other) {
Clan input = other.getClan();
if (issuerClan.isAlly(input.getTag())) {
ChatBlock.sendMessage(player, RED + lang("your.clans.are.already.allies", player));
return;
}
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));
return;
}
if (input.getAllies().size() >= maxAlliances) {
ChatBlock.sendMessage(player, lang("other.clan.reached.max.alliances", player));
return;
}
}
List<ClanPlayer> onlineLeaders = Helper.stripOffLinePlayers(issuerClan.getLeaders());
if (onlineLeaders.isEmpty()) {
ChatBlock.sendMessage(player, RED + lang("at.least.one.leader.accept.the.alliance",
player));
return;
}
requestManager.addAllyRequest(cp, input, issuerClan);
ChatBlock.sendMessage(player, AQUA + lang("leaders.have.been.asked.for.an.alliance",
player, input.getName()));
}
@Subcommand("%ally %remove")
@Conditions("verified|rank:name=ALLY_REMOVE")
@CommandPermission("simpleclans.leader.ally")
@Description("{@@command.description.ally.remove}")
@CommandCompletion("@allied_clans")
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.getName()), false);
issuerClan.addBb(player.getName(), AQUA + lang("has.broken.the.alliance", player.getName(),
allyInput.getName()));
}
@Subcommand("%kick")
@CommandPermission("simpleclans.leader.kick")
@CommandCompletion("@clan_members:hide_own")
@Conditions("rank:name=KICK")
@Description("{@@command.description.kick}")
public void kick(@Conditions("clan_member") Player sender,
@Conditions("same_clan") @Name("member") ClanPlayerInput other) {
ClanPlayer clanPlayer = other.getClanPlayer();
if (sender.getUniqueId().equals(clanPlayer.getUniqueId())) {
ChatBlock.sendMessage(sender, RED + lang("you.cannot.kick.yourself", sender));
return;
}
Clan clan = cm.getClanByPlayerUniqueId(sender.getUniqueId());
if (Objects.requireNonNull(clan).isLeader(clanPlayer.getUniqueId())) {
ChatBlock.sendMessage(sender, RED + lang("you.cannot.kick.another.leader", sender));
return;
}
clan.addBb(sender.getName(), AQUA + 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(), AQUA + 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}")
@HelpSearchTags("leave")
public void resign(@Conditions("clan_member") Player player) {
new SCConversation(plugin, player, new ResignPrompt()).begin();
}
}
@@ -0,0 +1,84 @@
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.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.commands.data.*;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.ui.InventoryDrawer;
import net.sacredlabyrinth.phaed.simpleclans.ui.frames.CoordsFrame;
import net.sacredlabyrinth.phaed.simpleclans.ui.frames.RosterFrame;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
import org.bukkit.command.CommandSender;
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.RED;
@CommandAlias("%clan")
@Conditions("%basic_conditions|verified")
public class DataCommands extends BaseCommand {
@Dependency
private SimpleClans plugin;
@Dependency
private SettingsManager settings;
@Subcommand("%vitals")
@CommandPermission("simpleclans.member.vitals")
@Conditions("rank:name=VITALS")
@Description("{@@command.description.vitals}")
public void vitals(CommandSender sender, Clan clan) {
Vitals vitals = new Vitals(plugin, sender, clan);
vitals.send();
}
@Subcommand("%stats")
@CommandPermission("simpleclans.member.stats")
@Conditions("rank:name=STATS")
@Description("{@@command.description.stats}")
public void stats(Player player, Clan clan) {
ClanStats stats = new ClanStats(plugin, player, clan);
stats.send();
}
@Subcommand("%profile")
@CommandPermission("simpleclans.member.profile")
@Description("{@@command.description.profile}")
public void profile(CommandSender sender, Clan clan) {
ClanProfile p = new ClanProfile(plugin, sender, clan);
p.send();
}
@Subcommand("%roster")
@CommandPermission("simpleclans.member.roster")
@Description("{@@command.description.roster}")
public void roster(Player player, Clan clan) {
if (settings.is(ENABLE_GUI)) {
InventoryDrawer.open(new RosterFrame(player, null, clan));
return;
}
ClanRoster r = new ClanRoster(plugin, player, clan);
r.send();
}
@Subcommand("%coords")
@CommandPermission("simpleclans.member.coords")
@Conditions("rank:name=COORDS")
@HelpSearchTags("local location")
@Description("{@@command.description.coords}")
public void coords(Player player, Clan clan) {
if (settings.is(ENABLE_GUI)) {
InventoryDrawer.open(new CoordsFrame(player, null, clan));
return;
}
if (VanishUtils.getNonVanished(player, clan).size() == 1) {
ChatBlock.sendMessage(player, RED + lang("you.are.the.only.member.online", player));
return;
}
ClanCoords c = new ClanCoords(plugin, player, clan);
c.send();
}
}
@@ -0,0 +1,133 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.clan;
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")
@Conditions("%basic_conditions|verified")
public class HomeCommands extends BaseCommand {
@Dependency
private SimpleClans plugin;
@Dependency
private PermissionsManager permissions;
@Dependency
private SettingsManager settings;
@Dependency
private ProtectionManager protection;
@Dependency
private ClanManager cm;
@Subcommand("%regroup %me")
@CommandPermission("simpleclans.leader.regroup.me")
@Conditions("rank:name=REGROUP_ME")
@Description("{@@command.description.regroup.me}")
public void regroupMe(Player player, ClanPlayer cp, Clan clan) {
if (!settings.is(ALLOW_REGROUP)) {
ChatBlock.sendMessage(player, RED + lang("insufficient.permissions", player));
return;
}
processRegroup(player, cp, clan, player.getLocation());
}
private void processRegroup(Player player, ClanPlayer cp, Clan clan, Location location) {
HomeRegroupEvent homeRegroupEvent = new HomeRegroupEvent(clan, cp, VanishUtils.getNonVanished(player, clan), location);
plugin.getServer().getPluginManager().callEvent(homeRegroupEvent);
if (homeRegroupEvent.isCancelled() || !cm.purchaseHomeRegroup(player)) {
return;
}
plugin.getTeleportManager().teleport(player, clan, location);
}
@Subcommand("%regroup %home")
@CommandPermission("simpleclans.leader.regroup.home")
@Conditions("rank:name=REGROUP_HOME")
@Description("{@@command.description.regroup.home}")
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();
processRegroup(player, cp, clan, location);
}
@Subcommand("%home")
@CommandPermission("simpleclans.member.home")
@Conditions("rank:name=HOME_TP")
@Description("{@@command.description.home.tp}")
public void teleport(Player player, @Conditions("can_teleport") Clan clan, ClanPlayer cp) {
Location homeLocation = clan.getHomeLocation();
if (cm.purchaseHomeTeleport(player)) {
plugin.getTeleportManager().addPlayer(player, homeLocation, clan.getName());
}
}
@Subcommand("%home %clear")
@CommandPermission("simpleclans.leader.home-set")
@Conditions("rank:name=HOME_SET")
@Description("{@@command.description.home.clear}")
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));
}
@Subcommand("%home %set")
@Conditions("rank:name=HOME_SET")
@CommandPermission("simpleclans.leader.home-set")
@Description("{@@command.description.home.set}")
public void set(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;
}
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;
}
}
PlayerHomeSetEvent homeSetEvent = new PlayerHomeSetEvent(clan, cp, player.getLocation());
plugin.getServer().getPluginManager().callEvent(homeSetEvent);
if (homeSetEvent.isCancelled() || !cm.purchaseHomeTeleportSet(player)) {
return;
}
clan.setHomeLocation(player.getLocation());
ChatBlock.sendMessage(player, AQUA + lang("hombase.set", player, YELLOW +
Helper.toLocationString(player.getLocation())));
}
}
@@ -1,12 +1,12 @@
package net.trueog.unionsog.commands.union;
package net.sacredlabyrinth.phaed.simpleclans.commands.clan;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.*;
import net.trueog.unionsog.ChatBlock;
import net.trueog.unionsog.UnionPlayer;
import net.trueog.unionsog.hooks.protection.Land;
import net.trueog.unionsog.managers.ProtectionManager;
import net.trueog.unionsog.managers.SettingsManager;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.hooks.protection.Land;
import net.sacredlabyrinth.phaed.simpleclans.managers.ProtectionManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager;
import org.bukkit.Location;
import org.bukkit.entity.Player;
@@ -14,12 +14,12 @@ import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import static net.trueog.unionsog.managers.SettingsManager.ConfigField.LAND_EDIT_ALL_LANDS;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.LAND_EDIT_ALL_LANDS;
@CommandAlias("%union")
@CommandAlias("%clan")
@Subcommand("%land")
@Conditions("%basic_conditions|union_member|land_sharing|own_land")
@CommandPermission("unionsog.member.land")
@Conditions("%basic_conditions|clan_member|land_sharing|own_land")
@CommandPermission("simpleclans.member.land")
public class LandCommand extends BaseCommand {
@Dependency
@@ -27,213 +27,152 @@ public class LandCommand extends BaseCommand {
@Dependency
private SettingsManager settings;
private Set<Land> getLands(UnionPlayer cp, Location location) {
private Set<Land> getLands(ClanPlayer cp, Location location) {
Player player = Objects.requireNonNull(cp.toPlayer());
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()))
.collect(Collectors.toSet());
}
}
@Subcommand("%allow")
public class AllowCommand extends BaseCommand {
private void allow(UnionPlayer cp, ProtectionManager.Action action, Location location) {
private void allow(ClanPlayer cp, ProtectionManager.Action action, Location location) {
allow(cp, action, location, true);
}
private void allow(UnionPlayer cp, ProtectionManager.Action action, Location location, boolean notify) {
private void allow(ClanPlayer cp, ProtectionManager.Action action, Location location, boolean notify) {
for (Land land : getLands(cp, location)) {
cp.allow(action, land.getId());
}
if (notify) {
ChatBlock.sendMessageKey(cp, "land.allowed.action");
ChatBlock.sendMessageKey(cp.toPlayer(), "land.allowed.action");
}
}
@Subcommand("%container")
@Description("{@@command.description.land.allow.container}")
@CommandPermission("unionsog.member.land.allow.container")
public void container(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.allow.container")
public void container(Player player, ClanPlayer cp) {
allow(cp, ProtectionManager.Action.CONTAINER, player.getLocation());
}
@Subcommand("%place")
@Description("{@@command.description.land.allow.place}")
@CommandPermission("unionsog.member.land.allow.place")
public void place(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.allow.place")
public void place(Player player, ClanPlayer cp) {
allow(cp, ProtectionManager.Action.PLACE, player.getLocation());
}
@Subcommand("%damage")
@Description("{@@command.description.land.allow.damage}")
@CommandPermission("unionsog.member.land.allow.damage")
public void damage(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.allow.damage")
public void damage(Player player, ClanPlayer cp) {
allow(cp, ProtectionManager.Action.DAMAGE, player.getLocation());
}
@Subcommand("%interact_entity")
@Description("{@@command.description.land.allow.interact_entity}")
@CommandPermission("unionsog.member.land.allow.interact_entity")
public void interactEntity(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.allow.interact_entity")
public void interactEntity(Player player, ClanPlayer cp) {
allow(cp, ProtectionManager.Action.INTERACT_ENTITY, player.getLocation());
}
@Subcommand("%interact")
@Description("{@@command.description.land.allow.interact}")
@CommandPermission("unionsog.member.land.allow.interact")
public void interact(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.allow.interact")
public void interact(Player player, ClanPlayer cp) {
allow(cp, ProtectionManager.Action.INTERACT, player.getLocation());
}
@Subcommand("%break")
@Description("{@@command.description.land.allow.break}")
@CommandPermission("unionsog.member.land.allow.break")
public void allowBreak(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.allow.break")
public void allowBreak(Player player, ClanPlayer cp) {
allow(cp, ProtectionManager.Action.BREAK, player.getLocation());
}
@Subcommand("%all")
@Description("{@@command.description.land.allow.all}")
@CommandPermission("unionsog.member.land.allow.all")
public void all(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.allow.all")
public void all(Player player, ClanPlayer cp) {
for (ProtectionManager.Action action : ProtectionManager.Action.values()) {
allow(cp, action, player.getLocation(), false);
}
ChatBlock.sendMessageKey(player, "land.allowed.all.actions");
}
}
@Subcommand("%block")
public class BlockCommand extends BaseCommand {
private void block(UnionPlayer cp, ProtectionManager.Action action, Location location) {
private void block(ClanPlayer cp, ProtectionManager.Action action, Location location) {
block(cp, action, location, true);
}
private void block(UnionPlayer cp, ProtectionManager.Action action, Location location, boolean notify) {
private void block(ClanPlayer cp, ProtectionManager.Action action, Location location, boolean notify) {
for (Land land : getLands(cp, location)) {
cp.disallow(action, land.getId());
}
if (notify) {
ChatBlock.sendMessageKey(cp, "land.blocked.action");
ChatBlock.sendMessageKey(cp.toPlayer(), "land.blocked.action");
}
}
@Subcommand("%container")
@Description("{@@command.description.land.block.container}")
@CommandPermission("unionsog.member.land.block.container")
public void container(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.block.container")
public void container(Player player, ClanPlayer cp) {
block(cp, ProtectionManager.Action.CONTAINER, player.getLocation());
}
@Subcommand("%place")
@Description("{@@command.description.land.block.place}")
@CommandPermission("unionsog.member.land.block.place")
public void place(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.block.place")
public void place(Player player, ClanPlayer cp) {
block(cp, ProtectionManager.Action.PLACE, player.getLocation());
}
@Subcommand("%damage")
@Description("{@@command.description.land.block.damage}")
@CommandPermission("unionsog.member.land.block.damage")
public void damage(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.block.damage")
public void damage(Player player, ClanPlayer cp) {
block(cp, ProtectionManager.Action.DAMAGE, player.getLocation());
}
@Subcommand("%interact_entity")
@Description("{@@command.description.land.block.interact_entity}")
@CommandPermission("unionsog.member.land.block.interact_entity")
public void interactEntity(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.block.interact_entity")
public void interactEntity(Player player, ClanPlayer cp) {
block(cp, ProtectionManager.Action.INTERACT_ENTITY, player.getLocation());
}
@Subcommand("%interact")
@Description("{@@command.description.land.block.interact}")
@CommandPermission("unionsog.member.land.block.interact")
public void interact(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.block.interact")
public void interact(Player player, ClanPlayer cp) {
block(cp, ProtectionManager.Action.INTERACT, player.getLocation());
}
@Subcommand("%break")
@Description("{@@command.description.land.block.break}")
@CommandPermission("unionsog.member.land.block.break")
public void blockBreak(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.block.break")
public void blockBreak(Player player, ClanPlayer cp) {
block(cp, ProtectionManager.Action.BREAK, player.getLocation());
}
@Subcommand("%all")
@Description("{@@command.description.land.block.all}")
@CommandPermission("unionsog.member.land.block.all")
public void all(Player player, UnionPlayer cp) {
@CommandPermission("simpleclans.member.land.block.all")
public void all(Player player, ClanPlayer cp) {
protection.getLandsAt(player.getLocation());
for (ProtectionManager.Action action : ProtectionManager.Action.values()) {
block(cp, action, player.getLocation(), false);
}
ChatBlock.sendMessageKey(player, "land.blocked.all.actions");
}
}
}
@@ -0,0 +1,227 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.clan;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.ChatBlock;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.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;
import java.util.Objects;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static net.sacredlabyrinth.phaed.simpleclans.managers.SettingsManager.ConfigField.*;
import static org.bukkit.ChatColor.*;
@CommandAlias("%clan")
@Conditions("%basic_conditions|leader")
public class LeaderCommands extends BaseCommand {
@Dependency
private SimpleClans plugin;
@Dependency
private StorageManager storage;
@Dependency
private PermissionsManager permissions;
@Dependency
private SettingsManager settings;
@Dependency
private RequestManager requestManager;
@Dependency
private ClanManager cm;
@Dependency
private ChatManager chatManager;
@Subcommand("%demote")
@CommandCompletion("@clan_leaders")
@CommandPermission("simpleclans.leader.demote")
@Description("{@@command.description.demote}")
public void demote(Player player,
ClanPlayer cp,
Clan clan,
@Conditions("same_clan") @Name("leader") ClanPlayerInput other) {
ClanPlayer otherCp = other.getClanPlayer();
if (!clan.enoughLeadersOnlineToDemote(otherCp)) {
ChatBlock.sendMessage(player, RED + lang("not.enough.leaders.online.to.vote.on.demotion", player));
return;
}
if (!clan.isLeader(otherCp.getUniqueId())) {
ChatBlock.sendMessage(player, RED + lang("player.is.not.a.leader.of.your.clan", player));
return;
}
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.demote(otherCp.getUniqueId());
}
@Subcommand("%promote")
@CommandPermission("simpleclans.leader.promote")
@CommandCompletion("@clan_non_leaders")
@Description("{@@command.description.promote}")
public void promote(Player player,
Clan clan,
ClanPlayer cp,
@Conditions("online|same_clan") @Name("member") ClanPlayerInput other) {
Player otherPl = Objects.requireNonNull(other.getClanPlayer().toPlayer());
if (!permissions.has(otherPl, "simpleclans.leader.promotable")) {
ChatBlock.sendMessage(player, RED + lang("the.player.does.not.have.the.permissions.to.lead.a.clan",
player));
return;
}
if (otherPl.getUniqueId().equals(player.getUniqueId())) {
ChatBlock.sendMessage(player, RED + lang("you.cannot.promote.yourself", player));
return;
}
if (clan.isLeader(otherPl.getUniqueId())) {
ChatBlock.sendMessage(player, RED + lang("the.player.is.already.a.leader", player));
return;
}
if (settings.is(CLAN_CONFIRMATION_FOR_PROMOTE) && clan.getLeaders().size() > 1) {
requestManager.addPromoteRequest(cp, otherPl.getName(), clan);
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.promote(otherPl.getUniqueId());
}
@Subcommand("%disband")
@CommandPermission("simpleclans.leader.disband")
@Description("{@@command.description.disband}")
public void disband(Player player, ClanPlayer cp, Clan clan) {
if (clan.getLeaders().size() != 1) {
requestManager.addDisbandRequest(cp, clan);
ChatBlock.sendMessage(player, AQUA +
lang("clan.disband.vote.has.been.requested.from.all.leaders", player));
return;
}
new SCConversation(plugin, player, new DisbandPrompt()).begin();
}
@Subcommand("%verify")
@CommandPermission("simpleclans.leader.verify")
@Description("{@@command.description.verify}")
public void verify(Player player, Clan clan) {
if (clan.isVerified()) {
ChatBlock.sendMessageKey(player, "your.clan.already.verified");
return;
}
if (!settings.is(ECONOMY_PURCHASE_CLAN_VERIFY)) {
ChatBlock.sendMessageKey(player, "staff.member.verify.clan");
return;
}
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()));
ChatBlock.sendMessage(player, AQUA + lang("the.clan.has.been.verified", player));
}
}
@Subcommand("%trust")
@CommandPermission("simpleclans.leader.settrust")
@CommandCompletion("@clan_members")
@Description("{@@command.description.trust}")
public void trust(Player player, Clan clan, @Conditions("same_clan") @Name("member") ClanPlayerInput trusted) {
ClanPlayer trustedInput = trusted.getClanPlayer();
if (player.getUniqueId().equals(trustedInput.getUniqueId())) {
ChatBlock.sendMessage(player, RED + lang("you.cannot.trust.yourself", player));
return;
}
if (clan.isLeader(trustedInput.getUniqueId())) {
ChatBlock.sendMessage(player, RED + lang("leaders.are.already.trusted", player));
return;
}
if (trustedInput.isTrusted()) {
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(),
player.getName()));
trustedInput.setTrusted(true);
storage.updateClanPlayer(trustedInput);
}
@Subcommand("%untrust")
@CommandPermission("simpleclans.leader.settrust")
@CommandCompletion("@clan_members")
@Description("{@@command.description.untrust}")
public void untrust(Player player, Clan clan, @Conditions("same_clan") @Name("member") ClanPlayerInput trusted) {
ClanPlayer trustedInput = trusted.getClanPlayer();
if (trustedInput.getUniqueId().equals(player.getUniqueId())) {
ChatBlock.sendMessage(player, RED + lang("you.cannot.untrust.yourself", player));
return;
}
if (clan.isLeader(trustedInput.getUniqueId())) {
ChatBlock.sendMessage(player, RED + lang("leaders.cannot.be.untrusted", player));
return;
}
if (!trustedInput.isTrusted()) {
ChatBlock.sendMessage(player, RED + lang("this.player.is.already.untrusted", player));
return;
}
clan.addBb(player.getName(), AQUA + lang("has.been.given.untrusted.status.by", trustedInput.getName(),
player.getName()));
trustedInput.setTrusted(false);
storage.updateClanPlayer(trustedInput);
}
@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.playerChargeMoney(player, amount)) {
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.playerGrantMoney(player, amount);
}
String messageKey = ex.getMessageKey();
if (messageKey != null) {
ChatBlock.sendMessage(player, RED + lang(messageKey));
}
}
}
}
@@ -0,0 +1,214 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.clan;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.*;
import net.sacredlabyrinth.phaed.simpleclans.*;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanPlayerInput;
import net.sacredlabyrinth.phaed.simpleclans.conversation.CreateRankNamePrompt;
import net.sacredlabyrinth.phaed.simpleclans.conversation.RequestCanceller;
import net.sacredlabyrinth.phaed.simpleclans.conversation.SCConversation;
import net.sacredlabyrinth.phaed.simpleclans.events.DeleteRankEvent;
import net.sacredlabyrinth.phaed.simpleclans.events.PlayerRankUpdateEvent;
import net.sacredlabyrinth.phaed.simpleclans.managers.PermissionsManager;
import net.sacredlabyrinth.phaed.simpleclans.managers.StorageManager;
import net.sacredlabyrinth.phaed.simpleclans.utils.ChatUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.AQUA;
import static org.bukkit.ChatColor.RED;
@CommandAlias("%clan")
@Subcommand("%rank")
@Conditions("%basic_conditions|verified|leader")
public class RankCommand extends BaseCommand {
@Dependency
private SimpleClans plugin;
@Dependency
private StorageManager storage;
@Dependency
private PermissionsManager permissions;
@Subcommand("%assign")
@CommandPermission("simpleclans.leader.rank.assign")
@CommandCompletion("@clan_members @ranks")
@Description("{@@command.description.rank.assign}")
public void assign(ClanPlayer player,
Clan clan,
@Name("member") @Conditions("same_clan") ClanPlayerInput member,
@Name("rank") Rank rank) {
ClanPlayer memberInput = member.getClanPlayer();
PlayerRankUpdateEvent event = new PlayerRankUpdateEvent(player, memberInput, clan, clan.getRank(memberInput.getRankId()), rank);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) return;
if (memberInput.getRankId().equals(rank.getName())) {
ChatBlock.sendMessage(player, lang("player.already.has.that.rank", player));
return;
}
memberInput.setRank(rank.getName());
storage.updateClanPlayer(memberInput);
ChatBlock.sendMessage(player, AQUA + lang("player.rank.changed", player));
}
@Subcommand("%unassign")
@CommandPermission("simpleclans.leader.rank.unassign")
@CommandCompletion("@clan_members")
@Description("{@@command.description.rank.unassign}")
public void unassign(ClanPlayer player, Clan clan, @Conditions("same_clan") @Name("member") ClanPlayerInput cp) {
ClanPlayer memberInput = cp.getClanPlayer();
PlayerRankUpdateEvent event = new PlayerRankUpdateEvent(player, memberInput, clan, clan.getRank(memberInput.getRankId()), null);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) return;
memberInput.setRank(null);
storage.updateClanPlayer(memberInput);
ChatBlock.sendMessage(player, AQUA + lang("player.unassigned.from.rank", player));
}
@Subcommand("%create")
@CommandPermission("simpleclans.leader.rank.create")
@Description("{@@command.description.rank.create}")
public void create(Player player, Clan clan) {
SCConversation conversation = new SCConversation(plugin, player, new CreateRankNamePrompt(), 60);
conversation.addConversationCanceller(new RequestCanceller(player, RED + lang("rank.create.request.cancelled", player)));
conversation.getContext().setSessionData("clan", clan);
conversation.begin();
}
@Subcommand("%delete")
@CommandPermission("simpleclans.leader.rank.delete")
@CommandCompletion("@ranks")
@Description("{@@command.description.rank.delete}")
public void delete(Player player, Clan clan, @Name("rank") Rank rank) {
DeleteRankEvent event = new DeleteRankEvent(player, clan, rank);
Bukkit.getServer().getPluginManager().callEvent(event);
if (!event.isCancelled()) {
clan.deleteRank(rank.getName());
storage.updateClan(clan, true);
ChatBlock.sendMessage(player, AQUA + lang("rank.0.deleted", player, rank.getDisplayName()));
}
}
@Subcommand("%list")
@CommandPermission("simpleclans.leader.rank.list")
@Description("{@@command.description.rank.list}")
public void list(Player player, Clan clan) {
List<Rank> ranks = clan.getRanks();
if (ranks.isEmpty()) {
ChatBlock.sendMessage(player, RED + lang("no.ranks", player));
return;
}
ranks.sort(Comparator.reverseOrder());
ChatBlock.sendMessage(player, AQUA + lang("clans.ranks", player));
int count = 1;
for (Rank rank : ranks) {
ChatBlock.sendMessage(player, AQUA + lang("ranks.list.item", player, count,
ChatUtils.parseColors(rank.getDisplayName()) + AQUA, rank.getName()));
count++;
}
}
@Subcommand("%setdisplayname")
@CommandPermission("simpleclans.leader.rank.setdisplayname")
@CommandCompletion("@ranks @nothing")
@Description("{@@command.description.rank.setdisplayname}")
public void setDisplayName(Player player, Clan clan, @Name("rank") Rank rank, @Name("displayname") String displayName) {
if (displayName.contains("&") && !permissions.has(player, "simpleclans.leader.coloredrank")) {
ChatBlock.sendMessage(player, RED + lang("you.cannot.set.colored.ranks", player));
return;
}
rank.setDisplayName(displayName);
storage.updateClan(clan, true);
ChatBlock.sendMessage(player, ChatColor.AQUA + lang("rank.displayname.updated", player));
}
@Subcommand("%setdefault")
@CommandPermission("simpleclans.leader.rank.setdefault")
@CommandCompletion("@ranks")
@Description("{@@command.description.rank.setdefault}")
public void setDefault(Player player, Clan clan, @Name("rank") Rank rank) {
clan.setDefaultRank(rank.getName());
ChatBlock.sendMessage(player, AQUA + lang("rank.setdefault", player, rank.getDisplayName()));
}
@Subcommand("%removedefault")
@CommandPermission("simpleclans.leader.rank.removedefault")
@Description("{@@command.description.rank.removedefault}")
public void removeDefault(Player player, Clan clan) {
clan.setDefaultRank(null);
ChatBlock.sendMessage(player, AQUA + lang("rank.removedefault", player));
}
@Subcommand("%permissions")
public class PermissionsCommand extends BaseCommand {
private final String validPermissionsToMessage = String.join(",", Helper.fromPermissionArray());
@Default
@CommandPermission("simpleclans.leader.rank.permissions.available")
@Description("{@@command.description.rank.permissions.available}")
public void availablePermissions(Player player) {
ChatBlock.sendMessage(player, AQUA + lang("available.rank.permissions", player));
ChatBlock.sendMessage(player, AQUA + validPermissionsToMessage);
}
@Default
@CommandPermission("simpleclans.leader.rank.permissions.list")
@CommandCompletion("@ranks")
@Description("{@@command.description.rank.permissions.rank}")
public void list(Player player, @Name("rank") Rank rank) {
Set<String> permissions = rank.getPermissions();
if (permissions.isEmpty()) {
ChatBlock.sendMessage(player, RED + lang("rank.no.permissions", player));
return;
}
ChatBlock.sendMessage(player, AQUA + lang("rank.0.permissions", player, rank.getDisplayName()));
ChatBlock.sendMessage(player, AQUA + String.join(",", permissions));
}
@Subcommand("%add")
@CommandPermission("simpleclans.leader.rank.permissions.add")
@CommandCompletion("@ranks @rank_permissions")
@Description("{@@command.description.rank.permissions.add}")
public void add(Player player,
Clan clan,
@Name("rank") Rank rank,
@Values("@rank_permissions") @Name("permission") String permission) {
Set<String> permissions = rank.getPermissions();
permissions.add(permission);
ChatBlock.sendMessage(player, AQUA + lang("permission.0.added.to.rank.1", player, permission,
rank.getDisplayName()));
storage.updateClan(clan, true);
}
@Subcommand("%remove")
@CommandCompletion("@ranks @rank_permissions")
@CommandPermission("simpleclans.leader.rank.permissions.remove")
@Description("{@@command.description.rank.permissions.remove}")
public void remove(Player player,
Clan clan,
@Name("rank") Rank rank,
@Values("@rank_permissions") @Name("permission") String permission) {
Set<String> permissions = rank.getPermissions();
permissions.remove(permission);
ChatBlock.sendMessage(player, AQUA + lang("permission.0.removed.from.rank.1", player,
permission, rank.getDisplayName()));
storage.updateClan(clan, true);
}
}
}
@@ -0,0 +1,91 @@
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.managers.StorageManager;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.function.Consumer;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.AQUA;
@CommandAlias("%clan")
@Subcommand("%toggle")
@Conditions("%basic_conditions")
public class ToggleCommand extends BaseCommand {
@Dependency
private StorageManager storage;
@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);
}
@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("%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,
Consumer<Boolean> consumer) {
String messageOn = AQUA + lang(onMessageKey, sender);
String messageOff = AQUA + lang(offMessageKey, sender);
ChatBlock.sendMessage(sender, status ? messageOff : messageOn);
consumer.accept(!status);
}
}
@@ -1,18 +1,13 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.CommandCompletions.AsyncCommandCompletionHandler;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
public abstract class AbstractAsyncCompletion extends AbstractCompletion
implements AsyncCommandCompletionHandler<BukkitCommandCompletionContext>
{
public AbstractAsyncCompletion(@NotNull UnionsOG plugin) {
implements AsyncCommandCompletionHandler<BukkitCommandCompletionContext> {
public AbstractAsyncCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
}
@@ -0,0 +1,16 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.managers.ClanManager;
import org.jetbrains.annotations.NotNull;
public abstract class AbstractCompletion implements IdentifiableCompletion {
protected final SimpleClans plugin;
protected final ClanManager clanManager;
public AbstractCompletion(@NotNull SimpleClans plugin) {
this.plugin = plugin;
this.clanManager = plugin.getClanManager();
}
}
@@ -1,16 +1,14 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
public abstract class AbstractStaticCompletion extends AbstractCompletion {
public AbstractStaticCompletion(@NotNull UnionsOG plugin) {
public AbstractStaticCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@NotNull
@@ -1,18 +1,13 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.CommandCompletions.CommandCompletionHandler;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
public abstract class AbstractSyncCompletion extends AbstractCompletion
implements CommandCompletionHandler<BukkitCommandCompletionContext>
{
public AbstractSyncCompletion(@NotNull UnionsOG plugin) {
implements CommandCompletionHandler<BukkitCommandCompletionContext> {
public AbstractSyncCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
}
@@ -1,36 +1,29 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.trueog.unionsog.UnionPlayer;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.stream.Collectors;
@SuppressWarnings("unused")
public class AllMembersCompletion extends AbstractSyncCompletion {
public AllMembersCompletion(@NotNull UnionsOG plugin) {
public class AllLeadersCompletion extends AbstractSyncCompletion {
public AllLeadersCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext context) throws InvalidCommandArgument {
return unionManager.getAllUnionPlayers().stream().filter(cp -> cp.getUnion() != null).map(UnionPlayer::getName)
return clanManager
.getAllClanPlayers().stream().filter(ClanPlayer::isLeader).map(ClanPlayer::getName)
.collect(Collectors.toList());
}
@Override
public @NotNull String getId() {
return "all_members";
return "all_leaders";
}
}
@@ -0,0 +1,29 @@
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.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.stream.Collectors;
@SuppressWarnings("unused")
public class AllNonLeadersCompletion extends AbstractSyncCompletion {
public AllNonLeadersCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext context) throws InvalidCommandArgument {
return clanManager
.getAllClanPlayers().stream().filter(cp -> !cp.isLeader() && cp.getClan() != null)
.map(ClanPlayer::getName).collect(Collectors.toList());
}
@Override
public @NotNull String getId() {
return "all_non_leaders";
}
}
@@ -1,9 +1,9 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.trueog.unionsog.Union;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -11,38 +11,25 @@ import java.util.Collection;
import java.util.Collections;
@SuppressWarnings("unused")
public class AlliedUnionsCompletion extends AbstractSyncCompletion {
public AlliedUnionsCompletion(@NotNull UnionsOG plugin) {
public class AlliedClansCompletion extends AbstractSyncCompletion {
public AlliedClansCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext context) throws InvalidCommandArgument {
Player player = context.getPlayer();
if (player != null) {
Union union = unionManager.getUnionByPlayerUniqueId(player.getUniqueId());
if (union != null) {
return union.getAllies();
Clan clan = clanManager.getClanByPlayerUniqueId(player.getUniqueId());
if (clan != null) {
return clan.getAllies();
}
}
return Collections.emptyList();
}
@Override
public @NotNull String getId() {
return "allied_unions";
return "allied_clans";
}
}
@@ -0,0 +1,36 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
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.Collection;
import java.util.Collections;
import java.util.stream.Collectors;
public class ClanLeadersCompletion extends AbstractSyncCompletion {
public ClanLeadersCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext c) throws InvalidCommandArgument {
Player player = c.getPlayer();
if (player != null) {
Clan clan = clanManager.getClanByPlayerUniqueId(player.getUniqueId());
if (clan != null) {
return clan.getLeaders().stream().map(ClanPlayer::getName).collect(Collectors.toList());
}
}
return Collections.emptyList();
}
@Override
public @NotNull String getId() {
return "clan_leaders";
}
}
@@ -1,10 +1,10 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.trueog.unionsog.Union;
import net.trueog.unionsog.UnionPlayer;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -14,45 +14,29 @@ import java.util.List;
import java.util.stream.Collectors;
@SuppressWarnings("unused")
public class UnionMembersCompletion extends AbstractSyncCompletion {
public UnionMembersCompletion(@NotNull UnionsOG plugin) {
public class ClanMembersCompletion extends AbstractSyncCompletion {
public ClanMembersCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext c) throws InvalidCommandArgument {
Player player = c.getPlayer();
if (player != null) {
Union union = unionManager.getUnionByPlayerUniqueId(player.getUniqueId());
if (union != null) {
List<String> list = union.getMembers().stream().map(UnionPlayer::getName).collect(Collectors.toList());
Clan clan = clanManager.getClanByPlayerUniqueId(player.getUniqueId());
if (clan != null) {
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();
}
@Override
public @NotNull String getId() {
return "union_members";
return "clan_members";
}
}
@@ -0,0 +1,36 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
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.Collection;
import java.util.Collections;
import java.util.stream.Collectors;
@SuppressWarnings("unused")
public class ClanNonLeadersCompletion extends AbstractSyncCompletion {
public ClanNonLeadersCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext c) throws InvalidCommandArgument {
Player player = c.getPlayer();
if (player != null) {
Clan clan = clanManager.getClanByPlayerUniqueId(player.getUniqueId());
if (clan != null) {
return clan.getNonLeaders().stream().map(ClanPlayer::getName).collect(Collectors.toList());
}
}
return Collections.emptyList(); }
@Override
public @NotNull String getId() {
return "clan_non_leaders";
}
}
@@ -0,0 +1,46 @@
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;
public class ClansCompletion extends AbstractSyncCompletion {
public ClansCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext c) throws InvalidCommandArgument {
List<Clan> clans = clanManager.getClans();
if (c.hasConfig("has_home")) {
clans.removeIf(clan -> clan.getHomeLocation() == null);
}
if (c.hasConfig("unverified")) {
clans.removeIf(Clan::isVerified);
}
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());
}
}
@@ -1,4 +1,4 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import org.jetbrains.annotations.NotNull;
@@ -6,5 +6,4 @@ public interface IdentifiableCompletion {
@NotNull
String getId();
}
@@ -1,35 +1,28 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collection;
import static net.trueog.unionsog.UnionsOG.lang;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
@SuppressWarnings("unused")
public class ListTypeCompletion extends AbstractStaticCompletion {
public ListTypeCompletion(@NotNull UnionsOG plugin) {
public ListTypeCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public @NotNull Collection<String> getCompletions() {
return Arrays.asList(lang("list.type.size"), lang("list.type.kdr"), lang("list.type.name"),
return Arrays.asList(
lang("list.type.size"), lang("list.type.kdr"), lang("list.type.name"),
lang("list.type.founded"), lang("list.type.active"));
}
@Override
public @NotNull String getId() {
return "union_list_type";
return "clan_list_type";
}
}
@@ -1,9 +1,9 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.trueog.unionsog.UnionsOG;
import net.trueog.unionsog.utils.VanishUtils;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.utils.VanishUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -13,42 +13,27 @@ import java.util.Collection;
@SuppressWarnings("unused")
public class NonMembersCompletion extends AbstractSyncCompletion {
public NonMembersCompletion(@NotNull UnionsOG plugin) {
public NonMembersCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public @NotNull String getId() {
return "non_members";
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext c) throws InvalidCommandArgument {
Collection<String> onlinePlayers = new ArrayList<>();
for (Player onlinePlayer : Bukkit.getOnlinePlayers()) {
boolean vanished = VanishUtils.isVanished(c.getSender(), onlinePlayer);
if (unionManager.getUnionByPlayerUniqueId(onlinePlayer.getUniqueId()) != null
|| (c.hasConfig("ignore_vanished") && vanished))
{
if (clanManager.getClanByPlayerUniqueId(onlinePlayer.getUniqueId()) != null || (c.hasConfig("ignore_vanished") && vanished)) {
continue;
}
onlinePlayers.add(onlinePlayer.getName());
}
return onlinePlayers;
}
}
@@ -1,34 +1,26 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collection;
import static net.trueog.unionsog.UnionsOG.lang;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
@SuppressWarnings("unused")
public class OrderCompletion extends AbstractStaticCompletion {
public OrderCompletion(@NotNull UnionsOG plugin) {
public OrderCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public @NotNull Collection<String> getCompletions() {
return Arrays.asList(lang("list.order.asc"), lang("list.order.desc"));
}
@Override
public @NotNull String getId() {
return "order";
}
}
@@ -0,0 +1,25 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import net.sacredlabyrinth.phaed.simpleclans.Helper;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Collection;
@SuppressWarnings("unused")
public class RankPermissionsCompletion extends AbstractStaticCompletion {
public RankPermissionsCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public @NotNull Collection<String> getCompletions() {
return Arrays.asList(Helper.fromPermissionArray());
}
@Override
public @NotNull String getId() {
return "rank_permissions";
}
}
@@ -0,0 +1,35 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.Rank;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
import java.util.Collections;
import java.util.stream.Collectors;
public class RanksCompletion extends AbstractSyncCompletion {
public RanksCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext context) throws InvalidCommandArgument {
Player player = context.getPlayer();
if (player != null) {
Clan clan = clanManager.getClanByPlayerUniqueId(player.getUniqueId());
if (clan != null) {
return clan.getRanks().stream().map(Rank::getName).collect(Collectors.toList());
}
}
return Collections.emptyList(); }
@Override
public @NotNull String getId() {
return "ranks";
}
}
@@ -1,9 +1,9 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.trueog.unionsog.Union;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -12,37 +12,24 @@ import java.util.Collections;
@SuppressWarnings("unused")
public class RivalsCompletion extends AbstractSyncCompletion {
public RivalsCompletion(@NotNull UnionsOG plugin) {
public RivalsCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext c) throws InvalidCommandArgument {
Player player = c.getPlayer();
if (player != null) {
Union union = unionManager.getUnionByPlayerUniqueId(player.getUniqueId());
if (union != null) {
return union.getRivals();
Clan clan = clanManager.getClanByPlayerUniqueId(player.getUniqueId());
if (clan != null) {
return clan.getRivals();
}
}
return Collections.emptyList();
}
@Override
public @NotNull String getId() {
return "rivals";
}
}
@@ -1,9 +1,9 @@
package net.trueog.unionsog.commands.completions;
package net.sacredlabyrinth.phaed.simpleclans.commands.completions;
import co.aikar.commands.BukkitCommandCompletionContext;
import co.aikar.commands.InvalidCommandArgument;
import net.trueog.unionsog.Union;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -12,38 +12,25 @@ import java.util.Collections;
import java.util.stream.Collectors;
@SuppressWarnings("unused")
public class WarringUnionsCompletion extends AbstractSyncCompletion {
public WarringUnionsCompletion(@NotNull UnionsOG plugin) {
public class WarringClansCompletion extends AbstractSyncCompletion {
public WarringClansCompletion(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Collection<String> getCompletions(BukkitCommandCompletionContext c) throws InvalidCommandArgument {
if (c.getIssuer().isPlayer()) {
Player player = c.getPlayer();
Union union = unionManager.getUnionByPlayerUniqueId(player.getUniqueId());
if (union != null) {
return union.getWarringUnions().stream().map(Union::getTag).collect(Collectors.toList());
Clan clan = clanManager.getClanByPlayerUniqueId(player.getUniqueId());
if (clan != null) {
return clan.getWarringClans().stream().map(Clan::getTag).collect(Collectors.toList());
}
}
return Collections.emptyList();
}
@Override
public @NotNull String getId() {
return "warring_unions";
return "warring_clans";
}
}
@@ -0,0 +1,12 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
import co.aikar.commands.BukkitCommandIssuer;
import co.aikar.commands.CommandConditions;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
public abstract class AbstractCommandCondition extends AbstractCondition implements CommandConditions.Condition<BukkitCommandIssuer> {
public AbstractCommandCondition(@NotNull SimpleClans plugin) {
super(plugin);
}
}
@@ -1,27 +1,24 @@
package net.trueog.unionsog.commands.conditions;
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
import net.trueog.unionsog.UnionsOG;
import net.trueog.unionsog.managers.*;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.managers.*;
import org.jetbrains.annotations.NotNull;
public abstract class AbstractCondition implements IdentifiableCondition {
protected final UnionsOG plugin;
protected final SimpleClans plugin;
protected final PermissionsManager permissionsManager;
protected final UnionManager unionManager;
protected final ClanManager clanManager;
protected final RequestManager requestManager;
protected final SettingsManager settingsManager;
protected final ProtectionManager protectionManager;
public AbstractCondition(@NotNull UnionsOG plugin) {
public AbstractCondition(@NotNull SimpleClans plugin) {
this.plugin = plugin;
permissionsManager = plugin.getPermissionsManager();
unionManager = plugin.getUnionManager();
clanManager = plugin.getClanManager();
requestManager = plugin.getRequestManager();
settingsManager = plugin.getSettingsManager();
protectionManager = plugin.getProtectionManager();
}
}
@@ -1,21 +1,16 @@
package net.trueog.unionsog.commands.conditions;
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
import co.aikar.commands.BukkitCommandExecutionContext;
import co.aikar.commands.BukkitCommandIssuer;
import co.aikar.commands.CommandConditions;
import net.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
public abstract class AbstractParameterCondition<T> extends AbstractCondition
implements CommandConditions.ParameterCondition<T, BukkitCommandExecutionContext, BukkitCommandIssuer>
{
public AbstractParameterCondition(@NotNull UnionsOG plugin) {
public abstract class AbstractParameterCondition<T> extends AbstractCondition implements CommandConditions.ParameterCondition<T,
BukkitCommandExecutionContext, BukkitCommandIssuer> {
public AbstractParameterCondition(@NotNull SimpleClans plugin) {
super(plugin);
}
public abstract Class<T> getType();
}
@@ -0,0 +1,38 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
import co.aikar.commands.*;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import net.sacredlabyrinth.phaed.simpleclans.commands.ClanInput;
import org.jetbrains.annotations.NotNull;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.RED;
@SuppressWarnings("unused")
public class AlliedClanCondition extends AbstractParameterCondition<ClanInput> {
public AlliedClanCondition(@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 {
BukkitCommandIssuer issuer = context.getIssuer();
Clan clan = Conditions.assertClanMember(clanManager, issuer);
if (!clan.isAlly(value.getClan().getTag())) {
throw new ConditionFailedException(RED + lang("your.clans.are.not.allies", issuer));
}
}
@Override
public @NotNull String getId() {
return "allied_clan";
}
}
@@ -0,0 +1,56 @@
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 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 {
private static final float HOUR_IN_MINUTES = 60;
public CanChangeFeeCondition(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context) throws InvalidCommandArgument {
LocalDateTime now = LocalDateTime.now();
LocalDateTime collectTime = getCollectTime();
long interval = now.until(collectTime, 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) {
error += lang("cannot.change.member.fee.minutes", issuer, interval);
} else {
error += lang("cannot.change.member.fee.hours", issuer, Math.ceil(interval / HOUR_IN_MINUTES));
}
throw new ConditionFailedException(error);
}
}
private LocalDateTime getCollectTime() {
LocalDateTime now = LocalDateTime.now();
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);
}
return collectTime;
}
@Override
public @NotNull String getId() {
return "change_fee";
}
}
@@ -1,41 +1,31 @@
package net.trueog.unionsog.commands.conditions;
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.trueog.unionsog.UnionsOG;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import static net.trueog.unionsog.UnionsOG.lang;
import static net.trueog.unionsog.managers.SettingsManager.ConfigField;
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 UnionsOG plugin) {
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,64 +1,46 @@
package net.trueog.unionsog.commands.conditions;
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.trueog.unionsog.Union;
import net.trueog.unionsog.UnionPlayer;
import net.trueog.unionsog.UnionsOG;
import co.aikar.commands.*;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import static net.trueog.unionsog.UnionsOG.lang;
import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;
import static org.bukkit.ChatColor.RED;
@SuppressWarnings("unused")
public class CanVoteCondition extends AbstractCommandCondition {
public CanVoteCondition(@NotNull UnionsOG plugin) {
public CanVoteCondition(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context) throws InvalidCommandArgument {
Player player = Conditions.assertPlayer(context.getIssuer());
UnionPlayer cp = unionManager.getCreateUnionPlayer(player.getUniqueId());
Union union = cp.getUnion();
if (union != null) {
if (!requestManager.hasRequest(union.getTag())) {
ClanPlayer cp = clanManager.getCreateClanPlayer(player.getUniqueId());
Clan clan = cp.getClan();
if (clan != null) {
if (!requestManager.hasRequest(clan.getTag())) {
throw new ConditionFailedException(lang("nothing.to.vote", player));
}
if (!clan.isLeader(player)) {
throw new ConditionFailedException(RED + lang("no.leader.permissions", player));
}
if (cp.getVote() != null) {
throw new ConditionFailedException(RED + lang("you.have.already.voted", player));
}
} else {
if (!requestManager.hasRequest(player.getName().toLowerCase())) {
throw new ConditionFailedException(lang("nothing.to.vote", player));
}
}
}
@Override
public @NotNull String getId() {
return "can_vote";
}
}
@@ -0,0 +1,51 @@
package net.sacredlabyrinth.phaed.simpleclans.commands.conditions;
import co.aikar.commands.*;
import net.sacredlabyrinth.phaed.simpleclans.Clan;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
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) {
super(plugin);
}
@Override
public Class<ClanInput> getType() {
return ClanInput.class;
}
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context, BukkitCommandExecutionContext execContext, ClanInput target) throws InvalidCommandArgument {
BukkitCommandIssuer issuer = execContext.getIssuer();
Clan issuerClan = Conditions.assertClanMember(clanManager, issuer);
Clan targetClan = target.getClan();
if (!issuerClan.isRival(targetClan.getTag())) {
throw new ConditionFailedException(lang("you.can.only.start.war.with.rivals", issuer));
}
if (issuerClan.isWarring(targetClan)) {
throw new ConditionFailedException(lang("clans.already.at.war", issuer));
}
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());
if (difference > maxDifference)
throw new ConditionFailedException(lang("you.cant.start.war.online.members.difference", issuer));
}
}
@Override
public @NotNull String getId() {
return "can_war_target";
}
}
@@ -0,0 +1,33 @@
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.ClanPlayer;
import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
@SuppressWarnings("unused")
public class ClanMemberCondition extends AbstractParameterCondition<ClanPlayer> {
public ClanMemberCondition(@NotNull SimpleClans plugin) {
super(plugin);
}
@Override
public Class<ClanPlayer> getType() {
return ClanPlayer.class;
}
@Override
public void validateCondition(ConditionContext<BukkitCommandIssuer> context,
BukkitCommandExecutionContext execContext, ClanPlayer value)
throws InvalidCommandArgument {
Conditions.assertClanMember(clanManager, context.getIssuer());
}
@Override
public @NotNull String getId() {
return "clan_member";
}
}
Loaded 100 of 505 files, more files were not shown because too many files have changed in this diff. Show more