Compare commits

..

No commits in common. "master" and "v2.13.4" have entirely different histories.

283 changed files with 10244 additions and 16416 deletions

14
.gitignore vendored
View File

@ -90,7 +90,19 @@ local.properties
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff:
.idea/*
.idea/workspace.xml
.idea/tasks.xml
.idea/dictionaries
.idea/vcs.xml
.idea/jsLibraryMappings.xml
# Sensitive or high-churn files:
.idea/dataSources.ids
.idea/dataSources.xml
.idea/dataSources.local.xml
.idea/sqlDataSources.xml
.idea/dynamic.xml
.idea/uiDesigner.xml
# Gradle:
.idea/gradle.xml

View File

@ -1,8 +1,2 @@
<a href="https://www.massivecraft.com/plugins/factions">![Factions Logotype](https://www.massivecraft.com/wp-content/uploads/2011/07/massivecraft-logotype-plugin-factions-2000.jpg)</a>
<a href="https://www.massivecraft.com/factions">![Factions Logotype](https://www.massivecraft.com/wp-content/uploads/2011/07/massivecraft-logotype-plugin-factions-2000.jpg)</a>
<b>https://www.massivecraft.com/factions</b>
<b>Please read the guide below if you want to compile.</b><br>
<b>https://www.massivecraft.com/about/departments/technology-department/tech-compile</b>
**License**:
This software uses the GNU Lesser General Public License version 3.

View File

@ -1,165 +1,165 @@
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.
GNU LESSER GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
This version of the GNU Lesser General Public License incorporates
the terms and conditions of version 3 of the GNU General Public
License, supplemented by the additional permissions listed below.
0. Additional Definitions.
As used herein, "this License" refers to version 3 of the GNU Lesser
General Public License, and the "GNU GPL" refers to version 3 of the GNU
General Public License.
"The Library" refers to a covered work governed by this License,
other than an Application or a Combined Work as defined below.
An "Application" is any work that makes use of an interface provided
by the Library, but which is not otherwise based on the Library.
Defining a subclass of a class defined by the Library is deemed a mode
of using an interface provided by the Library.
A "Combined Work" is a work produced by combining or linking an
Application with the Library. The particular version of the Library
with which the Combined Work was made is also called the "Linked
Version".
The "Minimal Corresponding Source" for a Combined Work means the
Corresponding Source for the Combined Work, excluding any source code
for portions of the Combined Work that, considered in isolation, are
based on the Application, and not on the Linked Version.
The "Corresponding Application Code" for a Combined Work means the
object code and/or source code for the Application, including any data
and utility programs needed for reproducing the Combined Work from the
Application, but excluding the System Libraries of the Combined Work.
1. Exception to Section 3 of the GNU GPL.
You may convey a covered work under sections 3 and 4 of this License
without being bound by section 3 of the GNU GPL.
2. Conveying Modified Versions.
If you modify a copy of the Library, and, in your modifications, a
facility refers to a function or data to be supplied by an Application
that uses the facility (other than as an argument passed when the
facility is invoked), then you may convey a copy of the modified
version:
a) under this License, provided that you make a good faith effort to
ensure that, in the event an Application does not supply the
function or data, the facility still operates, and performs
whatever part of its purpose remains meaningful, or
b) under the GNU GPL, with none of the additional permissions of
this License applicable to that copy.
3. Object Code Incorporating Material from Library Header Files.
The object code form of an Application may incorporate material from
a header file that is part of the Library. You may convey such object
code under terms of your choice, provided that, if the incorporated
material is not limited to numerical parameters, data structure
layouts and accessors, or small macros, inline functions and templates
(ten or fewer lines in length), you do both of the following:
a) Give prominent notice with each copy of the object code that the
Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the object code with a copy of the GNU GPL and this license
document.
4. Combined Works.
You may convey a Combined Work under terms of your choice that,
taken together, effectively do not restrict modification of the
portions of the Library contained in the Combined Work and reverse
engineering for debugging such modifications, if you also do each of
the following:
a) Give prominent notice with each copy of the Combined Work that
the Library is used in it and that the Library and its use are
covered by this License.
b) Accompany the Combined Work with a copy of the GNU GPL and this license
document.
c) For a Combined Work that displays copyright notices during
execution, include the copyright notice for the Library among
these notices, as well as a reference directing the user to the
copies of the GNU GPL and this license document.
d) Do one of the following:
0) Convey the Minimal Corresponding Source under the terms of this
License, and the Corresponding Application Code in a form
suitable for, and under terms that permit, the user to
recombine or relink the Application with a modified version of
the Linked Version to produce a modified Combined Work, in the
manner specified by section 6 of the GNU GPL for conveying
Corresponding Source.
1) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (a) uses at run time
a copy of the Library already present on the user's computer
system, and (b) will operate properly with a modified version
of the Library that is interface-compatible with the Linked
Version.
e) Provide Installation Information, but only if you would otherwise
be required to provide such information under section 6 of the
GNU GPL, and only to the extent that such information is
necessary to install and execute a modified version of the
Combined Work produced by recombining or relinking the
Application with a modified version of the Linked Version. (If
you use option 4d0, the Installation Information must accompany
the Minimal Corresponding Source and Corresponding Application
Code. If you use option 4d1, you must provide the Installation
Information in the manner specified by section 6 of the GNU GPL
for conveying Corresponding Source.)
5. Combined Libraries.
You may place library facilities that are a work based on the
Library side by side in a single library together with other library
facilities that are not Applications and are not covered by this
License, and convey such a combined library under terms of your
choice, if you do both of the following:
a) Accompany the combined library with a copy of the same work based
on the Library, uncombined with any other library facilities,
conveyed under the terms of this License.
b) Give prominent notice with the combined library that part of it
is a work based on the Library, and explaining where to find the
accompanying uncombined form of the same work.
6. Revised Versions of the GNU Lesser General Public License.
The Free Software Foundation may publish revised and/or new versions
of the GNU Lesser General Public License from time to time. Such new
versions will be similar in spirit to the present version, but may
differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the
Library as you received it specifies that a certain numbered version
of the GNU Lesser General Public License "or any later version"
applies to it, you have the option of following the terms and
conditions either of that published version or of any later version
published by the Free Software Foundation. If the Library as you
received it does not specify a version number of the GNU Lesser
General Public License, you may choose any version of the GNU Lesser
General Public License ever published by the Free Software Foundation.
If the Library as you received it specifies that a proxy can decide
whether future versions of the GNU Lesser General Public License shall
apply, that proxy's public statement of acceptance of any version is
permanent authorization for you to choose that version for the
Library.

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,13 @@
Copyright (c) 2008-2009 Google Inc.
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
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Copyright (c) 2008-2009 Google Inc.
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
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -3,31 +3,19 @@ name: ${project.name}
version: ${project.version}
website: ${project.url}
description: ${project.description}
authors: [Madus, Cayorion, Ulumulu1510, MarkehMe, Brettflan, AlkorZ3]
authors: [Cayorion, Madus, Ulumulu1510, MarkehMe, Brettflan]
depend: [MassiveCore]
softdepend: [PermissionsEx, Permissions, Essentials, EssentialsChat, HeroChat, LocalAreaChat, LWC, ChatManager, AuthMe, Vault, WorldEdit, WorldGuard, WorldGuardExtraFlags]
api-version: 1.13
softdepend: [PermissionsEx, Permissions, Essentials, EssentialsChat, HeroChat, iChat, LocalAreaChat, LWC, nChat, ChatManager, AuthMe, Vault, Spout, WorldEdit, WorldGuard, AuthDB, CaptureThePoints, CombatTag]
permissions:
# -------------------------------------------- #
# THE REAL NODES
# -------------------------------------------- #
# -------------------------------------------- #
# THE REAL NODES
# -------------------------------------------- #
factions.access: {description: manage access, with the proper fperm, default: false}
factions.access.deny: {description: deny faction access, default: false}
factions.access.deny.one: {description: deny access in a single chunk, default: false}
factions.access.deny.fill: {description: deny access by filling, default: false}
factions.access.deny.square: {description: deny access by square and radius, default: false}
factions.access.deny.circle: {description: deny access by circle and radius, default: false}
factions.access.grant: {description: grant faction access, default: false}
factions.access.grant.one: {description: grant access in a single chunk, default: false}
factions.access.grant.fill: {description: grant access by filling, default: false}
factions.access.grant.square: {description: grant access by square and radius, default: false}
factions.access.grant.circle: {description: grant access by circle and radius, default: false}
factions.access.inspect: {description: inspect where someone has access, default: false}
factions.access.faction: {description: grant faction access, with the proper fperm, default: false}
factions.access.player: {description: grant player access, with the proper fperm, default: false}
factions.access.view: {description: view access, default: false}
factions.autofly: {description: enable auto_fly mode, default: false}
factions.override: {description: enable override mode, default: false}
factions.basecommand: {description: use factions base command, default: false}
factions.chunkname: {description: set chunk name, default: false}
factions.claim: {description: claim faction territory, default: false}
factions.claim.one: {description: claim a single chunk, default: false}
factions.claim.auto: {description: claim as you walk around, default: false}
@ -38,21 +26,13 @@ permissions:
factions.create: {description: create new faction, default: false}
factions.description: {description: change faction description, default: false}
factions.disband: {description: disband faction, default: false}
factions.documentation: {description: show documentation, default: false}
factions.documentation.flags: {description: show flag documentation, default: false}
factions.documentation.power: {description: show power documentation, default: false}
factions.documentation.perms: {description: show perms documentation, default: false}
factions.documentation.ranks: {description: show rank documentation, default: false}
factions.documentation.tax: {description: show tax documentation, default: false}
factions.documentation.warps: {description: show warp documentation, default: false}
factions.expansions: {description: list expansions, default: false}
factions.faction: {description: show faction information, default: false}
factions.flag: {description: manage faction flags, default: false}
factions.flag.list: {description: list flags, default: false}
factions.flag.set: {description: set flags, default: false}
factions.flag.show: {description: show flags, default: false}
factions.fly: {description: faction fly, default: false}
factions.fly.other: {description: set faction fly for others, default: false}
factions.home: {description: teleport to faction home, default: false}
factions.invite: {description: manage invites, default: false}
factions.invite.list: {description: list invited players, default: false}
factions.invite.list.other: {description: list invited players of another factions, default: false}
@ -72,57 +52,33 @@ permissions:
factions.money.f2p: {description: transfer f --> p, default: false}
factions.money.p2f: {description: transfer p --> f, default: false}
factions.money.withdraw: {description: withdraw from faction, default: false}
factions.moneyconvert: {description: convert to the new money system, default: false}
factions.motd: {description: faction motd, default: false}
factions.open: {description: set if invitation is required to join, default: false}
factions.perm: {description: change faction permissions, default: false}
factions.perm.list: {description: list perms, default: false}
factions.perm.set: {description: set perms, default: false}
factions.perm.show: {description: show who has perm, default: false}
factions.perm.view: {description: view perms given to, default: false}
factions.perm.viewall: {description: view all perms held by, default: false}
factions.perm.show: {description: show perms, default: false}
factions.player: {description: show player information}
factions.powerboost: {description: manage powerboost, default: false}
factions.powerboost.faction: {description: manage faction powerboost, default: false}
factions.powerboost.faction.add: {description: add to faction powerboost, default: false}
factions.powerboost.faction.multiply: {description: multiply faction powerboost, default: false}
factions.powerboost.faction.set: {description: set faction powerboost, default: false}
factions.powerboost.faction.show: {description: show faction powerboost, default: false}
factions.powerboost.faction.take: {description: take faction powerboost, default: false}
factions.powerboost.player: {description: manage player powerboost, default: false}
factions.powerboost.player.add: {description: add to player powerboost, default: false}
factions.powerboost.player.multiply: {description: multiply player powerboost, default: false}
factions.powerboost.player.set: {description: set player powerboost, default: false}
factions.powerboost.player.show: {description: show player powerboost, default: false}
factions.powerboost.player.take: {description: take player powerboost, default: false}
factions.powerboost.faction: {description: show faction powerboost, default: false}
factions.powerboost.player: {description: show player powerboost, default: false}
factions.powerboost.set: {description: set powerboost, default: false}
factions.rank: {description: manage/show ranks, default: false}
factions.rank.show: {description: show rank, default: false}
factions.rank.set: {description: set rank, default: false}
factions.rank.list: {description: list ranks, default: false}
factions.rank.edit: {description: edit ranks, default: false}
factions.rank.edit.create: {description: create rank, default: false}
factions.rank.edit.name: {description: set rank name, default: false}
factions.rank.edit.prefix: {description: set rank prefix, default: false}
factions.rank.edit.priority: {description: set rank priority, default: false}
factions.rank.edit.delete: {description: delete rank, default: false}
factions.rank.action: {description: change rank, default: false}
factions.relation: {description: manage faction relations, default: false}
factions.relation.list: {description: list all factions with certain relation, default: false}
factions.relation.set: {description: set relation wish to another faction, default: false}
factions.relation.wishes: {description: list the relation wishes, default: false}
factions.seechunk: {description: see the chunk you stand in, default: false}
factions.seechunkold: {description: see the chunk you stand in, default: false}
factions.sethome: {description: set the faction home, default: false}
factions.setpower: {description: set power, default: false}
factions.status: {description: show status, default: false}
factions.tax: {description: manage taxes, default: false}
factions.tax.faction: {description: show faction tax, default: false}
factions.tax.player: {description: show player tax, default: false}
factions.tax.run: {description: run a tax collection, default: false}
factions.tax.set: {description: set taxes, default: false}
factions.name: {description: set faction name, default: false}
factions.title: {description: set player title, default: false}
factions.title.color: {description: set player title with color, default: false}
factions.territorytitles: {description: toggle territory titles, default: false}
factions.top: {description: show faction top, default: false}
factions.unclaim: {description: unclaim faction territory, default: false}
factions.unclaim.one: {description: unclaim a single chunk, default: false}
factions.unclaim.auto: {description: unclaim as you walk around, default: false}
@ -130,17 +86,7 @@ permissions:
factions.unclaim.square: {description: unclaim by square and radius, default: false}
factions.unclaim.circle: {description: unclaim by circle and radius, default: false}
factions.unclaim.all: {description: unclaim all faction land, default: false}
factions.vote: {description: vote in faction votes, default: false}
factions.vote.do: {description: do vote, default: false}
factions.vote.list: {description: list votes, default: false}
factions.vote.show: {description: show vote result, default: false}
factions.vote.create: {description: create a vote, default: false}
factions.vote.remove: {description: remove a vote, default: false}
factions.warp: {description: use warps, default: false}
factions.warp.go: {description: go to a warp, default: false}
factions.warp.list: {description: list warps, default: false}
factions.warp.add: {description: add new warp, default: false}
factions.warp.remove: {description: remove warp, default: false}
factions.unsethome: {description: unset faction home, default: false}
factions.unstuck: {description: teleport to nearest wilderness, default: false}
factions.config: {description: edit the factions config, default: false}
factions.clean: {description: clean the factions database, default: false}
@ -151,22 +97,11 @@ permissions:
factions.*:
children:
factions.access: true
factions.access.deny: true
factions.access.deny.one: true
factions.access.deny.fill: true
factions.access.deny.square: true
factions.access.deny.circle: true
factions.access.grant: true
factions.access.grant.one: true
factions.access.grant.fill: true
factions.access.grant.square: true
factions.access.grant.circle: true
factions.access.inspect: true
factions.access.faction: true
factions.access.player: true
factions.access.view: true
factions.autofly: true
factions.override: true
factions.basecommand: true
factions.chunkname: true
factions.claim: true
factions.claim.one: true
factions.claim.auto: true
@ -178,21 +113,12 @@ permissions:
factions.demote: true
factions.description: true
factions.disband: true
factions.documentation: true
factions.documentation.flags: true
factions.documentation.perms: true
factions.documentation.power: true
factions.documentation.ranks: true
factions.documentation.tax: true
factions.documentation.warps: true
factions.expansions: true
factions.faction: true
factions.flag: true
factions.flag.list: true
factions.flag.set: true
factions.flag.show: true
factions.fly: true
factions.fly.other: true
factions.home: true
factions.invite: true
factions.invite.list: true
@ -215,7 +141,6 @@ permissions:
factions.money.f2p: true
factions.money.p2f: true
factions.money.withdraw: true
factions.moneyconvert: true
factions.motd: true
factions.officer: true
factions.officer.any: true
@ -224,32 +149,11 @@ permissions:
factions.perm.list: true
factions.perm.set: true
factions.perm.show: true
factions.perm.view: true
factions.perm.viewall: true
factions.player: true
factions.powerboost: true
factions.powerboost.faction: true
factions.powerboost.faction.add: true
factions.powerboost.faction.multiply: true
factions.powerboost.faction.set: true
factions.powerboost.faction.show: true
factions.powerboost.faction.take: true
factions.powerboost.player: true
factions.powerboost.player.add: true
factions.powerboost.player.multiply: true
factions.powerboost.player.set: true
factions.powerboost.player.show: true
factions.powerboost.player.take: true
factions.rank: true
factions.rank.show: true
factions.rank.set: true
factions.rank.list: true
factions.rank.edit: true
factions.rank.edit.create: true
factions.rank.edit.name: true
factions.rank.edit.prefix: true
factions.rank.edit.priority: true
factions.rank.edit.delete: true
factions.powerboost.set: true
factions.promote: true
factions.relation: true
factions.relation.list: true
@ -260,16 +164,10 @@ permissions:
factions.sethome: true
factions.setpower: true
factions.status: true
factions.tax: true
factions.tax.faction: true
factions.tax.player: true
factions.tax.run: true
factions.tax.set: true
factions.name: true
factions.title: true
factions.title.color: true
factions.territorytitles: true
factions.top: true
factions.unclaim: true
factions.unclaim.one: true
factions.unclaim.auto: true
@ -279,17 +177,6 @@ permissions:
factions.unclaim.all: true
factions.unsethome: true
factions.unstuck: true
factions.vote: true
factions.vote.do: true
factions.vote.list: true
factions.vote.show: true
factions.vote.create: true
factions.vote.remove: true
factions.warp: true
factions.warp.go: true
factions.warp.list: true
factions.warp.add: true
factions.warp.remove: true
factions.config: true
factions.clean: true
factions.version: true
@ -304,26 +191,17 @@ permissions:
default: false
children:
factions.kit.rank2: true
factions.moneyconvert: true
factions.config: true
factions.clean: true
factions.kit.rank2:
default: false
children:
factions.kit.rank1: true
factions.powerboost.faction.add: true
factions.powerboost.faction.multiply: true
factions.powerboost.faction.set: true
factions.powerboost.faction.take: true
factions.powerboost.player.add: true
factions.powerboost.player.multiply: true
factions.powerboost.player.set: true
factions.powerboost.player.take: true
factions.powerboost.set: true
factions.join.others: true
factions.leader.any: true
factions.officer.any: true
factions.access.any: true
factions.fly.other: true
factions.setpower: true
factions.kit.rank1:
default: false
@ -335,20 +213,10 @@ permissions:
default: false
children:
factions.access: true
factions.access.deny: true
factions.access.deny.one: true
factions.access.deny.fill: true
factions.access.deny.square: true
factions.access.deny.circle: true
factions.access.grant: true
factions.access.grant.one: true
factions.access.grant.fill: true
factions.access.grant.square: true
factions.access.grant.circle: true
factions.access.inspect: true
factions.access.faction: true
factions.access.player: true
factions.access.view: true
factions.basecommand: true
factions.chunkname: true
factions.claim: true
factions.claim.one: true
factions.claim.auto: true
@ -360,19 +228,12 @@ permissions:
factions.demote: true
factions.description: true
factions.disband: true
factions.documentation: true
factions.documentation.flags: true
factions.documentation.perms: true
factions.documentation.power: true
factions.documentation.ranks: true
factions.documentation.warps: true
factions.expansions: true
factions.faction: true
factions.flag: true
factions.flag.list: true
factions.flag.set: true
factions.flag.show: true
factions.fly: true
factions.home: true
factions.invite: true
factions.invite.list: true
@ -399,25 +260,14 @@ permissions:
factions.perm.list: true
factions.perm.set: true
factions.perm.show: true
factions.perm.view: true
factions.perm.viewall: true
factions.player: true
factions.promote: true
factions.powerboost: true
factions.powerboost.faction: true
factions.powerboost.faction.show: true
factions.powerboost.player: true
factions.powerboost.player.show: true
factions.rank: true
factions.rank.show: true
factions.rank.set: true
factions.rank.list: true
factions.rank.edit: true
factions.rank.edit.create: true
factions.rank.edit.name: true
factions.rank.edit.prefix: true
factions.rank.edit.priority: true
factions.rank.edit.delete: true
factions.rank.action: true
factions.relation: true
factions.relation.list: true
factions.relation.set: true
@ -426,16 +276,10 @@ permissions:
factions.seechunkold: true
factions.sethome: true
factions.status: true
factions.tax: true
factions.tax.faction: true
factions.tax.player: true
factions.tax.run: true
factions.tax.set: true
factions.name: true
factions.title: true
factions.title.color: true
factions.territorytitles: true
factions.top: true
factions.unclaim: true
factions.unclaim.one: true
factions.unclaim.auto: true
@ -445,17 +289,6 @@ permissions:
factions.unclaim.all: true
factions.unsethome: true
factions.unstuck: true
factions.vote: true
factions.vote.do: true
factions.vote.list: true
factions.vote.show: true
factions.vote.create: true
factions.vote.remove: true
factions.warp: true
factions.warp.go: true
factions.warp.list: true
factions.warp.add: true
factions.warp.remove: true
factions.version: true
factions.kit.default:
default: true

39
pom.xml
View File

@ -5,7 +5,7 @@
<parent>
<groupId>com.massivecraft.massivesuper</groupId>
<artifactId>MassiveSuper</artifactId>
<version>3.3.4</version>
<version>2.13.4</version>
<relativePath>../MassiveSuper</relativePath>
</parent>
@ -32,10 +32,6 @@
<artifactId>MassiveCore</artifactId>
</dependency>
<!-- WorldEdit -->
<dependency>
<groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit-core</artifactId>
</dependency>
<dependency>
<groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit-bukkit</artifactId>
@ -43,42 +39,23 @@
<!-- WorldGuard -->
<dependency>
<groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-core</artifactId>
</dependency>
<dependency>
<groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-bukkit</artifactId>
</dependency>
<!-- WorldGuardExtraFlags -->
<dependency>
<groupId>net.goldtreeservers</groupId>
<artifactId>worldguardextraflags</artifactId>
<artifactId>worldguard-legacy</artifactId>
</dependency>
<!-- Vault -->
<dependency>
<groupId>net.milkbowl.vault</groupId>
<artifactId>Vault</artifactId>
</dependency>
<!-- Herochat -->
<dependency>
<groupId>com.dthielke.herochat</groupId>
<artifactId>Herochat</artifactId>
</dependency>
<!-- LWC -->
<dependency>
<groupId>com.griefcraft</groupId>
<artifactId>lwc</artifactId>
</dependency>
<!-- PlaceholderAPI -->
<dependency>
<groupId>me.clip</groupId>
<artifactId>placeholderapi</artifactId>
</dependency>
<!-- MineverseChat/VentureChat -->
<dependency>
<groupId>mineverse.Aust1n46.chat</groupId>
<artifactId>MineverseChat</artifactId>
</dependency>
<!-- Dynmap -->
<dependency>
<groupId>us.dynmap</groupId>
<artifactId>dynmap</artifactId>
</dependency>
</dependencies>
<!-- Build -->
@ -100,5 +77,5 @@
</resource>
</resources>
</build>
</project>

View File

@ -1,6 +1,6 @@
package com.massivecraft.factions;
public interface EconomyParticipator extends RelationParticipator
{
boolean msg(String msg, Object... args);
}
package com.massivecraft.factions;
public interface EconomyParticipator extends RelationParticipator
{
boolean msg(String msg, Object... args);
}

View File

@ -1,32 +1,32 @@
package com.massivecraft.factions;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.massivecore.util.extractor.Extractor;
public class ExtractorFactionAccountId implements Extractor
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static ExtractorFactionAccountId i = new ExtractorFactionAccountId();
public static ExtractorFactionAccountId get() { return i; }
// -------------------------------------------- //
// OVERRIDE: EXTRACTOR
// -------------------------------------------- //
@Override
public Object extract(Object o)
{
if (o instanceof Faction)
{
String factionId = ((Faction)o).getId();
if (factionId == null) return null;
return Factions.FACTION_MONEY_ACCOUNT_ID_PREFIX + factionId;
}
return null;
}
}
package com.massivecraft.factions;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.massivecore.util.extractor.Extractor;
public class ExtractorFactionAccountId implements Extractor
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static ExtractorFactionAccountId i = new ExtractorFactionAccountId();
public static ExtractorFactionAccountId get() { return i; }
// -------------------------------------------- //
// OVERRIDE: EXTRACTOR
// -------------------------------------------- //
@Override
public Object extract(Object o)
{
if (o instanceof Faction)
{
String factionId = ((Faction)o).getId();
if (factionId == null) return null;
return Factions.FACTION_MONEY_ACCOUNT_ID_PREFIX + factionId;
}
return null;
}
}

View File

@ -1,51 +1,13 @@
package com.massivecraft.factions;
import com.google.gson.GsonBuilder;
import com.massivecraft.factions.adapter.BoardAdapter;
import com.massivecraft.factions.adapter.BoardMapAdapter;
import com.massivecraft.factions.adapter.RelAdapter;
import com.massivecraft.factions.adapter.TerritoryAccessAdapter;
import com.massivecraft.factions.chat.modifier.ChatModifierLc;
import com.massivecraft.factions.chat.modifier.ChatModifierLp;
import com.massivecraft.factions.chat.modifier.ChatModifierParse;
import com.massivecraft.factions.chat.modifier.ChatModifierRp;
import com.massivecraft.factions.chat.modifier.ChatModifierUc;
import com.massivecraft.factions.chat.modifier.ChatModifierUcf;
import com.massivecraft.factions.chat.tag.ChatTagName;
import com.massivecraft.factions.chat.tag.ChatTagNameforce;
import com.massivecraft.factions.chat.tag.ChatTagRelcolor;
import com.massivecraft.factions.chat.tag.ChatTagRole;
import com.massivecraft.factions.chat.tag.ChatTagRoleprefix;
import com.massivecraft.factions.chat.tag.ChatTagRoleprefixforce;
import com.massivecraft.factions.chat.tag.ChatTagTitle;
import com.massivecraft.factions.cmd.CmdFactions;
import com.massivecraft.factions.chat.ChatActive;
import com.massivecraft.factions.cmd.type.TypeFactionChunkChangeType;
import com.massivecraft.factions.cmd.type.TypeRel;
import com.massivecraft.factions.engine.EngineCanCombatHappen;
import com.massivecraft.factions.engine.EngineChat;
import com.massivecraft.factions.engine.EngineChunkChange;
import com.massivecraft.factions.engine.EngineCleanInactivity;
import com.massivecraft.factions.engine.EngineDenyCommands;
import com.massivecraft.factions.engine.EngineDenyTeleport;
import com.massivecraft.factions.engine.EngineEcon;
import com.massivecraft.factions.engine.EngineExploit;
import com.massivecraft.factions.engine.EngineFlagEndergrief;
import com.massivecraft.factions.engine.EngineFlagExplosion;
import com.massivecraft.factions.engine.EngineFlagFireSpread;
import com.massivecraft.factions.engine.EngineFlagSpawn;
import com.massivecraft.factions.engine.EngineFlagZombiegrief;
import com.massivecraft.factions.engine.EngineFly;
import com.massivecraft.factions.engine.EngineLastActivity;
import com.massivecraft.factions.engine.EngineMotd;
import com.massivecraft.factions.engine.EngineMoveChunk;
import com.massivecraft.factions.engine.EnginePermBuild;
import com.massivecraft.factions.engine.EnginePlayerDamage;
import com.massivecraft.factions.engine.EnginePlayerData;
import com.massivecraft.factions.engine.EnginePower;
import com.massivecraft.factions.engine.EngineSeeChunk;
import com.massivecraft.factions.engine.EngineShow;
import com.massivecraft.factions.engine.EngineTeleportHomeOnDeath;
import com.massivecraft.factions.engine.EngineTerritoryShield;
import com.massivecraft.factions.engine.EngineVisualizations;
import com.massivecraft.factions.entity.Board;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.FactionColl;
@ -53,34 +15,13 @@ import com.massivecraft.factions.entity.MConfColl;
import com.massivecraft.factions.entity.MFlagColl;
import com.massivecraft.factions.entity.MPermColl;
import com.massivecraft.factions.entity.MPlayerColl;
import com.massivecraft.factions.entity.migrator.MigratorFaction001Invitations;
import com.massivecraft.factions.entity.migrator.MigratorFaction002Ranks;
import com.massivecraft.factions.entity.migrator.MigratorFaction003Warps;
import com.massivecraft.factions.entity.migrator.MigratorFaction004WarpsPerms;
import com.massivecraft.factions.entity.migrator.MigratorMConf001EnumerationUtil;
import com.massivecraft.factions.entity.migrator.MigratorMConf002CleanInactivity;
import com.massivecraft.factions.entity.migrator.MigratorMConf003CleanInactivity;
import com.massivecraft.factions.entity.migrator.MigratorMConf004Rank;
import com.massivecraft.factions.entity.migrator.MigratorMConf005Warps;
import com.massivecraft.factions.entity.migrator.MigratorMPerm001Warps;
import com.massivecraft.factions.entity.migrator.MigratorMPerm002MoveStandard;
import com.massivecraft.factions.entity.migrator.MigratorMPlayer001Ranks;
import com.massivecraft.factions.entity.migrator.MigratorMPlayer002UsingAdminMode;
import com.massivecraft.factions.entity.migrator.MigratorTerritoryAccess001Restructure;
import com.massivecraft.factions.event.EventFactionsChunkChangeType;
import com.massivecraft.factions.integration.dynmap.IntegrationDynmap;
import com.massivecraft.factions.integration.lwc.IntegrationLwc;
import com.massivecraft.factions.integration.placeholderapi.IntegrationPlaceholderAPI;
import com.massivecraft.factions.integration.venturechat.IntegrationVentureChat;
import com.massivecraft.factions.integration.worldguard.IntegrationWorldGuard;
import com.massivecraft.factions.mixin.PowerMixin;
import com.massivecraft.factions.task.TaskFlagPermCreate;
import com.massivecraft.factions.task.TaskPlayerPowerUpdate;
import com.massivecraft.factions.task.TaskTax;
import com.massivecraft.massivecore.MassivePlugin;
import com.massivecraft.massivecore.collections.MassiveList;
import com.massivecraft.massivecore.command.type.RegistryType;
import com.massivecraft.massivecore.store.migrator.MigratorUtil;
import com.massivecraft.massivecore.util.MUtil;
import com.massivecraft.massivecore.xlib.gson.GsonBuilder;
import org.bukkit.ChatColor;
import java.util.List;
@ -132,37 +73,12 @@ public class Factions extends MassivePlugin
// TODO: Perhaps this should be placed in the econ integration somewhere?
MUtil.registerExtractor(String.class, "accountId", ExtractorFactionAccountId.get());
MigratorUtil.addJsonRepresentation(Board.class, Board.MAP_TYPE);
MigratorUtil.setTargetVersion(TerritoryAccess.class, 1);
// Activate
this.activateAuto();
this.activate(getClassesActiveChat());
this.activate(this.getClassesActive("chat", ChatActive.class));
}
// These are overriden because the reflection trick was buggy and didn't work on all systems
@Override
public List<Class<?>> getClassesActiveMigrators()
{
return MUtil.list(
MigratorFaction001Invitations.class,
MigratorFaction002Ranks.class,
MigratorFaction003Warps.class,
MigratorFaction004WarpsPerms.class,
MigratorMConf001EnumerationUtil.class,
MigratorMConf002CleanInactivity.class,
MigratorMConf003CleanInactivity.class,
MigratorMConf004Rank.class,
MigratorMConf005Warps.class,
MigratorMPerm001Warps.class,
MigratorMPerm002MoveStandard.class,
MigratorMPlayer001Ranks.class,
MigratorMPlayer002UsingAdminMode.class,
MigratorTerritoryAccess001Restructure.class
);
}
@Override
public List<Class<?>> getClassesActiveColls()
{
@ -174,7 +90,7 @@ public class Factions extends MassivePlugin
// The Board could currently be activated in any order but the current placement is an educated guess.
// In the future we might want to find all chunks from the faction or something similar.
// We also have the /f access system where the player can be granted specific access, possibly supporting the idea of such a reverse index.
return MUtil.list(
return new MassiveList<Class<?>>(
MConfColl.class,
MFlagColl.class,
MPermColl.class,
@ -184,102 +100,17 @@ public class Factions extends MassivePlugin
);
}
@Override
public List<Class<?>> getClassesActiveCommands()
{
return MUtil.list(
CmdFactions.class
);
}
@Override
public List<Class<?>> getClassesActiveIntegrations()
{
return MUtil.list(
IntegrationPlaceholderAPI.class,
IntegrationVentureChat.class,
IntegrationLwc.class,
IntegrationWorldGuard.class,
IntegrationDynmap.class
);
}
@Override
public List<Class<?>> getClassesActiveTasks()
{
return MUtil.list(
TaskTax.class,
TaskFlagPermCreate.class,
TaskPlayerPowerUpdate.class
);
}
@Override
public List<Class<?>> getClassesActiveEngines()
{
return MUtil.list(
EngineCanCombatHappen.class,
EngineChat.class,
EngineChunkChange.class,
EngineCleanInactivity.class,
EngineDenyCommands.class,
EngineDenyTeleport.class,
EngineExploit.class,
EngineFlagEndergrief.class,
EngineFlagExplosion.class,
EngineFlagFireSpread.class,
EngineFlagSpawn.class,
EngineFlagZombiegrief.class,
EngineFly.class,
EngineLastActivity.class,
EngineMotd.class,
EngineMoveChunk.class,
EnginePermBuild.class,
EnginePlayerDamage.class,
EnginePlayerData.class,
EnginePower.class,
EngineSeeChunk.class,
EngineShow.class,
EngineTeleportHomeOnDeath.class,
EngineTerritoryShield.class,
EngineVisualizations.class,
EngineEcon.class
);
}
List<Class<?>> ret = super.getClassesActiveEngines();
@Override
public List<Class<?>> getClassesActiveMixins()
{
return MUtil.list(
PowerMixin.class
);
}
ret.remove(EngineEcon.class);
ret.add(EngineEcon.class);
@Override
public List<Class<?>> getClassesActiveTests()
{
return MUtil.list();
return ret;
}
public List<Class<?>> getClassesActiveChat()
{
return MUtil.list(
ChatModifierLc.class,
ChatModifierLp.class,
ChatModifierParse.class,
ChatModifierRp.class,
ChatModifierUc.class,
ChatModifierUcf.class,
ChatTagName.class,
ChatTagNameforce.class,
ChatTagRelcolor.class,
ChatTagRole.class,
ChatTagRoleprefix.class,
ChatTagRoleprefixforce.class,
ChatTagTitle.class
);
}
@Override
public GsonBuilder getGsonBuilder()
{
@ -287,6 +118,7 @@ public class Factions extends MassivePlugin
.registerTypeAdapter(TerritoryAccess.class, TerritoryAccessAdapter.get())
.registerTypeAdapter(Board.class, BoardAdapter.get())
.registerTypeAdapter(Board.MAP_TYPE, BoardMapAdapter.get())
.registerTypeAdapter(Rel.class, RelAdapter.get())
;
}

View File

@ -78,29 +78,18 @@ public class FactionsIndex
public synchronized void updateAll()
{
if (!MPlayerColl.get().isActive()) throw new IllegalStateException("The MPlayerColl is not yet fully activated.");
MPlayerColl.get().getAll().forEach(this::update);
for (MPlayer mplayer : MPlayerColl.get().getAll())
{
this.update(mplayer);
}
}
public synchronized void update(MPlayer mplayer)
{
if (mplayer == null) throw new NullPointerException("mplayer");
if (!FactionColl.get().isActive()) throw new IllegalStateException("The FactionColl is not yet fully activated.");
// TODO: This is not optimal but here we remove a player from the index when
// the mplayer object is deattached. Optimally it should be removed
// automatically because it is stored as a weak reference.
// But sometimes that doesn't happen so we do this instead.
// Is there a memory leak somewhere?
if (!mplayer.attached())
{
Faction factionIndexed = this.mplayer2faction.remove(mplayer);
if (factionIndexed != null)
{
faction2mplayers.get(factionIndexed).remove(mplayer);
}
return;
}
if (!mplayer.attached()) return;
Faction factionActual = mplayer.getFaction();
Faction factionIndexed = this.getFaction(mplayer);
@ -128,8 +117,11 @@ public class FactionsIndex
public synchronized void update(Faction faction)
{
if (faction == null) throw new NullPointerException("faction");
this.getMPlayers(faction).forEach(this::update);
for (MPlayer mplayer : this.getMPlayers(faction))
{
this.update(mplayer);
}
}
// -------------------------------------------- //
@ -161,7 +153,7 @@ public class FactionsIndex
@Override
public Set<MPlayer> createValue()
{
return Collections.newSetFromMap(new WeakHashMap<>());
return Collections.newSetFromMap(new WeakHashMap<MPlayer, Boolean>());
}
}

View File

@ -1,89 +1,128 @@
package com.massivecraft.factions;
import com.massivecraft.massivecore.Identified;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.util.PermissionUtil;
import org.bukkit.permissions.Permissible;
public enum Perm implements Identified
{
// -------------------------------------------- //
// ENUM
// -------------------------------------------- //
// All of these are referenced in the code
ACCESS_GRANT_ONE,
ACCESS_GRANT_FILL,
ACCESS_GRANT_SQUARE,
ACCESS_GRANT_CIRCLE,
ACCESS_DENY_ONE,
ACCESS_DENY_FILL,
ACCESS_DENY_SQUARE,
ACCESS_DENY_CIRCLE,
AUTOFLY,
CLAIM_ONE,
CLAIM_AUTO,
CLAIM_FILL,
CLAIM_SQUARE,
CLAIM_CIRCLE,
CLAIM_ALL,
UNCLAIM_ONE,
UNCLAIM_AUTO,
UNCLAIM_FILL,
UNCLAIM_SQUARE,
UNCLAIM_CIRCLE,
UNCLAIM_ALL,
OVERRIDE,
FLY,
JOIN_OTHERS,
INVITE_LIST_OTHER,
TITLE_COLOR,
POWERBOOST_SET,
MONEY_BALANCE_ANY,
SETPOWER,
CONFIG,
VERSION,
// These are just here to tell the system that it is seechunk rather than see.chunk
SEECHUNK,
SEECHUNKOLD,
// END OF LIST
;
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
private final String id;
@Override public String getId() { return this.id; }
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
Perm()
{
this.id = PermissionUtil.createPermissionId(Factions.get(), this);
}
// -------------------------------------------- //
// HAS
// -------------------------------------------- //
public boolean has(Permissible permissible, boolean verboose)
{
return PermissionUtil.hasPermission(permissible, this, verboose);
}
public boolean has(Permissible permissible)
{
return PermissionUtil.hasPermission(permissible, this);
}
public void hasOrThrow(Permissible permissible) throws MassiveException
{
PermissionUtil.hasPermissionOrThrow(permissible, this);
}
}
package com.massivecraft.factions;
import com.massivecraft.massivecore.Identified;
import com.massivecraft.massivecore.util.PermissionUtil;
import org.bukkit.permissions.Permissible;
public enum Perm implements Identified
{
// -------------------------------------------- //
// ENUM
// -------------------------------------------- //
ACCESS,
ACCESS_VIEW,
ACCESS_PLAYER,
ACCESS_FACTION,
OVERRIDE,
BASECOMMAND,
CLAIM,
CLAIM_ONE,
CLAIM_AUTO,
CLAIM_FILL,
CLAIM_SQUARE,
CLAIM_CIRCLE,
CLAIM_ALL,
CREATE,
DESCRIPTION,
DISBAND,
EXPANSIONS,
FACTION,
FLAG,
FLAG_LIST,
FLAG_SET,
FLAG_SHOW,
HOME,
INVITE,
INVITE_LIST,
INVITE_LIST_OTHER,
INVITE_ADD,
INVITE_REMOVE,
JOIN,
JOIN_OTHERS,
KICK,
LEAVE,
LIST,
MAP,
MONEY,
MONEY_BALANCE,
MONEY_BALANCE_ANY,
MONEY_DEPOSIT,
MONEY_F2F,
MONEY_F2P,
MONEY_P2F,
MONEY_WITHDRAW,
MOTD,
OPEN,
PERM,
PERM_LIST,
PERM_SET,
PERM_SHOW,
PLAYER,
POWERBOOST,
POWERBOOST_PLAYER,
POWERBOOST_FACTION,
POWERBOOST_SET,
RANK,
RANK_SHOW,
RANK_ACTION,
RELATION,
RELATION_SET,
RELATION_LIST,
RELATION_WISHES,
SEECHUNK,
SEECHUNKOLD,
SETHOME,
SETPOWER,
STATUS,
NAME,
TITLE,
TITLE_COLOR,
TERRITORYTITLES,
UNCLAIM,
UNCLAIM_ONE,
UNCLAIM_AUTO,
UNCLAIM_FILL,
UNCLAIM_SQUARE,
UNCLAIM_CIRCLE,
UNCLAIM_ALL,
UNSETHOME,
UNSTUCK,
CONFIG,
CLEAN,
VERSION,
// END OF LIST
;
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
private final String id;
@Override public String getId() { return this.id; }
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
Perm()
{
this.id = PermissionUtil.createPermissionId(Factions.get(), this);
}
// -------------------------------------------- //
// HAS
// -------------------------------------------- //
public boolean has(Permissible permissible, boolean verboose)
{
return PermissionUtil.hasPermission(permissible, this, verboose);
}
public boolean has(Permissible permissible)
{
return PermissionUtil.hasPermission(permissible, this);
}
}

View File

@ -1,140 +1,146 @@
package com.massivecraft.factions;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.massivecore.Colorized;
import com.massivecraft.massivecore.Named;
import com.massivecraft.massivecore.collections.MassiveSet;
import org.bukkit.ChatColor;
import java.util.Collections;
import java.util.Set;
public enum Rel implements Colorized, Named, MPerm.MPermable
{
// -------------------------------------------- //
// ENUM
// -------------------------------------------- //
ENEMY(
"an enemy", "enemies", "an enemy faction", "enemy factions",
"Enemy"
) { @Override public ChatColor getColor() { return MConf.get().colorEnemy; } },
NEUTRAL(
"someone neutral to you", "those neutral to you", "a neutral faction", "neutral factions",
"Neutral"
) { @Override public ChatColor getColor() { return MConf.get().colorNeutral; } },
TRUCE(
"someone in truce with you", "those in truce with you", "a faction in truce", "factions in truce",
"Truce"
) { @Override public ChatColor getColor() { return MConf.get().colorTruce; } },
ALLY(
"an ally", "allies", "an allied faction", "allied factions",
"Ally"
) { @Override public ChatColor getColor() { return MConf.get().colorAlly; } },
FACTION(
"your faction", "your faction", "your faction", "your faction",
"Faction"
) { @Override public ChatColor getColor() { return MConf.get().colorMember; } },
// END OF LIST
;
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
public int getValue() { return this.ordinal(); }
private final String descPlayerOne;
public String getDescPlayerOne() { return this.descPlayerOne; }
private final String descPlayerMany;
public String getDescPlayerMany() { return this.descPlayerMany; }
private final String descFactionOne;
public String getDescFactionOne() { return this.descFactionOne; }
private final String descFactionMany;
public String getDescFactionMany() { return this.descFactionMany; }
private final Set<String> names;
public Set<String> getNames() { return this.names; }
@Override public String getName() { return this.getNames().iterator().next(); }
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
Rel(String descPlayerOne, String descPlayerMany, String descFactionOne, String descFactionMany, String... names)
{
this.descPlayerOne = descPlayerOne;
this.descPlayerMany = descPlayerMany;
this.descFactionOne = descFactionOne;
this.descFactionMany = descFactionMany;
this.names = Collections.unmodifiableSet(new MassiveSet<>(names));
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public ChatColor getColor()
{
return MConf.get().colorMember;
}
@Override
public String getId()
{
return name();
}
@Override
public String getDisplayName(Object senderObject)
{
return this.getColor() + this.getName();
}
// -------------------------------------------- //
// UTIL
// -------------------------------------------- //
public boolean isAtLeast(Rel rel)
{
return this.getValue() >= rel.getValue();
}
public boolean isAtMost(Rel rel)
{
return this.getValue() <= rel.getValue();
}
public boolean isLessThan(Rel rel)
{
return this.getValue() < rel.getValue();
}
public boolean isMoreThan(Rel rel)
{
return this.getValue() > rel.getValue();
}
// Used for friendly fire.
public boolean isFriend()
{
return this.isAtLeast(TRUCE);
}
@Deprecated
public String getPrefix()
{
return "";
}
}
package com.massivecraft.factions;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.massivecore.Colorized;
import com.massivecraft.massivecore.Named;
import com.massivecraft.massivecore.collections.MassiveSet;
import org.bukkit.ChatColor;
import java.util.Collections;
import java.util.Set;
public enum Rel implements Colorized, Named
{
// -------------------------------------------- //
// ENUM
// -------------------------------------------- //
ENEMY(
"an enemy", "enemies", "an enemy faction", "enemy factions",
"Enemy"
) { @Override public ChatColor getColor() { return MConf.get().colorEnemy; } },
NEUTRAL(
"someone neutral to you", "those neutral to you", "a neutral faction", "neutral factions",
"Neutral"
) { @Override public ChatColor getColor() { return MConf.get().colorNeutral; } },
TRUCE(
"someone in truce with you", "those in truce with you", "a faction in truce", "factions in truce",
"Truce"
) { @Override public ChatColor getColor() { return MConf.get().colorTruce; } },
ALLY(
"an ally", "allies", "an allied faction", "allied factions",
"Ally"
) { @Override public ChatColor getColor() { return MConf.get().colorAlly; } },
RECRUIT(
"a recruit in your faction", "recruits in your faction", "", "",
"Recruit"
) { @Override public String getPrefix() { return MConf.get().prefixRecruit; } },
MEMBER(
"a member in your faction", "members in your faction", "your faction", "your factions",
"Member"
) { @Override public String getPrefix() { return MConf.get().prefixMember; } },
OFFICER(
"an officer in your faction", "officers in your faction", "", "",
"Officer", "Moderator"
) { @Override public String getPrefix() { return MConf.get().prefixOfficer; } },
LEADER(
"your faction leader", "your faction leader", "", "",
"Leader", "Admin", "Owner"
) { @Override public String getPrefix() { return MConf.get().prefixLeader; } },
// END OF LIST
;
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
public int getValue() { return this.ordinal(); }
private final String descPlayerOne;
public String getDescPlayerOne() { return this.descPlayerOne; }
private final String descPlayerMany;
public String getDescPlayerMany() { return this.descPlayerMany; }
private final String descFactionOne;
public String getDescFactionOne() { return this.descFactionOne; }
private final String descFactionMany;
public String getDescFactionMany() { return this.descFactionMany; }
private final Set<String> names;
public Set<String> getNames() { return this.names; }
@Override public String getName() { return this.getNames().iterator().next(); }
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
Rel(String descPlayerOne, String descPlayerMany, String descFactionOne, String descFactionMany, String... names)
{
this.descPlayerOne = descPlayerOne;
this.descPlayerMany = descPlayerMany;
this.descFactionOne = descFactionOne;
this.descFactionMany = descFactionMany;
this.names = Collections.unmodifiableSet(new MassiveSet<>(names));
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public ChatColor getColor()
{
return MConf.get().colorMember;
}
// -------------------------------------------- //
// UTIL
// -------------------------------------------- //
public boolean isAtLeast(Rel rel)
{
return this.getValue() >= rel.getValue();
}
public boolean isAtMost(Rel rel)
{
return this.getValue() <= rel.getValue();
}
public boolean isLessThan(Rel rel)
{
return this.getValue() < rel.getValue();
}
public boolean isMoreThan(Rel rel)
{
return this.getValue() > rel.getValue();
}
public boolean isRank()
{
return this.isAtLeast(Rel.RECRUIT);
}
// Used for friendly fire.
public boolean isFriend()
{
return this.isAtLeast(TRUCE);
}
public String getPrefix()
{
return "";
}
}

View File

@ -1,15 +1,15 @@
package com.massivecraft.factions;
import org.bukkit.ChatColor;
public interface RelationParticipator
{
String describeTo(RelationParticipator observer);
String describeTo(RelationParticipator observer, boolean ucfirst);
Rel getRelationTo(RelationParticipator observer);
Rel getRelationTo(RelationParticipator observer, boolean ignorePeaceful);
ChatColor getColorTo(RelationParticipator observer);
}
package com.massivecraft.factions;
import org.bukkit.ChatColor;
public interface RelationParticipator
{
String describeTo(RelationParticipator observer);
String describeTo(RelationParticipator observer, boolean ucfirst);
Rel getRelationTo(RelationParticipator observer);
Rel getRelationTo(RelationParticipator observer, boolean ignorePeaceful);
ChatColor getColorTo(RelationParticipator observer);
}

View File

@ -1,10 +1,7 @@
package com.massivecraft.factions;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPerm.MPermable;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.factions.util.RelationUtil;
import com.massivecraft.massivecore.collections.MassiveSet;
import java.util.Collection;
@ -24,56 +21,60 @@ public class TerritoryAccess
// default is true
private final boolean hostFactionAllowed;
public boolean isHostFactionAllowed() { return this.hostFactionAllowed; }
// default is empty
private final Set<String> grantedIds;
public Set<String> getGrantedIds() { return this.grantedIds; }
// default is null
private final String chunkName;
public String getChunkName() { return this.chunkName; }
// -------------------------------------------- //
// FIELDS: VERSION
// -------------------------------------------- //
public int version = 1;
private final Set<String> factionIds;
public Set<String> getFactionIds() { return this.factionIds; }
// default is empty
private final Set<String> playerIds;
public Set<String> getPlayerIds() { return this.playerIds; }
// -------------------------------------------- //
// FIELDS: DELTA
// -------------------------------------------- //
// The simple ones
public TerritoryAccess withHostFactionId(String hostFactionId) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName); }
public TerritoryAccess withHostFactionAllowed(Boolean hostFactionAllowed) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName); }
public TerritoryAccess withGrantedIds(Collection<String> grantedIds) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName); }
public TerritoryAccess withChunkName(String chunkName) { return valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName); }
public TerritoryAccess withHostFactionId(String hostFactionId) { return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds); }
public TerritoryAccess withHostFactionAllowed(Boolean hostFactionAllowed) { return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds); }
public TerritoryAccess withFactionIds(Collection<String> factionIds) { return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds); }
public TerritoryAccess withPlayerIds(Collection<String> playerIds) { return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds); }
// The intermediate ones
public TerritoryAccess withGranted(MPermable mpermable, boolean with)
public TerritoryAccess withFactionId(String factionId, boolean with)
{
return withGrantedId(mpermable.getId(), with);
}
public TerritoryAccess withGrantedId(String grantedId, boolean with)
{
if (this.getHostFactionId().equals(grantedId))
if (this.getHostFactionId().equals(factionId))
{
return valueOf(hostFactionId, with, grantedIds, chunkName);
return valueOf(hostFactionId, with, factionIds, playerIds);
}
Set<String> grantedIds = new MassiveSet<>(this.getGrantedIds());
Set<String> factionIds = new MassiveSet<>(this.getFactionIds());
if (with)
{
grantedIds.add(grantedId);
factionIds.add(factionId);
}
else
{
grantedIds.remove(grantedId);
factionIds.remove(factionId);
}
return valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName);
return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds);
}
public TerritoryAccess withPlayerId(String playerId, boolean with)
{
playerId = playerId.toLowerCase();
Set<String> playerIds = new MassiveSet<>(this.getPlayerIds());
if (with)
{
playerIds.add(playerId);
}
else
{
playerIds.remove(playerId);
}
return valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds);
}
// -------------------------------------------- //
// FIELDS: DIRECT
// -------------------------------------------- //
@ -85,80 +86,114 @@ public class TerritoryAccess
return Faction.get(this.getHostFactionId());
}
public Set<MPermable> getGranteds()
public Set<MPlayer> getGrantedMPlayers()
{
return MPerm.idsToMPermables(this.getGrantedIds());
// Create
Set<MPlayer> ret = new MassiveSet<>();
// Fill
for (String playerId : this.getPlayerIds())
{
ret.add(MPlayer.get(playerId));
}
// Return
return ret;
}
public Set<Faction> getGrantedFactions()
{
// Create
Set<Faction> ret = new MassiveSet<>();
// Fill
for (String factionId : this.getFactionIds())
{
Faction faction = Faction.get(factionId);
if (faction == null) continue;
ret.add(faction);
}
// Return
return ret;
}
// -------------------------------------------- //
// PRIVATE CONSTRUCTOR
// -------------------------------------------- //
// Strictly for GSON only
private TerritoryAccess()
{
this.hostFactionId = null;
this.hostFactionAllowed = true;
this.grantedIds = null;
this.chunkName = null;
}
private TerritoryAccess(String hostFactionId, Boolean hostFactionAllowed, Collection<String> grantedIds, String chunkName)
private TerritoryAccess(String hostFactionId, Boolean hostFactionAllowed, Collection<String> factionIds, Collection<String> playerIds)
{
if (hostFactionId == null) throw new NullPointerException("hostFactionId");
if (grantedIds == null) throw new NullPointerException("grantedIds");
if (hostFactionId == null) throw new IllegalArgumentException("hostFactionId was null");
this.hostFactionId = hostFactionId;
Set<String> grantedIdsInner = new MassiveSet<>();
grantedIdsInner.addAll(grantedIds);
if (grantedIdsInner.remove(hostFactionId))
Set<String> factionIdsInner = new MassiveSet<>();
if (factionIds != null)
{
hostFactionAllowed = true;
factionIdsInner.addAll(factionIds);
if (factionIdsInner.remove(hostFactionId))
{
hostFactionAllowed = true;
}
}
this.grantedIds = Collections.unmodifiableSet(grantedIdsInner);
this.factionIds = Collections.unmodifiableSet(factionIdsInner);
Set<String> playerIdsInner = new MassiveSet<>();
if (playerIds != null)
{
for (String playerId : playerIds)
{
playerIdsInner.add(playerId.toLowerCase());
}
}
this.playerIds = Collections.unmodifiableSet(playerIdsInner);
this.hostFactionAllowed = (hostFactionAllowed == null || hostFactionAllowed);
this.chunkName = chunkName;
}
// -------------------------------------------- //
// FACTORY: VALUE OF
// -------------------------------------------- //
public static TerritoryAccess valueOf(String hostFactionId, Boolean hostFactionAllowed, Collection<String> grantedIds, String chunkName)
public static TerritoryAccess valueOf(String hostFactionId, Boolean hostFactionAllowed, Collection<String> factionIds, Collection<String> playerIds)
{
if (hostFactionId == null) throw new NullPointerException("hostFactionId");
if (grantedIds == null) throw new NullPointerException("grantedIds");
return new TerritoryAccess(hostFactionId, hostFactionAllowed, grantedIds, chunkName);
return new TerritoryAccess(hostFactionId, hostFactionAllowed, factionIds, playerIds);
}
public static TerritoryAccess valueOf(String hostFactionId)
{
if (hostFactionId == null) throw new NullPointerException("hostFactionId");
return valueOf(hostFactionId, null, Collections.emptySet(), null);
return valueOf(hostFactionId, null, null, null);
}
// -------------------------------------------- //
// INSTANCE METHODS
// -------------------------------------------- //
public boolean isGranted(MPermable permable)
public boolean isFactionGranted(Faction faction)
{
return isGranted(permable.getId());
String factionId = faction.getId();
if (this.getHostFactionId().equals(factionId))
{
return this.isHostFactionAllowed();
}
return this.getFactionIds().contains(factionId);
}
public boolean isGranted(String permableId)
// Note that the player can have access without being specifically granted.
// The player could for example be a member of a granted faction.
public boolean isMPlayerGranted(MPlayer mplayer)
{
if (permableId.equals(this.hostFactionId)) return this.isHostFactionAllowed();
return this.getGrantedIds().contains(permableId);
String mplayerId = mplayer.getId();
return this.getPlayerIds().contains(mplayerId);
}
// A "default" TerritoryAccess could be serialized as a simple string only.
// The host faction is still allowed (default) and no faction or player has been granted explicit access (default).
public boolean isDefault()
{
return this.isHostFactionAllowed() && this.getGrantedIds().isEmpty() && this.getChunkName() == null;
return this.isHostFactionAllowed() && this.getFactionIds().isEmpty() && this.getPlayerIds().isEmpty();
}
// -------------------------------------------- //
@ -167,18 +202,20 @@ public class TerritoryAccess
public AccessStatus getTerritoryAccess(MPlayer mplayer)
{
if (isGranted(mplayer.getId())) return AccessStatus.ELEVATED;
if (isGranted(mplayer.getRank().getId())) return AccessStatus.ELEVATED;
if (this.getHostFactionId().equals(mplayer.getFaction().getId()))
{
if (this.isHostFactionAllowed()) return AccessStatus.STANDARD;
else return AccessStatus.DECREASED;
}
if (isGranted(mplayer.getFaction().getId())) return AccessStatus.ELEVATED;
if (isGranted(RelationUtil.getRelationOfThatToMe(mplayer, this.getHostFaction()).toString())) return AccessStatus.ELEVATED;
if (this.isMPlayerGranted(mplayer)) return AccessStatus.ELEVATED;
String factionId = mplayer.getFaction().getId();
if (this.getFactionIds().contains(factionId)) return AccessStatus.ELEVATED;
if (this.getHostFactionId().equals(factionId) && !this.isHostFactionAllowed()) return AccessStatus.DECREASED;
return AccessStatus.STANDARD;
}
@Deprecated
public Boolean hasTerritoryAccess(MPlayer mplayer)
{
return this.getTerritoryAccess(mplayer).hasAccess();
}
}

View File

@ -1,14 +1,17 @@
package com.massivecraft.factions.adapter;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.massivecraft.factions.TerritoryAccess;
import com.massivecraft.factions.entity.Board;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.xlib.gson.JsonDeserializationContext;
import com.massivecraft.massivecore.xlib.gson.JsonDeserializer;
import com.massivecraft.massivecore.xlib.gson.JsonElement;
import com.massivecraft.massivecore.xlib.gson.JsonParseException;
import com.massivecraft.massivecore.xlib.gson.JsonSerializationContext;
import com.massivecraft.massivecore.xlib.gson.JsonSerializer;
import java.lang.reflect.Type;
import java.util.Map;
public class BoardAdapter implements JsonDeserializer<Board>, JsonSerializer<Board>
{
@ -27,7 +30,7 @@ public class BoardAdapter implements JsonDeserializer<Board>, JsonSerializer<Boa
@Override
public Board deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
{
return new Board(context.deserialize(json, Board.MAP_TYPE));
return new Board((Map<PS, TerritoryAccess>) context.deserialize(json, Board.MAP_TYPE));
}
@Override

View File

@ -1,14 +1,14 @@
package com.massivecraft.factions.adapter;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.massivecraft.factions.TerritoryAccess;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.xlib.gson.JsonDeserializationContext;
import com.massivecraft.massivecore.xlib.gson.JsonDeserializer;
import com.massivecraft.massivecore.xlib.gson.JsonElement;
import com.massivecraft.massivecore.xlib.gson.JsonObject;
import com.massivecraft.massivecore.xlib.gson.JsonParseException;
import com.massivecraft.massivecore.xlib.gson.JsonSerializationContext;
import com.massivecraft.massivecore.xlib.gson.JsonSerializer;
import java.lang.reflect.Type;
import java.util.Map;

View File

@ -0,0 +1,39 @@
package com.massivecraft.factions.adapter;
import com.massivecraft.factions.Rel;
import com.massivecraft.factions.cmd.type.TypeRel;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.xlib.gson.JsonDeserializationContext;
import com.massivecraft.massivecore.xlib.gson.JsonDeserializer;
import com.massivecraft.massivecore.xlib.gson.JsonElement;
import com.massivecraft.massivecore.xlib.gson.JsonParseException;
import java.lang.reflect.Type;
public class RelAdapter implements JsonDeserializer<Rel>
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private static RelAdapter i = new RelAdapter();
public static RelAdapter get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public Rel deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException
{
try
{
return TypeRel.get().read(json.getAsString());
}
catch (MassiveException e)
{
return null;
}
}
}

View File

@ -1,20 +1,17 @@
package com.massivecraft.factions.adapter;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;
import com.massivecraft.factions.TerritoryAccess;
import com.massivecraft.massivecore.store.migrator.MigratorUtil;
import com.massivecraft.massivecore.xlib.gson.JsonDeserializationContext;
import com.massivecraft.massivecore.xlib.gson.JsonDeserializer;
import com.massivecraft.massivecore.xlib.gson.JsonElement;
import com.massivecraft.massivecore.xlib.gson.JsonObject;
import com.massivecraft.massivecore.xlib.gson.JsonParseException;
import com.massivecraft.massivecore.xlib.gson.JsonPrimitive;
import com.massivecraft.massivecore.xlib.gson.JsonSerializationContext;
import com.massivecraft.massivecore.xlib.gson.JsonSerializer;
import com.massivecraft.massivecore.xlib.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.Collections;
import java.util.Set;
public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>, JsonSerializer<TerritoryAccess>
@ -25,8 +22,8 @@ public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>
public static final String HOST_FACTION_ID = "hostFactionId";
public static final String HOST_FACTION_ALLOWED = "hostFactionAllowed";
public static final String GRANTED_IDS = "grantedIds";
public static final String CHUNK_NAME = "chunkName";
public static final String FACTION_IDS = "factionIds";
public static final String PLAYER_IDS = "playerIds";
public static final Type SET_OF_STRING_TYPE = new TypeToken<Set<String>>(){}.getType();
@ -57,25 +54,29 @@ public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>
// Prepare variables
String hostFactionId = null;
Boolean hostFactionAllowed = null;
Set<String> grantedIds = Collections.emptySet();
String chunkName = null;
Set<String> factionIds = null;
Set<String> playerIds = null;
// Read variables (test old values first)
JsonElement element = null;
element = obj.get(HOST_FACTION_ID);
element = obj.get("ID");
if (element == null) element = obj.get(HOST_FACTION_ID);
hostFactionId = element.getAsString();
element = obj.get(HOST_FACTION_ALLOWED);
element = obj.get("open");
if (element == null) element = obj.get(HOST_FACTION_ALLOWED);
if (element != null) hostFactionAllowed = element.getAsBoolean();
element = obj.get(GRANTED_IDS);
if (element != null) grantedIds = context.deserialize(element, SET_OF_STRING_TYPE);
element = obj.get(CHUNK_NAME);
if (element != null) chunkName = element.getAsString();
return TerritoryAccess.valueOf(hostFactionId, hostFactionAllowed, grantedIds, chunkName);
element = obj.get("factions");
if (element == null) element = obj.get(FACTION_IDS);
if (element != null) factionIds = context.deserialize(element, SET_OF_STRING_TYPE);
element = obj.get("fplayers");
if (element == null) element = obj.get(PLAYER_IDS);
if (element != null) playerIds = context.deserialize(element, SET_OF_STRING_TYPE);
return TerritoryAccess.valueOf(hostFactionId, hostFactionAllowed, factionIds, playerIds);
}
@Override
@ -99,18 +100,16 @@ public class TerritoryAccessAdapter implements JsonDeserializer<TerritoryAccess>
obj.addProperty(HOST_FACTION_ALLOWED, src.isHostFactionAllowed());
}
if (!src.getGrantedIds().isEmpty())
if (!src.getFactionIds().isEmpty())
{
obj.add(GRANTED_IDS, context.serialize(src.getGrantedIds(), SET_OF_STRING_TYPE));
obj.add(FACTION_IDS, context.serialize(src.getFactionIds(), SET_OF_STRING_TYPE));
}
if (src.getChunkName() != null)
if (!src.getPlayerIds().isEmpty())
{
obj.addProperty(CHUNK_NAME, src.getChunkName());
obj.add(PLAYER_IDS, context.serialize(src.getPlayerIds(), SET_OF_STRING_TYPE));
}
obj.add(MigratorUtil.VERSION_FIELD_NAME, new JsonPrimitive(src.version));
return obj;
}

View File

@ -1,116 +1,116 @@
package com.massivecraft.factions.chat;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* The ChatFormater is a system offered by factions for tag parsing.
*
* Note that every tag and modifier id must be lowercase.
* A tag with id "derp" is allowed but not with id "Derp". For that reason the tag {sender} will work but {Sender} wont.
*/
public class ChatFormatter
{
// -------------------------------------------- //
// CONSTANTS
// -------------------------------------------- //
public final static String START = "{";
public final static String END = "}";
public final static String SEPARATOR = "|";
public final static String ESC_START = "\\"+START;
public final static String ESC_END = "\\"+END;
public final static String ESC_SEPARATOR = "\\"+SEPARATOR;
public final static Pattern pattern = Pattern.compile(ESC_START+"([^"+ESC_START+ESC_END+"]+)"+ESC_END);
// -------------------------------------------- //
// FORMAT
// -------------------------------------------- //
public static String format(String msg, CommandSender sender, CommandSender recipient)
{
// We build the return value in this string buffer
StringBuffer ret = new StringBuffer();
// A matcher to match all the tags in the msg
Matcher matcher = pattern.matcher(msg);
// For each tag we find
while (matcher.find())
{
// The fullmatch is something like "{sender|lp|rp}"
String fullmatch = matcher.group(0);
// The submatch is something like "sender|lp|rp"
String submatch = matcher.group(1);
// The parts are something like ["sender", "lp", "rp"]
String[] parts = submatch.split(ESC_SEPARATOR);
// The modifier ids are something like ["lp", "rp"] and tagId something like "sender"
List<String> modifierIds = new ArrayList<>(Arrays.asList(parts));
String tagId = modifierIds.remove(0);
// Fetch tag for the id
ChatTag tag = ChatTag.getTag(tagId);
String replacement;
if (tag == null)
{
// No change if tag wasn't found
replacement = fullmatch;
}
else
{
replacement = compute(tag, modifierIds, sender, recipient);
if (replacement == null)
{
// If a tag or modifier returns null it's the same as opting out.
replacement = fullmatch;
}
}
matcher.appendReplacement(ret, replacement);
}
// Append the rest
matcher.appendTail(ret);
// And finally we return the string value of the buffer we built
return ret.toString();
}
// -------------------------------------------- //
// TAG COMPUTE
// -------------------------------------------- //
public static String compute(ChatTag tag, List<String> modifierIds, CommandSender sender, CommandSender recipient)
{
String ret = tag.getReplacement(sender, recipient);
if (ret == null) return null;
for (String modifierId : modifierIds)
{
// Find the modifier or skip
ChatModifier modifier = ChatModifier.getModifier(modifierId);
if (modifier == null) continue;
// Modify and ignore change if null.
// Modifier can't get or return null.
String modified = modifier.getModified(ret, sender, recipient);
if (modified == null) continue;
ret = modified;
}
return ret;
}
}
package com.massivecraft.factions.chat;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* The ChatFormater is a system offered by factions for tag parsing.
*
* Note that every tag and modifier id must be lowercase.
* A tag with id "derp" is allowed but not with id "Derp". For that reason the tag {sender} will work but {Sender} wont.
*/
public class ChatFormatter
{
// -------------------------------------------- //
// CONSTANTS
// -------------------------------------------- //
public final static String START = "{";
public final static String END = "}";
public final static String SEPARATOR = "|";
public final static String ESC_START = "\\"+START;
public final static String ESC_END = "\\"+END;
public final static String ESC_SEPARATOR = "\\"+SEPARATOR;
public final static Pattern pattern = Pattern.compile(ESC_START+"([^"+ESC_START+ESC_END+"]+)"+ESC_END);
// -------------------------------------------- //
// FORMAT
// -------------------------------------------- //
public static String format(String msg, CommandSender sender, CommandSender recipient)
{
// We build the return value in this string buffer
StringBuffer ret = new StringBuffer();
// A matcher to match all the tags in the msg
Matcher matcher = pattern.matcher(msg);
// For each tag we find
while (matcher.find())
{
// The fullmatch is something like "{sender|lp|rp}"
String fullmatch = matcher.group(0);
// The submatch is something like "sender|lp|rp"
String submatch = matcher.group(1);
// The parts are something like ["sender", "lp", "rp"]
String[] parts = submatch.split(ESC_SEPARATOR);
// The modifier ids are something like ["lp", "rp"] and tagId something like "sender"
List<String> modifierIds = new ArrayList<>(Arrays.asList(parts));
String tagId = modifierIds.remove(0);
// Fetch tag for the id
ChatTag tag = ChatTag.getTag(tagId);
String replacement;
if (tag == null)
{
// No change if tag wasn't found
replacement = fullmatch;
}
else
{
replacement = compute(tag, modifierIds, sender, recipient);
if (replacement == null)
{
// If a tag or modifier returns null it's the same as opting out.
replacement = fullmatch;
}
}
matcher.appendReplacement(ret, replacement);
}
// Append the rest
matcher.appendTail(ret);
// And finally we return the string value of the buffer we built
return ret.toString();
}
// -------------------------------------------- //
// TAG COMPUTE
// -------------------------------------------- //
public static String compute(ChatTag tag, List<String> modifierIds, CommandSender sender, CommandSender recipient)
{
String ret = tag.getReplacement(sender, recipient);
if (ret == null) return null;
for (String modifierId : modifierIds)
{
// Find the modifier or skip
ChatModifier modifier = ChatModifier.getModifier(modifierId);
if (modifier == null) continue;
// Modify and ignore change if null.
// Modifier can't get or return null.
String modified = modifier.getModified(ret, sender, recipient);
if (modified == null) continue;
ret = modified;
}
return ret;
}
}

View File

@ -12,7 +12,7 @@ public abstract class ChatTag extends ChatActive
// -------------------------------------------- //
private final static Map<String, ChatTag> idToTag = new MassiveMap<>();
public static ChatTag getTag(String tagId) { return idToTag.get(tagId); }
public static ChatTag getTag(String tagId) { return (ChatTag) idToTag.get(tagId); }
// -------------------------------------------- //
// CONSTRUCT

View File

@ -1,26 +1,26 @@
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import org.bukkit.command.CommandSender;
public class ChatModifierLc extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierLc() { super("lc"); }
private static ChatModifierLc i = new ChatModifierLc();
public static ChatModifierLc get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
return subject.toLowerCase();
}
}
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import org.bukkit.command.CommandSender;
public class ChatModifierLc extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierLc() { super("lc"); }
private static ChatModifierLc i = new ChatModifierLc();
public static ChatModifierLc get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
return subject.toLowerCase();
}
}

View File

@ -1,28 +1,28 @@
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import org.bukkit.command.CommandSender;
public class ChatModifierLp extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierLp() { super("lp"); }
private static ChatModifierLp i = new ChatModifierLp();
public static ChatModifierLp get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
if (subject.equals("")) return subject;
return " "+subject;
}
}
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import org.bukkit.command.CommandSender;
public class ChatModifierLp extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierLp() { super("lp"); }
private static ChatModifierLp i = new ChatModifierLp();
public static ChatModifierLp get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
if (subject.equals("")) return subject;
return " "+subject;
}
}

View File

@ -1,27 +1,27 @@
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.command.CommandSender;
public class ChatModifierParse extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierParse() { super("parse"); }
private static ChatModifierParse i = new ChatModifierParse();
public static ChatModifierParse get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
return Txt.parse(subject);
}
}
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.command.CommandSender;
public class ChatModifierParse extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierParse() { super("parse"); }
private static ChatModifierParse i = new ChatModifierParse();
public static ChatModifierParse get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
return Txt.parse(subject);
}
}

View File

@ -1,27 +1,27 @@
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import org.bukkit.command.CommandSender;
public class ChatModifierRp extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierRp() { super("rp"); }
private static ChatModifierRp i = new ChatModifierRp();
public static ChatModifierRp get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
if (subject.equals("")) return subject;
return subject+" ";
}
}
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import org.bukkit.command.CommandSender;
public class ChatModifierRp extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierRp() { super("rp"); }
private static ChatModifierRp i = new ChatModifierRp();
public static ChatModifierRp get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
if (subject.equals("")) return subject;
return subject+" ";
}
}

View File

@ -1,26 +1,26 @@
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import org.bukkit.command.CommandSender;
public class ChatModifierUc extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierUc() { super("uc"); }
private static ChatModifierUc i = new ChatModifierUc();
public static ChatModifierUc get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
return subject.toUpperCase();
}
}
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import org.bukkit.command.CommandSender;
public class ChatModifierUc extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierUc() { super("uc"); }
private static ChatModifierUc i = new ChatModifierUc();
public static ChatModifierUc get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
return subject.toUpperCase();
}
}

View File

@ -1,27 +1,27 @@
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.command.CommandSender;
public class ChatModifierUcf extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierUcf() { super("ucf"); }
private static ChatModifierUcf i = new ChatModifierUcf();
public static ChatModifierUcf get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
return Txt.upperCaseFirst(subject);
}
}
package com.massivecraft.factions.chat.modifier;
import com.massivecraft.factions.chat.ChatModifier;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.command.CommandSender;
public class ChatModifierUcf extends ChatModifier
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatModifierUcf() { super("ucf"); }
private static ChatModifierUcf i = new ChatModifierUcf();
public static ChatModifierUcf get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getModified(String subject, CommandSender sender, CommandSender recipient)
{
return Txt.upperCaseFirst(subject);
}
}

View File

@ -1,35 +1,35 @@
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagName extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagName() { super("factions_name"); }
private static ChatTagName i = new ChatTagName();
public static ChatTagName get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
// No "force"
Faction faction = usender.getFaction();
if (faction.isNone()) return "";
return faction.getName();
}
}
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagName extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagName() { super("factions_name"); }
private static ChatTagName i = new ChatTagName();
public static ChatTagName get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
// No "force"
Faction faction = usender.getFaction();
if (faction.isNone()) return "";
return faction.getName();
}
}

View File

@ -1,32 +1,32 @@
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagNameforce extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagNameforce() { super("factions_nameforce"); }
private static ChatTagNameforce i = new ChatTagNameforce();
public static ChatTagNameforce get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
Faction faction = usender.getFaction();
return faction.getName();
}
}
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagNameforce extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagNameforce() { super("factions_nameforce"); }
private static ChatTagNameforce i = new ChatTagNameforce();
public static ChatTagNameforce get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
Faction faction = usender.getFaction();
return faction.getName();
}
}

View File

@ -1,34 +1,34 @@
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagRelcolor extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagRelcolor() { super("factions_relcolor"); }
private static ChatTagRelcolor i = new ChatTagRelcolor();
public static ChatTagRelcolor get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Opt out if no recipient
if (recipient == null) return null;
// Get entities
MPlayer usender = MPlayer.get(sender);
MPlayer urecipient = MPlayer.get(recipient);
return urecipient.getRelationTo(usender).getColor().toString();
}
}
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagRelcolor extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagRelcolor() { super("factions_relcolor"); }
private static ChatTagRelcolor i = new ChatTagRelcolor();
public static ChatTagRelcolor get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Opt out if no recipient
if (recipient == null) return null;
// Get entities
MPlayer usender = MPlayer.get(sender);
MPlayer urecipient = MPlayer.get(recipient);
return urecipient.getRelationTo(usender).getColor().toString();
}
}

View File

@ -1,31 +1,31 @@
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.command.CommandSender;
public class ChatTagRole extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagRole() { super("factions_role"); }
private static ChatTagRole i = new ChatTagRole();
public static ChatTagRole get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
return Txt.upperCaseFirst(usender.getRank().getName().toLowerCase());
}
}
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.command.CommandSender;
public class ChatTagRole extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagRole() { super("factions_role"); }
private static ChatTagRole i = new ChatTagRole();
public static ChatTagRole get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
return Txt.upperCaseFirst(usender.getRole().toString().toLowerCase());
}
}

View File

@ -1,35 +1,35 @@
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagRoleprefix extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagRoleprefix() { super("factions_roleprefix"); }
private static ChatTagRoleprefix i = new ChatTagRoleprefix();
public static ChatTagRoleprefix get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
// No "force"
Faction faction = usender.getFaction();
if (faction.isNone()) return "";
return usender.getRank().getPrefix();
}
}
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagRoleprefix extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagRoleprefix() { super("factions_roleprefix"); }
private static ChatTagRoleprefix i = new ChatTagRoleprefix();
public static ChatTagRoleprefix get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
// No "force"
Faction faction = usender.getFaction();
if (faction.isNone()) return "";
return usender.getRole().getPrefix();
}
}

View File

@ -1,30 +1,30 @@
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagRoleprefixforce extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagRoleprefixforce() { super("factions_roleprefixforce"); }
private static ChatTagRoleprefixforce i = new ChatTagRoleprefixforce();
public static ChatTagRoleprefixforce get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
return usender.getRank().getPrefix();
}
}
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagRoleprefixforce extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagRoleprefixforce() { super("factions_roleprefixforce"); }
private static ChatTagRoleprefixforce i = new ChatTagRoleprefixforce();
public static ChatTagRoleprefixforce get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
return usender.getRole().getPrefix();
}
}

View File

@ -1,31 +1,31 @@
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagTitle extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagTitle() { super("factions_title"); }
private static ChatTagTitle i = new ChatTagTitle();
public static ChatTagTitle get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
if (!usender.hasTitle()) return "";
return usender.getTitle();
}
}
package com.massivecraft.factions.chat.tag;
import com.massivecraft.factions.chat.ChatTag;
import com.massivecraft.factions.entity.MPlayer;
import org.bukkit.command.CommandSender;
public class ChatTagTitle extends ChatTag
{
// -------------------------------------------- //
// INSTANCE & CONSTRUCT
// -------------------------------------------- //
private ChatTagTitle() { super("factions_title"); }
private static ChatTagTitle i = new ChatTagTitle();
public static ChatTagTitle get() { return i; }
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getReplacement(CommandSender sender, CommandSender recipient)
{
// Get entities
MPlayer usender = MPlayer.get(sender);
if (!usender.hasTitle()) return "";
return usender.getTitle();
}
}

View File

@ -1,96 +1,98 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.massivecore.command.MassiveCommandDeprecated;
import com.massivecraft.massivecore.command.MassiveCommandVersion;
import java.util.List;
public class CmdFactions extends FactionsCommand
{
// -------------------------------------------- //
// INSTANCE
// -------------------------------------------- //
private static CmdFactions i = new CmdFactions();
public static CmdFactions get() { return i; }
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
public CmdFactionsDocumentation cmdFactionsDocumentation = new CmdFactionsDocumentation();
public CmdFactionsList cmdFactionsList = new CmdFactionsList();
public CmdFactionsFaction cmdFactionsFaction = new CmdFactionsFaction();
public CmdFactionsPlayer cmdFactionsPlayer = new CmdFactionsPlayer();
public CmdFactionsStatus cmdFactionsStatus = new CmdFactionsStatus();
public CmdFactionsJoin cmdFactionsJoin = new CmdFactionsJoin();
public CmdFactionsLeave cmdFactionsLeave = new CmdFactionsLeave();
public CmdFactionsWarp cmdFactionsWarp = new CmdFactionsWarp();
public CmdFactionsHome cmdFactionsHome = new CmdFactionsHome();
public CmdFactionsSethome cmdFactionsSethome = new CmdFactionsSethome();
public CmdFactionsUnsethome cmdFactionsUnsethome = new CmdFactionsUnsethome();
public CmdFactionsVote cmdFactionsVote = new CmdFactionsVote();
public CmdFactionsMap cmdFactionsMap = new CmdFactionsMap();
public CmdFactionsCreate cmdFactionsCreate = new CmdFactionsCreate();
public CmdFactionsName cmdFactionsName = new CmdFactionsName();
public CmdFactionsDescription cmdFactionsDescription = new CmdFactionsDescription();
public CmdFactionsMotd cmdFactionsMotd = new CmdFactionsMotd();
public CmdFactionsInvite cmdFactionsInvite = new CmdFactionsInvite();
public CmdFactionsKick cmdFactionsKick = new CmdFactionsKick();
public CmdFactionsTitle cmdFactionsTitle = new CmdFactionsTitle();
public CmdFactionsRank cmdFactionsRank = new CmdFactionsRank();
public CmdFactionsMoney cmdFactionsMoney = new CmdFactionsMoney();
public CmdFactionsTop cmdFactionsTop = new CmdFactionsTop();
public CmdFactionsSeeChunk cmdFactionsSeeChunk = new CmdFactionsSeeChunk();
public CmdFactionsSeeChunkOld cmdFactionsSeeChunkOld = new CmdFactionsSeeChunkOld();
public CmdFactionsTerritorytitles cmdFactionsTerritorytitles = new CmdFactionsTerritorytitles();
public CmdFactionsClaim cmdFactionsClaim = new CmdFactionsClaim();
public CmdFactionsUnclaim cmdFactionsUnclaim = new CmdFactionsUnclaim();
public CmdFactionsAccess cmdFactionsAccess = new CmdFactionsAccess();
public CmdFactionsChunkname cmdFactionsChunkname = new CmdFactionsChunkname();
public CmdFactionsRelation cmdFactionsRelation = new CmdFactionsRelation();
public CmdFactionsRelationOld cmdFactionsRelationOldAlly = new CmdFactionsRelationOld("ally");
public CmdFactionsRelationOld cmdFactionsRelationOldTruce = new CmdFactionsRelationOld("truce");
public CmdFactionsRelationOld cmdFactionsRelationOldNeutral = new CmdFactionsRelationOld("neutral");
public CmdFactionsRelationOld cmdFactionsRelationOldEnemy = new CmdFactionsRelationOld("enemy");
public CmdFactionsTax cmdFactionsTax = new CmdFactionsTax();
public CmdFactionsPerm cmdFactionsPerm = new CmdFactionsPerm();
public CmdFactionsFlag cmdFactionsFlag = new CmdFactionsFlag();
public CmdFactionsFly cmdFactionsFly = new CmdFactionsFly();
public CmdFactionsUnstuck cmdFactionsUnstuck = new CmdFactionsUnstuck();
public CmdFactionsOverride cmdFactionsOverride = new CmdFactionsOverride();
public CmdFactionsDisband cmdFactionsDisband = new CmdFactionsDisband();
public CmdFactionsPowerboost cmdFactionsPowerBoost = new CmdFactionsPowerboost();
public CmdFactionsSetpower cmdFactionsSetpower = new CmdFactionsSetpower();
public CmdFactionsMoneyconvert cmdFactionsMoneyconvert = new CmdFactionsMoneyconvert();
public CmdFactionsConfig cmdFactionsConfig = new CmdFactionsConfig();
public CmdFactionsClean cmdFactionsClean = new CmdFactionsClean();
public MassiveCommandVersion cmdFactionsVersion = new MassiveCommandVersion(Factions.get());
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactions()
{
// Old rank stuff
this.addChild(new CmdFactionsRankOld("demote"));
this.addChild(new CmdFactionsRankOld("promote"));
// Deprecated Commands
this.addChild(new MassiveCommandDeprecated(this.cmdFactionsRank, "leader", "owner", "officer", "moderator", "coleader"));
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public List<String> getAliases()
{
return MConf.get().aliasesF;
}
}
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.Perm;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.massivecore.command.MassiveCommandDeprecated;
import com.massivecraft.massivecore.command.MassiveCommandVersion;
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
import java.util.List;
public class CmdFactions extends FactionsCommand
{
// -------------------------------------------- //
// INSTANCE
// -------------------------------------------- //
private static CmdFactions i = new CmdFactions();
public static CmdFactions get() { return i; }
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
public CmdFactionsList cmdFactionsList = new CmdFactionsList();
public CmdFactionsFaction cmdFactionsFaction = new CmdFactionsFaction();
public CmdFactionsPlayer cmdFactionsPlayer = new CmdFactionsPlayer();
public CmdFactionsJoin cmdFactionsJoin = new CmdFactionsJoin();
public CmdFactionsLeave cmdFactionsLeave = new CmdFactionsLeave();
public CmdFactionsHome cmdFactionsHome = new CmdFactionsHome();
public CmdFactionsMap cmdFactionsMap = new CmdFactionsMap();
public CmdFactionsCreate cmdFactionsCreate = new CmdFactionsCreate();
public CmdFactionsName cmdFactionsName = new CmdFactionsName();
public CmdFactionsDescription cmdFactionsDescription = new CmdFactionsDescription();
public CmdFactionsMotd cmdFactionsMotd = new CmdFactionsMotd();
public CmdFactionsSethome cmdFactionsSethome = new CmdFactionsSethome();
public CmdFactionsUnsethome cmdFactionsUnsethome = new CmdFactionsUnsethome();
public CmdFactionsInvite cmdFactionsInvite = new CmdFactionsInvite();
public CmdFactionsKick cmdFactionsKick = new CmdFactionsKick();
public CmdFactionsTitle cmdFactionsTitle = new CmdFactionsTitle();
public CmdFactionsRank cmdFactionsRank = new CmdFactionsRank();
public CmdFactionsRankOld cmdFactionsRankOldLeader = new CmdFactionsRankOld("leader");
public CmdFactionsRankOld cmdFactionsRankOldOwner = new CmdFactionsRankOld("owner");
public CmdFactionsRankOld cmdFactionsRankOldOfficer = new CmdFactionsRankOld("officer");
public CmdFactionsRankOld cmdFactionsRankOldModerator = new CmdFactionsRankOld("moderator");
public CmdFactionsRankOld cmdFactionsRankOldPromote = new CmdFactionsRankOld("promote");
public CmdFactionsRankOld cmdFactionsRankOldDemote = new CmdFactionsRankOld("demote");
public CmdFactionsMoney cmdFactionsMoney = new CmdFactionsMoney();
public CmdFactionsSeeChunk cmdFactionsSeeChunk = new CmdFactionsSeeChunk();
public CmdFactionsSeeChunkOld cmdFactionsSeeChunkOld = new CmdFactionsSeeChunkOld();
public CmdFactionsTerritorytitles cmdFactionsTerritorytitles = new CmdFactionsTerritorytitles();
public CmdFactionsStatus cmdFactionsStatus = new CmdFactionsStatus();
public CmdFactionsClaim cmdFactionsClaim = new CmdFactionsClaim();
public CmdFactionsUnclaim cmdFactionsUnclaim = new CmdFactionsUnclaim();
public CmdFactionsAccess cmdFactionsAccess = new CmdFactionsAccess();
public CmdFactionsRelation cmdFactionsRelation = new CmdFactionsRelation();
public CmdFactionsRelationOld cmdFactionsRelationOldAlly = new CmdFactionsRelationOld("ally");
public CmdFactionsRelationOld cmdFactionsRelationOldTruce = new CmdFactionsRelationOld("truce");
public CmdFactionsRelationOld cmdFactionsRelationOldNeutral = new CmdFactionsRelationOld("neutral");
public CmdFactionsRelationOld cmdFactionsRelationOldEnemy = new CmdFactionsRelationOld("enemy");
public CmdFactionsPerm cmdFactionsPerm = new CmdFactionsPerm();
public CmdFactionsFlag cmdFactionsFlag = new CmdFactionsFlag();
public CmdFactionsUnstuck cmdFactionsUnstuck = new CmdFactionsUnstuck();
public CmdFactionsExpansions cmdFactionsExpansions = new CmdFactionsExpansions();
public CmdFactionsXPlaceholder cmdFactionsTax = new CmdFactionsXPlaceholder("FactionsTax", "tax");
public CmdFactionsXPlaceholder cmdFactionsDynmap = new CmdFactionsXPlaceholder("FactionsDynmap", "dynmap");
public CmdFactionsOverride cmdFactionsOverride = new CmdFactionsOverride();
public CmdFactionsDisband cmdFactionsDisband = new CmdFactionsDisband();
public CmdFactionsPowerBoost cmdFactionsPowerBoost = new CmdFactionsPowerBoost();
public CmdFactionsSetpower cmdFactionsSetpower = new CmdFactionsSetpower();
public CmdFactionsConfig cmdFactionsConfig = new CmdFactionsConfig();
public CmdFactionsClean cmdFactionsClean = new CmdFactionsClean();
public MassiveCommandVersion cmdFactionsVersion = new MassiveCommandVersion(Factions.get()).setAliases("v", "version").addRequirements(RequirementHasPerm.get(Perm.VERSION));
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactions()
{
// Deprecated Commands
this.addChild(new MassiveCommandDeprecated(this.cmdFactionsClaim.cmdFactionsClaimAuto, "autoclaim"));
this.addChild(new MassiveCommandDeprecated(this.cmdFactionsUnclaim.cmdFactionsUnclaimAll, "unclaimall"));
this.addChild(new MassiveCommandDeprecated(this.cmdFactionsFlag, "open"));
this.addChild(new MassiveCommandDeprecated(this.cmdFactionsFaction, "show", "who"));
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public List<String> getAliases()
{
return MConf.get().aliasesF;
}
}

View File

@ -9,9 +9,8 @@ public class CmdFactionsAccess extends FactionsCommand
// -------------------------------------------- //
public CmdFactionsAccessView cmdFactionsAccessView = new CmdFactionsAccessView();
public CmdFactionsAccessGrant cmdFactionsAccessGrant = new CmdFactionsAccessGrant();
public CmdFactionsAccessDeny cmdFactionsAccessDeny = new CmdFactionsAccessDeny();
public CmdFactionsAccessInspect cmdFactionsAccessInspect = new CmdFactionsAccessInspect();
public CmdFactionsAccessPlayer cmdFactionsAccessPlayer = new CmdFactionsAccessPlayer();
public CmdFactionsAccessFaction cmdFactionsAccessFaction = new CmdFactionsAccessFaction();
// -------------------------------------------- //
// CONSTRUCT

View File

@ -1,16 +1,18 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.RelationParticipator;
import com.massivecraft.factions.TerritoryAccess;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPerm.MPermable;
import com.massivecraft.factions.util.AsciiMap;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.ps.PSFormatHumanSpace;
import com.massivecraft.massivecore.util.Txt;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public abstract class CmdFactionsAccessAbstract extends FactionsCommand
@ -36,69 +38,40 @@ public abstract class CmdFactionsAccessAbstract extends FactionsCommand
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void senderFields(boolean set)
public void perform() throws MassiveException
{
super.senderFields(set);
if (set)
{
chunk = PS.valueOf(me.getLocation()).getChunk(true);
ta = BoardColl.get().getTerritoryAccessAt(chunk);
hostFaction = ta.getHostFaction();
}
else
{
chunk = null;
ta = null;
hostFaction = null;
}
chunk = PS.valueOf(me.getLocation()).getChunk(true);
ta = BoardColl.get().getTerritoryAccessAt(chunk);
hostFaction = ta.getHostFaction();
this.innerPerform();
}
public abstract void innerPerform() throws MassiveException;
public void sendAccessInfo()
{
String chunkDesc = AsciiMap.getChunkDescWithName(chunk, ta);
Object title = "Access" + chunkDesc;
Object title = "Access at " + chunk.toString(PSFormatHumanSpace.get());
title = Txt.titleize(title);
message(title);
msg("<k>Host Faction: %s", hostFaction.describeTo(msender, true));
msg("<k>Host Faction Allowed: %s", ta.isHostFactionAllowed() ? Txt.parse("<lime>TRUE") : Txt.parse("<rose>FALSE"));
msg("<k>Granted to: %s", CmdFactionsPermShow.permablesToDisplayString(ta.getGranteds(), msender));
msg("<k>Granted Players: %s", describeRelationParticipators(ta.getGrantedMPlayers(), msender));
msg("<k>Granted Factions: %s", describeRelationParticipators(ta.getGrantedFactions(), msender));
}
public void setAccess(Collection<PS> chunks, MPermable mpermable, boolean granted)
public static String describeRelationParticipators(Collection<? extends RelationParticipator> relationParticipators, RelationParticipator observer)
{
chunks.forEach(chunk -> setAccess(chunk, mpermable, granted));
}
public void setAccess(PS chunk, MPermable mpermable, boolean granted)
{
TerritoryAccess ta = BoardColl.get().getTerritoryAccessAt(chunk);
Faction faction = ta.getHostFaction();
String chunkDesc = AsciiMap.getChunkDescWithName(chunk, ta);
String grantedDenied = granted ? "granted" : "denied";
String mpermableDesc = mpermable.getDisplayName(msender);
if ( ! MPerm.getPermAccess().has(msender, faction, false))
if (relationParticipators.size() == 0) return Txt.parse("<silver><em>none");
List<String> descriptions = new ArrayList<>();
for (RelationParticipator relationParticipator : relationParticipators)
{
msg("<b>You do not have permission to edit access%s<b>.", chunkDesc);
return;
descriptions.add(relationParticipator.describeTo(observer));
}
if (ta.isGranted(mpermable) == granted)
{
msg("<b>Access%s <b>is already %s to %s<b>.", chunkDesc, grantedDenied, mpermableDesc);
return;
}
ta = ta.withGranted(mpermable, granted);
BoardColl.get().setTerritoryAccessAt(chunk, ta);
msg("<i>Access%s<i> is now %s to %s<i>.", chunkDesc, grantedDenied, mpermableDesc);
return Txt.implodeCommaAnd(descriptions, Txt.parse("<i>, "), Txt.parse(" <i>and "));
}
}

View File

@ -1,26 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
public class CmdFactionsAccessDeny extends CmdFactionsAccessAbstract
{
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
public CmdFactionsAccessSetOne cmdFactionsAccessDenyOne = new CmdFactionsAccessSetOne(false);
public CmdFactionsAccessSetSquare cmdFactionsAccessDenySquare = new CmdFactionsAccessSetSquare(false);
public CmdFactionsAccessSetCircle cmdFactionsAccessDenyCircle = new CmdFactionsAccessSetCircle(false);
public CmdFactionsAccessSetFill cmdFactionsAccessDenyFill = new CmdFactionsAccessSetFill(false);
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessDeny()
{
// Requirements
this.addRequirements(RequirementIsPlayer.get());
}
}

View File

@ -0,0 +1,45 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanYes;
public class CmdFactionsAccessFaction extends CmdFactionsAccessAbstract
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessFaction()
{
// Parameters
this.addParameter(TypeFaction.get(), "faction");
this.addParameter(TypeBooleanYes.get(), "yes/no", "toggle");
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void innerPerform() throws MassiveException
{
// Args
Faction faction = this.readArg();
boolean newValue = this.readArg(!ta.isFactionGranted(faction));
// MPerm
if (!MPerm.getPermAccess().has(msender, hostFaction, true)) return;
// Apply
ta = ta.withFactionId(faction.getId(), newValue);
BoardColl.get().setTerritoryAccessAt(chunk, ta);
// Inform
this.sendAccessInfo();
}
}

View File

@ -1,26 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
public class CmdFactionsAccessGrant extends CmdFactionsAccessAbstract
{
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
public CmdFactionsAccessSetOne cmdFactionsAccessGrantOne = new CmdFactionsAccessSetOne(true);
public CmdFactionsAccessSetSquare cmdFactionsAccessGrantSquare = new CmdFactionsAccessSetSquare(true);
public CmdFactionsAccessSetCircle cmdFactionsAccessGrantCircle = new CmdFactionsAccessSetCircle(true);
public CmdFactionsAccessSetFill cmdFactionsAccessGrantFill = new CmdFactionsAccessSetFill(true);
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessGrant()
{
// Requirements
this.addRequirements(RequirementIsPlayer.get());
}
}

View File

@ -1,96 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.cmd.type.TypeMPermable;
import com.massivecraft.factions.entity.Board;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPerm.MPermable;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.collections.MassiveMap;
import com.massivecraft.massivecore.mixin.MixinWorld;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.ps.PSFormatHumanSpace;
import com.massivecraft.massivecore.util.Txt;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.stream.Collectors;
public class CmdFactionsAccessInspect extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessInspect()
{
// Parameters
this.addParameter(TypeMPermable.get(), "rank/rel/player/faction");
this.addParameter(TypeFaction.get(), "faction", "your");
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
// Parameter
Faction faction = this.readArgAt(1, msenderFaction);
MPermable mpermable = TypeMPermable.get(faction).read(this.argAt(0), sender);
String factionId = faction.getId();
// Check if they have access perms, unless they are checking for their own access
if (mpermable != msender && mpermable != msenderFaction && mpermable != msender.getRank())
{
if ( ! MPerm.getPermAccess().has(msender, faction, true)) return;
}
// Turn into id->chunks
// And filter the ones that are empty
Map<String, Set<PS>> world2Chunks = new MassiveMap<>();
for (Board board : BoardColl.get().getAll())
{
String worldId = board.getId();
Set<PS> chunks = board.getMap().entrySet().stream()
.filter(e -> e.getValue().getHostFactionId().equals(factionId))
.filter(e -> e.getValue().isGranted(mpermable))
.map(Entry::getKey)
.collect(Collectors.toSet());
if ( ! chunks.isEmpty()) world2Chunks.put(worldId, chunks);
}
if (world2Chunks.isEmpty())
{
msg("%s <i>has no special access in <reset>%s<i>.", mpermable.getDisplayName(msender), faction.describeTo(msender));
return;
}
msg("%s <i>has special access in <reset>%s <i>in the following chunks:", mpermable.getDisplayName(msender), faction.describeTo(msender));
for (Entry<String, Set<PS>> entry : world2Chunks.entrySet())
{
String worldId = entry.getKey();
Set<PS> chunks = entry.getValue();
String worldName = MixinWorld.get().getWorldDisplayName(worldId);
// Remove world from chunks
List<String> chunkNames = chunks.stream()
.map(PS::getChunkCoords)
.map(PSFormatHumanSpace.get()::format)
.collect(Collectors.toList());
String chunkDesc = Txt.implodeCommaAnd(chunkNames, Txt.parse("<i>"));
msg("%s<i> (%d): <reset>%s", worldName, chunks.size(), chunkDesc);
}
}
}

View File

@ -0,0 +1,45 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeMPlayer;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanYes;
public class CmdFactionsAccessPlayer extends CmdFactionsAccessAbstract
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessPlayer()
{
// Parameters
this.addParameter(TypeMPlayer.get(), "player");
this.addParameter(TypeBooleanYes.get(), "yes/no", "toggle");
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void innerPerform() throws MassiveException
{
// Args
MPlayer mplayer = this.readArg();
boolean newValue = this.readArg(!ta.isMPlayerGranted(mplayer));
// MPerm
if (!MPerm.getPermAccess().has(msender, hostFaction, true)) return;
// Apply
ta = ta.withPlayerId(mplayer.getId(), newValue);
BoardColl.get().setTerritoryAccessAt(chunk, ta);
// Inform
this.sendAccessInfo();
}
}

View File

@ -1,45 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Perm;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.util.ChunkUtil;
import java.util.Set;
public class CmdFactionsAccessSetCircle extends CmdFactionsAccessSetXRadius
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessSetCircle(boolean grant)
{
// Super
super(grant);
// Aliases
this.addAliases("circle");
// Requirements
this.addRequirements(RequirementIsPlayer.get());
Perm perm = grant ? Perm.ACCESS_GRANT_CIRCLE : Perm.ACCESS_DENY_CIRCLE;
this.addRequirements(RequirementHasPerm.get(perm));
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public Set<PS> getChunks() throws MassiveException
{
// Common Startup
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
return ChunkUtil.getChunksCircle(chunk, this.getRadius());
}
}

View File

@ -1,56 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Perm;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.util.ChunkUtil;
import java.util.Set;
import java.util.function.Predicate;
public class CmdFactionsAccessSetFill extends CmdFactionsAccessSetXSimple
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessSetFill(boolean claim)
{
// Super
super(claim);
// Aliases
this.addAliases("fill");
// Requirements
this.addRequirements(RequirementIsPlayer.get());
Perm perm = claim ? Perm.ACCESS_GRANT_FILL : Perm.ACCESS_DENY_FILL;
this.addRequirements(RequirementHasPerm.get(perm));
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public Set<PS> getChunks() throws MassiveException
{
// Common Startup
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
// What faction (aka color) resides there?
// NOTE: Wilderness/None is valid.
final Faction color = BoardColl.get().getFactionAt(chunk);
// Calculate
int max = MConf.get().setFillMax;
Predicate<PS> matcher = ps -> BoardColl.get().getFactionAt(ps) == color;
return ChunkUtil.getChunkArea(chunk, matcher, max);
}
}

View File

@ -1,43 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Perm;
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.ps.PS;
import java.util.Collections;
import java.util.Set;
public class CmdFactionsAccessSetOne extends CmdFactionsAccessSetXSimple
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessSetOne(boolean claim)
{
// Super
super(claim);
// Aliases
this.addAliases("one");
// Requirements
this.addRequirements(RequirementIsPlayer.get());
Perm perm = claim ? Perm.ACCESS_GRANT_ONE : Perm.ACCESS_DENY_ONE;
this.addRequirements(RequirementHasPerm.get(perm));
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public Set<PS> getChunks()
{
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
return Collections.singleton(chunk);
}
}

View File

@ -1,45 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Perm;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.util.ChunkUtil;
import java.util.Set;
public class CmdFactionsAccessSetSquare extends CmdFactionsAccessSetXRadius
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessSetSquare(boolean grant)
{
// Super
super(grant);
// Aliases
this.addAliases("square");
// Requirements
this.addRequirements(RequirementIsPlayer.get());
Perm perm = grant ? Perm.ACCESS_GRANT_SQUARE : Perm.ACCESS_DENY_SQUARE;
this.addRequirements(RequirementHasPerm.get(perm));
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public Set<PS> getChunks() throws MassiveException
{
// Common Startup
final PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
return ChunkUtil.getChunksSquare(chunk, this.getRadius());
}
}

View File

@ -1,68 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeMPermable;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPerm.MPermable;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.ps.PS;
import java.util.Set;
public abstract class CmdFactionsAccessSetX extends CmdFactionsAccessAbstract
{
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
private boolean grant = true;
public boolean isGranting() { return this.grant; }
public void setGranting(boolean grant) { this.grant = grant; }
private int mpermableArgIndex = 0;
public int getMPermableArgIndex() { return this.mpermableArgIndex; }
public void setMPermableArgIndex(int mpermableArgIndex) { this.mpermableArgIndex = mpermableArgIndex; }
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessSetX(boolean grant)
{
this.setGranting(grant);
this.setSetupEnabled(false);
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
// Args
final MPermable mpermable = this.getMPermable(hostFaction);
final Set<PS> chunks = this.getChunks();
if (chunks == null) throw new NullPointerException("chunks");
// Apply / Inform
setAccess(chunks, mpermable, this.isGranting());
}
// -------------------------------------------- //
// ABSTRACT
// -------------------------------------------- //
public abstract Set<PS> getChunks() throws MassiveException;
// -------------------------------------------- //
// EXTRAS
// -------------------------------------------- //
public MPermable getMPermable(Faction faction) throws MassiveException
{
String arg = this.argAt(this.getMPermableArgIndex());
return TypeMPermable.get(faction).read(arg, sender);
}
}

View File

@ -1,51 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeMPermable;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.type.primitive.TypeInteger;
public abstract class CmdFactionsAccessSetXRadius extends CmdFactionsAccessSetX
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessSetXRadius(boolean claim)
{
// Super
super(claim);
// Parameters
this.addParameter(TypeInteger.get(), "radius");
this.addParameter(TypeMPermable.get(), "rank/rel/faction/player");
this.setMPermableArgIndex(1);
}
// -------------------------------------------- //
// EXTRAS
// -------------------------------------------- //
public Integer getRadius() throws MassiveException
{
int radius = this.readArgAt(0);
// Radius Claim Min
if (radius < 1)
{
throw new MassiveException().setMsg("<b>If you specify a radius, it must be at least 1.");
}
// Radius Claim Max
if (radius > MConf.get().setRadiusMax && ! msender.isOverriding())
{
throw new MassiveException().setMsg("<b>The maximum radius allowed is <h>%s<b>.", MConf.get().setRadiusMax);
}
return radius;
}
}

View File

@ -1,21 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeMPermable;
public abstract class CmdFactionsAccessSetXSimple extends CmdFactionsAccessSetX
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsAccessSetXSimple(boolean claim)
{
// Super
super(claim);
// Parameters
this.addParameter(TypeMPermable.get(), "rank/rel/player/faction");
this.setMPermableArgIndex(0);
}
}

View File

@ -7,7 +7,7 @@ public class CmdFactionsAccessView extends CmdFactionsAccessAbstract
// -------------------------------------------- //
@Override
public void perform()
public void innerPerform()
{
this.sendAccessInfo();
}

View File

@ -1,83 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.TerritoryAccess;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.util.AsciiMap;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.command.type.TypeNullable;
import com.massivecraft.massivecore.command.type.primitive.TypeString;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.util.MUtil;
import com.massivecraft.massivecore.util.Txt;
public class CmdFactionsChunkname extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsChunkname()
{
// Parameters
this.addParameter(TypeNullable.get(TypeString.get()), "name", "read");
this.addRequirements(RequirementIsPlayer.get());
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
PS chunk = PS.valueOf(me.getLocation()).getChunk(true);
TerritoryAccess ta = BoardColl.get().getTerritoryAccessAt(chunk);
if (!this.argIsSet(0))
{
String name = ta.getChunkName();
if (name == null)
{
msg("<i>This chunk has no name.");
}
else
{
msg("<i>This chunk is called <h>%s<i>.", name);
}
return;
}
// MPerm
if (!MPerm.getPermTerritory().has(msender, msenderFaction, true)) return;
// Args
String target = this.readArg();
if (target != null)
{
target = target.trim();
target = Txt.parse(target);
}
String old = ta.getChunkName();
// NoChange
if (MUtil.equals(old, target))
{
if (old == null)
{
throw new MassiveException().addMsg("<b>This chunk already has no name.");
}
throw new MassiveException().addMsg("<b>The name for this chunk is already <h>%s<b>.", old);
}
ta = ta.withChunkName(target);
BoardColl.get().setTerritoryAccessAt(chunk, ta);
String chunkDesc = AsciiMap.getChunkDesc(chunk);
msg("<i>The chunk name%s<i> is now %s.", chunkDesc, target);
}
}

View File

@ -7,7 +7,6 @@ import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import com.massivecraft.factions.entity.Invitation;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.factions.entity.MPlayerColl;
import com.massivecraft.massivecore.MassiveException;
@ -145,11 +144,11 @@ public class CmdFactionsClean extends FactionsCommand
TerritoryAccess territoryAccess = entry.getValue();
boolean changed = false;
for (String grantedIds : territoryAccess.getGrantedIds())
for (String factionId : territoryAccess.getFactionIds())
{
if (MPerm.idToMPermableOptional(grantedIds).isPresent()) continue;
if (FactionColl.get().containsId(factionId)) continue;
territoryAccess = territoryAccess.withGrantedId(grantedIds, false);
territoryAccess = territoryAccess.withFactionId(factionId, false);
ret += 1;
changed = true;
}

View File

@ -1,6 +1,7 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.Rel;
import com.massivecraft.factions.cmd.req.ReqHasntFaction;
import com.massivecraft.factions.cmd.type.TypeFactionNameStrict;
import com.massivecraft.factions.entity.Faction;
@ -26,7 +27,7 @@ public class CmdFactionsCreate extends FactionsCommand
this.addAliases("new");
// Parameters
this.addParameter(TypeFactionNameStrict.get(), "name").setDesc("the name of your new faction");
this.addParameter(TypeFactionNameStrict.get(), "name");
// Requirements
this.addRequirements(ReqHasntFaction.get());
@ -54,7 +55,7 @@ public class CmdFactionsCreate extends FactionsCommand
Faction faction = FactionColl.get().create(factionId);
faction.setName(newName);
msender.setRank(faction.getLeaderRank());
msender.setRole(Rel.LEADER);
msender.setFaction(faction);
EventFactionsMembershipChange joinEvent = new EventFactionsMembershipChange(sender, msender, faction, MembershipChangeReason.CREATE);

View File

@ -17,7 +17,7 @@ public class CmdFactionsDescription extends FactionsCommand
public CmdFactionsDescription()
{
// Parameters
this.addParameter(TypeString.get(), "desc", true).setDesc("the new faction desciption");
this.addParameter(TypeString.get(), "desc", true);
// Requirements
this.addRequirements(ReqHasFaction.get());

View File

@ -12,8 +12,6 @@ import com.massivecraft.factions.event.EventFactionsDisband;
import com.massivecraft.factions.event.EventFactionsMembershipChange;
import com.massivecraft.factions.event.EventFactionsMembershipChange.MembershipChangeReason;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.type.primitive.TypeStringConfirmation;
import com.massivecraft.massivecore.util.ConfirmationUtil;
import com.massivecraft.massivecore.util.IdUtil;
import com.massivecraft.massivecore.util.Txt;
@ -26,8 +24,7 @@ public class CmdFactionsDisband extends FactionsCommand
public CmdFactionsDisband()
{
// Parameters
this.addParameter(TypeFaction.get(), "faction");
this.addParameter(TypeStringConfirmation.get(), "confirmation", "");
this.addParameter(TypeFaction.get(), "faction", "you");
}
// -------------------------------------------- //
@ -38,10 +35,7 @@ public class CmdFactionsDisband extends FactionsCommand
public void perform() throws MassiveException
{
// Args
Faction faction = this.readArg();
String confirmationString = this.readArg(null);
if (MConf.get().requireConfirmationForFactionDisbanding) ConfirmationUtil.tryConfirm(this);
Faction faction = this.readArg(msenderFaction);
// MPerm
if ( ! MPerm.getPermDisband().has(msender, faction, true)) return;
@ -49,7 +43,8 @@ public class CmdFactionsDisband extends FactionsCommand
// Verify
if (faction.getFlag(MFlag.getFlagPermanent()))
{
throw new MassiveException().addMsg("<i>This faction is designated as permanent, so you cannot disband it.");
msg("<i>This faction is designated as permanent, so you cannot disband it.");
return;
}
// Event

View File

@ -1,28 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Factions;
import org.bukkit.ChatColor;
public class CmdFactionsDocumentation extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsDocumentation()
{
String web = Factions.get().getDescription().getWebsite();
this.setHelp(mson("More help can be found at ", mson(web).link(web).color(ChatColor.AQUA)));
}
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
public CmdFactionsDocumentationPower cmdFactionsDocumentationPower = new CmdFactionsDocumentationPower();
public CmdFactionsDocumentationRanks cmdFactionsDocumentationRanks = new CmdFactionsDocumentationRanks();
public CmdFactionsDocumentationWarps cmdFactionsDocumentationWarps = new CmdFactionsDocumentationWarps();
public CmdFactionsDocumentationFlags cmdFactionsDocumentationFlags = new CmdFactionsDocumentationFlags();
public CmdFactionsDocumentationPerms cmdFactionsDocumentationPerms = new CmdFactionsDocumentationPerms();
}

View File

@ -1,39 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.entity.MFlag;
import com.massivecraft.factions.entity.MFlagColl;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.util.Txt;
import java.util.List;
import java.util.stream.Collectors;
public class CmdFactionsDocumentationFlags extends FactionsCommandDocumentation
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsDocumentationFlags()
{
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
msgDoc("Flags are a way to give certain factions certain attributes " +
" such as disabling pvp or enabling friendly fire.");
msgDoc("To see all the flags type:");
message(CmdFactions.get().cmdFactionsFlag.cmdFactionsFlagList.getTemplate(false, true, sender));
List<String> flags = MFlagColl.get().getAll(MFlag::isEditable).stream().map(flag -> Txt.parse("<h>%s", flag.getName())).collect(Collectors.toList());
String str = Txt.implodeCommaAndDot(flags, Txt.parse("<i>"));
msgDoc("The flags you can edit for your faction are: %s", str);
}
}

View File

@ -1,45 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.massivecore.MassiveException;
public class CmdFactionsDocumentationPerms extends FactionsCommandDocumentation
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsDocumentationPerms()
{
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
msgDoc("Permissions decide who can do what in your faction. " +
"Permissions can be given to a rank, a player, a relation, " +
"everyone in another faction or everyone with a specific rank in another faction.");
msgDoc("Because perms can be given to all of these groups individually, it allows for extreme degrees of fine tuning.");
msgDoc("To list all permissions type:");
message(CmdFactions.get().cmdFactionsPerm.cmdFactionsPermList.getTemplate(false, true, sender));
msgDoc("To see who has a specific perm type:");
message(CmdFactions.get().cmdFactionsPerm.cmdFactionsPermShow.getTemplate(false, true, sender));
msgDoc("Per default permissions are only granted to ranks within your faction " +
"and a few perms are given to allies, but if you have changed it that will be displayed by the command above.");
msgDoc("When you create a new rank, you will have to set up their perms from scratch.");
msgDoc("If you want to know what permissions are specifically given to someone do:");
message(CmdFactions.get().cmdFactionsPerm.cmdFactionsPermView.getTemplate(false, true, sender));
msgDoc("To set perms do: ");
message(CmdFactions.get().cmdFactionsPerm.cmdFactionsPermSet.getTemplate(false, true, sender));
}
}

View File

@ -1,38 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.massivecore.MassiveException;
public class CmdFactionsDocumentationPower extends FactionsCommandDocumentation
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsDocumentationPower()
{
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
msgDoc("All players have an amount of power ranging from <h>%.2f <i>to <h>%.2f<i>.", MConf.get().powerMin, MConf.get().powerMax);
msgDoc("The power of a faction is equal to the combined power of all it's members.");
msgDoc("Your power is <h>%.2f<i>", msender.getPower());
msgDoc("Your faction's power is <h>%.2f<i>", msenderFaction.getPower());
msgDoc("The amount of chunks a faction can claim is the amount power it has.");
msgDoc("For every hour you are online you gain <h>%.2f <i>power.", MConf.get().powerPerHour);
msgDoc("Every time you die you power is decreased by <h>%.2f <i>.", MConf.get().powerPerDeath*-1);
if (!MConf.get().canLeaveWithNegativePower && MConf.get().powerMin < 0)
{
msgDoc("You can't leave a faction if your power is negative.");
}
}
}

View File

@ -1,55 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.entity.Rank;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.mson.Mson;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.ChatColor;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class CmdFactionsDocumentationRanks extends FactionsCommandDocumentation
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsDocumentationRanks()
{
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
msgDoc("Ranks divide the faction into groups.");
List<Rank> ranks = msenderFaction.getRanks().getAll(Comparator.comparingInt(Rank::getPriority).reversed());
List<String> rankDesc = ranks.stream().map(r -> r.getDisplayName(msender)).collect(Collectors.toList());
msgDoc("Your faction has: <reset>%s", Txt.implodeCommaAndDot(rankDesc, Txt.parse("<i>")));
msgDoc("Ranks can have a prefix that will be prepended before any player name. Prefixes can be coloured.");
msgDoc("All ranks have a priority showed in parentheses after the name.");
Mson msonLeader = mson("The rank with the highest priority is deemed the “leader rank”" +
"(can be renamed) and only one person can have that rank")
.tooltip("For yor faction the leader rank is" + rankDesc.get(0))
.color(ChatColor.YELLOW);
messageDoc(msonLeader);
msgDoc("Whenever a new person joins the faction they will be assigned the rank with the lowest priority.");
msgDoc("Priorities are important because they determine who can do what." +
"For example: you cant kick someone with the same or higher rank than yourself." +
"So if you have both Officers, and Co-leaders, do not fear officers kicking co-leaders or the co-leaders kicking each other." +
"They cant. The same goes for changing ranks, titles and other similar things.");
msgDoc("To show, set or edit ranks do:");
message(CmdFactions.get().cmdFactionsRank.getTemplate(false, true, sender));
}
}

View File

@ -1,59 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.req.ReqTaxEnabled;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.money.Money;
import com.massivecraft.massivecore.util.TimeDiffUtil;
import com.massivecraft.massivecore.util.TimeUnit;
import com.massivecraft.massivecore.util.Txt;
import java.util.LinkedHashMap;
public class CmdFactionsDocumentationTax extends FactionsCommandDocumentation
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsDocumentationTax()
{
this.addRequirements(ReqTaxEnabled.get());
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
LinkedHashMap<TimeUnit, Long> timeUnitcounts = TimeDiffUtil.limit(TimeDiffUtil.unitcounts(MConf.get().taxTaskPeriodMillis, TimeUnit.getAll()), 3);
String periodString = TimeDiffUtil.formatedVerboose(timeUnitcounts);
msgDoc("<key>Taxation Period: <i>every %s<i>.", periodString);
long nextTaxationTime = MConf.get().taxTaskPeriodMillis + MConf.get().taxTaskPeriodMillis;
msgDoc("<key>Next Taxation: %s", Txt.getTimeDeltaDescriptionRelNow(nextTaxationTime));
String minTax = Money.format(MConf.get().taxPlayerMinimum);
String maxTax = Money.format(MConf.get().taxPlayerMaximum);
msgDoc("<i>Taxes for players can be set between <reset>%s <i>and <reset>%s<i>.", minTax, maxTax);
double tax = msenderFaction.getTaxForPlayer(msender);
if (tax > 0)
{
msgDoc("<i>You pay <reset>%s <i>in taxes.", Money.format(tax));
}
else if (tax < 0)
{
msgDoc("<i>Instead of taxes you faction pays you <reset>%s <i>.", Money.format(tax * -1));
}
else
{
msgDoc("<i>You don't pay taxes.");
}
}
}

View File

@ -1,76 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.req.ReqFactionWarpsEnabled;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPerm.MPermable;
import com.massivecraft.massivecore.MassiveException;
import java.util.Set;
public class CmdFactionsDocumentationWarps extends FactionsCommandDocumentation
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsDocumentationWarps()
{
this.addRequirements(ReqFactionWarpsEnabled.get());
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
msgDoc("A faction can have warps which allows it's members to easily go to important places within the faction.");
if (MConf.get().warpsMax < 0)
{
msgDoc("There is <h>no limit <i>to how many warps a faction can have.");
}
else
{
msgDoc("A faction can only have <h>%d <i>warps.", MConf.get().warpsMax);
}
if (MConf.get().warpsMustBeInClaimedTerritory)
{
msgDoc("Warps must be within claimed territory.");
}
if (MConf.get().warpsTeleportToOnDeathActive)
{
msgDoc("If your faction has a warp with the name <h>%s <i>you will teleport there after death.", MConf.get().warpsTeleportToOnDeathName);
}
if (!MConf.get().warpsTeleportAllowedFromEnemyTerritory)
{
msgDoc("You can't use faction warps while in enemy territory.");
}
if (!MConf.get().warpsTeleportAllowedFromDifferentWorld)
{
msgDoc("You can't teleporty to a warp from another world.");
}
if (MConf.get().warpsTeleportAllowedEnemyDistance > 0)
{
String str = String.format("You can't teleport home if there is an enemy within <h>%.1f <i>blocks of you", MConf.get().warpsTeleportAllowedEnemyDistance);
if (MConf.get().warpsTeleportIgnoreEnemiesIfInOwnTerritory) str += " unless you are in your own territory.";
else str += ".";
msgDoc(str);
}
if (msenderFaction.isNormal())
{
Set<MPermable> set = msenderFaction.getPermittedPermables(MPerm.getPermWarp());
String permables = CmdFactionsPermShow.permablesToDisplayString(set, msender);
msgDoc("In your faction warps can be used by: %s<i>.", permables);
}
}
}

View File

@ -0,0 +1,40 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.event.EventFactionsExpansions;
import com.massivecraft.massivecore.util.Txt;
import java.util.Map.Entry;
public class CmdFactionsExpansions extends FactionsCommand
{
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform()
{
// Event
EventFactionsExpansions event = new EventFactionsExpansions(sender);
event.run();
// Title
Object title = "Factions Expansions";
title = Txt.titleize(title);
message(title);
// Lines
for (Entry<String, Boolean> entry : event.getExpansions().entrySet())
{
String name = entry.getKey();
Boolean installed = entry.getValue();
String format = (installed ? "<g>[X] <h>%s" : "<b>[ ] <h>%s");
msg(format, name);
}
// URL Suggestion
msg("<i>Learn all about expansions in the online documentation:");
msg("<aqua>https://www.massivecraft.com/factions");
}
}

View File

@ -22,7 +22,7 @@ public class CmdFactionsFaction extends FactionsCommand
public CmdFactionsFaction()
{
// Aliases
this.addAliases("f", "show", "who").setDesc("the faction to show info about");
this.addAliases("f", "show", "who");
// Parameters
this.addParameter(TypeFaction.get(), "faction", "you");
@ -39,20 +39,25 @@ public class CmdFactionsFaction extends FactionsCommand
final Faction faction = this.readArg(msenderFaction);
final CommandSender sender = this.sender;
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
// Event
EventFactionsFactionShowAsync event = new EventFactionsFactionShowAsync(sender, faction);
event.run();
if (event.isCancelled()) return;
// Title
MixinMessage.get().messageOne(sender, Txt.titleize("Faction " + faction.getName(msender)));
// Lines
TreeSet<PriorityLines> priorityLiness = new TreeSet<>(event.getIdPriorityLiness().values());
for (PriorityLines priorityLines : priorityLiness)
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
{
MixinMessage.get().messageOne(sender, priorityLines.getLines());
// Event
EventFactionsFactionShowAsync event = new EventFactionsFactionShowAsync(sender, faction);
event.run();
if (event.isCancelled()) return;
// Title
MixinMessage.get().messageOne(sender, Txt.titleize("Faction " + faction.getName(msender)));
// Lines
TreeSet<PriorityLines> priorityLiness = new TreeSet<>(event.getIdPriorityLiness().values());
for (PriorityLines priorityLines : priorityLiness)
{
MixinMessage.get().messageOne(sender, priorityLines.getLines());
}
}
});

View File

@ -6,8 +6,8 @@ public class CmdFactionsFlag extends FactionsCommand
// FIELDS
// -------------------------------------------- //
public CmdFactionsFlagList cmdFactionsFlagList = new CmdFactionsFlagList();
public CmdFactionsFlagShow cmdFactionsFlagShow = new CmdFactionsFlagShow();
public CmdFactionsFlagSet cmdFactionsFlagSet = new CmdFactionsFlagSet();
CmdFactionsFlagList cmdFactionsFlagList = new CmdFactionsFlagList();
CmdFactionsFlagShow cmdFactionsFlagShow = new CmdFactionsFlagShow();
CmdFactionsFlagSet cmdFactionsFlagSet = new CmdFactionsFlagSet();
}

View File

@ -1,5 +1,9 @@
package com.massivecraft.factions.cmd;
import java.util.List;
import org.bukkit.Bukkit;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.entity.MFlag;
import com.massivecraft.factions.entity.MFlagColl;
@ -8,9 +12,7 @@ import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.Parameter;
import com.massivecraft.massivecore.pager.Pager;
import com.massivecraft.massivecore.pager.Stringifier;
import org.bukkit.Bukkit;
import java.util.List;
import com.massivecraft.massivecore.predicate.Predicate;
public class CmdFactionsFlagList extends FactionsCommand
{
@ -37,17 +39,36 @@ public class CmdFactionsFlagList extends FactionsCommand
// Pager create
String title = "Flag List for " + msenderFaction.describeTo(mplayer);
final Pager<MFlag> pager = new Pager<>(this, title, page, (Stringifier<MFlag>) (mflag, index) -> mflag.getStateDesc(false, false, true, true, true, false));
final Pager<MFlag> pager = new Pager<>(this, title, page, new Stringifier<MFlag>()
{
@Override
public String toString(MFlag mflag, int index)
{
return mflag.getStateDesc(false, false, true, true, true, false);
}
});
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
// Get items
List<MFlag> items = MFlagColl.get().getAll(mplayer.isOverriding() ? null : MFlag::isVisible);
// Pager items
pager.setItems(items);
// Pager message
pager.message();
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
{
// Get items
List<MFlag> items = MFlagColl.get().getAll(mplayer.isOverriding() ? null : new Predicate<MFlag>()
{
@Override
public boolean apply(MFlag mflag)
{
return mflag.isVisible();
}
});
// Pager items
pager.setItems(items);
// Pager message
pager.message();
}
});
}

View File

@ -18,9 +18,9 @@ public class CmdFactionsFlagSet extends FactionsCommand
public CmdFactionsFlagSet()
{
// Parameters
this.addParameter(TypeMFlag.get(), "flag").setDesc("the faction flag to set a value for");
this.addParameter(TypeBooleanYes.get(), "yes/no").setDesc("should the flag be on or off?");
this.addParameter(TypeFaction.get(), "faction", "you").setDesc("the faction to set the flag for (per default your own)");
this.addParameter(TypeMFlag.get(), "flag");
this.addParameter(TypeBooleanYes.get(), "yes/no");
this.addParameter(TypeFaction.get(), "faction", "you");
}
// -------------------------------------------- //
@ -41,7 +41,8 @@ public class CmdFactionsFlagSet extends FactionsCommand
// Is this flag editable?
if (!msender.isOverriding() && ! flag.isEditable())
{
throw new MassiveException().addMsg("<b>The flag <h>%s <b>is not editable.", flag.getName());
msg("<b>The flag <h>%s <b>is not editable.", flag.getName());
return;
}
// Event
@ -53,7 +54,8 @@ public class CmdFactionsFlagSet extends FactionsCommand
// No change
if (faction.getFlag(flag) == value)
{
throw new MassiveException().addMsg("%s <i>already has %s <i>set to %s<i>.", faction.describeTo(msender), flag.getStateDesc(value, false, true, true, false, true), flag.getStateDesc(value, true, true, false, false, false));
msg("%s <i>already has %s <i>set to %s<i>.", faction.describeTo(msender), flag.getStateDesc(value, false, true, true, false, true), flag.getStateDesc(value, true, true, false, false, false));
return;
}
// Apply

View File

@ -20,7 +20,7 @@ public class CmdFactionsFlagShow extends FactionsCommand
public CmdFactionsFlagShow()
{
// Parameters
this.addParameter(TypeFaction.get(), "faction", "you").setDesc("the faction to show flags for");
this.addParameter(TypeFaction.get(), "faction", "you");
this.addParameter(Parameter.getPage());
}
@ -37,7 +37,14 @@ public class CmdFactionsFlagShow extends FactionsCommand
// Pager create
String title = "Flags for " + faction.describeTo(msender);
Pager<MFlag> pager = new Pager<>(this, title, page, MFlag.getAll(), (Stringifier<MFlag>) (mflag, index) -> mflag.getStateDesc(faction.getFlag(mflag), true, true, true, true, true));
Pager<MFlag> pager = new Pager<>(this, title, page, MFlag.getAll(), new Stringifier<MFlag>()
{
@Override
public String toString(MFlag mflag, int index)
{
return mflag.getStateDesc(faction.getFlag(mflag), true, true, true, true, true);
}
});
// Pager args
List<String> pagerArgs = new MassiveList<>(

View File

@ -1,58 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.engine.EngineFly;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.MassiveCommandToggle;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.engine.EngineMassiveCorePlayerUpdate;
import com.massivecraft.massivecore.ps.PS;
import org.bukkit.entity.Player;
public class CmdFactionsFly extends MassiveCommandToggle
{
// -------------------------------------------- //
// INSTANCE
// -------------------------------------------- //
private static CmdFactionsFly i = new CmdFactionsFly();
public static CmdFactionsFly get() { return i; }
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsFly()
{
this.addRequirements(RequirementIsPlayer.get());
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public String getName()
{
return "faction flying";
}
@Override
public boolean getValue() throws MassiveException
{
return MPlayer.get(sender).isFlying();
}
public void setValue(boolean value) throws MassiveException
{
MPlayer mplayer = MPlayer.get(sender);
Player player = me;
if (player == null) throw new MassiveException().addMsg("<b>Could not find player.");
PS ps = PS.valueOf(player);
if (value) EngineFly.canFlyInTerritoryOrThrow(mplayer, ps);
mplayer.setFlying(value);
EngineMassiveCorePlayerUpdate.update(player, false);
}
}

View File

@ -1,31 +1,40 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Rel;
import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.entity.BoardColl;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.factions.entity.MFlag;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.factions.event.EventFactionsHomeTeleport;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.Visibility;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.mixin.MixinMessage;
import com.massivecraft.massivecore.mixin.MixinTeleport;
import com.massivecraft.massivecore.mixin.TeleporterException;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.teleport.Destination;
import com.massivecraft.massivecore.teleport.DestinationSimple;
import com.massivecraft.massivecore.util.MUtil;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import java.util.List;
public class CmdFactionsHome extends FactionsCommandWarp
public class CmdFactionsHome extends FactionsCommandHome
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsHome()
{
// Requirements
this.addRequirements(RequirementIsPlayer.get());
// Parameters
this.addParameter(TypeFaction.get(), "faction", "you");
// Visibility
this.setVisibility(Visibility.INVISIBLE);
// Requirements
this.addRequirements(RequirementIsPlayer.get());
}
// -------------------------------------------- //
@ -35,8 +44,114 @@ public class CmdFactionsHome extends FactionsCommandWarp
@Override
public void perform() throws MassiveException
{
List<String> args = MUtil.list(MConf.get().warpsHomeName, this.argAt(0));
CmdFactions.get().cmdFactionsWarp.cmdFactionsWarpGo.execute(me, args);
if ( ! MConf.get().homesTeleportCommandEnabled)
{
msender.msg("<b>Sorry, the ability to teleport to Faction homes is disabled on this server.");
return;
}
// Args
Faction faction = this.readArg(msenderFaction);
PS home = faction.getHome();
String homeDesc = "home for " + faction.describeTo(msender, false);
// Any and MPerm
if ( ! MPerm.getPermHome().has(msender, faction, true)) return;
if (home == null)
{
msender.msg("<b>%s <b>does not have a home.", faction.describeTo(msender, true));
if (MPerm.getPermSethome().has(msender, faction, false))
{
msender.msg("<i>You should:");
msender.message(CmdFactions.get().cmdFactionsSethome.getTemplate());
}
return;
}
if ( ! MConf.get().homesTeleportAllowedFromEnemyTerritory && msender.isInEnemyTerritory())
{
msender.msg("<b>You cannot teleport to %s <b>while in the territory of an enemy faction.", homeDesc);
return;
}
if ( ! MConf.get().homesTeleportAllowedFromDifferentWorld && !me.getWorld().getName().equalsIgnoreCase(home.getWorld()))
{
msender.msg("<b>You cannot teleport to %s <b>while in a different world.", homeDesc);
return;
}
Faction factionHere = BoardColl.get().getFactionAt(PS.valueOf(me.getLocation()));
Location locationHere = me.getLocation().clone();
// if player is not in a safe zone or their own faction territory, only allow teleport if no enemies are nearby
if
(
MConf.get().homesTeleportAllowedEnemyDistance > 0
&&
factionHere.getFlag(MFlag.getFlagPvp())
&&
(
! msender.isInOwnTerritory()
||
(
msender.isInOwnTerritory()
&&
! MConf.get().homesTeleportIgnoreEnemiesIfInOwnTerritory
)
)
)
{
World w = locationHere.getWorld();
double x = locationHere.getX();
double y = locationHere.getY();
double z = locationHere.getZ();
for (Player p : me.getServer().getOnlinePlayers())
{
if (MUtil.isntPlayer(p)) continue;
if (p == null || !p.isOnline() || p.isDead() || p == me || p.getWorld() != w)
continue;
MPlayer fp = MPlayer.get(p);
if (msender.getRelationTo(fp) != Rel.ENEMY)
continue;
Location l = p.getLocation();
double dx = Math.abs(x - l.getX());
double dy = Math.abs(y - l.getY());
double dz = Math.abs(z - l.getZ());
double max = MConf.get().homesTeleportAllowedEnemyDistance;
// box-shaped distance check
if (dx > max || dy > max || dz > max)
continue;
msender.msg("<b>You cannot teleport to %s <b>while an enemy is within %f blocks of you.", homeDesc, MConf.get().homesTeleportAllowedEnemyDistance);
return;
}
}
// Event
EventFactionsHomeTeleport event = new EventFactionsHomeTeleport(sender);
event.run();
if (event.isCancelled()) return;
// Apply
try
{
Destination destination = new DestinationSimple(home, homeDesc);
MixinTeleport.get().teleport(me, destination, sender);
}
catch (TeleporterException e)
{
String message = e.getMessage();
MixinMessage.get().messageOne(me, message);
}
}
}

View File

@ -23,7 +23,7 @@ public class CmdFactionsInviteAdd extends FactionsCommand
public CmdFactionsInviteAdd()
{
// Parameters
this.addParameter(TypeSet.get(TypeMPlayer.get()), "players", true).setDesc("the player to invite");
this.addParameter(TypeSet.get(TypeMPlayer.get()), "players", true);
}
// -------------------------------------------- //

View File

@ -16,6 +16,8 @@ import com.massivecraft.massivecore.util.TimeDiffUtil;
import com.massivecraft.massivecore.util.TimeUnit;
import com.massivecraft.massivecore.util.Txt;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
@ -30,7 +32,7 @@ public class CmdFactionsInviteList extends FactionsCommand
{
// Parameters
this.addParameter(Parameter.getPage());
this.addParameter(TypeFaction.get(), "faction", "you").setDesc("the faction to list invites for");
this.addParameter(TypeFaction.get(), "faction", "you");
}
// -------------------------------------------- //
@ -53,27 +55,38 @@ public class CmdFactionsInviteList extends FactionsCommand
// Pager Create
final List<Entry<String, Invitation>> invitations = new MassiveList<>(faction.getInvitations().entrySet());
invitations.sort((i1, i2) -> ComparatorSmart.get().compare(i2.getValue().getCreationMillis(), i1.getValue().getCreationMillis()));
Collections.sort(invitations, new Comparator<Entry<String, Invitation>>()
{
@Override
public int compare(Entry<String, Invitation> i1, Entry<String, Invitation> i2)
{
return ComparatorSmart.get().compare(i2.getValue().getCreationMillis(), i1.getValue().getCreationMillis());
}
});
final long now = System.currentTimeMillis();
final Pager<Entry<String, Invitation>> pager = new Pager<>(this, "Invited Players List", page, invitations, (Stringifier<Entry<String, Invitation>>) (entry, index) -> {
String inviteeId = entry.getKey();
String inviterId = entry.getValue().getInviterId();
String inviteeDisplayName = MixinDisplayName.get().getDisplayName(inviteeId, sender);
String inviterDisplayName = inviterId != null ? MixinDisplayName.get().getDisplayName(inviterId, sender) : Txt.parse("<silver>unknown");
String ageDesc = "";
if (entry.getValue().getCreationMillis() != null)
final Pager<Entry<String, Invitation>> pager = new Pager<>(this, "Invited Players List", page, invitations, new Stringifier<Entry<String, Invitation>>()
{
public String toString(Entry<String, Invitation> entry, int index)
{
long millis = now - entry.getValue().getCreationMillis();
LinkedHashMap<TimeUnit, Long> ageUnitcounts = TimeDiffUtil.limit(TimeDiffUtil.unitcounts(millis, TimeUnit.getAllButMillis()), 2);
ageDesc = TimeDiffUtil.formatedMinimal(ageUnitcounts, "<i>");
ageDesc = " " + ageDesc + Txt.parse(" ago");
}
String inviteeId = entry.getKey();
String inviterId = entry.getValue().getInviterId();
String inviteeDisplayName = MixinDisplayName.get().getDisplayName(inviteeId, sender);
String inviterDisplayName = inviterId != null ? MixinDisplayName.get().getDisplayName(inviterId, sender) : Txt.parse("<silver>unknown");
String ageDesc = "";
if (entry.getValue().getCreationMillis() != null)
{
long millis = now - entry.getValue().getCreationMillis();
LinkedHashMap<TimeUnit, Long> ageUnitcounts = TimeDiffUtil.limit(TimeDiffUtil.unitcounts(millis, TimeUnit.getAllButMillis()), 2);
ageDesc = TimeDiffUtil.formatedMinimal(ageUnitcounts, "<i>");
ageDesc = " " + ageDesc + Txt.parse(" ago");
}
return Txt.parse("%s<i> was invited by %s<reset>%s<i>.", inviteeDisplayName, inviterDisplayName, ageDesc);
return Txt.parse("%s<i> was invited by %s<reset>%s<i>.", inviteeDisplayName, inviterDisplayName, ageDesc);
}
});
// Pager Message

View File

@ -23,7 +23,7 @@ public class CmdFactionsInviteRemove extends FactionsCommand
public CmdFactionsInviteRemove()
{
// Parameters
this.addParameter(TypeSet.get(TypeMPlayer.get()), "players/all", true).setDesc("the player to deinvite");
this.addParameter(TypeSet.get(TypeMPlayer.get()), "players/all", true);
}
// -------------------------------------------- //

View File

@ -24,8 +24,8 @@ public class CmdFactionsJoin extends FactionsCommand
public CmdFactionsJoin()
{
// Parameters
this.addParameter(TypeFaction.get(), "faction").setDesc("the faction to join");
this.addParameter(TypeMPlayer.get(), "player", "you").setDesc("the player that should join tje faction (for admins only)");
this.addParameter(TypeFaction.get(), "faction");
this.addParameter(TypeMPlayer.get(), "player", "you");
}
// -------------------------------------------- //
@ -116,7 +116,6 @@ public class CmdFactionsJoin extends FactionsCommand
// Apply
mplayer.resetFactionData();
mplayer.setFaction(faction);
mplayer.setRank(faction.getLowestRank());
faction.uninvite(mplayer);

View File

@ -1,6 +1,7 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.Rel;
import com.massivecraft.factions.cmd.type.TypeMPlayer;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
@ -22,7 +23,7 @@ public class CmdFactionsKick extends FactionsCommand
public CmdFactionsKick()
{
// Parameters
this.addParameter(TypeMPlayer.get(), "player").setDesc("the player to kick");
this.addParameter(TypeMPlayer.get(), "player");
}
// -------------------------------------------- //
@ -43,22 +44,22 @@ public class CmdFactionsKick extends FactionsCommand
return;
}
if ( !msender.isOverriding() && mplayer.getRank().isLeader())
if (mplayer.getRole() == Rel.LEADER && !msender.isOverriding())
{
throw new MassiveException().addMsg("<b>The leader cannot be kicked.");
}
if (! msender.isOverriding() && mplayer.getFaction() == msenderFaction && mplayer.getRank().isMoreThan(msender.getRank()) )
if (mplayer.getRole().isMoreThan(msender.getRole()) && ! msender.isOverriding())
{
throw new MassiveException().addMsg("<b>You can't kick people of higher rank than yourself.");
}
if (! msender.isOverriding() && mplayer.getRank() == msender.getRank())
if (mplayer.getRole() == msender.getRole() && ! msender.isOverriding())
{
throw new MassiveException().addMsg("<b>You can't kick people of the same rank as yourself.");
}
if ( ! msender.isOverriding() && ! MConf.get().canLeaveWithNegativePower && mplayer.getPower() < 0)
if ( ! MConf.get().canLeaveWithNegativePower && mplayer.getPower() < 0 && ! msender.isOverriding())
{
msg("<b>You can't kick that person until their power is positive.");
return;
@ -87,7 +88,7 @@ public class CmdFactionsKick extends FactionsCommand
}
// Apply
if (mplayer.getRank().isLeader())
if (mplayer.getRole() == Rel.LEADER)
{
mplayerFaction.promoteNewLeader();
}

View File

@ -1,7 +1,7 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.comparator.ComparatorFactionList;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import com.massivecraft.factions.entity.MPlayer;
@ -41,33 +41,42 @@ public class CmdFactionsList extends FactionsCommand
// NOTE: The faction list is quite slow and mostly thread safe.
// We run it asynchronously to spare the primary server thread.
// Pager Create
final Pager<Faction> pager = new Pager<>(this, "Faction List", page, (Stringifier<Faction>) (faction, index) -> {
if (faction.isNone())
final Pager<Faction> pager = new Pager<>(this, "Faction List", page, new Stringifier<Faction>() {
@Override
public String toString(Faction faction, int index)
{
return Txt.parse("<i>Factionless<i> %d online", FactionColl.get().getNone().getMPlayersWhereOnlineTo(sender).size());
}
else
{
return Txt.parse("%s<i> %d/%d online, %d/%d/%d",
faction.getName(msender),
faction.getMPlayersWhereOnlineTo(sender).size(),
faction.getMPlayers().size(),
faction.getLandCount(),
faction.getPowerRounded(),
faction.getPowerMaxRounded()
);
if (faction.isNone())
{
return Txt.parse("<i>Factionless<i> %d online", FactionColl.get().getNone().getMPlayersWhereOnlineTo(sender).size());
}
else
{
return Txt.parse("%s<i> %d/%d online, %d/%d/%d",
faction.getName(msender),
faction.getMPlayersWhereOnlineTo(sender).size(),
faction.getMPlayers().size(),
faction.getLandCount(),
faction.getPowerRounded(),
faction.getPowerMaxRounded()
);
}
}
});
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
// Pager Items
final List<Faction> factions = FactionColl.get().getAll(ComparatorFactionList.get(sender));
pager.setItems(factions);
// Pager Message
pager.message();
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
{
// Pager Items
final List<Faction> factions = FactionColl.get().getAll(ComparatorFactionList.get(sender));
pager.setItems(factions);
// Pager Message
pager.message();
}
});
}

View File

@ -4,7 +4,6 @@ import com.massivecraft.factions.util.AsciiMap;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementIsPlayer;
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanYes;
import com.massivecraft.massivecore.ps.PS;
import com.massivecraft.massivecore.util.Txt;
public class CmdFactionsMap extends FactionsCommand
@ -16,7 +15,7 @@ public class CmdFactionsMap extends FactionsCommand
public CmdFactionsMap()
{
// Parameters
this.addParameter(TypeBooleanYes.get(), "on/off", "once").setDesc("set to yes to get an auto updating map\nset to no to disable");
this.addParameter(TypeBooleanYes.get(), "on/off", "once");
// Requirements
this.addRequirements(RequirementIsPlayer.get());
@ -38,7 +37,7 @@ public class CmdFactionsMap extends FactionsCommand
if (!showMap) return;
// Show Map
AsciiMap map = new AsciiMap(msender, PS.valueOf(me), !argSet);
AsciiMap map = new AsciiMap(msender, me, !argSet);
message(map.render());
}

View File

@ -11,9 +11,9 @@ public class CmdFactionsMoney extends FactionsCommand
public CmdFactionsMoneyBalance cmdMoneyBalance = new CmdFactionsMoneyBalance();
public CmdFactionsMoneyDeposit cmdMoneyDeposit = new CmdFactionsMoneyDeposit();
public CmdFactionsMoneyWithdraw cmdMoneyWithdraw = new CmdFactionsMoneyWithdraw();
public CmdFactionsMoneyTransferF2f cmdMoneyTransferFf = new CmdFactionsMoneyTransferF2f();
public CmdFactionsMoneyTransferF2p cmdMoneyTransferFp = new CmdFactionsMoneyTransferF2p();
public CmdFactionsMoneyTransferP2f cmdMoneyTransferPf = new CmdFactionsMoneyTransferP2f();
public CmdFactionsMoneyTransferFf cmdMoneyTransferFf = new CmdFactionsMoneyTransferFf();
public CmdFactionsMoneyTransferFp cmdMoneyTransferFp = new CmdFactionsMoneyTransferFp();
public CmdFactionsMoneyTransferPf cmdMoneyTransferPf = new CmdFactionsMoneyTransferPf();
// -------------------------------------------- //
// CONSTRUCT

View File

@ -16,7 +16,7 @@ public class CmdFactionsMoneyBalance extends FactionsCommand
public CmdFactionsMoneyBalance()
{
// Parameters
this.addParameter(TypeFaction.get(), "faction", "you").setDesc("the faction whose balance to check");
this.addParameter(TypeFaction.get(), "faction", "you");
// Requirements
this.addRequirements(ReqBankCommandsEnabled.get());

View File

@ -21,8 +21,8 @@ public class CmdFactionsMoneyDeposit extends FactionsCommand
public CmdFactionsMoneyDeposit()
{
// Parameters
this.addParameter(TypeDouble.get(), "amount").setDesc("the amount of money to deposit");
this.addParameter(TypeFaction.get(), "faction", "you").setDesc("the faction to deposit money to");
this.addParameter(TypeDouble.get(), "amount");
this.addParameter(TypeFaction.get(), "faction", "you");
// Requirements
this.addRequirements(ReqBankCommandsEnabled.get());

View File

@ -1,24 +1,26 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.Perm;
import com.massivecraft.factions.cmd.req.ReqBankCommandsEnabled;
import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.factions.integration.Econ;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
import com.massivecraft.massivecore.command.type.primitive.TypeDouble;
import com.massivecraft.massivecore.money.Money;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.ChatColor;
public class CmdFactionsMoneyTransferF2f extends FactionsCommand
public class CmdFactionsMoneyTransferFf extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsMoneyTransferF2f()
public CmdFactionsMoneyTransferFf()
{
// Fields
this.setSetupEnabled(false);
@ -27,11 +29,12 @@ public class CmdFactionsMoneyTransferF2f extends FactionsCommand
this.addAliases("ff");
// Parameters
this.addParameter(TypeDouble.get(), "amount").setDesc("the amount of money to transfer");
this.addParameter(TypeFaction.get(), "faction").setDesc("the faction to transfer money from");
this.addParameter(TypeFaction.get(), "faction").setDesc("the faction to transfer money to");
this.addParameter(TypeDouble.get(), "amount");
this.addParameter(TypeFaction.get(), "faction");
this.addParameter(TypeFaction.get(), "faction");
// Requirements
this.addRequirements(RequirementHasPerm.get(Perm.MONEY_F2F));
this.addRequirements(ReqBankCommandsEnabled.get());
}

View File

@ -1,6 +1,7 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.Perm;
import com.massivecraft.factions.cmd.req.ReqBankCommandsEnabled;
import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.cmd.type.TypeMPlayer;
@ -9,18 +10,19 @@ import com.massivecraft.factions.entity.MConf;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.factions.integration.Econ;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
import com.massivecraft.massivecore.command.type.primitive.TypeDouble;
import com.massivecraft.massivecore.money.Money;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.ChatColor;
public class CmdFactionsMoneyTransferF2p extends FactionsCommand
public class CmdFactionsMoneyTransferFp extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsMoneyTransferF2p()
public CmdFactionsMoneyTransferFp()
{
// Fields
this.setSetupEnabled(false);
@ -29,11 +31,12 @@ public class CmdFactionsMoneyTransferF2p extends FactionsCommand
this.addAliases("fp");
// Parameters
this.addParameter(TypeDouble.get(), "amount").setDesc("the amount of money to transfer");
this.addParameter(TypeFaction.get(), "faction").setDesc("the faction to transfer money from");
this.addParameter(TypeMPlayer.get(), "player").setDesc("the player to transfer money to");
this.addParameter(TypeDouble.get(), "amount");
this.addParameter(TypeFaction.get(), "faction");
this.addParameter(TypeMPlayer.get(), "player");
// Requirements
this.addRequirements(RequirementHasPerm.get(Perm.MONEY_F2P));
this.addRequirements(ReqBankCommandsEnabled.get());
}

View File

@ -1,6 +1,7 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.Perm;
import com.massivecraft.factions.cmd.req.ReqBankCommandsEnabled;
import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.cmd.type.TypeMPlayer;
@ -9,18 +10,19 @@ import com.massivecraft.factions.entity.MConf;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.factions.integration.Econ;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.requirement.RequirementHasPerm;
import com.massivecraft.massivecore.command.type.primitive.TypeDouble;
import com.massivecraft.massivecore.money.Money;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.ChatColor;
public class CmdFactionsMoneyTransferP2f extends FactionsCommand
public class CmdFactionsMoneyTransferPf extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsMoneyTransferP2f()
public CmdFactionsMoneyTransferPf()
{
// Fields
this.setSetupEnabled(false);
@ -29,11 +31,12 @@ public class CmdFactionsMoneyTransferP2f extends FactionsCommand
this.addAliases("pf");
// Parameters
this.addParameter(TypeDouble.get(), "amount").setDesc("the amount of money to transfer");
this.addParameter(TypeMPlayer.get(), "player").setDesc("the player to transfer money from");
this.addParameter(TypeFaction.get(), "faction").setDesc("the faction to transfer money to");
this.addParameter(TypeDouble.get(), "amount");
this.addParameter(TypeMPlayer.get(), "player");
this.addParameter(TypeFaction.get(), "faction");
// Requirements
this.addRequirements(RequirementHasPerm.get(Perm.MONEY_P2F));
this.addRequirements(ReqBankCommandsEnabled.get());
}

View File

@ -22,8 +22,8 @@ public class CmdFactionsMoneyWithdraw extends FactionsCommand
public CmdFactionsMoneyWithdraw()
{
// Parameters
this.addParameter(TypeDouble.get(), "amount").setDesc("the amount of money to withdraw");
this.addParameter(TypeFaction.get(), "faction", "you").setDesc("the faction to transfer money to");
this.addParameter(TypeDouble.get(), "amount");
this.addParameter(TypeFaction.get(), "faction", "you");
// Requirements
this.addRequirements(ReqBankCommandsEnabled.get());

View File

@ -1,77 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.Visibility;
import com.massivecraft.massivecore.command.type.primitive.TypeStringConfirmation;
import com.massivecraft.massivecore.money.Money;
import com.massivecraft.massivecore.util.ConfirmationUtil;
public class CmdFactionsMoneyconvert extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsMoneyconvert()
{
// Parameters
this.addParameter(TypeStringConfirmation.get(), "confirmation", "");
// Low priority
this.setPriority(-100);
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public Visibility getVisibility()
{
//return Visibility.INVISIBLE;
return MConf.get().useNewMoneySystem ? Visibility.INVISIBLE : Visibility.SECRET;
}
@Override
public void perform() throws MassiveException
{
if (MConf.get().useNewMoneySystem)
{
throw new MassiveException().addMsg("<b>The economy system is already converted.");
}
// Args
if (!this.argIsSet(0))
{
msg("<i>Money in Factions used to be stored within the applicable economy plugin." +
" This is problematic because not all economy plugins support that." +
" This command allows to convert to the new system where the money of a Faction" +
" is stored within the Factions plugin. Then all economy plugins can be used with Factions.");
}
ConfirmationUtil.tryConfirm(this);
MConf.get().useNewMoneySystem = true;
for (Faction f : FactionColl.get().getAll())
{
if (!Money.exists(f))
{
msg("<h>%s <i>does not have any money.", f.getName());
continue;
}
double money = Money.get(f);
f.setMoney(money);
Money.set(f, null, 0);
msg("<h>%s <i>has <h>%s <i> and has been converted.", f.getName(), Money.format(money));
}
msg("<i>Converted all factions. Hooray!");
}
}

View File

@ -19,7 +19,7 @@ public class CmdFactionsMotd extends FactionsCommand
public CmdFactionsMotd()
{
// Parameters
this.addParameter(TypeNullable.get(TypeString.get()), "new", "read", true).setDesc("the new motd\nif not specified you will just see the current one");
this.addParameter(TypeNullable.get(TypeString.get()), "new", "read", true);
}
// -------------------------------------------- //
@ -42,11 +42,8 @@ public class CmdFactionsMotd extends FactionsCommand
// Args
String target = this.readArg();
if (target != null)
{
target = target.trim();
target = Txt.parse(target);
}
target = target.trim();
target = Txt.parse(target);
// Get Old
String old = msenderFaction.getMotd();
@ -66,12 +63,11 @@ public class CmdFactionsMotd extends FactionsCommand
// Apply
msenderFaction.setMotd(target);
// Inform
for (MPlayer follower : msenderFaction.getMPlayers())
{
follower.msg("<i>%s <i>changed your faction motd.", MixinDisplayName.get().getDisplayName(sender, follower));
follower.message(msenderFaction.getMotdMessages());
follower.msg("<i>%s <i>set your faction motd to:\n%s", MixinDisplayName.get().getDisplayName(sender, follower), msenderFaction.getMotdDesc());
}
}

View File

@ -3,9 +3,14 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.cmd.type.TypeFactionNameLenient;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.event.EventFactionsNameChange;
import com.massivecraft.factions.util.MiscUtil;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.type.primitive.TypeString;
import java.util.ArrayList;
public class CmdFactionsName extends FactionsCommand
{
@ -16,8 +21,8 @@ public class CmdFactionsName extends FactionsCommand
public CmdFactionsName()
{
// Parameters
this.addParameter(TypeFactionNameLenient.get(), "new name").setDesc("the new name of the faction");
this.addParameter(TypeFaction.get(), "faction", "you").setDesc("the faction whose name to change");
this.addParameter(TypeFactionNameLenient.get(), "new name");
this.addParameter(TypeFaction.get(), "faction", "you");
}
// -------------------------------------------- //

View File

@ -8,8 +8,6 @@ public class CmdFactionsPerm extends FactionsCommand
CmdFactionsPermList cmdFactionsPermList = new CmdFactionsPermList();
CmdFactionsPermShow cmdFactionsPermShow = new CmdFactionsPermShow();
CmdFactionsPermView cmdFactionsPermView = new CmdFactionsPermView();
CmdFactionsPermViewall cmdFactionsPermViewall = new CmdFactionsPermViewall();
CmdFactionsPermSet cmdFactionsPermSet = new CmdFactionsPermSet();
}

View File

@ -7,13 +7,26 @@ import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.Parameter;
import com.massivecraft.massivecore.pager.Pager;
import com.massivecraft.massivecore.pager.Stringifier;
import com.massivecraft.massivecore.predicate.Predicate;
import org.bukkit.Bukkit;
import java.util.List;
import java.util.function.Predicate;
public class CmdFactionsPermList extends FactionsCommand
{
// -------------------------------------------- //
// REUSABLE PREDICATE
// -------------------------------------------- //
private static final Predicate<MPerm> PREDICATE_MPERM_VISIBLE = new Predicate<MPerm>()
{
@Override
public boolean apply(MPerm mperm)
{
return mperm.isVisible();
}
};
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
@ -36,18 +49,31 @@ public class CmdFactionsPermList extends FactionsCommand
// Pager create
String title = String.format("Perms for %s", msenderFaction.describeTo(msender));
final Pager<MPerm> pager = new Pager<>(this, title, page, (Stringifier<MPerm>) (mp, i) -> mp.getDesc(true, true));
final Predicate<MPerm> predicate = msender.isOverriding() ? null : MPerm::isVisible;
final Pager<MPerm> pager = new Pager<>(this, title, page, new Stringifier<MPerm>()
{
@Override
public String toString(MPerm mperm, int index)
{
return mperm.getDesc(true, true);
}
});
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), () -> {
// Get items
List<MPerm> items = MPermColl.get().getAll(predicate);
// Pager items
pager.setItems(items);
// Pager message
pager.message();
final Predicate<MPerm> predicate = msender.isOverriding() ? null : PREDICATE_MPERM_VISIBLE;
Bukkit.getScheduler().runTaskAsynchronously(Factions.get(), new Runnable()
{
@Override
public void run()
{
// Get items
List<MPerm> items = MPermColl.get().getAll(predicate);
// Pager items
pager.setItems(items);
// Pager message
pager.message();
}
});
}

View File

@ -1,16 +1,20 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Rel;
import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.cmd.type.TypeMPerm;
import com.massivecraft.factions.cmd.type.TypeMPermable;
import com.massivecraft.factions.cmd.type.TypeRel;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.factions.event.EventFactionsPermChange;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.type.primitive.TypeBooleanYes;
import com.massivecraft.massivecore.util.Txt;
import java.util.ArrayList;
import java.util.List;
public class CmdFactionsPermSet extends FactionsCommand
{
// -------------------------------------------- //
@ -21,7 +25,7 @@ public class CmdFactionsPermSet extends FactionsCommand
{
// Parameters
this.addParameter(TypeMPerm.get(), "perm");
this.addParameter(TypeMPermable.get(), "rank/rel/player/faction");
this.addParameter(TypeRel.get(), "relation");
this.addParameter(TypeBooleanYes.get(), "yes/no");
this.addParameter(TypeFaction.get(), "faction", "you");
}
@ -34,11 +38,10 @@ public class CmdFactionsPermSet extends FactionsCommand
public void perform() throws MassiveException
{
// Args
MPerm perm = this.readArgAt(0);
Boolean value = this.readArgAt(2);
Faction faction = this.readArgAt(3, msenderFaction);
MPerm.MPermable permable = TypeMPermable.get(faction).read(this.argAt(1), sender);
MPerm perm = this.readArg();
Rel rel = this.readArg();
Boolean value = this.readArg();
Faction faction = this.readArg(msenderFaction);
// Do the sender have the right to change perms for this faction?
if ( ! MPerm.getPermPerms().has(msender, faction, true)) return;
@ -46,38 +49,50 @@ public class CmdFactionsPermSet extends FactionsCommand
// Is this perm editable?
if ( ! msender.isOverriding() && ! perm.isEditable())
{
throw new MassiveException().addMsg("<b>The perm <h>%s <b>is not editable.", perm.getName());
}
if (permable == faction)
{
throw new MassiveException().addMsg("<b>A faction can't have perms for itself. Perhaps try ranks.");
msg("<b>The perm <h>%s <b>is not editable.", perm.getName());
return;
}
// Event
EventFactionsPermChange event = new EventFactionsPermChange(sender, faction, perm, permable, value);
EventFactionsPermChange event = new EventFactionsPermChange(sender, faction, perm, rel, value);
event.run();
if (event.isCancelled()) return;
value = event.getNewValue();
// Apply
boolean change = faction.setPermitted(permable, perm, value);
// No change
if (!change)
if (faction.getPermitted(perm).contains(rel) == value)
{
throw new MassiveException().addMsg("%s <i>already has %s <i>set to %s <i>for %s<i>.", faction.describeTo(msender), perm.getDesc(true, false), Txt.parse(value ? "<g>YES" : "<b>NOO"), permable.getDisplayName(msender));
msg("%s <i>already has %s <i>set to %s <i>for %s<i>.", faction.describeTo(msender), perm.getDesc(true, false), Txt.parse(value ? "<g>YES" : "<b>NOO"), rel.getColor() + rel.getDescPlayerMany());
return;
}
// Apply
faction.setRelationPermitted(perm, rel, value);
// The following is to make sure the leader always has the right to change perms if that is our goal.
if (perm == MPerm.getPermPerms() && MConf.get().perm2default.get(MPerm.ID_PERMS).contains("LEADER"))
if (perm == MPerm.getPermPerms() && MPerm.getPermPerms().getStandard().contains(Rel.LEADER))
{
faction.setPermitted( faction.getLeaderRank(), MPerm.getPermPerms(), true);
faction.setRelationPermitted(MPerm.getPermPerms(), Rel.LEADER, true);
}
// Create messages
List<Object> messages = new ArrayList<>();
// Inform sender
String yesNo = Txt.parse(value ? "<g>YES" : "<b>NOO");
msg("<i>Set perm <h>%s <i>to <h>%s <i>for <reset>%s<i> in <reset>%s<i>.", perm.getName(), yesNo, permable.getDisplayName(msender), faction.describeTo(msender));
messages.add(Txt.titleize("Perm for " + faction.describeTo(msender, true)));
messages.add(MPerm.getStateHeaders());
messages.add(Txt.parse(perm.getStateInfo(faction.getPermitted(perm), true)));
message(messages);
// Inform faction (their message is slighly different)
List<MPlayer> recipients = faction.getMPlayers();
recipients.remove(msender);
for (MPlayer recipient : recipients)
{
recipient.msg("<h>%s <i>set a perm for <h>%s<i>.", msender.describeTo(recipient, true), faction.describeTo(recipient, true));
recipient.message(messages);
}
}
}

View File

@ -4,16 +4,13 @@ import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.cmd.type.TypeMPerm;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPerm.MPermable;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.collections.MassiveList;
import com.massivecraft.massivecore.command.type.container.TypeSet;
import com.massivecraft.massivecore.util.Txt;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class CmdFactionsPermShow extends FactionsCommand
{
@ -24,8 +21,8 @@ public class CmdFactionsPermShow extends FactionsCommand
public CmdFactionsPermShow()
{
// Parameters
this.addParameter(TypeMPerm.get(), "perm");
this.addParameter(TypeFaction.get(), "faction", "you");
this.addParameter(TypeSet.get(TypeMPerm.get()), "perms", "all", true);
}
// -------------------------------------------- //
@ -36,49 +33,21 @@ public class CmdFactionsPermShow extends FactionsCommand
public void perform() throws MassiveException
{
// Arg: Faction
MPerm mperm = this.readArg();
Faction faction = this.readArg(msenderFaction);
Set<String> permittedIds = faction.getPerms().get(mperm.getId());
List<MPermable> permables = new MassiveList<>();
for (String permitted : permittedIds)
{
permables.add(MPerm.idToMPermable(permitted));
}
String removeString = Txt.parse(" of ") + faction.getDisplayName(msender);
List<String> permableList = permables.stream()
.map(permable -> permable.getDisplayName(msender))
.map(s -> s.replace(removeString, ""))
.collect(Collectors.toList());
String permableNames = Txt.implodeCommaAnd(permableList, Txt.parse("<i>"));
Collection<MPerm> mperms = this.readArg(MPerm.getAll());
// Create messages
msg("<i>In <reset>%s <i>permission <reset>%s <i>is granted to <reset>%s<i>.", faction.describeTo(msender), mperm.getDesc(true, false), permableNames);
}
List<Object> messages = new ArrayList<>();
@Deprecated
public static MPerm.MPermable idToMPermable(String id)
{
return MPerm.idToMPermable(id);
}
public static String permablesToDisplayString(Collection<MPermable> permables, Object watcherObject)
{
MPlayer mplayer = MPlayer.get(watcherObject);
Faction faction = mplayer.getFaction();
String removeString;
if (faction.isNone()) removeString = "";
else removeString = Txt.parse(" of ") + faction.getDisplayName(mplayer);
List<String> permableList = permables.stream()
.map(permable -> permable.getDisplayName(mplayer))
.map(s -> s.replace(removeString, ""))
.collect(Collectors.toList());
return Txt.implodeCommaAnd(permableList, Txt.parse("<i>"));
messages.add(Txt.titleize("Perm for " + faction.describeTo(msender, true)));
messages.add(MPerm.getStateHeaders());
for (MPerm mperm : mperms)
{
messages.add(Txt.parse(mperm.getStateInfo(faction.getPermitted(mperm), true)));
}
// Send messages
message(messages);
}
}

View File

@ -1,103 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.cmd.type.TypeMPermable;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.factions.entity.Rank;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.collections.MassiveList;
import com.massivecraft.massivecore.mson.Mson;
import com.massivecraft.massivecore.util.MUtil;
import com.massivecraft.massivecore.util.Txt;
import org.bukkit.ChatColor;
import java.util.List;
import java.util.stream.Collectors;
public class CmdFactionsPermView extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsPermView()
{
// Parameters
this.addParameter(TypeMPermable.get(), "rank/rel/player/faction");
this.addParameter(TypeFaction.get(), "faction", "you");
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
// Arg: Faction
Faction faction = this.readArgAt(1, msenderFaction);
TypeMPermable permableType = TypeMPermable.get(faction);
MPerm.MPermable permable = permableType.read(this.argAt(0), sender);
if (permable == faction)
{
throw new MassiveException().addMsg("<b>A faction can't have perms for itself.");
}
List<MPerm> perms = new MassiveList<>();
for (MPerm mperm : MPerm.getAll())
{
if (faction.isPermitted(permable.getId(), mperm.getId())) perms.add(mperm);
}
if (perms.isEmpty())
{
msg("<i>In <reset>%s <reset>%s <i>specifically has <b>no permissions<i>.", faction.describeTo(msender), permable.getDisplayName(sender));
}
else
{
List<String> permNames = perms.stream().map(perm -> Txt.parse("<h>") + perm.getName()).collect(Collectors.toList());
String names = Txt.implodeCommaAnd(permNames, Txt.parse("<i>"));
// Create messages
String permissionSingularPlural = permNames.size() == 1 ? "permission" : "permissions";
msg("<i>In <reset>%s <reset>%s <i>specifically has the %s: <reset>%s<i>.", faction.describeTo(msender), permable.getDisplayName(sender), permissionSingularPlural, names);
}
if (permable instanceof MPlayer)
{
MPlayer mplayer = (MPlayer) permable;
msg("<i>They may have other permissions through their faction membership, rank or relation to <reset>%s<i>.", faction.describeTo(msender));
List<Mson> msons = new MassiveList<>();
if (mplayer.getFaction() != faction) msons.add(Mson.parse("<command>[faction]").command(this, mplayer.getFaction().getName(), faction.getName()));
msons.add(Mson.parse("<command>[rank]").command(this, mplayer.getFaction().getName() + "-" + mplayer.getRank().getName(), faction.getName()));
if (mplayer.getFaction() != faction) msons.add(Mson.parse("<command>[relation]").command(this, faction.getRelationTo(mplayer).toString(), faction.getName()));
Mson msons2 = Mson.implode(msons, Mson.SPACE);
message(mson(mson("Commands: ").color(ChatColor.YELLOW), msons2));
}
if (permable instanceof Faction)
{
Faction faction1 = (Faction) permable;
msg("<i>They may have other permissions through their relation to <reset>%s<i>.", faction.describeTo(msender));
Mson msonRelation = Mson.parse("<command>[relation]").command(this, faction.getRelationTo(faction1).toString(), faction.getName());
Mson msons = Mson.implode(MUtil.list(msonRelation), Mson.SPACE);
message(mson(mson("Commands: ").color(ChatColor.YELLOW), msons));
}
if (permable instanceof Rank && !faction.hasRank((Rank) permable))
{
Rank rank = (Rank) permable;
msg("<i>They may have other permissions thorugh their faction membership or relation to <reset>%s<i>.", faction.describeTo(msender));
Mson msonFaction = Mson.parse("<command>[faction]").command(this, rank.getFaction().getName(), faction.getName());
Mson msonRelation = Mson.parse("<command>[relation]").command(this, faction.getRelationTo(rank.getFaction()).toString(), faction.getName());
Mson msons = Mson.implode(MUtil.list(msonFaction, msonRelation), Mson.SPACE);
message(mson(mson("Commands: ").color(ChatColor.YELLOW), msons));
}
msg("<i>To view all perms held by %s <i>type:", permable.getDisplayName(sender));
message(CmdFactions.get().cmdFactionsPerm.cmdFactionsPermViewall.getTemplateWithArgs(sender, MUtil.list(permable.getName(), faction.getName())));
}
}

View File

@ -1,104 +0,0 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeFaction;
import com.massivecraft.factions.cmd.type.TypeMPermable;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPerm;
import com.massivecraft.factions.entity.MPerm.MPermable;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.factions.entity.Rank;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.collections.MassiveList;
import com.massivecraft.massivecore.util.Txt;
import java.util.List;
import java.util.stream.Collectors;
public class CmdFactionsPermViewall extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsPermViewall()
{
// Parameters
this.addParameter(TypeMPermable.get(), "rank/rel/player/faction");
this.addParameter(TypeFaction.get(), "faction", "you");
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
// Arg: Faction
Faction faction = this.readArgAt(1, msenderFaction);
TypeMPermable permableType = TypeMPermable.get(faction);
MPerm.MPermable permable = permableType.read(this.argAt(0), sender);
// Self check
if (permable == faction)
{
throw new MassiveException().addMsg("<b>A faction can't have perms for itself.");
}
// Create list of all applicable permables
List<MPermable> permables = new MassiveList<>();
permables.add(permable);
if (permable instanceof MPlayer)
{
MPlayer mplayer = (MPlayer) permable;
permables.add(mplayer.getFaction());
permables.add(mplayer.getRank());
permables.add(faction.getRelationTo(mplayer));
}
if (permable instanceof Faction)
{
Faction faction1 = (Faction) permable;
permables.add(faction.getRelationTo(faction1));
}
if (permable instanceof Rank && !faction.hasRank((Rank) permable))
{
Rank rank = (Rank) permable;
Faction faction1 = rank.getFaction();
permables.add(faction1);
permables.add(faction.getRelationTo(faction1));
}
// Find the perms they have
List<MPerm> perms = new MassiveList<>();
perm:
for (MPerm mperm : MPerm.getAll())
{
String mpermId = mperm.getId();
permable:
for (MPermable mpa : permables)
{
if (!faction.isPermitted(mpa.getId(), mperm.getId())) continue permable;
perms.add(mperm);
continue perm;
}
}
if (perms.isEmpty())
{
msg("<i>In <reset>%s <reset>%s <i>has <b>no permissions<i>.", faction.describeTo(msender), permable.getDisplayName(sender));
}
else
{
List<String> permNames = perms.stream().map(perm -> Txt.parse("<h>") + perm.getName()).collect(Collectors.toList());
String names = Txt.implodeCommaAnd(permNames, Txt.parse("<i>"));
// Create messages
String permissionSingularPlural = permNames.size() == 1 ? "permission" : "permissions";
msg("<i>In <reset>%s <reset>%s <i>has the %s: <reset>%s<i> either specifically granted to them or through rank, relation or faction membership.", faction.describeTo(msender), permable.getDisplayName(sender), permissionSingularPlural, names);
}
}
}

View File

@ -1,109 +1,106 @@
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeMPlayer;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.Progressbar;
import com.massivecraft.massivecore.event.EventMassiveCorePlayerCleanInactivityToleranceMillis;
import com.massivecraft.massivecore.util.TimeDiffUtil;
import com.massivecraft.massivecore.util.TimeUnit;
import com.massivecraft.massivecore.util.Txt;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
public class CmdFactionsPlayer extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsPlayer()
{
// Parameters
this.addParameter(TypeMPlayer.get(), "player", "you");
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
// Args
MPlayer mplayer = this.readArg(msender);
// INFO: Title
message(Txt.titleize("Player " + mplayer.describeTo(msender)));
// INFO: Rank
msg("<a>Rank: <v>%s", mplayer.getRank().getDisplayName(sender));
// INFO: Power (as progress bar)
double progressbarQuota = 0;
double playerPowerMax = mplayer.getPowerMax();
if (playerPowerMax != 0)
{
progressbarQuota = mplayer.getPower() / playerPowerMax;
}
int progressbarWidth = (int) Math.round(mplayer.getPowerMax() / mplayer.getPowerMaxUniversal() * 100);
msg("<a>Power: <v>%s", Progressbar.HEALTHBAR_CLASSIC.withQuota(progressbarQuota).withWidth(progressbarWidth).render());
// INFO: Power (as digits)
msg("<a>Power: <v>%.2f / %.2f", mplayer.getPower(), mplayer.getPowerMax());
// INFO: Power Boost
if (mplayer.hasPowerBoost())
{
double powerBoost = mplayer.getPowerBoost();
String powerBoostType = (powerBoost > 0 ? "bonus" : "penalty");
msg("<a>Power Boost: <v>%f <i>(a manually granted %s)", powerBoost, powerBoostType);
}
// INFO: Power per Hour
// If the player is not at maximum we wan't to display how much time left.
String stringTillMax = "";
double powerTillMax = mplayer.getPowerMax() - mplayer.getPower();
if (powerTillMax > 0)
{
long millisTillMax = (long) (powerTillMax * TimeUnit.MILLIS_PER_HOUR / mplayer.getPowerPerHour());
LinkedHashMap<TimeUnit, Long> unitcountsTillMax = TimeDiffUtil.unitcounts(millisTillMax, TimeUnit.getAllButMillis());
unitcountsTillMax = TimeDiffUtil.limit(unitcountsTillMax, 2);
String unitcountsTillMaxFormated = TimeDiffUtil.formatedVerboose(unitcountsTillMax, "<i>");
stringTillMax = Txt.parse(" <i>(%s <i>left till max)", unitcountsTillMaxFormated);
}
msg("<a>Power per Hour: <v>%.2f%s", mplayer.getPowerPerHour(), stringTillMax);
// INFO: Power per Death
msg("<a>Power per Death: <v>%.2f", mplayer.getPowerPerDeath());
// Display automatic kick / remove info if the system is in use
if (MConf.get().cleanInactivityToleranceMillis <= 0) return;
EventMassiveCorePlayerCleanInactivityToleranceMillis event = new EventMassiveCorePlayerCleanInactivityToleranceMillis(mplayer.getLastActivityMillis(), mplayer);
event.run();
msg("<i>Automatic removal after %s <i>of inactivity:", format(event.getToleranceMillis()));
for (Entry<String, Long> causeMillis : event.getToleranceCauseMillis().entrySet())
{
String cause = causeMillis.getKey();
long millis = causeMillis.getValue();
msg("<a>%s<a>: <v>%s", cause, format(millis));
}
}
// -------------------------------------------- //
// TIME FORMAT
// -------------------------------------------- //
public static String format(long millis)
{
LinkedHashMap<TimeUnit, Long> unitcounts = TimeDiffUtil.unitcounts(millis, TimeUnit.getAllBut(TimeUnit.MILLISECOND, TimeUnit.WEEK, TimeUnit.MONTH));
return TimeDiffUtil.formatedVerboose(unitcounts);
}
}
package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeMPlayer;
import com.massivecraft.factions.entity.MConf;
import com.massivecraft.factions.entity.MPlayer;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.Progressbar;
import com.massivecraft.massivecore.event.EventMassiveCorePlayerCleanInactivityToleranceMillis;
import com.massivecraft.massivecore.util.TimeDiffUtil;
import com.massivecraft.massivecore.util.TimeUnit;
import com.massivecraft.massivecore.util.Txt;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
public class CmdFactionsPlayer extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsPlayer()
{
// Parameters
this.addParameter(TypeMPlayer.get(), "player", "you");
}
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public void perform() throws MassiveException
{
// Args
MPlayer mplayer = this.readArg(msender);
// INFO: Title
message(Txt.titleize("Player " + mplayer.describeTo(msender)));
// INFO: Power (as progress bar)
double progressbarQuota = 0;
double playerPowerMax = mplayer.getPowerMax();
if (playerPowerMax != 0)
{
progressbarQuota = mplayer.getPower() / playerPowerMax;
}
int progressbarWidth = (int) Math.round(mplayer.getPowerMax() / mplayer.getPowerMaxUniversal() * 100);
msg("<a>Power: <v>%s", Progressbar.HEALTHBAR_CLASSIC.withQuota(progressbarQuota).withWidth(progressbarWidth).render());
// INFO: Power (as digits)
msg("<a>Power: <v>%.2f / %.2f", mplayer.getPower(), mplayer.getPowerMax());
// INFO: Power Boost
if (mplayer.hasPowerBoost())
{
double powerBoost = mplayer.getPowerBoost();
String powerBoostType = (powerBoost > 0 ? "bonus" : "penalty");
msg("<a>Power Boost: <v>%f <i>(a manually granted %s)", powerBoost, powerBoostType);
}
// INFO: Power per Hour
// If the player is not at maximum we wan't to display how much time left.
String stringTillMax = "";
double powerTillMax = mplayer.getPowerMax() - mplayer.getPower();
if (powerTillMax > 0)
{
long millisTillMax = (long) (powerTillMax * TimeUnit.MILLIS_PER_HOUR / mplayer.getPowerPerHour());
LinkedHashMap<TimeUnit, Long> unitcountsTillMax = TimeDiffUtil.unitcounts(millisTillMax, TimeUnit.getAllButMillis());
unitcountsTillMax = TimeDiffUtil.limit(unitcountsTillMax, 2);
String unitcountsTillMaxFormated = TimeDiffUtil.formatedVerboose(unitcountsTillMax, "<i>");
stringTillMax = Txt.parse(" <i>(%s <i>left till max)", unitcountsTillMaxFormated);
}
msg("<a>Power per Hour: <v>%.2f%s", mplayer.getPowerPerHour(), stringTillMax);
// INFO: Power per Death
msg("<a>Power per Death: <v>%.2f", mplayer.getPowerPerDeath());
// Display automatic kick / remove info if the system is in use
if (MConf.get().cleanInactivityToleranceMillis <= 0) return;
EventMassiveCorePlayerCleanInactivityToleranceMillis event = new EventMassiveCorePlayerCleanInactivityToleranceMillis(mplayer.getLastActivityMillis(), mplayer);
event.run();
msg("<i>Automatic removal after %s <i>of inactivity:", format(event.getToleranceMillis()));
for (Entry<String, Long> causeMillis : event.getToleranceCauseMillis().entrySet())
{
String cause = causeMillis.getKey();
long millis = causeMillis.getValue();
msg("<a>%s<a>: <v>%s", cause, format(millis));
}
}
// -------------------------------------------- //
// TIME FORMAT
// -------------------------------------------- //
public static String format(long millis)
{
LinkedHashMap<TimeUnit, Long> unitcounts = TimeDiffUtil.unitcounts(millis, TimeUnit.getAllBut(TimeUnit.MILLISECOND, TimeUnit.WEEK, TimeUnit.MONTH));
return TimeDiffUtil.formatedVerboose(unitcounts);
}
}

View File

@ -1,19 +1,19 @@
package com.massivecraft.factions.cmd;
public class CmdFactionsPowerboost extends FactionsCommand
public class CmdFactionsPowerBoost extends FactionsCommand
{
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
public CmdFactionsPowerboostPlayer cmdFactionsPowerBoostPlayer = new CmdFactionsPowerboostPlayer();
public CmdFactionsPowerboostFaction cmdFactionsPowerBoostFaction = new CmdFactionsPowerboostFaction();
public CmdFactionsPowerBoostPlayer cmdFactionsPowerBoostPlayer = new CmdFactionsPowerBoostPlayer();
public CmdFactionsPowerBoostFaction cmdFactionsPowerBoostFaction = new CmdFactionsPowerBoostFaction();
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsPowerboost()
public CmdFactionsPowerBoost()
{
// Child
this.addChild(this.cmdFactionsPowerBoostPlayer);

View File

@ -2,33 +2,26 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.Factions;
import com.massivecraft.factions.FactionsParticipator;
import com.massivecraft.factions.Perm;
import com.massivecraft.massivecore.MassiveException;
import com.massivecraft.massivecore.command.type.Type;
import com.massivecraft.massivecore.command.type.TypeNullable;
import com.massivecraft.massivecore.command.type.primitive.TypeDouble;
import com.massivecraft.massivecore.util.Txt;
public abstract class CmdFactionsPowerboostAbstract extends FactionsCommand
public abstract class CmdFactionsPowerBoostAbstract extends FactionsCommand
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
protected CmdFactionsPowerboostAbstract(Type<? extends FactionsParticipator> parameterType, String parameterName)
protected CmdFactionsPowerBoostAbstract(Type<? extends FactionsParticipator> parameterType, String parameterName)
{
// Parameters
this.addParameter(parameterType, parameterName);
if (!this.getClass().getSimpleName().contains("Show"))
{
this.addParameter(TypeDouble.get(), "amount");
}
this.addParameter(TypeNullable.get(TypeDouble.get()), "amount", "show");
}
// -------------------------------------------- //
// ABSTRACT
// -------------------------------------------- //
public abstract double calcNewPowerboost(double current, double d);
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@ -38,32 +31,35 @@ public abstract class CmdFactionsPowerboostAbstract extends FactionsCommand
{
// Parameters
FactionsParticipator factionsParticipator = this.readArg();
boolean updated = false;
Double powerBoost = this.readArg(factionsParticipator.getPowerBoost());
// Try set the powerBoost
if (this.argIsSet(1))
{
// Yes updated
updated = true;
// Calc powerboost
double current = factionsParticipator.getPowerBoost();
double number = this.readArg();
double powerBoost = this.calcNewPowerboost(current, number);
// Set
factionsParticipator.setPowerBoost(powerBoost);
}
boolean updated = this.trySet(factionsParticipator, powerBoost);
// Inform
this.informPowerBoost(factionsParticipator, updated);
this.informPowerBoost(factionsParticipator, powerBoost, updated);
}
private void informPowerBoost(FactionsParticipator factionsParticipator, boolean updated)
private boolean trySet(FactionsParticipator factionsParticipator, Double powerBoost) throws MassiveException
{
// Trying to set?
if (!this.argIsSet(1)) return false;
// Check set permissions
if (!Perm.POWERBOOST_SET.has(sender, true)) throw new MassiveException();
// Set
factionsParticipator.setPowerBoost(powerBoost);
// Return
return true;
}
private void informPowerBoost(FactionsParticipator factionsParticipator, Double powerBoost, boolean updated)
{
// Prepare
Double powerBoost = factionsParticipator.getPowerBoost();
String participatorDescribe = factionsParticipator.describeTo(msender, true);
powerBoost = powerBoost == null ? factionsParticipator.getPowerBoost() : powerBoost;
String powerDescription = Txt.parse(Double.compare(powerBoost, 0D) >= 0 ? "<g>bonus" : "<b>penalty");
String when = updated ? "now " : "";
String verb = factionsParticipator.equals(msender) ? "have" : "has";

View File

@ -2,15 +2,15 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeFaction;
public abstract class CmdFactionsPowerboostFactionAbstract extends CmdFactionsPowerboostAbstract
public class CmdFactionsPowerBoostFaction extends CmdFactionsPowerBoostAbstract
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsPowerboostFactionAbstract()
public CmdFactionsPowerBoostFaction()
{
super(TypeFaction.get(), "faction");
}
}

View File

@ -2,15 +2,15 @@ package com.massivecraft.factions.cmd;
import com.massivecraft.factions.cmd.type.TypeMPlayer;
public abstract class CmdFactionsPowerboostPlayerAbstract extends CmdFactionsPowerboostAbstract
public class CmdFactionsPowerBoostPlayer extends CmdFactionsPowerBoostAbstract
{
// -------------------------------------------- //
// CONSTRUCT
// -------------------------------------------- //
public CmdFactionsPowerboostPlayerAbstract()
public CmdFactionsPowerBoostPlayer()
{
super(TypeMPlayer.get(), "player");
}
}

View File

@ -1,15 +0,0 @@
package com.massivecraft.factions.cmd;
public class CmdFactionsPowerboostFaction extends FactionsCommand
{
// -------------------------------------------- //
// FIELDS
// -------------------------------------------- //
public CmdFactionsPowerboostFactionShow cmdFactionsPowerBoostFactionShow = new CmdFactionsPowerboostFactionShow();
public CmdFactionsPowerboostFactionSet cmdFactionsPowerBoostFactionSet = new CmdFactionsPowerboostFactionSet();
public CmdFactionsPowerboostFactionAdd cmdFactionsPowerBoostFactionAdd = new CmdFactionsPowerboostFactionAdd();
public CmdFactionsPowerboostFactionTake cmdFactionsPowerBoostFactionTake = new CmdFactionsPowerboostFactionTake();
public CmdFactionsPowerboostFactionMultiply cmdFactionsPowerBoostFactionMultiply = new CmdFactionsPowerboostFactionMultiply();
}

View File

@ -1,15 +0,0 @@
package com.massivecraft.factions.cmd;
public class CmdFactionsPowerboostFactionAdd extends CmdFactionsPowerboostFactionAbstract
{
// -------------------------------------------- //
// OVERRIDE
// -------------------------------------------- //
@Override
public double calcNewPowerboost(double current, double d)
{
return current + d;
}
}

Some files were not shown because too many files have changed in this diff Show More