From 04b7a110f8b3dd7415319818101f0c91cc9b588a Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Mon, 7 Mar 2022 15:21:56 +0800 Subject: [PATCH] Update upstream --- .../server/level/DistanceManagerMixin.java | 28 ++++++++++++++- .../core/server/level/ServerLevelMixin.java | 11 ++++++ .../mixin/core/world/entity/EntityMixin.java | 10 ++++-- .../PrepareRamNearestTargetMixin.java | 34 +++++++++++++++++++ .../AbstractFurnaceBlockEntityMixin.java | 4 +++ .../mod/server/world/LevelPersistentData.java | 29 ++++++++++++++++ .../main/resources/mixins.arclight.core.json | 1 + 7 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/PrepareRamNearestTargetMixin.java create mode 100644 arclight-common/src/main/java/io/izzel/arclight/common/mod/server/world/LevelPersistentData.java diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/DistanceManagerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/DistanceManagerMixin.java index 7a7c450e..ff1b917f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/DistanceManagerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/DistanceManagerMixin.java @@ -9,6 +9,7 @@ import net.minecraft.server.level.DistanceManager; import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.Ticket; import net.minecraft.server.level.TicketType; +import net.minecraft.server.level.TickingTracker; import net.minecraft.util.SortedArraySet; import net.minecraft.world.level.ChunkPos; import org.spongepowered.asm.mixin.Final; @@ -31,7 +32,8 @@ public abstract class DistanceManagerMixin implements TicketManagerBridge { @Shadow protected abstract SortedArraySet> getTickets(long p_229848_1_); @Shadow private static int getTicketLevelAt(SortedArraySet> p_229844_0_) { return 0; } @Shadow @Final public Long2ObjectOpenHashMap>> tickets; - @Invoker("purgeStaleTickets") public abstract void bridge$tick(); + @Shadow abstract TickingTracker tickingTracker(); + @Shadow@Final private Long2ObjectOpenHashMap>> forcedTickets;@Invoker("purgeStaleTickets") public abstract void bridge$tick(); // @formatter:on @Inject(method = "removePlayer", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", remap = false, target = "Lit/unimi/dsi/fastutil/objects/ObjectSet;remove(Ljava/lang/Object;)Z")) @@ -41,6 +43,20 @@ public abstract class DistanceManagerMixin implements TicketManagerBridge { } } + public boolean addRegionTicketAtDistance(TicketType type, ChunkPos pos, int level, T value) { + var ticket = new Ticket<>(type, 33 - level, value); + var ret = this.addTicket(pos.toLong(), ticket); + this.tickingTracker().addTicket(pos.toLong(), ticket); + return ret; + } + + public boolean removeRegionTicketAtDistance(TicketType type, ChunkPos pos, int level, T value) { + var ticket = new Ticket<>(type, 33 - level, value); + var ret = this.removeTicket(pos.toLong(), ticket); + this.tickingTracker().removeTicket(pos.toLong(), ticket); + return ret; + } + public boolean addTicketAtLevel(TicketType type, ChunkPos pos, int level, T value) { Ticket ticket = new Ticket<>(type, level, value); return this.addTicket(pos.toLong(), ticket); @@ -71,6 +87,12 @@ public abstract class DistanceManagerMixin implements TicketManagerBridge { this.tickets.remove(chunkPosIn); } this.ticketTracker.update(chunkPosIn, getTicketLevelAt(ticketSet), false); + if (ticketIn.isForceTicks()) { + SortedArraySet> tickets = this.forcedTickets.get(chunkPosIn); + if (tickets != null) { + tickets.remove(ticketIn); + } + } return removed; } @@ -87,6 +109,10 @@ public abstract class DistanceManagerMixin implements TicketManagerBridge { if (ticketIn.getTicketLevel() < level) { this.ticketTracker.update(chunkPosIn, ticketIn.getTicketLevel(), true); } + if (ticketIn.isForceTicks()) { + SortedArraySet> tickets = this.forcedTickets.computeIfAbsent(chunkPosIn, e -> SortedArraySet.create(4)); + tickets.addOrGet(ticketIn); + } return ticketIn == ticket; } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java index ffec4bc9..36a48753 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/level/ServerLevelMixin.java @@ -13,6 +13,7 @@ import io.izzel.arclight.common.bridge.core.world.storage.LevelStorageSourceBrid import io.izzel.arclight.common.bridge.core.world.storage.MapDataBridge; import io.izzel.arclight.common.bridge.core.world.storage.WorldInfoBridge; import io.izzel.arclight.common.mixin.core.world.level.LevelMixin; +import io.izzel.arclight.common.mod.server.world.LevelPersistentData; import io.izzel.arclight.common.mod.server.world.WorldSymlink; import io.izzel.arclight.common.mod.util.ArclightCaptures; import io.izzel.arclight.common.mod.util.DelegateWorldInfo; @@ -49,6 +50,7 @@ import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.entity.PersistentEntitySectionManager; import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.storage.DerivedLevelData; +import net.minecraft.world.level.storage.DimensionDataStorage; import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.PrimaryLevelData; import net.minecraft.world.level.storage.ServerLevelData; @@ -102,6 +104,7 @@ public abstract class ServerLevelMixin extends LevelMixin implements ServerWorld @Shadow @Final public static BlockPos END_SPAWN_POINT; @Shadow @Final public ServerLevelData serverLevelData; @Shadow @Final private PersistentEntitySectionManager entityManager; + @Shadow public abstract DimensionDataStorage getDataStorage(); // @formatter:on @SuppressWarnings({"FieldCanBeLocal", "unused"}) @@ -162,6 +165,14 @@ public abstract class ServerLevelMixin extends LevelMixin implements ServerWorld this.uuid = WorldUUID.getUUID(levelSave.getDimensionPath(this.dimension()).toFile()); ((ServerChunkProviderBridge) this.chunkSource).bridge$setViewDistance(spigotConfig.viewDistance); ((WorldInfoBridge) this.$$worldDataServer).bridge$setWorld((ServerLevel) (Object) this); + var data = this.getDataStorage().computeIfAbsent(LevelPersistentData::new, () -> new LevelPersistentData(null), "bukkit_pdc"); + this.bridge$getWorld().readBukkitValues(data.getTag()); + } + + @Inject(method = "saveLevelData", at = @At("RETURN")) + private void arclight$savePdc(CallbackInfo ci) { + var data = this.getDataStorage().computeIfAbsent(LevelPersistentData::new, () -> new LevelPersistentData(null), "bukkit_pdc"); + data.save(this.world); } public LevelChunk getChunkIfLoaded(int x, int z) { diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java index 7d1cc24f..0e56ef79 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java @@ -9,6 +9,7 @@ import io.izzel.arclight.common.bridge.core.entity.InternalEntityBridge; import io.izzel.arclight.common.bridge.core.entity.LivingEntityBridge; import io.izzel.arclight.common.bridge.core.entity.MobEntityBridge; import io.izzel.arclight.common.bridge.core.entity.player.ServerPlayerEntityBridge; +import io.izzel.arclight.common.bridge.core.network.datasync.EntityDataManagerBridge; import io.izzel.arclight.common.bridge.core.world.TeleporterBridge; import io.izzel.arclight.common.bridge.core.world.WorldBridge; import io.izzel.arclight.common.mod.util.ArclightCaptures; @@ -215,6 +216,7 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, @Shadow public abstract void setTicksFrozen(int p_146918_); @Shadow public abstract void setSharedFlagOnFire(boolean p_146869_); @Shadow public abstract int getMaxAirSupply(); + @Shadow public abstract int getAirSupply(); // @formatter:on private static final int CURRENT_LEVEL = 2; @@ -778,10 +780,12 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, if (this.valid) { event.getEntity().getServer().getPluginManager().callEvent(event); } - if (!event.isCancelled()) { - this.entityData.set(DATA_AIR_SUPPLY_ID, event.getAmount()); + if (event.isCancelled() && this.getAirSupply() != -1) { + ci.cancel(); + ((EntityDataManagerBridge) this.getEntityData()).bridge$markDirty(DATA_AIR_SUPPLY_ID); + return; } - ci.cancel(); + this.entityData.set(DATA_AIR_SUPPLY_ID, event.getAmount()); // CraftBukkit end } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/PrepareRamNearestTargetMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/PrepareRamNearestTargetMixin.java new file mode 100644 index 00000000..64b3af9a --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/ai/behavior/PrepareRamNearestTargetMixin.java @@ -0,0 +1,34 @@ +package io.izzel.arclight.common.mixin.core.world.entity.ai.behavior; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.PathfinderMob; +import net.minecraft.world.entity.ai.behavior.PrepareRamNearestTarget; +import org.bukkit.craftbukkit.v.entity.CraftLivingEntity; +import org.bukkit.craftbukkit.v.event.CraftEventFactory; +import org.bukkit.event.entity.EntityTargetEvent; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.Optional; +import java.util.function.Consumer; + +@Mixin(PrepareRamNearestTarget.class) +public class PrepareRamNearestTargetMixin { + + @Redirect(method = "start(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/PathfinderMob;J)V", + at = @At(value = "INVOKE", remap = false, target = "Ljava/util/Optional;ifPresent(Ljava/util/function/Consumer;)V")) + private void arclight$targetEvent(Optional instance, Consumer action, ServerLevel level, PathfinderMob mob) { + instance.ifPresent(entity -> { + var event = CraftEventFactory.callEntityTargetLivingEvent(mob, entity, + (entity instanceof ServerPlayer) ? EntityTargetEvent.TargetReason.CLOSEST_PLAYER : EntityTargetEvent.TargetReason.CLOSEST_ENTITY); + if (event.isCancelled() || event.getTarget() == null) { + return; + } + var newEntity = ((CraftLivingEntity) event.getTarget()).getHandle(); + action.accept(newEntity); + }); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin.java index f3f743b7..8fba2f50 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/block/entity/AbstractFurnaceBlockEntityMixin.java @@ -219,4 +219,8 @@ public abstract class AbstractFurnaceBlockEntityMixin extends LockableBlockEntit public boolean bridge$isLit() { return this.isLit(); } + + public Object2IntOpenHashMap getRecipesUsed() { + return this.recipesUsed; + } } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/world/LevelPersistentData.java b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/world/LevelPersistentData.java new file mode 100644 index 00000000..5834e49f --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mod/server/world/LevelPersistentData.java @@ -0,0 +1,29 @@ +package io.izzel.arclight.common.mod.server.world; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.level.saveddata.SavedData; +import org.bukkit.craftbukkit.v.CraftWorld; +import org.jetbrains.annotations.NotNull; + +public class LevelPersistentData extends SavedData { + + private CompoundTag tag; + + public LevelPersistentData(CompoundTag tag) { + this.tag = tag == null ? new CompoundTag() : tag; + } + + public CompoundTag getTag() { + return tag; + } + + public void save(CraftWorld world) { + this.tag = new CompoundTag(); + world.storeBukkitValues(this.tag); + } + + @Override + public @NotNull CompoundTag save(@NotNull CompoundTag it) { + return tag; + } +} diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index 8d93e982..76f7c895 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -100,6 +100,7 @@ "world.entity.ai.behavior.AssignProfessionFromJobSiteMixin", "world.entity.ai.behavior.HarvestFarmlandMixin", "world.entity.ai.behavior.InteractWithDoorMixin", + "world.entity.ai.behavior.PrepareRamNearestTargetMixin", "world.entity.ai.behavior.ResetProfessionMixin", "world.entity.ai.behavior.StartAttackingMixin", "world.entity.ai.behavior.StopAttackingIfTargetInvalidMixin",