Skip to content

Commit 77eb614

Browse files
authored
Sponge module refactoring and fixes (#2697)
* Refactor some vanilla methods to sponge api * Fixes * Update api 14 * Fixes * PR fixes * Bring back vanilla methods
1 parent 8957a2e commit 77eb614

File tree

4 files changed

+191
-134
lines changed

4 files changed

+191
-134
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ neoforge-minecraft = "1.21.5"
1717

1818
sponge-minecraft = "1.21.4"
1919
# https://repo.spongepowered.org/service/rest/repository/browse/maven-public/org/spongepowered/spongeapi/
20-
sponge-api = "14.0.0-20241229.134205-2"
20+
sponge-api = "14.0.0-20250114.224746-4"
2121
sponge-api-major = "14"
2222

2323
# https://parchmentmc.org/docs/getting-started; note that we use older MC versions some times which is OK

worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package com.sk89q.worldedit.sponge;
2121

22+
import com.google.common.collect.Lists;
2223
import com.google.common.collect.Sets;
2324
import com.sk89q.worldedit.EditSession;
2425
import com.sk89q.worldedit.WorldEditException;
@@ -27,6 +28,7 @@
2728
import com.sk89q.worldedit.entity.Entity;
2829
import com.sk89q.worldedit.extent.Extent;
2930
import com.sk89q.worldedit.internal.util.LogManagerCompat;
31+
import com.sk89q.worldedit.math.BlockVector2;
3032
import com.sk89q.worldedit.math.BlockVector3;
3133
import com.sk89q.worldedit.math.Vector3;
3234
import com.sk89q.worldedit.regions.CuboidRegion;
@@ -53,7 +55,10 @@
5355
import net.minecraft.data.worldgen.features.TreeFeatures;
5456
import net.minecraft.server.level.ServerLevel;
5557
import net.minecraft.util.RandomSource;
58+
import net.minecraft.world.level.Level;
5659
import net.minecraft.world.level.LevelReader;
60+
import net.minecraft.world.level.chunk.ChunkAccess;
61+
import net.minecraft.world.level.chunk.status.ChunkStatus;
5762
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
5863
import org.apache.logging.log4j.Logger;
5964
import org.enginehub.linbus.tree.LinCompoundTag;
@@ -84,6 +89,7 @@
8489

8590
import java.lang.ref.WeakReference;
8691
import java.nio.file.Path;
92+
import java.util.Collection;
8793
import java.util.List;
8894
import java.util.Optional;
8995
import java.util.Set;
@@ -201,6 +207,7 @@ public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B
201207
.withBlocksMoving(false)
202208
.withForcedReRender(false)
203209
.withIgnoreRender(false)
210+
.withPerformBlockDestruction(false)
204211
);
205212
if (!didSet) {
206213
// still update NBT if the block is the same
@@ -347,7 +354,6 @@ public int getBlockLightLevel(BlockVector3 position) {
347354
int groundLight = getWorld().light(LightTypes.BLOCK, position.x(), position.y(), position.z());
348355

349356
return Math.max(skyLight, groundLight);
350-
351357
}
352358

353359
@Override
@@ -480,6 +486,15 @@ public Entity createEntity(Location location, BaseEntity entity) {
480486
return builder.build().apply(SpongeAdapter.adapt(location)).map(SpongeEntity::new).orElse(null);
481487
}
482488

489+
@Override
490+
public void sendBiomeUpdates(Iterable<BlockVector2> chunks) {
491+
List<ChunkAccess> nativeChunks = chunks instanceof Collection<BlockVector2> chunkCollection ? Lists.newArrayListWithCapacity(chunkCollection.size()) : Lists.newArrayList();
492+
for (BlockVector2 chunk : chunks) {
493+
nativeChunks.add(((Level) getWorld()).getChunk(chunk.x(), chunk.z(), ChunkStatus.BIOMES, false));
494+
}
495+
((ServerLevel) getWorld()).getChunkSource().chunkMap.resendBiomesForChunks(nativeChunks);
496+
}
497+
483498
@Override
484499
public WeatherType getWeather() {
485500
return WeatherTypes.get(

worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorldEdit.java

Lines changed: 7 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,12 @@
2828
import com.sk89q.worldedit.event.platform.PlatformReadyEvent;
2929
import com.sk89q.worldedit.event.platform.PlatformUnreadyEvent;
3030
import com.sk89q.worldedit.event.platform.PlatformsRegisteredEvent;
31-
import com.sk89q.worldedit.event.platform.SessionIdleEvent;
3231
import com.sk89q.worldedit.extension.platform.Actor;
3332
import com.sk89q.worldedit.extension.platform.Capability;
3433
import com.sk89q.worldedit.extension.platform.Platform;
3534
import com.sk89q.worldedit.extension.platform.PlatformManager;
3635
import com.sk89q.worldedit.internal.anvil.ChunkDeleter;
3736
import com.sk89q.worldedit.internal.command.CommandUtil;
38-
import com.sk89q.worldedit.internal.event.InteractionDebouncer;
3937
import com.sk89q.worldedit.sponge.config.SpongeConfiguration;
4038
import com.sk89q.worldedit.world.biome.BiomeCategory;
4139
import com.sk89q.worldedit.world.biome.BiomeType;
@@ -47,7 +45,6 @@
4745
import org.spongepowered.api.ResourceKey;
4846
import org.spongepowered.api.Server;
4947
import org.spongepowered.api.Sponge;
50-
import org.spongepowered.api.block.BlockSnapshot;
5148
import org.spongepowered.api.block.BlockType;
5249
import org.spongepowered.api.block.entity.BlockEntity;
5350
import org.spongepowered.api.block.entity.CommandBlock;
@@ -57,26 +54,17 @@
5754
import org.spongepowered.api.command.CommandResult;
5855
import org.spongepowered.api.command.parameter.ArgumentReader;
5956
import org.spongepowered.api.config.ConfigDir;
60-
import org.spongepowered.api.data.type.HandTypes;
6157
import org.spongepowered.api.entity.living.player.server.ServerPlayer;
62-
import org.spongepowered.api.event.EventContextKeys;
6358
import org.spongepowered.api.event.Listener;
64-
import org.spongepowered.api.event.action.InteractEvent;
65-
import org.spongepowered.api.event.block.InteractBlockEvent;
66-
import org.spongepowered.api.event.filter.cause.Root;
67-
import org.spongepowered.api.event.item.inventory.InteractItemEvent;
6859
import org.spongepowered.api.event.lifecycle.ConstructPluginEvent;
6960
import org.spongepowered.api.event.lifecycle.RegisterCommandEvent;
7061
import org.spongepowered.api.event.lifecycle.StartedEngineEvent;
7162
import org.spongepowered.api.event.lifecycle.StartingEngineEvent;
7263
import org.spongepowered.api.event.lifecycle.StoppingEngineEvent;
73-
import org.spongepowered.api.event.network.ServerSideConnectionEvent;
7464
import org.spongepowered.api.registry.RegistryTypes;
7565
import org.spongepowered.api.scheduler.Task;
7666
import org.spongepowered.api.world.LocatableBlock;
77-
import org.spongepowered.api.world.server.ServerLocation;
7867
import org.spongepowered.api.world.server.ServerWorld;
79-
import org.spongepowered.math.vector.Vector3d;
8068
import org.spongepowered.plugin.PluginContainer;
8169
import org.spongepowered.plugin.builtin.jvm.Plugin;
8270

@@ -113,7 +101,6 @@ public static SpongeWorldEdit inst() {
113101
private final SpongeConfiguration config;
114102
private final Path workingDir;
115103

116-
private InteractionDebouncer debouncer;
117104
private SpongePermissionsProvider provider;
118105
private SpongePlatform platform;
119106

@@ -135,7 +122,6 @@ public SpongeWorldEdit(Logger logger,
135122
@Listener
136123
public void onPluginConstruction(ConstructPluginEvent event) {
137124
this.platform = new SpongePlatform(this);
138-
debouncer = new InteractionDebouncer(platform);
139125

140126
WorldEdit.getInstance().getPlatformManager().register(platform);
141127

@@ -146,6 +132,13 @@ public void onPluginConstruction(ConstructPluginEvent event) {
146132
new CUIChannelHandler.RegistrationHandler(),
147133
MethodHandles.lookup()
148134
);
135+
136+
event.game().eventManager().registerListeners(
137+
container,
138+
new SpongeWorldEditListener(this),
139+
MethodHandles.lookup()
140+
);
141+
149142
logger.info("WorldEdit for Sponge (version " + getInternalVersion() + ") is loaded");
150143
}
151144

@@ -310,123 +303,6 @@ public List<CommandCompletion> complete(CommandCause cause, ArgumentReader.Mutab
310303
);
311304
}
312305

313-
private boolean skipEvents() {
314-
return platform == null || !platform.isHookingEvents();
315-
}
316-
317-
private boolean skipInteractionEvent(InteractEvent event) {
318-
return skipEvents() || event.context().get(EventContextKeys.USED_HAND).orElse(null) != HandTypes.MAIN_HAND.get();
319-
}
320-
321-
@Listener
322-
public void onPlayerInteractItemPrimary(InteractItemEvent.Primary event, @Root ServerPlayer spongePlayer) {
323-
if (skipInteractionEvent(event)) {
324-
return;
325-
}
326-
327-
WorldEdit we = WorldEdit.getInstance();
328-
SpongePlayer player = SpongeAdapter.adapt(spongePlayer);
329-
330-
Optional<Boolean> previousResult = debouncer.getDuplicateInteractionResult(player);
331-
if (previousResult.isPresent()) {
332-
return;
333-
}
334-
335-
boolean result = we.handleArmSwing(player);
336-
debouncer.setLastInteraction(player, result);
337-
}
338-
339-
@Listener
340-
public void onPlayerInteractItemSecondary(InteractItemEvent.Secondary event, @Root ServerPlayer spongePlayer) {
341-
if (skipInteractionEvent(event)) {
342-
return;
343-
}
344-
345-
WorldEdit we = WorldEdit.getInstance();
346-
SpongePlayer player = SpongeAdapter.adapt(spongePlayer);
347-
348-
Optional<Boolean> previousResult = debouncer.getDuplicateInteractionResult(player);
349-
if (previousResult.isPresent()) {
350-
if (previousResult.get()) {
351-
event.setCancelled(true);
352-
}
353-
return;
354-
}
355-
356-
boolean result = we.handleRightClick(player);
357-
debouncer.setLastInteraction(player, result);
358-
359-
if (result) {
360-
event.setCancelled(true);
361-
}
362-
}
363-
364-
@Listener
365-
public void onPlayerInteractBlockPrimary(InteractBlockEvent.Primary.Start event, @Root ServerPlayer spongePlayer) {
366-
if (skipInteractionEvent(event)) {
367-
return;
368-
}
369-
370-
WorldEdit we = WorldEdit.getInstance();
371-
SpongePlayer player = SpongeAdapter.adapt(spongePlayer);
372-
373-
BlockSnapshot targetBlock = event.block();
374-
Optional<ServerLocation> optLoc = targetBlock.location();
375-
376-
boolean result = false;
377-
if (optLoc.isPresent()) {
378-
ServerLocation loc = optLoc.get();
379-
com.sk89q.worldedit.util.Location pos = SpongeAdapter.adapt(loc, Vector3d.ZERO);
380-
381-
result = we.handleBlockLeftClick(player, pos, SpongeAdapter.adapt(event.targetSide()));
382-
}
383-
384-
result = we.handleArmSwing(player) || result;
385-
debouncer.setLastInteraction(player, result);
386-
387-
if (result) {
388-
event.setCancelled(true);
389-
}
390-
}
391-
392-
@Listener
393-
public void onPlayerInteractBlockSecondary(InteractBlockEvent.Secondary event, @Root ServerPlayer spongePlayer) {
394-
if (skipInteractionEvent(event)) {
395-
return;
396-
}
397-
398-
WorldEdit we = WorldEdit.getInstance();
399-
SpongePlayer player = SpongeAdapter.adapt(spongePlayer);
400-
401-
BlockSnapshot targetBlock = event.block();
402-
Optional<ServerLocation> optLoc = targetBlock.location();
403-
404-
boolean result = false;
405-
if (optLoc.isPresent()) {
406-
ServerLocation loc = optLoc.get();
407-
com.sk89q.worldedit.util.Location pos = SpongeAdapter.adapt(loc, Vector3d.ZERO);
408-
409-
result = we.handleBlockRightClick(player, pos, SpongeAdapter.adapt(event.targetSide()));
410-
}
411-
412-
result = we.handleRightClick(player) || result;
413-
debouncer.setLastInteraction(player, result);
414-
415-
if (result) {
416-
event.setCancelled(true);
417-
}
418-
}
419-
420-
@Listener
421-
public void onPlayerQuit(ServerSideConnectionEvent.Disconnect event) {
422-
event.profile().ifPresent(profile -> {
423-
debouncer.clearInteraction(profile::uniqueId);
424-
425-
WorldEdit.getInstance().getEventBus()
426-
.post(new SessionIdleEvent(new SpongePlayer.SessionKeyImpl(profile.uniqueId(), profile.name().orElseThrow())));
427-
});
428-
}
429-
430306
public PluginContainer getPluginContainer() {
431307
return container;
432308
}
@@ -500,5 +376,4 @@ public void setPermissionsProvider(SpongePermissionsProvider provider) {
500376
public SpongePermissionsProvider getPermissionsProvider() {
501377
return provider;
502378
}
503-
504379
}

0 commit comments

Comments
 (0)