Update upstream
This commit is contained in:
parent
eb2922c567
commit
04b7a110f8
@ -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<Ticket<?>> getTickets(long p_229848_1_);
|
||||
@Shadow private static int getTicketLevelAt(SortedArraySet<Ticket<?>> p_229844_0_) { return 0; }
|
||||
@Shadow @Final public Long2ObjectOpenHashMap<SortedArraySet<Ticket<?>>> tickets;
|
||||
@Invoker("purgeStaleTickets") public abstract void bridge$tick();
|
||||
@Shadow abstract TickingTracker tickingTracker();
|
||||
@Shadow@Final private Long2ObjectOpenHashMap<SortedArraySet<Ticket<?>>> 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 <T> boolean addRegionTicketAtDistance(TicketType<T> 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 <T> boolean removeRegionTicketAtDistance(TicketType<T> 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 <T> boolean addTicketAtLevel(TicketType<T> type, ChunkPos pos, int level, T value) {
|
||||
Ticket<T> 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<Ticket<?>> 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<Ticket<?>> tickets = this.forcedTickets.computeIfAbsent(chunkPosIn, e -> SortedArraySet.create(4));
|
||||
tickets.addOrGet(ticketIn);
|
||||
}
|
||||
return ticketIn == ticket;
|
||||
}
|
||||
|
||||
|
||||
@ -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<Entity> 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) {
|
||||
|
||||
@ -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;
|
||||
}
|
||||
this.entityData.set(DATA_AIR_SUPPLY_ID, event.getAmount());
|
||||
// CraftBukkit end
|
||||
}
|
||||
|
||||
|
||||
@ -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<LivingEntity> instance, Consumer<LivingEntity> 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);
|
||||
});
|
||||
}
|
||||
}
|
||||
@ -219,4 +219,8 @@ public abstract class AbstractFurnaceBlockEntityMixin extends LockableBlockEntit
|
||||
public boolean bridge$isLit() {
|
||||
return this.isLit();
|
||||
}
|
||||
|
||||
public Object2IntOpenHashMap<ResourceLocation> getRecipesUsed() {
|
||||
return this.recipesUsed;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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",
|
||||
|
||||
Loading…
Reference in New Issue
Block a user