Skip to content

Commit 5ea6b41

Browse files
authored
Merge branch 'main' into feature/v7/projectile-change-block-flag
2 parents 7c911c9 + 1a18adc commit 5ea6b41

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+842
-289
lines changed

.github/ISSUE_TEMPLATE/bug_report.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ body:
2727
description: Which server version version you using? If your server version is not listed, it is not supported. Update to a supported version first.
2828
multiple: false
2929
options:
30-
- '1.20.1'
30+
- '1.20.2'
3131
- '1.20'
3232
- '1.19.4'
3333
- '1.19.3'

.github/renovate.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@
1414
"com.google.code.gson:gson",
1515
"com.google.guava:guava",
1616
"org.yaml:snakeyaml",
17-
"org.apache.logging.log4j:log4j-api",
17+
"org.apache.logging.log4j:log4j-api"
1818
]
1919
}

.github/workflows/build-pr.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ jobs:
99
os: [ ubuntu-latest, windows-latest, macos-latest ]
1010
steps:
1111
- name: Checkout Repository
12-
uses: actions/checkout@v3
12+
uses: actions/checkout@v4
1313
- name: Validate Gradle Wrapper
1414
uses: gradle/wrapper-validation-action@v1
1515
- name: Setup Java
16-
uses: actions/setup-java@v3
16+
uses: actions/setup-java@v4
1717
with:
1818
distribution: temurin
1919
java-version: 17

.github/workflows/build.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ jobs:
99
runs-on: ubuntu-latest
1010
steps:
1111
- name: Checkout Repository
12-
uses: actions/checkout@v3
12+
uses: actions/checkout@v4
1313
- name: Validate Gradle Wrapper
1414
uses: gradle/wrapper-validation-action@v1
1515
- name: Setup Java
16-
uses: actions/setup-java@v3
16+
uses: actions/setup-java@v4
1717
with:
1818
distribution: temurin
1919
java-version: 17

.github/workflows/codeql.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ jobs:
2020
language: [ 'java' ]
2121
steps:
2222
- name: Checkout repository
23-
uses: actions/checkout@v3
23+
uses: actions/checkout@v4
2424
- name: Setup Java
25-
uses: actions/setup-java@v3
25+
uses: actions/setup-java@v4
2626
with:
2727
distribution: temurin
2828
java-version: 17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
name: "Label conflicting PRs"
2+
on:
3+
push:
4+
pull_request_target:
5+
types: [ synchronize ]
6+
pull_request:
7+
types: [ synchronize ]
8+
9+
permissions:
10+
pull-requests: write
11+
12+
jobs:
13+
main:
14+
if: github.event.pull_request.user.login != 'dependabot[bot]'
15+
runs-on: ubuntu-latest
16+
steps:
17+
- name: Label conflicting PRs
18+
uses: eps1lon/[email protected]
19+
with:
20+
dirtyLabel: "unresolved-merge-conflict"
21+
repoToken: "${{ secrets.GITHUB_TOKEN }}"
22+
commentOnDirty: "Please take a moment and address the merge conflicts of your pull request. Thanks!"
23+
continueOnMissingPermissions: true

Bukkit/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ tasks {
100100
withType<Javadoc> {
101101
val isRelease = if (rootProject.version.toString().endsWith("-SNAPSHOT")) "TODO" else rootProject.version.toString()
102102
val opt = options as StandardJavadocDocletOptions
103-
opt.links("https://jd.papermc.io/paper/1.19/")
103+
opt.links("https://jd.papermc.io/paper/1.20/")
104104
opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString())
105105
opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/")
106106
opt.links("https://jd.advntr.dev/api/4.14.0/")

Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java

+17
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import com.plotsquared.bukkit.listener.EntitySpawnListener;
3838
import com.plotsquared.bukkit.listener.PaperListener;
3939
import com.plotsquared.bukkit.listener.PlayerEventListener;
40+
import com.plotsquared.bukkit.listener.PlayerEventListener1201;
4041
import com.plotsquared.bukkit.listener.ProjectileEventListener;
4142
import com.plotsquared.bukkit.listener.ServerListener;
4243
import com.plotsquared.bukkit.listener.SingleWorldListener;
@@ -135,6 +136,7 @@
135136
import org.bukkit.metadata.FixedMetadataValue;
136137
import org.bukkit.metadata.MetadataValue;
137138
import org.bukkit.plugin.Plugin;
139+
import org.bukkit.plugin.RegisteredServiceProvider;
138140
import org.bukkit.plugin.java.JavaPlugin;
139141
import org.checkerframework.checker.nullness.qual.NonNull;
140142
import org.checkerframework.checker.nullness.qual.Nullable;
@@ -358,6 +360,9 @@ public void onEnable() {
358360

359361
if (Settings.Enabled_Components.EVENTS) {
360362
getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener.class), this);
363+
if ((serverVersion()[1] == 20 && serverVersion()[2] >= 1) || serverVersion()[1] > 20) {
364+
getServer().getPluginManager().registerEvents(injector().getInstance(PlayerEventListener1201.class), this);
365+
}
361366
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener.class), this);
362367
if (serverVersion()[1] >= 17) {
363368
getServer().getPluginManager().registerEvents(injector().getInstance(BlockEventListener117.class), this);
@@ -813,6 +818,7 @@ private void runEntityTask() {
813818
case "MINECART_MOB_SPAWNER":
814819
case "ENDER_CRYSTAL":
815820
case "MINECART_TNT":
821+
case "CHEST_BOAT":
816822
case "BOAT":
817823
if (Settings.Enabled_Components.KILL_ROAD_VEHICLES) {
818824
com.plotsquared.core.location.Location location = BukkitUtil.adapt(entity.getLocation());
@@ -1178,6 +1184,17 @@ public void setGenerator(final @NonNull String worldName) {
11781184
.append(" • Load Before: ").append(p.getDescription().getLoadBefore()).append("\n")
11791185
.append(" • Dependencies: ").append(p.getDescription().getDepend()).append("\n")
11801186
.append(" • Soft Dependencies: ").append(p.getDescription().getSoftDepend()).append("\n");
1187+
List<RegisteredServiceProvider<?>> providers = Bukkit.getServicesManager().getRegistrations(p);
1188+
if (!providers.isEmpty()) {
1189+
msg.append(" • Provided Services: \n");
1190+
for (RegisteredServiceProvider<?> provider : providers) {
1191+
msg.append(" • ")
1192+
.append(provider.getService().getName()).append(" = ")
1193+
.append(provider.getProvider().getClass().getName())
1194+
.append(" (priority: ").append(provider.getPriority()).append(")")
1195+
.append("\n");
1196+
}
1197+
}
11811198
}
11821199
return msg.toString();
11831200
}

Bukkit/src/main/java/com/plotsquared/bukkit/entity/ReplicatingEntityWrapper.java

+44-10
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.bukkit.entity.ArmorStand;
3434
import org.bukkit.entity.Bat;
3535
import org.bukkit.entity.Boat;
36+
import org.bukkit.entity.Breedable;
3637
import org.bukkit.entity.ChestedHorse;
3738
import org.bukkit.entity.EnderDragon;
3839
import org.bukkit.entity.Entity;
@@ -165,15 +166,15 @@ public ReplicatingEntityWrapper(Entity entity, short depth) {
165166
//this.horse.style = horse.getStyle();
166167
//this.horse.color = horse.getColor();
167168
storeTameable(horse);
168-
storeAgeable(horse);
169+
storeBreedable(horse);
169170
storeLiving(horse);
170171
storeInventory(horse);
171172
return;
172173
}
173174
// END INVENTORY HOLDER //
174175
case "WOLF", "OCELOT" -> {
175176
storeTameable((Tameable) entity);
176-
storeAgeable((Ageable) entity);
177+
storeBreedable((Breedable) entity);
177178
storeLiving((LivingEntity) entity);
178179
return;
179180
}
@@ -187,18 +188,18 @@ public ReplicatingEntityWrapper(Entity entity, short depth) {
187188
this.dataByte = (byte) 0;
188189
}
189190
this.dataByte2 = sheep.getColor().getDyeData();
190-
storeAgeable(sheep);
191+
storeBreedable(sheep);
191192
storeLiving(sheep);
192193
return;
193194
}
194195
case "VILLAGER", "CHICKEN", "COW", "MUSHROOM_COW", "PIG", "TURTLE", "POLAR_BEAR" -> {
195-
storeAgeable((Ageable) entity);
196+
storeBreedable((Breedable) entity);
196197
storeLiving((LivingEntity) entity);
197198
return;
198199
}
199200
case "RABBIT" -> {
200201
this.dataByte = getOrdinal(Rabbit.Type.values(), ((Rabbit) entity).getRabbitType());
201-
storeAgeable((Ageable) entity);
202+
storeBreedable((Breedable) entity);
202203
storeLiving((LivingEntity) entity);
203204
return;
204205
}
@@ -382,6 +383,11 @@ private void restoreTameable(Tameable entity) {
382383
}
383384
}
384385

386+
/**
387+
* @deprecated Use {@link #restoreBreedable(Breedable)} instead
388+
* @since 7.1.0
389+
*/
390+
@Deprecated(forRemoval = true, since = "7.1.0")
385391
private void restoreAgeable(Ageable entity) {
386392
if (!this.aged.adult) {
387393
entity.setBaby();
@@ -392,13 +398,41 @@ private void restoreAgeable(Ageable entity) {
392398
}
393399
}
394400

401+
/**
402+
* @deprecated Use {@link #storeBreedable(Breedable)} instead
403+
* @since 7.1.0
404+
*/
405+
@Deprecated(forRemoval = true, since = "7.1.0")
395406
public void storeAgeable(Ageable aged) {
396407
this.aged = new AgeableStats();
397408
this.aged.age = aged.getAge();
398409
this.aged.locked = aged.getAgeLock();
399410
this.aged.adult = aged.isAdult();
400411
}
401412

413+
/**
414+
* @since 7.1.0
415+
*/
416+
private void restoreBreedable(Breedable entity) {
417+
if (!this.aged.adult) {
418+
entity.setBaby();
419+
}
420+
entity.setAgeLock(this.aged.locked);
421+
if (this.aged.age > 0) {
422+
entity.setAge(this.aged.age);
423+
}
424+
}
425+
426+
/**
427+
* @since 7.1.0
428+
*/
429+
private void storeBreedable(Breedable breedable) {
430+
this.aged = new AgeableStats();
431+
this.aged.age = breedable.getAge();
432+
this.aged.locked = breedable.getAgeLock();
433+
this.aged.adult = breedable.isAdult();
434+
}
435+
402436
public void storeTameable(Tameable tamed) {
403437
this.tamed = new TameableStats();
404438
this.tamed.owner = tamed.getOwner();
@@ -502,15 +536,15 @@ public Entity spawn(World world, int xOffset, int zOffset) {
502536
//horse.setStyle(this.horse.style);
503537
//horse.setColor(this.horse.color);
504538
restoreTameable(horse);
505-
restoreAgeable(horse);
539+
restoreBreedable(horse);
506540
restoreLiving(horse);
507541
restoreInventory(horse);
508542
return entity;
509543
}
510544
// END INVENTORY HOLDER //
511545
case "WOLF", "OCELOT" -> {
512546
restoreTameable((Tameable) entity);
513-
restoreAgeable((Ageable) entity);
547+
restoreBreedable((Breedable) entity);
514548
restoreLiving((LivingEntity) entity);
515549
return entity;
516550
}
@@ -523,12 +557,12 @@ public Entity spawn(World world, int xOffset, int zOffset) {
523557
if (this.dataByte2 != 0) {
524558
sheep.setColor(DyeColor.getByDyeData(this.dataByte2));
525559
}
526-
restoreAgeable(sheep);
560+
restoreBreedable(sheep);
527561
restoreLiving(sheep);
528562
return sheep;
529563
}
530564
case "VILLAGER", "CHICKEN", "COW", "TURTLE", "POLAR_BEAR", "MUSHROOM_COW", "PIG" -> {
531-
restoreAgeable((Ageable) entity);
565+
restoreBreedable((Breedable) entity);
532566
restoreLiving((LivingEntity) entity);
533567
return entity;
534568
}
@@ -537,7 +571,7 @@ public Entity spawn(World world, int xOffset, int zOffset) {
537571
if (this.dataByte != 0) {
538572
((Rabbit) entity).setRabbitType(Rabbit.Type.values()[this.dataByte]);
539573
}
540-
restoreAgeable((Ageable) entity);
574+
restoreBreedable((Breedable) entity);
541575
restoreLiving((LivingEntity) entity);
542576
return entity;
543577
}

Bukkit/src/main/java/com/plotsquared/bukkit/inject/BukkitModule.java

+61-13
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@
2323
import com.google.inject.Singleton;
2424
import com.google.inject.assistedinject.FactoryModuleBuilder;
2525
import com.plotsquared.bukkit.BukkitPlatform;
26+
import com.plotsquared.bukkit.listener.ServerListener;
2627
import com.plotsquared.bukkit.listener.SingleWorldListener;
2728
import com.plotsquared.bukkit.player.BukkitPlayerManager;
2829
import com.plotsquared.bukkit.queue.BukkitChunkCoordinator;
2930
import com.plotsquared.bukkit.queue.BukkitQueueCoordinator;
3031
import com.plotsquared.bukkit.schematic.BukkitSchematicHandler;
3132
import com.plotsquared.bukkit.util.BukkitChunkManager;
32-
import com.plotsquared.bukkit.util.BukkitEconHandler;
3333
import com.plotsquared.bukkit.util.BukkitInventoryUtil;
3434
import com.plotsquared.bukkit.util.BukkitRegionManager;
3535
import com.plotsquared.bukkit.util.BukkitSetupUtils;
@@ -47,6 +47,9 @@
4747
import com.plotsquared.core.inject.factory.ChunkCoordinatorFactory;
4848
import com.plotsquared.core.inject.factory.HybridPlotWorldFactory;
4949
import com.plotsquared.core.inject.factory.ProgressSubscriberFactory;
50+
import com.plotsquared.core.player.OfflinePlotPlayer;
51+
import com.plotsquared.core.player.PlotPlayer;
52+
import com.plotsquared.core.plot.PlotArea;
5053
import com.plotsquared.core.plot.world.DefaultPlotAreaManager;
5154
import com.plotsquared.core.plot.world.PlotAreaManager;
5255
import com.plotsquared.core.plot.world.SinglePlotAreaManager;
@@ -72,6 +75,8 @@
7275
import org.bukkit.plugin.java.JavaPlugin;
7376
import org.checkerframework.checker.nullness.qual.NonNull;
7477

78+
import java.util.Objects;
79+
7580
public class BukkitModule extends AbstractModule {
7681

7782
private static final Logger LOGGER = LogManager.getLogger("PlotSquared/" + BukkitModule.class.getSimpleName());
@@ -128,21 +133,64 @@ protected void configure() {
128133
@Provides
129134
@Singleton
130135
@NonNull EconHandler provideEconHandler() {
131-
if (!Settings.Enabled_Components.ECONOMY) {
136+
if (!Settings.Enabled_Components.ECONOMY || !Bukkit.getPluginManager().isPluginEnabled("Vault")) {
132137
return EconHandler.nullEconHandler();
133138
}
134-
if (Bukkit.getPluginManager().isPluginEnabled("Vault")) {
135-
try {
136-
BukkitEconHandler econHandler = new BukkitEconHandler();
137-
if (!econHandler.init()) {
138-
LOGGER.warn("Economy is enabled but no plugin is providing an economy service. Falling back...");
139-
return EconHandler.nullEconHandler();
140-
}
141-
return econHandler;
142-
} catch (final Exception ignored) {
143-
}
139+
// Guice eagerly initializes singletons, so we need to bring the laziness ourselves
140+
return new LazyEconHandler();
141+
}
142+
143+
private static final class LazyEconHandler extends EconHandler implements ServerListener.MutableEconHandler {
144+
private volatile EconHandler implementation;
145+
146+
public void setImplementation(EconHandler econHandler) {
147+
this.implementation = econHandler;
144148
}
145-
return EconHandler.nullEconHandler();
149+
150+
@Override
151+
public boolean init() {
152+
return get().init();
153+
}
154+
155+
@Override
156+
public double getBalance(final PlotPlayer<?> player) {
157+
return get().getBalance(player);
158+
}
159+
160+
@Override
161+
public void withdrawMoney(final PlotPlayer<?> player, final double amount) {
162+
get().withdrawMoney(player, amount);
163+
}
164+
165+
@Override
166+
public void depositMoney(final PlotPlayer<?> player, final double amount) {
167+
get().depositMoney(player, amount);
168+
}
169+
170+
@Override
171+
public void depositMoney(final OfflinePlotPlayer player, final double amount) {
172+
get().depositMoney(player, amount);
173+
}
174+
175+
@Override
176+
public boolean isEnabled(final PlotArea plotArea) {
177+
return get().isEnabled(plotArea);
178+
}
179+
180+
@Override
181+
public @NonNull String format(final double balance) {
182+
return get().format(balance);
183+
}
184+
185+
@Override
186+
public boolean isSupported() {
187+
return get().isSupported();
188+
}
189+
190+
private EconHandler get() {
191+
return Objects.requireNonNull(this.implementation, "EconHandler not ready yet.");
192+
}
193+
146194
}
147195

148196
}

0 commit comments

Comments
 (0)