Compare commits

...
Author SHA1 Message Date
D4rkr34lm e07298e748 Move listener to permanent 2026-06-17 21:21:17 +02:00
D4rkr34lm d7ba19049a Add event handler 2026-06-17 21:10:55 +02:00
D4rkr34lm 47909b6f07 Add listener to prevent dried ghasts from growing 2026-06-17 21:09:07 +02:00
YoyoNow 669235709e Fix WorldEditListener 2026-06-12 15:14:09 +02:00
YoyoNow 796e154c1c Fix paper in inventory 2026-06-12 15:07:46 +02:00
YoyoNow 9efe35fe0d Update LobbySystem run task 2026-06-12 14:52:46 +02:00
YoyoNow e0aaacd66a Fix AnvilGUI for 1.21 not being mojmapped 2026-06-12 14:52:03 +02:00
Chaoscaot 27877938bc Add support for GameMode templates and YAML-based configuration handling in DevCommand.
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-06-12 12:29:56 +02:00
YoyoNow 701964c2f2 Fix DevCommand.kt 2026-06-12 12:15:07 +02:00
YoyoNow 6cbfc94e6d Merge pull request 'Access widener for paper' (#420) from AccessWidener into main
Reviewed-on: SteamWar/SteamWar#420
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-06-12 11:16:33 +02:00
YoyoNow c0ff123279 Fix EntityDamage only applying cancel for Player 2026-06-12 11:09:13 +02:00
YoyoNow 5511a1f08e Fix steamwar.devserver.gradle 2026-06-12 10:41:18 +02:00
YoyoNow 8c8da355bb Fix build.yml 2026-06-12 10:02:34 +02:00
Chaoscaot 7326ed4aa0 Merge pull request 'Remove some deprecated code in favor of newer code' (#421) from RemoveDeprecatedCode into main
Reviewed-on: SteamWar/SteamWar#421
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-06-12 09:58:05 +02:00
YoyoNow 2d59eb81c7 Fix ColorInit and CustomMap deprecation warnings 2026-06-12 09:49:32 +02:00
YoyoNow 711920464a Remove some deprecated code in favor of newer code 2026-06-12 09:37:43 +02:00
YoyoNow 117dbd08ae Implement startup arguments into steamwar.devserver.gradle 2026-06-11 23:54:42 +02:00
YoyoNow b36464e69e Implement Velocity changes 2026-06-11 23:50:34 +02:00
YoyoNow f5ac006c0c Fix REntity.EntityDataPacketBuilder 2026-06-11 23:49:38 +02:00
YoyoNow 414bfbfe3c Fix ClassTransformer public constructor 2026-06-11 23:48:33 +02:00
YoyoNow c362a3e1f0 Remove unused code 2026-06-11 23:24:11 +02:00
YoyoNow 2b43af8851 Remove unneded reflection 2026-06-11 23:22:05 +02:00
YoyoNow 1590f8f0ee Remove Reflection 2026-06-11 23:18:22 +02:00
YoyoNow 932732737d Unreflect more stuff 2026-06-11 22:35:13 +02:00
YoyoNow 2bc164c1b0 Extract widener definition into a widener.gradle.kts plugin 2026-06-11 20:38:33 +02:00
YoyoNow aa66b3dc83 Optimize imports 2026-06-11 18:29:44 +02:00
YoyoNow f5d9c6e175 Unreflect everything 2026-06-11 18:26:15 +02:00
YoyoNow 36b31fac77 Remove unneeded code
Cleanup build.gradle.kts
2026-06-11 13:49:35 +02:00
YoyoNow 641cefad01 Add comments to bausystem.accesswidener 2026-06-11 13:46:55 +02:00
YoyoNow eb866125ea Remove reflection from BauSystem 2026-06-11 13:45:49 +02:00
YoyoNow 961331f029 Fix Agent and WideningTransformer and ClassPatcher 2026-06-11 13:19:04 +02:00
YoyoNow 786257ad0e Add initial AccessWidener 2026-06-11 12:22:44 +02:00
YoyoNow e176b3bca8 Fix steamwar.devserver.gradle 'worldName' parameter 2026-06-10 20:46:13 +02:00
YoyoNow f81f05c3d0 Merge pull request 'Add RedstoneEngineCommand' (#406) from BauSystem/RedstoneEngineCommand into main
Reviewed-on: SteamWar/SteamWar#406
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2026-06-10 09:04:15 +02:00
YoyoNow 0afb6ce06a Merge branch 'main' into BauSystem/RedstoneEngineCommand 2026-06-10 09:03:55 +02:00
YoyoNow a938abde3f Add 'debug' property to enable/disable debugger 2026-06-09 23:00:46 +02:00
YoyoNow ec9b0387c5 Fix permission for BlastResistanceCommand 2026-06-09 16:42:40 +02:00
YoyoNow 03c3d49659 Add BlastResistanceCommand 2026-06-09 16:38:22 +02:00
Chaoscaot 8d9a77ab67 Merge pull request 'chore(VelocityCore): reennable replays for serverteam' (#417) from wip/VelocityCore-reenable-replays-for-serverteam into main
Reviewed-on: SteamWar/SteamWar#417
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-06-07 00:06:07 +02:00
D4rkr34lm fc2997e011 Rennable replays for serverteam 2026-06-06 12:17:23 +02:00
D4rkr34lm 8eb5f5ddf2 fix(BauSystem): cursor not properly disapearing 2026-06-03 21:23:36 +02:00
YoyoNow aa807060f4 Merge pull request 'fix(SpigotCore): small collection of rendering bugs in new cursor' (#413) from BauSystem/fix-small-sim-cursor-bug into main
Reviewed-on: SteamWar/SteamWar#413
Reviewed-by: YoyoNow <4+yoyonow@noreply.localhost>
2026-06-02 21:39:13 +02:00
D4rkr34lm 9bbbab9d4b Fix collection of rendering issues 2026-06-02 21:33:31 +02:00
YoyoNow 7cca4ada10 Merge pull request 'refactor(BauSystem): Extract sim cursor into generic curser and refactor sim cursor' (#410) from BauSystem/refactor-sim-cursor-no2 into main
Reviewed-on: SteamWar/SteamWar#410
Reviewed-by: YoyoNow <4+yoyonow@noreply.localhost>
2026-06-02 20:22:00 +02:00
YoyoNow 725e6df047 Merge pull request 'fix(SpigotCore): versions above 1.21.6 being kicked from arena' (#412) from SpigotCore/fix-newer-version-being-kicked-from-arena into main
Reviewed-on: SteamWar/SteamWar#412
Reviewed-by: YoyoNow <4+yoyonow@noreply.localhost>
2026-06-02 20:19:57 +02:00
D4rkr34lm f3ce124a23 Make dev velocity easier to debug and fix version issue 2026-06-02 20:18:13 +02:00
D4rkr34lm e83f72a53e Further simplification 2026-06-01 22:01:52 +02:00
D4rkr34lm def0c19e43 Refactor simulation cursor to use new generic cursor 2026-06-01 21:51:54 +02:00
D4rkr34lm 3810ccd63d Add proper onclick handleing 2026-06-01 21:27:34 +02:00
D4rkr34lm a018af1c8a Refactor to use Player components for better usability 2026-05-31 13:20:24 +02:00
YoyoNow fd8f942014 Fix RedstoneEngine not registering 2026-05-31 11:37:43 +02:00
YoyoNow eab8826583 Fix RedstoneEngine not registering 2026-05-31 11:36:21 +02:00
YoyoNow bc0177df43 Add ExperimentalCommand 2026-05-31 00:56:05 +02:00
YoyoNow 1dc78b8eb8 Add RedstoneEngineCommand 2026-05-31 00:44:56 +02:00
YoyoNow a9fb982143 Merge pull request 'Fix WorldDir of Event servers' (#405) from VelocityCore/FixEventWorldDir into main
Reviewed-on: SteamWar/SteamWar#405
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2026-05-30 18:33:17 +02:00
YoyoNow 5b8d881e01 Fix WorldDir of Event servers 2026-05-30 18:30:51 +02:00
YoyoNow eb55f4b395 Merge pull request 'Remove global Entity Interact callback' (#404) from SpigotCore/RemoveGlobalEntityServerCallback into main
Reviewed-on: SteamWar/SteamWar#404
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2026-05-30 15:27:45 +02:00
YoyoNow 273db91d06 Fix compile 2026-05-30 15:24:20 +02:00
YoyoNow 983ad544c1 Remove global Entity Interact callback 2026-05-30 15:18:37 +02:00
YoyoNow a6a34b2221 Fix Schem add on WGS Schems 2026-05-30 14:13:08 +02:00
YoyoNow 6c6bd19038 Merge pull request 'fix(BauSystem): interaction with trace entity not showing details text' (#398) from BauSystem/fix-interaction-with-trace-entity into main
Reviewed-on: SteamWar/SteamWar#398
Reviewed-by: YoyoNow <4+yoyonow@noreply.localhost>
2026-05-30 13:35:35 +02:00
D4rkr34lm 89e05cd109 Remove remnatn of old impl 2026-05-30 13:30:47 +02:00
D4rkr34lm ea9d7ac584 Refactor to use better impl of interaction entity in REntity system 2026-05-30 13:29:50 +02:00
D4rkr34lm 17e1cf53b0 Merge branch 'main' into BauSystem/fix-interaction-with-trace-entity 2026-05-30 13:24:43 +02:00
YoyoNow f64f337f17 Merge pull request 'Add RInteraction Entity' (#403) from SpigotCore/RInteraction into main
Reviewed-on: SteamWar/SteamWar#403
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2026-05-30 13:22:35 +02:00
YoyoNow c5f5be7d58 Add RInteraction Entity 2026-05-30 13:17:49 +02:00
Chaoscaot 9f18644763 Merge pull request 'fix(FightSystem): arrow stopper removing entites not shot by player (#399)' (#402) from wip/399-fix-error-stopper-for-dispensers into main
Reviewed-on: SteamWar/SteamWar#402
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-30 12:11:12 +02:00
D4rkr34lm 1de17d27f4 Fix arrow stopper 2026-05-30 11:55:59 +02:00
D4rkr34lm 3cd0db9bdf Merge branch 'main' into BauSystem/fix-interaction-with-trace-entity 2026-05-25 21:32:12 +02:00
D4rkr34lm 9711b48f2f Fix interaction with trace entity not showing detail text 2026-05-25 18:20:42 +02:00
Chaoscaot 9934b8bbb2 Fix TNTLeague InviteCommand.kt
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-25 01:55:20 +02:00
Chaoscaot 6447265b90 Merge pull request 'feat(BauSystem): use display entity to render trace' (#397) from BauSystem/use-display-entities-for-trace-render into main
Reviewed-on: SteamWar/SteamWar#397
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-25 01:40:30 +02:00
D4rkr34lm 71258318db Replace trace rendering by fallingblockentity with display entity for better accuracy 2026-05-24 23:39:50 +02:00
Chaoscaot 52e95e2649 Merge pull request 'fix(VelocityCore): disable replays' (#395) from disable-replays into main
Reviewed-on: SteamWar/SteamWar#395
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-24 13:45:32 +02:00
D4rkr34lm de6ac2cf20 fix 2026-05-24 13:44:57 +02:00
D4rkr34lm 628001e693 Disable Replays 2026-05-24 13:42:08 +02:00
Chaoscaot 47c148d64a Merge pull request 'fix(SpigotCore): techhider not hiding waterlogged blocks if neccecary' (#393) from fix-techhider-not-hidding-waterlogged-blocks into main
Reviewed-on: SteamWar/SteamWar#393
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-23 16:33:11 +02:00
D4rkr34lm 78617d5a98 another fix 2026-05-23 16:15:31 +02:00
D4rkr34lm 69b924ded6 fix techhider not hiding waterlogged blocks if neccecary 2026-05-23 12:29:19 +02:00
YoyoNow 002f7e5542 Merge pull request 'fix(FightSystem): techhider being active in check and test state' (#392) from fix-techhider-being-active-in-check-n-test-arena into main
Reviewed-on: SteamWar/SteamWar#392
Reviewed-by: YoyoNow <4+yoyonow@noreply.localhost>
2026-05-23 06:23:16 +02:00
D4rkr34lm 5d70f75ac9 Move techhider init into enable to prevent always active even in check and test state 2026-05-22 23:12:39 +02:00
YoyoNow 7f21a31ec9 Merge pull request 'refactor(SpigotCore): Techhider to ensure safety and improve reviewablity' (#338) from FightSystem/fix-tech-and-hull-hider into main
Reviewed-on: SteamWar/SteamWar#338
2026-05-22 21:37:03 +02:00
YoyoNow 23b5ab3e82 Fix build 2026-05-22 21:35:01 +02:00
YoyoNow 4f9fe07951 Fix final formatting stuff 2026-05-22 21:29:58 +02:00
YoyoNow 3bcff4c5ce Merge pull request 'perf(FightSystem): increase chunk hiding performance by skipping irrelavant chunks' (#385) from FightSystem/Optimize-new-techhider into FightSystem/fix-tech-and-hull-hider
Reviewed-on: SteamWar/SteamWar#385
Reviewed-by: YoyoNow <4+yoyonow@noreply.localhost>
2026-05-22 20:52:11 +02:00
D4rkr34lm 1810cb7546 Fix inlineing 2026-05-22 20:51:24 +02:00
D4rkr34lm e55ca911c4 Inline get all regions 2026-05-22 20:41:05 +02:00
D4rkr34lm 793f2de6c3 Sync with base branch 2026-05-22 19:42:36 +02:00
D4rkr34lm 54fa47bd99 Ensure parity with old techhider by suppressing select packets 2026-05-22 19:39:57 +02:00
YoyoNow 14a770b207 Merge pull request 'fix(BauSystem): tick step bossbar remaining visable' (#391) from fix-390-fix-tickstep-bosbar-not-disapearing into main
Reviewed-on: SteamWar/SteamWar#391
2026-05-22 18:56:30 +02:00
D4rkr34lm 7b3a04f4eb Remove unused custom event 2026-05-22 18:49:51 +02:00
D4rkr34lm f2a06057a8 Fix tick step bossbar remaining visable 2026-05-22 18:46:36 +02:00
D4rkr34lm e11f3f7cbc Fix preschem state and techider not being always active 2026-05-22 18:27:53 +02:00
D4rkr34lm ebc10c1ce4 Fix constructor visiblity 2026-05-22 17:57:15 +02:00
D4rkr34lm d682e35159 Resolve open comments 2026-05-22 17:55:12 +02:00
D4rkr34lm 7d74eb0c09 add old techhider to skip supporting bausystem for now 2026-05-22 17:40:33 +02:00
D4rkr34lm 7e18207b87 fix entities not despawning 2026-05-22 16:32:49 +02:00
YoyoNow 72b23ad116 Add filling off Hull for reset and paste with either visible blocks or occluding blocks 2026-05-22 16:24:34 +02:00
YoyoNow c508627d92 Merge pull request 'fix(BauSystem): techhider bypass on bau by middleclick pick' (#389) from fix-387-bau-techhider-bypass-by-middleclick into main
Reviewed-on: SteamWar/SteamWar#389
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-22 10:17:19 +02:00
D4rkr34lm 93ff982649 fix techhider bypass on bau by middleclick pick 2026-05-21 23:57:38 +02:00
D4rkr34lm 21f6394359 Fix section packet being unnececarily reconstructed 2026-05-21 22:20:40 +02:00
D4rkr34lm 29d0c8978c Rmeove old player join quickfix 2026-05-21 22:00:15 +02:00
D4rkr34lm 7366f83b15 Merge branch 'FightSystem/fix-tech-and-hull-hider' into FightSystem/Optimize-new-techhider 2026-05-21 21:57:41 +02:00
YoyoNow 9240bcfd5f Add blockUsedForObfuscation 2026-05-21 20:57:59 +02:00
D4rkr34lm bede8caa82 Add chunk skipping optimisation 2026-05-21 20:20:18 +02:00
D4rkr34lm 108aa2af9a remove unused reflection class 2026-05-21 18:46:00 +02:00
D4rkr34lm d07a86c13f remove container hiding as it has no lacalaity mapping posibility 2026-05-21 18:41:55 +02:00
D4rkr34lm 29106d5bb5 Add bundle packet handling 2026-05-21 18:20:15 +02:00
YoyoNow 32fd4b4630 Add Sound handling 2026-05-21 18:11:42 +02:00
YoyoNow c241aef932 Add BlockEntityType handling 2026-05-21 17:53:51 +02:00
D4rkr34lm 2db24ef2eb Merge remote-tracking branch 'origin/FightSystem/fix-tech-and-hull-hider' into FightSystem/fix-tech-and-hull-hider 2026-05-21 15:08:41 +02:00
D4rkr34lm a2caa79f99 Erste bugs ausgemerzt 2026-05-21 15:06:33 +02:00
YoyoNow e49cfa9495 Fix duplicates in CouncilChannel 2026-05-21 13:19:27 +02:00
YoyoNow 1f44b3169e Remove unused stuff 2026-05-21 13:05:16 +02:00
YoyoNow 49fafa5955 Fix build 2026-05-21 13:00:53 +02:00
YoyoNow c81e6b15e5 Merge branch 'main' into FightSystem/fix-tech-and-hull-hider
# Conflicts:
#	FightSystem/FightSystem_Core/src/de/steamwar/fightsystem/utils/HullHider.java
#	SpigotCore/SpigotCore_Main/src/de/steamwar/core/events/AntiNocom.java
2026-05-21 12:59:22 +02:00
D4rkr34lm dc0365834a fixes 2026-05-21 12:13:41 +02:00
YoyoNow 13334e03a4 Add Debugger for remote JVM 2026-05-21 12:11:40 +02:00
YoyoNow b35b2c0138 Add jvmArgs to steamwar.devserver.gradle 2026-05-21 11:31:39 +02:00
YoyoNow 6ef311ce68 Merge pull request 'Fix CouncilChannel' (#384) from VelocityCore/FixDiscordBot into main
Reviewed-on: SteamWar/SteamWar#384
2026-05-21 11:23:06 +02:00
YoyoNow 68d9c55525 Downgrade JDA to 5.5.1 2026-05-21 11:21:35 +02:00
YoyoNow dcd70c5ced Fix CouncilChannel
Update JDA to 6.4.1
2026-05-21 11:20:37 +02:00
D4rkr34lm a1d22b7d77 twast 2026-05-21 10:26:46 +02:00
YoyoNow 3b6fdbeec3 Fix CouncilChannel 2026-05-21 10:16:17 +02:00
YoyoNow 714f86a55b Improve Tablist Header colors 2026-05-21 10:02:34 +02:00
YoyoNow a177cc4faf Fix Tablist
Add UpdateTeamsPacketImpl back
2026-05-21 09:54:48 +02:00
YoyoNow 09aa2ee22c Fix compile of VelocityCore 2026-05-21 08:43:28 +02:00
YoyoNow b8499a7a8a Fix Tablist 2026-05-21 08:36:24 +02:00
YoyoNow e50bff3d38 Merge pull request 'Unwrap the wrappers' (#381) from UnwrapWrapper into main
Reviewed-on: SteamWar/SteamWar#381
2026-05-21 07:56:16 +02:00
D4rkr34lm 8424f842c3 resolve last compile issue in techhider 2026-05-21 00:18:12 +02:00
YoyoNow 8f23f57415 Fix TeamCommand 2026-05-20 23:01:50 +02:00
YoyoNow 3b65b93e73 Merge pull request 'SW Prefix Implementation' (#383) from Jaki/SteamWar:main into main
Reviewed-on: SteamWar/SteamWar#383
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2026-05-20 22:47:46 +02:00
Jakob Schulz 4a458f0e92 fix: update team name checks to use constants for better readability 2026-05-20 22:38:23 +02:00
Jakob Schulz 5f5a98bcd6 refactor team prefix handling and improve configuration parsing 2026-05-20 22:35:19 +02:00
D4rkr34lm 72df919312 cut down old protocol wrapper 2026-05-20 21:47:17 +02:00
D4rkr34lm 7ed36fe56e removed reflections form anti nocom guard 2026-05-20 21:44:28 +02:00
D4rkr34lm a7a8c4d051 Fix imports in tinyProtocol 2026-05-20 21:33:01 +02:00
D4rkr34lm 5da3767378 Started embedding new techhider into fight system 2026-05-20 21:30:44 +02:00
Jakob Schulz 53f98d4cd7 evaluate the config preference once per message 2026-05-20 19:30:06 +02:00
Jakob Schulz 48fb6b5ed7 add parsing for chat prefix mode configuration 2026-05-20 19:06:05 +02:00
Jakob Schulz 24d8ec7301 add "/team prefix" command 2026-05-20 18:34:10 +02:00
D4rkr34lm ba29e5cf23 Add tinyProtocol Handler for techhider 2026-05-20 18:28:39 +02:00
Jakob Schulz a5992a9e4e add "/team info SW" command to display the serverteam 2026-05-20 17:44:52 +02:00
Chaoscaot e94eac9b9d Fix Cauldrons in Schematic GUI
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-20 16:50:04 +02:00
YoyoNow a000beee20 Remove TinyProtocol.addTypedFilter 2026-05-20 13:52:13 +02:00
YoyoNow 2fd6c40b15 Remove some more wrappers 2026-05-20 13:27:49 +02:00
D4rkr34lm 32a2cbb4dd Finish initial implementation of logic 2026-05-19 22:47:22 +02:00
D4rkr34lm cf7a1ee086 Implement logic for hiding chunk data (not finished) 2026-05-19 22:17:41 +02:00
YoyoNow 8da7956523 Fix build 2026-05-19 21:03:38 +02:00
YoyoNow 9b821ff08f Unwrap the wrappers 2026-05-19 19:41:04 +02:00
YoyoNow ae6f279dcf Merge pull request 'add setting to disable block generators' (#375) from Jaki/SteamWar:main into main
Reviewed-on: SteamWar/SteamWar#375
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2026-05-19 19:25:25 +02:00
Jakob Schulz deb56c0c02 rename property 2026-05-19 19:24:03 +02:00
YoyoNow aead25650e Add debug output to TinyProtocol 2026-05-19 18:55:46 +02:00
YoyoNow 53ada2de83 Add debug output to TinyProtocol 2026-05-19 18:50:17 +02:00
YoyoNow 496cc3121c Add debug output to TinyProtocol 2026-05-19 18:41:15 +02:00
Jakob Schulz e9c766dbbb migrate to per material config 2026-05-19 18:39:10 +02:00
Jakob Schulz 706f6ed743 add setting to disable block generators 2026-05-18 21:26:38 +02:00
D4rkr34lm 270d82eb71 Merge branch 'main' into FightSystem/fix-tech-and-hull-hider 2026-05-17 19:58:16 +02:00
Chaoscaot 6da180136e Merge pull request 'fix(SpigotCore): rEntity move packet using incorrect position' (#372) from fix-rentity-system into main
Reviewed-on: SteamWar/SteamWar#372
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-17 19:30:45 +02:00
Chaoscaot 463d8336a7 Merge branch 'main' into fix-rentity-system 2026-05-17 19:29:16 +02:00
Chaoscaot c241b9c264 Merge pull request 'fix-pipeline' (#373) from fix-pipeline into main
Reviewed-on: SteamWar/SteamWar#373
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2026-05-17 19:25:06 +02:00
Chaoscaot b98273a7b2 Fix build, maybe?
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-17 19:20:44 +02:00
Chaoscaot bd28b133a2 Fix build, maybe?
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-17 19:05:24 +02:00
D4rkr34lm 5c618d03e8 Fix entity move 2026-05-17 18:21:33 +02:00
Chaoscaot 89b8a3ea42 Merge pull request 'fix(CI): force clean rebuild in pipeline' (#371) from fix-pipeline into main
Reviewed-on: SteamWar/SteamWar#371
2026-05-17 15:12:49 +02:00
D4rkr34lm 4198a08cda fix pipeline 2026-05-17 15:11:32 +02:00
D4rkr34lm 9f319128cc Update multiblock update packet filter 2026-05-17 13:49:46 +02:00
Chaoscaot 088d548d61 Merge pull request 'Format code' (#370) from Format into main
Reviewed-on: SteamWar/SteamWar#370
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-17 10:59:30 +02:00
YoyoNow e435154c12 Format code 2026-05-17 10:13:31 +02:00
YoyoNow eceb58b28c Format code 2026-05-17 10:12:22 +02:00
YoyoNow 5125453406 Format code 2026-05-17 10:08:06 +02:00
YoyoNow d110df924e Format code 2026-05-16 23:08:09 +02:00
YoyoNow 81dd8045f2 Remove unused code 2026-05-16 22:41:17 +02:00
Chaoscaot 245072f02c Merge pull request 'Remove more Reflection usage' (#368) from ReduceReflection into main
Reviewed-on: SteamWar/SteamWar#368
2026-05-16 22:24:54 +02:00
YoyoNow 00147f2a74 Optimize imports 2026-05-16 22:23:00 +02:00
YoyoNow fcc370c353 Remove even more useless stuff 2026-05-16 22:21:06 +02:00
D4rkr34lm 3bd1cf7167 Even more handlers 2026-05-16 22:12:25 +02:00
YoyoNow cfa650bcf4 Remove more reflection calls 2026-05-16 21:41:50 +02:00
YoyoNow ba4ee08489 Remove most Reflection from REntity 2026-05-16 21:34:18 +02:00
D4rkr34lm 723a7dc0ca Add handling for container 2026-05-16 20:14:09 +02:00
D4rkr34lm 88de28ed68 Add new handler 2026-05-16 19:25:32 +02:00
D4rkr34lm 6f1a3fe70c Update a lot of handlers and prepare for merge with main 2026-05-16 19:19:49 +02:00
D4rkr34lm 4a43e09a8b Add more handlers 2026-05-16 14:45:36 +02:00
Chaoscaot 6fb018b86b Merge pull request 'Remove MinVersion and MaxVersion' (#362) from CleanupCommonCore into main
Reviewed-on: SteamWar/SteamWar#362
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-16 14:43:01 +02:00
YoyoNow ec310dfee9 Remove MinVersion and MaxVersion 2026-05-16 14:41:02 +02:00
YoyoNow 9de5a93997 Remove MinVersion annotation 2026-05-16 14:37:36 +02:00
Chaoscaot ce88e88859 Merge pull request 'Upgrade all projects to Java 21 and migrate dependencies to Paper and FastAsyncWorldEdit.' (#360) from Refactor/remove-old-dependencies into main
Reviewed-on: SteamWar/SteamWar#360
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2026-05-16 14:36:59 +02:00
Chaoscaot 5589c6cd20 Merge branch 'main' into Refactor/remove-old-dependencies 2026-05-16 14:31:11 +02:00
Chaoscaot 35dead9c74 Merge pull request 'Reflection Reduction' (#357) from ReflectionReduction into main
Reviewed-on: SteamWar/SteamWar#357
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-16 14:29:39 +02:00
YoyoNow f1fbe14e60 Fix ChunkHider 2026-05-16 14:27:07 +02:00
YoyoNow b146c9928f Fix FlatteningWrapper 2026-05-16 14:08:29 +02:00
Chaoscaot 136b0f5b97 Refactor to simplify API usage and improve compatibility by replacing legacy methods and adapting to updated libraries.
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-16 14:08:28 +02:00
Chaoscaot 2d679028c0 Merge remote-tracking branch 'origin/ReflectionReduction' into Refactor/remove-old-dependencies 2026-05-16 14:03:19 +02:00
YoyoNow ce1f947f4b Remove Core.getVersion calls 2026-05-16 14:02:57 +02:00
Chaoscaot 5fb51b63c3 Fix Build
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-16 13:54:37 +02:00
Chaoscaot c04dc8fd86 Merge remote-tracking branch 'refs/remotes/origin/ReflectionReduction' into Refactor/remove-old-dependencies
# Conflicts:
#	MissileWars/build.gradle.kts
2026-05-16 13:53:29 +02:00
YoyoNow ab3970981d Remove more reflection 2026-05-16 13:46:42 +02:00
YoyoNow 9e4c9ce04a Remove more reflection 2026-05-16 13:38:10 +02:00
Chaoscaot 44e37467d6 Fix Build
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-16 13:29:49 +02:00
Chaoscaot 7c74ca014d Upgrade all projects to Java 21 and migrate dependencies to Paper and FastAsyncWorldEdit.
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-16 13:26:18 +02:00
YoyoNow e7454f6ce8 Fight FightWorld 2026-05-16 13:07:06 +02:00
YoyoNow a100d2d798 Remove more Reflection stuff 2026-05-16 13:02:20 +02:00
YoyoNow 3c48e7c02d Remove most calls to Reflection.getClass 2026-05-16 13:01:50 +02:00
YoyoNow 2b3c79fcab Merge pull request 'fix(FighSystem): Add chunk packet resend after join to enhance security' (#358) from FightSystem/tech-hider-hardening into main
Reviewed-on: SteamWar/SteamWar#358
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2026-05-16 12:58:00 +02:00
YoyoNow 7ff778b60a Merge pull request 'UpdateTinyProtocol' (#359) from UpdateTinyProtocol into main
Reviewed-on: SteamWar/SteamWar#359
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2026-05-16 12:57:15 +02:00
YoyoNow b83476b451 Fix TechhiderbugCommand 2026-05-16 12:28:52 +02:00
YoyoNow 58652cac5c Fix BauSystem build and local CMDFramework build 2026-05-16 12:22:40 +02:00
YoyoNow b216438a47 Add SteamWar adaption for TinyProtocol 2026-05-16 11:52:06 +02:00
YoyoNow 604657a084 Add singleton to TinyProtocol 2026-05-16 11:37:39 +02:00
YoyoNow 5a57b5f799 Remove Reflection from TinyProtocol 2026-05-16 11:36:09 +02:00
YoyoNow be233c65fe Update TinyProtocol 2026-05-16 11:18:40 +02:00
D4rkr34lm 9f201f8191 update packet codec 2026-05-15 21:50:09 +02:00
Chaoscaot 55c1962294 Fix MissileWars Missile Pasting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 20:53:13 +02:00
Chaoscaot 441932b30a Fix MissileWars Missile Pasting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 20:39:30 +02:00
D4rkr34lm bdecec304a Update with nms based refresh 2026-05-15 20:26:15 +02:00
D4rkr34lm 75e3e77478 Merge branch 'main' into FightSystem/tech-hider-hardening 2026-05-15 20:16:20 +02:00
Chaoscaot 5c93ca6143 Update bug report URL in DiscordTicketType enum
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 16:49:18 +02:00
D4rkr34lm 0452a9faa5 Add processors for a sed of id only entity packets 2026-05-15 16:23:23 +02:00
D4rkr34lm 9a75f38226 Continue 2026-05-15 16:14:05 +02:00
Chaoscaot 6d24aa160f Fix CI
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 16:12:39 +02:00
Chaoscaot 105630bbd8 Fix CI
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 16:09:36 +02:00
Chaoscaot 228ab5b2f2 Merge pull request 'Cleanup Version Code' (#339) from RemoveVersionCode into main
Reviewed-on: SteamWar/SteamWar#339
2026-05-15 16:07:25 +02:00
Chaoscaot b97fe7e5b1 Merge branch 'main' into RemoveVersionCode 2026-05-15 16:05:42 +02:00
YoyoNow 01db4fa951 Fix CraftbukkitWrapper for FightSystem 2026-05-15 16:00:50 +02:00
Chaoscaot cb153b50f1 Merge remote-tracking branch 'origin/main' 2026-05-15 15:51:06 +02:00
Chaoscaot 8b33bf40c3 Add CLI artifact deployment and service restart steps in build workflow
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 15:51:01 +02:00
YoyoNow 9a6221b723 Fix DiscordChannel 2026-05-15 15:44:27 +02:00
Chaoscaot a20b1cb263 Disable blank issues in Gitea configuration
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 15:39:04 +02:00
Chaoscaot cfe6055083 Disable blank issues in Gitea configuration
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 15:38:11 +02:00
Chaoscaot eea9abdc56 Add Templates
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 15:37:29 +02:00
Chaoscaot 138b94e562 Merge pull request 'Test Backporting' (#354) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#354
2026-05-15 15:09:46 +02:00
Chaoscaot d11467bd1b Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 15:09:28 +02:00
Chaoscaot 7be40d9bf9 Merge pull request 'Test Backporting' (#352) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#352
2026-05-15 15:03:40 +02:00
Chaoscaot dae8073992 Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 15:03:22 +02:00
Chaoscaot 143e7dc17c Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 15:03:01 +02:00
Chaoscaot f4ace64173 Merge pull request 'Test Backporting' (#351) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#351
2026-05-15 14:55:44 +02:00
Chaoscaot 236b486845 Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:55:13 +02:00
Chaoscaot c666f0228d Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:54:31 +02:00
YoyoNow 81049856b5 Fix build 2026-05-15 14:52:17 +02:00
YoyoNow 4813e24848 Remove LegacyBauSystem 2026-05-15 14:52:17 +02:00
YoyoNow d61d001ddf Cleanup FightSystem 2026-05-15 14:52:17 +02:00
YoyoNow 060364abb5 Cleanup SpigotCore 2026-05-15 14:52:17 +02:00
YoyoNow 13185f0e05 Cleanup SchematicSystem 2026-05-15 14:52:17 +02:00
YoyoNow fd266969f5 Cleanup BauSystem 2026-05-15 14:52:17 +02:00
Chaoscaot bd471330e1 Merge pull request 'Test Backporting' (#350) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#350
2026-05-15 14:48:42 +02:00
Chaoscaot 92602efa9e Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:48:13 +02:00
Chaoscaot 55a39ac85a Merge remote-tracking branch 'origin/main' 2026-05-15 14:47:41 +02:00
Chaoscaot 39898825ef Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:47:37 +02:00
Chaoscaot 59a2d1454e Merge pull request 'Test Backporting' (#349) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#349
2026-05-15 14:41:44 +02:00
Chaoscaot 16c324cf32 Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:41:25 +02:00
Chaoscaot b923b98b2c Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:41:06 +02:00
Chaoscaot afca7d5135 Merge pull request 'Test Backporting' (#348) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#348
2026-05-15 14:37:22 +02:00
Chaoscaot a05bebcd81 Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:35:30 +02:00
Chaoscaot 02cc8330ca Add automated CommonCore backport workflow
- Create backport PRs for merged CommonCore changes on `main`
- Auto-merge successful backport PRs into `version/*` branches
- Add opt-out label handling for backports
2026-05-15 14:35:02 +02:00
Chaoscaot f8397b8bab Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:15:35 +02:00
Chaoscaot 38603fbe45 Merge pull request 'Test Backporting' (#347) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#347
2026-05-15 14:14:15 +02:00
Chaoscaot 78700e868d Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:14:04 +02:00
Chaoscaot 259e8bdb7b Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:13:41 +02:00
Chaoscaot 0ea3c25b7b Merge pull request 'Test Backporting' (#346) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#346
2026-05-15 14:02:39 +02:00
Chaoscaot 2fa1b7d329 Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:02:24 +02:00
Chaoscaot af805f6ba4 Merge pull request 'Test Backporting' (#345) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#345
2026-05-15 14:01:41 +02:00
Chaoscaot 34c361d3f8 Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 14:01:22 +02:00
Chaoscaot 83eb621b0f Merge pull request 'Test Backporting' (#344) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#344
2026-05-15 13:58:00 +02:00
Chaoscaot 65aaf4857d Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 13:55:12 +02:00
Chaoscaot 7d52447b00 Merge pull request 'Test Backporting' (#343) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#343
2026-05-15 13:54:00 +02:00
Chaoscaot 046ab8d1a8 Merge branch 'main' into test/backporting 2026-05-15 13:53:53 +02:00
Chaoscaot 33c032092d Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 13:53:09 +02:00
Chaoscaot b8eeb93a8f Merge pull request 'Test Backporting' (#342) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#342
2026-05-15 13:44:41 +02:00
Chaoscaot e95f68406f Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 13:44:23 +02:00
Chaoscaot c6f432a5c4 Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 13:43:56 +02:00
Chaoscaot 9ca7446dba .gitea/workflows/backport-commoncore.yml aktualisiert 2026-05-15 13:42:26 +02:00
Chaoscaot 773a1adf64 Merge pull request 'Test Backporting' (#341) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#341
2026-05-15 13:38:23 +02:00
Chaoscaot 6afe5d4c0d Test Backporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 13:31:49 +02:00
Chaoscaot 755a05fe34 Add merge-backport workflow to automate PR backports after successful builds
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 13:31:11 +02:00
Chaoscaot 202da658ee Refactor workflows: split pull request build, rename deploy, and remove unused steps
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 12:47:00 +02:00
Chaoscaot a5856cf240 Merge pull request 'Test Autobackporting' (#340) from test/backporting into main
Reviewed-on: SteamWar/SteamWar#340
2026-05-15 12:31:37 +02:00
Chaoscaot 38099e6167 Test Autobackporting
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 12:28:10 +02:00
Chaoscaot d307038e5e Use non basic caching
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 12:07:41 +02:00
Chaoscaot d5aeeaf5e3 Add backport workflow for CommonCore changes and update build.yml
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 12:04:02 +02:00
Chaoscaot 134a05ea23 Add build.yml
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 11:37:16 +02:00
Chaoscaot db63f2a67c Add build.yml
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 11:29:08 +02:00
Chaoscaot 97a3c3ef35 .gitea/workflows/build.yml aktualisiert 2026-05-15 11:09:37 +02:00
Chaoscaot a40e904ab3 .gitea/workflows/build.yml aktualisiert 2026-05-15 11:06:54 +02:00
Chaoscaot a8a89b0809 .gitea/workflows/build.yml aktualisiert 2026-05-15 10:30:13 +02:00
Chaoscaot 480efd1f8b Add build.yml
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-15 10:11:29 +02:00
YoyoNow 26baccf3c4 Test push 2026-05-15 10:09:02 +02:00
Manuel Frohn 42808f40c0 preclassify packets as safe 2026-05-15 00:48:45 +02:00
Manuel Frohn 57c21122e6 Classify packets by scope 2026-05-15 00:32:09 +02:00
Manuel Frohn 42faba70d9 Add remaining packets with toss handler for now 2026-05-14 22:08:17 +02:00
Manuel Frohn 99e1f01869 Update bypass list with harmless play-client bound packets 2026-05-14 21:38:37 +02:00
Manuel Frohn 13bddbe359 Update bypass list with full set of configuration and login packets 2026-05-14 20:21:36 +02:00
D4rkr34lm 51ff0e1a9f Fix remaining local issues 2026-05-14 11:57:26 +02:00
D4rkr34lm 6766862a00 Refactored over all functionality 2026-05-13 22:48:44 +02:00
Chaoscaot 916f9b2557 Merge pull request 'SteamWar CLI merge' (#330) from feature/steamwar-cli into main
Reviewed-on: SteamWar/SteamWar#330
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2026-05-13 22:42:59 +02:00
Manuel Frohn c30aad179b Continue refactor 2026-05-13 17:20:32 +02:00
Manuel Frohn d3aad6a198 Move over signle block event package processing 2026-05-13 16:24:45 +02:00
Manuel Frohn 744dc67ca9 Move over identified packages from old impl 2026-05-13 15:33:08 +02:00
Manuel Frohn 164a7f5826 Replace tinyProtocolLib with newest version 2026-05-13 14:04:38 +02:00
Manuel Frohn 210cfcf3a6 Add player join chunk refrech 2026-05-13 13:47:29 +02:00
YoyoNow 34992344b2 Fix CheckCommand.accept 2026-05-12 16:47:30 +02:00
YoyoNow 1ea8dea381 Fix WhoisCommand.whois 2026-05-11 21:03:51 +02:00
Chaoscaot 15aa0572f3 Merge pull request 'Implement old bau behavior for WGS' (#332) from old-bau-behavior into main
Reviewed-on: SteamWar/SteamWar#332
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2026-05-10 18:55:25 +02:00
Chaoscaot 6a843f4a71 Implement old bau behavior for WGS
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-10 11:29:26 +02:00
Chaoscaot a63c1a94ca Fix TNT explosion logic to handle non-TNT entities correctly
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-09 21:10:43 +02:00
Chaoscaot 43263035d9 Merge pull request 'Add DB Indexes for future local Development deployments' (#262) from add-db-indexes into main
Reviewed-on: SteamWar/SteamWar#262
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2026-05-09 20:23:56 +02:00
Chaoscaot 42ab55d0f8 Merge branch 'main' into add-db-indexes
# Conflicts:
#	CommonCore/SQL/src/de/steamwar/sql/BannedUserIPs.kt
2026-05-09 20:22:15 +02:00
Chaoscaot 44846cce57 Unpack CLI distribution in release
- Remove CLI installDist from build step
- Copy the packaged sw.zip into /jars during release
- Use `rm -rf` for the existing `/jars/sw` cleanup
2026-05-09 16:51:04 +02:00
Chaoscaot 1451750bcb Add SteamWar CLI module
- add Clikt-based `sw` entrypoint and subcommands
- include database, user, dev, and profiler commands
- wire CLI build and CI install/release steps
2026-05-09 16:46:59 +02:00
YoyoNow 8ade5180cb Fix FightSystem 2026-05-08 20:55:17 +02:00
Chaoscaot d0535d0c47 Merge pull request '[fightsystem]: Fix broken kit system' (#322) from bugfix/fightsystem-broken-kits into main
Reviewed-on: SteamWar/SteamWar#322
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-04 18:31:25 +02:00
zOnlyKroks 79fa09e39b Chaos zufrieden stellen 2026-05-04 18:27:28 +02:00
Chaoscaot 4010c2125c Refactor lazy loading of dependents and relations to return lists
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-05-04 13:41:07 +02:00
zOnlyKroks 32de0077de [fightsystem]: Rework blacklist to whitelist 2026-05-03 14:15:59 +02:00
Chaoscaot bd53e016c5 Merge pull request 'feat: Add highligh flag for tracer' (#320) from BauSystem/add-highlight-trace-flag into main
Reviewed-on: SteamWar/SteamWar#320
Reviewed-by: zOnlyKroks <zonlyknox@gmail.com>
2026-05-03 13:04:37 +02:00
zOnlyKroks 5b1ed644d1 [fightsystem]: Fix broken kit system 2026-05-03 12:52:23 +02:00
D4rkr34lm a41787d89d Add flag 2026-05-02 13:36:32 +02:00
Chaoscaot 8e392b56c3 Merge pull request 'fix: windcharge check' (#318) from fix/mssing-string-get into main
Reviewed-on: SteamWar/SteamWar#318
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-01 12:30:42 +02:00
D4rkr34lm 42feadcd2d Add left out name get 2026-05-01 11:53:57 +02:00
Chaoscaot 15f0344416 Merge pull request 'feat: Add temporary hardcoded windcharge check to autockecker for WGS' (#316) from fix/enable-windcharges-for-wgs into main
Reviewed-on: SteamWar/SteamWar#316
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2026-05-01 11:03:38 +02:00
D4rkr34lm c90a977ab2 use same hacky impl as in fight system 2026-05-01 11:02:33 +02:00
D4rkr34lm b186228f4e Revert "swap out used api"
This reverts commit 5f38474809.
2026-05-01 10:59:23 +02:00
D4rkr34lm 5f38474809 swap out used api 2026-05-01 10:54:53 +02:00
Manuel Frohn 4f27320548 Implement hardcoded windcharge check 2026-04-30 14:44:54 +02:00
D4rkr34lm ba7bd1f1dd Configure V21 impl 2026-04-30 12:52:46 +02:00
YoyoNow fbe70e7ead Improve CheckCommand for WGS 2026-04-24 10:09:56 +02:00
YoyoNow 30a499be1d Hotfix CheckCommand
Remove uneeded stuff in SQLWrapper
2026-04-23 23:33:02 +02:00
Chaoscaot 86e212fe42 Fix Kits
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-04-23 18:23:13 +02:00
YoyoNow 4a646e6be0 Improve WindchargeStopper 2026-04-23 12:09:17 +02:00
YoyoNow bc0dc1925e Merge pull request 'Add WindchargeStopper to handle wind charge entity removal based on fight boundaries' (#182) from windcharges into main
Reviewed-on: SteamWar/SteamWar#182
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2026-04-23 12:04:34 +02:00
YoyoNow c3af4dbc68 Merge pull request 'Add CreateKitCommand' (#271) from add-kit-command into main
Reviewed-on: SteamWar/SteamWar#271
2026-04-23 12:01:18 +02:00
YoyoNow 703639537d Fix CreateKitCommand 2026-04-23 11:59:28 +02:00
YoyoNow 9ac3bf6a6c Redesign GameModeConfig and SchematicType 2026-04-23 11:54:50 +02:00
YoyoNow 41ea6c9407 Fix ViewFlag.ADVANCED 2026-04-23 08:27:43 +02:00
YoyoNow 67e9a3544e Fix Tablist.disable removing gm knowledge 2026-04-20 13:45:16 +02:00
YoyoNow f69ae3e77b Fix BauLock 2026-04-20 13:31:45 +02:00
Chaoscaot 2208dcc0fb Fix Set Parent
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-04-15 18:20:07 +02:00
YoyoNow b466216b3a Fix BlockFormListener 2026-04-13 20:33:11 +02:00
YoyoNow 5a862b251b Add BlockFormListener 2026-04-13 20:29:47 +02:00
YoyoNow 60a82a685d Improve FightSystem REDUCED_DEBUG_INFO on Test Arena 2026-04-13 20:18:43 +02:00
YoyoNow 573b0c14ae Improve FightSystem REDUCED_DEBUG_INFO on Test Arena 2026-04-13 20:03:41 +02:00
YoyoNow 82abe7e20f Fix OutsideWincondition 2026-04-05 12:34:11 +02:00
YoyoNow 34da59714e Fix IngameListener and StartCommand 2026-04-05 12:30:55 +02:00
YoyoNow 97071165cd Fix IngameListener, OutsideWincondition, TowerGenerator 2026-04-05 12:08:29 +02:00
YoyoNow 634465fbf1 Fix BanListener inserting bedrock ips 2026-04-04 12:08:17 +02:00
YoyoNow 2ad8cc3f4a Merge branch 'RemoveUnusedSQL' 2026-04-02 09:01:20 +02:00
YoyoNow e190fe0858 Fix FreezeListener 2026-04-01 19:43:31 +02:00
YoyoNow 569d91a0d3 Remove SelectAdjacent as it annoys most players 2026-03-29 14:15:01 +02:00
YoyoNow 487a15849a Add supress warnings 2026-03-29 13:12:09 +02:00
YoyoNow e110033315 Fix Replays for 1.21 2026-03-29 13:05:41 +02:00
YoyoNow c0b192e2bf Fix WorldEditWrapper not loading schematics in 1.21 2026-03-29 12:53:55 +02:00
YoyoNow 612254296c Fix WorldEditWrapper21 2026-03-29 11:55:16 +02:00
Chaoscaot 1dbcb122c2 Change Loader to use FastSchematicReaderV3
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-03-28 22:30:01 +01:00
Chaoscaot f2ee9dbeb3 Fix Schematic Tabcomplete
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-03-28 22:24:07 +01:00
YoyoNow 404ab2abfb Update GDPRQuery 2026-03-25 07:46:38 +01:00
YoyoNow 59a927c33c Remove Team.address and Team.port
Remove PollAnswer and UserElo from GDPRQuery
2026-03-24 22:11:19 +01:00
Chaoscaot 6c062216a1 Remove usage of EffectiveSchematicNode
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-03-24 20:07:17 +01:00
YoyoNow 72d62dfbe5 Fix AutoCheckerResult ignoring Water and Lava correctly 2026-03-22 15:23:46 +01:00
YoyoNow 76ecaccc41 Hotfix AutoChecker15 for now 2026-03-21 17:45:26 +01:00
YoyoNow 9587b9e1fd Fix Laufbau double click 2026-03-21 09:46:20 +01:00
YoyoNow 14dc807fd9 Fix SoulSand in LaufbauCommand 2026-03-21 09:39:17 +01:00
YoyoNow 63ad85f727 Fix TickManager21.stepTicks 2026-03-21 09:37:05 +01:00
YoyoNow 72e88502d2 Fix TeamCommand /team event ... 2026-03-21 09:26:02 +01:00
YoyoNow 71767ef6d9 Fix TeamCommand /team event ... 2026-03-21 09:20:57 +01:00
YoyoNow 5e19629df5 Fix build 2026-03-15 12:54:43 +01:00
YoyoNow ca70c6685c Remove Lunar client support
They currently have a problem with their maven repository
2026-03-15 12:52:56 +01:00
YoyoNow f00bd153fe Add GameModeConfig#Schematic#ReplacementsWithoutBlockUpdates
Add GameModeConfig#Schematic#ReplacementsWithBlockUpdates
2026-03-15 12:49:13 +01:00
YoyoNow c1221e5cf5 Remove SWTSI (SteamWar Teamserver Integration) 2026-03-13 21:16:13 +01:00
YoyoNow 236944ff69 Remove useless System.out 2026-03-13 21:12:34 +01:00
YoyoNow ab85c72fe3 Fix DesignEndStone
Closes: #292
Closes: #288
2026-03-13 21:08:00 +01:00
YoyoNow a750185df0 Fix stop not working for DevServer starter 2026-03-02 12:10:18 +01:00
YoyoNow 008ff1091f Hotfix DevCommand 2026-03-02 11:59:52 +01:00
YoyoNow 5d24581038 Fix WaterRemover.handleEntityExplode 2026-03-01 21:47:22 +01:00
YoyoNow bce07a4ac8 Add GameModeConfig.ArenaConfig.WaterDamage for hard water damage by setting air or normal handling 2026-03-01 21:36:29 +01:00
Chaoscaot 30b7bbc283 Fix WebPW Command
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-02-09 09:28:14 +01:00
Chaoscaot 46a11af6ca Fix Ban Command
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-02-02 19:12:34 +01:00
Chaoscaot 73f903fc23 Merge branch 'main' into add-db-indexes 2026-01-23 23:04:11 +01:00
YoyoNow 361c698323 Check why StaticMessageChannel does not work? 2026-01-09 10:07:26 +01:00
YoyoNow db4ea2d69d Check why StaticMessageChannel does not work? 2026-01-09 10:05:17 +01:00
YoyoNow 3cecc58bce Check why StaticMessageChannel does not work? 2026-01-09 10:03:14 +01:00
YoyoNow ce3d50fcb7 Check why StaticMessageChannel does not work? 2026-01-09 10:01:36 +01:00
YoyoNow 61bd28150b Check why StaticMessageChannel does not work? 2026-01-09 09:59:22 +01:00
YoyoNow bb9caa28a3 Check why StaticMessageChannel does not work? 2026-01-09 09:57:18 +01:00
YoyoNow 4b2970d243 Check why StaticMessageChannel does not work? 2026-01-09 09:53:34 +01:00
Chaoscaot 834767edbe Fix API
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-01-04 12:35:11 +01:00
Chaoscaot 25116c3865 Add CreateKitCommand
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-01-03 02:30:36 +01:00
Chaoscaot 4bea077d36 Fix Kits
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-01-03 02:25:52 +01:00
Chaoscaot 74d6ccc24f Fix Kits
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-01-03 02:22:55 +01:00
Chaoscaot d9f905d957 Fix Kits
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-01-02 14:24:49 +01:00
Chaoscaot 663a745d8f Fix Kits
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-01-02 14:08:49 +01:00
Chaoscaot 1f64c3383d Fix HotbarKitListener
Signed-off-by: Chaoscaot <max@maxsp.de>
2026-01-01 17:04:09 +01:00
Lixfel e4676d5eba Test hotpatch kit 2026-01-01 15:08:37 +01:00
Chaoscaot ebb2ec817d Fix Windcharge Damage on Arena
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-27 19:18:31 +01:00
Chaoscaot b6445ce2e9 Merge pull request 'Change Bug Button to Link' (#263) from update-bug-button into main
Reviewed-on: SteamWar/SteamWar#263
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-12-25 21:09:37 +01:00
Chaoscaot a454da6da8 Change Bug Button to Link
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-25 21:07:53 +01:00
Chaoscaot 22ed7e23da Add DB Indexes for future local Development deployments
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-25 20:51:57 +01:00
YoyoNow a87cc94700 Pot fix for WinconditionBasePercent 2025-12-23 12:27:48 +01:00
YoyoNow 31dac93698 Remove UnrankCommand 2025-12-23 10:40:53 +01:00
YoyoNow 1f568f3d8b Remove UnrankCommand 2025-12-22 21:25:40 +01:00
YoyoNow b8b8dd1ba0 Update UserPerm.kt 2025-12-21 13:25:30 +01:00
YoyoNow 99f864d889 Hotfix SteamwarUser and ServerStarter 2025-12-21 12:27:55 +01:00
YoyoNow 711a21b634 Merge pull request 'Remove SchemElo and UserElo' (#256) from RemoveElo into main
Reviewed-on: SteamWar/SteamWar#256
2025-12-21 12:04:27 +01:00
YoyoNow 9a85e8b442 Merge branch 'main' into RemoveElo 2025-12-21 12:03:33 +01:00
Chaoscaot 8358203cd4 Fix kits frfrfrfrfrfr
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-20 22:15:30 +01:00
Chaoscaot 6a619c2fd1 Fix kits frfrfrfrfr?
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-20 22:12:48 +01:00
Chaoscaot d348e4a480 Fix kits frfrfrfr?
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-20 22:10:25 +01:00
Chaoscaot 1269e4d971 Fix kits frfrfr
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-20 22:03:09 +01:00
Chaoscaot feac17d732 Fix kits frfr
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-20 21:58:44 +01:00
Chaoscaot 975b2bb8e6 Fix Kits and Maybe? Locale
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-20 21:35:34 +01:00
YoyoNow a1add4f997 Remove SchemElo and UserElo 2025-12-20 21:28:00 +01:00
YoyoNow b517fe3ad0 Remove SchemElo and UserElo 2025-12-20 21:26:42 +01:00
YoyoNow ac5dda58a1 Remove SchemElo and UserElo 2025-12-20 21:19:20 +01:00
YoyoNow 9efe625603 Pot fix for too many open files 2025-12-20 13:14:35 +01:00
YoyoNow 146ed598c8 Improve message on non ManualCheck submitted schematics 2025-12-20 12:20:36 +01:00
YoyoNow 50e86fbf89 Add 1.19 impl for SteamwarGameProfileRepository 2025-12-20 11:53:28 +01:00
YoyoNow 7216806a1c Fix SWPlayer on 1.15 2025-12-20 11:45:36 +01:00
YoyoNow 6cda79f7e1 Fix AbstractLinker 2025-12-20 11:41:36 +01:00
YoyoNow 87cc43a348 Fix FAWE stuff in 1.15 2025-12-20 11:35:08 +01:00
YoyoNow f9509c19d1 Trigger rebuild 2025-12-19 21:20:32 +01:00
YoyoNow e7bd5a9e74 Fix translation 2025-12-19 13:37:29 +01:00
YoyoNow aa74e0b887 Fix SQLWrapperImpl 2025-12-18 18:18:56 +01:00
Chaoscaot fe8d37c966 Maybe? Fix kits
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-17 23:29:00 +01:00
YoyoNow ccb79737db Fix Core.setServerName 2025-12-17 21:33:19 +01:00
Chaoscaot 1eea792e23 Synchronize team cache access to ensure thread safety
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-17 21:29:14 +01:00
YoyoNow 19c6ad0965 Merge pull request 'Add WorldIdentifier' (#249) from SpigotCore/WorldIdentifier into main
Reviewed-on: SteamWar/SteamWar#249
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-12-17 21:28:41 +01:00
YoyoNow 2c5306bfd1 Merge pull request 'Add WaterDestroy feature with command and listener' (#248) from waterblocker into main
Reviewed-on: SteamWar/SteamWar#248
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-12-17 21:13:45 +01:00
YoyoNow 1982b5e42c Update WaterDestroyCommand 2025-12-17 21:13:31 +01:00
Chaoscaot 3ad4081add Merge pull request 'Add AuditLog to Backend' (#244) from Backend/auditlog into main
Reviewed-on: SteamWar/SteamWar#244
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-12-17 21:03:04 +01:00
Chaoscaot 33a7961979 Add WaterDestroy feature with command and listener
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-17 20:49:23 +01:00
YoyoNow 4e994813eb Add WorldIdentifier 2025-12-17 20:31:21 +01:00
YoyoNow 367a72141a Undo Improve TNTDistributor 2025-12-17 11:32:11 +01:00
YoyoNow c29788f1eb Improve TNTDistributor 2025-12-17 11:15:47 +01:00
YoyoNow 9d32a331ca Improve TNTDistributor 2025-12-16 14:50:56 +01:00
YoyoNow c55494aeba Revert WinconditionPercent for QuickGear 2025-12-16 14:15:04 +01:00
YoyoNow 61dcee6f8e Improve WinconditionPercent for QuickGear 2025-12-16 13:20:55 +01:00
Chaoscaot 8b2b7e011a Add WaterDestroy feature with command and listener
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-11 00:34:29 +01:00
YoyoNow 8640d43d4b Merge pull request 'BauSystem/ImproveRegionData' (#234) from BauSystem/ImproveRegionData into main
Reviewed-on: SteamWar/SteamWar#234
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-12-03 13:26:10 +01:00
YoyoNow fbdb0cfaf1 Merge pull request 'Fix replay in 1.21 -> RPlayer needs fixing before' (#199) from FightSystem/ReplayFix21 into main
Reviewed-on: SteamWar/SteamWar#199
2025-12-03 10:05:03 +01:00
YoyoNow 9305ab5f91 Merge pull request 'Refactor Authlib integration and adjust entity handling for 1.21 compatibility' (#106) from 1.21.1/rplayer-fix into main
Reviewed-on: SteamWar/SteamWar#106
2025-12-03 10:04:50 +01:00
YoyoNow 34ade1de19 Merge branch 'main' into 1.21.1/rplayer-fix 2025-12-03 09:59:33 +01:00
YoyoNow 87d0df8067 Merge pull request 'Remove Poll-System' (#245) from Refactor/remove-poll-system into main
Reviewed-on: SteamWar/SteamWar#245
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-12-03 09:56:28 +01:00
Chaoscaot 09d2ed5384 Include permissions in /me route response
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-02 22:24:24 +01:00
Chaoscaot b576c36c2d Reapply "Improve Performance"
This reverts commit 0a7a753c48.

Signed-off-by: Chaoscaot <max@maxsp.de>

# Conflicts:
#	WebsiteBackend/src/de/steamwar/routes/AuditLog.kt
2025-12-02 21:59:34 +01:00
Chaoscaot 2f8491c3f6 Fix Team Creation
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-02 21:35:14 +01:00
Chaoscaot a089d42d9a Improve Performance
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-02 21:34:35 +01:00
Chaoscaot 0a7a753c48 Revert "Improve Performance"
This reverts commit 86bfde90b8.
2025-12-02 21:14:00 +01:00
Chaoscaot 86bfde90b8 Improve Performance
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-02 21:13:43 +01:00
Chaoscaot 4df92f7e5f Remove Poll-System
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-02 20:43:37 +01:00
Chaoscaot 9a78b99a75 Remove Poll-System
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-02 16:39:16 +01:00
Chaoscaot 1de1bf6571 Fix Leaderboard ID handling
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-02 00:47:54 +01:00
Chaoscaot 7c5a927d0f Add AuditLog to Backend
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-01 18:36:36 +01:00
Chaoscaot dfb71594b9 Fix Leaderboard
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-01 14:49:23 +01:00
Chaoscaot f535e056c7 Merge remote-tracking branch 'origin/main'
# Conflicts:
#	LobbySystem/src/de/steamwar/lobby/special/advent/Present.java
2025-12-01 12:23:34 +01:00
Chaoscaot e67e340707 Fix Advent Calendar Present parent ID handling
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-01 12:23:04 +01:00
YoyoNow a594a163f7 Fix NodeMember for Present since the setter for parent apparently does not work 2025-12-01 09:14:09 +01:00
YoyoNow 1c0146a02d Fix SchematicNode.parentNode get 2025-12-01 09:01:00 +01:00
Chaoscaot d3fecf763c Fix Lobby
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-12-01 00:21:12 +01:00
Chaoscaot 3944c011b0 Fix Lobby
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-30 21:22:21 +01:00
Chaoscaot 1f4a77e8b4 Fix Lobby
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-30 20:59:03 +01:00
Chaoscaot 4d40e52ea6 Merge pull request 'Refactor leaderboard management' (#166) from Lobby/refactor-leaderboard into main
Reviewed-on: SteamWar/SteamWar#166
2025-11-30 20:56:10 +01:00
YoyoNow 698e411944 Fix SQLWrapperImpl.getMaterialWithGreaterBlastResistance for 1.12 or lower 2025-11-30 20:18:58 +01:00
Chaoscaot 0fd7aab86c Fix FightStatistics
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-30 17:27:27 +01:00
YoyoNow 624fe98c47 Add some Clear tasks 2025-11-30 16:12:52 +01:00
Chaoscaot ede7df82f3 Fix FightStatistics
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-30 16:09:40 +01:00
Chaoscaot 3970f21999 Yeet Lunar
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-30 15:04:56 +01:00
Chaoscaot 6f248b78b8 Maybe fix Techhider
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-30 14:36:44 +01:00
Chaoscaot 6f4ec64ef7 Fix EventRelations
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-29 18:51:18 +01:00
YoyoNow bfc835b0dc Hotfix steamwar.java.gradle 2025-11-29 18:27:08 +01:00
YoyoNow 2dfad9e55c Hotfix FightStatistics 2025-11-29 17:57:25 +01:00
YoyoNow 00f5481630 Fix tnt only listeners detecting WindCharges 2025-11-28 12:15:34 +01:00
YoyoNow 2424bd430d Fix TNTListener action bar message showing for WindCharge
Remove OtherTNTListener and merge into TNTListener
2025-11-28 12:13:06 +01:00
YoyoNow eafb469eca Remove FlagStorage and merge into RegionData 2025-11-28 12:04:36 +01:00
YoyoNow 14bd38f471 Improve FlagStorage 2025-11-28 11:59:14 +01:00
YoyoNow c107b741c0 Merge pull request 'Add UserPerm.PUNISHMENTS' (#233) from CommonCore/UserPerm-Punishments into main
Reviewed-on: SteamWar/SteamWar#233
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-11-28 10:10:13 +01:00
YoyoNow febf2c283d Fix REntity.bowDrawnWatcher 2025-11-28 09:56:18 +01:00
YoyoNow 5f53ebf5b3 Fix REntity.getEquipmentPacket
Fix FightSchematic.pasteTeamName
2025-11-28 09:27:04 +01:00
YoyoNow f6f7b0dced Add UserPerm.PUNISHMENTS
Improve PunishmentType needed permissions
2025-11-28 08:02:28 +01:00
YoyoNow 5bdbf5dff4 Fix schematic commands for SteamWarLuaPlugin
Closes: #228
2025-11-25 22:10:14 +01:00
YoyoNow 1ae445319a Improve Present.click 2025-11-25 22:04:44 +01:00
YoyoNow a426a563db Fix SpectatorListener running the techhider all the time 2025-11-25 21:40:23 +01:00
Chaoscaot 1098c5617f Redirect to Issue tracker
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-25 21:11:47 +01:00
Chaoscaot c2bca83735 Fix Tab Complete
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-25 18:37:58 +01:00
YoyoNow cfa1b5d0cd Hotfix XrayCommand bugging players back 2025-11-25 18:26:48 +01:00
Chaoscaot 500f8978e5 Fix Schematic List
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-25 18:12:30 +01:00
YoyoNow 395e4a2167 Hotfix windcharges destroying blocks 2025-11-25 17:37:23 +01:00
YoyoNow 1d65f2349e Merge pull request 'Add SWPlayer for per player storage and without Memory Leaks' (#188) from SpigotCore/SWPlayer into main
Reviewed-on: SteamWar/SteamWar#188
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-11-25 17:00:24 +01:00
YoyoNow c0a4413b7a Merge branch 'main' into SpigotCore/SWPlayer 2025-11-25 16:59:28 +01:00
YoyoNow 6b71ac28fe Merge pull request 'bausystem/TLS' (#184) from bausystem/TLS into main
Reviewed-on: SteamWar/SteamWar#184
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-11-25 16:58:21 +01:00
YoyoNow 880c6f5066 Remove TypeGenerator 2025-11-25 16:37:19 +01:00
PsiRobot e284f8f08c Fix PR 2025-11-25 12:57:28 +00:00
PsiRobot 8a5c5794c0 Replace - with : in translation 2025-11-25 12:54:10 +00:00
PsiRobot a9e278ccd9 Fix spelling (s.a. PR) 2025-11-25 12:43:38 +00:00
YoyoNow c9bfcc5c0c Fix not ignoring deleted teams
Closes: #226
2025-11-24 20:55:58 +01:00
Chaoscaot e343d044ff Refactor Discord authentication endpoint for improved error handling and structure
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-14 23:56:04 +01:00
Chaoscaot f923a007a7 Revert "Add EventCache for efficient retrieval of event groups and teams"
This reverts commit 8b4f864f99.

Revert "Refactor EventFights and Fight classes to improve player initialization and retrieval"

This reverts commit 8d705e7a84.

Revert "Refactor EventFights and Fight classes to improve player initialization and retrieval"

This reverts commit 78352a3e67.
2025-11-14 23:25:05 +01:00
Chaoscaot 78352a3e67 Refactor EventFights and Fight classes to improve player initialization and retrieval
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-14 23:18:38 +01:00
Chaoscaot 8d705e7a84 Refactor EventFights and Fight classes to improve player initialization and retrieval
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-14 23:14:13 +01:00
Chaoscaot 8b4f864f99 Add EventCache for efficient retrieval of event groups and teams
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-14 22:47:27 +01:00
Chaoscaot f9cb712b07 Merge pull request 'Simplify Tokens and add Discord OAuth' (#220) from authv3 into main
Reviewed-on: SteamWar/SteamWar#220
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-11-14 22:43:04 +01:00
Chaoscaot b3b13d2950 Move Chatter.disconnect call to ensure proper execution after IP ban check.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-13 23:01:37 +01:00
Chaoscaot 08ad5edf76 Simplify Tokens and add Discord OAuth
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-13 14:31:05 +01:00
Chaoscaot afcf3a1906 Fix Schematic Move
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-12 22:52:51 +01:00
YoyoNow 33efd26d48 Fix build.gradle.kts 2025-11-12 07:43:36 +01:00
YoyoNow 2a96b3c26a Hotfix AutoCheckerItems for 1.19 2025-11-11 22:06:44 +01:00
YoyoNow 3de4b3871d Hotfix ModifyPart 2025-11-11 21:42:38 +01:00
YoyoNow 67223be80e Trigger rebuild 2025-11-11 21:28:13 +01:00
Chaoscaot 81715736ae Refactor TeamTable to introduce default values for color and deleted, and make address column nullable.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-11 18:44:46 +01:00
Chaoscaot 36691c6fea Refactor TeamTable to introduce default values for color and deleted, and make address column nullable.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-11 18:44:25 +01:00
Chaoscaot d0c1413ea6 Refactor Leaderboard to Kotlin, leveraging Exposed library for database operations, and update LeaderboardManager for compatibility.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-11 17:39:39 +01:00
YoyoNow 58618a3991 Fix FightTeam.removeLeader
Fix FightTeam.setLeader
2025-11-11 17:36:19 +01:00
Chaoscaot 5f7c5f0a18 Merge remote-tracking branch 'origin/Lobby/refactor-leaderboard' into Lobby/refactor-leaderboard
# Conflicts:
#	LobbySystem/src/de/steamwar/lobby/util/LeaderboardManager.java
2025-11-11 17:28:03 +01:00
Chaoscaot 9e9f405e30 Refactor leaderboard management: replace UserConfig-based implementation with new Leaderboard SQL class, update related classes to use LeaderboardManager, and fix query/logic for best time retrieval. 2025-11-11 17:27:24 +01:00
Chaoscaot e6848b27a0 Refactor FightTable to use WinningTeam enum for win column and adjust related logic.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-11 17:25:38 +01:00
Chaoscaot 93d0011b46 Update openMaterialSelector to exclude non-item materials in UtilGui.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-11 17:20:33 +01:00
YoyoNow fd4d15ac5a Fix replay in 1.21 -> RPlayer needs fixing before 2025-11-11 17:13:35 +01:00
YoyoNow f56fedefe4 Fix Obsidian and Bedrock 2025-11-11 17:07:56 +01:00
YoyoNow 167bb4e266 Fix YMLWrapper 2025-11-11 17:05:46 +01:00
YoyoNow f6a9ce184b Closes: #214
Closes: #215
2025-11-11 16:40:26 +01:00
Chaoscaot d5708c110c Refactor NodeDataTable to use default current timestamp for createdAt and ensure schemData reads blob as bytes.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-11 00:18:16 +01:00
Chaoscaot f23c1215b7 Refactor NodeDataTable to use insert instead of insertIgnore and add blobParam import.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-11 00:15:19 +01:00
YoyoNow cfcaf1569c Add GameModeConfig.Schematic.MaxBlastResistance 2025-11-10 21:39:35 +01:00
Chaoscaot dc56b67ff6 Sort fights by start time in descending order and refactor saveFromStream method to use useDb block.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 14:18:13 +01:00
Chaoscaot 13c4a3ff8b Sort fights by start time in descending order and refactor saveFromStream method to use useDb block.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 12:27:02 +01:00
Chaoscaot 7e5a13989b Sort fights by start time in descending order and refactor saveFromStream method to use useDb block.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 12:24:51 +01:00
Chaoscaot 990a03ca6c Add Exposed library dependencies to WebsiteBackend build script.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 11:57:12 +01:00
YoyoNow 4a608fe5b5 Fix SchematicType.fromDB 2025-11-10 11:55:17 +01:00
Chaoscaot 5ca15aa117 Refactor PersonalKitTable to use explicit ID column initialization and update create method to utilize insert operation.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 11:50:39 +01:00
Chaoscaot 9b459bd12c Refactor PersonalKitTable to use explicit ID column initialization and update create method to utilize insert operation.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 11:40:34 +01:00
Chaoscaot b20d37e252 Refactor PersonalKitTable to use explicit ID column initialization and update create method to utilize insert operation.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 11:40:20 +01:00
YoyoNow a8c98594a9 Fix GameModeConfig.Schematic.SubTypes 2025-11-10 11:32:03 +01:00
Chaoscaot 1c076b5bbf Fix incorrect field references in BauweltMember methods.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 11:19:56 +01:00
Chaoscaot 133ddb39cc Add ID column initialization for BauweltMember
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 11:09:57 +01:00
YoyoNow ebb375d8d6 Improve messages 2025-11-10 11:04:29 +01:00
YoyoNow 8ada9a6335 Fix UserElo.getEloFromDb 2025-11-10 11:01:31 +01:00
Chaoscaot 0760a5a08a Update build scripts: migrate to Spigot API, adjust JVM toolchains and Java version.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 09:42:24 +01:00
Chaoscaot 852ff95757 Update build scripts: migrate to Spigot API, adjust JVM toolchains and Java version.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 09:40:36 +01:00
Chaoscaot 5c7d388876 Remove unused SLF4J exclusion from shadowJar task.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 09:34:44 +01:00
Chaoscaot 4f92f8132d Remove unused SLF4J exclusion from shadowJar task.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 09:27:58 +01:00
Chaoscaot 56fb63f781 Add MySQL dependency to KotlinCore build script.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 09:17:37 +01:00
Chaoscaot 273efff87d Remove unused api-version field from plugin.yml.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 09:16:14 +01:00
Chaoscaot 0cac6f36c1 Remove unused api-version field from plugin.yml.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 09:09:44 +01:00
Chaoscaot 8680b9e6cf Change api dependencies to compileOnlyApi in build.gradle.kts and rename KitName column to Name in PersonalKitTable.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 09:02:23 +01:00
YoyoNow 6c94efaf90 Improve TeamCommand.info 2025-11-10 09:00:18 +01:00
YoyoNow f6261ad989 Improve output for DevCommand reloadmodes 2025-11-10 09:00:18 +01:00
Chaoscaot 614e989892 Rename IgnoreTable to IgnoredPlayers in IgnoreSystemTable for improved clarity.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-10 08:47:32 +01:00
Chaoscaot 84e1f605bd Merge pull request 'Exposed!' (#179) from exposed into main
Reviewed-on: SteamWar/SteamWar#179
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-11-10 08:42:59 +01:00
Chaoscaot 0ea5a62dbe Merge branch 'main' into exposed 2025-11-10 08:40:42 +01:00
Chaoscaot 0eb6047139 Merge remote-tracking branch 'origin/exposed' into exposed 2025-11-09 17:48:12 +01:00
Chaoscaot fcebecf745 Add placement column to TeamTeilnahme table and corresponding property.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-09 17:48:02 +01:00
YoyoNow dd14e9f518 Cleanup Session 2025-11-09 17:30:21 +01:00
Chaoscaot 6c5239c8fc Optimize imports across SQL module: replace explicit class imports with wildcard imports, remove unused imports for cleaner structure.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-09 17:28:40 +01:00
Chaoscaot fc71f47add Remove needsAdmin property from PunishmentType enum and refactor related declarations for cleaner structure.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-09 17:25:19 +01:00
Chaoscaot 5d36393643 Refactor EventRelation, EventGroup, and EventFight classes: ensure database operations are enclosed in useDb, add default values for group points, and override delete methods. Update Gradle build script to include lombok dependencies.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-08 22:44:22 +01:00
Chaoscaot fa4d006dd3 Refactor Authlib integration and adjust entity handling for 1.21 compatibility 2025-11-08 20:09:02 +01:00
Chaoscaot ebc6f50261 Refactor Gradle build scripts: update source set exclusions, add java-library plugin, and remove redundant configurations in SQL module.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-08 13:52:27 +01:00
YoyoNow 69cf219e39 Fix FlatteningWrapper21 2025-11-07 22:47:05 +01:00
YoyoNow fb4e53165f Hotfix FixedFlagStorage.clear and FixedGlobalFlagStorage.clear 2025-11-07 22:42:48 +01:00
YoyoNow 415d783365 Hotfix SEND_COMMAND_FEEDBACK in 1.20+ 2025-11-07 22:17:30 +01:00
YoyoNow ee99708340 Hotfix (FA)WE Selection 1.20+ 2025-11-07 22:13:31 +01:00
Chaoscaot c9d74fb656 Remove redundant SQL logger in useDb and extra newlines in SQLConfig.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-07 18:59:01 +01:00
Chaoscaot e50e52950b Refactor Token and SteamwarUser classes: enhance owner property with memoized transformation, increase hash generation key size, and ensure database usage in useDb block.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-07 18:57:34 +01:00
YoyoNow aaccd4b095 Merge branch 'main' into SpigotCore/SWPlayer 2025-11-07 15:41:56 +01:00
YoyoNow cac0ae3e13 Hotfix MaterialLazyInit for 1.21 2025-11-07 15:41:48 +01:00
YoyoNow 14045a3366 Update method name in Countingwand 2025-11-07 15:30:18 +01:00
YoyoNow f9b3dd34cf Trigger rebuild 2025-11-07 15:25:20 +01:00
Chaoscaot e5a61226ca Add newline at end of build.gradle.kts file for consistency.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-07 15:06:37 +01:00
YoyoNow cc3b93a8f6 Improve SelectAdjacent 2025-11-07 14:54:57 +01:00
Chaoscaot 0c35ace5e2 Remove redundant Java installation paths in Gradle configuration.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-07 14:54:30 +01:00
Chaoscaot 23bcf14ca5 Update Gradle configuration to specify multiple Java installation paths for compatibility.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-07 14:53:07 +01:00
YoyoNow 58460416c3 Improve WarpListener 2025-11-07 14:49:10 +01:00
YoyoNow 40ac7b2139 Improve NoClipCommand
Improve SelectBauGuiItem
2025-11-07 14:43:52 +01:00
Chaoscaot 63a5fcff97 Add Kotlin plugin and configure build scripts for Kotlin compatibility, integrate exposed library dependencies, and enhance JVM settings.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-07 14:40:10 +01:00
YoyoNow b69adcd362 Improve MaterialCommand 2025-11-07 14:34:30 +01:00
YoyoNow ceb8d2c6d4 Improve LaufbauUtils 2025-11-07 14:21:05 +01:00
Chaoscaot 39b3cdb897 Introduce GDPRQuery command for GDPR data generation, refactor SQL statements, and improve null safety across modules.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-07 12:42:15 +01:00
YoyoNow 26b4d8578a Improve ScriptRunner 2025-11-07 09:43:11 +01:00
YoyoNow 51411ceabe Improve ScriptRunner 2025-11-07 09:34:28 +01:00
YoyoNow 1ccc2c4b55 Improve Loader
Improve ObserverTracer
2025-11-07 09:25:40 +01:00
YoyoNow 941a1916b7 Improve Detonator 2025-11-07 09:12:17 +01:00
YoyoNow 3ccfe92afb Remove DC prefix for discord send messages to cleanup the chat 2025-11-07 08:46:26 +01:00
YoyoNow c17b76851d Improve chat from discord 2025-11-07 08:44:07 +01:00
YoyoNow f0e18bfc72 Improve CouncilChannel and StaticMessageChannel 2025-11-07 08:39:42 +01:00
YoyoNow 160f982955 Improve ChatListener for STC Chat
Add debug output for DiscordChannel
Fix CouncilChannel
2025-11-07 08:34:19 +01:00
YoyoNow 6b8f791497 Add SWPlayer for per player storage and without Memory Leaks 2025-11-06 21:38:24 +01:00
Chaoscaot 6ac0143459 Remove outdated SQL-related Java classes (GDPRQuery, Field, SelectStatement, SqlTypeMapper, Statement) and update references across modules.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-06 11:30:01 +01:00
Chaoscaot 98ca9e852c Merge pull request 'Add version dependant impl of tps warp to fight system' (#187) from FightSystem/Add-version-dependent-impl-of-tps-warp into main
Reviewed-on: SteamWar/SteamWar#187
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-11-06 09:50:24 +01:00
D4rkr34lm 17910ec8a4 Add version dependant impl 2025-11-06 02:07:20 +01:00
Chaoscaot 56bc75763b Migrate Token class to Kotlin, remove outdated Java implementation, and refactor references across modules. Update timestamp fields to use CurrentTimestamp where applicable.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-05 21:44:52 +01:00
Chaoscaot 8272c73b48 Migrate SQL-related classes (Referee, SchemElo, Script, Session, SWException, TeamTeilnahme) to Kotlin and remove outdated Java implementations. Update references across modules.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-05 17:47:30 +01:00
YoyoNow 6cb2c56e47 Merge pull request 'Remove some strain on the Database' (#185) from BauSystem/RemoveDatabaseStrain into main
Reviewed-on: SteamWar/SteamWar#185
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-11-05 17:20:35 +01:00
YoyoNow a3273f6814 Fix some stuff related to CRIU 2025-11-05 17:15:20 +01:00
YoyoNow 2534451e26 Fix caching problems 2025-11-05 17:13:54 +01:00
YoyoNow 0f0c8b763e Remove some strain on the Database 2025-11-05 17:09:53 +01:00
Chaoscaot 9acfb32ae0 Refactor SQL classes: update GameModeConfig functions, improve null safety in SchematicNode and SchematicType, and adjust NodeMemberTable structure.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-05 17:04:01 +01:00
Chaoscaot b2a4b05545 Merge branch 'main' into exposed
# Conflicts:
#	CommonCore/SQL/src/de/steamwar/sql/GameModeConfig.java
#	CommonCore/SQL/src/de/steamwar/sql/Punishment.java
2025-11-05 16:18:30 +01:00
PsiRobot acf9325179 Add Help messages and small refactor 2025-11-04 21:02:57 +00:00
Chaoscaot 89e2df0eb2 Migrate Punishment and PollAnswer classes to Kotlin and remove outdated Java implementations. Update references across modules.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-04 21:17:53 +01:00
PsiRobot ca3a7a82be Add /tb default subcommand 2025-11-04 15:52:41 +00:00
YoyoNow 73b3d21749 Remove unused stuff 2025-11-04 16:38:16 +01:00
PsiRobot 0e5a03e139 Added tls toggle 2025-11-04 15:18:29 +00:00
YoyoNow e97fb674a2 Fix FlatteningWrapper21 2025-11-04 16:15:36 +01:00
Chaoscaot 73da9179bf Migrate SQL-related classes (IgnoreSystem, Mod, NodeDownload, NodeMember) to Kotlin and remove old Java implementations. Update references across modules.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-02 19:28:14 +01:00
Chaoscaot 0fbbcdacea Migrate Fight, FightPlayer, and SchematicType classes to Kotlin and remove old Java implementations. Update references across modules.
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-11-01 13:52:26 +01:00
Chaoscaot 4e6933f2fd Remove Event-related SQL classes and update relevant references across modules
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-30 23:14:25 +01:00
YoyoNow 62c41cdda8 Improve softreload 2025-10-30 16:29:57 +01:00
YoyoNow 6d8c765483 Hotfix dual checking of Schematics 2025-10-30 15:23:40 +01:00
YoyoNow f216ed0f0b Hotfix CheckCommand 2025-10-30 15:18:09 +01:00
Chaoscaot eea1073892 Migrate Event class to Kotlin and update references across modules
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-29 23:17:17 +01:00
Chaoscaot 702aa1cfa6 Refactor CheckedSchematic and migrate to Kotlin
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-29 17:42:29 +01:00
Chaoscaot 5243cf850e Hotfix: 1.21 Autoprüfer
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-28 23:46:42 +01:00
Chaoscaot c0163d813e Add WindchargeStopper to handle wind charge entity removal based on fight boundaries
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-28 23:00:53 +01:00
Chaoscaot f53a31348f Hotfix: Kotlin ist schwer, ne Yoyo?
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-28 22:27:06 +01:00
Chaoscaot 6ea73f4890 Refactor NodeData
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-28 22:25:31 +01:00
Chaoscaot 14e82f36a5 Rename .java to .kt
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-28 22:25:31 +01:00
Chaoscaot a8eaf3daa7 Fixes
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-28 21:31:57 +01:00
Chaoscaot b51ea484e4 Refactor UserConfig
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-28 20:38:02 +01:00
Chaoscaot 8bef19ed8b Rename .java to .kt
Signed-off-by: Chaoscaot <max@maxsp.de>
2025-10-28 20:38:02 +01:00
YoyoNow e5edf918cc Merge pull request 'VelocityCore/AddCheckerForEventSchematics' (#181) from VelocityCore/AddCheckerForEventSchematics into main
Reviewed-on: SteamWar/SteamWar#181
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-10-28 19:54:53 +01:00
YoyoNow 58e885ef8f Merge pull request 'Improve PunishmentCommand Permissions' (#180) from VelocityCore/ImprovePunishmentCommand into main
Reviewed-on: SteamWar/SteamWar#180
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-10-28 19:54:45 +01:00
Chaoscaot 1aff7b30a6 Refactor SchematicNode 2025-10-28 19:03:30 +01:00
Chaoscaot c8ac984ad3 Rename .java to .kt 2025-10-28 19:03:30 +01:00
YoyoNow 022276e05a Improve SWCommand message visibility 2025-10-28 18:30:49 +01:00
YoyoNow 0c371fb403 Fix ModifyPart.changeType 2025-10-28 18:20:39 +01:00
YoyoNow 2654735bba Hotfix SchematicSystem.getGameModeConfig 2025-10-28 17:58:01 +01:00
YoyoNow 33bb1394aa Add GameModeConfig.Checkers 2025-10-28 17:37:05 +01:00
YoyoNow 52602045a9 Add GameModeConfig.Checkers 2025-10-28 17:36:16 +01:00
YoyoNow 4c730bcc48 Improve PunishmentCommand Permissions 2025-10-28 17:07:50 +01:00
YoyoNow 2410ea3979 Fix PunishmentCommand ban localhost for /ban 2025-10-28 17:03:48 +01:00
YoyoNow e211051294 Hotfix GameModeConfig 2025-10-27 22:04:17 +01:00
Chaoscaot a462231bab Starting... 2025-10-27 18:34:31 +01:00
Chaoscaot e6bbb76a0b Rename .java to .kt 2025-10-27 18:34:30 +01:00
Chaoscaot 89519e05bb Trigger CI 2025-10-26 20:04:49 +01:00
Chaoscaot 129f339ce3 Update Gradle wrapper to version 8.14 2025-10-26 20:01:12 +01:00
YoyoNow 90563b066d Fix Prefix color of Blue team 2025-10-26 18:28:27 +01:00
YoyoNow 986536428d Hotfix static initialisation of GameModeConfig 2025-10-26 18:17:40 +01:00
YoyoNow d7fb7c2a61 Hotfix static initialisation of GameModeConfig 2025-10-26 18:14:52 +01:00
YoyoNow b3f6312288 Hotfix static initialisation of GameModeConfig 2025-10-26 18:07:25 +01:00
YoyoNow f99f9b1564 Trigger rebuild 2025-10-26 17:53:37 +01:00
YoyoNow d860e2b865 Merge pull request 'Add Unified GameModeConfig' (#176) from UnifiedGameModeConfig into main
Reviewed-on: SteamWar/SteamWar#176
Reviewed-by: D4rkr34lm <dark@steamwar.de>
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-10-26 17:47:57 +01:00
YoyoNow 63069b7caa Remove log in SchematicType 2025-10-26 17:36:48 +01:00
YoyoNow 11eb506f05 Use log of SchematicType 2025-10-26 17:35:19 +01:00
YoyoNow 7a232d5d51 Add ignore for SteamWar team 2025-10-26 16:41:21 +01:00
YoyoNow 4ff9efef33 Merge pull request 'bausystem/TLS' (#178) from bausystem/TLS into main
Reviewed-on: SteamWar/SteamWar#178
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-10-26 15:30:59 +01:00
PsiRobot 57c8e3319a Remove dead code 2025-10-26 14:29:48 +00:00
PsiRobot ef75c35809 Remove unnecessary translation 2025-10-26 14:24:29 +00:00
PsiRobot 442ef71a17 Fix PR Comments 2025-10-26 14:22:20 +00:00
PsiRobot 3b87a18a5f Modified Format of the TLS Message 2025-10-26 14:06:48 +00:00
PsiRobot b3b7b5e601 Add TLS Feature 2025-10-26 14:06:48 +00:00
YoyoNow dd711be30b Add cache for GameModeConfig 2025-10-26 13:40:17 +01:00
YoyoNow 5ab04d0518 Add cache for GameModeConfig 2025-10-26 13:34:25 +01:00
YoyoNow 79ebdcea85 Make SchematicType static init type safe 2025-10-26 13:14:11 +01:00
YoyoNow dfbeab7b90 Add JavaDoc to GameModeConfig 2025-10-26 12:55:17 +01:00
YoyoNow c6dbece550 Improve GameModeConfig 2025-10-26 12:34:16 +01:00
YoyoNow 35117fdd30 Fix AuthManager.connectAuth 2025-10-26 11:39:00 +01:00
YoyoNow b4791ddf42 Fix VelocityCore 2025-10-26 11:34:43 +01:00
YoyoNow 3e918d031d Fix compilation 2025-10-26 09:42:55 +01:00
YoyoNow 184bd12cb1 Improve SQLWrapperImpl 2025-10-26 09:39:17 +01:00
YoyoNow 167a6b6dc4 Unify SchematicType loading 2025-10-26 09:36:44 +01:00
YoyoNow ef81626e02 Remove CheckSchemTypeManager 2025-10-26 09:28:24 +01:00
YoyoNow d216aac2c4 Improve YMLWrapper 2025-10-26 09:22:48 +01:00
YoyoNow aec03e41a1 Improve YMLWrapper 2025-10-26 09:14:34 +01:00
YoyoNow 4405d9c25d Improve YMLWrapper 2025-10-25 22:08:58 +02:00
YoyoNow e6dea72024 Improve YMLWrapper 2025-10-25 22:03:32 +02:00
YoyoNow 87a4836fa1 Add Unified GameModeConfig 2025-10-25 21:45:44 +02:00
YoyoNow 0a6977e433 Fix Teamserver.properties 2025-10-25 12:16:53 +02:00
YoyoNow c560f669ca Hotfix VersionAnnouncer 2025-10-25 12:07:23 +02:00
YoyoNow 20283e33e0 Add Disconnect for norisk client users 2025-10-25 12:04:28 +02:00
YoyoNow 69bc9142f3 Add emi to channels 2025-10-25 09:04:25 +02:00
YoyoNow aad287d11a Flatten package for linkage 2025-10-24 20:57:37 +02:00
YoyoNow 4cf963e22a Improve steamwar.devserver.gradle 2025-10-24 18:32:44 +02:00
YoyoNow 139f73402a Fix AbstractLinker not accessing private fields 2025-10-24 18:22:56 +02:00
YoyoNow 55a682d782 Add hypixel mods to drop list 2025-10-24 09:03:51 +02:00
YoyoNow 7e012ade9e Add 'xaeroworldmap:main' to disallow list 2025-10-24 08:57:57 +02:00
YoyoNow 55080d0011 Add some of the axiom plugin channels 2025-10-24 08:51:50 +02:00
YoyoNow adbd8f7dd4 Fix FightScoreboard 2025-10-23 20:41:03 +02:00
YoyoNow a03dda9522 Merge pull request 'Update copyright notices' (#171) from UpdateCopyrightNoticeInFiles into main
Reviewed-on: SteamWar/SteamWar#171
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-10-23 17:59:29 +02:00
YoyoNow a03a3f45e8 Update copyright notices 2025-10-23 17:56:43 +02:00
YoyoNow d02fe1b0c7 Merge pull request 'Add Linkage to CommonCore and implement SpigotLinker used in BauSystem' (#151) from ExtraceLinkageToCommonCore into main
Reviewed-on: SteamWar/SteamWar#151
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-10-23 17:51:03 +02:00
YoyoNow 9e029ea0f1 Merge pull request 'Update .gitignore and configure IntelliJ IDEA copyright settings' (#170) from add-copyright-to-repo into main
Reviewed-on: SteamWar/SteamWar#170
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-10-23 17:41:42 +02:00
Chaoscaot 010f36dc86 Update .gitignore and configure IntelliJ IDEA copyright settings 2025-10-23 17:38:54 +02:00
YoyoNow b55c3d332e Fix build problems 2025-10-23 17:27:10 +02:00
YoyoNow 9dabcfc918 Implement Linkage for TowerRun 2025-10-23 17:20:07 +02:00
YoyoNow d75c82dca5 Implement Linkage for Teamserver 2025-10-23 17:20:07 +02:00
YoyoNow 383604ec9f Implement Linkage for SpigotCore 2025-10-23 17:20:07 +02:00
YoyoNow c7284dc7ab Implement Linkage for SchematicSystem 2025-10-23 17:20:07 +02:00
YoyoNow 91a5da9cd2 Implement Linkage for MissileWars 2025-10-23 17:20:07 +02:00
YoyoNow 33b606060a Implement Linkage for LobbySystem 2025-10-23 17:20:07 +02:00
YoyoNow 22d1e15ae0 Implement Linkage for FightSystem 2025-10-23 17:20:07 +02:00
YoyoNow c394478632 Fix VelocityCore 2025-10-23 17:20:07 +02:00
YoyoNow d850894a00 Update VelocityCore to use Linkage 2025-10-23 17:20:07 +02:00
YoyoNow ca589bd07c Add Linkage to CommonCore and implement SpigotLinker used in BauSystem 2025-10-23 17:20:06 +02:00
YoyoNow 04d796bbfc Add millo_cracy for TestblockCommand 2025-10-23 17:17:49 +02:00
YoyoNow 3676da7679 Add zKrote for TestblockCommand 2025-10-23 17:12:37 +02:00
Chaoscaot eb63381b83 Refactor leaderboard management: replace UserConfig-based implementation with new Leaderboard SQL class, update related classes to use LeaderboardManager, and fix query/logic for best time retrieval. 2025-10-20 16:39:35 +02:00
YoyoNow ed672ec07a Add ExpectedCow4019 for TestblockCommand 2025-10-18 13:36:55 +02:00
YoyoNow 67960bfc2a Add Baumwolle_777 for TestblockCommand 2025-10-18 13:36:15 +02:00
YoyoNow c831d994be Merge pull request 'Add enable/disable/clear functionality for Piston Calculator' (#160) from BauSystem/piston-calculator-enable into main
Reviewed-on: SteamWar/SteamWar#160
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-10-18 07:50:42 +02:00
YoyoNow 08706d705d Update SimulatorCursor 2025-10-18 07:48:29 +02:00
YoyoNow 6ccb056065 Remove TestblockCommand permission check for schematic for now 2025-10-18 07:33:28 +02:00
YoyoNow 2b32cf38c7 Fix TestblockCommand permission check for schematic 2025-10-17 22:27:01 +02:00
YoyoNow bcdda35b44 Fix TestblockCommand permission check for schematic 2025-10-17 22:23:11 +02:00
YoyoNow d154fe90a9 Add Simon4ZX for TestblockCommand 2025-10-17 22:15:23 +02:00
YoyoNow a12c620744 Add Wolf36136 for TestblockCommand 2025-10-17 22:14:10 +02:00
YoyoNow f9c320cb33 Add RegionData
Improve TestblockCommand with remembering the TB
2025-10-17 21:36:50 +02:00
Chaoscaot 4e050106f5 Fix query in allParentsOfNode to use Config field instead of ReplaceColor. 2025-10-14 19:14:31 +02:00
Chaoscaot 089503e0a0 Synchronize access to skins map in PlayerSkinHandler to ensure thread safety and prevent race conditions. 2025-10-14 17:45:58 +02:00
Chaoscaot 7179daedae Add axiom:set_no_physical_trigger to plugin message channels for expanded functionality 2025-10-12 15:30:46 +02:00
Chaoscaot 3bfac2d1cf Hotfix: Portal Permissions 2025-10-07 22:43:54 +02:00
Chaoscaot ac24bc4f5b Hotfix: Portal Permissions 2025-10-07 22:39:38 +02:00
Chaoscaot e69d203b99 Add clear command to Piston Calculator to remove player-related data 2025-10-05 11:45:11 +02:00
Chaoscaot e1fa8aaefa Add enable/disable functionality for Piston Calculator and update help messages 2025-10-05 11:42:44 +02:00
YoyoNow c38777158a Improving SelectAdjacent 2025-10-03 11:55:37 +02:00
YoyoNow 2bc295c620 Fix RegionLib.type 2025-10-03 09:25:21 +02:00
YoyoNow 88cc06560e Fix BauServer Performance 2025-10-03 09:13:32 +02:00
YoyoNow 566a7deee3 Hotfix BackupCommand.backupGui 2025-10-02 21:14:26 +02:00
YoyoNow ea07766460 Fix RegionCommand.genericRestoreCommand 2025-10-02 20:55:06 +02:00
YoyoNow 9c5b7712cb Improve PistonCalculator 2025-10-02 20:41:21 +02:00
YoyoNow 84b14b8c3d Hotfix /region testblockpoint 2025-10-02 20:39:30 +02:00
YoyoNow abeb269368 Fix BackupCommand 2025-09-29 17:46:20 +02:00
YoyoNow fc002abf37 Fix BackupScheduler 2025-09-29 17:36:10 +02:00
YoyoNow 09f9a8ce32 Fix GameModeConfig 2025-09-29 17:33:02 +02:00
YoyoNow d0d353b24d Fix TNTPhase 2025-09-29 16:23:54 +02:00
YoyoNow 52828c8b4e Hotfix TraceRepository 2025-09-29 15:52:13 +02:00
YoyoNow 01efb9fce5 Hotfix TraceRepository 2025-09-29 15:48:25 +02:00
YoyoNow 8b636a11ee Force rebuild 2025-09-29 15:29:31 +02:00
YoyoNow 8ca1cf9b5c Force rebuild 2025-09-29 15:26:51 +02:00
YoyoNow ad4304d7b0 Fix 'BAU_INFO_ITEM_LORE_CHANGED' 2025-09-29 12:44:12 +02:00
YoyoNow e5e931d331 Fix 'BAU_INFO_ITEM_LORE_TESTBLOCK' 2025-09-29 12:41:39 +02:00
YoyoNow ed87197681 Trigger rebuild 2025-09-29 11:28:02 +02:00
YoyoNow e6e475e4bb Trigger rebuild 2025-09-29 11:25:33 +02:00
YoyoNow daa69dc22b Trigger rebuild 2025-09-29 11:23:20 +02:00
YoyoNow d011ffa536 Trigger rebuild 2025-09-29 11:20:32 +02:00
YoyoNow 4798b16015 Hotfix SWItem.setCustomModelData 2025-09-29 11:10:11 +02:00
YoyoNow f4c9ce512e Improve WorldEditRendererWrapper20 2025-09-29 11:00:50 +02:00
YoyoNow bfe9c7559e Improve RayVisualizerCommand 2025-09-29 10:48:24 +02:00
YoyoNow 394e043db3 Hotfix FixedRegion 2025-09-29 09:34:53 +02:00
YoyoNow d2a6ccc46b Merge pull request 'Modular BauSystem Regions' (#26) from BauSystem/RegionSystem into main
Reviewed-on: SteamWar/SteamWar#26
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-09-29 09:25:20 +02:00
YoyoNow ccd992f1db Improve SimulatorCursor selection changing 2025-09-29 09:23:53 +02:00
YoyoNow fa0a9a5c23 Fix PistonCalculator for GLAZED_TERRACOTTA Variations
Closes: #135
2025-09-29 09:08:45 +02:00
YoyoNow fa6b75e2aa Fix RPlayer (hopefully) 2025-09-29 08:35:03 +02:00
YoyoNow f2073db1e8 Improve PlayerSkinHandler 2025-09-29 08:33:08 +02:00
YoyoNow 5fe62d67d9 Improve StreamingCommand 2025-09-29 08:17:49 +02:00
YoyoNow 524ce0c579 Update VacationCommand add 'Abwesenheitsnotiz'
Closes: #144
2025-09-29 08:06:15 +02:00
YoyoNow 3685d662fb Hotfix CookieEvents 2025-09-28 16:47:16 +02:00
YoyoNow 19344b9f48 Hotfix EventFight and EventModeListener 2025-09-28 16:32:45 +02:00
YoyoNow 3d3c70845e Hotfix EventModeListener 2025-09-28 16:19:37 +02:00
YoyoNow 797f3a3158 Hotfix EventModeListener 2025-09-28 15:48:32 +02:00
YoyoNow 4b1680967a Fixup VelocityCore 2025-09-28 14:02:38 +02:00
YoyoNow 361c86c99e Merge pull request 'Add update of all coming fights if a fight is stopped' (#145) from VelocityCore/AutoReloadEventFightsOnFinish into main
Reviewed-on: SteamWar/SteamWar#145
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-09-28 14:00:00 +02:00
YoyoNow 613cb76edb Merge pull request 'Add StreamingCommand for streaming mode' (#146) from VelocityCore/StreamingMode into main
Reviewed-on: SteamWar/SteamWar#146
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-09-28 13:57:43 +02:00
YoyoNow 1231fa5c47 Add StreamingCommand for streaming mode 2025-09-28 13:09:07 +02:00
YoyoNow 06a7d9c7fc Add update of all coming fights if a fight is stopped 2025-09-28 10:42:05 +02:00
Chaoscaot 21d628b338 Refactor EventRelation: Fix query logic for byEvent, adjust insert fields, and update setFrom parameter handling. Update ResponseRelation to align with updated EventRelation structure. 2025-09-28 10:28:24 +02:00
YoyoNow 56d34f0311 Fix EventChannel 2025-09-27 19:50:30 +02:00
YoyoNow 4322547106 Hotfix EventRelation 2025-09-27 17:07:22 +02:00
YoyoNow 43a582edd8 Hotfix EventRelation 2025-09-27 16:42:26 +02:00
YoyoNow d4eabfe9b2 Make optional parameter on 'delete' not optional 2025-09-16 08:54:29 +02:00
YoyoNow bfbb017c8f Remove lockreplay ModifyPart 2025-09-05 07:48:36 +02:00
Chaoscaot 5a7349b5a6 Refactor NMSWrapper21 game mode handling: remove unused import and adjust setInternalGameMode to use direct field modification. 2025-08-09 11:29:58 +02:00
Chaoscaot ef91313c29 Adjust gameStateChangeReason field offset for updated packet structure in Minecraft 1.21. 2025-08-09 11:24:52 +02:00
Chaoscaot ba2297ca9a Add new plugin message channels for extended compatibility and feature integration 2025-08-09 11:18:15 +02:00
Chaoscaot ba843633d7 Downgrade api-version in plugin.yml to 1.13 for broader compatibility. 2025-08-09 00:12:52 +02:00
Chaoscaot 3b43ad3587 Downgrade api-version in plugin.yml to 1.13 for broader compatibility. 2025-08-09 00:11:44 +02:00
Chaoscaot 26a45fabb1 Merge pull request '1.21.6 Fightsystem' (#134) from 1.21.6/fightsystem into main
Reviewed-on: SteamWar/SteamWar#134
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-08-08 23:48:37 +02:00
YoyoNow f8bb69e829 Merge branch 'main' into 1.21.6/fightsystem 2025-08-05 21:13:24 +02:00
Chaoscaot b74b73b871 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java aktualisiert 2025-08-05 21:12:35 +02:00
YoyoNow b695a7e089 Update stuff from peer review 2025-08-05 20:59:43 +02:00
Chaoscaot 464d7c85bd Update version handling for Minecraft 1.21.5: Adjust TypeUtils and ServerStarter to support PAPER_21. 2025-08-03 22:10:15 +02:00
Chaoscaot 285882be70 Add chunk reset logic for Minecraft 1.21 in CraftbukkitWrapper21 to support advanced chunk management. 2025-08-03 16:42:05 +02:00
Chaoscaot 50780ad9bd Add chunk reset logic for Minecraft 1.21 in CraftbukkitWrapper21 to support advanced chunk management. 2025-08-03 16:39:25 +02:00
YoyoNow bbd2bcae35 Fix BackupCommand
Fix FixedRegion
2025-08-03 13:06:07 +02:00
YoyoNow a3801790a4 Remove old stuff 2025-08-02 14:32:24 +02:00
YoyoNow b14c39683a Implement FixedRegion.regionBackups 2025-08-02 14:31:46 +02:00
YoyoNow 0a3ae7117d Fix FixedGlobalRegion 2025-08-02 13:55:22 +02:00
YoyoNow 830ca93105 Implement Area for FixedRegion 2025-08-02 13:53:52 +02:00
YoyoNow 06333d634e Fix RegionConfig
Implement FixedRegion
Add RegionHistory.Impl
2025-08-02 13:25:22 +02:00
YoyoNow ecb9571624 Add toString() methods 2025-08-02 13:25:22 +02:00
YoyoNow 9e0e339277 Finish FixedFlagStorage 2025-08-02 13:25:22 +02:00
YoyoNow 06de120fe1 Add RegionSystem.getWorldSpawn
Fix Warp
Update FixedRegionSystem
2025-08-02 13:25:22 +02:00
YoyoNow 30db0bb718 Fix Warp.enable 2025-08-02 13:25:22 +02:00
YoyoNow 0a4dccd95a Fix WarpListener 2025-08-02 13:25:22 +02:00
YoyoNow 5550aa4930 Make FixedGlobalFlagStorage load the options from file 2025-08-02 13:25:22 +02:00
YoyoNow 811bd00ed2 Fix Flag.Value to have enum methods for save/load 2025-08-02 13:25:22 +02:00
YoyoNow bc371df796 Rework FixedFlagStorage and FixedGlobalFlagStorage to not be sensitive on adding a new Flag 2025-08-02 13:25:22 +02:00
YoyoNow 144975d977 Remove TNTMode.ONLY_BUILD 2025-08-02 13:25:22 +02:00
YoyoNow 0763e4b189 Move some stuff around 2025-08-02 13:25:22 +02:00
YoyoNow 38b061c12c Add JavaDoc to RegionSystem 2025-08-02 13:25:22 +02:00
YoyoNow 91a41ccd3f Add Prototype 2025-08-02 13:25:22 +02:00
YoyoNow 576ce891f6 Optimize WorldData 2025-08-02 13:25:22 +02:00
YoyoNow 7aff9f08d0 Remove old simulator loading 2025-08-02 13:25:22 +02:00
YoyoNow 13ef131401 Remove RegionSkins 2025-08-02 13:25:22 +02:00
YoyoNow 56680119e2 Fix ColorCommand 2025-08-02 13:25:22 +02:00
YoyoNow 6a5507321e Add FixedGlobalFlagStorage 2025-08-02 13:25:22 +02:00
YoyoNow 01d9532aa6 Pot impl a FixedGlobalRegion 2025-08-02 13:25:22 +02:00
YoyoNow c49a212c05 Move regionold to RegionFixed module 2025-08-02 13:25:22 +02:00
YoyoNow e6196251a6 Remove SkinCommand
Fix TickManager15
2025-08-02 13:25:22 +02:00
YoyoNow 698f917828 Add RegionSkins 2025-08-02 13:25:22 +02:00
YoyoNow ad87ad7495 Add RegionConfig 2025-08-02 13:25:22 +02:00
YoyoNow 6a78499193 Fix some more errors 2025-08-02 13:25:22 +02:00
YoyoNow d55556cb47 Fix some more errors 2025-08-02 13:25:22 +02:00
YoyoNow 4f24adf9fd Fix some more errors 2025-08-02 13:25:22 +02:00
YoyoNow 94e3eed6df Fix RegionScoreboardElement 2025-08-02 13:25:22 +02:00
YoyoNow 8a43809322 Fix RegionScoreboardElement 2025-08-02 13:25:22 +02:00
YoyoNow 8fb10c9266 Fix DesignEndStone and DesignEndStoneCommand
Fix Region.Area.reset
2025-08-02 13:25:22 +02:00
YoyoNow fb518efe63 Reduce to 24 compiler errors 2025-08-02 13:25:22 +02:00
YoyoNow 598daadd33 Reduce to 34 compiler errors 2025-08-02 13:25:22 +02:00
YoyoNow 0287881e33 Fix some more issues 2025-08-02 13:25:22 +02:00
YoyoNow a6b703b821 Fix some more issues 2025-08-02 13:25:22 +02:00
YoyoNow 43cca3376e Fix some more issues 2025-08-02 13:25:22 +02:00
YoyoNow 7e61db5e58 Fix some more issues 2025-08-02 13:25:22 +02:00
YoyoNow c9b4e6ab45 Improve Region some more 2025-08-02 13:25:22 +02:00
YoyoNow 314aaf7a76 Update Region 2025-08-02 13:25:22 +02:00
YoyoNow e98f53bbab Update Region 2025-08-02 13:25:22 +02:00
YoyoNow 7dc9da549c Fix some more stuff 2025-08-02 13:25:22 +02:00
YoyoNow 3bb84d0dcc Fixup BoundaryViewer to trigger rebuild 2025-08-02 13:25:22 +02:00
YoyoNow 3d0e5fc28d Fix many things 2025-08-02 13:25:22 +02:00
YoyoNow 5e5bfedb52 Fix some more build errors 2025-08-02 13:25:22 +02:00
YoyoNow ef19959eb2 Fix some more build errors 2025-08-02 13:25:22 +02:00
YoyoNow ae15e16dae Update BauMemberUpdate 2025-08-02 13:25:22 +02:00
YoyoNow 9a506a34f8 Fix things and optimize imports 2025-08-02 13:25:22 +02:00
YoyoNow 6822dc796f Update Region System of BauSystem 2025-08-02 13:25:22 +02:00
YoyoNow 8427ae36f2 Remove unused TestblockMode 2025-08-02 13:25:22 +02:00
YoyoNow 7f41559647 Fix build.gradle.kts as of 43618fc2 2025-08-02 13:25:22 +02:00
YoyoNow 4e70a675c2 Update Region.inBuildRegion and Region.inTestblockRegion 2025-08-02 13:25:22 +02:00
YoyoNow 96daa2c861 Update some part of Region 2025-08-02 13:25:21 +02:00
YoyoNow 45646b6ba3 Update SelectAdjacent 2025-08-02 13:23:03 +02:00
YoyoNow 8d1b15b019 Fix PistonCalculator 2025-08-02 13:14:05 +02:00
YoyoNow 2e91a5a582 Trigger rebuild 2025-08-02 11:42:39 +02:00
YoyoNow 018b9a971f Fix stuff in DiscordBot 2025-08-02 11:36:08 +02:00
YoyoNow 70d0f179cc Fix stuff in DiscordBot 2025-08-02 11:34:41 +02:00
YoyoNow 2166096ba5 Fix PistonCalculator 2025-08-01 21:17:58 +02:00
YoyoNow 3a13fc7bb9 Reduce MAX_BLOCKS of SelectAdjacent 2025-08-01 17:51:19 +02:00
YoyoNow 01f55c4309 Fix VacationCommand 2025-08-01 10:51:17 +02:00
YoyoNow d968187750 Fix VacationCommand 2025-08-01 10:49:28 +02:00
YoyoNow 9e629d09a8 Fix VacationCommand 2025-08-01 10:48:17 +02:00
YoyoNow d14022e69e Fix ChannelListener 2025-08-01 10:46:54 +02:00
YoyoNow 6623e9d808 Add VacationCommand 2025-08-01 10:43:37 +02:00
YoyoNow 9279d9cd8e Improve SelectAdjacent 2025-07-31 18:37:02 +02:00
YoyoNow b7963f2fe6 Fix PistonCalculator 2025-07-31 18:00:38 +02:00
YoyoNow 3f88ea1e57 Fix SelectAdjacent but make it a touch slower 2025-07-31 16:30:02 +02:00
YoyoNow 8076f31a19 Fix SelectAdjacent but make it a touch slower 2025-07-31 16:25:05 +02:00
YoyoNow 33e9b3409f Add SelectAdjacent for BauSystem and Builder 2025-07-31 16:21:08 +02:00
Chaoscaot e7803dcf82 Enhance compatibility and feature support for Minecraft 1.21: Add ProtocolWrapper21, update gamerule management, streamline entity tracking, and refine chunk hider logic. 2025-07-31 11:34:56 +02:00
Chaoscaot cf52b50333 Introduce support for Minecraft 1.21: Add ReflectionWrapper21, ChunkHider21, and enhance version compatibility across systems. 2025-07-31 10:43:40 +02:00
YoyoNow 297aa6151d Pot fix RPlayer 2025-07-31 09:44:28 +02:00
YoyoNow 14be3a8e3b Fix CheckpointUtilsJ9 2025-07-30 21:01:18 +02:00
YoyoNow 1c1e2e2efe Fix CheckpointUtilsJ9 2025-07-30 20:59:03 +02:00
YoyoNow e30eb35792 Fix CheckpointUtilsJ9 2025-07-30 20:57:38 +02:00
YoyoNow e94f273e21 Fix CheckpointUtilsJ9 2025-07-30 20:56:52 +02:00
YoyoNow c76648e630 Fix CheckpointUtilsJ9 2025-07-30 20:54:18 +02:00
YoyoNow a943dd6014 Fix CheckpointUtilsJ9 2025-07-30 20:51:17 +02:00
YoyoNow 0d7776ec6f Fix CheckpointUtilsJ9 2025-07-30 20:47:27 +02:00
YoyoNow 7db1d80988 Add SpaceCraft to startable fight servers 2025-07-30 20:41:01 +02:00
YoyoNow 50bd18bae7 Fix DevCommand 2025-07-30 18:20:41 +02:00
YoyoNow 89a55996fc Fix steamwar.devserver.gradle 2025-07-30 16:45:08 +02:00
YoyoNow f494729b89 Update steamwar.devserver.gradle 2025-07-30 16:03:39 +02:00
YoyoNow bcabce8b23 Fix JVMCRIUException 2025-07-30 14:00:47 +02:00
YoyoNow 376da2028b Fix ColorCommand 2025-07-30 13:36:24 +02:00
YoyoNow b6cfaf8135 Fix BauSystem.properties NO_PERMISSION 2025-07-30 13:34:51 +02:00
YoyoNow 5daee0f589 Fix checkpointing of a dev server 2025-07-30 11:36:40 +02:00
YoyoNow 43663ea099 Fix CRIUSupport for local building 2025-07-30 11:27:09 +02:00
YoyoNow 9d1b0063b9 Hotfix RayVisualizerCommand 2025-07-29 17:55:38 +02:00
YoyoNow e706044f44 Add RayVisualizerCommand
Closes: #99
2025-07-29 17:46:12 +02:00
YoyoNow 332daec716 Enable Loader.setTicksBetweenShots before loader finished
Closes: #76
2025-07-29 15:37:56 +02:00
YoyoNow 2daca017c2 Add InventoryFillerCommand.gui
Closes: #27
Fix PistonCalculator movement
2025-07-29 14:52:03 +02:00
YoyoNow 7edd72ac27 Improve PistonCalculator last time 2025-07-29 12:32:25 +02:00
YoyoNow 1355b57a93 Improve Subserver.run for CRIU 2025-07-29 12:04:48 +02:00
YoyoNow e04f0d4ad1 Revert the PR merge 2025-07-29 12:03:33 +02:00
YoyoNow 79a6c93f8f Merge pull request 'Improve Subserver.run for checkpoint' (#116) from VelocityCore/ImproveCheckpointHandling into main
Reviewed-on: SteamWar/SteamWar#116
2025-07-29 11:56:39 +02:00
YoyoNow e36bbfd2a7 Improve PistonCalculator 2025-07-29 11:18:04 +02:00
YoyoNow 65cb544b64 Merge pull request 'Implement anvil inventory handling through SWAnvilInv and related network packets' (#117) from VelocityCore/anvil-inv into main
Reviewed-on: SteamWar/SteamWar#117
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-07-29 11:06:18 +02:00
Chaoscaot 8a22afab63 Handle NullPointerException in handleClick method of SWAnvilInv to prevent crashes 2025-07-29 11:05:46 +02:00
Chaoscaot caae9542f4 Fix CLOSE case in SWAnvilInv to properly remove player from openInv map 2025-07-29 11:03:00 +02:00
YoyoNow 4104c60f6b Hotfix PistonCalculator 2025-07-29 10:52:18 +02:00
YoyoNow 69260a9b73 Hotfix PistonCalculator 2025-07-29 10:15:08 +02:00
YoyoNow 4fb6505aef Hotfix PistonCalculator 2025-07-29 10:09:55 +02:00
YoyoNow bb2f7cf0c1 Hotfix PistonCalculator 2025-07-29 10:09:14 +02:00
YoyoNow 8516c8e536 Closes: #120
Fix Loader.single
2025-07-29 09:59:38 +02:00
YoyoNow 066f06a6e3 Closes: #121
Improve PistonCalculator
2025-07-29 09:53:17 +02:00
YoyoNow 78e176b55e Closes: #94 2025-07-28 22:08:39 +02:00
Chaoscaot 86a10b3e97 Remove unused imports and redundant method annotations in SavePart class 2025-07-26 20:59:45 +02:00
Chaoscaot d01efffb6a Add steamshrimp.de to known hostnames in Hostname class 2025-07-20 00:45:56 +02:00
Chaoscaot fd57ba43e9 Mark createdAt as primary key in NodeData class 2025-07-19 22:48:03 +02:00
Chaoscaot eac0390dd3 Implement anvil inventory handling through SWAnvilInv and related network packets 2025-07-19 22:34:36 +02:00
Chaoscaot 03005adcd8 Merge pull request 'Add enhance ReplayCommand' (#115) from add-fight-id into main
Reviewed-on: SteamWar/SteamWar#115
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-07-19 22:06:36 +02:00
YoyoNow 933e2119ef Improve Subserver.run for checkpoint 2025-07-19 18:20:48 +02:00
YoyoNow 679d373a1e Fix colors final time, for 1.15 and earlier support 2025-07-19 18:11:10 +02:00
YoyoNow 828084a3d6 Update Guide color 2025-07-19 17:58:53 +02:00
YoyoNow 2b782585b1 Hotfix TeamCommand and WhoisCommand 2025-07-19 17:54:39 +02:00
YoyoNow b43965be91 Revert "Update PREFIX_GUIDE color to §a in UserPerm"
This reverts commit 30cdbe072e.
2025-07-19 17:45:39 +02:00
Chaoscaot d82f306094 Add getById method in Fight class and enhance ReplayCommand handling with admin replay checks 2025-07-19 17:12:44 +02:00
Chaoscaot 30cdbe072e Update PREFIX_GUIDE color to §a in UserPerm 2025-07-19 17:07:18 +02:00
Chaoscaot db7e1a5fc9 Add immersive portals channel to PluginMessage listener 2025-07-19 17:01:30 +02:00
Chaoscaot 3e5055c246 Refine checkpoint handling in Subserver and remove unnecessary debug logs in CheckpointUtilsJ9 2025-07-16 09:43:24 +02:00
Chaoscaot 44c06314c6 Update checkpoint restoration message handling in Subserver 2025-07-16 09:39:38 +02:00
Chaoscaot e06742d6d2 SpigotCore/SpigotCore_Main/src/de/steamwar/core/CheckpointUtilsJ9.java aktualisiert 2025-07-16 09:34:38 +02:00
Chaoscaot 62e674ed42 SpigotCore/SpigotCore_Main/src/de/steamwar/core/CheckpointUtilsJ9.java aktualisiert 2025-07-14 19:40:33 +02:00
Chaoscaot 0464442b83 VelocityCore/Persistent/src/de/steamwar/persistent/Subserver.java aktualisiert 2025-07-14 19:38:46 +02:00
Chaoscaot c682333771 Add Criu Debug 2025-07-14 19:13:25 +02:00
Chaoscaot 58ab619144 Add Criu Debug 2025-07-14 19:08:35 +02:00
Chaoscaot 00de852575 Add Criu Debug 2025-07-14 19:07:48 +02:00
Chaoscaot 948cf5e8db Add Criu Debug 2025-07-14 18:52:08 +02:00
Chaoscaot 7aba8da5a0 Add revision handling to setSchematic method in FightTeam 2025-07-14 13:40:43 +02:00
Chaoscaot 5a77854752 Fix replaceColor usage and correct config flag handling 2025-07-14 11:20:26 +02:00
Chaoscaot cf1422f532 Fix NodeData query to correctly order by CreatedAt descending 2025-07-14 09:46:06 +02:00
Chaoscaot 6260e65b33 Merge pull request 'Add Schematic Revisions' (#93) from schematic-revisions into main
Reviewed-on: SteamWar/SteamWar#93
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-07-14 09:13:16 +02:00
Chaoscaot 6db404c1e6 Merge pull request 'Add AuditLog' (#89) from AuditLog into main
Reviewed-on: SteamWar/SteamWar#89
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-07-14 09:13:02 +02:00
Chaoscaot b086fcaa32 Refactor validator method in download command 2025-07-13 21:11:18 +02:00
YoyoNow f33b3521b8 Hotfix TNTPoint for 1.15 or earlier 2025-07-13 21:00:42 +02:00
YoyoNow dc72ec1b93 Hotfix REntityServer for 1.15 or earlier 2025-07-13 20:57:22 +02:00
YoyoNow 0e9c9bd4dc Hotfix DiscordChannel 2025-07-13 20:48:43 +02:00
YoyoNow 291b6b1804 Merge pull request 'Add Winconditions.TIMED_DAMAGE_TECH_KO and Winconditions.RANDOM_ROTATE' (#111) from FightSystem/RandomRotationAndTimedDamageTechKO into main
Reviewed-on: SteamWar/SteamWar#111
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-07-13 18:40:52 +02:00
YoyoNow 104f0cf02d Fix final stuff 2025-07-13 18:39:53 +02:00
YoyoNow f7662cdcba Fix build 2025-07-13 18:15:24 +02:00
YoyoNow 167b36b10c Update RandomRotate 2025-07-13 18:10:53 +02:00
YoyoNow b9b541957b Fix older replays 2025-07-13 17:54:28 +02:00
YoyoNow e9d107f0ed Fix older replays 2025-07-13 17:54:06 +02:00
YoyoNow 1e264a63a2 Add Winconditions.TIMED_DAMAGE_TECH_KO and Winconditions.RANDOM_ROTATE 2025-07-13 16:48:35 +02:00
YoyoNow 868ba4073b Add Winconditions.TIMED_DAMAGE_TECH_KO and Winconditions.RANDOM_ROTATE 2025-07-13 16:46:11 +02:00
Chaoscaot 3410dd5a4b Merge pull request 'Improve perceived server start time' (#108) from VelocityCore/ImprovePerceivedServerStartTimeWithCRIU into main
Reviewed-on: SteamWar/SteamWar#108
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-07-10 13:46:03 +02:00
YoyoNow b86a26a709 Fix Simulator.autoTrace 2025-07-10 13:44:06 +02:00
YoyoNow 71238a0167 Add Simulator.autoTestblock 2025-07-10 13:40:21 +02:00
YoyoNow 30ac947ebb Add Simulator.autoTestblock 2025-07-10 13:39:03 +02:00
YoyoNow a7d64b5887 Improve TickManager21 2025-07-10 13:21:17 +02:00
YoyoNow d7908c8255 Improve perceived server start time 2025-07-10 13:02:24 +02:00
YoyoNow 12f26b982e Rever CheckpointUtilsJ9 2025-07-10 10:52:14 +02:00
YoyoNow 2be4118399 Close server socket before world saving 2025-07-10 10:23:28 +02:00
YoyoNow 9d6981ee0c Trigger rebuild 2025-07-10 10:09:39 +02:00
YoyoNow 97a4d47aa7 Merge pull request 'Add support for TPS and tick rate management in 1.21+' (#105) from 1.21.1/tpslimit into main
Reviewed-on: SteamWar/SteamWar#105
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-07-08 22:17:22 +02:00
YoyoNow d657f9871d Update and integrate legacy system 2025-07-08 22:16:52 +02:00
Chaoscaot a572b84016 Add Items 2025-07-08 21:11:27 +02:00
YoyoNow f1c6b4b453 Update UserPerm colors "final?" 2025-07-08 19:58:49 +02:00
Chaoscaot d0414c71f3 Fix v3Mode handling in WorldEditWrapper14 2025-07-08 12:07:03 +02:00
Chaoscaot 3530aec5e2 Add more Flowers and add Leather horse Armour 2025-07-08 10:45:40 +02:00
Chaoscaot cccd090357 Add support for TPS and tick rate management in 1.21+ 2025-07-07 22:43:16 +02:00
Chaoscaot 3ae9a41b31 Hotfix: Entities on 1.21+ 2025-07-06 21:58:05 +02:00
Chaoscaot b8b38cf777 Merge pull request 'Handle KickedFromServerEvent with redirect and empty component' (#103) from remove-kicked-message into main
Reviewed-on: SteamWar/SteamWar#103
2025-07-06 17:58:46 +02:00
Chaoscaot c1eca74dd0 Handle KickedFromServerEvent with redirect and empty component 2025-07-06 14:06:07 +02:00
Chaoscaot 8c23bf5bd4 Fix 1.21 DisplayEntities 2025-07-06 11:58:54 +02:00
YoyoNow 556c8f7db1 Fix MissileWars team colors and TNTLeague team colors 2025-07-04 17:49:58 +02:00
YoyoNow 7a03b327ef Fix tablist for real 2025-07-03 18:00:17 +02:00
YoyoNow 0091cba336 Fix Tablist in 1.21.5 or greater 2025-07-03 16:59:24 +02:00
YoyoNow 35d8bfb588 Update UserPerm
Fix Tablist
2025-07-03 16:47:58 +02:00
YoyoNow 78584fea34 Update UserPerm 2025-07-03 16:38:46 +02:00
YoyoNow 66511e514c Merge pull request 'Add a simple smaller Trace file' (#25) from BauSystem/SmallerTraces into main
Reviewed-on: SteamWar/SteamWar#25
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-07-03 11:29:52 +02:00
YoyoNow 6f64d03fee Update pr stuff 2025-07-03 11:07:52 +02:00
Chaoscaot c04e8d75eb Reorder Colors (again) 2025-07-03 00:57:25 +02:00
Chaoscaot 5c7c982175 Merge branch 'main' into schematic-revisions 2025-07-03 00:45:03 +02:00
Chaoscaot d5ca1e14e1 Add prepared flag to schematics and refactor related logic 2025-07-02 12:25:58 +02:00
YoyoNow 60347bc481 Hotfix dependencies 2025-07-02 11:53:24 +02:00
Chaoscaot fbfdcf8fff Merge pull request 'VelocityCore/JDADependencyPlugin' (#91) from VelocityCore/JDADependencyPlugin into main
Reviewed-on: SteamWar/SteamWar#91
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-07-02 11:46:07 +02:00
YoyoNow e56c41ca66 Improve dependency upload 2025-07-02 11:36:06 +02:00
YoyoNow 3b67048b9c Improve jar size 2025-07-02 11:22:36 +02:00
YoyoNow 6efbda669e Optimize and improve VelocityCore size
Improve steamwar.devserver.gradle to not upload anything that is up to date!
2025-07-02 11:17:55 +02:00
YoyoNow 4bd5d9eb0b Remove unused get and query 2025-07-02 10:00:43 +02:00
YoyoNow 60a70dfc40 Remove unused get 2025-07-02 09:59:09 +02:00
YoyoNow 95a97aed93 Update TraceRepository to save quite a bit smaller traces 2025-07-02 09:16:48 +02:00
Chaoscaot 6fa54aba2f Merge pull request 'Update UserPerm' (#92) from UserPermColorUpdate into main
Reviewed-on: SteamWar/SteamWar#92
2025-07-02 09:16:04 +02:00
YoyoNow d04939fb2c Add a simple smaller Trace file, not finished! 2025-07-02 08:12:09 +02:00
Chaoscaot 4c98ce4aff Add Schematic Revisions 2025-07-01 21:39:08 +02:00
YoyoNow 4ed6bc52d0 Update TheBreadBeards Easter particle 2025-07-01 21:37:12 +02:00
YoyoNow bc00873314 Update UserPerm 2025-07-01 21:28:59 +02:00
YoyoNow 8677d59cce Fix some stuff 2025-07-01 19:04:13 +02:00
YoyoNow 6b16bbc785 Add DiscordDependency plugin for faster upload times 2025-07-01 19:00:14 +02:00
YoyoNow 617bae5a5c Add AuditLog 2025-07-01 18:48:59 +02:00
YoyoNow 9988774fb4 Fix Warp.WorldSpawn 2025-06-30 17:27:23 +02:00
YoyoNow 4fc707431f Fix WorldEditRenderer 2025-06-30 17:10:24 +02:00
YoyoNow 8ff0319fe6 Fix BauSystem.properties 2025-06-30 16:53:28 +02:00
YoyoNow 86537a00de Fix TraceRecorder 2025-06-30 16:52:02 +02:00
YoyoNow e9f8a89758 Hotfix Tablist duplicate names after softreload 2025-06-30 16:48:03 +02:00
YoyoNow f37fbfffdf Hotfix SmartPlaceListener 2025-06-30 16:05:52 +02:00
YoyoNow 9798c08cf3 Hotfix SmartPlaceListener 2025-06-30 16:02:43 +02:00
Chaoscaot dbd979a5fe Fix 1.21 2025-06-30 15:58:31 +02:00
Chaoscaot 280202c43f Merge pull request 'Update to support Minecraft 1.21.6 version' (#52) from update/1.21.5 into main
Reviewed-on: SteamWar/SteamWar#52
2025-06-30 15:53:44 +02:00
Chaoscaot 23df187eb1 settings.gradle.kts aktualisiert 2025-06-30 15:52:51 +02:00
YoyoNow 39af920631 Remove TutorialSystem 2025-06-30 15:29:19 +02:00
Chaoscaot e4864e6eaf Add new changetype alias 2025-06-29 20:11:36 +02:00
Chaoscaot d2bb8e8e59 Fix Relations 2025-06-29 19:53:42 +02:00
Chaoscaot bd9451f2aa Fix Backend 2025-06-29 11:22:41 +02:00
YoyoNow 1bb15d9551 Fix RPlayer skin data 2025-06-28 14:14:55 +02:00
YoyoNow d06faa5d18 Fix 'java.lang.reflect.InvocationTargetException' for RPlayer being initialised 2025-06-28 13:32:50 +02:00
YoyoNow bc5e781810 Hotfix VersionAnnouncer 2025-06-28 13:26:05 +02:00
YoyoNow 14b756261e Merge pull request 'Add event grouping' (#57) from event-brackets into main
Reviewed-on: SteamWar/SteamWar#57
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-06-26 23:40:51 +02:00
Chaoscaot 1f1f99f8f3 Adjust advancing team logic in EventRelation to fix fromPlace handling 2025-06-26 23:38:19 +02:00
YoyoNow d9aeb47a3a Merge pull request 'Update WorldEdit CUI to RBlockDisplay' (#34) from WorldEditCUI into main
Reviewed-on: SteamWar/SteamWar#34
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-06-26 23:28:16 +02:00
YoyoNow afe30fd348 Merge pull request 'Add BauLockState.SUPERVISOR' (#80) from VelocityCore/BauLockSupervisor into main
Reviewed-on: SteamWar/SteamWar#80
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-06-26 23:28:07 +02:00
YoyoNow 9f323c8b38 Merge pull request 'Fix RPlayer not showing when same player is present' (#71) from FixRPlayerHandling into main
Reviewed-on: SteamWar/SteamWar#71
Reviewed-by: D4rkr34lm <dark@steamwar.de>
2025-06-26 23:28:00 +02:00
YoyoNow b6279fd7fa Remove useless line of code 2025-06-26 22:06:38 +02:00
YoyoNow 3f7cd48f27 Update sensible defaults for WorldEditRendererCUIEditor 2025-06-26 22:01:56 +02:00
YoyoNow c682678827 Add ClientVersionPacket
Update VersionAnnouncer
2025-06-26 21:57:44 +02:00
YoyoNow 1fd8b3c4cb Add ClientVersionPacket 2025-06-26 21:52:07 +02:00
YoyoNow c6ecab5aa8 Fix some stuff 2025-06-26 21:05:11 +02:00
YoyoNow 4383e541d8 Fix some stuff 2025-06-26 21:05:11 +02:00
YoyoNow cc4532ab90 Update CAALine to CLine
Update CAABox to CWireframe
2025-06-26 21:05:09 +02:00
YoyoNow 3e448e7597 Remove default methods of WorldEditRendererWrapper 2025-06-26 21:04:46 +02:00
YoyoNow d975110470 Final fixes 2025-06-26 21:04:46 +02:00
YoyoNow f6852a5523 Add WorldEditRendererCUIEditor to Builder server 2025-06-26 21:04:45 +02:00
YoyoNow 40437afb73 Final fixes 2025-06-26 21:04:45 +02:00
YoyoNow 80a156754d Finalize WorldEditCUI 2025-06-26 21:04:45 +02:00
YoyoNow dfc7bbbe13 Fix WorldEditRendererWrapper9 2025-06-26 21:04:45 +02:00
YoyoNow dd5f46069f Delete WorldEditRenderer8 2025-06-26 21:04:45 +02:00
YoyoNow b10897c204 Update WorldEditRenderer 2025-06-26 21:04:43 +02:00
YoyoNow f6dc1e1059 Update WE version of 1.20 to FAWE 1.18 2025-06-26 21:04:35 +02:00
YoyoNow dccb435bce Update WorldEdit CUI to RBlockDisplay 2025-06-26 21:04:35 +02:00
YoyoNow 1c8d6580d5 Fix Scoreboard 2025-06-26 21:01:29 +02:00
YoyoNow 187087f56b Fix LaufbauSettings 2025-06-26 20:20:59 +02:00
YoyoNow 77cf101889 Add BauLockState.SUPERVISOR 2025-06-26 14:49:48 +02:00
YoyoNow 0f68f671f5 Merge pull request 'Remove Shields from Check Arena' (#67) from remove-shield-from-check-arena into main
Reviewed-on: SteamWar/SteamWar#67
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-06-26 14:20:15 +02:00
YoyoNow 75c4966e37 Fix SimulatorTNTGui for 1.19 2025-06-26 13:52:01 +02:00
Chaoscaot fcebb4ffd3 Add red team schematic paste in WGCommand 2025-06-14 22:01:29 +02:00
Chaoscaot 9abbcc908d Remove unused fillRegion method from WorldEdit wrapper and related code 2025-06-14 21:56:02 +02:00
YoyoNow 4eb40581f2 Hotfix TexturePackSystem 2025-06-12 22:07:24 +02:00
YoyoNow c3a4e7ed85 Improve network code 2025-06-12 21:28:49 +02:00
Chaoscaot 5201a3edc0 Adjust TechareaCommand to refine wireframe bounds using offset subtraction 2025-06-12 19:53:22 +02:00
Chaoscaot c9821053ce Refactor TechareaCommand to support per-player REntityServer instances and add periodic tick updates 2025-06-12 19:45:45 +02:00
YoyoNow eb8562b3a9 Merge pull request 'Add BlueInsetRegion management and implement TechareaCommand' (#73) from show-tech-area into main
Reviewed-on: SteamWar/SteamWar#73
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-06-12 19:29:32 +02:00
Chaoscaot 37acbf0033 Add BlueInsetRegion management and implement TechareaCommand 2025-06-12 19:27:56 +02:00
YoyoNow 9e294afa8f Merge pull request 'Add CEntity, CLine, CWireframe and optimize REntityServer' (#72) from WireFrames into main
Reviewed-on: SteamWar/SteamWar#72
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-06-12 19:20:58 +02:00
YoyoNow 3e9ffa52c3 Fix nit 2025-06-12 19:19:38 +02:00
YoyoNow 3296d9ebb3 Add CEntity, CLine, CWireframe and optimize REntityServer 2025-06-12 18:53:35 +02:00
YoyoNow 3d562cf743 Add skin cache to VelocityCore 2025-06-11 17:05:47 +02:00
YoyoNow 24f4ab7f37 Fix RPlayer not showing when same player is present
Add DevLobby20 to LobbySystem build.gradle.kts
2025-06-11 15:35:27 +02:00
YoyoNow 0ea92be2e1 Fix TexturePackSystem 2025-06-11 11:25:56 +02:00
YoyoNow 88d8016987 Fix TexturePackSystem 2025-06-11 10:58:01 +02:00
YoyoNow 909c1c52aa Hotfix Persistent 2025-06-11 08:09:31 +02:00
YoyoNow 26b126fdba Hotfix Persistent 2025-06-11 08:05:28 +02:00
Chaoscaot ecb2e736aa Mark declined schematics as seen and fix substring usage in CheckedSchematic creation 2025-06-10 22:34:27 +02:00
Chaoscaot 38559e8a2b Fix parameter order in CheckedSchematic.create method 2025-06-10 22:31:14 +02:00
Chaoscaot 1aba92e707 Add seen and nodeType fields to CheckedSchematic class 2025-06-10 22:29:31 +02:00
YoyoNow e4df6f55fb Merge pull request 'GUIImprovements' (#64) from GUIImprovements into main
Reviewed-on: SteamWar/SteamWar#64
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-06-10 21:08:23 +02:00
YoyoNow ff5113e112 Merge pull request 'Refactor schematic checks to handle unseen notifications' (#33) from add-offline-notify into main
Reviewed-on: SteamWar/SteamWar#33
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-06-10 20:57:33 +02:00
YoyoNow c425ca1171 Merge pull request 'Add declined question handling in CheckCommand' (#66) from add-saved-declined-questions-history into main
Reviewed-on: SteamWar/SteamWar#66
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-06-10 20:43:53 +02:00
YoyoNow c1293ffda0 Merge pull request 'Add 'queuerestart' command' (#68) from VelocityCore/QueueRestartCommand into main
Reviewed-on: SteamWar/SteamWar#68
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-06-10 20:43:04 +02:00
YoyoNow 02428868c2 Merge pull request 'Add player count to ListCommand' (#69) from VelocityCore/CountInListCommand into main
Reviewed-on: SteamWar/SteamWar#69
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-06-10 20:42:37 +02:00
YoyoNow adaae7f943 Update Persistent.queueRestart to toggle 2025-06-10 20:40:04 +02:00
YoyoNow c12d2c2ddf Add player count to ListCommand 2025-06-10 20:39:11 +02:00
YoyoNow 428c63429c Add 'queuerestart' command 2025-06-10 17:26:20 +02:00
YoyoNow edec84c60a Merge pull request 'Use Transfer Packet for Event Velocity' (#40) from transfer-packet into main
Reviewed-on: SteamWar/SteamWar#40
Reviewed-by: YoyoNow <yoyonow@noreply.localhost>
2025-06-10 17:18:58 +02:00
YoyoNow 4f885a7269 Merge branch 'main' into transfer-packet 2025-06-10 17:18:08 +02:00
Chaoscaot dfd9febd8c Remove Shields from Check Arena 2025-06-08 22:34:05 +02:00
Chaoscaot 1a570dca17 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/SteamWarLuaPlugin.java aktualisiert 2025-06-08 18:18:44 +02:00
Chaoscaot 761977c90a BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/SteamWarLuaPlugin.java aktualisiert 2025-06-08 16:42:45 +02:00
Chaoscaot 5cc417c43c Add declined question handling in CheckCommand
- Implemented tracking of declined questions during checks.
- Updated messaging logic to display declined questions to users.
- Added new translations for decline-related messages.
2025-06-05 23:41:01 +02:00
Chaoscaot 1014df5f31 PR Stuff 2025-06-03 23:39:16 +02:00
Chaoscaot c920664920 Merge branch 'main' into add-offline-notify 2025-06-03 23:35:35 +02:00
Chaoscaot 3069ffc991 Merge branch 'main' into update/1.21.5 2025-06-03 23:09:05 +02:00
Chaoscaot c3db2b7f86 VelocityCore/src/de/steamwar/velocitycore/listeners/EventModeListener.java aktualisiert 2025-06-01 14:36:49 +02:00
YoyoNow c30f24ab8f Hotfix Protocol Version for real now 2025-05-31 21:32:19 +02:00
Chaoscaot bcb0ad4bef Merge branch 'main' into update/1.21.5
# Conflicts:
#	VelocityCore/src/de/steamwar/velocitycore/ServerVersion.java
2025-05-31 20:20:07 +02:00
Chaoscaot f2a46e54ea Revert "Add WeatherCommand"
This reverts commit 30fa3fd66e.
2025-05-31 19:40:08 +02:00
YoyoNow daede98a0f Hotfix TeamCommand 2025-05-31 17:45:24 +02:00
YoyoNow d37a14f280 Move some constants around 2025-05-31 10:04:21 +02:00
YoyoNow 083c5c07c2 Update CMDs for all current CustomModelData usages 2025-05-31 09:39:03 +02:00
YoyoNow 7b059cde0e Add customModelData to Velocity SWItem 2025-05-31 08:51:56 +02:00
YoyoNow 30fa3fd66e Add WeatherCommand 2025-05-30 21:37:07 +02:00
YoyoNow 37f6723542 Add CommonCore.DATA and CMDs 2025-05-29 17:12:32 +02:00
Chaoscaot 7a9740c4c4 Fix EventFight activeFights query and add null check for spectatePort in CookieEvents 2025-05-29 15:05:01 +02:00
Chaoscaot 54eec6d57c Merge pull request 'SchematicSystem: Add music disks to auto checker' (#59) from SchematicSystem/Allow-music-disks into main
Reviewed-on: SteamWar/SteamWar#59
Reviewed-by: Chaoscaot <max@chaoscaot.de>
2025-05-29 14:37:49 +02:00
Chaoscaot 2f93f336c9 Add image upload functionality and enhance page metadata creation. 2025-05-29 14:30:06 +02:00
Chaoscaot 62f9d37230 Merge pull request 'Add tech hider bug handling for arena subservers in BugCommand' (#62) from bug-auto-techhider-bug into main
Reviewed-on: SteamWar/SteamWar#62
Reviewed-by: Lixfel <lixfel@noreply.localhost>
2025-05-29 14:27:56 +02:00
YoyoNow b479b6667b Merge pull request 'Enable a Dirt Block (Schem owner -1 and Name like GameMode) to be selected for any ServerTeam member' (#51) from FightSystem/EnableDirtBlockForServerTeam into main
Reviewed-on: SteamWar/SteamWar#51
Reviewed-by: Lixfel <lixfel@noreply.localhost>
2025-05-29 12:06:41 +02:00
YoyoNow 9bc01a4e3b Revert FightTeam 2025-05-29 12:00:12 +02:00
YoyoNow b14cf445df Fix PR stuff 2025-05-29 11:32:50 +02:00
YoyoNow 527bc39d38 Add some more CustomModelData ids to items 2025-05-29 08:44:58 +02:00
Chaoscaot 8defbaa18b Add tech hider bug handling for arena subservers in BugCommand 2025-05-29 00:03:25 +02:00
Chaoscaot a5bb62590c Refactor page routing and point calculation logic
Streamlined the `page` routing structure by optimizing branch and file handling, introducing a reusable `filesInDirectory` method, and cleaning up redundancies. Enhanced `EventGroup` point calculation with incremental updates, new helper methods (`getTeams`, `getTeamsId`), and better handling of unfinished fights.
2025-05-28 23:57:29 +02:00
YoyoNow c35d4741a0 Add TexturePackSystem 2025-05-28 14:19:21 +02:00
YoyoNow a2a101c4e3 Merge pull request 'Add NoGravity' (#61) from FightSystem/EnableNoGravityFights into main
Reviewed-on: SteamWar/SteamWar#61
Reviewed-by: Lixfel <lixfel@noreply.localhost>
2025-05-27 19:58:55 +02:00
YoyoNow 277e1f9f9b Add NoGravity 2025-05-27 18:15:03 +02:00
YoyoNow 380506542f Remove some more duplicates 2025-05-23 09:13:23 +02:00
YoyoNow d410484e4c Update JDA to newest version 2025-05-22 19:47:14 +02:00
Chaoscaot 8768fd7d81 Refactor event handling and group assignment logic
Replaced `fight.event` with `event.eventID` for consistency and improved event handling. Adjusted `setGroup` to accept `Integer` instead of `EventGroup` to simplify group assignment logic. Removed unused `event` field in `CreateEventFight` and streamlined related processing.
2025-05-22 19:42:49 +02:00
Chaoscaot 374e314faa Add new WATUT Channel 2025-05-22 18:19:31 +02:00
Chaoscaot 45a8aab321 Revert "Add "/event vote" command for SteamWarArcade Event"
This reverts commit 7f215b921e.
2025-05-18 19:44:29 +02:00
Chaoscaot 0d15bbc266 Revert "Add "/event vote" command for SteamWarArcade Event"
This reverts commit a5b61fb0d6.
2025-05-18 19:44:28 +02:00
Chaoscaot 7fa97ce36c Revert "Fix TowerRun event"
This reverts commit 8cd088050d.
2025-05-18 19:44:28 +02:00
Chaoscaot 8cd088050d Fix TowerRun event 2025-05-18 16:32:01 +02:00
Chaoscaot b0bbc09113 Fix TowerRun event 2025-05-18 16:28:26 +02:00
Chaoscaot a5b61fb0d6 Add "/event vote" command for SteamWarArcade Event
To be removed after event
2025-05-18 16:22:50 +02:00
YoyoNow 297e6c9b59 Fix OOM? 2025-05-18 15:58:31 +02:00
YoyoNow 400c78447a Fix IngameListener 2025-05-18 15:41:43 +02:00
YoyoNow 778d0282d3 Fix IngameListener 2025-05-18 15:37:43 +02:00
YoyoNow 2a314e7035 Add sout 2025-05-18 15:31:48 +02:00
YoyoNow 6ed639fbb3 Add sout 2025-05-18 13:46:39 +02:00
YoyoNow 3a79f19f37 Merge remote-tracking branch 'origin/main' 2025-05-18 13:34:45 +02:00
YoyoNow f7e81f8204 Hotfix OOM in IngameListener 2025-05-18 13:34:42 +02:00
Chaoscaot 7f215b921e Add "/event vote" command for SteamWarArcade Event
To be removed after event
2025-05-18 13:32:09 +02:00
Chaoscaot b0be06136d Add 'ergebnis' field to EventFights data model and update logic
Introduced a new 'ergebnis' field to the EventFights data model to handle fight results. Updated the logic to support processing and updating this field when provided. This ensures better tracking and management of event fight outcomes.
2025-05-18 13:31:14 +02:00
YoyoNow 8132e4fca0 Remove code duplication 2025-05-18 10:34:41 +02:00
YoyoNow bf5eef2ebd Fix copyright nit
Remove SchematicCommand19
2025-05-18 10:28:32 +02:00
D4rkr34lm 69251f42a6 Add music disks to autochecker 2025-05-17 23:40:48 +02:00
Chaoscaot 6bbe94150d Merge pull request 'Prevent usage of Flashback channels for restricted players' (#58) from flashback into main
Reviewed-on: SteamWar/SteamWar#58
Reviewed-by: Lixfel <lixfel@noreply.localhost>
2025-05-17 11:57:40 +02:00
Chaoscaot 717cfa8baf Prevent usage of Flashback channels for restricted players
Added new channel handlers to block Flashback mod channels for users without appropriate permissions. Ensures restricted players using these channels are disconnected with a specific warning message. This enhances control over mod usage and maintains server integrity.
2025-05-16 18:00:23 +02:00
Chaoscaot 260656ad35 Fix for events 2025-05-14 19:28:27 +02:00
Chaoscaot e893d7934a Fix TowerRun for events 2025-05-14 19:11:05 +02:00
YoyoNow d0665932f4 Fix TowerRunGame.reset 2025-05-11 20:19:23 +02:00
YoyoNow d6fba9b0af Fix many simple things 2025-05-11 19:02:46 +02:00
YoyoNow b229b0d0ae Fix many simple things 2025-05-11 19:02:02 +02:00
YoyoNow ac00245b04 Fix lag of IngameListener 2025-05-11 18:50:21 +02:00
YoyoNow 6eb01a61b1 Update every Back item to use the new texture 2025-05-11 18:28:06 +02:00
YoyoNow fa13872f22 Add SWListInv 2025-05-11 18:28:06 +02:00
YoyoNow 79edc1c591 Add Simulator to improvements 2025-05-11 18:28:06 +02:00
Chaoscaot 6e9db276ef Add event referees management and teams endpoint.
Introduced a new route for managing event referees with get, put, and delete operations. Also added an endpoint to fetch all teams, and integrated the referees routing into event configuration.
2025-05-10 22:22:43 +02:00
Chaoscaot e3179c69aa Refactor event group management and routing system 2025-05-08 17:32:12 +02:00
Chaoscaot c633694222 Refactor event handling and tie-break logic implementation
Introduced new methods and structures in EventGroup, EventRelation, and EventFight to streamline point calculations, tie-break detection, and dependency resolution. Improved modularity by adding methods like getLastFight, needsTieBreak, and getDependents while optimizing the event result setting process. This refactor enhances clarity, reduces redundancy, and supports better maintainability of event-related logic.
2025-05-07 16:16:36 +02:00
YoyoNow a4eea298d2 Hotfix PrepareSchem not copying allowReplay and replaceColor while creating a prepared schem 2025-05-07 14:37:00 +02:00
Chaoscaot f387805b40 Add event grouping 2025-05-07 13:51:13 +02:00
Chaoscaot 2c644eef26 Merge pull request 'Maybe™️ fix Techhider' (#56) from techhider-fixes into main
Reviewed-on: SteamWar/SteamWar#56
Reviewed-by: Lixfel <lixfel@noreply.localhost>
2025-05-02 14:26:18 +02:00
Chaoscaot 7f0fa09c56 Update OpenJ9 dump configuration to enable heap hprof. 2025-05-02 14:14:27 +02:00
Chaoscaot 6940c32b02 Adjust OpenJ9 JVM arguments to include hprof option in dumps. 2025-05-02 14:13:33 +02:00
Chaoscaot 5015aca159 Maybe™️ fix Techhider 2025-05-02 10:13:47 +02:00
Chaoscaot 1912ad52e4 Add protocol version check to handle potential packet issue 2025-04-28 23:25:36 +02:00
Chaoscaot f30c3b2f34 Update anvilgui library to version 1.10.5-SNAPSHOT 2025-04-27 02:58:05 +02:00
Chaoscaot 7e863e8062 Refactor entity field access with version-aware adjustments 2025-04-27 02:53:59 +02:00
Chaoscaot aeff16b7dd Update to support Minecraft 1.21.5 version 2025-04-24 14:07:35 +02:00
Chaoscaot bb97d80c18 Refactor to align with Minecraft 1.21.5 API changes 2025-04-24 13:10:48 +02:00
YoyoNow 7d45680fcb Enable a Dirt Block (Schem owner -1 and Name like GameMode) to be selected for any ServerTeam member 2025-04-23 21:52:27 +02:00
Chaoscaot 40eeb4993f Add support for cookie-based event spectating
ACHTUNG: Janky!
2025-04-13 20:06:38 +02:00
Chaoscaot 4c23915987 Use Transfer Packet for Event Velocity 2025-04-13 18:09:24 +02:00
Chaoscaot 71522973a7 Refactor schematic checks to handle unseen notifications 2025-03-24 16:50:39 +01:00
1543 changed files with 47340 additions and 52587 deletions
+60
View File
@@ -0,0 +1,60 @@
name: Bug Report
about: Du hast einen Fehler gefunden? Melde ihn hier!
labels: [ "typ/bug" ]
body:
- type: markdown
attributes:
value: |
ACHTUNG: Sollte es bei dem Bug ein Sicherheitsrisiko geben, melde es bitte auf unserem Discord Server
- type: textarea
id: description
attributes:
label: Description
description: |
Beschreibe deinen Bug in kurzer Form.
- type: input
id: mc-ver
attributes:
label: Minecraft Version
description: Minecraft Version des Clients
validations:
required: true
- type: input
id: mc-ver-ser
attributes:
label: Minecraft Version Server
description: Minecraft Version des Servers, nur bei Bau oder Arenen Servern
- type: dropdown
id: can-reproduce
attributes:
label: Kannst du den Fehler wiederholen?
description: |
Wenn du den Fehler wiederholen kannst, können wir dieses Problem schneller beheben.
Solltest du den Fehler nicht wiederholen können, melde dich bitte auf unserem Discord Server.
options:
- "Yes"
- "No"
validations:
required: true
- type: textarea
id: reproduce-steps
attributes:
label: Wie kannst du den Fehler wiederholen?
description: Welche Schritte musst du ausführen, um den Fehler wiederholen zu können?
validations:
required: true
- type: textarea
id: expected-result
attributes:
label: Was sollte passieren?
description: Was sollte hier deiner Erwartung nach passieren?
- type: input
id: logs
attributes:
label: Auf welchem Server ist der Fehler aufgetreten?
description: Gebe bitte den Namen des Servers an, auf dem der Fehler aufgetreten ist. z.B. "Lobby", "Lixfels Bauserver" etc.
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: Sollte es ein Visuelles Problem geben, kannst du hier Screenshots hinzufügen.
+1
View File
@@ -0,0 +1 @@
blank_issues_enabled: true
@@ -0,0 +1,17 @@
name: Feature Idee
about: Du hast eine Idee für ein neues Feature, welches SteamWar nicht hat? Stelle sie hier vor.
labels: [ "typ/idee" ]
body:
- type: textarea
id: description
attributes:
label: Feature Beschreibung
placeholder: |
Ich glaube, dass ...
validations:
required: true
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: Wenn es sich um etwas grafisches handelt, kannst du hier Screenshots hinzufügen.
+193
View File
@@ -0,0 +1,193 @@
name: Backport CommonCore
on:
pull_request:
types:
- closed
branches:
- main
permissions:
contents: write
pull-requests: write
env:
BACKPORT_PATH: CommonCore
BACKPORT_BRANCH_PREFIX: backport/commoncore
DISABLE_BACKPORT_LABEL: no-backport
jobs:
backport:
name: Create CommonCore backport PRs
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Check backport eligibility
id: eligibility
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.CI_BOT_TOKEN }}
run: |
set -euo pipefail
api_url="${GITHUB_API_URL:-${GITHUB_SERVER_URL}/api/v1}"
echo "Backport debug: event=${GITHUB_EVENT_NAME:-unknown}"
echo "Backport debug: server=${GITHUB_SERVER_URL}"
echo "Backport debug: api=${api_url}"
echo "Backport debug: repository=${GITHUB_REPOSITORY}"
echo "Backport debug: action=$(jq -r '.action // ""' "$GITHUB_EVENT_PATH")"
merged="$(jq -r '.pull_request.merged // (.pull_request.merged_at != null)' "$GITHUB_EVENT_PATH")"
base_branch="$(jq -r '.pull_request.base.ref' "$GITHUB_EVENT_PATH")"
has_disable_label="$(jq -r --arg disable_backport_label "$DISABLE_BACKPORT_LABEL" 'any(.pull_request.labels[]?; .name == $disable_backport_label)' "$GITHUB_EVENT_PATH")"
echo "Backport debug: pr=$(jq -r '.pull_request.number // ""' "$GITHUB_EVENT_PATH") base=${base_branch} merged=${merged}"
echo "Backport debug: disable label present=${has_disable_label}"
{
echo "should_backport=$([[ "$merged" == "true" && "$base_branch" == "main" && "$has_disable_label" != "true" ]] && echo true || echo false)"
echo "pr_number=$(jq -r '.pull_request.number' "$GITHUB_EVENT_PATH")"
echo "pr_title<<EOF"
jq -r '.pull_request.title' "$GITHUB_EVENT_PATH"
echo "EOF"
} >> "$GITHUB_OUTPUT"
labels="$(curl -fsS \
-H "Accept: application/json" \
-H "Authorization: token ${GITHUB_TOKEN}" \
"${api_url}/repos/${GITHUB_REPOSITORY}/labels")"
if ! jq -e --arg disable_backport_label "$DISABLE_BACKPORT_LABEL" 'any(.[]; .name == $disable_backport_label)' <<< "$labels" >/dev/null; then
curl -fsS -X POST \
-H "Accept: application/json" \
-H "Authorization: token ${GITHUB_TOKEN}" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg name "$DISABLE_BACKPORT_LABEL" --arg color "ededed" --arg description "Disable automatic CommonCore backporting for this pull request." '{name: $name, color: $color, description: $description}')" \
"${api_url}/repos/${GITHUB_REPOSITORY}/labels"
fi
- name: Create backport pull requests
if: steps.eligibility.outputs.should_backport == 'true'
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.CI_BOT_TOKEN }}
PR_NUMBER: ${{ steps.eligibility.outputs.pr_number }}
PR_TITLE: ${{ steps.eligibility.outputs.pr_title }}
run: |
set -euo pipefail
api_url="${GITHUB_API_URL:-${GITHUB_SERVER_URL}/api/v1}"
repo_api_path="/repos/${GITHUB_REPOSITORY}"
api_request() {
local method="$1"
local path="$2"
local output="$3"
local data_file="${4:-}"
local status
local args=(-sS -X "$method" -H "Accept: application/json" -H "Authorization: token ${GITHUB_TOKEN}" -w "%{http_code}" -o "$output")
if [[ -n "$data_file" ]]; then
args+=(-H "Content-Type: application/json" --data-binary "@${data_file}")
fi
echo "Backport debug: ${method} ${path}"
if ! status="$(curl "${args[@]}" "${api_url}${path}")"; then
echo "Backport debug: ${method} ${path} failed before HTTP status was captured."
if [[ -s "$output" ]]; then
echo "Backport debug: response body:"
cat "$output"
fi
return 1
fi
echo "Backport debug: ${method} ${path} -> HTTP ${status}"
if [[ ! "$status" =~ ^2 ]]; then
echo "Backport debug: response body:"
cat "$output"
return 1
fi
}
echo "Backport debug: event=${GITHUB_EVENT_NAME:-unknown}"
echo "Backport debug: server=${GITHUB_SERVER_URL}"
echo "Backport debug: api=${api_url}"
echo "Backport debug: repository=${GITHUB_REPOSITORY}"
echo "Backport debug: pr=${PR_NUMBER}"
echo "Backport debug: actor=${GITHUB_ACTOR:-unknown}"
git config user.name "SteamWar Backport Bot"
git config user.email "actions@steamwar.de"
if [[ "${GITHUB_SERVER_URL}" == https://* ]]; then
auth_host="${GITHUB_SERVER_URL#https://}"
git remote set-url origin "https://oauth2:${GITHUB_TOKEN}@${auth_host}/${GITHUB_REPOSITORY}.git"
fi
git fetch --prune origin '+refs/heads/version/*:refs/remotes/origin/version/*'
api_request GET "${repo_api_path}" repo-debug.json
jq -r '"Backport debug: repo permissions admin=\(.permissions.admin // "unknown") push=\(.permissions.push // "unknown") pull=\(.permissions.pull // "unknown")"' repo-debug.json || true
echo "Backport debug: GET ${repo_api_path}/pulls/${PR_NUMBER}.diff"
curl -fsSL -w "Backport debug: GET ${repo_api_path}/pulls/${PR_NUMBER}.diff -> HTTP %{http_code}\n" \
-H "Accept: text/plain" \
-H "Authorization: token ${GITHUB_TOKEN}" \
"${api_url}${repo_api_path}/pulls/${PR_NUMBER}.diff" \
-o pull-request.diff
if ! grep -Eq "^diff --git a/${BACKPORT_PATH}/" pull-request.diff; then
echo "Pull request #${PR_NUMBER} has no ${BACKPORT_PATH} changes to backport."
exit 0
fi
mapfile -t target_branches < <(git for-each-ref --format='%(refname:strip=3)' refs/remotes/origin/version)
if [[ "${#target_branches[@]}" -eq 0 ]]; then
echo "No version/* branches found."
exit 0
fi
for target_branch in "${target_branches[@]}"; do
safe_target="${target_branch//\//-}"
backport_branch="${BACKPORT_BRANCH_PREFIX}/pr-${PR_NUMBER}-to-${safe_target}"
git checkout -B "${backport_branch}" "origin/${target_branch}"
git reset --hard "origin/${target_branch}"
if ! git apply --3way --index --include="${BACKPORT_PATH}/**" pull-request.diff; then
echo "Failed to apply CommonCore backport for ${target_branch}."
exit 1
fi
if git diff --cached --quiet; then
echo "CommonCore changes from #${PR_NUMBER} are already present in ${target_branch}."
continue
fi
git commit -m "Backport CommonCore changes from #${PR_NUMBER}" -m "${PR_TITLE}"
git push --force-with-lease origin "${backport_branch}"
api_request GET "${repo_api_path}/pulls?state=open" open-pulls.json
open_pr_number="$(jq -r --arg base "$target_branch" --arg head "$backport_branch" '[.[] | select(.base.ref == $base and .head.ref == $head) | (.number // .index)][0] // empty' open-pulls.json)"
if [[ -n "$open_pr_number" ]]; then
echo "Backport PR #${open_pr_number} already exists for ${target_branch}."
continue
fi
pr_body="$(printf 'Automatic CommonCore backport of #%s.\n\nOriginal PR title: %s\n\nOnly files below `CommonCore/` are included.' "$PR_NUMBER" "$PR_TITLE")"
jq -n \
--arg base "$target_branch" \
--arg head "$backport_branch" \
--arg title "Backport CommonCore changes from #${PR_NUMBER} to ${target_branch}" \
--arg body "$pr_body" \
'{base: $base, head: $head, title: $title, body: $body}' > create-pull.json
echo "Backport debug: create PR base=${target_branch} head=${backport_branch}"
api_request POST "${repo_api_path}/pulls" create-pull-response.json create-pull.json
done
+150
View File
@@ -0,0 +1,150 @@
name: Deploy
on:
push:
branches:
- main
- version/*
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v6
- name: Setup Java 8
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 8
- name: Setup Java 11
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 11
- name: Setup Java 17
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 21
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Setup Maven Repository
env:
SW_MAVEN_CREDENTIALS: ${{ secrets.SW_MAVEN_CREDENTIALS }}
run: |
echo "$SW_MAVEN_CREDENTIALS" > steamwar.properties
- name: Build with Gradle
run: ./gradlew clean build --no-daemon --no-build-cache --refresh-dependencies
- name: Stage deploy artifacts
shell: bash
run: |
set -euo pipefail
rm -rf deploy
mkdir -p deploy
cp "AccessWidener/build/libs/AccessWidener-all.jar" "deploy/AccessWidener.jar"
cp "BauSystem/build/libs/BauSystem-all.jar" "deploy/BauSystem.jar"
cp "FightSystem/build/libs/FightSystem-all.jar" "deploy/FightSystem.jar"
cp "KotlinCore/build/libs/KotlinCore-all.jar" "deploy/KotlinCore.jar"
cp "TNTLeague/build/libs/TNTLeague.jar" "deploy/TNTLeague.jar"
cp "LobbySystem/build/libs/LobbySystem.jar" "deploy/LobbySystem.jar"
cp "MissileWars/build/libs/MissileWars.jar" "deploy/MissileWars.jar"
cp "Realtime/build/libs/Realtime.jar" "deploy/RealTime.jar"
cp "SchematicSystem/build/libs/SchematicSystem-all.jar" "deploy/SchematicSystem.jar"
cp "SpigotCore/build/libs/SpigotCore-all.jar" "deploy/SpigotCore.jar"
cp "Teamserver/build/libs/Teamserver.jar" "deploy/Builder.jar"
cp "TowerRun/build/libs/TowerRun.jar" "deploy/TowerRun.jar"
cp "VelocityCore/Persistent/build/libs/Persistent.jar" "deploy/PersistentVelocityCore.jar"
cp "VelocityCore/Dependencies/build/libs/Dependencies-all.jar" "deploy/DependenciesVelocityCore.jar"
cp "VelocityCore/build/libs/VelocityCore-all.jar" "deploy/VelocityCore.jar"
cp "WebsiteBackend/build/libs/WebsiteBackend-all.jar" "deploy/website-api.jar"
cp "CLI/build/distributions/sw.zip" "deploy/sw.zip"
- name: Upload deploy artifacts
uses: actions/upload-artifact@v3
with:
name: steamwar-jars
path: deploy/
deploy:
name: Deploy
runs-on: ubuntu-latest
needs: build
steps:
- name: Download deploy artifacts
uses: actions/download-artifact@v3
with:
name: steamwar-jars
path: deploy
- name: Resolve deploy target
id: target
shell: bash
run: |
set -euo pipefail
if [[ "${GITHUB_REF_NAME}" == "main" ]]; then
echo "path=/jars/current" >> "$GITHUB_OUTPUT"
elif [[ "${GITHUB_REF_NAME}" == version/* ]]; then
version="${GITHUB_REF_NAME#version/}"
if [[ ! "$version" =~ ^[A-Za-z0-9._-]+$ ]]; then
echo "Unsupported version branch name: ${GITHUB_REF_NAME}" >&2
exit 1
fi
echo "path=/jars/${version}" >> "$GITHUB_OUTPUT"
else
echo "Unsupported deployment branch: ${GITHUB_REF_NAME}" >&2
exit 1
fi
- name: Upload jars with scp
shell: bash
env:
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
DEPLOY_PORT: ${{ secrets.DEPLOY_PORT }}
DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
DEPLOY_PATH: ${{ steps.target.outputs.path }}
run: |
set -euo pipefail
: "${DEPLOY_HOST:?Missing DEPLOY_HOST secret}"
: "${DEPLOY_USER:?Missing DEPLOY_USER secret}"
: "${DEPLOY_SSH_KEY:?Missing DEPLOY_SSH_KEY secret}"
port="${DEPLOY_PORT:-22}"
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "$DEPLOY_SSH_KEY" > ~/.ssh/deploy_key
chmod 600 ~/.ssh/deploy_key
ssh-keyscan -p "$port" "$DEPLOY_HOST" >> ~/.ssh/known_hosts
ssh -i ~/.ssh/deploy_key -p "$port" "${DEPLOY_USER}@${DEPLOY_HOST}" "mkdir -p '$DEPLOY_PATH'"
ssh -i ~/.ssh/deploy_key -p "$port" "${DEPLOY_USER}@${DEPLOY_HOST}" "mkdir -p '$DEPLOY_PATH/upload'"
scp -i ~/.ssh/deploy_key -P "$port" deploy/* "${DEPLOY_USER}@${DEPLOY_HOST}:$DEPLOY_PATH/upload"
ssh -i ~/.ssh/deploy_key -p "$port" "${DEPLOY_USER}@${DEPLOY_HOST}" "rm -f '$DEPLOY_PATH'/*.jar '$DEPLOY_PATH'/*.zip"
ssh -i ~/.ssh/deploy_key -p "$port" "${DEPLOY_USER}@${DEPLOY_HOST}" "mv '$DEPLOY_PATH'/upload/* '$DEPLOY_PATH'"
ssh -i ~/.ssh/deploy_key -p "$port" "${DEPLOY_USER}@${DEPLOY_HOST}" "rm -r '$DEPLOY_PATH/upload'"
ssh -i ~/.ssh/deploy_key -p "$port" "${DEPLOY_USER}@${DEPLOY_HOST}" "chmod o-w '$DEPLOY_PATH'/*"
- name: Restart Services
shell: bash
env:
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
DEPLOY_PORT: ${{ secrets.DEPLOY_PORT }}
DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }}
run: |
set -euo pipefail
ssh -i ~/.ssh/deploy_key -p "$DEPLOY_PORT" "${DEPLOY_USER}@${DEPLOY_HOST}" "sudo systemctl restart api.service"
ssh -i ~/.ssh/deploy_key -p "$DEPLOY_PORT" "${DEPLOY_USER}@${DEPLOY_HOST}" "unzip -o /jars/current/sw.zip -d /jars"
+76
View File
@@ -0,0 +1,76 @@
name: Pull Request Build
on:
pull_request:
permissions:
contents: write
pull-requests: write
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v6
- name: Setup Java 8
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 8
- name: Setup Java 11
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 11
- name: Setup Java 17
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 17
- name: Setup Java
uses: actions/setup-java@v5
with:
distribution: 'temurin'
java-version: 21
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Setup Maven Repository
env:
SW_MAVEN_CREDENTIALS: ${{ secrets.SW_MAVEN_CREDENTIALS }}
run: |
echo "$SW_MAVEN_CREDENTIALS" > steamwar.properties
- name: Build with Gradle
run: ./gradlew build --no-daemon
- name: Merge successful backport PR
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.CI_BOT_TOKEN }}
BACKPORT_BRANCH_PREFIX: backport/commoncore
run: |
set -euo pipefail
head_branch="$(jq -r '.pull_request.head.ref // ""' "$GITHUB_EVENT_PATH")"
base_branch="$(jq -r '.pull_request.base.ref // ""' "$GITHUB_EVENT_PATH")"
pr_number="$(jq -r '.pull_request.number' "$GITHUB_EVENT_PATH")"
if [[ "${head_branch}" != "${BACKPORT_BRANCH_PREFIX}/"* ]]; then
echo "Not a CommonCore backport PR."
exit 0
fi
if [[ "${base_branch}" != version/* ]]; then
echo "Backport PR target is not a version/* branch."
exit 0
fi
api_url="${GITHUB_API_URL:-${GITHUB_SERVER_URL}/api/v1}"
curl -fsS -X POST \
-H "Accept: application/json" \
-H "Authorization: token ${GITHUB_TOKEN}" \
-H "Content-Type: application/json" \
-d '{"Do":"merge","delete_branch_after_merge":true}' \
"${api_url}/repos/${GITHUB_REPOSITORY}/pulls/${pr_number}/merge"
+6 -1
View File
@@ -8,12 +8,17 @@
steamwar.properties steamwar.properties
# IntelliJ IDEA # IntelliJ IDEA
.idea
*.iml *.iml
# VSCode # VSCode
bin/ bin/
.vscode .vscode
.settings
# Other # Other
lib lib
/WebsiteBackend/data
/WebsiteBackend/logs
/WebsiteBackend/skins
/WebsiteBackend/config.json
/WebsiteBackend/sessions
+32
View File
@@ -0,0 +1,32 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
/AndroidProjectSystem.xml
/checkstyle-idea.xml
/compiler.xml
/copilot.data.migration.agent.xml
/copilot.data.migration.ask.xml
/copilot.data.migration.ask2agent.xml
/copilot.data.migration.edit.xml
/dataSources.xml
/encodings.xml
/git_toolbox_blame.xml
/git_toolbox_prj.xml
/gradle.xml
/jarRepositories.xml
/jpa.xml
/kotlinc.xml
/misc.xml
/modules.xml
/scala_compiler.xml
/swagger-settings.xml
/uiDesigner.xml
/vcs.xml
/codeStyles/
/inspectionProfiles/
/modules/
+7
View File
@@ -0,0 +1,7 @@
<component name="CopyrightManager">
<settings default="sw">
<module2copyright>
<element module="All" copyright="sw" />
</module2copyright>
</settings>
</component>
+6
View File
@@ -0,0 +1,6 @@
<component name="CopyrightManager">
<copyright>
<option name="notice" value=" This file is a part of the SteamWar software.&#10; &#10; Copyright (C) &amp;#36;today.year SteamWar.de-Serverteam&#10; &#10; This program is free software: you can redistribute it and/or modify&#10; it under the terms of the GNU Affero General Public License as published by&#10; the Free Software Foundation, either version 3 of the License, or&#10; (at your option) any later version.&#10; &#10; This program is distributed in the hope that it will be useful,&#10; but WITHOUT ANY WARRANTY; without even the implied warranty of&#10; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&#10; GNU Affero General Public License for more details.&#10; &#10; You should have received a copy of the GNU Affero General Public License&#10; along with this program. If not, see &lt;https://www.gnu.org/licenses/&gt;." />
<option name="myName" value="sw" />
</copyright>
</component>
+15
View File
@@ -0,0 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Remote JVM Debugger" type="Remote">
<option name="USE_SOCKET_TRANSPORT" value="true" />
<option name="SERVER_MODE" value="false" />
<option name="SHMEM_ADDRESS" />
<option name="HOST" value="localhost" />
<option name="PORT" value="5005" />
<option name="AUTO_RESTART" value="false" />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="5005" />
<option name="LOCAL" value="false" />
</RunnerSettings>
<method v="2" />
</configuration>
</component>
+45
View File
@@ -0,0 +1,45 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2025 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/>.
*/
plugins {
`java-library`
alias(libs.plugins.shadow)
}
dependencies {
implementation("org.ow2.asm:asm:9.7")
implementation("org.ow2.asm:asm-commons:9.7")
}
tasks.shadowJar {
manifest {
attributes(
"Manifest-Version" to "1.0",
"Build-Jdk-Spec" to "21",
"Main-Class" to "de.steamwar.Main",
"Premain-Class" to "de.steamwar.Agent",
"Can-Retransform-Classes" to "true",
"Can-Redefine-Classes" to "true",
)
}
}
tasks.build {
dependsOn(tasks.shadowJar)
}
@@ -0,0 +1,49 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 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;
/**
* A single parsed line from a .accesswidener file.
* <p>
* Examples:
* accessible class net/minecraft/server/level/ServerPlayer
* accessible method net/minecraft/server/level/ServerPlayer getStats ()V
* mutable field net/minecraft/world/entity/Entity id I
* extendable class net/minecraft/world/level/chunk/LevelChunk
*/
public record AccessWidenerEntry(
/** accessible | mutable | extendable (may have "transitive-" prefix) */
String directive,
/** class | method | field */
String memberType,
/** Internal class name, e.g. net/minecraft/server/level/ServerPlayer */
String target,
/** Method/field name, null for class entries */
String name,
/** Descriptor, null for class entries */
String descriptor) {
/**
* Returns true if this entry targets the class with the given internal name.
*/
public boolean targets(String internalName) {
return target.equals(internalName);
}
}
@@ -0,0 +1,104 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 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;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
* Parses Fabric-compatible .accesswidener files.
* <p>
* Supported format:
* <pre>
* accessWidener v2 named
*
* # comments are supported
* accessible class net/minecraft/Foo
* accessible method net/minecraft/Foo someMethod ()V
* accessible field net/minecraft/Foo someField I
* mutable field net/minecraft/Foo someField I
* extendable class net/minecraft/Foo
* extendable method net/minecraft/Foo someMethod ()V
*
* # transitive variants (expose widening to dependents)
* transitive-accessible class net/minecraft/Foo
* </pre>
*/
public final class AccessWidenerParser {
private AccessWidenerParser() {
}
public static List<AccessWidenerEntry> parse(InputStream in) throws IOException {
List<AccessWidenerEntry> entries = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8))) {
String line;
boolean headerSeen = false;
while ((line = reader.readLine()) != null) {
// Strip inline comments
int commentIdx = line.indexOf('#');
if (commentIdx >= 0) line = line.substring(0, commentIdx);
line = line.strip();
if (line.isEmpty()) continue;
if (!headerSeen) {
// First non-blank, non-comment line must be the header
if (!line.startsWith("accessWidener")) {
throw new IOException("Missing accessWidener header, got: " + line);
}
headerSeen = true;
continue;
}
AccessWidenerEntry entry = parseLine(line);
if (entry != null) entries.add(entry);
}
}
return entries;
}
private static AccessWidenerEntry parseLine(String line) {
String[] parts = line.split("\\s+");
if (parts.length < 3) return null;
String directive = parts[0]; // accessible / mutable / extendable / transitive-*
String memberType = parts[1]; // class / method / field
String target = parts[2]; // internal class name
return switch (memberType) {
case "class" -> new AccessWidenerEntry(directive, "class", target, null, null);
case "method", "field" -> {
if (parts.length < 5) yield null;
yield new AccessWidenerEntry(directive, memberType, target, parts[3], parts[4]);
}
default -> null;
};
}
}
@@ -0,0 +1,75 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 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;
import java.io.File;
import java.io.IOException;
import java.lang.instrument.Instrumentation;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
/**
* Java agent entry point.
* <p>
* At JVM startup: java -javaagent:paper-access-widener-agent.jar -jar server.jar
* <p>
* On attach the agent:
* <ol>
* <li>Find all .jar files inside the plugins folder</li>
* <li>Scan all found jars for *.accesswidener resources</li>
* <li>Transform any class during loading</li>
* </ol>
*/
public class Agent {
private Agent() {
throw new IllegalStateException("Utility class");
}
private static final Logger LOG = Logger.getLogger("AccessWidenerAgent");
// -javaagent: startup
public static void premain(String args, Instrumentation inst) {
init(inst);
}
private static void init(Instrumentation inst) {
LOG.info("[AccessWidener] Agent initialising.");
List<AccessWidenerEntry> entries = new ArrayList<>();
File file = new File(new File(".").getAbsoluteFile(), "plugins/");
File[] files = file.listFiles();
if (files == null) files = new File[0];
for (File jarFile : files) {
if (!jarFile.isFile()) continue;
if (!jarFile.getName().endsWith(".jar")) continue;
try {
entries.addAll(Utils.findAndParseAccessWideners(jarFile.toPath()));
} catch (IOException e) {
LOG.warning("Failed to parse access wideners from " + jarFile.getAbsolutePath());
}
}
LOG.info("[AccessWidener] Loaded " + entries.size() + " access wideners.");
inst.addTransformer(new WideningTransformer(entries), false);
LOG.info("[AccessWidener] Agent ready.");
}
}
@@ -0,0 +1,83 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 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;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* Uses ASM to patch class bytecode according to a list of access widener entries.
*
* Returns {@code null} if the class is not targeted by any entry (no-op signal
* to the caller so it can skip the write).
*/
public class ClassPatcher {
private static final Logger LOG = Logger.getLogger("ClassPatcher");
private final List<AccessWidenerEntry> entries;
/** Pre-computed set of targeted internal names for fast filtering. */
private final Set<String> targets;
private final Set<String> targetsPublicConstructor;
public ClassPatcher(List<AccessWidenerEntry> entries) {
this.entries = entries;
this.targets = entries.stream()
.map(AccessWidenerEntry::target)
.flatMap(s -> {
if (!s.contains("$")) return Stream.of(s);
int index = s.lastIndexOf('$');
return Stream.of(s, s.substring(0, index));
})
.collect(Collectors.toSet());
this.targetsPublicConstructor = entries.stream()
.filter(entry -> entry.directive().equals("transitive-extendable"))
.map(AccessWidenerEntry::target)
.collect(Collectors.toSet());
}
/**
* Patches {@code classBytes} if {@code className} is targeted.
*
* @return patched bytes, or {@code null} if no changes were needed
*/
public byte[] patch(String className, byte[] classBytes) {
if (!targets.contains(className)) return null;
try {
ClassReader cr = new ClassReader(classBytes);
ClassWriter cw = new ClassWriter(cr, 0);
cr.accept(new ClassTransformer(cw, className, entries, targetsPublicConstructor.contains(className)), ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
return cw.toByteArray();
} catch (Exception e) {
LOG.warning("[AccessWidener] Failed to transform " + className + ": " + e.getMessage());
return null;
}
}
}
@@ -0,0 +1,125 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 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;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.FieldVisitor;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import java.util.List;
public class ClassTransformer extends ClassVisitor {
private final String internalName;
private final List<AccessWidenerEntry> entries;
private final boolean appendPublicConstructor;
public ClassTransformer(ClassVisitor cv, String internalName, List<AccessWidenerEntry> entries, boolean appendPublicConstructor) {
super(Opcodes.ASM9, cv);
this.internalName = internalName;
this.entries = entries;
this.appendPublicConstructor = appendPublicConstructor;
}
@Override
public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
int newAccess = access;
for (AccessWidenerEntry e : entries) {
if (!e.targets(internalName) || !"class".equals(e.memberType())) continue;
newAccess = applyDirective(e.directive(), newAccess, false);
}
if (appendPublicConstructor) {
MethodVisitor methodVisitor = visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null);
methodVisitor.visitCode();
methodVisitor.visitVarInsn(Opcodes.ALOAD, 0);
methodVisitor.visitMethodInsn(
Opcodes.INVOKESPECIAL,
"java/lang/Object",
"<init>",
"()V",
false
);
methodVisitor.visitInsn(Opcodes.RETURN);
methodVisitor.visitMaxs(1, 1);
methodVisitor.visitEnd();
}
super.visit(version, newAccess, name, signature, superName, interfaces);
}
@Override
public void visitInnerClass(String name, String outerName, String innerName, int access) {
int newAccess = access;
for (AccessWidenerEntry e : entries) {
if (!e.target().equals(name) || !"class".equals(e.memberType())) continue;
newAccess = applyDirective(e.directive(), newAccess, false);
}
super.visitInnerClass(name, outerName, innerName, newAccess);
}
@Override
public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
int newAccess = access;
for (AccessWidenerEntry e : entries) {
if (!e.targets(internalName) || !"method".equals(e.memberType())) continue;
if (!name.equals(e.name()) || !descriptor.equals(e.descriptor())) continue;
newAccess = applyDirective(e.directive(), newAccess, false);
}
return super.visitMethod(newAccess, name, descriptor, signature, exceptions);
}
@Override
public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) {
int newAccess = access;
for (AccessWidenerEntry e : entries) {
if (!e.targets(internalName) || !"field".equals(e.memberType())) continue;
if (!name.equals(e.name())) continue;
newAccess = applyDirective(e.directive(), newAccess, true);
}
return super.visitField(newAccess, name, descriptor, signature, value);
}
/**
* Apply a directive to an access bitmask.
*
* @param directive accessible / mutable / extendable (with optional "transitive-" prefix)
* @param access current access flags
* @param isField true when processing a field (mutable removes final)
*/
private static int applyDirective(String directive, int access, boolean isField) {
// Strip transitive- prefix — the widening itself is the same
String effective = directive.startsWith("transitive-") ? directive.substring("transitive-".length()) : directive;
return switch (effective) {
case "accessible" -> makePublic(access);
case "extendable" -> makePublic(removeFinal(access));
case "mutable" -> isField ? removeFinal(access) : access;
default -> access;
};
}
private static int makePublic(int access) {
return (access & ~(Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED)) | Opcodes.ACC_PUBLIC;
}
private static int removeFinal(int access) {
return access & ~Opcodes.ACC_FINAL;
}
}
@@ -0,0 +1,125 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 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;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.*;
import java.util.ArrayList;
import java.util.List;
/**
* Command-line tool that produces a widened copy of a JAR for use as a
* compile-time stub in IntelliJ / Gradle.
*
* Usage:
* java -jar jar-widener.jar <input.jar> <output.jar> [file.accesswidener ...]
*
* The output JAR is identical to the input JAR except that every class
* targeted by the access widener entries has its access flags patched:
* accessible → public
* extendable → public + non-final
* mutable → non-final field
*
* Intended for use as a Gradle task so IntelliJ sees the already-widened
* class when you Ctrl+click NMS code, and javac compiles without complaints.
*/
public class Main {
public static void main(String[] args) throws Exception {
if (args.length < 2) {
System.err.println("Usage: jar-widener <input.jar> <output.jar> [*.accesswidener ...]");
System.exit(1);
}
Path inputJar = Path.of(args[0]);
Path outputJar = Path.of(args[1]);
if (!Files.exists(inputJar)) {
System.err.println("Input JAR not found: " + inputJar);
System.exit(1);
}
// --- Collect all access widener entries ---
List<AccessWidenerEntry> entries = new ArrayList<>();
if (args.length > 2) {
for (int i = 2; i < args.length; i++) {
Path awFile = Path.of(args[i]);
if (!Files.exists(awFile)) {
System.err.println("Warning: access widener file not found, skipping: " + awFile);
continue;
}
try (InputStream in = Files.newInputStream(awFile)) {
List<AccessWidenerEntry> parsed = AccessWidenerParser.parse(in);
System.out.println("Loaded " + parsed.size() + " entries from " + awFile.getFileName());
entries.addAll(parsed);
}
}
}
if (entries.isEmpty()) {
System.out.println("No access widener entries found — copying JAR unchanged.");
Files.createDirectories(outputJar.getParent());
Files.copy(inputJar, outputJar, StandardCopyOption.REPLACE_EXISTING);
return;
}
System.out.println("Widening " + inputJar.getFileName()
+ " with " + entries.size() + " total entr"
+ (entries.size() == 1 ? "y" : "ies") + "...");
// --- Copy input → output, transforming .class files in place ---
Files.createDirectories(outputJar.getParent());
Files.copy(inputJar, outputJar, StandardCopyOption.REPLACE_EXISTING);
ClassPatcher patcher = new ClassPatcher(entries);
try (FileSystem fs = FileSystems.newFileSystem(outputJar)) {
// Walk every .class entry in the JAR
try (var stream = Files.walk(fs.getPath("/"))) {
stream.filter(p -> p.toString().endsWith(".class"))
.forEach(classPath -> patchClass(fs, classPath, patcher));
}
}
System.out.println("Done. Widened JAR written to " + outputJar);
}
private static void patchClass(FileSystem fs, Path classPath, ClassPatcher patcher) {
// Derive internal class name from path e.g. /net/minecraft/Foo.class → net/minecraft/Foo
String internalName = classPath.toString()
.replaceFirst("^/", "")
.replace(".class", "");
try {
byte[] original = Files.readAllBytes(classPath);
byte[] patched = patcher.patch(internalName, original);
if (patched != null) {
Files.write(classPath, patched);
System.out.println(" Widened: " + internalName);
}
} catch (IOException e) {
System.err.println(" Warning: failed to patch " + internalName + ": " + e.getMessage());
}
}
}
@@ -0,0 +1,60 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 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;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.logging.Logger;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public class Utils {
private static final Logger LOG = Logger.getLogger("AccessWidenerAgent");
private Utils() {
throw new IllegalStateException("Utility class");
}
public static List<AccessWidenerEntry> findAndParseAccessWideners(Path jarPath) throws IOException {
List<AccessWidenerEntry> results = new ArrayList<>();
try (ZipFile zip = new ZipFile(jarPath.toFile())) {
Enumeration<? extends ZipEntry> entries = zip.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
if (entry.isDirectory() || !entry.getName().endsWith(".accesswidener")) continue;
try (InputStream in = zip.getInputStream(entry)) {
results.addAll(AccessWidenerParser.parse(in));
} catch (IOException e) {
LOG.warning("[AccessWidener] Failed to parse " + entry.getName()
+ " in " + jarPath.getFileName() + ": " + e.getMessage());
}
}
}
return results;
}
}
@@ -0,0 +1,44 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 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;
import java.lang.instrument.ClassFileTransformer;
import java.security.ProtectionDomain;
import java.util.List;
/**
* Transforms class bytecode to apply access widening rules.
* <p>
* Also monitors for new plugin ClassLoaders appearing (when plugins load after
* the agent attaches) and automatically picks up their .accesswidener files.
*/
public class WideningTransformer implements ClassFileTransformer {
private final ClassPatcher patcher;
public WideningTransformer(List<AccessWidenerEntry> entries) {
patcher = new ClassPatcher(entries);
}
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) {
return patcher.patch(className, classfileBuffer);
}
}
-35
View File
@@ -1,35 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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/>.
*/
plugins {
steamwar.java
}
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
dependencies {
compileOnly(project(":BauSystem:BauSystem_Main", "default"))
compileOnly(project(":SpigotCore", "default"))
compileOnly(libs.nms15)
compileOnly(libs.worldedit15)
}
@@ -1,239 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2022 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.bausystem.utils;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.bukkit.BukkitWorld;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardReader;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.mask.Mask2D;
import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.math.transform.AffineTransform;
import com.sk89q.worldedit.regions.CuboidRegion;
import com.sk89q.worldedit.regions.selector.CuboidRegionSelector;
import com.sk89q.worldedit.session.ClipboardHolder;
import com.sk89q.worldedit.world.World;
import com.sk89q.worldedit.world.block.BaseBlock;
import com.sk89q.worldedit.world.block.BlockTypes;
import de.steamwar.bausystem.region.Point;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Waterlogged;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import javax.annotation.Nullable;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.BiPredicate;
import java.util.logging.Level;
public class FlatteningWrapper15 implements FlatteningWrapper {
@Override
public boolean isNoBook(ItemStack item) {
return item.getType() != Material.WRITABLE_BOOK && item.getType() != Material.WRITTEN_BOOK;
}
private static final Set<Material> unpushable = new HashSet<>(Arrays.asList(Material.BARRIER, Material.BEACON, Material.COMMAND_BLOCK, Material.CHAIN_COMMAND_BLOCK, Material.REPEATING_COMMAND_BLOCK, Material.ENCHANTING_TABLE, Material.END_GATEWAY, Material.END_PORTAL, Material.ENDER_CHEST, Material.GRINDSTONE, Material.JIGSAW, Material.JUKEBOX, Material.NETHER_PORTAL, Material.OBSIDIAN, Material.STRUCTURE_VOID, Material.BARREL, Material.BEEHIVE, Material.BEE_NEST, Material.BLAST_FURNACE, Material.BREWING_STAND, Material.CHEST, Material.DAYLIGHT_DETECTOR, Material.DISPENSER, Material.DROPPER, Material.FURNACE, Material.HOPPER, Material.LECTERN, Material.SMOKER, Material.TRAPPED_CHEST));
// TODO: FLOWER
private static final Set<Material> breaking = new HashSet<>(Arrays.asList(Material.BAMBOO, Material.CACTUS, Material.CAKE, Material.CARVED_PUMPKIN, Material.CHORUS_FLOWER, Material.CHORUS_PLANT, Material.COBWEB, Material.COCOA, Material.DRAGON_EGG, Material.FIRE, Material.FLOWER_POT, Material.JACK_O_LANTERN, Material.LADDER, Material.LAVA, Material.LAVA, Material.LEVER, Material.LILY_PAD, Material.MELON, Material.NETHER_WART, Material.PUMPKIN, Material.COMPARATOR, Material.REDSTONE_WIRE, Material.REPEATER, Material.TORCH, Material.STRUCTURE_VOID, Material.SCAFFOLDING, Material.SEA_PICKLE, Material.SNOW, Material.SUGAR_CANE, Material.TORCH, Material.TRIPWIRE, Material.TRIPWIRE_HOOK, Material.TURTLE_EGG, Material.VINE, Material.WATER, Material.WHEAT));
@Override
public boolean isUnpusheable(Material material) {
if (unpushable.contains(material)) {
return true;
}
String name = material.name();
return name.contains("BANNER") || name.contains("SIGN");
}
@Override
public boolean isBreakingOnPush(Material material) {
if (breaking.contains(material)) {
return true;
}
String name = material.name();
return name.contains("BED") || name.contains("BUTTON") || name.contains("CARPET") || (name.contains("DOOR") && !name.contains("TRAPDOOR")) || name.contains("HEAD") || name.contains("LEAVES") || name.contains("MUSHROOM") || name.contains("PRESSURE_PLATE") || name.contains("SHULKER_BOX");
}
@Override
public boolean isWorldEditCommand(String command) {
if (command.startsWith("/")) {
command = command.replaceFirst("/", "");
}
command = command.toLowerCase();
return WorldEdit.getInstance().getPlatformManager().getPlatformCommandManager().getCommandManager().containsCommand(command);
}
private static final WorldEditPlugin WORLDEDIT_PLUGIN = Objects.requireNonNull((WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"));
private static final World BUKKITWORLD = new BukkitWorld(Bukkit.getWorlds().get(0));
@Override
public void setSelection(Player p, Point minPoint, Point maxPoint) {
WORLDEDIT_PLUGIN.getSession(p).setRegionSelector(BUKKITWORLD, new CuboidRegionSelector(BUKKITWORLD, minPoint.toBlockVector3(), maxPoint.toBlockVector3()));
}
@Override
public Clipboard loadSchematic(File file) {
Clipboard clipboard;
try (ClipboardReader reader = Objects.requireNonNull(ClipboardFormats.findByFile(file)).getReader(new FileInputStream(file))) {
clipboard = reader.read();
} catch (NullPointerException | IOException e) {
throw new SecurityException("Bausystem schematic not found", e);
}
return clipboard;
}
@Override
public EditSession paste(PasteBuilder pasteBuilder) {
try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) {
Clipboard clipboard = pasteBuilder.getClipboard();
if (!pasteBuilder.getMappers().isEmpty()) {
BlockVector3 minimum = clipboard.getRegion().getMinimumPoint();
for (int x = 0; x < clipboard.getDimensions().getX(); x++) {
for (int y = 0; y < clipboard.getDimensions().getY(); y++) {
for (int z = 0; z < clipboard.getDimensions().getZ(); z++) {
BlockVector3 pos = minimum.add(x, y, z);
pasteBuilder.getMappers().forEach(mapper -> mapper.accept(clipboard, pos));
}
}
}
}
AtomicReference<BlockVector3> pastePoint = new AtomicReference<>();
if (!pasteBuilder.getPredicates().isEmpty()) {
e.setMask(new Mask() {
@Override
public boolean test(BlockVector3 blockVector3) {
BaseBlock block = clipboard.getFullBlock(blockVector3.subtract(pastePoint.get()).add(clipboard.getRegion().getMinimumPoint()));
String blockName = block.getBlockType().toString().toLowerCase();
for (BiPredicate<BaseBlock, String> predicate : pasteBuilder.getPredicates()) {
if (!predicate.test(block, blockName)) return false;
}
return true;
}
public Mask copy() {
return this;
}
@Nullable
@Override
public Mask2D toMask2D() {
return null;
}
});
}
ClipboardHolder ch = new ClipboardHolder(clipboard);
BlockVector3 dimensions = clipboard.getDimensions();
BlockVector3 v = BlockVector3.at(pasteBuilder.getPastPoint().getX(), pasteBuilder.getPastPoint().getY(), pasteBuilder.getPastPoint().getZ());
BlockVector3 offset = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin());
if (pasteBuilder.isRotate()) {
ch.setTransform(new AffineTransform().rotateY(180));
v = v.add(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset.multiply(-1, 1, -1)).subtract(0, 0, 1);
} else {
v = v.subtract(dimensions.getX() / 2, 0, dimensions.getZ() / 2).subtract(offset);
}
pastePoint.set(v);
if (pasteBuilder.isReset()) {
e.setBlocks(new CuboidRegion(pasteBuilder.getMinPoint().toBlockVector3(), pasteBuilder.getMaxPoint().toBlockVector3()), Objects.requireNonNull(BlockTypes.AIR).getDefaultState().toBaseBlock());
if (pasteBuilder.getWaterLevel() != 0) {
e.setBlocks(new CuboidRegion(pasteBuilder.getMinPoint().toBlockVector3(), pasteBuilder.getMaxPoint().toBlockVector3().withY(pasteBuilder.getWaterLevel())), Objects.requireNonNull(BlockTypes.WATER).getDefaultState().toBaseBlock());
}
}
Operations.completeBlindly(ch.createPaste(e).to(v).ignoreAirBlocks(pasteBuilder.isIgnoreAir()).build());
return e;
} catch (WorldEditException e) {
throw new SecurityException(e.getMessage(), e);
}
}
@Override
public Clipboard copy(Point minPoint, Point maxPoint, Point copyPoint) {
BukkitWorld bukkitWorld = new BukkitWorld(Bukkit.getWorlds().get(0));
CuboidRegion region = new CuboidRegion(bukkitWorld, minPoint.toBlockVector3(), maxPoint.toBlockVector3());
BlockArrayClipboard clipboard = new BlockArrayClipboard(region);
try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(bukkitWorld, -1)) {
ForwardExtentCopy copy = new ForwardExtentCopy(
e, region, clipboard, region.getMinimumPoint()
);
copy.setCopyingEntities(false);
copy.setCopyingBiomes(false);
Operations.complete(copy);
clipboard.setOrigin(copyPoint.toBlockVector3());
return clipboard;
} catch (WorldEditException e) {
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
return null;
}
}
@Override
public boolean backup(Point minPoint, Point maxPoint, File file) {
Clipboard clipboard = copy(minPoint, maxPoint, minPoint);
try (ClipboardWriter writer = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(file))) {
writer.write(clipboard);
return true;
} catch (IOException e) {
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
return false;
}
}
@Override
public boolean inWater(org.bukkit.World world, Vector tntPosition) {
Block block = world.getBlockAt(tntPosition.getBlockX(), tntPosition.getBlockY(), tntPosition.getBlockZ());
if (block.getType() == Material.WATER)
return true;
BlockData data = block.getBlockData();
if (!(data instanceof Waterlogged))
return false;
return ((Waterlogged) data).isWaterlogged();
}
}
@@ -1,129 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2022 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.bausystem.utils;
import de.steamwar.Reflection;
import de.steamwar.bausystem.features.util.NoClipCommand;
import net.minecraft.server.v1_15_R1.*;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_15_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.List;
public class NMSWrapper15 implements NMSWrapper {
private static final Reflection.Field<EnumGamemode> playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0);
@Override
@SuppressWarnings("deprecation")
public void setInternalGameMode(Player player, GameMode gameMode) {
playerGameMode.set(((CraftPlayer) player).getHandle().playerInteractManager, EnumGamemode.getById(gameMode.getValue()));
}
@Override
public void setSlotToItemStack(Player player, Object o) {
PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
int index = packetPlayInSetCreativeSlot.b();
if (index >= 36 && index <= 44) {
index -= 36;
} else if (index > 44) {
index -= 5;
} else if (index <= 8) {
index = index - 8 + 36;
}
player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.getItemStack()));
if (index < 9) player.getInventory().setHeldItemSlot(index);
player.updateInventory();
}
private static final Reflection.Field<Integer> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, int.class, 0);
@Override
public void setGameStateChangeReason(Object packet) {
gameStateChangeReason.set(packet, 3);
}
@Override
public void setPlayerBuildAbilities(Player player) {
((CraftPlayer) player).getHandle().abilities.mayBuild = true;
((CraftPlayer) player).getHandle().abilities.canInstantlyBuild = true;
}
@Override
public Material pathMaterial() {
return Material.GRASS_PATH;
}
private static final int threshold = 2048;
@Override
public boolean checkItemStack(ItemStack item) {
net.minecraft.server.v1_15_R1.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
NBTTagCompound tag = nmsItem.getTag();
if (tag != null && tag.hasKey("BlockEntityTag")) {
NBTTagCompound blockTag = tag.getCompound("BlockEntityTag");
if (blockTag.hasKey("Items")) {
return drillDown(blockTag.getList("Items", 10), 0, 0) > threshold;
}
}
return false;
}
private int drillDown(NBTTagList items, int layer, int start) {
if (layer > 2) return start + threshold;
int invalid = start;
for (NBTBase nbtBase : items) {
if (!(nbtBase instanceof NBTTagCompound))
continue;
NBTTagCompound slot = (NBTTagCompound) nbtBase;
if (slot.hasKey("tag")) {
invalid += slot.getByte("Count");
NBTTagCompound iTag = slot.getCompound("tag");
if (iTag.hasKey("BlockEntityTag")) {
NBTTagCompound blockTag = iTag.getCompound("BlockEntityTag");
if (blockTag.hasKey("Items")) {
invalid = drillDown(blockTag.getList("Items", 10), layer + 1, invalid);
}
}
}
if (invalid > threshold)
break;
}
return invalid;
}
private final Class<?> explosionPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundExplodePacket");
private final Reflection.Field<Double> a = Reflection.getField(explosionPacket, double.class, 0);
private final Reflection.Field<Double> b = Reflection.getField(explosionPacket, double.class, 1);
private final Reflection.Field<Double> c = Reflection.getField(explosionPacket, double.class, 2);
private final Reflection.Field<Float> d = Reflection.getField(explosionPacket, float.class, 0);
private final Reflection.Field<List> e = Reflection.getField(explosionPacket, List.class, 0);
@Override
public Object resetExplosionKnockback(Object packet) {
PacketPlayOutExplosion packetPlayOutExplosion = (PacketPlayOutExplosion) packet;
return new PacketPlayOutExplosion(a.get(packetPlayOutExplosion), b.get(packetPlayOutExplosion), c.get(packetPlayOutExplosion), d.get(packetPlayOutExplosion), e.get(packetPlayOutExplosion), Vec3D.a);
}
}
@@ -1,43 +0,0 @@
/*
* 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.bausystem.utils;
import org.bukkit.Material;
public class PlaceItemWrapper15 implements PlaceItemWrapper {
public PlaceItemWrapper15() {
for (Material material : Material.values()) {
if (!material.isBlock()) continue;
if (material.isLegacy()) continue;
String nonWall = material.name().replace("_WALL_", "").replace("WALL_", "").replace("_WALL", "");
try {
Material nonWallMaterial = Material.valueOf(nonWall);
if (nonWallMaterial != material && nonWallMaterial.isItem() && !nonWallMaterial.isBlock()) {
BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL.put(nonWallMaterial, material);
}
} catch (Exception e) {
// Ignore
}
}
ITEM_MATERIAL_TO_BLOCK_MATERIAL.put(Material.REDSTONE, Material.REDSTONE_WIRE);
}
}
@@ -1,51 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2022 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.bausystem.utils;
import de.steamwar.Reflection;
import net.minecraft.server.v1_15_R1.EntityPlayer;
import net.minecraft.server.v1_15_R1.PacketPlayInFlying;
import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
public class PlayerMovementWrapper15 implements PlayerMovementWrapper {
@Override
public void setPosition(Player player, Object object) {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
if (Float.isNaN(packetPlayInFlying.a(Float.NaN))) {
entityPlayer.e(packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0));
} else {
entityPlayer.setLocation(packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0), packetPlayInFlying.a(0F), packetPlayInFlying.b(0F));
}
}
@Override
public Object convertToOut(Player player, Object object) {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
Object packet = Reflection.newInstance(teleportPacket);
teleportEntity.set(packet, player.getEntityId());
teleportPosition.set(packet, packetPlayInFlying.a(0.0), packetPlayInFlying.b(0.0), packetPlayInFlying.c(0.0),
Float.isNaN(packetPlayInFlying.a(Float.NaN)) ? player.getLocation().getYaw() : packetPlayInFlying.a(0.0F),
Float.isNaN(packetPlayInFlying.b(Float.NaN)) ? player.getLocation().getPitch() : packetPlayInFlying.b(0.0F));
return packet;
}
}
@@ -1,135 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2022 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.bausystem.utils;
import de.steamwar.Reflection;
import de.steamwar.bausystem.features.util.NoClipCommand;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.protocol.game.*;
import net.minecraft.server.level.PlayerInteractManager;
import net.minecraft.world.level.EnumGamemode;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.List;
public class NMSWrapper18 implements NMSWrapper {
private static final Reflection.Field<EnumGamemode> playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0);
@Override
@SuppressWarnings("deprecation")
public void setInternalGameMode(Player player, GameMode gameMode) {
playerGameMode.set(((CraftPlayer) player).getHandle().d, EnumGamemode.a(gameMode.getValue()));
}
@Override
public void setSlotToItemStack(Player player, Object o) {
PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
int index = packetPlayInSetCreativeSlot.b();
if (index >= 36 && index <= 44) {
index -= 36;
} else if (index > 44) {
index -= 5;
} else if (index <= 8) {
index = index - 8 + 36;
}
player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.c()));
if (index < 9) player.getInventory().setHeldItemSlot(index);
player.updateInventory();
}
private static final Reflection.Field<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
@Override
public void setGameStateChangeReason(Object packet) {
gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d);
}
@Override
public void setPlayerBuildAbilities(Player player) {
((CraftPlayer) player).getHandle().fs().d = true;
((CraftPlayer) player).getHandle().fs().e = true;
}
@Override
public Material pathMaterial() {
return Material.DIRT_PATH;
}
private static final int threshold = 2048;
@Override
public boolean checkItemStack(ItemStack item) {
net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
NBTTagCompound tag = nmsItem.t();
if (tag != null && tag.e("BlockEntityTag")) {
NBTTagCompound blockTag = tag.p("BlockEntityTag");
if (blockTag.e("Items")) {
return drillDown(blockTag.c("Items", 10), 0, 0) > threshold;
}
}
return false;
}
private int drillDown(NBTTagList items, int layer, int start) {
if (layer > 2) return start + threshold;
int invalid = start;
for (NBTBase nbtBase : items) {
if (!(nbtBase instanceof NBTTagCompound))
continue;
NBTTagCompound slot = (NBTTagCompound) nbtBase;
if (slot.e("tag")) {
invalid += slot.f("Count");
NBTTagCompound iTag = slot.p("tag");
if (iTag.e("BlockEntityTag")) {
NBTTagCompound blockTag = iTag.p("BlockEntityTag");
if (blockTag.e("Items")) {
invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid);
}
}
}
if (invalid > threshold)
break;
}
return invalid;
}
private final Class<?> explosionPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundExplodePacket");
private final Reflection.Field<Double> a = Reflection.getField(explosionPacket, double.class, 0);
private final Reflection.Field<Double> b = Reflection.getField(explosionPacket, double.class, 1);
private final Reflection.Field<Double> c = Reflection.getField(explosionPacket, double.class, 2);
private final Reflection.Field<Float> d = Reflection.getField(explosionPacket, float.class, 0);
private final Reflection.Field<List> e = Reflection.getField(explosionPacket, List.class, 0);
@Override
public Object resetExplosionKnockback(Object packet) {
PacketPlayOutExplosion packetPlayOutExplosion = (PacketPlayOutExplosion) packet;
return new PacketPlayOutExplosion(a.get(packetPlayOutExplosion), b.get(packetPlayOutExplosion), c.get(packetPlayOutExplosion), d.get(packetPlayOutExplosion), e.get(packetPlayOutExplosion), null);
}
}
@@ -1,51 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2022 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.bausystem.utils;
import de.steamwar.Reflection;
import net.minecraft.network.protocol.game.PacketPlayInFlying;
import net.minecraft.server.level.EntityPlayer;
import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer;
import org.bukkit.entity.Player;
public class PlayerMovementWrapper18 implements PlayerMovementWrapper {
@Override
public void setPosition(Player player, Object object) {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
if (packetPlayInFlying.h) {
entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
} else {
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
}
}
@Override
public Object convertToOut(Player player, Object object) {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
Object packet = Reflection.newInstance(teleportPacket);
teleportEntity.set(packet, player.getEntityId());
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c,
packetPlayInFlying.h ? player.getLocation().getYaw() : packetPlayInFlying.d,
packetPlayInFlying.h ? player.getLocation().getPitch() : packetPlayInFlying.e);
return packet;
}
}
@@ -1,134 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2022 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.bausystem.utils;
import de.steamwar.Reflection;
import de.steamwar.bausystem.features.util.NoClipCommand;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.protocol.game.*;
import net.minecraft.server.level.PlayerInteractManager;
import net.minecraft.world.level.EnumGamemode;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.List;
public class NMSWrapper19 implements NMSWrapper {
private static final Reflection.Field<EnumGamemode> playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0);
@Override
@SuppressWarnings("deprecation")
public void setInternalGameMode(Player player, GameMode gameMode) {
playerGameMode.set(((CraftPlayer) player).getHandle().d, EnumGamemode.a(gameMode.getValue()));
}
@Override
public void setSlotToItemStack(Player player, Object o) {
PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
int index = packetPlayInSetCreativeSlot.b();
if (index >= 36 && index <= 44) {
index -= 36;
} else if (index > 44) {
index -= 5;
} else if (index <= 8) {
index = index - 8 + 36;
}
player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.c()));
if (index < 9) player.getInventory().setHeldItemSlot(index);
player.updateInventory();
}
private static final Reflection.Field<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
@Override
public void setGameStateChangeReason(Object packet) {
gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d);
}
@Override
public void setPlayerBuildAbilities(Player player) {
((CraftPlayer) player).getHandle().fF().d = true;
((CraftPlayer) player).getHandle().fF().e = true;
}
@Override
public Material pathMaterial() {
return Material.DIRT_PATH;
}
private static final int threshold = 2048;
@Override
public boolean checkItemStack(ItemStack item) {
net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
NBTTagCompound tag = nmsItem.v();
if (tag != null && tag.e("BlockEntityTag")) {
NBTTagCompound blockTag = tag.p("BlockEntityTag");
if (blockTag.e("Items")) {
return drillDown(blockTag.c("Items", 10), 0, 0) > threshold;
}
}
return false;
}
private int drillDown(NBTTagList items, int layer, int start) {
if (layer > 2) return start + threshold;
int invalid = start;
for (NBTBase nbtBase : items) {
if (!(nbtBase instanceof NBTTagCompound))
continue;
NBTTagCompound slot = (NBTTagCompound) nbtBase;
if (slot.e("tag")) {
invalid += slot.f("Count");
NBTTagCompound iTag = slot.p("tag");
if (iTag.e("BlockEntityTag")) {
NBTTagCompound blockTag = iTag.p("BlockEntityTag");
if (blockTag.e("Items")) {
invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid);
}
}
}
if (invalid > threshold)
break;
}
return invalid;
}
private final Class<?> explosionPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundExplodePacket");
private final Reflection.Field<Double> a = Reflection.getField(explosionPacket, double.class, 0);
private final Reflection.Field<Double> b = Reflection.getField(explosionPacket, double.class, 1);
private final Reflection.Field<Double> c = Reflection.getField(explosionPacket, double.class, 2);
private final Reflection.Field<Float> d = Reflection.getField(explosionPacket, float.class, 0);
private final Reflection.Field<List> e = Reflection.getField(explosionPacket, List.class, 0);
@Override
public Object resetExplosionKnockback(Object packet) {
PacketPlayOutExplosion packetPlayOutExplosion = (PacketPlayOutExplosion) packet;
return new PacketPlayOutExplosion(a.get(packetPlayOutExplosion), b.get(packetPlayOutExplosion), c.get(packetPlayOutExplosion), d.get(packetPlayOutExplosion), e.get(packetPlayOutExplosion), null);
}
}
@@ -1,51 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2022 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.bausystem.utils;
import de.steamwar.Reflection;
import net.minecraft.network.protocol.game.PacketPlayInFlying;
import net.minecraft.server.level.EntityPlayer;
import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer;
import org.bukkit.entity.Player;
public class PlayerMovementWrapper19 implements PlayerMovementWrapper {
@Override
public void setPosition(Player player, Object object) {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
if (packetPlayInFlying.h) {
entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
} else {
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
}
}
@Override
public Object convertToOut(Player player, Object object) {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
Object packet = Reflection.newInstance(teleportPacket);
teleportEntity.set(packet, player.getEntityId());
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c,
packetPlayInFlying.h ? player.getLocation().getYaw() : packetPlayInFlying.d,
packetPlayInFlying.h ? player.getLocation().getPitch() : packetPlayInFlying.e);
return packet;
}
}
@@ -1,51 +0,0 @@
/*
* 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.bausystem.utils;
import com.destroystokyo.paper.event.server.ServerTickEndEvent;
import com.destroystokyo.paper.event.server.ServerTickStartEvent;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.features.tpslimit.TPSFreezeUtils;
import org.bukkit.Bukkit;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class TickListener19 implements TickListener, Listener {
private boolean tickStartRan = false;
public TickListener19() {
Bukkit.getPluginManager().registerEvents(this, BauSystem.getInstance());
}
@EventHandler
public void onServerTickStart(ServerTickStartEvent event) {
if (TPSFreezeUtils.isFrozen()) return;
Bukkit.getPluginManager().callEvent(new TickStartEvent());
tickStartRan = true;
}
@EventHandler
public void onServerTickEnd(ServerTickEndEvent event) {
if (!tickStartRan) return;
Bukkit.getPluginManager().callEvent(new TickEndEvent());
tickStartRan = false;
}
}
@@ -1,136 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2022 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.bausystem.utils;
import de.steamwar.Reflection;
import de.steamwar.bausystem.features.util.NoClipCommand;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.protocol.game.PacketPlayInSetCreativeSlot;
import net.minecraft.network.protocol.game.PacketPlayOutExplosion;
import net.minecraft.network.protocol.game.PacketPlayOutGameStateChange;
import net.minecraft.server.level.PlayerInteractManager;
import net.minecraft.world.level.EnumGamemode;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.List;
public class NMSWrapper20 implements NMSWrapper {
private static final Reflection.Field<EnumGamemode> playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0);
@Override
@SuppressWarnings("deprecation")
public void setInternalGameMode(Player player, GameMode gameMode) {
playerGameMode.set(((CraftPlayer) player).getHandle().e, EnumGamemode.a(gameMode.getValue()));
}
@Override
public void setSlotToItemStack(Player player, Object o) {
PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
int index = packetPlayInSetCreativeSlot.a();
if (index >= 36 && index <= 44) {
index -= 36;
} else if (index > 44) {
index -= 5;
} else if (index <= 8) {
index = index - 8 + 36;
}
player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.c()));
if (index < 9) player.getInventory().setHeldItemSlot(index);
player.updateInventory();
}
private static final Reflection.Field<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
@Override
public void setGameStateChangeReason(Object packet) {
gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d);
}
@Override
public void setPlayerBuildAbilities(Player player) {
((CraftPlayer) player).getHandle().fO().d = true;
((CraftPlayer) player).getHandle().fO().e = true;
}
@Override
public Material pathMaterial() {
return Material.DIRT_PATH;
}
private static final int threshold = 2048;
@Override
public boolean checkItemStack(ItemStack item) {
net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
NBTTagCompound tag = nmsItem.v();
if (tag != null && tag.e("BlockEntityTag")) {
NBTTagCompound blockTag = tag.p("BlockEntityTag");
if (blockTag.e("Items")) {
return drillDown(blockTag.c("Items", 10), 0, 0) > threshold;
}
}
return false;
}
private int drillDown(NBTTagList items, int layer, int start) {
if (layer > 2) return start + threshold;
int invalid = start;
for (NBTBase nbtBase : items) {
if (!(nbtBase instanceof NBTTagCompound))
continue;
NBTTagCompound slot = (NBTTagCompound) nbtBase;
if (slot.e("tag")) {
invalid += slot.f("Count");
NBTTagCompound iTag = slot.p("tag");
if (iTag.e("BlockEntityTag")) {
NBTTagCompound blockTag = iTag.p("BlockEntityTag");
if (blockTag.e("Items")) {
invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid);
}
}
}
if (invalid > threshold)
break;
}
return invalid;
}
private final Class<?> explosionPacket = Reflection.getClass("net.minecraft.network.protocol.game.ClientboundExplodePacket");
private final Reflection.Field<Double> a = Reflection.getField(explosionPacket, double.class, 0);
private final Reflection.Field<Double> b = Reflection.getField(explosionPacket, double.class, 1);
private final Reflection.Field<Double> c = Reflection.getField(explosionPacket, double.class, 2);
private final Reflection.Field<Float> d = Reflection.getField(explosionPacket, float.class, 0);
private final Reflection.Field<List> e = Reflection.getField(explosionPacket, List.class, 0);
@Override
public Object resetExplosionKnockback(Object packet) {
PacketPlayOutExplosion packetPlayOutExplosion = (PacketPlayOutExplosion) packet;
return new PacketPlayOutExplosion(a.get(packetPlayOutExplosion), b.get(packetPlayOutExplosion), c.get(packetPlayOutExplosion), d.get(packetPlayOutExplosion), e.get(packetPlayOutExplosion), null);
}
}
@@ -1,43 +0,0 @@
/*
* 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.bausystem.utils;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
public class PlaceItemWrapper20 implements PlaceItemWrapper {
public PlaceItemWrapper20() {
for (Material material : Material.values()) {
if (!material.isBlock()) continue;
if (material.isLegacy()) continue;
BlockData blockData = material.createBlockData();
Material placementMaterial = blockData.getPlacementMaterial();
if (material == placementMaterial) continue;
if (placementMaterial == Material.AIR) continue;
if (placementMaterial.isItem() && !placementMaterial.isBlock()) {
ITEM_MATERIAL_TO_BLOCK_MATERIAL.put(placementMaterial, material);
}
if (material.name().contains("WALL")) {
BLOCK_MATERIAL_TO_WALL_BLOCK_MATERIAL.put(placementMaterial, material);
}
}
}
}
@@ -1,51 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2022 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.bausystem.utils;
import de.steamwar.Reflection;
import net.minecraft.network.protocol.game.PacketPlayInFlying;
import net.minecraft.server.level.EntityPlayer;
import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer;
import org.bukkit.entity.Player;
public class PlayerMovementWrapper20 implements PlayerMovementWrapper {
@Override
public void setPosition(Player player, Object object) {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();
if (packetPlayInFlying.h) {
entityPlayer.b(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c, packetPlayInFlying.d, packetPlayInFlying.e);
} else {
entityPlayer.e(packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c);
}
}
@Override
public Object convertToOut(Player player, Object object) {
PacketPlayInFlying packetPlayInFlying = ((PacketPlayInFlying) object);
Object packet = Reflection.newInstance(teleportPacket);
teleportEntity.set(packet, player.getEntityId());
teleportPosition.set(packet, packetPlayInFlying.a, packetPlayInFlying.b, packetPlayInFlying.c,
packetPlayInFlying.h ? player.getLocation().getYaw() : packetPlayInFlying.d,
packetPlayInFlying.h ? player.getLocation().getPitch() : packetPlayInFlying.e);
return packet;
}
}
-17
View File
@@ -1,17 +0,0 @@
plugins {
steamwar.java
}
java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}
dependencies {
compileOnly(project(":BauSystem:BauSystem_Main", "default"))
compileOnly(project(":SpigotCore", "default"))
compileOnly(libs.paperapi21)
compileOnly(libs.nms21)
}
@@ -1,141 +0,0 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2024 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.bausystem.utils;
import de.steamwar.Reflection;
import de.steamwar.bausystem.features.util.NoClipCommand;
import net.minecraft.core.component.DataComponents;
import net.minecraft.nbt.NBTBase;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.network.protocol.game.PacketPlayInSetCreativeSlot;
import net.minecraft.network.protocol.game.PacketPlayOutExplosion;
import net.minecraft.network.protocol.game.PacketPlayOutGameStateChange;
import net.minecraft.server.level.EntityPlayer;
import net.minecraft.server.level.PlayerInteractManager;
import net.minecraft.world.entity.player.EntityHuman;
import net.minecraft.world.entity.player.PlayerAbilities;
import net.minecraft.world.item.component.CustomData;
import net.minecraft.world.level.EnumGamemode;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import java.util.Optional;
public class NMSWrapper21 implements NMSWrapper {
private static final Reflection.Field<PlayerInteractManager> playerInteractManager = Reflection.getField(EntityPlayer.class, null, PlayerInteractManager.class);
@Override
public void setInternalGameMode(Player player, GameMode gameMode) {
playerInteractManager.get(((CraftPlayer) player).getHandle()).a(EnumGamemode.a(gameMode.getValue()));
}
@Override
public void setSlotToItemStack(Player player, Object o) {
PacketPlayInSetCreativeSlot packetPlayInSetCreativeSlot = (PacketPlayInSetCreativeSlot) o;
int index = packetPlayInSetCreativeSlot.b();
if (index >= 36 && index <= 44) {
index -= 36;
} else if (index > 44) {
index -= 5;
} else if (index <= 8) {
index = index - 8 + 36;
}
player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(packetPlayInSetCreativeSlot.e()));
if (index < 9) player.getInventory().setHeldItemSlot(index);
player.updateInventory();
}
private static final Reflection.Field<PacketPlayOutGameStateChange.a> gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 12);
@Override
public void setGameStateChangeReason(Object packet) {
gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d);
}
private static final Reflection.Field<PlayerAbilities> playerAbilities = Reflection.getField(EntityHuman.class, null, PlayerAbilities.class);
@Override
public void setPlayerBuildAbilities(Player player) {
PlayerAbilities abilities = playerAbilities.get(((CraftPlayer) player).getHandle());
abilities.d = true;
abilities.e = true;
}
@Override
public Material pathMaterial() {
return Material.DIRT_PATH;
}
private static final int threshold = 2048;
@Override
public boolean checkItemStack(ItemStack item) {
net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item);
NBTTagCompound tag = nmsItem.a(DataComponents.b, CustomData.a).c();
if (tag.e("BlockEntityTag")) {
NBTTagCompound blockTag = tag.p("BlockEntityTag");
if (blockTag.e("Items")) {
return drillDown(blockTag.c("Items", 10), 0, 0) > threshold;
}
}
return false;
}
private int drillDown(NBTTagList items, int layer, int start) {
if (layer > 2) return start + threshold;
int invalid = start;
for (NBTBase nbtBase : items) {
if (!(nbtBase instanceof NBTTagCompound slot))
continue;
if (slot.e("tag")) {
invalid += slot.f("Count");
NBTTagCompound iTag = slot.p("tag");
if (iTag.e("BlockEntityTag")) {
NBTTagCompound blockTag = iTag.p("BlockEntityTag");
if (blockTag.e("Items")) {
invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid);
}
}
}
if (invalid > threshold)
break;
}
return invalid;
}
@Override
public Object resetExplosionKnockback(Object packet) {
PacketPlayOutExplosion explosion = (PacketPlayOutExplosion) packet;
return new PacketPlayOutExplosion(
explosion.b(),
Optional.empty(),
explosion.f(),
explosion.g()
);
}
}
+13 -5
View File
@@ -1,7 +1,7 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2024 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Affero General Public License as published by
@@ -19,6 +19,7 @@
plugins { plugins {
steamwar.java steamwar.java
widener
} }
tasks.compileJava { tasks.compileJava {
@@ -26,8 +27,8 @@ tasks.compileJava {
} }
java { java {
sourceCompatibility = JavaVersion.VERSION_17 sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_21
} }
dependencies { dependencies {
@@ -35,12 +36,19 @@ dependencies {
annotationProcessor(libs.classindex) annotationProcessor(libs.classindex)
compileOnly(project(":SpigotCore", "default")) compileOnly(project(":SpigotCore", "default"))
compileOnly(libs.spigotapi)
compileOnly(libs.axiom) compileOnly(libs.axiom)
compileOnly(libs.authlib) compileOnly(libs.authlib)
compileOnly(libs.fawe18) compileOnly(libs.paperapi)
compileOnly(libs.nms)
compileOnly(libs.fawe)
compileOnly(libs.netty)
implementation(libs.luaj) implementation(libs.luaj)
implementation(files("$projectDir/../libs/YAPION-SNAPSHOT.jar")) implementation(files("$projectDir/../libs/YAPION-SNAPSHOT.jar"))
} }
widener {
fromCatalog(libs.nms)
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,13 @@
accessWidener v2 named
# For NoClipCommand
accessible field net/minecraft/server/level/ServerPlayerGameMode gameModeForPlayer Lnet/minecraft/world/level/GameType;
# For PlaceItemUtils
accessible field org/bukkit/craftbukkit/block/CraftBlockState position Lnet/minecraft/core/BlockPos;
mutable field org/bukkit/craftbukkit/block/CraftBlockState position Lnet/minecraft/core/BlockPos;
accessible field org/bukkit/craftbukkit/block/CraftBlockState world Lorg/bukkit/craftbukkit/CraftWorld;
mutable field org/bukkit/craftbukkit/block/CraftBlockState world Lorg/bukkit/craftbukkit/CraftWorld;
# For TickManager
accessible field net/minecraft/server/ServerTickRateManager remainingSprintTicks J
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem; package de.steamwar.bausystem;
@@ -28,52 +28,44 @@ import de.steamwar.bausystem.features.script.lua.libs.LuaLib;
import de.steamwar.bausystem.features.slaves.laufbau.BoundingBoxLoader; import de.steamwar.bausystem.features.slaves.laufbau.BoundingBoxLoader;
import de.steamwar.bausystem.features.slaves.panzern.Panzern; import de.steamwar.bausystem.features.slaves.panzern.Panzern;
import de.steamwar.bausystem.features.slaves.panzern.PanzernAlgorithm; import de.steamwar.bausystem.features.slaves.panzern.PanzernAlgorithm;
import de.steamwar.bausystem.features.tpslimit.TPSFreezeUtils;
import de.steamwar.bausystem.features.tracer.TraceManager; import de.steamwar.bausystem.features.tracer.TraceManager;
import de.steamwar.bausystem.features.tracer.TraceRecorder; import de.steamwar.bausystem.features.tracer.TraceRecorder;
import de.steamwar.bausystem.features.world.BauScoreboard; import de.steamwar.bausystem.features.world.BauScoreboard;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.bausystem.region.loader.PrototypeLoader; import de.steamwar.bausystem.region.RegionSystem;
import de.steamwar.bausystem.region.loader.RegionLoader;
import de.steamwar.bausystem.region.loader.Updater;
import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.bausystem.utils.ScoreboardElement;
import de.steamwar.bausystem.utils.TickListener; import de.steamwar.bausystem.utils.TickManager;
import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.bausystem.worlddata.WorldData;
import de.steamwar.command.AbstractValidator; import de.steamwar.command.AbstractValidator;
import de.steamwar.command.SWCommand;
import de.steamwar.command.SWCommandUtils; import de.steamwar.command.SWCommandUtils;
import de.steamwar.core.CRIUSleepEvent;
import de.steamwar.core.Core; import de.steamwar.core.Core;
import de.steamwar.linkage.LinkedInstance; import de.steamwar.core.WorldEditRendererCUIEditor;
import de.steamwar.linkage.MaxVersion; import de.steamwar.core.WorldIdentifier;
import de.steamwar.linkage.MinVersion; import de.steamwar.linkage.AbstractLinker;
import de.steamwar.linkage.PluginCheck; import de.steamwar.linkage.SpigotLinker;
import de.steamwar.linkage.api.Disable;
import de.steamwar.linkage.api.Enable;
import de.steamwar.message.Message; import de.steamwar.message.Message;
import de.steamwar.network.packets.PacketHandler; import de.steamwar.providers.BauServerInfo;
import lombok.Getter; import lombok.Getter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.GameRule;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import java.io.*; import java.io.IOException;
import java.lang.reflect.Field; import java.io.OutputStream;
import java.util.HashMap; import java.io.PrintStream;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.stream.Collectors;
public class BauSystem extends JavaPlugin { public class BauSystem extends JavaPlugin implements Listener {
// This should be treated as final! // This should be treated as final!
public static Message MESSAGE; public static Message MESSAGE;
@@ -82,7 +74,7 @@ public class BauSystem extends JavaPlugin {
@Getter @Getter
private static BauSystem instance; private static BauSystem instance;
private final Map<Class<?>, Object> instances = new HashMap<>(); private SpigotLinker linker;
@Override @Override
public void onEnable() { public void onEnable() {
@@ -94,132 +86,67 @@ public class BauSystem extends JavaPlugin {
instance = this; instance = this;
SWUtils.setBausystem(instance); SWUtils.setBausystem(instance);
try { RegionSystem.INSTANCE.load();
PrototypeLoader.load();
RegionLoader.load();
} catch (SecurityException e) {
Bukkit.getLogger().log(Level.SEVERE, e.getMessage(), e);
Bukkit.shutdown();
System.exit(1);
return;
}
new Updater(PrototypeLoader.file, PrototypeLoader::load);
new Updater(RegionLoader.file, RegionLoader::load);
SWCommandUtils.addValidator(Player.class, validator(Permission.BUILD)); SWCommandUtils.addValidator(Player.class, validator(Permission.BUILD));
SWCommandUtils.addValidator(CommandSender.class, validator(Permission.BUILD)); SWCommandUtils.addValidator(CommandSender.class, validator(Permission.BUILD));
SWCommandUtils.addValidator("supervisor", validator(Permission.SUPERVISOR)); SWCommandUtils.addValidator("supervisor", validator(Permission.SUPERVISOR));
SWCommandUtils.addValidator("owner", validator(Permission.OWNER)); SWCommandUtils.addValidator("owner", validator(Permission.OWNER));
instances.put(BauServer.class, BauServer.getInstance()); linker = new SpigotLinker(BauSystem.getInstance(), BauSystem.MESSAGE) {
List<Class<?>> classes = new BufferedReader(new InputStreamReader(BauSystem.class.getResourceAsStream("/META-INF/annotations/de.steamwar.linkage.Linked"))) @Override
.lines() protected void linkObject(Object any) {
.map(s -> { super.linkObject(any);
try { if (any instanceof LuaLib) {
return Class.forName(s, false, BauSystem.class.getClassLoader()); SteamWarLuaPlugin.add((LuaLib) any);
} catch (ClassNotFoundException | NoClassDefFoundError e) {
if (e.getMessage().equals(s)) {
Bukkit.shutdown();
throw new SecurityException(e.getMessage(), e);
}
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList());
classes.forEach(clazz -> {
MinVersion minVersion = clazz.getAnnotation(MinVersion.class);
MaxVersion maxVersion = clazz.getAnnotation(MaxVersion.class);
PluginCheck[] pluginChecks = clazz.getAnnotationsByType(PluginCheck.class);
if (minVersion != null && Core.getVersion() < minVersion.value()) {
return;
}
if (maxVersion != null && Core.getVersion() > maxVersion.value()) {
return;
}
for (PluginCheck pluginCheck : pluginChecks) {
if (pluginCheck.has() == PluginCheck.Has.THIS && Bukkit.getPluginManager().getPlugin(pluginCheck.value()) != null) {
continue;
} }
if (pluginCheck.has() == PluginCheck.Has.NOT && Bukkit.getPluginManager().getPlugin(pluginCheck.value()) == null) { if (any instanceof ScoreboardElement) {
continue; BauScoreboard.addElement((ScoreboardElement) any);
} }
return; if (any instanceof BauGuiItem) {
} BauGUI.addItem((BauGuiItem) any);
}
Object any; if (any instanceof PanzernAlgorithm) {
try { Panzern.add((PanzernAlgorithm) any);
any = clazz.newInstance(); }
} catch (InstantiationException | IllegalAccessException e) { if (any instanceof ConfigConverter) {
getLogger().log(Level.SEVERE, e.getMessage(), e); Config.addConfigConverter((ConfigConverter) any);
Bukkit.shutdown(); }
throw new SecurityException(e.getMessage()); if (any instanceof BoundingBoxLoader) {
} ((BoundingBoxLoader) any).load();
instances.put(clazz, any);
if (any instanceof Enable) {
((Enable) any).enable();
}
if (any instanceof SWCommand) {
((SWCommand) any).setMessage(BauSystem.MESSAGE);
}
if (any instanceof Listener) {
Bukkit.getPluginManager().registerEvents((Listener) any, BauSystem.getInstance());
}
if (any instanceof PacketHandler) {
((PacketHandler) any).register();
}
if (any instanceof LuaLib) {
SteamWarLuaPlugin.add((LuaLib) any);
}
if (any instanceof ScoreboardElement) {
BauScoreboard.addElement((ScoreboardElement) any);
}
if (any instanceof BauGuiItem) {
BauGUI.addItem((BauGuiItem) any);
}
if (any instanceof PanzernAlgorithm) {
Panzern.add((PanzernAlgorithm) any);
}
if (any instanceof ConfigConverter) {
Config.addConfigConverter((ConfigConverter) any);
}
if (any instanceof BoundingBoxLoader) {
((BoundingBoxLoader) any).load();
}
});
instances.forEach((clazz, o) -> {
for (Field field : clazz.getFields()) {
if (field.getAnnotation(LinkedInstance.class) != null) {
try {
field.set(o, instances.get(field.getType()));
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
} }
} }
}); };
try {
TickListener.impl.init(); linker.addLinkableInstance(BauServer.getInstance());
linker.link();
} catch (AbstractLinker.LinkException e) {
getLogger().log(Level.SEVERE, "Could not link a class.", e);
Bukkit.shutdown();
return;
}
TraceManager.instance.init(); TraceManager.instance.init();
TraceRecorder.instance.init(); TraceRecorder.instance.init();
new WorldEditRendererCUIEditor();
Bukkit.getWorlds().get(0).setGameRule(GameRule.SEND_COMMAND_FEEDBACK, false);
String identifier = BauServerInfo.getOwnerUser().getUUID().toString().replace("-", "");
WorldIdentifier.set("bau/" + Core.getVersion() + "/" + identifier);
}
@EventHandler
public void onCRIUSleep(CRIUSleepEvent event) {
RegionSystem.INSTANCE.save();
} }
@Override @Override
public void onDisable() { public void onDisable() {
instances.forEach((aClass, o) -> { linker.unlink();
if (o instanceof Listener) {
HandlerList.unregisterAll((Listener) o);
}
if (o instanceof Disable) {
((Disable) o).disable();
}
});
WorldData.write(); WorldData.write();
RegionSystem.INSTANCE.save();
Config.getInstance().saveAll(); Config.getInstance().saveAll();
} }
@@ -263,7 +190,7 @@ public class BauSystem extends JavaPlugin {
@Override @Override
public void run() { public void run() {
if (TPSFreezeUtils.isFrozen()) return; if (TickManager.impl.isFrozen()) return;
if (counter >= delay) { if (counter >= delay) {
runnable.run(); runnable.run();
cancel(); cancel();
@@ -281,7 +208,7 @@ public class BauSystem extends JavaPlugin {
@Override @Override
public void run() { public void run() {
if (TPSFreezeUtils.isFrozen()) return; if (TickManager.impl.isFrozen()) return;
if (counter >= (first ? delay : period)) { if (counter >= (first ? delay : period)) {
first = false; first = false;
runnable.run(); runnable.run();
@@ -1,35 +1,32 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem; package de.steamwar.bausystem;
import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.config.BauServer;
import de.steamwar.bausystem.features.world.BauMemberUpdate; import de.steamwar.bausystem.features.world.BauMemberUpdate;
import de.steamwar.bausystem.utils.BauMemberUpdateEvent; import de.steamwar.bausystem.linkage.GuiItem;
import de.steamwar.sql.BauweltMember; import de.steamwar.sql.BauweltMember;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Predicate; import java.util.function.Predicate;
@AllArgsConstructor @AllArgsConstructor
@@ -40,44 +37,21 @@ public enum Permission {
return bauweltMember.isSupervisor(); return bauweltMember.isSupervisor();
}), }),
BUILD(bauweltMember -> { BUILD(bauweltMember -> {
if (isTempOnlySpectator(bauweltMember)) return false;
return bauweltMember.isBuild() || SUPERVISOR.permissionPredicate.test(bauweltMember); return bauweltMember.isBuild() || SUPERVISOR.permissionPredicate.test(bauweltMember);
}), }),
/** /**
* Only used for {@link BauMemberUpdate} * Only used for {@link BauMemberUpdate}
*/ */
REAL_SPECTATOR(bauweltMember -> { SPECTATOR(bauweltMember -> {
return !bauweltMember.isBuild() && !bauweltMember.isSupervisor(); return !bauweltMember.isBuild() && !bauweltMember.isSupervisor();
}), }),
/** /**
* Primarily used for {@link de.steamwar.bausystem.linkage.specific.GuiItem} * Primarily used for {@link GuiItem}
*/ */
MEMBER(bauweltMember -> { MEMBER(bauweltMember -> {
return true; return true;
}); });
private static final Set<Integer> TEMP_ONLY_SPECTATOR = new HashSet<>();
private static boolean isTempOnlySpectator(BauweltMember bauweltMember) {
return TEMP_ONLY_SPECTATOR.contains(bauweltMember.getMemberID());
}
public static boolean isTempOnlySpectator(Player player) {
return TEMP_ONLY_SPECTATOR.contains(SteamwarUser.get(player.getUniqueId()).getId());
}
public static void forceOnlySpectator(Player player) {
TEMP_ONLY_SPECTATOR.add(SteamwarUser.get(player.getUniqueId()).getId());
BauMemberUpdate.baumemberUpdate();
}
/**
* Only used by {@link BauMemberUpdate}
*/
public static void removeForceOnlySpectator(Player player) {
TEMP_ONLY_SPECTATOR.remove(SteamwarUser.get(player.getUniqueId()).getId());
}
private final Predicate<BauweltMember> permissionPredicate; private final Predicate<BauweltMember> permissionPredicate;
public boolean hasPermission(BauweltMember bauweltMember) { public boolean hasPermission(BauweltMember bauweltMember) {
@@ -87,10 +61,10 @@ public enum Permission {
public boolean hasPermission(Player member) { public boolean hasPermission(Player member) {
if (SteamwarUser.get(member.getUniqueId()).getId() == BauServer.getInstance().getOwnerID()) { if (SteamwarUser.get(member.getUniqueId()).getId() == BauServer.getInstance().getOwnerID()) {
return this != REAL_SPECTATOR; return this != SPECTATOR;
} }
BauweltMember bauweltMember = BauweltMember.getBauMember(BauServer.getInstance().getOwner(), member.getUniqueId()); BauweltMember bauweltMember = BauweltMember.getBauMember(BauServer.getInstance().getOwner(), member.getUniqueId());
if (bauweltMember == null) return this == REAL_SPECTATOR; if (bauweltMember == null) return this == SPECTATOR;
return permissionPredicate.test(bauweltMember); return permissionPredicate.test(bauweltMember);
} }
} }
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem; package de.steamwar.bausystem;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.config; package de.steamwar.bausystem.config;
@@ -36,7 +36,7 @@ public class BauServer {
private Integer owner; private Integer owner;
public UUID getOwner() { public UUID getOwner() {
return SteamwarUser.get(getOwnerID()).getUUID(); return SteamwarUser.byId(getOwnerID()).getUUID();
} }
public int getOwnerID() { public int getOwnerID() {
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.configplayer; package de.steamwar.bausystem.configplayer;
@@ -1,3 +1,22 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2025 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.bausystem.configplayer; package de.steamwar.bausystem.configplayer;
import yapion.hierarchy.types.YAPIONObject; import yapion.hierarchy.types.YAPIONObject;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.configplayer; package de.steamwar.bausystem.configplayer;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.configplayer.serializer; package de.steamwar.bausystem.configplayer.serializer;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2022 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.attributescopy; package de.steamwar.bausystem.features.attributescopy;
@@ -24,7 +24,6 @@ import de.steamwar.command.PreviousArguments;
import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper; import de.steamwar.command.TypeMapper;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import de.steamwar.linkage.MinVersion;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.attributescopy; package de.steamwar.bausystem.features.attributescopy;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2022 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.attributescopy; package de.steamwar.bausystem.features.attributescopy;
@@ -76,13 +76,21 @@ public class AttributesCopyCommand extends SWCommand {
if (itemStack.getType() == Material.ZOMBIE_HEAD && block.getType() == Material.ZOMBIE_WALL_HEAD) return true; if (itemStack.getType() == Material.ZOMBIE_HEAD && block.getType() == Material.ZOMBIE_WALL_HEAD) return true;
if (itemStack.getType() == Material.CREEPER_HEAD && block.getType() == Material.CREEPER_WALL_HEAD) return true; if (itemStack.getType() == Material.CREEPER_HEAD && block.getType() == Material.CREEPER_WALL_HEAD) return true;
if (itemStack.getType() == Material.DRAGON_HEAD && block.getType() == Material.DRAGON_WALL_HEAD) return true; if (itemStack.getType() == Material.DRAGON_HEAD && block.getType() == Material.DRAGON_WALL_HEAD) return true;
if (itemStack.getType() == Material.SKELETON_SKULL && block.getType() == Material.SKELETON_WALL_SKULL) return true; if (itemStack.getType() == Material.SKELETON_SKULL && block.getType() == Material.SKELETON_WALL_SKULL) {
if (itemStack.getType() == Material.WITHER_SKELETON_SKULL && block.getType() == Material.WITHER_SKELETON_WALL_SKULL) return true; return true;
}
if (itemStack.getType() == Material.WITHER_SKELETON_SKULL && block.getType() == Material.WITHER_SKELETON_WALL_SKULL) {
return true;
}
if (itemStack.getType() == Material.TORCH && block.getType() == Material.WALL_TORCH) return true; if (itemStack.getType() == Material.TORCH && block.getType() == Material.WALL_TORCH) return true;
if (itemStack.getType() == Material.SOUL_TORCH && block.getType() == Material.SOUL_WALL_TORCH) return true; if (itemStack.getType() == Material.SOUL_TORCH && block.getType() == Material.SOUL_WALL_TORCH) return true;
if (itemStack.getType() == Material.REDSTONE_TORCH && block.getType() == Material.REDSTONE_WALL_TORCH) return true; if (itemStack.getType() == Material.REDSTONE_TORCH && block.getType() == Material.REDSTONE_WALL_TORCH) {
return true;
}
if (itemStack.getType() == Material.WHEAT_SEEDS && block.getType() == Material.WHEAT) return true; if (itemStack.getType() == Material.WHEAT_SEEDS && block.getType() == Material.WHEAT) return true;
if (itemStack.getType().name().contains("_BANNER") && block.getType().name().contains("_WALL_BANNER")) return true; if (itemStack.getType().name().contains("_BANNER") && block.getType().name().contains("_WALL_BANNER")) {
return true;
}
return false; return false;
} }
} }
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2022 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.attributescopy; package de.steamwar.bausystem.features.attributescopy;
@@ -41,7 +41,7 @@ public class AttributesPlaceListener implements Listener {
@EventHandler @EventHandler
public void onBlockPlace(BlockPlaceEvent event) { public void onBlockPlace(BlockPlaceEvent event) {
if(!Permission.BUILD.hasPermission(event.getPlayer())) return; if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
ItemStack itemStack = event.getItemInHand(); ItemStack itemStack = event.getItemInHand();
ItemMeta itemMeta = itemStack.getItemMeta(); ItemMeta itemMeta = itemStack.getItemMeta();
if (itemMeta == null) return; if (itemMeta == null) return;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.autostart; package de.steamwar.bausystem.features.autostart;
@@ -1,26 +1,26 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.autostart; package de.steamwar.bausystem.features.autostart;
import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.autostart; package de.steamwar.bausystem.features.autostart;
@@ -24,8 +24,6 @@ import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.features.tpslimit.TPSUtils; import de.steamwar.bausystem.features.tpslimit.TPSUtils;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.RegionUtils;
import de.steamwar.bausystem.region.utils.RegionExtensionType;
import de.steamwar.bausystem.region.utils.RegionType;
import de.steamwar.bausystem.utils.ItemUtils; import de.steamwar.bausystem.utils.ItemUtils;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
@@ -33,9 +31,8 @@ import lombok.Getter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.data.type.Chest; import org.bukkit.block.data.type.Chest;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.EntityExplodeEvent;
@@ -43,9 +40,9 @@ import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import java.io.File; import java.util.Arrays;
import java.text.SimpleDateFormat; import java.util.HashMap;
import java.util.*; import java.util.Map;
@Linked @Linked
public class AutostartListener implements Listener { public class AutostartListener implements Listener {
@@ -68,7 +65,7 @@ public class AutostartListener implements Listener {
@EventHandler @EventHandler
public void onPlayerInteract(PlayerInteractEvent event) { public void onPlayerInteract(PlayerInteractEvent event) {
if(!Permission.BUILD.hasPermission(event.getPlayer())) return; if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
if (!ItemUtils.isItem(event.getItem(), "autostart")) { if (!ItemUtils.isItem(event.getItem(), "autostart")) {
return; return;
} }
@@ -92,7 +89,7 @@ public class AutostartListener implements Listener {
if (!(event.getPlayer() instanceof Player)) { if (!(event.getPlayer() instanceof Player)) {
return; return;
} }
if(!Permission.BUILD.hasPermission((Player) event.getPlayer())) return; if (!Permission.BUILD.hasPermission((Player) event.getPlayer())) return;
if (!ItemUtils.isItem(event.getPlayer().getInventory().getItemInMainHand(), "autostart")) { if (!ItemUtils.isItem(event.getPlayer().getInventory().getItemInMainHand(), "autostart")) {
return; return;
} }
@@ -106,11 +103,11 @@ public class AutostartListener implements Listener {
public void activate(Player player) { public void activate(Player player) {
Region region = Region.getRegion(player.getLocation()); Region region = Region.getRegion(player.getLocation());
if (region.isGlobal()) { if (region.getType().isGlobal()) {
BauSystem.MESSAGE.send("AUTOSTART_MESSAGE_NO_REGION", player); BauSystem.MESSAGE.send("AUTOSTART_MESSAGE_NO_REGION", player);
return; return;
} }
if (!region.hasType(RegionType.TESTBLOCK)) { if (region.getTestblockArea().isEmpty()) {
BauSystem.MESSAGE.send("AUTOSTART_MESSAGE_NO_REGION", player); BauSystem.MESSAGE.send("AUTOSTART_MESSAGE_NO_REGION", player);
return; return;
} }
@@ -124,6 +121,7 @@ public class AutostartListener implements Listener {
@EventHandler @EventHandler
public void onEntityExplode(EntityExplodeEvent event) { public void onEntityExplode(EntityExplodeEvent event) {
if (!(event.getEntity() instanceof TNTPrimed)) return;
if (regionStartTime.isEmpty()) { if (regionStartTime.isEmpty()) {
return; return;
} }
@@ -131,20 +129,12 @@ public class AutostartListener implements Listener {
event.blockList().forEach(block -> { event.blockList().forEach(block -> {
Region region = Region.getRegion(block.getLocation()); Region region = Region.getRegion(block.getLocation());
if (!regionStartTime.containsKey(region)) return; if (!regionStartTime.containsKey(region)) return;
if (!region.hasType(RegionType.TESTBLOCK)) return; if (!region.getTestblockArea().inRegion(block.getLocation(), true)) return;
if (!region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) return;
long tickDiff = TPSUtils.currentRealTick.get() - regionStartTime.remove(region); long tickDiff = TPSUtils.currentRealTick.get() - regionStartTime.remove(region);
long preFightDurationInSeconds = getPreFightDurationInSeconds(region); long preFightDurationInSeconds = region.getGameModeConfig().Times.PreFightDuration;
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT1", tickDiff); RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT1", tickDiff);
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT2", preFightDurationInSeconds, ((preFightDurationInSeconds * 20) - tickDiff)); RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT2", preFightDurationInSeconds, ((preFightDurationInSeconds * 20) - tickDiff));
RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT3"); RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT3");
}); });
} }
private int getPreFightDurationInSeconds(Region region) {
File file = region.gameModeConfig();
if (file == null) return 30;
FileConfiguration config = YamlConfiguration.loadConfiguration(file);
return config.getInt("Times.PreFightDuration", 30);
}
} }
@@ -1,49 +1,41 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.backup; package de.steamwar.bausystem.features.backup;
import com.sk89q.worldedit.EditSession;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.region.Color;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.RegionBackups;
import de.steamwar.bausystem.region.flags.ChangedMode;
import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.region.flags.Flag;
import de.steamwar.bausystem.region.flags.flagvalues.ColorMode; import de.steamwar.command.PreviousArguments;
import de.steamwar.bausystem.region.tags.Tag;
import de.steamwar.bausystem.utils.PasteBuilder;
import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommand;
import de.steamwar.command.SWCommandUtils;
import de.steamwar.command.TypeMapper; import de.steamwar.command.TypeMapper;
import de.steamwar.command.TypeValidator;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import de.steamwar.inventory.SWListInv; import de.steamwar.inventory.SWListInv;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import net.md_5.bungee.api.chat.ClickEvent; import net.md_5.bungee.api.chat.ClickEvent;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.io.File; import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Linked @Linked
@@ -54,7 +46,7 @@ public class BackupCommand extends SWCommand {
} }
static boolean checkGlobalRegion(Region region, Player p) { static boolean checkGlobalRegion(Region region, Player p) {
if (region.isGlobal()) { if (region.getType().isGlobal()) {
BauSystem.MESSAGE.send("BACKUP_REGION_NO_REGION", p); BauSystem.MESSAGE.send("BACKUP_REGION_NO_REGION", p);
return true; return true;
} }
@@ -67,11 +59,12 @@ public class BackupCommand extends SWCommand {
if (checkGlobalRegion(region, p)) { if (checkGlobalRegion(region, p)) {
return; return;
} }
if (!region.get(Tag.CHANGED)) { if (region.getRegionData().get(Flag.CHANGED).isWithDefault(ChangedMode.NO_CHANGE)) {
BauSystem.MESSAGE.send("BACKUP_CREATE_NO_CHANGE", p); BauSystem.MESSAGE.send("BACKUP_CREATE_NO_CHANGE", p);
return; return;
} }
if (region.backup()) { Optional<RegionBackups.Backup> backup = region.getBackups().create(RegionBackups.BackupType.MANUAL);
if (backup.isPresent()) {
BauSystem.MESSAGE.send("BACKUP_CREATE_SUCCESS", p); BauSystem.MESSAGE.send("BACKUP_CREATE_SUCCESS", p);
} else { } else {
BauSystem.MESSAGE.send("BACKUP_CREATE_FAILURE", p); BauSystem.MESSAGE.send("BACKUP_CREATE_FAILURE", p);
@@ -79,25 +72,12 @@ public class BackupCommand extends SWCommand {
} }
@Register(value = "load", description = "BACKUP_HELP_LOAD") @Register(value = "load", description = "BACKUP_HELP_LOAD")
public void backupLoad(@Validator("owner") Player p, @Mapper("backupName") String backupName) { public void backupLoad(@Validator("owner") Player p, @Mapper("backup") @ErrorMessage("BACKUP_LOAD_FAILURE") RegionBackups.Backup backup) {
Region region = Region.getRegion(p.getLocation()); if (backup.load()) {
if (checkGlobalRegion(region, p)) { BauSystem.MESSAGE.send("BACKUP_LOAD", p);
return; } else {
}
File backupFile = region.getBackupFile(backupName.replace('_', ' '));
if (backupFile == null) {
BauSystem.MESSAGE.send("BACKUP_LOAD_FAILURE", p); BauSystem.MESSAGE.send("BACKUP_LOAD_FAILURE", p);
return;
} }
EditSession editSession = new PasteBuilder(new PasteBuilder.FileProvider(backupFile))
.pastePoint(region.getMinPoint().add(region.getPrototype().getSizeX() / 2, 0, region.getPrototype().getSizeZ() / 2))
.minPoint(region.getMinPoint())
.maxPoint(region.getMaxPoint())
.waterLevel(region.getWaterLevel())
.run();
region.remember(editSession);
BauSystem.MESSAGE.send("BACKUP_LOAD", p);
} }
@Register(value = "list", description = "BACKUP_HELP_LIST") @Register(value = "list", description = "BACKUP_HELP_LIST")
@@ -106,10 +86,10 @@ public class BackupCommand extends SWCommand {
if (checkGlobalRegion(region, p)) { if (checkGlobalRegion(region, p)) {
return; return;
} }
List<String> backups = listBackup(p); List<RegionBackups.Backup> backups = listBackup(p);
BauSystem.MESSAGE.send("BACKUP_LIST_HEAD", p, backups.size()); BauSystem.MESSAGE.send("BACKUP_LIST_HEAD", p, backups.size());
backups.forEach(s -> { backups.forEach(backup -> {
BauSystem.MESSAGE.send("BACKUP_LIST_ENTRY", p, "/backup load " + s, new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/backup load " + s), s); BauSystem.MESSAGE.send("BACKUP_LIST_ENTRY", p, "/backup load " + backup.getName(), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/backup load " + backup.getName()), backup.getName());
}); });
} }
@@ -119,34 +99,45 @@ public class BackupCommand extends SWCommand {
if (checkGlobalRegion(region, p)) { if (checkGlobalRegion(region, p)) {
return; return;
} }
List<String> backups = listBackup(p); List<RegionBackups.Backup> backups = listBackup(p);
List<SWListInv.SWListEntry<String>> swListEntries = new ArrayList<>(); List<SWListInv.SWListEntry<RegionBackups.Backup>> swListEntries = new ArrayList<>();
List<String> lore = Arrays.asList(BauSystem.MESSAGE.parse("BACKUP_LORE", p)); List<String> lore = Arrays.asList(BauSystem.MESSAGE.parse("BACKUP_LORE", p));
for (int i = 0; i < backups.size(); i++) { for (int i = 0; i < backups.size(); i++) {
String s = backups.get(i); RegionBackups.Backup backup = backups.get(i);
SWItem swItem = new SWItem(Material.BRICK, BauSystem.MESSAGE.parse("BACKUP_ITEM_NAME", p, s), lore, false, clickType -> {}); SWItem swItem = new SWItem(Material.BRICK, BauSystem.MESSAGE.parse("BACKUP_ITEM_NAME", p, backup.getName()), lore, false, clickType -> {
});
swItem.getItemStack().setAmount(i + 1); swItem.getItemStack().setAmount(i + 1);
swListEntries.add(new SWListInv.SWListEntry<>(swItem, s)); swListEntries.add(new SWListInv.SWListEntry<>(swItem, backup));
} }
SWListInv<String> swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("BACKUP_INV_NAME", p), swListEntries, (clickType, s) -> { SWListInv<RegionBackups.Backup> swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("BACKUP_INV_NAME", p), swListEntries, (clickType, s) -> {
p.getOpenInventory().close(); p.getOpenInventory().close();
p.performCommand("backup load " + s); backupLoad(p, s);
}); });
swListInv.open(); swListInv.open();
} }
@Mapper(value = "backupName", local = true) @Mapper(value = "backup", local = true)
public TypeMapper<String> backupMapper() { public TypeMapper<RegionBackups.Backup> backupMapper() {
return SWCommandUtils.createMapper(s -> s, (commandSender, s) -> listBackup((Player) commandSender)); return new TypeMapper<>() {
@Override
public RegionBackups.Backup map(CommandSender commandSender, String[] previousArguments, String s) {
return Region.getRegion(((Player) commandSender).getLocation()).getBackups().get(s);
}
@Override
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
return listBackup((Player) sender).stream().map(RegionBackups.Backup::getName).collect(Collectors.toList());
}
};
} }
private List<String> listBackup(Player p) { private List<RegionBackups.Backup> listBackup(Player p) {
Region region = Region.getRegion(p.getLocation()); Region region = Region.getRegion(p.getLocation());
if (checkGlobalRegion(region, p)) { if (checkGlobalRegion(region, p)) {
return Collections.emptyList(); return Collections.emptyList();
} }
try { try {
return region.listBackup().stream().map(s -> s.substring(0, s.length() - 6).replace(' ', '_')).collect(Collectors.toList()); return region.getBackups().list();
} catch (NullPointerException e) { } catch (NullPointerException e) {
return Collections.emptyList(); return Collections.emptyList();
} }
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.bau; package de.steamwar.bausystem.features.bau;
@@ -22,10 +22,10 @@ package de.steamwar.bausystem.features.bau;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.config.BauServer;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.bausystem.region.FlagOptional;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.region.flags.Flag;
import de.steamwar.core.Core;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
@@ -56,15 +56,10 @@ public class BauInfoBauGuiItem extends BauGuiItem {
Region region = Region.getRegion(player.getLocation()); Region region = Region.getRegion(player.getLocation());
List<String> stringList = new ArrayList<>(); List<String> stringList = new ArrayList<>();
for (Flag flag : Flag.getFlags()) { for (Flag flag : Flag.getFlags()) {
if (flag == Flag.PROTECT && region.getFloorLevel() == 0) { if (!region.getRegionData().has(flag).isApplicable()) continue;
continue; FlagOptional<?> value = region.getRegionData().get(flag);
} if (value.isPresent()) {
if (flag == Flag.ITEMS && Core.getVersion() < 19) { stringList.add(BauSystem.MESSAGE.parse("BAU_INFO_ITEM_LORE_" + flag.name(), player, BauSystem.MESSAGE.parse(value.getWithDefault().getChatValue(), player)));
continue;
}
Flag.Value<?> value = region.get(flag);
if (value != null) {
stringList.add(BauSystem.MESSAGE.parse("BAU_INFO_ITEM_LORE_" + flag.name(), player, BauSystem.MESSAGE.parse(value.getChatValue(), player)));
} }
} }
itemStack.setLore(stringList); itemStack.setLore(stringList);
@@ -1,73 +0,0 @@
/*
* 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.bausystem.features.bau;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission;
import de.steamwar.command.PreviousArguments;
import de.steamwar.command.SWCommand;
import de.steamwar.command.TypeMapper;
import de.steamwar.linkage.Linked;
import de.steamwar.techhider.TechHider;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Collection;
import java.util.stream.Collectors;
@Linked
public class ForceSpectatorCommand extends SWCommand {
public ForceSpectatorCommand() {
super("forcespectator");
}
@Register
public void forceSpectator(@Validator("supervisor") Player player, @Mapper("builder") Player other) {
Permission.forceOnlySpectator(other);
}
@Mapper("builder")
public TypeMapper<Player> spectatorMapper() {
return new TypeMapper<>() {
@Override
public Player map(CommandSender commandSender, String[] previousArguments, String s) {
Player player = Bukkit.getPlayer(s);
if (player == null) {
return null;
}
if (Permission.BUILD.hasPermission(player) && !Permission.SUPERVISOR.hasPermission(player)) {
return player;
}
return null;
}
@Override
public Collection<String> tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) {
return Bukkit.getOnlinePlayers().stream()
.filter(Permission.BUILD::hasPermission)
.filter(player -> !Permission.SUPERVISOR.hasPermission(player))
.map(Player::getName)
.collect(Collectors.toList());
}
};
}
}
@@ -1,8 +1,28 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2025 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.bausystem.features.bau; package de.steamwar.bausystem.features.bau;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.config.BauServer;
import de.steamwar.bausystem.region.FlagOptional;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.region.flags.Flag;
import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommand;
@@ -27,15 +47,13 @@ public class InfoCommand extends SWCommand {
@Register(description = "BAU_INFO_COMMAND_HELP") @Register(description = "BAU_INFO_COMMAND_HELP")
public void genericCommand(Player p) { public void genericCommand(Player p) {
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_OWNER", p, SteamwarUser.get(bauServer.getOwnerID()).getUserName()); BauSystem.MESSAGE.send("BAU_INFO_COMMAND_OWNER", p, SteamwarUser.byId(bauServer.getOwnerID()).getUserName());
Region region = Region.getRegion(p.getLocation()); Region region = Region.getRegion(p.getLocation());
for (Flag flag : Flag.getFlags()) { for (Flag flag : Flag.getFlags()) {
if (flag == Flag.PROTECT && region.getFloorLevel() == 0) { if (!region.getRegionData().has(flag).isApplicable()) continue;
continue; FlagOptional<?> value = region.getRegionData().get(flag);
} if (value.isPresent()) {
Flag.Value<?> value = region.get(flag); BauSystem.MESSAGE.send("BAU_INFO_COMMAND_FLAG", p, BauSystem.MESSAGE.parse(flag.getChatValue(), p), BauSystem.MESSAGE.parse(value.getWithDefault().getChatValue(), p));
if (value != null) {
BauSystem.MESSAGE.send("BAU_INFO_COMMAND_FLAG", p, BauSystem.MESSAGE.parse(flag.getChatValue(), p), BauSystem.MESSAGE.parse(value.getChatValue(), p));
} }
} }
@@ -79,7 +97,7 @@ public class InfoCommand extends SWCommand {
st.append("§8, "); st.append("§8, ");
} }
st.append("§7"); st.append("§7");
st.append(SteamwarUser.get(bauweltMembers.get(i).getMemberID()).getUserName()); st.append(SteamwarUser.byId(bauweltMembers.get(i).getMemberID()).getUserName());
} }
return st.toString(); return st.toString();
} }
@@ -1,7 +1,7 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Affero General Public License as published by
@@ -23,7 +23,6 @@ import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.features.cannon.depth.Depth; import de.steamwar.bausystem.features.cannon.depth.Depth;
import de.steamwar.bausystem.features.cannon.depth.DepthManager; import de.steamwar.bausystem.features.cannon.depth.DepthManager;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.utils.RegionType;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.TNTPrimed; import org.bukkit.entity.TNTPrimed;
@@ -85,8 +84,8 @@ public class CannonDetector implements Listener {
grouped.forEach((cannonKey, tntPrimeds) -> { grouped.forEach((cannonKey, tntPrimeds) -> {
if (tntPrimeds.size() <= 5) return; if (tntPrimeds.size() <= 5) return;
Region region = Region.getRegion(tntPrimeds.get(0).getLocation()); Region region = Region.getRegion(tntPrimeds.get(0).getLocation());
if (region.isGlobal()) return; if (region.getType().isGlobal()) return;
if (!region.hasType(RegionType.TESTBLOCK)) return; if (region.getTestblockArea().isEmpty()) return;
Depth depth = new Depth(region); Depth depth = new Depth(region);
DepthManager.init(tntPrimeds, depth); DepthManager.init(tntPrimeds, depth);
}); });
@@ -1,7 +1,7 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Affero General Public License as published by
@@ -22,7 +22,6 @@ package de.steamwar.bausystem.features.cannon;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.Set; import java.util.Set;
@@ -1,7 +1,7 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Affero General Public License as published by
@@ -23,8 +23,6 @@ import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.configplayer.Config;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.RegionUtils;
import de.steamwar.bausystem.region.utils.RegionExtensionType;
import de.steamwar.bausystem.region.utils.RegionType;
import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.BaseComponent;
import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;
@@ -50,7 +48,7 @@ public class Depth {
public void update(List<Block> blocks) { public void update(List<Block> blocks) {
List<Block> blocksList = blocks.stream() List<Block> blocksList = blocks.stream()
.filter(block -> region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) .filter(block -> region.getTestblockArea().inRegion(block.getLocation(), true))
.collect(Collectors.toList()); .collect(Collectors.toList());
tntCount++; tntCount++;
for (Block block : blocksList) { for (Block block : blocksList) {
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2020 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.cannon.depth; package de.steamwar.bausystem.features.cannon.depth;
@@ -1,7 +1,7 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Affero General Public License as published by
@@ -1,29 +1,30 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.countingwand; package de.steamwar.bausystem.features.countingwand;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Point;
import de.steamwar.bausystem.shared.Pair;
import de.steamwar.bausystem.utils.ItemUtils; import de.steamwar.bausystem.utils.ItemUtils;
import de.steamwar.core.SWPlayer;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import lombok.Data;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -31,77 +32,55 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@UtilityClass @UtilityClass
public class Countingwand { public class Countingwand {
public static ItemStack getWandItem(Player player) { @Data
ItemStack itemStack = new SWItem(Material.STICK, BauSystem.MESSAGE.parse("COUNTINGWAND_ITEM_NAME", player), Arrays.asList(BauSystem.MESSAGE.parse("COUNTINGWAND_ITEM_LORE1", player), BauSystem.MESSAGE.parse("COUNTINGWAND_ITEM_LORE2", player)), false, null).getItemStack(); public class CountingWandComponent implements SWPlayer.Component {
ItemUtils.setItem(itemStack, "countingwand"); private Point pos1;
ItemMeta itemMeta = itemStack.getItemMeta(); private Point pos2;
itemMeta.setCustomModelData(1);
itemStack.setItemMeta(itemMeta);
return itemStack;
}
private final Map<String, Pair<Point, Point>> selections = new HashMap<>(); public boolean setPosition(boolean pos1, Point point) {
if (this.pos1 == null || this.pos2 == null) {
this.pos1 = point;
this.pos2 = point;
return true;
}
Point current = pos1 ? this.pos1 : this.pos2;
if (current.equals(point)) return false;
if (pos1) {
this.pos1 = point;
} else {
this.pos2 = point;
}
return true;
}
}
public boolean isCountingwand(ItemStack itemStack) { public static ItemStack getWandItem(Player player) {
return ItemUtils.isItem(itemStack, "countingwand"); ItemStack itemStack = new SWItem(Material.STICK, BauSystem.MESSAGE.parse("COUNTINGWAND_ITEM_NAME", player), Arrays.asList(BauSystem.MESSAGE.parse("COUNTINGWAND_ITEM_LORE1", player), BauSystem.MESSAGE.parse("COUNTINGWAND_ITEM_LORE2", player)), false, null).getItemStack();
} ItemUtils.setItem(itemStack, "countingwand");
ItemMeta itemMeta = itemStack.getItemMeta();
itemMeta.setCustomModelData(1);
itemStack.setItemMeta(itemMeta);
return itemStack;
}
public void checkSelection(final Point point, final boolean pos1, final Player p) { public boolean isCountingwand(ItemStack itemStack) {
Pair<Point, Point> selection = selections.get(p.getUniqueId().toString()); return ItemUtils.isItem(itemStack, "countingwand");
final boolean newPos; }
if (selection != null) {
if (pos1) {
newPos = !point.equals(selection.setKey(point));
} else {
newPos = !point.equals(selection.setValue(point));
}
} else {
if (pos1) {
selection = new Pair<>(point, null);
} else {
selection = new Pair<>(null, point);
}
selections.put(p.getUniqueId().toString(), selection);
newPos = true;
}
if (newPos) { public void checkSelection(final Point point, final boolean pos1, final Player p) {
String dimension = getDimensions(p, selection.getKey(), selection.getValue()); SWPlayer player = SWPlayer.of(p);
String volume = getVolume(p, selection.getKey(), selection.getValue()); CountingWandComponent countingWandComponent = player.getComponentOrDefault(CountingWandComponent.class, CountingWandComponent::new);
if (pos1) { if (countingWandComponent.setPosition(pos1, point)) {
BauSystem.MESSAGE.send("COUNTINGWAND_MESSAGE_RCLICK", p, point.getX(), point.getY(), point.getZ(), dimension, volume); Point point1 = countingWandComponent.pos1;
} else { Point point2 = countingWandComponent.pos2;
BauSystem.MESSAGE.send("COUNTINGWAND_MESSAGE_LCLICK", p, point.getX(), point.getY(), point.getZ(), dimension, volume); int amount = (Math.abs(point1.getX() - point2.getX()) + 1) * (Math.abs(point1.getY() - point2.getY()) + 1) * (Math.abs(point1.getZ() - point2.getZ()) + 1);
} String dimension = player.using(BauSystem.MESSAGE).parse("COUNTINGWAND_MESSAGE_VOLUME", amount);
} String volume = player.parse("COUNTINGWAND_MESSAGE_DIMENSION", Math.abs(point1.getX() - point2.getX()) + 1, Math.abs(point1.getY() - point2.getY()) + 1, Math.abs(point1.getZ() - point2.getZ()) + 1);
} player.sendMessage(pos1 ? "COUNTINGWAND_MESSAGE_RCLICK" : "COUNTINGWAND_MESSAGE_LCLICK", point.getX(), point.getY(), point.getZ(), dimension, volume);
}
public void removePlayer(Player p) { }
selections.remove(p.getUniqueId().toString());
}
public String getVolume(Player player, final Point point1, final Point point2) {
if (point1 == null || point2 == null) {
return BauSystem.MESSAGE.parse("COUNTINGWAND_MESSAGE_VOLUME", player, 0);
}
return BauSystem.MESSAGE.parse("COUNTINGWAND_MESSAGE_VOLUME", player, getAmount(point1, point2));
}
public String getDimensions(Player player, final Point point1, final Point point2) {
if (point1 == null || point2 == null) {
return BauSystem.MESSAGE.parse("COUNTINGWAND_MESSAGE_DIMENSION", player, 0, 0, 0);
}
return BauSystem.MESSAGE.parse("COUNTINGWAND_MESSAGE_DIMENSION", player, Math.abs(point1.getX() - point2.getX()) + 1, Math.abs(point1.getY() - point2.getY()) + 1, Math.abs(point1.getZ() - point2.getZ()) + 1);
}
public int getAmount(final Point point1, final Point point2) {
return (Math.abs(point1.getX() - point2.getX()) + 1) * (Math.abs(point1.getY() - point2.getY()) + 1) * (Math.abs(point1.getZ() - point2.getZ()) + 1);
}
} }
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.countingwand; package de.steamwar.bausystem.features.countingwand;
@@ -28,12 +28,12 @@ import org.bukkit.entity.Player;
@Linked @Linked
public class CountingwandCommand extends SWCommand { public class CountingwandCommand extends SWCommand {
public CountingwandCommand() { public CountingwandCommand() {
super("countingwand", "/countingwand", "cwand", "/cwand", "zollstock", "/zollstock"); super("countingwand", "/countingwand", "cwand", "/cwand", "zollstock", "/zollstock");
} }
@Register(description = "COUNTINGWAND_COMMAND_HELP") @Register(description = "COUNTINGWAND_COMMAND_HELP")
public void genericCommand(final Player p) { public void genericCommand(final Player p) {
SWUtils.giveItemToPlayer(p, Countingwand.getWandItem(p)); SWUtils.giveItemToPlayer(p, Countingwand.getWandItem(p));
} }
} }
@@ -1,26 +1,26 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.countingwand; package de.steamwar.bausystem.features.countingwand;
import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.ClickType;
@@ -30,24 +30,24 @@ import org.bukkit.inventory.ItemStack;
@Linked @Linked
public class CountingwandGuiItem extends BauGuiItem { public class CountingwandGuiItem extends BauGuiItem {
public CountingwandGuiItem() { public CountingwandGuiItem() {
super(22); super(22);
} }
@Override @Override
public ItemStack getItem(Player player) { public ItemStack getItem(Player player) {
return Countingwand.getWandItem(player); return Countingwand.getWandItem(player);
} }
@Override @Override
public boolean click(ClickType click, Player p) { public boolean click(ClickType click, Player p) {
p.closeInventory(); p.closeInventory();
p.performCommand("countingwand"); p.performCommand("countingwand");
return false; return false;
} }
@Override @Override
public Permission permission() { public Permission permission() {
return Permission.MEMBER; return Permission.MEMBER;
} }
} }
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.countingwand; package de.steamwar.bausystem.features.countingwand;
@@ -27,7 +27,6 @@ import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.util.RayTraceResult; import org.bukkit.util.RayTraceResult;
import java.util.Objects; import java.util.Objects;
@@ -36,40 +35,35 @@ import java.util.Objects;
@Linked @Linked
public class CountingwandListener implements Listener { public class CountingwandListener implements Listener {
@EventHandler @EventHandler
public void onBlockBreak(final BlockBreakEvent event) { public void onBlockBreak(final BlockBreakEvent event) {
if (!Countingwand.isCountingwand(event.getPlayer().getInventory().getItemInMainHand())) { if (!Countingwand.isCountingwand(event.getPlayer().getInventory().getItemInMainHand())) {
return; return;
} }
event.setCancelled(true); event.setCancelled(true);
Countingwand.checkSelection(Point.fromLocation(event.getBlock().getLocation()), true, event.getPlayer()); Countingwand.checkSelection(Point.fromLocation(event.getBlock().getLocation()), true, event.getPlayer());
} }
@EventHandler @EventHandler
public void onPlayerInteract(final PlayerInteractEvent event) { public void onPlayerInteract(final PlayerInteractEvent event) {
if (!Countingwand.isCountingwand(event.getItem())) { if (!Countingwand.isCountingwand(event.getItem())) {
return; return;
} }
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_AIR) { if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_AIR) {
RayTraceResult rayTraceResult = event.getPlayer().rayTraceBlocks(200, FluidCollisionMode.NEVER); RayTraceResult rayTraceResult = event.getPlayer().rayTraceBlocks(200, FluidCollisionMode.NEVER);
if (rayTraceResult == null) { if (rayTraceResult == null) {
return; return;
} }
Countingwand.checkSelection(Point.fromLocation(Objects.requireNonNull(rayTraceResult.getHitBlock()).getLocation()), event.getAction() == Action.LEFT_CLICK_AIR, event.getPlayer()); Countingwand.checkSelection(Point.fromLocation(Objects.requireNonNull(rayTraceResult.getHitBlock()).getLocation()), event.getAction() == Action.LEFT_CLICK_AIR, event.getPlayer());
return; return;
} }
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) { if (event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return; return;
} }
event.setCancelled(true); event.setCancelled(true);
Countingwand.checkSelection(Point.fromLocation(Objects.requireNonNull(event.getClickedBlock()).getLocation()), false, event.getPlayer()); Countingwand.checkSelection(Point.fromLocation(Objects.requireNonNull(event.getClickedBlock()).getLocation()), false, event.getPlayer());
} }
@EventHandler
public void onLeave(PlayerQuitEvent event) {
Countingwand.removePlayer(event.getPlayer());
}
} }
@@ -1,29 +1,27 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.design.endstone; package de.steamwar.bausystem.features.design.endstone;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.entity.REntity; import de.steamwar.entity.*;
import de.steamwar.entity.REntityServer;
import de.steamwar.entity.RFallingBlockEntity;
import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.ChatMessageType;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@@ -31,10 +29,8 @@ import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import java.util.ArrayList; import java.util.*;
import java.util.HashSet; import java.util.stream.Collectors;
import java.util.List;
import java.util.Set;
public class DesignEndStone { public class DesignEndStone {
@@ -44,27 +40,32 @@ public class DesignEndStone {
private REntityServer entityServer = new REntityServer(); private REntityServer entityServer = new REntityServer();
private List<REntity> entities = new ArrayList<>(); private List<REntity> entities = new ArrayList<>();
private Set<Location> locations = new HashSet<>(); private Set<Location> locations = new HashSet<>();
private boolean wsOrAs; private Set<Material> limited;
private double maxBlastResistance; private boolean calculateFromBottom;
public DesignEndStone(Region region) { public DesignEndStone(Region region) {
this.minX = region.getMinPointBuild().getX(); this.minX = region.getBuildArea().getMinPoint(false).getX();
this.minY = region.getMinPointBuild().getY(); this.minY = region.getBuildArea().getMinPoint(false).getY();
this.minZ = region.getMinPointBuild().getZ(); this.minZ = region.getBuildArea().getMinPoint(false).getZ();
this.maxX = region.getMaxPointBuild().getX(); this.maxX = region.getBuildArea().getMaxPoint(false).getX();
this.maxY = region.getMaxPointBuild().getY(); this.maxY = region.getBuildArea().getMaxPoint(false).getY();
this.maxZ = region.getMaxPointBuild().getZ(); this.maxZ = region.getBuildArea().getMaxPoint(false).getZ();
wsOrAs = region.getName().startsWith("ws") || region.getName().startsWith("as");
maxBlastResistance = wsOrAs ? 6.1 : 9.0;
entityServer.setCallback((player, rEntity, entityAction) -> { limited = Arrays.stream(Material.values())
if (entityAction != REntityServer.EntityAction.ATTACK) return; .filter(Material::isBlock)
Location location = new Location(WORLD, rEntity.getX(), rEntity.getY(), rEntity.getZ()); .filter(material -> !material.isLegacy())
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { .filter(material -> material.getBlastResistance() > region.getGameModeConfig().Schematic.MaxDesignBlastResistance)
location.getBlock().breakNaturally(); .collect(Collectors.toSet());
calc(); calculateFromBottom = region.getGameModeConfig().Arena.NoFloor;
}, 1); }
});
private void interact(Player player, RInteraction entity, REntityAction action) {
if (action != REntityAction.ATTACK) return;
Location location = new Location(WORLD, entity.getX(), entity.getY(), entity.getZ());
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
location.getBlock().breakNaturally();
calc();
}, 1);
} }
public void calc() { public void calc() {
@@ -76,7 +77,7 @@ public class DesignEndStone {
calc(minX, minY, maxZ, maxX, maxY, maxZ, 0, 0, -1, maxZ - minZ); calc(minX, minY, maxZ, maxX, maxY, maxZ, 0, 0, -1, maxZ - minZ);
calc(minX, minY, minZ, minX, maxY, maxZ, 1, 0, 0, maxX - minX); calc(minX, minY, minZ, minX, maxY, maxZ, 1, 0, 0, maxX - minX);
calc(maxX, minY, minZ, maxX, maxY, maxZ, -1, 0, 0, maxX - minX); calc(maxX, minY, minZ, maxX, maxY, maxZ, -1, 0, 0, maxX - minX);
if (wsOrAs) { if (calculateFromBottom) {
calc(minX, minY, minZ, maxX, minY, maxZ, 0, 1, 0, maxY - minY + 1); calc(minX, minY, minZ, maxX, minY, maxZ, 0, 1, 0, maxY - minY + 1);
} else { } else {
int airBlocks = 0; int airBlocks = 0;
@@ -106,13 +107,16 @@ public class DesignEndStone {
int cz = z + step * dirZ; int cz = z + step * dirZ;
Material material = WORLD.getBlockAt(cx, cy, cz).getType(); Material material = WORLD.getBlockAt(cx, cy, cz).getType();
if (material != Material.WATER && material != Material.LAVA && material.getBlastResistance() >= maxBlastResistance) { if (material != Material.WATER && material != Material.LAVA && limited.contains(material)) {
Location location = new Location(WORLD, cx + 0.5, cy, cz + 0.5); Location location = new Location(WORLD, cx, cy, cz);
if (!locations.add(location)) break; if (!locations.add(location)) break;
RFallingBlockEntity entity = new RFallingBlockEntity(entityServer, location, Material.RED_STAINED_GLASS); RBlockDisplay entity = new RBlockDisplay(entityServer, location);
entity.setNoGravity(true); entity.setBlock(Material.RED_STAINED_GLASS.createBlockData());
entity.setGlowing(true); entity.setGlowing(true);
entities.add(entity); entities.add(entity);
RInteraction interaction = new RInteraction(entityServer, location);
interaction.setCallback(this::interact);
entities.add(interaction);
break; break;
} else if (!material.isAir() && material != Material.WATER && material != Material.LAVA) { } else if (!material.isAir() && material != Material.WATER && material != Material.LAVA) {
break; break;
@@ -1,27 +1,26 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.design.endstone; package de.steamwar.bausystem.features.design.endstone;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.utils.RegionType;
import de.steamwar.bausystem.utils.BauMemberUpdateEvent; import de.steamwar.bausystem.utils.BauMemberUpdateEvent;
import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommand;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
@@ -49,7 +48,11 @@ public class DesignEndStoneCommand extends SWCommand implements Listener {
@Register(description = "DESIGN_ENDSTONE_COMMAND_HELP") @Register(description = "DESIGN_ENDSTONE_COMMAND_HELP")
public void genericCommand(@Validator Player player) { public void genericCommand(@Validator Player player) {
Region region = Region.getRegion(player.getLocation()); Region region = Region.getRegion(player.getLocation());
if (!region.hasType(RegionType.BUILD)) { if (region.getBuildArea().isEmpty()) {
BauSystem.MESSAGE.send("DESIGN_ENDSTONE_REGION_ERROR", player);
return;
}
if (!region.getGameModeConfig().loaded) {
BauSystem.MESSAGE.send("DESIGN_ENDSTONE_REGION_ERROR", player); BauSystem.MESSAGE.send("DESIGN_ENDSTONE_REGION_ERROR", player);
return; return;
} }
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.detonator; package de.steamwar.bausystem.features.detonator;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.detonator; package de.steamwar.bausystem.features.detonator;
@@ -25,8 +25,12 @@ import de.steamwar.bausystem.configplayer.Config;
import de.steamwar.bausystem.features.autostart.AutostartListener; import de.steamwar.bausystem.features.autostart.AutostartListener;
import de.steamwar.bausystem.features.detonator.storage.DetonatorStorage; import de.steamwar.bausystem.features.detonator.storage.DetonatorStorage;
import de.steamwar.bausystem.features.detonator.storage.ItemStorage; import de.steamwar.bausystem.features.detonator.storage.ItemStorage;
import de.steamwar.core.SWPlayer;
import de.steamwar.entity.RBlockDisplay;
import de.steamwar.entity.REntityServer; import de.steamwar.entity.REntityServer;
import de.steamwar.entity.RFallingBlockEntity; import de.steamwar.entity.RInteraction;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
@@ -45,36 +49,48 @@ import java.util.*;
@UtilityClass @UtilityClass
public class Detonator { public class Detonator {
private static final Map<Player, REntityServer> ENTITIES_MAP = new HashMap<>(); public class DetonatorComponent implements SWPlayer.Component {
private static final Vector HALF = new Vector(0.5, 0, 0.5); private final REntityServer entities = new REntityServer();
@Getter
@Setter
private boolean hasUpdated = false;
@Override
public void onMount(SWPlayer player) {
entities.addPlayer(player.getPlayer());
}
@Override
public void onUnmount(SWPlayer player) {
entities.close();
}
}
public static boolean isDetonator(ItemStack itemStack) { public static boolean isDetonator(ItemStack itemStack) {
return ItemStorage.isDetonator(itemStack); return ItemStorage.isDetonator(itemStack);
} }
public static void showDetonator(Player p, List<Location> locs) { public static void showDetonator(Player p, List<Location> locs) {
if (ENTITIES_MAP.containsKey(p)) return; DetonatorComponent detonatorComponent = SWPlayer.of(p).getComponentOrDefault(DetonatorComponent.class, DetonatorComponent::new);
REntityServer entities = new REntityServer();
entities.setCallback((player, rEntity, entityAction) -> {
Vector vector = new Vector(rEntity.getX(), rEntity.getY(), rEntity.getZ());
DetonatorListener.addLocationToDetonator(vector.toLocation(player.getWorld()).getBlock().getLocation(), player);
DetonatorListener.HAS_UPDATED.add(player);
});
entities.addPlayer(p);
ENTITIES_MAP.put(p, entities);
locs.forEach(location -> { locs.forEach(location -> {
RFallingBlockEntity entity = new RFallingBlockEntity(entities, location.clone().add(HALF), Material.RED_STAINED_GLASS); RBlockDisplay blockDisplay = new RBlockDisplay(detonatorComponent.entities, location);
entity.setNoGravity(true); blockDisplay.setBlock(Material.RED_STAINED_GLASS.createBlockData());
RInteraction interaction = new RInteraction(detonatorComponent.entities, location);
interaction.setCallback((player, entity, action) -> {
Vector vector = new Vector(entity.getX(), entity.getY(), entity.getZ());
DetonatorListener.addLocationToDetonator(vector.toLocation(player.getWorld()).getBlock().getLocation(), player);
});
}); });
} }
public static void hideDetonator(Player p) { public static void hideDetonator(Player p) {
ENTITIES_MAP.remove(p).close(); SWPlayer.of(p).removeComponent(DetonatorComponent.class);
} }
public static boolean hasActiveDetonatorShow(Player p) { public static boolean hasActiveDetonatorShow(Player p) {
return ENTITIES_MAP.containsKey(p); return SWPlayer.of(p).hasComponent(DetonatorComponent.class);
} }
public static void activateDetonator(DetonatorStorage detonator) { public static void activateDetonator(DetonatorStorage detonator) {
@@ -1,26 +1,26 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.detonator; package de.steamwar.bausystem.features.detonator;
import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.ClickType;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.detonator; package de.steamwar.bausystem.features.detonator;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.detonator; package de.steamwar.bausystem.features.detonator;
@@ -24,6 +24,7 @@ import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.SWUtils;
import de.steamwar.bausystem.features.detonator.storage.DetonatorStorage; import de.steamwar.bausystem.features.detonator.storage.DetonatorStorage;
import de.steamwar.bausystem.features.detonator.storage.ItemStorage; import de.steamwar.bausystem.features.detonator.storage.ItemStorage;
import de.steamwar.core.SWPlayer;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -36,15 +37,11 @@ import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerSwapHandItemsEvent; import org.bukkit.event.player.PlayerSwapHandItemsEvent;
import java.util.HashSet;
import java.util.Set;
@Linked @Linked
public class DetonatorListener implements Listener { public class DetonatorListener implements Listener {
static final Set<Player> HAS_UPDATED = new HashSet<>();
static void addLocationToDetonator(Location location, Player p) { static void addLocationToDetonator(Location location, Player p) {
SWPlayer.of(p).getComponent(Detonator.DetonatorComponent.class).ifPresent(detonatorComponent -> detonatorComponent.setHasUpdated(true));
Detoblock detoblock = Detonator.getBlock(location.getBlock()); Detoblock detoblock = Detonator.getBlock(location.getBlock());
if (detoblock == Detoblock.INVALID) { if (detoblock == Detoblock.INVALID) {
SWUtils.sendToActionbar(p, BauSystem.MESSAGE.parse("DETONATOR_INVALID_BLOCK", p)); SWUtils.sendToActionbar(p, BauSystem.MESSAGE.parse("DETONATOR_INVALID_BLOCK", p));
@@ -66,64 +63,59 @@ public class DetonatorListener implements Listener {
@EventHandler @EventHandler
public void onBlockBreak(BlockBreakEvent event) { public void onBlockBreak(BlockBreakEvent event) {
if(!Permission.BUILD.hasPermission(event.getPlayer())) return; if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
Player p = event.getPlayer(); Player p = event.getPlayer();
if (Detonator.isDetonator(p.getInventory().getItemInMainHand())) { if (Detonator.isDetonator(p.getInventory().getItemInMainHand())) {
event.setCancelled(true); event.setCancelled(true);
addLocationToDetonator(event.getBlock().getLocation(), p); addLocationToDetonator(event.getBlock().getLocation(), p);
HAS_UPDATED.add(event.getPlayer());
} }
} }
@EventHandler @EventHandler
public void onPlayerInteract(PlayerInteractEvent event) { public void onPlayerInteract(PlayerInteractEvent event) {
if(!Permission.BUILD.hasPermission(event.getPlayer())) return; if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
if (!Detonator.isDetonator(event.getItem())) { if (!Detonator.isDetonator(event.getItem())) return;
return;
}
if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) { if (event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
event.setCancelled(true); event.setCancelled(true);
DetonatorStorage detonator = new ItemStorage(event.getPlayer()); DetonatorStorage detonator = new ItemStorage(event.getPlayer());
Detonator.activateDetonator(detonator); Detonator.activateDetonator(detonator);
HAS_UPDATED.add(event.getPlayer()); SWPlayer.of(event.getPlayer()).getComponent(Detonator.DetonatorComponent.class).ifPresent(detonatorComponent -> detonatorComponent.setHasUpdated(true));
} }
} }
@EventHandler(ignoreCancelled = true) @EventHandler(ignoreCancelled = true)
public void onPlayerMove(PlayerMoveEvent event) { public void onPlayerMove(PlayerMoveEvent event) {
if (!Permission.BUILD.hasPermission(event.getPlayer()) ||!Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) { if (!Permission.BUILD.hasPermission(event.getPlayer()) || !Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) {
if (Detonator.hasActiveDetonatorShow(event.getPlayer())) { if (Detonator.hasActiveDetonatorShow(event.getPlayer())) {
Detonator.hideDetonator(event.getPlayer()); Detonator.hideDetonator(event.getPlayer());
} }
} else { return;
if (!Detonator.hasActiveDetonatorShow(event.getPlayer())) {
Detonator.showDetonator(event.getPlayer(), new ItemStorage(event.getPlayer()).getLocations());
}
} }
if (!Detonator.hasActiveDetonatorShow(event.getPlayer())) {
if (HAS_UPDATED.contains(event.getPlayer())) { Detonator.showDetonator(event.getPlayer(), new ItemStorage(event.getPlayer()).getLocations());
HAS_UPDATED.remove(event.getPlayer()); return;
if (Detonator.hasActiveDetonatorShow(event.getPlayer())) {
Detonator.hideDetonator(event.getPlayer());
Detonator.showDetonator(event.getPlayer(), new ItemStorage(event.getPlayer()).getLocations());
}
} }
Detonator.DetonatorComponent component = SWPlayer.of(event.getPlayer())
.getComponentAndFilter(Detonator.DetonatorComponent.class, Detonator.DetonatorComponent::isHasUpdated)
.orElse(null);
if (component == null) return;
component.setHasUpdated(false);
Detonator.hideDetonator(event.getPlayer());
Detonator.showDetonator(event.getPlayer(), new ItemStorage(event.getPlayer()).getLocations());
} }
@EventHandler @EventHandler
public void onPlayerItemHeld(PlayerItemHeldEvent event) { public void onPlayerItemHeld(PlayerItemHeldEvent event) {
if(!Permission.BUILD.hasPermission(event.getPlayer())) return; if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
if (Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) { if (!Detonator.isDetonator(event.getPlayer().getInventory().getItemInMainHand())) return;
HAS_UPDATED.add(event.getPlayer()); SWPlayer.of(event.getPlayer()).getComponent(Detonator.DetonatorComponent.class).ifPresent(detonatorComponent -> detonatorComponent.setHasUpdated(true));
}
} }
@EventHandler @EventHandler
public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) { public void onPlayerSwapHandItems(PlayerSwapHandItemsEvent event) {
if(!Permission.BUILD.hasPermission(event.getPlayer())) return; if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
if (Detonator.isDetonator(event.getMainHandItem()) || Detonator.isDetonator(event.getOffHandItem())) { if (!(Detonator.isDetonator(event.getMainHandItem()) || Detonator.isDetonator(event.getOffHandItem()))) return;
HAS_UPDATED.add(event.getPlayer()); SWPlayer.of(event.getPlayer()).getComponent(Detonator.DetonatorComponent.class).ifPresent(detonatorComponent -> detonatorComponent.setHasUpdated(true));
}
} }
} }
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.detonator.storage; package de.steamwar.bausystem.features.detonator.storage;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.detonator.storage; package de.steamwar.bausystem.features.detonator.storage;
@@ -0,0 +1,63 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 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.bausystem.features.dev;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.command.SWCommand;
import de.steamwar.linkage.Linked;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.io.IOException;
@Linked
public class CreateKitCommand extends SWCommand {
public CreateKitCommand() {
super("createkit");
if (!BauSystem.DEV_SERVER) unregister();
}
@Register
public void onCommand(Player player, String name) {
YamlConfiguration yaml = new YamlConfiguration();
yaml.set("Items", player.getInventory().getContents());
yaml.set("Armor", player.getInventory().getArmorContents());
yaml.set("Effects", player.getActivePotionEffects());
yaml.set("LeaderAllowed", true);
yaml.set("MemberAllowed", true);
yaml.set("EnterStage", 0);
yaml.set("TNT", true);
YamlConfiguration kits = new YamlConfiguration();
kits.set("Kits." + name, yaml);
try {
kits.save(new File("new.kits.yaml"));
player.sendMessage("Kit created!");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@@ -1,7 +1,7 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2026 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU Affero General Public License as published by
@@ -17,15 +17,15 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.utils; package de.steamwar.bausystem.features.experimental;
import de.steamwar.bausystem.BauSystem; import de.steamwar.command.SWCommand;
import de.steamwar.core.VersionDependent; import de.steamwar.linkage.Linked;
public interface TickListener { @Linked
public class ExperimentalCommand extends SWCommand {
TickListener impl = VersionDependent.getVersionImpl(BauSystem.getInstance()); public ExperimentalCommand() {
super("experimental", "experiment");
default void init() {
} }
} }
@@ -0,0 +1,135 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2026 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.bausystem.features.experimental.redstone_engine;
import de.steamwar.bausystem.features.experimental.ExperimentalCommand;
import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.utils.ScoreboardElement;
import de.steamwar.command.AbstractSWCommand;
import de.steamwar.command.SWCommand;
import de.steamwar.linkage.Linked;
import io.papermc.paper.configuration.WorldConfiguration;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.title.TitlePart;
import org.bukkit.Bukkit;
import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import java.util.Collection;
import java.util.List;
@AbstractSWCommand.PartOf(ExperimentalCommand.class)
@Linked
public class RedstoneEngine extends SWCommand implements Listener, ScoreboardElement {
public RedstoneEngine() {
super("");
}
private WorldConfiguration.Misc getConfig() {
return ((CraftWorld) Bukkit.getWorlds().get(0)).getHandle().paperConfig().misc;
}
@Register("redstone")
@Register("redstoneengine")
public void setRedstoneEngine(Player player, @StaticValue("alternate_current") String __, WorldConfiguration.Misc.AlternateCurrentUpdateOrder updateOrder) {
WorldConfiguration.Misc misc = getConfig();
misc.redstoneImplementation = WorldConfiguration.Misc.RedstoneImplementation.ALTERNATE_CURRENT;
misc.alternateCurrentUpdateOrder = updateOrder;
broadcastTitle(Bukkit.getOnlinePlayers());
}
@Register("redstone")
@Register("redstoneengine")
public void setRedstoneEngine(Player player, WorldConfiguration.Misc.RedstoneImplementation implementation) {
getConfig().redstoneImplementation = implementation;
broadcastTitle(Bukkit.getOnlinePlayers());
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
WorldConfiguration.Misc misc = getConfig();
if (misc.redstoneImplementation != WorldConfiguration.Misc.RedstoneImplementation.EIGENCRAFT) {
broadcastTitle(List.of(event.getPlayer()));
}
}
private void broadcastTitle(Collection<? extends Player> players) {
WorldConfiguration.Misc misc = getConfig();
Component title = switch (misc.redstoneImplementation) {
case VANILLA -> Component.text("⚠").color(NamedTextColor.RED).append(Component.text(" Redstone: Vanilla ").color(NamedTextColor.WHITE)).append(Component.text("⚠").color(NamedTextColor.RED));
case EIGENCRAFT -> Component.text("Redstone: Eigencraft");
case ALTERNATE_CURRENT -> Component.text("⚠").color(NamedTextColor.RED).append(Component.text(" Redstone: AC ").color(NamedTextColor.WHITE)).append(Component.text("⚠").color(NamedTextColor.RED));
};
Component subtitle;
if (misc.redstoneImplementation != WorldConfiguration.Misc.RedstoneImplementation.ALTERNATE_CURRENT) {
subtitle = Component.text().build();
} else {
subtitle = switch (misc.alternateCurrentUpdateOrder) {
case VERTICAL_FIRST_INWARD -> Component.text("Y first inwards"); // Y before XZ
case VERTICAL_FIRST_OUTWARD -> Component.text("Y first outwards"); // XZ before Y
case HORIZONTAL_FIRST_INWARD -> Component.text("XZ first inwards"); // Y before XZ
case HORIZONTAL_FIRST_OUTWARD -> Component.text("XZ first outwards"); // XZ before Y
};
}
players.forEach(player -> {
player.sendTitlePart(TitlePart.TITLE, title);
player.sendTitlePart(TitlePart.SUBTITLE, subtitle);
});
}
@Override
public ScoreboardGroup getGroup() {
return ScoreboardGroup.FOOTER;
}
@Override
public int order() {
return Integer.MAX_VALUE;
}
@Override
public String get(Region region, Player p) {
WorldConfiguration.Misc misc = getConfig();
switch (misc.redstoneImplementation) {
case ALTERNATE_CURRENT:
switch (misc.alternateCurrentUpdateOrder) {
case VERTICAL_FIRST_INWARD:
return "§eRedstone§8: §cAC §8(§7Y in§8)";
case VERTICAL_FIRST_OUTWARD:
return "§eRedstone§8: §cAC §8(§7Y out§8)";
case HORIZONTAL_FIRST_INWARD:
return "§eRedstone§8: §cAC §8(§7XZ in§8)";
case HORIZONTAL_FIRST_OUTWARD:
return "§eRedstone§8: §cAC §8(§7XZ out§8)";
}
return "§eRedstone§8: §cAC";
case EIGENCRAFT:
return null;
case VANILLA:
default:
return "§eRedstone§8: §cVanilla";
}
}
}
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.gui; package de.steamwar.bausystem.features.gui;
@@ -23,7 +23,7 @@ import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.SWUtils;
import de.steamwar.bausystem.features.gui.editor.BauGuiMapping; import de.steamwar.bausystem.features.gui.editor.BauGuiMapping;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWInventory;
import lombok.Getter; import lombok.Getter;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.gui; package de.steamwar.bausystem.features.gui;
@@ -1,27 +1,27 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.gui; package de.steamwar.bausystem.features.gui;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.ChatColor;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.gui; package de.steamwar.bausystem.features.gui;
@@ -1,28 +1,28 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.gui.editor; package de.steamwar.bausystem.features.gui.editor;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.features.gui.BauGUI; import de.steamwar.bausystem.features.gui.BauGUI;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.core.TrickyTrialsWrapper; import de.steamwar.data.CMDs;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import de.steamwar.inventory.SWListInv; import de.steamwar.inventory.SWListInv;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
@@ -73,8 +73,8 @@ public class BauGuiEditor implements Listener {
inv.setItem(mapping.getSize() + 5, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_TRASH", p), Arrays.asList(BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_TRASH_LORE", p)), false, clickType -> { inv.setItem(mapping.getSize() + 5, new SWItem(Material.BARRIER, BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_TRASH", p), Arrays.asList(BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_TRASH_LORE", p)), false, clickType -> {
}).getItemStack()); }).getItemStack());
inv.setItem(mapping.getSize() + 6, new SWItem(TrickyTrialsWrapper.impl.getTurtleScute(), BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_MORE", p)).getItemStack()); inv.setItem(mapping.getSize() + 6, new SWItem(Material.TURTLE_SCUTE, BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_MORE", p)).getItemStack());
inv.setItem(mapping.getSize() + 8, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_CLOSE", p)).getItemStack()); inv.setItem(mapping.getSize() + 8, new SWItem(Material.ARROW, BauSystem.MESSAGE.parse("GUI_EDITOR_ITEM_CLOSE", p)).setCustomModelData(CMDs.BACK).getItemStack());
p.openInventory(inv); p.openInventory(inv);
p.getOpenInventory().setCursor(cursor == null ? new SWItem().getItemStack() : cursor); p.getOpenInventory().setCursor(cursor == null ? new SWItem().getItemStack() : cursor);
@@ -1,27 +1,27 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.gui.editor; package de.steamwar.bausystem.features.gui.editor;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.Material; import org.bukkit.Material;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.gui.editor; package de.steamwar.bausystem.features.gui.editor;
@@ -22,7 +22,7 @@ package de.steamwar.bausystem.features.gui.editor;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.configplayer.Config;
import de.steamwar.bausystem.features.gui.BauGUI; import de.steamwar.bausystem.features.gui.BauGUI;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.hotbar; package de.steamwar.bausystem.features.hotbar;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.hotbar; package de.steamwar.bausystem.features.hotbar;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2021 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.hotbar; package de.steamwar.bausystem.features.hotbar;
@@ -31,7 +31,7 @@ public class HotbarListener implements Listener {
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onPlayerJoin(PlayerJoinEvent event) { public void onPlayerJoin(PlayerJoinEvent event) {
if(!Permission.BUILD.hasPermission(event.getPlayer())) return; if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
if (allNull(event.getPlayer().getInventory().getContents()) && allNull(event.getPlayer().getInventory().getArmorContents())) { if (allNull(event.getPlayer().getInventory().getContents()) && allNull(event.getPlayer().getInventory().getArmorContents())) {
DefaultHotbar.setHotbar(event.getPlayer()); DefaultHotbar.setHotbar(event.getPlayer());
} }
@@ -1,9 +1,28 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2025 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.bausystem.features.inventoryfiller; package de.steamwar.bausystem.features.inventoryfiller;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.Permission;
import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.configplayer.Config;
import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.linkage.BauGuiItem;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import de.steamwar.linkage.LinkedInstance; import de.steamwar.linkage.LinkedInstance;
@@ -31,7 +50,8 @@ public class InventoryFillBauGuiItem extends BauGuiItem {
@Override @Override
public ItemStack getItem(Player player) { public ItemStack getItem(Player player) {
String loreKey = Config.getInstance().get(player).getPlainValueOrDefault("inventoryfill", false) ? "OTHER_ITEMS_INVENTORY_FILL_LORE_ACTIVE" : "OTHER_ITEMS_INVENTORY_FILL_LORE_INACTIVE"; String loreKey = Config.getInstance().get(player).getPlainValueOrDefault("inventoryfill", false) ? "OTHER_ITEMS_INVENTORY_FILL_LORE_ACTIVE" : "OTHER_ITEMS_INVENTORY_FILL_LORE_INACTIVE";
return new SWItem(Material.HOPPER, BauSystem.MESSAGE.parse("OTHER_ITEMS_INVENTORY_FILL_NAME", player), Collections.singletonList(BauSystem.MESSAGE.parse(loreKey, player)), false, clickType -> {}).getItemStack(); return new SWItem(Material.HOPPER, BauSystem.MESSAGE.parse("OTHER_ITEMS_INVENTORY_FILL_NAME", player), Collections.singletonList(BauSystem.MESSAGE.parse(loreKey, player)), false, clickType -> {
}).getItemStack();
} }
@Override @Override
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2022 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.inventoryfiller; package de.steamwar.bausystem.features.inventoryfiller;
@@ -39,7 +39,7 @@ public class InventoryFiller implements Listener {
@EventHandler @EventHandler
public void onPlayerDropItem(PlayerDropItemEvent event) { public void onPlayerDropItem(PlayerDropItemEvent event) {
if(!Permission.BUILD.hasPermission(event.getPlayer())) return; if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
if (!Config.getInstance().get(event.getPlayer()).getPlainValueOrDefault("inventoryfill", false)) return; if (!Config.getInstance().get(event.getPlayer()).getPlainValueOrDefault("inventoryfill", false)) return;
if (!event.getPlayer().isSneaking()) return; if (!event.getPlayer().isSneaking()) return;
Block block = event.getPlayer().getTargetBlockExact(5); Block block = event.getPlayer().getTargetBlockExact(5);
@@ -61,7 +61,7 @@ public class InventoryFiller implements Listener {
*/ */
@EventHandler @EventHandler
public void onPlayerItemHeld(PlayerItemHeldEvent event) { public void onPlayerItemHeld(PlayerItemHeldEvent event) {
if(!Permission.BUILD.hasPermission(event.getPlayer())) return; if (!Permission.BUILD.hasPermission(event.getPlayer())) return;
if (!Config.getInstance().get(event.getPlayer()).getPlainValueOrDefault("inventoryfill", false)) return; if (!Config.getInstance().get(event.getPlayer()).getPlainValueOrDefault("inventoryfill", false)) return;
if (!event.getPlayer().isSneaking()) return; if (!event.getPlayer().isSneaking()) return;
ItemStack itemStack = event.getPlayer().getInventory().getItemInMainHand(); ItemStack itemStack = event.getPlayer().getInventory().getItemInMainHand();
@@ -1,15 +1,67 @@
/*
* This file is a part of the SteamWar software.
*
* Copyright (C) 2025 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.bausystem.features.inventoryfiller; package de.steamwar.bausystem.features.inventoryfiller;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.SWUtils;
import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.configplayer.Config;
import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommand;
import de.steamwar.inventory.SWInventory;
import de.steamwar.inventory.SWItem;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import org.bukkit.Material;
import org.bukkit.block.Barrel;
import org.bukkit.block.BlockState;
import org.bukkit.block.Chest;
import org.bukkit.block.ShulkerBox;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BlockStateMeta;
import java.util.HashMap;
import java.util.Map;
@Linked @Linked
public class InventoryFillerCommand extends SWCommand { public class InventoryFillerCommand extends SWCommand {
private static final Map<Integer, Integer> POWER_TO_FILLLEVEL = new HashMap<>();
static {
POWER_TO_FILLLEVEL.put(0, 0);
POWER_TO_FILLLEVEL.put(1, 1);
POWER_TO_FILLLEVEL.put(2, 1 * 64 + 60);
POWER_TO_FILLLEVEL.put(3, 3 * 64 + 55);
POWER_TO_FILLLEVEL.put(4, 5 * 64 + 51);
POWER_TO_FILLLEVEL.put(5, 7 * 64 + 46);
POWER_TO_FILLLEVEL.put(6, 9 * 64 + 42);
POWER_TO_FILLLEVEL.put(7, 11 * 64 + 37);
POWER_TO_FILLLEVEL.put(8, 13 * 64 + 32);
POWER_TO_FILLLEVEL.put(9, 15 * 64 + 28);
POWER_TO_FILLLEVEL.put(10, 17 * 64 + 23);
POWER_TO_FILLLEVEL.put(11, 19 * 64 + 19);
POWER_TO_FILLLEVEL.put(12, 21 * 64 + 14);
POWER_TO_FILLLEVEL.put(13, 23 * 64 + 10);
POWER_TO_FILLLEVEL.put(14, 25 * 64 + 5);
POWER_TO_FILLLEVEL.put(15, 27 * 64 + 0);
}
public InventoryFillerCommand() { public InventoryFillerCommand() {
super("inventoryfill"); super("inventoryfill");
} }
@@ -21,8 +73,116 @@ public class InventoryFillerCommand extends SWCommand {
if (!inventoryFill) { if (!inventoryFill) {
SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("INVENTORY_FILL_ENABLE", player)); SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("INVENTORY_FILL_ENABLE", player));
BauSystem.MESSAGE.send("INVENTORY_FILL_INFO", player); BauSystem.MESSAGE.send("INVENTORY_FILL_INFO", player);
}else { } else {
SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("INVENTORY_FILL_DISABLE", player)); SWUtils.sendToActionbar(player, BauSystem.MESSAGE.parse("INVENTORY_FILL_DISABLE", player));
} }
} }
@Register("gui")
public void gui(Player player) {
SWInventory inventory = new SWInventory(player, 18, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_NAME", player));
inventory.setItem(0, new SWItem(Material.REDSTONE, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 0)).setAmount(1));
inventory.setItem(1, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 1)).setAmount(1));
inventory.setItem(2, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 2)).setAmount(2));
inventory.setItem(3, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 3)).setAmount(3));
inventory.setItem(4, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 4)).setAmount(4));
inventory.setItem(5, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 5)).setAmount(5));
inventory.setItem(6, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 6)).setAmount(6));
inventory.setItem(7, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 7)).setAmount(7));
inventory.setItem(8, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 8)).setAmount(8));
inventory.setItem(9, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 9)).setAmount(9));
inventory.setItem(10, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 10)).setAmount(10));
inventory.setItem(11, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 11)).setAmount(11));
inventory.setItem(12, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 12)).setAmount(12));
inventory.setItem(13, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 13)).setAmount(13));
inventory.setItem(14, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 14)).setAmount(14));
inventory.setItem(15, new SWItem(Material.REDSTONE_TORCH, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_POWER", player, 15)).setAmount(15));
inventory.setItem(17, new SWItem(Material.TNT, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_TNT", player)));
for (int i = 0; i < 16; i++) {
inventory.setEventCallback(i, inventoryClickEvent -> {
selectInventoryType(player, inventoryClickEvent.getCurrentItem().getItemMeta().getDisplayName(), Material.DANDELION, POWER_TO_FILLLEVEL.get(inventoryClickEvent.getCurrentItem().getAmount()));
});
}
inventory.setEventCallback(17, inventoryClickEvent -> {
selectInventoryType(player, inventoryClickEvent.getCurrentItem().getItemMeta().getDisplayName(), Material.TNT, POWER_TO_FILLLEVEL.get(15));
});
inventory.open();
}
private final Material[] SHULKER_BOX_MATERIALS = new Material[]{
Material.SHULKER_BOX,
Material.WHITE_SHULKER_BOX,
Material.LIGHT_GRAY_SHULKER_BOX,
Material.GRAY_SHULKER_BOX,
Material.BLACK_SHULKER_BOX,
Material.BROWN_SHULKER_BOX,
Material.RED_SHULKER_BOX,
Material.ORANGE_SHULKER_BOX,
Material.YELLOW_SHULKER_BOX,
Material.LIME_SHULKER_BOX,
Material.GREEN_SHULKER_BOX,
Material.CYAN_SHULKER_BOX,
Material.LIGHT_BLUE_SHULKER_BOX,
Material.BLUE_SHULKER_BOX,
Material.PURPLE_SHULKER_BOX,
Material.MAGENTA_SHULKER_BOX,
Material.PINK_SHULKER_BOX
};
private void selectInventoryType(Player player, String name, Material material, int count) {
ItemStack[] itemStacks = new ItemStack[27];
int index = 0;
int amount = count;
while (amount > 0) {
ItemStack stack;
if (amount > 64) {
stack = new ItemStack(material, 64);
amount -= 64;
} else {
stack = new ItemStack(material, amount);
amount = 0;
}
itemStacks[index++] = stack;
}
SWInventory inventory = new SWInventory(player, 27, BauSystem.MESSAGE.parse("INVENTORY_FILL_GUI_NAME", player));
int i = 0;
for (Material type : SHULKER_BOX_MATERIALS) {
inventory.setItemEvent(i++, generateFilledInventory(name, type, itemStacks), inventoryClickEvent -> {
SWUtils.giveItemToPlayer(player, inventoryClickEvent.getCurrentItem());
});
}
inventory.setItemEvent(27 - 6, generateFilledInventory(name, Material.CHEST, itemStacks), inventoryClickEvent -> {
SWUtils.giveItemToPlayer(player, inventoryClickEvent.getCurrentItem());
});
inventory.setItemEvent(27 - 4, generateFilledInventory(name, Material.BARREL, itemStacks), inventoryClickEvent -> {
SWUtils.giveItemToPlayer(player, inventoryClickEvent.getCurrentItem());
});
inventory.open();
}
private ItemStack generateFilledInventory(String name, Material material, ItemStack[] itemStacks) {
ItemStack itemStack = new ItemStack(material);
BlockStateMeta meta = (BlockStateMeta) itemStack.getItemMeta();
BlockState state = meta.getBlockState();
if (state instanceof ShulkerBox box) {
box.getInventory().setContents(itemStacks);
box.update();
meta.setBlockState(box);
} else if (state instanceof Chest chest) {
chest.getInventory().setContents(itemStacks);
chest.update();
meta.setBlockState(chest);
} else if (state instanceof Barrel barrel) {
barrel.getInventory().setContents(itemStacks);
barrel.update();
meta.setBlockState(barrel);
}
meta.setDisplayName(name);
itemStack.setItemMeta(meta);
return itemStack;
}
} }
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.killchecker; package de.steamwar.bausystem.features.killchecker;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.killchecker; package de.steamwar.bausystem.features.killchecker;
@@ -38,7 +38,6 @@ import org.bukkit.event.player.PlayerQuitEvent;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set;
@Linked @Linked
public class KillcheckerCommand extends SWCommand implements Listener { public class KillcheckerCommand extends SWCommand implements Listener {
@@ -57,6 +56,10 @@ public class KillcheckerCommand extends SWCommand implements Listener {
@Register(value = "enable", description = "KILLCHECKER_HELP_ENABLE") @Register(value = "enable", description = "KILLCHECKER_HELP_ENABLE")
public void genericCommand(@Validator Player player, @OptionalValue("-outline") @StaticValue(value = {"-area", "-outline"}, allowISE = true) boolean onlyOutline) { public void genericCommand(@Validator Player player, @OptionalValue("-outline") @StaticValue(value = {"-area", "-outline"}, allowISE = true) boolean onlyOutline) {
Region region = Region.getRegion(player.getLocation()); Region region = Region.getRegion(player.getLocation());
if (region.getBuildArea().isEmpty()) {
BauSystem.MESSAGE.send("KILLCHECKER_NO_BUILD", player);
return;
}
KillcheckerVisualizer killcheckerVisualizer = visualizers.computeIfAbsent(region, region1 -> new KillcheckerVisualizer(region1, bossBarService)); KillcheckerVisualizer killcheckerVisualizer = visualizers.computeIfAbsent(region, region1 -> new KillcheckerVisualizer(region1, bossBarService));
killcheckerVisualizer.recalc(); killcheckerVisualizer.recalc();
killcheckerVisualizer.show(player, onlyOutline); killcheckerVisualizer.show(player, onlyOutline);
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.killchecker; package de.steamwar.bausystem.features.killchecker;
@@ -22,13 +22,11 @@ package de.steamwar.bausystem.features.killchecker;
import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Point;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.region.utils.RegionExtensionType;
import de.steamwar.bausystem.region.utils.RegionType;
import de.steamwar.bausystem.utils.bossbar.BauSystemBossbar; import de.steamwar.bausystem.utils.bossbar.BauSystemBossbar;
import de.steamwar.bausystem.utils.bossbar.BossBarService; import de.steamwar.bausystem.utils.bossbar.BossBarService;
import de.steamwar.entity.RBlockDisplay;
import de.steamwar.entity.REntity; import de.steamwar.entity.REntity;
import de.steamwar.entity.REntityServer; import de.steamwar.entity.REntityServer;
import de.steamwar.entity.RFallingBlockEntity;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
@@ -75,8 +73,8 @@ public class KillcheckerVisualizer {
public KillcheckerVisualizer(Region region, BossBarService bossBarService) { public KillcheckerVisualizer(Region region, BossBarService bossBarService) {
this.region = region; this.region = region;
this.minPoint = region.getMinPoint(RegionType.BUILD, RegionExtensionType.NORMAL); this.minPoint = region.getBuildArea().getMinPoint(false);
this.maxPoint = region.getMaxPoint(RegionType.BUILD, RegionExtensionType.NORMAL); this.maxPoint = region.getBuildArea().getMaxPoint(false);
yArea = (maxPoint.getX() - minPoint.getX()) * (maxPoint.getZ() - minPoint.getZ()); yArea = (maxPoint.getX() - minPoint.getX()) * (maxPoint.getZ() - minPoint.getZ());
zArea = (maxPoint.getX() - minPoint.getX()) * (maxPoint.getY() - minPoint.getY()); zArea = (maxPoint.getX() - minPoint.getX()) * (maxPoint.getY() - minPoint.getY());
@@ -106,7 +104,9 @@ public class KillcheckerVisualizer {
Block block = WORLD.getBlockAt(x, y, z); Block block = WORLD.getBlockAt(x, y, z);
if (block.getType().isAir()) continue; if (block.getType().isAir()) continue;
String name = block.getType().name(); String name = block.getType().name();
if (!name.endsWith("_WOOL") && !name.endsWith("_STAINED_GLASS") && !name.endsWith("_CONCRETE") && !name.endsWith("_TERRACOTTA")) continue; if (!name.endsWith("_WOOL") && !name.endsWith("_STAINED_GLASS") && !name.endsWith("_CONCRETE") && !name.endsWith("_TERRACOTTA")) {
continue;
}
if (name.equals("_GLAZED_TERRACOTTA")) continue; if (name.equals("_GLAZED_TERRACOTTA")) continue;
Cuboid cuboid = create(block.getType(), x, y, z); Cuboid cuboid = create(block.getType(), x, y, z);
cuboids.add(cuboid); cuboids.add(cuboid);
@@ -285,11 +285,13 @@ public class KillcheckerVisualizer {
} }
kill.forEach((point, count) -> { kill.forEach((point, count) -> {
if (rEntities.containsKey(point)) { if (rEntities.containsKey(point)) {
if (killCount.get(point) == count && outlinePoints.contains(point) == outlinePointsCacheLast.contains(point)) return; if (killCount.get(point) == count && outlinePoints.contains(point) == outlinePointsCacheLast.contains(point)) {
return;
}
rEntities.get(point).die(); rEntities.get(point).die();
} }
RFallingBlockEntity entity = new RFallingBlockEntity(outlinePoints.contains(point) ? outline : inner, point.toLocation(WORLD, 0.5, 0, 0.5), MATERIALS[Math.min(count - 1, MATERIALS.length) - 1]); RBlockDisplay entity = new RBlockDisplay(outlinePoints.contains(point) ? outline : inner, point.toLocation(WORLD, 0.5, 0, 0.5));
entity.setNoGravity(true); entity.setBlock(MATERIALS[Math.min(count - 1, MATERIALS.length) - 1].createBlockData());
rEntities.put(point, entity); rEntities.put(point, entity);
if (outlinePoints.contains(point)) outlinePointsCache.add(point); if (outlinePoints.contains(point)) outlinePointsCache.add(point);
killCount.put(point, count); killCount.put(point, count);
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.loader; package de.steamwar.bausystem.features.loader;
@@ -26,6 +26,7 @@ import de.steamwar.bausystem.features.loader.elements.LoaderInteractionElement;
import de.steamwar.bausystem.features.loader.elements.impl.LoaderTNT; import de.steamwar.bausystem.features.loader.elements.impl.LoaderTNT;
import de.steamwar.bausystem.features.loader.elements.impl.LoaderWait; import de.steamwar.bausystem.features.loader.elements.impl.LoaderWait;
import de.steamwar.bausystem.shared.EnumDisplay; import de.steamwar.bausystem.shared.EnumDisplay;
import de.steamwar.core.SWPlayer;
import de.steamwar.inventory.SWAnvilInv; import de.steamwar.inventory.SWAnvilInv;
import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWItem;
import de.steamwar.inventory.SWListInv; import de.steamwar.inventory.SWListInv;
@@ -40,21 +41,17 @@ import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
public class Loader implements Listener { public class Loader implements Listener, SWPlayer.Component {
private static final Map<Player, Loader> LOADER_MAP = new HashMap<>();
public static Loader getLoader(Player player) { public static Loader getLoader(Player player) {
return LOADER_MAP.get(player); return SWPlayer.of(player).getComponent(Loader.class).orElse(null);
} }
public static void newLoader(Player player) { public static void newLoader(Player player) {
LOADER_MAP.put(player, new Loader(player)); SWPlayer.of(player).setComponent(new Loader(player));
} }
private final Player p; private final Player p;
@@ -73,8 +70,8 @@ public class Loader implements Listener {
Bukkit.getPluginManager().registerEvents(this, BauSystem.getInstance()); Bukkit.getPluginManager().registerEvents(this, BauSystem.getInstance());
BauSystem.runTaskTimer(BauSystem.getInstance(), () -> { BauSystem.runTaskTimer(BauSystem.getInstance(), () -> {
if (stage != Stage.RUNNING) return; if (stage != Stage.RUNNING && stage != Stage.SINGLE) return;
if(!Permission.BUILD.hasPermission(p)) return; if (!Permission.BUILD.hasPermission(p)) return;
if (waitTime > 0) { if (waitTime > 0) {
waitTime--; waitTime--;
return; return;
@@ -145,17 +142,20 @@ public class Loader implements Listener {
recorder = null; recorder = null;
} }
elements.clear(); elements.clear();
LOADER_MAP.remove(p); SWPlayer.of(p).removeComponent(Loader.class);
} }
public boolean setTicksBetweenShots(int delay) { public boolean setTicksBetweenShots(int delay) {
if (elements.size() == 0) return false; if (elements.isEmpty()) return false;
LoaderElement loaderElement = elements.get(elements.size() - 1); LoaderElement loaderElement = elements.get(elements.size() - 1);
if (loaderElement instanceof LoaderWait) { if (loaderElement instanceof LoaderWait) {
((LoaderWait) loaderElement).setDelay(delay); ((LoaderWait) loaderElement).setDelay(delay);
return true; } else {
LoaderWait loaderWait = new LoaderWait(delay);
elements.add(loaderWait);
pause();
} }
return false; return true;
} }
public void setTicksBetweenBlocks(int delay) { public void setTicksBetweenBlocks(int delay) {
@@ -213,7 +213,8 @@ public class Loader implements Listener {
}; };
updateRunnable.run(); updateRunnable.run();
SWListInv<LoaderElement> swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("LOADER_GUI_TITLE", p), false, list, (clickType, loaderElement) -> {}); SWListInv<LoaderElement> swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("LOADER_GUI_TITLE", p), false, list, (clickType, loaderElement) -> {
});
swListInv.setCallback((clickType, entry) -> entry.click(p, () -> { swListInv.setCallback((clickType, entry) -> entry.click(p, () -> {
updateRunnable.run(); updateRunnable.run();
swListInv.open(); swListInv.open();
@@ -363,7 +364,9 @@ public class Loader implements Listener {
public static int LENGTH = SettingsSorting.values().length; public static int LENGTH = SettingsSorting.values().length;
public abstract Material getMaterial(); public abstract Material getMaterial();
public abstract String getName(); public abstract String getName();
public abstract boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next); public abstract boolean shouldShow(LoaderElement previous, LoaderElement current, LoaderElement next);
} }
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.loader; package de.steamwar.bausystem.features.loader;
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.loader; package de.steamwar.bausystem.features.loader;
@@ -44,7 +44,6 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Consumer;
public class LoaderRecorder implements Listener { public class LoaderRecorder implements Listener {
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.loader; package de.steamwar.bausystem.features.loader;
@@ -41,7 +41,7 @@ public class LoaderScoreboardElement implements ScoreboardElement {
@Override @Override
public String get(Region region, Player p) { public String get(Region region, Player p) {
if(!Permission.BUILD.hasPermission(p)) return null; if (!Permission.BUILD.hasPermission(p)) return null;
Loader loader = Loader.getLoader(p); Loader loader = Loader.getLoader(p);
if (loader == null) return null; if (loader == null) return null;
if (loader.getStage() == Loader.Stage.RUNNING) { if (loader.getStage() == Loader.Stage.RUNNING) {
@@ -1,20 +1,20 @@
/* /*
* This file is a part of the SteamWar software. * This file is a part of the SteamWar software.
* *
* Copyright (C) 2023 SteamWar.de-Serverteam * Copyright (C) 2025 SteamWar.de-Serverteam
* *
* This program is free software: you can redistribute it and/or modify * 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 * 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 * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details. * GNU Affero General Public License for more details.
* *
* You should have received a copy of the GNU Affero General Public License * 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/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package de.steamwar.bausystem.features.loader.elements; package de.steamwar.bausystem.features.loader.elements;
@@ -26,6 +26,8 @@ import java.util.function.Consumer;
public interface LoaderElement { public interface LoaderElement {
SWItem menu(Player player); SWItem menu(Player player);
void execute(Consumer<Long> delay); void execute(Consumer<Long> delay);
void click(Player player, Runnable backAction); void click(Player player, Runnable backAction);
} }

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