1
0

Commits vergleichen

...

676 Commits

Autor SHA1 Nachricht Datum
c0f8058c60 Push 2024-05-18 12:56:15 +02:00
153d354c60 Porta Porting 2024-04-11 00:22:55 +02:00
c6ccaa6abb A Starting point 2024-04-05 19:33:34 +02:00
59b2e397ba Controlify, Feather Client, Bugfixes
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-20 10:08:23 +01:00
a6feb68bf3 Geckolib, Waila, Midnightcontrols, Lambdacontrols
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-16 15:20:15 +01:00
457b787179 Update CommonCore, kick Litematica, kick MiniMaps
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-16 00:54:49 +01:00
9572347419 Fix sw:bridge, axiom, bau.steamwar.de
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-14 22:52:50 +01:00
a0a2d70c46 Add Various mods and Hostnames
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-14 21:51:35 +01:00
f214751d0b Merge pull request 'Add known Hostnames' (#511) from chaoscaot-add-hostnames-1 into master
Reviewed-on: SteamWar/BungeeCore#511
Reviewed-by: Lixfel <lixfel@steamwar.de>
2024-03-14 21:47:54 +01:00
8f3422dce6 Fix 2024-03-14 21:39:22 +01:00
2c6de937b3 src/de/steamwar/bungeecore/mods/Hostname.java aktualisiert
Signed-off-by: Chaoscaot <chaoscaot@zohomail.eu>
2024-03-14 21:36:38 +01:00
49238463a5 Add Scanner hostnames, Geyser, xAeroMiniMap, Axiom support
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-14 15:56:53 +01:00
0fd86300ac Passthrough sw:hotkeys, add optifine brand
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-14 12:18:27 +01:00
c74178abe1 Merge pull request 'Mod detection refactoring' (#509) from modDetectionRework into master
Reviewed-on: SteamWar/BungeeCore#509
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2024-03-14 11:42:23 +01:00
a3a65b0f53 Disable Replay by default (for now, until tests have been done)
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-14 11:42:01 +01:00
1c99a9fb4b Merge pull request 'Use new Referee table, Multi spectate server support' (#510) from wargearseason into master
Reviewed-on: SteamWar/BungeeCore#510
2024-03-14 09:34:30 +01:00
628e7b093c More elegant port solution
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-14 09:31:30 +01:00
dd90ee1ced Use new Referee table, Multi spectate server support
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-13 13:36:13 +01:00
8029dd09e9 Fix Node debug code changes, Debug messages, script_syntax,
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-11 22:29:22 +01:00
1e40decc9e Fix IP sanitizing impacts
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-04 12:44:33 +01:00
437d1c055c Fixed ReplayMod, FML2, FML3, FORGE, Hostname detection
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-03 18:36:28 +01:00
1436069cb5 Mod detection refactoring
Adding Lunar support
Fixing LabyMod support
Restricting ReplayMod
Restricting WorldDownloader
Enabling Fabric without FabricModSender
Adding logging for unknown channels

Untested.

Signed-off-by: Lixfel <agga-games@gmx.de>
2024-03-02 00:43:42 +01:00
yoyosource
b852423442 Fix messages 2024-02-17 09:09:14 +01:00
yoyosource
6f5bb3eb97 Fix HelpCommand 2024-02-17 09:06:25 +01:00
55d08ce0db Update CommonCore
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-02-17 08:34:09 +01:00
b3efb223af Merge pull request 'Update BauMemberPermission' (#505) from PermissionUpdate into master
Reviewed-on: SteamWar/BungeeCore#505
Reviewed-by: Lixfel <lixfel@steamwar.de>
2024-02-17 08:32:16 +01:00
74291bc143 Merge pull request 'Notify owner on lock blocking join' (#508) from buildLockNotification into master
Reviewed-on: SteamWar/BungeeCore#508
Reviewed-by: Chaoscaot <chaoscaot@zohomail.eu>
2024-02-13 10:52:52 +01:00
dabd880209 Notify owner on lock blocking join
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-02-06 22:34:23 +01:00
3b7fa8054d No Core Dumps on OOM/Crashes
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-02-06 22:20:45 +01:00
54b15ddd95 Remove TeamSpeak from tablist header
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-01-29 11:52:47 +01:00
70662386a7 Revert Hotfix: No fallback on server startup
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-01-20 09:00:01 +01:00
d7e9bb23fc Hotfix: No fallback on server startup
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-01-19 23:21:19 +01:00
yoyosource
04ebed15d3 Revert ServerStarter.builder startCondition
Fix CommonCore
2024-01-19 16:47:53 +01:00
yoyosource
9688c38954 Revert ServerStarter.builder startCondition 2024-01-19 16:44:52 +01:00
yoyosource
760cf4b3b1 Merge branch 'master' into PermissionUpdate
# Conflicts:
#	src/de/steamwar/bungeecore/ServerStarter.java
2024-01-19 16:37:51 +01:00
yoyosource
443a1b29c9 Fix messages
Fix ServerStarter condition
2024-01-19 16:30:47 +01:00
c7c541676c Fix java version
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-01-18 01:41:15 +01:00
d7a5b72f72 Merge pull request 'Checkpoint support' (#506) from checkpoint into master
Reviewed-on: SteamWar/BungeeCore#506
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2024-01-18 01:23:10 +01:00
510fed73d3 Fix missing ServerStarter
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-01-16 15:49:17 +01:00
f0e85c21ce Checkpoint support
Signed-off-by: Lixfel <agga-games@gmx.de>
2024-01-16 15:45:46 +01:00
9567bd4c3f Ignore incoming HTTP GET requests
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-12-30 20:47:47 +01:00
yoyosource
3752f3f145 Update BauMemberPermission 2023-12-22 17:07:14 +01:00
yoyosource
2cdbe68665 Fix Bau Lock messages 2023-12-22 10:22:33 +01:00
ed5f84dc20 Merge pull request 'Add BauLockState.TEAM_AND_SERVERTEAM and BauLockState.SERVERTEAM as requested by many' (#504) from ExtendedBauLock into master
Reviewed-on: SteamWar/BungeeCore#504
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-12-22 10:07:40 +01:00
yoyosource
c72a042bbb Add translations 2023-12-21 19:20:14 +01:00
yoyosource
334afbac63 Add BauLockState.TEAM_AND_SERVERTEAM and BauLockState.SERVERTEAM as requested by many 2023-12-21 18:15:23 +01:00
779d5f57dc Revert "Update Tablist colors"
This reverts commit 23291a7732.
2023-12-19 16:54:41 +01:00
5162c5b05b Revert "Fix NPE"
This reverts commit e1a0c4802f.
2023-12-19 16:54:41 +01:00
1b3ed278c6 Merge pull request 'Update Tablist colors' (#503) from TpAndTablist into master
Reviewed-on: SteamWar/BungeeCore#503
2023-12-19 16:53:09 +01:00
yoyosource
e1a0c4802f Fix NPE 2023-12-17 21:57:41 +01:00
yoyosource
23291a7732 Update Tablist colors 2023-12-17 21:32:24 +01:00
d22766fedd Merge pull request 'Add TpCommand tabcompletions for Teamserver players not joining from SteamWar' (#502) from TpAndTablist into master
Reviewed-on: SteamWar/BungeeCore#502
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-12-17 21:04:45 +01:00
yoyosource
5a0cf47878 Fix Peer Review issues 2023-12-17 20:31:53 +01:00
yoyosource
99f3ad5f03 Add TpCommand tabcompletions for Teamserver players not joining from SteamWar
Fix Tablist color for Teamserver players not joining from SteamWar
2023-12-17 19:52:50 +01:00
3d67919f0a Merge pull request 'Fix Tablist display names for SWTSI' (#500) from BetterSWTCITablistIntegration into master
Reviewed-on: SteamWar/BungeeCore#500
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-12-06 16:55:44 +01:00
yoyosource
c017fd23a1 Fix Tablist display names for SWTSI 2023-12-06 16:53:18 +01:00
a05ec1d6d9 Merge pull request 'Fix Tablist' (#499) from BetterSWTCITablistIntegration into master
Reviewed-on: SteamWar/BungeeCore#499
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-12-06 16:50:44 +01:00
yoyosource
28f09e54b9 Fix Tablist 2023-12-06 16:49:58 +01:00
7411d9d875 Merge pull request 'Add external players of teamserver to tablist of player' (#498) from BetterSWTCITablistIntegration into master
Reviewed-on: SteamWar/BungeeCore#498
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-12-06 16:41:41 +01:00
yoyosource
bdbe615790 Yoyo am losten 2023-12-06 16:39:41 +01:00
yoyosource
bfefd5a197 Remove some useless boolean inverts 2023-12-06 16:38:42 +01:00
yoyosource
56a9bd077c Add external players of teamserver to tablist of player 2023-12-06 16:35:30 +01:00
6dd35a265b Fix Tablist
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-12-06 12:33:07 +01:00
f270d4197b Fix tablist
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-12-06 12:26:20 +01:00
2d85746d9f Debug tablist
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-12-06 12:19:02 +01:00
9de6b8602d Tablist fix: Make similar to header and footer
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-12-06 12:07:43 +01:00
57b220f77c Tablist fix
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-12-06 12:01:53 +01:00
74cf9d4657 Tablist fix
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-12-06 11:57:35 +01:00
3ea910501a Fix Tablist for 1.20.3 Waterfall
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-12-06 11:40:34 +01:00
4979889468 Default to 1.20 Bau for Players > 1.19.4
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-12-05 16:31:14 +01:00
8e51002e6c Fix whois color code
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-11-29 18:34:41 +01:00
dad5c6029e Merge pull request 'Add restriction for checking own team schematics' (#494) from NoCheckingOfOwnTeamSchematics into master
Reviewed-on: SteamWar/BungeeCore#494
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-11-29 18:31:08 +01:00
yoyosource
a571832d67 Update Peer Review stuff and add message 2023-11-29 18:30:04 +01:00
yoyosource
6f31058d61 Remove CalendarCommand and CalendarListener from Bungee 2023-11-29 18:15:20 +01:00
e36d18ae9d Likely arena nametag fix.
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-11-29 18:10:56 +01:00
yoyosource
bb8b46c437 Add restriction for checking own team schematics 2023-11-29 17:49:24 +01:00
0df03a7dfb Star fixes, whois ID based only ADMINISTRATION, Prefix
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-11-29 17:20:19 +01:00
792bbd610d Merge pull request 'Fix QuickGear' (#493) from fix-quickgear into master
Reviewed-on: SteamWar/BungeeCore#493
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-11-29 16:37:22 +01:00
45cacced9d Fix QuickGear 2023-11-29 16:34:27 +01:00
d8d519765a Add QuickGear Rules, disable LevelHead on Badlion
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-11-29 16:22:06 +01:00
20481029c7 Merge pull request 'Help page addition: schem submit tutorial link' (#492) from helpSchemsubmit into master
Reviewed-on: SteamWar/BungeeCore#492
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-11-29 16:02:48 +01:00
c3a011d98e Help page addition: schem submit tutorial link
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-11-29 15:07:45 +01:00
yoyosource
183d43dadb Remove CalendarCommand and CalendarListener from Bungee 2023-11-28 20:47:17 +01:00
19903e9548 Fix playtime command
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-11-28 19:00:18 +01:00
04a2a31d80 Merge pull request 'Fix EloSchemHandler' (#489) from EloFixForPublicVsPublicAndRank into master
Reviewed-on: SteamWar/BungeeCore#489
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-10-28 20:28:52 +02:00
yoyosource
ec6cb89bdb Fix EloSchemHandler 2023-10-28 20:27:58 +02:00
3d64ee3b6f Merge pull request 'Fix ELO not given for public team vs public team' (#488) from EloFixForPublicVsPublicAndRank into master
Reviewed-on: SteamWar/BungeeCore#488
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-10-28 20:23:04 +02:00
yoyosource
9be6ec94dc Fix ELO not given for public team vs public team
Fix R1 vs R2
2023-10-25 08:29:22 +02:00
69720bfbd8 Merge pull request 'Add ModLoaderBlocker for lunar client' (#487) from LunarClient into master
Reviewed-on: SteamWar/BungeeCore#487
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-10-24 12:16:41 +02:00
yoyosource
d46c89101d Fix ModLoaderBlocker for Legacy API, if still used? 2023-10-24 11:37:36 +02:00
yoyosource
c4fcbdcb43 Add ModLoaderBlocker for lunar client 2023-10-24 11:10:24 +02:00
24d909a4da Fix eventreschedule perms
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-30 19:57:15 +02:00
6aeeff235a Fix eventreload perms
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-30 19:53:38 +02:00
65fcb5329f Queue Packets
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-24 08:27:55 +02:00
e981cf5c02 Merge pull request 'Remove player tabcomplete in every command' (#486) from BetterTabCompleting into master
Reviewed-on: SteamWar/BungeeCore#486
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-09-24 08:11:52 +02:00
yoyosource
5b627a7819 Fix some tab completions and optimize others 2023-09-23 13:22:43 +02:00
yoyosource
157aea068e Remove player tabcomplete in every command
Add player tab complete to every command needing it
Fix some tabcomplete things
2023-09-23 12:57:41 +02:00
38eb8d9c06 Fix BrandListener
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-22 07:45:14 +02:00
ffc2cefcfe Fix Tablist to have 1.20.2 compatibility #2
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-22 07:40:46 +02:00
0fc0954d82 Fix Tablist to have 1.20.2 compatibility
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-22 07:38:04 +02:00
43bd25c13e Disable ForgeHandler for 1.20.2+
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-22 07:29:53 +02:00
b892450e2d Merge pull request 'Automatic Random arena when not specified' (#485) from autoRandom into master
Reviewed-on: SteamWar/BungeeCore#485
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-09-16 11:45:47 +02:00
6fe4dbe13a Automatic Random arena when not specified
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-12 21:48:42 +02:00
dbc9ed8b57 Fix BanListener parsing
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-11 11:34:56 +02:00
ecf17dd347 Give Mods /mod permission
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-03 20:17:52 +02:00
244f922091 Change Colors
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-09-01 11:33:14 +02:00
ee05b42a07 Fix whois MODERATION
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-31 21:51:18 +02:00
fbbfc1bd03 Merge pull request 'Bau toggleall' (#482) from toggleall into master
Reviewed-on: SteamWar/BungeeCore#482
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-08-31 16:35:48 +02:00
1e9b5ead35 Fix behaviour
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-31 16:30:53 +02:00
19b12c0055 Merge pull request 'Remove external shutdown' (#484) from no-external-shutdown into master
Reviewed-on: SteamWar/BungeeCore#484
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-08-31 15:57:45 +02:00
e443235e34 Remove external shutdown
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-31 13:39:39 +02:00
cd044adc55 Rework whois
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-31 08:09:12 +02:00
a308f9b940 Update CommonCore
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-30 12:10:21 +02:00
af357cb554 Update CommonCore
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-29 20:04:59 +02:00
356afc9bff Update ColorChat Perm, Simplify BanListener
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-29 18:09:25 +02:00
2f928349d7 Update CommonCore
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-29 17:48:25 +02:00
7f05d0f9ca Update 4 years with various permission systems to UserPerm
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-29 17:47:49 +02:00
00e08b5943 Bau toggleall
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-26 00:30:43 +02:00
4db2ba6a5d Merge pull request 'Fix team leader stepdown and leaving' (#481) from teamDisband into master
Reviewed-on: SteamWar/BungeeCore#481
Reviewed-by: Chaoscaot <chaoscaot@zohomail.eu>
2023-08-25 17:26:24 +02:00
b35d5e214a Fix team leader stepdown and leaving
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-25 15:15:53 +02:00
3980961b76 Merge pull request 'Bau version refactoring, Bau 1.20 starter' (#480) from bau1.20 into master
Reviewed-on: SteamWar/BungeeCore#480
Reviewed-by: Chaoscaot <chaoscaot@zohomail.eu>
2023-08-20 21:56:20 +02:00
e5cc016652 Bau version refactoring, Bau 1.20 starter
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-20 21:46:15 +02:00
3db61577b0 Async builder deploy
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-19 13:28:26 +02:00
c0e1d3eff7 Fix script path
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-19 13:20:51 +02:00
6284cd8e7b Change to roundtrip-YAML parser
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-19 13:12:09 +02:00
443ce0377f Change to roundtrip-YAML parser
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-19 13:11:16 +02:00
0c3f200a91 Fix deployarena.py gamemode file loading
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-19 12:59:00 +02:00
8c03d2a348 Merge pull request 'Deploy arena command' (#479) from deployarena into master
Reviewed-on: SteamWar/BungeeCore#479
Reviewed-by: Chaoscaot <chaoscaot@zohomail.eu>
2023-08-19 12:54:21 +02:00
5aa402d6e8 Deploy arena command
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-19 12:39:58 +02:00
59168c3447 CommonCore update, 1.20 Buildercloud
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-08-17 22:53:31 +02:00
137ef647fb Fix buildercloud create
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-07-23 17:47:33 +02:00
1128a43010 Fix buildercloud
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-07-23 17:43:53 +02:00
5da9d55cb8 Merge pull request 'Buildercloud rework, no automatic map generation, renaming, hidden worlds' (#477) from buildercloud2 into master
Reviewed-on: SteamWar/BungeeCore#477
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-07-23 17:26:48 +02:00
yoyosource
df3e082774 Hotfix build 2023-07-18 22:11:19 +02:00
yoyosource
6192d0d458 Add user count to team info command 2023-07-18 22:09:17 +02:00
yoyosource
3254755e61 Fix elo again 2023-07-18 18:28:42 +02:00
yoyosource
e99f24b01b Fix another elo related thing 2023-07-18 18:21:31 +02:00
01c90dc4ae Buildercloud rework, no automatic map generation, renaming, hidden worlds
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-07-14 15:44:52 +02:00
yoyosource
4dad89ec34 Update EloPlayerHandler.MEDIAN_ELO_GAIN and add EloPlayerHandler.MEDIAN_ELO_LOSE 2023-06-26 21:42:51 +02:00
4385cd3589 Decrease logging spam
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-06-10 17:57:13 +02:00
eacf7fd6cf Fix SchemElo SchemID
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-05-23 19:52:18 +02:00
feeca8f523 Merge pull request 'Add Gradle Plugin' (#476) from gradle_plugin into master
Reviewed-on: SteamWar/BungeeCore#476
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-05-22 09:20:40 +02:00
e5d48024cb Add Gradle Plugin 2023-05-21 20:48:57 +02:00
yoyosource
8ed0847bcc Hotfix EloPlayer calculation 2023-05-20 10:46:28 +02:00
yoyosource
e43a724550 Hotfix ELO_LOSE_CONSTANT 2023-05-15 16:48:23 +02:00
yoyosource
9385f57612 Remove logging 2023-05-14 12:39:52 +02:00
yoyosource
6002af7f6a Hotfix die letzte 2023-05-14 12:38:46 +02:00
yoyosource
60d5a04d0c Add logging 2023-05-14 12:35:52 +02:00
yoyosource
9e1653740d Hotfix (the last one hopefully) for the Elo handling 2023-05-14 11:26:36 +02:00
yoyosource
618c4d24a2 Hotfix (the last one hopefully) for the Elo handling 2023-05-14 10:34:14 +02:00
yoyosource
fbcb043d1c Fix team ratio scaling 2023-05-13 16:27:45 +02:00
yoyosource
fcd686a9ba Hotfix the cache 2023-05-13 16:01:36 +02:00
yoyosource
4422fbdc8b Hotfix team elo scaling 2023-05-13 15:35:47 +02:00
yoyosource
9af07f821d Update Title style 2023-05-13 14:38:42 +02:00
yoyosource
7cd4a5bac8 Update messages and cleanup RankCommand visual clutter 2023-05-13 13:14:55 +02:00
yoyosource
6c540c3bac Hotfix some player connection issues for title sending 2023-05-13 09:02:20 +02:00
yoyosource
9e6c6ace27 Update CommonCore 2023-05-12 23:40:26 +02:00
yoyosource
aaadb0e5e2 Update some more stuff 2023-05-12 23:36:48 +02:00
yoyosource
6ed534bcb3 Hotfix TeamCommand.tp 2023-05-12 23:29:28 +02:00
yoyosource
6848bac447 Update some more stuff 2023-05-12 23:24:54 +02:00
yoyosource
6a3c47994a Add logging 2023-05-12 23:15:11 +02:00
ab207b2234 Merge pull request 'Update to new ranked system' (#475) from NewRankedSystem into master
Reviewed-on: SteamWar/BungeeCore#475
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-05-12 22:56:41 +02:00
yoyosource
5e09d018ba Update CommonCore 2023-05-12 22:54:54 +02:00
yoyosource
0c0cf594c4 Remove german translation 2023-05-11 16:13:47 +02:00
yoyosource
9039928eb4 Update to new ranked system 2023-05-11 16:06:27 +02:00
44e9c084c7 Update CommonCore
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-05-11 09:10:55 +02:00
3fa5e51f30 Merge pull request 'Only send FabricModSender messages if required.' (#474) from reduceJoinSpam into master
Reviewed-on: SteamWar/BungeeCore#474
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-05-09 15:26:54 +02:00
98e80442b2 Only send FabricModSender messages if required.
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-05-09 12:51:24 +02:00
yoyosource
65950a939b Merge remote-tracking branch 'origin/master' 2023-05-06 21:18:29 +02:00
yoyosource
4b38ed7c54 Hotfix TeamCommand.tp 2023-05-06 21:18:24 +02:00
3df1e556ae Merge pull request 'NoClassGC' (#473) from noclassgc into master
Reviewed-on: SteamWar/BungeeCore#473
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-05-02 09:38:33 +02:00
5ac85f4e9d NoClassGC
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-05-02 09:36:11 +02:00
yoyosource
ff75a43c11 Hotfix die zweite 2023-05-01 11:33:46 +02:00
yoyosource
95a9e8d2a6 Merge remote-tracking branch 'origin/master' 2023-05-01 11:22:06 +02:00
yoyosource
ab24041d44 Fix CommonCore startOfSeason 2023-05-01 11:22:02 +02:00
4052e342fb Merge pull request 'Fix Fight Merging' (#472) from fix_fight_merging into master
Reviewed-on: SteamWar/BungeeCore#472
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-05-01 10:29:35 +02:00
efc7a3fe48 Fix Fight Merging 2023-05-01 10:10:25 +02:00
4f42c0eca4 Merge pull request 'RuleCommandUpdate' (#469) from RuleCommandUpdate into master
Reviewed-on: SteamWar/BungeeCore#469
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-04-20 23:32:29 +02:00
MoBrot
481d4a7892 English translation 2023-04-20 19:33:01 +02:00
ead97b9f87 Merge pull request 'Update MsgCommand' (#468) from FixMsgCommand into master
Reviewed-on: SteamWar/BungeeCore#468
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-04-17 20:53:35 +02:00
yoyosource
4b33bd8082 Update MsgCommand 2023-04-17 20:51:15 +02:00
yoyosource
97934be675 Hotfix PunishmentCommand messages 2023-04-10 12:07:04 +02:00
cb87862596 Merge pull request 'Scream Message' (#466) from scream into master
Reviewed-on: SteamWar/BungeeCore#466
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-04-06 22:50:19 +02:00
1b05b66463 I wanna scream and shout 2023-04-06 21:00:03 +02:00
84c8ad6807 I wanna scream and shout 2023-04-06 20:57:48 +02:00
2a91876cb9 FabricModSender PP Circumventer notification
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-04-05 08:11:08 +02:00
MoBrot
265c841920 Add Code of Conduct to RegelnCommand 2023-03-19 22:26:25 +01:00
630ee612e0 Merge pull request 'Fix NoFight punishment for EventCommand' (#465) from FixNoFightServerPunishmentForEventCommand into master
Reviewed-on: SteamWar/BungeeCore#465
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-03-13 16:38:28 +01:00
yoyosource
341cff0507 Fix NoFight punishment for EventCommand 2023-03-13 16:31:11 +01:00
92da1d8bc2 Fix Tab Team
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-03-11 21:35:28 +01:00
1f83004d64 Fix tutorial rate misusers
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-03-10 11:50:47 +01:00
9b79a9c593 Merge pull request 'Fix Reasonless Punishments' (#464) from reasonless into master
Reviewed-on: SteamWar/BungeeCore#464
Reviewed-by: YoyoNow <jwsteam@nidido.de>
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-03-07 15:39:31 +01:00
yoyosource
24d4c9b213 Update CommonCore 2023-03-05 21:59:30 +01:00
yoyosource
b6612fcf37 Update CommonCore 2023-03-05 21:55:10 +01:00
a0f21a95da Fix Reasonless Punishments 2023-03-05 15:39:38 +01:00
yoyosource
0d45cacbbc Merge remote-tracking branch 'origin/master' 2023-03-04 12:36:57 +01:00
yoyosource
b5ca36c0d1 Update CommonCore 2023-03-04 12:36:53 +01:00
09c600ebed Update CommonCore
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-03-04 12:13:20 +01:00
1a6fbb5a19 Update CommonCore
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-03-04 12:12:24 +01:00
2f2584a6ae No Discord on EventBungee
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-03-04 11:55:58 +01:00
603f3a09bf Fix zero broadcast messages
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-03-03 18:00:59 +01:00
ed3f8d8362 Change to 1.19.3
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-03-03 16:14:34 +01:00
5c6390f1f1 Fix MemberCache invalidation
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-26 15:50:34 +01:00
0db89d1424 Update BannedUserIPs
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-25 07:35:48 +01:00
891f39b28e Fix formatting
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-24 20:21:57 +01:00
yoyosource
ad535f2788 Merge remote-tracking branch 'origin/master' 2023-02-24 20:21:26 +01:00
yoyosource
758365bc76 Hotfix TeamCommand 2023-02-24 20:21:21 +01:00
6e52fd7ded Hotfix NPE
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-24 17:08:26 +01:00
a681edd57e Hotfix NPE
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-24 13:36:26 +01:00
c096c5cbdf Update CommonCore
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-24 10:39:54 +01:00
2f7f561c16 Add BIS 2023-02-24 10:25:03 +01:00
2a69cadda8 Fix Schematic Upload 2023-02-24 10:15:45 +01:00
7750398466 Fix Queries 2023-02-24 09:31:35 +01:00
37dc1df094 Add License Header 2023-02-23 18:20:04 +01:00
724246e48e Update to CommonDB 2023-02-23 17:33:30 +01:00
a4509ab88e Merge branch 'master' into seperate_schemdata
# Conflicts:
#	src/de/steamwar/bungeecore/sql/SchematicNode.java
2023-02-23 17:29:21 +01:00
4441e9fa0c Update CommonCore: Team Lookup fix
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-23 14:04:05 +01:00
c0822b726b Merge pull request 'NoFabricFabric' (#460) from NoFabricFabric into master
Reviewed-on: SteamWar/BungeeCore#460
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-02-23 10:21:31 +01:00
yoyosource
0d6e1f54bd Update check 2023-02-23 08:35:43 +01:00
e2e2366759 Merge pull request 'CommonDB' (#463) from commonDB2 into master
Reviewed-on: SteamWar/BungeeCore#463
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-02-23 08:09:24 +01:00
06432868cc Update to CommonCore master
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-23 08:07:29 +01:00
yoyosource
242e19adb2 Hotfix TeamCommand tp and join 2023-02-22 20:07:06 +01:00
yoyosource
b096f8251c Hotfix TeamCommand info 2023-02-22 16:51:45 +01:00
99750ca767 Fix Bugs
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-22 16:18:16 +01:00
yoyosource
6e30c5e7ba Hotfix TeamCommand info 2023-02-22 15:15:55 +01:00
5c9394e4b0 Merge branch 'master' into commonDB2
# Conflicts:
#	src/de/steamwar/bungeecore/commands/BasicCommand.java
#	src/de/steamwar/bungeecore/commands/EventCommand.java
#	src/de/steamwar/bungeecore/commands/JoinmeCommand.java
#	src/de/steamwar/bungeecore/commands/TeamCommand.java
#	src/de/steamwar/bungeecore/commands/TeamchatCommand.java
2023-02-22 07:12:23 +01:00
3136c2f6d9 Merge pull request 'port_to_commandframework' (#457) from port_to_commandframework into master
Reviewed-on: SteamWar/BungeeCore#457
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-02-22 07:10:32 +01:00
yoyosource
02c8538d76 Fix another some weird tab completes 2023-02-21 20:49:38 +01:00
yoyosource
ba064a1f9e Fix another one 2023-02-21 20:45:00 +01:00
yoyosource
87db98a310 Fix 3 things 2023-02-21 20:38:19 +01:00
734de7178b Es ist vollbracht
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-21 20:03:36 +01:00
c4bafb4591 WIP CommonDB: Milestone SWUser
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-21 18:22:42 +01:00
4d535c5550 Merge branch 'master' into commonDB2
# Conflicts:
#	CommonCore
2023-02-21 15:58:18 +01:00
6699e3843f Seperate SchematicData 2023-02-21 13:31:03 +01:00
8a20d41f95 Hotfix LoginResult
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-20 17:05:44 +01:00
978fd1abe0 Fix Quilt FabricModSender requirement
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-19 22:46:58 +01:00
79a5e711c8 Merge branch 'master' into NoFabricFabric 2023-02-18 15:57:42 +01:00
yoyosource
0dd50c7e09 Update timings 2023-02-18 12:54:34 +01:00
yoyosource
05b6b3ac66 Add even better fabric check 2023-02-18 12:49:24 +01:00
yoyosource
42c23e4521 Add exception log 2023-02-18 11:04:29 +01:00
6735bf4d6a Merge pull request 'Add NonFabricFabricCheck' (#458) from NoFabricFabric into master
Reviewed-on: SteamWar/BungeeCore#458
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-02-17 17:42:25 +01:00
yoyosource
68a2f78e04 Update messages 2023-02-17 17:33:56 +01:00
yoyosource
5d70cc4185 Update messages 2023-02-17 17:25:58 +01:00
yoyosource
91e73eab25 Update messages 2023-02-17 17:24:49 +01:00
yoyosource
e4ab48a386 Fix vanilla brand check 2023-02-17 17:22:49 +01:00
yoyosource
277304b7f2 Fix vanilla brand check 2023-02-17 17:15:30 +01:00
yoyosource
bc44380c32 Add NonFabricFabricCheck 2023-02-17 17:13:46 +01:00
a0dd4f5c57 HotFix Tablistpart
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-17 17:09:05 +01:00
yoyosource
9dd3cb7697 Update JoinmeCommand ProxiedPlayer Validator
Fix typos in TeamCommand
2023-02-17 15:27:20 +01:00
yoyosource
dd8d65ff9d Merge remote-tracking branch 'origin/port_to_commandframework' into port_to_commandframework 2023-02-17 15:22:09 +01:00
yoyosource
6de8ed282b Add usage messsage on no permission 2023-02-17 15:22:05 +01:00
dfcb754a83 Merge branch 'master' into port_to_commandframework 2023-02-17 15:16:51 +01:00
yoyosource
b3a4c93c59 Update stuff 2023-02-17 15:08:55 +01:00
e26ee5f389 Merge pull request 'Improve needed mods check' (#456) from BetterNeededMods into master
Reviewed-on: SteamWar/BungeeCore#456
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-02-17 14:58:29 +01:00
yoyosource
f524cb61dc Final fixes 2023-02-17 14:57:23 +01:00
yoyosource
3f9f9546f6 Improve needed mods check 2023-02-17 14:51:03 +01:00
8581d9e102 Merge branch 'master' into commonDB2
# Conflicts:
#	CommonCore
#	src/de/steamwar/bungeecore/commands/CheckCommand.java
2023-02-17 12:14:39 +01:00
27c241f2d4 Fix CheckCommand schematic deleted
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-17 11:54:20 +01:00
be6538c78d WIP CommonDB
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-17 11:47:58 +01:00
6e2546a596 Merge pull request 'ModCommand' (#445) from ModCommand into master
Reviewed-on: SteamWar/BungeeCore#445
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-02-14 09:13:45 +01:00
01322548ef Merge branch 'master' into ModCommand 2023-02-12 20:34:26 +01:00
52b180468a Merge pull request 'Fix Logging of Upload schem to fix the whole thing' (#455) from schem_upload_logging into master
Reviewed-on: SteamWar/BungeeCore#455
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-02-08 22:39:52 +01:00
b0eedf3944 Merge branch 'master' into ModCommand 2023-02-06 17:19:28 +01:00
zOnlyKroks
e3f84c0b4d Fix license header 2023-02-06 17:19:10 +01:00
a40ad699f5 Fix Logging of Upload schem to fix the whole thing 2023-02-05 23:42:35 +01:00
871e45ffbb WIP CommonDB
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-04 12:55:08 +01:00
be14a8cfcc Merge branch 'master' into commonDB2
# Conflicts:
#	CommonCore
2023-02-04 12:53:14 +01:00
yoyosource
0c13308997 Fix quotes 2023-02-03 19:25:31 +01:00
48cdfe35f0 Fix Bugs and code problems
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-02-02 11:02:36 +01:00
yoyosource
7611abe4dc Remove BasicCommand 2023-01-23 18:28:12 +01:00
yoyosource
561289b5a6 Update TeamCommand (not finished) 2023-01-23 18:15:37 +01:00
yoyosource
d559c61846 Update TeamCommand (not finished) 2023-01-23 18:00:06 +01:00
yoyosource
88ff8d8e74 Update TeamCommand (not finished) 2023-01-23 16:37:08 +01:00
9c73ce868d WIP CommonDB 2
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-01-23 16:31:13 +01:00
be5833c0d0 WIP CommonDB 2
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-01-23 16:30:35 +01:00
zOnlyKroks
87efa9659d Fix more weird errors 2023-01-23 15:44:31 +01:00
zOnlyKroks
7dee43c868 Resolve Merge Conflicts 2023-01-23 15:40:42 +01:00
zOnlyKroks
39c52211a8 Merge branch 'master' into ModCommand
# Conflicts:
#	src/de/steamwar/bungeecore/listeners/ConnectionListener.java
#	src/de/steamwar/bungeecore/sql/Mod.java
2023-01-23 15:39:58 +01:00
yoyosource
a15cf2c94e Update JoinmeCommand 2023-01-21 22:28:46 +01:00
yoyosource
647702c0b0 Update JoinmeCommand 2023-01-21 22:22:55 +01:00
yoyosource
29945a351b Update EventCommand 2023-01-21 22:17:41 +01:00
yoyosource
9f9d082042 Update TpCommand 2023-01-21 16:49:39 +01:00
zOnlyKroks
334459b848 Smaller tweaks 2023-01-21 16:31:19 +01:00
zOnlyKroks
24456458de Rework two commands 2023-01-21 16:18:47 +01:00
b4ad223831 Update CommonCore
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-01-20 11:09:13 +01:00
yoyosource
527b1aee45 Update CommonCore 2023-01-19 17:23:24 +01:00
c0536e35e2 Merge pull request 'Move BungeeCore-SQL to use CommonDB Statement backend' (#446) from commonDB1 into master
Reviewed-on: SteamWar/BungeeCore#446
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2023-01-18 11:15:20 +01:00
b000745fcd Merge pull request 'Update WhoisCommand and make it public' (#447) from PublicWoisCommand into master
Reviewed-on: SteamWar/BungeeCore#447
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-01-17 16:43:53 +01:00
yoyosource
95686121a7 Update WhoisCommand and make it public 2023-01-17 16:42:50 +01:00
yoyosource
10f623b0e4 Update WhoisCommand and make it public 2023-01-17 16:15:43 +01:00
zOnlyKroks
58fb831950 Push fixes 2023-01-16 20:11:58 +01:00
zOnlyKroks
fc5c4922db Revert unwanted changes 2023-01-16 20:03:33 +01:00
zOnlyKroks
fe67ad4b60 Update messanges 2023-01-16 20:01:30 +01:00
990016aac7 Move BungeeCore-SQL to use CommonDB Statement backend
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-01-15 22:25:04 +01:00
9af9e84723 Set more sensible initial heap size for faster server startup time
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-01-15 21:19:19 +01:00
e859fe9211 Merge pull request 'Whois Fabric Mod Info' (#444) from whois_fabric_mods into master
Reviewed-on: SteamWar/BungeeCore#444
Reviewed-by: Lixfel <lixfel@steamwar.de>
2023-01-15 16:42:17 +01:00
35232e63c3 Merge branch 'master' into whois_fabric_mods 2023-01-15 16:20:23 +01:00
zOnlyKroks
5825c69fb9 Merge remote-tracking branch 'origin/whois_fabric_mods' into whois_fabric_mods 2023-01-15 16:19:52 +01:00
zOnlyKroks
184d157276 fix illegal argument exception 2023-01-15 16:19:43 +01:00
6fc3bc9ab2 Adjust CI
Signed-off-by: Lixfel <agga-games@gmx.de>
2023-01-15 12:25:54 +01:00
yoyosource
aa9bd8b00f Revert CommonCore 2023-01-13 22:18:36 +01:00
yoyosource
3303362f48 Revert CommonCore 2023-01-13 22:16:37 +01:00
zOnlyKroks
5d979310ff Fix pushed commoncore 2023-01-13 22:05:13 +01:00
zOnlyKroks
a39544abc6 Fix a minor unnecessary change 2023-01-10 13:34:35 +01:00
zOnlyKroks
8def39d376 Finalise GUI and implement item names (not yet final) 2023-01-10 13:27:13 +01:00
zOnlyKroks
69aa98e82e Finalise GUI and implement item names (not yet final) 2023-01-08 14:21:29 +01:00
zOnlyKroks
60f6a9cb4c remove typo 2023-01-06 23:41:41 +01:00
zOnlyKroks
d58ae049cf Ingamegui Working 2023-01-06 23:41:03 +01:00
zOnlyKroks
c59da8ff49 wip ingame gui 2023-01-06 22:11:25 +01:00
zOnlyKroks
dc234b2b33 Push fixes 2023-01-04 20:31:31 +01:00
zOnlyKroks
e0a1542b03 Check if mod exists in database 2023-01-04 15:15:16 +01:00
zOnlyKroks
1bec6c4cd4 Push initial implementation 2023-01-04 12:00:27 +01:00
zOnlyKroks
93d530830d fix nullpointer 2023-01-03 21:38:30 +01:00
zOnlyKroks
8b96e5d853 fix lang 2023-01-03 21:33:37 +01:00
zOnlyKroks
d8d1f97790 Count total size of modlist 2023-01-03 18:28:47 +01:00
yoyosource
9f6db3d639 Fix some stuff 2023-01-03 18:22:19 +01:00
zOnlyKroks
b12e1ee1fa Fix a few things 2023-01-03 16:18:07 +01:00
zOnlyKroks
62484dfea2 Correct message formatting 2023-01-03 13:41:21 +01:00
zOnlyKroks
391859b61f Correct message formatting 2023-01-03 13:39:06 +01:00
zOnlyKroks
1189ee9d77 Correct message formatting 2023-01-03 13:37:45 +01:00
zOnlyKroks
cabac4f533 Revert deletion of more old unused code 2023-01-03 13:35:11 +01:00
zOnlyKroks
99deeeb173 Fix formatting error + revert deletion of old code 2023-01-03 13:33:09 +01:00
zOnlyKroks
798009176c fix a few small things 2023-01-03 13:13:19 +01:00
zOnlyKroks
ed55af8952 Make it use more mod loader + add modloader + color coding 2023-01-02 23:54:24 +01:00
zOnlyKroks
b6365d32f7 Rework whois command 2023-01-02 13:05:52 +01:00
zOnlyKroks
abe45da57d Fix mod list array 2023-01-01 21:05:34 +01:00
zOnlyKroks
c2a962a865 Initial whois Fabric Mod Implementation 2023-01-01 16:19:57 +01:00
yoyosource
59854ef3f0 Add SWScriptSyntaxForwarder 2022-12-25 11:53:41 +01:00
yoyosource
77811f7160 Fix CalendarCommand 2022-12-24 12:02:16 +01:00
yoyosource
4904e9b60f Merge remote-tracking branch 'origin/master' 2022-12-17 12:29:14 +01:00
yoyosource
31253f284f Hotfix BauCommand testarena random map 2022-12-17 12:29:08 +01:00
e6d0bcc69f Disable LX
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-12-14 09:05:15 +01:00
5fd0dcae65 Fix NPC removal in Tablist
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-12-10 12:38:07 +01:00
0c509bdfdc Test fix tablist order
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-12-10 12:30:10 +01:00
3be4da2392 Fix local Chat 1.19 - 1.19.2
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-12-10 11:25:22 +01:00
37f32033db Merge pull request 'Adapt to BungeeCord 1.19.3 API changes' (#443) from 1.19.3 into master
Reviewed-on: SteamWar/BungeeCore#443
2022-12-10 01:03:28 +01:00
c8901fd58d Rebuild
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-12-10 01:02:20 +01:00
bcc5cc82d0 Adapt to BungeeCord 1.19.3 API changes
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-12-10 00:59:14 +01:00
64b4865e6f Adapt to BungeeCord 1.19.3 API changes
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-12-07 19:45:38 +01:00
yoyosource
c6235ded6e Hotfix CalendarCommand 2022-12-03 11:39:29 +01:00
15fedebff1 Merge pull request 'AdventCalendar' (#442) from AdventCalendar into master
Reviewed-on: SteamWar/BungeeCore#442
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-11-27 18:54:24 +01:00
yoyosource
b2b51fa9b2 Finalize CalendarCommand 2022-11-25 08:05:40 +01:00
yoyosource
6b0c30c241 Finalize CalendarCommand 2022-11-24 17:26:29 +01:00
yoyosource
ca4a5b49dd Update calendar content 2022-11-23 21:02:31 +01:00
yoyosource
40d10b5e39 Add message to CalendarListener 2022-11-22 16:51:13 +01:00
yoyosource
dbd9f977fd Add Listener 2022-11-22 16:44:35 +01:00
yoyosource
2e7c9e0fc7 Fix click 2022-11-22 16:43:53 +01:00
yoyosource
e024282a20 Add CalendarListener 2022-11-22 16:39:24 +01:00
yoyosource
11a63101f1 Add CalendarCommand 2022-11-21 18:02:50 +01:00
yoyosource
ef11620e2f Hotfix PunishmentCommand.parseTime 2022-11-01 23:22:24 +01:00
yoyosource
24a3885e2f Hotfix PunishmentCommand 2022-11-01 22:54:51 +01:00
yoyosource
24bfb12941 Hotfix TablistServer 2022-11-01 22:14:19 +01:00
83839a292a Merge pull request 'Add relative punishment times' (#439) from RelativePunishments into master
Reviewed-on: SteamWar/BungeeCore#439
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-10-28 10:10:12 +02:00
yoyosource
356db56da3 Hotfix weird tablist behaviour 2022-10-25 21:14:51 +02:00
yoyosource
2b5b2c2443 Hotfix weird tablist behaviour 2022-10-25 21:08:52 +02:00
yoyosource
c0195c1592 Add relative punishment times 2022-10-24 18:03:01 +02:00
67a7b60bdc Merge pull request 'Add Team showcase in tablist' (#438) from TeamTablist into master
Reviewed-on: SteamWar/BungeeCore#438
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-10-24 17:44:15 +02:00
yoyosource
79bd9598c7 Add Team showcase in tablist 2022-10-24 17:42:55 +02:00
yoyosource
fe4280f9e3 Add Team showcase in tablist 2022-10-24 17:30:02 +02:00
yoyosource
f2a8cb064e Add Team showcase in tablist 2022-10-24 17:27:19 +02:00
3606e75ab6 Merge branch 'master' into TeamTablist 2022-10-24 17:17:35 +02:00
yoyosource
70a8d8e3ed Add Team showcase in tablist 2022-10-24 17:16:16 +02:00
e0e18cab92 No autopermaban
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-10-13 13:04:58 +02:00
2c896e204f Reduce error spam
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-10-10 16:54:05 +02:00
56cd61623d Change reader null message
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-10-07 14:14:41 +02:00
yoyosource
befae2d821 Hotfix HistoricCommand 2022-10-06 22:24:12 +02:00
yoyosource
e0ff7b5231 Hotfix EventRescheduleCommand 2022-10-06 22:18:15 +02:00
404462044a Test tablist with remove
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-10-02 22:56:50 +02:00
ed9aa9082d Fix 1.19 Tutorial rate
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-28 16:43:29 +02:00
435dcfceba Add lx
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-28 13:39:25 +02:00
yoyosource
a66372e5f7 Undo TypeMappers 2022-09-24 11:27:25 +02:00
yoyosource
0296716a4e Hotfix TypeMappers 2022-09-24 11:15:40 +02:00
yoyosource
5bfb2d5c71 Hotfix TypeMappers 2022-09-24 11:02:37 +02:00
yoyosource
4205bce893 Hotfix BauCommand 2022-09-20 13:56:46 +02:00
93c96aea08 Merge pull request 'Update BauCommand' (#428) from BauCommand into master
Reviewed-on: SteamWar/BungeeCore#428
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-09-20 13:17:52 +02:00
yoyosource
09cfb97e32 Add own help message 2022-09-19 11:22:49 +02:00
yoyosource
60ed5da260 Hotfix versionselector() remove default 2022-09-19 11:14:22 +02:00
yoyosource
3aa3776c59 Hotfix versionselector() order 2022-09-19 11:08:33 +02:00
1e0eb5c039 Merge pull request 'Show no Chat Reports' (#436) from show_no_chat_reports into master
Reviewed-on: SteamWar/BungeeCore#436
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2022-09-19 10:53:31 +02:00
yoyosource
43b123f2cf Hotfix StatCommand 2022-09-18 13:46:39 +02:00
4c0afb4bbd More Copyright 2022-09-18 11:53:29 +02:00
1168f8cc86 Add Copyright 2022-09-18 11:52:57 +02:00
a028db5462 Show no Chat Reports (Next to chat and Server List for NoChatReportsMod) 2022-09-18 11:51:36 +02:00
yoyosource
c36a6885cf Fix merge conflicts 2022-09-17 11:34:51 +02:00
yoyosource
47dd2503cf Merge branch 'master' into BauCommand
# Conflicts:
#	src/de/steamwar/bungeecore/commands/BauCommand.java
2022-09-17 11:33:10 +02:00
4cfb7830f9 Merge pull request '+Fixed player connect with teleport' (#435) from BauLock into master
Reviewed-on: SteamWar/BungeeCore#435
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-09-17 09:30:15 +02:00
MoBrot
27ddb447fe Merge remote-tracking branch 'origin/BauLock' into BauLock 2022-09-16 23:39:12 +02:00
MoBrot
e483e32b31 +Add BauLock copyright header 2022-09-16 23:38:55 +02:00
be41928520 Merge branch 'master' into BauLock 2022-09-16 23:30:02 +02:00
MoBrot
3e9bd2768b +Fixed player connect with teleport 2022-09-16 23:27:52 +02:00
yoyosource
eb8d8380d9 Update BauCommand 2022-09-14 17:54:25 +02:00
yoyosource
1a51e2c6a2 Merge branch 'master' into BauCommand
# Conflicts:
#	src/de/steamwar/bungeecore/commands/BauCommand.java
2022-09-14 17:47:48 +02:00
160d482392 Merge pull request 'Add BauLock' (#415) from BauLock into master
Reviewed-on: SteamWar/BungeeCore#415
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-09-14 11:51:49 +02:00
MoBrot
451de152b2 +Fixed noby and IllegalArgumentException 2022-09-13 22:52:38 +02:00
MoBrot
e5ba1ad633 Merge remote-tracking branch 'origin/BauLock' into BauLock
# Conflicts:
#	src/de/steamwar/bungeecore/commands/BauCommand.java
2022-09-13 22:36:27 +02:00
338772c002 Merge pull request 'BauLock2' (#432) from BauLock2 into BauLock
Reviewed-on: SteamWar/BungeeCore#432
2022-09-13 22:35:17 +02:00
f9f0f83779 Don't kick players
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-13 22:34:59 +02:00
MoBrot
133f795c8f Merge remote-tracking branch 'origin/BauLock' into BauLock 2022-09-13 22:07:09 +02:00
093b861342 Merge pull request 'Fix Double Bans' (#434) from fix_double_bans into master
Reviewed-on: SteamWar/BungeeCore#434
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-09-12 17:56:22 +02:00
02c81068e7 Fix Double Bans 2022-09-12 17:54:42 +02:00
85c5201c82 Fix language
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-11 20:10:17 +02:00
6c9f9d17f8 Merge pull request 'Whois Fixes' (#433) from whois_fix into master
Reviewed-on: SteamWar/BungeeCore#433
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-09-11 20:05:18 +02:00
2919283963 Whois Fixes 2022-09-11 20:04:24 +02:00
7377f5513a Fix several issues
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-11 18:34:50 +02:00
fd1efaa22b Fix case sensitivity
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-11 18:16:06 +02:00
29a30ec5bb Fix missing return
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-11 18:11:58 +02:00
e83b399593 Fix wrong CommonDB
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-11 18:09:23 +02:00
3e1d60245a Fix fatal issues
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-11 18:08:42 +02:00
39562c9923 Merge pull request 'Bump JDA & close Inpustream' (#431) from fix_bot_upload into master
Reviewed-on: SteamWar/BungeeCore#431
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-09-11 15:29:36 +02:00
1af7b03987 Bump JDA & close Inpustream 2022-09-11 15:28:37 +02:00
197180631f Merge pull request 'Add current infos to Whois' (#430) from more_whois into master
Reviewed-on: SteamWar/BungeeCore#430
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-09-11 15:02:42 +02:00
d7530cae86 Add current infos to Whois 2022-09-09 20:38:37 +02:00
yoyosource
eee3dba1de Simplify arena map typemapper 2022-09-09 16:35:05 +02:00
yoyosource
6206a80cc1 Merge remote-tracking branch 'origin/master' 2022-09-09 16:11:39 +02:00
yoyosource
9e579ee3d6 Hotfix case sensitive maps 2022-09-09 16:11:34 +02:00
1cbec668d1 Merge branch 'master' into BauLock
# Conflicts:
#	src/de/steamwar/bungeecore/commands/HelpCommand.java
2022-09-09 15:49:04 +02:00
6ab0d3d983 Remove could not decode from ErrorLogger
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-09 08:40:55 +02:00
MoBrot
d4cd8a16a0 +Removed not used if statement 2022-09-08 21:32:41 +02:00
MoBrot
9a5b938fba +Fixed Owner message when locked 2022-09-08 21:28:21 +02:00
MoBrot
fe0d0eaffb +Add Owner message when bau is locked for Team 2022-09-08 20:49:17 +02:00
yoyosource
42898b0d4d Hotfix npe 2022-09-08 19:45:20 +02:00
yoyosource
88724c75e3 Merge remote-tracking branch 'origin/master' 2022-09-08 18:24:38 +02:00
yoyosource
e3e68af80f Hotfix ServerTeamchatCommand 2022-09-08 18:24:31 +02:00
3d958800fc Remove sorted checker in fabric
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-08 17:29:25 +02:00
150cf78607 Merge pull request 'Overload protection' (#429) from overloadProtection into master
Reviewed-on: SteamWar/BungeeCore#429
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2022-09-06 20:51:14 +02:00
yoyosource
19c02ad786 Merge remote-tracking branch 'origin/overloadProtection' into BauCommand 2022-09-06 20:06:03 +02:00
43d5cb47bb Overload protection
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-09-06 19:08:00 +02:00
yoyosource
4c44bc0a83 Update BauCommand 2022-09-06 17:13:15 +02:00
yoyosource
2676f97cfb Hotfix TypeMappers 2022-09-06 16:45:56 +02:00
baef387fdb Merge pull request 'Commands' (#427) from Commands into master
Reviewed-on: SteamWar/BungeeCore#427
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-09-06 15:44:36 +02:00
yoyosource
16c3f93741 Fix stuff 2022-09-06 15:36:27 +02:00
yoyosource
2325190cf1 Fix stuff 2022-09-03 14:33:00 +02:00
MoBrot
ef6435b176 +Fix BauCommand.setLocked
+Fix BauCommand.isLocked
+Update BauLockState.NONE to BauLockState.NOBODY
+Move Userconfig.getUserLockState to BauCommand
2022-09-02 14:27:27 +02:00
yoyosource
669375e751 Update ChallengeCommand
Update FightCommand
Update HistoricCommand
2022-09-01 18:39:08 +02:00
yoyosource
7de6402a63 Update ChallengeCommand 2022-09-01 18:24:56 +02:00
yoyosource
cb591fda59 WIP 2022-09-01 18:01:51 +02:00
e58fe20082 Merge pull request 'Improve Blocked Logging' (#426) from improve_blocked_logging into master
Reviewed-on: SteamWar/BungeeCore#426
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-08-29 14:35:48 +02:00
d14d748911 Improve Blocked Logging 2022-08-29 14:33:34 +02:00
f5675811ba Hotfix join permissions
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-28 08:43:07 +02:00
f1f159a330 Finish BuilderCloud command
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-27 18:01:16 +02:00
143a9aed4a Merge pull request 'Added BuilderCloudCommand' (#414) from BuilderCloud into master
Reviewed-on: SteamWar/BungeeCore#414
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2022-08-27 17:51:03 +02:00
6b89afd07d Finish BuilderCloud command
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-27 17:16:02 +02:00
d17a4f882e Merge branch 'master' into BuilderCloud 2022-08-27 14:27:50 +02:00
bd86c81e7f Merge pull request 'Fix tablist failure on softreload' (#424) from fixSoftreload into master
Reviewed-on: SteamWar/BungeeCore#424
Reviewed-by: Chaoscaot <chaoscaot@zohomail.eu>
2022-08-23 22:14:28 +02:00
a6407d6bb0 Fix tablist failure on softreload
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-23 18:10:52 +02:00
d232d18fda Merge pull request 'Fix 7/ replacer' (#423) from fix7replacer into master
Reviewed-on: SteamWar/BungeeCore#423
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2022-08-23 17:31:17 +02:00
b76164ac8d Merge pull request 'Add english aliases' (#422) from multilingAliases into master
Reviewed-on: SteamWar/BungeeCore#422
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2022-08-23 17:22:32 +02:00
4217afef59 Fix 7/ replacer
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-23 17:21:49 +02:00
a27f74af56 Fix build
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-23 16:59:53 +02:00
a782f811fc Add english aliases
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-23 16:57:19 +02:00
yoyosource
5c127e0887 Rebuild 2022-08-22 21:10:35 +02:00
yoyosource
3f99585b35 Rebuild 2022-08-22 21:09:27 +02:00
yoyosource
e29fb553f0 Remove deprecated guard api 2022-08-22 20:25:36 +02:00
yoyosource
6d717eb1b0 Update CommonCore 2022-08-22 18:43:59 +02:00
yoyosource
3550b2c4fd Merge remote-tracking branch 'origin/master' 2022-08-22 18:43:45 +02:00
yoyosource
c4204cd54d Update CommonCore 2022-08-22 18:43:36 +02:00
ea94195db8 Fix folder inconsistencies
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-22 16:07:21 +02:00
e4cd94aecd Fix lobbyconnection on disconnect
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-22 14:31:04 +02:00
b8404a74a7 Update to paper 1.19.2
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-22 06:50:53 +02:00
328d904f69 Merge pull request 'Bye Bye Mail.' (#421) from emaillessWeb into master
Reviewed-on: SteamWar/BungeeCore#421
Reviewed-by: Chaoscaot <chaoscaot@zohomail.eu>
2022-08-20 19:37:03 +02:00
bd1420cc90 Bye Bye Mail.
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-20 19:35:46 +02:00
5cf577c9e5 Bye Bye Mail.
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-20 19:22:21 +02:00
11106ab240 Bye Bye Mail.
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-20 19:15:28 +02:00
43a9b92b41 Bye Bye Mail.
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-20 19:10:26 +02:00
698f710138 Use /servers for server starts
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-20 18:15:02 +02:00
9439890131 Ignore took ms to process event in db
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-20 11:23:42 +02:00
yoyosource
abf4224788 Update WhoisCommand 2022-08-16 18:25:16 +02:00
MoBrot
c2211bdedf Add HelCommand for /bau lock
Add HelCommand for /bau unlock
2022-08-14 00:11:18 +02:00
MoBrot
39b63198d5 Add BungeeCore_de.properties "BAU_LOCKED_OPTIONS" Color correction
Add BungeeCore.properties "BAU_LOCKED_OPTIONS" Color correction
2022-08-13 22:23:29 +02:00
MoBrot
19dad58712 Replace BauLock to UserConfig
Update BauLockState.ALL to BauLockState.NONE
Add "BAU_LOCKED_OPTIONS" in BungeeCore_de.properties
Add "BAU_LOCKED_OPTIONS" in BungeeCore.properties
2022-08-13 21:18:54 +02:00
MoBrot
386395725d Add BauLock
Add BauCommand.isLocked
Add BauLockState
Add "BAU_LOCKED" and "BAU_UNLOCKED" in BungeeCore_de.properties
Add "Bau_LOCKED" and "BAU_UNLOCKED" in BungeeCore.properties
2022-08-10 19:20:33 +02:00
e2f2968813 Close inventory on world reset
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-05 12:02:08 +02:00
d2d8bc0bf8 1.19.1 Buildserver
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-05 08:14:15 +02:00
dfab5e7630 1.19.1 Buildserver
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-04 17:48:54 +02:00
8599df7e4e Fix CI again
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-04 17:10:17 +02:00
2f90bc2541 Fix CI
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-04 17:06:12 +02:00
a2f6a2c6ae 1.19.1 Support, API update
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-08-04 17:01:40 +02:00
MoBrot
229cf77035 Added BuilderCloudCommand
Added BungeeCore.properties message
Added BungeeCore_de.properties message
Added ServerStarter for the BuilderCloud
2022-07-28 18:00:02 +02:00
32bd46c97d Fix arena
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-22 10:25:14 +02:00
b562f1a24c Merge pull request 'CommandArena' (#373) from CommandArena into master
Reviewed-on: SteamWar/BungeeCore#373
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-07-22 08:53:21 +02:00
3266a2fdd0 Fix Command19
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-21 12:25:14 +02:00
8aaad8647f Fix Command19
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-21 12:12:36 +02:00
0e376456e8 Potential tp fix, added link descriptor, MWG 1.19 build servers
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-21 11:31:53 +02:00
yoyosource
8bcefb102c Update ArenaCommand 2022-07-18 16:19:48 +02:00
yoyosource
183248c0b1 Update ArenaCommand 2022-07-17 20:38:59 +02:00
yoyosource
93757ff86e Merge branch 'master' into CommandArena 2022-07-17 20:34:19 +02:00
621c95b525 Merge pull request 'Fix local colorcodes' (#413) from colorFix into master
Reviewed-on: SteamWar/BungeeCore#413
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2022-07-17 17:42:44 +02:00
e30f4cc2ee Fix strip
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-17 17:36:27 +02:00
3a54797d07 Use strip
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-17 17:34:15 +02:00
3053d5d301 Fix empty messages
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-17 17:31:11 +02:00
b80827ed1e Fix local colorcodes
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-17 17:12:48 +02:00
c79f49b166 Remove OpenJDK
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-17 16:31:55 +02:00
cfa1ccc4b8 Test 1.19 OpenJDK
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-15 22:57:35 +02:00
7e2f1f244d Remove lib
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-02 10:04:59 +02:00
66e97321ae To maven repo
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-07-01 21:40:18 +02:00
yoyosource
92cc4cf897 Fix TpCommand for teamserver 2022-06-27 15:41:05 +02:00
yoyosource
4503ffce2e Fix TpCommand for teamserver 2022-06-27 15:38:37 +02:00
yoyosource
d96d3caa43 Fix TpCommand for teamserver 2022-06-27 15:35:58 +02:00
yoyosource
f26fd7a700 Fix TpCommand for teamserver 2022-06-27 15:33:24 +02:00
yoyosource
2ce64e2203 Fix TpCommand for teamserver 2022-06-27 15:27:30 +02:00
yoyosource
732ad43e23 Fix TpCommand for teamserver 2022-06-27 15:25:06 +02:00
yoyosource
4b8950b369 Fix DevCommand 2022-06-26 17:45:23 +02:00
yoyosource
5c605df926 Fix TpCommand again 2022-06-26 16:23:08 +02:00
yoyosource
c8cf039987 Fix TpCommand again 2022-06-26 16:21:23 +02:00
yoyosource
61fff5ba08 Hotfix TpCommand 2022-06-26 16:17:44 +02:00
yoyosource
a6642d3d14 Update RCommand 2022-06-24 21:10:15 +02:00
0cd68d8ddc Fix tablist order
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-23 15:15:00 +02:00
b4fb2dcedf Merge pull request 'Add schem deadline message to /event' (#359) from deadline into master
Reviewed-on: SteamWar/BungeeCore#359
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-23 10:02:48 +02:00
e327c939f7 Cleanup branch
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-23 10:00:26 +02:00
148067e42b Merge remote-tracking branch 'origin/deadline' into deadline 2022-06-23 09:57:49 +02:00
yoyosource
7302dd715c Update deadline 2022-06-23 09:57:13 +02:00
yoyosource
4d8771eba1 Rebase onto master 2022-06-23 09:56:56 +02:00
yoyosource
e7b7cc01bc Add schem deadline message to /event 2022-06-23 09:56:51 +02:00
yoyosource
352497f658 Update CommonCore 2022-06-21 22:23:43 +02:00
yoyosource
1938eeefff Add TabCompletionCache invalidation 2022-06-21 22:22:54 +02:00
d507ca5df2 Merge pull request 'Optimize MsgCommand' (#410) from OptimizeMSGAndRCommand into master
Reviewed-on: SteamWar/BungeeCore#410
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-20 13:08:51 +02:00
a34d847b3a Merge branch 'master' into OptimizeMSGAndRCommand 2022-06-20 12:31:43 +02:00
1f1dcff9b5 Fix chat spoofing
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-19 15:24:06 +02:00
52e3da1e6e Move network to own threads
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-19 13:00:23 +02:00
c30542970e Fix npcs #4
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 19:04:09 +02:00
cc6860b0a5 Fix npcs #3
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 19:01:29 +02:00
78e602fd26 Fix npcs #3
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 18:59:14 +02:00
c2338fe3d0 Fix npcs #2
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 18:55:34 +02:00
593fe7389b Fix npcs, revert failed fix
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 17:31:57 +02:00
cc01a4132d Test fix tablist
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 16:07:06 +02:00
129e41cb77 Merge pull request 'Tablist' (#411) from tablist into master
Reviewed-on: SteamWar/BungeeCore#411
Reviewed-by: Chaoscaot <chaoscaot444@gmail.com>
2022-06-18 15:31:48 +02:00
64567c1556 Fix softreload issues
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 14:32:25 +02:00
eb469896f9 Remove unnecessary put
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 14:17:38 +02:00
f7fbefec82 Make Tablist softreloadable
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 14:15:48 +02:00
616062354f Fixes, working
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 14:07:00 +02:00
f2ed575f8c Untested full tablist
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 13:17:23 +02:00
2e17c380f0 Merge remote-tracking branch 'origin/tablist' into tablist 2022-06-18 13:16:58 +02:00
598dfcd8a0 Current tablist
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 13:16:44 +02:00
9703e9ea33 WIP new tablist
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-18 13:16:40 +02:00
eed24006fb Current tablist
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-17 20:43:36 +02:00
yoyosource
1ce88d071c Update CommonCore 2022-06-17 09:53:30 +02:00
yoyosource
eb81ffc9d8 Optimize MsgCommand
Optimize RCommand
2022-06-17 09:53:04 +02:00
yoyosource
bbb0f99382 Update CommonCore 2022-06-16 23:10:59 +02:00
yoyosource
81913953d8 Update MsgCommand and RCommand to new Validator API 2022-06-16 23:10:27 +02:00
yoyosource
5eaa87885d Hotfix SWCommand 2022-06-16 22:53:25 +02:00
yoyosource
c6a68fa2a1 Hotfix SWCommand 2022-06-16 22:27:45 +02:00
yoyosource
6192fd98c7 Hotfix SWCommand 2022-06-16 22:25:00 +02:00
yoyosource
059a945867 Hotfix SWCommand 2022-06-16 22:18:44 +02:00
yoyosource
c97233b68b Hotfix SWCommand 2022-06-16 22:14:40 +02:00
yoyosource
cc839859a8 Hotfix SWCommand 2022-06-16 22:11:24 +02:00
yoyosource
742bc92f53 Hotfix WhoisCommand 2022-06-16 22:05:39 +02:00
yoyosource
cccba31c46 Hotfix SWCommand on hover 2022-06-16 21:09:50 +02:00
yoyosource
49043c4b0c Fix TutorialCommand help messages 2022-06-16 21:03:04 +02:00
yoyosource
146756c299 Update CommonCore 2022-06-16 20:54:22 +02:00
yoyosource
9b1a394cb2 Fix empty MsgCommand and RCommand 2022-06-16 20:54:07 +02:00
yoyosource
789bb62a14 Add Validator
Update CommonCore
2022-06-16 20:41:52 +02:00
0da2383adb Merge branch 'master' into tablist 2022-06-16 14:45:37 +02:00
a4ad028f72 Fix imports
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-16 13:35:25 +02:00
7b06c64118 Merge branch 'master' into tablist 2022-06-16 13:34:56 +02:00
dd9651d6c8 Merge pull request 'Update VerifyCommand' (#407) from CommandVerify into master
Reviewed-on: SteamWar/BungeeCore#407
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:33:56 +02:00
d6e941bf72 Merge pull request 'Update WebregisterCommand' (#408) from CommandWebregister into master
Reviewed-on: SteamWar/BungeeCore#408
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:33:09 +02:00
e156d3ad4a Merge pull request 'Update WhoisCommand' (#409) from CommandWhois into master
Reviewed-on: SteamWar/BungeeCore#409
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:32:22 +02:00
7c1925ad71 Merge pull request 'Update UnIgnoreCommand' (#406) from CommandUnIgnore into master
Reviewed-on: SteamWar/BungeeCore#406
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:30:54 +02:00
3299620cd6 Merge pull request 'Update TutorialCommand' (#405) from CommandTutorial into master
Reviewed-on: SteamWar/BungeeCore#405
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:30:30 +02:00
adee8f565b Merge pull request 'Update StatCommand' (#402) from CommandStat into master
Reviewed-on: SteamWar/BungeeCore#402
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:26:49 +02:00
01c721a753 Merge pull request 'Update SetLocaleCommand' (#401) from CommandSetLocale into master
Reviewed-on: SteamWar/BungeeCore#401
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:26:27 +02:00
c3b3559875 Merge pull request 'Update ServerTeamchatCommand' (#400) from CommandServerTeamchat into master
Reviewed-on: SteamWar/BungeeCore#400
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:25:54 +02:00
f00d1dc540 Merge pull request 'Update ServerSwitchCommand' (#399) from CommandServerSwitch into master
Reviewed-on: SteamWar/BungeeCore#399
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:25:30 +02:00
c1a721cf4d Merge pull request 'Update PollCommand' (#392) from CommandPoll into master
Reviewed-on: SteamWar/BungeeCore#392
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:24:40 +02:00
60ca6fde85 Merge pull request 'Update ReplayCommand' (#398) from CommandReplay into master
Reviewed-on: SteamWar/BungeeCore#398
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:24:08 +02:00
ecb3723c7c Merge pull request 'Update RegelnCommand' (#397) from CommandRegeln into master
Reviewed-on: SteamWar/BungeeCore#397
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:23:52 +02:00
6bcafde70c Merge pull request 'Update RankCommand' (#396) from CommandRank into master
Reviewed-on: SteamWar/BungeeCore#396
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:23:28 +02:00
90c1208cf5 Merge pull request 'Update RCommand' (#395) from CommandR into master
Reviewed-on: SteamWar/BungeeCore#395
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:22:55 +02:00
5c534305d9 Merge pull request 'Update PunishmentCommand' (#394) from CommandPunishment into master
Reviewed-on: SteamWar/BungeeCore#394
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:22:34 +02:00
f2a537da90 Merge pull request 'Update PollresultCommand' (#393) from CommandPollresult into master
Reviewed-on: SteamWar/BungeeCore#393
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:17:45 +02:00
8ae6e90628 Merge pull request 'Update PlaytimeCommand' (#391) from CommandPlaytime into master
Reviewed-on: SteamWar/BungeeCore#391
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:14:58 +02:00
7f5ef05235 Merge pull request 'Update PingCommand' (#390) from CommandPing into master
Reviewed-on: SteamWar/BungeeCore#390
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:14:36 +02:00
7c898ac869 Merge pull request 'Update MsgCommand' (#389) from CommandMsg into master
Reviewed-on: SteamWar/BungeeCore#389
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:14:14 +02:00
d55e2abdb4 Merge pull request 'Update LocalCommand' (#388) from CommandLocal into master
Reviewed-on: SteamWar/BungeeCore#388
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:13:42 +02:00
734e8fc6c5 Merge pull request 'Update ListCommand' (#387) from CommandList into master
Reviewed-on: SteamWar/BungeeCore#387
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:13:24 +02:00
045b693c92 Merge pull request 'Update KickCommand' (#386) from CommandKick into master
Reviewed-on: SteamWar/BungeeCore#386
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:13:02 +02:00
0e430fee9b Merge pull request 'Update IgnoreCommand' (#384) from CommandIgnore into master
Reviewed-on: SteamWar/BungeeCore#384
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:11:18 +02:00
5bfac6c7b5 Merge pull request 'Update GDPRQuery' (#382) from CommandGDPRQuery into master
Reviewed-on: SteamWar/BungeeCore#382
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:10:27 +02:00
1bfdecd6b0 Merge pull request 'Update EventreloadCommand' (#380) from CommandEventreload into master
Reviewed-on: SteamWar/BungeeCore#380
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:03:28 +02:00
2aee854b5c Merge pull request 'Update EventRescheduleCommand' (#379) from CommandEventReschedule into master
Reviewed-on: SteamWar/BungeeCore#379
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:02:13 +02:00
41f89f5f0a Merge pull request 'Update CheckCommand' (#377) from CommandCheck into master
Reviewed-on: SteamWar/BungeeCore#377
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:00:46 +02:00
e46f68558a Merge pull request 'Update DevCommand' (#378) from CommandDev into master
Reviewed-on: SteamWar/BungeeCore#378
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 13:00:32 +02:00
dfb6f89b35 Merge pull request 'Update BugCommand' (#375) from CommandBug into master
Reviewed-on: SteamWar/BungeeCore#375
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 12:50:48 +02:00
df9f6e44e3 Merge pull request 'Update AlertCommand' (#372) from CommandAlert into master
Reviewed-on: SteamWar/BungeeCore#372
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-16 12:39:52 +02:00
yoyosource
4766e0ab96 Update WhoisCommand 2022-06-16 12:21:46 +02:00
yoyosource
d64a483bb6 Update WebregisterCommand 2022-06-16 12:19:23 +02:00
yoyosource
99807470ec Update VerifyCommand 2022-06-16 12:18:15 +02:00
yoyosource
595929f4b2 Update UnIgnoreCommand 2022-06-16 12:17:01 +02:00
yoyosource
9e867a7457 Update TutorialCommand 2022-06-16 12:15:50 +02:00
yoyosource
29ed8b16b8 Update StatCommand 2022-06-16 11:19:50 +02:00
yoyosource
4cd0150042 Update SetLocaleCommand 2022-06-16 11:19:03 +02:00
yoyosource
b4b46b56a4 Update ServerTeamchatCommand 2022-06-16 11:18:13 +02:00
yoyosource
160136833e Update ServerSwitchCommand 2022-06-16 11:16:47 +02:00
yoyosource
279577a536 Update ReplayCommand 2022-06-16 11:15:43 +02:00
yoyosource
67d816e90b Update RegelnCommand 2022-06-16 11:10:19 +02:00
yoyosource
84ead29ddb Update RCommand 2022-06-16 11:09:24 +02:00
yoyosource
21f020e13d Update RankCommand 2022-06-16 11:08:12 +02:00
yoyosource
e4c07bc211 Update PunishmentCommand 2022-06-16 11:04:59 +02:00
yoyosource
a7541dc0c3 Update PollresultCommand 2022-06-16 10:57:12 +02:00
41a5c3b207 Merge branch 'master' into tablist
# Conflicts:
#	src/de/steamwar/bungeecore/BungeeCore.java
2022-06-15 21:36:56 +02:00
yoyosource
fd14666880 Update PollCommand 2022-06-15 20:18:31 +02:00
yoyosource
4134e564cc Update PlaytimeCommand 2022-06-15 20:12:25 +02:00
yoyosource
6c301c987d Update PingCommand 2022-06-15 20:11:21 +02:00
yoyosource
9f5e714912 Update MsgCommand 2022-06-15 20:10:09 +02:00
yoyosource
7236885590 Update LocalCommand 2022-06-15 20:07:29 +02:00
yoyosource
c6f9019ce3 Update ListCommand 2022-06-15 20:06:21 +02:00
yoyosource
19616aef84 Update KickCommand 2022-06-15 20:04:43 +02:00
f2006dd218 Merge branch 'master' into deadline
# Conflicts:
#	CommonCore
2022-06-15 18:07:38 +02:00
yoyosource
082656e3ee Update deadline 2022-06-15 17:38:30 +02:00
yoyosource
8a21d5c93d Enable SWTSI again 2022-06-14 22:53:22 +02:00
yoyosource
4fc0e69a47 Update IgnoreCommand 2022-06-14 21:56:04 +02:00
yoyosource
99f5fbc3b8 Update GDPRQuery 2022-06-14 21:49:20 +02:00
yoyosource
d85b93364e Update EventRescheduleCommand 2022-06-14 21:42:05 +02:00
yoyosource
d0ac81aa93 Update EventreloadCommand 2022-06-14 21:31:48 +02:00
yoyosource
568f1bf598 Update DevCommand 2022-06-14 21:30:55 +02:00
yoyosource
d94080a0cb Update CheckCommand 2022-06-14 21:20:45 +02:00
yoyosource
546e507939 Update BugCommand 2022-06-14 20:46:13 +02:00
yoyosource
5c55bdacde Add tab completion to ArenaCommand 2022-06-14 20:16:36 +02:00
yoyosource
ae2a1d5779 Update ArenaCommand 2022-06-14 20:10:07 +02:00
yoyosource
08fdc1603e Update AlertCommand 2022-06-14 20:03:40 +02:00
8823368f0d CI Rebuild
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-14 19:44:18 +02:00
d83b6564d4 CI Rebuild
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-14 19:41:50 +02:00
46ae99f10d Merge pull request 'Fix some stuff for later use' (#371) from CommandAPI into master
Reviewed-on: SteamWar/BungeeCore#371
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-14 19:32:34 +02:00
yoyosource
8a417e32c1 Fix some stuff for later use 2022-06-14 18:19:25 +02:00
yoyosource
22ef3cd13d Fix some stuff for later use 2022-06-14 18:16:44 +02:00
2cd808b8aa Merge branch 'master' into deadline 2022-06-14 18:12:21 +02:00
60f4db4702 Merge pull request 'Add SWCommand and corresponding api' (#370) from CommandAPI into master
Reviewed-on: SteamWar/BungeeCore#370
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-14 17:23:29 +02:00
7b5359b558 Merge branch 'master' into deadline 2022-06-14 16:24:49 +02:00
yoyosource
a0ae828fbd Add SWCommand and corresponding api 2022-06-14 16:18:45 +02:00
0f58e89d24 Merge pull request 'Add ServerMetaInfo' (#369) from AddMetaInfo into master
Reviewed-on: SteamWar/BungeeCore#369
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-14 16:13:58 +02:00
yoyosource
bf4f7c6adf Add ServerMetaInfo 2022-06-14 15:47:11 +02:00
7aadaa2df3 Fix communication
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-14 09:32:43 +02:00
b285585608 Fix packet direction
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-14 09:09:59 +02:00
03462b0900 Merge branch 'master' into deadline 2022-06-14 09:08:38 +02:00
yoyosource
584b8197aa Merge branch 'master' into deadline 2022-06-14 09:08:12 +02:00
07cb11e12b Fix SWInventory
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-14 09:08:05 +02:00
571fa8c7d1 Fix concurrency, fix cast
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-14 08:56:09 +02:00
98079a2331 Merge pull request 'Bungee Network' (#362) from network into master
Reviewed-on: SteamWar/BungeeCore#362
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-14 08:50:04 +02:00
533f0a4269 Fix copyright
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-14 08:37:32 +02:00
41d27c567d Merge branch 'master' into network
# Conflicts:
#	src/de/steamwar/bungeecore/listeners/TablistManager.java
2022-06-14 08:28:10 +02:00
d05af2258b Fix translation
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-13 22:38:09 +02:00
9df8493b77 Merge pull request 'Cannot spoof chat my ass' (#368) from spoofChat into master
Reviewed-on: SteamWar/BungeeCore#368
Reviewed-by: Chaoscaot <chaoscaot444@gmail.com>
2022-06-13 22:13:57 +02:00
0446af29aa Cannot spoof chat my ass
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-13 22:10:10 +02:00
c2544e44fc WIP new tablist
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-13 21:04:24 +02:00
yoyosource
3a97baa267 Add debug messages for fabric checks 2022-06-12 18:22:33 +02:00
yoyosource
8267966409 Merge remote-tracking branch 'origin/master' 2022-06-12 18:17:51 +02:00
yoyosource
3d57f9ca80 Add debug messages for fabric checks 2022-06-12 18:17:44 +02:00
8e4729aab0 Merge pull request '1.19 Build server' (#366) from bau19 into master
Reviewed-on: SteamWar/BungeeCore#366
Reviewed-by: YoyoNow <jwsteam@nidido.de>
2022-06-11 20:41:18 +02:00
Chaoscaot
e49546d3d8 Fix Remote Plugin Messages 2022-06-11 09:44:39 +02:00
Chaoscaot
a97a6a78e2 Fix Remote Plugin Messages 2022-06-11 08:55:51 +02:00
01ea928652 1.19 Build server
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-10 19:30:15 +02:00
1ef5f9e625 Merge pull request 'ConvertFromWaterfall' (#363) from ConvertFromWaterfall into master
Reviewed-on: SteamWar/BungeeCore#363
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-08 16:54:22 +02:00
c5ae7fd229 Merge branch 'master' into ConvertFromWaterfall 2022-06-08 16:53:01 +02:00
69c325cf17 Merge pull request 'FixBungeeTablistPlus' (#364) from FixBungeeTablistPlus into master
Reviewed-on: SteamWar/BungeeCore#364
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-08 16:19:06 +02:00
2f06ea374e Simplify connection detection
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-08 16:18:04 +02:00
yoyosource
6769fd88e7 Fix TablistManager 2022-06-08 16:06:31 +02:00
yoyosource
f63213c9aa Fix build.gradle 2022-06-08 16:05:17 +02:00
yoyosource
bad4efd520 Convert everything from waterfall to plain bungee 2022-06-08 13:28:56 +02:00
yoyosource
9439887785 Fix TablistManager for newer BTLP plugin 2022-06-08 13:18:24 +02:00
yoyosource
27750d4e71 Merge remote-tracking branch 'origin/master' 2022-06-07 22:38:29 +02:00
yoyosource
1a91e561fa Disable SWTSI for now 2022-06-07 22:38:08 +02:00
Chaoscaot
446b4ad519 Bungee Network 2022-06-07 20:53:09 +02:00
59672e8d02 Merge pull request 'Using sql connections in round robbin mode instead of the same (possibly)' (#361) from sql into master
Reviewed-on: SteamWar/BungeeCore#361
Reviewed-by: Lixfel <lixfel@steamwar.de>
2022-06-07 14:14:21 +02:00
c74b2b2c84 Fix settings changed npe
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-07 14:13:51 +02:00
9f7f5eef36 Test fix ban timeout
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-04 22:49:07 +02:00
6d0a1f6bfd Fix geyser floodgate null
Signed-off-by: Lixfel <agga-games@gmx.de>
2022-06-04 16:23:13 +02:00
dea8e0b731 Merge branch 'master' into sql 2022-06-03 22:25:37 +02:00
yoyosource
d4e2e80dd5 Hotfix WhoisCommand 2022-06-03 13:26:03 +02:00
yoyosource
edfbfb614d Hotfix WhoisCommand 2022-06-03 13:24:47 +02:00
yoyosource
bb68a4a690 Using sql connections in round robbin mode instead of the same (possibly) 2022-06-02 17:08:29 +02:00
yoyosource
e61a98c2a3 Update some stuff 2022-06-01 23:19:30 +02:00
yoyosource
abc775009e Merge branch 'master' into deadline 2022-06-01 23:15:23 +02:00
yoyosource
163e40f2dd Fix ErrorLogger 2022-05-30 15:35:51 +02:00
yoyosource
e3783c4bfe Fix ErrorLogger 2022-05-30 15:34:58 +02:00
yoyosource
3713f828b2 Add schem deadline message to /event 2022-05-30 12:16:07 +02:00
yoyosource
2fb2fbc781 Add arg to replay command for direct selection of map 2022-05-30 11:31:15 +02:00
190 geänderte Dateien mit 7093 neuen und 8662 gelöschten Zeilen

5
.gitignore vendored
Datei anzeigen

@ -9,7 +9,4 @@ steamwar.properties
# IntelliJ IDEA
.idea
*.iml
# Other
lib
*.iml

Datei anzeigen

@ -1,23 +0,0 @@
# Building
Building SteamWar.de software requires certain libraries,
which cannot be provided over traditional ways (like maven)
due to copyright issues with compiled Spigot packages.
For building these libraries have to be named in a lib
directory named like in the following list.
A subset of the following libraries is required to build this software
(this is the list for being able to build all SteamWar.de software):
- BungeeCord.jar https://ci.md-5.net/job/BungeeCord/
- BungeeTabListPlus.jar https://www.spigotmc.org/resources/bungeetablistplus.313/
- PersistentBungeeCore.jar https://steamwar.de/devlabs/SteamWar/PersistentBungeeCore
- ProtocolLib.jar https://www.spigotmc.org/resources/protocollib.1997/
- Spigot-1.8.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.8.9)
- Spigot-1.9.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.9.4)
- Spigot-1.10.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.10.2)
- Spigot-1.12.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.12.2)
- Spigot-1.14.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.14.4)
- Spigot-1.15.jar https://hub.spigotmc.org/jenkins/job/BuildTools/ (1.15.2)
- SpigotCore.jar https://steamwar.de/devlabs/SteamWar/SpigotCore
- WorldEdit-1.12.jar https://dev.bukkit.org/projects/worldedit/files (6.1.9)
- WorldEdit-1.15.jar https://dev.bukkit.org/projects/worldedit/files (newest)

@ -1 +1 @@
Subproject commit 0f03b57e437c1d843816b7202d95b79ff0a8d2df
Subproject commit 20c22c47f940c4510de17594b28eb0a96cb9da0c

Datei anzeigen

@ -17,11 +17,6 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import org.apache.tools.ant.taskdefs.condition.Os
import java.util.function.BiConsumer
plugins {
// Adding the base plugin fixes the following gradle warnings in IntelliJ:
//
@ -34,36 +29,19 @@ plugins {
id 'java'
id 'application'
id 'com.github.johnrengelman.shadow' version '5.0.0'
id 'com.github.johnrengelman.shadow' version '8.1.1'
id 'de.steamwar.gradle' version 'RELEASE'
}
group 'de.steamwar'
version ''
Properties steamwarProperties = new Properties()
if (file("steamwar.properties").exists()) {
steamwarProperties.load(file("steamwar.properties").newDataInputStream())
}
ext {
buildName = 'BungeeCore'
artifactName = 'bungeecore'
uberJarName = "${buildName}-all.jar"
jarName = "${artifactName}.jar"
libs = "${buildDir}/libs"
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
operatingSystem = "windows"
} else {
operatingSystem = "unix"
}
}
compileJava.options.encoding = 'UTF-8'
sourceCompatibility = 1.8
targetCompatibility = 1.8
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
mainClassName = ''
@ -82,8 +60,32 @@ sourceSets {
repositories {
mavenCentral()
maven {
url 'https://m2.dv8tion.net/releases'
name = 'papermc'
url = 'https://repo.papermc.io/repository/maven-public/'
}
maven {
url = 'https://m2.dv8tion.net/releases'
content {
includeGroup 'net.dv8tion'
}
}
maven {
url = 'https://repo.lunarclient.dev'
content {
includeGroup 'com.lunarclient'
}
}
maven { url 'https://jitpack.io' }
mavenLocal()
}
shadowJar {
exclude 'META-INF/*'
//https://imperceptiblethoughts.com/shadow/configuration/minimizing/
minimize {
exclude project(':')
}
duplicatesStrategy DuplicatesStrategy.INCLUDE
}
dependencies {
@ -92,160 +94,24 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok:1.18.22'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.22'
compileOnly files("${projectDir}/lib/BungeeCord.jar")
compileOnly files("${projectDir}/lib/PersistentBungeeCore.jar")
compileOnly files("${projectDir}/lib/BungeeTabListPlus.jar")
implementation("net.dv8tion:JDA:4.3.0_299") {
compileOnly 'com.velocitypowered:velocity-api:3.3.0-SNAPSHOT'
annotationProcessor 'com.velocitypowered:velocity-api:3.3.0-SNAPSHOT'
compileOnly 'com.velocitypowered:velocity-proxy:3.3.0-SNAPSHOT'
compileOnly 'de.steamwar:persistentvelocitycore:DEV'
implementation("net.dv8tion:JDA:4.4.0_352") {
exclude module: 'opus-java'
}
implementation project(":CommonCore")
}
task buildProject {
description 'Build this project'
group "Steamwar"
implementation 'com.lunarclient:apollo-api:1.1.0'
implementation 'com.lunarclient:apollo-common:1.1.0'
dependsOn build
}
implementation 'org.reflections:reflections:0.10.2'
task finalizeProject {
description 'Finalize this project'
group "Steamwar"
compileOnly 'io.netty:netty-buffer:4.1.106.Final'
compileOnly 'io.netty:netty-transport:4.1.106.Final'
doLast {
if ("${buildDir}" == null) {
return
}
delete fileTree("${libs}").matching {
exclude("${uberJarName}")
}
file(libs + "/" + uberJarName).renameTo(file(libs + "/" + jarName))
}
}
build.finalizedBy(finalizeProject)
if (steamwarProperties.containsKey("hostname")) {
String hostname = steamwarProperties.get("hostname")
String uploadPath = steamwarProperties.getOrDefault("uploadPath", "~")
String server = steamwarProperties.getOrDefault("server", "DevBungee")
String serverStartFlags = steamwarProperties.getOrDefault("serverStartFlags", "")
task uploadProject {
description 'Upload this project'
group "Steamwar"
doLast {
await(shell("scp ${libs}/${jarName} ${hostname}:${uploadPath}/${server}/plugins"))
if (steamwarProperties.getOrDefault("directStart", "false") == "false" && !answer("Start ${server} server?")) {
return
}
serverStart(server, serverStartFlags, hostname)
}
}
uploadProject.dependsOn(buildProject)
task startDevServer {
description 'Start the DevBungee'
group "Steamwar"
doLast {
serverStart(server, serverStartFlags, hostname)
}
}
}
private def await(Process proc) {
def out = new StringBuilder()
def err = new StringBuilder()
proc.waitForProcessOutput(out, err)
return [out, err, proc.exitValue()]
}
private def shell(String command) {
if (operatingSystem == "unix") {
return ['bash', '-c', command].execute()
} else {
return ["cmd", "/c", command].execute()
}
}
private def serverStart(String serverName, String serverFlags, String hostname) {
def proc = shell("ssh -t ${hostname} \"./mc ${serverFlags} ${serverName}\"")
Set<String> strings = new HashSet<>()
File file = new File("${projectDir}/ignoredlog");
if (file.exists()) {
new BufferedReader(new InputStreamReader(new FileInputStream(file))).readLines().forEach({ s ->
strings.add(s)
})
}
Thread outputThread = new Thread({
Reader reader = proc.getInputStream().newReader();
Writer writer = System.out.newWriter();
try {
while (proc.alive) {
String s = reader.readLine()
if (s == null) {
return
}
if (strings.stream().anyMatch({check -> s.contains(check)})) {
continue
}
writer.write(s + "\n")
writer.flush()
}
} catch (IOException e) {
// Ignored
}
})
outputThread.setName("${serverName} - OutputThread")
outputThread.start()
Writer writer
Thread inputThread = new Thread({
Reader reader = System.in.newReader()
writer = proc.getOutputStream().newWriter()
try {
while (proc.alive) {
String s = reader.readLine()
writer.write(s + "\n")
writer.flush()
}
} catch (IOException e) {
// Ignored
}
})
inputThread.setName("${serverName} - InputThread")
inputThread.start()
gradle.buildFinished { buildResult ->
if (!proc.alive) {
return
}
writer = proc.getOutputStream().newWriter()
writer.write("stop\n")
writer.flush()
awaitClose(proc, outputThread, inputThread)
}
awaitClose(proc, outputThread, inputThread)
};
private static def awaitClose(Process proc, Thread outputThread, Thread inputThread) {
while (proc.alive) {
Thread.sleep(10)
}
proc.closeStreams()
outputThread.interrupt()
inputThread.interrupt()
}
private def answer(String question) {
while (System.in.available() > 0) System.in.read()
println(question)
boolean valid = "Yy".contains(((char) System.in.read()).toString())
while (System.in.available() > 0) System.in.read()
return valid
implementation 'com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4'
}

86
deployarena.py Ausführbare Datei
Datei anzeigen

@ -0,0 +1,86 @@
#!/usr/bin/env python3
import datetime
import os
import shutil
import sys
import tarfile
from os import path
# Non stdlib
from nbt import nbt
from ruamel.yaml import YAML
yaml = YAML()
if __name__ == "__main__":
configfile = f'/configs/GameModes/{sys.argv[1]}'
version = int(sys.argv[2])
worldname = sys.argv[3]
with open(configfile, 'r') as file:
gamemode = yaml.load(file)
builderworld = path.expanduser(f'~/builder{version}/{worldname}')
arenaworld = f'/servers/{gamemode["Server"]["Folder"]}/arenas/{worldname}'
if path.exists(arenaworld):
backupworld = path.expanduser(f'~/backup/arenas/{datetime.datetime.now()}-{worldname}-{version}.tar.xz')
with tarfile.open(backupworld, 'w:xz') as tar:
tar.add(arenaworld, arcname=worldname)
shutil.rmtree(arenaworld)
else:
gamemode['Server']['Maps'].append(worldname)
with open(configfile, 'w') as file:
yaml.dump(gamemode, file)
level = nbt.NBTFile(f'{builderworld}/level.dat')
level['Data']['Difficulty'] = nbt.TAG_Byte(2)
gameRules = level['Data']['GameRules']
gameRules['announceAdvancements'] = nbt.TAG_String('false')
gameRules['disableRaids'] = nbt.TAG_String('true')
gameRules['doDaylightCycle'] = nbt.TAG_String('false')
gameRules['doEntityDrops'] = nbt.TAG_String('false')
gameRules['doFireTick'] = nbt.TAG_String('true')
gameRules['doImmediateRespawn'] = nbt.TAG_String('true')
gameRules['doInsomnia'] = nbt.TAG_String('false')
gameRules['doLimitedCrafting'] = nbt.TAG_String('false')
gameRules['doMobLoot'] = nbt.TAG_String('false')
gameRules['doMobSpawning'] = nbt.TAG_String('false')
gameRules['doPatrolSpawning'] = nbt.TAG_String('false')
gameRules['doTileDrops'] = nbt.TAG_String('true')
gameRules['doTraderSpawning'] = nbt.TAG_String('false')
gameRules['doWardenSpawning'] = nbt.TAG_String('false')
gameRules['doWeatherCycle'] = nbt.TAG_String('false')
gameRules['drowningDamage'] = nbt.TAG_String('true')
gameRules['fallDamage'] = nbt.TAG_String('true')
gameRules['fireDamage'] = nbt.TAG_String('true')
gameRules['freezeDamage'] = nbt.TAG_String('true')
gameRules['keepInventory'] = nbt.TAG_String('true')
gameRules['lavaSourceConversion'] = nbt.TAG_String('false')
gameRules['maxEntityCramming'] = nbt.TAG_String('24')
gameRules['mobGriefing'] = nbt.TAG_String('false')
gameRules['naturalRegeneration'] = nbt.TAG_String('false')
gameRules['randomTickSpeed'] = nbt.TAG_String('3')
gameRules['reducedDebugInfo'] = nbt.TAG_String('true')
gameRules['snowAccumulationHeight'] = nbt.TAG_String('1')
gameRules['spawnRadius'] = nbt.TAG_String('0')
gameRules['spectatorsGenerateChunks'] = nbt.TAG_String('true')
gameRules['waterSourceConversion'] = nbt.TAG_String('true')
level.write_file()
if path.exists(arenaworld):
shutil.rmtree(arenaworld)
os.makedirs(f'{arenaworld}/backup')
shutil.copy2(f'{builderworld}/level.dat', f'{arenaworld}/backup/level.dat')
shutil.copytree(f'{builderworld}/region', f'{arenaworld}/backup/region')
shutil.copy2(f'{builderworld}/level.dat', f'{arenaworld}/level.dat')
shutil.copytree(f'{builderworld}/region', f'{arenaworld}/region')
shutil.copy2(f'{builderworld}/config.yml', f'{arenaworld}/config.yml')
if path.exists(f'{builderworld}/paper-world.yml'):
shutil.copy2(f'{builderworld}/paper-world.yml', f'{arenaworld}/backup/paper-world.yml')
shutil.copy2(f'{builderworld}/paper-world.yml', f'{arenaworld}/paper-world.yml')

Datei anzeigen

@ -1,5 +1,5 @@
#Sat Apr 10 23:34:12 CEST 2021
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.1-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStorePath=wrapper/dists

Datei anzeigen

@ -17,6 +17,15 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
rootProject.name = 'BungeeCore'
pluginManagement {
repositories {
gradlePluginPortal()
maven {
url = uri("https://steamwar.de/maven/")
}
}
}
rootProject.name = 'VelocityCore'
include 'CommonCore'

Datei anzeigen

@ -19,11 +19,9 @@
package de.steamwar.bungeecore;
import de.steamwar.bungeecore.sql.SchematicType;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.config.ConfigurationProvider;
import net.md_5.bungee.config.YamlConfiguration;
import de.steamwar.sql.SchematicType;
import org.simpleyaml.configuration.Configuration;
import org.simpleyaml.configuration.file.YamlFile;
import java.io.File;
import java.io.IOException;
@ -32,19 +30,29 @@ import java.util.stream.Collectors;
public class ArenaMode {
private static final Random random = new Random();
private static final Map<String, ArenaMode> byChat = new HashMap<>();
private static final Map<String, ArenaMode> byInternal = new HashMap<>();
private static final Map<SchematicType, ArenaMode> bySchemType = new HashMap<>();
private static final List<ArenaMode> allModes = new LinkedList<>();
private static final Random random = new Random();
static {
File folder = new File(ProxyServer.getInstance().getPluginsFolder(), "FightSystem");
init();
}
public static void init() {
byChat.clear();
byInternal.clear();
bySchemType.clear();
allModes.clear();
File folder = new File(VelocityCore.get().getDataDirectory().getParent().toFile(), "FightSystem");
for(File configFile : Arrays.stream(folder.listFiles((file, name) -> name.endsWith(".yml") && !name.endsWith(".kits.yml"))).sorted().collect(Collectors.toList())) {
Configuration config;
try {
config = ConfigurationProvider.getProvider(YamlConfiguration.class).load(configFile);
config = YamlFile.loadConfiguration(configFile);
} catch (IOException e) {
throw new SecurityException("Could not load SchematicTypes", e);
}
@ -94,6 +102,7 @@ public class ArenaMode {
private final String serverJar;
private final String config;
private final List<String> maps;
private final Map<String, String> lowerToRealMapNames = new HashMap<>();
private final boolean historic;
private final String internalName;
@ -106,6 +115,7 @@ public class ArenaMode {
this.serverJar = config.getString("Server.ServerJar");
this.config = internalName + ".yml";
this.maps = config.getStringList("Server.Maps");
maps.forEach(map -> lowerToRealMapNames.put(map.toLowerCase(), map));
this.displayName = config.getString("GameName", internalName);
this.chatNames = config.getStringList("Server.ChatNames");
this.schemType = config.getString("Schematic.Type", "").toLowerCase();
@ -155,6 +165,10 @@ public class ArenaMode {
return maps;
}
public String convertToRealMapName(String map){
return lowerToRealMapNames.get(map.toLowerCase());
}
public String getChatName(){
return chatNames.get(0);
}

Datei anzeigen

@ -19,7 +19,8 @@
package de.steamwar.bungeecore;
import net.md_5.bungee.api.ProxyServer;
import de.steamwar.messages.ChatSender;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import java.util.concurrent.TimeUnit;
@ -29,14 +30,15 @@ class Broadcaster {
private int lastBroadCast = 0;
Broadcaster(){
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> {
if(!ProxyServer.getInstance().getPlayers().isEmpty())
BungeeCore.broadcast(BungeeCore.CHAT_PREFIX + broadCastMsgs[lastBroadCast]);
VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), () -> {
if(!VelocityCore.get().getProxyServer().getAllPlayers().isEmpty() && broadCastMsgs.length > 0) {
VelocityCore.get().getProxyServer().sendMessage(LegacyComponentSerializer.legacySection().deserialize(VelocityCore.CHAT_PREFIX + broadCastMsgs[lastBroadCast]));
}
lastBroadCast++;
if(lastBroadCast == broadCastMsgs.length){
lastBroadCast = 0;
}
}, 10, 10, TimeUnit.MINUTES);
}).repeat(10, TimeUnit.MINUTES);
}
static void setBroadCastMsgs(String[] broadCastMsgs) {

Datei anzeigen

@ -19,7 +19,7 @@
package de.steamwar.bungeecore;
import de.steamwar.bungeecore.sql.SWException;
import de.steamwar.sql.SWException;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
@ -33,7 +33,6 @@ import java.util.logging.LogRecord;
import java.util.logging.Logger;
public class ErrorLogger extends Handler {
private int ddosRate = 0;
ErrorLogger(){
Logger.getLogger("").addHandler(this);
@ -57,17 +56,12 @@ public class ErrorLogger extends Handler {
if(logRecord.getThrown() != null)
logRecord.getThrown().printStackTrace(new PrintStream(stacktraceOutput));
String stacktrace = stacktraceOutput.toString();
if(stacktrace.contains("Cannot request protocol")) {
if(++ddosRate % 1000 == 0) {
SWException.log("Bungee", "DDOS", ddosRate + "");
}
return;
} else if (stacktrace.contains("ErrorLogger")) {
if (stacktrace.contains("ErrorLogger")) {
return;
}
SWException.log("Bungee", message, stacktrace);
SWException.log(message, stacktrace);
}
@Override
@ -86,9 +80,14 @@ public class ErrorLogger extends Handler {
List<String> contains = new ArrayList<>();
contains.add("Error authenticating ");
contains.add("read timed out");
contains.add("could not decode packet");
contains.add("Connection reset by peer");
contains.add("No client connected for pending server");
contains.add("Error occurred processing connection for");
contains.add("Server is online mode!");
contains.add(" took ");
contains.add("Could not translate packet ");
contains.add("455420");
ignoreContains = Collections.unmodifiableList(contains);
}
}

Datei anzeigen

@ -19,42 +19,37 @@
package de.steamwar.bungeecore;
import de.steamwar.bungeecore.sql.Event;
import de.steamwar.bungeecore.sql.EventFight;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.Team;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.scheduler.ScheduledTask;
import de.steamwar.sql.EventFight;
import de.steamwar.sql.Team;
import net.kyori.adventure.text.event.ClickEvent;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.TimeUnit;
import static de.steamwar.bungeecore.Storage.eventServer;
public class EventStarter implements Runnable {
public class EventStarter {
private static ScheduledTask task = null;
private static final Map<Integer, String> spectatePorts = new HashMap<>();
EventStarter(){
public static void addSpectateServer(int port, String command) {
spectatePorts.put(port, command);
}
public EventStarter() {
EventFight.loadAllComingFights();
if(task != null)
task.cancel();
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), this, 1, 10, TimeUnit.SECONDS);
VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), this::run).repeat(10, TimeUnit.SECONDS);
}
public static Map<Integer, Subserver> getEventServer() {
return eventServer;
}
@Override
public void run() {
eventServer.entrySet().removeIf(entry -> !Subserver.getServerList().contains(entry.getValue()));
private void run() {
eventServer.entrySet().removeIf(entry -> Subserver.getSubserver(entry.getValue().getServer()) == null);
Queue<EventFight> fights = EventFight.getFights();
EventFight next;
@ -63,22 +58,19 @@ public class EventStarter implements Runnable {
Team red = Team.get(next.getTeamRed());
//Don't start EventServer if not the event bungee
if(BungeeCore.EVENT_MODE || !Event.get(next.getEventID()).spectateSystem()) {
if(VelocityCore.EVENT_MODE || next.getSpectatePort() == 0) {
ServerStarter starter = new ServerStarter().event(next);
ProxiedPlayer leiter = ProxyServer.getInstance().getPlayer(SteamwarUser.get(next.getKampfleiter()).getUuid());
if(leiter != null)
starter.send(leiter);
starter.callback(subserver -> {
eventServer.put(blue.getTeamId(), subserver);
eventServer.put(red.getTeamId(), subserver);
}).start();
Subserver subserver = starter.start();
eventServer.put(blue.getTeamId(), subserver);
eventServer.put(red.getTeamId(), subserver);
Message.broadcast("EVENT_FIGHT_BROADCAST", "EVENT_FIGHT_BROADCAST_HOVER",
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/event " + blue.getTeamKuerzel()), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName());
ClickEvent.runCommand("/event " + blue.getTeamKuerzel()), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName());
} else {
Message.broadcast("EVENT_FIGHT_BROADCAST", "EVENT_FIGHT_BROADCAST_HOVER",
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/spectate"), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName());
ClickEvent.runCommand("/" + spectatePorts.get(next.getSpectatePort())), blue.getTeamColor(), blue.getTeamName(), red.getTeamColor(), red.getTeamName());
}
}
}

Datei anzeigen

@ -19,12 +19,13 @@
package de.steamwar.bungeecore;
import com.velocitypowered.api.command.CommandSource;
import de.steamwar.messages.ChatSender;
import de.steamwar.messages.SteamwarResourceBundle;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.kyori.adventure.identity.Identity;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.event.ClickEvent;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
import java.text.DateFormat;
import java.text.MessageFormat;
@ -35,17 +36,17 @@ import java.util.ResourceBundle;
public class Message {
@Deprecated
public static TextComponent parseToComponent(String message, boolean prefixed, CommandSender sender, Object... params){
return new TextComponent(TextComponent.fromLegacyText(parse(message, prefixed, locale(sender), params)));
public static Component parseToComponent(String message, boolean prefixed, CommandSource sender, Object... params){
return LegacyComponentSerializer.legacySection().deserialize(parse(message, prefixed, locale(sender), params));
}
@Deprecated
public static String parsePrefixed(String message, CommandSender sender, Object... params){
public static String parsePrefixed(String message, CommandSource sender, Object... params){
return parse(message, true, locale(sender), params);
}
@Deprecated
public static String parse(String message, CommandSender sender, Object... params){
public static String parse(String message, CommandSource sender, Object... params){
return parse(message, false, locale(sender), params);
}
@ -55,8 +56,8 @@ public class Message {
}
@Deprecated
private static Locale locale(CommandSender sender) {
return ChatSender.of(sender).getLocale();
private static Locale locale(CommandSource sender) {
return sender.get(Identity.LOCALE).orElse(Locale.GERMAN);
}
@Deprecated
@ -82,32 +83,32 @@ public class Message {
}
@Deprecated
public static void send(String message, CommandSender sender, Object... params){
send(message, true, sender, ChatMessageType.SYSTEM, null, null, params);
public static void send(String message, CommandSource sender, Object... params){
send(message, true, sender, null, null, params);
}
@Deprecated
public static void sendPrefixless(String message, CommandSender sender, Object... params){
send(message, false, sender, ChatMessageType.SYSTEM, null, null, params);
public static void sendPrefixless(String message, CommandSource sender, Object... params){
send(message, false, sender, null, null, params);
}
@Deprecated
public static void send(String message, CommandSender sender, String onHover, ClickEvent onClick, Object... params){
send(message, true, sender, ChatMessageType.SYSTEM, onHover, onClick, params);
public static void send(String message, CommandSource sender, String onHover, ClickEvent onClick, Object... params){
send(message, true, sender, onHover, onClick, params);
}
@Deprecated
public static void sendPrefixless(String message, CommandSender sender, String onHover, ClickEvent onClick, Object... params){
send(message, false, sender, ChatMessageType.SYSTEM, onHover, onClick, params);
public static void sendPrefixless(String message, CommandSource sender, String onHover, ClickEvent onClick, Object... params){
send(message, false, sender, onHover, onClick, params);
}
@Deprecated
private static void send(String message, boolean prefixed, CommandSender s, ChatMessageType type, String onHover, ClickEvent onClick, Object... params){
private static void send(String message, boolean prefixed, CommandSource s, String onHover, ClickEvent onClick, Object... params){
ChatSender sender = ChatSender.of(s);
if(type == ChatMessageType.CHAT && !sender.chatShown())
if(!sender.chatShown())
return;
sender.send(prefixed, type, onHover != null ? new Message("PLAIN_STRING", onHover) : null, onClick, new Message(message, params));
sender.send(prefixed, onHover != null ? new Message("PLAIN_STRING", onHover) : null, onClick, new Message(message, params));
}
public static void broadcast(String message, Object... params) {
@ -123,7 +124,7 @@ public class Message {
}
public static void team(String message, String onHover, ClickEvent onClick, Object... params) {
ChatSender.serverteamReceivers().filter(player -> player.user().getUserGroup().isTeamGroup()).forEach(player -> player.prefixless(message, onHover != null ? new Message(onHover, params) : null, onClick, params));
ChatSender.serverteamReceivers().forEach(player -> player.prefixless(message, onHover != null ? new Message(onHover, params) : null, onClick, params));
}
private final String format;

Datei anzeigen

@ -19,9 +19,11 @@
package de.steamwar.bungeecore;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.ProxyServer;
import java.io.*;
import java.nio.file.Files;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
@ -29,8 +31,13 @@ import java.util.logging.Level;
public abstract class Node {
private static final List<String> OPENJ9_ARGS = Arrays.asList("-Xgc:excessiveGCratio=80", "-Xsyslog:none", "-Xtrace:none", "-Xdisableexplicitgc", "-XX:+AlwaysPreTouch", "-XX:+CompactStrings", "-XX:-HeapDumpOnOutOfMemory", "-XX:+ExitOnOutOfMemoryError", "-Dlog4j.configurationFile=log4j2.xml");
private static final double MIN_FREE_MEM = 4.0 * 1024 * 1024; // 4 GiB
//-Xquickstart Langzeitperformance testen!
private static final List<String> OPENJ9_ARGS = Arrays.asList(
"-XX:+EnableCRIUSupport", "-XX:-CRIURestoreNonPortableMode",
"-Xgc:excessiveGCratio=80", "-Xdisableexplicitgc", "-Xnoclassgc", "-Xmos128M", "-Xmns48M", "-XX:+ExitOnOutOfMemoryError", // initial heap half values of memory observed by 1.19 spectate server
"-Xsyslog:none", "-Xtrace:none", "-Xverify:none", "-Xdump:system:none", "-Xdump:jit:none", "-Xdump:snap:none",
"-Dlog4j.configurationFile=log4j2.xml"
);
private static final Set<String> JAVA_8 = new HashSet<>();
static {
JAVA_8.add("paper-1.8.8.jar");
@ -40,59 +47,70 @@ public abstract class Node {
JAVA_8.add("spigot-1.10.2.jar");
}
private static final long MIN_FREE_MEM = 4 * 1024 * 1024L; // 4 GiB
private static final List<Node> nodes = new ArrayList<>();
public static Node local = null;
public static Node getNode() {
Node node = local;
double minLoad = local.getLoad();
if(minLoad < 0.5)
return local;
synchronized (nodes) {
Iterator<Node> it = nodes.iterator();
while(it.hasNext()) {
Node n = it.next();
double load = n.getLoad();
if (load < minLoad) {
minLoad = load;
node = n;
} else if (load == Double.POSITIVE_INFINITY) {
BungeeCore.get().getLogger().log(Level.SEVERE, "Removing " + n.getName() + " due to infinite load!");
it.remove();
}
}
for(Node node : nodes) {
if(node.belowLoadLimit)
return node;
}
return node;
return null;
}
public static void forEach(Consumer<Node> consumer) {
consumer.accept(local);
synchronized (nodes) {
nodes.forEach(consumer);
}
nodes.forEach(consumer);
}
public abstract ProcessBuilder startServer(String serverJar, File directory, String worldDir, String levelName, int port, String xmx, String... dParams);
public abstract void execute(String... command);
public abstract String getName();
public abstract double getLoad();
protected abstract ProcessBuilder prepareExecution(String... command);
protected abstract void calcLoadLimit();
protected final String hostname;
protected volatile boolean belowLoadLimit = true;
protected Node(String hostname) {
this.hostname = hostname;
nodes.add(this);
VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), () -> calcLoadLimit()).repeat(2, TimeUnit.SECONDS);
}
public void execute(String... command) {
try {
prepareExecution(command).start().waitFor();
} catch (IOException e) {
throw new SecurityException("Could not execute command", e);
} catch (InterruptedException e) {
VelocityCore.get().getLogger().log(Level.SEVERE, "Interrupted during execution", e);
Thread.currentThread().interrupt();
}
}
public boolean belowLoadLimit() {
return belowLoadLimit;
}
public String getName() {
return hostname;
}
protected void constructServerstart(File directory, List<String> cmd, String serverJar, String worldDir, String levelName, int port, String xmx, String... dParams) {
if (JAVA_8.contains(serverJar))
cmd.add("/usr/lib/jvm/java-8-openj9-amd64/bin/java");
else
cmd.add("java");
cmd.add("/usr/lib/jvm/java-21-openj9-amd64/bin/java");
for(String param : dParams){
cmd.add("-D" + param);
}
cmd.add("-Xmx" + xmx);
cmd.add("-Xshareclasses:nonfatal,name=" + directory.getName());
cmd.add("-Xmx" + xmx);
cmd.addAll(OPENJ9_ARGS);
if (!JAVA_8.contains(serverJar)) {
cmd.add("--add-opens");
cmd.add("java.base/jdk.internal.misc=ALL-UNNAMED");
cmd.add("-XX:-CRIUSecProvider");
}
cmd.add("-jar");
cmd.add("/binarys/" + serverJar);
@ -106,26 +124,21 @@ public abstract class Node {
cmd.add("nogui");
}
protected void execute(ProcessBuilder builder) {
try {
builder.start().waitFor();
} catch (IOException e) {
throw new SecurityException("Could not execute command", e);
} catch (InterruptedException e) {
ProxyServer.getInstance().getLogger().log(Level.SEVERE, "Interrupted during execution", e);
Thread.currentThread().interrupt();
protected void calcLoadLimit(BufferedReader meminfo) throws IOException {
String line = meminfo.readLine();
while(!line.startsWith("MemAvailable")) {
line = meminfo.readLine();
}
long availableMem = Long.parseLong(line.replaceAll(" +", " ").split(" ")[1]);
belowLoadLimit = availableMem >= MIN_FREE_MEM;
}
public static class LocalNode extends Node {
private static final File meminfo = new File("/proc/meminfo");
private static final File loadavg = new File("/proc/loadavg");
private final int cores;
private static final File MEMINFO = new File("/proc/meminfo");
public LocalNode() {
this.cores = Runtime.getRuntime().availableProcessors();
local = this;
super("sw");
}
@Override
@ -138,74 +151,26 @@ public abstract class Node {
}
@Override
public void execute(String... command) {
execute(new ProcessBuilder(command));
protected void calcLoadLimit() {
try (BufferedReader meminfo = new BufferedReader(new InputStreamReader(Files.newInputStream(MEMINFO.toPath())))) {
calcLoadLimit(meminfo);
} catch (IOException e) {
VelocityCore.get().getLogger().log(Level.SEVERE, "Could not read local load", e);
belowLoadLimit = false;
}
}
@Override
public String getName() {
return "local";
}
@Override
public double getLoad() {
double totalMem;
double freeMem;
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(meminfo)))) {
totalMem = Double.parseDouble(bufferedReader.readLine().replaceAll(" +", " ").split(" ")[1]);
bufferedReader.readLine();
freeMem = Double.parseDouble(bufferedReader.readLine().replaceAll(" +", " ").split(" ")[1]);
} catch (IOException e) {
throw new SecurityException("Could not read local memory", e);
}
double cpuLoad;
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(loadavg)))) {
cpuLoad = Double.parseDouble(bufferedReader.readLine().split(" ")[0]);
} catch (IOException e) {
throw new SecurityException("Could not read local cpu", e);
}
return cpuLoad / cores + (freeMem > MIN_FREE_MEM ? 0 : ((totalMem - freeMem) / totalMem));
protected ProcessBuilder prepareExecution(String... command) {
return new ProcessBuilder(command);
}
}
public static class RemoteNode extends Node {
private final int cores;
private final String remote;
public RemoteNode(String remote) {
this.remote = remote;
//Determine core count
Process process;
try {
process = new ProcessBuilder("ssh", remote, "nproc").start();
if(!process.waitFor(5, TimeUnit.SECONDS))
throw new IOException("Timeout of " + remote + " on init");
} catch (IOException e) {
BungeeCore.get().getLogger().log(Level.SEVERE, "Could not initialize " + remote);
cores = 1;
return;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
cores = 1;
return;
}
int c;
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
c = Integer.parseInt(bufferedReader.readLine());
} catch (IOException | NumberFormatException e) {
BungeeCore.get().getLogger().log(Level.SEVERE, "Could not read cores of" + remote, e);
c = 1;
}
cores = c;
BungeeCore.get().getLogger().log(Level.INFO, "Adding node " + remote + " with " + cores + " cores.");
synchronized (nodes) {
nodes.add(this);
}
public RemoteNode(String hostname) {
super(hostname);
VelocityCore.get().getLogger().log(Level.INFO, "Added node " + hostname);
}
@Override
@ -214,7 +179,7 @@ public abstract class Node {
cmd.add("ssh");
cmd.add("-L");
cmd.add(port + ":localhost:" + port);
cmd.add(remote);
cmd.add(hostname);
cmd.add("cd");
cmd.add(directory.getPath());
cmd.add(";");
@ -223,43 +188,30 @@ public abstract class Node {
}
@Override
public void execute(String... command) {
protected ProcessBuilder prepareExecution(String... command) {
List<String> cmd = new ArrayList<>();
cmd.add("ssh");
cmd.add(remote);
cmd.add(hostname);
cmd.addAll(Arrays.asList(command));
execute(new ProcessBuilder(cmd));
return new ProcessBuilder(cmd);
}
@Override
public String getName() {
return remote;
}
@Override
public double getLoad() {
Process process;
protected void calcLoadLimit() {
try {
process = new ProcessBuilder("ssh", remote, "cat /proc/loadavg;cat /proc/meminfo").start();
Process process = prepareExecution("cat /proc/meminfo").start();
if(!process.waitFor(1, TimeUnit.SECONDS))
return Double.POSITIVE_INFINITY;
throw new IOException(hostname + " timeout");
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
calcLoadLimit(reader);
}
} catch (IOException e) {
BungeeCore.get().getLogger().log(Level.SEVERE, "Could starting process to read load", e);
return Double.POSITIVE_INFINITY;
if(belowLoadLimit)
VelocityCore.get().getLogger().log(Level.SEVERE, "Could read remote load", e);
belowLoadLimit = false;
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return Double.POSITIVE_INFINITY;
}
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
double cpuLoad = Double.parseDouble(bufferedReader.readLine().split(" ")[0]);
double totalMem = Double.parseDouble(bufferedReader.readLine().replaceAll(" +", " ").split(" ")[1]);
bufferedReader.readLine();
double freeMem = Double.parseDouble(bufferedReader.readLine().replaceAll(" +", " ").split(" ")[1]);
return cpuLoad / cores + (freeMem > MIN_FREE_MEM ? 0 : ((totalMem - freeMem) / totalMem));
} catch (IOException e) {
BungeeCore.get().getLogger().log(Level.SEVERE, "Could read load", e);
return Double.POSITIVE_INFINITY;
belowLoadLimit = false;
}
}
}

Datei anzeigen

@ -1,32 +1,35 @@
package de.steamwar.bungeecore;
import de.steamwar.bungeecore.sql.EventFight;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.Team;
import de.steamwar.bungeecore.sql.Tutorial;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import com.velocitypowered.api.proxy.Player;
import de.steamwar.messages.ChatSender;
import de.steamwar.sql.*;
import lombok.Getter;
import java.io.DataOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.file.Files;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.function.BooleanSupplier;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
public class ServerStarter {
private static final boolean MAIN_SERVER = ProxyServer.getInstance().getConfig().getListeners().stream().anyMatch(info -> ((InetSocketAddress) info.getSocketAddress()).getPort() == 25565);
private static final Portrange BAU_PORTS = MAIN_SERVER ? new Portrange(10100, 20000) : new Portrange(2100, 2200);
private static final Portrange ARENA_PORTS = MAIN_SERVER ? new Portrange(3000, 3100) : (BungeeCore.EVENT_MODE ? new Portrange(4000, 5000) : BAU_PORTS);
private static final Portrange BAU_PORTS = VelocityCore.MAIN_SERVER ? new Portrange(10100, 20000) : new Portrange(2100, 2200);
private static final Portrange ARENA_PORTS = VelocityCore.MAIN_SERVER ? new Portrange(3000, 3100) : (VelocityCore.EVENT_MODE ? new Portrange(4000, 5000) : BAU_PORTS);
private static final String BACKBONE = "/home/minecraft/";
private static final String SERVER_PATH = BACKBONE + "server/";
private static final String EVENT_PATH = BACKBONE + "event/";
public static final String TEMP_WORLD_PATH = BACKBONE + "arenaserver/";
public static final String TUTORIAL_PATH = BACKBONE + "tutorials/";
public static final String WORLDS18_PATH = BACKBONE + "userworlds18/";
private static final String SERVER_PATH = "/servers/";
private static final String USER_HOME = System.getProperty("user.home") + "/";
private static final String EVENT_PATH = USER_HOME + "event/";
public static final String TEMP_WORLD_PATH = USER_HOME + "arenaserver/";
public static final String TUTORIAL_PATH = USER_HOME + "tutorials/";
public static final String WORLDS_BASE_PATH = USER_HOME + "userworlds";
public static final String BUILDER_BASE_PATH = USER_HOME + "builder";
private File directory = null;
private String worldDir = null;
@ -43,9 +46,11 @@ public class ServerStarter {
private boolean allowMerge = false;
private String fightMap = null;
private String gameMode = null;
private ServerConstructor constructor = (serverName, port, builder, shutdownCallback) -> new Arenaserver(serverName, gameMode, fightMap, allowMerge, port, builder, shutdownCallback);
private boolean checkpoint = false;
private ServerConstructor constructor = (serverName, port, builder, shutdownCallback, failureCallback) -> new Arenaserver(serverName, gameMode, fightMap, allowMerge, port, builder, shutdownCallback);
private Consumer<Subserver> callback = subserver -> {};
private final Set<ProxiedPlayer> playersToSend = new HashSet<>();
private final Set<Player> playersToSend = new HashSet<>();
private final Map<String, String> arguments = new HashMap<>();
public ServerStarter arena(ArenaMode mode, String map) {
@ -62,13 +67,13 @@ public class ServerStarter {
}
public ServerStarter event(EventFight eventFight) {
arena(eventFight.getSpielmodus(), eventFight.getMap());
node = Node.local;
arena(ArenaMode.getByInternal(eventFight.getSpielmodus()), eventFight.getMap());
node = Node.LocalNode.getNode();
worldDir = EVENT_PATH;
worldCleanup = () -> {};
arguments.put("fightID", String.valueOf(eventFight.getFightID()));
fightMap = eventFight.getMap();
gameMode = eventFight.getSpielmodus().getInternalName();
gameMode = eventFight.getSpielmodus();
String serverName = Team.get(eventFight.getTeamBlue()).getTeamKuerzel() + " vs " + Team.get(eventFight.getTeamRed()).getTeamKuerzel();
serverNameProvider = port -> serverName;
@ -76,7 +81,7 @@ public class ServerStarter {
return this;
}
public ServerStarter test(ArenaMode mode, String map, ProxiedPlayer owner) {
public ServerStarter test(ArenaMode mode, String map, Player owner) {
arena(mode, map);
buildWithTemp(owner);
portrange = BAU_PORTS;
@ -84,12 +89,12 @@ public class ServerStarter {
return send(owner);
}
public ServerStarter blueLeader(ProxiedPlayer player) {
public ServerStarter blueLeader(Player player) {
arguments.put("blueLeader", player.getUniqueId().toString());
return send(player);
}
public ServerStarter redLeader(ProxiedPlayer player) {
public ServerStarter redLeader(Player player) {
arguments.put("redLeader", player.getUniqueId().toString());
return send(player);
}
@ -109,38 +114,50 @@ public class ServerStarter {
return this;
}
public ServerStarter build18(UUID owner) {
directory = new File(SERVER_PATH, "Bau18");
serverJar = "paper-1.18.2.jar";
worldDir = WORLDS18_PATH;
worldName = String.valueOf(SteamwarUser.get(owner).getId());
buildWithWorld(owner, new File(directory, "Bauwelt").getPath());
public ServerStarter build(Version version, UUID owner) {
directory = version.getServerDirectory("Bau");
serverJar = version.getServerJar();
worldDir = version.getWorldFolder(WORLDS_BASE_PATH);
worldName = version != Version.SPIGOT_12 ? String.valueOf(SteamwarUser.get(owner).getId()) : owner.toString();
checkpoint = true;
build(owner);
worldSetup = () -> {
File world = new File(worldDir, worldName);
if (!world.exists())
copyWorld(node, new File(directory, "Bauwelt").getPath(), world.getPath());
};
// Send players to existing server
startCondition = () -> {
Bauserver subserver = Bauserver.get(owner);
if(subserver != null) {
for(Player p : playersToSend)
SubserverSystem.sendPlayer(subserver, p);
return false;
}
boolean atLeastOneSupervisor = playersToSend.stream().anyMatch(player -> {
if (player.getUniqueId().equals(owner)) return true;
BauweltMember bauweltMember = BauweltMember.getBauMember(owner, player.getUniqueId());
return bauweltMember.isSupervisor();
});
if (!atLeastOneSupervisor) {
for (Player p : playersToSend) {
ChatSender.of(p).system("BAU_START_NOT_ALLOWED");
}
}
return atLeastOneSupervisor;
};
return this;
}
public ServerStarter build15(UUID owner) {
directory = new File(SERVER_PATH, "Bau15");
worldDir = BungeeCore.USERWORLDS15;
worldName = String.valueOf(SteamwarUser.get(owner).getId());
buildWithWorld(owner, BungeeCore.BAUWELT15);
return this;
}
public ServerStarter build12(UUID owner) {
directory = new File(SERVER_PATH, "UserBau");
serverJar = "spigot-1.12.2.jar";
xmx = "256M";
worldDir = BungeeCore.WORLD_FOLDER;
worldName = owner.toString();
buildWithWorld(owner, BungeeCore.BAUWELT_PROTOTYP);
return this;
}
public ServerStarter tutorial(ProxiedPlayer owner, Tutorial tutorial) {
public ServerStarter tutorial(Player owner, Tutorial tutorial) {
directory = new File(SERVER_PATH, "Tutorial");
buildWithTemp(owner);
tempWorld(TUTORIAL_PATH + tutorial.id());
arguments.put("tutorial", String.valueOf(tutorial.id()));
tempWorld(TUTORIAL_PATH + tutorial.getTutorialId());
arguments.put("tutorial", String.valueOf(tutorial.getTutorialId()));
return send(owner);
}
@ -150,29 +167,7 @@ public class ServerStarter {
worldCleanup = () -> SubserverSystem.deleteFolder(node, worldDir + worldName);
}
private void buildWithWorld(UUID owner, String prototype) {
build(owner);
worldSetup = () -> {
File world = new File(worldDir, worldName);
if (!world.exists())
copyWorld(node, prototype, world.getPath());
};
// Send players to existing server
startCondition = () -> {
for(Subserver subserver : Subserver.getServerList()) {
if(subserver.getType() == Servertype.BAUSERVER && ((Bauserver)subserver).getOwner().equals(owner)) {
for(ProxiedPlayer p : playersToSend)
SubserverSystem.sendPlayer(subserver, p);
return false;
}
}
return true;
};
}
private void buildWithTemp(ProxiedPlayer owner) {
private void buildWithTemp(Player owner) {
build(owner.getUniqueId());
// Stop existing build server
@ -180,58 +175,124 @@ public class ServerStarter {
if(startingBau(owner))
return false;
for (Subserver subserver : Subserver.getServerList()) {
if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(owner.getUniqueId()) && subserver.hasStarted()) {
subserver.stop();
break;
}
}
Bauserver subserver = Bauserver.get(owner.getUniqueId());
if(subserver != null && subserver.isStarted())
subserver.stop();
return !startingBau(owner);
};
}
private void build(UUID owner) {
constructor = (serverName, port, builder, shutdownCallback) -> new Bauserver(serverName, owner, port, builder, shutdownCallback);
constructor = (serverName, port, builder, shutdownCallback, failureCallback) -> new Bauserver(serverName, owner, port, builder, shutdownCallback, failureCallback);
serverNameProvider = port -> bauServerName(SteamwarUser.get(owner));
}
public ServerStarter send(ProxiedPlayer player) {
public ServerStarter builder(Version version, String map, File generator) {
serverJar = version.getServerJar();
directory = version.getServerDirectory("Builder");
worldDir = version.getWorldFolder(BUILDER_BASE_PATH);
worldName = map;
serverNameProvider = port -> "" + map;
checkpoint = true;
constructor = (serverName, port, builder, shutdownCallback, failureCallback) -> new Builderserver(serverName, worldName, port, builder, shutdownCallback, failureCallback);
// Send players to existing server
startCondition = () -> {
Builderserver subserver = Builderserver.get(worldName);
if (subserver != null) {
for(Player p : playersToSend)
SubserverSystem.sendPlayer(subserver, p);
return false;
}
return true;
};
if(generator != null) {
worldSetup = () -> {
File leveldat = new File(new File(worldDir, worldName), "level.dat");
try {
Files.copy(generator.toPath(), leveldat.toPath());
} catch (IOException e) {
throw new SecurityException(e);
}
};
}
return this;
}
public ServerStarter send(Player player) {
playersToSend.add(player);
return this;
}
public Subserver start() {
public ServerStarter callback(Consumer<Subserver> callback) {
this.callback = callback;
return this;
}
public boolean start() {
if(!startCondition.getAsBoolean())
return null;
return false;
int port = portrange.freePort();
String serverName = serverNameProvider.apply(port);
if(node == null)
if(node == null) {
node = Node.getNode();
if(node == null) {
for (Player p : playersToSend)
ChatSender.of(p).system("SERVER_START_OVERLOAD");
return false;
}
}
if(worldName == null)
worldName = serverToWorldName(serverName);
worldSetup.run();
arguments.put("logPath", worldName);
Subserver subserver = constructor.construct(serverName, port, node.startServer(
serverJar, directory, worldDir, worldName, port, xmx, arguments.entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue()).toArray(String[]::new)
), worldCleanup);
File checkpointDir = new File("/tmp/" + System.getProperty("user.name") + ".checkpoints/" + directory.getName() + "/" + worldName);
if(checkpoint)
arguments.put("checkpoint", checkpointDir.getPath());
for(ProxiedPlayer p : playersToSend)
SubserverSystem.sendPlayer(subserver, p);
if(checkpoint && checkpointDir.exists()) {
try {
new DataOutputStream(Files.newOutputStream(new File(checkpointDir, "port").toPath())).writeInt(port);
} catch (IOException e) {
throw new SecurityException(e);
}
return subserver;
postStart(constructor.construct(serverName, port, node.prepareExecution(
"criu", "restore", "-D", checkpointDir.getPath(), "--auto-dedup", "--shell-job", "-v"
), worldCleanup, e -> regularStart(serverName, port)));
} else {
regularStart(serverName, port);
}
return true;
}
private static boolean startingBau(ProxiedPlayer p) {
for (Subserver subserver : Subserver.getServerList()) {
if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(p.getUniqueId()) && !subserver.hasStarted()) {
Message.send("BAU_START_ALREADY", p);
return true;
}
private void regularStart(String serverName, int port) {
postStart(constructor.construct(serverName, port, node.startServer(
serverJar, directory, worldDir, worldName, port, xmx, arguments.entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue()).toArray(String[]::new)
), worldCleanup, null));
}
private void postStart(Subserver subserver) {
for(Player p : playersToSend)
SubserverSystem.sendPlayer(subserver, p);
callback.accept(subserver);
}
private static boolean startingBau(Player p) {
Bauserver subserver = Bauserver.get(p.getUniqueId());
if(subserver != null && !subserver.isStarted()) {
ChatSender.of(p).system("BAU_START_ALREADY");
return true;
}
return false;
}
@ -249,7 +310,7 @@ public class ServerStarter {
}
private interface ServerConstructor {
Subserver construct(String serverName, int port, ProcessBuilder builder, Runnable shutdownCallback);
Subserver construct(String serverName, int port, ProcessBuilder builder, Runnable shutdownCallback, Consumer<Exception> failureCallback);
}
private static class Portrange {
@ -287,4 +348,28 @@ public class ServerStarter {
return result;
}
}
}
@Getter
public enum Version {
SPIGOT_12("spigot-1.12.2.jar", 12),
SPIGOT_15("spigot-1.15.2.jar", 15),
PAPER_19("paper-1.19.3.jar", 19),
PAPER_20("paper-1.20.1.jar", 20);
private final String serverJar;
private final int versionSuffix;
Version(String serverJar, int versionSuffix) {
this.serverJar = serverJar;
this.versionSuffix = versionSuffix;
}
public String getWorldFolder(String base) {
return base + versionSuffix + "/";
}
public File getServerDirectory(String base) {
return new File(SERVER_PATH, base + versionSuffix);
}
}
}

Datei anzeigen

@ -19,13 +19,13 @@
package de.steamwar.bungeecore;
import de.steamwar.bungeecore.comms.handlers.FightInfoHandler;
import de.steamwar.bungeecore.comms.packets.StartingServerPacket;
import de.steamwar.bungeecore.sql.IgnoreSystem;
import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import com.velocitypowered.api.proxy.Player;
import de.steamwar.bungeecore.network.NetworkSender;
import de.steamwar.bungeecore.network.handlers.FightInfoHandler;
import de.steamwar.sql.IgnoreSystem;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.network.packets.server.StartingServerPacket;
import net.kyori.adventure.text.event.ClickEvent;
import java.util.UUID;
@ -36,23 +36,26 @@ public class SubserverSystem {
node.execute("rm", "-r", worldName);
}
public static void sendDeniedMessage(ProxiedPlayer p, UUID owner){
ProxiedPlayer o = ProxyServer.getInstance().getPlayer(owner);
if(o == null)
public static void sendDeniedMessage(Player p, UUID owner){
Player o = VelocityCore.get().getProxyServer().getPlayer(owner).orElse(null);
if(o == null){
return;
if(IgnoreSystem.isIgnored(o, p)){
}
if(IgnoreSystem.isIgnored(owner, p.getUniqueId())){
Message.send("SERVER_IGNORED", p);
return;
}
Message.send("SERVER_ADD_MEMBER", o, p.getName());
Message.sendPrefixless("SERVER_ADD_MESSAGE", o, Message.parse("SERVER_ADD_MESSAGE_HOVER", o, p.getName()),
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/bau addmember " + p.getName()));
Message.send("SERVER_ADD_MEMBER", o, p.getUsername());
Message.sendPrefixless("SERVER_ADD_MESSAGE", o, Message.parse("SERVER_ADD_MESSAGE_HOVER", o, p.getUsername()),
ClickEvent.runCommand("/bau addmember " + p.getUsername()));
}
public static void sendPlayer(Subserver subserver, ProxiedPlayer player) {
public static void sendPlayer(Subserver subserver, Player player) {
subserver.sendPlayer(player);
if(!subserver.hasStarted() && FightInfoHandler.onLobby(player))
new StartingServerPacket(SteamwarUser.get(player.getUniqueId())).send(player);
if(!subserver.isStarted() && FightInfoHandler.onLobby(player))
NetworkSender.send(player, new StartingServerPacket(SteamwarUser.get(player.getUniqueId()).getId()));
}
}

Datei anzeigen

@ -19,82 +19,127 @@
package de.steamwar.bungeecore;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.proxy.ProxyInitializeEvent;
import com.velocitypowered.api.event.proxy.ProxyReloadEvent;
import com.velocitypowered.api.plugin.Plugin;
import com.velocitypowered.api.plugin.annotation.DataDirectory;
import com.velocitypowered.api.proxy.Player;
import com.velocitypowered.api.proxy.ProxyServer;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.commands.*;
import de.steamwar.bungeecore.comms.SpigotReceiver;
import de.steamwar.bungeecore.listeners.*;
import de.steamwar.bungeecore.listeners.mods.*;
import de.steamwar.bungeecore.sql.*;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.config.Configuration;
import net.md_5.bungee.config.ConfigurationProvider;
import net.md_5.bungee.config.YamlConfiguration;
import de.steamwar.bungeecore.mods.ServerListPing;
import de.steamwar.bungeecore.mods.*;
import de.steamwar.bungeecore.network.BungeeNetworkHandler;
import de.steamwar.bungeecore.tablist.TablistManager;
import de.steamwar.bungeecore.util.SteamWarModule;
import de.steamwar.bungeecore.util.annotations.Create;
import de.steamwar.command.SWCommandUtils;
import de.steamwar.command.SWTypeMapperCreator;
import de.steamwar.command.TabCompletionCache;
import de.steamwar.command.TypeMapper;
import de.steamwar.sql.Punishment;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.Team;
import de.steamwar.sql.UserElo;
import de.steamwar.sql.internal.Statement;
import lombok.Getter;
import org.reflections.Reflections;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.nio.file.Path;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
public class BungeeCore extends Plugin {
@Plugin(
id = "velocitycore",
name = "VelocityCore",
authors = {"SteamWar"}
)
public class VelocityCore {
public static boolean MAIN_SERVER;
public static String CHAT_PREFIX;
public static String WORLD_FOLDER;
public static String BAUWELT_PROTOTYP;
public static String LOBBY_SERVER;
public static String USERWORLDS15;
public static String BAUWELT15;
public static boolean EVENT_MODE;
private static BungeeCore instance;
public static final Map<String, String> serverPermissions = new HashMap<>();
public static final Map<String, String> commands = new HashMap<>();
private static VelocityCore instance;
private ErrorLogger errorLogger;
private TablistManager tablistManager;
@Override
public void onEnable(){
getProxy().registerChannel("sw:bridge");
getProxy().registerChannel("fabricmodsender:mods");
@Getter
private final ProxyServer proxyServer;
@Getter
private final Logger logger;
@Getter
private final Path dataDirectory;
@Getter
private Injector injector;
@Inject
public VelocityCore(ProxyServer proxyServer, Logger logger, @DataDirectory Path dataDirectory, Injector injector) {
this.proxyServer = proxyServer;
this.logger = logger;
this.dataDirectory = dataDirectory;
this.injector = injector;
}
@Subscribe
public void onProxyInitialization(ProxyInitializeEvent event) {
setInstance(this);
MAIN_SERVER = proxyServer.getBoundAddress().getPort() == 25565;
loadConfig();
injector = injector.createChildInjector(new SteamWarModule(this));
errorLogger = new ErrorLogger();
SWCommandUtils.init((SWTypeMapperCreator<TypeMapper<Object>, Player, Object>) (mapper, tabCompleter) -> new TypeMapper<Object>() {
@Override
public Object map(Player commandSender, String[] previousArguments, String s) {
return mapper.apply(s);
}
@Override
public Collection<String> tabCompletes(Player sender, String[] previousArguments, String s) {
return tabCompleter.apply(sender, s);
}
});
proxyServer.getScheduler().buildTask(this, TabCompletionCache::invalidateOldEntries).repeat(1, TimeUnit.SECONDS);
Reflections reflections = new Reflections("de.steamwar.bungeecore");
reflections.getTypesAnnotatedWith(Create.class)
.forEach(clazz -> {
Create create = clazz.getAnnotation(Create.class);
if (create.eventProxy() || MAIN_SERVER) {
Object obj = injector.getInstance(clazz);
if (Arrays.stream(clazz.getDeclaredMethods()).anyMatch(method -> method.isAnnotationPresent(Subscribe.class))) {
proxyServer.getEventManager().register(this, obj);
}
}
});
new ConnectionListener();
new Forge();
new Forge12();
new LabyMod();
new Badlion();
new ChatListener();
new BanListener();
new CheckListener();
new ModLoaderBlocker();
new WorldDownloader();
new BrandListener();
new Fabric();
new SubserverProtocolFixer();
new IPSanitizer();
new Node.LocalNode();
//new Node.RemoteNode("lx");
//new Node.RemoteNode("az");
commands.put("/tp", null);
commands.put("/bc", null);
commands.put("/bauchat", null);
commands.put("/local", null);
if(MAIN_SERVER) {
//new Node.RemoteNode("lx");
}
new TeamchatCommand();
new MsgCommand();
@ -104,7 +149,7 @@ public class BungeeCore extends Plugin {
new KickCommand();
new JoinmeCommand();
new TpCommand();
new HelpCommand();
HelpCommand helpCommand = new HelpCommand();
new TeamCommand();
new ServerTeamchatCommand();
new DevCommand();
@ -127,6 +172,9 @@ public class BungeeCore extends Plugin {
new RankCommand();
new LocalCommand();
new SetLocaleCommand();
new BuilderCloudCommand();
new ModCommand();
// Punishment Commands:
new PunishmentCommand("ban", Punishment.PunishmentType.Ban);
@ -140,8 +188,8 @@ public class BungeeCore extends Plugin {
new PunishmentCommand("note", Punishment.PunishmentType.Note);
if(!EVENT_MODE){
new BauCommand();
new WebregisterCommand();
new BauCommand(helpCommand);
new WebpasswordCommand();
new FightCommand();
new ChallengeCommand();
new HistoricCommand();
@ -156,15 +204,15 @@ public class BungeeCore extends Plugin {
new EventStarter();
new SessionManager();
new SpigotReceiver();
new TablistManager();
BungeeNetworkHandler.register();
tablistManager = new TablistManager();
new SettingsChangedListener();
getProxy().getScheduler().schedule(this, () -> {
SteamwarUser.clearCache();
UserElo.clearCache();
Team.clearCache();
}, 1, 1, TimeUnit.HOURS);
proxyServer.getScheduler().buildTask(this, () -> {
SteamwarUser.clear();
UserElo.clear();
Team.clear();
}).repeat(1, TimeUnit.HOURS);
if (SteamwarDiscordBotConfig.loaded) {
try {
@ -175,8 +223,8 @@ public class BungeeCore extends Plugin {
}
}
@Override
public void onDisable(){
@Subscribe
public void onDisable(ProxyReloadEvent event) {
if (SteamwarDiscordBotConfig.loaded) {
try {
SteamwarDiscordBot.instance().getJda().shutdown();
@ -185,67 +233,16 @@ public class BungeeCore extends Plugin {
}
}
if(tablistManager != null)
tablistManager.disable();
errorLogger.unregister();
Statement.closeAll();
}
public static BungeeCore get() {
public static VelocityCore get() {
return instance;
}
public static TextComponent stringToText(String msg){
return new TextComponent(TextComponent.fromLegacyText(msg));
}
public static void send(ProxiedPlayer player, String msg){
send(player, msg, null, null);
}
public static void send(CommandSender sender, String msg){
sender.sendMessage(stringToText(msg));
}
public static void send(ProxiedPlayer player, ChatMessageType type, String msg){
send(player, type, msg, null, null);
}
public static void send(ProxiedPlayer player, String msg, String onHover, ClickEvent onClick){
send(player, ChatMessageType.SYSTEM, msg, onHover, onClick);
}
public static void send(ProxiedPlayer player, ChatMessageType type, String msg, String onHover, ClickEvent onClick){
if(type == ChatMessageType.CHAT && player.getChatMode() != ProxiedPlayer.ChatMode.SHOWN)
return;
TextComponent message = stringToText(msg);
if(onHover != null)
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(onHover)));
if(onClick != null)
message.setClickEvent(onClick);
player.sendMessage(type, message);
}
public static void broadcast(String msg){
ProxyServer.getInstance().broadcast(stringToText(msg));
}
public static void broadcast(String msg, String onHover, ClickEvent onClick){
TextComponent message = stringToText(msg);
if(onHover != null)
message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, TextComponent.fromLegacyText(onHover)));
if(onClick != null)
message.setClickEvent(onClick);
ProxyServer.getInstance().broadcast(message);
}
public static void log(final ServerInfo server, final String msg){
log(server.getName() + ": " + msg);
}
public static void log(final ProxiedPlayer player, final String msg){
log(player.getName() + ": " + msg);
}
public static void log(final String msg){
log(Level.INFO, msg);
}
public static void log(final Level logLevel, final String msg){
get().getLogger().log(logLevel, msg);
}
public static void log(final String msg, final Throwable e){
get().getLogger().log(Level.SEVERE, msg, e);
}
private static void loadConfig(){
Configuration config;
try{
@ -268,40 +265,38 @@ public class BungeeCore extends Plugin {
}
CHAT_PREFIX = config.getString("prefix");
WORLD_FOLDER = config.getString("worldfolder");
BAUWELT_PROTOTYP = config.getString("bauweltprototyp");
LOBBY_SERVER = config.getString("lobbyserver");
USERWORLDS15 = config.getString("userworlds15");
BAUWELT15 = config.getString("bauwelt15");
EVENT_MODE = config.getBoolean("eventmode");
Broadcaster.setBroadCastMsgs(config.getStringList("broadcasts").toArray(new String[1]));
PollSystem.init(config.getString("poll.question"), config.getStringList("poll.answers"));
Persistent.setChatPrefix(CHAT_PREFIX);
Persistent.setLobbyServer(LOBBY_SERVER);
if (config.contains("discord")) {
SteamwarDiscordBotConfig.loadConfig(config.getSection("discord"));
}
final Configuration servers = config.getSection("servers");
for(final String serverName : servers.getKeys()){
final Configuration server = servers.getSection(serverName);
List<String> cmds = server.getStringList("commands");
serverPermissions.put(serverName, "bungeecore.server." + server.getString("permission"));
String cmd = cmds.remove(0);
if(server.contains("spectatePort"))
EventStarter.addSpectateServer(server.getInt("spectatePort"), cmd);
new ServerSwitchCommand(
cmd,
serverName,
serverPermissions.get(serverName),
cmds.toArray(new String[0])
);
if(server.getBoolean("modchecked", false)) {
ModLoaderBlocker.addServer(serverName);
}
File discordFile = new File(System.getProperty("user.home"), "discord.yml");
if(discordFile.exists() && !EVENT_MODE) {
try {
SteamwarDiscordBotConfig.loadConfig(ConfigurationProvider.getProvider(YamlConfiguration.class).load(discordFile));
} catch (IOException e) {
get().getLogger().log(Level.SEVERE, "Could not load discord bot configuration", e);
}
}
}
private static void setInstance(BungeeCore core){
private static void setInstance(VelocityCore core){
instance = core;
}
}

Datei anzeigen

@ -19,9 +19,9 @@
package de.steamwar.bungeecore.bot;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.SteamwarUser;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.entities.Emoji;
import net.dv8tion.jda.api.entities.Member;
@ -46,8 +46,8 @@ public class AuthManager {
String code = Base64.getEncoder().encodeToString(randBytes);
TOKENS.put(code, member.getIdLong());
BungeeCore.log("Created Discord Auth-Token: " + code + " for: " + member.getUser().getAsTag());
BungeeCore.get().getProxy().getScheduler().schedule(BungeeCore.get(), () -> TOKENS.remove(code), 10, TimeUnit.MINUTES);
VelocityCore.log("Created Discord Auth-Token: " + code + " for: " + member.getUser().getAsTag());
VelocityCore.get().getProxy().getScheduler().schedule(VelocityCore.get(), () -> TOKENS.remove(code), 10, TimeUnit.MINUTES);
return code;
}

Datei anzeigen

@ -19,7 +19,7 @@
package de.steamwar.bungeecore.bot;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.bungeecore.bot.commands.*;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.bot.events.EventManager;
@ -28,8 +28,8 @@ import de.steamwar.bungeecore.bot.listeners.*;
import de.steamwar.bungeecore.bot.util.DiscordRolesMessage;
import de.steamwar.bungeecore.bot.util.DiscordRulesMessage;
import de.steamwar.bungeecore.bot.util.DiscordTicketMessage;
import de.steamwar.bungeecore.sql.Event;
import de.steamwar.messages.ChatSender;
import de.steamwar.sql.Event;
import lombok.Getter;
import net.dv8tion.jda.api.JDA;
import net.dv8tion.jda.api.JDABuilder;
@ -81,7 +81,7 @@ public class SteamwarDiscordBot {
} catch (LoginException e) {
throw new SecurityException("Could not Login: " + SteamwarDiscordBotConfig.TOKEN, e);
}
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
try {
jda.awaitReady();
} catch (InterruptedException e) {
@ -90,11 +90,11 @@ public class SteamwarDiscordBot {
try {
activity();
} catch (Exception e) {
BungeeCore.get().getLogger().log(Level.SEVERE, "Could not set initial activity to discord", e);
VelocityCore.get().getLogger().log(Level.SEVERE, "Could not set initial activity to discord", e);
}
EventManager.update();
SchematicsManager.update();
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> {
ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), () -> {
try {
activity();
EventManager.update();
@ -148,7 +148,7 @@ public class SteamwarDiscordBot {
}
break;
case 1:
int count = BungeeCore.get().getProxy().getOnlineCount();
int count = VelocityCore.get().getProxy().getOnlineCount();
if (count == 1) {
jda.getPresence().setActivity(Activity.playing("mit 1 Spieler"));
} else {

Datei anzeigen

@ -21,8 +21,7 @@ package de.steamwar.bungeecore.bot.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.commands.PunishmentCommand;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.SteamwarUser;
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -45,7 +44,7 @@ public class BanCommand extends BasicDiscordCommand {
}
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
SteamwarUser target = PunishmentCommand.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
if (target == null) {
event.reply("Angegebener User invalide").setEphemeral(true).queue();
return;
@ -60,7 +59,7 @@ public class BanCommand extends BasicDiscordCommand {
String msg = event.getOption("reason").getAsString();
boolean isPerma = event.getOption("time").getAsString().equals("perma");
target.punish(Punishment.PunishmentType.Ban, time, msg, sender.getId(), isPerma);
PunishmentCommand.ban(target, time, msg, sender, isPerma);
Message.team("BAN_TEAM", new Message("PREFIX"), target.getUserName(), sender.getUserName(), new Message((isPerma ? "BAN_PERMA" : "BAN_UNTIL"), time), msg);
event.reply("Erfolgreich " + target.getUserName() + (isPerma ? " permanent" : " bis " + time) + " gebannt").setEphemeral(true).queue();
}

Datei anzeigen

@ -19,8 +19,8 @@
package de.steamwar.bungeecore.bot.commands;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.UserGroup;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserPerm;
import net.dv8tion.jda.api.entities.Member;
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
import net.dv8tion.jda.api.interactions.commands.build.CommandData;
@ -45,7 +45,7 @@ public abstract class BasicDiscordCommand extends CommandData {
protected boolean testPermission(SlashCommandEvent event) {
Member member = event.getMember();
SteamwarUser steamwarUser = SteamwarUser.get(member.getIdLong());
if (steamwarUser == null || (!steamwarUser.getUserGroup().isTeamGroup() && steamwarUser.getUserGroup() != UserGroup.Builder)) {
if (steamwarUser == null || (!steamwarUser.hasPerm(UserPerm.TEAM))) {
event.reply("Du hast für " + event.getName() + " keine Rechte oder es existiert keine Verknüpfung für dich.").setEphemeral(true).queue();
return false;
}

Datei anzeigen

@ -21,8 +21,8 @@ package de.steamwar.bungeecore.bot.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.commands.PunishmentCommand;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.Punishment;
import de.steamwar.sql.SteamwarUser;
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -45,7 +45,7 @@ public class MuteCommand extends BasicDiscordCommand {
}
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
SteamwarUser target = PunishmentCommand.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
if (target == null) {
event.reply("Angegebener User invalide").setEphemeral(true).complete();
return;

Datei anzeigen

@ -19,10 +19,10 @@
package de.steamwar.bungeecore.bot.commands;
import de.steamwar.bungeecore.sql.Event;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.Team;
import de.steamwar.bungeecore.sql.TeamTeilnahme;
import de.steamwar.sql.Event;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.Team;
import de.steamwar.sql.TeamTeilnahme;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.entities.Emoji;
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
@ -91,6 +91,6 @@ public class TeamCommand extends BasicDiscordCommand {
}
private boolean isOnline(SteamwarUser user) {
return ProxyServer.getInstance().getPlayer(user.getUuid()) != null;
return ProxyServer.getInstance().getPlayer(user.getUUID()) != null;
}
}

Datei anzeigen

@ -19,8 +19,10 @@
package de.steamwar.bungeecore.bot.commands;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.commands.PunishmentCommand;
import de.steamwar.sql.BannedUserIPs;
import de.steamwar.sql.Punishment;
import de.steamwar.sql.SteamwarUser;
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -42,7 +44,7 @@ public class UnbanCommand extends BasicDiscordCommand {
}
SteamwarUser sender = SteamwarUser.get(event.getMember().getIdLong());
SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
SteamwarUser target = PunishmentCommand.getOrCreateOfflinePlayer(event.getOption("user").getAsString());
if (target == null) {
event.reply("Angegebener User invalide").setEphemeral(true).queue();
return;
@ -54,6 +56,7 @@ public class UnbanCommand extends BasicDiscordCommand {
}
target.punish(Punishment.PunishmentType.Ban, Timestamp.from(new Date().toInstant()), "Unban", sender.getId(), false);
BannedUserIPs.unbanIPs(target.getId());
event.reply("Erfolgreich " + target.getUserName() + " entbannt").setEphemeral(true).queue();
}
}

Datei anzeigen

@ -19,9 +19,9 @@
package de.steamwar.bungeecore.bot.commands;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.Team;
import de.steamwar.sql.Punishment;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.Team;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.events.interaction.SlashCommandEvent;
import net.dv8tion.jda.api.interactions.commands.OptionType;
@ -72,7 +72,7 @@ public class WhoisCommand extends BasicDiscordCommand {
EmbedBuilder embedBuilder = new EmbedBuilder();
embedBuilder.setTitle("Whois: " + user.getUserName());
StringBuilder st = new StringBuilder();
st.append("UUID: ").append(user.getUuid()).append("\n");
st.append("UUID: ").append(user.getUUID()).append("\n");
st.append("ID: ").append(user.getId()).append("\n");
if (user.getDiscordId() != null) {
st.append("DiscordID: ").append(user.getDiscordId()).append("\n");

Datei anzeigen

@ -19,7 +19,7 @@
package de.steamwar.bungeecore.bot.config;
import de.steamwar.bungeecore.sql.UserGroup;
import de.steamwar.sql.UserPerm;
import net.md_5.bungee.config.Configuration;
import java.util.ArrayList;
@ -52,7 +52,7 @@ public class SteamwarDiscordBotConfig {
public static String TICKET_CREATED;
public static String TICKET_LOG;
public static Map<String, DiscordTicketType> TICKET_TYPES;
public static Map<UserGroup, String> RANKS;
public static Map<UserPerm, String> RANKS;
public static void loadConfig(Configuration config) {
TOKEN = config.getString("token");
@ -109,7 +109,7 @@ public class SteamwarDiscordBotConfig {
RANKS = new HashMap<>();
Configuration ranksSections = config.getSection("ranks");
for (String type : ranksSections.getKeys()) {
RANKS.put(UserGroup.getUsergroup(type), ranksSections.getString(type));
RANKS.put(UserPerm.valueOf(type.toUpperCase()), ranksSections.getString(type));
}
loaded = true;
}

Datei anzeigen

@ -21,10 +21,10 @@ package de.steamwar.bungeecore.bot.events;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.sql.Event;
import de.steamwar.bungeecore.sql.EventFight;
import de.steamwar.bungeecore.sql.Team;
import de.steamwar.bungeecore.sql.TeamTeilnahme;
import de.steamwar.sql.EventFight;
import de.steamwar.sql.Team;
import de.steamwar.sql.TeamTeilnahme;
import de.steamwar.sql.Event;
import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.MessageBuilder;

Datei anzeigen

@ -22,7 +22,7 @@ package de.steamwar.bungeecore.bot.events;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.commands.CheckCommand;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.SteamwarUser;
import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.MessageBuilder;

Datei anzeigen

@ -21,7 +21,7 @@ package de.steamwar.bungeecore.bot.listeners;
import de.steamwar.bungeecore.bot.AuthManager;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.SteamwarUser;
import net.dv8tion.jda.api.entities.ChannelType;
import net.dv8tion.jda.api.events.interaction.GenericComponentInteractionCreateEvent;
import net.dv8tion.jda.api.interactions.InteractionType;

Datei anzeigen

@ -22,8 +22,8 @@ package de.steamwar.bungeecore.bot.listeners;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.listeners.ChatListener;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.Punishment;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.messages.ChatSender;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.entities.Member;

Datei anzeigen

@ -21,10 +21,10 @@ package de.steamwar.bungeecore.bot.listeners;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.bot.events.EventManager;
import de.steamwar.bungeecore.sql.Event;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.Team;
import de.steamwar.bungeecore.sql.TeamTeilnahme;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.Team;
import de.steamwar.sql.TeamTeilnahme;
import de.steamwar.sql.Event;
import net.dv8tion.jda.api.events.interaction.SelectionMenuEvent;
import net.dv8tion.jda.api.interactions.components.Component;
import org.jetbrains.annotations.NotNull;

Datei anzeigen

@ -19,11 +19,12 @@
package de.steamwar.bungeecore.bot.listeners;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.bot.config.DiscordTicketType;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserPerm;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.MessageBuilder;
import net.dv8tion.jda.api.Permission;
@ -136,15 +137,15 @@ public class DiscordTicketListener extends BasicDiscordListener {
public void onGuildMessageReceived(@NotNull GuildMessageReceivedEvent event) {
if(event.getChannel().getParent() != null && event.getChannel().getParent().getId().equals(SteamwarDiscordBotConfig.TICKET_CATEGORY)) {
if(!event.getChannel().getId().equals(SteamwarDiscordBotConfig.TICKET_CHANNEL) && !event.getChannel().getId().equals(SteamwarDiscordBotConfig.TICKET_LOG)) {
BungeeCore.get().getProxy().getPlayers().forEach(player -> {
VelocityCore.get().getProxy().getPlayers().forEach(player -> {
if(event.getAuthor().isBot() || event.getAuthor().isSystem()) return;
SteamwarUser user = SteamwarUser.get(player);
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
boolean sendMessage;
if(user.getDiscordId() == null) {
sendMessage = user.getUserGroup().isCheckSchematics();
sendMessage = user.hasPerm(UserPerm.CHECK);
} else {
if(event.getAuthor().getId().equals(user.getDiscordId())) return;
sendMessage = user.getDiscordId().equals(event.getChannel().getTopic()) || user.getUserGroup().isCheckSchematics();
sendMessage = user.getDiscordId().equals(event.getChannel().getTopic()) || user.hasPerm(UserPerm.CHECK);
}
if(sendMessage) {
Message.sendPrefixless("DISCORD_TICKET_MESSAGE", player, "Zur nachricht", new ClickEvent(ClickEvent.Action.OPEN_URL, event.getMessage().getJumpUrl()), event.getChannel().getName(), event.getAuthor().getName(), event.getMessage().getContentRaw());

Datei anzeigen

@ -18,13 +18,16 @@
package de.steamwar.bungeecore.bot.listeners;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SchematicNode;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.sql.NodeData;
import de.steamwar.sql.Punishment;
import de.steamwar.sql.SchematicNode;
import de.steamwar.sql.SteamwarUser;
import net.dv8tion.jda.api.entities.Message;
import net.dv8tion.jda.api.events.message.priv.PrivateMessageReceivedEvent;
import java.io.InputStream;
public class PrivateMessageListener extends BasicDiscordListener {
@Override
@ -57,17 +60,19 @@ public class PrivateMessageListener extends BasicDiscordListener {
continue;
}
SchematicNode node = SchematicNode.getSchematicNode(user.getId(), name, 0);
SchematicNode node = SchematicNode.getSchematicNode(user.getId(), name, (Integer) null);
if(node == null) {
node = SchematicNode.createSchematic(user.getId(), name, null);
}
try {
node.saveFromStream(attachment.retrieveInputStream().get(), newFormat);
InputStream in = attachment.retrieveInputStream().get();
NodeData.get(node).saveFromStream(in, newFormat);
in.close();
event.getMessage().reply("`" + name + "` wurde erfolgreich hochgeladen").queue();
} catch (Exception e) {
event.getMessage().reply("`" + name + "` konnte nicht hochgeladen werden, bitte versuche es später nochmal oder wende dich an einen Developer").queue();
BungeeCore.log("Could not Upload Schem \"" + name + "\" from User \"" + user.getUserName() + "\"" + e);
VelocityCore.log("Could not Upload Schem \"" + name + "\" from User \"" + user.getUserName() + "\"", e);
}
}
}

Datei anzeigen

@ -21,7 +21,7 @@ package de.steamwar.bungeecore.bot.util;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.SteamwarUser;
import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.entities.Guild;
import net.dv8tion.jda.api.entities.Role;
@ -42,7 +42,7 @@ public class DiscordRanks {
guild.retrieveMemberById(steamwarUser.getDiscordId()).queue(member -> {
List<Role> roleList = member.getRoles();
Set<String> strings = new HashSet<>(SteamwarDiscordBotConfig.RANKS.values());
String needed = SteamwarDiscordBotConfig.RANKS.get(steamwarUser.getUserGroup());
String needed = SteamwarDiscordBotConfig.RANKS.get(steamwarUser.prefix());
for (Role role : roleList) {
if (!strings.contains(role.getId())) {
continue;

Datei anzeigen

@ -20,8 +20,8 @@
package de.steamwar.bungeecore.bot.util;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.sql.SchematicNode;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.SchematicNode;
import de.steamwar.sql.SteamwarUser;
import lombok.experimental.UtilityClass;
import net.dv8tion.jda.api.EmbedBuilder;
import net.dv8tion.jda.api.MessageBuilder;

Datei anzeigen

@ -21,49 +21,29 @@ package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.listeners.ConnectionListener;
import de.steamwar.command.SWCommand;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
public class AlertCommand extends BasicCommand {
public class AlertCommand extends SWCommand {
public AlertCommand() {
super("alert", "bungeecore.alert", "broadcast", "bbc");
super("alert", ConnectionListener.ALERT_PERMISSION, "broadcast", "bbc");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(args.length == 0){
Message.send("USAGE_ALERT", sender);
@Register(description = "USAGE_ALERT")
public void broadcast(CommandSender sender, @OptionalValue("") @StaticValue("-discord") String sendToDiscord, String... message) {
if (message.length == 0) {
ChatSender.of(sender).system(new Message("USAGE_ALERT"));
return;
}
String s;
boolean discordAnnounce = false;
if (args[0].equals("-discord")) {
if (args.length == 1) {
Message.send("USAGE_ALERT", sender);
return;
}
discordAnnounce = true;
s = join(1, args);
} else {
s = join(0, args);
}
String s = String.join(" ", message);
Message.broadcast("ALERT", ChatColor.translateAlternateColorCodes('&', s));
if (discordAnnounce && SteamwarDiscordBot.instance() != null) {
if ("-discord".equals(sendToDiscord) && SteamwarDiscordBot.instance() != null) {
SteamwarDiscordBot.instance().getAnnouncementListener().announce(s);
}
}
private String join(int startIndex, String... strings) {
StringBuilder st = new StringBuilder();
for (int i = startIndex; i < strings.length; i++) {
if (i != startIndex) {
st.append(" ");
}
st.append(strings[i]);
}
return st.toString();
}
}

Datei anzeigen

@ -19,33 +19,53 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.Servertype;
import de.steamwar.bungeecore.Subserver;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class ArenaCommand extends BasicCommand {
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
public class ArenaCommand extends SWCommand {
public ArenaCommand() {
super("arena", null);
super("arena");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
@Register
public void arenaJoin(ProxiedPlayer player, Subserver server) {
TpCommand.teleport(player, server.getServer());
}
ServerInfo server = ProxyServer.getInstance().getServerInfo(String.join(" ", args));
Subserver subserver = Subserver.getSubserver(server);
if(server == null || subserver == null || subserver.getType() != Servertype.ARENA) {
Message.send("ARENA_NOT_FOUND", player);
return;
}
@ClassMapper(value = Subserver.class, local = true)
public TypeMapper<Subserver> serverInfoTypeMapper() {
return new TypeMapper<Subserver>() {
@Override
public Subserver map(CommandSender commandSender, String[] previousArguments, String s) {
return Subserver.getSubserver(ProxyServer.getInstance().getServerInfo(s));
}
TpCommand.teleport(player, server);
@Override
public boolean validate(CommandSender sender, Subserver value, MessageSender messageSender) {
if (value == null || value.getType() != Servertype.ARENA) {
messageSender.send("ARENA_NOT_FOUND");
return false;
}
return true;
}
@Override
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
List<Subserver> subserverList = Subserver.getServerList();
synchronized (subserverList) {
return subserverList.stream().filter(subserver -> subserver.getType() == Servertype.ARENA).map(subserver -> subserver.getServer().getName()).collect(Collectors.toList());
}
}
};
}
}

Datei anzeigen

@ -1,69 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.TabExecutor;
import java.util.ArrayList;
import java.util.List;
abstract class BasicCommand extends Command implements TabExecutor {
public BasicCommand(String name, String permission, String... aliases) {
super(name, permission, aliases);
BungeeCore.commands.put("/" + name, permission);
ProxyServer.getInstance().getPluginManager().registerCommand(BungeeCore.get(), this);
}
Iterable<String> allPlayers(String begin) {
List<String> suggestions = new ArrayList<>();
for(ProxiedPlayer player : ProxyServer.getInstance().getPlayers()){
String playerName = player.getName();
if(playerName.startsWith(begin))
suggestions.add(playerName);
}
return suggestions;
}
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
return new ArrayList<>();
}
protected SteamwarUser existingUser(CommandSender sender, String arg){
SteamwarUser target = SteamwarUser.get(arg);
if(target == null)
Message.send("UNKNOWN_PLAYER", sender);
return target;
}
protected SteamwarUser unsafeUser(CommandSender sender, String arg){
SteamwarUser target = SteamwarUser.getOrCreateOfflinePlayer(arg);
if(target == null)
Message.send("UNKNOWN_PLAYER", sender);
return target;
}
}

Datei anzeigen

@ -20,221 +20,260 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.comms.packets.BaumemberUpdatePacket;
import de.steamwar.bungeecore.inventory.SWInventory;
import de.steamwar.bungeecore.inventory.SWItem;
import de.steamwar.bungeecore.sql.BauweltMember;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.messages.ChatSender;
import de.steamwar.bungeecore.network.NetworkSender;
import de.steamwar.bungeecore.util.BauLock;
import de.steamwar.bungeecore.util.BauLockState;
import de.steamwar.bungeecore.util.Chat19;
import de.steamwar.command.PreviousArguments;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper;
import de.steamwar.command.TypeValidator;
import de.steamwar.network.packets.server.BaumemberUpdatePacket;
import de.steamwar.sql.BauweltMember;
import de.steamwar.sql.SteamwarUser;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class BauCommand extends BasicCommand {
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public BauCommand(){
public class BauCommand extends SWCommand {
private final HelpCommand command;
public BauCommand(HelpCommand command){
super("bau", null, "b", "build", "gs");
this.command = command;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer)) {
return;
}
@Register(noTabComplete = true)
public void genericHelp(ProxiedPlayer p, String... args) {
this.command.sendBauHelp(p);
}
ProxiedPlayer p = (ProxiedPlayer) sender;
@Register
public void toBau(ProxiedPlayer p, @Mapper("version") @OptionalValue(value = "", onlyUINIG = true) ServerStarter.Version version) {
new ServerStarter().build(version, p.getUniqueId()).send(p).start();
}
versionSelector(p, args, 0,
() -> new ServerStarter().build18(p.getUniqueId()).send(p).start(),
() -> new ServerStarter().build15(p.getUniqueId()).send(p).start(),
() -> new ServerStarter().build12(p.getUniqueId()).send(p).start(),
() -> {
switch (args[0].toLowerCase()) {
case "addmember":
addmember(p, args);
break;
case "tp":
case "teleport":
teleport(p, args);
break;
case "info":
p.chat("/bauinfo");
break;
case "togglewe":
togglewe(p, args);
break;
case "toggleworld":
toggleworld(p, args);
break;
case "delmember":
delmember(p, args);
break;
case "resetall":
case "delete":
delete(p, args);
break;
case "testarena":
case "test":
testarena(p, args);
break;
default:
HelpCommand.sendBauHelp(ChatSender.of(p));
@Mapper(value = "version", local = true)
public TypeMapper<ServerStarter.Version> versionMapper() {
Map<String, ServerStarter.Version> versionMap = new HashMap<>();
versionMap.put("20", ServerStarter.Version.PAPER_20);
versionMap.put("1.20", ServerStarter.Version.PAPER_20);
versionMap.put("as", ServerStarter.Version.PAPER_20);
versionMap.put("airship", ServerStarter.Version.PAPER_20);
versionMap.put("wg", ServerStarter.Version.PAPER_20);
versionMap.put("wargear", ServerStarter.Version.PAPER_20);
versionMap.put("ws", ServerStarter.Version.PAPER_20);
versionMap.put("warship", ServerStarter.Version.PAPER_20);
versionMap.put("19", ServerStarter.Version.PAPER_19);
versionMap.put("1.19", ServerStarter.Version.PAPER_19);
versionMap.put("mwg", ServerStarter.Version.PAPER_19);
versionMap.put("miniwargear", ServerStarter.Version.PAPER_19);
versionMap.put("15", ServerStarter.Version.SPIGOT_15);
versionMap.put("1.15", ServerStarter.Version.SPIGOT_15);
versionMap.put("12", ServerStarter.Version.SPIGOT_12);
versionMap.put("1.12", ServerStarter.Version.SPIGOT_12);
return new TypeMapper<ServerStarter.Version>() {
@Override
public ServerStarter.Version map(CommandSender commandSender, String[] previousArguments, String s) {
if (commandSender == null) return null;
ProxiedPlayer player = (ProxiedPlayer) commandSender;
if (s.isEmpty()) {
int version = player.getPendingConnection().getVersion();
if (version > 762) { // Version > 1.19.4
return ServerStarter.Version.PAPER_20;
} else if (version > 578) { // Version > 1.15.2
return ServerStarter.Version.PAPER_19;
} else if (version > 340) { // Version > 1.12.2
return ServerStarter.Version.SPIGOT_15;
} else {
return ServerStarter.Version.SPIGOT_12;
}
}
);
return versionMap.get(s.toLowerCase());
}
@Override
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
return versionMap.keySet();
}
};
}
private static void addmember(ProxiedPlayer p, String[] args){
if (args.length == 1) {
Message.send("BAU_ADDMEMBER_USAGE", p);
return;
}
SteamwarUser target = SteamwarUser.get(args[1]);
if (target == null) {
Message.send("UNKNOWN_PLAYER", p);
return;
}else if(target.getUuid().equals(p.getUniqueId())) {
Message.send("BAU_ADDMEMBER_SELFADD", p);
return;
}else if (BauweltMember.getBauMember(p.getUniqueId(), target.getUuid()) != null) {
Message.send("BAU_ADDMEMBER_ISADDED", p);
return;
}
new BauweltMember(p.getUniqueId(), target.getUuid(), false, false);
@Register(value = "addmember", description = "BAU_ADDMEMBER_USAGE")
public void addmember(ProxiedPlayer p, @Validator("addMemberTarget") SteamwarUser target) {
BauweltMember.addMember(p.getUniqueId(), target.getUUID());
Message.send("BAU_ADDMEMBER_ADDED", p);
ProxiedPlayer z = ProxyServer.getInstance().getPlayer(target.getUuid());
ProxiedPlayer z = ProxyServer.getInstance().getPlayer(target.getUUID());
if(z != null)
Message.send("BAU_ADDMEMBER_ADDED_TARGET", z, p.getName());
}
private static void teleport(ProxiedPlayer p, String[] args){
if (args.length == 1) {
Message.send("BAU_TP_USAGE", p);
return;
}
SteamwarUser worldOwner = SteamwarUser.get(args[1]);
if (worldOwner == null) {
Message.send("UNKNOWN_PLAYER", p);
return;
}else if (!p.getUniqueId().equals(worldOwner.getUuid()) && BauweltMember.getBauMember(worldOwner.getUuid(), p.getUniqueId()) == null){
SubserverSystem.sendDeniedMessage(p, worldOwner.getUuid());
Message.send("BAU_TP_NOALLOWED", p);
return;
}
versionSelector(p, args, 2,
() -> new ServerStarter().build18(worldOwner.getUuid()).send(p).start(),
() -> new ServerStarter().build15(worldOwner.getUuid()).send(p).start(),
() -> new ServerStarter().build12(worldOwner.getUuid()).send(p).start(),
() -> HelpCommand.sendBauHelp(ChatSender.of(p)));
}
private static void versionSelector(ProxiedPlayer p, String[] args, int pos, Runnable run18, Runnable run15, Runnable run12, Runnable runElse) {
if(args.length <= pos) {
int version = p.getPendingConnection().getVersion();
if(version > 340) { // Version > 1.12.2
run15.run();
} else {
run12.run();
@Validator(value = "addMemberTarget", local = true)
public TypeValidator<SteamwarUser> addMemberTargetValidator() {
return (sender, value, messageSender) -> {
if (value == null) {
messageSender.send("UNKNOWN_PLAYER");
return false;
}
return;
}
switch (args[pos].toLowerCase()) {
case "18":
case "1.18":
run18.run();
break;
case "ws":
case "warship":
case "as":
case "airship":
case "mwg":
case "miniwargear":
case "wg":
case "wargear":
case "15":
case "1.15":
run15.run();
break;
case "12":
case "1.12":
run12.run();
break;
default:
runElse.run();
}
if (((ProxiedPlayer) sender).getUniqueId().equals(value.getUUID())) {
messageSender.send("BAU_ADDMEMBER_SELFADD");
return false;
}
if (BauweltMember.getBauMember(((ProxiedPlayer) sender).getUniqueId(), value.getUUID()) != null) {
messageSender.send("BAU_ADDMEMBER_ISADDED");
return false;
}
return true;
};
}
private static void togglewe(ProxiedPlayer p, String[] args){
BauweltMember target = toggle(p, args, "togglewe");
if(target == null)
return;
target.setWorldEdit(!target.isWorldEdit());
clearMembercache(p);
isAllowedTo(target.isWorldEdit(), p, target, "BAU_MEMBER_TOGGLE_WORLD_EDIT");
@Register(value = "tp", description = "BAU_TP_USAGE")
@Register("teleport")
public void teleport(ProxiedPlayer p, @Validator("teleportTarget") SteamwarUser worldOwner, @Mapper("version") @OptionalValue(value = "", onlyUINIG = true) ServerStarter.Version version) {
new ServerStarter().build(version, worldOwner.getUUID()).send(p).start();
}
private static void toggleworld(ProxiedPlayer p, String[] args){
BauweltMember target = toggle(p, args, "toggleworld");
if(target == null)
@Validator(value = "teleportTarget", local = true)
public TypeValidator<SteamwarUser> teleportTargetValidator() {
return (sender, value, messageSender) -> {
if (value == null) {
messageSender.send("UNKNOWN_PLAYER");
return false;
}
ProxiedPlayer p = (ProxiedPlayer) sender;
if (!p.getUniqueId().equals(value.getUUID()) && BauweltMember.getBauMember(value.getUUID(), p.getUniqueId()) == null) {
SubserverSystem.sendDeniedMessage(p, value.getUUID());
messageSender.send("BAU_TP_NOALLOWED");
return false;
}
return !BauLock.checkNotifyLocked(value, p);
};
}
@Register("info")
public void info(ProxiedPlayer p) {
Chat19.chat(p, "/bauinfo");
}
@Register("setspectator")
public void setSpectator(ProxiedPlayer p, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
if (user == null) {
Message.send("BAU_MEMBER_SET_USAGE", p, "setspectator");
return;
}
BauweltMember target = member(p, user);
if (target == null)
return;
target.setWorld(!target.isWorld());
target.setBuild(false);
target.setSupervisor(false);
clearMembercache(p);
isAllowedTo(target.isWorld(), p, target, "BAU_MEMBER_TOGGLE_WORLD");
sendPermissionUpdate(p, target, "BAU_MEMBER_SET_SPECTATOR");
}
@Register("setbuild")
public void setBuild(ProxiedPlayer p, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
if (user == null) {
Message.send("BAU_MEMBER_SET_USAGE", p, "setbuild");
return;
}
BauweltMember target = member(p, user);
if (target == null)
return;
target.setBuild(true);
target.setSupervisor(false);
clearMembercache(p);
sendPermissionUpdate(p, target, "BAU_MEMBER_SET_BUILDER");
}
@Register("setsupervisor")
public void setSupervisor(ProxiedPlayer p, @Mapper("addedUsers") @AllowNull @OptionalValue("") SteamwarUser user) {
if (user == null) {
Message.send("BAU_MEMBER_SET_USAGE", p, "setsupervisor");
return;
}
BauweltMember target = member(p, user);
if (target == null)
return;
target.setBuild(true);
target.setSupervisor(true);
clearMembercache(p);
sendPermissionUpdate(p, target, "BAU_MEMBER_SET_SUPERVISOR");
}
private static void clearMembercache(ProxiedPlayer p){
for(ServerInfo info : ProxyServer.getInstance().getServers().values()){
Subserver server = Subserver.getSubserver(info);
if(server != null && server.getType() == Servertype.BAUSERVER && ((Bauserver)server).getOwner().equals(p.getUniqueId())){
info.getPlayers().stream().findAny().ifPresent(player -> new BaumemberUpdatePacket().send(player));
info.getPlayers().stream().findAny().ifPresent(player -> NetworkSender.send(player, new BaumemberUpdatePacket()));
break;
}
}
}
private static void delmember(ProxiedPlayer p, String[] args){
if (args.length == 1) {
Message.send("BAU_DELMEMBER_USAGE", p);
return;
}
BauweltMember target = member(p, SteamwarUser.get(args[1]));
if(target == null)
@Register(value = "delmember", description = "BAU_DELMEMBER_USAGE")
public void delmember(ProxiedPlayer p, @Mapper("addedUsers") SteamwarUser user) {
BauweltMember target = member(p, user);
if (target == null)
return;
if(SteamwarUser.get(target.getMemberID()).getUuid().equals(p.getUniqueId())) {
if(SteamwarUser.get(target.getMemberID()).getUUID().equals(p.getUniqueId())) {
Message.send("BAU_DELMEMBER_SELFDEL", p);
return;
}
target.remove();
ProxiedPlayer toRemove = ProxyServer.getInstance().getPlayer(SteamwarUser.get(target.getMemberID()).getUuid());
ProxiedPlayer toRemove = ProxyServer.getInstance().getPlayer(SteamwarUser.get(target.getMemberID()).getUUID());
if(toRemove != null){
Message.send("BAU_DELMEMBER_DELETED_TARGET", toRemove, p.getName());
Subserver currentServer = Subserver.getSubserver(toRemove.getServer().getInfo());
if (currentServer != null && currentServer.getType() == Servertype.BAUSERVER && ((Bauserver) currentServer).getOwner().equals(p.getUniqueId())) {
toRemove.connect(ProxyServer.getInstance().getServerInfo(BungeeCore.LOBBY_SERVER));
toRemove.connect(ProxyServer.getInstance().getServerInfo(VelocityCore.LOBBY_SERVER));
}
}
Message.send("BAU_DELMEMBER_DELETED", p);
}
private static void delete(ProxiedPlayer p, String[] args){
SteamwarUser user = SteamwarUser.get(p.getUniqueId());
versionSelector(p, args, 1,
() -> deleteConfirmation(p, () -> deleteWorld(p, ServerStarter.WORLDS18_PATH + user.getId())),
() -> deleteConfirmation(p, () -> deleteWorld(p, BungeeCore.USERWORLDS15 + user.getId())),
() -> deleteConfirmation(p, () -> deleteWorld(p, BungeeCore.WORLD_FOLDER + p.getUniqueId().toString())),
() -> HelpCommand.sendBauHelp(ChatSender.of(p)));
@Mapper(value = "addedUsers", local = true)
public TypeMapper<SteamwarUser> addedUsers() {
return new TypeMapper<SteamwarUser>() {
@Override
public SteamwarUser map(CommandSender commandSender, String[] previousArguments, String s) {
return SteamwarUser.get(s);
}
@Override
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
if (!(sender instanceof ProxiedPlayer)) return Collections.emptyList();
return BauweltMember.getMembers(((ProxiedPlayer) sender).getUniqueId()).stream()
.map(bauweltMember -> SteamwarUser.get(bauweltMember.getMemberID()))
.map(steamwarUser -> steamwarUser.getUserName())
.collect(Collectors.toList());
}
};
}
@Register("resetall")
@Register("delete")
public void delete(ProxiedPlayer p, @Mapper("version") @OptionalValue(value = "", onlyUINIG = true) ServerStarter.Version version) {
deleteConfirmation(p, () -> deleteWorld(p, version.getWorldFolder(ServerStarter.WORLDS_BASE_PATH) + (version != ServerStarter.Version.SPIGOT_12 ? SteamwarUser.get(p.getUniqueId()).getId() : p.getUniqueId().toString())));
}
private static void deleteConfirmation(ProxiedPlayer p, Runnable worldDeletion) {
@ -242,27 +281,40 @@ public class BauCommand extends BasicCommand {
inventory.addItem(8, new SWItem(Message.parse("BAU_DELETE_GUI_CANCEL", p), 1), click ->
inventory.close()
);
inventory.addItem(0, new SWItem(Message.parse("BAU_DELETE_GUI_DELETE", p), 10), click ->
worldDeletion.run()
);
inventory.addItem(0, new SWItem(Message.parse("BAU_DELETE_GUI_DELETE", p), 10), click -> {
worldDeletion.run();
inventory.close();
});
inventory.open();
}
private static void deleteWorld(ProxiedPlayer player, String world) {
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
for (Subserver subserver : Subserver.getServerList()) {
if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(player.getUniqueId())) {
subserver.stop();
break;
}
}
SubserverSystem.deleteFolder(Node.local, world);
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
Bauserver subserver = Bauserver.get(player.getUniqueId());
if(subserver != null)
subserver.stop();
SubserverSystem.deleteFolder(VelocityCore.local, world);
Message.send("BAU_DELETE_DELETED", player);
});
}
private static void testarena(ProxiedPlayer p, String[] args){
FightCommand.createArena(p, "/bau testarena ", false, args, 1, false, (player, mode, map) -> ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> new ServerStarter().test(mode, map, p).start()));
@Register("test")
@Register("testarena")
public void testarena(ProxiedPlayer p, @Mapper("nonHistoricArenaMode") @OptionalValue("") @AllowNull ArenaMode arenaMode, @Mapper("arenaMap") @OptionalValue("") @AllowNull String map) {
FightCommand.createArena(p, "/bau testarena ", false, arenaMode, map, false, (player, mode, m) -> {
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> new ServerStarter().test(mode, m, p).start());
});
}
@Register(value = "lock", description = "BAU_LOCKED_OPTIONS")
public void lock(ProxiedPlayer p, BauLockState bauLockState) {
BauLock.setLocked(p, bauLockState);
}
@Register("unlock")
public void unlock(ProxiedPlayer p) {
BauLock.setLocked(p, BauLockState.OPEN);
}
private static BauweltMember member(ProxiedPlayer p, SteamwarUser member){
@ -271,7 +323,7 @@ public class BauCommand extends BasicCommand {
return null;
}
BauweltMember target = BauweltMember.getBauMember(p.getUniqueId(), member.getUuid());
BauweltMember target = BauweltMember.getBauMember(p.getUniqueId(), member.getUUID());
if (target == null) {
Message.send("BAU_MEMBER_NOMEMBER", p);
return null;
@ -279,27 +331,10 @@ public class BauCommand extends BasicCommand {
return target;
}
private static BauweltMember toggle(ProxiedPlayer p, String[] args, String subcommand){
if (args.length == 1) {
Message.send("BAU_MEMBER_TOGGLE_USAGE", p, subcommand);
return null;
}
SteamwarUser member = SteamwarUser.get(args[1]);
return member(p, member);
}
private static void isAllowedTo(boolean permission, ProxiedPlayer p, BauweltMember target, String what){
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(SteamwarUser.get(target.getMemberID()).getUuid());
if(permission){
if(player != null)
Message.send("BAU_MEMBER_TOGGLE_TARGET", player, p.getName(), Message.parse(what, player));
Message.send("BAU_MEMBER_TOGGLE", p, Message.parse(what, p));
}else{
if(player != null)
Message.send("BAU_MEMBER_TOGGLE_TARGET_OFF", player, p.getName(), Message.parse(what, player));
Message.send("BAU_MEMBER_TOGGLE_OFF", p, Message.parse(what, p));
}
private static void sendPermissionUpdate(ProxiedPlayer p, BauweltMember target, String what){
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(SteamwarUser.get(target.getMemberID()).getUUID());
if(player != null)
Message.send("BAU_MEMBER_SET_TARGET", player, p.getName(), Message.parse(what, player));
Message.send("BAU_MEMBER_SET", p, Message.parse(what, p));
}
}

Datei anzeigen

@ -19,27 +19,22 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.SWException;
import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.sql.SWException;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.command.SWCommand;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class BugCommand extends BasicCommand {
public class BugCommand extends SWCommand {
public BugCommand() {
super("bug", null);
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
@Register
public void bugMessage(ProxiedPlayer player, String... message) {
String server = player.getServer().getInfo().getName();
String message = String.join(" ", args);
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
SWException.log(server, message, player.getName() + " " + user.getId());
Message.send("BUG_MESSAGE", player);
SWException.log(String.join(" ", message), server + " " + player.getName() + " " + user.getId());
ChatSender.of(player).system("BUG_MESSAGE");
}
}

Datei anzeigen

@ -0,0 +1,174 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.ArenaMode;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.bungeecore.ServerStarter;
import de.steamwar.bungeecore.listeners.ConnectionListener;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.*;
import java.util.stream.Collectors;
public class BuilderCloudCommand extends SWCommand {
private final Map<String, ServerStarter.Version> versionMap = new HashMap<>();
public BuilderCloudCommand() {
super("buildercloud", ConnectionListener.BUILDERCLOUD_PERMISSION, "builder");
versionMap.put("15", ServerStarter.Version.SPIGOT_15);
versionMap.put("1.15", ServerStarter.Version.SPIGOT_15);
versionMap.put("1.15.2", ServerStarter.Version.SPIGOT_15);
versionMap.put("19", ServerStarter.Version.PAPER_19);
versionMap.put("1.19", ServerStarter.Version.PAPER_19);
versionMap.put("1.19.2", ServerStarter.Version.PAPER_19);
versionMap.put("20", ServerStarter.Version.PAPER_20);
versionMap.put("1.20", ServerStarter.Version.PAPER_20);
versionMap.put("1.20.1", ServerStarter.Version.PAPER_20);
}
@Register(value = "create", description = "BUILDERCLOUD_CREATE_USAGE")
public void create(ProxiedPlayer player, @ErrorMessage("BUILDERCLOUD_VERSION") ServerStarter.Version version, @Mapper("map") String map, @OptionalValue("") @Mapper("generator") @AllowNull File generator) {
mapFile(version, map).mkdir();
new ServerStarter().builder(version, map, generator).send(player).start();
}
@Register(description = "BUILDERCLOUD_USAGE")
public void start(ProxiedPlayer player, @ErrorMessage("BUILDERCLOUD_VERSION") ServerStarter.Version version, @Mapper("map") String map) {
if(!mapFile(version, map).exists()) {
ChatSender.of(player).system("BUILDERCLOUD_UNKNOWN_MAP");
return;
}
new ServerStarter().builder(version, map, null).send(player).start();
}
@Register(value = "rename", description = "BUILDERCLOUD_RENAME_USAGE")
public void rename(ProxiedPlayer player, @ErrorMessage("BUILDERCLOUD_VERSION") ServerStarter.Version version, @Mapper("map") String oldName, String newName) {
File oldMap = mapFile(version, oldName);
if(!oldMap.exists()) {
ChatSender.of(player).system("BUILDERCLOUD_UNKNOWN_MAP");
return;
}
File newMap = mapFile(version, newName);
if(newMap.exists()) {
ChatSender.of(player).system("BUILDERCLOUD_EXISTING_MAP");
return;
}
try {
Files.move(oldMap.toPath(), newMap.toPath());
} catch (IOException e) {
throw new SecurityException(e);
}
ChatSender.of(player).system("BUILDERCLOUD_RENAMED");
}
@Register(value = "deploy", description = "BUILDERCLOUD_DEPLOY_USAGE")
public void deploy(ProxiedPlayer player, @Mapper("nonHistoricArenaMode") ArenaMode arenaMode, @ErrorMessage("BUILDERCLOUD_VERSION") ServerStarter.Version version, @Mapper("map") String map) {
if(!mapFile(version, map).exists()) {
ChatSender.of(player).system("BUILDERCLOUD_UNKNOWN_MAP");
return;
}
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
VelocityCore.local.execute("/binarys/deployarena.py", arenaMode.getConfig(), Integer.toString(version.getVersionSuffix()), map);
ArenaMode.init();
ChatSender.of(player).system("BUILDERCLOUD_DEPLOY_FINISHED");
});
}
@ClassMapper(value = ServerStarter.Version.class, local = true)
private TypeMapper<ServerStarter.Version> versionTypeMapper() {
return new TypeMapper<ServerStarter.Version>() {
@Override
public ServerStarter.Version map(CommandSender commandSender, String[] previousArguments, String s) {
return versionMap.get(s);
}
@Override
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
return versionMap.keySet();
}
};
}
@Cached(global = true)
@Mapper(value = "map", local = true)
private TypeMapper<String> mapTypeMapper() {
return new TypeMapper<String>() {
@Override
public String map(CommandSender commandSender, String[] previousArguments, String s) {
return s;
}
@Override
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
File folder = getWorldFolder(previousArguments, 1);
String[] files;
if(folder == null || (files = folder.list()) == null)
return Collections.emptyList();
return Arrays.stream(files).filter(file -> new File(folder, file).isDirectory()).filter(file -> s.startsWith(".") || !file.startsWith(".")).collect(Collectors.toList());
}
};
}
@Cached(global = true)
@Mapper(value = "generator", local = true)
private TypeMapper<File> generatorTypeMapper() {
return new TypeMapper<File>() {
@Override
public File map(CommandSender commandSender, String[] previousArguments, String s) {
if(s.equals(""))
return null;
File folder = getWorldFolder(previousArguments, 2);
if(folder == null)
throw new SecurityException();
File generator = new File(folder, s + ".dat");
if(!generator.exists() || !generator.isFile())
throw new SecurityException();
return generator;
}
@Override
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
File folder = getWorldFolder(previousArguments, 2);
String[] files;
if(folder == null || (files = folder.list()) == null)
return Collections.emptyList();
return Arrays.stream(files).filter(file -> new File(folder, file).isFile()).filter(file -> file.endsWith(".dat")).map(file -> file.substring(0, file.length() - 4)).collect(Collectors.toList());
}
};
}
private File mapFile(ServerStarter.Version version, String map) {
return new File(version.getWorldFolder(ServerStarter.BUILDER_BASE_PATH), map);
}
private File getWorldFolder(String[] previousArguments, int offset) {
ServerStarter.Version v = versionMap.get(previousArguments[previousArguments.length - offset]);
if(v == null)
return null;
return new File(v.getWorldFolder(ServerStarter.BUILDER_BASE_PATH));
}
}

Datei anzeigen

@ -20,88 +20,73 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.listeners.mods.ModLoaderBlocker;
import de.steamwar.bungeecore.sql.IgnoreSystem;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import de.steamwar.sql.IgnoreSystem;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeValidator;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.ArrayList;
import java.util.LinkedList;
import static de.steamwar.bungeecore.Storage.challenges;
public class ChallengeCommand extends BasicCommand {
public class ChallengeCommand extends SWCommand {
public ChallengeCommand() {
super("challenge", "");
super("challenge");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(args.length < 1){
Message.send("CHALLENGE_USAGE", sender);
return;
}
if (!(sender instanceof ProxiedPlayer))
return;
if(ModLoaderBlocker.isFabric((ProxiedPlayer) sender)) {
Message.send("MODLOADER_DENIED", sender);
return;
}
ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
if(target == null){
Message.send("CHALLENGE_OFFLINE", sender);
return;
}else if(target == sender){
Message.send("CHALLENGE_SELF", sender);
return;
}else if (IgnoreSystem.isIgnored(target, (ProxiedPlayer) sender)) {
Message.send("CHALLENGE_IGNORED", sender);
return;
}
Subserver subserver = Subserver.getSubserver(target);
if(subserver != null && subserver.getType() == Servertype.ARENA){
Message.send("CHALLENGE_INARENA", sender);
return;
}
FightCommand.createArena(sender, "/challenge " + target.getName() + " ", false, args, 1, false, (player, mode, map) -> {
if(challenges.containsKey(target) && challenges.get(target).contains(player)){
@Register(description = "CHALLENGE_USAGE")
public void challenge(@Validator("arenaPlayer") ProxiedPlayer player, @Validator("target") ProxiedPlayer target, @Mapper("nonHistoricArenaMode") @OptionalValue("") @AllowNull ArenaMode arenaMode, @Mapper("arenaMap") @OptionalValue("") @AllowNull String map) {
FightCommand.createArena(player, "/challenge " + target.getName() + " ", false, arenaMode, map, false, (p, mode, m) -> {
if(challenges.containsKey(target) && challenges.get(target).contains(p)){
challenges.remove(target);
challenges.remove(player);
challenges.remove(p);
Subserver arena = new ServerStarter().arena(mode, map).blueLeader(player).redLeader(target).start();
Message.broadcast("CHALLENGE_BROADCAST", "CHALLENGE_BROADCAST_HOVER",
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), player.getName(), target.getName());
new ServerStarter().arena(mode, map).blueLeader(player).redLeader(target).callback(
arena -> Message.broadcast("CHALLENGE_BROADCAST", "CHALLENGE_BROADCAST_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), p.getName(), target.getName())
).start();
}else{
if(!challenges.containsKey(player)){
challenges.put(player, new LinkedList<>());
if(!challenges.containsKey(p)){
challenges.put(p, new LinkedList<>());
}
challenges.get(player).add(target);
challenges.get(p).add(target);
Message.send("CHALLENGE_CHALLENGED", player, target.getName(), mode.getDisplayName());
Message.send("CHALLENGE_CHALLENGED_TARGET", target, player.getName(), mode.getDisplayName(), mode.getMaps().size()!=1?Message.parse("CHALLENGE_CHALLENGED_MAP", target, map):"");
Message.send("CHALLENGE_CHALLENGED", p, target.getName(), mode.getDisplayName());
Message.send("CHALLENGE_CHALLENGED_TARGET", target, p.getName(), mode.getDisplayName(), mode.getMaps().size() != 1 ? Message.parse("CHALLENGE_CHALLENGED_MAP", target, m) : "");
Message.send("CHALLENGE_ACCEPT", target, Message.parse("CHALLENGE_ACCEPT_HOVER", target), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/challenge " + player.getName() + " " + mode.getChatName() + " " + map));
Message.send("CHALLENGE_ACCEPT", target, Message.parse("CHALLENGE_ACCEPT_HOVER", target), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/challenge " + p.getName() + " " + mode.getChatName() + " " + m));
}
});
}
@Validator(value = "target", local = true)
public TypeValidator<ProxiedPlayer> targetValidator() {
return (sender, value, messageSender) -> {
if (value == null) {
messageSender.send("CHALLENGE_OFFLINE");
return false;
}
if (sender == value) {
messageSender.send("CHALLENGE_SELF");
return false;
}
if (IgnoreSystem.isIgnored(value.getUniqueId(), ((ProxiedPlayer) sender).getUniqueId())) {
messageSender.send("CHALLENGE_IGNORED");
return false;
}
Subserver subserver = Subserver.getSubserver(value);
if (subserver != null && subserver.getType() == Servertype.ARENA) {
messageSender.send("CHALLENGE_INARENA");
return false;
}
return true;
};
}
public static void remove(ProxiedPlayer player){
challenges.remove(player);
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
if(args.length == 2)
return ArenaMode.getAllChatNames(false);
return new ArrayList<>();
}
}

Datei anzeigen

@ -19,29 +19,23 @@
package de.steamwar.bungeecore.commands;
import com.velocitypowered.api.proxy.Player;
import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.bot.util.DiscordSchemAlert;
import de.steamwar.bungeecore.listeners.ConnectionListener;
import de.steamwar.bungeecore.sql.CheckedSchematic;
import de.steamwar.bungeecore.sql.SchematicNode;
import de.steamwar.bungeecore.sql.SchematicType;
import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.config.Configuration;
import de.steamwar.sql.*;
import de.steamwar.command.SWCommand;
import net.kyori.adventure.text.event.ClickEvent;
import org.simpleyaml.configuration.Configuration;
import java.sql.Timestamp;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
public class CheckCommand extends BasicCommand {
public class CheckCommand extends SWCommand {
private static final Map<SchematicType, SchematicType> fightTypes = new HashMap<>();
private static Map<SchematicType, List<String>> checkQuestions = new HashMap<>();
private static Map<SchematicType, List<String>> ranks = new HashMap<>();
@ -54,78 +48,35 @@ public class CheckCommand extends BasicCommand {
ranks.put(checkType, config.getStringList("Ranks"));
}
public static boolean isChecking(ProxiedPlayer player){
public static void addFightType(SchematicType checkType, SchematicType fightType) {
fightTypes.put(checkType, fightType);
}
public static boolean isChecking(Player player){
return currentCheckers.containsKey(player.getUniqueId());
}
public static SchematicNode getCheckingSchem(ProxiedPlayer player) {
public static SchematicNode getCheckingSchem(Player player) {
return currentCheckers.get(player.getUniqueId()).schematic;
}
public CheckCommand() {
super("check", ConnectionListener.CHECK_PERMISSION);
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> {
VelocityCore.get().getProxyServer().getScheduler().buildTask(VelocityCore.get(), () -> {
List<SchematicNode> schematics = getSchemsToCheck();
if(schematics.size() != currentCheckers.size())
Message.team("CHECK_REMINDER", "CHECK_REMINDER_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check list"), schematics.size() - currentCheckers.size());
}, 10, 10, TimeUnit.MINUTES);
Message.team("CHECK_REMINDER", "CHECK_REMINDER_HOVER", ClickEvent.runCommand("/check list"), schematics.size() - currentCheckers.size());
}).repeat(10, TimeUnit.MINUTES).schedule();
}
public static void sendReminder(ProxiedPlayer player) {
public static void sendReminder(Player player) {
List<SchematicNode> schematics = getSchemsToCheck();
if(schematics.size() != currentCheckers.size())
Message.send("CHECK_REMINDER", player, Message.parse("CHECK_REMINDER_HOVER", player), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/check list"), schematics.size() - currentCheckers.size());
Message.send("CHECK_REMINDER", player, Message.parse("CHECK_REMINDER_HOVER", player), ClickEvent.runCommand("/check list"), schematics.size() - currentCheckers.size());
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
if(args.length == 0){
help(sender);
return;
}
switch(args[0].toLowerCase()){
case "list":
list(player);
break;
case "schematic":
schematic(player, args[1]);
break;
case "next":
case "accept":
next(player, args);
break;
case "cancel":
abort(player);
break;
case "decline":
decline(player, args);
break;
default:
help(player);
}
}
public static List<SchematicNode> getSchemsToCheck(){
List<SchematicNode> schematicList = new LinkedList<>();
for (SchematicType type : SchematicType.values()) {
if (type.check())
schematicList.addAll(SchematicNode.getAllSchematicsOfType(type.toDB()));
}
return schematicList;
}
public static String getChecker(SchematicNode schematic) {
if (currentSchems.get(schematic.getId()) == null) return null;
return currentSchems.get(schematic.getId()).checker.getName();
}
private void list(ProxiedPlayer player) {
@Register(value = "list", description = "CHECK_HELP_LIST")
public void list(ProxiedPlayer player) {
List<SchematicNode> schematicList = getSchemsToCheck();
Message.sendPrefixless("CHECK_LIST_HEADER", player, schematicList.size());
@ -153,24 +104,82 @@ public class CheckCommand extends BasicCommand {
}
}
private void schematic(ProxiedPlayer player, String schemID){
@Register(value = "schematic", noTabComplete = true)
public void schematic(ProxiedPlayer player, String schemID) {
if(isChecking(player)){
Message.send("CHECK_SCHEMATIC_ALREADY_CHECKING", player);
return;
}
SteamwarUser checkingUser = SteamwarUser.get(player.getUniqueId());
SchematicNode schem = SchematicNode.getSchematicNode(Integer.parseInt(schemID));
if(!schem.getSchemtype().check()){
ProxyServer.getInstance().getLogger().log(Level.SEVERE, player.getName() + " tried to check an uncheckable schematic!");
return;
}else if(schem.getOwner() == SteamwarUser.get(player.getUniqueId()).getId()) {
}else if(schem.getOwner() == checkingUser.getId()) {
Message.send("CHECK_SCHEMATIC_OWN", player);
return;
}
int playerTeam = checkingUser.hasPerm(UserPerm.MODERATION) ? 0 : checkingUser.getTeam();
if (playerTeam != 0 && SteamwarUser.get(schem.getOwner()).getTeam() == playerTeam) {
Message.send("CHECK_SCHEMATIC_OWN_TEAM", player);
return;
}
new CheckSession(player, schem);
}
@Register(value = "cancel", description = "CHECK_HELP_CANCEL")
@Register("abort")
public void abortCommand(ProxiedPlayer player) {
abort(player);
}
public static void abort(ProxiedPlayer player) {
if(notChecking(player))
return;
Message.send("CHECK_ABORT", player);
currentCheckers.get(player.getUniqueId()).abort();
}
@Register(value = "next", description = "CHECK_HELP_NEXT")
public void next(ProxiedPlayer player) {
next(player, new String[0]);
}
@Register(value = "accept")
public void accept(ProxiedPlayer player, @OptionalValue("") String rank) {
if (rank.equals("")) {
next(player, new String[0]);
} else {
next(player, new String[]{rank});
}
}
@Register(value = "decline", description = "CHECK_HELP_DECLINE")
public void decline(ProxiedPlayer player, String... message) {
if(notChecking(player))
return;
currentCheckers.get(player.getUniqueId()).decline(String.join(" ", message));
}
public static List<SchematicNode> getSchemsToCheck(){
List<SchematicNode> schematicList = new LinkedList<>();
for (SchematicType type : SchematicType.values()) {
if (type.check())
schematicList.addAll(SchematicNode.getAllSchematicsOfType(type.toDB()));
}
return schematicList;
}
public static String getChecker(SchematicNode schematic) {
if (currentSchems.get(schematic.getId()) == null) return null;
return currentSchems.get(schematic.getId()).checker.getName();
}
private static boolean notChecking(ProxiedPlayer player){
if(!isChecking(player)){
Message.send("CHECK_NOT_CHECKING", player);
@ -184,9 +193,9 @@ public class CheckCommand extends BasicCommand {
return;
int rank = 0;
if(args.length > 1){
if(args.length > 0){
try{
rank = Integer.parseInt(args[1]);
rank = Integer.parseInt(args[0]);
}catch(NumberFormatException e){
Message.send("CHECK_INVALID_RANK", player);
return;
@ -196,37 +205,6 @@ public class CheckCommand extends BasicCommand {
currentCheckers.get(player.getUniqueId()).next(rank);
}
public static void abort(ProxiedPlayer player){
if(notChecking(player))
return;
Message.send("CHECK_ABORT", player);
currentCheckers.get(player.getUniqueId()).abort();
}
private void decline(ProxiedPlayer player, String[] args){
if(notChecking(player))
return;
if(args.length < 2) {
help(player);
return;
}
StringBuilder message = new StringBuilder();
for (int i = 1; i < args.length; i++)
message.append(args[i]).append(" ");
currentCheckers.get(player.getUniqueId()).decline(message.toString());
}
private void help(CommandSender sender){
Message.sendPrefixless("CHECK_HELP_LIST", sender);
Message.sendPrefixless("CHECK_HELP_NEXT", sender);
Message.sendPrefixless("CHECK_HELP_DECLINE", sender);
Message.sendPrefixless("CHECK_HELP_CANCEL", sender);
}
private static class CheckSession{
private final ProxiedPlayer checker;
private final SchematicNode schematic;
@ -239,9 +217,9 @@ public class CheckCommand extends BasicCommand {
this.startTime = Timestamp.from(Instant.now());
this.checkList = checkQuestions.get(schematic.getSchemtype()).listIterator();
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
ArenaMode mode = ArenaMode.getBySchemType(schematic.getSchemtype().fightType());
if(new ServerStarter().test(mode, mode.getRandomMap(), checker).check(schematic.getId()).start() == null) {
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
ArenaMode mode = ArenaMode.getBySchemType(fightTypes.get(schematic.getSchemtype()));
if(!new ServerStarter().test(mode, mode.getRandomMap(), checker).check(schematic.getId()).start()) {
remove();
return;
}
@ -290,56 +268,56 @@ public class CheckCommand extends BasicCommand {
}
private void accept(int rank){
if(ranks.containsKey(schematic.getSchemtype())){
if(rank <= 0 || ranks.get(schematic.getSchemtype()).size() < rank){
Message.send("CHECK_INVALID_RANK", checker);
return;
if(createLog("freigegeben")) {
if(ranks.containsKey(schematic.getSchemtype())){
if(rank <= 0 || ranks.get(schematic.getSchemtype()).size() < rank){
Message.send("CHECK_INVALID_RANK", checker);
return;
}
schematic.setRank(rank);
}
schematic.setRank(rank);
}
schematic.setType(schematic.getSchemtype().fightType().toDB());
CheckedSchematic.create(schematic, SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), "freigegeben");
SteamwarUser user = SteamwarUser.get(schematic.getOwner());
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUuid());
if(player != null) {
Message.send("CHECK_ACCEPTED", player, schematic.getSchemtype().name(), schematic.getName());
} else {
DiscordSchemAlert.sendAccept(schematic, user);
schematic.setType(fightTypes.get(schematic.getSchemtype()).toDB());
SteamwarUser user = SteamwarUser.get(schematic.getOwner());
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUUID());
if(player != null) {
Message.send("CHECK_ACCEPTED", player, schematic.getSchemtype().name(), schematic.getName());
} else {
DiscordSchemAlert.sendAccept(schematic, user);
}
Message.team("CHECK_ACCEPTED_TEAM", schematic.getName(), user.getUserName());
}
Message.team("CHECK_ACCEPTED_TEAM", schematic.getName(), user.getUserName());
stop();
}
private void decline(String reason){
CheckedSchematic.create(schematic, SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), reason);
SteamwarUser user = SteamwarUser.get(schematic.getOwner());
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUuid());
if(player != null) {
Message.send("CHECK_DECLINED", player, schematic.getSchemtype().name(), schematic.getName(), reason);
} else {
DiscordSchemAlert.sendDecline(schematic, user, reason);
if(createLog(reason)) {
SteamwarUser user = SteamwarUser.get(schematic.getOwner());
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUUID());
if(player != null) {
Message.send("CHECK_DECLINED", player, schematic.getSchemtype().name(), schematic.getName(), reason);
} else {
DiscordSchemAlert.sendDecline(schematic, user, reason);
}
Message.team("CHECK_DECLINED_TEAM", schematic.getName(), user.getUserName(), reason);
schematic.setType(SchematicType.Normal.toDB());
}
Message.team("CHECK_DECLINED_TEAM", schematic.getName(), user.getUserName(), reason);
schematic.setType(SchematicType.Normal.toDB());
stop();
}
private void abort(){
CheckedSchematic.create(schematic, SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), "Prüfvorgang abgebrochen");
createLog("Prüfvorgang abgebrochen");
stop();
}
private void stop(){
currentCheckers.remove(checker.getUniqueId());
currentSchems.remove(schematic.getId());
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
for (Subserver subserver : Subserver.getServerList()) {
if (subserver.getType() == Servertype.BAUSERVER && ((Bauserver) subserver).getOwner().equals(checker.getUniqueId())) {
subserver.stop();
break;
}
}
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
Bauserver subserver = Bauserver.get(checker.getUniqueId());
if(subserver != null)
subserver.stop();
});
}
@ -347,5 +325,13 @@ public class CheckCommand extends BasicCommand {
currentCheckers.remove(checker.getUniqueId());
currentSchems.remove(schematic.getId());
}
private boolean createLog(String reason) {
if(SchematicNode.getSchematicNode(schematic.getId()) == null) // Schematic was deleted
return false;
CheckedSchematic.create(schematic, SteamwarUser.get(checker.getUniqueId()).getId(), startTime, Timestamp.from(Instant.now()), reason);
return true;
}
}
}

Datei anzeigen

@ -19,91 +19,97 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.Message;
import de.steamwar.sql.Punishment;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.command.*;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.io.File;
import java.net.InetSocketAddress;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public class DevCommand extends BasicCommand {
public class DevCommand extends SWCommand {
private final File devServerDir = new File("/configs/DevServer");
private final Map<String, ServerInfo> devServers = new HashMap<>();
public DevCommand() {
super("dev", "");
super("dev");
}
@Override
public void execute(CommandSender s, String[] args) {
if (!(s instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) s;
ChatSender sender = ChatSender.of(player);
if (sender.user().isPunishedWithMessage(sender, Punishment.PunishmentType.NoDevServer)) {
return;
}
@Register
public void simpleCommand(@Validator ProxiedPlayer player) {
updateDevServers();
if(devServers.isEmpty()) {
ChatSender sender = ChatSender.of(player);
if (devServers.isEmpty()) {
sender.system("DEV_NO_SERVER");
return;
} else if (devServers.size() == 1) {
player.connect(devServers.values().stream().findAny().get());
} else if (args.length == 0) {
ServerInfo info = devServers.get(player.getName().toLowerCase());
if (info == null) {
sender.system("DEV_UNKNOWN_SERVER");
return;
}
player.connect(info);
} else {
ServerInfo info = devServers.get(args[0].toLowerCase());
if (info == null) {
sender.system("DEV_NO_SERVER");
return;
}
player.connect(info);
return;
}
ServerInfo info = devServers.get(player.getName().toLowerCase());
if (info == null) {
sender.system("DEV_UNKNOWN_SERVER");
return;
}
player.connect(info);
}
@Override
public Iterable<String> onTabComplete(CommandSender sender, String[] args) {
if (!(sender instanceof ProxiedPlayer) || args.length > 1) {
return Collections.emptyList();
@Register
public void selectedCommand(@Validator ProxiedPlayer player, @Mapper("dev") String name) {
updateDevServers();
ChatSender sender = ChatSender.of(player);
ServerInfo info = devServers.get(name.toLowerCase());
if (info == null) {
sender.system("DEV_NO_SERVER");
return;
}
updateDevServers();
return devServers.keySet().stream().filter(s -> {
if (args.length == 0) return true;
return s.startsWith(args[0].toLowerCase());
}).collect(Collectors.toList());
player.connect(info);
}
@ClassValidator(value = ProxiedPlayer.class, local = true)
public TypeValidator<ProxiedPlayer> punishmentGuardChecker() {
return (sender, value, messageSender) -> {
SteamwarUser user = SteamwarUser.get(value.getUniqueId());
if (user.isPunished(Punishment.PunishmentType.NoDevServer)) {
Message message = PunishmentCommand.punishmentMessage(user, Punishment.PunishmentType.NoDevServer);
messageSender.send(message.getFormat(), message.getParams());
return false;
}
return true;
};
}
@Mapper(value = "dev", local = true)
public TypeMapper<String> devServers() {
return SWCommandUtils.createMapper(s -> s, s -> {
updateDevServers();
return devServers.keySet();
});
}
private void updateDevServers() {
String[] serverFiles = devServerDir.list();
Map<String, Integer> devServerFiles = new HashMap<>();
if(serverFiles != null) {
for(String serverFile : serverFiles) {
if (serverFiles != null) {
for (String serverFile : serverFiles) {
String[] server = serverFile.split("\\.");
devServerFiles.put(server[0], Integer.parseInt(server[1]));
}
}
devServers.entrySet().removeIf(entry -> {
if(!devServerFiles.containsKey(entry.getKey())) {
if (!devServerFiles.containsKey(entry.getKey())) {
ProxyServer.getInstance().getServers().remove(entry.getValue().getName());
return true;
}

Datei anzeigen

@ -20,58 +20,35 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.sql.Event;
import de.steamwar.bungeecore.sql.EventFight;
import de.steamwar.bungeecore.sql.Team;
import de.steamwar.bungeecore.sql.TeamTeilnahme;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.messages.ChatSender;
import de.steamwar.sql.*;
import de.steamwar.command.SWCommand;
import de.steamwar.command.SWCommandUtils;
import de.steamwar.command.TypeMapper;
import de.steamwar.command.TypeValidator;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class EventCommand extends BasicCommand {
public class EventCommand extends SWCommand {
public EventCommand() {
super("event", "");
super("event");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
Event currentEvent = Event.get();
if(currentEvent == null) {
noCurrentEvent(player);
return;
}
if(args.length != 1){
eventOverview(player, currentEvent);
return;
}
Team team = Team.get(args[0]);
if(team == null){
Message.send("EVENT_NO_TEAM", player);
return;
}
Subserver eventArena = EventStarter.getEventServer().get(team.getTeamId());
if(eventArena == null || !Subserver.getServerList().contains(eventArena)){
Message.send("EVENT_NO_FIGHT_TEAM", player);
return;
}
SubserverSystem.sendPlayer(eventArena, player);
@Validator("noEvent")
public TypeValidator<ProxiedPlayer> noEventValidator() {
return (sender, value, messageSender) -> Event.get() == null;
}
private void noCurrentEvent(ProxiedPlayer player){
@Register
public void noCurrentEvent(@Validator("noEvent") ProxiedPlayer player){
Message.send("EVENT_NO_CURRENT", player);
List<Event> coming = Event.getComing();
Instant now = Instant.now();
@ -84,6 +61,12 @@ public class EventCommand extends BasicCommand {
if(now.isBefore(e.getDeadline().toInstant())) {
Message.send("EVENT_COMING_DEADLINE", player, e.getDeadline());
}
SchematicType schemType = e.getSchematicType();
if (schemType != null) {
if (schemType.getDeadline() != null && now.isBefore(schemType.getDeadline().toInstant())) {
Message.send("EVENT_COMING_SCHEM_DEADLINE", player, e.getDeadline());
}
}
if(!teams.isEmpty()){
StringBuilder tline = new StringBuilder();
for(Team t : teams){
@ -95,7 +78,9 @@ public class EventCommand extends BasicCommand {
}
}
private void eventOverview(ProxiedPlayer player, Event currentEvent){
@Register
public void eventOverview(@Validator(value = "noEvent", invert = true) ProxiedPlayer player) {
Event currentEvent = Event.get();
Message.send("EVENT_USAGE", player);
List<EventFight> fights = EventFight.getEvent(currentEvent.getEventID());
@ -122,7 +107,32 @@ public class EventCommand extends BasicCommand {
}
}
BungeeCore.send(player, fline.toString());
VelocityCore.send(player, fline.toString());
}
}
@Register
public void eventWithTeam(@Validator(value = "noEvent", invert = true) ProxiedPlayer player, @ErrorMessage("EVENT_NO_TEAM") Team team) {
Subserver eventArena = EventStarter.getEventServer().get(team.getTeamId());
if(eventArena == null || !Subserver.getServerList().contains(eventArena)){
Message.send("EVENT_NO_FIGHT_TEAM", player);
return;
}
ChatSender sender = ChatSender.of(player);
if (!PunishmentCommand.isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer)) {
SubserverSystem.sendPlayer(eventArena, player);
}
}
@ClassMapper(Team.class)
@Cached(cacheDuration = 10, global = true)
public TypeMapper<Team> teamMapper() {
return SWCommandUtils.createMapper(Team::get, s -> EventStarter.getEventServer()
.keySet()
.stream()
.map(Team::get)
.map(t -> Arrays.asList(t.getTeamKuerzel(), t.getTeamColor()))
.flatMap(Collection::stream)
.collect(Collectors.toList()));
}
}

Datei anzeigen

@ -20,38 +20,33 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.Event;
import de.steamwar.bungeecore.sql.EventFight;
import de.steamwar.bungeecore.sql.Team;
import de.steamwar.bungeecore.listeners.ConnectionListener;
import de.steamwar.sql.EventFight;
import de.steamwar.sql.Team;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper;
import de.steamwar.sql.Event;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.sql.Timestamp;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.ListIterator;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class EventRescheduleCommand extends BasicCommand {
public class EventRescheduleCommand extends SWCommand {
public EventRescheduleCommand() {
super("eventreschedule", "bungeecore.softreload");
super("eventreschedule", ConnectionListener.EVENTRELOAD_PERMISSION);
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
if(args.length != 2){
Message.send("EVENTRESCHEDULE_USAGE", player);
return;
}
Team teamBlue = Team.get(args[0]);
Team teamRed = Team.get(args[1]);
@Register
public void reschedule(ProxiedPlayer player, Team teamBlue, Team teamRed) {
Event event = Event.get();
if(teamBlue == null || teamRed == null || event == null){
if(event == null){
Message.send("EVENTRESCHEDULE_UNKNOWN_TEAM", player);
return;
}
@ -74,4 +69,22 @@ public class EventRescheduleCommand extends BasicCommand {
Message.send("EVENTRESCHEDULE_NO_FIGHT", player);
}
@ClassMapper(value = Team.class, local = true)
public TypeMapper<Team> teamTypeMapper() {
return new TypeMapper<Team>() {
@Override
public Team map(CommandSender commandSender, String[] previousArguments, String s) {
return Team.get(s);
}
@Override
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
Event event = Event.get();
if (event == null) return null;
List<EventFight> fights = EventFight.getEvent(event.getEventID());
return fights.stream().flatMap(fight -> Stream.of(fight.getTeamBlue(), fight.getTeamRed())).map(Team::get).map(Team::getTeamKuerzel).distinct().collect(Collectors.toList());
}
};
}
}

Datei anzeigen

@ -19,16 +19,18 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.sql.EventFight;
import de.steamwar.bungeecore.listeners.ConnectionListener;
import de.steamwar.sql.EventFight;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.CommandSender;
public class EventreloadCommand extends BasicCommand {
public class EventreloadCommand extends SWCommand {
public EventreloadCommand() {
super("eventreload", "bungeecore.softreload");
super("eventreload", ConnectionListener.EVENTRELOAD_PERMISSION);
}
@Override
public void execute(CommandSender sender, String[] args) {
@Register
public void execute(CommandSender sender) {
EventFight.loadAllComingFights();
}
}

Datei anzeigen

@ -22,20 +22,16 @@ package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.inventory.SWInventory;
import de.steamwar.bungeecore.inventory.SWItem;
import de.steamwar.bungeecore.listeners.mods.ModLoaderBlocker;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.command.SWCommand;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.chat.hover.content.Text;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.LinkedList;
/**
* Jeder Fightcommand (auch bau testarena und challenge) haben folgende Optionskette:
*
@ -45,7 +41,7 @@ import java.util.LinkedList;
* Sollte die Map fehlen, kann sie mit getMap() bestimmt werden.
*/
public class FightCommand extends BasicCommand {
public class FightCommand extends SWCommand {
public FightCommand() {
super("fight", "", "f");
@ -91,34 +87,6 @@ public class FightCommand extends BasicCommand {
sender.sendMessage(ChatMessageType.SYSTEM, start);
}
private static void getMaps(ChatSender sender, String precommand, ArenaMode mode){
TextComponent start = new TextComponent();
TextComponent current = start;
if(mode.getMaps().size() > 1){
String command = precommand + mode.getChatName() + " Random";
start.setBold(true);
start.setColor(ChatColor.GRAY);
start.setText(sender.parseToLegacy("FIGHT_ARENA_RANDOM") + " ");
start.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("§e" + command)));
start.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, command));
current = new TextComponent();
}
for(String map : mode.getMaps()){
String command = precommand + mode.getChatName() + " " + map;
current.setBold(true);
current.setColor(ChatColor.GRAY);
current.setText(map + " ");
current.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("§e" + command)));
current.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, command));
if(current != start)
start.addExtra(current);
current = new TextComponent();
}
sender.sendMessage(ChatMessageType.SYSTEM, start);
}
private static boolean alreadyInArena(ProxiedPlayer player){
Subserver subserver = Subserver.getSubserver(player);
if(subserver != null && subserver.getType() == Servertype.ARENA){
@ -129,51 +97,24 @@ public class FightCommand extends BasicCommand {
return false;
}
static void createArena(CommandSender s, String precommand, boolean allowMerging, String[] args, int startArg, boolean historic, FightCallback callback){
if(!(s instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) s;
static void createArena(ProxiedPlayer player, String precommand, boolean allowMerging, ArenaMode arenaMode, String map, boolean historic, FightCallback callback) {
ChatSender sender = ChatSender.of(player);
if (sender.user().isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer)) {
return;
}
if(alreadyInArena(player))
return;
if(ModLoaderBlocker.isFabric(player) && !precommand.equals("/bau testarena ")) {
sender.system("MODLOADER_DENIED");
return;
}
if(args.length < startArg+1){
if (arenaMode == null) {
getModes(sender, precommand, historic);
return;
}
ArenaMode mode = getMode(sender, args[startArg]);
if(mode == null)
return;
if (map == null)
map = arenaMode.getRandomMap();
String map;
if(mode.getMaps().size() == 1){
map = mode.getRandomMap();
}else if(args.length < startArg+2){
getMaps(sender, precommand, mode);
return;
}else{
map = getMap(sender, mode, args[startArg+1]);
}
if(map == null)
return;
if(!allowMerging) {
callback.run(player, mode, map);
if (!allowMerging) {
callback.run(player, arenaMode, map);
} else {
suggestMerging(player, mode, map, callback);
suggestMerging(player, arenaMode, map, callback);
}
}
@ -183,7 +124,7 @@ public class FightCommand extends BasicCommand {
for (Subserver subserver : Subserver.getServerList()) {
if(subserver instanceof Arenaserver) {
Arenaserver arenaserver = (Arenaserver) subserver;
if(mode.getInternalName().equals(arenaserver.getMode()) && map.equals(arenaserver.getMap()) && arenaserver.isAllowMerge() && arenaserver.getServer().getPlayers().size() == 1) {
if(mode.getInternalName().equals(arenaserver.getMode()) && arenaserver.isAllowMerge() && arenaserver.getServer().getPlayers().size() == 1) {
mergable = arenaserver;
break;
}
@ -216,26 +157,13 @@ public class FightCommand extends BasicCommand {
inventory.open();
}
@Override
public void execute(CommandSender sender, String[] args) {
createArena(sender, "/fight ", true, args, 0, false, (player, mode, map) -> {
Subserver arena = new ServerStarter().arena(mode, map).blueLeader(player).start();
Message.broadcast("FIGHT_BROADCAST", "FIGHT_BROADCAST_HOVER"
, new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), player.getName());
});
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
if(args.length == 1){
return ArenaMode.getAllChatNames(false);
}else if(args.length == 2){
ArenaMode mode = ArenaMode.getByChat(args[1]);
if(mode == null)
return new LinkedList<>();
return mode.getMaps();
}
return new LinkedList<>();
@Register
public void fight(@Validator("arenaPlayer") ProxiedPlayer player, @Mapper("nonHistoricArenaMode") @OptionalValue("") @AllowNull ArenaMode arenaMode, @Mapper("arenaMap") @OptionalValue("") @AllowNull String map) {
createArena(player, "/fight ", true, arenaMode, map, false,
(p, mode, m) -> new ServerStarter().arena(mode, m).blueLeader(p).callback(
arena -> Message.broadcast("FIGHT_BROADCAST", "FIGHT_BROADCAST_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), p.getName())
).start()
);
}
/**

Datei anzeigen

@ -1,36 +1,37 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.Statement;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.internal.Statement;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.io.*;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class GDPRQuery extends BasicCommand {
public class GDPRQuery extends SWCommand {
public GDPRQuery() {
super("gdprquery", "bungeecore.softreload");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
@Register
public void generate(ProxiedPlayer player) {
generate(player, player);
}
ProxiedPlayer player = (ProxiedPlayer) sender;
SteamwarUser user = args.length == 0 ? SteamwarUser.get(player.getUniqueId()) : SteamwarUser.get(args[0]);
@Register
public void generate(ProxiedPlayer player, ProxiedPlayer forPlayer) {
SteamwarUser user = SteamwarUser.get(forPlayer.getUniqueId());
if(user == null) {
Message.send("UNKNOWN_PLAYER", player);
return;
}
BungeeCord.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
BungeeCord.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
try {
createZip(player, user);
} catch (IOException e) {
@ -48,7 +49,7 @@ public class GDPRQuery extends BasicCommand {
copy(getClass().getClassLoader().getResourceAsStream("GDPRQueryREADME.md"), out, "README.txt");
printUpdate(player, "GDPR_STATUS_WORLD");
copyBauwelt(user, out, "/home/minecraft/userworlds/" + user.getUuid().toString(), "BuildWorld12");
copyBauwelt(user, out, "/home/minecraft/userworlds/" + user.getUUID().toString(), "BuildWorld12");
copyBauwelt(user, out, "/home/minecraft/userworlds15/" + user.getId(), "BuildWorld15");
printUpdate(player, "GDPR_STATUS_INVENTORIES");
@ -213,14 +214,14 @@ public class GDPRQuery extends BasicCommand {
}
}
File playerdata = new File(world, "playerdata/" + user.getUuid().toString() + ".dat");
File playerdata = new File(world, "playerdata/" + user.getUUID().toString() + ".dat");
if(playerdata.exists())
copy(playerdata, out, outDir + "/playerdata/" + user.getUuid().toString() + ".dat");
copy(playerdata, out, outDir + "/playerdata/" + user.getUUID().toString() + ".dat");
}
private void copyPlayerdata(SteamwarUser user, ZipOutputStream out, String inDir, String outDir) throws IOException {
File worlds = new File(inDir);
String path = "playerdata/" + user.getUuid().toString() + ".dat";
String path = "playerdata/" + user.getUUID().toString() + ".dat";
int i = 0;
for(File world : worlds.listFiles()) {
@ -228,7 +229,7 @@ public class GDPRQuery extends BasicCommand {
if(!playerdata.exists())
continue;
copy(playerdata, out, outDir + "/" + (i++) + "/" + user.getUuid().toString() + ".dat");
copy(playerdata, out, outDir + "/" + (i++) + "/" + user.getUUID().toString() + ".dat");
}
}

Datei anzeigen

@ -20,88 +20,84 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.command.SWCommand;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class HelpCommand extends BasicCommand {
public class HelpCommand extends SWCommand {
public HelpCommand() {
super("help", "", "?");
}
@Override
public void execute(CommandSender s, String[] args) {
ChatSender sender = ChatSender.of(s);
if (args.length < 1) {
printPage(sender, ClickEvent.Action.RUN_COMMAND,
"HELP_LOBBY", "/l",
"HELP_BAU", "/bau",
"HELP_BAUSERVER", "/help bau",
"HELP_FIGHT", "/fight",
"HELP_CHALLENGE", "/challenge",
"HELP_HISTORIC", "/historic",
"HELP_TEAM", "/team",
"HELP_JOIN", "/join",
"HELP_LOCAL", "/local");
}else if (args[0].equalsIgnoreCase("bauserver")) {
sendBauHelp(sender);
}else if (args[0].equalsIgnoreCase("bau")) {
bauHelpGroup(sender, args);
}
}
@Register
public void genericCommand(ProxiedPlayer player) {
ChatSender sender = ChatSender.of(player);
private static void bauHelpGroup(ChatSender sender, String[] args) {
if (args.length < 2) {
sendBauHelpGroup(sender);
return;
}
switch (args[1].toLowerCase()) {
case "admin":
case "owner":
case "bauwelt":
sender.system("HELP_BAU_GROUP_ADMIN_TITLE");
sendBauHelp(sender);
return;
case "world":
printPage(sender, "HELP_BAU_GROUP_WORLD_TITLE", "HELP_TNT", "HELP_FIRE", "HELP_FREEZE", "HELP_TPSLIMIT", "HELP_PROTECT", "HELP_RESET");
return;
case "player":
printPage(sender, "HELP_BAU_GROUP_PLAYER_TITLE", "HELP_SPEED", "HELP_NV", "HELP_WV", "HELP_DEBUGSTICK", "HELP_TRACE", "HELP_LOADER");
return;
case "worldedit":
case "we":
case "world-edit":
case "edit":
printPage(sender, "HELP_BAU_GROUP_WE_TITLE", "HELP_WE_POS1", "HELP_WE_POS2", "HELP_WE_COPY", "HELP_WE_PASTE", "HELP_WE_FLOPY", "HELP_WE_FLOPYP", "HELP_WE_ROTATE_90", "HELP_WE_ROTATE_180", "HELP_WE_ROTATE_N90");
return;
case "other":
printPage(sender, "HELP_BAU_GROUP_OTHER_TITLE", "HELP_TESTBLOCK", "HELP_SKULL", "HELP_BAUINFO");
return;
default:
sendBauHelpGroup(sender);
}
}
private static void sendBauHelpGroup(ChatSender sender) {
printPage(sender, ClickEvent.Action.RUN_COMMAND,
"HELP_BAU_GROUP_ADMIN", "/help bau admin",
"HELP_BAU_GROUP_WORLD", "/help bau world",
"HELP_BAU_GROUP_PLAYER", "/help bau player",
"HELP_BAU_GROUP_WE", "/help bau we",
"HELP_BAU_GROUP_OTHER", "/help bau other");
"HELP_LOBBY", "/l",
"HELP_BAU", "/build",
"HELP_BAUSERVER", "/help build",
"HELP_FIGHT", "/fight",
"HELP_CHALLENGE", "/challenge",
"HELP_HISTORIC", "/historic",
"HELP_TEAM", "/team",
"HELP_JOIN", "/join",
"HELP_LOCAL", "/local");
}
static void sendBauHelp(ChatSender sender) {
printPage(sender, ClickEvent.Action.SUGGEST_COMMAND,
"HELP_BAU_TP", "/bau tp ",
"HELP_BAU_ADDMEMBER", "/bau addmember ",
"HELP_BAU_DELMEMBER", "/bau delmember ",
"HELP_BAU_TOGGLEWE", "/bau togglewe ",
"HELP_BAU_TOGGLEWORLD", "/bau toggleworld ",
"HELP_BAU_DELETE", "/bau delete ",
"HELP_BAU_TESTARENA", "/bau testarena ");
@Register({"build","world"})
public void buildWorld(ProxiedPlayer player) {
printPage(ChatSender.of(player), "HELP_BAU_GROUP_WORLD_TITLE", "HELP_TNT", "HELP_FIRE", "HELP_FREEZE", "HELP_TPSLIMIT", "HELP_PROTECT", "HELP_RESET");
}
@Register({"build","player"})
public void buildPlayer(ProxiedPlayer player) {
printPage(ChatSender.of(player), "HELP_BAU_GROUP_PLAYER_TITLE", "HELP_SPEED", "HELP_NV", "HELP_WV", "HELP_DEBUGSTICK", "HELP_TRACE", "HELP_LOADER");
}
@Register({"build","worldedit"})
@Register({"build","we"})
@Register({"build","world-edit"})
@Register({"build","edit"})
public void buildWorldedit(ProxiedPlayer player) {
printPage(ChatSender.of(player), "HELP_BAU_GROUP_WE_TITLE", "HELP_WE_POS1", "HELP_WE_POS2", "HELP_WE_COPY", "HELP_WE_PASTE", "HELP_WE_FLOPY", "HELP_WE_FLOPYP", "HELP_WE_ROTATE_90", "HELP_WE_ROTATE_180", "HELP_WE_ROTATE_N90");
}
@Register({"build","other"})
public void buildOther(ProxiedPlayer player) {
ChatSender sender = ChatSender.of(player);
printPage(sender, "HELP_BAU_GROUP_OTHER_TITLE", "HELP_TESTBLOCK", "HELP_SKULL", "HELP_BAUINFO");
sender.prefixless("HELP_SCHEMSUBMIT", new Message("HELP_SCHEMSUBMIT_HOVER"), new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.youtube.com/watch?v=9QrQ3UBWveE"));
}
@Register("build")
public void sendBauHelpGroup(ProxiedPlayer player) {
printPage(ChatSender.of(player), ClickEvent.Action.RUN_COMMAND,
"HELP_BAU_GROUP_ADMIN", "/help build admin",
"HELP_BAU_GROUP_WORLD", "/help build world",
"HELP_BAU_GROUP_PLAYER", "/help build player",
"HELP_BAU_GROUP_WE", "/help build we",
"HELP_BAU_GROUP_OTHER", "/help build other");
}
@Register("buildserver")
@Register({"build","admin"})
@Register({"build","owner"})
@Register({"build","bauwelt"})
public void sendBauHelp(ProxiedPlayer player) {
printPage(ChatSender.of(player), ClickEvent.Action.SUGGEST_COMMAND,
"HELP_BAU_TP", "/build tp ",
"HELP_BAU_ADDMEMBER", "/build addmember ",
"HELP_BAU_DELMEMBER", "/build delmember ",
"HELP_BAU_SET_SPECTATOR", "/build setSpectator ",
"HELP_BAU_SET_BUILDER", "/build setBuilder ",
"HELP_BAU_SET_SUPERVISOR", "/build setSupervisor ",
"HELP_BAU_DELETE", "/build delete ",
"HELP_BAU_TESTARENA", "/build testarena ",
"HELP_BAU_LOCK", "/build lock ",
"HELP_BAU_UNLOCK", "/build unlock");
}
private static void printPage(ChatSender sender, ClickEvent.Action action, String... args) {

Datei anzeigen

@ -22,36 +22,21 @@ package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.ArenaMode;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.ServerStarter;
import de.steamwar.bungeecore.Subserver;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.LinkedList;
public class HistoricCommand extends BasicCommand {
public class HistoricCommand extends SWCommand {
public HistoricCommand() {
super("historic", null);
}
@Override
public void execute(CommandSender sender, String[] args) {
FightCommand.createArena(sender, "/historic ", true, args, 0, true, (player, mode, map) -> {
Subserver arena = new ServerStarter().arena(mode, map).blueLeader(player).start();
Message.broadcast("HISTORIC_BROADCAST", "HISTORIC_BROADCAST_HOVER"
, new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), player.getName());
@Register
public void historic(@Validator("arenaPlayer") ProxiedPlayer player, @Mapper("historicArenaMode") @OptionalValue("") @AllowNull ArenaMode arenaMode, @Mapper("arenaMap") @OptionalValue("") @AllowNull String map) {
FightCommand.createArena(player, "/historic ", true, arenaMode, map, true, (p, mode, m) -> {
new ServerStarter().arena(mode, m).blueLeader(p).callback(
arena -> Message.broadcast("HISTORIC_BROADCAST", "HISTORIC_BROADCAST_HOVER", new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/arena " + arena.getServer().getName()), mode.getDisplayName(), p.getName())
).start();
});
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
if(args.length == 1){
return ArenaMode.getAllChatNames(true);
}else if(args.length == 2){
ArenaMode mode = ArenaMode.getByChat(args[1]);
if(mode == null)
return new LinkedList<>();
return mode.getMaps();
}
return new LinkedList<>();
}
}

Datei anzeigen

@ -20,34 +20,21 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.IgnoreSystem;
import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.command.SWCommand;
import de.steamwar.sql.IgnoreSystem;
import de.steamwar.sql.SteamwarUser;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class IgnoreCommand extends BasicCommand {
public class IgnoreCommand extends SWCommand {
public IgnoreCommand() {
super("ignore", null);
}
@Override
public void execute(CommandSender sender, String[] args) {
if(args.length < 1) {
Message.send("USAGE_IGNORE", sender);
return;
}
if (!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer p = (ProxiedPlayer) sender;
@Register(description = "USAGE_IGNORE")
public void genericCommand(ProxiedPlayer p, @ErrorMessage("UNKNOWN_PLAYER") SteamwarUser target) {
SteamwarUser user = SteamwarUser.get(p.getUniqueId());
SteamwarUser target = SteamwarUser.get(args[0]);
if(target == null){
Message.send("UNKNOWN_PLAYER", p);
return;
}
if(target.equals(user)){
Message.send("IGNORE_YOURSELF", p);
return;

Datei anzeigen

@ -19,75 +19,50 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.sql.BauweltMember;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.Subserver;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeValidator;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserPerm;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.ArrayList;
public class JoinmeCommand extends BasicCommand {
public class JoinmeCommand extends SWCommand {
public JoinmeCommand() {
super("joinme", "");
super("joinme");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(sender instanceof ProxiedPlayer) {
ProxiedPlayer player = (ProxiedPlayer) sender;
@Register(description = "JOINME_USAGE")
public void genericCommand(ProxiedPlayer player) {
if (!SteamwarUser.get(player.getUniqueId()).hasPerm(UserPerm.TEAM)) {
Message.send("JOINME_USAGE", player);
return;
}
Message.broadcast("JOINME_BROADCAST", "JOINME_BROADCAST_HOVER",
new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/join " + player.getName()), player.getName(), player.getServer().getInfo().getName());
}
if (args.length == 0 && player.hasPermission("bungeecore.joinme")) {
Message.broadcast("JOINME_BROADCAST", "JOINME_BROADCAST_HOVER"
, new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/join " + player.getName()), player.getName(), player.getServer().getInfo().getName());
} else if (args.length == 1) {
ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
if(target == null || !target.isConnected()){
Message.send("JOINME_PLAYER_OFFLINE", player);
return;
}else if(target.equals(player)){
Message.send("JOINME_PLAYER_SELF", player);
return;
}
ServerInfo server = target.getServer().getInfo();
String serverPerm = BungeeCore.serverPermissions.get(server.getName());
Subserver subserver = Subserver.getSubserver(target);
@Register
public void genericCommand(ProxiedPlayer player, @Validator ProxiedPlayer target) {
if (target.equals(player)){
Message.send("JOINME_PLAYER_SELF", player);
return;
}
if(subserver != null) {
Servertype type = subserver.getType();
if (type == Servertype.ARENA) {
SubserverSystem.sendPlayer(subserver, player);
} else if (type == Servertype.BAUSERVER) {
Bauserver bauserver = (Bauserver) subserver;
if (bauserver.getOwner().equals(player.getUniqueId()) ||
BauweltMember.getBauMember(bauserver.getOwner(), player.getUniqueId()) != null) {
SubserverSystem.sendPlayer(subserver, player);
} else {
SubserverSystem.sendDeniedMessage(player, bauserver.getOwner());
Message.send("JOIN_PLAYER_BLOCK", player);
}
}
}else if(serverPerm != null && !player.hasPermission(serverPerm)){
Message.send("JOIN_PLAYER_BLOCK", player);
}else if(serverPerm == null && !player.getGroups().contains("team")) {
Message.send("JOIN_PLAYER_BLOCK", player);
}else{
player.connect(server);
}
} else {
Message.send("JOINME_USAGE", player);
Subserver subserver = Subserver.getSubserver(target);
TpCommand.teleport(player, subserver != null ? subserver.getServer() : target.getServer().getInfo());
}
@ClassValidator(ProxiedPlayer.class)
public TypeValidator<ProxiedPlayer> playerMapper() {
return (sender, value, messageSender) -> {
if (value == null || !value.isConnected()) {
messageSender.send("JOINME_PLAYER_OFFLINE", sender);
return false;
}
}
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
if(args.length == 1){
return allPlayers(args[0]);
}
return new ArrayList<>();
return true;
};
}
}

Datei anzeigen

@ -19,50 +19,26 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.listeners.ConnectionListener;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.ArrayList;
public class KickCommand extends BasicCommand {
public class KickCommand extends SWCommand {
public KickCommand() {
super("kick", "bungeecore.kick");
super("kick", ConnectionListener.KICK_PERMISSION);
}
@Override
public void execute(CommandSender sender, String[] args) {
if(args.length == 0){
Message.send("KICK_USAGE", sender);
return;
}
ProxiedPlayer target = ProxyServer.getInstance().getPlayer(args[0]);
if(target == null){
Message.send("KICK_OFFLINE", sender);
return;
}
if(args.length == 1){
@Register(description = "KICK_USAGE")
public void genericCommand(CommandSender sender, @ErrorMessage("KICK_OFFLINE") ProxiedPlayer target, String... message) {
if (message.length == 0) {
target.disconnect(Message.parseToComponent("KICK_NORMAL", true, target));
}else{
StringBuilder msgBuilder = new StringBuilder();
msgBuilder.append(BungeeCore.CHAT_PREFIX).append("§c");
for (int i = 1; i < args.length; i++){
msgBuilder.append(args[i]).append(" ");
}
target.disconnect(BungeeCore.stringToText(msgBuilder.toString()));
} else {
target.disconnect(VelocityCore.stringToText(VelocityCore.CHAT_PREFIX + "§c" + String.join(" ", message)));
}
Message.send("KICK_CONFIRM", sender, target.getName());
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
if(args.length == 1)
return allPlayers(args[0]);
return new ArrayList<>();
}
}

Datei anzeigen

@ -22,6 +22,7 @@ package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.Servertype;
import de.steamwar.bungeecore.Subserver;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
@ -33,7 +34,7 @@ import java.util.List;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class ListCommand extends BasicCommand {
public class ListCommand extends SWCommand {
public ListCommand() {
super("list", "");
@ -60,8 +61,8 @@ public class ListCommand extends BasicCommand {
return playerMap;
}
@Override
public void execute(CommandSender commandSender, String[] strings) {
@Register
public void genericCommand(CommandSender commandSender) {
TreeMap<String, List<ProxiedPlayer>> playerMap = getCustomTablist();
for (String server : playerMap.navigableKeySet()) {
String serverName = server;

Datei anzeigen

@ -20,20 +20,18 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.listeners.ChatListener;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class LocalCommand extends BasicCommand {
public class LocalCommand extends SWCommand {
public LocalCommand() {
super("local", null, "bc", "bauchat");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ChatListener.localChat((ProxiedPlayer) sender, String.join(" ", args));
@Register
public void genericCommand(ProxiedPlayer player, String... message) {
ChatListener.localChat(player, String.join(" ", message));
}
}

Datei anzeigen

@ -0,0 +1,148 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2023 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.inventory.SWInventory;
import de.steamwar.bungeecore.inventory.SWItem;
import de.steamwar.bungeecore.inventory.SWListInv;
import de.steamwar.bungeecore.inventory.SWStreamInv;
import de.steamwar.bungeecore.listeners.ConnectionListener;
import de.steamwar.command.SWCommand;
import de.steamwar.sql.Mod;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
public class ModCommand extends SWCommand {
public ModCommand() {
super("mod", ConnectionListener.MOD_PERMISSION, "mods");
}
public static final Map<ProxiedPlayer, Mod.ModType> playerFilterType = new HashMap<>();
@Register
public void genericCommand(ProxiedPlayer p) {
playerFilterType.putIfAbsent(p,Mod.ModType.UNKLASSIFIED);
openGui(p);
}
private void openGui(ProxiedPlayer p) {
SWStreamInv<Mod> swStreamInv = new SWStreamInv<>(p,Message.parse("MOD_COMMAND_GUI_TITLE",p), (click, element) -> {
openClassificationGui(p,element);
},page -> {
Mod.ModType filtertype = playerFilterType.get(p);
return Mod.getAllModsFiltered(page,45, filtertype).stream().map(mod -> new SWListInv.SWListEntry<>(getModItem(mod),mod)).collect(Collectors.toList());
});
swStreamInv.addItem(52,new SWItem("NAME_TAG","Filter"), click -> {
swStreamInv.close();
openFilterGui(p);
});
swStreamInv.open();
}
public void updateAndCloseGui(Mod.ModType modType, Mod mod, SWInventory toClose, ProxiedPlayer p) {
mod.setModType(modType);
toClose.close();
openGui(p);
}
private void openFilterGui(ProxiedPlayer p) {
SWInventory inv = new SWInventory(p, 9, "Filter");
inv.addItem(1, new SWItem(Message.parse("MOD_UNCLASSIFIED",p),8), click -> playerFilterType.replace(p, Mod.ModType.UNKLASSIFIED));
inv.addItem(2, new SWItem(Message.parse("MOD_ALLOWED",p),2), click -> playerFilterType.replace(p, Mod.ModType.GREEN));
inv.addItem(3, new SWItem(Message.parse("MOD_FORBIDDEN",p), 11), click -> playerFilterType.replace(p, Mod.ModType.YELLOW));
inv.addItem(4, new SWItem(Message.parse("MOD_AUTOBAN",p),1), click -> playerFilterType.replace(p, Mod.ModType.RED));
inv.addItem(5, new SWItem(Message.parse("MOD_YT",p),13), click -> playerFilterType.replace(p, Mod.ModType.YOUTUBER_ONLY));
inv.addItem(8, new SWItem("ARROW", Message.parse("MOD_ITEM_BACK",p)), click -> {
inv.close();
openGui(p);
});
inv.open();
}
private void openClassificationGui(ProxiedPlayer p,Mod element) {
SWInventory swInventory = new SWInventory(p,9,Message.parse("MOD_COMMAND_CLASSICIATION_GUI",p));
swInventory.addItem(2, new SWItem(Message.parse("MOD_UNCLASSIFIED",p),8), (click1 -> updateAndCloseGui(Mod.ModType.UNKLASSIFIED,element,swInventory,p)));
swInventory.addItem(3, new SWItem(Message.parse("MOD_ALLOWED",p), 2), (click1 -> updateAndCloseGui(Mod.ModType.GREEN,element,swInventory,p)));
swInventory.addItem(4, new SWItem(Message.parse("MOD_FORBIDDEN",p), 11), (click1 -> updateAndCloseGui(Mod.ModType.YELLOW,element,swInventory,p)));
swInventory.addItem(5, new SWItem(Message.parse("MOD_AUTOBAN",p),1), (click1 -> updateAndCloseGui(Mod.ModType.RED,element,swInventory,p)));
swInventory.addItem(6, new SWItem(Message.parse("MOD_YT",p), 13), (click1 -> updateAndCloseGui(Mod.ModType.YOUTUBER_ONLY,element,swInventory,p)));
swInventory.addItem(8,new SWItem("ARROW",Message.parse("MOD_ITEM_BACK",p)), click1 -> {
swInventory.close();
openGui(p);
});
swInventory.open();
}
private SWItem getModItem(Mod modEntry) {
SWItem item = new SWItem("NAME_TAG", modEntry.getModName());
item.addLore(modEntry.getPlatform().name());
return item;
}
@Register(value = {"set"},description = "MOD_COMMAND_SET_USAGE")
public void set(ProxiedPlayer p,String modName,Mod.Platform platform,Mod.ModType newModType) {
Mod mod = Mod.get(modName, platform);
if(mod == null) {
Message.send("MOD_COMMAND_NOT_FOUND_IN_DATABASE",p,modName, platform.name());
return;
}
mod.setModType(newModType);
Message.send("MOD_CHANGED_TYPE",p,modName,platform.name(),newModType.name());
}
@Register(value = {"get"},description = "MOD_COMMAND_GET_USAGE")
public void get(ProxiedPlayer p,String modName,Mod.Platform platform) {
Mod mod = Mod.get(modName, platform);
if(mod == null) {
Message.send("MOD_COMMAND_NOT_FOUND_IN_DATABASE", p, modName, platform.name());
return;
}
Message.send("MOD_COMMAND_INFO", p, modName, platform.name(), mod.getModType().name());
}
@Register(value = {"next"})
public void next(ProxiedPlayer p) {
Mod mod = Mod.findFirstMod();
if(mod == null) {
Message.send("MOD_NO_MORE_UNCLASSIFIED_MODS",p);
return;
}
Message.send("MOD_FOUND_NEXT_MOD",p,"MOD_OPEN_GUI",new ClickEvent(ClickEvent.Action.RUN_COMMAND,""),mod.getModName(),mod.getPlatform().name());
}
}

Datei anzeigen

@ -20,35 +20,24 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.listeners.ChatListener;
import de.steamwar.bungeecore.sql.IgnoreSystem;
import de.steamwar.sql.IgnoreSystem;
import de.steamwar.command.SWCommand;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.stream.Stream;
import static de.steamwar.bungeecore.Storage.lastChats;
public class MsgCommand extends BasicCommand {
public class MsgCommand extends SWCommand {
public MsgCommand() {
super("msg", "", "w", "tell");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
if (args.length < 2) {
ChatSender.of(sender).system("MSG_USAGE");
return;
}
msg((ProxiedPlayer) sender, ProxyServer.getInstance().getPlayer(args[0]), Arrays.copyOfRange(args, 1, args.length));
@Register(description = "MSG_USAGE")
public void genericCommand(ProxiedPlayer sender, @ErrorMessage(value = "MSG_OFFLINE") ProxiedPlayer target, @ErrorMessage(value = "MSG_USAGE", allowEAs = false) String... message) {
msg(sender, target, message);
}
public static void msg(ProxiedPlayer player, ProxiedPlayer target, String[] args) {
@ -58,7 +47,7 @@ public class MsgCommand extends BasicCommand {
return;
}
if (IgnoreSystem.isIgnored(target, player)) {
if (IgnoreSystem.isIgnored(target.getUniqueId(), player.getUniqueId())) {
sender.system("MSG_IGNORED");
return;
}
@ -69,14 +58,6 @@ public class MsgCommand extends BasicCommand {
lastChats.put(target, player);
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
if(args.length == 1){
return allPlayers(args[0]);
}
return new ArrayList<>();
}
public static void remove(ProxiedPlayer player){
lastChats.remove(player);
}

Datei anzeigen

@ -20,20 +20,17 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class PingCommand extends BasicCommand {
public class PingCommand extends SWCommand {
public PingCommand() {
super("ping", "");
super("ping");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(sender instanceof ProxiedPlayer){
ProxiedPlayer player = (ProxiedPlayer) sender;
Message.send("PING_RESPONSE", player, player.getPing());
}
@Register
public void genericCommand(ProxiedPlayer player) {
Message.send("PING_RESPONSE", player, player.getPing());
}
}

Datei anzeigen

@ -20,30 +20,25 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import org.apache.commons.lang3.LocaleUtils;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
public class PlaytimeCommand extends BasicCommand{
public class PlaytimeCommand extends SWCommand {
public PlaytimeCommand() {
super("playtime", null);
super("playtime");
}
@Override
public void execute(CommandSender sender, String[] strings) {
if(!(sender instanceof ProxiedPlayer))
return;
NumberFormat format = NumberFormat.getNumberInstance(((ProxiedPlayer)sender).getLocale());
@Register
public void genericCommand(ProxiedPlayer player) {
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
NumberFormat format = NumberFormat.getNumberInstance(user.getLocale());
format.setMaximumFractionDigits(2);
String formattedText = format.format((SteamwarUser.get((ProxiedPlayer) sender).getOnlinetime() / (double) 3600));
String formattedText = format.format((user.getOnlinetime() / (double) 3600));
Message.send("HOURS_PLAYED", sender, formattedText);
Message.send("HOURS_PLAYED", player, formattedText);
}
}

Datei anzeigen

@ -21,37 +21,28 @@ package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.listeners.PollSystem;
import de.steamwar.bungeecore.sql.PollAnswer;
import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.sql.PollAnswer;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeValidator;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class PollCommand extends BasicCommand {
public class PollCommand extends SWCommand {
public PollCommand() {
super("poll", "");
super("poll");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
if(PollSystem.noCurrentPoll()){
Message.send("POLL_NO_POLL", player);
return;
}
if(args.length == 0){
PollSystem.sendPoll(player);
return;
}
@Register
public void genericCommand(ProxiedPlayer player) {
PollSystem.sendPoll(player);
}
@Register(noTabComplete = true)
public void answerPoll(@Validator ProxiedPlayer player, String answerString) {
int answer;
try {
answer = Integer.parseUnsignedInt(args[0]);
answer = Integer.parseUnsignedInt(answerString);
if(answer < 1 || answer > PollSystem.answers())
throw new NumberFormatException();
}catch(NumberFormatException e){
@ -67,4 +58,15 @@ public class PollCommand extends BasicCommand {
pollAnswer.setAnswer(answer);
}
@ClassValidator(value = ProxiedPlayer.class, local = true)
public TypeValidator<ProxiedPlayer> noPoll() {
return (sender, value, messageSender) -> {
if(PollSystem.noCurrentPoll()){
messageSender.send("POLL_NO_POLL");
return false;
}
return true;
};
}
}

Datei anzeigen

@ -20,35 +20,38 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.listeners.ConnectionListener;
import de.steamwar.bungeecore.listeners.PollSystem;
import de.steamwar.bungeecore.sql.PollAnswer;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.sql.PollAnswer;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeValidator;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.Map;
public class PollresultCommand extends BasicCommand {
public class PollresultCommand extends SWCommand {
public PollresultCommand() {
super("pollresult", "bungeecore.pollresults");
super("pollresult", ConnectionListener.POLLRESULT_PERMISSION);
}
@Override
public void execute(CommandSender sender, String[] strings) {
if(!(sender instanceof ProxiedPlayer))
return;
if(PollSystem.noCurrentPoll()) {
Message.send("POLLRESULT_NOPOLL", sender);
return;
@Register
public void genericCommand(@Validator ProxiedPlayer player) {
Map<Integer, Integer> voted = PollAnswer.getCurrentResults();
Message.send("POLLRESULT_HEADER", player, voted.values().stream().reduce(Integer::sum).orElse(0), PollAnswer.getCurrentPoll());
for (Map.Entry<Integer, Integer> e: voted.entrySet()) {
Message.send("POLLRESULT_LIST", player, PollSystem.getAnswer(e.getKey()), e.getValue());
}
ProxiedPlayer player = (ProxiedPlayer) sender;
}
Map<String, Integer> voted = PollAnswer.getCurrentResults();
Message.send("POLLRESULT_HEADER", player, voted.values().stream().reduce(Integer::sum).orElse(0), PollSystem.getQuestion());
for (Map.Entry<String, Integer> e: voted.entrySet()) {
Message.send("POLLRESULT_LIST", sender, e.getKey(), e.getValue());
}
@ClassValidator(value = ProxiedPlayer.class, local = true)
public TypeValidator<ProxiedPlayer> noPoll() {
return (sender, value, messageSender) -> {
if (PollSystem.noCurrentPoll()) {
messageSender.send("POLL_NO_POLL");
return false;
}
return true;
};
}
}

Datei anzeigen

@ -19,84 +19,228 @@
package de.steamwar.bungeecore.commands;
import com.google.gson.JsonParser;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.listeners.ConnectionListener;
import de.steamwar.bungeecore.listeners.IPSanitizer;
import de.steamwar.command.PreviousArguments;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper;
import de.steamwar.messages.ChatSender;
import de.steamwar.sql.BannedUserIPs;
import de.steamwar.sql.Punishment;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserPerm;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.io.IOException;
import java.net.URL;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.Instant;
import java.util.Date;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.logging.Level;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class PunishmentCommand {
public PunishmentCommand(String command, Punishment.PunishmentType punishmentType) {
new BasicCommand(command, "bungeecore.ban") {
@Override
public void execute(CommandSender sender, String[] args) {
if (punishmentType.isNeedsAdmin() && !SteamwarUser.get((ProxiedPlayer) sender).getUserGroup().isAdminGroup()) {
return;
private static final String API_URL = "https://api.mojang.com/users/profiles/minecraft/";
private static final JsonParser jsonParser = new JsonParser();
public static SteamwarUser getOrCreateOfflinePlayer(String name) {
SteamwarUser user = SteamwarUser.get(name);
if (user != null) {
return user;
}
UUID uuid = getUUIDofOfflinePlayer(name);
if (uuid == null) {
return null;
}
return SteamwarUser.getOrCreate(uuid, name, u -> {}, (o, n) -> {});
}
private static UUID getUUIDofOfflinePlayer(String playerName) {
try {
final URL url = new URL(API_URL + playerName);
String uuid = jsonParser.parse(new Scanner(url.openConnection().getInputStream()).nextLine()).getAsJsonObject().get("id").getAsString();
return UUID.fromString(uuid.replaceFirst("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5"));
} catch (NoSuchElementException e) {
// ignore, player does not exist
} catch (IOException e) {
VelocityCore.get().getLogger().log(Level.SEVERE, "Could not get offline player UUID " + playerName, e);
}
return null;
}
public static boolean isPunishedWithMessage(ChatSender player, Punishment.PunishmentType punishment) {
SteamwarUser user = player.user();
if (!user.isPunished(punishment)) {
return false;
}
player.system(punishmentMessage(user, punishment));
return true;
}
public static void ban(SteamwarUser user, Timestamp time, String banReason, SteamwarUser punisher, boolean perma) {
user.punish(Punishment.PunishmentType.Ban, time, banReason, punisher.getId(), perma);
ProxiedPlayer player = ProxyServer.getInstance().getPlayer(user.getUUID());
if (player != null) {
String ip = IPSanitizer.getTrueAddress(player.getPendingConnection()).getHostAddress();
ChatSender.disconnect(player).system(punishmentMessage(user, Punishment.PunishmentType.Ban));
for (BannedUserIPs banned : BannedUserIPs.get(ip)) {
SteamwarUser bannedUser = SteamwarUser.get(banned.getUserID());
if (bannedUser.isPunished(Punishment.PunishmentType.Ban) && bannedUser.getPunishment(Punishment.PunishmentType.Ban).getEndTime().before(time)) {
bannedUser.punish(Punishment.PunishmentType.Ban, time, banReason, punisher.getId(), perma);
}
if (args.length < 3) {
Message.send("PUNISHMENT_USAGE", sender, command);
}
BannedUserIPs.banIP(user.getId(), ip);
}
}
public static Message punishmentMessage(SteamwarUser user, Punishment.PunishmentType punishment) {
Punishment currentPunishment = user.getPunishment(punishment);
if (currentPunishment.isPerma()) {
return new Message(punishment.getPlayerMessagePerma(), currentPunishment.getReason());
} else {
return new Message(punishment.getPlayerMessageUntil(), currentPunishment.getEndTime(), currentPunishment.getReason());
}
}
public PunishmentCommand(String command, Punishment.PunishmentType punishmentType) {
new SWCommand(command, ConnectionListener.BAN_PERMISSION) {
@Register
public void genericCommand(ProxiedPlayer player, @Mapper("toPunish") String toPunish, String date, @ErrorMessage(allowEAs = false, value = "PUNISHMENT_USAGE_REASON") String... message) {
SteamwarUser punisher = SteamwarUser.get(player.getUniqueId());
if (punishmentType.isNeedsAdmin() && !punisher.hasPerm(UserPerm.MODERATION)) {
return;
}
SteamwarUser target = unsafeUser(sender, args[0]);
SteamwarUser target = unsafeUser(player, toPunish);
if (target == null)
return;
Timestamp banTime = parseTime(sender, args[1]);
Timestamp banTime = parseTime(player, date);
if (banTime == null)
return;
StringBuilder reason = new StringBuilder();
for (int i = 2; i < args.length; i++) {
reason.append(args[i]).append(" ");
}
boolean isPerma = args[1].equalsIgnoreCase("perma");
String msg = reason.toString();
target.punish(punishmentType, banTime, msg, SteamwarUser.get(sender.getName()).getId(), isPerma);
Message.team(punishmentType.getTeamMessage(), new Message("PREFIX"), target.getUserName(), sender.getName(), new Message((isPerma ? "PUNISHMENT_PERMA" : "PUNISHMENT_UNTIL"), banTime), msg);
boolean isPerma = date.equalsIgnoreCase("perma");
String msg = String.join(" ", message);
if(punishmentType == Punishment.PunishmentType.Ban)
ban(target, banTime, msg, punisher, isPerma);
else
target.punish(punishmentType, banTime, msg, punisher.getId(), isPerma);
Message.team(punishmentType.getTeamMessage(), new Message("PREFIX"), target.getUserName(), player.getName(), new Message((isPerma ? "PUNISHMENT_PERMA" : "PUNISHMENT_UNTIL"), banTime), msg);
}
@Register
public void genericError(ProxiedPlayer player, String... args) {
ChatSender.of(player).send(true, ChatMessageType.CHAT, null, null, new Message("PUNISHMENT_USAGE", command));
}
@Mapper(value = "toPunish", local = true)
public TypeMapper<String> allUsers() {
return new TypeMapper<String>() {
@Override
public String map(CommandSender commandSender, String[] previousArguments, String s) {
return s;
}
@Override
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
List<String> players = BungeeCord.getInstance().getPlayers().stream()
.map(CommandSender::getName)
.collect(Collectors.toList());
players.add(s);
return players;
}
};
}
};
if (punishmentType.getUnpunishmentMessage() == null) {
return;
}
String antiCommand = "un" + command;
new BasicCommand(antiCommand, "bungeecore.ban") {
@Override
public void execute(CommandSender sender, String[] args) {
if (punishmentType.isNeedsAdmin() && !SteamwarUser.get((ProxiedPlayer) sender).getUserGroup().isAdminGroup()) {
return;
}
if (args.length < 1) {
Message.send("UNPUNISHMENT_USAGE", sender, antiCommand);
return;
}
SteamwarUser target = existingUser(sender, args[0]);
if (target == null)
if (punishmentType.getUnpunishmentMessage() == null) return;
String antiCommand = "un" + command;
new SWCommand(antiCommand, ConnectionListener.BAN_PERMISSION) {
@Register
public void genericCommand(ProxiedPlayer player, @ErrorMessage("UNKNOWN_PLAYER") SteamwarUser target) {
if (punishmentType.isNeedsAdmin() && !SteamwarUser.get(player.getUniqueId()).hasPerm(UserPerm.MODERATION)) {
return;
}
if (!target.isPunished(punishmentType)) {
Message.send(punishmentType.getUsageNotPunished(), sender);
Message.send(punishmentType.getUsageNotPunished(), player);
return;
}
Message.send(punishmentType.getUnpunishmentMessage(), sender, target.getUserName());
target.punish(punishmentType, Timestamp.from(new Date().toInstant()), antiCommand, SteamwarUser.get(sender.getName()).getId(), false);
Message.send(punishmentType.getUnpunishmentMessage(), player, target.getUserName());
target.punish(punishmentType, Timestamp.from(new Date().toInstant()), antiCommand, SteamwarUser.get(player.getName()).getId(), false);
if(punishmentType == Punishment.PunishmentType.Ban)
BannedUserIPs.unbanIPs(target.getId());
}
@Register
public void genericError(ProxiedPlayer player, String... args) {
ChatSender.of(player).send(true, ChatMessageType.CHAT, null, null, new Message("UNPUNISHMENT_USAGE", antiCommand));
}
};
}
protected SteamwarUser unsafeUser(CommandSender sender, String arg){
SteamwarUser target = getOrCreateOfflinePlayer(arg);
if(target == null)
Message.send("UNKNOWN_PLAYER", sender);
return target;
}
private static Pattern RELATIVE_PATTERN = Pattern.compile("([1-9]\\d*[hdwmy])+");
public static Timestamp parseTime(CommandSender sender, String arg) {
if (arg.equalsIgnoreCase("perma")) {
return Punishment.PERMA_TIME;
} else {
if (RELATIVE_PATTERN.matcher(arg).matches()) {
Instant instant = Instant.now();
StringBuilder st = new StringBuilder();
for (int i = 0; i < arg.length(); i++) {
char c = arg.charAt(i);
if (c >= '0' && c <= '9') {
st.append(c);
continue;
}
int amount = Integer.parseInt(st.toString());
st = new StringBuilder();
switch (c) {
case 'h':
instant = instant.plus(amount, ChronoUnit.HOURS);
break;
case 'd':
instant = instant.plus(amount, ChronoUnit.DAYS);
break;
case 'w':
instant = instant.plus(Duration.ofSeconds(amount * ChronoUnit.WEEKS.getDuration().getSeconds()));
break;
case 'm':
instant = instant.plus(Duration.ofSeconds(amount * ChronoUnit.MONTHS.getDuration().getSeconds()));
break;
case 'y':
instant = instant.plus(Duration.ofSeconds(amount * ChronoUnit.YEARS.getDuration().getSeconds()));
break;
}
}
return Timestamp.from(instant);
}
SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy_HH:mm");
try {
Date parsedDate = dateFormat.parse(arg);

Datei anzeigen

@ -19,28 +19,19 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import static de.steamwar.bungeecore.Storage.lastChats;
public class RCommand extends BasicCommand {
public class RCommand extends SWCommand {
public RCommand() {
super("r", "", "reply");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
if(args.length == 0){
ChatSender.of(sender).system("R_USAGE");
return;
}
MsgCommand.msg((ProxiedPlayer) sender, lastChats.get(sender), args);
@Register(description = "R_USAGE")
public void genericCommand(ProxiedPlayer player, @ErrorMessage(value = "R_USAGE", allowEAs = false) String... message) {
MsgCommand.msg(player, lastChats.get(player), message);
}
}

Datei anzeigen

@ -21,50 +21,49 @@ package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.ArenaMode;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.UserElo;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.command.SWCommand;
import de.steamwar.command.SWCommandUtils;
import de.steamwar.command.TypeMapper;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserElo;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.Optional;
import java.util.stream.Collectors;
public class RankCommand extends BasicCommand {
public class RankCommand extends SWCommand {
public RankCommand() {
super("rank", null);
super("rank");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
@Register
public void ownRank(ProxiedPlayer player) {
rank(player, SteamwarUser.get(player.getUniqueId()));
}
ProxiedPlayer player = (ProxiedPlayer) sender;
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
if (args.length > 0) {
SteamwarUser nUser = SteamwarUser.get(args[0]);
if (nUser == null) {
Message.send("RANK_PLAYER_NOT_FOUND", player);
return;
}
Message.send("RANK_PLAYER_FOUND", player, nUser.getUserName());
user = nUser;
@Register
public void rank(ProxiedPlayer player, @ErrorMessage("RANK_PLAYER_NOT_FOUND") SteamwarUser user) {
if (!player.getName().equals(user.getUserName())) {
Message.sendPrefixless("RANK_PLAYER_FOUND", player, user.getUserName());
}
for(ArenaMode mode : ArenaMode.getAllModes()) {
if (!mode.isRanked())
continue;
Message.send("RANK_HEADER", player, mode.getChatName());
Optional<Integer> elo = UserElo.getElo(user.getId(), mode.getSchemType());
String eloString;
if (elo.isPresent()) {
int placement = UserElo.getPlacement(elo.get(), mode.getSchemType());
Message.send("RANK_PLACED", player, placement, elo.get());
eloString = Message.parse("RANK_PLACED", player, placement, elo.get());
} else {
Message.send("RANK_UNPLACED", player);
eloString = Message.parse("RANK_UNPLACED", player);
}
Message.send("RANK_EMBLEM", player, UserElo.getEmblemProgression(player, mode.getChatName(), user.getId()));
Message.sendPrefixless("RANK_HEADER", player, mode.getChatName(), eloString);
Message.sendPrefixless("RANK_EMBLEM", player, UserElo.getEmblemProgression(mode.getChatName(), user.getId()));
}
}
}

Datei anzeigen

@ -20,25 +20,23 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class RegelnCommand extends BasicCommand {
public class RegelnCommand extends SWCommand {
public RegelnCommand() {
super("regeln", null);
super("regeln", null, "rules");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
@Register
public void genericCommand(ProxiedPlayer player) {
Message.send("REGELN_RULES", player);
Message.sendPrefixless("REGELN_AS", player, Message.parse("REGELN_AS_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_AS_URL", player)));
Message.sendPrefixless("REGELN_MWG", player, Message.parse("REGELN_MWG_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_MWG_URL", player)));
Message.sendPrefixless("REGELN_WG", player, Message.parse("REGELN_WG_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_WG_URL", player)));
Message.sendPrefixless("REGELN_WS", player, Message.parse("REGELN_WS_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_WS_URL", player)));
Message.sendPrefixless("REGELN_QG", player, Message.parse("REGELN_QG_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_QG_URL", player)));
Message.sendPrefixless("REGELN_CONDUCT", player, Message.parse("REGELN_CONDUCT_HOVER", player), new ClickEvent(ClickEvent.Action.OPEN_URL, Message.parse("REGELN_CONDUCT_URL", player)));
}
}

Datei anzeigen

@ -23,45 +23,44 @@ import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.inventory.SWItem;
import de.steamwar.bungeecore.inventory.SWListInv;
import de.steamwar.bungeecore.inventory.SWStreamInv;
import de.steamwar.bungeecore.sql.Fight;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SchematicType;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.*;
import de.steamwar.command.SWCommand;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class ReplayCommand extends BasicCommand {
public class ReplayCommand extends SWCommand {
public ReplayCommand() {
super("replay", null);
super("replay");
}
@Override
public void execute(CommandSender s, String[] args) {
if(!(s instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) s;
@Register
public void genericCommand(ProxiedPlayer player, @OptionalValue("") String optionalMap) {
ChatSender sender = ChatSender.of(player);
if (sender.user().isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer))
if (PunishmentCommand.isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer))
return;
new SWStreamInv<>(player, Message.parse("REPLAY_TITLE", player), (click, fight) -> {
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
ArenaMode mode = fight.getGameMode();
ArenaMode mode = ArenaMode.getBySchemType(fight.getSchemType());
ServerStarter starter = new ServerStarter().replay(fight.getFightID()).blueLeader(player);
if (user.getUserGroup().isAdminGroup() && click.isShiftClick() && fight.replayExists()) {
starter.test(mode, mode.getRandomMap(), player).start();
String map = mode.getRandomMap();
if (!optionalMap.equals("")) {
String tMap = mode.hasMap(optionalMap);
if (tMap != null) map = tMap;
}
if (user.hasPerm(UserPerm.MODERATION) && click.isShiftClick() && fight.replayExists()) {
starter.test(mode, map, player).start();
} else if(!fight.replayAllowed()) {
sender.system("REPLAY_UNAVAILABLE");
} else {
starter.arena(mode, mode.getRandomMap()).start();
starter.arena(mode, map).start();
}
}, page -> Fight.getPage(page, 45).stream().map(fight -> new SWListInv.SWListEntry<>(getFightItem(sender, fight), fight)).collect(Collectors.toList())).open();
}

Datei anzeigen

@ -19,26 +19,23 @@
package de.steamwar.bungeecore.commands;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class ServerSwitchCommand extends BasicCommand {
public class ServerSwitchCommand extends SWCommand {
private String serverName;
private final String serverName;
public ServerSwitchCommand(String cmd, String name, String permission, String... aliases) {
super(cmd, permission, aliases);
public ServerSwitchCommand(String cmd, String name, String... aliases) {
super(cmd, null, aliases);
serverName = name;
}
@Override
public void execute(CommandSender sender, String[] strings) {
if(sender instanceof ProxiedPlayer){
ProxiedPlayer player = (ProxiedPlayer) sender;
ServerInfo target = ProxyServer.getInstance().getServerInfo(serverName);
player.connect(target);
}
@Register
public void genericCommand(ProxiedPlayer player) {
ServerInfo target = ProxyServer.getInstance().getServerInfo(serverName);
player.connect(target);
}
}

Datei anzeigen

@ -20,23 +20,19 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.listeners.ChatListener;
import de.steamwar.bungeecore.listeners.ConnectionListener;
import de.steamwar.command.SWCommand;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.CommandSender;
public class ServerTeamchatCommand extends BasicCommand {
public class ServerTeamchatCommand extends SWCommand {
public ServerTeamchatCommand() {
super("stc", "bungeecore.teamchat","serverteamchat");
super("stc", ConnectionListener.TEAMCHAT_PERMISSION,"serverteamchat");
}
@Override
public void execute(CommandSender s, String[] args) {
ChatSender sender = ChatSender.of(s);
if(args.length == 0) {
sender.system("STC_USAGE");
return;
}
ChatListener.sendChat(sender, ChatSender.serverteamReceivers(), "CHAT_SERVERTEAM", null, String.join(" ", args));
@Register(description = "STC_USAGE")
public void genericCommand(CommandSender commandSender, @ErrorMessage(value = "STC_USAGE", allowEAs = false) String... message) {
ChatListener.sendChat(ChatSender.of(commandSender), ChatSender.serverteamReceivers(), "CHAT_SERVERTEAM", null, String.join(" ", message));
}
}

Datei anzeigen

@ -19,25 +19,25 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.network.NetworkSender;
import de.steamwar.command.SWCommand;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.network.packets.server.LocaleInvalidationPacket;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.Objects;
public class SetLocaleCommand extends BasicCommand {
public class SetLocaleCommand extends SWCommand {
public SetLocaleCommand() {
super("setlocale", null, "setlanguage");
}
@Override
public void execute(CommandSender s, String[] strings) {
if (!(s instanceof ProxiedPlayer))
return;
ChatSender sender = ChatSender.of(s);
sender.user().setLocale(Objects.requireNonNull(((ProxiedPlayer) s).getLocale()), true);
@Register
public void genericCommand(ProxiedPlayer player) {
ChatSender sender = ChatSender.of(player);
sender.user().setLocale(Objects.requireNonNull(player.getLocale()), true);
NetworkSender.send(player, new LocaleInvalidationPacket(sender.user().getId()));
sender.system("LOCK_LOCALE_CHANGED");
}
}

Datei anzeigen

@ -21,6 +21,7 @@ package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.Node;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.CommandSender;
import java.io.BufferedReader;
@ -28,14 +29,14 @@ import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
public class StatCommand extends BasicCommand {
public class StatCommand extends SWCommand {
public StatCommand() {
super("stat", "bungeecore.softreload", "stats");
}
@Override
public void execute(CommandSender sender, String[] args) {
@Register
public void genericCommand(CommandSender sender) {
Map<String, Integer> serverCount = new HashMap<>();
try {
Process process = new ProcessBuilder("ps", "x").start();
@ -43,7 +44,7 @@ public class StatCommand extends BasicCommand {
if (!s.contains("--port"))
return;
serverCount.compute(
s.contains("ssh -L") ? s.substring(s.indexOf("ssh -L") + 6).split(" ")[2] : "local",
s.contains("ssh -L") ? s.substring(s.indexOf("ssh -L") + 6).split(" ")[2] : "sw",
(server, count) -> (count != null ? count : 0) + 1
);
});
@ -51,7 +52,6 @@ public class StatCommand extends BasicCommand {
throw new SecurityException(e.getMessage(), e);
}
Node.forEach(node -> Message.send("STAT_SERVER", sender, node.getName(), node.getLoad(), serverCount.getOrDefault(node.getName(), 0)));
Node.forEach(node -> Message.send("STAT_SERVER", sender, node.getName(), node.belowLoadLimit(), serverCount.getOrDefault(node.getName(), 0)));
}
}

Datei anzeigen

@ -23,14 +23,17 @@ import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.Storage;
import de.steamwar.bungeecore.inventory.SWItem;
import de.steamwar.bungeecore.inventory.SWListInv;
import de.steamwar.bungeecore.sql.*;
import de.steamwar.command.PreviousArguments;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper;
import de.steamwar.command.TypeValidator;
import de.steamwar.messages.ChatSender;
import io.netty.channel.ConnectTimeoutException;
import de.steamwar.sql.*;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.UserConnection;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.ServerConnectRequest;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.chat.HoverEvent;
@ -42,15 +45,13 @@ import net.md_5.bungee.api.event.ServerConnectEvent;
import java.net.*;
import java.time.Instant;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import static de.steamwar.bungeecore.Storage.teamInvitations;
public class TeamCommand extends BasicCommand {
public class TeamCommand extends SWCommand {
private static final List<SWListInv.SWListEntry<String>> COLOR_CODES = new ArrayList<>();
@ -78,16 +79,17 @@ public class TeamCommand extends BasicCommand {
}
public TeamCommand() {
super("team", "");
super("team");
}
private void help(CommandSender sender){
@Register(noTabComplete = true)
public void help(CommandSender sender, String... args){
Message.send("TEAM_HELP_HEADER", sender);
Message.send("TEAM_HELP_LIST", sender);
Message.send("TEAM_HELP_INFO", sender);
Message.send("TEAM_HELP_TP", sender);
if(!(sender instanceof ProxiedPlayer))
return;
Message.send("TEAM_HELP_TP", sender);
ProxiedPlayer player = (ProxiedPlayer) sender;
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
@ -112,95 +114,26 @@ public class TeamCommand extends BasicCommand {
}
}
@Override
public void execute(CommandSender sender, String[] args){
if(args.length < 1){
help(sender);
return;
}
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
@Register(value = "create", description = "TEAM_CREATE_USAGE")
public void create(@Validator("isNotInTeam") ProxiedPlayer player, @Length(min = 2, max = 4) @ErrorMessage("TEAM_KUERZEL_LENGTH") String kuerzel, @Length(min = 4, max = 15) @ErrorMessage("TEAM_NAME_LENGTH") String name){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
switch(args[0].toLowerCase()){
case "create":
create(player, user, team, args);
break;
case "join":
join(player, user, args);
break;
case "stepback":
stepBack(player,user,team);
break;
case "leave":
leave(player, user, team);
break;
case "invite":
invite(player, user, team, args);
break;
case "remove":
remove(player, user, team, args);
break;
case "changekuerzel":
changekuerzel(player, user, team, args);
break;
case "changename":
changename(player, user, team, args);
break;
case "promote":
promote(player, user, team, args);
break;
case "changecolor":
changeColor(player, user, team);
break;
case "info":
info(player, user, team, args);
break;
case "list":
list(player, args);
break;
case "event":
event(player, user, team, args);
break;
case "tp":
tp(player, user, team, args);
break;
case "server":
server(player, user, team, args);
break;
default:
help(player);
}
}
private void create(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
if(unwantedInTeam(player, user))
if(checkTeamKuerzel(player, team, kuerzel))
return;
if(args.length < 3){
Message.send("TEAM_CREATE_USAGE", player);
return;
}
if(checkTeamKuerzel(player, team, args[1]))
if(checkTeamName(player, team, name))
return;
if(checkTeamName(player, team, args[2]))
return;
Team.create(args[1], args[2]);
user.setTeam(Team.get(args[1]).getTeamId());
Team.create(kuerzel, name);
user.setTeam(Team.get(kuerzel).getTeamId());
user.setLeader(true);
Message.send("TEAM_CREATE_CREATED", player, args[2]);
Message.send("TEAM_CREATE_CREATED", player, name);
}
private void join(ProxiedPlayer player, SteamwarUser user, String[] args){
if(unwantedInTeam(player, user))
return;
@Register("join")
public void join(@Validator("isNotInTeam") ProxiedPlayer player, String... args){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
if(notDuringEvent(player))
return;
@ -216,7 +149,7 @@ public class TeamCommand extends BasicCommand {
if(invs.size() == 1){
t = invs.get(0);
}else{
if(args.length != 2){
if(args.length != 1){
Message.send("TEAM_JOIN_USAGE", player);
StringBuilder sb = new StringBuilder();
for(int inv : invs){
@ -229,7 +162,7 @@ public class TeamCommand extends BasicCommand {
for(int inv : invs){
Team team = Team.get(inv);
if(team.getTeamName().equals(args[1])){
if(team.getTeamName().equals(args[0])){
t = inv;
break;
}
@ -246,11 +179,12 @@ public class TeamCommand extends BasicCommand {
Message.send("TEAM_JOIN_JOINED", player, Team.get(t).getTeamName());
}
private void stepBack(ProxiedPlayer player, SteamwarUser user, Team team) {
if(notLeader(player, user, team))
return;
@Register("stepback")
public void stepBack(@Validator("isLeader") ProxiedPlayer player) {
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
if(team.size() > 1 && team.getMembers().stream().map(SteamwarUser::get).filter(member -> user != member).noneMatch(SteamwarUser::isLeader)){
if(noRemainingLeaders(team, user)){
Message.send("TEAM_OTHER_LEADER_REQUIRED", player);
return;
}
@ -259,12 +193,13 @@ public class TeamCommand extends BasicCommand {
Message.send("TEAM_STEP_BACK", player);
}
private void leave(ProxiedPlayer player, SteamwarUser user, Team team){
if(notInTeam(player, user))
return;
@Register("leave")
public void leave(@Validator("isInTeam") ProxiedPlayer player){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
int teamSize = team.size();
if(teamSize > 1 && user.isLeader() && team.getMembers().stream().map(SteamwarUser::get).filter(member -> user != member).noneMatch(SteamwarUser::isLeader)){
if(teamSize > 1 && user.isLeader() && noRemainingLeaders(team, user)) {
Message.send("TEAM_OTHER_LEADER_REQUIRED", player);
return;
}
@ -278,20 +213,19 @@ public class TeamCommand extends BasicCommand {
Message.send("TEAM_LEAVE_LEFT", player);
}
private boolean noRemainingLeaders(Team team, SteamwarUser except) {
return SteamwarUser.getTeam(team.getTeamId()).stream().filter(member -> except.getId() != member.getId()).noneMatch(SteamwarUser::isLeader);
}
private void invite(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
if(notLeader(player, user, team))
return;
@Register(value = "invite", description = "TEAM_INVITE_USAGE")
public void invite(@Validator("isLeader") ProxiedPlayer player, @AllowNull SteamwarUser target){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
if(notDuringEvent(player))
return;
if(args.length != 2){
Message.send("TEAM_INVITE_USAGE", player);
return;
}
SteamwarUser target = SteamwarUser.get(args[1]);
if(target == null){
Message.send("TEAM_INVITE_NO_PLAYER", player);
return;
@ -310,22 +244,17 @@ public class TeamCommand extends BasicCommand {
teamInvitations.get(target.getId()).add(team.getTeamId());
Message.send("TEAM_INVITE_INVITED", player, args[1]);
ProxiedPlayer p = ProxyServer.getInstance().getPlayer(target.getUuid());
Message.send("TEAM_INVITE_INVITED", player, target.getUserName());
ProxiedPlayer p = ProxyServer.getInstance().getPlayer(target.getUUID());
if(p != null)
Message.send("TEAM_INVITE_INVITED_TARGET", p, team.getTeamColor(), team.getTeamName());
}
private void remove(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
if(notLeader(player, user, team))
return;
@Register(value = "remove", description = "TEAM_REMOVE_USAGE")
public void remove(@Validator("isLeader") ProxiedPlayer player, @AllowNull @Mapper("memberList") SteamwarUser target){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
if(args.length != 2){
Message.send("TEAM_REMOVE_USAGE", player);
return;
}
SteamwarUser target = SteamwarUser.get(args[1]);
if(target == null){
Message.send("TEAM_REMOVE_NOT_PLAYER", player);
return;
@ -355,64 +284,71 @@ public class TeamCommand extends BasicCommand {
target.setTeam(0);
Message.send("TEAM_REMOVE_REMOVED", player);
ProxiedPlayer p = ProxyServer.getInstance().getPlayer(target.getUuid());
ProxiedPlayer p = ProxyServer.getInstance().getPlayer(target.getUUID());
if(p != null)
Message.send("TEAM_REMOVE_REMOVED_TARGET", player);
}
private void changekuerzel(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
if(notLeader(player, user, team))
return;
@Mapper(value = "memberList", local = true)
public TypeMapper<SteamwarUser> memberList() {
return new TypeMapper<SteamwarUser>() {
@Override
public SteamwarUser map(CommandSender commandSender, String[] previousArguments, String s) {
return SteamwarUser.get(s);
}
@Override
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
if (!(sender instanceof ProxiedPlayer)) return Collections.emptyList();
ProxiedPlayer player = (ProxiedPlayer) sender;
Team team = Team.get(SteamwarUser.get(player.getUniqueId()).getTeam());
return team.getMembers().stream()
.map(SteamwarUser::get)
.map(SteamwarUser::getUserName)
.collect(Collectors.toList());
}
};
}
@Register(value = "changekurzel", description = "TEAM_KUERZEL_USAGE")
public void changekuerzel(@Validator("isLeader") ProxiedPlayer player, @Length(min = 2, max = 4) @ErrorMessage("TEAM_KUERZEL_LENGTH") String kuerzel){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
if(notDuringEvent(player))
return;
if(args.length < 2){
Message.send("TEAM_KUERZEL_USAGE", player);
return;
}
if(checkTeamKuerzel(player, team, args[1]))
if(checkTeamKuerzel(player, team, kuerzel))
return;
team.setTeamKuerzel(args[1]);
team.setTeamKuerzel(kuerzel);
Message.send("TEAM_KUERZEL_CHANGED", player);
}
private void changename(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
if(notLeader(player, user, team))
return;
@Register(value = "changename", description = "TEAM_NAME_USAGE")
public void changename(@Validator("isLeader") ProxiedPlayer player, @Length(min = 4, max = 15) @ErrorMessage("TEAM_NAME_LENGTH") String name){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
if(notDuringEvent(player))
return;
if(args.length < 2){
Message.send("TEAM_NAME_USAGE", player);
return;
}
if(checkTeamName(player, team, args[1]))
if(checkTeamName(player, team, name))
return;
team.setTeamName(args[1]);
team.setTeamName(name);
Message.send("TEAM_NAME_CHANGED", player);
}
private void promote(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
if(notLeader(player, user, team))
return;
@Register(value = "promote", description = "TEAM_LEADER_USAGE")
public void promote(@Validator("isLeader") ProxiedPlayer player, @AllowNull @Mapper("memberList") SteamwarUser target){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
if(notDuringEvent(player))
return;
if(args.length < 2){
Message.send("TEAM_LEADER_USAGE", player);
return;
}
SteamwarUser target = SteamwarUser.get(args[1]);
if(target == null){
Message.send("TEAM_LEADER_NOT_USER", player, args[1]);
Message.send("TEAM_LEADER_NOT_USER", player);
return;
}
@ -422,36 +358,33 @@ public class TeamCommand extends BasicCommand {
}
target.setLeader(true);
Message.send("TEAM_LEADER_PROMOTED", player, args[1]);
Message.send("TEAM_LEADER_PROMOTED", player, target.getUserName());
}
private String playerName(SteamwarUser user){
return ProxyServer.getInstance().getPlayer(user.getUuid()) != null ? "§a" + user.getUserName() : "§e" + user.getUserName();
return ProxyServer.getInstance().getPlayer(user.getUUID()) != null ? "§a" + user.getUserName() : "§e" + user.getUserName();
}
private void info(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
if(args.length == 1 && user.getTeam() == 0){
Message.send("TEAM_INFO_USAGE", player);
return;
}else if(user.getTeam() == 0 || args.length == 2){
team = Team.get(args[1]);
}
if(team == null){
Message.send("UNKNOWN_TEAM", player);
return;
}
@Register("info")
public void info(@Validator("isInTeam") ProxiedPlayer player){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
info(player, team);
}
@Register(value = "info", description = "TEAM_INFO_USAGE")
public void info(ProxiedPlayer player, @ErrorMessage("UNKNOWN_TEAM") Team team){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Message.sendPrefixless("TEAM_INFO_TEAM", player, team.getTeamName(), team.getTeamColor(), team.getTeamKuerzel());
List<SteamwarUser> users = team.getMembers().stream().map(SteamwarUser::get).collect(Collectors.toList());
Message.sendPrefixless("TEAM_INFO_LEADER", player, getMemberList(users, true));
Message.sendPrefixless("TEAM_INFO_LEADER", player, users.stream().filter(SteamwarUser::isLeader).count(), getMemberList(users, true));
String members = getMemberList(users, false);
if(members.length() > 0) {
Message.sendPrefixless("TEAM_INFO_MEMBER", player, members);
Message.sendPrefixless("TEAM_INFO_MEMBER", player, users.stream().filter(u -> !u.isLeader()).count(), members);
}
Set<Event> events = TeamTeilnahme.getEvents(team.getTeamId());
@ -470,21 +403,10 @@ public class TeamCommand extends BasicCommand {
return sb.toString();
}
private void list(ProxiedPlayer player, String[] args){
@Register("list")
public void list(ProxiedPlayer player, @Min(intValue = 1) @OptionalValue("1") @ErrorMessage("TEAM_LIST_NOT_PAGE") int page){
final int TEAMS_PER_PAGE = 10;
int page;
if(args.length > 1){
try{
page = Integer.parseInt(args[1]);
}catch(NumberFormatException e){
Message.send("TEAM_LIST_NOT_PAGE", player);
return;
}
}else
page = 1;
List<Team> all = Team.getAll();
final int lastPage = ((all.size() - 1) / 10) + 1;
if(page < 1 || page > lastPage){
@ -521,34 +443,29 @@ public class TeamCommand extends BasicCommand {
player.sendMessage(beforePage);
}
private void event(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
if(notInTeam(player, user))
return;
@Register("event")
public void event(@Validator("isInTeam") ProxiedPlayer player) {
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
if(args.length < 2){
Message.send("TEAM_EVENT_USAGE", player);
Set<Event> events = TeamTeilnahme.getEvents(team.getTeamId());
if(!events.isEmpty()){
Message.send("TEAM_EVENT_HEADER", player);
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(Message.parse("EVENT_DATE_FORMAT", player));
for(Event e : events)
Message.sendPrefixless("TEAM_EVENT_EVENT", player, e.getStart().toLocalDateTime().format(dateFormat), e.getEventName());
}
return;
Message.send("TEAM_EVENT_USAGE", player);
Set<Event> events = TeamTeilnahme.getEvents(team.getTeamId());
if(!events.isEmpty()){
Message.send("TEAM_EVENT_HEADER", player);
DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(Message.parse("EVENT_DATE_FORMAT", player));
for(Event e : events)
Message.sendPrefixless("TEAM_EVENT_EVENT", player, e.getStart().toLocalDateTime().format(dateFormat), e.getEventName());
}
}
if(notLeader(player, user, team))
return;
@Register("event")
public void event(@Validator("isLeader") ProxiedPlayer player, Event event){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
if(notDuringEvent(player))
return;
Event event = Event.get(args[1]);
if(event == null){
Message.send("TEAM_EVENT_NO_EVENT", player);
return;
}
if(Instant.now().isAfter(event.getDeadline().toInstant())){
Message.send("TEAM_EVENT_OVER", player);
return;
@ -564,50 +481,62 @@ public class TeamCommand extends BasicCommand {
}
}
private void tp(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
if(args.length == 1){
if(notInTeam(player, user))
return;
tp(player, team);
return;
}
Team targetTeam = Team.get(args[1]);
if(targetTeam == null){
Message.send("TEAM_TP_NO_TEAM", player);
return;
}
tp(player, targetTeam);
@Register("tp")
public void tp(@Validator("isInTeam") ProxiedPlayer player) {
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
tp(player, team);
}
private void tp(ProxiedPlayer player, Team targetTeam) {
if (targetTeam.getAddress() == null) {
@Register("tp")
public void tp(ProxiedPlayer player, @ErrorMessage("TEAM_TP_NO_TEAM") @Mapper("teamWithTeamServer") Team targetTeam) {
if (targetTeam.getAddress() == null || targetTeam.getAddress().isEmpty()) {
Message.send("TEAM_NO_ADDRESS", player);
return;
}
InetSocketAddress address = new InetSocketAddress(targetTeam.getAddress(), targetTeam.getPort());
ServerInfo serverInfo = Storage.teamServers.computeIfAbsent(targetTeam.getTeamId(), integer -> {
InetSocketAddress address = new InetSocketAddress(targetTeam.getAddress(), targetTeam.getPort());
ServerInfo info = ProxyServer.getInstance().constructServerInfo("Team " + targetTeam.getTeamKuerzel(), address, "SteamWar.de - Teamserver", false);
ProxyServer.getInstance().getServers().put(info.getName(), info);
return info;
});
if (!address.equals(serverInfo.getSocketAddress())) {
serverInfo = Storage.teamServers.remove(targetTeam.getTeamId());
ProxyServer.getInstance().getServers().remove(serverInfo.getName());
tp(player, targetTeam);
return;
}
player.connect(ServerConnectRequest.builder()
.target(serverInfo)
.connectTimeout(BungeeCord.getInstance().getConfig().getServerConnectTimeout())
.retry(false)
.reason(ServerConnectEvent.Reason.PLUGIN)
.callback((success, error) -> {
if (error != null) {
Message.send("TEAM_OFFLINE", player);
}
})
.build());
/*
((UserConnection) player).connect(serverInfo, (success, error) -> {
if (error != null) {
Message.send("TEAM_OFFLINE", player);
}
}, false, ServerConnectEvent.Reason.PLUGIN, BungeeCord.getInstance().getConfig().getServerConnectTimeout(), false);
*/
}
private void server(ProxiedPlayer player, SteamwarUser user, Team team, String[] args){
if(notLeader(player, user, team))
return;
if (user.isPunishedWithMessage(ChatSender.of(player), Punishment.PunishmentType.NoTeamServer)) {
@Register(value = "server", description = "TEAM_SERVER_USAGE")
public void server(@Validator("isLeader") ProxiedPlayer player, String server, @Min(intValue = 1) @Max(intValue = 65535) @ErrorMessage("TEAM_SERVER_PORT_INVALID") int port){
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
if (PunishmentCommand.isPunishedWithMessage(ChatSender.of(player), Punishment.PunishmentType.NoTeamServer)) {
return;
}
if (args.length < 2) {
Message.send("TEAM_SERVER_USAGE", player);
return;
}
String server = args[1];
try {
if (isLocalhost(InetAddress.getByName(server))) {
Message.send("TEAM_SERVER_ADDRESS_INVALID", player);
@ -617,26 +546,14 @@ public class TeamCommand extends BasicCommand {
Message.send("TEAM_SERVER_ADDRESS_INVALID", player);
return;
}
int port = 25565;
if (args.length == 3) {
try {
port = Integer.parseInt(args[2]);
if (port < 1 || port > 65535) {
Message.send("TEAM_SERVER_PORT_INVALID", player);
return;
}
} catch (NumberFormatException e) {
Message.send("TEAM_SERVER_PORT_INVALID", player);
return;
}
}
team.setAddress(server);
team.setPort(port);
Storage.teamServers.remove(team.getTeamId());
Message.send("TEAM_SERVER_SET", player);
}
private static boolean isLocalhost(InetAddress addr) {
public static boolean isLocalhost(InetAddress addr) {
// Check if the address is a valid special local or loop back
if (addr.isAnyLocalAddress() || addr.isLoopbackAddress())
return true;
@ -649,9 +566,10 @@ public class TeamCommand extends BasicCommand {
}
}
private void changeColor(ProxiedPlayer player, SteamwarUser user, Team team) {
if(notLeader(player, user, team))
return;
@Register("color")
public void changeColor(@Validator("isLeader") ProxiedPlayer player) {
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
Team team = Team.get(user.getTeam());
if(notDuringEvent(player))
return;
@ -671,12 +589,115 @@ public class TeamCommand extends BasicCommand {
inv.open();
}
private boolean checkTeamName(ProxiedPlayer player, Team team, String arg){
if(arg.length() < 4 || arg.length() > 15){
Message.send("TEAM_NAME_LENGHT", player);
return true;
}
@ClassMapper(Event.class)
public TypeMapper<Event> eventTypeMapper() {
return new TypeMapper<Event>() {
@Override
public Event map(CommandSender commandSender, String[] previousArguments, String s) {
return Event.get(s);
}
@Override
public boolean validate(CommandSender sender, Event value, MessageSender messageSender) {
if (value == null) {
messageSender.send("TEAM_EVENT_NO_EVENT", sender);
return false;
} else {
return true;
}
}
@Override
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
return Event.getComing().stream().map(Event::getEventName).collect(Collectors.toList());
}
};
}
@Validator(value = "isNotInTeam", local = true)
public TypeValidator<ProxiedPlayer> isNotInTeamValidator() {
return (sender, value, messageSender) -> {
if (!(sender instanceof ProxiedPlayer)) return false;
ProxiedPlayer player = (ProxiedPlayer) sender;
SteamwarUser steamwarUser = SteamwarUser.get(player.getUniqueId());
if (steamwarUser.getTeam() != 0) {
messageSender.send("TEAM_IN_TEAM");
return false;
}
return true;
};
}
@Validator(value = "isInTeam", local = true)
public TypeValidator<ProxiedPlayer> isInTeamValidator() {
return (sender, value, messageSender) -> {
if (!(sender instanceof ProxiedPlayer)) return false;
ProxiedPlayer player = (ProxiedPlayer) sender;
SteamwarUser steamwarUser = SteamwarUser.get(player.getUniqueId());
if (steamwarUser.getTeam() == 0) {
messageSender.send("TEAM_NOT_IN_TEAM");
return false;
}
return true;
};
}
@Validator(value = "isLeader", local = true)
public TypeValidator<ProxiedPlayer> isLeaderValidator() {
return (sender, value, messageSender) -> {
if (!(sender instanceof ProxiedPlayer)) return false;
ProxiedPlayer player = (ProxiedPlayer) sender;
SteamwarUser steamwarUser = SteamwarUser.get(player.getUniqueId());
if (steamwarUser.getTeam() == 0) {
messageSender.send("TEAM_NOT_IN_TEAM");
return false;
}
if (!steamwarUser.isLeader()) {
messageSender.send("TEAM_NOT_LEADER");
return false;
}
return true;
};
}
@ClassMapper(Team.class)
@Cached(global = true, cacheDuration = 60)
public TypeMapper<Team> team() {
return new TypeMapper<Team>() {
@Override
public Team map(CommandSender commandSender, String[] previousArguments, String s) {
return Team.get(s);
}
@Override
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
return Team.getAll().stream()
.flatMap(team -> Stream.of(team.getTeamName(), team.getTeamKuerzel()))
.collect(Collectors.toList());
}
};
}
@Mapper(value = "teamWithTeamServer", local = true)
@Cached(global = true, cacheDuration = 60)
public TypeMapper<Team> teamWithTeamServer() {
return new TypeMapper<Team>() {
@Override
public Team map(CommandSender commandSender, String[] previousArguments, String s) {
return Team.get(s);
}
@Override
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
return Team.getAll().stream()
.filter(team -> team.getAddress() != null && !team.getAddress().isEmpty())
.flatMap(team -> Stream.of(team.getTeamName(), team.getTeamKuerzel()))
.collect(Collectors.toList());
}
};
}
private boolean checkTeamName(ProxiedPlayer player, Team team, String arg){
Team t = Team.get(arg);
if(t != null && t.getTeamId() != team.getTeamId()){
Message.send("TEAM_NAME_TAKEN", player);
@ -686,11 +707,6 @@ public class TeamCommand extends BasicCommand {
}
private boolean checkTeamKuerzel(ProxiedPlayer player, Team team, String arg){
if(arg.length() < 2 || arg.length() > 4){
Message.send("TEAM_KUERZEL_LENGHT", player);
return true;
}
Team t = Team.get(arg);
if(t != null && (team == null || t.getTeamId() != team.getTeamId())){
Message.send("TEAM_KUERZEL_TAKEN", player);
@ -699,32 +715,6 @@ public class TeamCommand extends BasicCommand {
return false;
}
private boolean unwantedInTeam(ProxiedPlayer player, SteamwarUser user){
if(user.getTeam() != 0){
Message.send("TEAM_IN_TEAM", player);
return true;
}
return false;
}
private boolean notInTeam(ProxiedPlayer player, SteamwarUser user){
if(user.getTeam() == 0){
Message.send("TEAM_NOT_IN_TEAM", player);
return true;
}
return false;
}
private boolean notLeader(ProxiedPlayer player, SteamwarUser user, Team team){
if(notInTeam(player, user))
return true;
if(!user.isLeader()){
Message.send("TEAM_NOT_LEADER", player);
return true;
}
return false;
}
private boolean notDuringEvent(ProxiedPlayer player){
if(Event.get() != null){
Message.send("TEAM_NOT_IN_EVENT", player);
@ -732,37 +722,4 @@ public class TeamCommand extends BasicCommand {
}
return false;
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args){
List<String> tab = new ArrayList<>();
if(args.length == 1){
tab.add("create");
tab.add("join");
tab.add("invite");
tab.add("stepback");
tab.add("leave");
tab.add("info");
tab.add("remove");
tab.add("event");
tab.add("changekuerzel");
tab.add("changename");
tab.add("promote");
tab.add("changecolor");
tab.add("tp");
tab.add("server");
}else if(args.length == 2){
if(args[1].equalsIgnoreCase("event")){
List<Event> coming = Event.getComing();
coming.forEach(event -> tab.add(event.getEventName()));
}else if(args[1].equalsIgnoreCase("join") || args[1].equalsIgnoreCase("info") || args[1].equalsIgnoreCase("tp")){
List<Team> teams = Team.getAll();
teams.forEach(team -> {
tab.add(team.getTeamName());
tab.add(team.getTeamKuerzel());
});
}
}
return tab;
}
}

Datei anzeigen

@ -20,30 +20,28 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.listeners.ChatListener;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.command.SWCommand;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class TeamchatCommand extends BasicCommand {
public class TeamchatCommand extends SWCommand {
public TeamchatCommand() {
super("tc", "","teamchat");
}
@Override
public void execute(CommandSender s, String[] args) {
ChatSender sender = ChatSender.of(s);
if(args.length == 0){
sender.system("TC_USAGE");
return;
}
@Register(description = "TC_USAGE")
public void genericCommand(ProxiedPlayer player, @ErrorMessage(value = "TC_USAGE", allowEAs = false) String... args) {
ChatSender sender = ChatSender.of(player);
SteamwarUser user = sender.user();
if(user.getTeam() == 0){
sender.system("TC_NO_TEAM");
return;
}
ChatListener.sendChat(sender, ChatSender.allReceivers().filter(player -> player.user().getTeam() == user.getTeam()), "CHAT_TEAM", null, String.join(" ", args));
ChatListener.sendChat(sender, ChatSender.allReceivers().filter(p -> p.user().getTeam() == user.getTeam()), "CHAT_TEAM", null, String.join(" ", args));
}
}

Datei anzeigen

@ -20,7 +20,11 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.sql.*;
import de.steamwar.sql.*;
import de.steamwar.bungeecore.util.BauLock;
import de.steamwar.bungeecore.util.Chat19;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.CommandSender;
@ -28,88 +32,116 @@ import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.ArrayList;
import java.util.*;
public class TpCommand extends BasicCommand {
public class TpCommand extends SWCommand {
public TpCommand(){
super("join", null, "tp", "teleport");
}
@Override
public void execute(CommandSender s, String[] args) {
if(!(s instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) s;
@Register
public void genericCommand(ProxiedPlayer p) {
ChatSender.of(p).system(Event.get() == null ? "TP_USAGE" : "TP_USAGE_EVENT");
}
ChatSender sender = ChatSender.of(player);
if(args.length == 0){
if(Event.get() == null)
sender.system("TP_USAGE");
else
sender.system("TP_USAGE_EVENT");
return;
}
ServerInfo server = getTarget(player, args[0]);
@Register
public void teleportCommand(ProxiedPlayer p, @Mapper("to") String to, String... rest) {
ServerInfo server = getTarget(to);
//Give control of teleport command to server
if(server == null) {
player.chat("/tp " + String.join(" ", args));
if (server == p.getServer().getInfo() || server == null) {
if (rest.length == 0) {
Chat19.chat(p, "/tp " + to);
} else {
Chat19.chat(p, "/tp " + to + " " + String.join(" ", rest));
}
return;
}
teleport(player, server);
teleport(p, server);
}
@Override
public Iterable<String> onTabComplete(CommandSender commandSender, String[] args) {
if(args.length > 0)
return allPlayers(args[args.length - 1]);
return new ArrayList<>();
@Mapper("to")
@Cached(cacheDuration = 10)
public TypeMapper<String> tabCompleter() {
return new TypeMapper<String>() {
@Override
public String map(CommandSender commandSender, String[] previousArguments, String s) {
return s;
}
@Override
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
List<String> list = new ArrayList<>();
for (ProxiedPlayer player : BungeeCord.getInstance().getPlayers()) {
list.add(player.getName());
}
if (Event.get() != null) {
EventStarter.getEventServer().keySet().forEach(teamId -> {
Team team = Team.get(teamId);
list.add(team.getTeamName());
list.add(team.getTeamKuerzel());
});
}
if (Storage.teamServers.containsValue(((ProxiedPlayer) sender).getServer().getInfo())) {
Storage.directTabItems.getOrDefault((ProxiedPlayer) sender, Collections.emptyMap()).forEach((uuid, item) -> {
list.add(item.getUsername());
});
}
return list;
}
};
}
public static void teleport(ProxiedPlayer player, ServerInfo server){
public static void teleport(ProxiedPlayer player, ServerInfo server) {
ChatSender sender = ChatSender.of(player);
if(CheckCommand.isChecking(player)){
sender.system("CHECK_CHECKING");
return;
}
String serverPerm = BungeeCore.serverPermissions.get(server.getName());
Subserver subserver = Subserver.getSubserver(server);
if (subserver != null && subserver.getType() == Servertype.ARENA) {
if (!sender.user().isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer))
SubserverSystem.sendPlayer(subserver, player);
} else if(subserver instanceof Bauserver) {
Bauserver bauserver = (Bauserver) subserver;
ProxiedPlayer checker = BungeeCord.getInstance().getPlayer(bauserver.getOwner());
if (checker != null && CheckCommand.isChecking(checker)) {
SteamwarUser steamwarUser = SteamwarUser.get(player);
if (steamwarUser.getUserGroup().isCheckSchematics() || CheckCommand.getCheckingSchem(checker).getOwner() == steamwarUser.getId()) {
SubserverSystem.sendPlayer(subserver, player);
} else {
sender.system("JOIN_PLAYER_BLOCK");
}
} else if (bauserver.getOwner().equals(player.getUniqueId()) || BauweltMember.getBauMember(bauserver.getOwner(), player.getUniqueId()) != null) {
SubserverSystem.sendPlayer(subserver, player);
} else {
SubserverSystem.sendDeniedMessage(player, bauserver.getOwner());
sender.system("JOIN_PLAYER_BLOCK");
}
} else if (serverPerm != null && !player.hasPermission(serverPerm)) {
sender.system("JOIN_PLAYER_BLOCK");
} else if (serverPerm == null && !player.getGroups().contains("team")) {
sender.system("JOIN_PLAYER_BLOCK");
} else {
if(subserver == null) {
player.connect(server);
return;
}
switch (subserver.getType()) {
case ARENA:
if (PunishmentCommand.isPunishedWithMessage(sender, Punishment.PunishmentType.NoFightServer))
return;
break;
case BAUSERVER:
Bauserver bauserver = (Bauserver) subserver;
ProxiedPlayer checker = BungeeCord.getInstance().getPlayer(bauserver.getOwner());
if (checker != null && CheckCommand.isChecking(checker)) {
if (!sender.user().hasPerm(UserPerm.CHECK) && CheckCommand.getCheckingSchem(checker).getOwner() != sender.user().getId()) {
sender.system("JOIN_PLAYER_BLOCK");
return;
}
} else if (BauLock.checkNotifyLocked(SteamwarUser.get(bauserver.getOwner()), player)) {
return;
} else if (!bauserver.getOwner().equals(player.getUniqueId()) && BauweltMember.getBauMember(bauserver.getOwner(), player.getUniqueId()) == null) {
SubserverSystem.sendDeniedMessage(player, bauserver.getOwner());
sender.system("JOIN_PLAYER_BLOCK");
return;
}
break;
case BUILDER:
if(!sender.user().hasPerm(UserPerm.BUILD)) {
sender.system("JOIN_PLAYER_BLOCK");
return;
}
break;
}
SubserverSystem.sendPlayer(subserver, player);
}
private static ServerInfo getTarget(ProxiedPlayer player, String arg) {
private static ServerInfo getTarget(String arg) {
ServerInfo server = null;
//Get target player server
@ -127,9 +159,6 @@ public class TpCommand extends BasicCommand {
}
}
if(server == player.getServer().getInfo())
server = null;
return server;
}
}

Datei anzeigen

@ -24,9 +24,12 @@ import de.steamwar.bungeecore.inventory.SWInventory;
import de.steamwar.bungeecore.inventory.SWItem;
import de.steamwar.bungeecore.inventory.SWListInv;
import de.steamwar.bungeecore.inventory.SWStreamInv;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.Tutorial;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.bungeecore.util.Chat19;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeValidator;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.Tutorial;
import de.steamwar.sql.UserPerm;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
@ -35,69 +38,53 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.stream.Collectors;
public class TutorialCommand extends BasicCommand {
public class TutorialCommand extends SWCommand {
public TutorialCommand() {
super("tutorial", null);
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
@Register
public void genericCommand(ProxiedPlayer player) {
openInventory(player, true, false);
}
if(args.length == 0) {
openInventory(player, true, false);
@Register("rate")
public void rate(ProxiedPlayer player) {
Chat19.chat(player, "/tutorial rate");
}
@Register("rate")
public void rate(ProxiedPlayer player, int id) {
Tutorial tutorial = Tutorial.get(id);
if(tutorial == null) {
Chat19.chat(player, "/tutorial rate"); // Catch players manually entering numbers
return;
}
switch(args[0].toLowerCase()) {
case "rate":
if(args.length < 2) {
player.chat("/tutorial rate");
return;
}
rate(player, tutorial);
}
int id;
try {
id = Integer.parseInt(args[1]);
} catch (NumberFormatException e) {
BungeeCore.get().getLogger().log(Level.SEVERE, "rate executed with non number: " + args[1]);
return;
}
@Register(value = "create", description = "TUTORIAL_CREATE_HELP")
public void create(ProxiedPlayer player, String material, String... name) {
create(player, String.join(" ", name), material.toUpperCase());
}
Tutorial tutorial = Tutorial.get(id);
if(tutorial == null) {
BungeeCore.get().getLogger().log(Level.SEVERE, "rate executed with nonexistent id: " + id);
return;
}
@Register("own")
public void own(ProxiedPlayer player) {
openInventory(player, false, true);
}
rate(player, tutorial);
break;
case "create":
if(args.length < 3) {
Message.send("TUTORIAL_CREATE_HELP", player);
return;
}
@Register("unreleased")
public void unreleased(@Validator("unreleased") ProxiedPlayer player) {
openInventory(player, false, false);
}
create(player, Arrays.stream(args).skip(2).collect(Collectors.joining(" ")), args[1].toUpperCase());
break;
case "own":
openInventory(player, false, true);
break;
case "unreleased":
if (SteamwarUser.get(player.getUniqueId()).getUserGroup().isTeamGroup()) {
openInventory(player, false, false);
break;
}
default:
Message.send("TUTORIAL_CREATE_HELP", player);
Message.send("TUTORIAL_OWN_HELP", player);
}
@Validator("unreleased")
public TypeValidator<ProxiedPlayer> unreleasedChecker() {
return (sender, value, messageSender) -> (SteamwarUser.get((value).getUniqueId()).hasPerm(UserPerm.TEAM));
}
private void openInventory(ProxiedPlayer player, boolean released, boolean own) {
@ -107,36 +94,37 @@ public class TutorialCommand extends BasicCommand {
player,
Message.parse("TUTORIAL_TITLE", player),
(click, tutorial) -> {
if(!released && click.isShiftClick() && user.getUserGroup().isTeamGroup() && user != tutorial.creator()) {
if(!released && click.isShiftClick() && user.hasPerm(UserPerm.TEAM) && user.getId() != tutorial.getCreator()) {
tutorial.release();
openInventory(player, released, own);
return;
} else if(own && click.isShiftClick() && click.isRightClick()) {
tutorial.delete();
SubserverSystem.deleteFolder(VelocityCore.local, world(tutorial).getPath());
openInventory(player, released, own);
return;
}
new ServerStarter().tutorial(player, tutorial).start();
},
page -> (own ? Tutorial.getOwn(user, page, 45) : Tutorial.getPage(page, 45, released)).stream().map(tutorial -> new SWListInv.SWListEntry<>(getTutorialItem(player, tutorial, own), tutorial)).collect(Collectors.toList())
page -> (own ? Tutorial.getOwn(user.getId(), page, 45) : Tutorial.getPage(page, 45, released)).stream().map(tutorial -> new SWListInv.SWListEntry<>(getTutorialItem(player, tutorial, own), tutorial)).collect(Collectors.toList())
).open();
}
private SWItem getTutorialItem(ProxiedPlayer player, Tutorial tutorial, boolean personalHighlights) {
SWItem item = new SWItem(tutorial.item(), Message.parse("TUTORIAL_NAME", player, tutorial.name()));
SWItem item = new SWItem(tutorial.getItem(), Message.parse("TUTORIAL_NAME", player, tutorial.getName()));
item.setHideAttributes(true);
List<String> lore = new ArrayList<>();
lore.add(Message.parse("TUTORIAL_BY", player, tutorial.creator().getUserName()));
lore.add(Message.parse("TUTORIAL_STARS", player, String.format("%.1f", tutorial.stars())));
lore.add(Message.parse("TUTORIAL_BY", player, SteamwarUser.get(tutorial.getCreator()).getUserName()));
lore.add(Message.parse("TUTORIAL_STARS", player, String.format("%.1f", tutorial.getStars())));
if (personalHighlights)
lore.add(Message.parse("TUTORIAL_DELETE", player));
item.setLore(lore);
if (personalHighlights && tutorial.released())
if (personalHighlights && tutorial.isReleased())
item.setEnchanted(true);
return item;
@ -147,7 +135,7 @@ public class TutorialCommand extends BasicCommand {
int[] rates = new int[]{1, 2, 3, 4, 5};
new SWListInv<>(player, Message.parse("TUTORIAL_RATE_TITLE", player), Arrays.stream(rates).mapToObj(rate -> new SWListInv.SWListEntry<>(new SWItem("NETHER_STAR", Message.parse("TUTORIAL_RATE", player, rate)), rate)).collect(Collectors.toList()), (click, rate) -> {
tutorial.rate(user, rate);
tutorial.rate(user.getId(), rate);
SWInventory.close(player);
}).open();
}
@ -163,14 +151,18 @@ public class TutorialCommand extends BasicCommand {
}
subserver.execute("save-all");
ProxyServer.getInstance().getScheduler().schedule(BungeeCore.get(), () -> {
Tutorial tutorial = Tutorial.create(user, name, item);
File tutorialWorld = tutorial.world();
ProxyServer.getInstance().getScheduler().schedule(VelocityCore.get(), () -> {
Tutorial tutorial = Tutorial.create(user.getId(), name, item);
File tutorialWorld = world(tutorial);
if (tutorialWorld.exists())
SubserverSystem.deleteFolder(Node.local, tutorialWorld.getPath());
ServerStarter.copyWorld(Node.local, tempWorld.getPath(), tutorialWorld.getPath());
SubserverSystem.deleteFolder(VelocityCore.local, tutorialWorld.getPath());
ServerStarter.copyWorld(VelocityCore.local, tempWorld.getPath(), tutorialWorld.getPath());
Message.send("TUTORIAL_CREATED", player);
}, 1, TimeUnit.SECONDS);
}
private File world(Tutorial tutorial) {
return new File(ServerStarter.TUTORIAL_PATH, String.valueOf(tutorial.getTutorialId()));
}
}

Datei anzeigen

@ -0,0 +1,86 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2020 SteamWar.de-Serverteam
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.ArenaMode;
import de.steamwar.command.SWCommandUtils;
import de.steamwar.command.TypeMapper;
import de.steamwar.command.TypeValidator;
import de.steamwar.messages.ChatSender;
import de.steamwar.sql.Punishment;
import lombok.experimental.UtilityClass;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.Collection;
@UtilityClass
public class TypeMappers {
public static void init() {
SWCommandUtils.addValidator("arenaPlayer", arenaPlayer());
SWCommandUtils.addMapper("nonHistoricArenaMode", arenaModeTypeMapper(false));
SWCommandUtils.addMapper("historicArenaMode", arenaModeTypeMapper(true));
SWCommandUtils.addMapper("arenaMap", arenaMapTypeMapper());
}
private static TypeValidator<ProxiedPlayer> arenaPlayer() {
return (sender, value, messageSender) -> {
ChatSender player = ChatSender.of(value);
if (PunishmentCommand.isPunishedWithMessage(player, Punishment.PunishmentType.NoFightServer)) {
return false;
}
return true;
};
}
private static TypeMapper<ArenaMode> arenaModeTypeMapper(boolean historic) {
return new TypeMapper<ArenaMode>() {
@Override
public ArenaMode map(CommandSender commandSender, String[] previousArguments, String s) {
return ArenaMode.getByChat(s);
}
@Override
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
return ArenaMode.getAllChatNames(historic);
}
};
}
private static TypeMapper<String> arenaMapTypeMapper() {
return new TypeMapper<String>() {
@Override
public String map(CommandSender commandSender, String[] previousArguments, String s) {
if (previousArguments.length == 0) return null;
return ArenaMode.getByChat(previousArguments[previousArguments.length - 1]).convertToRealMapName(s);
}
@Override
public Collection<String> tabCompletes(CommandSender sender, String[] previousArguments, String s) {
if (previousArguments.length == 0) return null;
ArenaMode arenaMode = ArenaMode.getByChat(previousArguments[previousArguments.length - 1]);
if (arenaMode == null) return null;
return arenaMode.getMaps();
}
};
}
}

Datei anzeigen

@ -20,30 +20,22 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.IgnoreSystem;
import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.sql.IgnoreSystem;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.command.SWCommand;
import net.md_5.bungee.api.connection.ProxiedPlayer;
public class UnIgnoreCommand extends BasicCommand {
public class UnIgnoreCommand extends SWCommand {
public UnIgnoreCommand() {
super("unignore", null);
super("unignore");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(args.length < 1) {
Message.send("UNIGNORE_USAGE", sender);
return;
}
if (!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer p = (ProxiedPlayer) sender;
@Register(description = "UNIGNORE_USAGE")
public void genericCommand(ProxiedPlayer p, String toUnIgnore) {
SteamwarUser user = SteamwarUser.get(p.getUniqueId());
SteamwarUser target = SteamwarUser.get(args[0]);
SteamwarUser target = SteamwarUser.get(toUnIgnore);
if(target == null){
Message.send("UNIGNORE_NOT_PLAYER", p);
return;
@ -55,5 +47,4 @@ public class UnIgnoreCommand extends BasicCommand {
IgnoreSystem.unIgnore(user, target);
Message.send("UNIGNORE_UNIGNORED", p, target.getUserName());
}
}

Datei anzeigen

@ -19,31 +19,27 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.bot.AuthManager;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.command.SWCommand;
import net.dv8tion.jda.api.entities.Member;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.Base64;
public class VerifyCommand extends BasicCommand {
public class VerifyCommand extends SWCommand {
public VerifyCommand() {
super("verify", "");
super("verify");
}
@Override
public void execute(CommandSender sender, String[] strings) {
if(strings.length < 1) {
Message.send("VERIFY_USAGE", sender);
return;
}
@Register(description = "VERIFY_USAGE")
public void genericCommand(ProxiedPlayer sender, String code) {
byte[] bytes;
try {
bytes = Base64.getDecoder().decode(strings[0]);
bytes = Base64.getDecoder().decode(code);
} catch (IllegalArgumentException e) {
Message.send("VERIFY_INVALID", sender);
return;
@ -54,9 +50,9 @@ public class VerifyCommand extends BasicCommand {
return;
}
if(bytes[0] == 'D' && bytes[1] == 'C') {
Member member = AuthManager.connectAuth(SteamwarUser.get(sender.getName()), strings[0]);
Member member = AuthManager.connectAuth(SteamwarUser.get(sender.getName()), code);
if(member != null) {
BungeeCore.log(sender.getName() + " Verified with Discorduser: " + member.getIdLong());
VelocityCore.log(sender.getName() + " Verified with Discorduser: " + member.getIdLong());
Message.send("VERIFY_SUCCESS", sender, member.getUser().getAsTag());
} else {
Message.send("VERIFY_INVALID", sender);

Datei anzeigen

@ -19,67 +19,45 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.SWException;
import net.md_5.bungee.api.CommandSender;
import de.steamwar.command.SWCommand;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class WebregisterCommand extends BasicCommand {
public class WebpasswordCommand extends SWCommand {
public WebregisterCommand() {
super("webregister", null, "web", "webpw");
public WebpasswordCommand() {
super("webpassword", null, "webpw", "web");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
if(args.length != 1){
Message.send("WEB_USAGE", player);
@Register(description = "WEB_USAGE")
public void genericCommand(ProxiedPlayer player, String password) {
if(password.length() < 8) {
ChatSender.of(player).system("WEB_PASSWORD_LENGTH");
return;
}
ProcessBuilder pb = new ProcessBuilder("php", "/var/www/register.php", player.getName(), args[0]);
ProcessBuilder pb = new ProcessBuilder("php", "/var/www/register.php", player.getName(), password);
pb.redirectErrorStream(true);
try {
Process regProcess = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(regProcess.getInputStream()));
String errorLine;
boolean error = false;
while((errorLine = reader.readLine()) != null){
switch(errorLine){
case "username_exists":
Message.send("WEB_ALREADY", player);
break;
case "email_exists":
Message.send("WEB_ALREADY_EMAIL", player);
// SWException.log("Bungee", "Duplicate E-Mail", player.getName() + " " + args[0]);
break;
case "invalid_email":
Message.send("WEB_NOT_EMAIL", player);
break;
case "email_updated":
Message.send("WEB_EMAIL_REFRESH", player);
break;
default:
Message.send("WEB_INTERNAL_ERROR", player);
SWException.log("Bungee", "Unknown Wordpress User Creation Error", errorLine);
if((errorLine = reader.readLine()) != null) {
if ("updated".equals(errorLine)) {
ChatSender.of(player).system("WEB_UPDATED");
return;
} else {
throw new SecurityException("Could not create webaccount " + errorLine);
}
error = true;
}
if(error)
return;
Message.send("WEB_EMAIL_SEND", player);
ChatSender.of(player).system("WEB_CREATED");
} catch (IOException e) {
Message.send("WEB_INTERNAL_ERROR", player);
throw new SecurityException("Could not create webaccount", e);
}
}

Datei anzeigen

@ -20,94 +20,178 @@
package de.steamwar.bungeecore.commands;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.Team;
import de.steamwar.bungeecore.Storage;
import de.steamwar.bungeecore.mods.ModUtils;
import de.steamwar.command.SWCommand;
import de.steamwar.command.SWCommandUtils;
import de.steamwar.command.TypeMapper;
import de.steamwar.messages.ChatSender;
import de.steamwar.sql.*;
import lombok.Getter;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.time.Instant;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class WhoisCommand extends BasicCommand {
public WhoisCommand(){
super("whois", "bungeecore.teamchat");
public class WhoisCommand extends SWCommand {
public WhoisCommand() {
super("whois");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!(sender instanceof ProxiedPlayer))
return;
ProxiedPlayer player = (ProxiedPlayer) sender;
@Register(description = "WHOIS_USAGE")
public void genericCommand(ProxiedPlayer player, @Mapper("player") String target, WhoisParameterTypes... parameters) {
ChatSender sender = ChatSender.of(player);
SteamwarUser user = SteamwarUser.get(target);
if (sender.user().hasPerm(UserPerm.ADMINISTRATION)) {
if (user == null) {
try {
int id = Integer.parseInt(target);
user = SteamwarUser.get(id);
} catch (NumberFormatException ignored) {
// Ignored
}
}
if(args.length == 0){
Message.send("WHOIS_USAGE", player);
return;
}
SteamwarUser user = SteamwarUser.get(args[0]);
if(user == null){
try {
int id = Integer.parseInt(args[0]);
user = SteamwarUser.get(id);
}catch (NumberFormatException ignored) {}
}
if (user == null) {
try {
long id = Long.parseLong(args[0]);
user = SteamwarUser.get(id);
} catch (NumberFormatException ignored) {
// Ignored
if (user == null) {
try {
long id = Long.parseLong(target);
user = SteamwarUser.get(id);
} catch (NumberFormatException ignored) {
// Ignored
}
}
}
if(user == null) {
Message.send("UNKNOWN_PLAYER", player);
return;
if (user == null) {
sender.system("UNKNOWN_PLAYER");
} else {
EnumSet<WhoisParameterTypes> set = parameters.length == 0 ? EnumSet.noneOf(WhoisParameterTypes.class) : EnumSet.copyOf(Arrays.asList(parameters));
sendUserinfo(sender, user, set);
}
boolean all = false;
if(args.length > 1 && args[1].startsWith("-")) {
all = args[1].contains("a");
}
sendUserinfo(player, user, all);
}
private static void sendUserinfo(ProxiedPlayer player, SteamwarUser user, boolean all) {
Message.send("WHOIS_USERNAME", player, user.getUserName());
Message.send("WHOIS_UUID", player, Message.parse("WHOIS_UUID_HOVER", player), new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, user.getUuid().toString()), user.getUuid().toString());
Message.send("WHOIS_ID", player, user.getId());
if (user.getDiscordId() != null) {
Message.send("WHOIS_DISCORD_ID", player, user.getDiscordId());
}
Timestamp firstJoin = user.getFirstjoin();
if(firstJoin == null)
Message.send("WHOIS_JOINED_FIRST", player, "0000-00-00 00:00:00");
else
Message.send("WHOIS_JOINED_FIRST", player, firstJoin.toString());
Message.send("WHOIS_HOURS_PLAYED", player, new DecimalFormat("###.##").format(user.getOnlinetime() / (double) 3600));
@Mapper(value = "player", local = true)
public TypeMapper<String> playerTypeMapper() {
return SWCommandUtils.createMapper(s -> s, s -> BungeeCord.getInstance().getPlayers().stream().map(ProxiedPlayer::getName).collect(Collectors.toList()));
}
private static void sendUserinfo(ChatSender sender, SteamwarUser user, EnumSet<WhoisParameterTypes> parameterTypes) {
Team team = Team.get(user.getTeam());
Message.send("WHOIS_TEAM", player, Message.parse("WHOIS_TEAM_HOVER", player, team.getTeamName()), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/team info " + team.getTeamKuerzel()), team.getTeamColor(), team.getTeamKuerzel(), team.getTeamName());
Message.send("WHOIS_PUNISHMENTS", player);
sender.system("WHOIS_USERNAME", user.getUserName());
sender.system("WHOIS_PREFIX", user.prefix().getColorCode() + user.prefix().getChatPrefix());
sender.system("WHOIS_TEAM", new Message("WHOIS_TEAM_HOVER", team.getTeamName()), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/team info " + team.getTeamKuerzel()), team.getTeamColor(), team.getTeamKuerzel(), team.getTeamName());
if (!sender.user().hasPerm(UserPerm.TEAM))
return;
if (sender.user().hasPerm(UserPerm.MODERATION)) {
sender.system("WHOIS_ID", user.getId());
sender.system("WHOIS_UUID", new Message("WHOIS_UUID_HOVER"), new ClickEvent(ClickEvent.Action.COPY_TO_CLIPBOARD, user.getUUID().toString()), user.getUUID().toString());
if (user.getDiscordId() != null)
sender.system("WHOIS_DISCORD_ID", user.getDiscordId());
sender.system("WHOIS_PERMS", user.perms().stream().map(Enum::name).collect(Collectors.joining(", ")));
}
ProxiedPlayer target = BungeeCord.getInstance().getPlayer(user.getUUID());
Timestamp firstJoin = user.getFirstjoin();
double onlineTime = user.getOnlinetime();
if(firstJoin == null && target != null) {
firstJoin = Storage.sessions.get(target);
}
if(firstJoin != null)
sender.system("WHOIS_JOINED_FIRST", firstJoin.toString());
sender.system("WHOIS_HOURS_PLAYED", new DecimalFormat("###.##").format(onlineTime / 3600d));
if(target != null) {
sender.system("WHOIS_CURRENT_PLAYED", new DecimalFormat("####.##").format((Instant.now().getEpochSecond() - Storage.sessions.get(target).toInstant().getEpochSecond()) / 60d));
sender.system("WHOIS_CURRENT_SERVER", target.getServer().getInfo().getName());
sender.system("WHOIS_CURRENT_PROTOCOL", target.getPendingConnection().getVersion());
List<Mod> mods = ModUtils.getPlayerModMap().get(user.getUUID());
if(mods == null)
mods = Collections.emptyList();
sender.system("WHOIS_PLATFORM", mods.isEmpty() ? "Vanilla" : mods.get(0).getPlatform().toString());
if (parameterTypes.contains(WhoisParameterTypes.MOD)) {
if (!mods.isEmpty()) {
sender.system("WHOIS_ACTIVE_MODS", mods.size(), mods.stream().map(mod -> "§" + mod.getModType().getColorCode() + mod.getModName()).collect(Collectors.joining("§8, ")));
} else {
sender.system("WHOIS_NO_ACTIVE_MODS");
}
}
}
sender.system("WHOIS_PUNISHMENTS");
List<Punishment> punishmentList = Punishment.getAllPunishmentsOfPlayer(user.getId());
Set<Punishment.PunishmentType> found = new HashSet<>();
boolean isPunished = false;
boolean all = parameterTypes.contains(WhoisParameterTypes.ALL);
for (Punishment punishment : punishmentList) {
if (!all && !punishment.getType().isMulti() && !found.add(punishment.getType())) {
continue;
}
Message.sendPrefixless("WHOIS_PUNISHMENT", player, SteamwarUser.get(punishment.getPunisher()).getUserName(), punishment.getType().name(), punishment.getBantime(punishment.getStartTime(), false), punishment.getBantime(punishment.getEndTime(), punishment.isPerma()), punishment.getReason());
if (!all && !punishment.isCurrent()) {
continue;
}
sender.prefixless("WHOIS_PUNISHMENT", SteamwarUser.get(punishment.getPunisher()).getUserName(), punishment.getType().name(), punishment.getBantime(punishment.getStartTime(), false), punishment.getBantime(punishment.getEndTime(), punishment.isPerma()), punishment.getReason());
isPunished = true;
}
if (!isPunished) {
Message.send(all ? "WHOIS_NO_ALL_PUNISHMENT" : "WHOIS_NO_PUNISHMENT", player);
sender.system(all ? "WHOIS_NO_ALL_PUNISHMENT" : "WHOIS_NO_PUNISHMENT");
}
}
@ClassMapper(value = WhoisParameterTypes.class, local = true)
public TypeMapper<WhoisParameterTypes> argumentTypeMapper() {
WhoisParameterTypes[] values = WhoisParameterTypes.values();
return new TypeMapper<WhoisParameterTypes>() {
@Override
public WhoisParameterTypes map(CommandSender commandSender, String[] previousArguments, String s) {
SteamwarUser user = SteamwarUser.get(((ProxiedPlayer) commandSender).getUniqueId());
return Stream.of(values)
.filter(p -> user.hasPerm(p.perm))
.filter(p -> p.getTabCompletes().contains(s))
.findFirst()
.orElse(null);
}
@Override
public Collection<String> tabCompletes(CommandSender commandSender, String[] previousArguments, String s) {
SteamwarUser user = SteamwarUser.get(((ProxiedPlayer) commandSender).getUniqueId());
return Stream.of(values)
.filter(p -> user.hasPerm(p.perm))
.flatMap(p -> p.getTabCompletes().stream())
.collect(Collectors.toList());
}
};
}
private enum WhoisParameterTypes {
ALL(Arrays.asList("-a", "-all"), UserPerm.TEAM),
MOD(Arrays.asList("-m", "-mod", "-mods"), UserPerm.MODERATION);
private final UserPerm perm;
@Getter
private List<String> tabCompletes;
WhoisParameterTypes(List<String> tabCompletes, UserPerm perm) {
this.perm = perm;
this.tabCompletes = tabCompletes;
}
}
}

Datei anzeigen

@ -1,47 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms;
import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.Server;
import java.io.ByteArrayOutputStream;
public abstract class BungeePacket {
public void send(Server server) {
ByteArrayDataOutput out = ByteStreams.newDataOutput();
out.writeByte(getId());
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
writeVars(out);
out.writeUTF(outputStream.toByteArray().toString());
server.sendData("sw:bridge", out.toByteArray());
}
public void send(ProxiedPlayer player) {
send(player.getServer());
}
public abstract int getId();
public abstract void writeVars(ByteArrayDataOutput byteArrayDataOutput);
}

Datei anzeigen

@ -1,43 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms;
public class PacketIdManager {
//0x0(X) Standalone Packets
public static final byte PING_PACKET = 0x01;
public static final byte TABLIST_NAME = 0x02;
public static final byte PREPARE_SCHEM = 0x03;
public static final byte BAUMEMBER_UPDATE = 0x04;
public static final byte EXECUTE_COMMAND = 0x05;
public static final byte LOCALE_INVALIDATION = 0x06;
//0x1(X) Bungee Inventory
public static final byte INVENTORY_PACKET = 0x10;
public static final byte INVENTORY_CALLBACK_PACKET = 0x11;
public static final byte INVENTORY_CLOSE_PACKET = 0x12;
//0x2(X) Server Information System
public static final byte I_AM_A_LOBBY = 0x20;
public static final byte FIGHT_INFO = 0x21;
public static final byte FIGHT_ENDS = 0x22;
public static final byte STARTING_SERVER = 0x23;
}

Datei anzeigen

@ -1,28 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms;
import com.google.common.io.ByteArrayDataInput;
import net.md_5.bungee.api.config.ServerInfo;
public interface SpigotHandler {
void handle(ByteArrayDataInput in, ServerInfo info);
}

Datei anzeigen

@ -1,66 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.comms.handlers.*;
import de.steamwar.bungeecore.listeners.BasicListener;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.Server;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.event.EventHandler;
import java.util.HashMap;
import java.util.Map;
public class SpigotReceiver extends BasicListener {
private static final Map<Byte, SpigotHandler> handlerMap = new HashMap<>();
@EventHandler
public void onPluginMessage(PluginMessageEvent event) {
if(!event.getTag().equalsIgnoreCase("sw:bridge"))
return;
event.setCancelled(true);
if(!(event.getSender() instanceof Server))
return;
ByteArrayDataInput in = ByteStreams.newDataInput(event.getData());
Byte handler = in.readByte();
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> handlerMap.get(handler).handle(in, ((Server) event.getSender()).getInfo()));
}
public static void registerHandler(Byte id, SpigotHandler handler) {
handlerMap.put(id, handler);
}
static {
registerHandler(PacketIdManager.INVENTORY_CALLBACK_PACKET, new InventoryCallbackHandler());
registerHandler(PacketIdManager.TABLIST_NAME, (in, info) -> {});
registerHandler(PacketIdManager.PREPARE_SCHEM, new PrepareSchemHandler());
registerHandler(PacketIdManager.I_AM_A_LOBBY, new ImALobbyHandler());
registerHandler(PacketIdManager.FIGHT_INFO, new FightInfoHandler());
registerHandler(PacketIdManager.EXECUTE_COMMAND, new ExecuteCommandHandler());
registerHandler(PacketIdManager.FIGHT_ENDS, new FightEndsHandler());
}
}

Datei anzeigen

@ -1,159 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2020 SteamWar.de-Serverteam
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms.handlers;
import com.google.common.io.ByteArrayDataInput;
import de.steamwar.bungeecore.ArenaMode;
import de.steamwar.bungeecore.comms.SpigotHandler;
import de.steamwar.bungeecore.comms.packets.FightEndsPacket;
import de.steamwar.bungeecore.sql.*;
import lombok.RequiredArgsConstructor;
import net.md_5.bungee.api.config.ServerInfo;
import java.util.*;
import java.util.stream.Collectors;
public class FightEndsHandler implements SpigotHandler {
private Map<String, LinkedList<Game>> gameModeGames = new HashMap<>();
private int K = 20;
private long defaultFightRange = 1000 /* Milliseconds */ * 60 /* Seconds */ * 15L /* Minutes */;
private Map<String, Long> fightRanges = new HashMap<>();
private long defaultFightCount = 1;
private Map<String, Long> fightCounts = new HashMap<>();
{
fightRanges.put("miniwargear", 1000 /* Milliseconds */ * 60 /* Seconds */ * 30L /* Minutes */);
fightCounts.put("miniwargear", 3L);
}
@Override
public void handle(ByteArrayDataInput in, ServerInfo info) {
FightEndsPacket fightEndsPacket = new FightEndsPacket(in);
if (!ArenaMode.getBySchemType(SchematicType.fromDB(fightEndsPacket.getGameMode())).isRanked()) {
return;
}
int bluePlayerSize = fightEndsPacket.getBluePlayers().size();
int redPlayerSize = fightEndsPacket.getRedPlayers().size();
double playerRatio = bluePlayerSize > redPlayerSize ? (double) redPlayerSize / bluePlayerSize : (double) bluePlayerSize / redPlayerSize;
if (playerRatio < 0.6) {
return;
}
boolean bluePublic = SchematicNode.getSchematicNode(fightEndsPacket.getBlueSchem()).getOwner() == 0;
boolean redPublic = SchematicNode.getSchematicNode(fightEndsPacket.getRedSchem()).getOwner() == 0;
if (bluePublic ^ redPublic) {
return;
}
double blueResult;
if (fightEndsPacket.getWin() == 0) {
blueResult = 0.5;
} else if (fightEndsPacket.getWin() == 1) {
blueResult = 1;
} else {
blueResult = 0;
}
// Die nächsten Zeilen filtern ein Fight innerhalb eines Teams nicht gewertet wird, bzw auch wenn nur Teile beider Teams im
// gleichen Team sind dieser ungewertet ist.
Set<Integer> teamsIds = fightEndsPacket.getBluePlayers().stream().map(SteamwarUser::get).map(SteamwarUser::getTeam).collect(Collectors.toSet());
for (int redPlayer : fightEndsPacket.getRedPlayers()) {
if (teamsIds.contains(SteamwarUser.get(redPlayer).getTeam())) {
return;
}
}
try {
if (teamComboExistedAlready(fightEndsPacket.getBluePlayers(), fightEndsPacket.getRedPlayers(), fightEndsPacket.getGameMode())) {
return;
}
} finally {
gameModeGames.computeIfAbsent(fightEndsPacket.getGameMode(), s -> new LinkedList<>()).add(new Game(fightEndsPacket.getBluePlayers(), fightEndsPacket.getRedPlayers()));
}
int blueSchemElo = SchemElo.getElo(fightEndsPacket.getBlueSchem());
int redSchemElo = SchemElo.getElo(fightEndsPacket.getRedSchem());
int blueTeamElo = fightEndsPacket.getBluePlayers().stream().mapToInt(player -> UserElo.getEloOrDefault(player, fightEndsPacket.getGameMode())).sum();
int redTeamElo = fightEndsPacket.getRedPlayers().stream().mapToInt(player -> UserElo.getEloOrDefault(player, fightEndsPacket.getGameMode())).sum();
calculateEloOfTeam(fightEndsPacket.getBlueSchem(), blueSchemElo, redSchemElo, blueTeamElo, redTeamElo, blueResult, fightEndsPacket.getBluePlayers(), fightEndsPacket.getGameMode(), bluePublic || redPublic);
calculateEloOfTeam(fightEndsPacket.getRedSchem(), redSchemElo, blueSchemElo, redTeamElo, blueTeamElo, 1 - blueResult, fightEndsPacket.getRedPlayers(), fightEndsPacket.getGameMode(), bluePublic || redPublic);
}
private void calculateEloOfTeam(int schemId, int eloSchemOwn, int eloSchemEnemy, int eloTeamOwn, int eloTeamEnemy, double result, List<Integer> players, String gameMode, boolean noPlayerRank) {
double winSchemExpectation = calsWinExpectation(eloSchemOwn, eloSchemEnemy);
SchemElo.setElo(schemId, (int) Math.round(eloSchemOwn + K * (result - winSchemExpectation)));
if (noPlayerRank) return;
double winTeamExpectation = calsWinExpectation(eloTeamOwn, eloTeamEnemy);
for (int player : players) {
int playerElo = UserElo.getEloOrDefault(player, gameMode);
int fights = UserElo.getFightsOfSeason(player, gameMode);
UserElo.setElo(player, gameMode, (int) Math.round(playerElo + getK(fights) * (result - winTeamExpectation)));
}
}
private double calsWinExpectation(int eloOwn, int eloEnemy) {
return 1 / (1 + Math.pow(10, (eloEnemy - eloOwn) / 600f));
}
private double getK(int fights) {
return K * Math.max(1.3 - (fights / 200.0), 0.8);
}
private boolean teamComboExistedAlready(List<Integer> bluePlayers, List<Integer> redPlayers, String gameMode) {
if (!gameModeGames.containsKey(gameMode)) {
return false;
}
LinkedList<Game> games = gameModeGames.get(gameMode);
long lifetime = fightRanges.getOrDefault(gameMode, defaultFightRange);
while (!games.isEmpty()) {
Game game = games.getFirst();
if (game.livedMillis() > lifetime) {
games.removeFirst();
} else {
break;
}
}
return games.stream().filter(game -> game.isSame(bluePlayers, redPlayers)).count() > fightCounts.getOrDefault(gameMode, defaultFightCount);
}
@RequiredArgsConstructor
private static class Game {
private long time = System.currentTimeMillis();
private final List<Integer> bluePlayers;
private final List<Integer> redPlayers;
public long livedMillis() {
return System.currentTimeMillis() - time;
}
public boolean isSame(List<Integer> bluePlayers, List<Integer> redPlayers) {
return bluePlayers.containsAll(this.bluePlayers) && redPlayers.containsAll(this.redPlayers);
}
}
}

Datei anzeigen

@ -1,64 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms.handlers;
import com.google.common.io.ByteArrayDataInput;
import de.steamwar.bungeecore.comms.SpigotHandler;
import de.steamwar.bungeecore.comms.packets.FightInfoPacket;
import de.steamwar.bungeecore.listeners.TablistManager;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class FightInfoHandler implements SpigotHandler {
private static final Set<ServerInfo> lobbys = new HashSet<>();
public static void addLobby(ServerInfo lobby) {
lobbys.add(lobby);
}
public static boolean onLobby(ProxiedPlayer player) {
return lobbys.contains(player.getServer().getInfo());
}
@Override
public void handle(ByteArrayDataInput in, ServerInfo info) {
FightInfoPacket packet = new FightInfoPacket(in);
packet.setServerName(info.getName());
TablistManager.newFightInfo(info, packet);
Iterator<ServerInfo> lobbyIt = lobbys.iterator();
while(lobbyIt.hasNext()) {
ServerInfo lobby = lobbyIt.next();
Iterator<ProxiedPlayer> it = lobby.getPlayers().iterator();
if(!it.hasNext()){
lobbyIt.remove();
continue;
}
packet.send(it.next());
}
}
}

Datei anzeigen

@ -1,67 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms.handlers;
import com.google.common.io.ByteArrayDataInput;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.comms.SpigotHandler;
import de.steamwar.bungeecore.comms.packets.CloseInventoryPacket;
import de.steamwar.bungeecore.inventory.InvCallback;
import de.steamwar.bungeecore.inventory.SWInventory;
import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import java.util.HashMap;
import java.util.Map;
public class InventoryCallbackHandler implements SpigotHandler {
public static final Map<Integer, SWInventory> inventoryHashMap = new HashMap<>();
@Override
public void handle(ByteArrayDataInput in, ServerInfo info) {
SteamwarUser owner = SteamwarUser.get(in.readInt());
CallbackType type = CallbackType.valueOf(in.readUTF());
if(!inventoryHashMap.containsKey(owner.getId())) {
BungeeCore.send(ProxyServer.getInstance().getPlayer(owner.getUuid()), BungeeCore.CHAT_PREFIX + "§cBitte erneut versuchen. Durch ein Softwareupdate konnte die übliche Aktion nicht durchgeführt werden.");
if(type == CallbackType.CLICK) {
new CloseInventoryPacket(owner.getId()).send(ProxyServer.getInstance().getPlayer(owner.getUuid()));
}
return;
}
if(type == CallbackType.CLICK) {
int pos = in.readInt();
InvCallback.ClickType clickType = InvCallback.ClickType.valueOf(in.readUTF());
inventoryHashMap.get(owner.getId()).handleCallback(clickType, pos);
}else if(type == CallbackType.CLOSE) {
if(inventoryHashMap.get(owner.getId()).isNext()) {
inventoryHashMap.get(owner.getId()).handleClose();
return;
}
inventoryHashMap.get(owner.getId()).setNext(true);
}
}
public enum CallbackType {
CLICK,
CLOSE,
}
}

Datei anzeigen

@ -1,36 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms.packets;
import com.google.common.io.ByteArrayDataOutput;
import de.steamwar.bungeecore.comms.BungeePacket;
import de.steamwar.bungeecore.comms.PacketIdManager;
public class BaumemberUpdatePacket extends BungeePacket {
@Override
public int getId() {
return PacketIdManager.BAUMEMBER_UPDATE;
}
@Override
public void writeVars(ByteArrayDataOutput byteArrayDataOutput) {
// empty
}
}

Datei anzeigen

@ -1,43 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms.packets;
import com.google.common.io.ByteArrayDataOutput;
import de.steamwar.bungeecore.comms.BungeePacket;
import de.steamwar.bungeecore.comms.PacketIdManager;
public class CloseInventoryPacket extends BungeePacket {
final int player;
@Override
public int getId() {
return PacketIdManager.INVENTORY_CLOSE_PACKET;
}
public CloseInventoryPacket(int player) {
this.player = player;
}
@Override
public void writeVars(ByteArrayDataOutput byteArrayDataOutput) {
byteArrayDataOutput.writeInt(player);
}
}

Datei anzeigen

@ -1,80 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2020 SteamWar.de-Serverteam
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms.packets;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;
import de.steamwar.bungeecore.comms.BungeePacket;
import de.steamwar.bungeecore.comms.PacketIdManager;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.ArrayList;
import java.util.List;
@AllArgsConstructor
@Getter
public class FightEndsPacket extends BungeePacket {
private byte win;
private int blueSchem;
private int redSchem;
private List<Integer> bluePlayers;
private List<Integer> redPlayers;
private String gameMode;
public FightEndsPacket(ByteArrayDataInput byteArrayDataInput) {
win = byteArrayDataInput.readByte();
blueSchem = byteArrayDataInput.readInt();
redSchem = byteArrayDataInput.readInt();
int blueSize = byteArrayDataInput.readInt();
bluePlayers = new ArrayList<>(blueSize);
for (int i = 0; i < blueSize; i++) {
bluePlayers.add(byteArrayDataInput.readInt());
}
int redSize = byteArrayDataInput.readInt();
redPlayers = new ArrayList<>(redSize);
for (int i = 0; i < redSize; i++) {
redPlayers.add(byteArrayDataInput.readInt());
}
gameMode = byteArrayDataInput.readUTF();
}
@Override
public int getId() {
return PacketIdManager.FIGHT_ENDS;
}
@Override
public void writeVars(ByteArrayDataOutput byteArrayDataOutput) {
byteArrayDataOutput.writeByte(win);
byteArrayDataOutput.writeInt(blueSchem);
byteArrayDataOutput.writeInt(redSchem);
byteArrayDataOutput.writeInt(bluePlayers.size());
for (int i : bluePlayers) {
byteArrayDataOutput.writeInt(i);
}
byteArrayDataOutput.writeInt(redPlayers.size());
for (int i : redPlayers) {
byteArrayDataOutput.writeInt(i);
}
byteArrayDataOutput.writeUTF(gameMode);
}
}

Datei anzeigen

@ -1,183 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms.packets;
import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteArrayDataOutput;
import de.steamwar.bungeecore.comms.BungeePacket;
import de.steamwar.bungeecore.comms.PacketIdManager;
import java.util.ArrayList;
import java.util.List;
public class FightInfoPacket extends BungeePacket {
private String serverName; // Name of the Server
private final String gameMode; // GameMode aka Schematictype (if known, else "")
private final String arena; // Name of the arena
private final String blueName; // Name of the blue team, expected to begin with "§a" colorcode
private final String redName; // Name of the red team, expected to begin with "§a" colorcode
private final String fightState; // Fight state (technical term) (if known, else "")
private final int countdown; // Countdown state in seconds (if known, else 0)
private final int blueLeader; // SWUserID of the blue team leader (if known, else 0)
private final int redLeader; // SWUserID of the red team leader (if known, else 0)
private final int blueSchem; // Blue SchemID (if known, else 0)
private final int redSchem; // Red SchemID (if known, else 0)
private final List<Integer> bluePlayers; // List of Blue SWUserIDs
private final List<Integer> redPlayers; // List of Red SWUserIDs
private final List<Integer> spectators; // List of Spectator SWUserIDs
public FightInfoPacket(String serverName, String gameMode, String arena, String blueName, String redName, String fightState, int countdown, int blueLeader, int redLeader, int blueSchem, int redSchem, List<Integer> bluePlayers, List<Integer> redPlayers, List<Integer> spectators) {
this.serverName = serverName;
this.gameMode = gameMode;
this.arena = arena;
this.blueName = blueName;
this.redName = redName;
this.fightState = fightState;
this.countdown = countdown;
this.blueLeader = blueLeader;
this.redLeader = redLeader;
this.blueSchem = blueSchem;
this.redSchem = redSchem;
this.bluePlayers = bluePlayers;
this.redPlayers = redPlayers;
this.spectators = spectators;
}
public FightInfoPacket(ByteArrayDataInput in) {
this.serverName = in.readUTF();
this.gameMode = in.readUTF();
this.arena = in.readUTF();
this.blueName = in.readUTF();
this.redName = in.readUTF();
this.fightState = in.readUTF();
this.countdown = in.readInt();
this.blueLeader = in.readInt();
this.redLeader = in.readInt();
this.blueSchem = in.readInt();
this.redSchem = in.readInt();
this.bluePlayers = readPlayerList(in);
this.redPlayers = readPlayerList(in);
this.spectators = readPlayerList(in);
}
@Override
public int getId() {
return PacketIdManager.FIGHT_INFO;
}
@Override
public void writeVars(ByteArrayDataOutput out) {
out.writeUTF(serverName);
out.writeUTF(gameMode);
out.writeUTF(arena);
out.writeUTF(blueName);
out.writeUTF(redName);
out.writeUTF(fightState);
out.writeInt(countdown);
out.writeInt(blueLeader);
out.writeInt(redLeader);
out.writeInt(blueSchem);
out.writeInt(redSchem);
writePlayerList(out, bluePlayers);
writePlayerList(out, redPlayers);
writePlayerList(out, spectators);
}
public String getServerName() {
return serverName;
}
public void setServerName(String serverName) {
this.serverName = serverName;
}
public String getGameMode() {
return gameMode;
}
public String getArena() {
return arena;
}
public String getBlueName() {
return blueName;
}
public String getRedName() {
return redName;
}
public String getFightState() {
return fightState;
}
public int getCountdown() {
return countdown;
}
public int getBlueLeader() {
return blueLeader;
}
public int getRedLeader() {
return redLeader;
}
public int getBlueSchem() {
return blueSchem;
}
public int getRedSchem() {
return redSchem;
}
public List<Integer> getBluePlayers() {
return bluePlayers;
}
public List<Integer> getRedPlayers() {
return redPlayers;
}
public List<Integer> getSpectators() {
return spectators;
}
public int playerSize(){
return bluePlayers.size() + redPlayers.size() + spectators.size();
}
private static List<Integer> readPlayerList(ByteArrayDataInput in) {
int length = in.readInt();
List<Integer> players = new ArrayList<>(length);
for(int i = 0; i < length; i++) {
players.add(in.readInt());
}
return players;
}
private void writePlayerList(ByteArrayDataOutput out, List<Integer> players) {
out.writeInt(players.size());
for(Integer player : players) {
out.writeInt(player);
}
}
}

Datei anzeigen

@ -1,80 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms.packets;
import com.google.common.io.ByteArrayDataOutput;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import de.steamwar.bungeecore.comms.PacketIdManager;
import de.steamwar.bungeecore.inventory.SWInventory;
import de.steamwar.bungeecore.inventory.SWItem;
import de.steamwar.bungeecore.comms.BungeePacket;
import de.steamwar.bungeecore.sql.SteamwarUser;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.HashMap;
import java.util.Map;
public class InventoryPacket extends BungeePacket {
final String title;
final int player;
final int size;
final Map<Integer, SWItem> items;
public InventoryPacket(int size, String title, ProxiedPlayer player) {
items = new HashMap<>();
this.title = title;
this.size = size;
this.player = SteamwarUser.get(player).getId();
}
public InventoryPacket(SWInventory inventory) {
items = inventory.getItems();
this.title = inventory.getTitle();
this.size = inventory.getSize();
this.player = SteamwarUser.get(inventory.getPlayer()).getId();
}
@Override
public int getId() {
return PacketIdManager.INVENTORY_PACKET;
}
@Override
public void writeVars(ByteArrayDataOutput byteArrayDataOutput) {
JsonObject object = new JsonObject();
object.addProperty("id", player);
object.addProperty("title", title);
object.addProperty("size", size);
object.addProperty("itemcount", items.size());
JsonArray array = new JsonArray();
for (int i = 0; i < size; i++) {
if(items.get(i) != null)
array.add(items.get(i).writeToString(i));
}
object.add("items", array);
byteArrayDataOutput.writeUTF(object.toString());
}
public void setItem(int index, SWItem item) {
items.put(index, item);
}
}

Datei anzeigen

@ -1,43 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.comms.packets;
import com.google.common.io.ByteArrayDataOutput;
import de.steamwar.bungeecore.comms.BungeePacket;
import de.steamwar.bungeecore.comms.PacketIdManager;
public class PingPacket extends BungeePacket {
final int id;
@Override
public int getId() {
return PacketIdManager.PING_PACKET;
}
public PingPacket(int id) {
this.id = id;
}
@Override
public void writeVars(ByteArrayDataOutput byteArrayDataOutput) {
byteArrayDataOutput.writeInt(id);
}
}

Datei anzeigen

@ -1,25 +0,0 @@
package de.steamwar.bungeecore.comms.packets;
import com.google.common.io.ByteArrayDataOutput;
import de.steamwar.bungeecore.comms.BungeePacket;
import de.steamwar.bungeecore.comms.PacketIdManager;
import de.steamwar.bungeecore.sql.SteamwarUser;
public class StartingServerPacket extends BungeePacket {
private final int user;
public StartingServerPacket(SteamwarUser user) {
this.user = user.getId();
}
@Override
public int getId() {
return PacketIdManager.STARTING_SERVER;
}
@Override
public void writeVars(ByteArrayDataOutput out) {
out.writeInt(user);
}
}

Datei anzeigen

@ -19,10 +19,11 @@
package de.steamwar.bungeecore.inventory;
import de.steamwar.bungeecore.comms.handlers.InventoryCallbackHandler;
import de.steamwar.bungeecore.comms.packets.CloseInventoryPacket;
import de.steamwar.bungeecore.comms.packets.InventoryPacket;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.network.NetworkSender;
import de.steamwar.bungeecore.network.handlers.InventoryCallbackHandler;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.network.packets.server.CloseInventoryPacket;
import de.steamwar.network.packets.server.InventoryPacket;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import java.util.ArrayList;
@ -30,6 +31,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiFunction;
public class SWInventory {
@ -44,7 +46,7 @@ public class SWInventory {
public SWInventory(ProxiedPlayer proxiedPlayer, int size, String title) {
itemMap = new HashMap<>();
InventoryCallbackHandler.inventoryHashMap.put(SteamwarUser.get(proxiedPlayer).getId(), this);
InventoryCallbackHandler.inventoryHashMap.put(SteamwarUser.get(proxiedPlayer.getUniqueId()).getId(), this);
this.player = proxiedPlayer;
this.size = size;
this.title = title;
@ -112,7 +114,7 @@ public class SWInventory {
public void handleClose() {
if(processingClick.compareAndSet(false, true)) {
InventoryCallbackHandler.inventoryHashMap.remove(SteamwarUser.get(player).getId(), this);
InventoryCallbackHandler.inventoryHashMap.remove(SteamwarUser.get(player.getUniqueId()).getId(), this);
if(close != null)
close.clicked(null);
processingClick.set(false);
@ -120,8 +122,14 @@ public class SWInventory {
}
public void open() {
InventoryPacket inv = new InventoryPacket(this);
inv.send(player);
InventoryPacket inv = new InventoryPacket(title, SteamwarUser.get(player.getUniqueId()).getId(), size, map(itemMap, (integer, swItem) -> swItem.writeToString(integer).toString()));
NetworkSender.send(player, inv);
}
private static <T, K, J> Map<T, J> map(Map<T, K> map, BiFunction<T, K, J> function) {
Map<T, J> result = new HashMap<>();
map.forEach((key, value) -> result.put(key, function.apply(key, value)));
return result;
}
public void close() {
@ -129,7 +137,7 @@ public class SWInventory {
}
public static void close(ProxiedPlayer player) {
new CloseInventoryPacket(SteamwarUser.get(player).getId()).send(player);
NetworkSender.send(player, new CloseInventoryPacket(SteamwarUser.get(player.getUniqueId()).getId()));
}
public void setClose(InvCallback close) {

Datei anzeigen

@ -19,43 +19,44 @@
package de.steamwar.bungeecore.listeners;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.listeners.mods.Forge;
import de.steamwar.bungeecore.sql.BannedUserIPs;
import de.steamwar.bungeecore.sql.Punishment;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.commands.PunishmentCommand;
import de.steamwar.bungeecore.commands.WebpasswordCommand;
import de.steamwar.messages.ChatSender;
import de.steamwar.sql.BannedUserIPs;
import de.steamwar.sql.Punishment;
import de.steamwar.sql.SteamwarUser;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.connection.PendingConnection;
import net.md_5.bungee.api.event.LoginEvent;
import net.md_5.bungee.event.EventHandler;
import java.sql.Timestamp;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
public class BanListener extends BasicListener {
@EventHandler
public void onLogin(LoginEvent event) {
event.registerIntent(BungeeCore.get());
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), () -> {
SteamwarUser user = SteamwarUser.getOrCreate(event.getConnection());
event.registerIntent(VelocityCore.get());
ProxyServer.getInstance().getScheduler().runAsync(VelocityCore.get(), () -> {
PendingConnection connection = event.getConnection();
SteamwarUser user = SteamwarUser.getOrCreate(connection.getUniqueId(), connection.getName(), ConnectionListener::newPlayer, WebpasswordCommand::changeUsername);
String ip = IPSanitizer.getTrueAddress(connection).getHostAddress();
if (user.isPunished(Punishment.PunishmentType.Ban)) {
user.updateBanIP(event.getConnection().getAddress().getAddress().getHostAddress());
event.setCancelled(true);
ChatSender.of(event).system(user.punishmentMessage(Punishment.PunishmentType.Ban));
BannedUserIPs.banIP(user.getId(), ip);
ChatSender.of(event).system(PunishmentCommand.punishmentMessage(user, Punishment.PunishmentType.Ban));
event.completeIntent(VelocityCore.get());
return;
}
List<BannedUserIPs> ips = BannedUserIPs.get(event.getConnection().getAddress().getAddress().getHostAddress());
List<BannedUserIPs> ips = BannedUserIPs.get(ip);
if(!ips.isEmpty()){
Timestamp highestBan = ips.get(0).getTimestamp();
boolean perma = false;
for(BannedUserIPs banned : ips) {
@ -72,30 +73,22 @@ public class BanListener extends BasicListener {
}
ClickEvent clickEvent = new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/ban " + user.getUserName() + " "
+ (perma?"perma":highestBan.toLocalDateTime().format(DateTimeFormatter.ofPattern("dd.MM.yyyy_HH:mm")))
+ " Bannumgehung");
+ " Ban Evasion - Bannumgehung");
for (ProxiedPlayer target : ProxyServer.getInstance().getPlayers()){
if ((target.hasPermission("bungeecore.teamchat"))
&& (target.getChatMode() == ProxiedPlayer.ChatMode.COMMANDS_ONLY
|| target.getChatMode() == ProxiedPlayer.ChatMode.SHOWN)){
StringBuilder potentialBan = new StringBuilder();
potentialBan.append(Message.parsePrefixed("BAN_AVOIDING_ALERT", target, user.getUserName()));
for(BannedUserIPs banned : ips) {
ChatSender.serverteamReceivers().forEach(sender -> sender.system(
"BAN_AVOIDING_ALERT",
new Message("BAN_AVOIDING_BAN_HOVER"),
clickEvent,
user.getUserName(),
ips.stream().map(banned -> {
SteamwarUser bannedUser = SteamwarUser.get(banned.getUserID());
potentialBan.append(Message.parse("BAN_AVOIDING_LIST", target, bannedUser.getUserName(),
banned.getTimestamp().toLocalDateTime().format(DateTimeFormatter.ofPattern(Message.parse("TIMEFORMAT", target)))));
}
TextComponent msg = new TextComponent(potentialBan.toString());
msg.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(Message.parse("BAN_AVOIDING_BAN_HOVER", target)).create()));
msg.setClickEvent(clickEvent);
target.sendMessage(msg);
}
}
return sender.parseToLegacy("BAN_AVOIDING_LIST", bannedUser.getUserName(),
banned.getTimestamp().toLocalDateTime().format(DateTimeFormatter.ofPattern(sender.parseToPlain("TIMEFORMAT"))));
}).collect(Collectors.joining(" "))
));
}
Forge.onServerConnected(event);
event.completeIntent(VelocityCore.get());
});
}
}

Datei anzeigen

@ -1,31 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.listeners;
import de.steamwar.bungeecore.BungeeCore;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.plugin.Listener;
public abstract class BasicListener implements Listener {
public BasicListener(){
ProxyServer.getInstance().getPluginManager().registerListener(BungeeCore.get(), this);
}
}

Datei anzeigen

@ -1,71 +0,0 @@
/*
This file is a part of the SteamWar software.
Copyright (C) 2020 SteamWar.de-Serverteam
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package de.steamwar.bungeecore.listeners;
import de.steamwar.messages.ChatSender;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PluginMessageEvent;
import net.md_5.bungee.event.EventHandler;
import net.md_5.bungee.protocol.DefinedPacket;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
public class BrandListener extends BasicListener {
private static boolean isLocalHost(InetAddress addr) {
if (addr.isAnyLocalAddress() || addr.isLoopbackAddress()) {
return true;
}
try {
return NetworkInterface.getByInetAddress(addr) != null;
} catch (SocketException e) {
return false;
}
}
@EventHandler
public void onServerSwitch(PluginMessageEvent event) {
if(!event.getTag().equals("minecraft:brand") && !event.getTag().equals("MC|Brand")) {
return;
}
if (isLocalHost(event.getReceiver().getAddress().getAddress())) {
return;
}
if (!(event.getReceiver() instanceof ProxiedPlayer)) {
return;
}
event.setCancelled(true);
ProxiedPlayer player = (ProxiedPlayer) event.getReceiver();
String brandString = ChatSender.of(player).parseToLegacy("STEAMWAR_BRAND", ProxyServer.getInstance().getName(), player.getServer().getInfo().getName(), new String(event.getData(), 1, event.getData().length - 1));
ByteBuf brand = ByteBufAllocator.DEFAULT.heapBuffer();
DefinedPacket.writeString(brandString, brand);
player.sendData(event.getTag(), DefinedPacket.toArray(brand));
brand.release();
}
}

Datei anzeigen

@ -21,10 +21,12 @@ package de.steamwar.bungeecore.listeners;
import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.bot.SteamwarDiscordBot;
import de.steamwar.bungeecore.comms.packets.PingPacket;
import de.steamwar.bungeecore.sql.*;
import de.steamwar.bungeecore.commands.PunishmentCommand;
import de.steamwar.bungeecore.network.NetworkSender;
import de.steamwar.bungeecore.util.Chat19;
import de.steamwar.messages.ChatSender;
import net.md_5.bungee.api.*;
import de.steamwar.network.packets.server.PingPacket;
import de.steamwar.sql.*;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.ChatEvent;
import net.md_5.bungee.api.event.TabCompleteEvent;
@ -35,17 +37,13 @@ import net.md_5.bungee.event.EventHandler;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.logging.Level;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ChatListener extends BasicListener {
private static final Set<Integer> coloredTeams = new HashSet<>();
static {
coloredTeams.add(12);
coloredTeams.add(54);
coloredTeams.add(285);
}
private static final List<String> rankedModes = ArenaMode.getAllModes().stream().filter(ArenaMode::isRanked).map(ArenaMode::getSchemType).collect(Collectors.toList());
@EventHandler
public void onChatEvent(ChatEvent e) {
@ -54,53 +52,66 @@ public class ChatListener extends BasicListener {
ProxiedPlayer player = (ProxiedPlayer) e.getSender();
String message = e.getMessage();
e.setCancelled(true);
if (message.contains("jndi:ldap")) {
e.setCancelled(true);
SteamwarUser.get(player).punishPerma(Punishment.PunishmentType.Ban, "Versuchte Exploit-Ausnutzung", 0);
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
PunishmentCommand.ban(user, Punishment.PERMA_TIME, "Versuchte Exploit-Ausnutzung", SteamwarUser.get(-1), true);
VelocityCore.log(Level.SEVERE, user.getUserName() + " " + user.getId() + " wurde automatisch wegen jndi:ldap gebannt.");
return;
}
message = sanitize7(message);
if (isCommand(player, message))
return;
if (message.startsWith("/")) {
if(filteredCommand((CommandSender) e.getSender(), message))
e.setCancelled(true);
Subserver subserver = Subserver.getSubserver(player);
if(subserver != null && subserver.getType() == Servertype.ARENA && subserver.getServer() == player.getServer().getInfo()) {
localChat(player, message);
} else if (message.startsWith("+")) {
localChat(player, message.substring(1));
} else {
e.setCancelled(true);
Subserver subserver = Subserver.getSubserver(player);
if(subserver != null && subserver.getType() == Servertype.ARENA && subserver.getServer() == player.getServer().getInfo()) {
localChat(player, message);
} else if (message.startsWith("+")) {
localChat(player, message.substring(1));
} else {
sendChat(ChatSender.of(player), ChatSender.globalReceivers(), "CHAT_GLOBAL", null, message);
}
sendChat(ChatSender.of(player), ChatSender.globalReceivers(), "CHAT_GLOBAL", null, message);
}
}
public static void sendChat(ChatSender sender, Stream<ChatSender> receivers, String format, ChatSender msgReceiver, String message) {
String finalMessage = modifyFilter(sender, message);
if(finalMessage == null)
return;
private static boolean isCommand(ProxiedPlayer player, String message) {
String command = message.substring(1);
boolean isCommand = message.startsWith("/") || (message.startsWith("7") && command.split(" ", 2)[0].matches("[7/]?[A-Za-z]+"));
if(isCommand && !ProxyServer.getInstance().getPluginManager().dispatchCommand(player, command)) {
if(command.startsWith("7"))
command = "/" + command.substring(1);
message = "/" + command;
if(filteredCommand(player, message))
return true;
Chat19.chat(player, message);
}
return isCommand;
}
public static void sendChat(ChatSender sender, Stream<ChatSender> receivers, String format, ChatSender msgReceiver, String message) {
SteamwarUser user = sender.user();
final String coloredMessage = user.hasPerm(UserPerm.COLOR_CHAT) ? ChatColor.translateAlternateColorCodes('&', message) : message;
if(chatFilter(sender, coloredMessage))
return;
AtomicBoolean noReceiver = new AtomicBoolean(true);
receivers.filter(ChatSender::chatShown).forEach(player -> {
if(sender.user().getId() != player.user().getId())
noReceiver.set(false);
chatToReciever(player, msgReceiver, user, format, finalMessage);
chatToReciever(player, msgReceiver, user, format, coloredMessage);
});
chatToReciever(ChatSender.console(), msgReceiver, user, format, finalMessage);
chatToReciever(ChatSender.console(), msgReceiver, user, format, coloredMessage);
if(format.equals("CHAT_GLOBAL")) {
if (SteamwarDiscordBot.instance() != null)
chatToReciever(ChatSender.discordChannel(SteamwarDiscordBot.instance().getIngameChatListener()), msgReceiver, user, format, finalMessage);
chatToReciever(ChatSender.discordChannel(SteamwarDiscordBot.instance().getIngameChatListener()), msgReceiver, user, format, coloredMessage);
} else if (format.equals("CHAT_SERVERTEAM")) {
if (SteamwarDiscordBot.instance() != null)
chatToReciever(ChatSender.discordChannel(SteamwarDiscordBot.instance().getServerTeamChatListener()), msgReceiver, user, format, finalMessage);
chatToReciever(ChatSender.discordChannel(SteamwarDiscordBot.instance().getServerTeamChatListener()), msgReceiver, user, format, coloredMessage);
} else if (noReceiver.get()) {
sender.system("CHAT_NO_RECEIVER");
}
@ -113,68 +124,57 @@ public class ChatListener extends BasicListener {
return;
}
message = sanitize7(message);
if(ChatListener.filteredCommand(player, message))
return;
if(!message.startsWith("/")) {
message = modifyFilter(sender, message);
if(message == null)
return;
}
player.chat(message);
if(!message.startsWith("/") && chatFilter(sender, message))
return;
Chat19.chat(player, message);
}
private static String modifyFilter(ChatSender sender, String message) {
private static boolean chatFilter(ChatSender sender, String message) {
if(!sender.chatShown()) {
sender.system("CHAT_RECEIVE");
return null;
return true;
}
if(message.replace("§[a-f0-9klmno]", "").trim().isEmpty()) {
sender.system("CHAT_EMPTY");
return true;
}
SteamwarUser user = sender.user();
UserGroup group = user.getUserGroup();
if(!group.isTeamGroup() && (message.contains("http:") || message.contains("https:") || message.contains("www."))){
if(!user.hasPerm(UserPerm.TEAM) && (message.contains("http:") || message.contains("https:") || message.contains("www."))){
sender.system("CHAT_NO_LINKS");
return null;
return true;
}
if (user.isPunishedWithMessage(sender, Punishment.PunishmentType.Mute))
return null;
if(group != UserGroup.Member || coloredTeams.contains(user.getTeam()))
message = ChatColor.translateAlternateColorCodes('&', message);
if (PunishmentCommand.isPunishedWithMessage(sender, Punishment.PunishmentType.Mute))
return true;
if (message.contains("LIXFEL"))
specialAlert(sender, "Lixfel", "CHAT_LIXFEL_", 3, 6, 11, 12, 15);
if (message.contains("YOYONOW"))
specialAlert(sender, "YoyoNow", "CHAT_YOYONOW_", 3, 6, 11, 12);
if (message.contains("CHAOSCAOT"))
specialAlert(sender, "Chaoscaot", "CHAT_CHAOSCAOT_", 3, 6, 11, 12, 15, 17);
return message;
return false;
}
private static void chatToReciever(ChatSender receiver, ChatSender msgReceiver, SteamwarUser sender, String format, String message) {
UserGroup group = sender.getUserGroup();
UserPerm.Prefix prefix = sender.prefix();
String chatColorCode = sender.hasPerm(UserPerm.TEAM) ? "§f" : "§7";
receiver.chat(new Message(format,
sender,
msgReceiver == null ? receiver : msgReceiver,
highlightMentions(message, group.getChatColorCode(), receiver),
highlightMentions(message, chatColorCode, receiver),
sender.getTeam() == 0 ? "" : "§" + Team.get(sender.getTeam()).getTeamColor() + Team.get(sender.getTeam()).getTeamKuerzel() + " ",
UserElo.getEmblem(sender),
group.getColorCode(),
group.getChatPrefix().length() == 0 ? "§f" : group.getChatPrefix() + " ",
group.getChatColorCode()));
}
private static String sanitize7(String message) {
String begin = message.split(" ", 2)[0];
if(begin.startsWith("7") && begin.substring(1).matches("[A-Za-z]+")){
message = "/" + message.substring(1);
}else if((begin.startsWith("77") || begin.startsWith("7/") || begin.startsWith("/7")) && begin.substring(2).matches("[A-Za-z]+")){
message = "//" + message.substring(2);
}
return message;
UserElo.getEmblem(sender, rankedModes),
prefix.getColorCode(),
prefix.getChatPrefix().length() == 0 ? "§f" : prefix.getChatPrefix() + " ",
chatColorCode));
}
private static boolean filteredCommand(CommandSender sender, String message) {
@ -191,7 +191,7 @@ public class ChatListener extends BasicListener {
TaskScheduler scheduler = ProxyServer.getInstance().getScheduler();
for(int i = 0; i < delay.length; i++) {
int finalI = i;
scheduler.schedule(BungeeCore.get(), () -> sender.prefixless("CHAT_MSG", name, sender.user(), new Message(baseMessage + (finalI+1))), delay[i], TimeUnit.SECONDS);
scheduler.schedule(VelocityCore.get(), () -> sender.prefixless("CHAT_MSG", name, sender.user(), new Message(baseMessage + (finalI+1))), delay[i], TimeUnit.SECONDS);
}
}
@ -202,49 +202,13 @@ public class ChatListener extends BasicListener {
String mark = "@" + player.user().getUserName();
return Arrays.stream(message.split(" ")).map(cur -> {
if(cur.equalsIgnoreCase(mark)) {
new PingPacket(player.user().getId()).send(player.user().getPlayer());
NetworkSender.send(ProxyServer.getInstance().getPlayer(player.user().getUUID()), new PingPacket(player.user().getId()));
return "§e" + cur + returnColor;
}
return cur;
}).collect(Collectors.joining(" "));
}
@EventHandler
public void onTabCompleteEvent(TabCompleteEvent e){
List<String> suggestions = e.getSuggestions();
String [] cursor = e.getCursor().split(" ");
String last;
if(cursor.length != 0)
last = cursor[cursor.length - 1];
else
last = "";
for(ProxiedPlayer player : ProxyServer.getInstance().getPlayers()){
String name = player.getName();
if (last.isEmpty() || name.startsWith(last)) {
suggestions.add(name);
}
}
if(last.startsWith("@")) {
String plrName = last.replace("@", "");
for(ProxiedPlayer player : ProxyServer.getInstance().getPlayers()){
String name = player.getName();
if ((plrName.isEmpty() || name.startsWith(plrName)) && !plrName.equalsIgnoreCase(name)) {
suggestions.add("@" + name);
}
}
}
if(e.getSender() instanceof ProxiedPlayer && cursor.length == 1 && cursor[0].startsWith("/")){
ProxiedPlayer player = (ProxiedPlayer) e.getSender();
for(String cmd : BungeeCore.commands.keySet()){
if(cmd.startsWith(cursor[0]) && player.hasPermission(BungeeCore.commands.get(cmd))){
suggestions.add(cmd);
}
}
}
}
@EventHandler
public void onTabCompleteResponseEvent(TabCompleteResponseEvent e){
List<String> suggestions = e.getSuggestions();

Datei anzeigen

@ -21,9 +21,9 @@ package de.steamwar.bungeecore.listeners;
import de.steamwar.bungeecore.*;
import de.steamwar.bungeecore.commands.CheckCommand;
import de.steamwar.bungeecore.sql.SchematicNode;
import de.steamwar.bungeecore.sql.SchematicType;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.sql.SchematicNode;
import de.steamwar.sql.SchematicType;
import de.steamwar.sql.SteamwarUser;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PostLoginEvent;

Datei anzeigen

@ -19,7 +19,7 @@
package de.steamwar.bungeecore.listeners;
import de.steamwar.bungeecore.BungeeCore;
import de.steamwar.bungeecore.VelocityCore;
import de.steamwar.bungeecore.Message;
import de.steamwar.bungeecore.Servertype;
import de.steamwar.bungeecore.Subserver;
@ -27,9 +27,11 @@ import de.steamwar.bungeecore.bot.config.SteamwarDiscordBotConfig;
import de.steamwar.bungeecore.bot.util.DiscordRanks;
import de.steamwar.bungeecore.commands.ChallengeCommand;
import de.steamwar.bungeecore.commands.CheckCommand;
import de.steamwar.bungeecore.commands.ModCommand;
import de.steamwar.bungeecore.commands.MsgCommand;
import de.steamwar.bungeecore.sql.SteamwarUser;
import de.steamwar.bungeecore.sql.UserGroup;
import de.steamwar.bungeecore.mods.ModUtils;
import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.UserPerm;
import net.md_5.bungee.api.AbstractReconnectHandler;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.chat.ClickEvent;
@ -37,18 +39,26 @@ import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.PostLoginEvent;
import net.md_5.bungee.api.event.ServerDisconnectEvent;
import net.md_5.bungee.api.event.ServerKickEvent;
import net.md_5.bungee.event.EventHandler;
import java.util.*;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.UUID;
public class ConnectionListener extends BasicListener {
private static final String ADMIN_GROUP = "admin";
public static final String TEAM_GROUP = "team";
public static final String ALERT_PERMISSION = "bungeecore.alert";
public static final String BAN_PERMISSION = "bungeecore.ban";
public static final String BUILDERCLOUD_PERMISSION = "bungeecore.buildercloud";
public static final String CHECK_PERMISSION = "bungeecore.check";
private static final String YOUTUBER_MODS = "bungeecore.youtubermods";
public static final String EVENTRELOAD_PERMISSION = "bungeecore.eventreload";
public static final String KICK_PERMISSION = "bungeecore.kick";
public static final String POLLRESULT_PERMISSION = "bungeecore.pollresult";
public static final String SOFTRELOAD_PERMISSION = "bungeecore.softreload";
public static final String TEAMCHAT_PERMISSION = "bungeecore.teamchat";
public static final String MOD_PERMISSION = "bungeecore.mod";
private static final Set<UUID> newPlayers = new HashSet<>();
@ -61,25 +71,36 @@ public class ConnectionListener extends BasicListener {
ProxiedPlayer player = event.getPlayer();
SteamwarUser user = SteamwarUser.get(player.getUniqueId());
player.removeGroups("Admin", "team");
if(user.getUserGroup().isAdminGroup())
player.addGroups(ADMIN_GROUP);
if(user.getUserGroup().isTeamGroup()) {
player.addGroups(TEAM_GROUP);
CheckCommand.sendReminder(player);
if(user.hasPerm(UserPerm.ADMINISTRATION)) {
player.setPermission("bungeecord.command.end", true);
player.setPermission("bungeecord.command.reload", true);
player.setPermission("bungeecord.command.ip", true);
player.setPermission(SOFTRELOAD_PERMISSION, true);
}
if(user.getUserGroup().isCheckSchematics())
player.setPermission(CHECK_PERMISSION, true);
if(user.hasPerm(UserPerm.MODERATION)) {
player.setPermission(ALERT_PERMISSION, true);
player.setPermission(KICK_PERMISSION, true);
player.setPermission(POLLRESULT_PERMISSION, true);
player.setPermission(EVENTRELOAD_PERMISSION, true);
player.setPermission(MOD_PERMISSION, true);
}
if(user.getUserGroup() != UserGroup.Member) {
player.setPermission(YOUTUBER_MODS, true);
player.setDisplayName(user.getUserGroup().getColorCode() + user.getUserGroup().getChatPrefix() + " " + player.getName() + "§r");
player.setPermission("bungeecore.group." + user.getUserGroup().name().toLowerCase(), true);
}else {
player.setDisplayName("§f" + player.getName());
if(user.hasPerm(UserPerm.TEAM)) {
player.setPermission("bungeecord.command.list", true);
player.setPermission("bungeecord.command.send", true);
player.setPermission("bungeecord.command.server", true);
player.setPermission(TEAMCHAT_PERMISSION, true);
player.setPermission(BAN_PERMISSION, true);
}
if(user.hasPerm(UserPerm.CHECK)) {
CheckCommand.sendReminder(player);
player.setPermission(CHECK_PERMISSION, true);
}
if(user.hasPerm(UserPerm.BUILD)) {
player.setPermission(BUILDERCLOUD_PERMISSION, true);
}
for(Subserver subserver : Subserver.getServerList()){
@ -105,6 +126,9 @@ public class ConnectionListener extends BasicListener {
@EventHandler
public void onServerKickEvent(ServerKickEvent ev)
{
if(!ev.getPlayer().isConnected())
return;
ServerInfo kickedFrom;
if (ev.getPlayer().getServer() != null){
@ -118,7 +142,7 @@ public class ConnectionListener extends BasicListener {
}
}
ServerInfo kickTo = ProxyServer.getInstance().getServerInfo(BungeeCore.LOBBY_SERVER);
ServerInfo kickTo = ProxyServer.getInstance().getServerInfo(VelocityCore.LOBBY_SERVER);
if (kickedFrom != null && kickedFrom.equals(kickTo)) {
return;
@ -132,18 +156,7 @@ public class ConnectionListener extends BasicListener {
public void onDisconnect(PlayerDisconnectEvent e){
ChallengeCommand.remove(e.getPlayer());
MsgCommand.remove(e.getPlayer());
}
@EventHandler
public void onServerDisconnect(ServerDisconnectEvent e){
ServerInfo server = e.getTarget();
Subserver subserver = Subserver.getSubserver(server);
if(subserver == null)
return;
ProxiedPlayer player = e.getPlayer();
Collection<ProxiedPlayer> players = server.getPlayers();
if(players.isEmpty() || (players.size() == 1 && players.contains(player)))
ProxyServer.getInstance().getScheduler().runAsync(BungeeCore.get(), subserver::waitForTermination);
ModUtils.getPlayerModMap().remove(e.getPlayer().getUniqueId());
ModCommand.playerFilterType.remove(e.getPlayer());
}
}

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden Mehr anzeigen