9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2026-01-04 15:41:38 +00:00

Merge branch 'Xiao-MoMi:dev' into dev

This commit is contained in:
jhqwqmc
2025-05-08 06:21:46 +08:00
committed by GitHub
14 changed files with 61 additions and 76 deletions

View File

@@ -40,7 +40,6 @@ import net.momirealms.craftengine.core.util.ReflectionUtils;
import net.momirealms.craftengine.core.util.VersionHelper;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.inventory.ItemStack;
@@ -192,15 +191,7 @@ public class BukkitCraftEngine extends CraftEngine {
new Metrics(this.bootstrap(), 24333);
}
// tick task
if (VersionHelper.isFolia()) {
this.tickTask = this.scheduler().sync().runRepeating(() -> {
for (BukkitServerPlayer serverPlayer : networkManager().onlineUsers()) {
org.bukkit.entity.Player player = serverPlayer.platformPlayer();
Location location = player.getLocation();
scheduler().sync().run(serverPlayer::tick, player.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4);
}
}, 1, 1);
} else {
if (!VersionHelper.isFolia()) {
this.tickTask = this.scheduler().sync().runRepeating(() -> {
for (BukkitServerPlayer serverPlayer : networkManager().onlineUsers()) {
serverPlayer.tick();

View File

@@ -7,15 +7,10 @@ import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector;
import net.momirealms.craftengine.core.plugin.CraftEngine;
import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager;
import net.momirealms.craftengine.core.plugin.command.sender.Sender;
import net.momirealms.craftengine.core.plugin.context.ContextHolder;
import net.momirealms.craftengine.core.plugin.context.PlayerOptionalContext;
import net.momirealms.craftengine.core.util.AdventureHelper;
import net.momirealms.craftengine.core.world.chunk.CESection;
import org.bukkit.Chunk;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.incendo.cloud.Command;
import org.incendo.cloud.parser.standard.StringParser;
public class DebugIsSectionInjectedCommand extends BukkitCommandFeature<CommandSender> {

View File

@@ -1,13 +1,10 @@
package net.momirealms.craftengine.bukkit.plugin.gui;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.util.LegacyInventoryUtils;
import net.momirealms.craftengine.core.plugin.gui.AbstractGui;
import net.momirealms.craftengine.core.plugin.gui.Gui;
import net.momirealms.craftengine.core.plugin.gui.GuiManager;
import net.momirealms.craftengine.core.plugin.gui.Inventory;
import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask;
import net.momirealms.craftengine.core.util.VersionHelper;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -19,7 +16,6 @@ import org.bukkit.event.inventory.InventoryDragEvent;
public class BukkitGuiManager implements GuiManager, Listener {
private final BukkitCraftEngine plugin;
private SchedulerTask timerTask;
public BukkitGuiManager(BukkitCraftEngine plugin) {
this.plugin = plugin;
@@ -28,35 +24,11 @@ public class BukkitGuiManager implements GuiManager, Listener {
@Override
public void delayedInit() {
Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap());
this.timerTask = plugin.scheduler().sync().runRepeating(this::timerTask, 30, 30);
}
@Override
public void disable() {
HandlerList.unregisterAll(this);
if (this.timerTask != null && !this.timerTask.cancelled()) {
this.timerTask.cancel();
}
}
public void timerTask() {
if (VersionHelper.isFolia()) {
for (Player player : Bukkit.getOnlinePlayers()) {
this.plugin.scheduler().sync().run(() -> {
org.bukkit.inventory.Inventory top = !VersionHelper.isOrAbove1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory();
if (top.getHolder() instanceof CraftEngineInventoryHolder holder) {
holder.gui().onTimer();
}
}, player.getWorld(), player.getLocation().getBlockX() >> 4, player.getLocation().getBlockZ() >> 4);
}
} else {
for (Player player : Bukkit.getOnlinePlayers()) {
org.bukkit.inventory.Inventory top = !VersionHelper.isOrAbove1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory();
if (top.getHolder() instanceof CraftEngineInventoryHolder holder) {
holder.gui().onTimer();
}
}
}
}
@Override

View File

@@ -68,7 +68,6 @@ import java.lang.reflect.Modifier;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.function.Consumer;
@@ -827,8 +826,8 @@ public class BukkitInjector {
if (previousLight != newLight || (clientSideNewState != null && (BlockStateUtils.isOcclude(newState) != BlockStateUtils.isOcclude(clientSideNewState)))) {
CEWorld world = thisObj.ceChunk().world();
SectionPos sectionPos = thisObj.cePos();
Set<SectionPos> posSet = SectionPosUtils.calculateAffectedRegions((sectionPos.x() << 4) + x, (sectionPos.y() << 4) + y, (sectionPos.z() << 4) + z, Math.max(newLight, previousLight));
world.sectionLightUpdated(posSet);
List<SectionPos> pos = SectionPosUtils.calculateAffectedRegions((sectionPos.x() << 4) + x, (sectionPos.y() << 4) + y, (sectionPos.z() << 4) + z, Math.max(newLight, previousLight));
world.sectionLightUpdated(pos);
}
}

View File

@@ -187,6 +187,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes
user.setPlayer(player);
this.onlineUsers.put(player.getUniqueId(), user);
this.resetUserArray();
if (VersionHelper.isFolia()) {
player.getScheduler().runAtFixedRate(plugin.bootstrap(), (t) -> user.tick(),
() -> plugin.debug(() -> "Player " + player.getName() + "'s entity scheduler is retired"), 1, 1);
}
}
}

View File

@@ -7,6 +7,7 @@ import net.momirealms.craftengine.bukkit.block.BukkitBlockManager;
import net.momirealms.craftengine.bukkit.item.BukkitItemManager;
import net.momirealms.craftengine.bukkit.nms.FastNMS;
import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine;
import net.momirealms.craftengine.bukkit.plugin.gui.CraftEngineInventoryHolder;
import net.momirealms.craftengine.bukkit.util.*;
import net.momirealms.craftengine.bukkit.world.BukkitWorld;
import net.momirealms.craftengine.core.block.BlockSettings;
@@ -324,6 +325,7 @@ public class BukkitServerPlayer extends Player {
public void tick() {
// not fully online
if (serverPlayer() == null) return;
if (VersionHelper.isFolia()) {
try {
Object serverPlayer = serverPlayer();
@@ -335,6 +337,9 @@ public class BukkitServerPlayer extends Player {
} else {
this.gameTicks = FastNMS.INSTANCE.field$MinecraftServer$currentTick();
}
if (this.gameTicks % 15 == 0) {
this.updateGUI();
}
if (this.isDestroyingBlock) {
this.tickBlockDestroy();
}
@@ -351,6 +356,13 @@ public class BukkitServerPlayer extends Player {
}
}
private void updateGUI() {
org.bukkit.inventory.Inventory top = !VersionHelper.isOrAbove1_21() ? LegacyInventoryUtils.getTopInventory(platformPlayer()) : platformPlayer().getOpenInventory().getTopInventory();
if (top.getHolder() instanceof CraftEngineInventoryHolder holder) {
holder.gui().onTimer();
}
}
@Override
public float getDestroyProgress(Object blockState, BlockPos pos) {
return FastNMS.INSTANCE.method$BlockStateBase$getDestroyProgress(blockState, serverPlayer(), FastNMS.INSTANCE.field$CraftWorld$ServerLevel(platformPlayer().getWorld()), LocationUtils.toBlockPos(pos));

View File

@@ -23,16 +23,11 @@ public class LightUtils {
List<Object> players = FastNMS.INSTANCE.method$ChunkHolder$getPlayers(chunkHolder);
if (players.isEmpty()) continue;
Object lightEngine = Reflections.field$ChunkHolder$lightEngine.get(chunkHolder);
BitSet blockChangedLightSectionFilter = (BitSet) Reflections.field$ChunkHolder$blockChangedLightSectionFilter.get(chunkHolder);
blockChangedLightSectionFilter.or(entry.getValue());
BitSet skyChangedLightSectionFilter = (BitSet) Reflections.field$ChunkHolder$skyChangedLightSectionFilter.get(chunkHolder);
Object chunkPos = FastNMS.INSTANCE.constructor$ChunkPos((int) chunkKey, (int) (chunkKey >> 32));
Object lightPacket = FastNMS.INSTANCE.constructor$ClientboundLightUpdatePacket(chunkPos, lightEngine, skyChangedLightSectionFilter, blockChangedLightSectionFilter);
Object lightPacket = FastNMS.INSTANCE.constructor$ClientboundLightUpdatePacket(chunkPos, lightEngine, entry.getValue(), entry.getValue());
for (Object player : players) {
FastNMS.INSTANCE.sendPacket(player, lightPacket);
}
blockChangedLightSectionFilter.clear();
skyChangedLightSectionFilter.clear();
}
} catch (Exception e) {
CraftEngine.instance().logger().warn("Could not update light for world " + world.getName());

View File

@@ -4,10 +4,13 @@ import net.momirealms.craftengine.bukkit.util.LightUtils;
import net.momirealms.craftengine.core.plugin.config.Config;
import net.momirealms.craftengine.core.util.SectionPosUtils;
import net.momirealms.craftengine.core.world.CEWorld;
import net.momirealms.craftengine.core.world.SectionPos;
import net.momirealms.craftengine.core.world.World;
import net.momirealms.craftengine.core.world.chunk.storage.StorageAdaptor;
import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage;
import java.util.HashSet;
public class BukkitCEWorld extends CEWorld {
public BukkitCEWorld(World world, StorageAdaptor adaptor) {
@@ -20,9 +23,19 @@ public class BukkitCEWorld extends CEWorld {
@Override
public void tick() {
HashSet<SectionPos> poses;
synchronized (super.updatedSectionSet) {
poses = new HashSet<>(super.updatedSectionSet);
super.updatedSectionSet.clear();
}
if (Config.enableLightSystem()) {
LightUtils.updateChunkLight((org.bukkit.World) world.platformWorld(), SectionPosUtils.toMap(super.updatedSectionPositions, world.worldHeight().getMinSection() - 1, world.worldHeight().getMaxSection() + 1));
super.updatedSectionPositions.clear();
LightUtils.updateChunkLight(
(org.bukkit.World) world.platformWorld(),
SectionPosUtils.toMap(poses,
world.worldHeight().getMinSection() - 1,
world.worldHeight().getMaxSection() + 1
)
);
}
}
}

View File

@@ -32,6 +32,7 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class BukkitWorldManager implements WorldManager, Listener {
@@ -45,6 +46,7 @@ public class BukkitWorldManager implements WorldManager, Listener {
private UUID lastVisitedUUID;
private CEWorld lastVisitedWorld;
private StorageAdaptor storageAdaptor;
private boolean isTicking = false;
public BukkitWorldManager(BukkitCraftEngine plugin) {
instance = this;
@@ -90,12 +92,20 @@ public class BukkitWorldManager implements WorldManager, Listener {
public void delayedInit() {
// events and tasks
Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap());
this.tickTask = plugin.scheduler().sync().runRepeating(() -> {
for (CEWorld world : worldArray) {
world.tick();
Bukkit.getPluginManager().registerEvents(this, this.plugin.bootstrap());
this.tickTask = this.plugin.scheduler().asyncRepeating(() -> {
try {
if (this.isTicking) {
return;
}
this.isTicking = true;
for (CEWorld world : this.worldArray) {
world.tick();
}
} finally {
this.isTicking = false;
}
}, 1, 1);
}, 50, 50, TimeUnit.MILLISECONDS);
// load loaded chunks
this.worldMapLock.writeLock().lock();
try {
@@ -125,7 +135,6 @@ public class BukkitWorldManager implements WorldManager, Listener {
if (this.tickTask != null && !this.tickTask.cancelled()) {
this.tickTask.cancel();
}
for (World world : Bukkit.getWorlds()) {
CEWorld ceWorld = getWorld(world.getUID());
for (Chunk chunk : world.getLoadedChunks()) {
@@ -299,7 +308,7 @@ public class BukkitWorldManager implements WorldManager, Listener {
}
}
}
if (unsaved && !FastNMS.INSTANCE.method$LevelChunk$isUnsaved(levelChunk)) {
if (unsaved /*&& !FastNMS.INSTANCE.method$LevelChunk$isUnsaved(levelChunk)*/) {
FastNMS.INSTANCE.method$LevelChunk$markUnsaved(levelChunk);
}
ceChunk.unload();