65 Commits
Author SHA1 Message Date
Intelli 58f4a76d75 CoreProtect v22.0 release 2023-07-31 18:39:57 -06:00
Intelli a46deeb6ba Fixed typo in API documentation 2023-07-28 15:42:40 -06:00
Jeff P 7fd50a0507 Add method override for FAWE logging (#417) 2023-07-24 13:48:42 -06:00
Intelli 9e1d5af97d Fixed NullPointerException while logging container transactions 2023-07-19 17:12:00 -06:00
ianiiaannn 4cce566e37 Update Traditional Chinese translation (#392)
* Update Phrase to make strings correctly split by fullwidth colons (U+FF1A)

* Fix Traditional Chinese translation

* Replace U+FF1A with `: `
2023-07-19 14:35:25 -06:00
Intelli 703c36f356 Added automatic forward compatibility for extended logging of new wood types 2023-07-17 18:41:05 -06:00
Intelli 1dd293c5a4 Renamed "mysql-maximum-pool-size" to "maximum-pool-size" 2023-07-17 17:33:57 -06:00
1331b8d0c5 Added hidden "unknown-user" logging option (default: false) (#397)
* Allow unknown user logging (attempt to patch a bug of tnt splashing blocks and it not being logged)

* Changed "unknown-logging" to be hidden (default: false)

* Update BlockFormListener.java

---------

Co-authored-by: Radiant <i.like.using.discord@gmail.com>
Co-authored-by: Intelli <6790859+Intelli@users.noreply.github.com>
2023-07-17 17:25:35 -06:00
violetcandIntelli 2476aa2ea8 Utilize internal cache in StructureGrowthProcess (#371)
* Use whoPlacedCache

* Still perform database lookup if cache is empty

---------

Co-authored-by: Intelli <6790859+Intelli@users.noreply.github.com>
2023-07-17 16:55:16 -06:00
Keno MedenbachandIntelli 6045799fea Make MySQL maximumPoolSize configurable (#411)
* Make MySQL maximumPoolSize configurable

* Correctly assign default value to mysql-maximum-pool-size

---------

Co-authored-by: Intelli <6790859+Intelli@users.noreply.github.com>
2023-07-17 16:47:52 -06:00
Intelli 342fadd0f6 Fixed invalid config values defaulting to zero rather than default value 2023-07-17 16:42:12 -06:00
Intelli e81c84671c Update CONTRIBUTING.md 2023-07-15 12:45:59 -06:00
Intelli e501046073 Fixed sign edits being logged even if no changes were made 2023-07-14 15:27:30 -06:00
Intelli c6a0f20fff Improved logic for logging brushing of suspicious blocks 2023-07-14 14:59:18 -06:00
Intelli 05aebe7544 Added logging for brushing suspicious blocks (implement #409) 2023-07-14 14:29:36 -06:00
Intelli 36ad62007f Added missing break keywords in BukkitAdapter 2023-07-13 19:44:04 -06:00
Intelli bdde2d36be Fixed signs using SpigotAdapter instead of BukkitAdapter 2023-07-13 19:41:51 -06:00
Intelli f32a3e7c5e Fixed Folia teleportation not using adapter 2023-07-13 19:27:53 -06:00
Intelli c7cf035564 Check that CampfireStartEvent exists before registering 2023-07-13 19:27:03 -06:00
Intelli d4997cca60 Added extended support for new cherry/bamboo blocks 2023-07-13 19:10:48 -06:00
Intelli 355eea1cf9 @kugge: Fixed Folia teleportation in unloaded chunks (#368) 2023-07-13 18:35:49 -06:00
Intelli d7b76135c8 Reduced MySQL connection lifetime from 5m to 1m (fix #362) 2023-07-13 18:07:15 -06:00
Intelli 1a06e6a6bf Made PreLogEvent cancellable (implements #325) 2023-07-13 17:55:00 -06:00
Intelli e7a6f21d88 Added inventory transaction logging for placing items on a campfire (#357) 2023-07-13 17:28:14 -06:00
Intelli 5973206bb3 Added interaction logging for chiseled bookshelves 2023-07-13 15:51:04 -06:00
Intelli 1e007c98a4 Cleanup 2023-07-13 14:43:09 -06:00
Intelli df9b478be7 Split up MySQL upgrade query to resolve issues from interrupted queries 2023-07-13 13:56:27 -06:00
Intelli 054beb700b Fixed ConcurrentModificationException in ProjectileLaunchEvent 2023-07-13 13:49:13 -06:00
Intelli 47a000a57f Added support for hanging signs 2023-07-13 13:06:47 -06:00
Intelli cde18dc529 Update formatting 2023-07-12 16:33:50 -06:00
asdanjer d200616fe1 Improved performance of ItemStack merging (fix #385) 2023-07-12 16:29:22 -06:00
Intelli e0d65453b6 Added logging for destruction of suspicious sand/gravel 2023-07-12 16:26:38 -06:00
Intelli d414db1c0b Added item mapping for torchflower seeds 2023-07-12 15:58:47 -06:00
Intelli b0469924a7 Build project against Folia 1.20.1 2023-07-12 15:19:47 -06:00
Intelli 4e43a42662 Added logging and rollback support for double sided signs 2023-07-12 15:17:14 -06:00
Intelli 7e97e12969 Added inventory transaction logging for chiseled bookshelves 2023-07-08 14:55:24 -06:00
Intelli d7d53bf9e2 Fixed NullPointerException while performing rollbacks 2023-07-08 13:57:36 -06:00
Intelli b9309482cf Fix config typo 2023-07-08 13:52:00 -06:00
Intelli 410eba5559 Fixed Folia detection 2023-06-19 18:59:58 -06:00
ByteExceptionMandIntelli 814ae4d9d5 Fixed NullPointerException when breaking/placing a spawner (#380)
* fix: Make Util#getEntityId parameter nullable

* Removed JetBrains Nullable

* Updated to follow contribution guidelines

---------

Co-authored-by: Intelli <6790859+Intelli@users.noreply.github.com>
2023-06-13 17:14:09 -06:00
Intelli d64ec8d911 Updated HikariCP dependency from 4.0.3 to 5.0.1 2023-05-21 15:42:28 -06:00
Intelli 5d90f25211 Fixed logging and lookup issues after performing "/co reload" (fix #366) 2023-05-05 16:47:56 -06:00
Intelli 7825f61e45 Fixed NullPointerException when processing transactions for dyed armor 2023-04-09 13:19:02 -06:00
Intelli 7e49c95832 Fixed InventoryClickEvent exception when using Magma 2023-04-08 17:38:31 -06:00
Intelli 4b9e69c40f Fixed tree/mushroom growth not respecting config file when using bonemeal (...)
Fixed mushroom growth logging invalid data when using bonemeal
2023-04-06 13:55:57 -06:00
Sofiane H. Djerbi f2934fd876 Fix Folia Teleportation (#349) 2023-04-03 18:15:16 -06:00
Intelli f706bcf38e Added repeating task support to Scheduler 2023-03-31 16:43:27 -06:00
Intelli fe6023450c Added missing methods to WorldEditBlockState 2023-03-29 19:11:48 -06:00
Intelli ace870b930 Fixed item frame & armor stand logging under Folia 2023-03-24 18:10:11 -06:00
Intelli 7170e29452 Added support for Folia 2023-03-23 19:45:44 -06:00
Intelli 29345e2fb1 Use HumanEntity instead of Player when logging item crafting (fix #336) 2023-03-13 13:32:22 -06:00
Amir a22db638fa Updated examples in commands.md (#323)
When I first looked at the documentation, I did not recognize that you can enter such values ​​in the <user> field. Thought I needed to clarify that this is possible.
2023-02-01 12:42:00 -07:00
Intelli de3c326203 Corrected Spanish translation 2023-01-12 12:51:42 -07:00
Intelli acb71a83a2 Fixed performLookup in API not returning valid block data (#308) 2023-01-03 12:17:09 -07:00
Intelli 3ffed30b1e Updated exclusions (Maven/Gradle) 2022-12-21 19:56:32 -07:00
Intelli 5d6fd60d40 Added tooltips to lookups that display item names and enchantments (#67) 2022-12-21 19:11:34 -07:00
Intelli 20710a00de Added legacy component serialization support for signs in Paper 1.17+ 2022-12-20 14:37:22 -07:00
Intelli 5eabee6504 Added logging for dragon egg teleportation (#303) 2022-12-19 16:05:02 -07:00
Intelli 97eb0d777b Fixed incorrect amounts when dispensing items in Paper 1.19.3+ 2022-12-19 14:57:46 -07:00
Intelli 61847f2f8d Changed minimum required version to Spigot 1.15 2022-12-15 16:45:24 -07:00
Intelli 12f2000085 Fixed sign lookups displaying incorrectly when containing hex colors 2022-12-15 16:06:41 -07:00
Intelli 66e32c02bf Added player interaction logging for jukeboxes 2022-12-15 15:36:19 -07:00
Intelli 9da1343f7f Add logging and rollback support for jukebox transactions 2022-12-15 15:25:53 -07:00
Intelli 272ecae858 Fixed networking API connections being reset when reloading config
Credit: https://github.com/PlayPro/CoreProtect/pull/211/files#diff-1342ad937bb4d40012db93a64c02a41e92f2d6f35b069435f464af03aca69b00 (@vacla)
2022-12-10 14:12:33 -07:00
Intelli 3db2159292 Updated versions listed in README 2022-12-09 18:51:04 -07:00
87 changed files with 3136 additions and 1597 deletions

No files matched your search

+2 -2
View File
@@ -10,7 +10,7 @@ Please note we have a code of conduct, please follow it in all your interactions
- For consistency, please only use spaces for indentation.
- Use descriptiveCamelCase for variable/method names. Names containing underscore or abbreviations should be changed.
- Restrict changes in a commit to a single event or section of code (e.g. refactor BlockBreakEvent and BlockPlaceEvent in separate commits)
- Attempt to keep the amount of code modified in a single commit small and readable.
- Attempt to keep the amount of code modified in a single pull request small and readable.
- Please utilize [SonarLint](https://www.sonarlint.org) in your IDE. Contributions are automatically analyzed.
- When adding new functionality, please also be sure to update the documentation as well.
- Use common sense. If you have a suggestion for a contribution guideline, post it on Discord.
@@ -148,4 +148,4 @@ at [https://www.contributor-covenant.org/translations][translations].
[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations
[translations]: https://www.contributor-covenant.org/translations
+3 -3
View File
@@ -11,14 +11,14 @@ CoreProtect
CoreProtect is a blazing fast data logging and anti-griefing tool for Minecraft servers.
For a detailed description of the plugin, please visit [spigotmc.org/resources/coreprotect.8631](https://www.spigotmc.org/resources/coreprotect.8631/).
For a detailed description of the plugin, please visit [coreprotect.net](https://coreprotect.net).
| Quick Links | |
| --- | --- |
| CoreProtect Discord: | [discord.gg/b4DZ4jy](https://discord.gg/b4DZ4jy) |
| CoreProtect Patreon: | [patreon.com/coreprotect](https://www.patreon.com/coreprotect) |
| CoreProtect Documentation: | [docs.coreprotect.net](https://docs.coreprotect.net) |
| Downloads for MC 1.14 - 1.18: | [spigotmc.org/resources/coreprotect.8631](https://www.spigotmc.org/resources/coreprotect.8631/) |
| Downloads for MC 1.14 - 1.20: | [coreprotect.net/latest](https://coreprotect.net/latest/) |
| Downloads for MC 1.8 - 1.12: | [coreprotect.net/legacy](https://coreprotect.net/legacy/) |
bStats
@@ -41,7 +41,7 @@ Maven
<dependency>
<groupId>net.coreprotect</groupId>
<artifactId>coreprotect</artifactId>
<version>21.0</version>
<version>22.0</version>
<scope>provided</scope>
</dependency>
```
+7 -3
View File
@@ -7,7 +7,7 @@ plugins {
}
group = 'net.coreprotect'
String projectVersion = '21.3'
String projectVersion = '22.0'
String projectBranch = ''
version = projectVersion // `version` might be modified, we don't always want that (e.g. plugin.yml)
description = 'Provides block protection for your server.'
@@ -34,9 +34,9 @@ dependencies {
compileOnly('com.sk89q.worldedit:worldedit-bukkit:7.0.0-SNAPSHOT') {
exclude group: 'org.bukkit'
}
compileOnly 'io.papermc.paper:paper-api:1.19-R0.1-SNAPSHOT'
compileOnly 'dev.folia:folia-api:1.20.1-R0.1-SNAPSHOT'
implementation 'org.bstats:bstats-bukkit-lite:1.8'
implementation 'com.zaxxer:HikariCP:4.0.3'
implementation 'com.zaxxer:HikariCP:5.0.1'
}
jar {
@@ -52,6 +52,10 @@ shadowJar {
// #toString because #getGroup technically returns an Object
relocate('org.bstats', project.group.toString())
relocate('com.zaxxer', project.group.toString())
exclude(dependency('com.google.code.gson:.*'))
exclude(dependency('org.intellij:.*'))
exclude(dependency('org.jetbrains:.*'))
exclude(dependency('org.slf4j:.*'))
}
archiveClassifier.set(null)
}
+6 -6
View File
@@ -203,7 +203,7 @@ This will parse results from a lookup. You'll then be able to view the following
* **getZ():** Get the Z coordinate of the block.
* **getType():** Get the Material of the block.
* **getBlockData():** Get the BlockData of the block.
* **getPlayer():** Get the username as a string..
* **getPlayer():** Get the username as a string.
* **getTimestamp():** Get the time of the action.
* **getActionId():** Get the action ID. (0=removed, 1=placed, 2=interaction)
* **getActionString():** Get the action as a string. (Removal, Placement, Interaction)
@@ -296,7 +296,7 @@ if (CoreProtect!=null){ //Ensure we have access to the API
int x = parseResult.getX();
int y = parseResult.getY();
int z = parseResult.getZ();
//...
// ...
}
}
}
@@ -316,7 +316,7 @@ if (CoreProtect!=null){ //Ensure we have access to the API
int x = result.getX();
int y = result.getY();
int z = result.getZ();
//...
// ...
}
}
}
@@ -335,7 +335,7 @@ if (CoreProtect!=null){ //Ensure we have access to the API
int x = result.getX();
int y = result.getY();
int z = result.getZ();
//...
// ...
}
}
}
@@ -358,7 +358,7 @@ public void run() {
int x = result.getX();
int y = result.getY();
int z = result.getZ();
//...
// ...
}
}
}
@@ -396,7 +396,7 @@ if (CoreProtect!=null){ //Ensure we have access to the API
int x = parseResult.getX();
int y = parseResult.getY();
int z = parseResult.getZ();
//...
// ...
}
}
}
+6 -6
View File
@@ -203,7 +203,7 @@ This will parse results from a lookup. You'll then be able to view the following
* **getZ():** Get the Z coordinate of the block.
* **getType():** Get the Material of the block.
* **getBlockData():** Get the BlockData of the block.
* **getPlayer():** Get the username as a string..
* **getPlayer():** Get the username as a string.
* **getTimestamp():** Get the time of the action.
* **getActionId():** Get the action ID. (0=removed, 1=placed, 2=interaction)
* **getActionString():** Get the action as a string. (Removal, Placement, Interaction)
@@ -296,7 +296,7 @@ if (CoreProtect!=null){ //Ensure we have access to the API
int x = parseResult.getX();
int y = parseResult.getY();
int z = parseResult.getZ();
//...
// ...
}
}
}
@@ -316,7 +316,7 @@ if (CoreProtect!=null){ //Ensure we have access to the API
int x = result.getX();
int y = result.getY();
int z = result.getZ();
//...
// ...
}
}
}
@@ -335,7 +335,7 @@ if (CoreProtect!=null){ //Ensure we have access to the API
int x = result.getX();
int y = result.getY();
int z = result.getZ();
//...
// ...
}
}
}
@@ -358,7 +358,7 @@ public void run() {
int x = result.getX();
int y = result.getY();
int z = result.getZ();
//...
// ...
}
}
}
@@ -396,7 +396,7 @@ if (CoreProtect!=null){ //Ensure we have access to the API
int x = parseResult.getX();
int y = parseResult.getY();
int z = parseResult.getZ();
//...
// ...
}
}
}
+9 -8
View File
@@ -120,11 +120,12 @@ void performPurge(int time)
#### CoreProtectPreLogEvent
Fired when a CoreProtect logger is about to log an action. Not cancellable.
Fired when a CoreProtect logger is about to log an action. Cancellable.
| Property | Description | Mutable |
| --- | --- | --- |
| User | The name of the user under which this action will be logged. | Yes |
| Cancelled | If cancelled, the action won't be logged to the database. | Yes |
---
@@ -224,7 +225,7 @@ This will parse results from a lookup. You'll then be able to view the following
* **getZ():** Get the Z coordinate of the block.
* **getType():** Get the Material of the block.
* **getBlockData():** Get the BlockData of the block.
* **getPlayer():** Get the username as a string..
* **getPlayer():** Get the username as a string.
* **getTimestamp():** Get the time of the action.
* **getActionId():** Get the action ID. (0=removed, 1=placed, 2=interaction)
* **getActionString():** Get the action as a string. (Removal, Placement, Interaction)
@@ -317,7 +318,7 @@ if (CoreProtect != null){ // Ensure we have access to the API
int x = parseResult.getX();
int y = parseResult.getY();
int z = parseResult.getZ();
//...
// ...
}
}
}
@@ -337,7 +338,7 @@ if (CoreProtect != null){ // Ensure we have access to the API
int x = result.getX();
int y = result.getY();
int z = result.getZ();
//...
// ...
}
}
}
@@ -356,7 +357,7 @@ if (CoreProtect != null){ // Ensure we have access to the API
int x = result.getX();
int y = result.getY();
int z = result.getZ();
//...
// ...
}
}
}
@@ -379,7 +380,7 @@ public void run() {
int x = result.getX();
int y = result.getY();
int z = result.getZ();
//...
// ...
}
}
}
@@ -429,7 +430,7 @@ if (CoreProtect != null){ // Ensure we have access to the API
int x = parseResult.getX();
int y = parseResult.getY();
int z = parseResult.getZ();
//...
// ...
}
}
}
@@ -449,7 +450,7 @@ if (CoreProtect != null){ // Ensure we have access to the API
int y = parseResult.getY();
int z = parseResult.getZ();
int action = parseResult.getActionId(); // 0 = logout, 1 = login
//...
// ...
}
}
}
+2 -1
View File
@@ -133,6 +133,7 @@ ___
* Example: `u:Notch`
* Example: `u:Notch,Intelli`
* Example: `u:#fire,#tnt,#creeper,#explosion`
---
@@ -276,4 +277,4 @@ Lookup commands are generally the same as rollback commands. The primary differe
* `/co lookup u:Notch a:username`
*(lookup previous usernames used by Notch)*
___
___
+2 -2
View File
@@ -24,7 +24,7 @@ DATABASE_LOCKED_4: "Desactivando el bloqueo en la base de datos resultaría en u
DATABASE_UNREACHABLE: "No se pudo alcanzar la base de datos. Descartando datos y apagando."
DEVELOPMENT_BRANCH: "Rama de desarrollo detectada, saltando scripts de parche."
DIRT_BLOCK: "Se ha colocado un bloque de tierra debajo de tí."
DISABLE_SUCCESS: "¡Se ha desactivado extosamente {0}!"
DISABLE_SUCCESS: "¡Se ha desactivado exitosamente {0}!"
ENABLE_FAILED: "Imposible de iniciar {0}."
ENABLE_SUCCESS: "¡{0} ha sido exitosamente activado!"
ENJOY_COREPROTECT: "¿Disfrutando {0}? ¡Ingrese a nuestro Discord!"
@@ -198,4 +198,4 @@ USING_SQLITE: "Usando SQLite para el guardado de información."
VALID_DONATION_KEY: "Clave de donación válida."
VERSION_NOTICE: "Versión {0} está disponible."
VERSION_REQUIRED: "{0} {1} o súperior es requerida."
WORLD_NOT_FOUND: "Mundo \"{0}\" inexistente."
WORLD_NOT_FOUND: "Mundo \"{0}\" inexistente."
+93 -93
View File
@@ -1,8 +1,8 @@
# CoreProtect Language File (zh-TW)
# Translators: whitebear13579, Flandre_tw
# Translators: whitebear13579, flandretw, ianiiaannn
ACTION_NOT_SUPPORTED: "此指令不支援該操作。"
AMOUNT_BLOCK: "{0} 個{方塊|方塊}"
ACTION_NOT_SUPPORTED: "此指令不支援該行為。"
AMOUNT_BLOCK: "{0} 格{方塊|方塊}"
AMOUNT_CHUNK: "{0} 個{區塊|區塊}"
AMOUNT_ENTITY: "{0} 個{實體|實體}"
AMOUNT_ITEM: "{0} 個{物品|物品}"
@@ -10,52 +10,52 @@ API_TEST: "API 測試成功。"
CACHE_ERROR: "警告: 驗證快取 {0} 時出現錯誤。"
CACHE_RELOAD: "正在強制從資料庫中重新載入{鏡像|世界}快取。"
CHECK_CONFIG: "請檢查 config.yml 檔案。"
COMMAND_CONSOLE: "請從控制台運行命令。"
COMMAND_NOT_FOUND: "未知的指令 \"{0}\"。"
COMMAND_CONSOLE: "請從控制台執行此指令。"
COMMAND_NOT_FOUND: "未知的指令「{0}」。"
COMMAND_THROTTLED: "請稍後再試。"
CONSUMER_ERROR: "消費者隊列處理已經 {暫停|繼續}."
CONSUMER_TOGGLED: "消費者隊列處理已 {暫停|繼續}."
CONTAINER_HEADER: "儲存容器變更記錄。"
CONSUMER_ERROR: "消費者隊列處理已經{暫停|繼續}."
CONSUMER_TOGGLED: "消費者隊列處理已{暫停|繼續}."
CONTAINER_HEADER: "儲存容器變更紀錄。"
DATABASE_BUSY: "資料庫繁忙,請稍後再試。"
DATABASE_INDEX_ERROR: "無法驗證資料庫索引。"
DATABASE_LOCKED_1: "資料庫已被鎖定,請等待 15 秒後再試……"
DATABASE_LOCKED_1: "資料庫已被鎖定,請稍後 15 秒後再試……"
DATABASE_LOCKED_2: "資料庫正在使用,請稍後再試一次。"
DATABASE_LOCKED_3: "若要關閉資料庫鎖定功能,請設定 \"database-lock: false\"。"
DATABASE_LOCKED_4: "關閉資料庫鎖定功能,可能導致資料損壞。"
DATABASE_UNREACHABLE: "資料庫無法存取,正在拋棄資料並關閉。"
DEVELOPMENT_BRANCH: "檢測到正在使用開發分支的版本,已跳過使用補丁腳本。"
DATABASE_LOCKED_3: "若要停用資料庫鎖定功能,請設定「database-lock: false」。"
DATABASE_LOCKED_4: "停用資料庫鎖定功能可能導致資料毀損。"
DATABASE_UNREACHABLE: "資料庫無法存取,正在拋棄資料並停用。"
DEVELOPMENT_BRANCH: "檢測到正在使用開發分支的版本,已跳過資料庫版本更新。"
DIRT_BLOCK: "已在你的下方放置了泥土。"
DISABLE_SUCCESS: "執行成功 ! 關閉 {0} !"
DISABLE_SUCCESS: "執行成功!已停用 {0}!"
ENABLE_FAILED: "無法啟用 {0}。"
ENABLE_SUCCESS: "已經成功啟用 {0} !"
ENJOY_COREPROTECT: "喜歡 {0} 嗎 ? 加入我們的 Discord !"
ENABLE_SUCCESS: "已經成功啟用 {0}!"
ENJOY_COREPROTECT: "喜歡 {0} 嗎?加入我們的 Discord!"
FINISHING_CONVERSION: "正在完成資料轉換,請稍候……"
FINISHING_LOGGING: "正在完成資料記錄,請稍候……"
FIRST_VERSION: "初始化資料庫: {0}"
FINISHING_LOGGING: "正在完成紀錄檔處理,請稍候……"
FIRST_VERSION: "資料庫初始化版本: {0}"
GLOBAL_LOOKUP: "請勿指定範圍來進行全面的搜尋。"
GLOBAL_ROLLBACK: "使用 \"{0}\" 來進行全面的{回滾|恢復}。"
HELP_ACTION_1: "將搜尋限制為某個行為。"
GLOBAL_ROLLBACK: "使用「{0}」來進行全面的{回滾|恢復}。"
HELP_ACTION_1: "僅過濾某個行為。"
HELP_ACTION_2: "範例: [a:block], [a:+block], [a:-block] [a:click], [a:container], [a:inventory], [a:item], [a:kill], [a:chat], [a:command], [a:sign], [a:session], [a:username]"
HELP_COMMAND: "顯示該指令的更多資訊。"
HELP_EXCLUDE_1: "排除方塊/玩家"
HELP_EXCLUDE_2: "範例: [e:stone], [e:Notch], [e:stone,Notch]"
HELP_HEADER: "{0} 說明"
HELP_INCLUDE_1: "包括指定的方塊/實體"
HELP_INCLUDE_1: "僅過濾指定的方塊/實體"
HELP_INCLUDE_2: "範例: [i:stone], [i:zombie], [i:stone,wood,bedrock]"
HELP_INSPECT_1: "當檢查器啟用後,你可以執行以下操作:"
HELP_INSPECT_2: "對你欲查詢的方塊點擊左鍵,可以查看方塊放置記錄。"
HELP_INSPECT_3: "對你欲查詢的方塊點擊右鍵,可以查看相鄰方塊破壞記錄。"
HELP_INSPECT_4: "對你欲查詢的位置放置方塊,可以查看放置位置破壞記錄。"
HELP_INSPECT_5: "對你欲查詢的液體中放置方塊,可以查看液體變更記錄。"
HELP_INSPECT_6: "對你欲查詢的門、儲物箱等方塊點擊右鍵,可以查看使用記錄。"
HELP_INSPECT_7: "小提醒: 你可以使用 \"/co i\" 來加快搜尋的速度。"
HELP_INSPECT_COMMAND: "開啟或關閉檢查器。"
HELP_INSPECT_2: "對你欲查詢的方塊點擊左鍵,可以查看方塊放置紀錄。"
HELP_INSPECT_3: "對你欲查詢的方塊點擊右鍵,可以查看相鄰方塊破壞紀錄。"
HELP_INSPECT_4: "對你欲查詢的位置放置方塊,可以查看放置位置破壞紀錄。"
HELP_INSPECT_5: "對你欲查詢的液體中放置方塊,可以查看液體變更紀錄。"
HELP_INSPECT_6: "對你欲查詢的門、儲物箱等方塊點擊右鍵,可以查看使用紀錄。"
HELP_INSPECT_7: "小提醒: 你可以使用「/co i」來快速啟用或停用檢查器。"
HELP_INSPECT_COMMAND: "啟用或停用檢查器。"
HELP_LIST: "顯示所有指令列表。"
HELP_LOOKUP_1: "指令捷徑"
HELP_LOOKUP_2: "在使用檢查器檢查後以便查看日誌。"
HELP_LOOKUP_COMMAND: "進階查詢方塊的資料。"
HELP_NO_INFO: "未找到 \"{0}\" 的相關指令資訊。"
HELP_PARAMETER: "若需查看相關詳細參數資訊,請查閱 \"{0}\"。"
HELP_LOOKUP_COMMAND: "進階查詢方塊資料。"
HELP_NO_INFO: "未找到「{0}」的相關指令資訊。"
HELP_PARAMETER: "若需查看相關詳細參數資訊,請查閱「{0}」。"
HELP_PARAMS_1: "執行{查詢|回滾|恢復}。"
HELP_PARAMS_2: "指定需要{查詢|回滾|恢復}的玩家。"
HELP_PARAMS_3: "指定需要{查詢|回滾|恢復}的時間範圍。"
@@ -63,12 +63,12 @@ HELP_PARAMS_4: "指定限制{查詢|回滾|恢復}的範圍。"
HELP_PARAMS_5: "將{查詢|回滾|恢復}限制在某個行為。"
HELP_PARAMS_6: "在{查詢|回滾|恢復}中指定特定的實體/方塊。"
HELP_PARAMS_7: "從{查詢|回滾|恢復}中排除特定的方塊/玩家。"
HELP_PURGE_1: "刪除了指定時間範圍的資料。"
HELP_PURGE_2: "舉例來說,\"{0}\" 將會刪除超過一個月的所有方塊資料,只保留最近 30 天的資料。"
HELP_PURGE_COMMAND: "刪除舊的方塊資料。"
HELP_PURGE_1: "清除指定時間範圍內的資料。"
HELP_PURGE_2: "舉例來說,「{0}」將會清除超過一個月的所有資料,只保留最近 30 天的資料。"
HELP_PURGE_COMMAND: "清除舊資料。"
HELP_RADIUS_1: "指定半徑範圍。"
HELP_RADIUS_2: "範例: [r:10] (僅會更改你周圍的 10 格方塊)"
HELP_RELOAD_COMMAND: "重新載入配置檔案。"
HELP_RADIUS_2: "範例: [r:10](僅會更改你周圍的 10 格方塊)"
HELP_RELOAD_COMMAND: "重新載入設定檔。"
HELP_RESTORE_COMMAND: "恢復方塊資料。"
HELP_ROLLBACK_COMMAND: "回滾方塊資料。"
HELP_STATUS: "查看插件狀態與版本資訊。"
@@ -78,106 +78,106 @@ HELP_TIME_1: "指定搜尋的時間範圍。"
HELP_TIME_2: "範例: [t:2w,5d,7h,2m,10s], [t:5d2h], [t:2.50h]"
HELP_USER_1: "指定要搜尋的玩家。"
HELP_USER_2: "範例: [u:Notch], [u:Notch,#enderman]"
INCOMPATIBLE_ACTION: "\"{0}\" 不能用於此操作。"
INSPECTOR_ERROR: "已{開啟|關閉}檢查器了。"
INSPECTOR_TOGGLED: "已{開啟|關閉}檢查器。"
INTEGRATION_ERROR: "無法{初始化|關閉} {0} 日誌記錄。"
INTEGRATION_SUCCESS: "{0} 成功記錄{初始化|關閉}。"
INTEGRATION_VERSION: "發現 {0} 版本無效。"
INCOMPATIBLE_ACTION: "「{0}」不能用於此行為。"
INSPECTOR_ERROR: "檢查器已經{啟用|停用}了。"
INSPECTOR_TOGGLED: "已{啟用|停用}檢查器。"
INTEGRATION_ERROR: "無法{初始化|停用}{0}紀錄檔。"
INTEGRATION_SUCCESS: "{0} 紀錄檔已成功{初始化|停用}。"
INTEGRATION_VERSION: "{0} 的版本無效。"
INTERACTIONS_HEADER: "玩家互動"
INVALID_ACTION: "這不是有效的行為。"
INVALID_BRANCH_1: "插件版本無效 (未設定分支)。"
INVALID_BRANCH_2: "若要繼續行為,請將你的項目分之設定為 \"development\"。"
INVALID_BRANCH_3: "執行開發中的插件可能會導致資料損毀。"
INVALID_CONTAINER: "請先檢查有效的容器。"
INVALID_DONATION_KEY: "無效的捐贈金鑰。"
INVALID_INCLUDE: "\"{0}\" 是無效的方塊/實體名稱。"
INVALID_INCLUDE_COMBO: "這是無效的方塊/實體組合。"
INVALID_RADIUS: "請輸入有效的範圍。"
INVALID_SELECTION: "未找到選擇 {0} 的內容。"
INVALID_USERNAME: "\"{0}\" 是無效的玩家名稱。"
INVALID_WORLD: "請指定有效的世界。"
INVALID_ACTION: "此並非有效的行為。"
INVALID_BRANCH_1: "插件版本無效(未設定分支)。"
INVALID_BRANCH_2: "若要繼續,請將分支設定為「development」。"
INVALID_BRANCH_3: "執行開發中的插件版本可能會導致資料損毀。"
INVALID_CONTAINER: "此並非有效的容器。"
INVALID_DONATION_KEY: "無效的贊助金鑰。"
INVALID_INCLUDE: "「{0}」為無效的方塊/實體名稱。"
INVALID_INCLUDE_COMBO: "此為無效的方塊/實體組合。"
INVALID_RADIUS: "此並非有效的範圍。"
INVALID_SELECTION: "「{0}」為無效的選擇範圍。"
INVALID_USERNAME: "「{0}」為無效的使用者名稱。"
INVALID_WORLD: "此並非有效的世界。"
LATEST_VERSION: "最新版本: {0}"
LINK_DISCORD: "Discord: {0}"
LINK_DOWNLOAD: "下載: {0}"
LINK_PATREON: "Patreon: {0}"
LINK_WIKI_BLOCK: "方塊名稱: {0}"
LINK_WIKI_ENTITY: "實體名稱: {0}"
LOGGING_ITEMS: "還剩 {0} 項要進行記錄,請稍候……"
LOGGING_TIME_LIMIT: "已達到記錄的時間上限,正在刪除資料並關閉……"
LOGGING_ITEMS: "還剩 {0} 項要進行紀錄,請稍候……"
LOGGING_TIME_LIMIT: "已達到紀錄的時間上限,正在捨棄資料並停用……"
LOOKUP_BLOCK: "{0} {放置|破壞} {1}。"
LOOKUP_CONTAINER: "{0} {新增|刪除} {1} {2}。"
LOOKUP_HEADER: "{0} 搜尋結果。"
LOOKUP_CONTAINER: "{0} {存入|取出} {1} {2}。"
LOOKUP_HEADER: "{0} 條搜尋結果。"
LOOKUP_INTERACTION: "{0} {點擊|殺死} {1}。"
LOOKUP_ITEM: "{0} {撿起|拋棄} {1} {2}。"
LOOKUP_LOGIN: "{0} 已登{入|出}。"
LOOKUP_PAGE: "第 {0} 頁"
LOOKUP_PROJECTILE: "{0} {扔|射} {1} {2}."
LOOKUP_ROWS_FOUND: "已找到 {0} {行|行}。"
LOOKUP_ROWS_FOUND: "已找到 {0} {條|條}。"
LOOKUP_SEARCHING: "正在搜尋,請稍候……"
LOOKUP_STORAGE: "{0} {存|取} {1} {2}。"
LOOKUP_STORAGE: "{0} {存入|取出} {1} {2}。"
LOOKUP_TIME: "{0} 前"
LOOKUP_USERNAME: "{0} 以 {1} 的身分登入。"
MAXIMUM_RADIUS: "最大 {查詢|回滾|恢復} 的範圍為 {0}。"
MISSING_ACTION_USER: "若要使用此操作,請指定玩家。"
LOOKUP_USERNAME: "{0} 已改變使用者名稱為 {1}。"
MAXIMUM_RADIUS: "最大{查詢|回滾|恢復}的範圍為 {0}。"
MISSING_ACTION_USER: "若要使用此行為,請指定玩家。"
MISSING_LOOKUP_TIME: "請指定{查詢|回滾|恢復}的時間範圍。"
MISSING_LOOKUP_USER: "請指定搜尋的玩家或是{方塊|範圍}。"
MISSING_PARAMETERS: "請使用 \"{0}\"。"
MISSING_PARAMETERS: "請使用「{0}」。"
MISSING_ROLLBACK_RADIUS: "你沒有指定{回滾|恢復}的範圍。"
MISSING_ROLLBACK_USER: "你沒有指定{回滾|恢復}的玩家。"
MYSQL_UNAVAILABLE: "無法連線到 MySQL 伺服器。"
NO_DATA: "找不到 {0} §f的資料。"
NO_DATA_LOCATION: "找不到這個位置的{資料|交易|互動|訊息}。"
NO_DATA: "未找到 {0} §f的資料。"
NO_DATA_LOCATION: "未找到此位置的{資料|交易|互動|訊息}。"
NO_PERMISSION: "你沒有使用該操作的權限。"
NO_RESULTS: "未找到相關結果。"
NO_RESULTS_PAGE: "未找到該頁面相關的{結果|資料}。"
NO_ROLLBACK: "未找到{待處理|上一個}回滾/恢復。"
PATCH_INTERRUPTED: "更新已中斷 ! 將會在下次重新啟動時再次嘗試。"
PATCH_INTERRUPTED: "更新已中斷!將會在下次啟動時再次嘗試。"
PATCH_OUTDATED_1: "無法更新早於 {0} 的資料庫。"
PATCH_OUTDATED_2: "請使用受到支援的 CoreProtect 版本。"
PATCH_PROCESSING: "正在處理新資訊,請稍候……"
PATCH_SKIP_UPDATE: "已在 {0} 上跳過{列表|索引}的{更新|建立|刪除}。"
PATCH_SKIP_UPDATE: "已在 {0} 上跳過{資料表|索引}的{更新|建立|清除}。"
PATCH_STARTED: "正在執行 {0} 更新,請稍候……"
PATCH_SUCCESS: "已成功升級到 {0}。"
PATCH_UPGRADING: "正在進行資料庫升級,請稍候……"
PLEASE_SELECT: "請選擇: \"{0}\" 或是 \"{1}\"。"
PATCH_SUCCESS: "資料庫已成功更新到 {0}。"
PATCH_UPGRADING: "正在進行資料庫更新,請稍候……"
PLEASE_SELECT: "請選擇:「{0}」或是「{1}」。"
PREVIEW_CANCELLED: "預覽已取消。"
PREVIEW_CANCELLING: "正在取消預覽……"
PREVIEW_IN_GAME: "你只能在遊戲中預覽回滾。"
PREVIEW_TRANSACTION: "您無法預覽 {集裝箱|庫存} 交易。"
PREVIEW_TRANSACTION: "您無法預覽{集裝箱|庫存}交易。"
PURGE_ABORTED: "清除失敗,你的資料可能已損毀。"
PURGE_ERROR: "無法處理 {0} 條資料 !"
PURGE_ERROR: "無法處理 {0} 筆資料!"
PURGE_FAILED: "清除失敗,請稍後再試。"
PURGE_IN_PROGRESS: "正在執行清除作業,請稍後再試。"
PURGE_MINIMUM_TIME: "你只能清除早於 {0} {天|小時}的資料。"
PURGE_NOTICE_1: "請注意,此操作可能需要一些時間。"
PURGE_NOTICE_2: "在完成此程序前請不要重新啟動伺服器。"
PURGE_OPTIMIZING: "正在最佳化資料庫,請稍候……"
PURGE_PROCESSING: "正在處理 {0} 資料……"
PURGE_REPAIRING: "正在嘗試修復此問題,這可能需要一些時間。"
PURGE_ROWS: "已刪除 {0} {行|行}資料。"
PURGE_STARTED: "資料刪除開始於 \"{0}\"。"
PURGE_PROCESSING: "正在清除 {0} 筆資料……"
PURGE_REPAIRING: "正在嘗試修復問題,這可能需要一些時間。"
PURGE_ROWS: "已清除 {0} {筆|筆}資料。"
PURGE_STARTED: "資料清除開始於「{0}」。"
PURGE_SUCCESS: "成功清除資料。"
RELOAD_STARTED: "正在重新載入配置檔案 - 請稍候……"
RELOAD_SUCCESS: "成功重新載入配置檔案。"
ROLLBACK_ABORTED: "已中止回滾/恢復。"
RELOAD_STARTED: "正在重新載入設定檔——請稍候……"
RELOAD_SUCCESS: "成功重新載入設定檔。"
ROLLBACK_ABORTED: "已中斷回滾/恢復。"
ROLLBACK_CHUNKS_FOUND: "找到 {0} 個{區塊|區塊}需要修改。"
ROLLBACK_CHUNKS_MODIFIED: "已修改 {0}/{1}個{區塊|區塊}。"
ROLLBACK_COMPLETED: "已完成 \"{0}\" 的{回滾|恢復|預覽}。"
ROLLBACK_EXCLUDED_USERS: "已排除{玩家|玩家}: \"{0}\"。"
ROLLBACK_INCLUDE: "{包括|不包括}{方塊|實體|目標}{類型|類型}: \"{0}\"。"
ROLLBACK_COMPLETED: "已完成「{0}」的{回滾|恢復|預覽}。"
ROLLBACK_EXCLUDED_USERS: "已排除{玩家|玩家}「{0}」。"
ROLLBACK_INCLUDE: "{包括|不包括}{方塊|實體|目標}{類型|類型}「{0}」。"
ROLLBACK_IN_PROGRESS: "已在進行回滾/恢復。"
ROLLBACK_LENGTH: "花費時間: {0} {秒|秒}。"
ROLLBACK_MODIFIED: "{已修改|正在修改} {0}。"
ROLLBACK_RADIUS: "範圍: {0} {方塊|方塊}。"
ROLLBACK_SELECTION: "範圍設定為 \"{0}\"。"
ROLLBACK_STARTED: "{回滾|恢復|預覽}開始於 \"{0}\"。"
ROLLBACK_RADIUS: "範圍: {0} 格{方塊|方塊}。"
ROLLBACK_SELECTION: "選擇範圍為「{0}」。"
ROLLBACK_STARTED: "{回滾|恢復|預覽}開始於「{0}」。"
ROLLBACK_TIME: "時間範圍: {0}。"
ROLLBACK_WORLD_ACTION: "限制{世界|互動} \"{0}\"。"
ROLLBACK_WORLD_ACTION: "限制{世界|行為}「{0}」。"
SIGN_HEADER: "簽名訊息"
STATUS_CONSUMER: "玩家: {0} 個{物品|物品}已在隊列中。"
STATUS_CONSUMER: "消費者隊列: {0} 筆{資料|資料}在隊列中。"
STATUS_DATABASE: "資料庫: 使用 {0}。"
STATUS_INTEGRATION: "{0}: 整合{開啟|關閉}。"
STATUS_INTEGRATION: "{0}: 整合{啟用|停用}。"
STATUS_LICENSE: "憑證: {0}"
STATUS_VERSION: "版本: {0}"
TELEPORTED: "傳送到 {0}。"
@@ -192,11 +192,11 @@ UPDATE_ERROR: "檢查更新時發生錯誤。"
UPDATE_HEADER: "{0} 更新"
UPDATE_NOTICE: "通知: {0} 現已推出。"
UPGRADE_IN_PROGRESS: "正在進行更新,請稍後再試。"
USER_NOT_FOUND: "找不到玩家 \"{0}\"。"
USER_OFFLINE: "用戶 \"{0}\"不在線。"
USER_NOT_FOUND: "未找到玩家「{0}」。"
USER_OFFLINE: "用戶「{0}」不在線上。"
USING_MYSQL: "使用 MySQL 進行資料儲存。"
USING_SQLITE: "使用 SQLite 進行資料儲存。"
VALID_DONATION_KEY: "有效的贈品金鑰"
VALID_DONATION_KEY: "有效的贊助金鑰"
VERSION_NOTICE: "版本 {0} 現已推出。"
VERSION_REQUIRED: "{0} 需要使用 {1} 或更高版本。"
WORLD_NOT_FOUND: "世界: \"{0}\" 不存在。"
WORLD_NOT_FOUND: "世界「{0}」不存在。"
+15 -6
View File
@@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>net.coreprotect</groupId>
<artifactId>CoreProtect</artifactId>
<version>21.3</version>
<version>22.0</version>
<properties>
<project.branch></project.branch>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -51,6 +51,14 @@
</excludes>
</filter>
</filters>
<artifactSet>
<excludes>
<exclude>com.google.code.gson:*</exclude>
<exclude>org.intellij:*</exclude>
<exclude>org.jetbrains:*</exclude>
<exclude>org.slf4j:*</exclude>
</excludes>
</artifactSet>
<relocations>
<relocation>
<pattern>org.bstats</pattern>
@@ -74,7 +82,7 @@
</repository>
<repository>
<id>paper-repo</id>
<url>https://papermc.io/repo/repository/maven-public/</url>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
<repository>
<id>codemc-repo</id>
@@ -87,14 +95,15 @@
</repositories>
<dependencies>
<!--
paper-api: io.papermc.paper
paper-api (<= 1.16): com.destroystokyo.paper
spigot-api: org.spigotmc
bukkit: org.bukkit
-->
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.19-R0.1-SNAPSHOT</version>
<groupId>dev.folia</groupId>
<artifactId>folia-api</artifactId>
<version>1.20.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
@@ -118,7 +127,7 @@
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
<version>5.0.1</version>
</dependency>
</dependencies>
</project>
@@ -21,6 +21,7 @@ import net.coreprotect.listener.player.PlayerQuitListener;
import net.coreprotect.paper.PaperAdapter;
import net.coreprotect.thread.CacheHandler;
import net.coreprotect.thread.NetworkHandler;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Chat;
import net.coreprotect.utility.Color;
import net.coreprotect.utility.Util;
@@ -94,7 +95,7 @@ public final class CoreProtect extends JavaPlugin {
Chat.console(Phrase.build(Phrase.LINK_DISCORD, "www.coreprotect.net/discord/"));
Chat.console("--------------------");
getServer().getScheduler().scheduleSyncDelayedTask(this, () -> {
Scheduler.scheduleSyncDelayedTask(this, () -> {
try {
Thread networkHandler = new Thread(new NetworkHandler(true, true));
networkHandler.start();
@@ -3,9 +3,13 @@ package net.coreprotect.bukkit;
import java.util.List;
import java.util.Map;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Directional;
@@ -13,7 +17,8 @@ import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.MerchantRecipe;
import org.bukkit.inventory.meta.ItemMeta;
@@ -31,15 +36,14 @@ public class BukkitAdapter implements BukkitInterface {
public static final int BUKKIT_V1_17 = 17;
public static final int BUKKIT_V1_18 = 18;
public static final int BUKKIT_V1_19 = 19;
public static final int BUKKIT_V1_20 = 20;
public static void loadAdapter() {
switch (ConfigHandler.SERVER_VERSION) {
case BUKKIT_V1_13:
case BUKKIT_V1_14:
BukkitAdapter.ADAPTER = new BukkitAdapter();
break;
case BUKKIT_V1_15:
BukkitAdapter.ADAPTER = new Bukkit_v1_15();
BukkitAdapter.ADAPTER = new BukkitAdapter();
break;
case BUKKIT_V1_16:
BukkitAdapter.ADAPTER = new Bukkit_v1_16();
@@ -51,8 +55,12 @@ public class BukkitAdapter implements BukkitInterface {
BukkitAdapter.ADAPTER = new Bukkit_v1_18();
break;
case BUKKIT_V1_19:
default:
BukkitAdapter.ADAPTER = new Bukkit_v1_19();
break;
case BUKKIT_V1_20:
default:
BukkitAdapter.ADAPTER = new Bukkit_v1_20();
break;
}
}
@@ -100,11 +108,6 @@ public class BukkitAdapter implements BukkitInterface {
return false;
}
@Override
public void sendSignChange(Player player, Sign sign) {
return;
}
@Override
public int getMinHeight(World world) {
return 0;
@@ -136,13 +139,13 @@ public class BukkitAdapter implements BukkitInterface {
}
@Override
public boolean isGlowing(Sign sign) {
public boolean isGlowing(Sign sign, boolean isFront) {
return false;
}
@Override
public void setGlowing(Sign sign, boolean set) {
return;
public boolean isWaxed(Sign sign) {
return false;
}
@Override
@@ -155,4 +158,104 @@ public class BukkitAdapter implements BukkitInterface {
return null;
}
@Override
public void setGlowing(Sign sign, boolean isFront, boolean isGlowing) {
return;
}
@Override
public void setColor(Sign sign, boolean isFront, int color) {
if (!isFront) {
return;
}
sign.setColor(DyeColor.getByColor(Color.fromRGB(color)));
}
@Override
public void setWaxed(Sign sign, boolean isWaxed) {
return;
}
@Override
public int getColor(Sign sign, boolean isFront) {
if (isFront) {
return sign.getColor().getColor().asRGB();
}
return 0;
}
@Override
public Material getPlantSeeds(Material material) {
switch (material) {
case WHEAT:
material = Material.WHEAT_SEEDS;
break;
case PUMPKIN_STEM:
material = Material.PUMPKIN_SEEDS;
break;
case MELON_STEM:
material = Material.MELON_SEEDS;
break;
case BEETROOTS:
material = Material.BEETROOT_SEEDS;
break;
default:
}
return material;
}
@Override
public boolean isSuspiciousBlock(Material material) {
return false;
}
@Override
public boolean isSign(Material material) {
return Tag.SIGNS.isTagged(material);
}
@Override
public boolean isChiseledBookshelf(Material material) {
return false;
}
@Override
public boolean isBookshelfBook(Material material) {
return false;
}
@Override
public ItemStack getChiseledBookshelfBook(BlockState blockState, PlayerInteractEvent event) {
return null;
}
@Override
public String getLine(Sign sign, int line) {
if (line < 4) {
return sign.getLine(line);
}
else {
return "";
}
}
@Override
public void setLine(Sign sign, int line, String string) {
if (string == null) {
string = "";
}
if (line < 4) {
sign.setLine(line, string);
}
}
@Override
public boolean isSignFront(SignChangeEvent event) {
return true;
}
}
@@ -6,12 +6,14 @@ import java.util.Map;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.MerchantRecipe;
import org.bukkit.inventory.meta.ItemMeta;
@@ -44,16 +46,40 @@ public interface BukkitInterface {
public boolean isItemFrame(Material material);
public boolean isGlowing(Sign sign);
public boolean isGlowing(Sign sign, boolean isFront);
public boolean isInvisible(Material material);
public boolean isWaxed(Sign sign);
public int getMinHeight(World world);
public int getLegacyBlockId(Material material);
public void sendSignChange(Player player, Sign sign);
public void setGlowing(Sign sign, boolean isFront, boolean isGlowing);
public void setGlowing(Sign sign, boolean b);
public void setColor(Sign sign, boolean isFront, int color);
public void setWaxed(Sign sign, boolean isWaxed);
public int getColor(Sign sign, boolean isFront);
public Material getPlantSeeds(Material material);
public boolean isSuspiciousBlock(Material material);
public boolean isSign(Material material);
public boolean isChiseledBookshelf(Material material);
public boolean isBookshelfBook(Material material);
public ItemStack getChiseledBookshelfBook(BlockState blockState, PlayerInteractEvent event);
public String getLine(Sign sign, int line);
public void setLine(Sign sign, int line, String string);
public boolean isSignFront(SignChangeEvent event);
}
@@ -1,105 +0,0 @@
package net.coreprotect.bukkit;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.bukkit.Material;
import org.bukkit.block.Sign;
import org.bukkit.entity.Bee;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.SuspiciousStewMeta;
import org.bukkit.potion.PotionEffect;
public class Bukkit_v1_15 extends BukkitAdapter implements BukkitInterface {
@Override
public boolean getEntityMeta(LivingEntity entity, List<Object> info) {
if (entity instanceof Bee) {
Bee bee = (Bee) entity;
info.add(bee.getAnger());
info.add(bee.hasNectar());
info.add(bee.hasStung());
}
else {
return false;
}
return true;
}
@Override
public boolean setEntityMeta(Entity entity, Object value, int count) {
if (entity instanceof Bee) {
Bee bee = (Bee) entity;
if (count == 0) {
int set = (int) value;
bee.setAnger(set);
}
else if (count == 1) {
boolean set = (Boolean) value;
bee.setHasNectar(set);
}
else if (count == 2) {
boolean set = (Boolean) value;
bee.setHasStung(set);
}
}
else {
return false;
}
return true;
}
@Override
public boolean getItemMeta(ItemMeta itemMeta, List<Map<String, Object>> list, List<List<Map<String, Object>>> metadata, int slot) {
if (itemMeta instanceof SuspiciousStewMeta) {
SuspiciousStewMeta meta = (SuspiciousStewMeta) itemMeta;
SuspiciousStewMeta subMeta = meta.clone();
meta.clearCustomEffects();
list.add(meta.serialize());
metadata.add(list);
if (subMeta.hasCustomEffects()) {
for (PotionEffect effect : subMeta.getCustomEffects()) {
list = new ArrayList<>();
list.add(effect.serialize());
metadata.add(list);
}
}
}
else {
return false;
}
return true;
}
@Override
public boolean setItemMeta(Material rowType, ItemStack itemstack, List<Map<String, Object>> map) {
if ((rowType == Material.SUSPICIOUS_STEW)) {
for (Map<String, Object> suspiciousStewData : map) {
SuspiciousStewMeta meta = (SuspiciousStewMeta) itemstack.getItemMeta();
PotionEffect effect = new PotionEffect(suspiciousStewData);
meta.addCustomEffect(effect, true);
itemstack.setItemMeta(meta);
}
}
else {
return false;
}
return true;
}
@Override
public void sendSignChange(Player player, Sign sign) {
player.sendSignChange(sign.getLocation(), sign.getLines(), sign.getColor());
}
}
@@ -17,7 +17,7 @@ import org.bukkit.entity.Zoglin;
import net.coreprotect.model.BlockGroup;
public class Bukkit_v1_16 extends Bukkit_v1_15 implements BukkitInterface {
public class Bukkit_v1_16 extends BukkitAdapter implements BukkitInterface {
public Bukkit_v1_16() {
BlockGroup.TRACK_TOP = new HashSet<>(Arrays.asList(Material.TORCH, Material.REDSTONE_TORCH, Material.BAMBOO, Material.BAMBOO_SAPLING, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH, Material.SCAFFOLDING, Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.GRASS, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.REDSTONE_WIRE, Material.WHEAT, Material.ACACIA_SIGN, Material.BIRCH_SIGN, Material.DARK_OAK_SIGN, Material.JUNGLE_SIGN, Material.OAK_SIGN, Material.SPRUCE_SIGN, Material.WHITE_BANNER, Material.ORANGE_BANNER, Material.MAGENTA_BANNER, Material.LIGHT_BLUE_BANNER, Material.YELLOW_BANNER, Material.LIME_BANNER, Material.PINK_BANNER, Material.GRAY_BANNER, Material.LIGHT_GRAY_BANNER, Material.CYAN_BANNER, Material.PURPLE_BANNER, Material.BLUE_BANNER, Material.BROWN_BANNER, Material.GREEN_BANNER, Material.RED_BANNER, Material.BLACK_BANNER, Material.RAIL, Material.IRON_DOOR, Material.SNOW, Material.CACTUS, Material.SUGAR_CANE, Material.REPEATER, Material.PUMPKIN_STEM, Material.MELON_STEM, Material.CARROT, Material.POTATO, Material.COMPARATOR, Material.ACTIVATOR_RAIL, Material.SUNFLOWER, Material.LILAC, Material.TALL_GRASS, Material.LARGE_FERN, Material.ROSE_BUSH, Material.PEONY, Material.NETHER_WART, Material.CHORUS_PLANT, Material.CHORUS_FLOWER, Material.KELP, Material.SOUL_TORCH, Material.TWISTING_VINES, Material.CRIMSON_FUNGUS, Material.WARPED_FUNGUS, Material.CRIMSON_ROOTS, Material.WARPED_ROOTS, Material.NETHER_SPROUTS, Material.CRIMSON_SIGN, Material.WARPED_SIGN));
@@ -218,13 +218,21 @@ public class Bukkit_v1_17 extends Bukkit_v1_16 implements BukkitInterface {
}
@Override
public boolean isGlowing(Sign sign) {
public boolean isGlowing(Sign sign, boolean isFront) {
if (!isFront) {
return false;
}
return sign.isGlowingText();
}
@Override
public void setGlowing(Sign sign, boolean set) {
sign.setGlowingText(set);
public void setGlowing(Sign sign, boolean isFront, boolean isGlowing) {
if (!isFront) {
return;
}
sign.setGlowingText(isGlowing);
}
@Override
@@ -0,0 +1,231 @@
package net.coreprotect.bukkit;
import java.util.Arrays;
import java.util.HashSet;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.BlockState;
import org.bukkit.block.ChiseledBookshelf;
import org.bukkit.block.Sign;
import org.bukkit.block.sign.Side;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import net.coreprotect.model.BlockGroup;
public class Bukkit_v1_20 extends Bukkit_v1_19 implements BukkitInterface {
private Boolean hasClickedPosition = null;
public Bukkit_v1_20() {
BlockGroup.CONTAINERS = new HashSet<>(Arrays.asList(Material.JUKEBOX, Material.DISPENSER, Material.CHEST, Material.FURNACE, Material.BREWING_STAND, Material.TRAPPED_CHEST, Material.HOPPER, Material.DROPPER, Material.ARMOR_STAND, Material.ITEM_FRAME, Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.SMOKER, Material.LECTERN, Material.CHISELED_BOOKSHELF));
BlockGroup.UPDATE_STATE = new HashSet<>(Arrays.asList(Material.TORCH, Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FURNACE, Material.BLAST_FURNACE, Material.SMOKER, Material.LEVER, Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.GLOWSTONE, Material.JACK_O_LANTERN, Material.REPEATER, Material.REDSTONE_LAMP, Material.BEACON, Material.COMPARATOR, Material.DAYLIGHT_DETECTOR, Material.REDSTONE_BLOCK, Material.HOPPER, Material.CHEST, Material.TRAPPED_CHEST, Material.ACTIVATOR_RAIL, Material.SOUL_TORCH, Material.SOUL_WALL_TORCH, Material.SHROOMLIGHT, Material.RESPAWN_ANCHOR, Material.CRYING_OBSIDIAN, Material.TARGET, Material.SMALL_AMETHYST_BUD, Material.MEDIUM_AMETHYST_BUD, Material.LARGE_AMETHYST_BUD, Material.AMETHYST_CLUSTER, Material.CAVE_VINES, Material.CAVE_VINES_PLANT, Material.GLOW_LICHEN, Material.LIGHT, Material.LAVA_CAULDRON, Material.CHISELED_BOOKSHELF));
BlockGroup.BUTTONS.clear();
BlockGroup.BUTTONS.addAll(Tag.BUTTONS.getValues());
BlockGroup.PRESSURE_PLATES.clear();
BlockGroup.PRESSURE_PLATES.addAll(Tag.PRESSURE_PLATES.getValues());
for (Material value : Tag.DOORS.getValues()) {
if (!BlockGroup.DOORS.contains(value)) {
BlockGroup.DOORS.add(value);
}
}
for (Material value : Tag.FENCE_GATES.getValues()) {
if (!BlockGroup.INTERACT_BLOCKS.contains(value)) {
BlockGroup.INTERACT_BLOCKS.add(value);
}
if (!BlockGroup.SAFE_INTERACT_BLOCKS.contains(value)) {
BlockGroup.SAFE_INTERACT_BLOCKS.add(value);
}
}
for (Material value : Tag.WOODEN_TRAPDOORS.getValues()) {
if (!BlockGroup.INTERACT_BLOCKS.contains(value)) {
BlockGroup.INTERACT_BLOCKS.add(value);
}
if (!BlockGroup.SAFE_INTERACT_BLOCKS.contains(value)) {
BlockGroup.SAFE_INTERACT_BLOCKS.add(value);
}
}
for (Material value : Tag.CEILING_HANGING_SIGNS.getValues()) {
if (!BlockGroup.TRACK_BOTTOM.contains(value)) {
BlockGroup.TRACK_BOTTOM.add(value);
}
}
for (Material value : Tag.WALL_SIGNS.getValues()) {
if (!BlockGroup.TRACK_SIDE.contains(value)) {
BlockGroup.TRACK_SIDE.add(value);
}
}
for (Material value : Tag.SAPLINGS.getValues()) {
if (!BlockGroup.TRACK_TOP.contains(value)) {
BlockGroup.TRACK_TOP.add(value);
}
if (!BlockGroup.NON_ATTACHABLE.contains(value)) {
BlockGroup.NON_ATTACHABLE.add(value);
}
}
for (Material value : Tag.FLOWERS.getValues()) {
if (!BlockGroup.TRACK_TOP.contains(value)) {
BlockGroup.TRACK_TOP.add(value);
}
if (!BlockGroup.NON_ATTACHABLE.contains(value)) {
BlockGroup.NON_ATTACHABLE.add(value);
}
}
for (Material value : Tag.SIGNS.getValues()) {
if (!Tag.WALL_SIGNS.isTagged(value) && !BlockGroup.TRACK_TOP.contains(value)) {
BlockGroup.TRACK_TOP.add(value);
}
}
}
@Override
public void setGlowing(Sign sign, boolean isFront, boolean isGlowing) {
if (isFront) {
sign.getSide(Side.FRONT).setGlowingText(isGlowing);
}
else {
sign.getSide(Side.BACK).setGlowingText(isGlowing);
}
}
@Override
public void setColor(Sign sign, boolean isFront, int color) {
if (isFront) {
sign.getSide(Side.FRONT).setColor(DyeColor.getByColor(Color.fromRGB(color)));
}
else {
sign.getSide(Side.BACK).setColor(DyeColor.getByColor(Color.fromRGB(color)));
}
}
@Override
public void setWaxed(Sign sign, boolean isWaxed) {
sign.setWaxed(isWaxed);
}
@Override
public int getColor(Sign sign, boolean isFront) {
if (isFront) {
return sign.getSide(Side.FRONT).getColor().getColor().asRGB();
}
else {
return sign.getSide(Side.BACK).getColor().getColor().asRGB();
}
}
@Override
public boolean isGlowing(Sign sign, boolean isFront) {
if (isFront) {
return sign.getSide(Side.FRONT).isGlowingText();
}
else {
return sign.getSide(Side.BACK).isGlowingText();
}
}
@Override
public boolean isWaxed(Sign sign) {
return sign.isWaxed();
}
@Override
public Material getPlantSeeds(Material material) {
switch (material) {
case WHEAT:
material = Material.WHEAT_SEEDS;
break;
case PUMPKIN_STEM:
material = Material.PUMPKIN_SEEDS;
break;
case MELON_STEM:
material = Material.MELON_SEEDS;
break;
case BEETROOTS:
material = Material.BEETROOT_SEEDS;
break;
case TORCHFLOWER_CROP:
material = Material.TORCHFLOWER_SEEDS;
break;
default:
}
return material;
}
@Override
public boolean isSuspiciousBlock(Material material) {
return material == Material.SUSPICIOUS_GRAVEL || material == Material.SUSPICIOUS_SAND;
}
@Override
public boolean isSign(Material material) {
return Tag.ALL_SIGNS.isTagged(material);
}
@Override
public boolean isChiseledBookshelf(Material material) {
return material == Material.CHISELED_BOOKSHELF;
}
@Override
public boolean isBookshelfBook(Material material) {
return Tag.ITEMS_BOOKSHELF_BOOKS.isTagged(material);
}
@Override
public ItemStack getChiseledBookshelfBook(BlockState blockState, PlayerInteractEvent event) {
try {
if (hasClickedPosition == null) {
hasClickedPosition = true;
PlayerInteractEvent.class.getMethod("getClickedPosition"); // Bukkit 1.20.1+
}
else if (Boolean.FALSE.equals(hasClickedPosition)) {
return null;
}
ChiseledBookshelf chiseledBookshelf = (ChiseledBookshelf) blockState;
ItemStack book = chiseledBookshelf.getInventory().getItem(chiseledBookshelf.getSlot(event.getClickedPosition()));
return book == null ? new ItemStack(Material.AIR) : book;
}
catch (Exception e) {
hasClickedPosition = false;
return null;
}
}
@Override
public String getLine(Sign sign, int line) {
if (line < 4) {
return sign.getSide(Side.FRONT).getLine(line);
}
else {
return sign.getSide(Side.BACK).getLine(line - 4);
}
}
@Override
public void setLine(Sign sign, int line, String string) {
if (string == null) {
string = "";
}
if (line < 4) {
sign.getSide(Side.FRONT).setLine(line, string);
}
else {
sign.getSide(Side.BACK).setLine(line - 4, string);
}
}
@Override
public boolean isSignFront(SignChangeEvent event) {
return event.getSide().equals(Side.FRONT);
}
}
@@ -1,5 +1,6 @@
package net.coreprotect.command;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.Statement;
import java.text.NumberFormat;
@@ -356,14 +357,9 @@ public class LookupCommand {
ConfigHandler.lookupThrottle.put(player2.getName(), new Object[] { true, System.currentTimeMillis() });
if (connection != null) {
Statement statement = connection.createStatement();
String blockdata = ChestTransactionLookup.performLookup(command.getName(), statement, location, player2, p2, finalLimit, false);
if (blockdata.contains("\n")) {
for (String b : blockdata.split("\n")) {
Chat.sendComponent(player2, b);
}
}
else {
Chat.sendComponent(player2, blockdata);
List<String> blockData = ChestTransactionLookup.performLookup(command.getName(), statement, location, player2, p2, finalLimit, false);
for (String data : blockData) {
Chat.sendComponent(player2, data);
}
statement.close();
}
@@ -906,7 +902,7 @@ public class LookupCommand {
for (String[] data : lookupList) {
String time = data[0];
String dplayer = data[1];
String dtype = data[5];
int dtype = Integer.parseInt(data[5]);
int ddata = Integer.parseInt(data[6]);
int daction = Integer.parseInt(data[7]);
int amount = Integer.parseInt(data[10]);
@@ -916,8 +912,10 @@ public class LookupCommand {
int z = Integer.parseInt(data[4]);
String rbd = ((Integer.parseInt(data[8]) == 2 || Integer.parseInt(data[8]) == 3) ? Color.STRIKETHROUGH : "");
String timeago = Util.getTimeSince(Integer.parseInt(time), unixtimestamp, true);
Material blockType = Util.itemFilter(Util.getType(Integer.parseInt(dtype)), (Integer.parseInt(data[13]) == 0));
Material blockType = Util.itemFilter(Util.getType(dtype), (Integer.parseInt(data[13]) == 0));
String dname = Util.nameFilter(blockType.name().toLowerCase(Locale.ROOT), ddata);
byte[] metadata = data[11] == null ? null : data[11].getBytes(StandardCharsets.ISO_8859_1);
String tooltip = Util.getEnchantments(metadata, dtype, amount);
String selector = Selector.FIRST;
String tag = Color.WHITE + "-";
@@ -946,7 +944,7 @@ public class LookupCommand {
tag = (daction == 0 ? Color.GREEN + "+" : Color.RED + "-");
}
Chat.sendComponent(player2, timeago + " " + tag + " " + Phrase.build(Phrase.LOOKUP_CONTAINER, Color.DARK_AQUA + rbd + dplayer + Color.WHITE + rbd, "x" + amount, Color.DARK_AQUA + rbd + dname + Color.WHITE, selector));
Chat.sendComponent(player2, timeago + " " + tag + " " + Phrase.build(Phrase.LOOKUP_CONTAINER, Color.DARK_AQUA + rbd + dplayer + Color.WHITE + rbd, "x" + amount, Util.createTooltip(Color.DARK_AQUA + rbd + dname, tooltip) + Color.WHITE, selector));
PluginChannelListener.getInstance().sendData(player2, Integer.parseInt(time), Phrase.LOOKUP_CONTAINER, selector, dplayer, dname, amount, x, y, z, wid, rbd, true, tag.contains("+"));
}
}
@@ -963,7 +961,7 @@ public class LookupCommand {
int x = Integer.parseInt(data[2]);
int y = Integer.parseInt(data[3]);
int z = Integer.parseInt(data[4]);
String dtype = data[5];
int dtype = Integer.parseInt(data[5]);
int ddata = Integer.parseInt(data[6]);
int daction = Integer.parseInt(data[7]);
int wid = Integer.parseInt(data[9]);
@@ -983,8 +981,7 @@ public class LookupCommand {
String dname = "";
boolean isPlayer = false;
if (daction == 3 && !finalArgAction.contains(11) && amount == -1) {
int dTypeInt = Integer.parseInt(dtype);
if (dTypeInt == 0) {
if (dtype == 0) {
if (ConfigHandler.playerIdCacheReversed.get(ddata) == null) {
UserStatement.loadName(connection, ddata);
}
@@ -992,11 +989,11 @@ public class LookupCommand {
isPlayer = true;
}
else {
dname = Util.getEntityType(dTypeInt).name();
dname = Util.getEntityType(dtype).name();
}
}
else {
dname = Util.getType(Integer.parseInt(dtype)).name().toLowerCase(Locale.ROOT);
dname = Util.getType(dtype).name().toLowerCase(Locale.ROOT);
dname = Util.nameFilter(dname, ddata);
}
if (dname.length() > 0 && !isPlayer) {
@@ -1015,6 +1012,9 @@ public class LookupCommand {
String selector = Selector.FIRST;
String action = "a:block";
if (finalArgAction.contains(4) || finalArgAction.contains(5) || finalArgAction.contains(11) || amount > -1) {
byte[] metadata = data[11] == null ? null : data[11].getBytes(StandardCharsets.ISO_8859_1);
String tooltip = Util.getEnchantments(metadata, dtype, amount);
if (daction == 2 || daction == 3) {
phrase = Phrase.LOOKUP_ITEM; // {picked up|dropped}
selector = (daction != 2 ? Selector.FIRST : Selector.SECOND);
@@ -1040,7 +1040,7 @@ public class LookupCommand {
action = "a:container";
}
Chat.sendComponent(player2, timeago + " " + tag + " " + Phrase.build(phrase, Color.DARK_AQUA + rbd + dplayer + Color.WHITE + rbd, "x" + amount, Color.DARK_AQUA + rbd + dname + Color.WHITE, selector));
Chat.sendComponent(player2, timeago + " " + tag + " " + Phrase.build(phrase, Color.DARK_AQUA + rbd + dplayer + Color.WHITE + rbd, "x" + amount, Util.createTooltip(Color.DARK_AQUA + rbd + dname, tooltip) + Color.WHITE, selector));
PluginChannelListener.getInstance().sendData(player2, Integer.parseInt(time), phrase, selector, dplayer, dname, (tag.contains("+") ? 1 : -1), x, y, z, wid, rbd, action.contains("container"), tag.contains("+"));
}
else {
@@ -6,8 +6,10 @@ import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.language.Phrase;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Chat;
import net.coreprotect.utility.ChatMessage;
import net.coreprotect.utility.Color;
@@ -99,12 +101,14 @@ public class TeleportCommand {
int chunkX = location.getBlockX() >> 4;
int chunkZ = location.getBlockZ() >> 4;
if (location.getWorld().isChunkLoaded(chunkX, chunkZ) == false) {
location.getWorld().getChunkAt(location);
}
Scheduler.runTask(CoreProtect.getInstance(), () -> {
if (!location.getWorld().isChunkLoaded(chunkX, chunkZ)) {
location.getWorld().getChunkAt(location);
}
// Teleport the player to a safe location
Teleport.performSafeTeleport(((Player) player), location, true);
// Teleport the player to a safe location
Teleport.performSafeTeleport(((Player) player), location, true);
}, location);
ConfigHandler.teleportThrottle.put(player.getName(), new Object[] { false, System.currentTimeMillis() });
}
@@ -20,6 +20,7 @@ import org.bukkit.World;
import net.coreprotect.CoreProtect;
import net.coreprotect.language.Language;
import net.coreprotect.thread.Scheduler;
public class Config extends Language {
@@ -85,8 +86,10 @@ public class Config extends Language {
public boolean PLAYER_MESSAGES;
public boolean PLAYER_COMMANDS;
public boolean PLAYER_SESSIONS;
public boolean UNKNOWN_LOGGING;
public boolean USERNAME_CHANGES;
public boolean WORLDEDIT;
public int MAXIMUM_POOL_SIZE;
public int MYSQL_PORT;
public int DEFAULT_RADIUS;
public int MAX_RADIUS;
@@ -165,7 +168,7 @@ public class Config extends Language {
HEADERS.put("sign-text", new String[] { "# Logs text on signs. If disabled, signs will be blank when rolled back." });
HEADERS.put("buckets", new String[] { "# Logs lava and water sources placed/removed by players who are using buckets." });
HEADERS.put("leaf-decay", new String[] { "# Logs natural tree leaf decay." });
HEADERS.put("tree-growth", new String[] { "# Logs tree growth. Trees are linked to the player who planted the sappling." });
HEADERS.put("tree-growth", new String[] { "# Logs tree growth. Trees are linked to the player who planted the sapling." });
HEADERS.put("mushroom-growth", new String[] { "# Logs mushroom growth." });
HEADERS.put("vine-growth", new String[] { "# Logs natural vine growth." });
HEADERS.put("sculk-spread", new String[] { "# Logs the spread of sculk blocks from sculk catalysts." });
@@ -194,6 +197,8 @@ public class Config extends Language {
this.HOPPER_FILTER_META = this.getBoolean("hopper-filter-meta", false);
this.EXCLUDE_TNT = this.getBoolean("exclude-tnt", false);
this.NETWORK_DEBUG = this.getBoolean("network-debug", false);
this.UNKNOWN_LOGGING = this.getBoolean("unknown-logging", false);
this.MAXIMUM_POOL_SIZE = this.getInt("maximum-pool-size", 10);
this.DONATION_KEY = this.getString("donation-key");
this.MYSQL = this.getBoolean("use-mysql");
this.PREFIX = this.getString("table-prefix");
@@ -310,7 +315,7 @@ public class Config extends Language {
configured = configured.replaceAll("[^0-9]", "");
return configured.isEmpty() ? 0 : Integer.parseInt(configured);
return configured.isEmpty() ? dfl : Integer.parseInt(configured);
}
private String getString(final String key) {
@@ -383,7 +388,7 @@ public class Config extends Language {
// for now this solution is good enough to ensure we only modify on the main thread
final CompletableFuture<Void> complete = new CompletableFuture<>();
Bukkit.getScheduler().runTask(CoreProtect.getInstance(), () -> {
Scheduler.runTask(CoreProtect.getInstance(), () -> {
try {
parseConfig(data);
}
@@ -43,7 +43,7 @@ public class ConfigHandler extends Queue {
public static final String EDITION_BRANCH = Util.getBranch();
public static final String EDITION_NAME = Util.getPluginName();
public static final String JAVA_VERSION = "11.0";
public static final String SPIGOT_VERSION = "1.14";
public static final String SPIGOT_VERSION = "1.15";
public static String path = "plugins/CoreProtect/";
public static String sqlite = "database.db";
public static String host = "127.0.0.1";
@@ -52,9 +52,12 @@ public class ConfigHandler extends Queue {
public static String username = "root";
public static String password = "";
public static String prefix = "co_";
public static int maximumPoolSize = 10;
public static HikariDataSource hikariDataSource = null;
public static final boolean isSpigot = Util.isSpigot();
public static final boolean isPaper = Util.isPaper();
public static final boolean isFolia = Util.isFolia();
public static volatile boolean serverRunning = false;
public static volatile boolean converterRunning = false;
public static volatile boolean purgeRunning = false;
@@ -118,7 +121,7 @@ public class ConfigHandler extends Queue {
public static Map<Integer, String> playerIdCacheReversed = syncMap();
public static Map<String, List<Object>> lastRollback = syncMap();
public static Map<String, Boolean> activeRollbacks = syncMap();
public static Map<String, Object[]> entityBlockMapper = syncMap();
public static Map<String, Object[]> entityBlockMapper = new ConcurrentHashMap<>();
public static ConcurrentHashMap<Long, Long> populatedChunks = new ConcurrentHashMap<>();
public static ConcurrentHashMap<String, String> language = new ConcurrentHashMap<>();
public static List<String> databaseTables = new ArrayList<>();
@@ -173,6 +176,7 @@ public class ConfigHandler extends Queue {
ConfigHandler.database = Config.getGlobal().MYSQL_DATABASE;
ConfigHandler.username = Config.getGlobal().MYSQL_USERNAME;
ConfigHandler.password = Config.getGlobal().MYSQL_PASSWORD;
ConfigHandler.maximumPoolSize = Config.getGlobal().MAXIMUM_POOL_SIZE;
ConfigHandler.prefix = Config.getGlobal().PREFIX;
ConfigHandler.loadBlacklist(); // Load the blacklist file if it exists.
@@ -229,8 +233,8 @@ public class ConfigHandler extends Queue {
config.setJdbcUrl("jdbc:mysql://" + ConfigHandler.host + ":" + ConfigHandler.port + "/" + ConfigHandler.database);
config.setUsername(ConfigHandler.username);
config.setPassword(ConfigHandler.password);
config.setMaxLifetime(300000);
config.setKeepaliveTime(60000);
config.setMaximumPoolSize(ConfigHandler.maximumPoolSize);
config.setMaxLifetime(60000);
config.addDataSourceProperty("characterEncoding", "UTF-8");
config.addDataSourceProperty("connectionTimeout", "10000");
/* https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration */
@@ -414,7 +418,10 @@ public class ConfigHandler extends Queue {
ConfigHandler.loadConfig(); // Load (or create) the configuration file.
ConfigHandler.loadDatabase(); // Initialize MySQL and create tables if necessary.
ListenerHandler.registerNetworking(); // Register channels for networking API
if (startup) {
ListenerHandler.registerNetworking(); // Register channels for networking API
}
}
catch (Exception e) {
e.printStackTrace();
@@ -24,6 +24,7 @@ import net.coreprotect.config.ConfigHandler;
import net.coreprotect.consumer.process.Process;
import net.coreprotect.listener.block.BlockUtil;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Util;
public class Queue {
@@ -85,7 +86,7 @@ public class Queue {
}
protected static void queueBlockBreakValidate(final String user, final Block block, final BlockState blockState, final Material type, final String blockData, final int extraData, int ticks) {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
if (!block.getType().equals(type)) {
queueBlockBreak(user, blockState, type, blockData, null, extraData, 0);
@@ -94,7 +95,7 @@ public class Queue {
catch (Exception e) {
e.printStackTrace();
}
}, ticks);
}, block.getLocation(), ticks);
}
protected static void queueBlockBreak(String user, BlockState block, Material type, String blockData, Material breakType, int extraData, int blockNumber) {
@@ -178,18 +179,18 @@ public class Queue {
}
protected static void queueBlockPlaceDelayed(final String user, final Location placed, final Material type, final String blockData, final BlockState replaced, int ticks) {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
queueBlockPlace(user, placed.getBlock().getState(), type, replaced, null, -1, 0, blockData);
}
catch (Exception e) {
e.printStackTrace();
}
}, ticks);
}, placed, ticks);
}
protected static void queueBlockPlaceValidate(final String user, final BlockState blockLocation, final Block block, final BlockState blockReplaced, final Material forceT, final int forceD, final int forceData, final String blockData, int ticks) {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
Material blockType = block.getType();
if (blockType.equals(forceT)) {
@@ -204,11 +205,11 @@ public class Queue {
catch (Exception e) {
e.printStackTrace();
}
}, ticks);
}, blockLocation.getLocation(), ticks);
}
protected static void queueBlockGravityValidate(final String user, final Location location, final Block block, final Material blockType, int ticks) {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
Block placementBlock = BlockUtil.gravityScan(location, blockType, user);
if (!block.equals(placementBlock)) {
@@ -218,7 +219,7 @@ public class Queue {
catch (Exception e) {
e.printStackTrace();
}
}, ticks);
}, location, ticks);
}
protected static void queueContainerBreak(String user, Location location, Material type, ItemStack[] oldInventory) {
@@ -351,7 +352,7 @@ public class Queue {
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, location);
}
protected static void queueSignText(String user, Location location, int action, int color, boolean glowing, String line1, String line2, String line3, String line4, int offset) {
protected static void queueSignText(String user, Location location, int action, int color, int colorSecondary, boolean frontGlowing, boolean backGlowing, boolean isWaxed, boolean isFront, String line1, String line2, String line3, String line4, String line5, String line6, String line7, String line8, int offset) {
/*
if (line1.length() == 0 && line2.length() == 0 && line3.length() == 0 && line4.length() == 0) {
return;
@@ -360,7 +361,7 @@ public class Queue {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.SIGN_TEXT, null, color, null, action, offset, null });
Consumer.consumerSigns.get(currentConsumer).put(consumerId, new Object[] { (glowing == true ? 1 : 0), line1, line2, line3, line4 });
Consumer.consumerSigns.get(currentConsumer).put(consumerId, new Object[] { colorSecondary, Util.getSignData(frontGlowing, backGlowing), isWaxed, isFront, line1, line2, line3, line4, line5, line6, line7, line8 });
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, location);
}
@@ -16,7 +16,7 @@ class SignTextProcess {
Map<Integer, Object[]> signs = Consumer.consumerSigns.get(processId);
if (signs.get(id) != null) {
Object[] SIGN_DATA = signs.get(id);
SignTextLogger.log(preparedStmt, batchCount, user, location, action, color, (Integer) SIGN_DATA[0], (String) SIGN_DATA[1], (String) SIGN_DATA[2], (String) SIGN_DATA[3], (String) SIGN_DATA[4], forceData);
SignTextLogger.log(preparedStmt, batchCount, user, location, action, color, (Integer) SIGN_DATA[0], (Integer) SIGN_DATA[1], (Boolean) SIGN_DATA[2], (Boolean) SIGN_DATA[3], (String) SIGN_DATA[4], (String) SIGN_DATA[5], (String) SIGN_DATA[6], (String) SIGN_DATA[7], (String) SIGN_DATA[8], (String) SIGN_DATA[9], (String) SIGN_DATA[10], (String) SIGN_DATA[11], forceData);
signs.remove(id);
}
}
@@ -26,10 +26,10 @@ class SignUpdateProcess {
int userid = ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT));
String query = "";
if (action == 0) {
query = "SELECT color, data, line_1, line_2, line_3, line_4 FROM " + ConfigHandler.prefix + "sign WHERE user='" + userid + "' AND wid='" + wid + "' AND x='" + x + "' AND z='" + z + "' AND y='" + y + "' AND time < '" + time + "' ORDER BY rowid DESC LIMIT 0, 1";
query = "SELECT color, color_secondary, data, waxed, face, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8 FROM " + ConfigHandler.prefix + "sign WHERE user='" + userid + "' AND wid='" + wid + "' AND x='" + x + "' AND z='" + z + "' AND y='" + y + "' AND time < '" + time + "' ORDER BY rowid DESC LIMIT 0, 1";
}
else {
query = "SELECT color, data, line_1, line_2, line_3, line_4 FROM " + ConfigHandler.prefix + "sign WHERE user='" + userid + "' AND wid='" + wid + "' AND x='" + x + "' AND z='" + z + "' AND y='" + y + "' AND time >= '" + time + "' ORDER BY rowid ASC LIMIT 0, 1";
query = "SELECT color, color_secondary, data, waxed, face, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8 FROM " + ConfigHandler.prefix + "sign WHERE user='" + userid + "' AND wid='" + wid + "' AND x='" + x + "' AND z='" + z + "' AND y='" + y + "' AND time >= '" + time + "' ORDER BY rowid ASC LIMIT 0, 1";
}
SignStatement.getData(statement, block, query);
Util.updateBlock(block);
@@ -21,7 +21,10 @@ class StructureGrowthProcess {
Map<Integer, List<BlockState>> blockLists = Consumer.consumerBlockList.get(processId);
if (blockLists.get(id) != null) {
List<BlockState> blockStates = blockLists.get(id);
String resultData = Lookup.whoPlaced(statement, block);
String resultData = Lookup.whoPlacedCache(block);
if (resultData.isEmpty()) {
resultData = Lookup.whoPlaced(statement, block);
}
if (resultData.length() > 0) {
user = resultData;
}
@@ -6,7 +6,6 @@ import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -24,6 +23,7 @@ import net.coreprotect.consumer.Queue;
import net.coreprotect.consumer.process.Process;
import net.coreprotect.language.Phrase;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Chat;
import net.coreprotect.utility.Util;
@@ -46,9 +46,9 @@ public class ContainerRollback extends Queue {
Queue.queueRollbackUpdate(userString, location, lookupList, Process.CONTAINER_ROLLBACK_UPDATE, rollbackType); // Perform update transaction in consumer
final String finalUserString = userString;
ConfigHandler.rollbackHash.put(userString, new int[] { 0, 0, 0, 0 });
ConfigHandler.rollbackHash.put(userString, new int[] { 0, 0, 0, 0, 0 });
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), new Runnable() {
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), new Runnable() {
@Override
public void run() {
try {
@@ -140,13 +140,13 @@ public class ContainerRollback extends Queue {
}
matchingFrames.clear();
ConfigHandler.rollbackHash.put(finalUserString, new int[] { itemCount, modifyCount, entityCount, 1 });
ConfigHandler.rollbackHash.put(finalUserString, new int[] { itemCount, modifyCount, entityCount, 1, 1 });
}
catch (Exception e) {
e.printStackTrace();
}
}
}, 0);
}, location, 0);
int[] rollbackHashData = ConfigHandler.rollbackHash.get(finalUserString);
int next = rollbackHashData[3];
@@ -215,7 +215,7 @@ public class Database extends Queue {
public static PreparedStatement prepareStatement(Connection connection, int type, boolean keys) {
PreparedStatement preparedStatement = null;
try {
String signInsert = "INSERT INTO " + ConfigHandler.prefix + "sign (time, user, wid, x, y, z, action, color, data, line_1, line_2, line_3, line_4) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
String signInsert = "INSERT INTO " + ConfigHandler.prefix + "sign (time, user, wid, x, y, z, action, color, color_secondary, data, waxed, face, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
String blockInsert = "INSERT INTO " + ConfigHandler.prefix + "block (time, user, wid, x, y, z, type, data, meta, blockdata, action, rolled_back) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
String skullInsert = "INSERT INTO " + ConfigHandler.prefix + "skull (time, owner) VALUES (?, ?)";
String containerInsert = "INSERT INTO " + ConfigHandler.prefix + "container (time, user, wid, x, y, z, type, data, amount, metadata, action, rolled_back) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
@@ -362,7 +362,7 @@ public class Database extends Queue {
index = ", INDEX(wid,x,z,time), INDEX(action,time), INDEX(user,time), INDEX(time)";
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "session(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int, user int, wid int, x int, y int (3), z int, action tinyint" + index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
index = ", INDEX(wid,x,z,time), INDEX(user,time), INDEX(time)";
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "sign(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int, user int, wid int, x int, y int, z int, action tinyint, color int, data tinyint, line_1 varchar(100), line_2 varchar(100), line_3 varchar(100), line_4 varchar(100)" + index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "sign(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int, user int, wid int, x int, y int, z int, action tinyint, color int, color_secondary int, data tinyint, waxed tinyint, face tinyint, line_1 varchar(100), line_2 varchar(100), line_3 varchar(100), line_4 varchar(100), line_5 varchar(100), line_6 varchar(100), line_7 varchar(100), line_8 varchar(100)" + index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "skull(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid), time int, owner varchar(64)) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
index = ", INDEX(user), INDEX(uuid)";
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "user(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int,user varchar(100),uuid varchar(64)" + index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
@@ -450,7 +450,7 @@ public class Database extends Queue {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "session (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, action INTEGER);");
}
if (!tableData.contains(prefix + "sign")) {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "sign (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, action INTEGER, color INTEGER, data INTEGER, line_1 TEXT, line_2 TEXT, line_3 TEXT, line_4 TEXT);");
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "sign (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, action INTEGER, color INTEGER, color_secondary INTEGER, data INTEGER, waxed INTEGER, face INTEGER, line_1 TEXT, line_2 TEXT, line_3 TEXT, line_4 TEXT, line_5 TEXT, line_6 TEXT, line_7 TEXT, line_8 TEXT);");
}
if (!tableData.contains(prefix + "skull")) {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "skull (id INTEGER PRIMARY KEY ASC, time INTEGER, owner TEXT);");
@@ -1,5 +1,6 @@
package net.coreprotect.database;
import java.nio.charset.StandardCharsets;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
@@ -55,7 +56,7 @@ public class Lookup extends Queue {
results[newId] = (String) map[i];
}
}
else if (i == 13 && map[i] instanceof Byte[]) {
else if (i == 13 && map[i] instanceof byte[]) {
results[newId] = Util.byteDataToString((byte[]) map[i], (int) map[6]);
}
else if (i > 0) { // skip rowid
@@ -65,6 +66,9 @@ public class Lookup extends Queue {
else if (map[i] instanceof String) {
results[newId] = (String) map[i];
}
else if (map[i] instanceof byte[]) {
results[newId] = new String((byte[]) map[i], StandardCharsets.ISO_8859_1);
}
}
}
catch (Exception e) {
@@ -187,36 +191,65 @@ public class Lookup extends Queue {
int resultX = results.getInt("x");
int resultY = results.getInt("y");
int resultZ = results.getInt("z");
boolean isFront = results.getInt("face") == 0;
String line1 = results.getString("line_1");
String line2 = results.getString("line_2");
String line3 = results.getString("line_3");
String line4 = results.getString("line_4");
String line5 = results.getString("line_5");
String line6 = results.getString("line_6");
String line7 = results.getString("line_7");
String line8 = results.getString("line_8");
StringBuilder message = new StringBuilder();
if (line1 != null && line1.length() > 0) {
if (isFront && line1 != null && line1.length() > 0) {
message.append(line1);
if (!line1.endsWith(" ")) {
message.append(" ");
}
}
if (line2 != null && line2.length() > 0) {
if (isFront && line2 != null && line2.length() > 0) {
message.append(line2);
if (!line2.endsWith(" ")) {
message.append(" ");
}
}
if (line3 != null && line3.length() > 0) {
if (isFront && line3 != null && line3.length() > 0) {
message.append(line3);
if (!line3.endsWith(" ")) {
message.append(" ");
}
}
if (line4 != null && line4.length() > 0) {
if (isFront && line4 != null && line4.length() > 0) {
message.append(line4);
if (!line4.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line5 != null && line5.length() > 0) {
message.append(line5);
if (!line5.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line6 != null && line6.length() > 0) {
message.append(line6);
if (!line6.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line7 != null && line7.length() > 0) {
message.append(line7);
if (!line7.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line8 != null && line8.length() > 0) {
message.append(line8);
if (!line8.endsWith(" ")) {
message.append(" ");
}
}
Object[] dataArray = new Object[] { resultId, resultTime, resultUserId, resultWorldId, resultX, resultY, resultZ, message.toString() };
list.add(dataArray);
@@ -592,7 +625,7 @@ public class Lookup extends Queue {
}
if (actionList.contains(10)) {
queryBlock = queryBlock + " action = '1' AND (LENGTH(line_1) > 0 OR LENGTH(line_2) > 0 OR LENGTH(line_3) > 0 OR LENGTH(line_4) > 0) AND";
queryBlock = queryBlock + " action = '1' AND (LENGTH(line_1) > 0 OR LENGTH(line_2) > 0 OR LENGTH(line_3) > 0 OR LENGTH(line_4) > 0 OR LENGTH(line_5) > 0 OR LENGTH(line_6) > 0 OR LENGTH(line_7) > 0 OR LENGTH(line_8) > 0) AND";
}
if (queryBlock.length() > 0) {
@@ -645,7 +678,7 @@ public class Lookup extends Queue {
}
else if (actionList.contains(10)) {
queryTable = "sign";
rows = "rowid as id,time,user,wid,x,y,z,line_1,line_2,line_3,line_4";
rows = "rowid as id,time,user,wid,x,y,z,face,line_1,line_2,line_3,line_4,line_5,line_6,line_7,line_8";
}
else if (actionList.contains(11)) {
queryTable = "item";
File diff suppressed because it is too large. Load diff
@@ -9,6 +9,7 @@ import org.bukkit.Material;
import net.coreprotect.CoreProtect;
import net.coreprotect.bukkit.BukkitAdapter;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.database.statement.BlockStatement;
import net.coreprotect.database.statement.UserStatement;
@@ -48,7 +49,9 @@ public class BlockBreakLogger {
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
if (Config.getGlobal().API_ENABLED) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
int wid = Util.getWorldId(location.getWorld().getName());
@@ -57,6 +60,11 @@ public class BlockBreakLogger {
int y = location.getBlockY();
int z = location.getBlockZ();
CacheHandler.breakCache.put("" + x + "." + y + "." + z + "." + wid + "", new Object[] { time, event.getUser(), type });
if (event.isCancelled()) {
return;
}
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, type, data, meta, blockData, 0, 0);
}
catch (Exception e) {
@@ -9,6 +9,7 @@ import org.bukkit.block.BlockState;
import net.coreprotect.CoreProtect;
import net.coreprotect.bukkit.BukkitAdapter;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.database.statement.BlockStatement;
import net.coreprotect.database.statement.UserStatement;
@@ -79,7 +80,9 @@ public class BlockPlaceLogger {
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
if (Config.getGlobal().API_ENABLED) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
int wid = Util.getWorldId(block.getWorld().getName());
@@ -89,8 +92,11 @@ public class BlockPlaceLogger {
CacheHandler.lookupCache.put("" + x + "." + y + "." + z + "." + wid + "", new Object[] { time, event.getUser(), type });
}
int internalType = Util.getBlockId(type.name(), true);
if (event.isCancelled()) {
return;
}
int internalType = Util.getBlockId(type.name(), true);
if (replacedType > 0 && Util.getType(replacedType) != Material.AIR && Util.getType(replacedType) != Material.CAVE_AIR) {
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, replacedType, replacedData, null, replaceBlockData, 0, 0);
}
@@ -6,6 +6,7 @@ import java.util.Locale;
import org.bukkit.Location;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.database.statement.CommandStatement;
import net.coreprotect.database.statement.UserStatement;
@@ -28,7 +29,13 @@ public class CommandLogger {
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
if (Config.getGlobal().API_ENABLED) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
int wid = Util.getWorldId(location.getWorld().getName());
@@ -9,12 +9,12 @@ import java.util.Map;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.ItemFrame;
import org.bukkit.inventory.EntityEquipment;
import org.bukkit.block.BlockFace;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.consumer.Queue;
import net.coreprotect.database.statement.ContainerStatement;
@@ -34,16 +34,12 @@ public class ContainerLogger extends Queue {
ItemStack[] contents = null;
String faceData = null;
if (type == Material.ARMOR_STAND) {
EntityEquipment equipment = (EntityEquipment) container;
if (equipment != null) {
contents = Util.getArmorStandContents(equipment);
}
if (type == Material.ITEM_FRAME) {
contents = (ItemStack[]) ((Object[]) container)[1];
faceData = ((BlockFace) ((Object[]) container)[2]).name();
}
else if (type == Material.ITEM_FRAME) {
ItemFrame itemFrame = (ItemFrame) container;
contents = Util.getItemFrameItem(itemFrame);
faceData = itemFrame.getFacing().name();
else if (type == Material.JUKEBOX || type == Material.ARMOR_STAND) {
contents = (ItemStack[]) ((Object[]) container)[1];
}
else {
Inventory inventory = (Inventory) container;
@@ -61,6 +57,9 @@ public class ContainerLogger extends Queue {
ItemStack[] oi1 = oldList.get(0);
ItemStack[] oldInventory = Util.getContainerState(oi1);
ItemStack[] newInventory = Util.getContainerState(contents);
if (oldInventory == null || newInventory == null) {
return;
}
List<ItemStack[]> forceList = ConfigHandler.forceContainer.get(loggingContainerId);
if (forceList != null) {
@@ -173,7 +172,13 @@ public class ContainerLogger extends Queue {
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
if (Config.getGlobal().API_ENABLED) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
int wid = Util.getWorldId(location.getWorld().getName());
@@ -8,6 +8,7 @@ import java.util.Locale;
import org.bukkit.block.BlockState;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.database.statement.BlockStatement;
import net.coreprotect.database.statement.EntityStatement;
@@ -28,7 +29,13 @@ public class EntityKillLogger {
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
if (Config.getGlobal().API_ENABLED) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
int wid = Util.getWorldId(block.getWorld().getName());
@@ -10,6 +10,7 @@ import org.bukkit.Location;
import org.bukkit.inventory.ItemStack;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.database.statement.ItemStatement;
import net.coreprotect.database.statement.UserStatement;
@@ -125,7 +126,13 @@ public class ItemLogger {
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
if (Config.getGlobal().API_ENABLED) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
int wid = Util.getWorldId(location.getWorld().getName());
@@ -7,6 +7,7 @@ import org.bukkit.Material;
import org.bukkit.block.BlockState;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.database.statement.BlockStatement;
import net.coreprotect.database.statement.UserStatement;
@@ -27,7 +28,13 @@ public class PlayerInteractLogger {
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
if (Config.getGlobal().API_ENABLED) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
int wid = Util.getWorldId(block.getWorld().getName());
@@ -6,6 +6,7 @@ import java.util.Locale;
import org.bukkit.block.BlockState;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.database.statement.BlockStatement;
import net.coreprotect.database.statement.UserStatement;
@@ -29,7 +30,13 @@ public class PlayerKillLogger {
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
if (Config.getGlobal().API_ENABLED) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
int playerId = ConfigHandler.playerIdCache.get(player.toLowerCase(Locale.ROOT));
@@ -6,6 +6,7 @@ import java.util.Locale;
import org.bukkit.Location;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.database.statement.SignStatement;
import net.coreprotect.database.statement.UserStatement;
@@ -18,14 +19,20 @@ public class SignTextLogger {
throw new IllegalStateException("Database class");
}
public static void log(PreparedStatement preparedStmt, int batchCount, String user, Location location, int action, int color, int data, String line1, String line2, String line3, String line4, int timeOffset) {
public static void log(PreparedStatement preparedStmt, int batchCount, String user, Location location, int action, int color, int colorSecondary, int data, boolean isWaxed, boolean isFront, String line1, String line2, String line3, String line4, String line5, String line6, String line7, String line8, int timeOffset) {
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
if (Config.getGlobal().API_ENABLED) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
int wid = Util.getWorldId(location.getWorld().getName());
@@ -33,7 +40,21 @@ public class SignTextLogger {
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
SignStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, action, color, data, line1, line2, line3, line4);
if (line1.isEmpty() && line2.isEmpty() && line3.isEmpty() && line4.isEmpty()) {
line1 = null;
line2 = null;
line3 = null;
line4 = null;
}
if (line5.isEmpty() && line6.isEmpty() && line7.isEmpty() && line8.isEmpty()) {
line5 = null;
line6 = null;
line7 = null;
line8 = null;
}
SignStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, action, color, colorSecondary, data, isWaxed ? 1 : 0, isFront ? 0 : 1, line1, line2, line3, line4, line5, line6, line7, line8);
}
catch (Exception e) {
e.printStackTrace();
@@ -2,6 +2,8 @@ package net.coreprotect.database.lookup;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.bukkit.Location;
@@ -18,8 +20,8 @@ import net.coreprotect.utility.Util;
public class ChestTransactionLookup {
public static String performLookup(String command, Statement statement, Location l, CommandSender commandSender, int page, int limit, boolean exact) {
String result = "";
public static List<String> performLookup(String command, Statement statement, Location l, CommandSender commandSender, int page, int limit, boolean exact) {
List<String> result = new ArrayList<>();
try {
if (l == null) {
@@ -67,13 +69,11 @@ public class ChestTransactionLookup {
int totalPages = (int) Math.ceil(count / (limit + 0.0));
query = "SELECT time,user,action,type,data,amount,rolled_back FROM " + ConfigHandler.prefix + "container " + Util.getWidIndex("container") + "WHERE wid = '" + worldId + "' AND (x = '" + x + "' OR x = '" + x2 + "') AND (z = '" + z + "' OR z = '" + z2 + "') AND y = '" + y + "' ORDER BY rowid DESC LIMIT " + pageStart + ", " + limit + "";
query = "SELECT time,user,action,type,data,amount,metadata,rolled_back FROM " + ConfigHandler.prefix + "container " + Util.getWidIndex("container") + "WHERE wid = '" + worldId + "' AND (x = '" + x + "' OR x = '" + x2 + "') AND (z = '" + z + "' OR z = '" + z2 + "') AND y = '" + y + "' ORDER BY rowid DESC LIMIT " + pageStart + ", " + limit + "";
if (exact) {
query = "SELECT time,user,action,type,data,amount,rolled_back FROM " + ConfigHandler.prefix + "container " + Util.getWidIndex("container") + "WHERE wid = '" + worldId + "' AND (x = '" + l.getBlockX() + "') AND (z = '" + l.getBlockZ() + "') AND y = '" + y + "' ORDER BY rowid DESC LIMIT " + pageStart + ", " + limit + "";
query = "SELECT time,user,action,type,data,amount,metadata,rolled_back FROM " + ConfigHandler.prefix + "container " + Util.getWidIndex("container") + "WHERE wid = '" + worldId + "' AND (x = '" + l.getBlockX() + "') AND (z = '" + l.getBlockZ() + "') AND y = '" + y + "' ORDER BY rowid DESC LIMIT " + pageStart + ", " + limit + "";
}
results = statement.executeQuery(query);
StringBuilder resultBuilder = new StringBuilder();
while (results.next()) {
int resultUserId = results.getInt("user");
int resultAction = results.getInt("action");
@@ -82,6 +82,8 @@ public class ChestTransactionLookup {
long resultTime = results.getLong("time");
int resultAmount = results.getInt("amount");
int resultRolledBack = results.getInt("rolled_back");
byte[] resultMetadata = results.getBytes("metadata");
String tooltip = Util.getEnchantments(resultMetadata, resultType, resultAmount);
if (ConfigHandler.playerIdCacheReversed.get(resultUserId) == null) {
UserStatement.loadName(statement.getConnection(), resultUserId);
@@ -91,7 +93,7 @@ public class ChestTransactionLookup {
String timeAgo = Util.getTimeSince(resultTime, time, true);
if (!found) {
resultBuilder = new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.CONTAINER_HEADER) + Color.WHITE + " ----- " + Util.getCoordinates(command, worldId, x, y, z, false, false) + "\n");
result.add(new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.CONTAINER_HEADER) + Color.WHITE + " ----- " + Util.getCoordinates(command, worldId, x, y, z, false, false)).toString());
}
found = true;
@@ -117,25 +119,23 @@ public class ChestTransactionLookup {
target = target.split(":")[1];
}
resultBuilder.append(timeAgo + " " + tag + " ").append(Phrase.build(Phrase.LOOKUP_CONTAINER, Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat, "x" + resultAmount, Color.DARK_AQUA + rbFormat + target + Color.WHITE, selector)).append("\n");
result.add(new StringBuilder(timeAgo + " " + tag + " " + Phrase.build(Phrase.LOOKUP_CONTAINER, Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat, "x" + resultAmount, Util.createTooltip(Color.DARK_AQUA + rbFormat + target, tooltip) + Color.WHITE, selector)).toString());
PluginChannelListener.getInstance().sendData(commandSender, resultTime, Phrase.LOOKUP_CONTAINER, selector, resultUser, target, resultAmount, x, y, z, worldId, rbFormat, true, tag.contains("+"));
}
result = resultBuilder.toString();
results.close();
if (found) {
if (count > limit) {
String pageInfo = Color.WHITE + "-----\n";
pageInfo = pageInfo + Util.getPageNavigation(command, page, totalPages) + "\n";
result = result + pageInfo;
result.add(Color.WHITE + "-----");
result.add(Util.getPageNavigation(command, page, totalPages));
}
}
else {
if (rowMax > count && count > 0) {
result = Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_RESULTS_PAGE, Selector.SECOND);
result.add(Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_RESULTS_PAGE, Selector.SECOND));
}
else {
result = Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_DATA_LOCATION, Selector.SECOND);
result.add(Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_DATA_LOCATION, Selector.SECOND));
}
}
@@ -4,6 +4,8 @@ import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
@@ -18,6 +20,8 @@ import net.coreprotect.utility.Util;
public class SignMessageLookup {
static Pattern pattern = Pattern.compile("§x(§[a-fA-F0-9]){6}");
public static List<String> performLookup(String command, Statement statement, Location l, CommandSender commandSender, int page, int limit) {
List<String> result = new ArrayList<>();
@@ -51,7 +55,7 @@ public class SignMessageLookup {
int rowMax = page * limit;
int pageStart = rowMax - limit;
String query = "SELECT COUNT(*) as count from " + ConfigHandler.prefix + "sign " + Util.getWidIndex("sign") + "WHERE wid = '" + worldId + "' AND x = '" + x + "' AND z = '" + z + "' AND y = '" + y + "' AND action = '1' AND (LENGTH(line_1) > 0 OR LENGTH(line_2) > 0 OR LENGTH(line_3) > 0 OR LENGTH(line_4) > 0) LIMIT 0, 1";
String query = "SELECT COUNT(*) as count from " + ConfigHandler.prefix + "sign " + Util.getWidIndex("sign") + "WHERE wid = '" + worldId + "' AND x = '" + x + "' AND z = '" + z + "' AND y = '" + y + "' AND action = '1' AND (LENGTH(line_1) > 0 OR LENGTH(line_2) > 0 OR LENGTH(line_3) > 0 OR LENGTH(line_4) > 0 OR LENGTH(line_5) > 0 OR LENGTH(line_6) > 0 OR LENGTH(line_7) > 0 OR LENGTH(line_8) > 0) LIMIT 0, 1";
ResultSet results = statement.executeQuery(query);
while (results.next()) {
@@ -61,7 +65,7 @@ public class SignMessageLookup {
int totalPages = (int) Math.ceil(count / (limit + 0.0));
query = "SELECT time,user,line_1,line_2,line_3,line_4 FROM " + ConfigHandler.prefix + "sign " + Util.getWidIndex("sign") + "WHERE wid = '" + worldId + "' AND x = '" + x + "' AND z = '" + z + "' AND y = '" + y + "' AND action = '1' AND (LENGTH(line_1) > 0 OR LENGTH(line_2) > 0 OR LENGTH(line_3) > 0 OR LENGTH(line_4) > 0) ORDER BY rowid DESC LIMIT " + pageStart + ", " + limit + "";
query = "SELECT time,user,face,line_1,line_2,line_3,line_4,line_5,line_6,line_7,line_8 FROM " + ConfigHandler.prefix + "sign " + Util.getWidIndex("sign") + "WHERE wid = '" + worldId + "' AND x = '" + x + "' AND z = '" + z + "' AND y = '" + y + "' AND action = '1' AND (LENGTH(line_1) > 0 OR LENGTH(line_2) > 0 OR LENGTH(line_3) > 0 OR LENGTH(line_4) > 0 OR LENGTH(line_5) > 0 OR LENGTH(line_6) > 0 OR LENGTH(line_7) > 0 OR LENGTH(line_8) > 0) ORDER BY rowid DESC LIMIT " + pageStart + ", " + limit + "";
results = statement.executeQuery(query);
while (results.next()) {
@@ -71,32 +75,69 @@ public class SignMessageLookup {
String line2 = results.getString("line_2");
String line3 = results.getString("line_3");
String line4 = results.getString("line_4");
String line5 = results.getString("line_5");
String line6 = results.getString("line_6");
String line7 = results.getString("line_7");
String line8 = results.getString("line_8");
boolean isFront = results.getInt("face") == 0;
StringBuilder message = new StringBuilder();
if (line1 != null && line1.length() > 0) {
if (isFront && line1 != null && line1.length() > 0) {
message.append(line1);
if (!line1.endsWith(" ")) {
message.append(" ");
}
}
if (line2 != null && line2.length() > 0) {
if (isFront && line2 != null && line2.length() > 0) {
message.append(line2);
if (!line2.endsWith(" ")) {
message.append(" ");
}
}
if (line3 != null && line3.length() > 0) {
if (isFront && line3 != null && line3.length() > 0) {
message.append(line3);
if (!line3.endsWith(" ")) {
message.append(" ");
}
}
if (line4 != null && line4.length() > 0) {
if (isFront && line4 != null && line4.length() > 0) {
message.append(line4);
if (!line4.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line5 != null && line5.length() > 0) {
message.append(line5);
if (!line5.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line6 != null && line6.length() > 0) {
message.append(line6);
if (!line6.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line7 != null && line7.length() > 0) {
message.append(line7);
if (!line7.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line8 != null && line8.length() > 0) {
message.append(line8);
if (!line8.endsWith(" ")) {
message.append(" ");
}
}
String parsedMessage = message.toString();
if (parsedMessage.contains("§x")) {
for (Matcher matcher = pattern.matcher(parsedMessage); matcher.find(); matcher = pattern.matcher(parsedMessage)) {
String color = parsedMessage.substring(matcher.start(), matcher.end());
parsedMessage = parsedMessage.replace(color, "");
}
}
if (ConfigHandler.playerIdCacheReversed.get(resultUserId) == null) {
UserStatement.loadName(statement.getConnection(), resultUserId);
@@ -109,7 +150,7 @@ public class SignMessageLookup {
result.add(new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.SIGN_HEADER) + Color.WHITE + " ----- " + Util.getCoordinates(command, worldId, x, y, z, false, false) + "").toString());
}
found = true;
result.add(timeAgo + Color.WHITE + " - " + Color.DARK_AQUA + resultUser + ": " + Color.WHITE + "\n" + message.toString() + Color.WHITE);
result.add(timeAgo + Color.WHITE + " - " + Color.DARK_AQUA + resultUser + ": " + Color.WHITE + "\n" + parsedMessage + Color.WHITE);
PluginChannelListener.getInstance().sendMessageData(commandSender, resultTime, resultUser, message.toString(), true, x, y, z, worldId);
}
results.close();
@@ -4,12 +4,11 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.bukkit.Color;
import org.bukkit.DyeColor;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import net.coreprotect.bukkit.BukkitAdapter;
import net.coreprotect.utility.Util;
public class SignStatement {
@@ -17,7 +16,7 @@ public class SignStatement {
throw new IllegalStateException("Database class");
}
public static void insert(PreparedStatement preparedStmt, int batchCount, int time, int id, int wid, int x, int y, int z, int action, int color, int data, String line1, String line2, String line3, String line4) {
public static void insert(PreparedStatement preparedStmt, int batchCount, int time, int id, int wid, int x, int y, int z, int action, int color, int colorSecondary, int data, int waxed, int face, String line1, String line2, String line3, String line4, String line5, String line6, String line7, String line8) {
try {
preparedStmt.setInt(1, time);
preparedStmt.setInt(2, id);
@@ -27,11 +26,18 @@ public class SignStatement {
preparedStmt.setInt(6, z);
preparedStmt.setInt(7, action);
preparedStmt.setInt(8, color);
preparedStmt.setInt(9, data);
preparedStmt.setString(10, line1);
preparedStmt.setString(11, line2);
preparedStmt.setString(12, line3);
preparedStmt.setString(13, line4);
preparedStmt.setInt(9, colorSecondary);
preparedStmt.setInt(10, data);
preparedStmt.setInt(11, waxed);
preparedStmt.setInt(12, face);
preparedStmt.setString(13, line1);
preparedStmt.setString(14, line2);
preparedStmt.setString(15, line3);
preparedStmt.setString(16, line4);
preparedStmt.setString(17, line5);
preparedStmt.setString(18, line6);
preparedStmt.setString(19, line7);
preparedStmt.setString(20, line8);
preparedStmt.addBatch();
if (batchCount > 0 && batchCount % 1000 == 0) {
@@ -54,24 +60,39 @@ public class SignStatement {
while (resultSet.next()) {
int color = resultSet.getInt("color");
int colorSecondary = resultSet.getInt("color_secondary");
int data = resultSet.getInt("data");
boolean isWaxed = resultSet.getInt("waxed") == 1;
// boolean isFront = resultSet.getInt("face") == 0;
String line1 = resultSet.getString("line_1");
String line2 = resultSet.getString("line_2");
String line3 = resultSet.getString("line_3");
String line4 = resultSet.getString("line_4");
String line5 = resultSet.getString("line_5");
String line6 = resultSet.getString("line_6");
String line7 = resultSet.getString("line_7");
String line8 = resultSet.getString("line_8");
if (color > 0) {
sign.setColor(DyeColor.getByColor(Color.fromRGB(color)));
BukkitAdapter.ADAPTER.setColor(sign, true, color);
}
if (colorSecondary > 0) {
BukkitAdapter.ADAPTER.setColor(sign, false, colorSecondary);
}
if (data > 0) {
BukkitAdapter.ADAPTER.setGlowing(sign, (data == 1 ? true : false));
}
sign.setLine(0, line1);
sign.setLine(1, line2);
sign.setLine(2, line3);
sign.setLine(3, line4);
boolean frontGlowing = Util.isSideGlowing(true, data);
boolean backGlowing = Util.isSideGlowing(false, data);
BukkitAdapter.ADAPTER.setGlowing(sign, true, frontGlowing);
BukkitAdapter.ADAPTER.setGlowing(sign, false, backGlowing);
BukkitAdapter.ADAPTER.setLine(sign, 0, line1);
BukkitAdapter.ADAPTER.setLine(sign, 1, line2);
BukkitAdapter.ADAPTER.setLine(sign, 2, line3);
BukkitAdapter.ADAPTER.setLine(sign, 3, line4);
BukkitAdapter.ADAPTER.setLine(sign, 4, line5);
BukkitAdapter.ADAPTER.setLine(sign, 5, line6);
BukkitAdapter.ADAPTER.setLine(sign, 6, line7);
BukkitAdapter.ADAPTER.setLine(sign, 7, line8);
BukkitAdapter.ADAPTER.setWaxed(sign, isWaxed);
}
resultSet.close();
@@ -6,6 +6,7 @@ import org.bukkit.event.HandlerList;
public class CoreProtectPreLogEvent extends Event {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled = false;
private String user;
public CoreProtectPreLogEvent(String user) {
@@ -17,6 +18,14 @@ public class CoreProtectPreLogEvent extends Event {
return user;
}
public boolean isCancelled() {
return cancelled;
}
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
public void setUser(String newUser) {
if (newUser == null || newUser.isEmpty()) {
throw new IllegalArgumentException("Invalid user");
@@ -216,7 +216,8 @@ public enum Phrase {
final private static Set<Phrase> HEADERS = new HashSet<>(Arrays.asList(Phrase.CONTAINER_HEADER, Phrase.HELP_HEADER, Phrase.INTERACTIONS_HEADER, Phrase.LOOKUP_HEADER, Phrase.SIGN_HEADER, Phrase.UPDATE_HEADER));
final private static Set<String> COLORS = new HashSet<>(Arrays.asList(Color.WHITE, Color.DARK_AQUA));
final private static String split = ":";
final private static String SPLIT = ":";
final private static String FULL_WIDTH_SPLIT = ":";
public String getPhrase() {
return Language.getPhrase(this);
@@ -265,7 +266,8 @@ public enum Phrase {
}
if (color.length() > 0) {
output = output.replaceFirst(split, split + color);
output = output.replaceFirst(SPLIT, SPLIT + color);
output = output.replaceFirst(FULL_WIDTH_SPLIT, FULL_WIDTH_SPLIT + color);
output = ChatMessage.parseQuotes(output, color);
}
@@ -15,6 +15,7 @@ import net.coreprotect.listener.block.BlockIgniteListener;
import net.coreprotect.listener.block.BlockPistonListener;
import net.coreprotect.listener.block.BlockPlaceListener;
import net.coreprotect.listener.block.BlockSpreadListener;
import net.coreprotect.listener.block.CampfireStartListener;
import net.coreprotect.listener.channel.PluginChannelHandshakeListener;
import net.coreprotect.listener.channel.PluginChannelListener;
import net.coreprotect.listener.entity.CreatureSpawnListener;
@@ -52,6 +53,7 @@ import net.coreprotect.listener.world.ChunkPopulateListener;
import net.coreprotect.listener.world.LeavesDecayListener;
import net.coreprotect.listener.world.PortalCreateListener;
import net.coreprotect.listener.world.StructureGrowListener;
import net.coreprotect.paper.listener.BlockPreDispenseListener;
import net.coreprotect.paper.listener.PaperChatListener;
public final class ListenerHandler {
@@ -60,6 +62,15 @@ public final class ListenerHandler {
PluginManager pluginManager = plugin.getServer().getPluginManager();
// Paper Listeners / Fallbacks (Block Listeners)
try {
Class.forName("io.papermc.paper.event.block.BlockPreDispenseEvent"); // Paper 1.16+
pluginManager.registerEvents(new BlockPreDispenseListener(), plugin);
}
catch (Exception e) {
BlockPreDispenseListener.useBlockPreDispenseEvent = false;
}
// Block Listeners
pluginManager.registerEvents(new BlockBreakListener(), plugin);
pluginManager.registerEvents(new BlockBurnListener(), plugin);
@@ -73,6 +84,13 @@ public final class ListenerHandler {
pluginManager.registerEvents(new BlockPistonListener(), plugin);
pluginManager.registerEvents(new BlockPlaceListener(), plugin);
pluginManager.registerEvents(new BlockSpreadListener(), plugin);
try {
Class.forName("org.bukkit.event.block.CampfireStartEvent"); // Bukkit 1.20+
pluginManager.registerEvents(new CampfireStartListener(), plugin);
}
catch (Exception e) {
CampfireStartListener.useCampfireStartEvent = false;
}
// Entity Listeners
pluginManager.registerEvents(new CreatureSpawnListener(), plugin);
@@ -88,6 +106,15 @@ public final class ListenerHandler {
pluginManager.registerEvents(new HangingBreakListener(), plugin);
pluginManager.registerEvents(new HangingBreakByEntityListener(), plugin);
// Paper Listeners / Fallbacks (Player Listeners)
try {
Class.forName("net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer"); // Paper 1.16+
pluginManager.registerEvents(new PaperChatListener(), plugin);
}
catch (Exception e) {
pluginManager.registerEvents(new PlayerChatListener(), plugin);
}
// Player Listeners
pluginManager.registerEvents(new ArmorStandManipulateListener(), plugin);
pluginManager.registerEvents(new CraftItemListener(), plugin);
@@ -115,15 +142,6 @@ public final class ListenerHandler {
pluginManager.registerEvents(new PortalCreateListener(), plugin);
pluginManager.registerEvents(new StructureGrowListener(), plugin);
// Paper Listeners / Fallbacks
try {
Class.forName("net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer");
pluginManager.registerEvents(new PaperChatListener(), plugin);
}
catch (Exception e) {
pluginManager.registerEvents(new PlayerChatListener(), plugin);
}
// Plugin channel events
pluginManager.registerEvents(new PluginChannelListener(), plugin);
}
@@ -7,7 +7,6 @@ import java.util.Locale;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.World;
import org.bukkit.block.Banner;
import org.bukkit.block.Block;
@@ -38,6 +37,7 @@ import net.coreprotect.config.Config;
import net.coreprotect.consumer.Queue;
import net.coreprotect.database.Database;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.paper.PaperAdapter;
import net.coreprotect.utility.Util;
public final class BlockBreakListener extends Queue implements Listener {
@@ -125,7 +125,7 @@ public final class BlockBreakListener extends Queue implements Listener {
Block scanBlock = world.getBlockAt(scanLocation);
Material scanType = scanBlock.getType();
if (scanMin == 5) {
if (scanType.hasGravity()) {
if (scanType.hasGravity() || BukkitAdapter.ADAPTER.isSuspiciousBlock(scanType)) {
if (Config.getConfig(world).BLOCK_MOVEMENT) {
// log the top-most sand/gravel block as being removed
int scanY = y + 2;
@@ -133,7 +133,7 @@ public final class BlockBreakListener extends Queue implements Listener {
while (!topFound) {
Block topBlock = world.getBlockAt(x, scanY, z);
Material topMaterial = topBlock.getType();
if (!topMaterial.hasGravity()) {
if (!topMaterial.hasGravity() && !BukkitAdapter.ADAPTER.isSuspiciousBlock(topMaterial)) {
scanLocation = new Location(world, x, (scanY - 1), z);
topFound = true;
}
@@ -209,7 +209,7 @@ public final class BlockBreakListener extends Queue implements Listener {
}
}
else if (scanMin == 5) {
if (scanType.hasGravity()) {
if (scanType.hasGravity() || BukkitAdapter.ADAPTER.isSuspiciousBlock(scanType)) {
log = true;
}
}
@@ -273,18 +273,28 @@ public final class BlockBreakListener extends Queue implements Listener {
e.printStackTrace();
}
}
if (log && Tag.SIGNS.isTagged(blockType)) {
if (log && BukkitAdapter.ADAPTER.isSign(blockType)) {
if (Config.getConfig(world).SIGN_TEXT) {
try {
Location location = blockState.getLocation();
Sign sign = (Sign) blockLog.getState();
String line1 = sign.getLine(0);
String line2 = sign.getLine(1);
String line3 = sign.getLine(2);
String line4 = sign.getLine(3);
int color = sign.getColor().getColor().asRGB();
boolean isGlowing = BukkitAdapter.ADAPTER.isGlowing(sign);
Queue.queueSignText(user, location, 0, color, isGlowing, line1, line2, line3, line4, 5);
String line1 = PaperAdapter.ADAPTER.getLine(sign, 0);
String line2 = PaperAdapter.ADAPTER.getLine(sign, 1);
String line3 = PaperAdapter.ADAPTER.getLine(sign, 2);
String line4 = PaperAdapter.ADAPTER.getLine(sign, 3);
String line5 = PaperAdapter.ADAPTER.getLine(sign, 4);
String line6 = PaperAdapter.ADAPTER.getLine(sign, 5);
String line7 = PaperAdapter.ADAPTER.getLine(sign, 6);
String line8 = PaperAdapter.ADAPTER.getLine(sign, 7);
boolean isFront = true;
int color = BukkitAdapter.ADAPTER.getColor(sign, isFront);
int colorSecondary = BukkitAdapter.ADAPTER.getColor(sign, !isFront);
boolean frontGlowing = BukkitAdapter.ADAPTER.isGlowing(sign, isFront);
boolean backGlowing = BukkitAdapter.ADAPTER.isGlowing(sign, !isFront);
boolean isWaxed = BukkitAdapter.ADAPTER.isWaxed(sign);
Queue.queueSignText(user, location, 0, color, colorSecondary, frontGlowing, backGlowing, isWaxed, isFront, line1, line2, line3, line4, line5, line6, line7, line8, 5);
}
catch (Exception e) {
e.printStackTrace();
@@ -315,7 +325,10 @@ public final class BlockBreakListener extends Queue implements Listener {
}
for (Block placementBlock : placementMap) {
queueBlockPlace(user, block.getState(), placementBlock.getType(), null, null, -1, 0, placementBlock.getBlockData().getAsString());
Material placementType = placementBlock.getType();
if (placementType.hasGravity()) {
queueBlockPlace(user, block.getState(), placementType, null, null, -1, 0, placementBlock.getBlockData().getAsString());
}
}
}
@@ -24,6 +24,7 @@ import net.coreprotect.config.Config;
import net.coreprotect.consumer.Queue;
import net.coreprotect.listener.player.InventoryChangeListener;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.paper.listener.BlockPreDispenseListener;
import net.coreprotect.thread.CacheHandler;
public final class BlockDispenseListener extends Queue implements Listener {
@@ -48,20 +49,22 @@ public final class BlockDispenseListener extends Queue implements Listener {
boolean dispenseSuccess = !event.getVelocity().equals(new Vector()); // true if velocity is set
boolean dispenseRelative = newBlock.getLocation().equals(velocityLocation); // true if velocity location matches relative location
if (dispenseRelative || material.equals(Material.FLINT_AND_STEEL) || material.equals(Material.SHEARS)) {
forceItem = false;
}
if (!BlockPreDispenseListener.useBlockPreDispenseEvent) {
if (dispenseRelative || material.equals(Material.FLINT_AND_STEEL) || material.equals(Material.SHEARS)) {
forceItem = false;
}
if (block.getType() == Material.DROPPER) {
forceItem = true; // droppers always drop items
}
if (block.getType() == Material.DROPPER) {
forceItem = true; // droppers always drop items
}
ItemStack[] inventory = ((InventoryHolder) block.getState()).getInventory().getStorageContents();
if (forceItem) {
inventory = Arrays.copyOf(inventory, inventory.length + 1);
inventory[inventory.length - 1] = item;
ItemStack[] inventory = ((InventoryHolder) block.getState()).getInventory().getStorageContents();
if (forceItem) {
inventory = Arrays.copyOf(inventory, inventory.length + 1);
inventory[inventory.length - 1] = item;
}
InventoryChangeListener.inventoryTransaction(user, block.getLocation(), inventory);
}
InventoryChangeListener.inventoryTransaction(user, block.getLocation(), inventory);
if (material.equals(Material.WATER_BUCKET)) {
type = Material.WATER;
@@ -8,7 +8,6 @@ import java.util.Map;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
@@ -26,6 +25,7 @@ import net.coreprotect.config.Config;
import net.coreprotect.consumer.Queue;
import net.coreprotect.database.Database;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.paper.PaperAdapter;
public final class BlockExplodeListener extends Queue implements Listener {
@@ -114,17 +114,27 @@ public final class BlockExplodeListener extends Queue implements Listener {
Block block = entry.getValue();
Material blockType = block.getType();
BlockState blockState = block.getState();
if (Tag.SIGNS.isTagged(blockType) && Config.getConfig(world).SIGN_TEXT) {
if (BukkitAdapter.ADAPTER.isSign(blockType) && Config.getConfig(world).SIGN_TEXT) {
try {
Location location = blockState.getLocation();
Sign sign = (Sign) blockState;
String line1 = sign.getLine(0);
String line2 = sign.getLine(1);
String line3 = sign.getLine(2);
String line4 = sign.getLine(3);
int color = sign.getColor().getColor().asRGB();
boolean isGlowing = BukkitAdapter.ADAPTER.isGlowing(sign);
Queue.queueSignText(user, location, 0, color, isGlowing, line1, line2, line3, line4, 5);
String line1 = PaperAdapter.ADAPTER.getLine(sign, 0);
String line2 = PaperAdapter.ADAPTER.getLine(sign, 1);
String line3 = PaperAdapter.ADAPTER.getLine(sign, 2);
String line4 = PaperAdapter.ADAPTER.getLine(sign, 3);
String line5 = PaperAdapter.ADAPTER.getLine(sign, 4);
String line6 = PaperAdapter.ADAPTER.getLine(sign, 5);
String line7 = PaperAdapter.ADAPTER.getLine(sign, 6);
String line8 = PaperAdapter.ADAPTER.getLine(sign, 7);
boolean isFront = true;
int color = BukkitAdapter.ADAPTER.getColor(sign, isFront);
int colorSecondary = BukkitAdapter.ADAPTER.getColor(sign, !isFront);
boolean frontGlowing = BukkitAdapter.ADAPTER.isGlowing(sign, isFront);
boolean backGlowing = BukkitAdapter.ADAPTER.isGlowing(sign, !isFront);
boolean isWaxed = BukkitAdapter.ADAPTER.isWaxed(sign);
Queue.queueSignText(user, location, 0, color, colorSecondary, frontGlowing, backGlowing, isWaxed, isFront, line1, line2, line3, line4, line5, line6, line7, line8, 5);
}
catch (Exception e) {
e.printStackTrace();
@@ -1,6 +1,7 @@
package net.coreprotect.listener.block;
import java.util.List;
import java.util.Locale;
import org.bukkit.Location;
import org.bukkit.Tag;
@@ -30,7 +31,10 @@ public final class BlockFertilizeListener extends Queue implements Listener {
Location location = block.getLocation();
List<BlockState> blocks = event.getBlocks();
if (blocks.size() == 1 && blocks.get(0).getLocation().equals(location) && Tag.SAPLINGS.isTagged(block.getType())) {
if (Tag.SAPLINGS.isTagged(block.getType()) && (!Config.getConfig(location.getWorld()).TREE_GROWTH || (blocks.size() == 1 && blocks.get(0).getLocation().equals(location)))) {
return;
}
if (block.getType().name().toLowerCase(Locale.ROOT).contains("mushroom") && (!Config.getConfig(location.getWorld()).MUSHROOM_GROWTH || (blocks.size() == 1 && blocks.get(0).getLocation().equals(location)))) {
return;
}
@@ -20,10 +20,11 @@ public final class BlockFormListener extends Queue implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
protected void onBlockForm(BlockFormEvent event) {
// random form, snow/ice
World world = event.getBlock().getWorld();
Block block = event.getBlock();
World world = block.getWorld();
BlockState newState = event.getNewState();
if (Config.getConfig(world).LIQUID_TRACKING && (newState.getType().equals(Material.OBSIDIAN) || newState.getType().equals(Material.COBBLESTONE) || event.getBlock().getType().name().endsWith("_CONCRETE_POWDER"))) {
Block block = event.getBlock();
boolean log = false;
if (Config.getConfig(world).LIQUID_TRACKING && (newState.getType().equals(Material.OBSIDIAN) || newState.getType().equals(Material.COBBLESTONE) || block.getType().name().endsWith("_CONCRETE_POWDER"))) {
String player = Lookup.whoPlacedCache(block);
int wid = Util.getWorldId(world.getName());
if (!(player.length() > 0)) {
@@ -58,7 +59,7 @@ public final class BlockFormListener extends Queue implements Listener {
}
}
if (player.length() > 0) {
boolean log = true;
log = true;
/*
if (newState.getType().equals(Material.COBBLESTONE)) {
log = false;
@@ -78,6 +79,9 @@ public final class BlockFormListener extends Queue implements Listener {
}
}
}
if (!log && Config.getConfig(world).UNKNOWN_LOGGING && Lookup.whoPlacedCache(block).length() == 0) {
Queue.queueBlockPlace("#unknown", block.getLocation().getBlock().getState(), block.getType(), block.getState(), newState.getType(), -1, 0, newState.getBlockData().getAsString());
}
}
}
@@ -87,6 +87,39 @@ public final class BlockFromToListener extends Queue implements Listener {
CacheHandler.lookupCache.put("" + x + "." + y + "." + z + "." + wid + "", new Object[] { unixtimestamp, f, type });
Queue.queueBlockPlace(f, toBlock.getState(), block.getType(), toBlockState, type, -1, 0, blockData.getAsString());
}
else if (type.equals(Material.DRAGON_EGG)) {
Location location = block.getLocation();
int worldId = Util.getWorldId(location.getWorld().getName());
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
String coordinates = x + "." + y + "." + z + "." + worldId + "." + type.name();
String user = "#entity";
Object[] data = CacheHandler.interactCache.get(coordinates);
if (data != null && data[1] == Material.DRAGON_EGG) {
long newTime = System.currentTimeMillis();
long oldTime = (long) data[0];
if ((newTime - oldTime) < 20) { // 50ms = 1 tick
user = (String) data[2];
}
CacheHandler.interactCache.remove(coordinates);
}
if (Config.getConfig(block.getWorld()).BLOCK_BREAK) {
Queue.queueBlockBreak(user, block.getState(), block.getType(), block.getBlockData().getAsString(), 0);
}
if (Config.getConfig(block.getWorld()).BLOCK_PLACE) {
Block toBlock = event.getToBlock();
BlockState toBlockState = toBlock.getState();
if (Config.getConfig(world).BLOCK_MOVEMENT) {
toBlockState = BlockUtil.gravityScan(toBlock.getLocation(), type, user).getState();
}
Queue.queueBlockPlace(user, toBlockState, block.getType(), toBlockState, type, -1, 0, blockData.getAsString());
}
}
}
}
@@ -4,7 +4,6 @@ import java.util.Locale;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
@@ -28,6 +27,7 @@ import net.coreprotect.config.Config;
import net.coreprotect.consumer.Queue;
import net.coreprotect.listener.player.InventoryChangeListener;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.paper.PaperAdapter;
import net.coreprotect.utility.Util;
public final class BlockPlaceListener extends Queue implements Listener {
@@ -106,19 +106,29 @@ public final class BlockPlaceListener extends Queue implements Listener {
Queue.queueBlockPlace(player.getName(), blockState, blockPlaced.getType(), blockReplaced, forceType, forceData, 0, bBlockData);
if (Tag.SIGNS.isTagged(blockType)) {
if (BukkitAdapter.ADAPTER.isSign(blockType)) {
if (Config.getConfig(world).SIGN_TEXT) {
try {
Location location = blockState.getLocation();
Sign sign = (Sign) blockState;
String line1 = sign.getLine(0);
String line2 = sign.getLine(1);
String line3 = sign.getLine(2);
String line4 = sign.getLine(3);
int color = sign.getColor().getColor().asRGB();
boolean isGlowing = BukkitAdapter.ADAPTER.isGlowing(sign);
if (line1.length() > 0 || line2.length() > 0 || line3.length() > 0 || line4.length() > 0) {
Queue.queueSignText(player.getName(), location, 1, color, isGlowing, line1, line2, line3, line4, 0);
String line1 = PaperAdapter.ADAPTER.getLine(sign, 0);
String line2 = PaperAdapter.ADAPTER.getLine(sign, 1);
String line3 = PaperAdapter.ADAPTER.getLine(sign, 2);
String line4 = PaperAdapter.ADAPTER.getLine(sign, 3);
String line5 = PaperAdapter.ADAPTER.getLine(sign, 4);
String line6 = PaperAdapter.ADAPTER.getLine(sign, 5);
String line7 = PaperAdapter.ADAPTER.getLine(sign, 6);
String line8 = PaperAdapter.ADAPTER.getLine(sign, 7);
boolean isFront = true;
int color = BukkitAdapter.ADAPTER.getColor(sign, isFront);
int colorSecondary = BukkitAdapter.ADAPTER.getColor(sign, !isFront);
boolean frontGlowing = BukkitAdapter.ADAPTER.isGlowing(sign, isFront);
boolean backGlowing = BukkitAdapter.ADAPTER.isGlowing(sign, !isFront);
boolean isWaxed = BukkitAdapter.ADAPTER.isWaxed(sign);
if (line1.length() > 0 || line2.length() > 0 || line3.length() > 0 || line4.length() > 0 || line5.length() > 0 || line6.length() > 0 || line7.length() > 0 || line8.length() > 0) {
Queue.queueSignText(player.getName(), location, 1, color, colorSecondary, frontGlowing, backGlowing, isWaxed, isFront, line1, line2, line3, line4, line5, line6, line7, line8, 0);
}
}
catch (Exception e) {
@@ -0,0 +1,50 @@
package net.coreprotect.listener.block;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.CampfireStartEvent;
import org.bukkit.inventory.ItemStack;
import net.coreprotect.consumer.Queue;
import net.coreprotect.listener.player.PlayerDropItemListener;
import net.coreprotect.thread.CacheHandler;
import net.coreprotect.utility.Util;
public final class CampfireStartListener extends Queue implements Listener {
public static boolean useCampfireStartEvent = true;
@EventHandler(priority = EventPriority.MONITOR)
protected void onCampfireStart(CampfireStartEvent event) {
Block block = event.getBlock();
Location location = block.getLocation();
int worldId = Util.getWorldId(location.getWorld().getName());
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
String coordinates = x + "." + y + "." + z + "." + worldId + "." + block.getType().name();
String user = "#entity";
Object[] data = CacheHandler.interactCache.get(coordinates);
if (data != null && data[1].equals(event.getSource())) {
long newTime = System.currentTimeMillis();
long oldTime = (long) data[0];
if ((newTime - oldTime) < 20) { // 50ms = 1 tick
user = (String) data[2];
}
CacheHandler.interactCache.remove(coordinates);
}
if (user.equals("#entity")) {
return;
}
ItemStack itemStack = event.getSource().clone();
itemStack.setAmount(1);
PlayerDropItemListener.playerDropItem(event.getBlock().getLocation(), user, itemStack);
}
}
@@ -12,6 +12,7 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageByBlockEvent;
import org.bukkit.inventory.ItemStack;
import net.coreprotect.config.Config;
import net.coreprotect.consumer.Queue;
@@ -45,7 +46,9 @@ public final class EntityDamageByBlockListener extends Queue implements Listener
if (entity instanceof ItemFrame && Config.getConfig(entity.getWorld()).ITEM_TRANSACTIONS) {
ItemFrame frame = (ItemFrame) entity;
if (frame.getItem().getType() != Material.AIR) {
PlayerInteractEntityListener.queueFrameTransaction(user, frame, false);
ItemStack[] oldState = new ItemStack[] { frame.getItem().clone() };
ItemStack[] newState = new ItemStack[] { new ItemStack(Material.AIR) };
PlayerInteractEntityListener.queueContainerSpecifiedItems(user, Material.ITEM_FRAME, new Object[] { oldState, newState, frame.getFacing() }, frame.getLocation(), false);
}
}
else if (entity instanceof ArmorStand && Config.getConfig(entity.getWorld()).BLOCK_BREAK) {
@@ -2,7 +2,6 @@ package net.coreprotect.listener.entity;
import java.util.Locale;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -35,6 +34,7 @@ import net.coreprotect.config.ConfigHandler;
import net.coreprotect.consumer.Queue;
import net.coreprotect.database.Database;
import net.coreprotect.listener.player.PlayerInteractEntityListener;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Util;
public final class EntityDamageByEntityListener extends Queue implements Listener {
@@ -113,7 +113,9 @@ public final class EntityDamageByEntityListener extends Queue implements Listene
if (entity instanceof ItemFrame && Config.getConfig(entityLocation.getWorld()).ITEM_TRANSACTIONS) {
ItemFrame frame = (ItemFrame) entity;
if (frame.getItem().getType() != Material.AIR) {
PlayerInteractEntityListener.queueFrameTransaction(user, frame, logDrops);
ItemStack[] oldState = new ItemStack[] { frame.getItem().clone() };
ItemStack[] newState = new ItemStack[] { new ItemStack(Material.AIR) };
PlayerInteractEntityListener.queueContainerSpecifiedItems(user, Material.ITEM_FRAME, new Object[] { oldState, newState, frame.getFacing() }, frame.getLocation(), logDrops);
}
}
else if (entity instanceof EnderCrystal && Config.getConfig(entity.getWorld()).BLOCK_BREAK) {
@@ -125,13 +127,13 @@ public final class EntityDamageByEntityListener extends Queue implements Listene
if (Config.getConfig(entityLocation.getWorld()).ITEM_TRANSACTIONS) {
String killer = user;
ItemStack[] contents = Util.getContainerContents(Material.ARMOR_STAND, entity, block.getLocation());
Bukkit.getScheduler().runTask(CoreProtect.getInstance(), () -> {
Scheduler.runTask(CoreProtect.getInstance(), () -> {
if (entity != null && entity.isDead()) {
entityLocation.setY(entityLocation.getY() + 0.99);
Database.containerBreakCheck(killer, Material.ARMOR_STAND, entity, contents, block.getLocation());
Queue.queueBlockBreak(killer, block.getState(), Material.ARMOR_STAND, null, (int) entityLocation.getYaw());
}
});
}, entity);
}
}
}
@@ -20,6 +20,7 @@ import org.bukkit.entity.AbstractHorse;
import org.bukkit.entity.AbstractVillager;
import org.bukkit.entity.Ageable;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Bee;
import org.bukkit.entity.Cat;
import org.bukkit.entity.ChestedHorse;
import org.bukkit.entity.Creeper;
@@ -66,6 +67,7 @@ import net.coreprotect.CoreProtect;
import net.coreprotect.bukkit.BukkitAdapter;
import net.coreprotect.config.Config;
import net.coreprotect.consumer.Queue;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.serialize.ItemMetaHandler;
public final class EntityDeathListener extends Queue implements Listener {
@@ -95,13 +97,13 @@ public final class EntityDeathListener extends Queue implements Listener {
}
}
Bukkit.getScheduler().runTask(CoreProtect.getInstance(), () -> {
for (LivingEntity entity : entityList) {
for (LivingEntity entity : entityList) {
Scheduler.runTask(CoreProtect.getInstance(), () -> {
if (entity != null && entity.isDead()) {
logEntityDeath(entity, "#command");
}
}
});
}, entity);
}
}
protected static void logEntityDeath(LivingEntity entity, String e) {
@@ -496,6 +498,12 @@ public final class EntityDeathListener extends Queue implements Listener {
}
}
}
if (entity instanceof Bee) {
Bee bee = (Bee) entity;
info.add(bee.getAnger());
info.add(bee.hasNectar());
info.add(bee.hasStung());
}
else {
BukkitAdapter.ADAPTER.getEntityMeta(entity, info);
}
@@ -15,6 +15,7 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.inventory.ItemStack;
import net.coreprotect.bukkit.BukkitAdapter;
import net.coreprotect.config.Config;
@@ -133,7 +134,9 @@ public final class HangingBreakByEntityListener extends Queue implements Listene
if (!event.isCancelled() && Config.getConfig(entity.getWorld()).ITEM_TRANSACTIONS && !inspecting) {
if (itemframe.getItem().getType() != Material.AIR) {
PlayerInteractEntityListener.queueFrameTransaction(culprit, itemframe, logDrops);
ItemStack[] oldState = new ItemStack[] { itemframe.getItem().clone() };
ItemStack[] newState = new ItemStack[] { new ItemStack(Material.AIR) };
PlayerInteractEntityListener.queueContainerSpecifiedItems(culprit, Material.ITEM_FRAME, new Object[] { oldState, newState, itemframe.getFacing() }, itemframe.getLocation(), logDrops);
}
}
}
@@ -11,6 +11,7 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.hanging.HangingBreakEvent;
import org.bukkit.inventory.ItemStack;
import net.coreprotect.bukkit.BukkitAdapter;
import net.coreprotect.config.Config;
@@ -61,7 +62,9 @@ public final class HangingBreakListener extends Queue implements Listener {
if (!event.isCancelled() && Config.getConfig(entity.getWorld()).ITEM_TRANSACTIONS) {
if (itemframe.getItem().getType() != Material.AIR) {
PlayerInteractEntityListener.queueFrameTransaction(causeName, itemframe, logDrops);
ItemStack[] oldState = new ItemStack[] { itemframe.getItem().clone() };
ItemStack[] newState = new ItemStack[] { new ItemStack(Material.AIR) };
PlayerInteractEntityListener.queueContainerSpecifiedItems(causeName, Material.ITEM_FRAME, new Object[] { oldState, newState, itemframe.getFacing() }, itemframe.getLocation(), logDrops);
}
}
}
@@ -2,10 +2,7 @@ package net.coreprotect.listener.player;
import java.sql.Connection;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -60,15 +57,9 @@ public final class ArmorStandManipulateListener extends Queue implements Listene
try (Connection connection = Database.getConnection(true)) {
if (connection != null) {
Statement statement = connection.createStatement();
String blockData = ChestTransactionLookup.performLookup(null, statement, location, finalPlayer, 1, 7, true);
if (blockData.contains("\n")) {
for (String b : blockData.split("\n")) {
Chat.sendComponent(finalPlayer, b);
}
}
else {
Chat.sendComponent(finalPlayer, blockData);
List<String> blockData = ChestTransactionLookup.performLookup(null, statement, location, finalPlayer, 1, 7, true);
for (String data : blockData) {
Chat.sendComponent(finalPlayer, data);
}
statement.close();
}
@@ -93,7 +84,8 @@ public final class ArmorStandManipulateListener extends Queue implements Listene
Player player = event.getPlayer();
final ArmorStand armorStand = event.getRightClicked();
EntityEquipment equipment = armorStand.getEquipment();
ItemStack[] contents = Util.getArmorStandContents(equipment);
ItemStack[] oldContents = Util.getArmorStandContents(equipment);
ItemStack[] newContents = oldContents.clone();
ItemStack item = event.getArmorStandItem();
ItemStack playerItem = event.getPlayerItem();
@@ -116,49 +108,45 @@ public final class ArmorStandManipulateListener extends Queue implements Listene
return;
}
if (item == null && playerItem == null) {
int slot = 0;
switch (event.getSlot()) {
case LEGS:
slot = 1;
break;
case CHEST:
slot = 2;
break;
case HEAD:
slot = 3;
break;
case HAND:
slot = 4;
break;
case OFF_HAND:
slot = 5;
break;
default:
slot = 0;
}
// 0: BOOTS, 1: LEGGINGS, 2: CHESTPLATE, 3: HELMET, 4: MAINHAND, 5: OFFHAND
if (item.getType() == playerItem.getType()) {
return;
}
/*
if (item!=null && playerItem==null){
//player gets item
}
if (item==null && playerItem!=null){
//players item placed on armor stands
}
if (item!=null && playerItem!=null){
//items are swapped
}
*/
Material type = Material.ARMOR_STAND;
Location standLocation = armorStand.getLocation();
int x = standLocation.getBlockX();
int y = standLocation.getBlockY();
int z = standLocation.getBlockZ();
String transactingChestId = standLocation.getWorld().getUID().toString() + "." + x + "." + y + "." + z;
String loggingChestId = player.getName().toLowerCase(Locale.ROOT) + "." + x + "." + y + "." + z;
int chestId = Queue.getChestId(loggingChestId);
if (chestId > 0) {
if (ConfigHandler.forceContainer.get(loggingChestId) != null) {
int force_size = ConfigHandler.forceContainer.get(loggingChestId).size();
List<ItemStack[]> list = ConfigHandler.oldContainer.get(loggingChestId);
if (list.size() <= force_size) {
list.add(Util.getContainerState(contents));
ConfigHandler.oldContainer.put(loggingChestId, list);
}
}
else if (item.getType() != Material.AIR && playerItem.getType() == Material.AIR) {
oldContents[slot] = item.clone();
newContents[slot] = new ItemStack(Material.AIR);
PlayerInteractEntityListener.queueContainerSpecifiedItems(player.getName(), Material.ARMOR_STAND, new Object[] { oldContents, newContents }, armorStand.getLocation(), false);
}
else {
List<ItemStack[]> list = new ArrayList<>();
list.add(Util.getContainerState(contents));
ConfigHandler.oldContainer.put(loggingChestId, list);
else if (item.getType() == Material.AIR && playerItem.getType() != Material.AIR) {
oldContents[slot] = new ItemStack(Material.AIR);
newContents[slot] = playerItem.clone();
PlayerInteractEntityListener.queueContainerSpecifiedItems(player.getName(), Material.ARMOR_STAND, new Object[] { oldContents, newContents }, armorStand.getLocation(), false);
}
else if (item.getType() != Material.AIR && playerItem.getType() != Material.AIR) {
oldContents[slot] = item.clone();
newContents[slot] = playerItem.clone();
PlayerInteractEntityListener.queueContainerSpecifiedItems(player.getName(), Material.ARMOR_STAND, new Object[] { oldContents, newContents }, armorStand.getLocation(), false);
}
ConfigHandler.transactingChest.computeIfAbsent(transactingChestId, k -> Collections.synchronizedList(new ArrayList<>()));
Queue.queueContainerTransaction(player.getName(), standLocation, type, equipment, chestId);
}
}
@@ -7,7 +7,7 @@ import java.util.Locale;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.Event.Result;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -71,7 +71,7 @@ public final class CraftItemListener extends Queue implements Listener {
return;
}
Player player = (Player) event.getWhoClicked();
HumanEntity player = event.getWhoClicked();
if (event.getClick() == ClickType.NUMBER_KEY && player.getInventory().getItem(event.getHotbarButton()) != null) {
return;
}
@@ -1,6 +1,5 @@
package net.coreprotect.listener.player;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
@@ -15,6 +14,7 @@ import org.bukkit.event.entity.FoodLevelChangeEvent;
import net.coreprotect.CoreProtect;
import net.coreprotect.consumer.Queue;
import net.coreprotect.thread.CacheHandler;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Util;
public final class FoodLevelChangeListener extends Queue implements Listener {
@@ -50,7 +50,7 @@ public final class FoodLevelChangeListener extends Queue implements Listener {
}
final Material oldBlockType = oldType;
Bukkit.getServer().getScheduler().runTask(CoreProtect.getInstance(), () -> {
Scheduler.runTask(CoreProtect.getInstance(), () -> {
try {
Block newBlock = oldBlockState.getBlock();
BlockState newBlockState = newBlock.getState();
@@ -66,7 +66,7 @@ public final class FoodLevelChangeListener extends Queue implements Listener {
catch (Exception e) {
e.printStackTrace();
}
});
}, oldBlockState.getLocation());
}
CacheHandler.interactCache.remove(coordinates);
@@ -5,7 +5,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.inventory.BrewerInventory;
import org.bukkit.inventory.FurnaceInventory;
@@ -16,6 +15,7 @@ import org.bukkit.inventory.ItemStack;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Util;
public final class HopperPullListener {
@@ -38,7 +38,7 @@ public final class HopperPullListener {
ItemStack movedItem = item.clone();
final long taskStarted = InventoryChangeListener.tasksStarted.incrementAndGet();
Bukkit.getServer().getScheduler().runTaskAsynchronously(CoreProtect.getInstance(), () -> {
Scheduler.runTaskAsynchronously(CoreProtect.getInstance(), () -> {
try {
if (sourceHolder == null || destinationHolder == null) {
return;
@@ -5,7 +5,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.inventory.BrewerInventory;
import org.bukkit.inventory.FurnaceInventory;
@@ -16,6 +15,7 @@ import org.bukkit.inventory.ItemStack;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Util;
public final class HopperPushListener {
@@ -38,7 +38,7 @@ public final class HopperPushListener {
ItemStack movedItem = item.clone();
final long taskStarted = InventoryChangeListener.tasksStarted.incrementAndGet();
Bukkit.getServer().getScheduler().runTaskAsynchronously(CoreProtect.getInstance(), () -> {
Scheduler.runTaskAsynchronously(CoreProtect.getInstance(), () -> {
try {
if (sourceHolder == null || destinationHolder == null) {
return;
@@ -6,7 +6,6 @@ import java.util.List;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicLong;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
@@ -32,6 +31,7 @@ import net.coreprotect.config.ConfigHandler;
import net.coreprotect.consumer.Queue;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.paper.PaperAdapter;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Util;
import net.coreprotect.utility.Validate;
@@ -227,7 +227,7 @@ public final class InventoryChangeListener extends Queue implements Listener {
ItemStack[] containerState = Util.getContainerState(inventory.getContents());
final long taskStarted = InventoryChangeListener.tasksStarted.incrementAndGet();
Bukkit.getServer().getScheduler().runTaskAsynchronously(CoreProtect.getInstance(), () -> {
Scheduler.runTaskAsynchronously(CoreProtect.getInstance(), () -> {
try {
Material containerType = (enderChest != true ? null : Material.ENDER_CHEST);
InventoryChangeListener.checkTasks(taskStarted);
@@ -249,7 +249,13 @@ public final class InventoryChangeListener extends Queue implements Listener {
boolean enderChest = false;
if (inventoryAction != InventoryAction.MOVE_TO_OTHER_INVENTORY && inventoryAction != InventoryAction.COLLECT_TO_CURSOR && inventoryAction != InventoryAction.UNKNOWN) {
// Perform this check to prevent triggering onInventoryInteractAsync when a user is just clicking items in their own inventory
Inventory inventory = event.getView().getInventory(event.getRawSlot());
Inventory inventory = null;
try {
inventory = event.getView().getInventory(event.getRawSlot());
}
catch (Exception e) {
return;
}
if (inventory == null) {
return;
}
@@ -18,7 +18,7 @@ import net.coreprotect.consumer.Queue;
public final class PlayerDropItemListener extends Queue implements Listener {
protected static void playerDropItem(Location location, String user, ItemStack itemStack) {
public static void playerDropItem(Location location, String user, ItemStack itemStack) {
if (!Config.getConfig(location.getWorld()).ITEM_DROPS || itemStack == null) {
return;
}
@@ -38,14 +38,14 @@ public final class PlayerInteractEntityListener extends Queue implements Listene
final Entity entity = event.getRightClicked(); // change item in ItemFrame, etc
if (entity instanceof ItemFrame) {
ItemFrame frame = (ItemFrame) entity;
Material handType = Material.AIR;
ItemStack handItem = new ItemStack(Material.AIR);
ItemStack mainHand = player.getInventory().getItemInMainHand();
ItemStack offHand = player.getInventory().getItemInOffHand();
if (event.getHand().equals(EquipmentSlot.HAND) && mainHand.getType() != Material.AIR) {
handType = mainHand.getType();
handItem = mainHand;
}
else if (event.getHand().equals(EquipmentSlot.OFF_HAND) && offHand.getType() != Material.AIR) {
handType = offHand.getType();
handItem = offHand;
}
else if (event.getHand().equals(EquipmentSlot.OFF_HAND)) {
return;
@@ -72,8 +72,10 @@ public final class PlayerInteractEntityListener extends Queue implements Listene
return;
}
if (frame.getItem().getType().equals(Material.AIR) && !handType.equals(Material.AIR)) {
queueFrameTransaction(player.getName(), frame, false);
if (frame.getItem().getType().equals(Material.AIR) && !handItem.getType().equals(Material.AIR)) { // add item to item frame
ItemStack[] oldState = new ItemStack[] { new ItemStack(Material.AIR) };
ItemStack[] newState = new ItemStack[] { handItem.clone() };
queueContainerSpecifiedItems(player.getName(), Material.ITEM_FRAME, new Object[] { oldState, newState, frame.getFacing() }, frame.getLocation(), false);
}
}
else if (!event.isCancelled() && entity instanceof Creature && entity.getType().name().equals("ALLAY")) {
@@ -108,15 +110,13 @@ public final class PlayerInteractEntityListener extends Queue implements Listene
}
}
public static void queueFrameTransaction(String user, ItemFrame frame, boolean logDrop) {
ItemStack[] contents = Util.getItemFrameItem(frame);
Material type = Material.ITEM_FRAME;
Location frameLocation = frame.getLocation();
int x = frameLocation.getBlockX();
int y = frameLocation.getBlockY();
int z = frameLocation.getBlockZ();
public static void queueContainerSpecifiedItems(String user, Material type, Object container, Location location, boolean logDrop) {
ItemStack[] contents = (ItemStack[]) ((Object[]) container)[0];
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
String transactingChestId = frameLocation.getWorld().getUID().toString() + "." + x + "." + y + "." + z;
String transactingChestId = location.getWorld().getUID().toString() + "." + x + "." + y + "." + z;
String loggingChestId = user.toLowerCase(Locale.ROOT) + "." + x + "." + y + "." + z;
int chestId = Queue.getChestId(loggingChestId);
if (chestId > 0) {
@@ -137,15 +137,15 @@ public final class PlayerInteractEntityListener extends Queue implements Listene
}
ConfigHandler.transactingChest.computeIfAbsent(transactingChestId, k -> Collections.synchronizedList(new ArrayList<>()));
Queue.queueContainerTransaction(user, frameLocation, type, frame, chestId);
Queue.queueContainerTransaction(user, location, type, container, chestId);
if (logDrop) {
ItemStack dropItem = frame.getItem();
ItemStack dropItem = contents[0];
if (dropItem.getType() == Material.AIR) {
return;
}
PlayerDropItemListener.playerDropItem(frame.getLocation(), user, dropItem);
PlayerDropItemListener.playerDropItem(location, user, dropItem);
}
}
}
@@ -8,8 +8,6 @@ import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -19,6 +17,7 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Chest;
import org.bukkit.block.DoubleChest;
import org.bukkit.block.Jukebox;
import org.bukkit.block.Sign;
import org.bukkit.block.data.Bisected;
import org.bukkit.block.data.Bisected.Half;
@@ -37,6 +36,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.BlockInventoryHolder;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
@@ -52,8 +52,11 @@ import net.coreprotect.database.lookup.ChestTransactionLookup;
import net.coreprotect.database.lookup.InteractionLookup;
import net.coreprotect.database.lookup.SignMessageLookup;
import net.coreprotect.language.Phrase;
import net.coreprotect.listener.block.CampfireStartListener;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.paper.PaperAdapter;
import net.coreprotect.thread.CacheHandler;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Chat;
import net.coreprotect.utility.Color;
import net.coreprotect.utility.Util;
@@ -61,6 +64,7 @@ import net.coreprotect.utility.Util;
public final class PlayerInteractListener extends Queue implements Listener {
public static ConcurrentHashMap<String, Object[]> lastInspectorEvent = new ConcurrentHashMap<>();
public static ConcurrentHashMap<String, Object[]> suspiciousBlockEvent = new ConcurrentHashMap<>();
@EventHandler(priority = EventPriority.LOWEST)
protected void onPlayerInspect(PlayerInteractEvent event) {
@@ -139,7 +143,7 @@ public final class PlayerInteractListener extends Queue implements Listener {
if (blockFinal instanceof Sign && player.getGameMode() != GameMode.CREATIVE) {
Thread.sleep(1500);
Sign sign = (Sign) blockFinal;
BukkitAdapter.ADAPTER.sendSignChange(player, sign);
player.sendSignChange(sign.getLocation(), sign.getLines(), sign.getColor());
}
}
else {
@@ -186,7 +190,7 @@ public final class PlayerInteractListener extends Queue implements Listener {
final Material type = block.getType();
boolean isInteractBlock = BlockGroup.INTERACT_BLOCKS.contains(type);
boolean isContainerBlock = BlockGroup.CONTAINERS.contains(type);
boolean isSignBlock = Tag.SIGNS.isTagged(type);
boolean isSignBlock = BukkitAdapter.ADAPTER.isSign(type);
if (isInteractBlock || isContainerBlock || isSignBlock) {
final Block clickedBlock = event.getClickedBlock();
@@ -303,15 +307,9 @@ public final class PlayerInteractListener extends Queue implements Listener {
try (Connection connection = Database.getConnection(true)) {
if (connection != null) {
Statement statement = connection.createStatement();
String blockData = ChestTransactionLookup.performLookup(null, statement, finalLocation, player, 1, 7, false);
if (blockData.contains("\n")) {
for (String splitData : blockData.split("\n")) {
Chat.sendComponent(player, splitData);
}
}
else {
Chat.sendComponent(player, blockData);
List<String> blockData = ChestTransactionLookup.performLookup(null, statement, finalLocation, player, 1, 7, false);
for (String data : blockData) {
Chat.sendComponent(player, data);
}
statement.close();
@@ -527,13 +525,20 @@ public final class PlayerInteractListener extends Queue implements Listener {
/* Logging for players punching out fire blocks. */
if (event.getAction().equals(Action.LEFT_CLICK_BLOCK)) {
World world = event.getClickedBlock().getWorld();
if (event.useInteractedBlock() != Event.Result.DENY && Config.getConfig(world).BLOCK_BREAK) {
Block relativeBlock = event.getClickedBlock().getRelative(event.getBlockFace());
if (event.useInteractedBlock() != Event.Result.DENY) {
Block block = event.getClickedBlock();
if (block.getType() == Material.DRAGON_EGG) {
clickedDragonEgg(event.getPlayer(), block);
}
if (BlockGroup.FIRE.contains(relativeBlock.getType())) {
Player player = event.getPlayer();
Material type = relativeBlock.getType();
Queue.queueBlockBreak(player.getName(), relativeBlock.getState(), type, relativeBlock.getBlockData().getAsString(), 0);
if (Config.getConfig(world).BLOCK_BREAK) {
Block relativeBlock = event.getClickedBlock().getRelative(event.getBlockFace());
if (BlockGroup.FIRE.contains(relativeBlock.getType())) {
Player player = event.getPlayer();
Material type = relativeBlock.getType();
Queue.queueBlockBreak(player.getName(), relativeBlock.getState(), type, relativeBlock.getBlockData().getAsString(), 0);
}
}
}
}
@@ -547,7 +552,7 @@ public final class PlayerInteractListener extends Queue implements Listener {
if (event.useInteractedBlock() != Event.Result.DENY) {
boolean isCake = false;
if (Tag.SIGNS.isTagged(type)) {
if (BukkitAdapter.ADAPTER.isSign(type)) {
// check if right clicked sign with dye
Set<Material> dyeSet = EnumSet.of(Material.BLACK_DYE, Material.BLUE_DYE, Material.BROWN_DYE, Material.CYAN_DYE, Material.GRAY_DYE, Material.GREEN_DYE, Material.LIGHT_BLUE_DYE, Material.LIGHT_GRAY_DYE, Material.LIME_DYE, Material.MAGENTA_DYE, Material.ORANGE_DYE, Material.PINK_DYE, Material.PURPLE_DYE, Material.RED_DYE, Material.WHITE_DYE, Material.YELLOW_DYE);
Material handType = null;
@@ -557,30 +562,47 @@ public final class PlayerInteractListener extends Queue implements Listener {
handType = mainHand.getType();
}
if (handType != null && (dyeSet.contains(handType) || handType.name().endsWith("INK_SAC")) && Config.getConfig(block.getWorld()).SIGN_TEXT) {
if (handType != null && (dyeSet.contains(handType) || handType.name().endsWith("INK_SAC") || handType == Material.HONEYCOMB) && Config.getConfig(block.getWorld()).SIGN_TEXT) {
BlockState blockState = block.getState();
Sign sign = (Sign) blockState;
String line1 = sign.getLine(0);
String line2 = sign.getLine(1);
String line3 = sign.getLine(2);
String line4 = sign.getLine(3);
int oldColor = sign.getColor().getColor().asRGB();
int newColor = oldColor;
boolean oldGlowing = BukkitAdapter.ADAPTER.isGlowing(sign);
boolean newGlowing = oldGlowing;
String line1 = PaperAdapter.ADAPTER.getLine(sign, 0);
String line2 = PaperAdapter.ADAPTER.getLine(sign, 1);
String line3 = PaperAdapter.ADAPTER.getLine(sign, 2);
String line4 = PaperAdapter.ADAPTER.getLine(sign, 3);
String line5 = PaperAdapter.ADAPTER.getLine(sign, 4);
String line6 = PaperAdapter.ADAPTER.getLine(sign, 5);
String line7 = PaperAdapter.ADAPTER.getLine(sign, 6);
String line8 = PaperAdapter.ADAPTER.getLine(sign, 7);
if (dyeSet.contains(handType)) {
newColor = (DyeColor.valueOf(handType.name().replaceFirst("_DYE", ""))).getColor().asRGB();
}
else {
newGlowing = (handType != Material.INK_SAC);
}
boolean isFront = true;
int oldColor = BukkitAdapter.ADAPTER.getColor(sign, isFront);
int oldColorSecondary = BukkitAdapter.ADAPTER.getColor(sign, !isFront);
boolean oldFrontGlowing = BukkitAdapter.ADAPTER.isGlowing(sign, isFront);
boolean oldBackGlowing = BukkitAdapter.ADAPTER.isGlowing(sign, !isFront);
boolean oldIsWaxed = BukkitAdapter.ADAPTER.isWaxed(sign);
if (oldGlowing != newGlowing || oldColor != newColor) {
Location location = blockState.getLocation();
Queue.queueSignText(player.getName(), location, 0, oldColor, oldGlowing, line1, line2, line3, line4, 1); // 1 second timeOffset
Queue.queueBlockPlace(player.getName(), block.getState(), block.getType(), blockState, block.getType(), -1, 0, blockState.getBlockData().getAsString());
Queue.queueSignText(player.getName(), location, 2, newColor, newGlowing, line1, line2, line3, line4, 0);
if (!oldIsWaxed) {
Scheduler.runTask(CoreProtect.getInstance(), () -> {
BlockState newState = block.getState();
if (newState instanceof Sign) {
Sign newSign = (Sign) newState;
int newColor = BukkitAdapter.ADAPTER.getColor(newSign, isFront);
int newColorSecondary = BukkitAdapter.ADAPTER.getColor(newSign, !isFront);
boolean newFrontGlowing = BukkitAdapter.ADAPTER.isGlowing(newSign, isFront);
boolean newBackGlowing = BukkitAdapter.ADAPTER.isGlowing(newSign, !isFront);
boolean newIsWaxed = BukkitAdapter.ADAPTER.isWaxed(newSign);
boolean modifyingFront = oldBackGlowing == newBackGlowing && oldColorSecondary == newColorSecondary;
if (oldColor != newColor || oldColorSecondary != newColorSecondary || oldFrontGlowing != newFrontGlowing || oldBackGlowing != newBackGlowing || oldIsWaxed != newIsWaxed) {
Location location = blockState.getLocation();
Queue.queueSignText(player.getName(), location, 0, oldColor, oldColorSecondary, oldFrontGlowing, oldBackGlowing, oldIsWaxed, modifyingFront, line1, line2, line3, line4, line5, line6, line7, line8, 1); // 1 second timeOffset
Queue.queueBlockPlace(player.getName(), blockState, block.getType(), blockState, block.getType(), -1, 0, blockState.getBlockData().getAsString());
Queue.queueSignText(player.getName(), location, 2, newColor, newColorSecondary, newFrontGlowing, newBackGlowing, newIsWaxed, modifyingFront, line1, line2, line3, line4, line5, line6, line7, line8, 0);
}
}
}, block.getLocation());
}
}
}
@@ -620,9 +642,158 @@ public final class PlayerInteractListener extends Queue implements Listener {
});
*/
}
else if ((type == Material.CAMPFIRE || type == Material.SOUL_CAMPFIRE) && CampfireStartListener.useCampfireStartEvent) {
ItemStack handItem = null;
ItemStack mainHand = player.getInventory().getItemInMainHand();
ItemStack offHand = player.getInventory().getItemInOffHand();
if (event.getHand().equals(EquipmentSlot.HAND) && mainHand != null && mainHand.getType() != Material.BUCKET) {
handItem = mainHand;
}
else if (event.getHand().equals(EquipmentSlot.OFF_HAND) && offHand != null) {
handItem = offHand;
}
else {
return;
}
if (player.getGameMode() != GameMode.CREATIVE) {
Location location = block.getLocation();
long time = System.currentTimeMillis();
int wid = Util.getWorldId(location.getWorld().getName());
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
String coordinates = x + "." + y + "." + z + "." + wid + "." + type.name();
CacheHandler.interactCache.put(coordinates, new Object[] { time, handItem, player.getName() });
}
}
isCake = type.name().endsWith(Material.CAKE.name());
}
else if (type == Material.JUKEBOX) {
BlockState blockState = block.getState();
if (blockState instanceof Jukebox) {
Jukebox jukebox = (Jukebox) blockState;
ItemStack jukeboxRecord = jukebox.isPlaying() ? jukebox.getRecord() : new ItemStack(Material.AIR);
ItemStack oldItemState = jukeboxRecord.clone();
ItemStack newItemState = new ItemStack(Material.AIR);
if (jukeboxRecord.getType() == Material.AIR) {
ItemStack handItem = null;
ItemStack mainHand = player.getInventory().getItemInMainHand();
ItemStack offHand = player.getInventory().getItemInOffHand();
if (event.getHand().equals(EquipmentSlot.HAND) && mainHand != null && Tag.ITEMS_MUSIC_DISCS.isTagged(mainHand.getType())) {
handItem = mainHand;
}
else if (event.getHand().equals(EquipmentSlot.OFF_HAND) && offHand != null && Tag.ITEMS_MUSIC_DISCS.isTagged(offHand.getType())) {
handItem = offHand;
}
else {
return;
}
oldItemState = new ItemStack(Material.AIR);
newItemState = handItem.clone();
}
if (!oldItemState.equals(newItemState)) {
if (Config.getConfig(player.getWorld()).PLAYER_INTERACTIONS) {
Queue.queuePlayerInteraction(player.getName(), blockState, type);
}
if (Config.getConfig(block.getWorld()).ITEM_TRANSACTIONS) {
boolean logDrops = player.getGameMode() != GameMode.CREATIVE;
ItemStack[] oldState = new ItemStack[] { oldItemState };
ItemStack[] newState = new ItemStack[] { newItemState };
PlayerInteractEntityListener.queueContainerSpecifiedItems(player.getName(), Material.JUKEBOX, new Object[] { oldState, newState }, jukebox.getLocation(), logDrops);
}
}
}
}
else if (BukkitAdapter.ADAPTER.isChiseledBookshelf(type)) {
BlockState blockState = block.getState();
if (blockState instanceof BlockInventoryHolder) {
ItemStack book = BukkitAdapter.ADAPTER.getChiseledBookshelfBook(blockState, event);
if (book != null) {
ItemStack oldItemState = book.clone();
ItemStack newItemState = new ItemStack(Material.AIR);
if (book.getType() == Material.AIR) {
ItemStack handItem = null;
ItemStack mainHand = player.getInventory().getItemInMainHand();
ItemStack offHand = player.getInventory().getItemInOffHand();
if (event.getHand().equals(EquipmentSlot.HAND) && mainHand != null && BukkitAdapter.ADAPTER.isBookshelfBook(mainHand.getType())) {
handItem = mainHand;
}
else if (event.getHand().equals(EquipmentSlot.OFF_HAND) && offHand != null && BukkitAdapter.ADAPTER.isBookshelfBook(offHand.getType())) {
handItem = offHand;
}
else {
return;
}
oldItemState = new ItemStack(Material.AIR);
newItemState = handItem.clone();
}
if (!oldItemState.equals(newItemState)) {
if (Config.getConfig(player.getWorld()).PLAYER_INTERACTIONS) {
Queue.queuePlayerInteraction(player.getName(), blockState, type);
}
InventoryChangeListener.inventoryTransaction(player.getName(), blockState.getLocation(), null);
}
}
else { // fallback if unable to determine bookshelf slot
InventoryChangeListener.inventoryTransaction(player.getName(), blockState.getLocation(), null);
}
}
}
else if (BukkitAdapter.ADAPTER.isSuspiciousBlock(type)) {
ItemStack handItem = null;
ItemStack mainHand = player.getInventory().getItemInMainHand();
ItemStack offHand = player.getInventory().getItemInOffHand();
if (event.getHand().equals(EquipmentSlot.HAND) && mainHand != null) {
handItem = mainHand;
}
else if (event.getHand().equals(EquipmentSlot.OFF_HAND) && offHand != null) {
handItem = offHand;
}
if (handItem.getType() == Material.BRUSH) {
BlockState blockState = block.getState();
Location blockLocation = block.getLocation();
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
Material newType = block.getType();
if (type == newType || (newType != Material.SAND && newType != Material.GRAVEL)) {
return;
}
long systemTime = System.currentTimeMillis();
boolean logChange = true;
if (suspiciousBlockEvent.get(player.getName()) != null) {
Object[] lastEvent = suspiciousBlockEvent.get(player.getName());
long lastTime = (long) lastEvent[0];
long timeSince = systemTime - lastTime;
Location lastLocation = (Location) lastEvent[1];
if (timeSince < 5000 && blockLocation.equals(lastLocation)) {
logChange = false;
}
}
if (logChange) {
Queue.queueBlockPlace(player.getName(), blockState, newType, blockState, newType, -1, 0, null);
suspiciousBlockEvent.put(player.getName(), new Object[] { systemTime, blockLocation });
}
}, blockLocation, 100);
}
}
else if (type == Material.DRAGON_EGG) {
clickedDragonEgg(player, block);
}
if (isCake || type == Material.CAKE) {
boolean placeCandle = false;
@@ -691,7 +862,7 @@ public final class PlayerInteractListener extends Queue implements Listener {
if (!exists) {
final Player playerFinal = player;
final Location locationFinal = crystalLocation;
Bukkit.getServer().getScheduler().runTask(CoreProtect.getInstance(), () -> {
Scheduler.runTask(CoreProtect.getInstance(), () -> {
try {
boolean blockExists = false;
int showingBottom = 0;
@@ -711,7 +882,7 @@ public final class PlayerInteractListener extends Queue implements Listener {
catch (Exception e) {
e.printStackTrace();
}
});
}, locationFinal);
}
}
}
@@ -762,4 +933,16 @@ public final class PlayerInteractListener extends Queue implements Listener {
}
}
}
private void clickedDragonEgg(Player player, Block block) {
Location location = block.getLocation();
long time = System.currentTimeMillis();
int wid = Util.getWorldId(location.getWorld().getName());
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
String coordinates = x + "." + y + "." + z + "." + wid + "." + Material.DRAGON_EGG.name();
CacheHandler.interactCache.put(coordinates, new Object[] { time, Material.DRAGON_EGG, player.getName() });
}
}
@@ -12,24 +12,85 @@ import org.bukkit.event.block.SignChangeEvent;
import net.coreprotect.bukkit.BukkitAdapter;
import net.coreprotect.config.Config;
import net.coreprotect.consumer.Queue;
import net.coreprotect.paper.PaperAdapter;
public final class SignChangeListener extends Queue implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
protected void onSignChange(SignChangeEvent event) {
String player = event.getPlayer().getName();
Block block = event.getBlock();
if (event.isCancelled() || !Config.getConfig(block.getWorld()).SIGN_TEXT) {
return;
}
String player = event.getPlayer().getName();
Location location = block.getLocation();
BlockState blockState = block.getState();
String line1 = event.getLine(0);
String line2 = event.getLine(1);
String line3 = event.getLine(2);
String line4 = event.getLine(3);
int color = (blockState instanceof Sign) ? ((Sign) blockState).getColor().getColor().asRGB() : 0;
boolean isGlowing = (blockState instanceof Sign) ? BukkitAdapter.ADAPTER.isGlowing((Sign) blockState) : false;
if (!event.isCancelled() && Config.getConfig(block.getWorld()).SIGN_TEXT) {
Queue.queueSignText(player, location, 1, color, isGlowing, line1, line2, line3, line4, 0);
String edit1 = event.getLine(0);
String edit2 = event.getLine(1);
String edit3 = event.getLine(2);
String edit4 = event.getLine(3);
String line1 = "";
String line2 = "";
String line3 = "";
String line4 = "";
String line5 = "";
String line6 = "";
String line7 = "";
String line8 = "";
int color = 0;
int colorSecondary = 0;
boolean frontGlowing = false;
boolean backGlowing = false;
boolean isWaxed = false;
boolean isFront = BukkitAdapter.ADAPTER.isSignFront(event);
boolean existingText = false;
if (blockState instanceof Sign) {
Sign sign = (Sign) blockState;
line1 = PaperAdapter.ADAPTER.getLine(sign, 0);
line2 = PaperAdapter.ADAPTER.getLine(sign, 1);
line3 = PaperAdapter.ADAPTER.getLine(sign, 2);
line4 = PaperAdapter.ADAPTER.getLine(sign, 3);
line5 = PaperAdapter.ADAPTER.getLine(sign, 4);
line6 = PaperAdapter.ADAPTER.getLine(sign, 5);
line7 = PaperAdapter.ADAPTER.getLine(sign, 6);
line8 = PaperAdapter.ADAPTER.getLine(sign, 7);
color = BukkitAdapter.ADAPTER.getColor(sign, true);
colorSecondary = BukkitAdapter.ADAPTER.getColor(sign, false);
frontGlowing = BukkitAdapter.ADAPTER.isGlowing(sign, true);
backGlowing = BukkitAdapter.ADAPTER.isGlowing(sign, false);
isWaxed = BukkitAdapter.ADAPTER.isWaxed(sign);
if (isFront && line1.equals(edit1) && line2.equals(edit2) && line3.equals(edit3) && line4.equals(edit4)) {
return;
}
else if (!isFront && line5.equals(edit1) && line6.equals(edit2) && line7.equals(edit3) && line8.equals(edit4)) {
return;
}
else if (line1.length() > 0 || line2.length() > 0 || line3.length() > 0 || line4.length() > 0 || line5.length() > 0 || line6.length() > 0 || line7.length() > 0 || line8.length() > 0) {
existingText = true;
Queue.queueSignText(player, location, 0, color, colorSecondary, frontGlowing, backGlowing, isWaxed, isFront, line1, line2, line3, line4, line5, line6, line7, line8, 1);
Queue.queueBlockPlace(player, blockState, block.getType(), blockState, block.getType(), -1, 0, blockState.getBlockData().getAsString());
}
}
if (isFront) {
line1 = edit1;
line2 = edit2;
line3 = edit3;
line4 = edit4;
}
else {
line5 = edit1;
line6 = edit2;
line7 = edit3;
line8 = edit4;
}
if (existingText || line1.length() > 0 || line2.length() > 0 || line3.length() > 0 || line4.length() > 0 || line5.length() > 0 || line6.length() > 0 || line7.length() > 0 || line8.length() > 0) {
Queue.queueSignText(player, location, 1, color, colorSecondary, frontGlowing, backGlowing, isWaxed, isFront, line1, line2, line3, line4, line5, line6, line7, line8, 0);
}
}
}
@@ -7,8 +7,6 @@ import java.util.Set;
import org.bukkit.Material;
import org.bukkit.Tag;
import net.coreprotect.config.ConfigHandler;
public final class BlockGroup {
public static Set<Material> TRACK_ANY = new HashSet<>(Arrays.asList(Material.PISTON_HEAD, Material.LEVER, Material.BELL));
@@ -17,7 +15,7 @@ public final class BlockGroup {
public static Set<Material> TRACK_BOTTOM = new HashSet<>(Arrays.asList());
public static Set<Material> TRACK_SIDE = new HashSet<>(Arrays.asList(Material.WALL_TORCH, Material.REDSTONE_WALL_TORCH, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.ACTIVATOR_RAIL, Material.WHITE_BED, Material.ORANGE_BED, Material.MAGENTA_BED, Material.LIGHT_BLUE_BED, Material.YELLOW_BED, Material.LIME_BED, Material.PINK_BED, Material.GRAY_BED, Material.LIGHT_GRAY_BED, Material.CYAN_BED, Material.PURPLE_BED, Material.BLUE_BED, Material.BROWN_BED, Material.GREEN_BED, Material.RED_BED, Material.BLACK_BED, Material.LADDER, Material.ACACIA_WALL_SIGN, Material.BIRCH_WALL_SIGN, Material.DARK_OAK_WALL_SIGN, Material.JUNGLE_WALL_SIGN, Material.OAK_WALL_SIGN, Material.SPRUCE_WALL_SIGN, Material.VINE, Material.COCOA, Material.TRIPWIRE_HOOK, Material.WHITE_WALL_BANNER, Material.ORANGE_WALL_BANNER, Material.MAGENTA_WALL_BANNER, Material.LIGHT_BLUE_WALL_BANNER, Material.YELLOW_WALL_BANNER, Material.LIME_WALL_BANNER, Material.PINK_WALL_BANNER, Material.GRAY_WALL_BANNER, Material.LIGHT_GRAY_WALL_BANNER, Material.CYAN_WALL_BANNER, Material.PURPLE_WALL_BANNER, Material.BLUE_WALL_BANNER, Material.BROWN_WALL_BANNER, Material.GREEN_WALL_BANNER, Material.RED_WALL_BANNER, Material.BLACK_WALL_BANNER));
public static Set<Material> SHULKER_BOXES = new HashSet<>(Arrays.asList(Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX));
public static Set<Material> CONTAINERS = new HashSet<>(Arrays.asList(Material.DISPENSER, Material.CHEST, Material.FURNACE, Material.BREWING_STAND, Material.TRAPPED_CHEST, Material.HOPPER, Material.DROPPER, Material.ARMOR_STAND, Material.ITEM_FRAME, Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.SMOKER, Material.LECTERN));
public static Set<Material> CONTAINERS = new HashSet<>(Arrays.asList(Material.JUKEBOX, Material.DISPENSER, Material.CHEST, Material.FURNACE, Material.BREWING_STAND, Material.TRAPPED_CHEST, Material.HOPPER, Material.DROPPER, Material.ARMOR_STAND, Material.ITEM_FRAME, Material.SHULKER_BOX, Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX, Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX, Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX, Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX, Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX, Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.SMOKER, Material.LECTERN));
public static Set<Material> DOORS = new HashSet<>(Arrays.asList(Material.OAK_DOOR, Material.SPRUCE_DOOR, Material.BIRCH_DOOR, Material.JUNGLE_DOOR, Material.ACACIA_DOOR, Material.DARK_OAK_DOOR));
public static Set<Material> BUTTONS = new HashSet<>(Arrays.asList(Material.STONE_BUTTON, Material.OAK_BUTTON, Material.ACACIA_BUTTON, Material.BIRCH_BUTTON, Material.DARK_OAK_BUTTON, Material.JUNGLE_BUTTON, Material.SPRUCE_BUTTON));
public static Set<Material> PRESSURE_PLATES = new HashSet<>(Arrays.asList(Material.STONE_PRESSURE_PLATE, Material.ACACIA_PRESSURE_PLATE, Material.BIRCH_PRESSURE_PLATE, Material.DARK_OAK_PRESSURE_PLATE, Material.HEAVY_WEIGHTED_PRESSURE_PLATE, Material.JUNGLE_PRESSURE_PLATE, Material.LIGHT_WEIGHTED_PRESSURE_PLATE, Material.OAK_PRESSURE_PLATE, Material.SPRUCE_PRESSURE_PLATE));
@@ -46,75 +44,73 @@ public final class BlockGroup {
public static Set<Material> NON_ATTACHABLE = new HashSet<>(Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.BARRIER, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH, Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.WATER, Material.LAVA, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.GRASS, Material.FERN, Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.TORCH, Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.LADDER, Material.RAIL, Material.LEVER, Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.SNOW, Material.SUGAR_CANE, Material.NETHER_PORTAL, Material.REPEATER, Material.KELP, Material.CHORUS_FLOWER, Material.CHORUS_PLANT));
public static void initialize() {
if (!ConfigHandler.serverRunning) {
TRACK_ANY.addAll(BUTTONS);
TRACK_TOP.addAll(DOORS);
TRACK_TOP.addAll(PRESSURE_PLATES);
TRACK_TOP.addAll(Tag.CARPETS.getValues());
TRACK_TOP_BOTTOM.addAll(LANTERNS);
LIGHTABLES.addAll(CANDLES);
INTERACT_BLOCKS.addAll(DOORS);
INTERACT_BLOCKS.addAll(BUTTONS);
SAFE_INTERACT_BLOCKS.addAll(DOORS);
SAFE_INTERACT_BLOCKS.addAll(BUTTONS);
NON_ATTACHABLE.addAll(BUTTONS);
NON_ATTACHABLE.addAll(CANDLES);
NON_ATTACHABLE.addAll(FIRE);
UPDATE_STATE.addAll(LIGHTABLES);
UPDATE_STATE.addAll(LANTERNS);
TRACK_ANY.addAll(BUTTONS);
TRACK_TOP.addAll(DOORS);
TRACK_TOP.addAll(PRESSURE_PLATES);
TRACK_TOP.addAll(Tag.CARPETS.getValues());
TRACK_TOP_BOTTOM.addAll(LANTERNS);
LIGHTABLES.addAll(CANDLES);
INTERACT_BLOCKS.addAll(DOORS);
INTERACT_BLOCKS.addAll(BUTTONS);
SAFE_INTERACT_BLOCKS.addAll(DOORS);
SAFE_INTERACT_BLOCKS.addAll(BUTTONS);
NON_ATTACHABLE.addAll(BUTTONS);
NON_ATTACHABLE.addAll(CANDLES);
NON_ATTACHABLE.addAll(FIRE);
UPDATE_STATE.addAll(LIGHTABLES);
UPDATE_STATE.addAll(LANTERNS);
/* add all blocks that support vertical scanning */
VERTICAL.addAll(VERTICAL_TOP_BOTTOM);
VERTICAL.addAll(VERTICAL_TOP);
VERTICAL.addAll(VERTICAL_BOTTOM);
/* add all blocks that support vertical scanning */
VERTICAL.addAll(VERTICAL_TOP_BOTTOM);
VERTICAL.addAll(VERTICAL_TOP);
VERTICAL.addAll(VERTICAL_BOTTOM);
/* Natural block group */
/* https://minecraft.fandom.com/wiki/Tag */
NATURAL_BLOCKS.addAll(Tag.BAMBOO_PLANTABLE_ON.getValues());
NATURAL_BLOCKS.addAll(Tag.VALID_SPAWN.getValues());
NATURAL_BLOCKS.addAll(Tag.SAND.getValues());
NATURAL_BLOCKS.addAll(Tag.LOGS.getValues());
NATURAL_BLOCKS.addAll(Tag.LEAVES.getValues());
NATURAL_BLOCKS.addAll(Tag.ICE.getValues());
NATURAL_BLOCKS.addAll(Tag.UNDERWATER_BONEMEALS.getValues());
NATURAL_BLOCKS.addAll(Tag.CORAL_BLOCKS.getValues());
NATURAL_BLOCKS.addAll(Tag.ENDERMAN_HOLDABLE.getValues());
NATURAL_BLOCKS.addAll(SOUL_BLOCKS);
NATURAL_BLOCKS.addAll(VINES);
/* Natural block group */
/* https://minecraft.fandom.com/wiki/Tag */
NATURAL_BLOCKS.addAll(Tag.BAMBOO_PLANTABLE_ON.getValues());
NATURAL_BLOCKS.addAll(Tag.VALID_SPAWN.getValues());
NATURAL_BLOCKS.addAll(Tag.SAND.getValues());
NATURAL_BLOCKS.addAll(Tag.LOGS.getValues());
NATURAL_BLOCKS.addAll(Tag.LEAVES.getValues());
NATURAL_BLOCKS.addAll(Tag.ICE.getValues());
NATURAL_BLOCKS.addAll(Tag.UNDERWATER_BONEMEALS.getValues());
NATURAL_BLOCKS.addAll(Tag.CORAL_BLOCKS.getValues());
NATURAL_BLOCKS.addAll(Tag.ENDERMAN_HOLDABLE.getValues());
NATURAL_BLOCKS.addAll(SOUL_BLOCKS);
NATURAL_BLOCKS.addAll(VINES);
/*
NATURAL_BLOCKS.addAll(Tag.BASE_STONE_OVERWORLD.getValues());
NATURAL_BLOCKS.addAll(Tag.BEACON_BASE_BLOCKS.getValues());
NATURAL_BLOCKS.addAll(Tag.SOUL_FIRE_BASE_BLOCKS.getValues());
NATURAL_BLOCKS.addAll(Tag.GEODE_INVALID_BLOCKS.getValues());
NATURAL_BLOCKS.addAll(Tag.GUARDED_BY_PIGLINS.getValues());
NATURAL_BLOCKS.addAll(Tag.INFINIBURN_END.getValues());
NATURAL_BLOCKS.addAll(Tag.INFINIBURN_NETHER.getValues());
NATURAL_BLOCKS.addAll(Tag.INFINIBURN_OVERWORLD.getValues());
NATURAL_BLOCKS.addAll(Tag.INSIDE_STEP_SOUND_BLOCKS.getValues());
NATURAL_BLOCKS.addAll(Tag.DEEPSLATE_ORE_REPLACEABLES.getValues());
NATURAL_BLOCKS.addAll(Tag.DIRT.getValues());
NATURAL_BLOCKS.addAll(Tag.STONE_ORE_REPLACEABLES.getValues());
NATURAL_BLOCKS.addAll(Tag.COAL_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.COPPER_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.DIAMOND_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.EMERALD_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.GOLD_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.IRON_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.LAPIS_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.REDSTONE_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.FIRE.getValues());
NATURAL_BLOCKS.addAll(Tag.SNOW.getValues());
NATURAL_BLOCKS.addAll(Tag.BEEHIVES.getValues());
NATURAL_BLOCKS.addAll(Tag.BEE_GROWABLES.getValues());
NATURAL_BLOCKS.addAll(Tag.FLOWERS.getValues());
NATURAL_BLOCKS.addAll(Tag.CROPS.getValues());
NATURAL_BLOCKS.addAll(Tag.FEATURES_CANNOT_REPLACE.getValues());
NATURAL_BLOCKS.addAll(Tag.LUSH_GROUND_REPLACEABLE.getValues());
NATURAL_BLOCKS.addAll(Tag.MUSHROOM_GROW_BLOCK.getValues());
NATURAL_BLOCKS.addAll(Tag.NYLIUM.getValues());
NATURAL_BLOCKS.addAll(Tag.PORTALS.getValues());
*/
}
/*
NATURAL_BLOCKS.addAll(Tag.BASE_STONE_OVERWORLD.getValues());
NATURAL_BLOCKS.addAll(Tag.BEACON_BASE_BLOCKS.getValues());
NATURAL_BLOCKS.addAll(Tag.SOUL_FIRE_BASE_BLOCKS.getValues());
NATURAL_BLOCKS.addAll(Tag.GEODE_INVALID_BLOCKS.getValues());
NATURAL_BLOCKS.addAll(Tag.GUARDED_BY_PIGLINS.getValues());
NATURAL_BLOCKS.addAll(Tag.INFINIBURN_END.getValues());
NATURAL_BLOCKS.addAll(Tag.INFINIBURN_NETHER.getValues());
NATURAL_BLOCKS.addAll(Tag.INFINIBURN_OVERWORLD.getValues());
NATURAL_BLOCKS.addAll(Tag.INSIDE_STEP_SOUND_BLOCKS.getValues());
NATURAL_BLOCKS.addAll(Tag.DEEPSLATE_ORE_REPLACEABLES.getValues());
NATURAL_BLOCKS.addAll(Tag.DIRT.getValues());
NATURAL_BLOCKS.addAll(Tag.STONE_ORE_REPLACEABLES.getValues());
NATURAL_BLOCKS.addAll(Tag.COAL_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.COPPER_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.DIAMOND_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.EMERALD_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.GOLD_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.IRON_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.LAPIS_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.REDSTONE_ORES.getValues());
NATURAL_BLOCKS.addAll(Tag.FIRE.getValues());
NATURAL_BLOCKS.addAll(Tag.SNOW.getValues());
NATURAL_BLOCKS.addAll(Tag.BEEHIVES.getValues());
NATURAL_BLOCKS.addAll(Tag.BEE_GROWABLES.getValues());
NATURAL_BLOCKS.addAll(Tag.FLOWERS.getValues());
NATURAL_BLOCKS.addAll(Tag.CROPS.getValues());
NATURAL_BLOCKS.addAll(Tag.FEATURES_CANNOT_REPLACE.getValues());
NATURAL_BLOCKS.addAll(Tag.LUSH_GROUND_REPLACEABLE.getValues());
NATURAL_BLOCKS.addAll(Tag.MUSHROOM_GROW_BLOCK.getValues());
NATURAL_BLOCKS.addAll(Tag.NYLIUM.getValues());
NATURAL_BLOCKS.addAll(Tag.PORTALS.getValues());
*/
}
}
@@ -1,6 +1,9 @@
package net.coreprotect.paper;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.block.Sign;
import org.bukkit.entity.Entity;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
@@ -18,6 +21,7 @@ public class PaperAdapter implements PaperInterface {
public static final int PAPER_V1_17 = BukkitAdapter.BUKKIT_V1_17;
public static final int PAPER_V1_18 = BukkitAdapter.BUKKIT_V1_18;
public static final int PAPER_V1_19 = BukkitAdapter.BUKKIT_V1_19;
public static final int PAPER_V1_20 = BukkitAdapter.BUKKIT_V1_20;
public static void loadAdapter() {
int paperVersion = ConfigHandler.SERVER_VERSION;
@@ -27,19 +31,24 @@ public class PaperAdapter implements PaperInterface {
switch (paperVersion) {
case PAPER_UNAVAILABLE:
case PAPER_V1_13:
case PAPER_V1_14:
PaperAdapter.ADAPTER = new PaperAdapter();
break;
case PAPER_V1_13:
case PAPER_V1_14:
case PAPER_V1_15:
PaperAdapter.ADAPTER = new PaperHandler();
break;
case PAPER_V1_16:
PaperAdapter.ADAPTER = new Paper_v1_16();
break;
case PAPER_V1_17:
case PAPER_V1_18:
case PAPER_V1_19:
PaperAdapter.ADAPTER = new Paper_v1_17();
break;
case PAPER_V1_20:
default:
PaperAdapter.ADAPTER = new Paper_v1_16();
PaperAdapter.ADAPTER = new Paper_v1_20();
break;
}
}
@@ -54,4 +63,14 @@ public class PaperAdapter implements PaperInterface {
return false;
}
@Override
public String getLine(Sign sign, int line) {
return BukkitAdapter.ADAPTER.getLine(sign, line);
}
@Override
public void teleportAsync(Entity entity, Location location) {
entity.teleport(location);
}
}
@@ -1,6 +1,8 @@
package net.coreprotect.paper;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.entity.Entity;
public class PaperHandler extends PaperAdapter implements PaperInterface {
@@ -9,4 +11,9 @@ public class PaperHandler extends PaperAdapter implements PaperInterface {
return server.isStopping();
}
@Override
public void teleportAsync(Entity entity, Location location) {
entity.teleportAsync(location);
}
}
@@ -1,6 +1,9 @@
package net.coreprotect.paper;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.block.Sign;
import org.bukkit.entity.Entity;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
@@ -10,4 +13,8 @@ public interface PaperInterface {
public boolean isStopping(Server server);
public String getLine(Sign sign, int line);
public void teleportAsync(Entity entity, Location location);
}
@@ -0,0 +1,15 @@
package net.coreprotect.paper;
import org.bukkit.block.Sign;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
public class Paper_v1_17 extends Paper_v1_16 implements PaperInterface {
@Override
public String getLine(Sign sign, int line) {
// https://docs.adventure.kyori.net/serializer/
return LegacyComponentSerializer.legacySection().serialize(sign.line(line));
}
}
@@ -0,0 +1,21 @@
package net.coreprotect.paper;
import org.bukkit.block.Sign;
import org.bukkit.block.sign.Side;
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
public class Paper_v1_20 extends Paper_v1_17 implements PaperInterface {
@Override
public String getLine(Sign sign, int line) {
// https://docs.adventure.kyori.net/serializer/
if (line < 4) {
return LegacyComponentSerializer.legacySection().serialize(sign.getSide(Side.FRONT).line(line));
}
else {
return LegacyComponentSerializer.legacySection().serialize(sign.getSide(Side.BACK).line(line - 4));
}
}
}
@@ -0,0 +1,38 @@
package net.coreprotect.paper.listener;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Dispenser;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import io.papermc.paper.event.block.BlockPreDispenseEvent;
import net.coreprotect.config.Config;
import net.coreprotect.consumer.Queue;
import net.coreprotect.listener.player.InventoryChangeListener;
public final class BlockPreDispenseListener extends Queue implements Listener {
public static boolean useBlockPreDispenseEvent = true;
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockPreDispense(BlockPreDispenseEvent event) {
Block block = event.getBlock();
World world = block.getWorld();
if (!Config.getConfig(world).BLOCK_PLACE) {
return;
}
BlockData blockData = block.getBlockData();
if (blockData instanceof Dispenser) {
String user = "#dispenser";
ItemStack[] inventory = ((InventoryHolder) block.getState()).getInventory().getStorageContents();
InventoryChangeListener.inventoryTransaction(user, block.getLocation(), inventory);
}
}
}
@@ -0,0 +1,172 @@
package net.coreprotect.patch.script;
import java.sql.Statement;
import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.language.Phrase;
import net.coreprotect.language.Selector;
import net.coreprotect.patch.Patch;
import net.coreprotect.utility.Chat;
public class __2_22_0 {
protected static boolean patch(Statement statement) {
try {
if (Config.getGlobal().MYSQL) {
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN line_5 VARCHAR(100);");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN line_6 VARCHAR(100);");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN line_7 VARCHAR(100);");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN line_8 VARCHAR(100);");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN color_secondary INT;");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN waxed TINYINT DEFAULT 0;");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN face TINYINT DEFAULT 0;");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
}
else {
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN line_5 TEXT;");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN line_6 TEXT;");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN line_7 TEXT;");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN line_8 TEXT;");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN color_secondary INTEGER;");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN waxed TINYINT DEFAULT 0;");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
if (!Patch.continuePatch()) {
return false;
}
try {
statement.executeUpdate("ALTER TABLE " + ConfigHandler.prefix + "sign ADD COLUMN face TINYINT DEFAULT 0;");
}
catch (Exception e) {
Chat.console(Phrase.build(Phrase.PATCH_SKIP_UPDATE, ConfigHandler.prefix + "sign", Selector.FIRST, Selector.FIRST));
}
}
}
catch (Exception e) {
e.printStackTrace();
}
return true;
}
}
@@ -20,6 +20,7 @@ public class SpigotAdapter implements SpigotInterface {
public static final int SPIGOT_V1_17 = BukkitAdapter.BUKKIT_V1_17;
public static final int SPIGOT_V1_18 = BukkitAdapter.BUKKIT_V1_18;
public static final int SPIGOT_V1_19 = BukkitAdapter.BUKKIT_V1_19;
public static final int SPIGOT_V1_20 = BukkitAdapter.BUKKIT_V1_20;
public static void loadAdapter() {
int spigotVersion = ConfigHandler.SERVER_VERSION;
@@ -40,6 +41,7 @@ public class SpigotAdapter implements SpigotInterface {
case SPIGOT_V1_17:
case SPIGOT_V1_18:
case SPIGOT_V1_19:
case SPIGOT_V1_20:
default:
SpigotAdapter.ADAPTER = new Spigot_v1_16();
break;
@@ -80,5 +82,4 @@ public class SpigotAdapter implements SpigotInterface {
Chat.sendMessage(sender, message.toString());
}
}
@@ -0,0 +1,129 @@
package net.coreprotect.thread;
import java.util.concurrent.TimeUnit;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.scheduler.BukkitTask;
import io.papermc.paper.threadedregions.scheduler.ScheduledTask;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.ConfigHandler;
public class Scheduler {
private Scheduler() {
throw new IllegalStateException("Scheduler class");
}
public static void scheduleSyncDelayedTask(CoreProtect plugin, Runnable task, Object regionData, int delay) {
if (ConfigHandler.isFolia) {
if (regionData instanceof Location) {
Location location = (Location) regionData;
if (delay == 0) {
Bukkit.getServer().getRegionScheduler().run(plugin, location, value -> task.run());
}
else {
Bukkit.getServer().getRegionScheduler().runDelayed(plugin, location, value -> task.run(), delay);
}
}
else if (regionData instanceof Entity) {
Entity entity = (Entity) regionData;
if (delay == 0) {
entity.getScheduler().run(plugin, value -> task.run(), task);
}
else {
entity.getScheduler().runDelayed(plugin, value -> task.run(), task, delay);
}
}
else {
if (delay == 0) {
Bukkit.getServer().getGlobalRegionScheduler().run(plugin, value -> task.run());
}
else {
Bukkit.getServer().getGlobalRegionScheduler().runDelayed(plugin, value -> task.run(), delay);
}
}
}
else {
if (delay == 0) {
Bukkit.getServer().getScheduler().runTask(plugin, task);
}
else {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, task, delay);
}
}
}
public static Object scheduleSyncRepeatingTask(CoreProtect plugin, Runnable task, Object regionData, int delay, int period) {
if (ConfigHandler.isFolia) {
if (regionData instanceof Location) {
Location location = (Location) regionData;
return Bukkit.getServer().getRegionScheduler().runAtFixedRate(plugin, location, value -> task.run(), delay, period);
}
else if (regionData instanceof Entity) {
Entity entity = (Entity) regionData;
return entity.getScheduler().runAtFixedRate(plugin, value -> task.run(), task, delay, period);
}
else {
return Bukkit.getServer().getGlobalRegionScheduler().runAtFixedRate(plugin, value -> task.run(), delay, period);
}
}
else {
return Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, task, delay, period);
}
}
public static void scheduleAsyncDelayedTask(CoreProtect plugin, Runnable task, int delay) {
if (ConfigHandler.isFolia) {
if (delay == 0) {
Bukkit.getServer().getAsyncScheduler().runNow(plugin, value -> task.run());
}
else {
Bukkit.getServer().getAsyncScheduler().runDelayed(plugin, value -> task.run(), (delay * 50L), TimeUnit.MILLISECONDS);
}
}
else {
if (delay == 0) {
Bukkit.getServer().getScheduler().runTaskAsynchronously(plugin, task);
}
else {
Bukkit.getServer().getScheduler().runTaskLaterAsynchronously(plugin, task, delay);
}
}
}
public static void scheduleSyncDelayedTask(CoreProtect plugin, Runnable task, int delay) {
scheduleSyncDelayedTask(plugin, task, null, delay);
}
public static void runTask(CoreProtect plugin, Runnable task) {
scheduleSyncDelayedTask(plugin, task, null, 0);
}
public static void runTask(CoreProtect plugin, Runnable task, Object regionData) {
scheduleSyncDelayedTask(plugin, task, regionData, 0);
}
public static void runTaskAsynchronously(CoreProtect plugin, Runnable task) {
scheduleAsyncDelayedTask(plugin, task, 0);
}
public static void runTaskLaterAsynchronously(CoreProtect plugin, Runnable task, int delay) {
scheduleAsyncDelayedTask(plugin, task, delay);
}
public static void cancelTask(Object task) {
if (ConfigHandler.isFolia) {
if (task instanceof ScheduledTask) {
ScheduledTask scheduledTask = (ScheduledTask) task;
scheduledTask.cancel();
}
}
else if (task instanceof BukkitTask) {
BukkitTask bukkitTask = (BukkitTask) task;
bukkitTask.cancel();
}
}
}
@@ -1,6 +1,5 @@
package net.coreprotect.utility;
import org.bukkit.Bukkit;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;
@@ -9,6 +8,7 @@ import org.bukkit.block.data.type.Chest;
import org.bukkit.block.data.type.Chest.Type;
import net.coreprotect.CoreProtect;
import net.coreprotect.thread.Scheduler;
public class ChestTool {
@@ -75,7 +75,7 @@ public class ChestTool {
}
private static void validateContainer(BlockData blockData, Type newType, Block block, Block relativeBlock) {
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
BlockData relativeBlockData = relativeBlock.getBlockData();
if (!blockData.getAsString().equals(block.getBlockData().getAsString()) || !(relativeBlockData instanceof Chest) || ((Chest) relativeBlockData).getType() == newType) {
@@ -89,7 +89,7 @@ public class ChestTool {
catch (Exception e) {
e.printStackTrace();
}
}, 2);
}, relativeBlock.getLocation(), 2);
}
}
@@ -10,8 +10,10 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.language.Phrase;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.paper.PaperAdapter;
public class Teleport {
@@ -78,7 +80,12 @@ public class Teleport {
double oldY = location.getY();
location.setY(checkY);
player.teleport(location);
if (ConfigHandler.isFolia) {
PaperAdapter.ADAPTER.teleportAsync(player, location);
}
else {
player.teleport(location);
}
if (!enforceTeleport) {
// Only send a message if the player was moved by at least 1 block
+112 -26
View File
@@ -28,6 +28,7 @@ import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.Chest;
import org.bukkit.block.CommandBlock;
import org.bukkit.block.Jukebox;
import org.bukkit.block.ShulkerBox;
import org.bukkit.block.banner.Pattern;
import org.bukkit.block.data.BlockData;
@@ -58,6 +59,7 @@ import net.coreprotect.database.Rollback;
import net.coreprotect.language.Phrase;
import net.coreprotect.model.BlockGroup;
import net.coreprotect.thread.CacheHandler;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.serialize.ItemMetaHandler;
import net.coreprotect.worldedit.CoreProtectEditSessionEvent;
@@ -265,6 +267,51 @@ public class Util extends Queue {
return message.toString();
}
public static String getEnchantments(byte[] metadata, int type, int amount) {
if (metadata == null) {
return "";
}
ItemStack item = new ItemStack(Util.getType(type), amount);
item = (ItemStack) Rollback.populateItemStack(item, metadata)[2];
String displayName = item.hasItemMeta() && item.getItemMeta().hasDisplayName() ? item.getItemMeta().getDisplayName() : "";
StringBuilder message = new StringBuilder(Color.ITALIC + displayName + Color.GREY);
List<String> enchantments = ItemMetaHandler.getEnchantments(item, displayName);
for (String enchantment : enchantments) {
if (message.length() > 0) {
message.append("\n");
}
message.append(enchantment);
}
if (!displayName.isEmpty()) {
message.insert(0, enchantments.isEmpty() ? Color.WHITE : Color.AQUA);
}
else if (!enchantments.isEmpty()) {
String name = Util.capitalize(item.getType().name().replace("_", " "), true);
message.insert(0, Color.AQUA + Color.ITALIC + name);
}
return message.toString();
}
public static String createTooltip(String phrase, String tooltip) {
if (tooltip.isEmpty()) {
return phrase;
}
StringBuilder message = new StringBuilder(Chat.COMPONENT_TAG_OPEN + Chat.COMPONENT_POPUP);
// tooltip
message.append("|" + tooltip + "|");
// chat output
message.append(phrase);
return message.append(Chat.COMPONENT_TAG_CLOSE).toString();
}
public static String hoverCommandFilter(String string) {
StringBuilder command = new StringBuilder();
@@ -410,14 +457,16 @@ public class Util extends Queue {
try {
int c1 = 0;
for (ItemStack o1 : items) {
int c2 = 0;
for (ItemStack o2 : items) {
if (o1 != null && o2 != null && c2 > c1 && o1.isSimilar(o2) && !Util.isAir(o1.getType())) { // Ignores amount
int namount = o1.getAmount() + o2.getAmount();
o1.setAmount(namount);
o2.setAmount(0);
if (o1 != null && o1.getAmount() > 0) {
int c2 = 0;
for (ItemStack o2 : items) {
if (o2 != null && c2 > c1 && o1.isSimilar(o2) && !Util.isAir(o1.getType())) { // Ignores amount
int namount = o1.getAmount() + o2.getAmount();
o1.setAmount(namount);
o2.setAmount(0);
}
c2++;
}
c2++;
}
c1++;
}
@@ -561,7 +610,10 @@ public class Util extends Queue {
}
public static ItemStack[] getContainerState(ItemStack[] array) {
ItemStack[] result = array.clone();
ItemStack[] result = array == null ? null : array.clone();
if (result == null) {
return result;
}
int count = 0;
for (ItemStack itemStack : array) {
@@ -719,6 +771,10 @@ public class Util extends Queue {
ItemFrame entity = (ItemFrame) container;
contents = Util.getItemFrameItem(entity);
}
else if (type == Material.JUKEBOX) {
Jukebox blockState = (Jukebox) ((Block) container).getState();
contents = Util.getJukeboxItem(blockState);
}
else {
Block block = (Block) container;
Inventory inventory = Util.getContainerInventory(block.getState(), true);
@@ -796,7 +852,22 @@ public class Util extends Queue {
return contents;
}
public static ItemStack[] getJukeboxItem(Jukebox blockState) {
ItemStack[] contents = null;
try {
contents = new ItemStack[] { blockState.getRecord() };
}
catch (Exception e) {
e.printStackTrace();
}
return contents;
}
public static int getEntityId(EntityType type) {
if (type == null) {
return -1;
}
return getEntityId(type.name(), true);
}
@@ -1141,22 +1212,7 @@ public class Util extends Queue {
return material;
}
switch (material) {
case WHEAT:
material = Material.WHEAT_SEEDS;
break;
case PUMPKIN_STEM:
material = Material.PUMPKIN_SEEDS;
break;
case MELON_STEM:
material = Material.MELON_SEEDS;
break;
case BEETROOTS:
material = Material.BEETROOT_SEEDS;
break;
default:
}
material = BukkitAdapter.ADAPTER.getPlantSeeds(material);
if (material.name().contains("WALL_")) {
material = Material.valueOf(material.name().replace("WALL_", ""));
}
@@ -1220,6 +1276,17 @@ public class Util extends Queue {
return true;
}
public static boolean isFolia() {
try {
Class.forName("io.papermc.paper.threadedregions.ThreadedRegionizer");
}
catch (Exception e) {
return false;
}
return true;
}
public static String getBranch() {
String branch = "";
try {
@@ -1460,7 +1527,7 @@ public class Util extends Queue {
}
public static void updateBlock(final BlockState block) {
Bukkit.getServer().getScheduler().runTask(CoreProtect.getInstance(), () -> {
Scheduler.runTask(CoreProtect.getInstance(), () -> {
try {
if (block.getBlockData() instanceof Waterlogged) {
Block currentBlock = block.getBlock();
@@ -1473,7 +1540,7 @@ public class Util extends Queue {
catch (Exception e) {
e.printStackTrace();
}
});
}, block.getLocation());
}
public static void updateInventory(Player player) {
@@ -1554,4 +1621,23 @@ public class Util extends Queue {
return isInventory ? 2 : 1;
}
}
public static int getSignData(boolean frontGlowing, boolean backGlowing) {
if (frontGlowing && backGlowing) {
return 3;
}
else if (backGlowing) {
return 2;
}
else if (frontGlowing) {
return 1;
}
return 0;
}
public static boolean isSideGlowing(boolean isFront, int data) {
return ((isFront && (data == 1 || data == 3)) || (!isFront && (data == 2 || data == 3)));
}
}
@@ -17,6 +17,7 @@ import org.bukkit.block.data.BlockData;
import org.bukkit.entity.AbstractHorse;
import org.bukkit.entity.AbstractVillager;
import org.bukkit.entity.Ageable;
import org.bukkit.entity.Bee;
import org.bukkit.entity.Cat;
import org.bukkit.entity.ChestedHorse;
import org.bukkit.entity.Creeper;
@@ -58,6 +59,7 @@ import net.coreprotect.CoreProtect;
import net.coreprotect.bukkit.BukkitAdapter;
import net.coreprotect.database.Rollback;
import net.coreprotect.thread.CacheHandler;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Util;
public class EntityUtil {
@@ -70,7 +72,7 @@ public class EntityUtil {
if (type == null) {
return;
}
Bukkit.getServer().getScheduler().runTask(CoreProtect.getInstance(), () -> {
Scheduler.runTask(CoreProtect.getInstance(), () -> {
try {
Location location = block.getLocation();
location.setX(location.getX() + 0.50);
@@ -532,6 +534,21 @@ public class EntityUtil {
}
}
}
else if (entity instanceof Bee) {
Bee bee = (Bee) entity;
if (count == 0) {
int set = (int) value;
bee.setAnger(set);
}
else if (count == 1) {
boolean set = (Boolean) value;
bee.setHasNectar(set);
}
else if (count == 2) {
boolean set = (Boolean) value;
bee.setHasStung(set);
}
}
else {
BukkitAdapter.ADAPTER.setEntityMeta(entity, value, count);
}
@@ -541,7 +558,7 @@ public class EntityUtil {
catch (Exception e) {
e.printStackTrace();
}
});
}, block.getLocation());
}
}
@@ -6,6 +6,7 @@ import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.bukkit.Bukkit;
import org.bukkit.Color;
import org.bukkit.FireworkEffect;
import org.bukkit.Material;
@@ -23,6 +24,7 @@ import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.inventory.meta.LeatherArmorMeta;
import org.bukkit.inventory.meta.MapMeta;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.inventory.meta.SuspiciousStewMeta;
import org.bukkit.potion.PotionEffect;
import net.coreprotect.bukkit.BukkitAdapter;
@@ -92,21 +94,18 @@ public class ItemMetaHandler {
return itemMeta.getEnchants();
}
public static String getEnchantments(ItemStack item) {
StringBuilder result = new StringBuilder();
public static List<String> getEnchantments(ItemStack item, String displayName) {
List<String> result = new ArrayList<>();
Map<Enchantment, Integer> enchantments = getEnchantments(item.getItemMeta());
for (Entry<Enchantment, Integer> entry : enchantments.entrySet()) {
Enchantment enchantment = entry.getKey();
Integer level = entry.getValue();
if (result.length() > 0) {
result.append("\n");
}
result.append(getEnchantmentName(enchantment, level));
result.add(getEnchantmentName(enchantment, level));
}
return result.toString();
return result;
}
public static List<List<Map<String, Object>>> seralize(ItemStack item, Material type, String faceData, int slot) {
@@ -133,7 +132,7 @@ public class ItemMetaHandler {
LeatherArmorMeta meta = (LeatherArmorMeta) itemMeta;
LeatherArmorMeta subMeta = meta.clone();
meta.setColor(null);
meta.setColor(Bukkit.getServer().getItemFactory().getDefaultLeatherColor());
list.add(meta.serialize());
metadata.add(list);
@@ -232,6 +231,21 @@ public class ItemMetaHandler {
metadata.add(list);
}
}
else if (itemMeta instanceof SuspiciousStewMeta) {
SuspiciousStewMeta meta = (SuspiciousStewMeta) itemMeta;
SuspiciousStewMeta subMeta = meta.clone();
meta.clearCustomEffects();
list.add(meta.serialize());
metadata.add(list);
if (subMeta.hasCustomEffects()) {
for (PotionEffect effect : subMeta.getCustomEffects()) {
list = new ArrayList<>();
list.add(effect.serialize());
metadata.add(list);
}
}
}
else if (!BukkitAdapter.ADAPTER.getItemMeta(itemMeta, list, metadata, slot)) {
list.add(itemMeta.serialize());
metadata.add(list);
@@ -14,6 +14,7 @@ import net.coreprotect.config.Config;
import net.coreprotect.config.ConfigHandler;
import net.coreprotect.language.Phrase;
import net.coreprotect.language.Selector;
import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Chat;
public class CoreProtectEditSessionEvent {
@@ -47,7 +48,7 @@ public class CoreProtectEditSessionEvent {
// Failed to initialize WorldEdit logging
}
Bukkit.getServer().getScheduler().runTask(CoreProtect.getInstance(), () -> {
Scheduler.runTask(CoreProtect.getInstance(), () -> {
try {
if (isInitialized()) {
Chat.console(Phrase.build(Phrase.INTEGRATION_SUCCESS, "WorldEdit", Selector.FIRST));
@@ -56,4 +56,8 @@ public class CoreProtectLogger extends AbstractDelegateExtent {
return false;
}
public <T extends BlockStateHolder<T>> boolean setBlock(int x, int y, int z, T block) throws WorldEditException {
return setBlock(BlockVector3.at(x,y,z), block);
}
}
@@ -1,5 +1,6 @@
package net.coreprotect.worldedit;
import java.util.Collection;
import java.util.List;
import org.bukkit.Chunk;
@@ -9,6 +10,8 @@ import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Entity;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.MaterialData;
import org.bukkit.metadata.MetadataValue;
import org.bukkit.plugin.Plugin;
@@ -184,4 +187,22 @@ public final class WorldEditBlockState implements BlockState {
return false;
}
@Override
public Collection<ItemStack> getDrops() {
// TODO Auto-generated method stub
return null;
}
@Override
public Collection<ItemStack> getDrops(ItemStack tool) {
// TODO Auto-generated method stub
return null;
}
@Override
public Collection<ItemStack> getDrops(ItemStack tool, Entity entity) {
// TODO Auto-generated method stub
return null;
}
}
@@ -6,7 +6,6 @@ import org.bukkit.DyeColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Server;
import org.bukkit.Tag;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.Bisected;
import org.bukkit.block.data.Bisected.Half;
@@ -44,7 +43,7 @@ public class WorldEditLogger extends Queue {
}
protected static BaseBlock getBaseBlock(Extent extent, BlockVector3 position, Location location, Material oldType, com.sk89q.worldedit.world.block.BlockState oldBlock) {
if (oldType == Material.SPAWNER || (Config.getConfig(location.getWorld()).SIGN_TEXT && Tag.SIGNS.isTagged(oldType))) {
if (oldType == Material.SPAWNER || (Config.getConfig(location.getWorld()).SIGN_TEXT && net.coreprotect.bukkit.BukkitAdapter.ADAPTER.isSign(oldType))) {
return extent.getFullBlock(position);
}
@@ -67,16 +66,22 @@ public class WorldEditLogger extends Queue {
if (!oldType.equals(newType) || !oldBlockDataString.equals(newBlockDataString)) {
try {
if (baseBlock != null && baseBlock.hasNbtData()) {
if (Config.getConfig(location.getWorld()).SIGN_TEXT && Tag.SIGNS.isTagged(oldType)) {
if (Config.getConfig(location.getWorld()).SIGN_TEXT && net.coreprotect.bukkit.BukkitAdapter.ADAPTER.isSign(oldType)) {
CompoundTag compoundTag = baseBlock.getNbtData();
String line1 = getSignText(compoundTag.getString("Text1"));
String line2 = getSignText(compoundTag.getString("Text2"));
String line3 = getSignText(compoundTag.getString("Text3"));
String line4 = getSignText(compoundTag.getString("Text4"));
int color = DyeColor.valueOf(baseBlock.getNbtData().getString("Color").toUpperCase()).getColor().asRGB();
boolean isGlowing = (compoundTag.getInt("GlowingText") == 1 ? true : false);
if (!compoundTag.containsKey("front_text")) {
String line1 = getSignText(compoundTag.getString("Text1"));
String line2 = getSignText(compoundTag.getString("Text2"));
String line3 = getSignText(compoundTag.getString("Text3"));
String line4 = getSignText(compoundTag.getString("Text4"));
int color = DyeColor.valueOf(baseBlock.getNbtData().getString("Color").toUpperCase()).getColor().asRGB();
int colorSecondary = 0;
boolean frontGlowing = (compoundTag.getInt("GlowingText") == 1 ? true : false);
boolean backGlowing = false;
boolean isWaxed = false;
boolean isFront = true;
Queue.queueSignText(actor.getName(), location, 0, color, isGlowing, line1, line2, line3, line4, 5);
Queue.queueSignText(actor.getName(), location, 0, color, colorSecondary, frontGlowing, backGlowing, isWaxed, isFront, line1, line2, line3, line4, "", "", "", "", 5);
}
}
if (oldType == Material.SPAWNER) {
String mobType = getMobType(baseBlock);
+1
View File
@@ -3,6 +3,7 @@ main: net.coreprotect.CoreProtect
version: ${project.version}
branch: ${project.branch}
api-version: 1.13
folia-supported: true
website: http://coreprotect.net
author: Intelli
softdepend: [WorldEdit]