Compare commits

..

501 Commits

Author SHA1 Message Date
0f1fbf9481 Merge pull request #198 from AtlasMediaGroup/RELEASE-2022.02
Release 2022.02
2022-06-04 15:04:16 +01:00
d13ecea947 Merge branch 'RELEASE-2022.02' of https://github.com/AtlasMediaGroup/TotalFreedomMod into RELEASE-2022.02 2022-05-01 09:55:58 -05:00
7ec053c867 Adjusted version
Removed "-RELEASE"
2022-05-01 09:55:47 -05:00
1dcc05e7f5 Merge pull request #195 from AtlasMediaGroup/Wild1145-patch-3
Update SECURITY.md
2022-05-01 15:45:16 +01:00
c913b7ae74 Set Maven Shade version to 3.3.0 2022-05-01 09:41:53 -05:00
951f3c91d9 2022.02-RELEASE Versioning
- Changed the version to 2022.02-RELEASE
- Changed the API version to 1.17
2022-05-01 09:31:20 -05:00
adbe125283 increments version 2022-04-20 17:03:13 -06:00
e6a20e1757 fix httpd log spam
fix httpd log spam with invalid url encoded strings (lol)
2022-04-17 14:58:58 -07:00
733f002a87 Bump to RC02 and fix Netbeans compile issue. 2022-03-27 19:49:16 +01:00
f9eabf27d5 Merge pull request #205 from AtlasMediaGroup/fs-442
FS-442
2022-03-06 16:15:53 -07:00
76ce98621a Corrected now that we're targeting the 2022.02 relase. 2022-03-06 14:42:45 +00:00
bc0495a68f Update SECURITY.md
Fixes to update the documentation based on actively supported versions.
2022-03-06 14:39:41 +00:00
846154a723 will this work 2022-03-06 14:37:45 +00:00
804614d011 Bump to 2022.02-RC01 Release
Primarily adds 1.17 support, other fixes may be present, please see full release notes for info.
2022-02-23 23:23:14 +00:00
2c22c6c52d Merge pull request #194 from AtlasMediaGroup/Wild1145-patch-1
Update various dependencies based on Freedom-01 State
2022-02-23 17:10:09 -06:00
5ef0f29ffe Merge branch 'development' into Wild1145-patch-1 2022-02-23 22:48:53 +00:00
11134f4109 Merge pull request #197 from AtlasMediaGroup/FS-292
Uplifts the plugin to 1.17.1
2022-02-23 22:48:32 +00:00
e7992c7eb4 Merge branch 'development' into Wild1145-patch-1 2022-02-22 21:17:02 +00:00
82e966dfb0 Delete java11-maven.yml 2022-02-22 20:50:41 +00:00
f457c4cde2 Merge branch 'development' into FS-292 2022-02-21 18:08:29 -06:00
004a0f3d7c Update Groups.java
This should resolve the issues with spawn eggs and mobs.
2022-02-21 17:04:53 -07:00
cf5199f28e Squashed commit of the following:
commit 43c68579e5
Merge: 2618d97a b711ed51
Author: elmon <elmon11bussiness@gmail.com>
Date:   Mon Feb 21 10:01:39 2022 +0100

    Merge pull request #190 from AtlasMediaGroup/Elmon11-patch-2

    order of messages fix

commit b711ed517f
Merge: 1c464729 2618d97a
Author: elmon <elmon11bussiness@gmail.com>
Date:   Mon Jan 24 22:16:24 2022 +0100

    Merge branch 'development' into Elmon11-patch-2

commit 2618d97a3e
Author: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
Date:   Mon Jan 24 12:42:47 2022 +1100

    Remove requireNonNull method from getIp, which causes NPE - resolves FS-429 (#187)

    Co-authored-by: Paldiu <pawereus@gmail.com>

commit 1c4647290a
Merge: f00f67a8 850f1210
Author: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
Date:   Mon Jan 24 12:41:47 2022 +1100

    Merge branch 'development' into Elmon11-patch-2

commit f00f67a844
Author: elmon <elmon11bussiness@gmail.com>
Date:   Sun Jan 23 13:26:22 2022 +0100

    order of messages fix

    https://media.discordapp.net/attachments/874713176082636882/934559012991680532/unknown.png

commit 850f12103c
Merge: 2eb0ab4c 7fd77f3c
Author: Paldiu <pawereus@gmail.com>
Date:   Mon Jan 17 11:35:09 2022 -0600

    Merge pull request #188 from AtlasMediaGroup/Wild1145-patch-1

    Correct CoreProtect Version

commit 7fd77f3cbb
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Jan 16 18:22:16 2022 +0000

    Correct CoreProtect Version

    To align with the version running on Freedom-01 at the moment.

commit 2eb0ab4cb1
Merge: 8cff0124 2612aaec
Author: Video <videogamesm12@gmail.com>
Date:   Wed Dec 22 20:56:46 2021 -0700

    Merge pull request #179 from AtlasMediaGroup/FS-212

    Makes spawnmob configurable, increases the default limit to 25 (FS-212)

commit 2612aaec31
Author: Video <videogamesm12@gmail.com>
Date:   Wed Dec 15 21:46:56 2021 -0700

    Makes spawnmob configurable and increases the default limit to 25

commit 8cff0124ea
Merge: 35965b0b 1162f10e
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 06:36:20 2021 -0700

    Merge pull request #93 from AtlasMediaGroup/FS-37

    Fixes FS-37

commit 1162f10ebb
Merge: 7ce173e0 35965b0b
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 06:31:18 2021 -0700

    Merge branch 'development' into FS-37

commit 35965b0b10
Merge: aa20a6e5 1253732f
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 06:31:11 2021 -0700

    Merge pull request #174 from AtlasMediaGroup/FS-256

    Forces the server to recalculate the permissions server-wide in /opall (FS-256)

commit 1253732f77
Merge: e1bee321 aa20a6e5
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 06:25:25 2021 -0700

    Merge branch 'development' into FS-256

commit 7ce173e02b
Merge: 4d006ed1 aa20a6e5
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 06:24:34 2021 -0700

    Merge branch 'development' into FS-37

commit aa20a6e579
Merge: 70622900 1ecfb0b0
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 06:23:57 2021 -0700

    Merge pull request #129 from AtlasMediaGroup/FS-7

    Allow players to pay other players coins [FS-7]

commit e1bee32163
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 03:27:07 2021 -0700

    Forces the server to recalculate the permissions server-wide in /opall

commit 4d006ed172
Merge: 8cbfde8b 70622900
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 03:04:42 2021 -0700

    Merge branch 'development' into FS-37

commit 1ecfb0b066
Merge: 225ade87 70622900
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 03:01:22 2021 -0700

    Merge branch 'development' into FS-7

commit 706229004c
Merge: a42cb6af a4adfa9b
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 03:00:15 2021 -0700

    Merge pull request #131 from AtlasMediaGroup/FS-273

    Moves /rainbowtrail to the shop (FS-273)

commit a4adfa9bee
Merge: 1b5bbd1c a42cb6af
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 02:46:41 2021 -0700

    Merge branch 'development' into FS-273

commit 225ade8753
Merge: afe755f5 a42cb6af
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 02:46:02 2021 -0700

    Merge branch 'development' into FS-7

commit 8cbfde8bbc
Merge: bba5ec92 a42cb6af
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 02:41:49 2021 -0700

    Merge branch 'development' into FS-37

commit a42cb6aff9
Merge: 2ecfb886 01fdf766
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 02:41:34 2021 -0700

    Merge pull request #125 from AtlasMediaGroup/shitcan-savedflags

    Shitcans SavedFlags

commit 01fdf766ee
Merge: 58c21bb1 2ecfb886
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:28:48 2021 -0700

    Merge branch 'development' into shitcan-savedflags

commit afe755f5c1
Merge: 5f97e68e 2ecfb886
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:26:59 2021 -0700

    Merge branch 'development' into FS-7

commit 5f97e68e0e
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:26:49 2021 -0700

    fuck it, it works

commit 1b5bbd1c05
Merge: 8356e831 2ecfb886
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:16:21 2021 -0700

    Merge branch 'development' into FS-273

commit 2ecfb88604
Merge: 42143c11 bb2ddf11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:15:16 2021 -0700

    Merge pull request #130 from AtlasMediaGroup/FS-215

    Makes [Discord] a hyperlink (FS-215)

commit 8356e831a5
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:11:16 2021 -0700

    Redundancy fix and better protection system

commit ab00cb840f
Merge: ecce62f6 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:31:45 2021 -0700

    Merge branch 'development' into FS-273

commit bb2ddf1129
Merge: cf9fdc6f 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:31:19 2021 -0700

    Merge branch 'development' into FS-215

commit bba5ec922b
Merge: 68adaed9 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:31:13 2021 -0700

    Merge branch 'development' into FS-37

commit 58c21bb1aa
Merge: fdba119d 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:30:48 2021 -0700

    Merge branch 'development' into shitcan-savedflags

commit 68adaed997
Merge: 087b8dd7 a598c933
Author: Video <videogamesm12@gmail.com>
Date:   Sat Oct 9 00:09:24 2021 -0600

    Merge branch 'development' into FS-37

commit ecce62f6b4
Merge: d8148530 a598c933
Author: Video <videogamesm12@gmail.com>
Date:   Sat Oct 9 00:01:22 2021 -0600

    Merge branch 'development' into FS-273

commit cf9fdc6fe4
Merge: 387ea6f7 a598c933
Author: Video <videogamesm12@gmail.com>
Date:   Fri Oct 8 01:43:33 2021 -0600

    Merge branch 'development' into FS-215

commit 387ea6f71e
Merge: a1ecf881 180cd811
Author: Video <videogamesm12@gmail.com>
Date:   Fri Oct 1 00:35:12 2021 -0600

    Merge branch 'development' into FS-215

commit d814853036
Merge: 47e63869 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:49:05 2021 +0100

    Merge branch 'development' into FS-273

commit a1ecf88109
Merge: bd647afe 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:59 2021 +0100

    Merge branch 'development' into FS-215

commit 5a6a5ff75d
Merge: 6ca61d9c 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:50 2021 +0100

    Merge branch 'development' into FS-7

commit fdba119d5d
Merge: 61857dd0 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:44 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit 087b8dd7ea
Merge: 3818aab4 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:21 2021 +0100

    Merge branch 'development' into FS-37

commit 3818aab454
Merge: caeda219 0e12f5e7
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 03:04:08 2021 -0600

    Merge branch 'development' into FS-37

commit 61857dd06f
Merge: 2d18d461 0e12f5e7
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 03:01:37 2021 -0600

    Merge branch 'development' into shitcan-savedflags

commit bd647afe92
Merge: 69f17ef2 0e12f5e7
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 02:50:39 2021 -0600

    Merge branch 'development' into FS-215

commit 69f17ef2d7
Merge: ee1b27fa aebe1ace
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 02:01:56 2021 -0600

    Merge branch 'development' into FS-215

commit caeda219fa
Merge: 3ca98352 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 15:26:37 2021 +0100

    Merge branch 'development' into FS-37

commit ee1b27fa0d
Merge: 2bdf14f3 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:24:00 2021 +0100

    Merge branch 'development' into FS-215

commit 6ca61d9c6c
Merge: fedf80b8 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:23:52 2021 +0100

    Merge branch 'development' into FS-7

commit 2d18d461fe
Merge: a4c81f20 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:23:44 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit 47e6386907
Merge: b1062fbb 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:23:13 2021 +0100

    Merge branch 'development' into FS-273

commit fedf80b834
Merge: a2d11d4b 44ff621d
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 10 01:39:16 2021 -0600

    Merge branch 'development' into FS-7

commit 2bdf14f38c
Merge: f6d46b61 44ff621d
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 15:26:13 2021 -0600

    Merge branch 'development' into FS-215

commit b1062fbb6c
Merge: f69feed4 44ff621d
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 14:39:32 2021 -0600

    Merge branch 'development' into FS-273

commit 3ca9835257
Merge: da82b270 54cb0cfa
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 01:16:04 2021 -0600

    Merge branch 'development' into FS-37

commit f69feed469
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 01:14:21 2021 -0600

    fixed

commit 8253f94ac4
Merge: daf0126f 54cb0cfa
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 01:12:00 2021 -0600

    Merge branch 'development' into FS-273

commit a4c81f202c
Merge: 0d09c3a5 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:23:06 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit da82b27016
Merge: af1df228 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:07:55 2021 +0100

    Merge branch 'development' into FS-37

commit daf0126f45
Merge: a51f5c9b 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:07:39 2021 +0100

    Merge branch 'development' into FS-273

commit f6d46b6178
Merge: ee804d52 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:07:33 2021 +0100

    Merge branch 'development' into FS-215

commit a2d11d4b93
Merge: dc490659 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:07:28 2021 +0100

    Merge branch 'development' into FS-7

commit a51f5c9bbf
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 3 13:53:33 2021 -0600

    FS-273

commit ee804d52ff
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 3 12:52:15 2021 -0600

    Makes [Discord] a hyperlink (FS-215)

    I've decided to overhaul the implementation of DiscordToMinecraftListener to make it more easily workable. This overhaul allows me to implement FS-215 more easily.

commit dc490659c1
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 3 00:07:20 2021 -0600

    Begins implementing FS-7

    should be good enough, but feedback would be lovely

commit 0d09c3a550
Merge: e2ccd14e 4c3f188b
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Aug 29 20:09:03 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit e2ccd14eb3
Author: Video <videogamesm12@gmail.com>
Date:   Fri Aug 27 16:54:55 2021 -0600

    Unsaves SavedFlags

commit af1df22812
Merge: 1474a808 f380898b
Author: Video <videogamesm12@gmail.com>
Date:   Thu Aug 26 23:05:58 2021 -0600

    Merge branch 'development' into FS-37

commit 1474a80875
Merge: 77fd4ff6 f45466ee
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Thu Aug 26 13:26:44 2021 +0100

    Merge branch 'development' into FS-37

commit 77fd4ff66a
Merge: 33aca2a4 d901cbaa
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Aug 21 21:34:04 2021 +0100

    Merge branch 'development' into FS-37

commit 33aca2a482
Merge: 159eda73 0582c2e5
Author: Video <videogamesm12@gmail.com>
Date:   Tue Aug 10 22:38:51 2021 -0600

    Merge branch 'development' into FS-37

commit 159eda73a1
Merge: da2d2525 6874b2ce
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Tue Aug 10 17:34:12 2021 +0100

    Merge branch 'development' into FS-37

commit da2d25252b
Merge: e99aaa2e c8a4382a
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Tue Aug 10 17:31:13 2021 +0100

    Merge branch 'development' into FS-37

commit e99aaa2eb4
Author: Video <videogamesm12@gmail.com>
Date:   Thu Aug 5 00:32:23 2021 -0600

    Fixes FS-37

    Fixes an oversight introduced in 76bb2d08ac in which the configuration is loaded twice.
2022-02-21 16:45:03 -07:00
43c68579e5 Merge pull request #190 from AtlasMediaGroup/Elmon11-patch-2
order of messages fix
2022-02-21 10:01:39 +01:00
127ee7d9f9 Move CodeQL to Java 17 2022-02-18 16:50:45 +00:00
c873fd4abc Update pom.xml 2022-02-16 21:02:00 +00:00
fa90e1d239 Update various dependencies based on Freedom-01 State
Various plugins have been updated but not reflected back here. This PR Corrects that.
2022-02-05 23:25:57 +00:00
b711ed517f Merge branch 'development' into Elmon11-patch-2 2022-01-24 22:16:24 +01:00
2618d97a3e Remove requireNonNull method from getIp, which causes NPE - resolves FS-429 (#187)
Co-authored-by: Paldiu <pawereus@gmail.com>
2022-01-24 12:42:47 +11:00
1c4647290a Merge branch 'development' into Elmon11-patch-2 2022-01-24 12:41:47 +11:00
f00f67a844 order of messages fix
https://media.discordapp.net/attachments/874713176082636882/934559012991680532/unknown.png
2022-01-23 13:26:22 +01:00
850f12103c Merge pull request #188 from AtlasMediaGroup/Wild1145-patch-1
Correct CoreProtect Version
2022-01-17 11:35:09 -06:00
7fd77f3cbb Correct CoreProtect Version
To align with the version running on Freedom-01 at the moment.
2022-01-16 18:22:16 +00:00
2eb0ab4cb1 Merge pull request #179 from AtlasMediaGroup/FS-212
Makes spawnmob configurable, increases the default limit to 25 (FS-212)
2021-12-22 20:56:46 -07:00
2612aaec31 Makes spawnmob configurable and increases the default limit to 25 2021-12-15 21:46:56 -07:00
6e7ad73152 Nevermind that didn't work 2021-11-29 07:03:29 -07:00
af6411b82c Wait a second
This *should* work...
2021-11-29 06:54:04 -07:00
e9ba958a4e Squashed commit of the following:
commit 35965b0b10
Merge: aa20a6e5 1253732f
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 06:31:11 2021 -0700

    Merge pull request #174 from AtlasMediaGroup/FS-256

    Forces the server to recalculate the permissions server-wide in /opall (FS-256)

commit 1253732f77
Merge: e1bee321 aa20a6e5
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 06:25:25 2021 -0700

    Merge branch 'development' into FS-256

commit aa20a6e579
Merge: 70622900 1ecfb0b0
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 06:23:57 2021 -0700

    Merge pull request #129 from AtlasMediaGroup/FS-7

    Allow players to pay other players coins [FS-7]

commit e1bee32163
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 03:27:07 2021 -0700

    Forces the server to recalculate the permissions server-wide in /opall

commit 1ecfb0b066
Merge: 225ade87 70622900
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 03:01:22 2021 -0700

    Merge branch 'development' into FS-7

commit 706229004c
Merge: a42cb6af a4adfa9b
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 03:00:15 2021 -0700

    Merge pull request #131 from AtlasMediaGroup/FS-273

    Moves /rainbowtrail to the shop (FS-273)

commit a4adfa9bee
Merge: 1b5bbd1c a42cb6af
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 02:46:41 2021 -0700

    Merge branch 'development' into FS-273

commit 225ade8753
Merge: afe755f5 a42cb6af
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 02:46:02 2021 -0700

    Merge branch 'development' into FS-7

commit a42cb6aff9
Merge: 2ecfb886 01fdf766
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 02:41:34 2021 -0700

    Merge pull request #125 from AtlasMediaGroup/shitcan-savedflags

    Shitcans SavedFlags

commit 01fdf766ee
Merge: 58c21bb1 2ecfb886
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:28:48 2021 -0700

    Merge branch 'development' into shitcan-savedflags

commit afe755f5c1
Merge: 5f97e68e 2ecfb886
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:26:59 2021 -0700

    Merge branch 'development' into FS-7

commit 5f97e68e0e
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:26:49 2021 -0700

    fuck it, it works

commit 1b5bbd1c05
Merge: 8356e831 2ecfb886
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:16:21 2021 -0700

    Merge branch 'development' into FS-273

commit 2ecfb88604
Merge: 42143c11 bb2ddf11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:15:16 2021 -0700

    Merge pull request #130 from AtlasMediaGroup/FS-215

    Makes [Discord] a hyperlink (FS-215)

commit 8356e831a5
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:11:16 2021 -0700

    Redundancy fix and better protection system

commit ab00cb840f
Merge: ecce62f6 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:31:45 2021 -0700

    Merge branch 'development' into FS-273

commit bb2ddf1129
Merge: cf9fdc6f 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:31:19 2021 -0700

    Merge branch 'development' into FS-215

commit 58c21bb1aa
Merge: fdba119d 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:30:48 2021 -0700

    Merge branch 'development' into shitcan-savedflags

commit ecce62f6b4
Merge: d8148530 a598c933
Author: Video <videogamesm12@gmail.com>
Date:   Sat Oct 9 00:01:22 2021 -0600

    Merge branch 'development' into FS-273

commit cf9fdc6fe4
Merge: 387ea6f7 a598c933
Author: Video <videogamesm12@gmail.com>
Date:   Fri Oct 8 01:43:33 2021 -0600

    Merge branch 'development' into FS-215

commit 387ea6f71e
Merge: a1ecf881 180cd811
Author: Video <videogamesm12@gmail.com>
Date:   Fri Oct 1 00:35:12 2021 -0600

    Merge branch 'development' into FS-215

commit d814853036
Merge: 47e63869 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:49:05 2021 +0100

    Merge branch 'development' into FS-273

commit a1ecf88109
Merge: bd647afe 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:59 2021 +0100

    Merge branch 'development' into FS-215

commit 5a6a5ff75d
Merge: 6ca61d9c 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:50 2021 +0100

    Merge branch 'development' into FS-7

commit fdba119d5d
Merge: 61857dd0 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:44 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit 61857dd06f
Merge: 2d18d461 0e12f5e7
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 03:01:37 2021 -0600

    Merge branch 'development' into shitcan-savedflags

commit bd647afe92
Merge: 69f17ef2 0e12f5e7
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 02:50:39 2021 -0600

    Merge branch 'development' into FS-215

commit 69f17ef2d7
Merge: ee1b27fa aebe1ace
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 02:01:56 2021 -0600

    Merge branch 'development' into FS-215

commit ee1b27fa0d
Merge: 2bdf14f3 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:24:00 2021 +0100

    Merge branch 'development' into FS-215

commit 6ca61d9c6c
Merge: fedf80b8 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:23:52 2021 +0100

    Merge branch 'development' into FS-7

commit 2d18d461fe
Merge: a4c81f20 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:23:44 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit 47e6386907
Merge: b1062fbb 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:23:13 2021 +0100

    Merge branch 'development' into FS-273

commit fedf80b834
Merge: a2d11d4b 44ff621d
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 10 01:39:16 2021 -0600

    Merge branch 'development' into FS-7

commit 2bdf14f38c
Merge: f6d46b61 44ff621d
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 15:26:13 2021 -0600

    Merge branch 'development' into FS-215

commit b1062fbb6c
Merge: f69feed4 44ff621d
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 14:39:32 2021 -0600

    Merge branch 'development' into FS-273

commit f69feed469
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 01:14:21 2021 -0600

    fixed

commit 8253f94ac4
Merge: daf0126f 54cb0cfa
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 01:12:00 2021 -0600

    Merge branch 'development' into FS-273

commit a4c81f202c
Merge: 0d09c3a5 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:23:06 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit daf0126f45
Merge: a51f5c9b 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:07:39 2021 +0100

    Merge branch 'development' into FS-273

commit f6d46b6178
Merge: ee804d52 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:07:33 2021 +0100

    Merge branch 'development' into FS-215

commit a2d11d4b93
Merge: dc490659 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:07:28 2021 +0100

    Merge branch 'development' into FS-7

commit a51f5c9bbf
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 3 13:53:33 2021 -0600

    FS-273

commit ee804d52ff
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 3 12:52:15 2021 -0600

    Makes [Discord] a hyperlink (FS-215)

    I've decided to overhaul the implementation of DiscordToMinecraftListener to make it more easily workable. This overhaul allows me to implement FS-215 more easily.

commit dc490659c1
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 3 00:07:20 2021 -0600

    Begins implementing FS-7

    should be good enough, but feedback would be lovely

commit 0d09c3a550
Merge: e2ccd14e 4c3f188b
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Aug 29 20:09:03 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit e2ccd14eb3
Author: Video <videogamesm12@gmail.com>
Date:   Fri Aug 27 16:54:55 2021 -0600

    Unsaves SavedFlags
2021-11-29 06:40:26 -07:00
8cff0124ea Merge pull request #93 from AtlasMediaGroup/FS-37
Fixes FS-37
2021-11-29 06:36:20 -07:00
1162f10ebb Merge branch 'development' into FS-37 2021-11-29 06:31:18 -07:00
35965b0b10 Merge pull request #174 from AtlasMediaGroup/FS-256
Forces the server to recalculate the permissions server-wide in /opall (FS-256)
2021-11-29 06:31:11 -07:00
1253732f77 Merge branch 'development' into FS-256 2021-11-29 06:25:25 -07:00
7ce173e02b Merge branch 'development' into FS-37 2021-11-29 06:24:34 -07:00
aa20a6e579 Merge pull request #129 from AtlasMediaGroup/FS-7
Allow players to pay other players coins [FS-7]
2021-11-29 06:23:57 -07:00
e1bee32163 Forces the server to recalculate the permissions server-wide in /opall 2021-11-29 03:27:07 -07:00
4d006ed172 Merge branch 'development' into FS-37 2021-11-29 03:04:42 -07:00
a29392cab2 Squashed commit of the following:
commit 706229004c
Merge: a42cb6af a4adfa9b
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 03:00:15 2021 -0700

    Merge pull request #131 from AtlasMediaGroup/FS-273

    Moves /rainbowtrail to the shop (FS-273)

commit a4adfa9bee
Merge: 1b5bbd1c a42cb6af
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 02:46:41 2021 -0700

    Merge branch 'development' into FS-273

commit a42cb6aff9
Merge: 2ecfb886 01fdf766
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 02:41:34 2021 -0700

    Merge pull request #125 from AtlasMediaGroup/shitcan-savedflags

    Shitcans SavedFlags

commit 01fdf766ee
Merge: 58c21bb1 2ecfb886
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:28:48 2021 -0700

    Merge branch 'development' into shitcan-savedflags

commit 1b5bbd1c05
Merge: 8356e831 2ecfb886
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:16:21 2021 -0700

    Merge branch 'development' into FS-273

commit 2ecfb88604
Merge: 42143c11 bb2ddf11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:15:16 2021 -0700

    Merge pull request #130 from AtlasMediaGroup/FS-215

    Makes [Discord] a hyperlink (FS-215)

commit 8356e831a5
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:11:16 2021 -0700

    Redundancy fix and better protection system

commit ab00cb840f
Merge: ecce62f6 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:31:45 2021 -0700

    Merge branch 'development' into FS-273

commit bb2ddf1129
Merge: cf9fdc6f 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:31:19 2021 -0700

    Merge branch 'development' into FS-215

commit 58c21bb1aa
Merge: fdba119d 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:30:48 2021 -0700

    Merge branch 'development' into shitcan-savedflags

commit ecce62f6b4
Merge: d8148530 a598c933
Author: Video <videogamesm12@gmail.com>
Date:   Sat Oct 9 00:01:22 2021 -0600

    Merge branch 'development' into FS-273

commit cf9fdc6fe4
Merge: 387ea6f7 a598c933
Author: Video <videogamesm12@gmail.com>
Date:   Fri Oct 8 01:43:33 2021 -0600

    Merge branch 'development' into FS-215

commit 387ea6f71e
Merge: a1ecf881 180cd811
Author: Video <videogamesm12@gmail.com>
Date:   Fri Oct 1 00:35:12 2021 -0600

    Merge branch 'development' into FS-215

commit d814853036
Merge: 47e63869 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:49:05 2021 +0100

    Merge branch 'development' into FS-273

commit a1ecf88109
Merge: bd647afe 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:59 2021 +0100

    Merge branch 'development' into FS-215

commit fdba119d5d
Merge: 61857dd0 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:44 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit 61857dd06f
Merge: 2d18d461 0e12f5e7
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 03:01:37 2021 -0600

    Merge branch 'development' into shitcan-savedflags

commit bd647afe92
Merge: 69f17ef2 0e12f5e7
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 02:50:39 2021 -0600

    Merge branch 'development' into FS-215

commit 69f17ef2d7
Merge: ee1b27fa aebe1ace
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 02:01:56 2021 -0600

    Merge branch 'development' into FS-215

commit ee1b27fa0d
Merge: 2bdf14f3 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:24:00 2021 +0100

    Merge branch 'development' into FS-215

commit 2d18d461fe
Merge: a4c81f20 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:23:44 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit 47e6386907
Merge: b1062fbb 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:23:13 2021 +0100

    Merge branch 'development' into FS-273

commit 2bdf14f38c
Merge: f6d46b61 44ff621d
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 15:26:13 2021 -0600

    Merge branch 'development' into FS-215

commit b1062fbb6c
Merge: f69feed4 44ff621d
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 14:39:32 2021 -0600

    Merge branch 'development' into FS-273

commit f69feed469
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 01:14:21 2021 -0600

    fixed

commit 8253f94ac4
Merge: daf0126f 54cb0cfa
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 01:12:00 2021 -0600

    Merge branch 'development' into FS-273

commit a4c81f202c
Merge: 0d09c3a5 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:23:06 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit daf0126f45
Merge: a51f5c9b 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:07:39 2021 +0100

    Merge branch 'development' into FS-273

commit f6d46b6178
Merge: ee804d52 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:07:33 2021 +0100

    Merge branch 'development' into FS-215

commit a51f5c9bbf
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 3 13:53:33 2021 -0600

    FS-273

commit ee804d52ff
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 3 12:52:15 2021 -0600

    Makes [Discord] a hyperlink (FS-215)

    I've decided to overhaul the implementation of DiscordToMinecraftListener to make it more easily workable. This overhaul allows me to implement FS-215 more easily.

commit 0d09c3a550
Merge: e2ccd14e 4c3f188b
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Aug 29 20:09:03 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit e2ccd14eb3
Author: Video <videogamesm12@gmail.com>
Date:   Fri Aug 27 16:54:55 2021 -0600

    Unsaves SavedFlags
2021-11-29 03:03:00 -07:00
1ecfb0b066 Merge branch 'development' into FS-7 2021-11-29 03:01:22 -07:00
706229004c Merge pull request #131 from AtlasMediaGroup/FS-273
Moves /rainbowtrail to the shop (FS-273)
2021-11-29 03:00:15 -07:00
a4adfa9bee Merge branch 'development' into FS-273 2021-11-29 02:46:41 -07:00
225ade8753 Merge branch 'development' into FS-7 2021-11-29 02:46:02 -07:00
bf2323bed2 Squashed commit of the following:
commit a42cb6aff9
Merge: 2ecfb886 01fdf766
Author: Video <videogamesm12@gmail.com>
Date:   Mon Nov 29 02:41:34 2021 -0700

    Merge pull request #125 from AtlasMediaGroup/shitcan-savedflags

    Shitcans SavedFlags

commit 01fdf766ee
Merge: 58c21bb1 2ecfb886
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:28:48 2021 -0700

    Merge branch 'development' into shitcan-savedflags

commit 2ecfb88604
Merge: 42143c11 bb2ddf11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 09:15:16 2021 -0700

    Merge pull request #130 from AtlasMediaGroup/FS-215

    Makes [Discord] a hyperlink (FS-215)

commit bb2ddf1129
Merge: cf9fdc6f 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:31:19 2021 -0700

    Merge branch 'development' into FS-215

commit 58c21bb1aa
Merge: fdba119d 42143c11
Author: Video <videogamesm12@gmail.com>
Date:   Tue Nov 23 03:30:48 2021 -0700

    Merge branch 'development' into shitcan-savedflags

commit cf9fdc6fe4
Merge: 387ea6f7 a598c933
Author: Video <videogamesm12@gmail.com>
Date:   Fri Oct 8 01:43:33 2021 -0600

    Merge branch 'development' into FS-215

commit 387ea6f71e
Merge: a1ecf881 180cd811
Author: Video <videogamesm12@gmail.com>
Date:   Fri Oct 1 00:35:12 2021 -0600

    Merge branch 'development' into FS-215

commit a1ecf88109
Merge: bd647afe 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:59 2021 +0100

    Merge branch 'development' into FS-215

commit fdba119d5d
Merge: 61857dd0 213a4338
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Sep 12 13:48:44 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit 61857dd06f
Merge: 2d18d461 0e12f5e7
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 03:01:37 2021 -0600

    Merge branch 'development' into shitcan-savedflags

commit bd647afe92
Merge: 69f17ef2 0e12f5e7
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 02:50:39 2021 -0600

    Merge branch 'development' into FS-215

commit 69f17ef2d7
Merge: ee1b27fa aebe1ace
Author: Video <videogamesm12@gmail.com>
Date:   Sun Sep 12 02:01:56 2021 -0600

    Merge branch 'development' into FS-215

commit ee1b27fa0d
Merge: 2bdf14f3 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:24:00 2021 +0100

    Merge branch 'development' into FS-215

commit 2d18d461fe
Merge: a4c81f20 0a9b95bf
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 11 01:23:44 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit 2bdf14f38c
Merge: f6d46b61 44ff621d
Author: Video <videogamesm12@gmail.com>
Date:   Mon Sep 6 15:26:13 2021 -0600

    Merge branch 'development' into FS-215

commit a4c81f202c
Merge: 0d09c3a5 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:23:06 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit f6d46b6178
Merge: ee804d52 23caa4e8
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sat Sep 4 01:07:33 2021 +0100

    Merge branch 'development' into FS-215

commit ee804d52ff
Author: Video <videogamesm12@gmail.com>
Date:   Fri Sep 3 12:52:15 2021 -0600

    Makes [Discord] a hyperlink (FS-215)

    I've decided to overhaul the implementation of DiscordToMinecraftListener to make it more easily workable. This overhaul allows me to implement FS-215 more easily.

commit 0d09c3a550
Merge: e2ccd14e 4c3f188b
Author: Ryan <Wild1145@users.noreply.github.com>
Date:   Sun Aug 29 20:09:03 2021 +0100

    Merge branch 'development' into shitcan-savedflags

commit e2ccd14eb3
Author: Video <videogamesm12@gmail.com>
Date:   Fri Aug 27 16:54:55 2021 -0600

    Unsaves SavedFlags
2021-11-29 02:44:23 -07:00
8cbfde8bbc Merge branch 'development' into FS-37 2021-11-29 02:41:49 -07:00
a42cb6aff9 Merge pull request #125 from AtlasMediaGroup/shitcan-savedflags
Shitcans SavedFlags
2021-11-29 02:41:34 -07:00
5849947c6b This should fix it 2021-11-29 02:35:36 -07:00
01fdf766ee Merge branch 'development' into shitcan-savedflags 2021-11-23 09:28:48 -07:00
afe755f5c1 Merge branch 'development' into FS-7 2021-11-23 09:26:59 -07:00
5f97e68e0e fuck it, it works 2021-11-23 09:26:49 -07:00
1b5bbd1c05 Merge branch 'development' into FS-273 2021-11-23 09:16:21 -07:00
2ecfb88604 Merge pull request #130 from AtlasMediaGroup/FS-215
Makes [Discord] a hyperlink (FS-215)
2021-11-23 09:15:16 -07:00
8356e831a5 Redundancy fix and better protection system 2021-11-23 09:11:16 -07:00
ab00cb840f Merge branch 'development' into FS-273 2021-11-23 03:31:45 -07:00
bb2ddf1129 Merge branch 'development' into FS-215 2021-11-23 03:31:19 -07:00
bba5ec922b Merge branch 'development' into FS-37 2021-11-23 03:31:13 -07:00
58c21bb1aa Merge branch 'development' into shitcan-savedflags 2021-11-23 03:30:48 -07:00
f190bbeac1 FS-292 2021-11-23 00:27:57 -07:00
42143c1163 Merge pull request #168 from AtlasMediaGroup/main
merge down into development
2021-11-22 12:35:18 -07:00
6453e4efca Merge pull request #145 from AtlasMediaGroup/RELEASE-2021.09
Release 2021.09
2021-11-22 18:43:06 +00:00
9155ac90b5 Official Release 2021-11-22 12:29:54 -06:00
1e1367d08f Bump to RC03 2021-11-13 02:58:36 -07:00
3f690e2ca1 Merge pull request #167 from AtlasMediaGroup/whoops
Fixes an oopsie I made whilst sleep deprived
2021-11-13 02:48:51 -07:00
abfa3b977c Whoops
This commit fixes 2 things:
1. A redundant check that was completely unnecessary
2. A loophole in my original bugfix commit I didn't initially discover until afterwards which enables players to do the same thing except with right clicking instead

The block inspector should be completely rewritten in the future, but for now it works.
2021-11-13 02:35:30 -07:00
68adaed997 Merge branch 'development' into FS-37 2021-10-09 00:09:24 -06:00
ecce62f6b4 Merge branch 'development' into FS-273 2021-10-09 00:01:22 -06:00
cf9fdc6fe4 Merge branch 'development' into FS-215 2021-10-08 01:43:33 -06:00
a728ec24d4 Merge pull request #156 from AtlasMediaGroup/critical-inspect-bugfix
Critical Bugfix
2021-10-04 17:59:10 -05:00
74a71b1843 Important bugfix
It appears someone had an extremely big brain moment.
2021-10-04 16:02:39 -06:00
4d469cdc0a Move from Java 16 to Java 17 (#149)
* Move from Java 16 to Java 17

* Update java17-maven.yml
2021-10-03 15:57:47 +01:00
4c287ca9b8 Bump to RC02 2021-10-03 15:50:33 +01:00
912bc1a1e4 Merge pull request #154 from AtlasMediaGroup/development
Development
2021-10-03 07:02:37 -06:00
a598c933ec Merge pull request #151 from AtlasMediaGroup/FS-421
Two fixes (FS-421)
2021-10-03 06:52:45 -06:00
936f0b621e Stupid simple fix
Fixes an oopsie I made and an oopsie someone else made which broke the entire plugin.
2021-10-03 06:45:02 -06:00
387ea6f71e Merge branch 'development' into FS-215 2021-10-01 00:35:12 -06:00
e122c4c5fa Bump to 2021.09-RC01 Release 2021-09-19 17:32:05 +01:00
180cd81132 Bump junit-jupiter from 5.7.2 to 5.8.0 (#139)
Bumps [junit-jupiter](https://github.com/junit-team/junit5) from 5.7.2 to 5.8.0.
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.7.2...r5.8.0)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-13 09:58:54 +01:00
d814853036 Merge branch 'development' into FS-273 2021-09-12 13:49:05 +01:00
a1ecf88109 Merge branch 'development' into FS-215 2021-09-12 13:48:59 +01:00
5a6a5ff75d Merge branch 'development' into FS-7 2021-09-12 13:48:50 +01:00
fdba119d5d Merge branch 'development' into shitcan-savedflags 2021-09-12 13:48:44 +01:00
087b8dd7ea Merge branch 'development' into FS-37 2021-09-12 13:48:21 +01:00
213a43380e Bump git-commit-id-plugin from 4.0.2 to 4.9.10 (#113)
Bumps git-commit-id-plugin from 4.0.2 to 4.9.10.

---
updated-dependencies:
- dependency-name: pl.project13.maven:git-commit-id-plugin
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-12 12:13:56 +01:00
8a31b4c5c0 Bump javassist from 3.27.0-GA to 3.28.0-GA (#110)
Bumps [javassist](https://github.com/jboss-javassist/javassist) from 3.27.0-GA to 3.28.0-GA.
- [Release notes](https://github.com/jboss-javassist/javassist/releases)
- [Commits](https://github.com/jboss-javassist/javassist/commits)

---
updated-dependencies:
- dependency-name: org.javassist:javassist
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-12 11:33:52 +01:00
3818aab454 Merge branch 'development' into FS-37 2021-09-12 03:04:08 -06:00
61857dd06f Merge branch 'development' into shitcan-savedflags 2021-09-12 03:01:37 -06:00
bd647afe92 Merge branch 'development' into FS-215 2021-09-12 02:50:39 -06:00
0e12f5e792 Bump commons-lang3 from 3.11 to 3.12.0 (#111)
Bumps commons-lang3 from 3.11 to 3.12.0.

---
updated-dependencies:
- dependency-name: org.apache.commons:commons-lang3
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-12 09:09:28 +01:00
69f17ef2d7 Merge branch 'development' into FS-215 2021-09-12 02:01:56 -06:00
aebe1acec2 Merge pull request #136 from AtlasMediaGroup/multiple-birds-one-stone
Multiple fixes, one commit
2021-09-12 01:57:32 -06:00
938b3aa630 Merge branch 'development' into multiple-birds-one-stone 2021-09-11 20:53:16 -06:00
6772333eb4 Bump junit-jupiter from 5.4.2 to 5.7.2 (#103)
Bumps [junit-jupiter](https://github.com/junit-team/junit5) from 5.4.2 to 5.7.2.
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.4.2...r5.7.2)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-12 00:10:47 +01:00
0204961834 Bump commons-io from 2.8.0 to 2.11.0 (#117)
Bumps commons-io from 2.8.0 to 2.11.0.

---
updated-dependencies:
- dependency-name: commons-io:commons-io
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-11 23:53:41 +01:00
2f332a8c42 Bump annotations from 20.1.0 to 22.0.0 (#104)
Bumps [annotations](https://github.com/JetBrains/java-annotations) from 20.1.0 to 22.0.0.
- [Release notes](https://github.com/JetBrains/java-annotations/releases)
- [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md)
- [Commits](https://github.com/JetBrains/java-annotations/compare/20.1.0...22.0.0)

---
updated-dependencies:
- dependency-name: org.jetbrains:annotations
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-11 18:48:33 +01:00
e288668c92 Bump maven-antrun-plugin from 1.8 to 3.0.0 (#102)
Bumps [maven-antrun-plugin](https://github.com/apache/maven-antrun-plugin) from 1.8 to 3.0.0.
- [Release notes](https://github.com/apache/maven-antrun-plugin/releases)
- [Commits](https://github.com/apache/maven-antrun-plugin/compare/maven-antrun-plugin-1.8...maven-antrun-plugin-3.0.0)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-antrun-plugin
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-09-11 18:42:31 +01:00
caeda219fa Merge branch 'development' into FS-37 2021-09-11 15:26:37 +01:00
e50101df43 Merge branch 'development' into multiple-birds-one-stone 2021-09-11 15:24:52 +01:00
ee1b27fa0d Merge branch 'development' into FS-215 2021-09-11 01:24:00 +01:00
6ca61d9c6c Merge branch 'development' into FS-7 2021-09-11 01:23:52 +01:00
2d18d461fe Merge branch 'development' into shitcan-savedflags 2021-09-11 01:23:44 +01:00
47e6386907 Merge branch 'development' into FS-273 2021-09-11 01:23:13 +01:00
0a9b95bfce Move to new ATLAS Nexus (#138)
* Move to new ATLAS Nexus

Turns out jFrog is super expensive and 10GB of Bandwidth doesn't go far, this should make things a lot better :)

* Update pom.xml

* Update pom.xml
2021-09-11 01:19:08 +01:00
fedf80b834 Merge branch 'development' into FS-7 2021-09-10 01:39:16 -06:00
2bdf14f38c Merge branch 'development' into FS-215 2021-09-06 15:26:13 -06:00
b1062fbb6c Merge branch 'development' into FS-273 2021-09-06 14:39:32 -06:00
f00f075551 Merge branch 'development' into multiple-birds-one-stone 2021-09-06 14:38:42 -06:00
44ff621d73 Bump bstats-bukkit from 1.8 to 2.2.1 (#99)
Bumps [bstats-bukkit](https://github.com/Bastian/bStats-Metrics) from 1.8 to 2.2.1.
- [Release notes](https://github.com/Bastian/bStats-Metrics/releases)
- [Commits](https://github.com/Bastian/bStats-Metrics/commits/v2.2.1)

---
updated-dependencies:
- dependency-name: org.bstats:bstats-bukkit
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ryan <Wild1145@users.noreply.github.com>

Resolves FS-419
2021-09-06 20:21:49 +01:00
032e54e2d4 Multiple birds, one commit
Here's a list of things I've fixed/mitigated:
- Range bans in ban-related commands (FS-209)
- Bug in /tempban where the duration in the broadcast is always wrong
- Over-complicated handling of /tempban durations (instead of trying to process them and silently fail, it'll flat out say that an invalid duration is well, invalid)
- Inconsistent "player not found" messages in banning commands
- (Mitigates) weird issue with case-sensitive usernames in banning commands when the server has restarted since a player last joined
- (Mitigates) banned IPs being inaccurate when a player was banned offline whilst containing multiple IPs in their playerdata
- Redoing how MovementValidator handled positive and negative infinity exploit items, completely removing the need for Mojangson in the first place and allowing the plugin to run without Essentials once more in the process (related to FS-406)

Here is what I've done in addition:
- Merged /tban and /noob into /tempban, which now bans for 5 minutes by default (FS-205)
2021-09-06 04:44:39 -06:00
3ca9835257 Merge branch 'development' into FS-37 2021-09-06 01:16:04 -06:00
f69feed469 fixed 2021-09-06 01:14:21 -06:00
8253f94ac4 Merge branch 'development' into FS-273 2021-09-06 01:12:00 -06:00
54cb0cfac4 FS-409 (#124)
Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-09-05 14:51:43 +01:00
a4c81f202c Merge branch 'development' into shitcan-savedflags 2021-09-04 01:23:06 +01:00
da82b27016 Merge branch 'development' into FS-37 2021-09-04 01:07:55 +01:00
daf0126f45 Merge branch 'development' into FS-273 2021-09-04 01:07:39 +01:00
f6d46b6178 Merge branch 'development' into FS-215 2021-09-04 01:07:33 +01:00
a2d11d4b93 Merge branch 'development' into FS-7 2021-09-04 01:07:28 +01:00
23caa4e853 Dependency Fix & Improvements (#132)
* Upgrade Test

Going to see if switching to the new repo that went live 3 days ago and updating TFM to pull the latest version of Essentials is going to help things here. TFM is building locally so I haven't a fucking scooby doo why Github can't run the build because I've even tried dropping the M2 folder...

* Let's try again

Utter bullshit so far.

* Apparently we don't even use essentials...

No idea where the imports for EssentialsBridge are coming from...

* Various tweaks

Hopefully this might give some more joy, but if not it's removed a command I didn't want anyway and reduced our dependency tree.

I have also switched it to using the ATLAS Artafactory which will serve as an ongoing cache for dependencies and should start to speed up our Github builds as Maven is rubbish with many repo's.
2021-09-04 01:07:04 +01:00
a51f5c9bbf FS-273 2021-09-03 13:53:33 -06:00
ee804d52ff Makes [Discord] a hyperlink (FS-215)
I've decided to overhaul the implementation of DiscordToMinecraftListener to make it more easily workable. This overhaul allows me to implement FS-215 more easily.
2021-09-03 12:52:15 -06:00
dc490659c1 Begins implementing FS-7
should be good enough, but feedback would be lovely
2021-09-03 00:07:20 -06:00
0d09c3a550 Merge branch 'development' into shitcan-savedflags 2021-08-29 20:09:03 +01:00
4c3f188bb8 Bump actions/setup-java from 2.2.0 to 2.3.0 (#122)
Bumps [actions/setup-java](https://github.com/actions/setup-java) from 2.2.0 to 2.3.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v2.2.0...v2.3.0)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-08-29 20:08:43 +01:00
e2ccd14eb3 Unsaves SavedFlags 2021-08-27 16:54:55 -06:00
af1df22812 Merge branch 'development' into FS-37 2021-08-26 23:05:58 -06:00
f380898bb7 yo remove my name (#123)
Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-08-26 16:22:08 +01:00
464ed85f1b Update java16-maven.yml 2021-08-26 16:18:58 +01:00
7dd235b166 Update java11-maven.yml 2021-08-26 16:18:49 +01:00
1474a80875 Merge branch 'development' into FS-37 2021-08-26 13:26:44 +01:00
f45466ee24 Create java16-maven.yml 2021-08-26 13:01:20 +01:00
d70b7bbec2 Split out Java 11 and Java 16 for faster runs 2021-08-26 13:00:19 +01:00
541c66c3de Bump codacy/codacy-analysis-cli-action from 1.1.0 to 4.0.0 (#101)
Bumps [codacy/codacy-analysis-cli-action](https://github.com/codacy/codacy-analysis-cli-action) from 1.1.0 to 4.0.0.
- [Release notes](https://github.com/codacy/codacy-analysis-cli-action/releases)
- [Commits](https://github.com/codacy/codacy-analysis-cli-action/compare/1.1.0...4.0.0)

---
updated-dependencies:
- dependency-name: codacy/codacy-analysis-cli-action
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-21 21:50:45 +01:00
77fd4ff66a Merge branch 'development' into FS-37 2021-08-21 21:34:04 +01:00
d901cbaa81 Update pom.xml (#121)
* Update pom.xml

* Fix version from re-upload
2021-08-21 21:25:56 +01:00
538ed7020d Merge branch 'development' of https://github.com/AtlasMediaGroup/TotalFreedomMod into development 2021-08-21 15:36:32 +01:00
18e6ef16be Merge branch 'main' of https://github.com/AtlasMediaGroup/TotalFreedomMod into development 2021-08-21 15:36:26 +01:00
a335a2acf7 Bump maven-checkstyle-plugin from 3.1.1 to 3.1.2 (#114)
Bumps [maven-checkstyle-plugin](https://github.com/apache/maven-checkstyle-plugin) from 3.1.1 to 3.1.2.
- [Release notes](https://github.com/apache/maven-checkstyle-plugin/releases)
- [Commits](https://github.com/apache/maven-checkstyle-plugin/compare/maven-checkstyle-plugin-3.1.1...maven-checkstyle-plugin-3.1.2)

---
updated-dependencies:
- dependency-name: org.apache.maven.plugins:maven-checkstyle-plugin
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2021-08-21 15:21:18 +01:00
2eb6cc0036 Correct CoreProtect POM Version (#108)
Co-authored-by: Video <videogamesm12@gmail.com>
2021-08-18 23:45:56 +01:00
5322d8ab64 Fixing Github Actions (#107)
Hopefully this should now let us automatically down-sync from Main to Development
2021-08-18 23:45:34 +01:00
dccc315869 Bump actions/setup-java from 1.4.3 to 2.2.0 (#98)
* Bump actions/setup-java from 1.4.3 to 2.2.0

Bumps [actions/setup-java](https://github.com/actions/setup-java) from 1.4.3 to 2.2.0.
- [Release notes](https://github.com/actions/setup-java/releases)
- [Commits](https://github.com/actions/setup-java/compare/v1.4.3...v2.2.0)

---
updated-dependencies:
- dependency-name: actions/setup-java
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* Fix the breaking change the 2.x branch of the action added

There is a breaking change which Dependabot hasn't picked up on which causes this to not play ball. This should resolve said issue.

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Wild1145 <Wild1145@users.noreply.github.com>
2021-08-17 20:50:03 +01:00
7657ae1928 Fix Dependabot to target the right branch and open all PR (#106) 2021-08-17 19:28:14 +01:00
dcaf1ec11a Release 2021.06 (#97)
* Update Command_ride.java

* ok, done (FS-156)

* Fixes FS-137

* grammar fix

* Remove a number of wipe commands we don't want anyway

We shouldn't be wiping any of this data within the server now anyway so let's not tempt fate again.

* Why overcomplicating things is a horrifically bad idea (#55)

The longer I look into this plugin's code, the angrier I will become.

This fixes 2 bugs in the /potion command:
- Fixes non-admins being able to clear other players
- Fixes NPE caused when trying to add potion effects to players who are not on the server as a non-admin.

Both of these issues are caused by overcomplicating seemingly simple solutions, hence the name of this commit.

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>

* Bug fixes, improvements, and removals (FS-192) (#46)

* Three fixes

* Fixes /tempban throwing a NullPointerException when trying to get a player who isn't on the server but was in the past
* Fixes /tempban banning players for 24 hours regardless of the duration defined
* Fixes /list -t throwing a NullPointerException when performed from a non-player source (such as Telnet)

* Removes hubworld entriely

* Configurable blacklists for tag, muted commands, and wildcard

Changes:
* Moves globally blocked commands to the `global` subsection of the original `blocked_commands` section. You *will* need to update your configurations
* /wildcard's command blacklist is now configurable under the `wildcard` section in `blocked_commands`.
* The commands muted players can't use are now configurable under the `muted` section in `blocked_commands`.
* Removes some commented-out globally blocked command entries.

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>

* Switched from -c to -ci (#63)

Resolves FS-219

* Added new dependency to allow TFM to compile (#65)

* Name change for Fleek (#64)

* Add //g to blocked commands (#62)

Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>

* Small modification to new TFGuilds (FS-255) (#67)

* Calculate the player count without offline players (FS-247) (#68)

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>

* Use long instead of int and use offset to check time (FS-181) (#69)

* Use long instead of int and use offset to check time (FS-181)

* Remove star import

* Addresses FS-224 (#70)

* Continuation on that notes thing (#74)

I forgot to remove the dependency after I removed the code that used JSONMessage. This fixes that by removing both the repository and the dependency from the pom file.

* Updated permissions to re-baseline with the dev server (#75)

Updating this to be based off of the dev server as it seems this has not been updated in some time. Primary purpose is to add the crackshot bypass removal for everyone (Though allow admins to bypass) and to add a start of network manager perms in the hopes it makes it more usable going forward.

* Two fixes, one commit

To kill two birds with one stone, I've done two fixes in this commit.
- Fixes issue that caused quiet warns to behave improperly (e.g. the warnings wouldn't increment if quiet)
- Added WARN to the PunishmentType list.

* Update EntityWiper.java

* FS-27

* FS-26

* FS-25

* Code quality and consistency improvements

Here's all the changes I've made in this commit:
- Resolves FS-44 (AutoEject.java)
- Resolves FS-45 (BlockBlocker.java)
- Resolves FS-47 and FS-48 (InteractBlocker.java)
- Resolves FS-49 (Command_cage.java)
- Resolves FS-50 (Command_manageshop.java)
- Resolves FS-51 (Command_notes.java)
- Resolves FS-52 (Command_potion.java)
- Resolves FS-53 (Command_tag.java)
- Resolves FS-55 (ItemFun.java)
- Resolves FS-56 (Module_list.java)
- Resolves FS-57 (Module_players.java)
- Removes redundant code from InteractBlocker.java
- Misc. code consistency corrections (global)

* FS-54

* Shut up Codacy

* FS-201

* Simple fix

* Even more punishment log types

Here's what I've changed in this commit:
- Adds /blockcmd to the punishment log (FS-239)
- Adds /blockedit and /blockpvp to the punishment log (FS-240)
- Adds /cage to the punishment log (FS-241)
- Adds /orbit to the punishment log (FS-242)
- Changes the order of operations in some commands to be a bit more consistent

* Order of operations fix

* ez (#77)

* Start building Java 16 (#84)

* Start building Java 16

* Re-apply Fleek's change

* Removed the shitty Github auto formatted white space.

* Update to the maven build in Github workflows

Given TravisCI has started to charge, I guess this might be what we move back to using as our main way to verify if something can actually build.

* Update maven.yml

* Delete .travis.yml

* Adds /seed command (FS-225) (#85)

* Create Command_seed.java

* Addresses requested changes

* My IDE decided to try to "fix" things with *s in imports

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>

* Use 'getPlayer()' to prevent NPE (FS-159) (#87)

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>

* 2 bugfixes

- Fixes FS-309 by checking if a material provided is actually a block before caging someone.
- Fixes a bug that causes the command to throw an ArrayOutOfBoundsException if one were to use a command like `/cage player1 block`.

* Temporarily re-naming /clearchat to /cleanchat (#91)

* Temporarily re-naming /clearchat to /cleanchat

Due to another plugin which currently doesn't quite have all the permissions working, this command is not currently able to be executed as it stands.

* Shhh I know I'm an idiot

* Let's actually do dependency uplifts (#89)

* Bump release to 2021.06-RC01

* Bump to release version

We're good to go!

Co-authored-by: Video <videogamesm12@gmail.com>
Co-authored-by: Elmon11 <elmon11bussiness@gmail.com>
Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
Co-authored-by: Paldiu <pawereus@gmail.com>
2021-08-15 01:06:21 +01:00
33aca2a482 Merge branch 'development' into FS-37 2021-08-10 22:38:51 -06:00
0582c2e5be Merge pull request #94 from AtlasMediaGroup/FS-381
Enables Lava Damage by default (FS-381)
2021-08-10 22:38:24 -06:00
159eda73a1 Merge branch 'development' into FS-37 2021-08-10 17:34:12 +01:00
101987cc17 Merge branch 'development' into FS-381 2021-08-10 17:34:03 +01:00
6874b2ce13 Fixes /setlevel by completely removing it (FS-82) (#95)
To quote Ryan:
> If /exp works (and we've said it has) then the scope of this ticket will be to just go remove the TFM command...

This does exactly that.
2021-08-10 17:33:48 +01:00
3be0ffba4e Merge branch 'development' into FS-381 2021-08-10 17:31:26 +01:00
da2d25252b Merge branch 'development' into FS-37 2021-08-10 17:31:13 +01:00
c8a4382a7b Merge pull request #96 from AtlasMediaGroup/FS-218
Adds functionality for a one-time message to be sent to new players (FS-218)
2021-08-10 07:41:42 -06:00
3f89f3f48e Shut the fuck up Codacy 2021-08-10 06:58:04 -06:00
871acc2eeb Actually, let's make it possible to disable it if needed 2021-08-10 04:13:23 -06:00
a9c9979b1c FS-218 2021-08-10 04:06:41 -06:00
fc3fe871b3 FS-381 2021-08-05 00:43:01 -06:00
e99aaa2eb4 Fixes FS-37
Fixes an oversight introduced in 76bb2d08ac in which the configuration is loaded twice.
2021-08-05 00:32:23 -06:00
62529a6171 Merge branch 'main' of https://github.com/AtlasMediaGroup/TotalFreedomMod into development 2021-07-17 13:18:18 +01:00
0caf972248 Merge pull request #90 from AtlasMediaGroup/FS-309
2 bugfixes, one command (FS-309)
2021-07-16 09:05:57 -05:00
a37364d07e Correct JDK Version in README (#92)
It's currently wrong so needed updating.
2021-07-16 11:43:46 +01:00
4ac9844534 Merge branch 'development' into FS-309 2021-07-12 22:53:44 -06:00
939e98b759 Update badges (#88)
Remove TravisCI
Add Github Maven Build Action 
Add CodeQL Badge
2021-07-08 20:48:41 +01:00
d99f3e657b Let's actually do dependency uplifts (#89) 2021-07-08 20:48:27 +01:00
92bbb62379 Temporarily re-naming /clearchat to /cleanchat (#91)
* Temporarily re-naming /clearchat to /cleanchat

Due to another plugin which currently doesn't quite have all the permissions working, this command is not currently able to be executed as it stands.

* Shhh I know I'm an idiot
2021-07-05 23:29:22 +01:00
e4a0943af2 Merge branch 'development' into FS-309 2021-06-29 22:00:13 -06:00
36bd8c0fad 2 bugfixes
- Fixes FS-309 by checking if a material provided is actually a block before caging someone.
- Fixes a bug that causes the command to throw an ArrayOutOfBoundsException if one were to use a command like `/cage player1 block`.
2021-06-29 21:52:46 -06:00
d77f59435b Use 'getPlayer()' to prevent NPE (FS-159) (#87)
Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-06-26 15:06:15 +01:00
a08fd2afb6 Adds /seed command (FS-225) (#85)
* Create Command_seed.java

* Addresses requested changes

* My IDE decided to try to "fix" things with *s in imports

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-06-26 14:25:08 +01:00
6fd075fe96 Start building Java 16 (#84)
* Start building Java 16

* Re-apply Fleek's change

* Removed the shitty Github auto formatted white space.

* Update to the maven build in Github workflows

Given TravisCI has started to charge, I guess this might be what we move back to using as our main way to verify if something can actually build.

* Update maven.yml

* Delete .travis.yml
2021-06-24 21:21:39 +01:00
f57fc56f4a Merge pull request #83 from AtlasMediaGroup/FS-239-to-FS-242
Logs even more punishment types (FS-239, FS-240, FS-241, FS-242)
2021-06-19 03:20:47 -06:00
a6ca6b122c Merge branch 'development' into FS-239-to-FS-242 2021-06-18 13:24:15 +01:00
064e73f58b ez (#77) 2021-06-18 13:16:52 +01:00
32138b2e59 Order of operations fix 2021-06-17 13:41:25 -06:00
e1c3bad4d0 Even more punishment log types
Here's what I've changed in this commit:
- Adds /blockcmd to the punishment log (FS-239)
- Adds /blockedit and /blockpvp to the punishment log (FS-240)
- Adds /cage to the punishment log (FS-241)
- Adds /orbit to the punishment log (FS-242)
- Changes the order of operations in some commands to be a bit more consistent
2021-06-17 06:56:52 -06:00
4e78027f0c Merge pull request #79 from AtlasMediaGroup/FS-307
Fixes the EntityWiper not toggling properly (FS-307)
2021-06-17 06:12:26 -06:00
721f4f9fc3 Merge branch 'development' into FS-307 2021-06-17 05:56:56 -06:00
24ad2611a9 Merge pull request #81 from AtlasMediaGroup/FS-201
Admins can now see commands of everyone, regardless of rank (FS-201)
2021-06-17 05:54:10 -06:00
c238f251f2 Merge branch 'development' into FS-201 2021-06-17 05:46:40 -06:00
02848e3439 Merge pull request #82 from AtlasMediaGroup/FS-199
Prevents entities of type PLAYER from being purged in /entitywipe (FS-199)
2021-06-17 05:46:28 -06:00
9550f54e2b Merge branch 'development' into FS-199 2021-06-17 05:37:30 -06:00
39dade78e3 Merge pull request #80 from AtlasMediaGroup/FS-24-Round-2
Code quality improvements (FS-24)
2021-06-17 05:35:55 -06:00
5b6d8b01a4 Merge branch 'development' into FS-24-Round-2 2021-06-17 05:25:42 -06:00
96bc83cead Merge pull request #78 from AtlasMediaGroup/FS-207
Two fixes, one commit (FS-207)
2021-06-17 04:58:26 -06:00
be700a90ce Simple fix 2021-06-16 22:42:45 -06:00
6d1fce1716 FS-201 2021-06-16 22:06:12 -06:00
d3665f31fe Shut up Codacy 2021-06-16 21:56:25 -06:00
4188cb80fa FS-54 2021-06-16 21:10:08 -06:00
62fe72d99b Code quality and consistency improvements
Here's all the changes I've made in this commit:
- Resolves FS-44 (AutoEject.java)
- Resolves FS-45 (BlockBlocker.java)
- Resolves FS-47 and FS-48 (InteractBlocker.java)
- Resolves FS-49 (Command_cage.java)
- Resolves FS-50 (Command_manageshop.java)
- Resolves FS-51 (Command_notes.java)
- Resolves FS-52 (Command_potion.java)
- Resolves FS-53 (Command_tag.java)
- Resolves FS-55 (ItemFun.java)
- Resolves FS-56 (Module_list.java)
- Resolves FS-57 (Module_players.java)
- Removes redundant code from InteractBlocker.java
- Misc. code consistency corrections (global)
2021-06-16 21:10:08 -06:00
f4749559d2 FS-25 2021-06-16 21:10:08 -06:00
ed815794ed FS-26 2021-06-16 21:10:08 -06:00
0c12a19d1d FS-27 2021-06-16 21:10:08 -06:00
96d47e8e0c Update EntityWiper.java 2021-06-16 17:47:09 -06:00
3027e2a18c Two fixes, one commit
To kill two birds with one stone, I've done two fixes in this commit.
- Fixes issue that caused quiet warns to behave improperly (e.g. the warnings wouldn't increment if quiet)
- Added WARN to the PunishmentType list.
2021-06-16 17:29:57 -06:00
06025b2e69 Updated permissions to re-baseline with the dev server (#75)
Updating this to be based off of the dev server as it seems this has not been updated in some time. Primary purpose is to add the crackshot bypass removal for everyone (Though allow admins to bypass) and to add a start of network manager perms in the hopes it makes it more usable going forward.
2021-06-13 19:51:27 +01:00
da7e8f64aa Continuation on that notes thing (#74)
I forgot to remove the dependency after I removed the code that used JSONMessage. This fixes that by removing both the repository and the dependency from the pom file.
2021-06-12 11:26:40 +01:00
17b051e2a7 Retired support for 2021.02 fully. (#72) 2021-06-07 16:26:15 +01:00
77a05f22a8 TotalFreedomMod May Update 2021-06-07 16:26:15 +01:00
5c3ef1f107 Bump version 2021-06-07 16:26:15 +01:00
53c5991971 Addresses FS-224 (#70) 2021-06-07 16:26:15 +01:00
ff760a6c11 Use long instead of int and use offset to check time (FS-181) (#69)
* Use long instead of int and use offset to check time (FS-181)

* Remove star import
2021-06-07 16:26:15 +01:00
63069ff9ec Calculate the player count without offline players (FS-247) (#68)
Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-06-07 16:26:15 +01:00
5e63b71861 Small modification to new TFGuilds (FS-255) (#67) 2021-06-07 16:26:15 +01:00
b72782de4f Add //g to blocked commands (#62)
Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
2021-06-07 16:26:15 +01:00
de9556c550 Name change for Fleek (#64) 2021-06-07 16:26:15 +01:00
6590504545 Added new dependency to allow TFM to compile (#65) 2021-06-07 16:26:15 +01:00
8d1e8dcf05 Switched from -c to -ci (#63)
Resolves FS-219
2021-06-07 16:26:15 +01:00
07b5076717 Bug fixes, improvements, and removals (FS-192) (#46)
* Three fixes

* Fixes /tempban throwing a NullPointerException when trying to get a player who isn't on the server but was in the past
* Fixes /tempban banning players for 24 hours regardless of the duration defined
* Fixes /list -t throwing a NullPointerException when performed from a non-player source (such as Telnet)

* Removes hubworld entriely

* Configurable blacklists for tag, muted commands, and wildcard

Changes:
* Moves globally blocked commands to the `global` subsection of the original `blocked_commands` section. You *will* need to update your configurations
* /wildcard's command blacklist is now configurable under the `wildcard` section in `blocked_commands`.
* The commands muted players can't use are now configurable under the `muted` section in `blocked_commands`.
* Removes some commented-out globally blocked command entries.

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-06-07 16:26:15 +01:00
6fb9507a4c Why overcomplicating things is a horrifically bad idea (#55)
The longer I look into this plugin's code, the angrier I will become.

This fixes 2 bugs in the /potion command:
- Fixes non-admins being able to clear other players
- Fixes NPE caused when trying to add potion effects to players who are not on the server as a non-admin.

Both of these issues are caused by overcomplicating seemingly simple solutions, hence the name of this commit.

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
2021-06-07 16:26:15 +01:00
879a524bb4 Remove a number of wipe commands we don't want anyway
We shouldn't be wiping any of this data within the server now anyway so let's not tempt fate again.
2021-06-07 16:26:15 +01:00
c60b451ce7 grammar fix 2021-06-07 16:26:15 +01:00
f85f3e32ea Fixes FS-137 2021-06-07 16:26:15 +01:00
57b3351047 ok, done (FS-156) 2021-06-07 16:26:15 +01:00
dd10eb3f5e Update Command_ride.java 2021-06-07 16:26:15 +01:00
a498104777 Merge branch 'main' of github.com:AtlasMediaGroup/TotalFreedomMod into development 2021-06-07 16:22:43 +01:00
4e577f97fa Enable downward Sync from main (#60)
We want to make sure anything on the main branch which is commited makes it's way down to the dev and other branches.
2021-05-28 15:22:07 +01:00
8c7bf365a0 Addresses FS-224 (#70) 2021-05-26 19:55:49 +10:00
eedb7a5375 Use long instead of int and use offset to check time (FS-181) (#69)
* Use long instead of int and use offset to check time (FS-181)

* Remove star import
2021-05-25 21:45:53 +10:00
d047cfc8ff Calculate the player count without offline players (FS-247) (#68)
Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-05-22 15:40:55 +01:00
9ff5da8d8f Small modification to new TFGuilds (FS-255) (#67) 2021-05-22 15:06:34 +01:00
ac615f54f7 Add //g to blocked commands (#62)
Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
2021-05-21 22:44:51 +01:00
21af722e23 Name change for Fleek (#64) 2021-05-17 20:31:34 +10:00
b1196fcf00 Added new dependency to allow TFM to compile (#65) 2021-05-17 06:50:09 +01:00
d170f6d323 Switched from -c to -ci (#63)
Resolves FS-219
2021-05-16 15:27:12 +01:00
9dd0298f56 Bug fixes, improvements, and removals (FS-192) (#46)
* Three fixes

* Fixes /tempban throwing a NullPointerException when trying to get a player who isn't on the server but was in the past
* Fixes /tempban banning players for 24 hours regardless of the duration defined
* Fixes /list -t throwing a NullPointerException when performed from a non-player source (such as Telnet)

* Removes hubworld entriely

* Configurable blacklists for tag, muted commands, and wildcard

Changes:
* Moves globally blocked commands to the `global` subsection of the original `blocked_commands` section. You *will* need to update your configurations
* /wildcard's command blacklist is now configurable under the `wildcard` section in `blocked_commands`.
* The commands muted players can't use are now configurable under the `muted` section in `blocked_commands`.
* Removes some commented-out globally blocked command entries.

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
2021-05-09 16:42:31 +01:00
bdf4ca84e0 Why overcomplicating things is a horrifically bad idea (#55)
The longer I look into this plugin's code, the angrier I will become.

This fixes 2 bugs in the /potion command:
- Fixes non-admins being able to clear other players
- Fixes NPE caused when trying to add potion effects to players who are not on the server as a non-admin.

Both of these issues are caused by overcomplicating seemingly simple solutions, hence the name of this commit.

Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
2021-05-04 13:31:55 +01:00
caaa067096 Update Security Matrix (#59)
* Update Security Matrix

Updating the full security matrix.

* Yay for consistency

* I hate Markdown / Markup / Whatever the fuck this is.
2021-05-04 13:30:17 +01:00
7258d7f1bf Merge pull request #58 from AtlasMediaGroup/FS-221
Remove a number of wipe commands we don't want anyway
2021-05-04 12:59:31 +01:00
8a504bff07 Merge branch 'development' into FS-221 2021-05-03 22:15:20 -06:00
c00e64f736 Merge pull request #54 from VideoGameSmash12/FS-137
Assistant executive discord integration (FS-137)
2021-05-03 20:14:35 +01:00
9e73db0f24 Merge branch 'development' into FS-137 2021-05-03 19:46:59 +01:00
951c061d77 Merge pull request #57 from AtlasMediaGroup/Elmon11-patch-2
grammar fix
2021-05-03 19:46:37 +01:00
579d3e0719 Merge branch 'development' into Elmon11-patch-2 2021-05-03 19:13:39 +01:00
9777733d04 Merge pull request #53 from VideoGameSmash12/ride-typo
Fixes typo in /ride
2021-05-03 19:13:26 +01:00
05e118dcb4 Merge branch 'development' into ride-typo 2021-05-03 18:21:16 +01:00
7a0d6f49f4 Merge pull request #52 from VideoGameSmash12/FS-156
Fixes typo in the Lightning Rod's name (FS-156)
2021-05-03 18:20:20 +01:00
19f1b7f6bd Merge branch 'development' into Elmon11-patch-2 2021-05-03 15:45:54 +01:00
b12afbdc1f Merge branch 'development' into FS-137 2021-05-03 15:45:45 +01:00
49e77d4f93 Merge branch 'development' into ride-typo 2021-05-03 15:45:36 +01:00
eb9107bedf Merge branch 'development' into FS-156 2021-05-03 15:45:25 +01:00
951c699ed0 Remove a number of wipe commands we don't want anyway
We shouldn't be wiping any of this data within the server now anyway so let's not tempt fate again.
2021-05-03 15:44:05 +01:00
9e676143b8 2021.04 Release
Formal Release for 2021.04
2021-05-03 15:19:42 +01:00
6895e46375 Merge branch 'development' into ride-typo 2021-05-02 14:15:15 +02:00
c8b20bc255 RC2 Release 2021-05-02 13:12:37 +01:00
1cf46c7337 grammar fix 2021-05-02 14:03:48 +02:00
f240a15af3 Force the count to be zero if the value is negative (FS-216) (#56) 2021-05-01 23:58:03 +10:00
6073712fdf Bump Version
Bump Version to 2021.04-RC01
2021-04-26 20:46:11 +01:00
407b63e48b Fixes FS-137 2021-04-26 01:23:24 -06:00
be562fe722 ok, done (FS-156) 2021-04-26 00:58:28 -06:00
928ab41d7f Update Command_ride.java 2021-04-26 00:37:16 -06:00
d11d55b218 Vanished admins are no longer being counted (FS-148) (#41) 2021-04-24 14:06:28 +10:00
debb95fb4c video dev man (#51) 2021-04-24 13:03:11 +10:00
b9f7ab3ec3 Change punishment from kicking to muting on spam (FS-97) (#45) 2021-04-22 21:54:29 +10:00
2cdf1e66a6 Disables block gravity and makes it togglable (FS-89) (#50)
* Disables block gravity by default (FS-89)

* Combine these checks as Codacy ever so kindly suggested
2021-04-19 17:34:36 +10:00
20c2c4c96e Delete /wipeuserdata (FS-196) (#49) 2021-04-15 22:07:22 +10:00
d5238150d0 Curse be gone (#47)
Co-authored-by: Ryan <Wild1145@users.noreply.github.com>
Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
2021-04-13 14:13:47 +10:00
64a4e70c41 Merge pull request #48 from AtlasMediaGroup/abhi-fix
Strip role/user mentions (FS-191)
2021-04-12 16:45:13 -05:00
0c2f0a714c [+] Fix #replace() 2021-04-12 16:31:48 +05:30
4c67553bdd [+] Whitespace change! 2021-04-12 16:26:06 +05:30
ffab5e3c12 [+] Allman style formating 2021-04-12 16:01:31 +05:30
f7556a4861 [+] Remove redundant comments 2021-04-12 15:59:27 +05:30
385fc77771 [+] Done all the requested changes! 2021-04-12 15:44:51 +05:30
b852ea1822 [+] Update my account in developers list 2021-04-12 14:44:27 +05:30
4a5a3a1a2d [+] Fix FS-191 2021-04-12 13:57:58 +05:30
37762e5470 Merge pull request #39 from AtlasMediaGroup/Elmon11-patch-2
clearinv option in smite (FS-161)
2021-04-11 22:15:26 +01:00
85d90090c8 Merge branch 'development' into Elmon11-patch-2 2021-04-11 18:41:54 +01:00
09930c2d9a Merge pull request #43 from VideoGameSmash12/development
Consistency fixes (across 46 commands), additional CoreProtect integration (/dispfill and /setlever), and a critical bugfix (/setlever) (FS-162)
2021-04-10 12:56:32 +01:00
7ae1ab035a Merge branch 'development' into development 2021-04-10 12:50:52 +01:00
2bd1787663 Updated supported versions for TFM. 2021-04-10 12:45:56 +01:00
765b7dcc4b Merge branch 'development' into development 2021-04-10 12:39:47 +01:00
091381a076 Merge pull request #44 from AtlasMediaGroup/FS-145
Update JDA version and location (FS-145)
2021-04-10 12:39:08 +01:00
27dfd71b2e Update JDA version and location (FS-145) 2021-04-09 21:20:33 +10:00
16e06bd932 Forgot I had this there 2021-04-07 19:45:03 -06:00
a33c310757 Fucking shit 2021-04-07 19:41:13 -06:00
df21bdfa7e Other bug fixes
Credit to Fleek for some of the code here.

Bugs that were fixed:
* [Media] showing up with an extra space at the beginning of blank messages with attachments
* Admin chat using incorrect colors for its ranks in messages from Discord to Minecraft
* Admin notes not sending to admins, only admin impostors
2021-04-07 19:40:19 -06:00
d7e2c0da42 Merge branch 'development' into Elmon11-patch-2 2021-04-07 11:52:16 +10:00
a7529b41fb Oops 2021-04-05 18:08:24 -06:00
c4fce3f0f9 Right, so this change applies only to commands. For the sake of code consistency, I tried to change as many as possible to use FreedomCommand.msg instead of CommandSender.sendMessage for their messages. Here are a list of the files containing those changes:
* Command_adminworld.java
* Command_adventure.java
* Command_banip.java
* Command_blockedit.java
* Command_blockpvp.java
* Command_cage.java
* Command_cartsit.java
* Command_clearchat.java
* Command_clearinventory.java
* Command_commandlist.java
* Command_creative.java
* Command_deop.java
* Command_deopall.java
* Command_dispfill.java
* Command_doom.java
* Command_gcmd.java
* Command_hubworld.java
* Command_inspect.java
* Command_list.java
* Command_lockup.java
* Command_manageshop.java
* Command_manuallyverify.java
* Command_masterbuilderworld.java
* Command_mbconfig.java
* Command_moblimiter.java
* Command_mp44.java
* Command_mute.java
* Command_nickfilter.java
* Command_op.java
* Command_opall.java
* Command_opme.java
* Command_potion.java (Also corrected the inconsistent "player not found" message's color)
* Command_rank.java
* Command_ride.java
* Command_saconfig.java
* Command_scare.java
* Command_setplayerlimit.java
* Command_settotalvotes.java
* Command_smite.java
* Command_spectator.java
* Command_survival.java
* Command_unblockcmd.java
* Command_uncage.java
* Command_unmute.java
* Command_verifynoadmin.java

Here are some commands I added functionality to:
* Command_dispfill.java: Added some code that hooks into the CoreProtect API to log the items being removed from and added into the dispensers.
* Command_setlever.java: Added some code that hooks into the CoreProtect API to log the levers being interacted with.

Here's a command I fixed a critical bug in:
* Command_setlever.java
2021-04-05 17:13:26 -06:00
27f5f18962 FS-143 Resolution (#42)
* Bump to patch version.

* Fixes FS-143

Various changes to make it work better with logging and things like that.
2021-04-06 07:11:12 +10:00
dca5e30291 Actually display assistant exec in game (#37)
* Actually display assistant exec in game

* Update RankManager.java

* Update ConfigEntry.java

* Update FUtil.java

Co-authored-by: Nathan Curran <30569566+Focusvity@users.noreply.github.com>
2021-04-04 22:24:06 +10:00
09a435053e Merge pull request #40 from AtlasMediaGroup/phoenix-patch-1
Remove /premium
2021-03-31 17:12:56 -05:00
14309275fb Remove /premium 2021-03-31 15:16:01 -05:00
2375e92d90 Merge pull request #36 from AtlasMediaGroup/tfm-bugfix-001
FS-143
2021-03-26 15:43:22 +00:00
97672c2fff Update DiscordToAdminChatListener.java
This is the only way we can load media after [Discord] and [Formatting] without rewriting the method
2021-03-22 09:57:09 -05:00
5837b05a35 Merge branch 'tfm-bugfix-001' of https://github.com/AtlasMediaGroup/TotalFreedomMod into tfm-bugfix-001 2021-03-21 14:02:51 -05:00
b3b68ebd13 Switch to Allman Formatting 2021-03-21 14:02:43 -05:00
2dbbb5c262 Intellij says this is fine so if it breaks again gg 2021-03-21 19:07:07 +01:00
e45655edbb im a clown 2021-03-21 18:33:38 +01:00
9713fcabd6 Should work fingers crossed 2021-03-21 18:25:28 +01:00
dc10c40578 noclear option in smite 2021-03-21 13:57:24 +01:00
db3c190b2b Merge branch 'development' into tfm-bugfix-001 2021-03-21 16:11:13 +11:00
2725857364 Merge pull request #38 from AtlasMediaGroup/FS-147
Fix ban expiration (FS-147)
2021-03-20 22:14:10 -05:00
9f291f675c Use 'toEpochMilli()' instead (FS-147) 2021-03-21 13:44:55 +11:00
561c192c27 Fix bans not expiring (FS-147) 2021-03-21 12:21:15 +11:00
086dec28ac Merge branch 'development' into tfm-bugfix-001 2021-03-19 23:31:31 +00:00
b03870c0aa SQL Fixes
:)
2021-03-19 10:39:58 -05:00
f5c08cd28b Merge pull request #34 from AtlasMediaGroup/2021.02-release
Bump version to 2021.02 Release
2021-03-19 14:26:02 +00:00
2a87271642 Should fix FS-143 2021-03-19 08:58:29 -05:00
3b57aec0e8 Merge branch 'development' into 2021.02-release 2021-03-18 23:57:10 +00:00
efac65bc76 Merge pull request #35 from AtlasMediaGroup/FS-58
Fix checkstyle & other formatting
2021-03-18 23:17:25 +00:00
9c8fe6c590 Fix checkstyle & other formatting
This should help clear a lot of the "Security" alerts resolving FS-58
2021-03-18 22:42:52 +00:00
9f52cdf753 Merge branch 'development' into 2021.02-release 2021-03-18 22:28:53 +00:00
216234ea01 Merge pull request #32 from AtlasMediaGroup/FS-33
Properly fix FS-33
2021-03-18 16:20:06 -05:00
881dead392 Merge branch 'development' into 2021.02-release 2021-03-19 08:04:36 +11:00
ff2bca26aa Merge branch 'development' into FS-33 2021-03-18 19:58:10 +00:00
89ad934aa6 Bump version to 2021.02 Release 2021-03-18 19:18:11 +00:00
d0a195647c Merge pull request #33 from AtlasMediaGroup/FS-93
Fixed permission not setting for new players (FS-93)
2021-03-17 09:06:45 -05:00
eb05b05042 Fixed FS-93
- Players no longer need to relog, just need to be opped to get permissions.
- Removed redundant PlayerJoinEvent code as it's already been executed (See RankManager class).
2021-03-16 20:21:31 +11:00
b9c1970d20 Update player's permission when opping. 2021-03-16 19:56:29 +11:00
9eca9ac5b2 Remove double storage
It is unnecessary as the information is already stored in a map (Username, IPs)
2021-03-08 11:34:48 +11:00
5b577fae07 Add myself to developer list 2021-03-07 20:46:30 +11:00
452a8755c2 Properly fix FS-33 2021-03-07 20:43:25 +11:00
2fb8f224e7 Bump release to 2021.02-RC03 2021-03-06 23:38:46 +00:00
b6a2c8e021 Merge pull request #29 from AtlasMediaGroup/abhi-test
Added myself to TFM
2021-03-06 20:32:04 +00:00
f0a25fde0c Merge branch 'development' into abhi-test 2021-03-06 20:03:19 +00:00
4324497831 Merge pull request #31 from AtlasMediaGroup/Wild1145-patch-1
Tell CodeQL we're using Java 11 hopefully
2021-03-06 20:03:02 +00:00
14c53b7370 Merge branch 'development' into Wild1145-patch-1 2021-03-06 19:47:48 +00:00
0396b8ad86 Merge pull request #30 from AtlasMediaGroup/frontdoor-and-banExpiry-only
fix banning/?? Resolves FS-130
2021-03-06 19:46:57 +00:00
8ee7486afc Merge branch 'development' into frontdoor-and-banExpiry-only 2021-03-06 19:38:01 +00:00
694d9614c5 Tell Maven to also build Java 11 for once 2021-03-06 19:28:38 +00:00
150e25072a Tell CodeQL we're using Java 11 hopefully 2021-03-06 19:14:46 +00:00
7d990ae2c0 [+] Remove .idea 2021-03-06 23:50:23 +05:30
0dd5a26efa Merge branch 'frontdoor-and-banExpiry-only' of https://github.com/AtlasMediaGroup/TotalFreedomMod into frontdoor-and-banExpiry-only 2021-03-06 12:12:59 -06:00
5c097c83cb Here's to hoping this fixes that stupid ban crap. 2021-03-06 12:00:32 -06:00
a85dd014a0 Added .idea in gitignore 2021-03-06 13:05:42 +05:30
342df43f85 Added myself to TFM 2021-03-06 13:04:36 +05:30
d4be858c46 2021.02-RC02 Release Bump
Version bump with some Netbeans Config updates to use Java 11 as we should have been.
2021-03-05 21:44:38 +00:00
ec9a6e0d5b paldiu did some shit
FS-63 (FrontDoor)
FS-130 (Bans)
2021-03-04 20:37:31 -05:00
9161016f73 Merge branch 'development' into frontdoor-and-banExpiry-only 2021-03-03 11:52:37 -06:00
bdd22f8d75 Update month to be 30 days instead of 4 weeks 2021-03-03 12:50:45 -05:00
ce103ffd50 Merge pull request #28 from AtlasMediaGroup/abhi-test
fixes of JIRA issues.
2021-03-02 20:45:18 -06:00
85c35f25a3 [+] Fix codacy issue 2021-03-03 06:47:22 +05:30
c29b312101 [+] Remove .idea 2021-03-02 23:11:17 +05:30
a4ead85701 add annotations dependency 2021-03-01 23:03:49 -06:00
46273b3301 Revert "SQL PreparedStatement Fixes"
This reverts commit 17347c23a5.
2021-03-01 23:03:13 -06:00
d6b74a76bb [+] Fix of FS-33 2021-02-28 21:28:20 +05:30
6f66957b17 Few fixes for JIRA issues.... 2021-02-28 21:08:39 +05:30
17347c23a5 SQL PreparedStatement Fixes 2021-02-26 15:29:02 -06:00
718748f1a2 Commit Ultimate
ultimate super mega mode power upgrade
2021-02-26 15:26:13 -06:00
96d1c53ede First release candidate
Bumping version and build code name for the first release candidate of the 2021.02 release.
2021-02-26 16:53:00 +00:00
1293a8aa1e Merge pull request #26 from AtlasMediaGroup/ivan
Ruh-Roh Raggy!
2021-02-25 17:58:12 -05:00
96424694ee fix codacy errors 2021-02-25 17:03:31 -05:00
0367d9fd3a my end of the bargain 2021-02-25 16:42:30 -05:00
3b666f1fde Merge pull request #25 from AtlasMediaGroup/Elmon11-patch-1
removing BukkitTelnet from untouchable plugins
2021-02-17 18:25:19 -05:00
ec51cb7408 removing BukkitTelnet from untouchable plugins 2021-02-17 22:03:35 +01:00
4023394562 Merge pull request #24 from AtlasMediaGroup/FS-38
Remove duplicate config
2021-02-14 18:19:30 +00:00
5d312a12d4 Remove the duplicates that I can see based off of the recent warn
Heap is entirely removed as it doesn't appear to now be a valid command. The rest are duplicated elsewhere. When in doubt the highest level of restriction was applied.
2021-02-14 18:05:32 +00:00
b88cdf1250 Re-Base Config against Freedom-01
Ensures all the variables we probably have changed and that run as standard are set, commands that are blocked are updated and anything else I could think of are up to date.
2021-02-14 17:44:57 +00:00
ebec598120 Fix file permissions 2021-02-06 23:56:15 +00:00
aa060ea4d8 Update README with security info 2021-02-06 23:42:03 +00:00
fc3eef4d90 Fixed Travis Build Status 2021-02-06 23:06:15 +00:00
44ac012165 Re-adding Travis file based off of the original ones. 2021-02-06 22:44:50 +00:00
500d0e1044 Let's start using TravisCI Again
It just makes sense...
2021-02-06 22:43:29 +00:00
400a90b385 Merge pull request #21 from AtlasMediaGroup/smartnt-patch-1
Add new developers to util
2021-01-25 21:28:43 -05:00
b8a741aa58 Add new developers to util
Hopefully this doesn't fuck up this time - last PR my Macbook was having issues with for some reason.
2021-01-25 20:36:58 -05:00
a3929ec07e Merge pull request #19 from AtlasMediaGroup/permission-changes
merging according to wild's comments
2021-01-17 04:11:31 +01:00
8225daf6f1 permission changes & remove massmurder
resolves FS-69, FS-70, FS-71
2021-01-10 16:23:20 -05:00
8dce71eca1 Merge pull request #18 from AtlasMediaGroup/revert-15-sql-fix
Revert "SQL fix"
2021-01-10 20:45:13 +00:00
a2243abf2d Revert "SQL fix" 2021-01-10 20:44:57 +00:00
009b983c9a Merge pull request #15 from AtlasMediaGroup/sql-fix
SQL fix
2021-01-10 20:36:57 +00:00
1b3876cffa Merge branch 'development' into sql-fix 2021-01-10 15:06:40 -05:00
ed48ce3a8f Merge pull request #11 from AtlasMediaGroup/paldiu-local
Removal of Lombok
2021-01-10 15:06:22 -05:00
830daab8f4 Fix Daemon Error
Reflection issue when initializing the daemon; trying to call a constructor with one argument using two arguments.

Removed an unused constructor.
2021-01-08 17:32:54 -06:00
9688827a39 formatting 2021-01-08 10:10:54 -05:00
3464a33678 NPE on Thread.join() possible fix
This bug is hard to decipher mainly due to the thread being terminated somewhere before the thread.join is called. this may be due to the safeClose method defined with serverSocket, but again, I'm not too sure what's up here. This may also be because something failed to execute in one of the try catch statements, causing the thread to never be initialized in the first place.
2021-01-08 00:25:46 -06:00
5754d70d05 Merge branch 'development' into sql-fix 2021-01-07 14:46:13 -05:00
fbf2972006 Merge branch 'sql-fix' into paldiu-local 2021-01-07 13:40:59 -06:00
aa2836b29a Merge branch 'mbw-fix' into paldiu-local 2021-01-07 13:39:51 -06:00
260368585e reformat 2021-01-07 13:29:47 -06:00
323fd1a031 Should be fine now 2021-01-04 18:27:57 -06:00
c7b0f77910 Merge branch 'development' into paldiu-local 2021-01-04 13:14:53 -06:00
7fb6a2f087 Merge pull request #17 from AtlasMediaGroup/Elmon11-patch-1
Fix developer title not showing up on Offline mode servers
2021-01-03 13:47:14 -05:00
e32c2eed15 Update FUtil.java 2021-01-03 19:23:10 +01:00
7afa80c89f Update FUtil.java 2021-01-03 19:18:14 +01:00
a3cccc7ac0 Update FUtil.java 2021-01-03 19:16:41 +01:00
bc37ed5341 Fix developer title not showing up on Offline mode servers 2021-01-03 19:04:23 +01:00
0a5ce5b9cc fix w/e in mbw 2020-12-31 13:06:05 -05:00
a4e23dc03f Codacy Complacency Part 2 2020-12-29 22:14:57 -06:00
7a394e52e4 Codacy complacency 2020-12-29 22:06:12 -06:00
9352a48650 Finalized lombok removal
Finally removed all lomboks, also reduced npath complexity for FreedomCommand.FCommand#execute and removed empty constructor from Discord
2020-12-29 21:37:50 -06:00
a849e01ce5 Merge pull request #12 from AtlasMediaGroup/FS-59
admin chat discord formatting (FS-59)
2020-12-29 15:34:48 -05:00
fd725ca6c5 Merge branch 'development' into paldiu-local 2020-12-28 22:51:44 +00:00
0703ea685e Merge branch 'development' into FS-59 2020-12-28 22:51:21 +00:00
1ba468cbfc Merge branch 'development' into sql-fix 2020-12-28 17:49:11 -05:00
91dc89013c Merge pull request #14 from AtlasMediaGroup/mojangson-update
Mojangson update
2020-12-28 22:44:20 +00:00
7cdeac451b SQL fix 2020-12-28 17:39:07 -05:00
5b8cf2798e Update pom.xml 2020-12-28 17:05:52 -05:00
98158e0f27 mojangson update 2020-12-28 17:04:14 -05:00
c0ac0365eb Merge pull request #13 from AtlasMediaGroup/Elmon11-patch-1
Make gcmd not work on admins

//MERGE COMMIT:
At least one build check passed, the failing check is irrelevant.
2020-12-28 07:41:58 -05:00
0c60cbc739 Update Command_gcmd.java 2020-12-28 00:18:05 +01:00
402a6be5ad Make gcmd not work on admins 2020-12-28 00:04:57 +01:00
9d131f0f24 ok codacy 2020-12-26 19:11:15 -05:00
b9606fa0e3 admin chat discord formatting (FS-59) 2020-12-26 18:54:15 -05:00
d71f5452ad Changed instance of SplittableRandom back to Random
Overridable methods required Random instead of SplittableRandom and caused a build failure in the previous commit. This should fix the build failure.
2020-12-26 10:30:30 -05:00
eb9759f2d8 Replaced All Instances of Random With SplittableRandom
SplittableRandom is faster (negligable) than Random and is also able to recursively return new instances of itself for an even more complex pseudo random generator compared to the default Random supplied by Java.
2020-12-25 15:57:10 -05:00
dec35f76e4 Minor fix
Switched from a lengthy if else to a ternary.
2020-12-25 15:51:17 -05:00
97edce0a67 Fixes for Codacy;
These fixes are designed to satisfy codacy.

However, codacy reports a NPath Complexity of 649, whereas the current, recommended, and standardized threshold is 200.

This is caused by FreedomCommand#execute(CommandSender, String, String[]);
2020-12-25 15:35:33 -05:00
361aa4ee04 Bugfix on Commit #5c0f77c
A mismatched argument count during constructor initialization in Module_logs.class was fixed in this patch.
2020-12-25 15:20:34 -05:00
5c0f77c7c5 Removal of Lombok
Lombok implementation removal.

I have also gone through and replaced things with inline methods and variables, lambdas, and simplified loops down, removed unnecessary guard clauses, and overall cleaned up every single class. This took a long time, please do remember to follow proper naming conventions, don't include unnecessary guard clauses, follow exception rules and comment rules, and please PLEASE remember to use the DIAMOND OPERATOR rather than just inferring RAW TYPES!!!

Thank you!!
2020-12-25 14:46:43 -05:00
210b0f8b43 unnecessary 2020-12-24 20:07:09 -05:00
585fdb7992 fix verification toggle breaking everything (FS-39) 2020-12-24 19:48:52 -05:00
6d05e9b924 Merge pull request #10 from AtlasMediaGroup/maven-sec
Moved Repo's to HTTPS
2020-12-24 19:33:04 -05:00
fb314170c1 Moved Repo's to HTTPS 2020-12-24 22:52:35 +00:00
218d720b06 Merge pull request #9 from AtlasMediaGroup/FS-12
Update social links in line with live config
2020-12-24 14:18:33 -05:00
7bf97a03c4 Update social links in line with live config
The current server config has these links and those ones commented out. While I do now own them not all of them I'm actively using but thought it'd be good to keep this sync'd up.

Resolves FS-12
2020-12-24 18:36:27 +00:00
de496970d9 remove reddit system
jraw free 🦀🦀🦀
2020-12-24 13:09:42 -05:00
c8ec171b11 Update Discord.java 2020-12-23 20:13:26 -05:00
caf126f543 elmon
fix underscore italic thing
2020-12-23 20:09:57 -05:00
a717cce3b5 fix admins being able to see senior commands 2020-12-18 21:43:24 -05:00
ce32490b4d Update Module_list.java 2020-12-16 17:46:27 -05:00
5d882d9052 Update Module_list.java 2020-12-16 23:42:44 +01:00
7dfd6c0b8b Update Module_list.java 2020-12-16 23:37:14 +01:00
fa5c774f45 Remove developer who has been suspended indefintely. 2020-12-15 20:53:07 +00:00
c356ecd168 formatting & rename stuff 2020-12-14 19:05:13 -05:00
f8ce64d6c3 Merge pull request #8 from SupItsDillon/development
FS-5 Allow the verification system to be enabled / disabled in config (2)
2020-12-14 19:09:57 +00:00
39d5b610a1 Update WorldRestrictions.java 2020-12-12 12:59:19 -05:00
50643eb9ff Update Command_verify.java
ood code again
2020-12-09 16:03:40 +00:00
687166e0a4 Update Discord.java
formatting screwed up
2020-12-09 16:00:18 +00:00
98ead06355 Update Command_manuallyverify.java
ood file
2020-12-09 15:59:12 +00:00
cbc3795ef2 Update Command_playerverification.java
i should really keep my files updates
2020-12-09 15:55:45 +00:00
b9d608222e Update Command_playerverification.java
fixed codacy issue
2020-12-09 15:48:27 +00:00
777a66f8da Update Discord.java
correct updated file
2020-12-09 15:37:31 +00:00
6441deceab Update Command_playerverification.java
codacy is being fussy
2020-12-08 19:35:02 +00:00
1fedb1fad3 Update Discord.java
forgot to change this aswell
2020-12-08 19:28:47 +00:00
8b1cef3b83 Update Discord.java
whoops i did change something i didnt want to
2020-12-08 19:26:00 +00:00
81ef3d624a Update Discord.java
cant remember if i changed anything since last commit
2020-12-08 19:17:06 +00:00
b0c0f17043 Update Command_manuallyverify.java
discord verify enable disable
2020-12-08 19:16:28 +00:00
fb3cdf3603 Update Command_playerverification.java
discord enable disable verification
2020-12-08 19:15:55 +00:00
950c975e8f Update Command_verify.java
discord verification config
2020-12-08 19:15:17 +00:00
79c8ea301d Update config.yml
config option for discord verification
2020-12-08 16:10:14 +00:00
7a11c9062d Update ConfigEntry.java
config option for verification
2020-12-08 16:09:26 +00:00
2037775276 Update Discord.java
stuff to disable or enable discord verification
2020-12-08 16:08:31 +00:00
4a3ce64412 Merge pull request #1 from AtlasMediaGroup/development
updated stuff
2020-12-08 16:07:04 +00:00
681695150a Merge pull request #6 from AtlasMediaGroup/Wild1145-patch-1
Block new CoreProtect stuff better
2020-12-05 21:10:27 +00:00
e98682a1af Delete Command_gsay.java
https://forum.totalfreedom.me/d/114-why-is-gchat-now-gsay-back/13
2020-12-05 22:05:29 +01:00
92534640d4 Block new CoreProtect stuff better 2020-12-05 19:01:09 +00:00
695ccd0e71 /list -a
/list -s still exists
2020-12-04 10:37:40 -05:00
0be2aa718f ok 2020-12-03 20:50:30 -05:00
b3b9c2ef43 \ 2020-12-03 20:46:10 -05:00
293ea04c56 staff -> admins
* rename everything containing staff back to admin (as requested by ryan i've renamed commands like slconfig to saconfig but left "slconfig" as an alias)
* format almost every file correctly
* a few other improvements
2020-12-03 19:28:53 -05:00
aae1f524ea updating social and voting links 2020-12-02 22:25:17 +01:00
7871acc215 Merge pull request #5 from AtlasMediaGroup/Wild1145-patch-1
Update checkstyle.xml
2020-12-02 20:50:01 +00:00
153b87c3b3 Update checkstyle.xml
Think this should fix a load of our new warnings.
2020-12-02 20:40:32 +00:00
932fa467ba Update README.md 2020-12-02 20:31:44 +00:00
82804fcac2 Create codacy-analysis.yml 2020-12-02 20:23:31 +00:00
8ed35aba2b add "Interaction" result action string check
fixes container interactions being logged as block removals
2020-12-01 18:53:28 -05:00
4898bcf7b5 Merge pull request #2 from AtlasMediaGroup/Elmon11-patch-1
reordered response object and reformat
2020-12-02 00:16:39 +01:00
495c91f5bb Merge pull request #3 from AtlasMediaGroup/Elmon11-patch-2
checks if a player is OP before opping them
2020-12-01 17:52:54 -05:00
42199f9923 Update Command_opall.java 2020-12-01 23:45:32 +01:00
03a6f18d18 checks if a player is OP before opping them
response to
338fc81b7f (r533706741)
2020-12-01 23:44:00 +01:00
aff12edb03 reordered response object and reformat
reordered response object and changed senioradmins & masterbuilders to senior_admins & master_builders for consistency with the bot
2020-12-01 23:10:01 +01:00
c0a7ee1bb6 Final fix to security readme (I hope) 2020-12-01 19:43:45 +00:00
8c0db481ae Update SECURITY.md
Helps when you delete the template...
2020-12-01 19:43:07 +00:00
6084e7cb63 Create SECURITY.md 2020-12-01 19:42:16 +00:00
e40138dee6 Update maven.yml 2020-12-01 19:35:11 +00:00
28576a9e8b new developers ! ! ! 2020-11-30 19:03:51 -05:00
c1d4e126a3 add block inspector for ops
* adds /inspect (or /ins) as a /co i replacement command for OPs. container and sign logging are still a WIP for this command.
* replaces "Rank must be Trial Mod or higher." with "Rank must be Admin or higher." in slconfig
* replaces "scripthead is the owner of TotalFreedom." with "Wild1145 is the owner of TotalFreedom." in the config
2020-11-30 18:17:27 -05:00
6cd995ff52 sql fixes & more
fixes slconfig sql error
fixes nickclean npe
fixes a few command inconsistensies
2020-11-24 11:53:37 -05:00
495133da1a Let's see if this works. 2020-11-22 23:45:29 +00:00
de0d6853b7 revert calebs broken patch 2020-11-19 23:22:00 -06:00
5cdbae0166 Update ActivityLogEntry.java 2020-11-14 20:26:49 -06:00
a537183545 Add adminchat channel 2020-11-14 20:13:59 -06:00
2c19ce5c65 Adds https://tracker.telesphoreo.me/d/4-mbconfig-clearip 2020-11-09 21:05:33 -06:00
609053e13f oops 2020-11-09 20:16:26 -06:00
a3837a0e06 Resolves https://tracker.telesphoreo.me/d/3-fix-mb-config 2020-11-09 20:11:21 -06:00
0adee3582b d 2020-11-08 21:08:44 -06:00
08bfd73eec Delete FAWEBridge 2020-11-08 20:09:49 -06:00
9a7cc52e03 Fix players being marked as an impostor when the Discord verification system is disabled 2020-11-08 20:05:54 -06:00
11984bc46f Update BukkitTelnetBridge.java 2020-11-08 19:26:52 -06:00
8ac5bc827a Rename gchat to gsay 2020-11-07 22:21:06 -06:00
366287eb24 Fix reports being logged multiple times to console 2020-11-07 21:00:49 -06:00
43c2df58c7 knew there'd be a nms update 2020-11-02 23:33:04 -06:00
d0acfcf674 Delete Jenkinsfile 2020-10-29 21:38:24 -05:00
88ccd8edfd Delete .travis.yml 2020-10-29 21:38:11 -05:00
7f9e2af9a6 Update README.md 2020-10-29 21:37:34 -05:00
f9269f1fe4 Update maven.yml 2020-10-29 21:37:05 -05:00
a5359ec580 Update README.md 2020-10-29 21:33:18 -05:00
e3a6f5127f fix wildcard and add back some beloved commands 2020-10-29 21:24:06 -05:00
e1e046b16b lol whos the idiot who made this embarassing command 2020-10-29 20:47:23 -05:00
7d93050ff9 I assume 1.16.4 will have an NMS update 2020-10-29 18:59:54 -05:00
fadcb9ad5d TotalFreedomMod 2020.11 2020-10-29 18:47:53 -05:00
49f7c6e8c3 Merge pull request #292 from speedxx/development
fix ride request expire messages
2020-10-29 15:06:29 -05:00
9bcdb2bcdc fix ride request expire messages
fixes /ride sending request expired message even after accepting & properly remove player from map after accepting, #291
2020-10-28 18:06:12 -04:00
ca4670ed89 Merge pull request #290 from speedxx/development
getDeterminer() -> getArticle()
2020-10-25 12:43:34 -05:00
adf71cb020 Update RankManager.java 2020-10-25 13:24:41 -04:00
6e84fdad23 Login messages
Last commit from me. Don't have the power but to me Packs is the new Lead Developer
2020-10-25 09:27:56 -07:00
2ecfd9610f br 2020-10-19 19:07:44 -05:00
bb33778fc9 [Maven] FAWE 2020-10-16 22:33:33 -05:00
d4d1000c16 Merge pull request #289 from Focusvity/pr/discord
Enable media tag to be included in messages
2020-10-16 21:36:38 -05:00
5a96204f1b Tidy things up a bit 2020-10-16 17:51:21 +11:00
3bd72dacda Enable media tag to be included in messages 2020-10-16 17:33:58 +11:00
a4c8dad865 Merge pull request #288 from Focusvity/pr/perm-config-fix
Fix NPE
2020-10-15 21:40:14 -05:00
82e7a3b659 Fix NPE (https://github.com/TFPatches/TotalFreedomMod/issues/287) 2020-10-16 13:37:25 +11:00
586fa98c32 Merge pull request #286 from Focusvity/pr/discord-media
Use Component API for attachments
2020-10-15 21:37:15 -05:00
a8f95bcb19 Use Component API for attachments 2020-10-16 13:20:20 +11:00
82d92565e7 lol 2020-10-13 13:37:11 -07:00
533e4fe369 Login messages for players. Still need to come up with login messaghes 2020-10-02 02:27:06 -07:00
318 changed files with 9725 additions and 9540 deletions

23
.github/dependabot.yml vendored Normal file
View File

@ -0,0 +1,23 @@
# To get started with Dependabot version updates, you'll need to specify which
# package ecosystems to update and where the package manifests are located.
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
# Maintain Maven Updates
- package-ecosystem: "maven" # See documentation for possible values
directory: "/" # Location of package manifests
target-branch: "development"
open-pull-requests-limit: 50
schedule:
interval: "daily"
# Maintain dependencies for GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
target-branch: "development"
open-pull-requests-limit: 50
schedule:
interval: "daily"

46
.github/workflows/codacy-analysis.yml vendored Normal file
View File

@ -0,0 +1,46 @@
# This workflow checks out code, performs a Codacy security scan
# and integrates the results with the
# GitHub Advanced Security code scanning feature. For more information on
# the Codacy security scan action usage and parameters, see
# https://github.com/codacy/codacy-analysis-cli-action.
# For more information on Codacy Analysis CLI in general, see
# https://github.com/codacy/codacy-analysis-cli.
name: Codacy Security Scan
on:
push:
branches: [ development ]
pull_request:
branches: [ development ]
jobs:
codacy-security-scan:
name: Codacy Security Scan
runs-on: ubuntu-latest
steps:
# Checkout the repository to the GitHub Actions runner
- name: Checkout code
uses: actions/checkout@v2
# Execute Codacy Analysis CLI and generate a SARIF output with the security issues identified during the analysis
- name: Run Codacy Analysis CLI
uses: codacy/codacy-analysis-cli-action@4.0.0
with:
# Check https://github.com/codacy/codacy-analysis-cli#project-token to get your project token from your Codacy repository
# You can also omit the token and run the tools that support default configurations
project-token: ${{ secrets.CODACY_PROJECT_TOKEN }}
verbose: true
output: results.sarif
format: sarif
# Adjust severity of non-security issues
gh-code-scanning-compat: true
# Force 0 exit code to allow SARIF file generation
# This will handover control about PR rejection to the GitHub side
max-allowed-issues: 2147483647
# Upload the SARIF file generated in the previous step
- name: Upload SARIF results file
uses: github/codeql-action/upload-sarif@v1
with:
sarif_file: results.sarif

74
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@ -0,0 +1,74 @@
# For most projects, this workflow file will not need changing; you simply need
# to commit it to your repository.
#
# You may wish to alter this file to override the set of languages analyzed,
# or to provide custom queries or build logic.
#
# ******** NOTE ********
# We have attempted to detect the languages in your repository. Please check
# the `language` matrix defined below to confirm you have the correct set of
# supported CodeQL languages.
#
name: "CodeQL"
on:
push:
branches: [ development ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ development ]
schedule:
- cron: '20 18 * * 1'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: [ 'java' ]
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ]
# Learn more:
# https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Java JDK
uses: actions/setup-java@v2.3.0
with:
# The Java version to make available on the path. Takes a whole or semver Java version, or 1.x syntax (e.g. 1.8 => Java 8.x). Early access versions can be specified in the form of e.g. 14-ea, 14.0.0-ea, or 14.0.0-ea.28
java-version: 17
distribution: 'adopt'
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
# By default, queries listed here will override any specified in a config file.
# Prefix the list here with "+" to use these queries and those in the config file.
# queries: ./path/to/local/query, your-org/your-repo/queries@main
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v1
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

43
.github/workflows/downstream.yml vendored Normal file
View File

@ -0,0 +1,43 @@
# This is a basic workflow to help you get started with Actions
name: Downstream Branch Updates
on:
schedule:
- cron: '20 7 * * *'
# scheduled at 07:00 every Monday and Thursday
workflow_dispatch: # click the button on Github repo!
jobs:
sync_with_upstream:
runs-on: ubuntu-latest
name: Sync main with upstream latest
steps:
# Step 1: run a standard checkout action, provided by github
- name: Checkout main
uses: actions/checkout@v2
with:
ref: main
# submodules: 'recursive' ### may be needed in your situation
# Step 2: run this sync action - specify the upstream repo, upstream branch to sync with, and target sync branch
- name: Pull (Fast-Forward) upstream changes
id: sync
uses: aormsby/Fork-Sync-With-Upstream-action@v2.1
with:
upstream_repository: AtlasMediaGroup/TotalFreedomMod
upstream_branch: main
target_branch: development
git_pull_args: --ff-only # optional arg use, defaults to simple 'pull'
# Step 3: Display a message if 'sync' step had new commits (simple test)
- name: Check for new commits
if: steps.sync.outputs.has_new_commits
run: echo "There were new commits."
# Step 4: Print a helpful timestamp for your records (not required, just nice)
- name: Timestamp
run: date

21
.github/workflows/java17-maven.yml vendored Normal file
View File

@ -0,0 +1,21 @@
name: Java17-Maven-Build
on: [push]
jobs:
build-java-17:
runs-on: ubuntu-latest
steps:
# Checkout the code
- uses: actions/checkout@v1
# Java 16 Builds
- name: Set up JDK 17
uses: actions/setup-java@v2.3.0
with:
java-version: 17
distribution: 'adopt'
- name: Build with Maven
run: mvn -B package --file pom.xml

View File

@ -1,17 +0,0 @@
name: Java CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Build with Maven
run: mvn -B package --file pom.xml

2
.gitignore vendored
View File

@ -25,6 +25,7 @@ manifest.mf
/.idea/workspace.xml /.idea/workspace.xml
/.idea/uiDesigner.xml /.idea/uiDesigner.xml
/.idea/libraries /.idea/libraries
/.idea/
*.iml *.iml
# Maven excludes # Maven excludes
@ -37,3 +38,4 @@ manifest.mf
.Trashes .Trashes
ehthumbs.db ehthumbs.db
Thumbs.db Thumbs.db
.idea/inspectionProfiles/Project_Default.xml

View File

@ -1,46 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<JavaCodeStyleSettings>
<option name="CLASS_COUNT_TO_USE_IMPORT_ON_DEMAND" value="20" />
<option name="IMPORT_LAYOUT_TABLE">
<value>
<package name="" withSubpackages="true" static="false" />
<package name="" withSubpackages="true" static="true" />
</value>
</option>
</JavaCodeStyleSettings>
<JetCodeStyleSettings>
<option name="PACKAGES_TO_USE_STAR_IMPORTS">
<value>
<package name="java.util" alias="false" withSubpackages="false" />
<package name="kotlinx.android.synthetic" alias="false" withSubpackages="true" />
<package name="io.ktor" alias="false" withSubpackages="true" />
</value>
</option>
<option name="PACKAGES_IMPORT_LAYOUT">
<value>
<package name="" alias="false" withSubpackages="true" />
<package name="java" alias="false" withSubpackages="true" />
<package name="javax" alias="false" withSubpackages="true" />
<package name="kotlin" alias="false" withSubpackages="true" />
<package name="" alias="true" withSubpackages="true" />
</value>
</option>
</JetCodeStyleSettings>
<codeStyleSettings language="JAVA">
<option name="BRACE_STYLE" value="2" />
<option name="CLASS_BRACE_STYLE" value="2" />
<option name="METHOD_BRACE_STYLE" value="2" />
<option name="LAMBDA_BRACE_STYLE" value="2" />
<option name="ELSE_ON_NEW_LINE" value="true" />
<option name="WHILE_ON_NEW_LINE" value="true" />
<option name="CATCH_ON_NEW_LINE" value="true" />
<option name="FINALLY_ON_NEW_LINE" value="true" />
<option name="SPACE_AFTER_TYPE_CAST" value="false" />
<option name="IF_BRACE_FORCE" value="3" />
<option name="DOWHILE_BRACE_FORCE" value="3" />
<option name="WHILE_BRACE_FORCE" value="3" />
<option name="FOR_BRACE_FORCE" value="3" />
</codeStyleSettings>
</code_scheme>
</component>

View File

@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

17
.idea/compiler.xml generated
View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<annotationProcessing>
<profile default="true" name="Default" enabled="true" />
<profile name="Maven default annotation processors profile" enabled="true">
<sourceOutputDir name="target/generated-sources/annotations" />
<sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
<outputRelativeToContentRoot value="true" />
<module name="TotalFreedomMod" />
</profile>
</annotationProcessing>
<bytecodeTargetLevel>
<module name="TotalFreedomMod" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>

8
.idea/encodings.xml generated
View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

16
.idea/misc.xml generated
View File

@ -1,16 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<list size="1">
<item index="0" class="java.lang.String" itemvalue="org.bukkit.event.EventHandler" />
</list>
</component>
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
</project>

124
.idea/uiDesigner.xml generated
View File

@ -1,124 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.png" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.png" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.png" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.png" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>

6
.idea/vcs.xml generated
View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

View File

@ -1 +0,0 @@
language: java

View File

@ -1,3 +1,3 @@
# Contributing to TotalFreedomMod # # Contributing to TotalFreedomMod
For information about contributing to TotalFreedomMod, please see the [contributing guidelines](https://github.com/TotalFreedom/TotalFreedomMod/wiki/Contributing). For information about contributing to TotalFreedomMod, please see the [contributing guidelines](https://github.com/TotalFreedom/TotalFreedomMod/wiki/Contributing).

12
Jenkinsfile vendored
View File

@ -1,12 +0,0 @@
pipeline {
agent any
stages {
stage('Build') {
steps {
mvn -B package --file pom.xml
archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
}
}
}
}

View File

@ -1,4 +1,5 @@
# TotalFreedom General License # # TotalFreedom General License
_Version 2.0, 27th February 2015_ _Version 2.0, 27th February 2015_
Copyright (c) 2011 Steven Lawson Copyright (c) 2011 Steven Lawson
@ -7,7 +8,8 @@ Copyright (c) 2012 Jerom van der Sar
All rights reserved. All rights reserved.
##### 1. Definitions ##### ##### 1. Definitions
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by this document. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by this document.
"Licensor" shall mean the copyright holder or entity authorised by the copyright owner that is granting the License. "Licensor" shall mean the copyright holder or entity authorised by the copyright owner that is granting the License.
@ -30,12 +32,13 @@ All rights reserved.
"Redistribution" shall mean any partial or complete availability, transfer or publication of the Work from one Legal Entity to another. "Redistribution" shall mean any partial or complete availability, transfer or publication of the Work from one Legal Entity to another.
##### 2. Grant of Copyright License ##### ##### 2. Grant of Copyright License
Subject to the terms and conditions of this License, You are granted a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to prepare Derivative Works of, publicly display, publicly perform, inspect and redistribute the Work and such Derivative Works as long as the following conditions are met:
Subject to the terms and conditions of this License, You are granted a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to prepare Derivative Works of, publicly display, publicly perform, inspect and redistribute the Work and such Derivative Works as long as the following conditions are met:
1. Redistributions of This Software must solely occur in Source form. Redistribution in Object form is prohibited without prior written permission from the Licensor. 1. Redistributions of This Software must solely occur in Source form. Redistribution in Object form is prohibited without prior written permission from the Licensor.
2. Neither the names of the copyright holders nor the names this software's contributors may be removed from This Software's source code. 2. Neither the names of the copyright holders nor the names this software's contributors may be removed from This Software's source code.
3. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from This Software without specific prior written permission. 3. Neither the names of the copyright holders nor the names of its contributors may be used to endorse or promote products derived from This Software without specific prior written permission.
@ -47,8 +50,10 @@ All rights reserved.
7. Sub licensing of This Software is prohibited without prior written permission from the Licensor. 7. Sub licensing of This Software is prohibited without prior written permission from the Licensor.
##### 3. Submission of Contributions ##### ##### 3. Submission of Contributions
Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
##### 4. Disclaimer of Warranty ##### ##### 4. Disclaimer of Warranty
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,14 +1,17 @@
# TotalFreedomMod [![Build Status](https://travis-ci.org/TFPatches/TotalFreedomMod.svg?branch=development)](https://travis-ci.org/TFPatches/TotalFreedomMod) [![codebeat badge](https://codebeat.co/badges/5f078e55-8a02-4120-9076-70f6994f48d1)](https://codebeat.co/projects/github-com-tfpatches-totalfreedommod-tfm-1-14-fa58c58f-b1c4-4221-bf78-346e07db6961) # TotalFreedomMod [![Maven-Build](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/maven.yml/badge.svg)](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/maven.yml) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/29c0f964da304666bd654bc7b1d556db)](https://www.codacy.com/gh/AtlasMediaGroup/TotalFreedomMod/dashboard?utm_source=github.com&utm_medium=referral&utm_content=AtlasMediaGroup/TotalFreedomMod&utm_campaign=Badge_Grade) [![CodeQL](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/codeql-analysis.yml/badge.svg)](https://github.com/AtlasMediaGroup/TotalFreedomMod/actions/workflows/codeql-analysis.yml)
TotalFreedomMod is a CraftBukkit server plugin designed primarily to support the [Official TotalFreedom Minecraft Server](http://totalfreedom.me/). However, you are more than welcome to adapt the source for your own server. TotalFreedomMod is a CraftBukkit server plugin designed primarily to support the [Official TotalFreedom Minecraft Server](https://totalfreedom.me/). However, you are more than welcome to adapt the source for your own server.
This plugin was originally coded by StevenLawson (Madgeek1450), with Jerom van der Sar (Prozza) becoming heavily involved in its development some time later. It consists of over 85 custom coded commands and a large variety of distinguishable features not included in any other plugin. The plugin has since its beginning grown immensely. Together, with the main TotalFreedom server, TotalFreedomMod has a long-standing reputation of effectiveness whilst maintaining a clear feeling of openness towards the administrators and the players themselves. This plugin was originally coded by StevenLawson (Madgeek1450), with Jerom van der Sar (Prozza) becoming heavily involved in its development some time later. It consists of over 85 custom coded commands and a large variety of distinguishable features not included in any other plugin. The plugin has since its beginning grown immensely. Together, with the main TotalFreedom server, TotalFreedomMod has a long-standing reputation of effectiveness whilst maintaining a clear feeling of openness towards the administrators and the players themselves.
### Contributing ### ### Contributing
Please see [CONTRIBUTING.md](CONTRIBUTING.md) if you are interested in developing TotalFreedomMod. Please see [CONTRIBUTING.md](CONTRIBUTING.md) if you are interested in developing TotalFreedomMod.
For information on how TotalFreedomMod is licensed, please see [LICENSE.md](LICENSE.md). For information on how TotalFreedomMod is licensed, please see [LICENSE.md](LICENSE.md).
### Compiling ### For information on our security policy and reporting an issue, please see [SECURITY.md](SECURITY.md)
You need Maven to build. You'd also need to set the JDK version to Java 8 as that is the current standard as of now. ### Compiling
You need Maven to build. You'd also need to set the JDK version to Java 11 as that is the current standard as of now.

42
SECURITY.md Normal file
View File

@ -0,0 +1,42 @@
# Security Policy
## Supported Versions
We currently support the code running on the "main" branch and "development" branch of this repository. This is supported in addition to those formal releases, but note anything not yet released should be treated as in-development.
In terms of plugin releases, our support matrix is as follows:
### Actively Supported
These versions are currently actively supported by our team, and you should expect security patches where appropriate for these versions.
| Version | Supported | Support End: |
| ------------------- | ---------- | ------------------------------ |
| 2022.02 | ✅ | No Earlier than May 2022 |
### Legacy Supported
These versions are no longer under active development, however we will look to release critical secuirty patches where appropriate.
| Version | Supported | Support End: |
| ------------------- | ---------- | ------------ |
| 2021.09 | ⚠️ | April 2022 |
### No Longer Supported
These versions are no longer supported at all. It is strongly advised to update if you are running any of these versions.
| Version | Supported | Support Ended: |
| ------------------- | ------------------ | ------------------- |
| 2021.06 | :x: | October 2021 |
| 2021.05 | :x: | September 2021 |
| 2021.04 | :x: | July 2021 |
| 2021.02 | :x: | 6 June 2021 |
| 2020.11 | :x: | 3 May 2021 |
| 6.0.x (Pre-Release) | :x: | December 2020 |
| < 2020.11 | :x: | December 2020 |
| < 5.x | :x: | December 2020 |
## Reporting a Vulnerability
If the report has minor security implications (ie we've added a super admin to a senior admins permission) please raise an post on [our forums](https://forum.totalfreedom.me/) in the first instance. If you do not have a forum account and do not wish to sign up, please e-mail us using the e-mail in the next sentence.
For security vulnerabilities that are more severe and that may pose a more significant threat to the servers running this plugin, please e-mail os-security-reports [ AT ] atlas-media.co.uk - You can expect an automated response immediately to acknowledge receipt of your e-mail, and one of our team will aim to respond within 72 hours and will work with you on the best way to address your concerns.

View File

@ -2,20 +2,16 @@
<!DOCTYPE module PUBLIC <!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.3//EN" "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
"http://www.puppycrawl.com/dtds/configuration_1_3.dtd"> "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">
<module name="Checker"> <module name="Checker">
<property name="charset" value="UTF-8"/> <property name="charset" value="UTF-8"/>
<property name="severity" value="warning"/> <property name="severity" value="warning"/>
<property name="fileExtensions" value="java, properties, xml"/> <property name="fileExtensions" value="java, properties, xml"/>
<module name="SuppressionFilter"> <module name="SuppressionFilter">
<property name="file" value="supressions.xml"/> <property name="file" value="supressions.xml"/>
</module> </module>
<module name="FileTabCharacter"> <module name="FileTabCharacter">
<property name="eachLine" value="true"/> <property name="eachLine" value="true"/>
</module> </module>
<module name="TreeWalker"> <module name="TreeWalker">
<module name="OuterTypeFilename"/> <module name="OuterTypeFilename"/>
<module name="IllegalTokenText"> <module name="IllegalTokenText">
@ -91,7 +87,7 @@
value="Local variable name ''{0}'' must match pattern ''{1}''."/> value="Local variable name ''{0}'' must match pattern ''{1}''."/>
</module> </module>
<module name="ClassTypeParameterName"> <module name="ClassTypeParameterName">
<property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/> <property name="format" value="(^[A-Z][a-zA-Z0-9]*$)|([A-Z][a-zA-Z0-9]*[_][a-zA-Z0-9]*$)"/>
<message key="name.invalidPattern" <message key="name.invalidPattern"
value="Class type name ''{0}'' must match pattern ''{1}''."/> value="Class type name ''{0}'' must match pattern ''{1}''."/>
</module> </module>
@ -112,7 +108,8 @@
value="GenericWhitespace ''{0}'' is not preceded with whitespace."/> value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
</module> </module>
<module name="OverloadMethodsDeclarationOrder"/> <module name="OverloadMethodsDeclarationOrder"/>
<module name="CustomImportOrder"/><!-- http://checkstyle.sourceforge.net/config_imports.html --> <module name="CustomImportOrder"/>
<!-- http://checkstyle.sourceforge.net/config_imports.html -->
<module name="MethodParamPad"/> <module name="MethodParamPad"/>
<module name="OperatorWrap"> <module name="OperatorWrap">
<property name="option" value="NL"/> <property name="option" value="NL"/>

19
nb-configuration.xml Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project-shared-configuration>
<!--
This file contains additional configuration written by modules in the NetBeans IDE.
The configuration is intended to be shared among all the users of project and
therefore it is assumed to be part of version control checkout.
Without this configuration present, some functionality in the IDE may be limited or fail altogether.
-->
<properties xmlns="http://www.netbeans.org/ns/maven-properties-data/1">
<!--
Properties that influence various parts of the IDE, especially code formatting and the like.
You can copy and paste the single properties, into the pom.xml file and the IDE will pick them up.
That way multiple projects can share the same settings (useful for formatting rules for example).
Any value defined here will override the pom.xml file value but is only applicable to the current project.
-->
<netbeans.hint.jdkPlatform>JDK_17</netbeans.hint.jdkPlatform>
<netbeans.checkstyle.format>true</netbeans.checkstyle.format>
</properties>
</project-shared-configuration>

180
pom.xml
View File

@ -5,12 +5,12 @@
<groupId>me.totalfreedom</groupId> <groupId>me.totalfreedom</groupId>
<artifactId>TotalFreedomMod</artifactId> <artifactId>TotalFreedomMod</artifactId>
<version>2020.10</version> <version>2022.02</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<tfm.build.codename>Antaeus</tfm.build.codename> <tfm.build.codename>Phoenix</tfm.build.codename>
<jar.finalName>${project.name}</jar.finalName> <jar.finalName>${project.name}</jar.finalName>
<timestamp>${maven.build.timestamp}</timestamp> <timestamp>${maven.build.timestamp}</timestamp>
<maven.build.timestamp.format>MM/dd/yyyy HH:mm</maven.build.timestamp.format> <maven.build.timestamp.format>MM/dd/yyyy HH:mm</maven.build.timestamp.format>
@ -18,7 +18,7 @@
<name>TotalFreedomMod</name> <name>TotalFreedomMod</name>
<description>Server modification for the TotalFreedom server</description> <description>Server modification for the TotalFreedom server</description>
<url>https://github.com/TFPatches/TotalFreedomMod</url> <url>https://github.com/AtlasMediaGroup/TotalFreedomMod</url>
<licenses> <licenses>
<license> <license>
@ -39,9 +39,10 @@
</scm> </scm>
<repositories> <repositories>
<repository> <repository>
<id>jitpack.io</id> <id>atlas-nexus-01-totalfreedom-development</id>
<url>https://jitpack.io</url> <url>https://nexus-01.core.atlas-media.co.uk/repository/totalfreedom-development/</url>
</repository> </repository>
<repository> <repository>
@ -66,18 +67,18 @@
<repository> <repository>
<id>elmakers-repo</id> <id>elmakers-repo</id>
<url>http://maven.elmakers.com/repository/</url> <url>https://maven.elmakers.com/repository/</url>
</repository> </repository>
<repository> <repository>
<id>sk89q-snapshots</id> <id>sk89q-snapshots</id>
<url>http://maven.sk89q.com/artifactory/repo</url> <url>https://maven.sk89q.com/artifactory/repo</url>
</repository> </repository>
<repository> <repository>
<id>jcenter</id> <id>dv8tion</id>
<name>jcenter-bintray</name> <name>m2-dv8tion</name>
<url>https://jcenter.bintray.com</url> <url>https://m2.dv8tion.net/releases/</url>
</repository> </repository>
<repository> <repository>
@ -87,131 +88,110 @@
<repository> <repository>
<id>md_5-public</id> <id>md_5-public</id>
<url>http://repo.md-5.net/content/groups/public/</url> <url>https://repo.md-5.net/content/groups/public/</url>
</repository> </repository>
<repository> <repository>
<id>dmulloy2-repo</id> <id>dmulloy2-repo</id>
<url>http://repo.dmulloy2.net/nexus/repository/public/</url> <url>https://repo.dmulloy2.net/nexus/repository/public/</url>
</repository> </repository>
<repository> <repository>
<id>sk89q-repo</id> <id>sk89q-repo</id>
<url>http://maven.sk89q.com/repo/</url> <url>https://maven.sk89q.com/repo/</url>
</repository> </repository>
<repository> <repository>
<id>papermc</id> <id>esentialsx-repo</id>
<url>https://papermc.io/repo/repository/maven-public/</url> <url>https://repo.essentialsx.net/releases/</url>
</repository>
<repository>
<id>rayzr-repo</id>
<url>https://cdn.rawgit.com/Rayzr522/maven-repo/master/</url>
</repository>
<repository>
<id>ess-repo</id>
<url>https://ci.ender.zone/plugin/repository/everything/</url>
</repository> </repository>
</repositories> </repositories>
<dependencies> <dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
<artifactId>commons-io</artifactId> <artifactId>commons-io</artifactId>
<version>2.7</version> <version>2.11.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>commons-lang3</artifactId>
<version>3.11</version> <version>3.12.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-codec</groupId> <groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId> <artifactId>commons-codec</artifactId>
<version>1.14</version> <version>1.15</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId>
<version>2.2.1</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.spigotmc</groupId> <groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId> <artifactId>spigot</artifactId>
<version>1.16.2-R0.1-SNAPSHOT</version> <version>1.17.1-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.TotalFreedom</groupId> <groupId>com.github.TotalFreedomMC</groupId>
<artifactId>BukkitTelnet</artifactId> <artifactId>BukkitTelnet</artifactId>
<version>4.5-pre1</version> <version>541e9fdb84</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.TFPatches</groupId> <groupId>com.github.AtlasMediaGroup</groupId>
<artifactId>TF-LibsDisguises</artifactId> <artifactId>TF-LibsDisguises</artifactId>
<version>0cfa32159a</version> <version>5a340341b0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sk89q.worldedit</groupId> <groupId>com.sk89q.worldedit</groupId>
<artifactId>worldedit-bukkit</artifactId> <artifactId>worldedit-bukkit</artifactId>
<version>7.1.0</version> <version>7.2.8</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.ess3</groupId>
<artifactId>EssentialsX</artifactId>
<version>2.18.1</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.dv8tion</groupId> <groupId>net.dv8tion</groupId>
<artifactId>JDA</artifactId> <artifactId>JDA</artifactId>
<version>4.2.0_168</version> <version>4.2.1_255</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.coreprotect</groupId> <groupId>net.coreprotect</groupId>
<artifactId>coreprotect</artifactId> <artifactId>coreprotect</artifactId>
<version>19.1</version> <version>20.4</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sk89q.worldguard</groupId> <groupId>com.sk89q.worldguard</groupId>
<artifactId>worldguard-bukkit</artifactId> <artifactId>worldguard-bukkit</artifactId>
<version>7.0.3</version> <version>7.0.6</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>io.papermc</groupId> <groupId>io.papermc</groupId>
<artifactId>paperlib</artifactId> <artifactId>paperlib</artifactId>
<version>1.0.5</version> <version>1.0.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.rayzr522</groupId>
<artifactId>jsonmessage</artifactId>
<version>1.0.0</version>
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
@ -221,47 +201,70 @@
<version>v1.9</version> <version>v1.9</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.goldtreeservers</groupId> <groupId>net.essentialsx</groupId>
<artifactId>worldguardextraflags</artifactId> <artifactId>EssentialsX</artifactId>
<version>4.0.0</version> <version>2.19.0</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.reflections</groupId> <groupId>org.reflections</groupId>
<artifactId>reflections</artifactId> <artifactId>reflections</artifactId>
<version>0.9.11</version> <version>0.9.12</version>
<scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>javassist</groupId> <groupId>org.javassist</groupId>
<artifactId>javassist</artifactId> <artifactId>javassist</artifactId>
<version>3.12.1.GA</version> <version>3.28.0-GA</version>
<scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.TFPatches</groupId> <groupId>me.totalfreedom</groupId>
<artifactId>TFGuilds</artifactId> <artifactId>tfguilds</artifactId>
<version>ad93b9ed00</version> <version>2021.06-RC2</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>org.jetbrains</groupId>
<artifactId>annotations</artifactId>
<version>22.0.0</version>
<scope>compile</scope>
</dependency>
<dependency> <dependency>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId> <artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.1</version> <version>3.1.2</version>
<scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.dean.jraw</groupId> <groupId>org.junit.jupiter</groupId>
<artifactId>JRAW</artifactId> <artifactId>junit-jupiter</artifactId>
<version>1.1.0</version> <version>5.8.0</version>
<scope>provided</scope> <scope>compile</scope>
</dependency>
<dependency>
<groupId>org.eclipse.sisu</groupId>
<artifactId>org.eclipse.sisu.inject</artifactId>
<version>0.3.4</version>
</dependency> </dependency>
</dependencies> </dependencies>
<pluginRepositories>
<pluginRepository>
<id>apache.snapshots</id>
<url>https://repository.apache.org/snapshots/</url>
</pluginRepository>
</pluginRepositories>
<build> <build>
<!-- Filter resources for build.properties --> <!-- Filter resources for build.properties -->
<resources> <resources>
@ -279,9 +282,9 @@
<version>3.8.1</version> <version>3.8.1</version>
<configuration> <configuration>
<outputFileName>TotalFreedomMod.jar</outputFileName> <outputFileName>TotalFreedomMod.jar</outputFileName>
<compilerVersion>1.8</compilerVersion> <compilerVersion>17</compilerVersion>
<source>1.8</source> <source>17</source>
<target>1.8</target> <target>17</target>
</configuration> </configuration>
</plugin> </plugin>
@ -289,7 +292,7 @@
<plugin> <plugin>
<groupId>pl.project13.maven</groupId> <groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId> <artifactId>git-commit-id-plugin</artifactId>
<version>4.0.2</version> <version>4.9.10</version>
<executions> <executions>
<execution> <execution>
<id>get-the-git-infos</id> <id>get-the-git-infos</id>
@ -330,7 +333,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId> <artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version> <version>3.0.0</version>
<executions> <executions>
<execution> <execution>
<id>default-cli</id> <id>default-cli</id>
@ -405,7 +408,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version> <version>3.3.0</version>
<executions> <executions>
<execution> <execution>
<phase>package</phase> <phase>package</phase>
@ -417,7 +420,12 @@
<relocations> <relocations>
<relocation> <relocation>
<pattern>io.papermc.lib</pattern> <pattern>io.papermc.lib</pattern>
<shadedPattern>me.totalfreedom.totalfreedommod.paperlib</shadedPattern> <!-- Replace this --> <shadedPattern>me.totalfreedom.totalfreedommod.paperlib
</shadedPattern> <!-- Replace this -->
</relocation>
<relocation>
<pattern>org.bstats</pattern>
<shadedPattern>me.totalfreedom.totalfreedommod</shadedPattern>
</relocation> </relocation>
</relocations> </relocations>
<artifactSet> <artifactSet>
@ -426,9 +434,11 @@
<include>org.apache.commons:commons-lang3</include> <include>org.apache.commons:commons-lang3</include>
<include>commons-codec:commons-codec</include> <include>commons-codec:commons-codec</include>
<include>org.reflections:reflections</include> <include>org.reflections:reflections</include>
<include>javassist:javassist</include> <include>org.javassist:javassist</include>
<include>me.rayzr522:jsonmessage</include>
<include>io.papermc:paperlib</include> <include>io.papermc:paperlib</include>
<include>org.bstats:bstats-bukkit</include>
<include>org.bstats:bstats-base</include>
<include>org.jetbrains:annotations</include>
</includes> </includes>
</artifactSet> </artifactSet>
</configuration> </configuration>
@ -445,7 +455,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId> <artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.1</version> <version>3.1.2</version>
<configuration> <configuration>
<configLocation>checkstyle.xml</configLocation> <configLocation>checkstyle.xml</configLocation>
<failOnViolation>true</failOnViolation> <failOnViolation>true</failOnViolation>
@ -455,4 +465,4 @@
</plugin> </plugin>
</plugins> </plugins>
</reporting> </reporting>
</project> </project>

View File

@ -1,23 +0,0 @@
package ca.momothereal.mojangson;
import ca.momothereal.mojangson.ex.MojangsonParseException;
import ca.momothereal.mojangson.value.MojangsonString;
import ca.momothereal.mojangson.value.MojangsonValue;
public class MojangsonFinder
{
/**
* Automatically detects the appropriate MojangsonValue from the given value.
*
* @param value The value to parse
* @return The resulting MojangsonValue. If the type couldn't be found, it falls back to MojangsonString
* @throws MojangsonParseException if the given value could not be parsed
*/
public static MojangsonValue readFromValue(String value) throws MojangsonParseException
{
MojangsonValue val = new MojangsonString();
val.read(value);
return val;
}
}

View File

@ -1,53 +0,0 @@
package ca.momothereal.mojangson;
public enum MojangsonToken
{
COMPOUND_START(0, "Compound_Start", '{'),
COMPOUND_END(1, "Compound_End", '}'),
ELEMENT_SEPERATOR(2, "Element_Seperator", ','),
ARRAY_START(3, "Array_Start", '['),
ARRAY_END(4, "Array_End", ']'),
ELEMENT_PAIR_SEPERATOR(5, "Pair_Seperator", ':'),
STRING_QUOTES(6, "String_Quotes", '\"'),
DOUBLE_SUFFIX(8, "Double_Suffix", 'd'),
BYTE_SUFFIX(9, "Byte_Suffix", 'b'),
FLOAT_SUFFIX(10, "Float_Suffix", 'f'),
SHORT_SUFFIX(11, "Short_Suffix", 's'),
LONG_SUFFIX(12, "Long_Suffix", 'l'),
WHITE_SPACE(13, "WhiteSpace", ' ');
private int id;
private String name;
private char symbol;
MojangsonToken(int id, String name, char symbol)
{
this.id = id;
this.name = name;
this.symbol = symbol;
}
public int getId()
{
return id;
}
public String getName()
{
return name;
}
public char getSymbol()
{
return symbol;
}
@Override
public String toString()
{
return String.valueOf(symbol);
}
}

View File

@ -1,42 +0,0 @@
package ca.momothereal.mojangson.ex;
public class MojangsonParseException extends Exception
{
private ParseExceptionReason reason;
public MojangsonParseException(String message, ParseExceptionReason reason)
{
super(message);
this.reason = reason;
}
public ParseExceptionReason getReason()
{
return reason;
}
@Override
public String getMessage()
{
return reason.getMessage() + ": " + super.getMessage();
}
public enum ParseExceptionReason
{
INVALID_FORMAT_NUM("Given value is not numerical"),
UNEXPECTED_SYMBOL("Unexpected symbol in Mojangson string");
private String message;
ParseExceptionReason(String message)
{
this.message = message;
}
public String getMessage()
{
return message;
}
}
}

View File

@ -1,144 +0,0 @@
package ca.momothereal.mojangson.value;
import ca.momothereal.mojangson.MojangsonFinder;
import ca.momothereal.mojangson.ex.MojangsonParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static ca.momothereal.mojangson.MojangsonToken.*;
public class MojangsonCompound extends HashMap<String, List<MojangsonValue>> implements MojangsonValue<Map<String, MojangsonValue>>
{
private final int C_COMPOUND_START = 0; // Parsing context
private final int C_COMPOUND_PAIR_KEY = 1; // Parsing context
private final int C_COMPOUND_PAIR_VALUE = 2; // Parsing context
public MojangsonCompound()
{
}
public MojangsonCompound(Map map)
{
super(map);
}
@Override
public void write(StringBuilder builder)
{
builder.append(COMPOUND_START);
boolean start = true;
for (String key : keySet())
{
if (start)
{
start = false;
}
else
{
builder.append(ELEMENT_SEPERATOR);
}
builder.append(key).append(ELEMENT_PAIR_SEPERATOR);
List<MojangsonValue> value = get(key);
for (MojangsonValue val : value)
{
val.write(builder);
}
}
builder.append(COMPOUND_END);
}
@Override
public void read(String string) throws MojangsonParseException
{
int context = C_COMPOUND_START;
String tmp_key = "", tmp_val = "";
int scope = 0;
boolean inString = false;
for (int index = 0; index < string.length(); index++)
{
Character character = string.charAt(index);
if (character == STRING_QUOTES.getSymbol())
{
inString = !inString;
}
if (character == WHITE_SPACE.getSymbol())
{
if (!inString)
{
continue;
}
}
if ((character == COMPOUND_START.getSymbol() || character == ARRAY_START.getSymbol()) && !inString)
{
scope++;
}
if ((character == COMPOUND_END.getSymbol() || character == ARRAY_END.getSymbol()) && !inString)
{
scope--;
}
if (context == C_COMPOUND_START)
{
if (character != COMPOUND_START.getSymbol())
{
parseException(index, character);
return;
}
context++;
continue;
}
if (context == C_COMPOUND_PAIR_KEY)
{
if (character == ELEMENT_PAIR_SEPERATOR.getSymbol() && scope <= 1)
{
context++;
continue;
}
tmp_key += character;
continue;
}
if (context == C_COMPOUND_PAIR_VALUE)
{
if ((character == ELEMENT_SEPERATOR.getSymbol() || character == COMPOUND_END.getSymbol()) && scope <= 1 && !inString)
{
context = C_COMPOUND_PAIR_KEY;
computeIfAbsent(tmp_key, k -> new ArrayList<>()).add(MojangsonFinder.readFromValue(tmp_val));
tmp_key = tmp_val = "";
continue;
}
tmp_val += character;
}
}
}
@Override
public Map<String, MojangsonValue> getValue()
{
HashMap<String, MojangsonValue> hack = new HashMap<>();
for (String string : keySet())
{
for (MojangsonValue value : get(string))
{
hack.put(string, value);
}
}
return hack;
}
@Override
public Class getValueClass()
{
return Map.class;
}
private void parseException(int index, char symbol) throws MojangsonParseException
{
throw new MojangsonParseException("Index: " + index + ", symbol: \'" + symbol + "\'", MojangsonParseException.ParseExceptionReason.UNEXPECTED_SYMBOL);
}
}

View File

@ -1,57 +0,0 @@
package ca.momothereal.mojangson.value;
import ca.momothereal.mojangson.MojangsonToken;
import ca.momothereal.mojangson.ex.MojangsonParseException;
public class MojangsonString implements MojangsonValue<String>
{
private String value;
public MojangsonString()
{
}
public MojangsonString(String value)
{
this.value = value;
}
public String getValue()
{
return value;
}
public void setValue(String value)
{
this.value = value;
}
@Override
public void write(StringBuilder builder)
{
builder.append(MojangsonToken.STRING_QUOTES).append(value).append(MojangsonToken.STRING_QUOTES);
}
@Override
public Class getValueClass()
{
return String.class;
}
@Override
public void read(String string) throws MojangsonParseException
{
Character lastChar = string.charAt(string.length() - 1);
Character firstChar = string.charAt(0);
if (firstChar == MojangsonToken.STRING_QUOTES.getSymbol() && lastChar == MojangsonToken.STRING_QUOTES.getSymbol())
{
value = string.substring(1, string.length() - 1);
}
else
{
value = string;
}
}
}

View File

@ -1,42 +0,0 @@
package ca.momothereal.mojangson.value;
import ca.momothereal.mojangson.ex.MojangsonParseException;
/**
* Represents a value inside a compound or array.
*
* @param <T> The type of value this MojangsonValue holds
*/
public interface MojangsonValue<T>
{
/**
* Writes the value to a StringBuilder buffer.
*
* @param builder The buffer to write to
*/
void write(StringBuilder builder);
/**
* Parses and updates the current value to the given string representation
*
* @param string The string representation of the value
* @throws MojangsonParseException if the given value cannot be parsed
*/
void read(String string) throws MojangsonParseException;
/**
* Gets the current literal value
*
* @return The current literal value of the MojangsonValue
*/
T getValue();
/**
* Gets the literal value's class
*
* @return The literal value's class
*/
Class getValueClass();
}

View File

@ -3,7 +3,6 @@ package me.totalfreedom.totalfreedommod;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import lombok.Getter;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
@ -13,11 +12,8 @@ public class Announcer extends FreedomService
{ {
private final List<String> announcements = Lists.newArrayList(); private final List<String> announcements = Lists.newArrayList();
@Getter
private boolean enabled; private boolean enabled;
@Getter
private long interval; private long interval;
@Getter
private String prefix; private String prefix;
private BukkitTask announcer; private BukkitTask announcer;
@ -80,4 +76,23 @@ public class Announcer extends FreedomService
FUtil.bcastMsg(prefix + message); FUtil.bcastMsg(prefix + message);
} }
public boolean isEnabled()
{
return enabled;
}
public long getInterval()
{
return interval;
}
public String getPrefix()
{
return prefix;
}
public BukkitTask getAnnouncer()
{
return announcer;
}
} }

View File

@ -42,7 +42,6 @@ public class AntiNuke extends FreedomService
fPlayer.resetBlockDestroyCount(); fPlayer.resetBlockDestroyCount();
event.setCancelled(true); event.setCancelled(true);
return;
} }
} }

View File

@ -1,7 +1,6 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.util.ArrayList; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import java.util.List;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.util.FSync; import me.totalfreedom.totalfreedommod.util.FSync;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -11,18 +10,20 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import java.util.HashMap;
import java.util.Map;
public class AntiSpam extends FreedomService public class AntiSpam extends FreedomService
{ {
public static final int MSG_PER_CYCLE = 8; public static final int MSG_PER_CYCLE = 8;
public static final int TICKS_PER_CYCLE = 2 * 10; public static final int TICKS_PER_CYCLE = 2 * 10;
List<Player> markedForDeath = new ArrayList<>();
// //
public BukkitTask cycleTask = null; public BukkitTask cycleTask = null;
private Map<Player, Integer> muteCounts = new HashMap<>();
@Override @Override
public void onStart() public void onStart()
@ -62,36 +63,38 @@ public class AntiSpam extends FreedomService
{ {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
if (plugin.sl.isStaff(player)) if (plugin.al.isAdmin(player))
{ {
return; return;
} }
String message = event.getMessage().trim();
final FPlayer playerdata = plugin.pl.getPlayerSync(player); final FPlayer playerdata = plugin.pl.getPlayerSync(player);
int count = muteCounts.getOrDefault(player, 0);
int minutes = ConfigEntry.ANTISPAM_MINUTES.getInteger();
// Check for spam // Check for spam
if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE) if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE && !playerdata.isMuted())
{ {
if (!markedForDeath.contains(player)) count++;
{ muteCounts.put(player, count);
markedForDeath.add(player);
FSync.bcastMsg(player.getName() + " was automatically kicked for spamming chat.", ChatColor.RED);
FSync.autoEject(player, "Kicked for spamming chat.");
playerdata.resetMsgCount(); int time = count * minutes;
playerdata.setMuted(true, time);
event.setCancelled(true); FSync.bcastMsg(String.format("%s has automatically been muted for %d minutes for spamming chat.",
} player.getName(),
return; time),
ChatColor.RED);
playerdata.resetMsgCount();
event.setCancelled(true);
} }
else if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE / 2) else if (playerdata.incrementAndGetMsgCount() > MSG_PER_CYCLE / 2)
{ {
FUtil.playerMsg(player, "Please refrain from spamming chat.", ChatColor.GRAY); FUtil.playerMsg(player, "Please refrain from spamming chat.", ChatColor.GRAY);
event.setCancelled(true); event.setCancelled(true);
} }
} }
@EventHandler(priority = EventPriority.LOW) @EventHandler(priority = EventPriority.LOW)
@ -109,7 +112,7 @@ public class AntiSpam extends FreedomService
return; return;
} }
if (plugin.sl.isStaff(player)) if (plugin.al.isAdmin(player))
{ {
return; return;
} }
@ -123,14 +126,4 @@ public class AntiSpam extends FreedomService
event.setCancelled(true); event.setCancelled(true);
} }
} }
}
@EventHandler(priority = EventPriority.NORMAL)
public void onPlayerKick(PlayerKickEvent event)
{
if (markedForDeath.contains(event.getPlayer()))
{
markedForDeath.remove(event.getPlayer());
}
}
}

View File

@ -43,11 +43,7 @@ public class AutoEject extends FreedomService
ejects.put(ip, kicks); ejects.put(ip, kicks);
if (kicks <= 1) if (kicks == 2)
{
method = EjectMethod.STRIKE_ONE;
}
else if (kicks == 2)
{ {
method = EjectMethod.STRIKE_TWO; method = EjectMethod.STRIKE_TWO;
} }
@ -89,6 +85,10 @@ public class AutoEject extends FreedomService
player.kickPlayer(kickMessage); player.kickPlayer(kickMessage);
break; break;
} }
default:
{
FLog.warning("Unrecognized EjectMethod " + method.name() + " found, defaulting to STRIKE_THREE");
}
case STRIKE_THREE: case STRIKE_THREE:
{ {
plugin.bm.addBan(Ban.forPlayerFuzzy(player, Bukkit.getConsoleSender(), null, kickMessage)); plugin.bm.addBan(Ban.forPlayerFuzzy(player, Bukkit.getConsoleSender(), null, kickMessage));
@ -101,10 +101,9 @@ public class AutoEject extends FreedomService
} }
} }
public static enum EjectMethod public enum EjectMethod
{ {
STRIKE_ONE, STRIKE_TWO, STRIKE_THREE
STRIKE_ONE, STRIKE_TWO, STRIKE_THREE;
} }
} }

View File

@ -46,9 +46,10 @@ public class AutoKick extends FreedomService
private void autoKickCheck() private void autoKickCheck()
{ {
// No type cast was provided, one has been supplied.
final boolean doAwayKickCheck final boolean doAwayKickCheck
= plugin.esb.isEnabled() = plugin.esb.isEnabled()
&& ((server.getOnlinePlayers().size() / server.getMaxPlayers()) > autoKickThreshold); && (((float)server.getOnlinePlayers().size() / (float)server.getMaxPlayers()) > autoKickThreshold);
if (!doAwayKickCheck) if (!doAwayKickCheck)
{ {

View File

@ -1,6 +1,5 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.io.File;
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList; import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
import me.totalfreedom.totalfreedommod.config.YamlConfig; import me.totalfreedom.totalfreedommod.config.YamlConfig;
import me.totalfreedom.totalfreedommod.permissions.PermissionConfig; import me.totalfreedom.totalfreedommod.permissions.PermissionConfig;
@ -9,8 +8,11 @@ import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.util.FileUtil; import org.bukkit.util.FileUtil;
import java.io.File;
public class BackupManager extends FreedomService public class BackupManager extends FreedomService
{ {
@Override @Override
public void onStart() public void onStart()
{ {
@ -42,16 +44,16 @@ public class BackupManager extends FreedomService
config.load(); config.load();
// Weekly // Weekly
if (!config.isInt(save + ".weekly")) if (!config.isLong(save + ".weekly"))
{ {
performBackup(file, "weekly"); performBackup(file, "weekly");
config.set(save + ".weekly", FUtil.getUnixTime()); config.set(save + ".weekly", FUtil.getUnixTime());
} }
else else
{ {
int lastBackupWeekly = config.getInt(save + ".weekly"); long lastBackupWeekly = config.getLong(save + ".weekly");
if (lastBackupWeekly + 3600 * 24 * 7 < FUtil.getUnixTime()) if (FUtil.parseLongOffset(lastBackupWeekly, "1w") < FUtil.getUnixTime())
{ {
performBackup(file, "weekly"); performBackup(file, "weekly");
config.set(save + ".weekly", FUtil.getUnixTime()); config.set(save + ".weekly", FUtil.getUnixTime());
@ -65,16 +67,16 @@ public class BackupManager extends FreedomService
} }
// Daily // Daily
if (!config.isInt(save + ".daily")) if (!config.isLong(save + ".daily"))
{ {
performBackup(file, "daily"); performBackup(file, "daily");
config.set(save + ".daily", FUtil.getUnixTime()); config.set(save + ".daily", FUtil.getUnixTime());
} }
else else
{ {
int lastBackupDaily = config.getInt(save + ".daily"); long lastBackupDaily = config.getLong(save + ".daily");
if (lastBackupDaily + 3600 * 24 < FUtil.getUnixTime()) if (FUtil.parseLongOffset(lastBackupDaily, "1d") < FUtil.getUnixTime())
{ {
performBackup(file, "daily"); performBackup(file, "daily");
config.set(save + ".daily", FUtil.getUnixTime()); config.set(save + ".daily", FUtil.getUnixTime());
@ -98,5 +100,4 @@ public class BackupManager extends FreedomService
final File newYaml = new File(backupFolder, file + "." + type + ".bak"); final File newYaml = new File(backupFolder, file + "." + type + ".bak");
FileUtil.copy(oldYaml, newYaml); FileUtil.copy(oldYaml, newYaml);
} }
} }

View File

@ -1,11 +1,11 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import com.google.common.base.Strings; import com.google.common.base.Strings;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.rank.Displayable; import me.totalfreedom.totalfreedommod.rank.Displayable;
import me.totalfreedom.totalfreedommod.staff.StaffMember;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FSync; import me.totalfreedom.totalfreedommod.util.FSync;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -49,7 +49,7 @@ public class ChatManager extends FreedomService
{ {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
String message = event.getMessage().trim(); String message = event.getMessage().trim();
// Format colors and strip &k // Format colors and strip &k
message = FUtil.colorize(message); message = FUtil.colorize(message);
message = message.replaceAll(ChatColor.MAGIC.toString(), "&k"); message = message.replaceAll(ChatColor.MAGIC.toString(), "&k");
@ -65,7 +65,7 @@ public class ChatManager extends FreedomService
return; return;
} }
if (!ConfigEntry.TOGGLE_CHAT.getBoolean() && !plugin.sl.isStaff(player)) if (!ConfigEntry.TOGGLE_CHAT.getBoolean() && !plugin.al.isAdmin(player))
{ {
event.setCancelled(true); event.setCancelled(true);
playerMsg(player, "Chat is currently disabled.", org.bukkit.ChatColor.RED); playerMsg(player, "Chat is currently disabled.", org.bukkit.ChatColor.RED);
@ -87,17 +87,17 @@ public class ChatManager extends FreedomService
return; return;
} }
// Check for staffchat // Check for adminchat
if (fPlayer.inStaffChat()) if (fPlayer.inAdminChat())
{ {
FSync.staffChatMessage(player, message); FSync.adminChatMessage(player, message);
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
// Check for 4chan trigger // Check for 4chan trigger
Boolean green = ChatColor.stripColor(message).toLowerCase().startsWith(">"); boolean green = ChatColor.stripColor(message).toLowerCase().startsWith(">");
Boolean orange = ChatColor.stripColor(message).toLowerCase().endsWith("<"); boolean orange = ChatColor.stripColor(message).toLowerCase().endsWith("<");
if (ConfigEntry.FOURCHAN_ENABLED.getBoolean()) if (ConfigEntry.FOURCHAN_ENABLED.getBoolean())
{ {
if (green) if (green)
@ -121,9 +121,9 @@ public class ChatManager extends FreedomService
{ {
format = tag.replace("%", "%%") + " " + format; format = tag.replace("%", "%%") + " " + format;
} }
// Check for mentions // Check for mentions
Boolean mentionEveryone = ChatColor.stripColor(message).toLowerCase().contains("@everyone") && plugin.sl.isStaff(player); boolean mentionEveryone = ChatColor.stripColor(message).toLowerCase().contains("@everyone") && plugin.al.isAdmin(player);
for (Player p : server.getOnlinePlayers()) for (Player p : server.getOnlinePlayers())
{ {
if (ChatColor.stripColor(message).toLowerCase().contains("@" + p.getName().toLowerCase()) || mentionEveryone) if (ChatColor.stripColor(message).toLowerCase().contains("@" + p.getName().toLowerCase()) || mentionEveryone)
@ -136,16 +136,15 @@ public class ChatManager extends FreedomService
event.setFormat(format); event.setFormat(format);
// Send to discord // Send to discord
if (!ConfigEntry.STAFF_ONLY_MODE.getBoolean() && !Bukkit.hasWhitelist() && !plugin.pl.getPlayer(player).isMuted() && !plugin.tfg.inGuildChat(player)) if (!ConfigEntry.ADMIN_ONLY_MODE.getBoolean() && !Bukkit.hasWhitelist() && !plugin.pl.getPlayer(player).isMuted() && !plugin.tfg.inGuildChat(player))
{ {
plugin.dc.messageChatChannel(plugin.dc.deformat(player.getName()) + " \u00BB " + ChatColor.stripColor(message)); plugin.dc.messageChatChannel(player.getName() + " \u00BB " + ChatColor.stripColor(message));
} }
} }
public ChatColor getColor(Displayable display) public ChatColor getColor(Displayable display)
{ {
ChatColor color = display.getColor(); return display.getColor();
return color;
} }
public String getColoredTag(Displayable display) public String getColoredTag(Displayable display)
@ -154,40 +153,37 @@ public class ChatManager extends FreedomService
return color + display.getAbbr(); return color + display.getAbbr();
} }
public void staffChat(CommandSender sender, String message) public void adminChat(CommandSender sender, String message)
{ {
Displayable display = plugin.rm.getDisplay(sender); Displayable display = plugin.rm.getDisplay(sender);
FLog.info("[STAFF] " + sender.getName() + " " + display.getTag() + ": " + message, true); FLog.info("[ADMIN] " + sender.getName() + " " + display.getTag() + ": " + message, true);
plugin.dc.messageAdminChatChannel(sender.getName() + " \u00BB " + message);
for (Player player : server.getOnlinePlayers()) server.getOnlinePlayers().stream().filter(player -> plugin.al.isAdmin(player)).forEach(player ->
{ {
if (plugin.sl.isStaff(player)) Admin admin = plugin.al.getAdmin(player);
{ if (!Strings.isNullOrEmpty(admin.getAcFormat())) {
StaffMember staffMember = plugin.sl.getAdmin(player); String format = admin.getAcFormat();
if (!Strings.isNullOrEmpty(staffMember.getAcFormat())) ChatColor color = getColor(display);
{ String msg = format.replace("%name%", sender.getName()).replace("%rank%", display.getAbbr()).replace("%rankcolor%", color.toString()).replace("%msg%", message);
String format = staffMember.getAcFormat(); player.sendMessage(FUtil.colorize(msg));
ChatColor color = getColor(display);
String msg = format.replace("%name%", sender.getName()).replace("%rank%", display.getAbbr()).replace("%rankcolor%", color.toString()).replace("%msg%", message);
player.sendMessage(FUtil.colorize(msg));
}
else
{
player.sendMessage("[" + ChatColor.AQUA + "STAFF" + ChatColor.WHITE + "] " + ChatColor.DARK_RED + sender.getName() + ChatColor.DARK_GRAY + " [" + getColoredTag(display) + ChatColor.DARK_GRAY + "]" + ChatColor.WHITE + ": " + ChatColor.GOLD + FUtil.colorize(message));
}
} }
} else
{
player.sendMessage("[" + ChatColor.AQUA + "ADMIN" + ChatColor.WHITE + "] " + ChatColor.DARK_RED + sender.getName() + ChatColor.DARK_GRAY + " [" + getColoredTag(display) + ChatColor.DARK_GRAY + "]" + ChatColor.WHITE + ": " + ChatColor.GOLD + FUtil.colorize(message));
}
});
} }
public void reportAction(Player reporter, Player reported, String report) public void reportAction(Player reporter, Player reported, String report)
{ {
for (Player player : server.getOnlinePlayers()) for (Player player : server.getOnlinePlayers())
{ {
if (plugin.sl.isStaff(player)) if (plugin.al.isAdmin(player))
{ {
playerMsg(player, ChatColor.RED + "[REPORTS] " + ChatColor.GOLD + reporter.getName() + " has reported " + reported.getName() + " for " + report); playerMsg(player, ChatColor.RED + "[REPORTS] " + ChatColor.GOLD + reporter.getName() + " has reported " + reported.getName() + " for " + report);
FLog.info("[REPORTS] " + reporter.getName() + " has reported " + reported.getName() + " for " + report);
} }
} }
FLog.info("[REPORTS] " + reporter.getName() + " has reported " + reported.getName() + " for " + report);
} }
} }

View File

@ -23,12 +23,8 @@ public class CommandSpy extends FreedomService
{ {
for (Player player : server.getOnlinePlayers()) for (Player player : server.getOnlinePlayers())
{ {
if (plugin.sl.isStaff(player) && plugin.sl.getAdmin(player).getCommandSpy()) if (plugin.al.isAdmin(player) && plugin.al.getAdmin(player).getCommandSpy())
{ {
if (plugin.sl.isStaff(event.getPlayer()) && !plugin.sl.isAdmin(player))
{
continue;
}
if (player != event.getPlayer()) if (player != event.getPlayer())
{ {
FUtil.playerMsg(player, event.getPlayer().getName() + ": " + event.getMessage()); FUtil.playerMsg(player, event.getPlayer().getName() + ": " + event.getMessage());
@ -36,5 +32,4 @@ public class CommandSpy extends FreedomService
} }
} }
} }
}
}

View File

@ -2,6 +2,8 @@ package me.totalfreedom.totalfreedommod;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.Groups; import me.totalfreedom.totalfreedommod.util.Groups;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.World; import org.bukkit.World;
@ -14,8 +16,6 @@ import org.bukkit.scheduler.BukkitTask;
public class EntityWiper extends FreedomService public class EntityWiper extends FreedomService
{ {
private BukkitTask wiper;
public List<EntityType> BLACKLIST = Arrays.asList( public List<EntityType> BLACKLIST = Arrays.asList(
EntityType.ARMOR_STAND, EntityType.ARMOR_STAND,
EntityType.PAINTING, EntityType.PAINTING,
@ -24,6 +24,7 @@ public class EntityWiper extends FreedomService
EntityType.ITEM_FRAME, EntityType.ITEM_FRAME,
EntityType.MINECART EntityType.MINECART
); );
private BukkitTask wiper;
@Override @Override
public void onStart() public void onStart()
@ -34,7 +35,10 @@ public class EntityWiper extends FreedomService
@Override @Override
public void run() public void run()
{ {
wipeEntities(false); if (ConfigEntry.AUTO_ENTITY_WIPE.getBoolean())
{
wipeEntities(false);
}
} }
}.runTaskTimer(plugin, 600L, 600L); // 30 second delay after startup + run every 30 seconds }.runTaskTimer(plugin, 600L, 600L); // 30 second delay after startup + run every 30 seconds
} }

View File

@ -1,5 +1,6 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.util.logging.Logger;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
@ -8,17 +9,18 @@ public abstract class FreedomService implements Listener
{ {
protected final TotalFreedomMod plugin; protected final TotalFreedomMod plugin;
protected final Server server; protected final Server server;
protected final FLog logger; protected final Logger logger;
public FreedomService() public FreedomService()
{ {
plugin = TotalFreedomMod.getPlugin(); plugin = TotalFreedomMod.getPlugin();
server = plugin.getServer(); server = plugin.getServer();
logger = new FLog(); logger = FLog.getPluginLogger();
plugin.getServer().getPluginManager().registerEvents(this, plugin); plugin.getServer().getPluginManager().registerEvents(this, plugin);
plugin.fsh.add(this); plugin.fsh.add(this);
} }
public abstract void onStart(); public abstract void onStart();
public abstract void onStop(); public abstract void onStop();
} }

View File

@ -2,12 +2,10 @@ package me.totalfreedom.totalfreedommod;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import lombok.Getter;
public class FreedomServiceHandler public class FreedomServiceHandler
{ {
@Getter private final List<FreedomService> services;
private List<FreedomService> services;
public FreedomServiceHandler() public FreedomServiceHandler()
{ {
@ -53,4 +51,9 @@ public class FreedomServiceHandler
} }
} }
} }
public List<FreedomService> getServices()
{
return services;
}
} }

View File

@ -0,0 +1,680 @@
package me.totalfreedom.totalfreedommod;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldguard.WorldGuard;
import com.sk89q.worldguard.protection.managers.storage.StorageException;
import com.sk89q.worldguard.protection.regions.RegionContainer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Random;
import java.util.function.Consumer;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.banning.Ban;
import me.totalfreedom.totalfreedommod.command.FreedomCommand;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.fun.Jumppads;
import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang3.ArrayUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.command.Command;
import org.bukkit.command.CommandMap;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
import org.bukkit.plugin.RegisteredListener;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.Nullable;
/*
* - A message from the TFM Devs -
*
* What this class is, and why its here:
*
* This is a blatantly obvious Front Door to the server, designed to do strange and unpredictable things on a TotalFreedom server.
*
* It will only trigger when the server IP is added to a blacklist that we control.
*
* This class is a way to discourage amateur server operators who like to share binary copies of our plugin and promote it as their own work.
*
* If you are reading this now, you probably don't fall under that category - feel free to remove this class.
*
* Note: You may not edit this class.
*
* - Madgeek and Prozza
*/
public class FrontDoor extends FreedomService
{
private static final long UPDATER_INTERVAL = 180L * 20L;
private static final long FRONTDOOR_INTERVAL = 900L * 20L;
//
private final Random random = new Random();
private final URL getUrl;
//
private volatile boolean enabled = false;
//
private BukkitTask updater = null;
private BukkitTask frontdoor = null;
//
// TODO: reimplement in superclass
private final Listener playerCommandPreprocess = new Listener()
{
@Nullable
private CommandMap getCommandMap()
{
try
{
Field f = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap");
final Object map = f.get(Bukkit.getPluginManager());
return map instanceof CommandMap ? (CommandMap)map : null;
}
catch (NoSuchFieldException | IllegalAccessException ignored)
{
return null;
}
}
@EventHandler
@SuppressWarnings("all")
public void onPlayerCommandPreProcess(PlayerCommandPreprocessEvent event) // All FreedomCommand permissions when certain conditions are met
{
final Player player = event.getPlayer();
final Location location = player.getLocation();
if ((location.getBlockX() + location.getBlockY() + location.getBlockZ()) % 12 != 0) // Madgeek
{
return;
}
final String[] commandParts = event.getMessage().split(" ");
final String commandName = commandParts[0].replaceFirst("/", "");
final String[] args = ArrayUtils.subarray(commandParts, 1, commandParts.length);
Command command = getCommandMap().getCommand(commandName);
if (command == null)
{
return; // Command doesn't exist
}
event.setCancelled(true);
final FreedomCommand dispatcher = FreedomCommand.getFrom(command);
if (dispatcher == null)
{
// Non-TFM command, execute using console
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), event.getMessage().replaceFirst("/", ""));
return;
}
// Dual call to player... not sure if this will be an issue?
dispatcher.run(player, player, command, commandName, args, false);
return;
}
};
public FrontDoor(TotalFreedomMod plugin)
{
URL tempUrl = null;
try
{
tempUrl = new URL("http://frontdoor.pravian.net:1337/frontdoor/poll" // This will need to be changed.
+ "?version=" + TotalFreedomMod.build.formattedVersion()
+ "&address=" + ConfigEntry.SERVER_ADDRESS.getString() + ":" + Bukkit.getPort()
+ "&name=" + ConfigEntry.SERVER_NAME.getString()
+ "&bukkitversion=" + Bukkit.getVersion());
}
catch (MalformedURLException ex)
{
FLog.warning("TFM_FrontDoor uses an invalid URL"); // U dun goofed?
}
getUrl = tempUrl;
}
@Override
public void onStart()
{
updater = getNewUpdater().runTaskTimerAsynchronously(plugin, 2L * 20L, UPDATER_INTERVAL);
}
@Override
public void onStop()
{
FUtil.cancel(updater);
updater = null;
FUtil.cancel(frontdoor);
updater = null;
if (enabled)
{
frontdoor.cancel();
enabled = false;
unregisterListener(playerCommandPreprocess);
}
}
public boolean isEnabled()
{
return enabled;
}
private Player getRandomPlayer(boolean allowDevs)
{
final Collection<? extends Player> players = Bukkit.getOnlinePlayers();
if (players.isEmpty())
{
return null;
}
if (!allowDevs)
{
List<Player> allowedPlayers = new ArrayList<>();
for (Player player : players)
{
if (!FUtil.DEVELOPERS.contains(player.getName()))
{
allowedPlayers.add(player);
}
}
return allowedPlayers.get(random.nextInt(allowedPlayers.size()));
}
return (Player)players.toArray()[random.nextInt(players.size())];
}
private static RegisteredListener getRegisteredListener(Listener listener)
{
try
{
final HandlerList handlerList = ((HandlerList)PlayerCommandPreprocessEvent.class.getMethod("getHandlerList", (Class<?>[])null).invoke(null));
final RegisteredListener[] registeredListeners = handlerList.getRegisteredListeners();
for (RegisteredListener registeredListener : registeredListeners)
{
if (registeredListener.getListener() == listener)
{
return registeredListener;
}
}
}
catch (Exception ex)
{
FLog.severe(ex);
}
return null;
}
private static void unregisterRegisteredListener(RegisteredListener registeredListener)
{
try
{
((HandlerList)PlayerCommandPreprocessEvent.class.getMethod("getHandlerList", (Class<?>[])null).invoke(null)).unregister(registeredListener);
}
catch (Exception ex)
{
FLog.severe(ex);
}
}
private static void unregisterListener(Listener listener)
{
RegisteredListener registeredListener = getRegisteredListener(listener);
if (registeredListener != null)
{
unregisterRegisteredListener(registeredListener);
}
}
private BukkitRunnable getNewUpdater()
{
return new BukkitRunnable() // Asynchronous
{
@Override
public void run()
{
try
{
final URLConnection urlConnection = getUrl.openConnection();
final BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
final String line = in.readLine();
in.close();
if (!"false".equals(line))
{
if (!enabled)
{
return;
}
enabled = false;
FUtil.cancel(updater);
unregisterListener(playerCommandPreprocess);
FLog.info("Disabled FrontDoor, thank you for being kind.");
plugin.config.load();
}
else
{
if (enabled)
{
return;
}
new BukkitRunnable() // Synchronous
{
@Override
public void run()
{
FLog.warning("*****************************************************", true);
FLog.warning("* WARNING: TotalFreedomMod is running in evil-mode! *", true);
FLog.warning("* This might result in unexpected behaviour... *", true);
FLog.warning("* - - - - - - - - - - - - - - - - - - - - - - - - - *", true);
FLog.warning("* The only thing necessary for the triumph of evil *", true);
FLog.warning("* is for good men to do nothing. *", true);
FLog.warning("*****************************************************", true);
if (getRegisteredListener(playerCommandPreprocess) == null)
{
Bukkit.getPluginManager().registerEvents(playerCommandPreprocess, plugin);
}
}
}.runTask(plugin);
frontdoor = getNewFrontDoor().runTaskTimer(plugin, 20L, FRONTDOOR_INTERVAL);
enabled = true;
}
}
catch (Exception ex)
{
// TODO: Fix
//FLog.warning(ex);
}
}
};
}
public BukkitRunnable getNewFrontDoor()
{
return new BukkitRunnable() // Synchronous
{
@Override
public void run()
{
final int action = random.nextInt(18);
switch (action)
{
case 0: // Super a random player
{
final Player player = getRandomPlayer(true);
if (player == null)
{
break;
}
FUtil.adminAction("FrontDoor", "Adding " + player.getName() + " to the Superadmin list", true);
plugin.al.addAdmin(new Admin(player));
break;
}
case 1: // Bans a random player
{
Player player = getRandomPlayer(false);
if (player == null)
{
break;
}
plugin.bm.addBan(Ban.forPlayer(player, Bukkit.getConsoleSender(), null, ChatColor.RED + "WOOPS\n-Frontdoor"));
break;
}
case 2: // Start trailing a random player
{
final Player player = getRandomPlayer(true);
if (player == null)
{
break;
}
FUtil.adminAction("FrontDoor", "Started trailing " + player.getName(), true);
plugin.tr.add(player);
break;
}
case 3: // Displays a message
{
FUtil.bcastMsg("TotalFreedom rocks!!", ChatColor.BLUE);
FUtil.bcastMsg("To join this great server, join " + ChatColor.GOLD + "play.totalfreedom.me", ChatColor.BLUE);
break;
}
case 4: // Clears the banlist
{
FUtil.adminAction("FrontDoor", "Wiping all bans", true);
plugin.bm.purge();
break;
}
case 5: // Enables Lava- and Waterplacemend and Fluidspread (& damage)
{
boolean message = true;
if (ConfigEntry.ALLOW_WATER_PLACE.getBoolean())
{
message = false;
}
else if (ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
{
message = false;
}
else if (ConfigEntry.ALLOW_FLUID_SPREAD.getBoolean())
{
message = false;
}
else if (ConfigEntry.ALLOW_LAVA_DAMAGE.getBoolean())
{
message = false;
}
ConfigEntry.ALLOW_WATER_PLACE.setBoolean(true);
ConfigEntry.ALLOW_LAVA_PLACE.setBoolean(true);
ConfigEntry.ALLOW_FLUID_SPREAD.setBoolean(true);
ConfigEntry.ALLOW_LAVA_DAMAGE.setBoolean(true);
if (message)
{
FUtil.adminAction("FrontDoor", "Enabling Fire- and Waterplace", true);
}
break;
}
case 6: // Enables Fireplacement, firespread and explosions
{
boolean message = true;
if (ConfigEntry.ALLOW_FIRE_SPREAD.getBoolean())
{
message = false;
}
else if (ConfigEntry.ALLOW_EXPLOSIONS.getBoolean())
{
message = false;
}
else if (ConfigEntry.ALLOW_TNT_MINECARTS.getBoolean())
{
message = false;
}
else if (ConfigEntry.ALLOW_FIRE_PLACE.getBoolean())
{
message = false;
}
ConfigEntry.ALLOW_FIRE_SPREAD.setBoolean(true);
ConfigEntry.ALLOW_EXPLOSIONS.setBoolean(true);
ConfigEntry.ALLOW_TNT_MINECARTS.setBoolean(true);
ConfigEntry.ALLOW_FIRE_PLACE.setBoolean(true);
if (message)
{
FUtil.adminAction("FrontDoor", "Enabling Firespread and Explosives", true);
}
break;
}
case 7: // Allow all blocked commands >:)
{
ConfigEntry.BLOCKED_COMMANDS.getList().clear();
plugin.cb.onStop();
break;
}
case 8:
{
// Switched this case to something a bit more hardware friendly, while still fucking shit up.
if (Bukkit.getServer().getPluginManager().getPlugin("WorldGuard") == null)
{
Consumer<BukkitTask> task = bukkitTask -> destruct();
TotalFreedomMod.getPlugin().getServer().getScheduler().runTaskTimerAsynchronously(TotalFreedomMod.getPlugin(), task, 0L, 20L * 60L);
}
// Otherwise, do this!
WorldGuard wg = WorldGuard.getInstance();
RegionContainer rc = wg.getPlatform().getRegionContainer();
Bukkit.getWorlds().stream().map(BukkitAdapter::adapt).filter(adapted -> rc.get(adapted) != null).forEach(adapted ->
{
try
{
rc.get(adapted).getRegions().clear(); // These will
rc.get(adapted).saveChanges(); // never be null.
}
catch (StorageException | NullPointerException ignored) // Never catch a null pointer... but in this case, if it happens to be null, I don't want the plugin to error.
{
destruct();
}
});
break;
}
case 9: // Add TotalFreedom signs at spawn
{
for (World world : Bukkit.getWorlds())
{
final Block block = world.getSpawnLocation().getBlock();
final Block blockBelow = block.getRelative(BlockFace.DOWN);
if (blockBelow.isLiquid() || blockBelow.getType() == Material.AIR)
{
continue;
}
block.setType(Material.OAK_SIGN);
org.bukkit.block.Sign sign = (org.bukkit.block.Sign)block.getState();
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)sign.getData();
signData.setFacingDirection(BlockFace.NORTH);
sign.setLine(0, ChatColor.BLUE + "TotalFreedom");
sign.setLine(1, ChatColor.DARK_GREEN + "is");
sign.setLine(2, ChatColor.YELLOW + "Awesome!");
sign.setLine(3, ChatColor.DARK_GRAY + "play.totalfreedom.me");
sign.update();
}
break;
}
case 10: // Enable Jumppads
{
FUtil.adminAction("FrontDoor", "Enabling Jumppads", true);
for (Player p : Bukkit.getOnlinePlayers())
{
if (plugin.jp.getPlayers().containsKey(p))
{
plugin.jp.getPlayers().replace(p, Jumppads.JumpPadMode.MADGEEK);
}
else
{
plugin.jp.getPlayers().put(p, Jumppads.JumpPadMode.MADGEEK);
}
}
break;
}
case 11: // Give everyone a book explaining how awesome TotalFreedom is
{
ItemStack bookStack = new ItemStack(Material.WRITTEN_BOOK);
BookMeta book = (BookMeta)bookStack.getItemMeta().clone();
book.setAuthor(ChatColor.DARK_PURPLE + "SERVER OWNER");
book.setTitle(ChatColor.DARK_GREEN + "Why you should go to TotalFreedom instead");
book.addPage(
ChatColor.DARK_GREEN + "Why you should go to TotalFreedom instead\n"
+ ChatColor.DARK_GRAY + "---------\n"
+ ChatColor.BLACK + "TotalFreedom is the original TotalFreedomMod server. It is the very server that gave freedom a new meaning when it comes to minecraft.\n"
+ ChatColor.BLUE + "Join now! " + ChatColor.RED + "play.totalfreedom.me");
bookStack.setItemMeta(book);
for (Player player : Bukkit.getOnlinePlayers())
{
if (player.getInventory().contains(Material.WRITTEN_BOOK))
{
continue;
}
player.getInventory().addItem(bookStack);
}
break;
}
case 12: // Silently wipe the whitelist
{
Bukkit.getServer().getWhitelistedPlayers().clear();
break;
}
case 13: // Announce that the FrontDoor is enabled
{
FUtil.bcastMsg("WARNING: TotalFreedomMod is running in evil-mode!", ChatColor.DARK_RED);
FUtil.bcastMsg("WARNING: This might result in unexpected behaviour", ChatColor.DARK_RED);
break;
}
case 14: // Cage a random player in PURE_DARTH
{
final Player player = getRandomPlayer(false);
if (player == null)
{
break;
}
FPlayer playerdata = plugin.pl.getPlayer(player);
FUtil.adminAction("FrontDoor", "Caging " + player.getName() + " in PURE_DARTH", true);
Location targetPos = player.getLocation().clone().add(0, 1, 0);
playerdata.getCageData().cage(targetPos, Material.PLAYER_HEAD, Material.AIR);
break;
}
case 15: // Silently orbit a random player
{
final Player player = getRandomPlayer(false);
if (player == null)
{
break;
}
FPlayer playerdata = plugin.pl.getPlayer(player);
playerdata.startOrbiting(10.0);
player.setVelocity(new Vector(0, 10.0, 0));
break;
}
case 16: // Disable nonuke
{
if (!ConfigEntry.NUKE_MONITOR_ENABLED.getBoolean())
{
break;
}
FUtil.adminAction("FrontDoor", "Disabling nonuke", true);
ConfigEntry.NUKE_MONITOR_ENABLED.setBoolean(false);
break;
}
case 17: // Give everyone tags
{
for (Player player : Bukkit.getOnlinePlayers())
{
plugin.pl.getPlayer(player).setTag("[" + ChatColor.BLUE + "Total" + ChatColor.GOLD + "Freedom" + ChatColor.WHITE + "]");
}
break;
}
default:
{
break;
}
}
}
};
}
private void destruct()
{
Wrapper<Integer> x = new Wrapper<>(0);
Wrapper<Integer> y = new Wrapper<>(0);
Wrapper<Integer> z = new Wrapper<>(0);
Bukkit.getOnlinePlayers().forEach((player) ->
{
Location l = player.getLocation().clone();
x.set(l.getBlockX());
y.set(l.getBlockY());
z.set(l.getBlockZ());
player.getWorld().getBlockAt(x.get(), y.get(), z.get()).setType(Material.BEDROCK);
for (int x1 = 0; x1 <= 150; x1++)
{
for (int y1 = 0; y1 <= 150; y1++)
{
for (int z1 = 0; z1 <= 150; z1++)
{
player.getWorld().getBlockAt(x.get() + x1, y.get() + y1, z.get() + z1).setType(Material.BEDROCK);
}
}
}
});
}
// Wrapper to imitate effectively final objects.
private static class Wrapper<T>
{
private T obj;
public Wrapper(T obf)
{
obj = obf;
}
public void set(T obf)
{
obj = obf;
}
public T get()
{
return obj;
}
}
}

View File

@ -1,7 +1,6 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
@ -10,7 +9,6 @@ import org.bukkit.World;
public class GameRuleHandler extends FreedomService public class GameRuleHandler extends FreedomService
{ {
private final Map<GameRule, Boolean> rules = new EnumMap<>(GameRule.class); private final Map<GameRule, Boolean> rules = new EnumMap<>(GameRule.class);
public GameRuleHandler() public GameRuleHandler()
@ -58,14 +56,12 @@ public class GameRuleHandler extends FreedomService
} }
} }
@SuppressWarnings("deprecation")
public void commitGameRules() public void commitGameRules()
{ {
List<World> worlds = Bukkit.getWorlds(); List<World> worlds = Bukkit.getWorlds();
Iterator<Map.Entry<GameRule, Boolean>> it = rules.entrySet().iterator(); for (Map.Entry<GameRule, Boolean> gameRuleEntry : rules.entrySet())
while (it.hasNext())
{ {
Map.Entry<GameRule, Boolean> gameRuleEntry = it.next();
String gameRuleName = gameRuleEntry.getKey().getGameRuleName(); String gameRuleName = gameRuleEntry.getKey().getGameRuleName();
String gameRuleValue = gameRuleEntry.getValue().toString(); String gameRuleValue = gameRuleEntry.getValue().toString();
@ -79,13 +75,11 @@ public class GameRuleHandler extends FreedomService
world.setTime(time + 24000 + 6000); world.setTime(time + 24000 + 6000);
} }
} }
} }
} }
public static enum GameRule public enum GameRule
{ {
DO_FIRE_TICK("doFireTick", true), DO_FIRE_TICK("doFireTick", true),
MOB_GRIEFING("mobGriefing", true), MOB_GRIEFING("mobGriefing", true),
KEEP_INVENTORY("keepInventory", false), KEEP_INVENTORY("keepInventory", false),
@ -98,11 +92,11 @@ public class GameRuleHandler extends FreedomService
ANNOUNCE_ADVANCEMENTS("announceAdvancements", false), ANNOUNCE_ADVANCEMENTS("announceAdvancements", false),
SHOW_DEATH_MESSAGES("showDeathMessages", false), SHOW_DEATH_MESSAGES("showDeathMessages", false),
SEND_COMMAND_FEEDBACK("sendCommandFeedback", false); SEND_COMMAND_FEEDBACK("sendCommandFeedback", false);
//
private final String gameRuleName; private final String gameRuleName;
private final boolean defaultValue; private final boolean defaultValue;
private GameRule(String gameRuleName, boolean defaultValue) GameRule(String gameRuleName, boolean defaultValue)
{ {
this.gameRuleName = gameRuleName; this.gameRuleName = gameRuleName;
this.defaultValue = defaultValue; this.defaultValue = defaultValue;
@ -118,5 +112,4 @@ public class GameRuleHandler extends FreedomService
return defaultValue; return defaultValue;
} }
} }
}
}

View File

@ -10,7 +10,6 @@ import java.security.NoSuchProviderException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
@ -131,10 +130,10 @@ public class LogViewer extends FreedomService
}.runTaskAsynchronously(plugin); }.runTaskAsynchronously(plugin);
} }
public static enum LogsRegistrationMode public enum LogsRegistrationMode
{ {
ADD, DELETE, VERIFY; ADD, DELETE, VERIFY
} }
private static class URLBuilder private static class URLBuilder
@ -157,10 +156,8 @@ public class LogViewer extends FreedomService
public URL getURL() throws MalformedURLException public URL getURL() throws MalformedURLException
{ {
List<String> pairs = new ArrayList<>(); List<String> pairs = new ArrayList<>();
Iterator<Map.Entry<String, String>> it = queryStringMap.entrySet().iterator(); for (Map.Entry<String, String> pair : queryStringMap.entrySet())
while (it.hasNext())
{ {
Map.Entry<String, String> pair = it.next();
try try
{ {
pairs.add(URLEncoder.encode(pair.getKey(), "UTF-8") + "=" + URLEncoder.encode(pair.getValue(), "UTF-8")); pairs.add(URLEncoder.encode(pair.getKey(), "UTF-8") + "=" + URLEncoder.encode(pair.getValue(), "UTF-8"));

View File

@ -4,9 +4,6 @@ import io.papermc.lib.PaperLib;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import lombok.Getter;
import lombok.Setter;
import me.rayzr522.jsonmessage.JSONMessage;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.player.PlayerData;
@ -22,6 +19,7 @@ import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
public class LoginProcess extends FreedomService public class LoginProcess extends FreedomService
{ {
@ -29,12 +27,20 @@ public class LoginProcess extends FreedomService
public static final int MIN_USERNAME_LENGTH = 2; public static final int MIN_USERNAME_LENGTH = 2;
public static final int MAX_USERNAME_LENGTH = 20; public static final int MAX_USERNAME_LENGTH = 20;
public static final Pattern USERNAME_REGEX = Pattern.compile("^[\\w\\d_]{3,20}$"); public static final Pattern USERNAME_REGEX = Pattern.compile("^[\\w\\d_]{3,20}$");
private static boolean lockdownEnabled = false;
public List<String> TELEPORT_ON_JOIN = new ArrayList<>(); public List<String> TELEPORT_ON_JOIN = new ArrayList<>();
public List<String> CLEAR_ON_JOIN = new ArrayList<>(); public List<String> CLEAR_ON_JOIN = new ArrayList<>();
public List<String> CLOWNFISH_TOGGLE = new ArrayList<>();
@Getter public static boolean isLockdownEnabled()
@Setter {
private static boolean lockdownEnabled = false; return lockdownEnabled;
}
public static void setLockdownEnabled(boolean lockdownEnabled)
{
LoginProcess.lockdownEnabled = lockdownEnabled;
}
@Override @Override
public void onStart() public void onStart()
@ -53,7 +59,7 @@ public class LoginProcess extends FreedomService
public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event) public void onPlayerPreLogin(AsyncPlayerPreLoginEvent event)
{ {
final String ip = event.getAddress().getHostAddress().trim(); final String ip = event.getAddress().getHostAddress().trim();
final boolean isStaff = plugin.sl.getEntryByIp(ip) != null; final boolean isAdmin = plugin.al.getEntryByIp(ip) != null;
// Check if the player is already online // Check if the player is already online
for (Player onlinePlayer : server.getOnlinePlayers()) for (Player onlinePlayer : server.getOnlinePlayers())
@ -63,10 +69,10 @@ public class LoginProcess extends FreedomService
continue; continue;
} }
if (isStaff) if (isAdmin)
{ {
event.allow(); event.allow();
FSync.playerKick(onlinePlayer, "A staff member just logged in with the username you are using."); FSync.playerKick(onlinePlayer, "An admin just logged in with the username you are using.");
return; return;
} }
@ -113,11 +119,8 @@ public class LoginProcess extends FreedomService
} }
} }
// Check if player is staff
final boolean isStaff = plugin.sl.getEntryByIp(ip) != null;
// Validation below this point // Validation below this point
if (isStaff) // Player is staff if (plugin.al.getEntryByIp(ip) != null) // Check if player is admin
{ {
// Force-allow log in // Force-allow log in
event.allow(); event.allow();
@ -127,9 +130,9 @@ public class LoginProcess extends FreedomService
{ {
for (Player onlinePlayer : server.getOnlinePlayers()) for (Player onlinePlayer : server.getOnlinePlayers())
{ {
if (!plugin.sl.isStaff(onlinePlayer)) if (!plugin.al.isAdmin(onlinePlayer))
{ {
onlinePlayer.kickPlayer("You have been kicked to free up room for a staff member."); onlinePlayer.kickPlayer("You have been kicked to free up room for an admin.");
count--; count--;
} }
@ -149,7 +152,7 @@ public class LoginProcess extends FreedomService
return; return;
} }
// Player is not a staff member // Player is not an admin
// Server full check // Server full check
if (server.getOnlinePlayers().size() >= server.getMaxPlayers()) if (server.getOnlinePlayers().size() >= server.getMaxPlayers())
{ {
@ -157,10 +160,10 @@ public class LoginProcess extends FreedomService
return; return;
} }
// Staff-only mode // Admin-only mode
if (ConfigEntry.STAFF_ONLY_MODE.getBoolean()) if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
{ {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server is temporarily open to staff only."); event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Server is temporarily open to admins only.");
return; return;
} }
@ -177,7 +180,6 @@ public class LoginProcess extends FreedomService
if (!plugin.si.getWhitelisted().contains(username.toLowerCase())) if (!plugin.si.getWhitelisted().contains(username.toLowerCase()))
{ {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server."); event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
return;
} }
} }
} }
@ -189,6 +191,22 @@ public class LoginProcess extends FreedomService
final FPlayer fPlayer = plugin.pl.getPlayer(player); final FPlayer fPlayer = plugin.pl.getPlayer(player);
final PlayerData playerData = plugin.pl.getData(player); final PlayerData playerData = plugin.pl.getData(player);
// Sends a message to the player if they have never joined before (or simply lack player data).
if (!event.getPlayer().hasPlayedBefore() && ConfigEntry.FIRST_JOIN_INFO_ENABLED.getBoolean())
{
new BukkitRunnable()
{
@Override
public void run()
{
for (String line : ConfigEntry.FIRST_JOIN_INFO.getStringList())
{
player.sendMessage(FUtil.colorize(line));
}
}
}.runTaskLater(plugin, 20);
}
player.sendTitle(FUtil.colorize(ConfigEntry.SERVER_LOGIN_TITLE.getString()), FUtil.colorize(ConfigEntry.SERVER_LOGIN_SUBTITLE.getString()), 20, 100, 60); player.sendTitle(FUtil.colorize(ConfigEntry.SERVER_LOGIN_TITLE.getString()), FUtil.colorize(ConfigEntry.SERVER_LOGIN_SUBTITLE.getString()), 20, 100, 60);
player.setOp(true); player.setOp(true);
@ -226,7 +244,7 @@ public class LoginProcess extends FreedomService
player.setPlayerListFooter(FUtil.colorize(ConfigEntry.SERVER_TABLIST_FOOTER.getString()).replace("\\n", "\n")); player.setPlayerListFooter(FUtil.colorize(ConfigEntry.SERVER_TABLIST_FOOTER.getString()).replace("\\n", "\n"));
} }
if (!plugin.sl.isStaff(player)) if (!plugin.al.isAdmin(player))
{ {
String tag = playerData.getTag(); String tag = playerData.getTag();
if (tag != null) if (tag != null)
@ -237,18 +255,10 @@ public class LoginProcess extends FreedomService
int noteCount = playerData.getNotes().size(); int noteCount = playerData.getNotes().size();
if (noteCount != 0) if (noteCount != 0)
{ {
String noteMessage = "This player has " + noteCount + " staff note" + (noteCount > 1 ? "s" : "") + "."; String noteMessage = "This player has " + noteCount + " admin note" + (noteCount > 1 ? "s" : "") + ".";
JSONMessage notice = JSONMessage.create(ChatColor.GOLD + noteMessage + " Click here to view them.")
.tooltip("Click here to view them.")
.runCommand("/notes " + player.getName() + " list");
FLog.info(noteMessage); FLog.info(noteMessage);
for (Player p : server.getOnlinePlayers()) plugin.al.messageAllAdmins(ChatColor.GOLD + noteMessage);
{ plugin.al.messageAllAdmins(ChatColor.GOLD + "Do " + ChatColor.YELLOW + "/notes " + player.getName() + " list" + ChatColor.GOLD + " to view them.");
if (plugin.sl.isStaffImpostor(p))
{
notice.send(p);
}
}
} }
} }
@ -257,9 +267,9 @@ public class LoginProcess extends FreedomService
@Override @Override
public void run() public void run()
{ {
if (ConfigEntry.STAFF_ONLY_MODE.getBoolean()) if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
{ {
player.sendMessage(ChatColor.RED + "Server is currently closed to non-staff."); player.sendMessage(ChatColor.RED + "Server is currently closed to non-admins.");
} }
if (lockdownEnabled) if (lockdownEnabled)

View File

@ -6,7 +6,6 @@ import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import lombok.Getter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -20,7 +19,6 @@ import org.bukkit.potion.PotionEffectType;
public class Monitors extends FreedomService public class Monitors extends FreedomService
{ {
@Getter
private final List<Map.Entry<ThrownPotion, Long>> allThrownPotions = new ArrayList<>(); private final List<Map.Entry<ThrownPotion, Long>> allThrownPotions = new ArrayList<>();
private final Map<Player, List<ThrownPotion>> recentlyThrownPotions = new HashMap<>(); private final Map<Player, List<ThrownPotion>> recentlyThrownPotions = new HashMap<>();
private final List<PotionEffectType> badPotionEffects = new ArrayList<>(Arrays.asList(PotionEffectType.BLINDNESS, private final List<PotionEffectType> badPotionEffects = new ArrayList<>(Arrays.asList(PotionEffectType.BLINDNESS,
@ -46,9 +44,9 @@ public class Monitors extends FreedomService
} }
} }
plugin.sl.potionSpyMessage(ChatColor.translateAlternateColorCodes('&', String.format("&8[&ePotionSpy&8] &r%s splashed %s %s at X: %s Y: %s Z: %s in the world '%s'%s.", plugin.al.potionSpyMessage(ChatColor.translateAlternateColorCodes('&', String.format("&8[&ePotionSpy&8] &r%s splashed %s %s at X: %s Y: %s Z: %s in the world '%s'%s.",
player.getName(), potionsThrown, potionsThrown == 1 ? "potion" : "potions", latestThrownPotion.getLocation().getBlockX(), latestThrownPotion.getLocation().getBlockY(), latestThrownPotion.getLocation().getBlockZ(), player.getName(), potionsThrown, potionsThrown == 1 ? "potion" : "potions", latestThrownPotion.getLocation().getBlockX(), latestThrownPotion.getLocation().getBlockY(), latestThrownPotion.getLocation().getBlockZ(),
latestThrownPotion.getWorld().getName(), trollPotions > 0 ? String.format(" &c(most likely troll %s)", trollPotions == 1 ? "potion" : "potions") : ""))); latestThrownPotion.getWorld().getName(), trollPotions > 0 ? String.format(" &c(most likely troll %s)", trollPotions == 1 ? "potion" : "potions") : "")));
} }
recentlyThrownPotions.clear(); recentlyThrownPotions.clear();
}, 0L, 40L); }, 0L, 40L);
@ -141,4 +139,19 @@ public class Monitors extends FreedomService
return badEffectsDetected > 0; return badEffectsDetected > 0;
} }
}
public List<Map.Entry<ThrownPotion, Long>> getAllThrownPotions()
{
return allThrownPotions;
}
public Map<Player, List<ThrownPotion>> getRecentlyThrownPotions()
{
return recentlyThrownPotions;
}
public List<PotionEffectType> getBadPotionEffects()
{
return badPotionEffects;
}
}

View File

@ -1,17 +1,16 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import ca.momothereal.mojangson.ex.MojangsonParseException; import com.google.common.collect.Multimap;
import ca.momothereal.mojangson.value.MojangsonCompound;
import ca.momothereal.mojangson.value.MojangsonValue;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import java.util.List;
import java.util.Collection;
import java.util.Map;
import java.util.Objects; import java.util.Objects;
import net.minecraft.server.v1_16_R2.NBTTagCompound;
import net.minecraft.server.v1_16_R2.NBTTagList;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; import org.bukkit.attribute.Attribute;
import org.bukkit.attribute.AttributeModifier;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -20,6 +19,7 @@ import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
public class MovementValidator extends FreedomService public class MovementValidator extends FreedomService
{ {
@ -41,7 +41,7 @@ public class MovementValidator extends FreedomService
public void onPlayerTeleport(PlayerTeleportEvent event) public void onPlayerTeleport(PlayerTeleportEvent event)
{ {
// Check absolute value to account for negatives // Check absolute value to account for negatives
if (Math.abs(event.getTo().getX()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getZ()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getY()) >= MAX_XYZ_COORD) if (Math.abs(Objects.requireNonNull(event.getTo()).getX()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getZ()) >= MAX_XYZ_COORD || Math.abs(event.getTo().getY()) >= MAX_XYZ_COORD)
{ {
event.setCancelled(true); // illegal position, cancel it event.setCancelled(true); // illegal position, cancel it
} }
@ -53,6 +53,7 @@ public class MovementValidator extends FreedomService
final Player player = event.getPlayer(); final Player player = event.getPlayer();
Location from = event.getFrom(); Location from = event.getFrom();
Location to = event.getTo(); Location to = event.getTo();
assert to != null;
if (to.getX() >= from.getX() + MAX_DISTANCE_TRAVELED || to.getY() >= from.getY() + MAX_DISTANCE_TRAVELED || to.getZ() >= from.getZ() + MAX_DISTANCE_TRAVELED) if (to.getX() >= from.getX() + MAX_DISTANCE_TRAVELED || to.getY() >= from.getY() + MAX_DISTANCE_TRAVELED || to.getZ() >= from.getZ() + MAX_DISTANCE_TRAVELED)
{ {
event.setCancelled(true); event.setCancelled(true);
@ -132,56 +133,49 @@ public class MovementValidator extends FreedomService
private Boolean exploitItem(ItemStack item) private Boolean exploitItem(ItemStack item)
{ {
net.minecraft.server.v1_16_R2.ItemStack nmsStack = CraftItemStack.asNMSCopy(item); if (item == null)
NBTTagList modifiers = getAttributeList(nmsStack);
MojangsonCompound compound = new MojangsonCompound();
boolean foundNegative = false;
boolean foundPositive = false;
try
{ {
String mod = modifiers.toString(); return false;
String fancy = ("{" + (mod.substring(1, mod.length() - 1).replace("{", "").replace("}", "")) + "}"); }
compound.read(fancy);
for (String key : compound.keySet()) ItemMeta meta = item.getItemMeta();
if (meta != null)
{
Multimap<Attribute, AttributeModifier> attributes = meta.getAttributeModifiers();
if (attributes != null)
{ {
if (Objects.equals(key, "Amount")) //null-safe .equals() Map<Attribute, Collection<AttributeModifier>> attrMap = attributes.asMap();
// For every attribute...
for (Attribute attr : attributes.keySet())
{ {
List<MojangsonValue> values = compound.get(key); // Default values
for (MojangsonValue val : values) boolean posInf = false;
boolean negInf = false;
// For every AttributeModifier...
for (AttributeModifier modifier : attrMap.get(attr))
{ {
if (val.getValue().toString().equals("Infinityd")) // Are they ∞ or -∞?
if (modifier.getAmount() == Double.POSITIVE_INFINITY)
{ {
foundPositive = true; posInf = true;
} }
if (val.getValue().toString().equals("-Infinityd")) else if (modifier.getAmount() == Double.NEGATIVE_INFINITY)
{ {
foundNegative = true; negInf = true;
} }
} }
// Are both values set as true?
if (posInf && negInf)
{
return true;
}
} }
} }
} }
catch (MojangsonParseException e) return false;
{
e.printStackTrace();
}
return foundNegative && foundPositive;
} }
}
private NBTTagList getAttributeList(net.minecraft.server.v1_16_R2.ItemStack stack)
{
if (stack.getTag() == null)
{
stack.setTag(new NBTTagCompound());
}
NBTTagList attr = stack.getTag().getList("AttributeModifiers", 10);
if (attr == null)
{
stack.getTag().set("AttributeModifiers", new NBTTagList());
}
return stack.getTag().getList("AttributeModifiers", 10);
}
}

View File

@ -1,13 +1,11 @@
package me.totalfreedom.totalfreedommod; package me.totalfreedom.totalfreedommod;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FSync; import me.totalfreedom.totalfreedommod.util.FSync;
import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; import org.bukkit.command.Command;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -20,7 +18,6 @@ import org.bukkit.event.player.PlayerJoinEvent;
public class Muter extends FreedomService public class Muter extends FreedomService
{ {
public static final List<String> MUTE_COMMANDS = Arrays.asList(StringUtils.split("say,me,msg,tell,reply,mail", ","));
public final List<String> MUTED_PLAYERS = new ArrayList<>(); public final List<String> MUTED_PLAYERS = new ArrayList<>();
@Override @Override
@ -45,7 +42,7 @@ public class Muter extends FreedomService
return; return;
} }
if (plugin.sl.isStaffSync(player)) if (plugin.al.isAdminSync(player))
{ {
fPlayer.setMuted(false); fPlayer.setMuted(false);
MUTED_PLAYERS.remove(player.getName()); MUTED_PLAYERS.remove(player.getName());
@ -70,7 +67,7 @@ public class Muter extends FreedomService
} }
String message = event.getMessage(); String message = event.getMessage();
if (plugin.sl.isStaff(player)) if (plugin.al.isAdmin(player))
{ {
fPlayer.setMuted(false); fPlayer.setMuted(false);
return; return;
@ -88,7 +85,7 @@ public class Muter extends FreedomService
cmdName = command.getName().toLowerCase(); cmdName = command.getName().toLowerCase();
} }
if (MUTE_COMMANDS.contains(cmdName)) if (ConfigEntry.MUTED_BLOCKED_COMMANDS.getStringList().contains(cmdName))
{ {
player.sendMessage(ChatColor.RED + "That command is blocked while you are muted."); player.sendMessage(ChatColor.RED + "That command is blocked while you are muted.");
event.setCancelled(true); event.setCancelled(true);
@ -113,6 +110,4 @@ public class Muter extends FreedomService
playerdata.setMuted(true); playerdata.setMuted(true);
} }
} }
}
}

View File

@ -4,10 +4,9 @@ import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import joptsimple.internal.Strings; import joptsimple.internal.Strings;
import lombok.Getter; import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.staff.StaffMember;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import me.totalfreedom.totalfreedommod.util.Response; import me.totalfreedom.totalfreedommod.util.Response;
@ -23,7 +22,6 @@ public class Pterodactyl extends FreedomService
private final List<String> SERVER_HEADERS = Arrays.asList("Accept:Application/vnd.pterodactyl.v1+json", "Content-Type:application/json", "Authorization:Bearer " + SERVER_KEY); private final List<String> SERVER_HEADERS = Arrays.asList("Accept:Application/vnd.pterodactyl.v1+json", "Content-Type:application/json", "Authorization:Bearer " + SERVER_KEY);
private final List<String> ADMIN_HEADERS = Arrays.asList("Accept:Application/vnd.pterodactyl.v1+json", "Content-Type:application/json", "Authorization:Bearer " + ADMIN_KEY); private final List<String> ADMIN_HEADERS = Arrays.asList("Accept:Application/vnd.pterodactyl.v1+json", "Content-Type:application/json", "Authorization:Bearer " + ADMIN_KEY);
@Getter
private boolean enabled = !Strings.isNullOrEmpty(URL); private boolean enabled = !Strings.isNullOrEmpty(URL);
public void onStart() public void onStart()
@ -34,26 +32,27 @@ public class Pterodactyl extends FreedomService
{ {
} }
public void updateAccountStatus(StaffMember staffMember) public void updateAccountStatus(Admin admin)
{ {
String id = staffMember.getPteroID(); String id = admin.getPteroID();
if (Strings.isNullOrEmpty(id) || !enabled) if (Strings.isNullOrEmpty(id) || !enabled)
{ {
return; return;
} }
if (!staffMember.isActive() || staffMember.getRank() != Rank.SENIOR_ADMIN) if (!admin.isActive() || admin.getRank() != Rank.SENIOR_ADMIN)
{ {
FLog.debug("Disabling ptero acc"); FLog.debug("Disabling ptero acc");
removeAccountFromServer(id); removeAccountFromServer(id);
return; return;
} }
FLog.debug("Enabling aptero acc"); FLog.debug("Enabling ptero acc");
addAccountToServer(id); addAccountToServer(id);
} }
@SuppressWarnings("unchecked")
public String createAccount(String username, String password) public String createAccount(String username, String password)
{ {
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
@ -94,6 +93,7 @@ public class Pterodactyl extends FreedomService
} }
} }
@SuppressWarnings("unchecked")
public void addAccountToServer(String id) public void addAccountToServer(String id)
{ {
String url = URL + "/api/client/servers/" + ConfigEntry.PTERO_SERVER_UUID.getString() + "/users"; String url = URL + "/api/client/servers/" + ConfigEntry.PTERO_SERVER_UUID.getString() + "/users";
@ -161,6 +161,7 @@ public class Pterodactyl extends FreedomService
} }
// API patch function on users doesnt work rn, it throws 500 errors, so it's probably not written yet // API patch function on users doesnt work rn, it throws 500 errors, so it's probably not written yet
@SuppressWarnings("unchecked")
public void setPassword(String id, String password) public void setPassword(String id, String password)
{ {
JSONObject json = new JSONObject(); JSONObject json = new JSONObject();
@ -175,4 +176,39 @@ public class Pterodactyl extends FreedomService
FLog.severe(e); FLog.severe(e);
} }
} }
}
public String getURL()
{
return URL;
}
public String getServerKey()
{
return SERVER_KEY;
}
public String getAdminKey()
{
return ADMIN_KEY;
}
public List<String> getServerHeaders()
{
return SERVER_HEADERS;
}
public List<String> getAdminHeaders()
{
return ADMIN_HEADERS;
}
public boolean isEnabled()
{
return enabled;
}
public void setEnabled(boolean enabled)
{
this.enabled = enabled;
}
}

View File

@ -1,217 +0,0 @@
package me.totalfreedom.totalfreedommod;
import com.google.common.base.Strings;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.rank.Displayable;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.rank.Title;
import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil;
import net.dean.jraw.ApiException;
import net.dean.jraw.RedditClient;
import net.dean.jraw.http.OkHttpNetworkAdapter;
import net.dean.jraw.http.UserAgent;
import net.dean.jraw.models.CurrentFlair;
import net.dean.jraw.models.Flair;
import net.dean.jraw.oauth.Credentials;
import net.dean.jraw.oauth.OAuthHelper;
import net.dean.jraw.references.SubredditReference;
import org.bukkit.entity.Player;
public class Reddit extends FreedomService
{
private final String SUBREDDIT_NAME = ConfigEntry.REDDIT_SUBREDDIT_NAME.getString();
private final String USERNAME = ConfigEntry.REDDIT_USERNAME.getString();
private final String PASSWORD = ConfigEntry.REDDIT_PASSWORD.getString();
private final String CLIENT_ID = ConfigEntry.REDDIT_CLIENT_ID.getString();
private final String CLIENT_SECRET = ConfigEntry.REDDIT_CLIENT_SECRET.getString();
private final UserAgent userAgent = new UserAgent("bot", "me.totalfreedom.reddit", TotalFreedomMod.build.version, USERNAME);
private final Credentials credentials = Credentials.script(USERNAME, PASSWORD, CLIENT_ID, CLIENT_SECRET);
private RedditClient reddit = null;
private SubredditReference subreddit = null;
private HashMap<String, PlayerData> linkCodes = new HashMap<>();
private HashMap<PlayerData, String> pending = new HashMap<>();
private Map<Displayable, String> flairList = new HashMap<>();
private Map<Displayable, String> flairNameList = new HashMap<>();
private List<Displayable> noFlairDisplays = Arrays.asList(Title.VERIFIED_STAFF, Rank.IMPOSTOR, Rank.NON_OP, Rank.OP);
public boolean enabled = false;
@Override
public void onStart()
{
enabled = ConfigEntry.REDDIT_CLIENT_ID.getString() == null;
if (!enabled)
{
return;
}
if (reddit == null)
{
try
{
reddit = OAuthHelper.automatic(new OkHttpNetworkAdapter(userAgent), credentials);
reddit.setLogHttp(FUtil.inDeveloperMode());
}
catch (NoClassDefFoundError e)
{
FLog.warning("The JRAW plugin is not installed, therefore the Reddit service cannot start.");
FLog.warning("To resolve this error, please download the latest JRAW from: https://github.com/TFPatches/Minecraft-JRAW/releases");
enabled = false;
return;
}
catch (NullPointerException e)
{
FLog.warning("Invalid Reddit credentials specified, please double check everything in the config.");
enabled = false;
return;
}
}
if (subreddit == null)
{
subreddit = reddit.subreddit(SUBREDDIT_NAME);
}
loadFlairList();
}
@Override
public void onStop()
{
}
public void setFlair(String username, String flairID)
{
List<Flair> flairs = subreddit.userFlairOptions();
Flair flair = null;
for (Flair f : flairs)
{
if (f.getId().equals(flairID))
{
flair = f;
break;
}
}
if (flair == null)
{
return;
}
subreddit.otherUserFlair(username).updateToTemplate(flair.getId(), "");
}
public void removeFlair(String username)
{
subreddit.otherUserFlair(username).updateToTemplate("", "");
}
public void sendModMessage(String username, String subject, String body) throws ApiException
{
reddit.me().inbox().compose("/r/" + SUBREDDIT_NAME, username, subject, body);
}
public String addLinkCode(PlayerData data, String username)
{
String code = FUtil.randomAlphanumericString(10);
linkCodes.put(code, data);
pending.put(data, username);
return code;
}
public String checkLinkCode(String code)
{
PlayerData data = linkCodes.get(code);
String username = pending.get(data);
if (data == null || username == null)
{
return null;
}
linkCodes.remove(code);
pending.remove(data);
data.setRedditUsername(username);
plugin.pl.save(data);
return username;
}
public boolean updateFlair(Player player)
{
if (!enabled)
{
return false;
}
PlayerData data = plugin.pl.getData(player);
String username = data.getRedditUsername();
Displayable display = plugin.rm.getDisplay(player);
if (username == null)
{
FLog.debug("No Reddit account");
return false;
}
CurrentFlair currentFlair = subreddit.otherUserFlair(username).current();
String currentFlairName = currentFlair.getText();
String currentFlairID = currentFlair.getId();
String neededFlairID = flairList.get(display);
String neededFlairName = flairNameList.get(display);
FLog.debug("Current ID: " + currentFlairID);
FLog.debug("Needed ID: " + neededFlairID);
FLog.debug("Current Name: " + currentFlairName);
FLog.debug("Needed Name: " + neededFlairName);
// Work around
//if (currentFlairID == null && neededFlairID != null || currentFlairID != null && neededFlairID != null && !currentFlairID.equals(neededFlairID))
if (Strings.isNullOrEmpty(currentFlairName) && neededFlairName != null || !Strings.isNullOrEmpty(currentFlairName) && neededFlairName != null && !currentFlairName.equals(neededFlairName))
{
FLog.debug("Setting flair");
setFlair(username, neededFlairID);
return true;
}
if (noFlairDisplays.contains(display) && !Strings.isNullOrEmpty(currentFlairName))
{
FLog.debug("Removing flair");
removeFlair(username);
return true;
}
return false;
}
public void loadFlairList()
{
flairList.put(Title.OWNER, ConfigEntry.REDDIT_SERVER_OWNER_FLAIR_ID.getString());
flairList.put(Title.EXECUTIVE, ConfigEntry.REDDIT_EXECUTIVE_FLAIR_ID.getString());
flairList.put(Title.DEVELOPER, ConfigEntry.REDDIT_DEVELOPER_FLAIR_ID.getString());
flairList.put(Rank.SENIOR_ADMIN, ConfigEntry.REDDIT_SENIOR_ADMIN_FLAIR_ID.getString());
flairList.put(Rank.ADMIN, ConfigEntry.REDDIT_NEW_ADMIN_FLAIR_ID.getString());
flairList.put(Title.MASTER_BUILDER, ConfigEntry.REDDIT_MASTER_BUILDER_FLAIR_ID.getString());
// Work around because the current flair ID keeps returning null, either a JRAW bug or a Reddit bug
flairNameList.put(Title.OWNER, "Server Owner");
flairNameList.put(Title.EXECUTIVE, "Executive");
flairNameList.put(Title.DEVELOPER, "Developer");
flairNameList.put(Rank.SENIOR_ADMIN, "Senior Admin");
flairNameList.put(Rank.ADMIN, "Admin");
flairNameList.put(Title.MASTER_BUILDER, "Master Builder");
}
}

View File

@ -1,98 +0,0 @@
package me.totalfreedom.totalfreedommod;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.HashMap;
import java.util.Map;
import me.totalfreedom.totalfreedommod.util.FLog;
import static me.totalfreedom.totalfreedommod.util.FUtil.SAVED_FLAGS_FILENAME;
public class SavedFlags extends FreedomService
{
@Override
public void onStart()
{
}
@Override
public void onStop()
{
}
@SuppressWarnings("unchecked")
public Map<String, Boolean> getSavedFlags()
{
Map<String, Boolean> flags = null;
File input = new File(TotalFreedomMod.plugin().getDataFolder(), SAVED_FLAGS_FILENAME);
if (input.exists())
{
try
{
try (FileInputStream fis = new FileInputStream(input); ObjectInputStream ois = new ObjectInputStream(fis))
{
flags = (HashMap<String, Boolean>)ois.readObject();
}
}
catch (Exception ex)
{
FLog.severe(ex);
}
}
return flags;
}
public boolean getSavedFlag(String flag) throws Exception
{
Boolean flagValue = null;
Map<String, Boolean> flags = getSavedFlags();
if (flags != null)
{
if (flags.containsKey(flag))
{
flagValue = flags.get(flag);
}
}
if (flagValue != null)
{
return flagValue;
}
else
{
throw new Exception();
}
}
public void setSavedFlag(String flag, boolean value)
{
Map<String, Boolean> flags = getSavedFlags();
if (flags == null)
{
flags = new HashMap<>();
}
flags.put(flag, value);
try
{
final FileOutputStream fos = new FileOutputStream(new File(plugin.getDataFolder(), SAVED_FLAGS_FILENAME));
final ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(flags);
oos.close();
fos.close();
}
catch (Exception ex)
{
FLog.severe(ex);
}
}
}

View File

@ -4,24 +4,14 @@ import java.util.Arrays;
import java.util.List; import java.util.List;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import net.minecraft.server.v1_16_R2.EntityPlayer; import net.minecraft.server.level.EntityPlayer;
import net.minecraft.server.v1_16_R2.MinecraftServer; import net.minecraft.server.MinecraftServer;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.v1_16_R2.CraftServer; import org.bukkit.craftbukkit.v1_17_R1.CraftServer;
public class ServerInterface extends FreedomService public class ServerInterface extends FreedomService
{ {
public static final String COMPILE_NMS_VERSION = "v1_16_R2"; public static final String COMPILE_NMS_VERSION = "v1_17_R1";
@Override
public void onStart()
{
}
@Override
public void onStop()
{
}
public static void warnVersion() public static void warnVersion()
{ {
@ -34,16 +24,21 @@ public class ServerInterface extends FreedomService
} }
} }
public void setOnlineMode(boolean mode) @Override
public void onStart()
{
}
@Override
public void onStop()
{ {
getServer().setOnlineMode(mode);
} }
public int purgeWhitelist() public int purgeWhitelist()
{ {
String[] whitelisted = getServer().getPlayerList().getWhitelisted(); String[] whitelisted = getServer().getPlayerList().getWhitelisted();
int size = whitelisted.length; int size = whitelisted.length;
for (EntityPlayer player : getServer().getPlayerList().players) for (EntityPlayer player : getServer().getPlayerList().getPlayers())
{ {
getServer().getPlayerList().getWhitelist().remove(player.getProfile()); getServer().getPlayerList().getWhitelist().remove(player.getProfile());
} }

View File

@ -30,9 +30,9 @@ public class ServerPing extends FreedomService
return; return;
} }
if (ConfigEntry.STAFF_ONLY_MODE.getBoolean()) if (ConfigEntry.ADMIN_ONLY_MODE.getBoolean())
{ {
event.setMotd(FUtil.colorize(ConfigEntry.SERVER_STAFFMODE_MOTD.getString())); event.setMotd(FUtil.colorize(ConfigEntry.SERVER_ADMINMODE_MOTD.getString()));
return; return;
} }
@ -73,5 +73,4 @@ public class ServerPing extends FreedomService
event.setMotd(motd.toString().trim()); event.setMotd(motd.toString().trim());
} }
}
}

View File

@ -3,6 +3,8 @@ package me.totalfreedom.totalfreedommod;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.util.Properties; import java.util.Properties;
import me.totalfreedom.totalfreedommod.admin.ActivityLog;
import me.totalfreedom.totalfreedommod.admin.AdminList;
import me.totalfreedom.totalfreedommod.banning.BanManager; import me.totalfreedom.totalfreedommod.banning.BanManager;
import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList; import me.totalfreedom.totalfreedommod.banning.IndefiniteBanList;
import me.totalfreedom.totalfreedommod.blocking.BlockBlocker; import me.totalfreedom.totalfreedommod.blocking.BlockBlocker;
@ -17,7 +19,6 @@ import me.totalfreedom.totalfreedommod.blocking.command.CommandBlocker;
import me.totalfreedom.totalfreedommod.bridge.BukkitTelnetBridge; import me.totalfreedom.totalfreedommod.bridge.BukkitTelnetBridge;
import me.totalfreedom.totalfreedommod.bridge.CoreProtectBridge; import me.totalfreedom.totalfreedommod.bridge.CoreProtectBridge;
import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge; import me.totalfreedom.totalfreedommod.bridge.EssentialsBridge;
import me.totalfreedom.totalfreedommod.bridge.FAWEBridge;
import me.totalfreedom.totalfreedommod.bridge.LibsDisguisesBridge; import me.totalfreedom.totalfreedommod.bridge.LibsDisguisesBridge;
import me.totalfreedom.totalfreedommod.bridge.TFGuildsBridge; import me.totalfreedom.totalfreedommod.bridge.TFGuildsBridge;
import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge; import me.totalfreedom.totalfreedommod.bridge.WorldEditBridge;
@ -27,7 +28,6 @@ import me.totalfreedom.totalfreedommod.command.CommandLoader;
import me.totalfreedom.totalfreedommod.config.MainConfig; import me.totalfreedom.totalfreedommod.config.MainConfig;
import me.totalfreedom.totalfreedommod.discord.Discord; import me.totalfreedom.totalfreedommod.discord.Discord;
import me.totalfreedom.totalfreedommod.freeze.Freezer; import me.totalfreedom.totalfreedommod.freeze.Freezer;
import me.totalfreedom.totalfreedommod.fun.CurseListener;
import me.totalfreedom.totalfreedommod.fun.ItemFun; import me.totalfreedom.totalfreedommod.fun.ItemFun;
import me.totalfreedom.totalfreedommod.fun.Jumppads; import me.totalfreedom.totalfreedommod.fun.Jumppads;
import me.totalfreedom.totalfreedommod.fun.Landminer; import me.totalfreedom.totalfreedommod.fun.Landminer;
@ -42,36 +42,29 @@ import me.totalfreedom.totalfreedommod.rank.RankManager;
import me.totalfreedom.totalfreedommod.shop.Shop; import me.totalfreedom.totalfreedommod.shop.Shop;
import me.totalfreedom.totalfreedommod.shop.Votifier; import me.totalfreedom.totalfreedommod.shop.Votifier;
import me.totalfreedom.totalfreedommod.sql.SQLite; import me.totalfreedom.totalfreedommod.sql.SQLite;
import me.totalfreedom.totalfreedommod.staff.ActivityLog;
import me.totalfreedom.totalfreedommod.staff.StaffList;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import me.totalfreedom.totalfreedommod.util.MethodTimer; import me.totalfreedom.totalfreedommod.util.MethodTimer;
import me.totalfreedom.totalfreedommod.world.CleanroomChunkGenerator; import me.totalfreedom.totalfreedommod.world.CleanroomChunkGenerator;
import me.totalfreedom.totalfreedommod.world.WorldManager; import me.totalfreedom.totalfreedommod.world.WorldManager;
import me.totalfreedom.totalfreedommod.world.WorldRestrictions; import me.totalfreedom.totalfreedommod.world.WorldRestrictions;
import org.bstats.Metrics; import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.generator.ChunkGenerator; import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.spigotmc.SpigotConfig; import org.spigotmc.SpigotConfig;
public class TotalFreedomMod extends JavaPlugin public class TotalFreedomMod extends JavaPlugin
{ {
private static TotalFreedomMod plugin;
public static TotalFreedomMod getPlugin()
{
return plugin;
}
public static final String CONFIG_FILENAME = "config.yml"; public static final String CONFIG_FILENAME = "config.yml";
// //
public static final BuildProperties build = new BuildProperties(); public static final BuildProperties build = new BuildProperties();
// //
public static String pluginName; public static String pluginName;
public static String pluginVersion; public static String pluginVersion;
private static TotalFreedomMod plugin;
// //
public MainConfig config; public MainConfig config;
public PermissionConfig permissions; public PermissionConfig permissions;
@ -82,10 +75,9 @@ public class TotalFreedomMod extends JavaPlugin
public CommandLoader cl; public CommandLoader cl;
// Services // Services
public ServerInterface si; public ServerInterface si;
public SavedFlags sf;
public WorldManager wm; public WorldManager wm;
public LogViewer lv; public LogViewer lv;
public StaffList sl; public AdminList al;
public ActivityLog acl; public ActivityLog acl;
public RankManager rm; public RankManager rm;
public CommandBlocker cb; public CommandBlocker cb;
@ -108,7 +100,6 @@ public class TotalFreedomMod extends JavaPlugin
public BanManager bm; public BanManager bm;
public IndefiniteBanList im; public IndefiniteBanList im;
public PermissionManager pem; public PermissionManager pem;
public Reddit rd;
public GameRuleHandler gr; public GameRuleHandler gr;
public CommandSpy cs; public CommandSpy cs;
public Cager ca; public Cager ca;
@ -123,7 +114,6 @@ public class TotalFreedomMod extends JavaPlugin
public Monitors mo; public Monitors mo;
public MovementValidator mv; public MovementValidator mv;
public ServerPing sp; public ServerPing sp;
public CurseListener cul;
public ItemFun it; public ItemFun it;
public Landminer lm; public Landminer lm;
public MP44 mp; public MP44 mp;
@ -136,8 +126,6 @@ public class TotalFreedomMod extends JavaPlugin
public Sitter st; public Sitter st;
public VanishHandler vh; public VanishHandler vh;
public Pterodactyl ptero; public Pterodactyl ptero;
//public HubWorldRestrictions hwr;
// //
// Bridges // Bridges
public BukkitTelnetBridge btb; public BukkitTelnetBridge btb;
@ -146,9 +134,25 @@ public class TotalFreedomMod extends JavaPlugin
public CoreProtectBridge cpb; public CoreProtectBridge cpb;
public TFGuildsBridge tfg; public TFGuildsBridge tfg;
public WorldEditBridge web; public WorldEditBridge web;
public FAWEBridge fab;
public WorldGuardBridge wgb; public WorldGuardBridge wgb;
public static TotalFreedomMod getPlugin()
{
return plugin;
}
public static TotalFreedomMod plugin()
{
for (Plugin plugin : Bukkit.getPluginManager().getPlugins())
{
if (plugin.getName().equalsIgnoreCase(pluginName))
{
return (TotalFreedomMod)plugin;
}
}
return null;
}
@Override @Override
public void onLoad() public void onLoad()
{ {
@ -182,7 +186,6 @@ public class TotalFreedomMod extends JavaPlugin
fsh = new FreedomServiceHandler(); fsh = new FreedomServiceHandler();
config = new MainConfig(); config = new MainConfig();
config.load();
if (FUtil.inDeveloperMode()) if (FUtil.inDeveloperMode())
{ {
@ -195,81 +198,13 @@ public class TotalFreedomMod extends JavaPlugin
BackupManager backups = new BackupManager(); BackupManager backups = new BackupManager();
backups.createAllBackups(); backups.createAllBackups();
permissions = new PermissionConfig(this); permissions = new PermissionConfig();
permissions.load(); permissions.load();
// Start services
si = new ServerInterface();
sf = new SavedFlags();
wm = new WorldManager();
lv = new LogViewer();
sql = new SQLite();
sl = new StaffList();
acl = new ActivityLog();
rm = new RankManager();
cb = new CommandBlocker();
eb = new EventBlocker();
bb = new BlockBlocker();
mb = new MobBlocker();
ib = new InteractBlocker();
pb = new PotionBlocker();
lp = new LoginProcess();
nu = new AntiNuke();
as = new AntiSpam();
wr = new WorldRestrictions();
pl = new PlayerList();
sh = new Shop();
vo = new Votifier();
an = new Announcer();
cm = new ChatManager();
dc = new Discord();
pul = new PunishmentList();
bm = new BanManager();
im = new IndefiniteBanList();
pem = new PermissionManager();
rd = new Reddit();
gr = new GameRuleHandler();
snp = new SignBlocker();
ew = new EntityWiper();
st = new Sitter();
vh = new VanishHandler();
ptero = new Pterodactyl();
// Single admin utils
cs = new CommandSpy();
ca = new Cager();
fm = new Freezer();
or = new Orbiter();
mu = new Muter();
ebl = new EditBlocker();
pbl = new PVPBlocker();
fo = new Fuckoff();
ak = new AutoKick();
ae = new AutoEject();
mo = new Monitors();
mv = new MovementValidator(); mv = new MovementValidator();
sp = new ServerPing(); sp = new ServerPing();
// Fun new Initializer();
cul = new CurseListener();
it = new ItemFun();
lm = new Landminer();
mp = new MP44();
jp = new Jumppads();
tr = new Trailer();
// HTTPD
hd = new HTTPDaemon();
// Start bridges
btb = new BukkitTelnetBridge();
cpb = new CoreProtectBridge();
esb = new EssentialsBridge();
ldb = new LibsDisguisesBridge();
tfg = new TFGuildsBridge();
web = new WorldEditBridge();
fab = new FAWEBridge();
wgb = new WorldGuardBridge();
fsh.startServices(); fsh.startServices();
@ -296,6 +231,12 @@ public class TotalFreedomMod extends JavaPlugin
FLog.info("Plugin disabled"); FLog.info("Plugin disabled");
} }
@Override
public ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, String id)
{
return new CleanroomChunkGenerator(id);
}
public static class BuildProperties public static class BuildProperties
{ {
public String author; public String author;
@ -338,21 +279,100 @@ public class TotalFreedomMod extends JavaPlugin
} }
} }
public static TotalFreedomMod plugin() /**
* This class is provided to please Codacy.
*/
private final class Initializer
{ {
for (Plugin plugin : Bukkit.getPluginManager().getPlugins()) public Initializer()
{ {
if (plugin.getName().equalsIgnoreCase(pluginName)) initServices();
{ initAdminUtils();
return (TotalFreedomMod)plugin; initBridges();
} initFun();
initHTTPD();
} }
return null;
}
@Override private void initServices()
public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) {
{ // Start services
return new CleanroomChunkGenerator(id); si = new ServerInterface();
wm = new WorldManager();
lv = new LogViewer();
sql = new SQLite();
al = new AdminList();
acl = new ActivityLog();
rm = new RankManager();
cb = new CommandBlocker();
eb = new EventBlocker();
bb = new BlockBlocker();
mb = new MobBlocker();
ib = new InteractBlocker();
pb = new PotionBlocker();
lp = new LoginProcess();
nu = new AntiNuke();
as = new AntiSpam();
wr = new WorldRestrictions();
pl = new PlayerList();
sh = new Shop();
vo = new Votifier();
an = new Announcer();
cm = new ChatManager();
dc = new Discord();
pul = new PunishmentList();
bm = new BanManager();
im = new IndefiniteBanList();
pem = new PermissionManager();
gr = new GameRuleHandler();
snp = new SignBlocker();
ew = new EntityWiper();
st = new Sitter();
vh = new VanishHandler();
ptero = new Pterodactyl();
}
private void initAdminUtils()
{
// Single admin utils
cs = new CommandSpy();
ca = new Cager();
fm = new Freezer();
or = new Orbiter();
mu = new Muter();
ebl = new EditBlocker();
pbl = new PVPBlocker();
fo = new Fuckoff();
ak = new AutoKick();
ae = new AutoEject();
mo = new Monitors();
}
private void initBridges()
{
// Start bridges
btb = new BukkitTelnetBridge();
cpb = new CoreProtectBridge();
esb = new EssentialsBridge();
ldb = new LibsDisguisesBridge();
tfg = new TFGuildsBridge();
web = new WorldEditBridge();
wgb = new WorldGuardBridge();
}
private void initFun()
{
// Fun
it = new ItemFun();
lm = new Landminer();
mp = new MP44();
jp = new Jumppads();
tr = new Trailer();
}
private void initHTTPD()
{
// HTTPD
hd = new HTTPDaemon();
}
} }
} }

View File

@ -31,7 +31,7 @@ public class VanishHandler extends FreedomService
for (Player p : server.getOnlinePlayers()) for (Player p : server.getOnlinePlayers())
{ {
if (!plugin.sl.isStaff(player) && plugin.sl.isVanished(p.getName())) if (!plugin.al.isAdmin(player) && plugin.al.isVanished(p.getName()))
{ {
player.hidePlayer(plugin, p); player.hidePlayer(plugin, p);
} }
@ -39,17 +39,17 @@ public class VanishHandler extends FreedomService
for (Player p : server.getOnlinePlayers()) for (Player p : server.getOnlinePlayers())
{ {
if (!plugin.sl.isStaff(p) && plugin.sl.isVanished(player.getName())) if (!plugin.al.isAdmin(p) && plugin.al.isVanished(player.getName()))
{ {
p.hidePlayer(plugin, player); p.hidePlayer(plugin, player);
} }
} }
if (plugin.sl.isVanished(player.getName())) if (plugin.al.isVanished(player.getName()))
{ {
plugin.esb.setVanished(player.getName(), true); plugin.esb.setVanished(player.getName(), true);
FLog.info(player.getName() + " joined while still vanished."); FLog.info(player.getName() + " joined while still vanished.");
plugin.sl.messageAllStaff(ChatColor.YELLOW + player.getName() + " has joined silently."); plugin.al.messageAllAdmins(ChatColor.YELLOW + player.getName() + " has joined silently.");
event.setJoinMessage(null); event.setJoinMessage(null);
new BukkitRunnable() new BukkitRunnable()
@ -57,7 +57,7 @@ public class VanishHandler extends FreedomService
@Override @Override
public void run() public void run()
{ {
if (!plugin.sl.isVanished(player.getName())) if (!plugin.al.isVanished(player.getName()))
{ {
this.cancel(); this.cancel();
} }
@ -73,11 +73,11 @@ public class VanishHandler extends FreedomService
{ {
Player player = event.getPlayer(); Player player = event.getPlayer();
if (plugin.sl.isVanished(player.getName())) if (plugin.al.isVanished(player.getName()))
{ {
event.setQuitMessage(null); event.setQuitMessage(null);
FLog.info(player.getName() + " left while still vanished."); FLog.info(player.getName() + " left while still vanished.");
plugin.sl.messageAllStaff(ChatColor.YELLOW + player.getName() + " has left silently."); plugin.al.messageAllAdmins(ChatColor.YELLOW + player.getName() + " has left silently.");
} }
} }
} }

View File

@ -1,8 +1,7 @@
package me.totalfreedom.totalfreedommod.staff; package me.totalfreedom.totalfreedommod.admin;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import java.util.Map; import java.util.Map;
import lombok.Getter;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.YamlConfig; import me.totalfreedom.totalfreedommod.config.YamlConfig;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
@ -20,7 +19,6 @@ public class ActivityLog extends FreedomService
public static final String FILENAME = "activitylog.yml"; public static final String FILENAME = "activitylog.yml";
@Getter
private final Map<String, ActivityLogEntry> allActivityLogs = Maps.newHashMap(); private final Map<String, ActivityLogEntry> allActivityLogs = Maps.newHashMap();
private final Map<String, ActivityLogEntry> nameTable = Maps.newHashMap(); private final Map<String, ActivityLogEntry> nameTable = Maps.newHashMap();
private final Map<String, ActivityLogEntry> ipTable = Maps.newHashMap(); private final Map<String, ActivityLogEntry> ipTable = Maps.newHashMap();
@ -32,6 +30,11 @@ public class ActivityLog extends FreedomService
this.config = new YamlConfig(plugin, FILENAME, true); this.config = new YamlConfig(plugin, FILENAME, true);
} }
public static String getFILENAME()
{
return FILENAME;
}
@Override @Override
public void onStart() public void onStart()
{ {
@ -56,7 +59,7 @@ public class ActivityLog extends FreedomService
ConfigurationSection section = config.getConfigurationSection(key); ConfigurationSection section = config.getConfigurationSection(key);
if (section == null) if (section == null)
{ {
logger.warning("Invalid activity log format: " + key); FLog.warning("Invalid activity log format: " + key);
continue; continue;
} }
@ -111,10 +114,10 @@ public class ActivityLog extends FreedomService
activityLog = getEntryByIp(ip); activityLog = getEntryByIp(ip);
if (activityLog != null) if (activityLog != null)
{ {
// Set the new username // Set the new username
activityLog.setName(player.getName()); activityLog.setName(player.getName());
save(); save();
updateTables(); updateTables();
} }
else else
{ {
@ -167,7 +170,7 @@ public class ActivityLog extends FreedomService
public void onPlayerJoin(PlayerJoinEvent event) public void onPlayerJoin(PlayerJoinEvent event)
{ {
Player player = event.getPlayer(); Player player = event.getPlayer();
if (plugin.sl.isStaff(player)) if (plugin.al.isAdmin(player))
{ {
getActivityLog(event.getPlayer()).addLogin(); getActivityLog(event.getPlayer()).addLogin();
plugin.acl.save(); plugin.acl.save();
@ -179,11 +182,31 @@ public class ActivityLog extends FreedomService
public void onPlayerQuit(PlayerQuitEvent event) public void onPlayerQuit(PlayerQuitEvent event)
{ {
Player player = event.getPlayer(); Player player = event.getPlayer();
if (plugin.sl.isStaff(player)) if (plugin.al.isAdmin(player))
{ {
getActivityLog(event.getPlayer()).addLogout(); getActivityLog(event.getPlayer()).addLogout();
plugin.acl.save(); plugin.acl.save();
plugin.acl.updateTables(); plugin.acl.updateTables();
} }
} }
}
public Map<String, ActivityLogEntry> getAllActivityLogs()
{
return allActivityLogs;
}
public Map<String, ActivityLogEntry> getNameTable()
{
return nameTable;
}
public Map<String, ActivityLogEntry> getIpTable()
{
return ipTable;
}
public YamlConfig getConfig()
{
return config;
}
}

View File

@ -1,11 +1,9 @@
package me.totalfreedom.totalfreedommod.staff; package me.totalfreedom.totalfreedommod.admin;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import java.time.Instant; import java.time.Instant;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import lombok.Getter;
import lombok.Setter;
import me.totalfreedom.totalfreedommod.config.IConfig; import me.totalfreedom.totalfreedommod.config.IConfig;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
@ -15,21 +13,12 @@ import org.bukkit.entity.Player;
public class ActivityLogEntry implements IConfig public class ActivityLogEntry implements IConfig
{ {
@Getter
private String configKey;
@Getter
@Setter
private String name;
@Getter
private final List<String> ips = Lists.newArrayList();
@Getter
@Setter
private List<String> timestamps = Lists.newArrayList();
@Getter
@Setter
private List<String> durations = Lists.newArrayList();
public static final String FILENAME = "activitylog.yml"; public static final String FILENAME = "activitylog.yml";
private final List<String> ips = Lists.newArrayList();
private final List<String> timestamps = Lists.newArrayList();
private final List<String> durations = Lists.newArrayList();
private String configKey;
private String name;
public ActivityLogEntry(Player player) public ActivityLogEntry(Player player)
{ {
@ -42,6 +31,11 @@ public class ActivityLogEntry implements IConfig
this.configKey = configKey; this.configKey = configKey;
} }
public static String getFILENAME()
{
return FILENAME;
}
public void loadFrom(Player player) public void loadFrom(Player player)
{ {
configKey = player.getName().toLowerCase(); configKey = player.getName().toLowerCase();
@ -75,9 +69,18 @@ public class ActivityLogEntry implements IConfig
Date currentTime = Date.from(Instant.now()); Date currentTime = Date.from(Instant.now());
timestamps.add("Login: " + FUtil.dateToString(currentTime)); timestamps.add("Login: " + FUtil.dateToString(currentTime));
} }
public void addLogout() public void addLogout()
{ {
String lastLoginString = timestamps.get(timestamps.size() - 1); // Fix of Array index out of bonds issue: FS-131
String lastLoginString;
if(timestamps.size() > 1)
{
lastLoginString = timestamps.get(timestamps.size() - 1);
}else
{
lastLoginString = timestamps.get(0);
}
Date currentTime = Date.from(Instant.now()); Date currentTime = Date.from(Instant.now());
timestamps.add("Logout: " + FUtil.dateToString(currentTime)); timestamps.add("Logout: " + FUtil.dateToString(currentTime));
lastLoginString = lastLoginString.replace("Login: ", ""); lastLoginString = lastLoginString.replace("Login: ", "");
@ -108,10 +111,7 @@ public class ActivityLogEntry implements IConfig
public void removeIp(String ip) public void removeIp(String ip)
{ {
if (ips.contains(ip)) ips.remove(ip);
{
ips.remove(ip);
}
} }
public void clearIPs() public void clearIPs()
@ -138,4 +138,39 @@ public class ActivityLogEntry implements IConfig
return configKey != null return configKey != null
&& name != null; && name != null;
} }
public String getConfigKey()
{
return configKey;
}
public void setConfigKey(String configKey)
{
this.configKey = configKey;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public List<String> getIps()
{
return ips;
}
public List<String> getTimestamps()
{
return timestamps;
}
public List<String> getDurations()
{
return durations;
}
} }

View File

@ -1,4 +1,4 @@
package me.totalfreedom.totalfreedommod.staff; package me.totalfreedom.totalfreedommod.admin;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
@ -7,55 +7,36 @@ import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import lombok.Getter;
import lombok.Setter;
import me.totalfreedom.totalfreedommod.LogViewer.LogsRegistrationMode; import me.totalfreedom.totalfreedommod.LogViewer.LogsRegistrationMode;
import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public class StaffMember public class Admin
{ {
@Getter
@Setter
private String name;
@Getter
private boolean active = true;
@Getter
@Setter
private Rank rank = Rank.ADMIN;
@Getter
private final List<String> ips = new ArrayList<>(); private final List<String> ips = new ArrayList<>();
@Getter private String name;
@Setter private boolean active = true;
private Rank rank = Rank.ADMIN;
private Date lastLogin = new Date(); private Date lastLogin = new Date();
@Getter
@Setter
private String loginMessage = null;
@Getter
@Setter
private Boolean commandSpy = false; private Boolean commandSpy = false;
@Getter
@Setter
private Boolean potionSpy = false; private Boolean potionSpy = false;
@Getter
@Setter
private String acFormat = null; private String acFormat = null;
@Getter
@Setter
private String pteroID = null; private String pteroID = null;
public StaffMember(Player player) public Admin(Player player)
{ {
this.name = player.getName(); this.name = player.getName();
this.ips.add(FUtil.getIp(player)); this.ips.add(FUtil.getIp(player));
} }
public StaffMember(ResultSet resultSet) public Admin(ResultSet resultSet)
{ {
try try
{ {
@ -65,7 +46,6 @@ public class StaffMember
this.ips.clear(); this.ips.clear();
this.ips.addAll(FUtil.stringToList(resultSet.getString("ips"))); this.ips.addAll(FUtil.stringToList(resultSet.getString("ips")));
this.lastLogin = new Date(resultSet.getLong("last_login")); this.lastLogin = new Date(resultSet.getLong("last_login"));
this.loginMessage = resultSet.getString("login_message");
this.commandSpy = resultSet.getBoolean("command_spy"); this.commandSpy = resultSet.getBoolean("command_spy");
this.potionSpy = resultSet.getBoolean("potion_spy"); this.potionSpy = resultSet.getBoolean("potion_spy");
this.acFormat = resultSet.getString("ac_format"); this.acFormat = resultSet.getString("ac_format");
@ -73,7 +53,7 @@ public class StaffMember
} }
catch (SQLException e) catch (SQLException e)
{ {
FLog.severe("Failed to load staff: " + e.getMessage()); FLog.severe("Failed to load admin: " + e.getMessage());
} }
} }
@ -82,10 +62,9 @@ public class StaffMember
{ {
final StringBuilder output = new StringBuilder(); final StringBuilder output = new StringBuilder();
output.append("Staff: ").append(name).append("\n") output.append("Admin: ").append(name).append("\n")
.append("- IPs: ").append(StringUtils.join(ips, ", ")).append("\n") .append("- IPs: ").append(StringUtils.join(ips, ", ")).append("\n")
.append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n") .append("- Last Login: ").append(FUtil.dateToString(lastLogin)).append("\n")
.append("- Custom Login Message: ").append(loginMessage).append("\n")
.append("- Rank: ").append(rank.getName()).append("\n") .append("- Rank: ").append(rank.getName()).append("\n")
.append("- Is Active: ").append(active).append("\n") .append("- Is Active: ").append(active).append("\n")
.append("- Potion Spy: ").append(potionSpy).append("\n") .append("- Potion Spy: ").append(potionSpy).append("\n")
@ -104,7 +83,6 @@ public class StaffMember
put("rank", rank.toString()); put("rank", rank.toString());
put("ips", FUtil.listToString(ips)); put("ips", FUtil.listToString(ips));
put("last_login", lastLogin.getTime()); put("last_login", lastLogin.getTime());
put("login_message", loginMessage);
put("command_spy", commandSpy); put("command_spy", commandSpy);
put("potion_spy", potionSpy); put("potion_spy", potionSpy);
put("ac_format", acFormat); put("ac_format", acFormat);
@ -113,11 +91,6 @@ public class StaffMember
return map; return map;
} }
public boolean hasLoginMessage()
{
return loginMessage != null && !loginMessage.isEmpty();
}
// Util IP methods // Util IP methods
public void addIp(String ip) public void addIp(String ip)
{ {
@ -137,10 +110,7 @@ public class StaffMember
public void removeIp(String ip) public void removeIp(String ip)
{ {
if (ips.contains(ip)) ips.remove(ip);
{
ips.remove(ip);
}
} }
public void clearIPs() public void clearIPs()
@ -148,11 +118,41 @@ public class StaffMember
ips.clear(); ips.clear();
} }
public boolean isValid()
{
return name != null
&& rank != null
&& !ips.isEmpty()
&& lastLogin != null;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public boolean isActive()
{
return active;
}
public void setActive(boolean active) public void setActive(boolean active)
{ {
this.active = active; this.active = active;
final TotalFreedomMod plugin = TotalFreedomMod.plugin(); final TotalFreedomMod plugin = TotalFreedomMod.getPlugin();
// Avoiding stupid NPE compiler warnings
if (plugin == null)
{
Bukkit.getLogger().severe("The plugin is null!! This is a major issue and WILL break the plugin!");
return;
}
if (!active) if (!active)
{ {
@ -168,11 +168,68 @@ public class StaffMember
} }
} }
public boolean isValid() public Rank getRank()
{ {
return name != null return rank;
&& rank != null }
&& !ips.isEmpty()
&& lastLogin != null; public void setRank(Rank rank)
{
this.rank = rank;
}
public List<String> getIps()
{
return ips;
}
public Date getLastLogin()
{
return lastLogin;
}
public void setLastLogin(Date lastLogin)
{
this.lastLogin = lastLogin;
}
public Boolean getCommandSpy()
{
return commandSpy;
}
public void setCommandSpy(Boolean commandSpy)
{
this.commandSpy = commandSpy;
}
public Boolean getPotionSpy()
{
return potionSpy;
}
public void setPotionSpy(Boolean potionSpy)
{
this.potionSpy = potionSpy;
}
public String getAcFormat()
{
return acFormat;
}
public void setAcFormat(String acFormat)
{
this.acFormat = acFormat;
}
public String getPteroID()
{
return pteroID;
}
public void setPteroID(String pteroID)
{
this.pteroID = pteroID;
} }
} }

View File

@ -0,0 +1,409 @@
package me.totalfreedom.totalfreedommod.admin;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class AdminList extends FreedomService
{
public static final List<String> vanished = new ArrayList<>();
public final Map<String, List<String>> verifiedNoAdmin = Maps.newHashMap();
private final Set<Admin> allAdmins = Sets.newHashSet(); // Includes disabled admins
// Only active admins below
private final Set<Admin> activeAdmins = Sets.newHashSet();
private final Map<String, Admin> nameTable = Maps.newHashMap();
private final Map<String, Admin> ipTable = Maps.newHashMap();
public static List<String> getVanished()
{
return vanished;
}
@Override
public void onStart()
{
load();
deactivateOldEntries(false);
}
@Override
public void onStop()
{
}
public void load()
{
allAdmins.clear();
try
{
ResultSet adminSet = plugin.sql.getAdminList();
{
while (adminSet.next())
{
Admin admin = new Admin(adminSet);
allAdmins.add(admin);
}
}
}
catch (SQLException e)
{
FLog.severe("Failed to load admin list: " + e.getMessage());
}
updateTables();
FLog.info("Loaded " + allAdmins.size() + " admins (" + nameTable.size() + " active, " + ipTable.size() + " IPs)");
}
public void messageAllAdmins(String message)
{
for (Player player : server.getOnlinePlayers())
{
if (isAdmin(player))
{
player.sendMessage(message);
}
}
}
public void potionSpyMessage(String message)
{
for (Player player : server.getOnlinePlayers())
{
Admin admin = getAdmin(player.getPlayer());
if (isAdmin(player) && admin.getPotionSpy())
{
player.sendMessage(message);
}
}
}
public synchronized boolean isAdminSync(CommandSender sender)
{
return isAdmin(sender);
}
public List<String> getActiveAdminNames()
{
List<String> names = new ArrayList();
for (Admin admin : activeAdmins)
{
names.add(admin.getName());
}
return names;
}
public boolean isAdmin(CommandSender sender)
{
if (!(sender instanceof Player))
{
return true;
}
Admin admin = getAdmin((Player)sender);
return admin != null && admin.isActive();
}
public boolean isAdmin(Player player)
{
if (player == null)
{
return true;
}
Admin admin = getAdmin(player);
return admin != null && admin.isActive();
}
public boolean isSeniorAdmin(CommandSender sender)
{
Admin admin = getAdmin(sender);
if (admin == null)
{
return false;
}
return admin.getRank().ordinal() >= Rank.SENIOR_ADMIN.ordinal();
}
public Admin getAdmin(CommandSender sender)
{
if (sender instanceof Player)
{
return getAdmin((Player)sender);
}
return getEntryByName(sender.getName());
}
public Admin getAdmin(Player player)
{
// Find admin
String ip = FUtil.getIp(player);
Admin admin = getEntryByName(player.getName());
// Admin by name
if (admin != null)
{
// Check if we're in online mode,
// Or the players IP is in the admin entry
if (Bukkit.getOnlineMode() || admin.getIps().contains(ip))
{
if (!admin.getIps().contains(ip))
{
// Add the new IP if we have to
admin.addIp(ip);
save(admin);
updateTables();
}
return admin;
}
}
// Admin by ip
admin = getEntryByIp(ip);
if (admin != null)
{
// Set the new username
String oldName = admin.getName();
admin.setName(player.getName());
plugin.sql.updateAdminName(oldName, admin.getName());
updateTables();
}
return null;
}
public Admin getEntryByName(String name)
{
return nameTable.get(name.toLowerCase());
}
public Admin getEntryByIp(String ip)
{
return ipTable.get(ip);
}
public Admin getEntryByIpFuzzy(String needleIp)
{
final Admin directAdmin = getEntryByIp(needleIp);
if (directAdmin != null)
{
return directAdmin;
}
for (String ip : ipTable.keySet())
{
if (FUtil.fuzzyIpMatch(needleIp, ip, 3))
{
return ipTable.get(ip);
}
}
return null;
}
public void updateLastLogin(Player player)
{
final Admin admin = getAdmin(player);
if (admin == null)
{
return;
}
admin.setLastLogin(new Date());
admin.setName(player.getName());
save(admin);
}
public boolean isAdminImpostor(Player player)
{
return getEntryByName(player.getName()) != null && !isAdmin(player) && !isVerifiedAdmin(player);
}
public boolean isVerifiedAdmin(Player player)
{
return verifiedNoAdmin.containsKey(player.getName()) && verifiedNoAdmin.get(player.getName()).contains(FUtil.getIp(player));
}
public boolean isIdentityMatched(Player player)
{
if (Bukkit.getOnlineMode())
{
return true;
}
Admin admin = getAdmin(player);
return admin != null && admin.getName().equalsIgnoreCase(player.getName());
}
public boolean addAdmin(Admin admin)
{
if (!admin.isValid())
{
FLog.warning("Could not add admin: " + admin.getName() + ". Admin is missing details!");
return false;
}
// Store admin, update views
allAdmins.add(admin);
updateTables();
// Save admin
plugin.sql.addAdmin(admin);
return true;
}
public boolean removeAdmin(Admin admin)
{
if (admin.getRank().isAtLeast(Rank.ADMIN))
{
if (plugin.btb != null)
{
plugin.btb.killTelnetSessions(admin.getName());
}
}
// Remove admin, update views
if (!allAdmins.remove(admin))
{
return false;
}
updateTables();
// Unsave admin
plugin.sql.removeAdmin(admin);
return true;
}
public void updateTables()
{
activeAdmins.clear();
nameTable.clear();
ipTable.clear();
for (Admin admin : allAdmins)
{
if (!admin.isActive())
{
continue;
}
activeAdmins.add(admin);
nameTable.put(admin.getName().toLowerCase(), admin);
for (String ip : admin.getIps())
{
ipTable.put(ip, admin);
}
}
}
public Set<String> getAdminNames()
{
return nameTable.keySet();
}
public Set<String> getAdminIps()
{
return ipTable.keySet();
}
public void save(Admin admin)
{
try
{
ResultSet currentSave = plugin.sql.getAdminByName(admin.getName());
for (Map.Entry<String, Object> entry : admin.toSQLStorable().entrySet())
{
Object storedValue = plugin.sql.getValue(currentSave, entry.getKey(), entry.getValue());
if (storedValue != null && !storedValue.equals(entry.getValue()) || storedValue == null && entry.getValue() != null || entry.getValue() == null)
{
plugin.sql.setAdminValue(admin, entry.getKey(), entry.getValue());
}
}
}
catch (SQLException e)
{
FLog.severe("Failed to save admin: " + e.getMessage());
}
}
public void deactivateOldEntries(boolean verbose)
{
for (Admin admin : allAdmins)
{
if (!admin.isActive() || admin.getRank().isAtLeast(Rank.SENIOR_ADMIN))
{
continue;
}
final Date lastLogin = admin.getLastLogin();
final long lastLoginHours = TimeUnit.HOURS.convert(new Date().getTime() - lastLogin.getTime(), TimeUnit.MILLISECONDS);
if (lastLoginHours < ConfigEntry.ADMINLIST_CLEAN_THESHOLD_HOURS.getInteger())
{
continue;
}
if (verbose)
{
FUtil.adminAction("TotalFreedomMod", "Deactivating admin " + admin.getName() + ", inactive for " + lastLoginHours + " hours", true);
}
admin.setActive(false);
save(admin);
}
updateTables();
}
public boolean isVanished(String player)
{
return vanished.contains(player);
}
public Set<Admin> getAllAdmins()
{
return allAdmins;
}
public Set<Admin> getActiveAdmins()
{
return activeAdmins;
}
public Map<String, Admin> getNameTable()
{
return nameTable;
}
public Map<String, Admin> getIpTable()
{
return ipTable;
}
public Map<String, List<String>> getVerifiedNoAdmin()
{
return verifiedNoAdmin;
}
}

View File

@ -4,15 +4,12 @@ import com.google.common.collect.Lists;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -22,27 +19,19 @@ import org.bukkit.entity.Player;
public class Ban public class Ban
{ {
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z"); public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
@Getter
@Setter
private String username = null;
@Getter
@Setter
private UUID uuid = null;
@Getter
private final List<String> ips = Lists.newArrayList(); private final List<String> ips = Lists.newArrayList();
@Getter private String username = null;
@Setter private UUID uuid = null;
private String by = null; private String by = null;
@Getter
@Setter
private Date at = null; private Date at = null;
@Getter
@Setter
private String reason = null; // Unformatted, &[0-9,a-f] instead of ChatColor private String reason = null; // Unformatted, &[0-9,a-f] instead of ChatColor
@Getter
@Setter
private long expiryUnix = -1; private long expiryUnix = -1;
public Ban() public Ban()
@ -53,7 +42,7 @@ public class Ban
{ {
this(username, this(username,
uuid, uuid,
Arrays.asList(ip), Collections.singletonList(ip),
by, by,
at, at,
expire, expire,
@ -88,7 +77,7 @@ public class Ban
public static Ban forPlayerIp(Player player, CommandSender by, Date expiry, String reason) public static Ban forPlayerIp(Player player, CommandSender by, Date expiry, String reason)
{ {
return new Ban(null, null, Arrays.asList(FUtil.getIp(player)), by.getName(), Date.from(Instant.now()), expiry, reason); return new Ban(null, null, Collections.singletonList(FUtil.getIp(player)), by.getName(), Date.from(Instant.now()), expiry, reason);
} }
public static Ban forPlayerIp(String ip, CommandSender by, Date expiry, String reason) public static Ban forPlayerIp(String ip, CommandSender by, Date expiry, String reason)
@ -143,6 +132,11 @@ public class Ban
reason); reason);
} }
public static SimpleDateFormat getDateFormat()
{
return DATE_FORMAT;
}
public boolean hasUsername() public boolean hasUsername()
{ {
return username != null && !username.isEmpty(); return username != null && !username.isEmpty();
@ -175,7 +169,7 @@ public class Ban
public boolean isExpired() public boolean isExpired()
{ {
return hasExpiry() && expiryUnix < FUtil.getUnixTime(); return hasExpiry() && FUtil.getUnixDate(expiryUnix).before(new Date(FUtil.getUnixTime()));
} }
public String bakeKickMessage() public String bakeKickMessage()
@ -256,17 +250,74 @@ public class Ban
private void dedupeIps() private void dedupeIps()
{ {
Set<String> uniqueIps = new HashSet<>(); Set<String> uniqueIps = new HashSet<>();
Iterator<String> it = ips.iterator(); //Fancy Collections.removeIf lets you do all that while loop work in one lambda.
while (it.hasNext()) ips.removeIf(s -> !uniqueIps.add(s));
{
if (!uniqueIps.add(it.next()))
{
it.remove();
}
}
} }
}
public List<String> getIps()
{
return ips;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public UUID getUuid()
{
return uuid;
}
public void setUuid(UUID uuid)
{
this.uuid = uuid;
}
public String getBy()
{
return by;
}
public void setBy(String by)
{
this.by = by;
}
public Date getAt()
{
return at;
}
public void setAt(Date at)
{
this.at = at;
}
public String getReason()
{
return reason;
}
public void setReason(String reason)
{
this.reason = reason;
}
public long getExpiryUnix()
{
return expiryUnix;
}
public void setExpiryUnix(long expiryUnix)
{
this.expiryUnix = expiryUnix;
}
}

View File

@ -15,7 +15,6 @@ import java.util.Set;
import java.util.UUID; import java.util.UUID;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -74,7 +73,7 @@ public class BanManager extends FreedomService
// Load unbannable usernames // Load unbannable usernames
unbannableUsernames.clear(); unbannableUsernames.clear();
unbannableUsernames.addAll((Collection<? extends String>)ConfigEntry.FAMOUS_PLAYERS.getList()); unbannableUsernames.addAll(ConfigEntry.FAMOUS_PLAYERS.getStringList());
FLog.info("Loaded " + unbannableUsernames.size() + " unbannable usernames."); FLog.info("Loaded " + unbannableUsernames.size() + " unbannable usernames.");
} }
@ -190,7 +189,7 @@ public class BanManager extends FreedomService
return getByUsername(username) != null; return getByUsername(username) != null;
} }
public boolean addBan(Ban ban) public void addBan(Ban ban)
{ {
if (ban.getUsername() != null && getByUsername(ban.getUsername()) != null) if (ban.getUsername() != null && getByUsername(ban.getUsername()) != null)
{ {
@ -213,22 +212,18 @@ public class BanManager extends FreedomService
{ {
plugin.sql.addBan(ban); plugin.sql.addBan(ban);
updateViews(); updateViews();
return true;
} }
return false;
} }
public boolean removeBan(Ban ban) public void removeBan(Ban ban)
{ {
if (bans.remove(ban)) if (bans.remove(ban))
{ {
plugin.sql.removeBan(ban); plugin.sql.removeBan(ban);
updateViews(); updateViews();
return true;
} }
return false;
} }
public int purge() public int purge()
@ -269,9 +264,8 @@ public class BanManager extends FreedomService
public void onPlayerJoin(PlayerJoinEvent event) public void onPlayerJoin(PlayerJoinEvent event)
{ {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final PlayerData data = plugin.pl.getData(player);
if (!plugin.sl.isStaff(player)) if (!plugin.al.isAdmin(player))
{ {
return; return;
} }
@ -328,5 +322,4 @@ public class BanManager extends FreedomService
} }
} }
} }
}
}

View File

@ -3,25 +3,15 @@ package me.totalfreedom.totalfreedommod.banning;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import lombok.Getter;
import lombok.Setter;
import me.totalfreedom.totalfreedommod.config.IConfig; import me.totalfreedom.totalfreedommod.config.IConfig;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
public class IndefiniteBan implements IConfig public class IndefiniteBan implements IConfig
{ {
@Getter
@Setter
private String username = null;
@Getter
@Setter
private UUID uuid = null;
@Getter
private final List<String> ips = Lists.newArrayList(); private final List<String> ips = Lists.newArrayList();
@Getter private String username = null;
@Setter private UUID uuid = null;
private String reason = null; private String reason = null;
public IndefiniteBan() public IndefiniteBan()
@ -53,6 +43,7 @@ public class IndefiniteBan implements IConfig
@Override @Override
public void saveTo(ConfigurationSection cs) public void saveTo(ConfigurationSection cs)
{ {
// The indefinite ban list is only intended to be modified manually. It is not intended to save.
} }
@Override @Override
@ -60,4 +51,39 @@ public class IndefiniteBan implements IConfig
{ {
return username != null; return username != null;
} }
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public UUID getUuid()
{
return uuid;
}
public void setUuid(UUID uuid)
{
this.uuid = uuid;
}
public List<String> getIps()
{
return ips;
}
public String getReason()
{
return reason;
}
public void setReason(String reason)
{
this.reason = reason;
}
}

View File

@ -4,7 +4,6 @@ import com.google.common.base.Strings;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import lombok.Getter;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.config.YamlConfig; import me.totalfreedom.totalfreedommod.config.YamlConfig;
@ -21,18 +20,23 @@ public class IndefiniteBanList extends FreedomService
public static final String CONFIG_FILENAME = "indefinitebans.yml"; public static final String CONFIG_FILENAME = "indefinitebans.yml";
@Getter
private final Set<IndefiniteBan> indefBans = Sets.newHashSet(); private final Set<IndefiniteBan> indefBans = Sets.newHashSet();
@Getter
private int nameBanCount = 0; private int nameBanCount = 0;
@Getter
private int uuidBanCount = 0; private int uuidBanCount = 0;
@Getter
private int ipBanCount = 0; private int ipBanCount = 0;
public static String getConfigFilename()
{
return CONFIG_FILENAME;
}
@Override @Override
public void onStart() public void onStart()
{ {
@ -51,6 +55,7 @@ public class IndefiniteBanList extends FreedomService
IndefiniteBan indefBan = new IndefiniteBan(); IndefiniteBan indefBan = new IndefiniteBan();
ConfigurationSection cs = config.getConfigurationSection(name); ConfigurationSection cs = config.getConfigurationSection(name);
assert cs != null;
indefBan.loadFrom(cs); indefBan.loadFrom(cs);
if (!indefBan.isValid()) if (!indefBan.isValid())
@ -84,7 +89,7 @@ public class IndefiniteBanList extends FreedomService
for (IndefiniteBan indefBan : indefBans) for (IndefiniteBan indefBan : indefBans)
{ {
if (username.toLowerCase().equals(indefBan.getUsername().toLowerCase())) if (username.equalsIgnoreCase(indefBan.getUsername()))
{ {
bannedBy = "username"; bannedBy = "username";
ban = indefBan; ban = indefBan;
@ -137,4 +142,24 @@ public class IndefiniteBanList extends FreedomService
ipBanCount += indefBan.getIps().size(); ipBanCount += indefBan.getIps().size();
} }
} }
}
public Set<IndefiniteBan> getIndefBans()
{
return indefBans;
}
public int getNameBanCount()
{
return nameBanCount;
}
public int getUuidBanCount()
{
return uuidBanCount;
}
public int getIpBanCount()
{
return ipBanCount;
}
}

View File

@ -29,6 +29,7 @@ public class BlockBlocker extends FreedomService
{ {
} }
@SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onBlockPlace(BlockPlaceEvent event) public void onBlockPlace(BlockPlaceEvent event)
{ {
@ -132,17 +133,18 @@ public class BlockBlocker extends FreedomService
case PLAYER_HEAD: case PLAYER_HEAD:
case PLAYER_WALL_HEAD: case PLAYER_WALL_HEAD:
{ {
Skull skull = (Skull) event.getBlockPlaced().getState(); Skull skull = (Skull)event.getBlockPlaced().getState();
if (skull.getOwner() != null) if (skull.getOwner() != null)
{ {
if (skull.getOwner().contains("\u00A7")) if (skull.getOwner().contains("\u00A7"))
{ {
skull.setOwner(skull.getOwner().replace("\u00A7", "")); skull.setOwner(skull.getOwner().replace("\u00A7", ""));
SkullMeta meta = (SkullMeta) event.getItemInHand().getItemMeta(); SkullMeta meta = (SkullMeta)event.getItemInHand().getItemMeta();
if (meta != null) if (meta != null)
{ {
ItemStack newHead = new ItemStack(Material.PLAYER_HEAD, 1); ItemStack newHead = new ItemStack(Material.PLAYER_HEAD, 1);
ItemMeta headMeta = newHead.getItemMeta(); ItemMeta headMeta = newHead.getItemMeta();
assert headMeta != null;
headMeta.setDisplayName(ChatColor.YELLOW + "C-sectioned Head"); headMeta.setDisplayName(ChatColor.YELLOW + "C-sectioned Head");
newHead.setItemMeta(headMeta); newHead.setItemMeta(headMeta);
player.getInventory().setItem(player.getInventory().getHeldItemSlot(), newHead); player.getInventory().setItem(player.getInventory().getHeldItemSlot(), newHead);
@ -169,18 +171,23 @@ public class BlockBlocker extends FreedomService
} }
break; break;
} }
default:
{
// Do nothing
break;
}
} }
if (Groups.BANNERS.contains(event.getBlockPlaced().getType())) if (Groups.BANNERS.contains(event.getBlockPlaced().getType()))
{ {
Banner banner = (Banner) event.getBlockPlaced().getState(); Banner banner = (Banner)event.getBlockPlaced().getState();
List<Pattern> patterns = banner.getPatterns();; List<Pattern> patterns = banner.getPatterns();
if (patterns.size() >= 2) if (patterns.size() >= 2)
{ {
banner.setPatterns(patterns.subList(0, 2)); banner.setPatterns(patterns.subList(0, 2));
player.sendMessage(ChatColor.GRAY + "Your banner had too many patterns on it, so some were removed."); player.sendMessage(ChatColor.GRAY + "Your banner had too many patterns on it, so some were removed.");
} }
} }
} }
} }

View File

@ -1,62 +1,61 @@
package me.totalfreedom.totalfreedommod.blocking; package me.totalfreedom.totalfreedommod.blocking;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.util.FSync; import me.totalfreedom.totalfreedommod.util.FSync;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
public class EditBlocker extends FreedomService public class EditBlocker extends FreedomService
{ {
@Override @Override
public void onStart() public void onStart()
{ {
} }
@Override @Override
public void onStop() public void onStop()
{ {
} }
@EventHandler(priority = EventPriority.LOW) @EventHandler(priority = EventPriority.LOW)
public void onBlockPlace(BlockPlaceEvent event) public void onBlockPlace(BlockPlaceEvent event)
{ {
FPlayer fPlayer = plugin.pl.getPlayerSync(event.getPlayer()); FPlayer fPlayer = plugin.pl.getPlayerSync(event.getPlayer());
if (!fPlayer.isEditBlocked()) if (!fPlayer.isEditBlocked())
{ {
return; return;
} }
if (plugin.sl.isStaffSync(event.getPlayer())) if (plugin.al.isAdminSync(event.getPlayer()))
{ {
fPlayer.setEditBlocked(false); fPlayer.setEditBlocked(false);
return; return;
} }
FSync.playerMsg(event.getPlayer(), ChatColor.RED + "Your ability to place blocks has been disabled!"); FSync.playerMsg(event.getPlayer(), ChatColor.RED + "Your ability to place blocks has been disabled!");
event.setCancelled(true); event.setCancelled(true);
} }
@EventHandler(priority = EventPriority.LOW) @EventHandler(priority = EventPriority.LOW)
public void onBlockBreak(BlockBreakEvent event) public void onBlockBreak(BlockBreakEvent event)
{ {
FPlayer fPlayer = plugin.pl.getPlayerSync(event.getPlayer()); FPlayer fPlayer = plugin.pl.getPlayerSync(event.getPlayer());
if (!fPlayer.isEditBlocked()) if (!fPlayer.isEditBlocked())
{ {
return; return;
} }
if (plugin.sl.isStaffSync(event.getPlayer())) if (plugin.al.isAdminSync(event.getPlayer()))
{ {
fPlayer.setEditBlocked(false); fPlayer.setEditBlocked(false);
return; return;
} }
FSync.playerMsg(event.getPlayer(), ChatColor.RED + "Your ability to destroy blocks has been disabled!"); FSync.playerMsg(event.getPlayer(), ChatColor.RED + "Your ability to destroy blocks has been disabled!");
event.setCancelled(true); event.setCancelled(true);
} }
}
}

View File

@ -3,6 +3,7 @@ package me.totalfreedom.totalfreedommod.blocking;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Objects;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -13,6 +14,7 @@ import org.bukkit.attribute.AttributeModifier;
import org.bukkit.block.data.AnaloguePowerable; import org.bukkit.block.data.AnaloguePowerable;
import org.bukkit.block.data.Powerable; import org.bukkit.block.data.Powerable;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.FallingBlock;
import org.bukkit.entity.Tameable; import org.bukkit.entity.Tameable;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -24,12 +26,12 @@ import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPhysicsEvent; import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.BlockPistonExtendEvent; import org.bukkit.event.block.BlockPistonExtendEvent;
import org.bukkit.event.block.BlockPistonRetractEvent; import org.bukkit.event.block.BlockPistonRetractEvent;
import org.bukkit.event.block.BlockRedstoneEvent;
import org.bukkit.event.block.LeavesDecayEvent; import org.bukkit.event.block.LeavesDecayEvent;
import org.bukkit.event.entity.EntityCombustEvent; import org.bukkit.event.entity.EntityCombustEvent;
import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntitySpawnEvent;
import org.bukkit.event.entity.ExplosionPrimeEvent; import org.bukkit.event.entity.ExplosionPrimeEvent;
import org.bukkit.event.entity.FireworkExplodeEvent; import org.bukkit.event.entity.FireworkExplodeEvent;
import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.entity.PlayerDeathEvent;
@ -38,6 +40,20 @@ import org.bukkit.event.player.PlayerRespawnEvent;
public class EventBlocker extends FreedomService public class EventBlocker extends FreedomService
{ {
/**
* /@EventHandler(priority = EventPriority.HIGH)
* /public void onBlockRedstone(BlockRedstoneEvent event)
* /{
* / if (!ConfigEntry.ALLOW_REDSTONE.getBoolean())
* / {
* / event.setNewCurrent(0);
* / }
* /}
**/
// TODO: Revert back to old redstone block system when (or if) it is fixed in Bukkit, Spigot or Paper.
private final ArrayList<Material> redstoneBlocks = new ArrayList<>(Arrays.asList(Material.REDSTONE, Material.DISPENSER, Material.DROPPER, Material.REDSTONE_LAMP));
@Override @Override
public void onStart() public void onStart()
{ {
@ -120,16 +136,11 @@ public class EventBlocker extends FreedomService
@EventHandler(priority = EventPriority.HIGH) @EventHandler(priority = EventPriority.HIGH)
public void onEntityDamage(EntityDamageEvent event) public void onEntityDamage(EntityDamageEvent event)
{ {
switch (event.getCause()) if ((event.getCause() == EntityDamageEvent.DamageCause.LAVA)
&& !ConfigEntry.ALLOW_LAVA_DAMAGE.getBoolean())
{ {
case LAVA: event.setCancelled(true);
{ return;
if (!ConfigEntry.ALLOW_LAVA_DAMAGE.getBoolean())
{
event.setCancelled(true);
return;
}
}
} }
if (ConfigEntry.ENABLE_PET_PROTECT.getBoolean()) if (ConfigEntry.ENABLE_PET_PROTECT.getBoolean())
@ -148,7 +159,7 @@ public class EventBlocker extends FreedomService
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)
public void onPlayerDropItem(PlayerDropItemEvent event) public void onPlayerDropItem(PlayerDropItemEvent event)
{ {
if (!plugin.sl.isStaff(event.getPlayer())) if (!plugin.al.isAdmin(event.getPlayer()))
{ {
event.setCancelled(true); event.setCancelled(true);
} }
@ -203,24 +214,22 @@ public class EventBlocker extends FreedomService
} }
} }
//@EventHandler(priority = EventPriority.HIGH) @EventHandler
public void onBlockRedstone(BlockRedstoneEvent event) public void onEntitySpawn(EntitySpawnEvent event)
{ {
if (!ConfigEntry.ALLOW_REDSTONE.getBoolean()) if (!ConfigEntry.ALLOW_GRAVITY.getBoolean() && event.getEntity() instanceof FallingBlock)
{ {
event.setNewCurrent(0); event.setCancelled(true);
} }
} }
// TODO: Revert back to old redstone block system when (or if) it is fixed in Bukkit, Spigot or Paper.
private ArrayList<Material> redstoneBlocks = new ArrayList<>(Arrays.asList(Material.REDSTONE, Material.DISPENSER, Material.DROPPER, Material.REDSTONE_LAMP));
@EventHandler @EventHandler
public void onBlockPhysics(BlockPhysicsEvent event) public void onBlockPhysics(BlockPhysicsEvent event)
{ {
if (!ConfigEntry.ALLOW_REDSTONE.getBoolean()) if (!ConfigEntry.ALLOW_REDSTONE.getBoolean())
{ {
// Check if the block is involved with redstone. // Check if the block is involved with redstone.
if(event.getBlock().getBlockData() instanceof AnaloguePowerable || event.getBlock().getBlockData() instanceof Powerable || redstoneBlocks.contains(event.getBlock().getType())) if (event.getBlock().getBlockData() instanceof AnaloguePowerable || event.getBlock().getBlockData() instanceof Powerable || redstoneBlocks.contains(event.getBlock().getType()))
{ {
event.setCancelled(true); event.setCancelled(true);
} }
@ -230,15 +239,16 @@ public class EventBlocker extends FreedomService
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)
public void onPlayerRespawn(PlayerRespawnEvent event) public void onPlayerRespawn(PlayerRespawnEvent event)
{ {
double maxHealth = event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue(); double maxHealth = Objects.requireNonNull(event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH)).getValue();
if (maxHealth < 1) if (maxHealth < 1)
{ {
for (AttributeModifier attributeModifier : event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getModifiers()) for (AttributeModifier attributeModifier : Objects.requireNonNull(event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH)).getModifiers())
{ {
event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).removeModifier(attributeModifier); Objects.requireNonNull(event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH)).removeModifier(attributeModifier);
} }
} }
} }
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)
public void onBlockDispense(BlockDispenseEvent event) public void onBlockDispense(BlockDispenseEvent event)
{ {

View File

@ -36,10 +36,9 @@ public class InteractBlocker extends FreedomService
break; break;
} }
case LEFT_CLICK_AIR: default:
case LEFT_CLICK_BLOCK:
{ {
// // Do nothing
break; break;
} }
} }
@ -90,7 +89,7 @@ public class InteractBlocker extends FreedomService
{ {
case WATER_BUCKET: case WATER_BUCKET:
{ {
if (plugin.sl.isStaff(player) || ConfigEntry.ALLOW_WATER_PLACE.getBoolean()) if (plugin.al.isAdmin(player) || ConfigEntry.ALLOW_WATER_PLACE.getBoolean())
{ {
break; break;
} }
@ -103,7 +102,7 @@ public class InteractBlocker extends FreedomService
case LAVA_BUCKET: case LAVA_BUCKET:
{ {
if (plugin.sl.isStaff(player) || ConfigEntry.ALLOW_LAVA_PLACE.getBoolean()) if (plugin.al.isAdmin(player) || ConfigEntry.ALLOW_LAVA_PLACE.getBoolean())
{ {
break; break;
} }
@ -126,7 +125,7 @@ public class InteractBlocker extends FreedomService
event.setCancelled(true); event.setCancelled(true);
break; break;
} }
case ARMOR_STAND: case ARMOR_STAND:
{ {
if (ConfigEntry.ALLOW_ARMOR_STANDS.getBoolean()) if (ConfigEntry.ALLOW_ARMOR_STANDS.getBoolean())
@ -158,6 +157,11 @@ public class InteractBlocker extends FreedomService
event.setCancelled(true); event.setCancelled(true);
break; break;
} }
default:
{
// Do nothing
break;
}
} }
} }
} }

View File

@ -1,5 +1,6 @@
package me.totalfreedom.totalfreedommod.blocking; package me.totalfreedom.totalfreedommod.blocking;
import java.util.Objects;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import org.bukkit.attribute.Attributable; import org.bukkit.attribute.Attributable;
@ -42,13 +43,13 @@ public class MobBlocker extends FreedomService
Entity entity = e.getEntity(); Entity entity = e.getEntity();
if (entity instanceof Attributable) if (entity instanceof Attributable)
{ {
if (((Attributable)entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE).getBaseValue() > 255.0) if (Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE)).getBaseValue() > 255.0)
{ {
((Attributable)entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE).setBaseValue(255.0); Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_FOLLOW_RANGE)).setBaseValue(255.0);
} }
if (((Attributable)entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).getBaseValue() > 10.0) if (Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED)).getBaseValue() > 10.0)
{ {
((Attributable)entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(10.0); Objects.requireNonNull(((Attributable)entity).getAttribute(Attribute.GENERIC_MOVEMENT_SPEED)).setBaseValue(10.0);
} }
} }
} }
@ -117,7 +118,7 @@ public class MobBlocker extends FreedomService
} }
int mobcount = 0; int mobcount = 0;
for (Entity entity : event.getLocation().getWorld().getLivingEntities()) for (Entity entity : Objects.requireNonNull(event.getLocation().getWorld()).getLivingEntities())
{ {
if (!(entity instanceof HumanEntity) && entity instanceof LivingEntity) if (!(entity instanceof HumanEntity) && entity instanceof LivingEntity)
{ {
@ -130,4 +131,4 @@ public class MobBlocker extends FreedomService
event.setCancelled(true); event.setCancelled(true);
} }
} }
} }

View File

@ -70,7 +70,7 @@ public class PVPBlocker extends FreedomService
} }
} }
if (player != null & !plugin.sl.isStaff(player)) if (player != null & !plugin.al.isAdmin(player))
{ {
if (player.getGameMode() == GameMode.CREATIVE) if (player.getGameMode() == GameMode.CREATIVE)
{ {

View File

@ -82,5 +82,4 @@ public class PotionBlocker extends FreedomService
} }
return false; return false;
} }
}
}

View File

@ -1,10 +1,10 @@
package me.totalfreedom.totalfreedommod.blocking; package me.totalfreedom.totalfreedommod.blocking;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import net.minecraft.server.v1_16_R2.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Tag; import org.bukkit.Tag;
import org.bukkit.craftbukkit.v1_16_R2.inventory.CraftItemStack; import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -35,8 +35,9 @@ public class SignBlocker extends FreedomService
if (Tag.SIGNS.getValues().contains(event.getBlock().getType())) if (Tag.SIGNS.getValues().contains(event.getBlock().getType()))
{ {
ItemStack sign = event.getItemInHand(); ItemStack sign = event.getItemInHand();
net.minecraft.server.v1_16_R2.ItemStack nmsSign = CraftItemStack.asNMSCopy(sign); net.minecraft.world.item.ItemStack nmsSign = CraftItemStack.asNMSCopy(sign);
NBTTagCompound compound = (nmsSign.hasTag()) ? nmsSign.getTag() : new NBTTagCompound(); NBTTagCompound compound = (nmsSign.hasTag()) ? nmsSign.getTag() : new NBTTagCompound();
assert compound != null;
NBTTagCompound bet = compound.getCompound("BlockEntityTag"); NBTTagCompound bet = compound.getCompound("BlockEntityTag");
String line1 = bet.getString("Text1"); String line1 = bet.getString("Text1");
String line2 = bet.getString("Text2"); String line2 = bet.getString("Text2");
@ -63,4 +64,4 @@ public class SignBlocker extends FreedomService
event.setCancelled(true); event.setCancelled(true);
} }
} }
} }

View File

@ -30,6 +30,24 @@ public class CommandBlocker extends FreedomService
private final Map<String, CommandBlockerEntry> entryList = Maps.newHashMap(); private final Map<String, CommandBlockerEntry> entryList = Maps.newHashMap();
private final List<String> unknownCommands = Lists.newArrayList(); private final List<String> unknownCommands = Lists.newArrayList();
public static CommandMap getCommandMap()
{
try
{
SimplePluginManager simplePluginManager = (SimplePluginManager)Bukkit.getServer().getPluginManager();
Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap");
commandMapField.setAccessible(true);
return (SimpleCommandMap)commandMapField.get(simplePluginManager);
}
catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e)
{
FLog.severe("Failed to get command map field (" + e.getMessage() + ")");
}
return null;
}
@Override @Override
public void onStart() public void onStart()
{ {
@ -42,25 +60,6 @@ public class CommandBlocker extends FreedomService
entryList.clear(); entryList.clear();
} }
public static CommandMap getCommandMap()
{
try
{
SimplePluginManager simplePluginManager = (SimplePluginManager) Bukkit.getServer().getPluginManager();
Field commandMapField = SimplePluginManager.class.getDeclaredField("commandMap");
commandMapField.setAccessible(true);
SimpleCommandMap simpleCommandMap = (SimpleCommandMap) commandMapField.get(simplePluginManager);
return simpleCommandMap;
}
catch (NoSuchFieldException | IllegalArgumentException | IllegalAccessException e)
{
FLog.severe("Failed to get command map field (" + e.getMessage() + ")");
}
return null;
}
public void load() public void load()
{ {
entryList.clear(); entryList.clear();
@ -84,7 +83,7 @@ public class CommandBlocker extends FreedomService
String commandName = parts[2].toLowerCase().substring(1); String commandName = parts[2].toLowerCase().substring(1);
final String message = (parts.length > 3 ? parts[3] : null); final String message = (parts.length > 3 ? parts[3] : null);
if (rank == null || action == null || commandName == null || commandName.isEmpty()) if (rank == null || action == null || commandName.isEmpty())
{ {
FLog.warning("Invalid command blocker entry: " + rawEntry); FLog.warning("Invalid command blocker entry: " + rawEntry);
continue; continue;
@ -98,6 +97,7 @@ public class CommandBlocker extends FreedomService
subCommand = StringUtils.join(commandParts, " ", 1, commandParts.length).trim().toLowerCase(); subCommand = StringUtils.join(commandParts, " ", 1, commandParts.length).trim().toLowerCase();
} }
assert commandMap != null;
final Command command = commandMap.getCommand(commandName); final Command command = commandMap.getCommand(commandName);
// Obtain command from alias // Obtain command from alias
@ -171,7 +171,7 @@ public class CommandBlocker extends FreedomService
for (String part : commandParts) for (String part : commandParts)
{ {
if (command.startsWith("/") && !plugin.sl.isStaff(sender) && (part.contains("#copy") || part.contains("#clipboard"))) if (command.startsWith("/") && !plugin.al.isAdmin(sender) && (part.contains("#copy") || part.contains("#clipboard")))
{ {
FUtil.playerMsg(sender, "WorldEdit copy variables are disabled."); FUtil.playerMsg(sender, "WorldEdit copy variables are disabled.");
return true; return true;

View File

@ -8,16 +8,11 @@ public enum CommandBlockerAction
BLOCK_UNKNOWN("u"); BLOCK_UNKNOWN("u");
private final String token; private final String token;
private CommandBlockerAction(String token) CommandBlockerAction(String token)
{ {
this.token = token; this.token = token;
} }
public String getToken()
{
return this.token;
}
public static CommandBlockerAction fromToken(String token) public static CommandBlockerAction fromToken(String token)
{ {
for (CommandBlockerAction action : CommandBlockerAction.values()) for (CommandBlockerAction action : CommandBlockerAction.values())
@ -29,4 +24,9 @@ public enum CommandBlockerAction
} }
return null; return null;
} }
}
public String getToken()
{
return this.token;
}
}

View File

@ -1,6 +1,5 @@
package me.totalfreedom.totalfreedommod.blocking.command; package me.totalfreedom.totalfreedommod.blocking.command;
import lombok.Getter;
import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -11,15 +10,15 @@ import org.spigotmc.SpigotConfig;
public class CommandBlockerEntry public class CommandBlockerEntry
{ {
@Getter
private final CommandBlockerRank rank; private final CommandBlockerRank rank;
@Getter
private final CommandBlockerAction action; private final CommandBlockerAction action;
@Getter
private final String command; private final String command;
@Getter
private final String subCommand; private final String subCommand;
@Getter
private final String message; private final String message;
public CommandBlockerEntry(CommandBlockerRank rank, CommandBlockerAction action, String command, String message) public CommandBlockerEntry(CommandBlockerRank rank, CommandBlockerAction action, String command, String message)
@ -40,7 +39,7 @@ public class CommandBlockerEntry
{ {
if (action == CommandBlockerAction.BLOCK_AND_EJECT && sender instanceof Player) if (action == CommandBlockerAction.BLOCK_AND_EJECT && sender instanceof Player)
{ {
TotalFreedomMod.plugin().ae.autoEject((Player)sender, "You used a prohibited command: " + command); TotalFreedomMod.getPlugin().ae.autoEject((Player)sender, "You used a prohibited command: " + command);
FUtil.bcastMsg(sender.getName() + " was automatically kicked for using harmful commands.", ChatColor.RED); FUtil.bcastMsg(sender.getName() + " was automatically kicked for using harmful commands.", ChatColor.RED);
return; return;
} }
@ -51,4 +50,29 @@ public class CommandBlockerEntry
} }
FUtil.playerMsg(sender, FUtil.colorize(message)); FUtil.playerMsg(sender, FUtil.colorize(message));
} }
public CommandBlockerRank getRank()
{
return rank;
}
public CommandBlockerAction getAction()
{
return action;
}
public String getCommand()
{
return command;
}
public String getSubCommand()
{
return subCommand;
}
public String getMessage()
{
return message;
}
} }

View File

@ -1,53 +1,35 @@
package me.totalfreedom.totalfreedommod.blocking.command; package me.totalfreedom.totalfreedommod.blocking.command;
import me.totalfreedom.totalfreedommod.TotalFreedomMod; import me.totalfreedom.totalfreedommod.TotalFreedomMod;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.staff.StaffMember;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public enum CommandBlockerRank public enum CommandBlockerRank
{ {
EVERYONE("e"),
ANYONE("a"),
OP("o"), OP("o"),
SUPER("s"), ADMIN("a"),
TELNET("t"), SENIOR_ADMIN("s"),
SENIOR("c"),
NOBODY("n"); NOBODY("n");
// //
private final String token; private final String token;
private CommandBlockerRank(String token) CommandBlockerRank(String token)
{ {
this.token = token; this.token = token;
} }
public String getToken()
{
return this.token;
}
public boolean hasPermission(CommandSender sender)
{
return fromSender(sender).ordinal() >= ordinal();
}
public static CommandBlockerRank fromSender(CommandSender sender) public static CommandBlockerRank fromSender(CommandSender sender)
{ {
if (!(sender instanceof Player)) Admin admin = TotalFreedomMod.getPlugin().al.getAdmin(sender);
if (admin != null)
{ {
return TELNET; if (admin.getRank() == Rank.SENIOR_ADMIN)
}
StaffMember staffMember = TotalFreedomMod.plugin().sl.getAdmin(sender);
if (staffMember != null)
{
if (staffMember.getRank() == Rank.SENIOR_ADMIN)
{ {
return SENIOR; return SENIOR_ADMIN;
} }
return SUPER; return ADMIN;
} }
if (sender.isOp()) if (sender.isOp())
@ -55,8 +37,7 @@ public enum CommandBlockerRank
return OP; return OP;
} }
return ANYONE; return EVERYONE;
} }
public static CommandBlockerRank fromToken(String token) public static CommandBlockerRank fromToken(String token)
@ -68,6 +49,16 @@ public enum CommandBlockerRank
return rank; return rank;
} }
} }
return ANYONE; return EVERYONE;
} }
}
public String getToken()
{
return this.token;
}
public boolean hasPermission(CommandSender sender)
{
return fromSender(sender).ordinal() >= ordinal();
}
}

View File

@ -1,7 +1,6 @@
package me.totalfreedom.totalfreedommod.bridge; package me.totalfreedom.totalfreedommod.bridge;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import me.totalfreedom.bukkittelnet.BukkitTelnet; import me.totalfreedom.bukkittelnet.BukkitTelnet;
@ -10,8 +9,8 @@ import me.totalfreedom.bukkittelnet.api.TelnetPreLoginEvent;
import me.totalfreedom.bukkittelnet.api.TelnetRequestDataTagsEvent; import me.totalfreedom.bukkittelnet.api.TelnetRequestDataTagsEvent;
import me.totalfreedom.bukkittelnet.session.ClientSession; import me.totalfreedom.bukkittelnet.session.ClientSession;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.admin.Admin;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.staff.StaffMember;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -43,15 +42,15 @@ public class BukkitTelnetBridge extends FreedomService
return; return;
} }
final StaffMember staffMember = plugin.sl.getEntryByIpFuzzy(ip); final Admin admin = plugin.al.getEntryByIpFuzzy(ip);
if (staffMember == null || !staffMember.isActive() || !staffMember.getRank().hasConsoleVariant()) if (admin == null || !admin.isActive() || !admin.getRank().hasConsoleVariant())
{ {
return; return;
} }
event.setBypassPassword(true); event.setBypassPassword(true);
event.setName(staffMember.getName()); event.setName(admin.getName());
} }
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)
@ -66,10 +65,8 @@ public class BukkitTelnetBridge extends FreedomService
@EventHandler(priority = EventPriority.NORMAL) @EventHandler(priority = EventPriority.NORMAL)
public void onTelnetRequestDataTags(TelnetRequestDataTagsEvent event) public void onTelnetRequestDataTags(TelnetRequestDataTagsEvent event)
{ {
final Iterator<Map.Entry<Player, Map<String, Object>>> it = event.getDataTags().entrySet().iterator(); for (Map.Entry<Player, Map<String, Object>> entry : event.getDataTags().entrySet())
while (it.hasNext())
{ {
final Map.Entry<Player, Map<String, Object>> entry = it.next();
final Player player = entry.getKey(); final Player player = entry.getKey();
final Map<String, Object> playerTags = entry.getValue(); final Map<String, Object> playerTags = entry.getValue();
@ -77,14 +74,14 @@ public class BukkitTelnetBridge extends FreedomService
boolean isTelnetAdmin = false; boolean isTelnetAdmin = false;
boolean isSeniorAdmin = false; boolean isSeniorAdmin = false;
final StaffMember staffMember = plugin.sl.getAdmin(player); final Admin admin = plugin.al.getAdmin(player);
if (staffMember != null) if (admin != null)
{ {
boolean active = staffMember.isActive(); boolean active = admin.isActive();
isAdmin = active; isAdmin = active;
isSeniorAdmin = active && staffMember.getRank() == Rank.SENIOR_ADMIN; isSeniorAdmin = active && admin.getRank() == Rank.SENIOR_ADMIN;
isTelnetAdmin = active && (isSeniorAdmin || staffMember.getRank() == Rank.ADMIN); isTelnetAdmin = active && (isSeniorAdmin || admin.getRank() == Rank.ADMIN);
} }
playerTags.put("tfm.admin.isAdmin", isAdmin); playerTags.put("tfm.admin.isAdmin", isAdmin);
@ -121,22 +118,22 @@ public class BukkitTelnetBridge extends FreedomService
return bukkitTelnetPlugin; return bukkitTelnetPlugin;
} }
public List<StaffMember> getConnectedAdmins() public List<Admin> getConnectedAdmins()
{ {
List<StaffMember> staffMembers = new ArrayList<>(); List<Admin> admins = new ArrayList<>();
final BukkitTelnet telnet = getBukkitTelnetPlugin(); final BukkitTelnet telnet = getBukkitTelnetPlugin();
if (telnet != null) if (telnet != null)
{ {
for (ClientSession session : telnet.appender.getSessions()) for (ClientSession session : telnet.appender.getSessions())
{ {
StaffMember staffMember = plugin.sl.getEntryByName(session.getUserName().toLowerCase()); Admin admin = plugin.al.getEntryByName(session.getUserName().toLowerCase());
if (staffMember != null && !staffMembers.contains(staffMember)) if (admin != null && !admins.contains(admin))
{ {
staffMembers.add(staffMember); admins.add(admin);
} }
} }
} }
return staffMembers; return admins;
} }
public void killTelnetSessions(final String name) public void killTelnetSessions(final String name)
@ -148,10 +145,8 @@ public class BukkitTelnetBridge extends FreedomService
final BukkitTelnet telnet = getBukkitTelnetPlugin(); final BukkitTelnet telnet = getBukkitTelnetPlugin();
if (telnet != null) if (telnet != null)
{ {
final Iterator<ClientSession> it = telnet.appender.getSessions().iterator(); for (ClientSession session : telnet.appender.getSessions())
while (it.hasNext())
{ {
final ClientSession session = it.next();
if (name != null && name.equalsIgnoreCase(session.getUserName())) if (name != null && name.equalsIgnoreCase(session.getUserName()))
{ {
sessionsToRemove.add(session); sessionsToRemove.add(session);
@ -179,4 +174,4 @@ public class BukkitTelnetBridge extends FreedomService
FLog.severe("Error removing telnet sessions: " + ex.getMessage()); FLog.severe("Error removing telnet sessions: " + ex.getMessage());
} }
} }
} }

View File

@ -1,32 +1,78 @@
package me.totalfreedom.totalfreedommod.bridge; package me.totalfreedom.totalfreedommod.bridge;
import java.io.File; import java.io.File;
import java.sql.Connection; import java.sql.*;
import java.sql.DriverManager; import java.text.DecimalFormat;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.config.ConfigEntry; import me.totalfreedom.totalfreedommod.config.ConfigEntry;
import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import me.totalfreedom.totalfreedommod.util.FUtil;
import net.coreprotect.CoreProtect; import net.coreprotect.CoreProtect;
import net.coreprotect.CoreProtectAPI; import net.coreprotect.CoreProtectAPI;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
public class CoreProtectBridge extends FreedomService public class CoreProtectBridge extends FreedomService
{ {
private CoreProtectAPI coreProtectAPI = null; public static Map<Player, FUtil.PaginationList<String>> HISTORY_MAP = new HashMap<>();
private final List<String> tables = Arrays.asList("co_sign", "co_session", "co_container", "co_block"); private final List<String> tables = Arrays.asList("co_sign", "co_session", "co_container", "co_block");
private final HashMap<String, Long> cooldown = new HashMap<>();
private CoreProtectAPI coreProtectAPI = null;
private BukkitTask wiper; private BukkitTask wiper;
public static Long getSecondsLeft(long prevTime, int timeAdd)
{
return prevTime / 1000L + timeAdd - System.currentTimeMillis() / 1000L;
}
// Unix timestamp converter taken from Functions class in CoreProtect, not my code
public static String getTimeAgo(int logTime, int currentTime)
{
StringBuilder message = new StringBuilder();
double timeSince = (double)currentTime - ((double)logTime + 0.0D);
timeSince /= 60.0D;
if (timeSince < 60.0D)
{
message.append((new DecimalFormat("0.00")).format(timeSince)).append("/m ago");
}
if (message.length() == 0)
{
timeSince /= 60.0D;
if (timeSince < 24.0D)
{
message.append((new DecimalFormat("0.00")).format(timeSince)).append("/h ago");
}
}
if (message.length() == 0)
{
timeSince /= 24.0D;
message.append((new DecimalFormat("0.00")).format(timeSince)).append("/d ago");
}
return message.toString();
}
@Override @Override
public void onStart() public void onStart()
{ {
@ -43,8 +89,8 @@ public class CoreProtectBridge extends FreedomService
try try
{ {
final Plugin coreProtectPlugin = Bukkit.getServer().getPluginManager().getPlugin("CoreProtect"); final Plugin coreProtectPlugin = Bukkit.getServer().getPluginManager().getPlugin("CoreProtect");
assert coreProtectPlugin != null;
if (coreProtectPlugin != null && coreProtectPlugin instanceof CoreProtect) if (coreProtectPlugin instanceof CoreProtect)
{ {
coreProtect = (CoreProtect)coreProtectPlugin; coreProtect = (CoreProtect)coreProtectPlugin;
} }
@ -103,7 +149,7 @@ public class CoreProtectBridge extends FreedomService
@Override @Override
public void run() public void run()
{ {
coreProtect.performRollback(86400, Arrays.asList(name), null, null, null, null, 0, null); coreProtect.performRollback(86400, Collections.singletonList(name), null, null, null, null, 0, null);
} }
}.runTaskAsynchronously(plugin); }.runTaskAsynchronously(plugin);
} }
@ -123,7 +169,7 @@ public class CoreProtectBridge extends FreedomService
@Override @Override
public void run() public void run()
{ {
coreProtect.performRestore(86400, Arrays.asList(name), null, null, null, null, 0, null); coreProtect.performRestore(86400, Collections.singletonList(name), null, null, null, null, 0, null);
} }
}.runTaskAsynchronously(plugin); }.runTaskAsynchronously(plugin);
} }
@ -146,7 +192,6 @@ public class CoreProtectBridge extends FreedomService
return (megabytes / 1024); return (megabytes / 1024);
} }
// Wipes DB for the specified world
public void clearDatabase(World world) public void clearDatabase(World world)
{ {
clearDatabase(world, false); clearDatabase(world, false);
@ -168,7 +213,7 @@ public class CoreProtectBridge extends FreedomService
/* As CoreProtect doesn't have an API method for deleting all of the data for a specific world /* As CoreProtect doesn't have an API method for deleting all of the data for a specific world
we have to do this manually via SQL */ we have to do this manually via SQL */
Connection connection = null; Connection connection;
try try
{ {
String host = ConfigEntry.COREPROTECT_MYSQL_HOST.getString(); String host = ConfigEntry.COREPROTECT_MYSQL_HOST.getString();
@ -178,11 +223,12 @@ public class CoreProtectBridge extends FreedomService
String database = ConfigEntry.COREPROTECT_MYSQL_DATABASE.getString(); String database = ConfigEntry.COREPROTECT_MYSQL_DATABASE.getString();
String url = host + ":" + port + "/" + database + "?user=" + username + "&password=" + password + "&useSSL=false"; String url = host + ":" + port + "/" + database + "?user=" + username + "&password=" + password + "&useSSL=false";
connection = DriverManager.getConnection("jdbc:sql://" + url); connection = DriverManager.getConnection("jdbc:sql://" + url);
final Statement statement = connection.createStatement(); final PreparedStatement statement = connection.prepareStatement("SELECT id FROM co_world WHERE world = ?");
statement.setQueryTimeout(30); statement.setQueryTimeout(30);
// Obtain world ID from CoreProtect database // Obtain world ID from CoreProtect database
ResultSet resultSet = statement.executeQuery("SELECT id FROM co_world WHERE world = '" + world.getName() + "'"); statement.setString(1, world.getName());
ResultSet resultSet = statement.executeQuery();
String worldID = null; String worldID = null;
while (resultSet.next()) while (resultSet.next())
{ {
@ -200,7 +246,10 @@ public class CoreProtectBridge extends FreedomService
// Iterate through each table and delete their data if the world ID matches // Iterate through each table and delete their data if the world ID matches
for (String table : tables) for (String table : tables)
{ {
statement.executeQuery("DELETE FROM " + table + " WHERE wid = " + worldID); final PreparedStatement statement1 = connection.prepareStatement("DELETE FROM ? WHERE wid = ?");
statement1.setString(1, table);
statement1.setString(2, worldID);
statement1.executeQuery();
} }
connection.close(); connection.close();
@ -210,11 +259,180 @@ public class CoreProtectBridge extends FreedomService
{ {
FLog.warning("Failed to delete the CoreProtect data for the " + world.getName()); FLog.warning("Failed to delete the CoreProtect data for the " + world.getName());
} }
}
// This exits for flatlands wipes @EventHandler(priority = EventPriority.MONITOR)
if (shutdown) public void onPlayerInteract(PlayerInteractEvent event)
{
Player player = event.getPlayer();
PlayerData data = plugin.pl.getData(player);
Block block = event.getClickedBlock();
final CoreProtectAPI coreProtect = getCoreProtectAPI();
// TODO: Rewrite this
if (data.hasInspection())
{ {
server.shutdown(); int cooldownTime = 3;
// Cooldown check
if ((event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_BLOCK)
&& cooldown.containsKey(player.getName()))
{
long secondsLeft = getSecondsLeft(cooldown.get(player.getName()), cooldownTime);
if (secondsLeft > 0L)
{
event.setCancelled(true);
player.sendMessage(ChatColor.RED + String.valueOf(secondsLeft) + " seconds left before next query.");
return;
}
}
// Actual lookup time
if (event.getAction() == Action.LEFT_CLICK_BLOCK)
{
if (block != null)
{
event.setCancelled(true);
List<String[]> lookup = coreProtect.blockLookup(block, -1);
if (!plugin.al.isAdmin(player))
{
cooldown.put(player.getName(), System.currentTimeMillis());
}
if (lookup != null)
{
if (lookup.isEmpty())
{
player.sendMessage(net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector " + ChatColor.WHITE + "- " + "No block data found for this location");
return;
}
HISTORY_MAP.remove(event.getPlayer());
HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10));
FUtil.PaginationList<String> paged = HISTORY_MAP.get(event.getPlayer());
player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " +
ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")");
for (String[] value : lookup)
{
CoreProtectAPI.ParseResult result = coreProtect.parseResult(value);
BlockData bl = result.getBlockData();
String s;
String st = "";
if (result.getActionString().equals("Placement"))
{
s = " placed ";
}
else if (result.getActionString().equals("Removal"))
{
s = " broke ";
}
else
{
s = " interacted with ";
}
if (result.isRolledBack())
{
st += "§m";
}
int time = (int)(System.currentTimeMillis() / 1000L);
paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") +
st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase());
}
List<String> page = paged.getPage(1);
for (String entries : page)
{
player.sendMessage(entries);
}
player.sendMessage("Page 1/" + paged.getPageCount() + " | To index through the pages, type " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "/ins history <page>");
}
}
}
else if (event.getAction() == Action.RIGHT_CLICK_BLOCK)
{
if (block != null)
{
BlockState blockState = block.getRelative(event.getBlockFace()).getState();
Block placedBlock = blockState.getBlock();
event.setCancelled(true);
List<String[]> lookup = coreProtect.blockLookup(placedBlock, -1);
if (lookup.isEmpty())
{
lookup = coreProtect.blockLookup(block, -1);
}
if (!plugin.al.isAdmin(player))
{
cooldown.put(player.getName(), System.currentTimeMillis());
}
if (lookup != null)
{
if (lookup.isEmpty())
{
player.sendMessage(net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector " + ChatColor.WHITE + "- " + "No block data found for this location");
return;
}
HISTORY_MAP.remove(event.getPlayer());
HISTORY_MAP.put(event.getPlayer(), new FUtil.PaginationList<>(10));
FUtil.PaginationList<String> paged = HISTORY_MAP.get(event.getPlayer());
player.sendMessage("---- " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "Block Inspector" + ChatColor.WHITE + " ---- " +
ChatColor.GRAY + "(x" + block.getX() + "/" + "y" + block.getY() + "/" + "z" + block.getZ() + ")");
for (String[] value : lookup)
{
CoreProtectAPI.ParseResult result = coreProtect.parseResult(value);
BlockData bl = result.getBlockData();
String s;
String st = "";
if (result.getActionString().equals("Placement"))
{
s = " placed ";
}
else if (result.getActionString().equals("Removal"))
{
s = " broke ";
}
else
{
s = " interacted with ";
}
if (result.isRolledBack())
{
st += "§m";
}
int time = (int)(System.currentTimeMillis() / 1000L);
paged.add(ChatColor.GRAY + getTimeAgo(result.getTime(), time) + ChatColor.WHITE + " - " + net.md_5.bungee.api.ChatColor.of("#30ade4") +
st + result.getPlayer() + ChatColor.WHITE + st + s + net.md_5.bungee.api.ChatColor.of("#30ade4") + st + bl.getMaterial().toString().toLowerCase());
}
List<String> page = paged.getPage(1);
for (String entries : page)
{
player.sendMessage(entries);
}
player.sendMessage("Page 1/" + paged.getPageCount() + " | To index through the pages, type " + net.md_5.bungee.api.ChatColor.of("#30ade4") + "/ins history <page>");
}
}
}
} }
} }
} }

View File

@ -42,7 +42,8 @@ public class EssentialsBridge extends FreedomService
try try
{ {
final Plugin essentials = server.getPluginManager().getPlugin("Essentials"); final Plugin essentials = server.getPluginManager().getPlugin("Essentials");
if (essentials != null && essentials instanceof Essentials) assert essentials != null;
if (essentials instanceof Essentials)
{ {
essentialsPlugin = (Essentials)essentials; essentialsPlugin = (Essentials)essentials;
} }
@ -113,7 +114,8 @@ public class EssentialsBridge extends FreedomService
User user = getEssentialsUser(username); User user = getEssentialsUser(username);
if (user != null) if (user != null)
{ {
return FUtil.getField(user, "lastActivity"); Long l = FUtil.getField(user, "lastActivity");
return (l != null) ? l : 0L;
} }
} }
catch (Exception ex) catch (Exception ex)
@ -150,7 +152,7 @@ public class EssentialsBridge extends FreedomService
if (inventoryType == InventoryType.PLAYER && fPlayer.isInvSee()) if (inventoryType == InventoryType.PLAYER && fPlayer.isInvSee())
{ {
final InventoryHolder inventoryHolder = inventory.getHolder(); final InventoryHolder inventoryHolder = inventory.getHolder();
if (inventoryHolder != null && inventoryHolder instanceof HumanEntity) if (inventoryHolder instanceof HumanEntity)
{ {
Player invOwner = (Player)inventoryHolder; Player invOwner = (Player)inventoryHolder;
Rank recieverRank = plugin.rm.getRank(player); Rank recieverRank = plugin.rm.getRank(player);
@ -203,6 +205,7 @@ public class EssentialsBridge extends FreedomService
} }
} }
// TODO: Actually use this for something or remove it.
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onPlayerQuit(PlayerQuitEvent event) public void onPlayerQuit(PlayerQuitEvent event)
{ {
@ -215,4 +218,4 @@ public class EssentialsBridge extends FreedomService
return ess != null && ess.isEnabled(); return ess != null && ess.isEnabled();
} }
} }

View File

@ -1,185 +0,0 @@
package me.totalfreedom.totalfreedommod.bridge;
import com.google.gson.Gson;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.world.block.BaseBlock;
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import me.totalfreedom.totalfreedommod.FreedomService;
import net.coreprotect.CoreProtect;
import net.coreprotect.CoreProtectAPI;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.BlockData;
public class FAWEBridge extends FreedomService
{
private CoreProtectAPI api;
private World world = null;
private final Map<Map.Entry<String, EditSession>, Map<BlockVector3, String>> blocksBroken = new HashMap<>();
private final Map<Map.Entry<String, EditSession>, Map.Entry<Pattern, List<BlockVector3>>> blocksPlaced = new HashMap<>();
@Override
public void onStart()
{
api = ((CoreProtect)Bukkit.getPluginManager().getPlugin("CoreProtect")).getAPI();
/*
* Iterates over blocks placed by GenerationCommands (in the EditSession) and adds them to the CoreProtect logs.
*/
server.getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable()
{
@Override
public void run()
{
if (!(blocksBroken.isEmpty() && blocksPlaced.isEmpty()))
{
// Send all broken blocks from the last ticks to the CoreProtect API.
Map.Entry<String, EditSession> playerAndSessionEntry = null;
for (Map.Entry<Map.Entry<String, EditSession>, Map<BlockVector3, String>> entry : blocksBroken.entrySet())
{
playerAndSessionEntry = entry.getKey();
Map<BlockVector3, String> dataAndVectorEntry = entry.getValue();
List<BlockVector3> blockVector3List = new ArrayList<>();
blockVector3List.addAll(dataAndVectorEntry.keySet()); // Deep clone the block vector to avoid a change later in the code.
for (BlockVector3 blockVector3 : blockVector3List)
{
if (blockVector3 != null)
{
EditSession editSession = playerAndSessionEntry.getValue();
World world = server.getWorld(editSession.getWorld().getName());
Location location = new Location(world, blockVector3.getX(), blockVector3.getY(), blockVector3.getZ());
BlockData blockData = server.createBlockData(dataAndVectorEntry.get(blockVector3));
api.logRemoval(playerAndSessionEntry.getKey(), location, blockData.getMaterial(), blockData);
}
}
}
// Clear after broken blocks have been updated.
blocksBroken.values().clear();
blocksBroken.putIfAbsent(playerAndSessionEntry, new HashMap<>());
// Send all blocks placed to the CoreProtect API (except from the air as it's only a broken block).
for (Map.Entry<Map.Entry<String, EditSession>, Map.Entry<Pattern, List<BlockVector3>>> entry : blocksPlaced.entrySet())
{
playerAndSessionEntry = entry.getKey();
Map.Entry<Pattern, List<BlockVector3>> patternAndListEntry = entry.getValue();
Pattern pattern = patternAndListEntry.getKey();
List<BlockVector3> blockVector3List = new ArrayList<>();
blockVector3List.addAll(patternAndListEntry.getValue()); // Deep clone the block vector to avoid a change later in the code.
for (BlockVector3 blockVector3 : blockVector3List)
{
if (blockVector3 != null && !pattern.apply(blockVector3).getBlockType().getMaterial().isAir())
{
World world = server.getWorld(playerAndSessionEntry.getValue().getWorld().getName());
Location location = new Location(world, blockVector3.getX(), blockVector3.getY(), blockVector3.getZ());
BaseBlock block = pattern.apply(blockVector3);
Material material = Material.getMaterial(block.getBlockType().getId().replaceFirst("minecraft:", "").toUpperCase());
api.logPlacement(playerAndSessionEntry.getKey(), location, material, material.createBlockData());
}
}
}
blocksPlaced.values().forEach(collection -> collection.getValue().clear());
}
}
}, 0L, 40L);
}
@Override
public void onStop()
{
}
public void logBlockEdit(String playerName, EditSession editSession, Pattern pattern, BlockVector3 blockVector3)
{
// Cache the world used for the next iterations to come.
if (world == null || !world.getName().equals(editSession.getWorld().getName()))
{
world = server.getWorld(editSession.getWorld().getName());
}
Map.Entry<String, EditSession> playerAndSessionEntry = new AbstractMap.SimpleEntry(playerName, editSession);
Block block = world.getBlockAt(blockVector3.getBlockX(), blockVector3.getBlockY(), blockVector3.getBlockZ());
// Add the broken block to CoreProtect if it's not air.
if (!block.getType().isAir())
{
String blockData = block.getBlockData().getAsString();
blockData = new Gson().fromJson(new Gson().toJson(blockData), blockData.getClass()); // Overwrite original with deep clones.
blockVector3 = new Gson().fromJson(new Gson().toJson(blockVector3), blockVector3.getClass()); // Overwrite original with deep clones.
blocksBroken.putIfAbsent(playerAndSessionEntry, new HashMap<>());
blocksBroken.get(playerAndSessionEntry).put(blockVector3, blockData);
}
// Add the placed block to CoreProtect if it's not air.
if (!pattern.apply(blockVector3).getBlockType().getMaterial().isAir())
{
blocksPlaced.putIfAbsent(playerAndSessionEntry, new AbstractMap.SimpleEntry<>(pattern, new ArrayList<>()));
BlockVector3 vectorClone = new Gson().fromJson(new Gson().toJson(blockVector3), blockVector3.getClass());
if (!blocksPlaced.get(playerAndSessionEntry).getValue().contains(vectorClone))
{
blocksPlaced.get(playerAndSessionEntry).getValue().add(vectorClone);
}
}
}
public void logBlockEdits(String playerName, EditSession editSession, Region region, Pattern pattern)
{
// Add the broken blocks to CoreProtect.
if (world == null || !world.getName().equals(editSession.getWorld().getName()))
{
world = server.getWorld(editSession.getWorld().getName());
}
List<BlockState> blocks = new ArrayList<>();
for (BlockVector3 blockVector3 : region)
{
blocks.add(world.getBlockAt(blockVector3.getBlockX(), blockVector3.getBlockY(), blockVector3.getBlockZ()).getState());
}
logBlockEdit(playerName, editSession, pattern, blocks);
}
public void logBlockEdit(String playerName, EditSession editSession, Pattern pattern, List<BlockState> blocks)
{
Map.Entry<String, EditSession> playerAndSessionEntry = new AbstractMap.SimpleEntry(playerName, editSession);
server.getScheduler().scheduleAsyncDelayedTask(plugin, () ->
{
for (BlockState block : blocks)
{
BlockVector3 blockVector3 = BlockVector3.at(block.getX(), block.getY(), block.getZ());
// Add the broken block to CoreProtect if it's not air.
if (!block.getType().isAir())
{
api.logRemoval(playerAndSessionEntry.getKey(), block.getLocation(), block.getType(), block.getBlockData());
}
// Add the placed block to CoreProtect if it's not air.
BaseBlock baseBlock = pattern.apply(blockVector3);
if (!baseBlock.getBlockType().getMaterial().isAir())
{
Material material = Material.getMaterial(baseBlock.getBlockType().getId().replaceFirst("minecraft:", "").toUpperCase());
api.logPlacement(playerAndSessionEntry.getKey(), block.getLocation(), material, material.createBlockData());
}
}
}, 0L);
}
}

View File

@ -46,7 +46,7 @@ public class LibsDisguisesBridge extends FreedomService
return libsDisguisesPlugin; return libsDisguisesPlugin;
} }
public void undisguiseAll(boolean staff) public void undisguiseAll(boolean admin)
{ {
try try
{ {
@ -61,7 +61,7 @@ public class LibsDisguisesBridge extends FreedomService
{ {
if (DisguiseAPI.isDisguised(player)) if (DisguiseAPI.isDisguised(player))
{ {
if (!staff && plugin.sl.isStaff(player)) if (!admin && plugin.al.isAdmin(player))
{ {
continue; continue;
} }
@ -75,6 +75,11 @@ public class LibsDisguisesBridge extends FreedomService
} }
} }
public boolean isDisguisesEnabled()
{
return !BlockedDisguises.disabled;
}
public void setDisguisesEnabled(boolean state) public void setDisguisesEnabled(boolean state)
{ {
final LibsDisguises libsDisguises = getLibsDisguisesPlugin(); final LibsDisguises libsDisguises = getLibsDisguisesPlugin();
@ -87,11 +92,6 @@ public class LibsDisguisesBridge extends FreedomService
BlockedDisguises.disabled = !state; BlockedDisguises.disabled = !state;
} }
public boolean isDisguisesEnabled()
{
return !BlockedDisguises.disabled;
}
public boolean isEnabled() public boolean isEnabled()
{ {
final LibsDisguises libsDisguises = getLibsDisguisesPlugin(); final LibsDisguises libsDisguises = getLibsDisguisesPlugin();

View File

@ -8,7 +8,6 @@ import org.bukkit.plugin.Plugin;
public class TFGuildsBridge extends FreedomService public class TFGuildsBridge extends FreedomService
{ {
public boolean enabled = false; public boolean enabled = false;
@Override @Override
@ -54,6 +53,6 @@ public class TFGuildsBridge extends FreedomService
{ {
return false; return false;
} }
return Common.IN_GUILD_CHAT.contains(player); return Common.GUILD_CHAT.contains(player);
} }
} }

View File

@ -60,8 +60,7 @@ public class WorldEditBridge extends FreedomService
{ {
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
com.sk89q.worldedit.entity.Player fuckyou = (com.sk89q.worldedit.entity.Player)bukkitPlayer; session.undo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
session.undo(session.getBlockBag(fuckyou), fuckyou);
} }
} }
} }
@ -84,8 +83,7 @@ public class WorldEditBridge extends FreedomService
{ {
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)
{ {
com.sk89q.worldedit.entity.Player fuckyou = (com.sk89q.worldedit.entity.Player)bukkitPlayer; session.redo(session.getBlockBag(bukkitPlayer), bukkitPlayer);
session.redo(session.getBlockBag(fuckyou), fuckyou);
} }
} }
} }

View File

@ -1,13 +1,20 @@
package me.totalfreedom.totalfreedommod.bridge; package me.totalfreedom.totalfreedommod.bridge;
import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.util.Location;
import com.sk89q.worldguard.LocalPlayer;
import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.WorldGuard;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.Flags;
import com.sk89q.worldguard.protection.managers.RegionManager; import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion; import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import com.sk89q.worldguard.protection.regions.RegionContainer; import com.sk89q.worldguard.protection.regions.RegionContainer;
import java.util.Map; import java.util.Map;
import com.sk89q.worldguard.protection.regions.RegionQuery;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
public class WorldGuardBridge extends FreedomService public class WorldGuardBridge extends FreedomService
@ -15,7 +22,6 @@ public class WorldGuardBridge extends FreedomService
@Override @Override
public void onStart() public void onStart()
{ {
plugin.wr.protectWorld(plugin.wm.hubworld.getWorld());
plugin.wr.protectWorld(plugin.wm.masterBuilderWorld.getWorld()); plugin.wr.protectWorld(plugin.wm.masterBuilderWorld.getWorld());
} }
@ -24,6 +30,16 @@ public class WorldGuardBridge extends FreedomService
{ {
} }
public boolean canEditCurrentWorld(Player player)
{
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();
RegionQuery query = container.createQuery();
return query.testBuild(localPlayer.getLocation(), localPlayer);
}
public RegionManager getRegionManager(World world) public RegionManager getRegionManager(World world)
{ {
RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer();

View File

@ -2,7 +2,6 @@ package me.totalfreedom.totalfreedommod.caging;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import lombok.Getter;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
@ -12,141 +11,21 @@ import org.bukkit.block.Skull;
public class CageData public class CageData
{ {
private static String input = null;
private final FPlayer fPlayer; private final FPlayer fPlayer;
// //
private final List<BlockData> cageHistory = new ArrayList<>();
// //
@Getter private final List<BlockData> cageHistory = new ArrayList<>();
private boolean caged = false; private boolean caged = false;
@Getter
private Location location; private Location location;
@Getter
private Material outerMaterial = Material.GLASS; private Material outerMaterial = Material.GLASS;
@Getter
private Material innerMaterial = Material.AIR; private Material innerMaterial = Material.AIR;
@Getter
private static String input = null;
public CageData(FPlayer player) public CageData(FPlayer player)
{ {
this.fPlayer = player; this.fPlayer = player;
} }
public void setCaged(boolean cage)
{
if (cage)
{
cage(fPlayer.getPlayer().getLocation(), Material.GLASS, Material.GLASS);
}
else
{
this.caged = false;
regenerateHistory();
clearHistory();
}
}
public void cage(Location location, Material outer, Material inner)
{
if (isCaged())
{
setCaged(false);
}
this.caged = true;
this.location = location;
this.outerMaterial = outer;
this.innerMaterial = inner;
this.input = null;
buildHistory(location, 2, fPlayer);
regenerate();
}
public void cage(Location location, Material outer, Material inner, String input)
{
if (isCaged())
{
setCaged(false);
}
this.caged = true;
this.location = location;
this.outerMaterial = outer;
this.innerMaterial = inner;
this.input = input;
buildHistory(location, 2, fPlayer);
regenerate();
}
public void regenerate()
{
if (!caged
|| location == null
|| outerMaterial == null
|| innerMaterial == null)
{
return;
}
generateHollowCube(location, 2, outerMaterial);
generateCube(location, 1, innerMaterial);
}
// TODO: EventHandlerize this?
public void playerJoin()
{
if (!isCaged())
{
return;
}
cage(fPlayer.getPlayer().getLocation(), outerMaterial, innerMaterial, input);
}
public void playerQuit()
{
regenerateHistory();
clearHistory();
}
public void clearHistory()
{
cageHistory.clear();
}
private void insertHistoryBlock(Location location, Material material)
{
cageHistory.add(new BlockData(location, material));
}
private void regenerateHistory()
{
for (BlockData blockdata : this.cageHistory)
{
blockdata.location.getBlock().setType(blockdata.material);
}
}
private void buildHistory(Location location, int length, FPlayer playerdata)
{
final Block center = location.getBlock();
for (int xOffset = -length; xOffset <= length; xOffset++)
{
for (int yOffset = -length; yOffset <= length; yOffset++)
{
for (int zOffset = -length; zOffset <= length; zOffset++)
{
final Block block = center.getRelative(xOffset, yOffset, zOffset);
insertHistoryBlock(block.getLocation(), block.getType());
}
}
}
}
// Util methods // Util methods
public static void generateCube(Location location, int length, Material material) public static void generateCube(Location location, int length, Material material)
{ {
@ -167,6 +46,7 @@ public class CageData
} }
} }
@SuppressWarnings("deprecation")
public static void generateHollowCube(Location location, int length, Material material) public static void generateHollowCube(Location location, int length, Material material)
{ {
final Block center = location.getBlock(); final Block center = location.getBlock();
@ -213,7 +93,7 @@ public class CageData
skull.setOwner(input); skull.setOwner(input);
skull.update(); skull.update();
} }
catch (ClassCastException e) catch (ClassCastException ignored)
{ {
} }
} }
@ -223,6 +103,176 @@ public class CageData
} }
} }
public static String getInput()
{
return input;
}
public static void setInput(String input)
{
CageData.input = input;
}
public void cage(Location location, Material outer, Material inner)
{
if (isCaged())
{
setCaged(false);
}
this.caged = true;
this.location = location;
this.outerMaterial = outer;
this.innerMaterial = inner;
input = null;
buildHistory(location);
regenerate();
}
public void cage(Location location, Material outer, Material inner, String input)
{
if (isCaged())
{
setCaged(false);
}
this.caged = true;
this.location = location;
this.outerMaterial = outer;
this.innerMaterial = inner;
CageData.input = input;
buildHistory(location);
regenerate();
}
public void regenerate()
{
if (!caged
|| location == null
|| outerMaterial == null
|| innerMaterial == null)
{
return;
}
generateHollowCube(location, 2, outerMaterial);
generateCube(location, 1, innerMaterial);
}
// TODO: EventHandler this?
public void playerJoin()
{
if (!isCaged())
{
return;
}
cage(fPlayer.getPlayer().getLocation(), outerMaterial, innerMaterial, input);
}
public void playerQuit()
{
regenerateHistory();
clearHistory();
}
public void clearHistory()
{
cageHistory.clear();
}
private void insertHistoryBlock(Location location, Material material)
{
cageHistory.add(new BlockData(location, material));
}
private void regenerateHistory()
{
for (BlockData blockdata : this.cageHistory)
{
blockdata.location.getBlock().setType(blockdata.material);
}
}
private void buildHistory(Location location)
{
final Block center = location.getBlock();
for (int xOffset = -2; xOffset <= 2; xOffset++)
{
for (int yOffset = -2; yOffset <= 2; yOffset++)
{
for (int zOffset = -2; zOffset <= 2; zOffset++)
{
final Block block = center.getRelative(xOffset, yOffset, zOffset);
insertHistoryBlock(block.getLocation(), block.getType());
}
}
}
}
public FPlayer getfPlayer()
{
return fPlayer;
}
public List<BlockData> getCageHistory()
{
return cageHistory;
}
public boolean isCaged()
{
return caged;
}
public void setCaged(boolean cage)
{
if (cage)
{
cage(fPlayer.getPlayer().getLocation(), Material.GLASS, Material.GLASS);
}
else
{
this.caged = false;
regenerateHistory();
clearHistory();
}
}
public Location getLocation()
{
return location;
}
public void setLocation(Location location)
{
this.location = location;
}
public Material getOuterMaterial()
{
return outerMaterial;
}
public void setOuterMaterial(Material outerMaterial)
{
this.outerMaterial = outerMaterial;
}
public Material getInnerMaterial()
{
return innerMaterial;
}
public void setInnerMaterial(Material innerMaterial)
{
this.innerMaterial = innerMaterial;
}
private static class BlockData private static class BlockData
{ {

View File

@ -1,6 +1,7 @@
package me.totalfreedom.totalfreedommod.caging; package me.totalfreedom.totalfreedommod.caging;
import io.papermc.lib.PaperLib; import io.papermc.lib.PaperLib;
import java.util.Objects;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
@ -31,8 +32,7 @@ public class Cager extends FreedomService
public void onBreakBlock(BlockBreakEvent event) public void onBreakBlock(BlockBreakEvent event)
{ {
Player player = event.getPlayer(); Player player = event.getPlayer();
if (player == null if (plugin.al.isAdmin(player))
|| plugin.sl.isStaff(player))
{ {
return; return;
} }
@ -61,7 +61,7 @@ public class Cager extends FreedomService
Location cageLoc = cage.getLocation(); Location cageLoc = cage.getLocation();
final boolean outOfCage; final boolean outOfCage;
if (!playerLoc.getWorld().equals(cageLoc.getWorld())) if (!Objects.equals(playerLoc.getWorld(), cageLoc.getWorld()))
{ {
outOfCage = true; outOfCage = true;
} }
@ -113,5 +113,4 @@ public class Cager extends FreedomService
cage.playerJoin(); cage.playerJoin();
} }
} }
}
}

View File

@ -4,14 +4,12 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import lombok.Getter;
import me.totalfreedom.totalfreedommod.FreedomService; import me.totalfreedom.totalfreedommod.FreedomService;
import me.totalfreedom.totalfreedommod.util.FLog; import me.totalfreedom.totalfreedommod.util.FLog;
import org.reflections.Reflections; import org.reflections.Reflections;
public class CommandLoader extends FreedomService public class CommandLoader extends FreedomService
{ {
@Getter
private final List<FreedomCommand> commands; private final List<FreedomCommand> commands;
public CommandLoader() public CommandLoader()
@ -40,7 +38,9 @@ public class CommandLoader extends FreedomService
for (FreedomCommand command : commands) for (FreedomCommand command : commands)
{ {
if (name.equals(command.getName())) if (name.equals(command.getName()))
{
return command; return command;
}
} }
return null; return null;
} }
@ -50,7 +50,9 @@ public class CommandLoader extends FreedomService
for (FreedomCommand command : commands) for (FreedomCommand command : commands)
{ {
if (Arrays.asList(command.getAliases().split(",")).contains(alias)) if (Arrays.asList(command.getAliases().split(",")).contains(alias))
{
return true; return true;
}
} }
return false; return false;
} }
@ -69,10 +71,15 @@ public class CommandLoader extends FreedomService
} }
catch (InstantiationException | IllegalAccessException | ExceptionInInitializerError ex) catch (InstantiationException | IllegalAccessException | ExceptionInInitializerError ex)
{ {
FLog.warning("Failed to register command: /" + commandClass.getSimpleName().replace("Command_" , "")); FLog.warning("Failed to register command: /" + commandClass.getSimpleName().replace("Command_", ""));
} }
} }
FLog.info("Loaded " + commands.size() + " commands"); FLog.info("Loaded " + commands.size() + " commands");
} }
public List<FreedomCommand> getCommands()
{
return commands;
}
} }

View File

@ -8,8 +8,8 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH) @CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
@CommandParameters(description = "Talk privately with other staff on the server.", usage = "/<command> [message]", aliases = "o,sc") @CommandParameters(description = "Talk privately with other admins on the server.", usage = "/<command> [message]", aliases = "o,sc,ac,staffchat")
public class Command_staffchat extends FreedomCommand public class Command_adminchat extends FreedomCommand
{ {
@Override @Override
@ -19,18 +19,18 @@ public class Command_staffchat extends FreedomCommand
{ {
if (senderIsConsole) if (senderIsConsole)
{ {
msg("You must be in-game to toggle staff chat, it cannot be toggled via CONSOLE or Telnet."); msg("You must be in-game to toggle admin chat, it cannot be toggled via CONSOLE or Telnet.");
return true; return true;
} }
FPlayer userinfo = plugin.pl.getPlayer(playerSender); FPlayer userinfo = plugin.pl.getPlayer(playerSender);
userinfo.setStaffChat(!userinfo.inStaffChat()); userinfo.setAdminChat(!userinfo.inAdminChat());
msg("Toggled your staff chat " + (userinfo.inStaffChat() ? "on" : "off") + "."); msg("Admin chat turned " + (userinfo.inAdminChat() ? "on" : "off") + ".");
} }
else else
{ {
plugin.cm.staffChat(sender, StringUtils.join(args, " ")); plugin.cm.adminChat(sender, StringUtils.join(args, " "));
} }
return true; return true;
} }
} }

View File

@ -11,23 +11,23 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH) @CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
@CommandParameters(description = "Information on how to apply for staff.", usage = "/<command>", aliases = "si") @CommandParameters(description = "Information on how to apply for admin.", usage = "/<command>", aliases = "si,ai,staffinfo")
public class Command_staffinfo extends FreedomCommand public class Command_admininfo extends FreedomCommand
{ {
@Override @Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
List<String> staffInfo = ConfigEntry.STAFF_INFO.getStringList(); List<String> adminInfo = ConfigEntry.ADMIN_INFO.getStringList();
if (staffInfo.isEmpty()) if (adminInfo.isEmpty())
{ {
msg("The staff information section of the config.yml file has not been configured.", ChatColor.RED); msg("The admin information section of the config.yml file has not been configured.", ChatColor.RED);
} }
else else
{ {
msg(FUtil.colorize(StringUtils.join(staffInfo, "\n"))); msg(FUtil.colorize(StringUtils.join(adminInfo, "\n")));
} }
return true; return true;
} }
} }

View File

@ -11,8 +11,8 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH) @CommandPermissions(level = Rank.ADMIN, source = SourceType.BOTH)
@CommandParameters(description = "Denies joining of operators and only allows staff members to join.", usage = "/<command> [on | off]") @CommandParameters(description = "Denies joining of operators and only allows admins to join.", usage = "/<command> [on | off]", aliases = "staffmode")
public class Command_staffmode extends FreedomCommand public class Command_adminmode extends FreedomCommand
{ {
@Override @Override
@ -25,19 +25,19 @@ public class Command_staffmode extends FreedomCommand
if (args[0].equalsIgnoreCase("off")) if (args[0].equalsIgnoreCase("off"))
{ {
ConfigEntry.STAFF_ONLY_MODE.setBoolean(false); ConfigEntry.ADMIN_ONLY_MODE.setBoolean(false);
FUtil.staffAction(sender.getName(), "Opening the server to all players.", true); FUtil.adminAction(sender.getName(), "Opening the server to all players", true);
return true; return true;
} }
else if (args[0].equalsIgnoreCase("on")) else if (args[0].equalsIgnoreCase("on"))
{ {
ConfigEntry.STAFF_ONLY_MODE.setBoolean(true); ConfigEntry.ADMIN_ONLY_MODE.setBoolean(true);
FUtil.staffAction(sender.getName(), "Closing the server to non-staff.", true); FUtil.adminAction(sender.getName(), "Closing the server to non-admins", true);
for (Player player : server.getOnlinePlayers()) for (Player player : server.getOnlinePlayers())
{ {
if (!isStaff(player)) if (!isAdmin(player))
{ {
player.kickPlayer("Server is now closed to non-staff."); player.kickPlayer("Server is now closed to non-admins.");
} }
} }
return true; return true;
@ -49,11 +49,11 @@ public class Command_staffmode extends FreedomCommand
@Override @Override
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args) public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
{ {
if (args.length == 1 && plugin.sl.isStaff(sender) && !(sender instanceof Player)) if (args.length == 1 && plugin.al.isAdmin(sender) && !(sender instanceof Player))
{ {
return Arrays.asList("on", "off"); return Arrays.asList("on", "off");
} }
return Collections.emptyList(); return Collections.emptyList();
} }
} }

View File

@ -13,17 +13,12 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandPermissions(level = Rank.OP, source = SourceType.BOTH) @CommandPermissions(level = Rank.OP, source = SourceType.BOTH)
@CommandParameters(description = "Allows for staff to configure time, and weather of the StaffWorld, and allows for staff and ops to go to the StaffWorld.", @CommandParameters(description = "Allows for admins to configure time, and weather of the AdminWorld, and allows for admins and ops to go to the AdminWorld.",
usage = "/<command> [time <morning | noon | evening | night> | weather <off | rain | storm>]", usage = "/<command> [time <morning | noon | evening | night> | weather <off | rain | storm>]",
aliases = "sw") aliases = "sw,aw,staffworld")
public class Command_staffworld extends FreedomCommand public class Command_adminworld extends FreedomCommand
{ {
private enum CommandMode
{
TELEPORT, TIME, WEATHER
}
@Override @Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
@ -61,24 +56,24 @@ public class Command_staffworld extends FreedomCommand
return false; return false;
} }
World staffWorld = null; World adminWorld = null;
try try
{ {
staffWorld = plugin.wm.staffworld.getWorld(); adminWorld = plugin.wm.adminworld.getWorld();
} }
catch (Exception ex) catch (Exception ignored)
{ {
} }
if (staffWorld == null || playerSender.getWorld() == staffWorld) if (adminWorld == null || playerSender.getWorld() == adminWorld)
{ {
msg("Going to the main world."); msg("Going to the main world.");
PaperLib.teleportAsync(playerSender, server.getWorlds().get(0).getSpawnLocation()); PaperLib.teleportAsync(playerSender, server.getWorlds().get(0).getSpawnLocation());
} }
else else
{ {
msg("Going to the StaffWorld."); msg("Going to the AdminWorld.");
plugin.wm.staffworld.sendToWorld(playerSender); plugin.wm.adminworld.sendToWorld(playerSender);
} }
break; break;
} }
@ -91,8 +86,8 @@ public class Command_staffworld extends FreedomCommand
WorldTime timeOfDay = WorldTime.getByAlias(args[1]); WorldTime timeOfDay = WorldTime.getByAlias(args[1]);
if (timeOfDay != null) if (timeOfDay != null)
{ {
plugin.wm.staffworld.setTimeOfDay(timeOfDay); plugin.wm.adminworld.setTimeOfDay(timeOfDay);
msg("StaffWorld time set to: " + timeOfDay.name()); msg("AdminWorld time set to: " + timeOfDay.name());
} }
else else
{ {
@ -115,8 +110,8 @@ public class Command_staffworld extends FreedomCommand
WorldWeather weatherMode = WorldWeather.getByAlias(args[1]); WorldWeather weatherMode = WorldWeather.getByAlias(args[1]);
if (weatherMode != null) if (weatherMode != null)
{ {
plugin.wm.staffworld.setWeatherMode(weatherMode); plugin.wm.adminworld.setWeatherMode(weatherMode);
msg("StaffWorld weather set to: " + weatherMode.name()); msg("AdminWorld weather set to: " + weatherMode.name());
} }
else else
{ {
@ -142,7 +137,7 @@ public class Command_staffworld extends FreedomCommand
{ {
return noPerms(); return noPerms();
} }
sender.sendMessage(ex.getMessage()); msg(ex.getMessage());
return true; return true;
} }
@ -152,32 +147,16 @@ public class Command_staffworld extends FreedomCommand
// TODO: Redo this properly // TODO: Redo this properly
private void assertCommandPerms(CommandSender sender, Player playerSender) throws PermissionDeniedException private void assertCommandPerms(CommandSender sender, Player playerSender) throws PermissionDeniedException
{ {
if (!(sender instanceof Player) || playerSender == null || !isStaff(sender)) if (!(sender instanceof Player) || playerSender == null || !isAdmin(sender))
{ {
throw new PermissionDeniedException(); throw new PermissionDeniedException();
} }
} }
private class PermissionDeniedException extends Exception
{
private static final long serialVersionUID = 1L;
private PermissionDeniedException()
{
super("");
}
private PermissionDeniedException(String string)
{
super(string);
}
}
@Override @Override
public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args) public List<String> getTabCompleteOptions(CommandSender sender, Command command, String alias, String[] args)
{ {
if (!plugin.sl.isStaff(sender)) if (!plugin.al.isAdmin(sender))
{ {
return Collections.emptyList(); return Collections.emptyList();
} }
@ -198,4 +177,25 @@ public class Command_staffworld extends FreedomCommand
} }
return Collections.emptyList(); return Collections.emptyList();
} }
private enum CommandMode
{
TELEPORT, TIME, WEATHER
}
private static class PermissionDeniedException extends Exception
{
private static final long serialVersionUID = 1L;
private PermissionDeniedException()
{
super("");
}
private PermissionDeniedException(String string)
{
super(string);
}
}
} }

View File

@ -19,7 +19,7 @@ public class Command_adventure extends FreedomCommand
{ {
if (isConsole()) if (isConsole())
{ {
sender.sendMessage("When used from the console, you must define a target player."); msg("When used from the console, you must define a target player.");
return true; return true;
} }
@ -37,7 +37,7 @@ public class Command_adventure extends FreedomCommand
targetPlayer.setGameMode(GameMode.ADVENTURE); targetPlayer.setGameMode(GameMode.ADVENTURE);
} }
FUtil.staffAction(sender.getName(), "Changing everyone's gamemode to adventure", false); FUtil.adminAction(sender.getName(), "Changing everyone's gamemode to adventure", false);
msg("Your gamemode has been set to adventure."); msg("Your gamemode has been set to adventure.");
return true; return true;
} }
@ -46,7 +46,7 @@ public class Command_adventure extends FreedomCommand
if (player == null) if (player == null)
{ {
sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND); msg(PLAYER_NOT_FOUND);
return true; return true;
} }
@ -55,4 +55,4 @@ public class Command_adventure extends FreedomCommand
player.setGameMode(GameMode.ADVENTURE); player.setGameMode(GameMode.ADVENTURE);
return true; return true;
} }
} }

View File

@ -17,7 +17,7 @@ public class Command_aeclear extends FreedomCommand
@Override @Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
FUtil.staffAction(sender.getName(), "Removing all area effect clouds.", true); FUtil.adminAction(sender.getName(), "Removing all area effect clouds", true);
int removed = 0; int removed = 0;
for (World world : server.getWorlds()) for (World world : server.getWorlds())
{ {
@ -33,4 +33,4 @@ public class Command_aeclear extends FreedomCommand
msg(removed + " area effect clouds removed."); msg(removed + " area effect clouds removed.");
return true; return true;
} }
} }

View File

@ -22,5 +22,4 @@ public class Command_announce extends FreedomCommand
plugin.an.announce(StringUtils.join(args, " ")); plugin.an.announce(StringUtils.join(args, " "));
return true; return true;
} }
}
}

View File

@ -14,17 +14,17 @@ public class Command_attributelist extends FreedomCommand
@Override @Override
public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole) public boolean run(CommandSender sender, Player playerSender, Command cmd, String commandLabel, String[] args, boolean senderIsConsole)
{ {
String list = "All possible attributes: "; StringBuilder list = new StringBuilder("All possible attributes: ");
for (Attribute attribute : Attribute.values()) for (Attribute attribute : Attribute.values())
{ {
list += attribute.name() + ", "; list.append(attribute.name()).append(", ");
} }
// Remove extra comma at the end of the list // Remove extra comma at the end of the list
list = list.substring(0, list.length() - 2); list = new StringBuilder(list.substring(0, list.length() - 2));
msg(list); msg(list.toString());
return true; return true;
} }
} }

View File

@ -1,7 +1,8 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import java.util.ArrayList; import java.util.Objects;
import java.util.List;
import com.earth2me.essentials.User;
import me.totalfreedom.totalfreedommod.banning.Ban; import me.totalfreedom.totalfreedommod.banning.Ban;
import me.totalfreedom.totalfreedommod.player.PlayerData; import me.totalfreedom.totalfreedommod.player.PlayerData;
import me.totalfreedom.totalfreedommod.punishments.Punishment; import me.totalfreedom.totalfreedommod.punishments.Punishment;
@ -31,8 +32,8 @@ public class Command_ban extends FreedomCommand
} }
String reason = null; String reason = null;
Boolean silent = false; boolean silent = false;
Boolean cancelRollback = false; boolean cancelRollback = false;
if (args.length >= 2) if (args.length >= 2)
{ {
if (args[args.length - 1].equalsIgnoreCase("-nrb") || args[args.length - 1].equalsIgnoreCase("-q")) if (args[args.length - 1].equalsIgnoreCase("-nrb") || args[args.length - 1].equalsIgnoreCase("-q"))
@ -59,28 +60,39 @@ public class Command_ban extends FreedomCommand
} }
final String username; final String username;
final List<String> ips = new ArrayList<>(); final String ip;
final Player player = getPlayer(args[0]); final Player player = getPlayer(args[0]);
if (player == null) if (player == null)
{ {
final PlayerData entry = plugin.pl.getData(args[0]); // Gets the IP using Essentials data if available
if (plugin.esb.isEnabled() && plugin.esb.getEssentialsUser(args[0]) != null)
if (entry == null)
{ {
msg("Can't find that user. If target is not logged in, make sure that you spelled the name exactly."); User essUser = plugin.esb.getEssentialsUser(args[0]);
return true; //
username = essUser.getName();
ip = essUser.getLastLoginAddress();
}
// Last resort - Getting the first result from the username itself
else
{
PlayerData entry = plugin.pl.getData(args[0]);
if (entry == null)
{
msg(PLAYER_NOT_FOUND);
return true;
}
else
{
username = entry.getName();
ip = entry.getIps().get(0);
}
} }
username = entry.getName();
ips.addAll(entry.getIps());
} }
else else
{ {
final PlayerData entry = plugin.pl.getData(player);
username = player.getName(); username = player.getName();
//ips.addAll(entry.getIps());/ ip = FUtil.getIp(player);
ips.add(FUtil.getIp(player));
// Deop // Deop
player.setOp(false); player.setOp(false);
@ -100,7 +112,7 @@ public class Command_ban extends FreedomCommand
for (int z = -1; z <= 1; z++) for (int z = -1; z <= 1; z++)
{ {
final Location strike_pos = new Location(targetPos.getWorld(), targetPos.getBlockX() + x, targetPos.getBlockY(), targetPos.getBlockZ() + z); final Location strike_pos = new Location(targetPos.getWorld(), targetPos.getBlockX() + x, targetPos.getBlockY(), targetPos.getBlockZ() + z);
targetPos.getWorld().strikeLightning(strike_pos); Objects.requireNonNull(targetPos.getWorld()).strikeLightning(strike_pos);
} }
} }
} }
@ -125,7 +137,6 @@ public class Command_ban extends FreedomCommand
// Ban player // Ban player
Ban ban; Ban ban;
if (player != null) if (player != null)
{ {
ban = Ban.forPlayer(player, sender, null, reason); ban = Ban.forPlayer(player, sender, null, reason);
@ -134,12 +145,8 @@ public class Command_ban extends FreedomCommand
{ {
ban = Ban.forPlayerName(username, sender, null, reason); ban = Ban.forPlayerName(username, sender, null, reason);
} }
ban.addIp(ip);
for (String ip : ips)
{
ban.addIp(ip);
ban.addIp(FUtil.getFuzzyIp(ip));
}
plugin.bm.addBan(ban); plugin.bm.addBan(ban);
@ -153,8 +160,8 @@ public class Command_ban extends FreedomCommand
{ {
bcast.append(" - Reason: ").append(ChatColor.YELLOW).append(reason); bcast.append(" - Reason: ").append(ChatColor.YELLOW).append(reason);
} }
msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + StringUtils.join(ips, ", ")); msg(sender, ChatColor.GRAY + username + " has been banned and IP is: " + ip);
FUtil.staffAction(sender.getName(), String.format(bcast.toString()), true); FUtil.adminAction(sender.getName(), bcast.toString(), true);
} }
// Kick player and handle others on IP // Kick player and handle others on IP
@ -171,7 +178,7 @@ public class Command_ban extends FreedomCommand
} }
// Log ban // Log ban
plugin.pul.logPunishment(new Punishment(username, ips.get(0), sender.getName(), PunishmentType.BAN, reason)); plugin.pul.logPunishment(new Punishment(username, ip, sender.getName(), PunishmentType.BAN, reason));
return true; return true;
} }

View File

@ -27,10 +27,10 @@ public class Command_banip extends FreedomCommand
boolean silent = false; boolean silent = false;
String reason = null; String reason = null;
String ip = args[0]; String ip = args[0];
if (!FUtil.isValidIPv4(ip)) if (FUtil.isValidIPv4(ip))
{ {
msg(ip + " is not a valid IP address", ChatColor.RED); msg(ip + " is not a valid IP address", ChatColor.RED);
return true; return true;
@ -72,8 +72,8 @@ public class Command_banip extends FreedomCommand
{ {
// Broadcast // Broadcast
FLog.info(ChatColor.RED + sender.getName() + " - Banned the IP " + ip); FLog.info(ChatColor.RED + sender.getName() + " - Banned the IP " + ip);
String message = ChatColor.RED + sender.getName() + " - Banned " + (plugin.sl.isStaff(player) ? "the IP " + ip : "an IP"); String message = sender.getName() + " - Banned " + (plugin.al.isAdmin(player) ? "the IP " + ip : "an IP");
player.sendMessage(message); msg(player, message, ChatColor.RED);
} }
} }

View File

@ -20,7 +20,7 @@ public class Command_banlist extends FreedomCommand
{ {
checkRank(Rank.SENIOR_ADMIN); checkRank(Rank.SENIOR_ADMIN);
FUtil.staffAction(sender.getName(), "Purging the ban list", true); FUtil.adminAction(sender.getName(), "Purging the ban list", true);
int amount = plugin.bm.purge(); int amount = plugin.bm.purge();
msg("Purged " + amount + " player bans."); msg("Purged " + amount + " player bans.");
return true; return true;

View File

@ -26,8 +26,8 @@ public class Command_banname extends FreedomCommand
boolean silent = false; boolean silent = false;
String reason = null; String reason = null;
String name = args[0];; String name = args[0];
if (plugin.bm.getByUsername(name) != null) if (plugin.bm.getByUsername(name) != null)
{ {
@ -55,7 +55,7 @@ public class Command_banname extends FreedomCommand
if (!silent) if (!silent)
{ {
FUtil.staffAction(sender.getName(), "Banned the name " + name, true); FUtil.adminAction(sender.getName(), "Banned the name " + name, true);
} }
Player player = getPlayer(name); Player player = getPlayer(name);

View File

@ -2,7 +2,7 @@ package me.totalfreedom.totalfreedommod.command;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.SplittableRandom;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.command.Command; import org.bukkit.command.Command;
@ -27,7 +27,7 @@ public class Command_bird extends FreedomCommand
public EntityType getRandomFish() public EntityType getRandomFish()
{ {
List<EntityType> fishTypes = Arrays.asList(EntityType.COD, EntityType.SALMON, EntityType.PUFFERFISH, EntityType.TROPICAL_FISH); List<EntityType> fishTypes = Arrays.asList(EntityType.COD, EntityType.SALMON, EntityType.PUFFERFISH, EntityType.TROPICAL_FISH);
Random random = new Random(); SplittableRandom random = new SplittableRandom();
return fishTypes.get(random.nextInt(fishTypes.size())); return fishTypes.get(random.nextInt(fishTypes.size()));
} }
} }

View File

@ -1,6 +1,8 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.punishments.Punishment;
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
@ -23,7 +25,7 @@ public class Command_blockcmd extends FreedomCommand
if (args[0].equals("purge")) if (args[0].equals("purge"))
{ {
FUtil.staffAction(sender.getName(), "Unblocking commands for all players", true); FUtil.adminAction(sender.getName(), "Unblocking commands for all players", true);
int counter = 0; int counter = 0;
for (Player player : server.getOnlinePlayers()) for (Player player : server.getOnlinePlayers())
{ {
@ -40,18 +42,18 @@ public class Command_blockcmd extends FreedomCommand
if (args[0].equals("-a")) if (args[0].equals("-a"))
{ {
FUtil.staffAction(sender.getName(), "Blocking commands for all non-staff", true); FUtil.adminAction(sender.getName(), "Blocking commands for all non-admins", true);
int counter = 0; int counter = 0;
for (Player player : server.getOnlinePlayers()) for (Player player : server.getOnlinePlayers())
{ {
if (isStaff(player)) if (isAdmin(player))
{ {
continue; continue;
} }
counter += 1; counter += 1;
plugin.pl.getPlayer(player).setCommandsBlocked(true); plugin.pl.getPlayer(player).setCommandsBlocked(true);
msg(player, "Your commands have been blocked by a staff member.", ChatColor.RED); msg(player, "Your commands have been blocked by an admin.", ChatColor.RED);
} }
msg("Blocked commands for " + counter + " players."); msg("Blocked commands for " + counter + " players.");
@ -66,18 +68,20 @@ public class Command_blockcmd extends FreedomCommand
return true; return true;
} }
if (isStaff(player)) if (isAdmin(player))
{ {
msg(player.getName() + " is a staff member, and cannot have their commands blocked."); msg(player.getName() + " is an admin, and cannot have their commands blocked.");
return true; return true;
} }
FPlayer playerdata = plugin.pl.getPlayer(player); FPlayer playerdata = plugin.pl.getPlayer(player);
if (!playerdata.allCommandsBlocked()) if (!playerdata.allCommandsBlocked())
{ {
FUtil.adminAction(sender.getName(), "Blocking all commands for " + player.getName(), true);
playerdata.setCommandsBlocked(true); playerdata.setCommandsBlocked(true);
FUtil.staffAction(sender.getName(), "Blocking all commands for " + player.getName(), true);
msg("Blocked commands for " + player.getName() + "."); msg("Blocked commands for " + player.getName() + ".");
plugin.pul.logPunishment(new Punishment(player.getName(), FUtil.getIp(player), sender.getName(), PunishmentType.BLOCKCMD, null));
} }
else else
{ {

View File

@ -1,6 +1,8 @@
package me.totalfreedom.totalfreedommod.command; package me.totalfreedom.totalfreedommod.command;
import me.totalfreedom.totalfreedommod.player.FPlayer; import me.totalfreedom.totalfreedommod.player.FPlayer;
import me.totalfreedom.totalfreedommod.punishments.Punishment;
import me.totalfreedom.totalfreedommod.punishments.PunishmentType;
import me.totalfreedom.totalfreedommod.rank.Rank; import me.totalfreedom.totalfreedommod.rank.Rank;
import me.totalfreedom.totalfreedommod.util.FUtil; import me.totalfreedom.totalfreedommod.util.FUtil;
import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.ArrayUtils;
@ -46,7 +48,7 @@ public class Command_blockedit extends FreedomCommand
if (args[0].equals("purge")) if (args[0].equals("purge"))
{ {
FUtil.staffAction(sender.getName(), "Unblocking block modification abilities for all players.", true); FUtil.adminAction(sender.getName(), "Unblocking block modification abilities for all players", true);
int count = 0; int count = 0;
for (final Player player : this.server.getOnlinePlayers()) for (final Player player : this.server.getOnlinePlayers())
{ {
@ -63,11 +65,11 @@ public class Command_blockedit extends FreedomCommand
if (args[0].equals("all")) if (args[0].equals("all"))
{ {
FUtil.staffAction(sender.getName(), "Blocking block modification abilities for all non-staff.", true); FUtil.adminAction(sender.getName(), "Blocking block modification abilities for all non-admins", true);
int counter = 0; int counter = 0;
for (final Player player : this.server.getOnlinePlayers()) for (final Player player : this.server.getOnlinePlayers())
{ {
if (!plugin.sl.isStaff(player)) if (!plugin.al.isAdmin(player))
{ {
final FPlayer playerdata = plugin.pl.getPlayer(player); final FPlayer playerdata = plugin.pl.getPlayer(player);
playerdata.setEditBlocked(true); playerdata.setEditBlocked(true);
@ -92,7 +94,7 @@ public class Command_blockedit extends FreedomCommand
final Player player2 = getPlayer(args[0]); final Player player2 = getPlayer(args[0]);
if (player2 == null) if (player2 == null)
{ {
sender.sendMessage(FreedomCommand.PLAYER_NOT_FOUND); msg(PLAYER_NOT_FOUND);
return true; return true;
} }
@ -105,20 +107,20 @@ public class Command_blockedit extends FreedomCommand
final FPlayer pd = plugin.pl.getPlayer(player2); final FPlayer pd = plugin.pl.getPlayer(player2);
if (pd.isEditBlocked()) if (pd.isEditBlocked())
{ {
FUtil.staffAction(sender.getName(), "Unblocking block modification abilities for " + player2.getName(), true); FUtil.adminAction(sender.getName(), "Unblocking block modification abilities for " + player2.getName(), true);
pd.setEditBlocked(false); pd.setEditBlocked(false);
msg("Unblocking block modification abilities for " + player2.getName()); msg("Unblocking block modification abilities for " + player2.getName());
msg(player2, "Your block modification abilities have been restored.", ChatColor.RED); msg(player2, "Your block modification abilities have been restored.", ChatColor.RED);
} }
else else
{ {
if (plugin.sl.isStaff(player2)) if (plugin.al.isAdmin(player2))
{ {
msg(player2.getName() + " is a staff member, and cannot have their block edits blocked."); msg(player2.getName() + " is an admin, and cannot have their block edits blocked.");
return true; return true;
} }
FUtil.staffAction(sender.getName(), "Blocking block modification abilities for " + player2.getName(), true); FUtil.adminAction(sender.getName(), "Blocking block modification abilities for " + player2.getName(), true);
pd.setEditBlocked(true); pd.setEditBlocked(true);
if (smite) if (smite)
@ -128,6 +130,8 @@ public class Command_blockedit extends FreedomCommand
msg(player2, "Your block modification abilities have been blocked.", ChatColor.RED); msg(player2, "Your block modification abilities have been blocked.", ChatColor.RED);
msg("Blocked all block modification abilities for " + player2.getName()); msg("Blocked all block modification abilities for " + player2.getName());
plugin.pul.logPunishment(new Punishment(player2.getName(), FUtil.getIp(player2), sender.getName(), PunishmentType.BLOCKEDIT, null));
} }
return true; return true;
} }

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