Compare commits

..

61 Commits

Author SHA1 Message Date
cc1e209ea4 fix: clear above and below plot gen heights if build heights are larger 2023-03-17 16:14:47 +00:00
745b06a008 fix: fix generation by re-adding important method 2023-03-16 17:42:48 +00:00
77b2bd166a Update dependency io.github.gradle-nexus.publish-plugin to v1.3.0 (#3987)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-15 09:43:41 +00:00
8e02336c44 Reapply stash 2023-03-15 10:30:38 +01:00
3adfbde45a Don't format JSON files 2023-03-06 11:49:18 +01:00
e6db8e2750 Perform code formatting according to editorconfig (#3981)
* Perform code reformatting

* Fix javadoc errors
2023-03-06 11:38:30 +01:00
9cd0ee9b49 Cleanup deprecated methods (#3980) 2023-03-06 11:21:14 +01:00
d455d1fcd7 Merge branch 'v6' into v7 2023-03-06 10:48:51 +01:00
ea19ff783f Back to snapshot for development 2023-03-06 10:47:51 +01:00
447e4c7d58 Release 6.11.1 2023-03-06 10:40:17 +01:00
89031447f2 Migrate left over occurrences to enhanced switches (#3979)
* Migrate left-overs to enhanced switches

* More
2023-03-06 10:25:02 +01:00
4210a3a555 Deprecate unused methods for removal (#3977) 2023-03-06 10:13:03 +01:00
42e146b8c7 Delete unused HyperverseWorldManager file 2023-03-05 20:53:00 +01:00
a5fdcda673 Merge branch 'v6' into v7 2023-03-05 10:18:55 +01:00
52823f5024 Update Ilshidur/action-discord digest to 08d9328 (#3974)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-05 10:15:38 +01:00
1326c257a0 Update dependency com.intellectualsites.arkitektonika:Arkitektonika-Client to v2.1.2 (#3972)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-05 10:15:27 +01:00
fc3137cd96 Fix farmland moisturize (#3978)
* fix: Fix farmland gets moisturizes

Signed-off-by: ByteExceptionM <git@byteexception.eu>

* chore: Revert code reformat

Signed-off-by: ByteExceptionM <git@byteexception.eu>

---------

Signed-off-by: ByteExceptionM <git@byteexception.eu>
2023-03-05 10:15:05 +01:00
a5c53a96d1 Record-inize methods (#3976) 2023-03-05 10:07:36 +01:00
c46cc73f52 Turn down renovate a bit 2023-03-05 00:03:39 +01:00
276e619caa Merge branch 'v6' into v7 2023-03-04 11:19:48 +01:00
f11acacedd Update dependency com.intellectualsites.prtree:PRTree to v2.0.1 (#3975)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-02 22:36:18 +01:00
f636a5ec63 Merge branch 'v6' into v7 2023-03-02 20:48:43 +01:00
d1bac90745 Update developers field 2023-03-02 20:48:33 +01:00
785362c576 Merge branch 'v6' into v7 2023-03-02 12:34:18 +01:00
e98f628d34 Pin GH actions to SHA to avoid mutable refs (#3973) 2023-03-02 12:30:14 +01:00
b2ab61559c Update dependency com.diffplug.spotless to v6.16.0 (#3970)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-02 00:46:34 +01:00
dd6eb8e74f Update dependency cloud.commandframework:cloud-services to v1.8.2 (#3971)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-03-02 00:46:19 +01:00
97cdd03ea4 Update dependency gradle to v7.6.1 (#3967)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-27 21:24:04 +01:00
f5118e6802 Don't fire 'PlotUnlinkEvent' twice on plot clear (#3947) 2023-02-23 09:26:30 +01:00
94ca5cf679 Update dependency cloud.commandframework:cloud-services to v1.8.1 (#3965)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-22 23:47:31 +01:00
5a55a1f602 Update dependency io.github.gradle-nexus.publish-plugin to v1.2.0 (#3966)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-22 23:47:13 +01:00
1e7ba7d173 Merge branch 'v6' into v7 2023-02-12 19:06:11 +01:00
ed33635a15 Update dependency com.diffplug.spotless to v6.15.0 (#3959)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-11 09:35:35 +01:00
888682e5d0 Update dependency com.intellectualsites.bom:bom-1.18.x to v1.24 (#3960)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-11 09:35:21 +01:00
72bb5f00b0 Back to snapshot for development 2023-02-10 17:16:52 +01:00
773fd6f59f Release 6.11.0 2023-02-10 17:12:15 +01:00
aa784e98f8 Merge branch 'v6' into v7 2023-02-10 16:44:57 +01:00
5cce86d924 feat: Add event firing on remove road entity (#3955)
* feat: Add event firing on remove road entity

Signed-off-by: ByteExceptionM <git@byteexception.eu>

* chore: Add some more entity vars

Signed-off-by: ByteExceptionM <git@byteexception.eu>

* chore: Rename method

Signed-off-by: ByteExceptionM <git@byteexception.eu>

* chore: Code cleanup

Signed-off-by: ByteExceptionM <git@byteexception.eu>

* chore: Code reformat

Signed-off-by: ByteExceptionM <git@byteexception.eu>

* chore: Change iterator removal

Signed-off-by: ByteExceptionM <git@byteexception.eu>

* Comply with checkstyle

---------

Signed-off-by: ByteExceptionM <git@byteexception.eu>
Co-authored-by: Alexander Brandes <mc.cache@web.de>
2023-02-09 20:51:59 +01:00
84567bcb00 Update dependency com.diffplug.spotless to v6.14.1 (#3957)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-02-06 12:48:30 +01:00
d7c2ab1d16 Make farmland keep its moisture (#3952)
Handle MoistureChangeEvent for farm land
2023-01-31 11:22:13 +01:00
0d359ade0c Update dependency com.diffplug.spotless to v6.14.0 (#3950)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-28 19:21:35 +01:00
ffbec24290 Update dependency com.intellectualsites.bom:bom-1.18.x to v1.23 (#3948)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-01-24 22:35:15 +01:00
586474c8e6 Merge branch 'v6' into v7 2023-01-23 13:40:52 +01:00
70b6636f50 Revert "Cleanup deprecated methods"
This reverts commit 26692d6633.
2023-01-23 13:40:47 +01:00
ab357deb48 Put more legacy web interface deprecations in place 2023-01-23 13:40:35 +01:00
bd62d1a1c7 Merge branch 'v6' into v7 2023-01-23 13:28:12 +01:00
6130c3dfa5 Clarify 2D biome deprecation 2023-01-23 13:28:05 +01:00
26692d6633 Cleanup deprecated methods 2023-01-23 13:27:08 +01:00
bb0f200429 Merge branch 'v6' into v7 2023-01-23 13:18:28 +01:00
5787588500 Move BukkitPlotGenerator#generateChunkData() deprecation from v7 to v6 2023-01-23 13:18:20 +01:00
bed62edc02 Resolved conflicts 2023-01-23 13:03:26 +01:00
ee0f389c78 Merge branch 'v6' into v7 2023-01-23 13:01:48 +01:00
b40383b5a4 Back to snapshot for development 2023-01-23 12:33:51 +01:00
be8903128d Release 6.10.9 2023-01-23 12:28:33 +01:00
08800ec16d Cleanup deperecated WorldEdit met
Co-authored-by: Matthew Kaulfers <42121989+mkaulfers@users.noreply.github.com>
2023-01-22 11:26:07 +01:00
83e274ff9f Revert "PS-3908: Cleanup deprecated methods to improve code maturity. (#3944)"
This reverts commit 0dd8b1053c.
2023-01-22 11:21:01 +01:00
0dd8b1053c PS-3908: Cleanup deprecated methods to improve code maturity. (#3944)
https://github.com/IntellectualSites/PlotSquared/issues/3908
2023-01-22 00:02:15 +01:00
0558fcf5d5 Provide full verbosity for invalid components 2023-01-21 22:27:20 +01:00
5af8be4293 chore: Remove things marked as for removal (#3941)
* chore: Remove things marked as for removal

* Address feedback

Co-authored-by: Alexander Brandes <mc.cache@web.de>
2023-01-21 16:44:28 +01:00
cbacdd67eb Merge branch 'v6' into v7 2023-01-21 16:39:14 +01:00
c45bbe3ec5 fix: ensure plots are fully unlinked before the clear itself is run (#3933)
* fix: ensure plots are fully unlinked before the clear itself is run

* Update Core/src/main/java/com/plotsquared/core/plot/PlotModificationManager.java

Co-authored-by: Alexander Brandes <mc.cache@web.de>
2023-01-19 09:01:06 +01:00
104 changed files with 1018 additions and 1171 deletions

View File

@ -1,8 +1,7 @@
name: Announce release on discord
on:
release:
types: [published]
types: [ published ]
jobs:
send_announcement:
runs-on: ubuntu-latest
@ -12,7 +11,7 @@ jobs:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
DISCORD_USERNAME: PlotSquared Release
DISCORD_AVATAR: https://raw.githubusercontent.com/IntellectualSites/Assets/main/plugins/PlotSquared/PlotSquared.png
uses: Ilshidur/action-discord@0.3.2
uses: Ilshidur/action-discord@08d9328877d6954120eef2b07abbc79249bb6210 # ratchet:Ilshidur/action-discord@0.3.2
with:
args: |
"<@&525015541815967744> <@&679322738552471574> <@&699293353862496266>"

View File

@ -1,7 +1,5 @@
name: Build PR
on: [ pull_request ]
jobs:
build_pr:
if: github.repository_owner == 'IntellectualSites'
@ -13,7 +11,7 @@ jobs:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
uses: gradle/wrapper-validation-action@55e685c48d84285a5b0418cd094606e199cca3b6 # v1
- name: Setup Java
uses: actions/setup-java@v3
with:

View File

@ -1,10 +1,8 @@
name: build
on:
push:
branches:
- v7
- main
jobs:
build:
if: github.repository_owner == 'IntellectualSites'
@ -13,7 +11,7 @@ jobs:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
uses: gradle/wrapper-validation-action@55e685c48d84285a5b0418cd094606e199cca3b6 # v1
- name: Setup Java
uses: actions/setup-java@v3
with:
@ -30,7 +28,7 @@ jobs:
echo "STATUS=release" >> $GITHUB_ENV
fi
- name: Publish Release
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v7'}}
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
run: ./gradlew publishToSonatype closeAndReleaseSonatypeStagingRepository
env:
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
@ -38,15 +36,14 @@ jobs:
ORG_GRADLE_PROJECT_signingKey: ${{ secrets.SIGNING_KEY }}
ORG_GRADLE_PROJECT_signingPassword: ${{ secrets.SIGNING_PASSWORD }}
- name: Publish Snapshot
if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v7' }}
if: ${{ runner.os == 'Linux' && env.STATUS != 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main' }}
run: ./gradlew publishToSonatype
env:
ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }}
ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }}
- name: Publish core javadoc
# if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v7'}}
if: ${{ runner.os == 'Linux' && env.STATUS == 'snapshot' && github.event_name == 'push' && github.ref == 'refs/heads/v7'}}
uses: cpina/github-action-push-to-another-repository@main
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
uses: cpina/github-action-push-to-another-repository@0a14457bb28b04dfa1652e0ffdfda866d2845c73
env:
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
with:
@ -57,9 +54,8 @@ jobs:
target-branch: main
target-directory: v7/core
- name: Publish bukkit javadoc
# if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v7'}}
if: ${{ runner.os == 'Linux' && env.STATUS == 'snapshot' && github.event_name == 'push' && github.ref == 'refs/heads/v7'}}
uses: cpina/github-action-push-to-another-repository@main
if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/main'}}
uses: cpina/github-action-push-to-another-repository@0a14457bb28b04dfa1652e0ffdfda866d2845c73 # main
env:
SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }}
with:

View File

@ -1,11 +1,10 @@
name: "CodeQL"
on:
push:
branches: [ v7 ]
branches: [ main ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ v7 ]
branches: [ main ]
jobs:
analyze:
@ -15,23 +14,18 @@ jobs:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'java' ]
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2
with:
languages: ${{ matrix.language }}
- name: Autobuild
uses: github/codeql-action/autobuild@v2
uses: github/codeql-action/autobuild@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@32dc499307d133bb5085bae78498c0ac2cf762d5 # v2

View File

@ -1,14 +1,12 @@
name: draft release
on:
push:
branches:
- v6
- main
pull_request:
types: [ opened, reopened, synchronize ]
pull_request_target:
types: [ opened, reopened, synchronize ]
jobs:
update_release_draft:
if: ${{ github.event_name != 'pull_request' || github.repository != github.event.pull_request.head.repo.full_name }}

View File

@ -102,7 +102,7 @@ tasks {
opt.links("https://jd.papermc.io/paper/1.19/")
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
opt.links("https://jd.adventure.kyori.net/api/4.12.0/")
opt.links("https://jd.advntr.dev/api/4.12.0/")
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/")
opt.isLinkSource = true

View File

@ -72,6 +72,8 @@ import com.plotsquared.core.configuration.Storage;
import com.plotsquared.core.configuration.caption.ChatFormatter;
import com.plotsquared.core.configuration.file.YamlConfiguration;
import com.plotsquared.core.database.DBFunc;
import com.plotsquared.core.events.RemoveRoadEntityEvent;
import com.plotsquared.core.events.Result;
import com.plotsquared.core.generator.GeneratorWrapper;
import com.plotsquared.core.generator.IndependentPlotGenerator;
import com.plotsquared.core.generator.SingleWorldGenerator;
@ -110,6 +112,7 @@ import com.plotsquared.core.uuid.CacheUUIDService;
import com.plotsquared.core.uuid.UUIDPipeline;
import com.plotsquared.core.uuid.offline.OfflineModeUUIDService;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import io.papermc.lib.PaperLib;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.text.Component;
@ -293,8 +296,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
this.injector.injectMembers(this);
try {
this.injector.getInstance(TranslationUpdateManager.class);
TranslationUpdateManager.upgradeTranslationFile();
this.injector.getInstance(TranslationUpdateManager.class).upgradeTranslationFile();
} catch (IOException e) {
throw new RuntimeException(e);
}
@ -819,8 +821,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.hasMetadata("ps-tmp-teleport")) {
continue;
}
iterator.remove();
entity.remove();
this.removeRoadEntity(entity, iterator);
}
continue;
}
@ -833,8 +834,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.hasMetadata("ps-tmp-teleport")) {
continue;
}
iterator.remove();
entity.remove();
this.removeRoadEntity(entity, iterator);
}
}
continue;
@ -844,7 +844,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
case "DROPPED_ITEM":
if (Settings.Enabled_Components.KILL_ROAD_ITEMS
&& plotArea.getOwnedPlotAbs(BukkitUtil.adapt(entity.getLocation())) == null) {
entity.remove();
this.removeRoadEntity(entity, iterator);
}
// dropped item
continue;
@ -875,8 +875,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.hasMetadata("ps-tmp-teleport")) {
continue;
}
iterator.remove();
entity.remove();
this.removeRoadEntity(entity, iterator);
}
}
}
@ -981,8 +980,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.hasMetadata("ps-tmp-teleport")) {
continue;
}
iterator.remove();
entity.remove();
this.removeRoadEntity(entity, iterator);
}
}
} else {
@ -993,8 +991,7 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
if (entity.hasMetadata("ps-tmp-teleport")) {
continue;
}
iterator.remove();
entity.remove();
this.removeRoadEntity(entity, iterator);
}
}
}
@ -1008,8 +1005,20 @@ public final class BukkitPlatform extends JavaPlugin implements Listener, PlotPl
}), TaskTime.seconds(1L));
}
private void removeRoadEntity(Entity entity, Iterator<Entity> entityIterator) {
RemoveRoadEntityEvent event = eventDispatcher.callRemoveRoadEntity(BukkitAdapter.adapt(entity));
if (event.getEventResult() == Result.DENY) {
return;
}
entityIterator.remove();
entity.remove();
}
@Override
public @Nullable ChunkGenerator getDefaultWorldGenerator(
public @Nullable
final ChunkGenerator getDefaultWorldGenerator(
final @NonNull String worldName,
final @Nullable String id
) {

View File

@ -18,9 +18,14 @@
*/
package com.plotsquared.bukkit.entity;
import org.bukkit.entity.Horse;
class HorseStats {
double jump;
boolean chest;
Horse.Variant variant;
Horse.Color color;
Horse.Style style;
}

View File

@ -101,50 +101,26 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.noGravity = true;
}
switch (entity.getType().toString()) {
case "BOAT":
case "BOAT" -> {
Boat boat = (Boat) entity;
this.dataByte = getOrdinal(TreeSpecies.values(), boat.getWoodType());
return;
case "ARROW":
case "EGG":
case "ENDER_CRYSTAL":
case "ENDER_PEARL":
case "ENDER_SIGNAL":
case "EXPERIENCE_ORB":
case "FALLING_BLOCK":
case "FIREBALL":
case "FIREWORK":
case "FISHING_HOOK":
case "LEASH_HITCH":
case "LIGHTNING":
case "MINECART":
case "MINECART_COMMAND":
case "MINECART_MOB_SPAWNER":
case "MINECART_TNT":
case "PLAYER":
case "PRIMED_TNT":
case "SLIME":
case "SMALL_FIREBALL":
case "SNOWBALL":
case "MINECART_FURNACE":
case "SPLASH_POTION":
case "THROWN_EXP_BOTTLE":
case "WITHER_SKULL":
case "UNKNOWN":
case "SPECTRAL_ARROW":
case "SHULKER_BULLET":
case "DRAGON_FIREBALL":
case "AREA_EFFECT_CLOUD":
case "TRIDENT":
case "LLAMA_SPIT":
}
case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "EXPERIENCE_ORB", "FALLING_BLOCK", "FIREBALL",
"FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND", "MINECART_MOB_SPAWNER",
"MINECART_TNT", "PLAYER", "PRIMED_TNT", "SLIME", "SMALL_FIREBALL", "SNOWBALL", "MINECART_FURNACE", "SPLASH_POTION",
"THROWN_EXP_BOTTLE", "WITHER_SKULL", "UNKNOWN", "SPECTRAL_ARROW", "SHULKER_BULLET", "DRAGON_FIREBALL", "AREA_EFFECT_CLOUD",
"TRIDENT", "LLAMA_SPIT" -> {
// Do this stuff later
return;
}
// MISC //
case "DROPPED_ITEM":
case "DROPPED_ITEM" -> {
Item item = (Item) entity;
this.stack = item.getItemStack();
return;
case "ITEM_FRAME":
}
case "ITEM_FRAME" -> {
this.x = Math.floor(this.getX());
this.y = Math.floor(this.getY());
this.z = Math.floor(this.getZ());
@ -152,7 +128,8 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.dataByte = getOrdinal(Rotation.values(), itemFrame.getRotation());
this.stack = itemFrame.getItem().clone();
return;
case "PAINTING":
}
case "PAINTING" -> {
this.x = Math.floor(this.getX());
this.y = Math.floor(this.getY());
this.z = Math.floor(this.getZ());
@ -165,41 +142,43 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
this.dataString = art.name();
return;
}
// END MISC //
// INVENTORY HOLDER //
case "MINECART_CHEST":
case "MINECART_HOPPER":
case "MINECART_CHEST", "MINECART_HOPPER" -> {
storeInventory((InventoryHolder) entity);
return;
}
// START LIVING ENTITY //
// START AGEABLE //
// START TAMEABLE //
case "HORSE":
case "DONKEY":
case "LLAMA":
case "MULE":
case "SKELETON_HORSE":
case "HORSE", "DONKEY", "LLAMA", "MULE", "SKELETON_HORSE" -> {
AbstractHorse horse = (AbstractHorse) entity;
this.horse = new HorseStats();
this.horse.jump = horse.getJumpStrength();
if (horse instanceof ChestedHorse horse1) {
this.horse.chest = horse1.isCarryingChest();
}
//todo these horse features need fixing
//this.horse.variant = horse.getVariant();
//this.horse.style = horse.getStyle();
//this.horse.color = horse.getColor();
storeTameable(horse);
storeAgeable(horse);
storeLiving(horse);
storeInventory(horse);
return;
}
// END INVENTORY HOLDER //
case "WOLF":
case "OCELOT":
case "WOLF", "OCELOT" -> {
storeTameable((Tameable) entity);
storeAgeable((Ageable) entity);
storeLiving((LivingEntity) entity);
return;
}
// END TAMEABLE //
//todo fix sheep
case "SHEEP":
case "SHEEP" -> {
Sheep sheep = (Sheep) entity;
if (sheep.isSheared()) {
this.dataByte = (byte) 1;
@ -210,23 +189,20 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
storeAgeable(sheep);
storeLiving(sheep);
return;
case "VILLAGER":
case "CHICKEN":
case "COW":
case "MUSHROOM_COW":
case "PIG":
case "TURTLE":
case "POLAR_BEAR":
}
case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
storeAgeable((Ageable) entity);
storeLiving((LivingEntity) entity);
return;
case "RABBIT":
}
case "RABBIT" -> {
this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType());
storeAgeable((Ageable) entity);
storeLiving((LivingEntity) entity);
return;
}
// END AGEABLE //
case "ARMOR_STAND":
case "ARMOR_STAND" -> {
ArmorStand stand = (ArmorStand) entity;
this.inventory =
new ItemStack[]{stand.getItemInHand().clone(), stand.getHelmet().clone(),
@ -234,37 +210,30 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
stand.getBoots().clone()};
storeLiving(stand);
this.stand = new ArmorStandStats();
EulerAngle head = stand.getHeadPose();
this.stand.head[0] = (float) head.getX();
this.stand.head[1] = (float) head.getY();
this.stand.head[2] = (float) head.getZ();
EulerAngle body = stand.getBodyPose();
this.stand.body[0] = (float) body.getX();
this.stand.body[1] = (float) body.getY();
this.stand.body[2] = (float) body.getZ();
EulerAngle leftLeg = stand.getLeftLegPose();
this.stand.leftLeg[0] = (float) leftLeg.getX();
this.stand.leftLeg[1] = (float) leftLeg.getY();
this.stand.leftLeg[2] = (float) leftLeg.getZ();
EulerAngle rightLeg = stand.getRightLegPose();
this.stand.rightLeg[0] = (float) rightLeg.getX();
this.stand.rightLeg[1] = (float) rightLeg.getY();
this.stand.rightLeg[2] = (float) rightLeg.getZ();
EulerAngle leftArm = stand.getLeftArmPose();
this.stand.leftArm[0] = (float) leftArm.getX();
this.stand.leftArm[1] = (float) leftArm.getY();
this.stand.leftArm[2] = (float) leftArm.getZ();
EulerAngle rightArm = stand.getRightArmPose();
this.stand.rightArm[0] = (float) rightArm.getX();
this.stand.rightArm[1] = (float) rightArm.getY();
this.stand.rightArm[2] = (float) rightArm.getZ();
if (stand.hasArms()) {
this.stand.arms = true;
}
@ -278,52 +247,37 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
this.stand.small = true;
}
return;
case "ENDERMITE":
}
case "ENDERMITE" -> {
return;
case "BAT":
}
case "BAT" -> {
if (((Bat) entity).isAwake()) {
this.dataByte = (byte) 1;
} else {
this.dataByte = (byte) 0;
}
return;
case "ENDER_DRAGON":
}
case "ENDER_DRAGON" -> {
EnderDragon entity1 = (EnderDragon) entity;
this.dataByte = (byte) entity1.getPhase().ordinal();
return;
case "SKELETON":
case "WITHER_SKELETON":
case "GUARDIAN":
case "ELDER_GUARDIAN":
case "GHAST":
case "MAGMA_CUBE":
case "SQUID":
case "PIG_ZOMBIE":
case "HOGLIN":
case "ZOMBIFIED_PIGLIN":
case "PIGLIN":
case "PIGLIN_BRUTE":
case "ZOMBIE":
case "WITHER":
case "WITCH":
case "SPIDER":
case "CAVE_SPIDER":
case "SILVERFISH":
case "GIANT":
case "ENDERMAN":
case "CREEPER":
case "BLAZE":
case "SHULKER":
case "SNOWMAN":
}
case "SKELETON", "WITHER_SKELETON", "GUARDIAN", "ELDER_GUARDIAN", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN",
"ZOMBIFIED_PIGLIN", "PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH",
"GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SHULKER", "SNOWMAN" -> {
storeLiving((LivingEntity) entity);
return;
case "IRON_GOLEM":
}
case "IRON_GOLEM" -> {
if (((IronGolem) entity).isPlayerCreated()) {
this.dataByte = (byte) 1;
} else {
this.dataByte = (byte) 0;
}
storeLiving((LivingEntity) entity);
}
// END LIVING //
}
}
@ -461,20 +415,15 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
Entity entity;
switch (this.getType().toString()) {
case "DROPPED_ITEM":
case "DROPPED_ITEM" -> {
return world.dropItem(location, this.stack);
case "PLAYER":
case "LEASH_HITCH":
}
case "PLAYER", "LEASH_HITCH" -> {
return null;
case "ITEM_FRAME":
entity = world.spawn(location, ItemFrame.class);
break;
case "PAINTING":
entity = world.spawn(location, Painting.class);
break;
default:
entity = world.spawnEntity(location, this.getType());
break;
}
case "ITEM_FRAME" -> entity = world.spawn(location, ItemFrame.class);
case "PAINTING" -> entity = world.spawn(location, Painting.class);
default -> entity = world.spawnEntity(location, this.getType());
}
if (this.depth == 0) {
return entity;
@ -502,91 +451,70 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
entity.setGravity(false);
}
switch (entity.getType().toString()) {
case "BOAT":
case "BOAT" -> {
Boat boat = (Boat) entity;
boat.setWoodType(TreeSpecies.values()[dataByte]);
return entity;
case "SLIME":
}
case "SLIME" -> {
((Slime) entity).setSize(this.dataByte);
return entity;
case "ARROW":
case "EGG":
case "ENDER_CRYSTAL":
case "ENDER_PEARL":
case "ENDER_SIGNAL":
case "DROPPED_ITEM":
case "EXPERIENCE_ORB":
case "FALLING_BLOCK":
case "FIREBALL":
case "FIREWORK":
case "FISHING_HOOK":
case "LEASH_HITCH":
case "LIGHTNING":
case "MINECART":
case "MINECART_COMMAND":
case "MINECART_MOB_SPAWNER":
case "MINECART_TNT":
case "PLAYER":
case "PRIMED_TNT":
case "SMALL_FIREBALL":
case "SNOWBALL":
case "SPLASH_POTION":
case "THROWN_EXP_BOTTLE":
case "SPECTRAL_ARROW":
case "SHULKER_BULLET":
case "AREA_EFFECT_CLOUD":
case "DRAGON_FIREBALL":
case "WITHER_SKULL":
case "MINECART_FURNACE":
case "LLAMA_SPIT":
case "TRIDENT":
case "UNKNOWN":
}
case "ARROW", "EGG", "ENDER_CRYSTAL", "ENDER_PEARL", "ENDER_SIGNAL", "DROPPED_ITEM", "EXPERIENCE_ORB", "FALLING_BLOCK",
"FIREBALL", "FIREWORK", "FISHING_HOOK", "LEASH_HITCH", "LIGHTNING", "MINECART", "MINECART_COMMAND",
"MINECART_MOB_SPAWNER", "MINECART_TNT", "PLAYER", "PRIMED_TNT", "SMALL_FIREBALL", "SNOWBALL",
"SPLASH_POTION", "THROWN_EXP_BOTTLE", "SPECTRAL_ARROW", "SHULKER_BULLET", "AREA_EFFECT_CLOUD",
"DRAGON_FIREBALL", "WITHER_SKULL", "MINECART_FURNACE", "LLAMA_SPIT", "TRIDENT", "UNKNOWN" -> {
// Do this stuff later
return entity;
}
// MISC //
case "ITEM_FRAME":
case "ITEM_FRAME" -> {
ItemFrame itemframe = (ItemFrame) entity;
itemframe.setRotation(Rotation.values()[this.dataByte]);
itemframe.setItem(this.stack);
return entity;
case "PAINTING":
}
case "PAINTING" -> {
Painting painting = (Painting) entity;
painting.setFacingDirection(BlockFace.values()[this.dataByte], true);
painting.setArt(Art.getByName(this.dataString), true);
return entity;
}
// END MISC //
// INVENTORY HOLDER //
case "MINECART_CHEST":
case "MINECART_HOPPER":
case "MINECART_CHEST", "MINECART_HOPPER" -> {
restoreInventory((InventoryHolder) entity);
return entity;
}
// START LIVING ENTITY //
// START AGEABLE //
// START TAMEABLE //
case "HORSE":
case "LLAMA":
case "SKELETON_HORSE":
case "DONKEY":
case "MULE":
case "HORSE", "LLAMA", "SKELETON_HORSE", "DONKEY", "MULE" -> {
AbstractHorse horse = (AbstractHorse) entity;
horse.setJumpStrength(this.horse.jump);
if (horse instanceof ChestedHorse) {
((ChestedHorse) horse).setCarryingChest(this.horse.chest);
}
//todo broken as of 1.13
//horse.setVariant(this.horse.variant);
//horse.setStyle(this.horse.style);
//horse.setColor(this.horse.color);
restoreTameable(horse);
restoreAgeable(horse);
restoreLiving(horse);
restoreInventory(horse);
return entity;
}
// END INVENTORY HOLDER //
case "WOLF":
case "OCELOT":
case "WOLF", "OCELOT" -> {
restoreTameable((Tameable) entity);
restoreAgeable((Ageable) entity);
restoreLiving((LivingEntity) entity);
return entity;
}
// END AGEABLE //
case "SHEEP":
case "SHEEP" -> {
Sheep sheep = (Sheep) entity;
if (this.dataByte == 1) {
sheep.setSheared(true);
@ -597,25 +525,22 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
restoreAgeable(sheep);
restoreLiving(sheep);
return sheep;
case "VILLAGER":
case "CHICKEN":
case "COW":
case "TURTLE":
case "POLAR_BEAR":
case "MUSHROOM_COW":
case "PIG":
}
case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
restoreAgeable((Ageable) entity);
restoreLiving((LivingEntity) entity);
return entity;
}
// END AGEABLE //
case "RABBIT":
case "RABBIT" -> {
if (this.dataByte != 0) {
((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]);
}
restoreAgeable((Ageable) entity);
restoreLiving((LivingEntity) entity);
return entity;
case "ARMOR_STAND":
}
case "ARMOR_STAND" -> {
// CHECK positions
ArmorStand stand = (ArmorStand) entity;
if (this.inventory[0] != null) {
@ -685,56 +610,38 @@ public final class ReplicatingEntityWrapper extends EntityWrapper {
}
restoreLiving(stand);
return stand;
case "BAT":
}
case "BAT" -> {
if (this.dataByte != 0) {
((Bat) entity).setAwake(true);
}
restoreLiving((LivingEntity) entity);
return entity;
case "ENDER_DRAGON":
}
case "ENDER_DRAGON" -> {
if (this.dataByte != 0) {
((EnderDragon) entity).setPhase(EnderDragon.Phase.values()[this.dataByte]);
}
restoreLiving((LivingEntity) entity);
return entity;
case "ENDERMITE":
case "GHAST":
case "MAGMA_CUBE":
case "SQUID":
case "PIG_ZOMBIE":
case "HOGLIN":
case "PIGLIN":
case "ZOMBIFIED_PIGLIN":
case "PIGLIN_BRUTE":
case "ZOMBIE":
case "WITHER":
case "WITCH":
case "SPIDER":
case "CAVE_SPIDER":
case "SILVERFISH":
case "GIANT":
case "ENDERMAN":
case "CREEPER":
case "BLAZE":
case "SNOWMAN":
case "SHULKER":
case "GUARDIAN":
case "ELDER_GUARDIAN":
case "SKELETON":
case "WITHER_SKELETON":
}
case "ENDERMITE", "GHAST", "MAGMA_CUBE", "SQUID", "PIG_ZOMBIE", "HOGLIN", "PIGLIN", "ZOMBIFIED_PIGLIN", "PIGLIN_BRUTE", "ZOMBIE", "WITHER", "WITCH", "SPIDER", "CAVE_SPIDER", "SILVERFISH", "GIANT", "ENDERMAN", "CREEPER", "BLAZE", "SNOWMAN", "SHULKER", "GUARDIAN", "ELDER_GUARDIAN", "SKELETON", "WITHER_SKELETON" -> {
restoreLiving((LivingEntity) entity);
return entity;
case "IRON_GOLEM":
}
case "IRON_GOLEM" -> {
if (this.dataByte != 0) {
((IronGolem) entity).setPlayerCreated(true);
}
restoreLiving((LivingEntity) entity);
return entity;
default:
}
default -> {
if (Settings.DEBUG) {
LOGGER.info("Could not identify entity: {}", entity.getType());
}
return entity;
}
// END LIVING
}
}

View File

@ -24,7 +24,6 @@ import com.plotsquared.core.generator.IndependentPlotGenerator;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.location.UncheckedWorldLocation;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.plot.world.SinglePlotArea;
import com.plotsquared.core.queue.ZeroedDelegateScopedQueueCoordinator;
import org.bukkit.generator.BlockPopulator;
@ -47,17 +46,6 @@ final class BlockStatePopulator extends BlockPopulator {
this.plotGenerator = plotGenerator;
}
/**
* @deprecated Use {@link BlockStatePopulator#BlockStatePopulator(IndependentPlotGenerator)} as plotAreManager is unused
*/
@Deprecated(forRemoval = true, since = "6.9.0")
public BlockStatePopulator(
final @NonNull IndependentPlotGenerator plotGenerator,
final @NonNull PlotAreaManager plotAreaManager
) {
this.plotGenerator = plotGenerator;
}
@Override
public void populate(
@NonNull final WorldInfo worldInfo,

View File

@ -277,6 +277,11 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
return super.getBaseHeight(worldInfo, random, x, z, heightMap);
}
/**
* The entire method is deprecated, but kept for compatibility with versions lower than or equal to 1.16.2.
* The method will be removed in future versions, because WorldEdit and FastAsyncWorldEdit only support the latest point
* release.
*/
@SuppressWarnings("deprecation") // The entire method is deprecated, but kept for compatibility with <=1.16.2
@Override
@Deprecated(since = "TODO")
@ -287,8 +292,8 @@ public class BukkitPlotGenerator extends ChunkGenerator implements GeneratorWrap
if (this.platformGenerator != this) {
return this.platformGenerator.generateChunkData(world, random, x, z, biome);
} else {
// Return super as it will throw an exception caught by the server that will mean this method is no longer used.
return super.generateChunkData(world, random, x, z, biome);
// Throw exception to be caught by the server that indicates the new generation API is being used.
throw new UnsupportedOperationException("Using new generation methods. This method is unsupported.");
}
}

View File

@ -72,6 +72,7 @@ import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.Dispenser;
import org.bukkit.block.data.type.Farmland;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Fireball;
import org.bukkit.entity.Player;
@ -99,6 +100,7 @@ import org.bukkit.event.block.BlockSpreadEvent;
import org.bukkit.event.block.CauldronLevelChangeEvent;
import org.bukkit.event.block.EntityBlockFormEvent;
import org.bukkit.event.block.LeavesDecayEvent;
import org.bukkit.event.block.MoistureChangeEvent;
import org.bukkit.event.block.SpongeAbsorbEvent;
import org.bukkit.event.world.StructureGrowEvent;
import org.bukkit.projectiles.BlockProjectileSource;
@ -740,6 +742,43 @@ public class BlockEventListener implements Listener {
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onMoistureChange(MoistureChangeEvent event) {
Block block = event.getBlock();
Location location = BukkitUtil.adapt(block.getLocation());
PlotArea area = location.getPlotArea();
if (area == null) {
return;
}
Plot plot = area.getOwnedPlot(location);
if (plot == null) {
event.setCancelled(true);
return;
}
if (block.getBlockData() instanceof Farmland farmland && event
.getNewState()
.getBlockData() instanceof Farmland newFarmland) {
int currentMoisture = farmland.getMoisture();
int newMoisture = newFarmland.getMoisture();
// farmland gets moisturizes
if (newMoisture > currentMoisture) {
return;
}
if (plot.getFlag(SoilDryFlag.class)) {
return;
}
plot.debug("Soil could not dry because soil-dry = false");
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onChange(BlockFromToEvent event) {
Block fromBlock = event.getBlock();

View File

@ -67,6 +67,16 @@ public class ChunkListener implements Listener {
private RefMethod methodGetHandleChunk;
private RefMethod methodGetHandleWorld;
private RefField mustSave;
/*
private RefMethod methodGetFullChunk;
private RefMethod methodGetBukkitChunk;
private RefMethod methodGetChunkProvider;
private RefMethod methodGetVisibleMap;
private RefField worldServer;
private RefField playerChunkMap;
private RefField updatingChunks;
private RefField visibleChunks;
*/
private Chunk lastChunk;
private boolean ignoreUnload = false;
private boolean isTrueForNotSave = true;

View File

@ -113,7 +113,15 @@ public class EntityEventListener implements Listener {
return;
}
Entity victim = event.getEntity();
/*
if (victim.getType().equals(EntityType.ITEM_FRAME)) {
Plot plot = BukkitUtil.getLocation(victim).getPlot();
if (plot != null && !plot.isAdded(damager.getUniqueId())) {
event.setCancelled(true);
return;
}
}
*/
if (!BukkitEntityUtil.entityDamage(damager, victim, event.getCause())) {
if (event.isCancelled()) {
if (victim instanceof Ageable ageable) {
@ -137,54 +145,37 @@ public class EntityEventListener implements Listener {
}
CreatureSpawnEvent.SpawnReason reason = event.getSpawnReason();
switch (reason.toString()) {
case "DISPENSE_EGG":
case "EGG":
case "OCELOT_BABY":
case "SPAWNER_EGG":
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
if (!area.isSpawnEggs()) {
event.setCancelled(true);
return;
}
break;
case "REINFORCEMENTS":
case "NATURAL":
case "MOUNT":
case "PATROL":
case "RAID":
case "SHEARED":
case "SILVERFISH_BLOCK":
case "ENDER_PEARL":
case "TRAP":
case "VILLAGE_DEFENSE":
case "VILLAGE_INVASION":
case "BEEHIVE":
case "CHUNK_GEN":
}
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL",
"TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
if (!area.isMobSpawning()) {
event.setCancelled(true);
return;
}
break;
case "BREEDING":
}
case "BREEDING" -> {
if (!area.isSpawnBreeding()) {
event.setCancelled(true);
return;
}
break;
case "BUILD_IRONGOLEM":
case "BUILD_SNOWMAN":
case "BUILD_WITHER":
case "CUSTOM":
}
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
if (!area.isSpawnCustom() && entity.getType() != EntityType.ARMOR_STAND) {
event.setCancelled(true);
return;
}
break;
case "SPAWNER":
}
case "SPAWNER" -> {
if (!area.isMobSpawnerSpawning()) {
event.setCancelled(true);
return;
}
break;
}
}
Plot plot = area.getOwnedPlotAbs(location);
if (plot == null) {

View File

@ -178,59 +178,41 @@ public class PaperListener implements Listener {
}
CreatureSpawnEvent.SpawnReason reason = event.getReason();
switch (reason.toString()) {
case "DISPENSE_EGG":
case "EGG":
case "OCELOT_BABY":
case "SPAWNER_EGG":
case "DISPENSE_EGG", "EGG", "OCELOT_BABY", "SPAWNER_EGG" -> {
if (!area.isSpawnEggs()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
break;
case "REINFORCEMENTS":
case "NATURAL":
case "MOUNT":
case "PATROL":
case "RAID":
case "SHEARED":
case "SILVERFISH_BLOCK":
case "ENDER_PEARL":
case "TRAP":
case "VILLAGE_DEFENSE":
case "VILLAGE_INVASION":
case "BEEHIVE":
case "CHUNK_GEN":
}
case "REINFORCEMENTS", "NATURAL", "MOUNT", "PATROL", "RAID", "SHEARED", "SILVERFISH_BLOCK", "ENDER_PEARL", "TRAP", "VILLAGE_DEFENSE", "VILLAGE_INVASION", "BEEHIVE", "CHUNK_GEN" -> {
if (!area.isMobSpawning()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
break;
case "BREEDING":
}
case "BREEDING" -> {
if (!area.isSpawnBreeding()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
break;
case "BUILD_IRONGOLEM":
case "BUILD_SNOWMAN":
case "BUILD_WITHER":
case "CUSTOM":
}
case "BUILD_IRONGOLEM", "BUILD_SNOWMAN", "BUILD_WITHER", "CUSTOM" -> {
if (!area.isSpawnCustom() && event.getType() != EntityType.ARMOR_STAND) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
break;
case "SPAWNER":
}
case "SPAWNER" -> {
if (!area.isMobSpawnerSpawning()) {
event.setShouldAbortSpawn(true);
event.setCancelled(true);
return;
}
break;
}
}
Plot plot = location.getOwnedPlotAbs();
if (plot == null) {

View File

@ -1,93 +0,0 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.bukkit.listener;
import com.google.inject.Inject;
import com.plotsquared.bukkit.util.BukkitUtil;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.location.Location;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.world.PlotAreaManager;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.block.Banner;
import org.bukkit.block.Beacon;
import org.bukkit.block.BlockState;
import org.bukkit.block.CommandBlock;
import org.bukkit.block.Comparator;
import org.bukkit.block.Conduit;
import org.bukkit.block.Container;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.block.DaylightDetector;
import org.bukkit.block.EnchantingTable;
import org.bukkit.block.EndGateway;
import org.bukkit.block.EnderChest;
import org.bukkit.block.Jukebox;
import org.bukkit.block.Sign;
import org.bukkit.block.Skull;
import org.bukkit.block.Structure;
import org.bukkit.block.data.type.Bed;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.BlockPlaceEvent;
import org.checkerframework.checker.nullness.qual.NonNull;
/**
* @deprecated P2 effectively no longer supports 1.13
*/
@Deprecated(forRemoval = true, since = "6.10.4")
public class PaperListener113 extends PaperListener {
@Inject
public PaperListener113(@NonNull PlotAreaManager plotAreaManager) {
super(plotAreaManager);
}
@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
if (!Settings.Paper_Components.TILE_ENTITY_CHECK || !Settings.Enabled_Components.CHUNK_PROCESSOR) {
return;
}
BlockState state = event.getBlock().getState(false);
if (!(state instanceof Banner || state instanceof Beacon || state instanceof Bed || state instanceof CommandBlock
|| state instanceof Comparator || state instanceof Conduit || state instanceof Container || state instanceof CreatureSpawner
|| state instanceof DaylightDetector || state instanceof EnchantingTable || state instanceof EnderChest || state instanceof EndGateway
|| state instanceof Jukebox || state instanceof Sign || state instanceof Skull || state instanceof Structure)) {
return;
}
final Location location = BukkitUtil.adapt(event.getBlock().getLocation());
final PlotArea plotArea = location.getPlotArea();
if (plotArea == null) {
return;
}
final int tileEntityCount = event.getBlock().getChunk().getTileEntities(false).length;
if (tileEntityCount >= Settings.Chunk_Processor.MAX_TILES) {
final PlotPlayer<?> plotPlayer = BukkitUtil.adapt(event.getPlayer());
plotPlayer.sendMessage(
TranslatableCaption.of("errors.tile_entity_cap_reached"),
TagResolver.resolver("amount", Tag.inserting(Component.text(Settings.Chunk_Processor.MAX_TILES)))
);
event.setCancelled(true);
event.setBuild(false);
}
}
}

View File

@ -273,8 +273,7 @@ public class PlayerEventListener implements Listener {
Plot plot = plotPlayer.getCurrentPlot();
// Check WorldEdit
switch (parts[0]) {
case "up":
case "worldedit:up":
case "up", "worldedit:up" -> {
if (plot == null || (!plot.isAdded(plotPlayer.getUUID()) && !plotPlayer.hasPermission(
Permission.PERMISSION_ADMIN_BUILD_OTHER,
true
@ -283,6 +282,7 @@ public class PlayerEventListener implements Listener {
return;
}
}
}
if (plot == null && !area.isRoadFlags()) {
return;
}
@ -844,6 +844,10 @@ public class PlayerEventListener implements Listener {
@SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onInventoryClick(InventoryClickEvent event) {
/*if (!event.isLeftClick() || (event.getAction() != InventoryAction.PLACE_ALL) || event
.isShiftClick()) {
return;
}*/
HumanEntity entity = event.getWhoClicked();
if (!(entity instanceof Player) || !this.plotAreaManager
.hasPlotArea(entity.getWorld().getName())) {
@ -1112,13 +1116,13 @@ public class PlayerEventListener implements Listener {
Location location = BukkitUtil.adapt(block.getLocation());
Action action = event.getAction();
switch (action) {
case PHYSICAL: {
case PHYSICAL -> {
eventType = PlayerBlockEventType.TRIGGER_PHYSICAL;
blocktype1 = BukkitAdapter.asBlockType(block.getType());
break;
}
//todo rearrange the right click code. it is all over the place.
case RIGHT_CLICK_BLOCK: {
case RIGHT_CLICK_BLOCK -> {
Material blockType = block.getType();
eventType = PlayerBlockEventType.INTERACT_BLOCK;
blocktype1 = BukkitAdapter.asBlockType(block.getType());
@ -1140,22 +1144,17 @@ public class PlayerEventListener implements Listener {
// in the following, lb needs to have the material of the item in hand i.e. type
switch (type.toString()) {
case "REDSTONE":
case "STRING":
case "PUMPKIN_SEEDS":
case "MELON_SEEDS":
case "COCOA_BEANS":
case "WHEAT_SEEDS":
case "BEETROOT_SEEDS":
case "SWEET_BERRIES":
case "GLOW_BERRIES":
case "REDSTONE", "STRING", "PUMPKIN_SEEDS", "MELON_SEEDS", "COCOA_BEANS", "WHEAT_SEEDS", "BEETROOT_SEEDS",
"SWEET_BERRIES", "GLOW_BERRIES" -> {
return;
default:
}
default -> {
//eventType = PlayerBlockEventType.PLACE_BLOCK;
if (type.isBlock()) {
return;
}
}
}
if (PaperLib.isPaper()) {
if (MaterialTags.SPAWN_EGGS.isTagged(type) || Material.EGG.equals(type)) {
eventType = PlayerBlockEventType.SPAWN_MOB;
@ -1187,9 +1186,8 @@ public class PlayerEventListener implements Listener {
eventType = PlayerBlockEventType.READ;
break;
}
break;
}
case LEFT_CLICK_BLOCK: {
case LEFT_CLICK_BLOCK -> {
Material blockType = block.getType();
// todo: when the code above is rearranged, it would be great to beautify this as well.
@ -1200,11 +1198,11 @@ public class PlayerEventListener implements Listener {
eventType = PlayerBlockEventType.INTERACT_BLOCK;
blocktype1 = BukkitAdapter.asBlockType(block.getType());
break;
}
default:
default -> {
return;
}
}
if (this.worldEdit != null && pp.getAttribute("worldedit")) {
if (event.getMaterial() == Material.getMaterial(this.worldEdit.getConfiguration().wandItem)) {
return;

View File

@ -89,6 +89,11 @@ public class SingleWorldListener implements Listener {
markChunkAsClean(event.getChunk());
}
// @EventHandler
// public void onPopulate(ChunkPopulateEvent event) {
// handle(event);
// }
@EventHandler(priority = EventPriority.LOWEST)
public void onChunkLoad(ChunkLoadEvent event) {
handle(event);

View File

@ -1,63 +0,0 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.bukkit.managers;
/*
import com.google.inject.Singleton;
import org.bukkit.World;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
import se.hyperver.hyperverse.Hyperverse;
import se.hyperver.hyperverse.world.WorldConfiguration;
import se.hyperver.hyperverse.world.WorldConfigurationBuilder;
import se.hyperver.hyperverse.world.WorldFeatures;
import se.hyperver.hyperverse.world.WorldType;
Hyperverse implementation is currently put on ice until Hyperverse is released on a stable line and deployed to the central
repository.
@Singleton
public class HyperverseWorldManager extends BukkitWorldManager {
@Override
public @Nullable World handleWorldCreation(@NonNull String worldName, @Nullable String generator) {
// First let Bukkit register the world
this.setGenerator(worldName, generator);
// Create the world
final WorldConfigurationBuilder worldConfigurationBuilder = WorldConfiguration.builder()
.setName(worldName).setType(WorldType.OVER_WORLD);
if (generator != null) {
worldConfigurationBuilder.setGenerator(generator).setWorldFeatures(WorldFeatures.FLATLAND);
}
try {
return Hyperverse.getApi().createWorld(worldConfigurationBuilder.createWorldConfiguration())
.getBukkitWorld();
} catch (final Exception e) {
e.printStackTrace();
}
return null;
}
@Override
public String getName() {
return "bukkit-hyperverse";
}
}
*/

View File

@ -41,9 +41,13 @@ public class BukkitOfflinePlayer implements OfflinePlotPlayer {
* @param player Bukkit OfflinePlayer player to convert
* @param permissionHandler Permission Profile to be used
*/
public BukkitOfflinePlayer(final @NonNull OfflinePlayer player, final @NonNull PermissionHandler permissionHandler) {
public BukkitOfflinePlayer(
final @NonNull OfflinePlayer player, final @NonNull
PermissionHandler permissionHandler
) {
this.player = player;
this.permissionProfile = permissionHandler.getPermissionProfile(this).orElse(NullPermissionProfile.INSTANCE);
this.permissionProfile = permissionHandler.getPermissionProfile(this)
.orElse(NullPermissionProfile.INSTANCE);
}
@NonNull

View File

@ -71,29 +71,8 @@ public class BukkitPlayer extends PlotPlayer<Player> {
* @param eventDispatcher EventDispatcher instance
* @param player Bukkit player instance
* @param permissionHandler PermissionHandler instance
* @deprecated Please do not use this method. Instead use {@link BukkitUtil#adapt(Player)}, as it caches player objects.
* This method will be made private in a future release.
*/
@Deprecated(forRemoval = true, since = "TODO")
public BukkitPlayer(
final @NonNull PlotAreaManager plotAreaManager,
final @NonNull EventDispatcher eventDispatcher,
final @NonNull Player player,
final @NonNull PermissionHandler permissionHandler
) {
this(plotAreaManager, eventDispatcher, player, false, permissionHandler);
}
/**
* @param plotAreaManager PlotAreaManager instance
* @param eventDispatcher EventDispatcher instance
* @param player Bukkit player instance
* @param permissionHandler PermissionHandler instance
* @deprecated Please do not use this method. Instead use {@link BukkitUtil#adapt(Player)}, as it caches player objects.
* This method will be made private in a future release.
*/
@Deprecated(forRemoval = true, since = "TODO")
public BukkitPlayer(
BukkitPlayer(
final @NonNull PlotAreaManager plotAreaManager,
final @NonNull EventDispatcher eventDispatcher,
final @NonNull Player player,

View File

@ -54,7 +54,6 @@ public class BukkitPlayerManager extends PlayerManager<BukkitPlayer, Player> {
@NonNull
@Override
@SuppressWarnings("deprecation")
public BukkitPlayer getPlayer(final @NonNull Player object) {
if (object.getUniqueId().version() == 2) { // not a real player
return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, object, false, this.permissionHandler);
@ -66,13 +65,12 @@ public class BukkitPlayerManager extends PlayerManager<BukkitPlayer, Player> {
}
@Override
@SuppressWarnings("deprecation")
public @NonNull BukkitPlayer createPlayer(final @NonNull UUID uuid) {
final Player player = Bukkit.getPlayer(uuid);
if (player == null || !player.isOnline()) {
throw new NoSuchPlayerException(uuid);
}
return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, this.permissionHandler);
return new BukkitPlayer(this.plotAreaManager, this.eventDispatcher, player, false, this.permissionHandler);
}
@Nullable

View File

@ -37,7 +37,6 @@ import org.bukkit.block.Sign;
import org.bukkit.block.Skull;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.checkerframework.checker.nullness.qual.NonNull;
@ -52,15 +51,6 @@ public class StateWrapper {
public org.bukkit.block.BlockState state = null;
public CompoundTag tag = null;
/**
* @deprecated in favour of using WE methods for obtaining NBT, specifically by obtaining a
* {@link com.sk89q.worldedit.world.block.BaseBlock} and then using {@link com.sk89q.worldedit.world.block.BaseBlock#getNbtData()}
*/
@Deprecated(forRemoval = true, since = "6.9.0")
public StateWrapper(org.bukkit.block.BlockState state) {
this.state = state;
}
public StateWrapper(CompoundTag tag) {
this.tag = tag;
}
@ -254,26 +244,6 @@ public class StateWrapper {
return false;
}
/**
* Get a CompoundTag of the contents of a block's inventory (chest, furnace, etc.).
*
* @deprecated in favour of using WorldEdit methods for obtaining NBT, specifically by obtaining a
* {@link com.sk89q.worldedit.world.block.BaseBlock} and then using {@link com.sk89q.worldedit.world.block.BaseBlock#getNbtData()}
*/
@Deprecated(forRemoval = true, since = "6.9.0")
public CompoundTag getTag() {
if (this.tag != null) {
return this.tag;
}
if (this.state instanceof InventoryHolder inv) {
ItemStack[] contents = inv.getInventory().getContents();
Map<String, Tag> values = new HashMap<>();
values.put("Items", new ListTag(CompoundTag.class, serializeInventory(contents)));
return new CompoundTag(values);
}
return null;
}
public String getId() {
String tileid = this.tag.getString("id").toLowerCase();
if (tileid.startsWith("minecraft:")) {

View File

@ -69,9 +69,8 @@ public class BukkitRegionManager extends RegionManager {
@Inject
public BukkitRegionManager(
@NonNull WorldUtil worldUtil,
@NonNull GlobalBlockQueue blockQueue,
@NonNull ProgressSubscriberFactory subscriberFactory
@NonNull WorldUtil worldUtil, @NonNull GlobalBlockQueue blockQueue, @NonNull
ProgressSubscriberFactory subscriberFactory
) {
super(worldUtil, blockQueue, subscriberFactory);
this.blockQueue = blockQueue;
@ -258,7 +257,7 @@ public class BukkitRegionManager extends RegionManager {
map.saveEntitiesOut(Bukkit.getWorld(world.getName()).getChunkAt(x, z), currentPlotClear);
AugmentedUtils.bypass(
ignoreAugment,
() -> ChunkManager.setChunkInPlotArea(null, new RunnableVal<>() {
() -> ChunkManager.setChunkInPlotArea(null, new RunnableVal<ZeroedDelegateScopedQueueCoordinator>() {
@Override
public void run(ZeroedDelegateScopedQueueCoordinator value) {
Location min = value.getMin();

View File

@ -31,6 +31,7 @@ import org.apache.logging.log4j.Logger;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import java.util.HashMap;
import java.util.HashSet;
@ -84,6 +85,28 @@ public class ContentMap {
}
}
void saveEntitiesIn(Chunk chunk, CuboidRegion region, boolean delete) {
for (Entity entity : chunk.getEntities()) {
Location location = BukkitUtil.adapt(entity.getLocation());
int x = location.getX();
int z = location.getZ();
if (!BukkitChunkManager.isIn(region, x, z)) {
continue;
}
if (entity.getVehicle() != null) {
continue;
}
EntityWrapper wrap = new ReplicatingEntityWrapper(entity, (short) 2);
wrap.saveEntity();
this.entities.add(wrap);
if (delete) {
if (!(entity instanceof Player)) {
entity.remove();
}
}
}
}
void restoreEntities(World world) {
for (EntityWrapper entity : this.entities) {
try {

View File

@ -54,8 +54,8 @@ public class UpdateUtility implements Listener {
internalVersion = PlotSquared.get().getVersion();
}
// Suppress Json deprecation, we can't use features from gson 2.8.1 and newer yet
@SuppressWarnings({"deprecation", "DefaultCharset"})
// Suppress Json deprecation, we can't use features from gson 2.8.1 and newer yet
public void updateChecker() {
task = Bukkit.getScheduler().runTaskTimerAsynchronously(this.javaPlugin, () -> {
try {

View File

@ -4,16 +4,16 @@ api-version: "1.13"
version: "${version}"
load: STARTUP
description: "Easy, yet powerful Plot World generation and management."
authors: [Citymonstret, Empire92, MattBDev, dordsor21, NotMyFault, SirYwell]
authors: [ Citymonstret, Empire92, MattBDev, dordsor21, NotMyFault, SirYwell ]
website: https://www.spigotmc.org/resources/77506/
softdepend: [Vault, PlaceholderAPI, Essentials, LuckPerms, BungeePerms, MVdWPlaceholderAPI]
loadbefore: [MultiWorld, Multiverse-Core]
depend: [WorldEdit]
softdepend: [ Vault, PlaceholderAPI, Essentials, LuckPerms, BungeePerms, MVdWPlaceholderAPI ]
loadbefore: [ MultiWorld, Multiverse-Core ]
depend: [ WorldEdit ]
database: false
commands:
plots:
description: Plot command.
aliases: [p,plot,ps,plotsquared,p2,2,plotme]
aliases: [ p,plot,ps,plotsquared,p2,2,plotme ]
permission: plots.use
permission-message: "You are lacking the permission node 'plots.use'"
permissions:

View File

@ -55,7 +55,7 @@ further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at contact@intellectualsites.com. All
reported by contacting the project team at contact<at>intellectualsites.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.

View File

@ -68,8 +68,8 @@ tasks {
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
val opt = options as StandardJavadocDocletOptions
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-core/" + libs.worldeditCore.get().versionConstraint.toString())
opt.links("https://jd.adventure.kyori.net/api/4.12.0/")
opt.links("https://jd.adventure.kyori.net/text-minimessage/4.12.0/")
opt.links("https://jd.advntr.dev/api/4.12.0/")
opt.links("https://jd.advntr.dev/text-minimessage/4.12.0/")
opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/")
opt.links("https://checkerframework.org/api/")
opt.links("https://javadoc.io/doc/com.intellectualsites.informative-annotations/informative-annotations/latest/")

View File

@ -203,7 +203,7 @@ public interface PlotPlatform<P> extends LocaleHolder {
* @return Player manager
*/
default @NonNull PlayerManager<? extends PlotPlayer<P>, ? extends P> playerManager() {
return injector().getInstance(Key.get(new TypeLiteral<>() {
return injector().getInstance(Key.get(new TypeLiteral<PlayerManager<? extends PlotPlayer<P>, ? extends P>>() {
}));
}

View File

@ -133,6 +133,8 @@ public class PlotSquared {
private final Map<String, CaptionMap> captionMaps = new HashMap<>();
public HashMap<String, HashMap<PlotId, Plot>> plots_tmp;
private CaptionLoader captionLoader;
// WorldEdit instance
private WorldEdit worldedit;
private File configFile;
private File worldsFile;
private YamlConfiguration worldConfiguration;
@ -221,11 +223,11 @@ public class PlotSquared {
}
}
WorldEdit worldedit = WorldEdit.getInstance();
this.worldedit = WorldEdit.getInstance();
WorldEdit.getInstance().getEventBus().register(new WEPlatformReadyListener());
// Create Event utility class
this.eventDispatcher = new EventDispatcher(worldedit);
this.eventDispatcher = new EventDispatcher(this.worldedit);
// Create plot listener
this.plotListener = new PlotListener(this.eventDispatcher);
@ -1013,7 +1015,7 @@ public class PlotSquared {
/**
* Setup the configuration for a plot world based on world arguments.
*
* <p>
*
* <i>e.g. /mv create &lt;world&gt; normal -g PlotSquared:&lt;args&gt;</i>
*
@ -1523,6 +1525,10 @@ public class PlotSquared {
return this.backgroundUUIDPipeline;
}
public @NonNull WorldEdit getWorldEdit() {
return this.worldedit;
}
public @NonNull File getConfigFile() {
return this.configFile;
}

View File

@ -136,7 +136,9 @@ public class SimpleBackupManager implements BackupManager {
return this.backupLimit;
}
private record PlotCacheKey(Plot plot) {
private record PlotCacheKey(
Plot plot
) {
@Override
public boolean equals(final Object o) {

View File

@ -173,7 +173,7 @@ public class QuadMap<T> {
public QuadMap<T> newInstance(int newsize, int x, int z, int min) {
try {
return new QuadMap<>(newsize, x, z, min) {
return new QuadMap<T>(newsize, x, z, min) {
@Override
public CuboidRegion getRegion(T value) {
return QuadMap.this.getRegion(value);

View File

@ -55,6 +55,7 @@ import com.plotsquared.core.util.TabCompletions;
import com.plotsquared.core.util.WorldUtil;
import com.plotsquared.core.util.task.RunnableVal3;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.EditSessionBuilder;
import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.entity.Player;
@ -232,13 +233,11 @@ public class Area extends SubCommand {
try (final ClipboardWriter clipboardWriter = BuiltInClipboardFormat.SPONGE_SCHEMATIC.getWriter(new FileOutputStream(
file))) {
final BlockArrayClipboard clipboard = new BlockArrayClipboard(selectedRegion);
final EditSession editSession = WorldEdit.getInstance().newEditSession(selectedRegion.getWorld());
final ForwardExtentCopy forwardExtentCopy = new ForwardExtentCopy(
editSession,
selectedRegion,
clipboard,
selectedRegion.getMinimumPoint()
);
EditSessionBuilder editSessionBuilder = WorldEdit.getInstance().newEditSessionBuilder();
editSessionBuilder.world(selectedRegion.getWorld());
final EditSession editSession = editSessionBuilder.build();
final ForwardExtentCopy forwardExtentCopy =
new ForwardExtentCopy(editSession, selectedRegion, clipboard, selectedRegion.getMinimumPoint());
forwardExtentCopy.setCopyingBiomes(true);
forwardExtentCopy.setCopyingEntities(true);
Operations.complete(forwardExtentCopy);
@ -725,7 +724,7 @@ public class Area extends SubCommand {
return false;
}
final List<PlotArea> areas = new ArrayList<>(Arrays.asList(this.plotAreaManager.getAllPlotAreas()));
paginate(player, areas, 8, page, new RunnableVal3<>() {
paginate(player, areas, 8, page, new RunnableVal3<Integer, PlotArea, CaptionHolder>() {
@Override
public void run(Integer i, PlotArea area, CaptionHolder caption) {
String name;

View File

@ -35,6 +35,7 @@ import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.services.plots.AutoQuery;
import com.plotsquared.core.services.plots.AutoService;
import com.plotsquared.core.util.EconHandler;
import com.plotsquared.core.util.EventDispatcher;
@ -326,7 +327,7 @@ public class Auto extends SubCommand {
}
List<Plot> plots = this.servicePipeline
.pump(new AutoService.AutoQuery(player, null, sizeX, sizeZ, plotarea))
.pump(new AutoQuery(player, null, sizeX, sizeZ, plotarea))
.through(AutoService.class)
.getResult();

View File

@ -83,7 +83,7 @@ public class Caps extends SubCommand {
final int current = countedEntities[type];
final int max = plot.getFlag(capFlag);
final String percentage = String.format("%.1f", 100 * ((float) current / max));
ComponentLike maxBeautified = max == Integer.MAX_VALUE
ComponentLike maxBeautified = max >= Integer.MAX_VALUE
? TranslatableCaption.of("info.infinite").toComponent(player)
: Component.text(max);
player.sendMessage(

View File

@ -107,9 +107,7 @@ public class Clear extends Command {
}
BackupManager.backup(player, plot, () -> {
final long start = System.currentTimeMillis();
boolean result = plot.getPlotModificationManager().clear(true, false, player, () -> {
plot.getPlotModificationManager().unlink();
TaskManager.runTask(() -> {
boolean result = plot.getPlotModificationManager().clear(true, false, player, () -> TaskManager.runTask(() -> {
plot.removeRunning();
// If the state changes, then mark it as no longer done
if (DoneFlag.isDone(plot)) {
@ -137,8 +135,7 @@ public class Clear extends Command {
.tag("plot", Tag.inserting(Component.text(plot.getId().toString())))
.build()
);
});
});
}));
if (!result) {
player.sendMessage(TranslatableCaption.of("errors.wait_for_timer"));
} else {

View File

@ -813,7 +813,8 @@ public class Cluster extends SubCommand {
if (throwable instanceof TimeoutException) {
player.sendMessage(TranslatableCaption.of("players.fetching_players_timeout"));
} else {
final String owner = Objects.requireNonNullElse(username, "unknown");
final String owner;
owner = Objects.requireNonNullElse(username, "unknown");
String name = cluster.getName();
String size = (cluster.getP2().getX() - cluster.getP1().getX() + 1) + "x" + (
cluster.getP2().getY() - cluster.getP1().getY() + 1);

View File

@ -502,9 +502,9 @@ public abstract class Command {
public String getCommandString() {
if (this.parent == null) {
return "/" + this;
return "/" + toString();
} else {
return this.parent.getCommandString() + " " + this;
return this.parent.getCommandString() + " " + toString();
}
}
@ -559,9 +559,10 @@ public abstract class Command {
public Collection<Command> tab(PlotPlayer<?> player, String[] args, boolean space) {
switch (args.length) {
case 0:
case 0 -> {
return this.allCommands;
case 1:
}
case 1 -> {
String arg = args[0].toLowerCase();
if (space) {
Command cmd = getCommand(arg);
@ -580,7 +581,8 @@ public abstract class Command {
}
return commands;
}
default:
}
default -> {
Command cmd = getCommand(args[0]);
if (cmd != null) {
return cmd.tab(player, Arrays.copyOfRange(args, 1, args.length), space);
@ -589,6 +591,7 @@ public abstract class Command {
}
}
}
}
@Override
public String toString() {

View File

@ -37,7 +37,7 @@ public class Confirm extends SubCommand {
}
CmdConfirm.removePending(player);
if ((System.currentTimeMillis() - command.timestamp)
> Settings.Confirmation.CONFIRMATION_TIMEOUT_SECONDS * 1000L) {
> Settings.Confirmation.CONFIRMATION_TIMEOUT_SECONDS * 1000) {
player.sendMessage(TranslatableCaption.of("confirm.expired_confirm"));
return false;
}

View File

@ -75,11 +75,13 @@ public class DebugRoadRegen extends SubCommand {
}
String kind = args[0].toLowerCase();
switch (kind) {
case "plot":
case "plot" -> {
return regenPlot(player);
case "region":
}
case "region" -> {
return regenRegion(player, Arrays.copyOfRange(args, 1, args.length));
default:
}
default -> {
player.sendMessage(
TranslatableCaption.of("commandconfig.command_syntax"),
TagResolver.resolver("value", Tag.inserting(Component.text(DebugRoadRegen.USAGE)))
@ -87,6 +89,7 @@ public class DebugRoadRegen extends SubCommand {
return false;
}
}
}
public boolean regenPlot(PlotPlayer<?> player) {
Location location = player.getLocation();

View File

@ -183,7 +183,9 @@ public class Download extends SubCommand {
private void upload(PlotPlayer<?> player, Plot plot) {
if (Settings.Web.LEGACY_WEBINTERFACE) {
schematicHandler.getCompoundTag(plot).whenComplete((compoundTag, throwable) -> schematicHandler.upload(
schematicHandler
.getCompoundTag(plot)
.whenComplete((compoundTag, throwable) -> schematicHandler.upload(
compoundTag,
null,
null,
@ -191,10 +193,13 @@ public class Download extends SubCommand {
@Override
public void run(URL value) {
plot.removeRunning();
player.sendMessage(TranslatableCaption.of("web.generation_link_success"), TagResolver.builder().tag(
"download",
Tag.preProcessParsed(value.toString())
).tag("delete", Tag.preProcessParsed("Not available")).build());
player.sendMessage(
TranslatableCaption.of("web.generation_link_success"),
TagResolver.builder()
.tag("download", Tag.preProcessParsed(value.toString()))
.tag("delete", Tag.preProcessParsed("Not available"))
.build()
);
player.sendMessage(StaticCaption.of(value.toString()));
}
}

View File

@ -60,9 +60,10 @@ public class Help extends Command {
RunnableVal2<Command, CommandResult> whenDone
) {
switch (args.length) {
case 0:
case 0 -> {
return displayHelp(player, null, 0);
case 1:
}
case 1 -> {
if (MathMan.isInteger(args[0])) {
try {
return displayHelp(player, null, Integer.parseInt(args[0]));
@ -72,7 +73,8 @@ public class Help extends Command {
} else {
return displayHelp(player, args[0], 1);
}
case 2:
}
case 2 -> {
if (MathMan.isInteger(args[1])) {
try {
return displayHelp(player, args[0], Integer.parseInt(args[1]));
@ -81,8 +83,8 @@ public class Help extends Command {
}
}
return CompletableFuture.completedFuture(false);
default:
sendUsage(player);
}
default -> sendUsage(player);
}
return CompletableFuture.completedFuture(true);
}

View File

@ -190,7 +190,7 @@ public class Inbox extends SubCommand {
final int page;
if (args.length > 1) {
switch (args[1].toLowerCase()) {
case "delete":
case "delete" -> {
if (!inbox.canModify(plot, player)) {
player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify"));
return false;
@ -225,7 +225,6 @@ public class Inbox extends SubCommand {
);
return false;
}
if (!inbox.getComments(plot, new RunnableVal<>() {
@Override
public void run(List<PlotComment> value) {
@ -254,7 +253,8 @@ public class Inbox extends SubCommand {
return false;
}
return true;
case "clear":
}
case "clear" -> {
if (!inbox.canModify(plot, player)) {
player.sendMessage(TranslatableCaption.of("comment.no_perm_inbox_modify"));
}
@ -268,7 +268,8 @@ public class Inbox extends SubCommand {
plot.getPlotCommentContainer().removeComments(comments);
}
return true;
default:
}
default -> {
try {
page = Integer.parseInt(args[1]);
} catch (NumberFormatException ignored) {
@ -276,6 +277,7 @@ public class Inbox extends SubCommand {
return false;
}
}
}
} else {
page = 1;
}

View File

@ -117,7 +117,7 @@ public class ListCmd extends SubCommand {
if (player.hasPermission(Permission.PERMISSION_LIST_FUZZY)) {
args.add("fuzzy <search...>");
}
return args.toArray(new String[0]);
return args.toArray(new String[args.size()]);
}
public void noArgs(PlotPlayer<?> player) {

View File

@ -28,6 +28,7 @@ import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import java.util.List;
import java.util.concurrent.CompletableFuture;
@CommandDeclaration(command = "near",
@ -55,4 +56,8 @@ public class Near extends Command {
return CompletableFuture.completedFuture(true);
}
private List<PlotPlayer<?>> getPlayersInPlotVisible(Plot plot, PlotPlayer<?> executor) {
return plot.getPlayersInPlot().stream().filter(executor::canSee).toList();
}
}

View File

@ -90,12 +90,8 @@ public class Purge extends SubCommand {
return false;
}
switch (split[0].toLowerCase()) {
case "world":
case "w":
world = split[1];
break;
case "area":
case "a":
case "world", "w" -> world = split[1];
case "area", "a" -> {
area = this.plotAreaManager.getPlotAreaByString(split[1]);
if (area == null) {
player.sendMessage(
@ -104,9 +100,8 @@ public class Purge extends SubCommand {
);
return false;
}
break;
case "plotid":
case "id":
}
case "plotid", "id" -> {
try {
id = PlotId.fromString(split[1]);
} catch (IllegalArgumentException ignored) {
@ -116,9 +111,8 @@ public class Purge extends SubCommand {
);
return false;
}
break;
case "owner":
case "o":
}
case "owner", "o" -> {
UUIDMapping ownerMapping = PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(split[1]);
if (ownerMapping == null) {
player.sendMessage(
@ -128,9 +122,8 @@ public class Purge extends SubCommand {
return false;
}
owner = ownerMapping.uuid();
break;
case "shared":
case "s":
}
case "shared", "s" -> {
UUIDMapping addedMapping = PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(split[1]);
if (addedMapping == null) {
player.sendMessage(
@ -140,24 +133,15 @@ public class Purge extends SubCommand {
return false;
}
added = addedMapping.uuid();
break;
case "clear":
case "c":
case "delete":
case "d":
case "del":
clear = Boolean.parseBoolean(split[1]);
break;
case "unknown":
case "?":
case "u":
unknown = Boolean.parseBoolean(split[1]);
break;
default:
}
case "clear", "c", "delete", "d", "del" -> clear = Boolean.parseBoolean(split[1]);
case "unknown", "?", "u" -> unknown = Boolean.parseBoolean(split[1]);
default -> {
sendUsage(player);
return false;
}
}
}
final HashSet<Plot> toDelete = new HashSet<>();
for (Plot plot : PlotQuery.newQuery().whereBasePlot()) {
if (world != null && !plot.getWorldName().equalsIgnoreCase(world)) {
@ -236,10 +220,7 @@ public class Purge extends SubCommand {
try {
ids.add(plot.temp);
if (finalClear) {
plot.getPlotModificationManager().clear(
false,
true,
player,
plot.getPlotModificationManager().clear(false, true, player,
() -> LOGGER.info("Plot {} cleared by purge", plot.getId())
);
} else {

View File

@ -35,14 +35,22 @@ import java.util.Map;
* the component GUI
*/
@SerializableAs("preset")
public record ComponentPreset(ClassicPlotManagerComponent component, String pattern, double cost, String permission,
String displayName, List<String> description, ItemType icon) implements ConfigurationSerializable {
public record ComponentPreset(
ClassicPlotManagerComponent component,
String pattern,
double cost,
String permission,
String displayName,
List<String> description,
ItemType icon
) implements ConfigurationSerializable {
@SuppressWarnings("unchecked")
public static ComponentPreset deserialize(final @NonNull Map<String, Object> map) {
final ClassicPlotManagerComponent classicPlotManagerComponent = ClassicPlotManagerComponent
.fromString(map.getOrDefault("component", "").toString()).orElseThrow(() ->
new IllegalArgumentException("The preset needs a valid target component"));
new IllegalArgumentException("The preset in components.yml needs a valid target component, got: " + map.get(
"component")));
final String pattern = map.getOrDefault("pattern", "").toString();
final double cost = Double.parseDouble(map.getOrDefault("cost", "0.0").toString());
final String permission = map.getOrDefault("permission", "").toString();

View File

@ -233,7 +233,6 @@ public class Config {
*
* @param split the node (split by period)
* @param instance the instance
* @return
*/
private static Field getField(String[] split, Object instance) {
try {

View File

@ -146,6 +146,7 @@ public final class CaptionLoader {
* @param reader the reader to read the map from.
* @return the translation map.
*/
@SuppressWarnings("UnstableApiUsage")
static @NonNull Map<@NonNull String, @NonNull String> loadFromReader(final @NonNull Reader reader) {
final Type type = new TypeToken<Map<String, String>>() {
}.getType();

View File

@ -2499,7 +2499,7 @@ public class SQLManager implements AbstractDB {
id = null;
}
String msg = set.getString("comment");
long timestamp = set.getInt("timestamp") * 1000L;
long timestamp = set.getInt("timestamp") * 1000;
PlotComment comment =
new PlotComment(world, id, msg, sender, inbox, timestamp);
comments.add(comment);
@ -3414,7 +3414,10 @@ public class SQLManager implements AbstractDB {
}
}
private record LegacySettings(int id, PlotSettings settings) {
private record LegacySettings(
int id,
PlotSettings settings
) {
}

View File

@ -0,0 +1,64 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.core.events;
import com.sk89q.worldedit.entity.Entity;
import org.checkerframework.checker.nullness.qual.NonNull;
/**
* @since 6.11.1
*/
public abstract class EntityEvent {
private final Entity entity;
private String name;
/**
* @since 6.11.0
*/
public EntityEvent(Entity entity) {
this.entity = entity;
}
/**
* Obtain the entity involved in the event
*
* @return Entity
* @since 6.11.0
*/
public Entity getEntity() {
return this.entity;
}
/**
* Obtain the event's class name
*
* @return the event class name
* @since 6.11.0
*/
@NonNull
public String getEventName() {
if (this.name == null) {
this.name = this.getClass().getSimpleName();
}
return this.name;
}
}

View File

@ -105,38 +105,6 @@ public class PlayerAutoPlotEvent extends PlotEvent implements CancellablePlotEve
return this.plotArea;
}
/**
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#getSizeX()}
*/
@Deprecated(forRemoval = true, since = "6.1.0")
public int getSize_x() {
return getSizeX();
}
/**
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeX(int)}
*/
@Deprecated(forRemoval = true, since = "6.1.0")
public void setSize_x(int sizeX) {
setSizeX(sizeX);
}
/**
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#getSizeZ()}
*/
@Deprecated(forRemoval = true, since = "6.1.0")
public int getSize_z() {
return getSizeZ();
}
/**
* @deprecated for removal. Use {@link PlayerAutoPlotEvent#setSizeZ(int)}
*/
@Deprecated(forRemoval = true, since = "6.1.0")
public void setSize_z(int sizeZ) {
setSizeZ(sizeZ);
}
/**
* Get the x size of the auto-area
*

View File

@ -0,0 +1,50 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.core.events;
import com.sk89q.worldedit.entity.Entity;
/**
* @since 6.11.0
*/
public class RemoveRoadEntityEvent extends EntityEvent implements CancellablePlotEvent {
private Result eventResult;
/**
* RemoveRoadEntityEvent: Called when an entity on road is removed.
*
* @param entity The entity to remove
* @since 6.11.0
*/
public RemoveRoadEntityEvent(Entity entity) {
super(entity);
}
@Override
public Result getEventResult() {
return this.eventResult;
}
@Override
public void setEventResult(Result eventResult) {
this.eventResult = eventResult;
}
}

View File

@ -65,6 +65,21 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
super(worldName, id, generator, min, max, worldConfiguration, blockQueue);
}
private static BlockBucket createCheckedBlockBucket(String input, BlockBucket def) {
final BlockBucket bucket = new BlockBucket(input);
Pattern pattern = null;
try {
pattern = bucket.toPattern();
} catch (Exception ignore) {
}
if (pattern == null) {
LOGGER.error("Failed to parse pattern '{}', check your worlds.yml", input);
LOGGER.error("Falling back to {}", def);
return def;
}
return bucket;
}
/**
* CONFIG NODE | DEFAULT VALUE | DESCRIPTION | CONFIGURATION TYPE | REQUIRED FOR INITIAL SETUP.
*
@ -145,19 +160,4 @@ public abstract class ClassicPlotWorld extends SquarePlotWorld {
return Math.min(WALL_HEIGHT, plotRoadMin);
}
private static BlockBucket createCheckedBlockBucket(String input, BlockBucket def) {
final BlockBucket bucket = new BlockBucket(input);
Pattern pattern = null;
try {
pattern = bucket.toPattern();
} catch (Exception ignore) {
}
if (pattern == null) {
LOGGER.error("Failed to parse pattern '{}', check your worlds.yml", input);
LOGGER.error("Falling back to {}", def);
return def;
}
return bucket;
}
}

View File

@ -368,6 +368,7 @@ public class HybridGen extends IndependentPlotGenerator {
}
}
}
return;
}
@Override
@ -401,6 +402,12 @@ public class HybridGen extends IndependentPlotGenerator {
return biome == null ? hybridPlotWorld.getPlotBiome() : biome;
}
private enum SchematicFeature {
BIOMES,
ROAD,
POPULATING
}
/**
* Wrapper to allow a WorldEdit {@link Entity} to effectively have a mutable location as the location in its NBT should be changed
* when set to the world.
@ -455,10 +462,4 @@ public class HybridGen extends IndependentPlotGenerator {
}
private enum SchematicFeature {
BIOMES,
ROAD,
POPULATING
}
}

View File

@ -288,6 +288,13 @@ public class HybridPlotManager extends ClassicPlotManager {
queue.setCompleteTask(whenDone);
}
if (!canRegen) {
if (hybridPlotWorld.getMinBuildHeight() < hybridPlotWorld.getMinGenHeight()) {
queue.setCuboid(
pos1.withY(hybridPlotWorld.getMinBuildHeight()),
pos2.withY(hybridPlotWorld.getMinGenHeight()),
BlockTypes.AIR.getDefaultState()
);
}
queue.setCuboid(
pos1.withY(hybridPlotWorld.getMinGenHeight()),
pos2.withY(hybridPlotWorld.getMinGenHeight()),
@ -305,6 +312,13 @@ public class HybridPlotManager extends ClassicPlotManager {
pos2.withY(hybridPlotWorld.getMaxGenHeight()),
BlockTypes.AIR.getDefaultState()
);
if (hybridPlotWorld.getMaxGenHeight() < hybridPlotWorld.getMaxBuildHeight() - 1) {
queue.setCuboid(
pos1.withY(hybridPlotWorld.getMaxGenHeight()),
pos2.withY(hybridPlotWorld.getMaxBuildHeight() - 1),
BlockTypes.AIR.getDefaultState()
);
}
queue.setBiomeCuboid(pos1, pos2, biome);
} else {
queue.setRegenRegion(new CuboidRegion(pos1.getBlockVector3(), pos2.getBlockVector3()));

View File

@ -68,8 +68,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
private static final AffineTransform transform = new AffineTransform().rotateY(90);
public boolean ROAD_SCHEMATIC_ENABLED;
public boolean PLOT_SCHEMATIC = false;
@Deprecated(forRemoval = true, since = "6.9.0")
public int PLOT_SCHEMATIC_HEIGHT = -1;
public short PATH_WIDTH_LOWER;
public short PATH_WIDTH_UPPER;
public HashMap<Integer, BaseBlock[]> G_SCH;
@ -104,22 +102,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
PlotSquared.platform().injector().injectMembers(this);
}
@Deprecated(forRemoval = true, since = "6.9.0")
public static byte wrap(byte data, int start) {
if ((data >= start) && (data < (start + 4))) {
data = (byte) ((((data - start) + 2) & 3) + start);
}
return data;
}
@Deprecated(forRemoval = true, since = "6.9.0")
public static byte wrap2(byte data, int start) {
if ((data >= start) && (data < (start + 2))) {
data = (byte) ((((data - start) + 1) & 1) + start);
}
return data;
}
public static BaseBlock rotate(BaseBlock id) {
CompoundTag tag = id.getNbtData();
@ -344,8 +326,18 @@ public class HybridPlotWorld extends ClassicPlotWorld {
if (w3 > PLOT_WIDTH || h3 > PLOT_WIDTH) {
this.ROAD_SCHEMATIC_ENABLED = true;
}
int centerShiftZ = (this.PLOT_WIDTH - l3) / 2;
int centerShiftX = (this.PLOT_WIDTH - w3) / 2;
int centerShiftZ;
if (l3 < this.PLOT_WIDTH) {
centerShiftZ = (this.PLOT_WIDTH - l3) / 2;
} else {
centerShiftZ = (PLOT_WIDTH - l3) / 2;
}
int centerShiftX;
if (w3 < this.PLOT_WIDTH) {
centerShiftX = (this.PLOT_WIDTH - w3) / 2;
} else {
centerShiftX = (PLOT_WIDTH - w3) / 2;
}
BlockVector3 min = blockArrayClipboard3.getMinimumPoint();
for (short x = 0; x < w3; x++) {
@ -476,11 +468,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
}
}
/**
* @deprecated This method should not be available for public API usage and will be made private.
*/
@Deprecated(forRemoval = true, since = "6.10.2")
public void addOverlayBlock(short x, short y, short z, BaseBlock id, boolean rotate, int height) {
private void addOverlayBlock(short x, short y, short z, BaseBlock id, boolean rotate, int height) {
if (z < 0) {
z += this.SIZE;
} else if (z >= this.SIZE) {
@ -511,11 +499,7 @@ public class HybridPlotWorld extends ClassicPlotWorld {
existing[y] = id;
}
/**
* @deprecated This method should not be available for public API usage and will be made private.
*/
@Deprecated(forRemoval = true, since = "6.10.2")
public void addOverlayBiome(short x, short z, BiomeType id) {
private void addOverlayBiome(short x, short z, BiomeType id) {
if (z < 0) {
z += this.SIZE;
} else if (z >= this.SIZE) {
@ -560,14 +544,6 @@ public class HybridPlotWorld extends ClassicPlotWorld {
return schem1PopulationNeeded || schem2PopulationNeeded || schem3PopulationNeeded;
}
/**
* @deprecated in favour of {@link HybridPlotWorld#getSchematicRoot()}
*/
@Deprecated(forRemoval = true, since = "6.9.0")
public File getRoot() {
return this.root;
}
/**
* Get the root folder for this world's generation schematics. May be null if schematics not initialised via
* {@link HybridPlotWorld#setupSchematics()}

View File

@ -37,6 +37,7 @@ import com.plotsquared.core.plot.world.PlotAreaManager;
import com.plotsquared.core.queue.BlockArrayCacheScopedQueueCoordinator;
import com.plotsquared.core.queue.GlobalBlockQueue;
import com.plotsquared.core.queue.QueueCoordinator;
import com.plotsquared.core.util.ChunkManager;
import com.plotsquared.core.util.EventDispatcher;
import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.RegionManager;
@ -86,6 +87,7 @@ public class HybridUtils {
public static boolean UPDATE = false;
private final PlotAreaManager plotAreaManager;
private final ChunkManager chunkManager;
private final GlobalBlockQueue blockQueue;
private final WorldUtil worldUtil;
private final SchematicHandler schematicHandler;
@ -94,12 +96,14 @@ public class HybridUtils {
@Inject
public HybridUtils(
final @NonNull PlotAreaManager plotAreaManager,
final @NonNull ChunkManager chunkManager,
final @NonNull GlobalBlockQueue blockQueue,
final @NonNull WorldUtil worldUtil,
final @NonNull SchematicHandler schematicHandler,
final @NonNull EventDispatcher eventDispatcher
) {
this.plotAreaManager = plotAreaManager;
this.chunkManager = chunkManager;
this.blockQueue = blockQueue;
this.worldUtil = worldUtil;
this.schematicHandler = schematicHandler;
@ -624,7 +628,7 @@ public class HybridUtils {
queue = queueCoordinator;
enqueue = false;
}
if (id2 == null || id1 != id2) {
if (id1 == null || id2 == null || id1 != id2) {
if (id1 != null) {
Plot p1 = area.getPlotAbs(id1);
if (p1 != null && p1.hasOwner() && p1.isMerged()) {

View File

@ -185,31 +185,39 @@ public abstract class SquarePlotManager extends GridPlotManager {
return null;
}
switch (hash) {
case 8:
case 8 -> {
// north
return plot.isMerged(Direction.NORTH) ? id : null;
case 4:
}
case 4 -> {
// east
return plot.isMerged(Direction.EAST) ? id : null;
case 2:
}
case 2 -> {
// south
return plot.isMerged(Direction.SOUTH) ? id : null;
case 1:
}
case 1 -> {
// west
return plot.isMerged(Direction.WEST) ? id : null;
case 12:
}
case 12 -> {
// northeast
return plot.isMerged(Direction.NORTHEAST) ? id : null;
case 6:
}
case 6 -> {
// southeast
return plot.isMerged(Direction.SOUTHEAST) ? id : null;
case 3:
}
case 3 -> {
// southwest
return plot.isMerged(Direction.SOUTHWEST) ? id : null;
case 9:
}
case 9 -> {
// northwest
return plot.isMerged(Direction.NORTHWEST) ? id : null;
}
}
} catch (Exception ignored) {
LOGGER.error("Invalid plot / road width in settings.yml for world: {}", squarePlotWorld.getWorldName());
}

View File

@ -64,6 +64,7 @@ import com.sk89q.worldedit.world.item.ItemType;
import com.sk89q.worldedit.world.item.ItemTypes;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.ComponentLike;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull;
@ -79,6 +80,8 @@ import java.util.UUID;
public class PlotListener {
private static final MiniMessage MINI_MESSAGE = MiniMessage.miniMessage();
private final HashMap<UUID, Interval> feedRunnable = new HashMap<>();
private final HashMap<UUID, Interval> healRunnable = new HashMap<>();
private final Map<UUID, List<StatusEffect>> playerEffects = new HashMap<>();
@ -517,6 +520,11 @@ public class PlotListener {
private record StatusEffect(@NonNull String name, long expiresAt) {
private StatusEffect(@NonNull String name, long expiresAt) {
this.name = name;
this.expiresAt = expiresAt;
}
}
}

View File

@ -21,7 +21,11 @@ package com.plotsquared.core.location;
import com.plotsquared.core.util.MathMan;
import com.plotsquared.core.util.StringMan;
public record ChunkWrapper(String world, int x, int z) {
public record ChunkWrapper(
String world,
int x,
int z
) {
@Override
public int hashCode() {

View File

@ -215,7 +215,11 @@ public final class BlockBucket implements ConfigurationSerializable {
return result;
}
private record Range(int min, int max, boolean automatic) {
private record Range(
int min,
int max,
boolean automatic
) {
public int getWeight() {
return max - min;
@ -225,31 +229,6 @@ public final class BlockBucket implements ConfigurationSerializable {
return num <= max && num >= min;
}
public boolean equals(final Object o) {
if (o == this) {
return true;
}
if (!(o instanceof final Range other)) {
return false;
}
if (this.min() != other.min()) {
return false;
}
if (this.max() != other.max()) {
return false;
}
return this.automatic() == other.automatic();
}
public int hashCode() {
final int PRIME = 59;
int result = 1;
result = result * PRIME + this.min();
result = result * PRIME + this.max();
result = result * PRIME + (this.automatic() ? 79 : 97);
return result;
}
}
}

View File

@ -382,6 +382,9 @@ public abstract class PlotArea implements ComponentLike {
this.defaultHome = new BlockLoc(Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE);
} else {
try {
/*String[] split = homeDefault.split(",");
this.DEFAULT_HOME =
new PlotLoc(Integer.parseInt(split[0]), Integer.parseInt(split[1]));*/
this.defaultHome = BlockLoc.fromString(homeDefault);
} catch (NumberFormatException ignored) {
this.defaultHome = null;

View File

@ -106,17 +106,6 @@ public final class PlotId {
return PlotId.of(hash >> 16, hash & 0xFFFF);
}
/**
* Get a copy of the plot ID
*
* @return Plot ID copy
* @deprecated PlotId is immutable, copy is not required.
*/
@Deprecated(forRemoval = true, since = "6.10.2")
public @NonNull PlotId copy() {
return this;
}
/**
* Get the ID X component
*

View File

@ -222,17 +222,6 @@ public final class PlotModificationManager {
if (isDelete) {
this.removeSign();
}
PlotUnlinkEvent event = PlotSquared.get().getEventDispatcher()
.callUnlink(
this.plot.getArea(),
this.plot,
true,
!isDelete,
isDelete ? PlotUnlinkEvent.REASON.DELETE : PlotUnlinkEvent.REASON.CLEAR
);
if (event.getEventResult() != Result.DENY && this.unlinkPlot(event.isCreateRoad(), event.isCreateSign())) {
PlotSquared.get().getEventDispatcher().callPostUnlink(plot, event.getReason());
}
final PlotManager manager = this.plot.getArea().getPlotManager();
Runnable run = new Runnable() {
@Override
@ -283,7 +272,21 @@ public final class PlotModificationManager {
manager.clearPlot(current, this, actor, null);
}
};
PlotUnlinkEvent event = PlotSquared.get().getEventDispatcher()
.callUnlink(
this.plot.getArea(),
this.plot,
true,
!isDelete,
isDelete ? PlotUnlinkEvent.REASON.DELETE : PlotUnlinkEvent.REASON.CLEAR
);
if (event.getEventResult() != Result.DENY) {
if (this.unlinkPlot(event.isCreateRoad(), event.isCreateSign(), run)) {
PlotSquared.get().getEventDispatcher().callPostUnlink(plot, event.getReason());
}
} else {
run.run();
}
return true;
}
@ -323,7 +326,23 @@ public final class PlotModificationManager {
* @return success/!cancelled
*/
public boolean unlinkPlot(final boolean createRoad, final boolean createSign) {
return unlinkPlot(createRoad, createSign, null);
}
/**
* Unlink the plot and all connected plots.
*
* @param createRoad whether to recreate road
* @param createSign whether to recreate signs
* @param whenDone Task to run when unlink is complete
* @return success/!cancelled
* @since 6.10.9
*/
public boolean unlinkPlot(final boolean createRoad, final boolean createSign, final Runnable whenDone) {
if (!this.plot.isMerged()) {
if (whenDone != null) {
whenDone.run();
}
return false;
}
final Set<Plot> plots = this.plot.getConnectedPlots();
@ -368,14 +387,17 @@ public final class PlotModificationManager {
current.getPlotModificationManager().setSign(PlayerManager.resolveName(current.getOwnerAbs()).getComponent(
LocaleHolder.console()));
}
if (whenDone != null) {
TaskManager.runTask(whenDone);
}
}));
} else if (whenDone != null) {
queue.setCompleteTask(whenDone);
}
if (createRoad) {
manager.finishPlotUnlink(ids, queue);
}
if (queue != null) {
queue.enqueue();
}
return true;
}

View File

@ -20,6 +20,13 @@ package com.plotsquared.core.plot.comment;
import com.plotsquared.core.plot.PlotId;
public record PlotComment(String world, PlotId id, String comment, String senderName, String inbox, long timestamp) {
public record PlotComment(
String world,
PlotId id,
String comment,
String senderName,
String inbox,
long timestamp
) {
}

View File

@ -19,7 +19,6 @@
package com.plotsquared.core.plot.expiration;
import com.google.inject.Inject;
import com.plotsquared.core.PlotPlatform;
import com.plotsquared.core.PlotSquared;
import com.plotsquared.core.configuration.caption.Caption;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
@ -63,11 +62,6 @@ import java.util.concurrent.ConcurrentLinkedDeque;
public class ExpireManager {
/**
* @deprecated Use {@link PlotPlatform#expireManager()} instead
*/
@Deprecated(forRemoval = true, since = "6.10.2")
public static ExpireManager IMP;
private final ConcurrentHashMap<UUID, Long> dates_cache;
private final ConcurrentHashMap<UUID, Long> account_age_cache;
private final EventDispatcher eventDispatcher;

View File

@ -19,6 +19,7 @@
package com.plotsquared.core.plot.flag.implementations;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.plot.flag.FlagParseException;
import com.plotsquared.core.plot.flag.InternalFlag;
import com.plotsquared.core.plot.flag.types.ListFlag;
import org.checkerframework.checker.nullness.qual.NonNull;
@ -33,7 +34,7 @@ public class AnalysisFlag extends ListFlag<Integer, AnalysisFlag> implements Int
}
@Override
public AnalysisFlag parse(@NonNull String input) {
public AnalysisFlag parse(@NonNull String input) throws FlagParseException {
final String[] split = input.split(",");
final List<Integer> numbers = new ArrayList<>();
for (final String element : split) {

View File

@ -19,6 +19,7 @@
package com.plotsquared.core.plot.flag.implementations;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.plot.flag.FlagParseException;
import com.plotsquared.core.plot.flag.types.ListFlag;
import org.checkerframework.checker.nullness.qual.NonNull;
@ -38,7 +39,7 @@ public class BlockedCmdsFlag extends ListFlag<String, BlockedCmdsFlag> {
}
@Override
public BlockedCmdsFlag parse(@NonNull String input) {
public BlockedCmdsFlag parse(@NonNull String input) throws FlagParseException {
return flagOf(Arrays.asList(input.split(",")));
}

View File

@ -57,25 +57,16 @@ public class DenyTeleportFlag extends PlotFlag<DenyTeleportFlag.DeniedGroup, Den
}
final boolean result;
switch (value) {
case TRUSTED:
result = !plot.getTrusted().contains(player.getUUID());
break;
case MEMBERS:
result = !plot.getMembers().contains(player.getUUID());
break;
case NONMEMBERS:
result = plot.isAdded(player.getUUID());
break;
case NONTRUSTED:
result =
case TRUSTED -> result = !plot.getTrusted().contains(player.getUUID());
case MEMBERS -> result = !plot.getMembers().contains(player.getUUID());
case NONMEMBERS -> result = plot.isAdded(player.getUUID());
case NONTRUSTED -> result =
plot.getTrusted().contains(player.getUUID()) || plot.isOwner(player.getUUID());
break;
case NONOWNERS:
result = plot.isOwner(player.getUUID());
break;
default:
case NONOWNERS -> result = plot.isOwner(player.getUUID());
default -> {
return true;
}
}
return result || player.hasPermission("plots.admin.entry.denied");
}

View File

@ -19,6 +19,7 @@
package com.plotsquared.core.plot.flag.implementations;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.plot.flag.FlagParseException;
import com.plotsquared.core.plot.flag.PlotFlag;
import com.sk89q.worldedit.world.gamemode.GameMode;
import com.sk89q.worldedit.world.gamemode.GameModes;
@ -56,7 +57,7 @@ public class GamemodeFlag extends PlotFlag<GameMode, GamemodeFlag> {
}
@Override
public GamemodeFlag parse(@NonNull String input) {
public GamemodeFlag parse(@NonNull String input) throws FlagParseException {
return switch (input) {
case "creative", "c", "1" -> flagOf(GameModes.CREATIVE);
case "adventure", "a", "2" -> flagOf(GameModes.ADVENTURE);

View File

@ -19,6 +19,7 @@
package com.plotsquared.core.plot.flag.implementations;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.plot.flag.FlagParseException;
import com.plotsquared.core.plot.flag.PlotFlag;
import com.sk89q.worldedit.world.gamemode.GameMode;
import com.sk89q.worldedit.world.gamemode.GameModes;
@ -51,7 +52,7 @@ public class GuestGamemodeFlag extends PlotFlag<GameMode, GuestGamemodeFlag> {
}
@Override
public GuestGamemodeFlag parse(@NonNull String input) {
public GuestGamemodeFlag parse(@NonNull String input) throws FlagParseException {
return switch (input) {
case "creative", "c", "1" -> flagOf(GameModes.CREATIVE);
case "adventure", "a", "2" -> flagOf(GameModes.ADVENTURE);

View File

@ -30,6 +30,7 @@ import org.checkerframework.checker.nullness.qual.NonNull;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
public abstract class BlockTypeListFlag<F extends ListFlag<BlockTypeWrapper, F>>
extends ListFlag<BlockTypeWrapper, F> {
@ -72,9 +73,11 @@ public abstract class BlockTypeListFlag<F extends ListFlag<BlockTypeWrapper, F>>
public Collection<String> getTabCompletions() {
final Collection<String> tabCompletions = new ArrayList<>();
tabCompletions.addAll(
BlockType.REGISTRY.keySet().stream().map(val -> val.replace("minecraft:", "")).toList());
BlockType.REGISTRY.keySet().stream().map(val -> val.replace("minecraft:", ""))
.collect(Collectors.toList()));
tabCompletions.addAll(
BlockCategory.REGISTRY.keySet().stream().map(val -> "#" + val.replace("minecraft:", "")).toList());
BlockCategory.REGISTRY.keySet().stream().map(val -> "#" + val.replace("minecraft:", ""))
.collect(Collectors.toList()));
return tabCompletions;
}

View File

@ -76,7 +76,10 @@ public abstract class TimedFlag<T, F extends PlotFlag<TimedFlag.Timed<T>, F>>
return getValue().toString();
}
public record Timed<T>(int interval, T value) {
public record Timed<T>(
int interval,
T value
) {
@Override
public String toString() {

View File

@ -194,6 +194,17 @@ public class SinglePlotArea extends GridPlotWorld {
} catch (final Exception e) {
e.printStackTrace();
}
// String worldName = plot.getWorldName();
// World world = Bukkit.getWorld(worldName);
// if (world != null) {
// return world;
// }
// WorldCreator wc = new WorldCreator(worldName);
// wc.generator("PlotSquared:single");
// wc.environment(World.Environment.NORMAL);
// wc.type(WorldType.FLAT);
// return AsyncWorld.create(wc);
}

View File

@ -43,11 +43,10 @@ import java.util.function.Consumer;
public abstract class QueueCoordinator {
private final AtomicBoolean enqueued = new AtomicBoolean();
private boolean forceSync = false;
@Nullable
private Object chunkObject;
private final AtomicBoolean enqueued = new AtomicBoolean();
@SuppressWarnings({"unused", "FieldCanBeLocal"})
@Inject
private GlobalBlockQueue blockQueue;
@ -203,7 +202,7 @@ public abstract class QueueCoordinator {
* @return success or not
* @deprecated Biomes now take XYZ, see {@link #setBiome(int, int, int, BiomeType)}
* <br>
* Scheduled for removal once we drop the support for versions not supporting 3D biomes.
* Scheduled for removal once we drop the support for versions not supporting 3D biomes, 1.18 and earlier.
*/
@Deprecated(forRemoval = true, since = "6.0.0")
public abstract boolean setBiome(int x, int z, @NonNull BiomeType biome);

View File

@ -41,6 +41,9 @@ public class ZeroedDelegateScopedQueueCoordinator extends DelegateQueueCoordinat
private final int minX;
private final int minZ;
private final int maxX;
private final int maxZ;
private final int dx;
private final int dz;
@ -56,8 +59,11 @@ public class ZeroedDelegateScopedQueueCoordinator extends DelegateQueueCoordinat
this.minX = min.getX();
this.minZ = min.getZ();
this.dx = max.getX() - minX;
this.dz = max.getZ() - minZ;
this.maxX = max.getX();
this.maxZ = max.getZ();
this.dx = maxX - minX;
this.dz = maxZ - minZ;
}
@Override

View File

@ -93,7 +93,7 @@ public class DefaultProgressSubscriber implements ProgressSubscriber {
this.actor = actor;
this.interval = TaskTime.ms(interval);
this.wait = TaskTime.ms(wait);
this.caption = Objects.requireNonNullElse(caption, TranslatableCaption.of("working.progress"));
this.caption = Objects.requireNonNullElseGet(caption, () -> TranslatableCaption.of("working.progress"));
}
@Override

View File

@ -0,0 +1,94 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.core.services.plots;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotId;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
* Crate a new auto query
*
* @param player Player to claim for
* @param startId Plot ID to start searching from
* @param sizeX Number of plots along the X axis
* @param sizeZ Number of plots along the Z axis
* @param plotArea Plot area to search in
*/
public record AutoQuery(
@NonNull PlotPlayer<?> player,
@Nullable PlotId startId,
int sizeX,
int sizeZ,
@NonNull PlotArea plotArea
) {
/**
* Get the player that the plots are meant for
*
* @return Player
*/
@Override
public @NonNull PlotPlayer<?> player() {
return this.player;
}
/**
* Get the plot ID to start searching from
*
* @return Start ID
*/
@Override
public @Nullable PlotId startId() {
return this.startId;
}
/**
* Get the number of plots along the X axis
*
* @return Number of plots along the X axis
*/
@Override
public int sizeX() {
return this.sizeX;
}
/**
* Get the number of plots along the Z axis
*
* @return Number of plots along the Z axis
*/
@Override
public int sizeZ() {
return this.sizeZ;
}
/**
* Get the plot area to search in
*
* @return Plot area
*/
@Override
public @NonNull PlotArea plotArea() {
return this.plotArea;
}
}

View File

@ -21,9 +21,7 @@ package com.plotsquared.core.services.plots;
import cloud.commandframework.services.types.Service;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.plotsquared.core.player.PlotPlayer;
import com.plotsquared.core.plot.Plot;
import com.plotsquared.core.plot.PlotArea;
import com.plotsquared.core.plot.PlotAreaType;
import com.plotsquared.core.plot.PlotId;
import org.checkerframework.checker.nullness.qual.NonNull;
@ -34,87 +32,12 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Predicate;
public interface AutoService extends Service<AutoService.AutoQuery, List<Plot>> {
public interface AutoService extends Service<AutoQuery, List<Plot>> {
Cache<PlotId, Plot> plotCandidateCache = CacheBuilder.newBuilder()
.expireAfterWrite(20, TimeUnit.SECONDS).build();
Object plotLock = new Object();
record AutoQuery(PlotPlayer<?> player, PlotId startId, int sizeX, int sizeZ, PlotArea plotArea) {
/**
* Crate a new auto query
*
* @param player Player to claim for
* @param startId Plot ID to start searching from
* @param sizeX Number of plots along the X axis
* @param sizeZ Number of plots along the Z axis
* @param plotArea Plot area to search in
*/
public AutoQuery(
final @NonNull PlotPlayer<?> player, final @Nullable PlotId startId,
final int sizeX, final int sizeZ, final @NonNull PlotArea plotArea
) {
this.player = player;
this.startId = startId;
this.sizeX = sizeX;
this.sizeZ = sizeZ;
this.plotArea = plotArea;
}
/**
* Get the player that the plots are meant for
*
* @return Player
*/
@Override
public @NonNull PlotPlayer<?> player() {
return this.player;
}
/**
* Get the plot ID to start searching from
*
* @return Start ID
*/
@Override
public @Nullable PlotId startId() {
return this.startId;
}
/**
* Get the number of plots along the X axis
*
* @return Number of plots along the X axis
*/
@Override
public int sizeX() {
return this.sizeX;
}
/**
* Get the number of plots along the Z axis
*
* @return Number of plots along the Z axis
*/
@Override
public int sizeZ() {
return this.sizeZ;
}
/**
* Get the plot area to search in
*
* @return Plot area
*/
@Override
public @NonNull PlotArea plotArea() {
return this.plotArea;
}
}
final class DefaultAutoService implements AutoService {
@Override
@ -124,7 +47,6 @@ public interface AutoService extends Service<AutoService.AutoQuery, List<Plot>>
}
final class SinglePlotService implements AutoService, Predicate<AutoQuery> {
@Nullable
@ -150,12 +72,11 @@ public interface AutoService extends Service<AutoService.AutoQuery, List<Plot>>
@Override
public boolean test(final @NonNull AutoQuery autoQuery) {
return autoQuery.sizeX == 1 && autoQuery.sizeZ == 1;
return autoQuery.sizeX() == 1 && autoQuery.sizeZ() == 1;
}
}
final class MultiPlotService implements AutoService, Predicate<AutoQuery> {
@Override

View File

@ -72,7 +72,7 @@ public enum CommonSetupSteps implements SetupStep {
@Override
public SetupStep handleInput(PlotPlayer<?> plotPlayer, PlotAreaBuilder builder, String arg) {
Optional<PlotAreaType> plotAreaType = PlotAreaType.fromString(arg);
if (plotAreaType.isEmpty()) {
if (!plotAreaType.isPresent()) {
plotPlayer.sendMessage(TranslatableCaption.of("setup.setup_world_type_error"));
return this;
}
@ -180,7 +180,8 @@ public enum CommonSetupSteps implements SetupStep {
@Override
public SetupStep handleInput(PlotPlayer<?> plotPlayer, PlotAreaBuilder builder, String argument) {
Optional<PlotAreaTerrainType> optTerrain;
if ((optTerrain = PlotAreaTerrainType.fromString(argument)).isEmpty()) {
if (!(optTerrain = PlotAreaTerrainType.fromString(argument))
.isPresent()) {
plotPlayer.sendMessage(TranslatableCaption.of("setup.setup_partial_area_error"));
return this;
}

View File

@ -23,7 +23,10 @@ import com.plotsquared.core.configuration.ConfigurationNode;
/**
* This class wraps an array of {@link ConfigurationNode}s.
*/
public record SettingsNodesWrapper(ConfigurationNode[] settingsNodes, SetupStep afterwards) {
public record SettingsNodesWrapper(
ConfigurationNode[] settingsNodes,
SetupStep afterwards
) {
/**
* Returns the first step of this wrapper or the step or the

View File

@ -42,15 +42,27 @@ public class EntityUtil {
}
private static int capNumeral(final @NonNull String flagName) {
int i = switch (flagName) {
case "mob-cap" -> CAP_MOB;
case "hostile-cap" -> CAP_MONSTER;
case "animal-cap" -> CAP_ANIMAL;
case "vehicle-cap" -> CAP_VEHICLE;
case "misc-cap" -> CAP_MISC;
// "entity-cap"
default -> CAP_ENTITY;
};
int i;
switch (flagName) {
case "mob-cap":
i = CAP_MOB;
break;
case "hostile-cap":
i = CAP_MONSTER;
break;
case "animal-cap":
i = CAP_ANIMAL;
break;
case "vehicle-cap":
i = CAP_VEHICLE;
break;
case "misc-cap":
i = CAP_MISC;
break;
case "entity-cap":
default:
i = CAP_ENTITY;
}
return i;
}

View File

@ -45,6 +45,7 @@ import com.plotsquared.core.events.PlotFlagRemoveEvent;
import com.plotsquared.core.events.PlotMergeEvent;
import com.plotsquared.core.events.PlotRateEvent;
import com.plotsquared.core.events.PlotUnlinkEvent;
import com.plotsquared.core.events.RemoveRoadEntityEvent;
import com.plotsquared.core.events.TeleportCause;
import com.plotsquared.core.events.post.PostPlayerAutoPlotEvent;
import com.plotsquared.core.events.post.PostPlotChangeOwnerEvent;
@ -71,6 +72,7 @@ import com.plotsquared.core.plot.flag.types.BlockTypeWrapper;
import com.plotsquared.core.plot.world.SinglePlotArea;
import com.plotsquared.core.util.task.TaskManager;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.entity.Entity;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.world.block.BlockType;
import com.sk89q.worldedit.world.block.BlockTypes;
@ -298,6 +300,12 @@ public class EventDispatcher {
return event;
}
public RemoveRoadEntityEvent callRemoveRoadEntity(Entity entity) {
RemoveRoadEntityEvent event = new RemoveRoadEntityEvent(entity);
eventBus.post(event);
return event;
}
public void doJoinTask(final PlotPlayer<?> player) {
if (player == null) {
return; //possible future warning message to figure out where we are retrieving null
@ -351,11 +359,13 @@ public class EventDispatcher {
}
}
switch (type) {
case TELEPORT_OBJECT:
case TELEPORT_OBJECT -> {
return false;
case READ:
}
case READ -> {
return true;
case INTERACT_BLOCK: {
}
case INTERACT_BLOCK -> {
if (plot == null) {
final List<BlockTypeWrapper> use = area.getRoadFlag(UseFlag.class);
for (final BlockTypeWrapper blockTypeWrapper : use) {
@ -390,7 +400,7 @@ public class EventDispatcher {
}
return false;
}
case TRIGGER_PHYSICAL: {
case TRIGGER_PHYSICAL -> {
if (plot == null) {
final List<BlockTypeWrapper> use = area.getRoadFlag(UseFlag.class);
for (final BlockTypeWrapper blockTypeWrapper : use) {
@ -422,7 +432,7 @@ public class EventDispatcher {
false
);
}
case SPAWN_MOB: {
case SPAWN_MOB -> {
if (plot == null) {
return player.hasPermission(
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
@ -464,7 +474,7 @@ public class EventDispatcher {
}
return false;
}
case PLACE_MISC: {
case PLACE_MISC -> {
if (plot == null) {
return player.hasPermission(
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
@ -506,7 +516,7 @@ public class EventDispatcher {
}
return false;
}
case PLACE_VEHICLE:
case PLACE_VEHICLE -> {
if (plot == null) {
return player.hasPermission(
Permission.PERMISSION_ADMIN_INTERACT_ROAD.toString(), notifyPerms
@ -518,8 +528,9 @@ public class EventDispatcher {
);
}
return plot.getFlag(VehiclePlaceFlag.class);
default:
break;
}
default -> {
}
}
return true;
}

View File

@ -18,6 +18,9 @@
*/
package com.plotsquared.core.util;
public record FileBytes(String path, byte[] data) {
public record FileBytes(
String path,
byte[] data
) {
}

View File

@ -56,7 +56,7 @@ public final class ItemUtil {
return ItemTypes.get(input);
}
public static ItemType[] parse(String commaDelimited) {
public static final ItemType[] parse(String commaDelimited) {
String[] split = commaDelimited.split(",(?![^\\(\\[]*[\\]\\)])");
ItemType[] result = new ItemType[split.length];
for (int i = 0; i < split.length; i++) {

View File

@ -20,14 +20,49 @@ package com.plotsquared.core.util;
public class MathMan {
public static int gcd(int a, int b) {
private static final int ATAN2_BITS = 7;
private static final int ATAN2_BITS2 = ATAN2_BITS << 1;
private static final int ATAN2_MASK = ~(-1 << ATAN2_BITS2);
private static final int ATAN2_COUNT = ATAN2_MASK + 1;
private static final int ATAN2_DIM = (int) Math.sqrt(ATAN2_COUNT);
private static final float INV_ATAN2_DIM_MINUS_1 = 1.0f / (ATAN2_DIM - 1);
private static final float[] atan2 = new float[ATAN2_COUNT];
private static final int[] table =
{0, 16, 22, 27, 32, 35, 39, 42, 45, 48, 50, 53, 55, 57, 59, 61, 64, 65, 67, 69, 71, 73, 75,
76, 78, 80, 81, 83, 84, 86, 87, 89, 90, 91, 93, 94, 96, 97, 98, 99, 101, 102, 103, 104,
106, 107, 108, 109, 110, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123,
124, 125, 126, 128, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140,
141, 142, 143, 144, 144, 145, 146, 147, 148, 149, 150, 150, 151, 152, 153, 154, 155,
155, 156, 157, 158, 159, 160, 160, 161, 162, 163, 163, 164, 165, 166, 167, 167, 168,
169, 170, 170, 171, 172, 173, 173, 174, 175, 176, 176, 177, 178, 178, 179, 180, 181,
181, 182, 183, 183, 184, 185, 185, 186, 187, 187, 188, 189, 189, 190, 191, 192, 192,
193, 193, 194, 195, 195, 196, 197, 197, 198, 199, 199, 200, 201, 201, 202, 203, 203,
204, 204, 205, 206, 206, 207, 208, 208, 209, 209, 210, 211, 211, 212, 212, 213, 214,
214, 215, 215, 216, 217, 217, 218, 218, 219, 219, 220, 221, 221, 222, 222, 223, 224,
224, 225, 225, 226, 226, 227, 227, 228, 229, 229, 230, 230, 231, 231, 232, 232, 233,
234, 234, 235, 235, 236, 236, 237, 237, 238, 238, 239, 240, 240, 241, 241, 242, 242,
243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 248, 248, 249, 249, 250, 250, 251,
251, 252, 252, 253, 253, 254, 254, 255};
static {
for (int i = 0; i < ATAN2_DIM; i++) {
for (int j = 0; j < ATAN2_DIM; j++) {
float x0 = (float) i / ATAN2_DIM;
float y0 = (float) j / ATAN2_DIM;
atan2[(j * ATAN2_DIM) + i] = (float) Math.atan2(y0, x0);
}
}
}
public static final int gcd(int a, int b) {
if (b == 0) {
return a;
}
return gcd(b, a % b);
}
public static int gcd(int[] a) {
public static final int gcd(int[] a) {
int result = a[0];
for (int i = 1; i < a.length; i++) {
result = gcd(result, a[i]);
@ -47,7 +82,7 @@ public class MathMan {
return (x << 16) | (y & 0xFFFF);
}
public static int average(int a, int b) {
public static final int average(int a, int b) {
return (a & b) + (a ^ b) / 2;
}

View File

@ -1,150 +0,0 @@
/*
* PlotSquared, a land and world management plugin for Minecraft.
* Copyright (C) IntellectualSites <https://intellectualsites.com>
* Copyright (C) IntellectualSites team and contributors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package com.plotsquared.core.util;
import com.plotsquared.core.configuration.Settings;
import com.plotsquared.core.configuration.caption.TranslatableCaption;
import com.plotsquared.core.permissions.Permission;
import com.plotsquared.core.permissions.PermissionHolder;
import com.plotsquared.core.player.PlotPlayer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.tag.Tag;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.checkerframework.checker.nullness.qual.NonNull;
/**
* The Permissions class handles checking user permissions.<br>
* - This will respect * nodes and plots.admin and can be used to check permission ranges (e.g. plots.plot.5)<br>
* - Checking the PlotPlayer class directly will not take the above into account<br>
*
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes
*/
@Deprecated(forRemoval = true, since = "6.9.3")
public class Permissions {
/**
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes. Use {@link PlotPlayer#hasPermission(String, boolean)}
*/
@Deprecated(forRemoval = true, since = "6.9.3")
public static boolean hasPermission(PlotPlayer<?> player, Permission permission, boolean notify) {
return hasPermission(player, permission.toString(), notify);
}
/**
* Check if the owner of the profile has a given (global) permission
*
* @param caller permission holder
* @param permission Permission
* @return {@code true} if the owner has the given permission, else {@code false}
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes. Use {@link PermissionHolder#hasPermission(Permission)}
*/
@Deprecated(forRemoval = true, since = "6.9.3")
public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull Permission permission) {
return caller.hasPermission(permission.toString());
}
/**
* Check if the owner of the profile has a given (global) permission. There is no guarantee that per-world permissions will
* be checked because unmaintained crap plugins like PEX exist.
*
* @param caller permission holder
* @param permission Permission
* @return {@code true} if the owner has the given permission, else {@code false}
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes. Use {@link PermissionHolder#hasPermission(String)}
*/
@Deprecated(forRemoval = true, since = "6.9.3")
public static boolean hasPermission(final @NonNull PermissionHolder caller, final @NonNull String permission) {
return caller.hasPermission(permission);
}
/**
* Check if the owner of the profile has a given (global) keyed permission. Checks both {@code permission.key}
* and {@code permission.*}
*
* @param caller permission holder
* @param permission Permission
* @param key Permission "key"
* @return {@code true} if the owner has the given permission, else {@code false}
* @since 6.0.10
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes. Use {@link PermissionHolder#hasKeyedPermission(String, String)}
*/
@Deprecated(forRemoval = true, since = "6.9.3")
public static boolean hasKeyedPermission(
final @NonNull PermissionHolder caller, final @NonNull String permission,
final @NonNull String key
) {
return caller.hasKeyedPermission(permission, key);
}
/**
* Checks if a PlotPlayer has a permission, and optionally send the no permission message if applicable.
*
* @param player permission holder
* @param permission permission
* @param notify if to notify the permission holder
* @return if permission is had
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes. Use {@link PlotPlayer#hasPermission(String, boolean)}
*/
@Deprecated(forRemoval = true, since = "6.9.3")
public static boolean hasPermission(PlotPlayer<?> player, String permission, boolean notify) {
if (!hasPermission(player, permission)) {
if (notify) {
player.sendMessage(
TranslatableCaption.of("permission.no_permission_event"),
TagResolver.resolver("node", Tag.inserting(Component.text(permission)))
);
}
return false;
}
return true;
}
/**
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes. Use {@link PlotPlayer#hasPermissionRange(Permission, int)}
*/
@Deprecated(forRemoval = true, since = "6.9.3")
public static int hasPermissionRange(PlotPlayer<?> player, Permission Permission, int range) {
return hasPermissionRange(player, Permission.toString(), range);
}
/**
* Check the highest permission a PlotPlayer has within a specified range.<br>
* - Excessively high values will lag<br>
* - The default range that is checked is {@link Settings.Limit#MAX_PLOTS}<br>
*
* @param player Player to check for
* @param stub The permission stub to check e.g. for `plots.plot.#` the stub is `plots.plot`
* @param range The range to check
* @return The highest permission they have within that range
* @deprecated all logic that may once have been in the class lives elsewhere. We also want to do away with statically-accessed
* classes. Use {@link PlotPlayer#hasPermissionRange(String, int)}
*/
@Deprecated(forRemoval = true, since = "6.9.3")
public static int hasPermissionRange(PlotPlayer<?> player, String stub, int range) {
return player.hasPermissionRange(stub, range);
}
}

View File

@ -429,7 +429,9 @@ public abstract class SchematicHandler {
if (parent.exists()) {
final String[] rawNames = parent.list((dir, name) -> name.endsWith(".schematic") || name.endsWith(".schem"));
if (rawNames != null) {
final List<String> transformed = Arrays.stream(rawNames).toList();
final List<String> transformed = Arrays.stream(rawNames)
//.map(rawName -> rawName.substring(0, rawName.length() - 10))
.collect(Collectors.toList());
names.addAll(transformed);
}
}
@ -489,6 +491,10 @@ public abstract class SchematicHandler {
return null;
}
/**
* The legacy web interface is deprecated for removal in favor of Arkitektonika.
*/
@Deprecated(forRemoval = true, since = "6.11.0")
public List<String> getSaves(UUID uuid) {
String rawJSON;
try {
@ -725,7 +731,10 @@ public abstract class SchematicHandler {
}
BaseBlock block = aabb.getWorld().getFullBlock(point);
if (block.getNbtData() != null) {
Map<String, Tag> values = new HashMap<>(block.getNbtData().getValue());
Map<String, Tag> values = new HashMap<>();
for (Map.Entry<String, Tag> entry : block.getNbtData().getValue().entrySet()) {
values.put(entry.getKey(), entry.getValue());
}
// Positions are kept in NBT, we don't want that.
values.remove("x");

View File

@ -129,7 +129,9 @@ public class StringMan {
}
public static String repeat(String s, int n) {
return String.valueOf(s).repeat(Math.max(0, n));
StringBuilder sb = new StringBuilder();
sb.append(String.valueOf(s).repeat(Math.max(0, n)));
return sb.toString();
}
/**

View File

@ -92,23 +92,23 @@ public final class TimeUtil {
case "wks":
case "w":
time += 604800L * numbers;
time += 604800 * numbers;
case "days":
case "day":
case "d":
time += 86400L * numbers;
time += 86400 * numbers;
case "hour":
case "hr":
case "hrs":
case "hours":
case "h":
time += 3600L * numbers;
time += 3600 * numbers;
case "minutes":
case "minute":
case "mins":
case "min":
case "m":
time += 60L * numbers;
time += 60 * numbers;
case "seconds":
case "second":
case "secs":

View File

@ -231,6 +231,10 @@ public abstract class WorldUtil {
*/
public abstract void refreshChunk(int x, int z, String world);
/**
* The legacy web interface is deprecated for removal in favor of Arkitektonika.
*/
@Deprecated(forRemoval = true, since = "6.11.0")
public void upload(
final @NonNull Plot plot,
final @Nullable UUID uuid,

View File

@ -89,7 +89,7 @@ public final class PlaceholderRegistry {
this.createPlaceholder("world_name", player -> player.getLocation().getWorldName());
this.createPlaceholder("has_plot", player -> player.getPlotCount() > 0 ? "true" : "false");
this.createPlaceholder("allowed_plot_count", (player) -> {
if (player.getAllowedPlots() == Integer.MAX_VALUE) { // Beautifies cases with '*' permission
if (player.getAllowedPlots() >= Integer.MAX_VALUE) { // Beautifies cases with '*' permission
return legacyComponent(TranslatableCaption.of("info.infinite"), player);
}
return Integer.toString(player.getAllowedPlots());
@ -300,7 +300,9 @@ public final class PlaceholderRegistry {
/**
* Event called when a new {@link Placeholder} has been added
*/
public record PlaceholderAddedEvent(Placeholder placeholder) {
public record PlaceholderAddedEvent(
Placeholder placeholder
) {
}

View File

@ -72,7 +72,8 @@ class SearchPlotProvider implements PlotProvider {
IntStream.range(0, size).mapToObj(i -> new ArrayList<Plot>())
.collect(Collectors.toCollection(() -> new ArrayList<>(size)));
PlotArea area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(search);
PlotArea area = null;
String alias = null;
for (Plot plot : PlotQuery.newQuery().allPlots()) {
int count = 0;
if (!uuids.isEmpty()) {
@ -89,10 +90,10 @@ class SearchPlotProvider implements PlotProvider {
count++;
}
}
if (plot.getArea() != null && plot.getArea().equals(area)) {
if (area != null && plot.getArea().equals(area)) {
count++;
}
if (search.equals(plot.getAlias())) {
if (alias != null && alias.equals(plot.getAlias())) {
count += 2;
}
if (count != 0) {

View File

@ -25,18 +25,9 @@ import java.util.UUID;
/**
* A pair consisting of a UUID and a username
*/
public record UUIDMapping(@NonNull UUID uuid, @NonNull String username) {
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
final UUIDMapping that = (UUIDMapping) o;
return uuid.equals(that.uuid) && username.equals(that.username);
}
public record UUIDMapping(
@NonNull UUID uuid,
@NonNull String username
) {
}

View File

@ -25,17 +25,45 @@ import com.plotsquared.core.plot.flag.FlagParseException;
import com.plotsquared.core.plot.flag.PlotFlag;
import com.plotsquared.core.plot.flag.implementations.PlotTitleFlag;
import com.plotsquared.core.plot.flag.implementations.UseFlag;
import com.sk89q.worldedit.world.item.ItemType;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class FlagTest {
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + FlagTest.class.getSimpleName());
private ItemType testBlock;
@BeforeEach
public void setUp() {
public void setUp() throws Exception {
//EventUtil.manager = new EventUtilTest();
DBFunc.dbManager = new AbstractDBTest();
}
// @Test public void flagTest() throws Exception {
// Plot plot = new Plot(null, PlotId.of(0, 0));
// plot.owner = UUID.fromString("84499644-ad72-454b-a19d-f28c28df382b");
// //plot.setFlag(use, use.parseValue("33,33:1,6:4")); //TODO fix this so FlagTest will run during compile
// Optional<? extends Collection> flag = plot.getFlag(use);
// if (flag.isPresent()) {
// LOGGER.info(Flags.USE.valueToString(flag.get()));
// testBlock = ItemTypes.BONE_BLOCK;
// flag.get().add(testBlock);
// }
// flag.ifPresent(collection -> LOGGER.info(Flags.USE.valueToString(collection)));
// Optional<Set<BlockType>> flag2 = plot.getFlag(Flags.USE);
// if (flag2.isPresent()) {
// // assertThat(flag2.get(), (Matcher<? super Set<BlockType>>) IsCollectionContaining.hasItem(testBlock));
// }
// if (flag.isPresent() && flag2.isPresent()) {
// assertEquals(flag.get(), flag2.get());
// }
// }
@Test
public void testFlagName() {
String flagName = PlotFlag.getFlagName(UseFlag.class);

View File

@ -33,11 +33,13 @@ is to provide a lag-free and smooth experience.
* [Contributing](https://github.com/IntellectualSites/.github/blob/main/CONTRIBUTING.md)
### Developer Resources
* [API Documentation](https://intellectualsites.github.io/plotsquared-documentation/api/api-documentation)
* [Event API](https://intellectualsites.github.io/plotsquared-documentation/api/event-api)
* [Flag API](https://intellectualsites.github.io/plotsquared-documentation/api/flag-api)
# Official Addons
* [Plot2Dynmap](http://www.spigotmc.org/resources/plot2dynmap.1292/)
* [HoloPlots](https://www.spigotmc.org/resources/holoplots.4880/)
* [PlotHider](https://www.spigotmc.org/resources/plot-hider.20701/)
@ -46,10 +48,14 @@ is to provide a lag-free and smooth experience.
Want to add new features to PlotSquared or fix bugs yourself? You can get the game running, with PlotSquared, from the code here:
For additional information about compiling PlotSquared, see [CONTRIBUTING.md](https://github.com/IntellectualSites/.github/blob/main/CONTRIBUTING.md)
For additional information about compiling PlotSquared,
see [CONTRIBUTING.md](https://github.com/IntellectualSites/.github/blob/main/CONTRIBUTING.md)
### Submitting Your Changes
PlotSquared is open source (specifically licensed under GPL v3), so note that your contributions will also be open source. The best way to submit a change is to create a fork on GitHub, put your changes there, and then create a "pull request" on our PlotSquared repository.
PlotSquared is open source (specifically licensed under GPL v3), so note that your contributions will also be open source. The
best way to submit a change is to create a fork on GitHub, put your changes there, and then create a "pull request" on our
PlotSquared repository.
<a href="https://yourkit.com/">
<img src="https://www.yourkit.com/images/yklogo.png">
@ -57,4 +63,6 @@ PlotSquared is open source (specifically licensed under GPL v3), so note that yo
Thank you to YourKit for supporting our product by providing us with their innovative and intelligent tools
for monitoring and profiling Java and .NET applications.
YourKit is the creator of [YourKit Java Profiler](https://www.yourkit.com/java/profiler/), [YourKit .NET Profiler](https://www.yourkit.com/.net/profiler/), and [YourKit YouMonitor](https://www.yourkit.com/youmonitor/).
YourKit is the creator
of [YourKit Java Profiler](https://www.yourkit.com/java/profiler/), [YourKit .NET Profiler](https://www.yourkit.com/.net/profiler/),
and [YourKit YouMonitor](https://www.yourkit.com/youmonitor/).

View File

@ -1,6 +1,6 @@
import com.diffplug.gradle.spotless.SpotlessPlugin
import com.github.jengelman.gradle.plugins.shadow.ShadowPlugin
import java.net.URI
import com.diffplug.gradle.spotless.SpotlessPlugin
plugins {
java
@ -74,7 +74,7 @@ subprojects {
}
dependencies {
implementation(platform("com.intellectualsites.bom:bom-newest:1.22"))
implementation(platform("com.intellectualsites.bom:bom-newest:1.24"))
}
dependencies {
@ -155,7 +155,7 @@ subprojects {
id.set("NotMyFault")
name.set("Alexander Brandes")
organization.set("IntellectualSites")
email.set("contact@notmyfault.dev")
email.set("contact(at)notmyfault.dev")
}
developer {
id.set("SirYwell")

View File

@ -11,17 +11,17 @@ essentialsx = "2.19.7"
mvdwapi = "3.1.1"
# Third party
prtree = "2.0.0"
prtree = "2.0.1"
aopalliance = "1.0"
cloud-services = "1.8.0"
arkitektonika = "2.1.1"
cloud-services = "1.8.2"
arkitektonika = "2.1.2"
squirrelid = "0.3.1"
# Gradle plugins
shadow = "7.1.2"
grgit = "4.1.1"
spotless = "6.13.0"
nexus = "1.1.0"
spotless = "6.16.0"
nexus = "1.3.0"
[libraries]
# Platform expectations

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