Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PlotSquared & WorldEdit support #1724

Open
wants to merge 10 commits into
base: FeudalKings
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,22 @@

import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.players.PlayerList;
import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.ChunkGenerator;

public interface CraftServerBridge {

void bridge$setPlayerList(PlayerList playerList);

void bridge$removeWorld(ServerLevel world);

ChunkGenerator bridge$consumeGeneratorCache(String name);

// One-shot custom chunk generation cache
void bridge$offerGeneratorCache(String name, ChunkGenerator generator);

BiomeProvider bridge$consumeBiomeProviderCache(String name);

// One-shot custom chunk generation cache
void bridge$offerBiomeProviderCache(String name, BiomeProvider provider);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ public interface MinecraftServerBridge {

void bridge$setServer(CraftServer server);

CraftServer bridge$getServer();

RemoteConsoleCommandSender bridge$getRemoteConsole();

void bridge$setRemoteConsole(RemoteConsoleCommandSender sender);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import java.io.IOException;
import net.minecraft.server.level.ThreadedLevelLightEngine;
import net.minecraft.world.level.chunk.ChunkGenerator;

public interface ServerChunkProviderBridge {

Expand All @@ -16,7 +15,7 @@ public interface ServerChunkProviderBridge {

ThreadedLevelLightEngine bridge$getLightManager();

void bridge$setChunkGenerator(ChunkGenerator chunkGenerator);

void bridge$setViewDistance(int viewDistance);

void bridge$setSimulationDistance(int simDistance);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package io.izzel.arclight.common.mixin.bukkit;

import com.google.common.collect.Lists;
import io.izzel.arclight.common.bridge.bukkit.CraftServerBridge;
import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge;
import jline.console.ConsoleReader;
import net.minecraft.server.dedicated.DedicatedPlayerList;
import net.minecraft.server.dedicated.DedicatedServer;
Expand All @@ -11,9 +13,12 @@
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.command.CraftCommandMap;
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
import org.bukkit.craftbukkit.v.help.SimpleHelpMap;
import org.bukkit.craftbukkit.v.scheduler.CraftScheduler;
import org.bukkit.event.server.ServerLoadEvent;
import org.bukkit.generator.BiomeProvider;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginLoadOrder;
import org.bukkit.plugin.PluginManager;
Expand All @@ -33,9 +38,7 @@

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

Expand All @@ -51,6 +54,7 @@ public abstract class CraftServerMixin implements CraftServerBridge {
@Shadow @Final protected DedicatedServer console;
@Shadow @Final @Mutable private String serverName;
@Shadow @Final @Mutable protected DedicatedPlayerList playerList;
@Shadow @Final @Mutable private List<CraftPlayer> playerView;
@Shadow @Final private Map<String, World> worlds;
@Shadow public int reloadCount;
@Shadow private YamlConfiguration configuration;
Expand All @@ -66,7 +70,10 @@ public abstract class CraftServerMixin implements CraftServerBridge {
@Shadow public abstract void loadPlugins();
@Shadow public abstract void enablePlugins(PluginLoadOrder type);
@Shadow public abstract PluginManager getPluginManager();
@Shadow@Final private String serverVersion;@Accessor("logger") @Mutable public abstract void setLogger(Logger logger);
@Shadow@Final private String serverVersion;
@Accessor("logger") @Mutable public abstract void setLogger(Logger logger);
@Shadow public abstract ChunkGenerator getGenerator(String world);
@Shadow public abstract BiomeProvider getBiomeProvider(String world);
// @formatter:on

@Inject(method = "<init>", at = @At("RETURN"))
Expand Down Expand Up @@ -94,7 +101,13 @@ public String getVersion() {

@Override
public void bridge$setPlayerList(PlayerList playerList) {
// Though I'm not sure why we need this player list setter
// Player list view should be changed along with player list
// Or unexpected problem may happen
this.playerList = (DedicatedPlayerList) playerList;
this.playerView = Collections.unmodifiableList(Lists.transform(playerList.players, player ->
((ServerPlayerEntityBridge)player).bridge$getBukkitEntity()
));
}

/**
Expand Down Expand Up @@ -169,4 +182,43 @@ public void reload() {
this.enablePlugins(PluginLoadOrder.POSTWORLD);
this.getPluginManager().callEvent(new ServerLoadEvent(ServerLoadEvent.LoadType.RELOAD));
}

private final Map<String, ChunkGenerator> generatorCache = new HashMap<>();
private final Map<String, BiomeProvider> biomeProviderCache = new HashMap<>();

@Override
public void bridge$offerGeneratorCache(String name, ChunkGenerator generator) {
// Newly created level
generatorCache.put(name, generator);
}

@Override
public ChunkGenerator bridge$consumeGeneratorCache(String name) {
var cache = generatorCache.remove(name);
if (cache == null) {
// If not provided (which means it's not newly created),
// load from bukkit.yml configuration.
// See CraftServer
cache = getGenerator(name);
}
return cache;
}

@Override
public BiomeProvider bridge$consumeBiomeProviderCache(String name) {
var cache = biomeProviderCache.remove(name);
if (cache == null) {
// If not provided (which means it's not newly created),
// load from bukkit.yml configuration.
// See CraftServer
cache = getBiomeProvider(name);
}
return cache;
}

@Override
public void bridge$offerBiomeProviderCache(String name, BiomeProvider provider) {
// Newly created level
biomeProviderCache.put(name, provider);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,16 @@ public void initWorld(ServerLevel serverWorld, ServerLevelData worldInfo, WorldD
}
WorldBorder worldborder = serverWorld.getWorldBorder();
worldborder.applySettings(worldInfo.getWorldBorder());

// Call WorldInitEvent for Bukkit created world
// Before any chunk is loaded/generated.
// This makes delayed configurate possible.
// Calling multiple times is OK since Spigot also do so.
// See [PlotSquared] BukkitSetupUtils#setupWorld(PlotAreaBuilder).
// See CraftServer.
// CraftBukkit - SPIGOT-5569: Call WorldInitEvent before any chunks are generated
this.server.getPluginManager().callEvent(new WorldInitEvent(serverWorld.bridge$getWorld()));

if (!worldInfo.isInitialized()) {
try {
setInitialSpawn(serverWorld, worldInfo, worldOptions.generateBonusChest(), flag);
Expand Down Expand Up @@ -485,6 +495,15 @@ public void removeLevel(ServerLevel level) {
this.server = server;
}

// Used for one-shot cache access
@Override
public CraftServer bridge$getServer() {
if (this.server == null) {
throw new IllegalStateException("CraftServer has not been initialized yet");
}
return this.server;
}

@Override
public RemoteConsoleCommandSender bridge$getRemoteConsole() {
return remoteConsole;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,9 @@
import io.izzel.arclight.common.bridge.core.world.server.ChunkMapBridge;
import io.izzel.arclight.common.bridge.core.world.server.ServerChunkProviderBridge;
import io.izzel.arclight.common.bridge.core.world.server.TicketManagerBridge;
import io.izzel.arclight.mixin.Local;
import net.minecraft.server.level.*;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.GameRules;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.storage.LevelData;
import org.bukkit.entity.SpawnCategory;
Expand All @@ -19,7 +17,6 @@
import org.spongepowered.asm.mixin.gen.Accessor;
import org.spongepowered.asm.mixin.gen.Invoker;
import org.spongepowered.asm.mixin.injection.*;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

import javax.annotation.Nullable;
import java.io.IOException;
Expand Down Expand Up @@ -58,13 +55,13 @@ public LevelChunk getChunkUnchecked(int chunkX, int chunkZ) {
}

@Override
public void bridge$setChunkGenerator(ChunkGenerator chunkGenerator) {
((ChunkMapBridge) this.chunkMap).bridge$setChunkGenerator(chunkGenerator);
public void bridge$setViewDistance(int viewDistance) {
((ChunkMapBridge) this.chunkMap).bridge$setViewDistance(viewDistance);
}

@Override
public void bridge$setViewDistance(int viewDistance) {
((ChunkMapBridge) this.chunkMap).bridge$setViewDistance(viewDistance);
public void bridge$setSimulationDistance(int simDistance) {
distanceManager.updateSimulationDistance(simDistance);
}

@ModifyVariable(method = "getChunkFutureMainThread", index = 4, at = @At("HEAD"))
Expand Down
Loading