Update upstream

This commit is contained in:
IzzelAliz 2022-03-07 15:21:56 +08:00
parent eb2922c567
commit 04b7a110f8
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338
7 changed files with 113 additions and 4 deletions

View File

@ -9,6 +9,7 @@ import net.minecraft.server.level.DistanceManager;
import net.minecraft.server.level.ServerPlayer; import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.level.Ticket; import net.minecraft.server.level.Ticket;
import net.minecraft.server.level.TicketType; import net.minecraft.server.level.TicketType;
import net.minecraft.server.level.TickingTracker;
import net.minecraft.util.SortedArraySet; import net.minecraft.util.SortedArraySet;
import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.ChunkPos;
import org.spongepowered.asm.mixin.Final; 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 protected abstract SortedArraySet<Ticket<?>> getTickets(long p_229848_1_);
@Shadow private static int getTicketLevelAt(SortedArraySet<Ticket<?>> p_229844_0_) { return 0; } @Shadow private static int getTicketLevelAt(SortedArraySet<Ticket<?>> p_229844_0_) { return 0; }
@Shadow @Final public Long2ObjectOpenHashMap<SortedArraySet<Ticket<?>>> tickets; @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 // @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")) @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) { public <T> boolean addTicketAtLevel(TicketType<T> type, ChunkPos pos, int level, T value) {
Ticket<T> ticket = new Ticket<>(type, level, value); Ticket<T> ticket = new Ticket<>(type, level, value);
return this.addTicket(pos.toLong(), ticket); return this.addTicket(pos.toLong(), ticket);
@ -71,6 +87,12 @@ public abstract class DistanceManagerMixin implements TicketManagerBridge {
this.tickets.remove(chunkPosIn); this.tickets.remove(chunkPosIn);
} }
this.ticketTracker.update(chunkPosIn, getTicketLevelAt(ticketSet), false); 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; return removed;
} }
@ -87,6 +109,10 @@ public abstract class DistanceManagerMixin implements TicketManagerBridge {
if (ticketIn.getTicketLevel() < level) { if (ticketIn.getTicketLevel() < level) {
this.ticketTracker.update(chunkPosIn, ticketIn.getTicketLevel(), true); 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; return ticketIn == ticket;
} }

View File

@ -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.MapDataBridge;
import io.izzel.arclight.common.bridge.core.world.storage.WorldInfoBridge; 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.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.server.world.WorldSymlink;
import io.izzel.arclight.common.mod.util.ArclightCaptures; import io.izzel.arclight.common.mod.util.ArclightCaptures;
import io.izzel.arclight.common.mod.util.DelegateWorldInfo; 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.entity.PersistentEntitySectionManager;
import net.minecraft.world.level.saveddata.maps.MapItemSavedData; import net.minecraft.world.level.saveddata.maps.MapItemSavedData;
import net.minecraft.world.level.storage.DerivedLevelData; 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.LevelStorageSource;
import net.minecraft.world.level.storage.PrimaryLevelData; import net.minecraft.world.level.storage.PrimaryLevelData;
import net.minecraft.world.level.storage.ServerLevelData; 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 static BlockPos END_SPAWN_POINT;
@Shadow @Final public ServerLevelData serverLevelData; @Shadow @Final public ServerLevelData serverLevelData;
@Shadow @Final private PersistentEntitySectionManager<Entity> entityManager; @Shadow @Final private PersistentEntitySectionManager<Entity> entityManager;
@Shadow public abstract DimensionDataStorage getDataStorage();
// @formatter:on // @formatter:on
@SuppressWarnings({"FieldCanBeLocal", "unused"}) @SuppressWarnings({"FieldCanBeLocal", "unused"})
@ -162,6 +165,14 @@ public abstract class ServerLevelMixin extends LevelMixin implements ServerWorld
this.uuid = WorldUUID.getUUID(levelSave.getDimensionPath(this.dimension()).toFile()); this.uuid = WorldUUID.getUUID(levelSave.getDimensionPath(this.dimension()).toFile());
((ServerChunkProviderBridge) this.chunkSource).bridge$setViewDistance(spigotConfig.viewDistance); ((ServerChunkProviderBridge) this.chunkSource).bridge$setViewDistance(spigotConfig.viewDistance);
((WorldInfoBridge) this.$$worldDataServer).bridge$setWorld((ServerLevel) (Object) this); ((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) { public LevelChunk getChunkIfLoaded(int x, int z) {

View File

@ -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.LivingEntityBridge;
import io.izzel.arclight.common.bridge.core.entity.MobEntityBridge; 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.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.TeleporterBridge;
import io.izzel.arclight.common.bridge.core.world.WorldBridge; import io.izzel.arclight.common.bridge.core.world.WorldBridge;
import io.izzel.arclight.common.mod.util.ArclightCaptures; 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 setTicksFrozen(int p_146918_);
@Shadow public abstract void setSharedFlagOnFire(boolean p_146869_); @Shadow public abstract void setSharedFlagOnFire(boolean p_146869_);
@Shadow public abstract int getMaxAirSupply(); @Shadow public abstract int getMaxAirSupply();
@Shadow public abstract int getAirSupply();
// @formatter:on // @formatter:on
private static final int CURRENT_LEVEL = 2; private static final int CURRENT_LEVEL = 2;
@ -778,10 +780,12 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge,
if (this.valid) { if (this.valid) {
event.getEntity().getServer().getPluginManager().callEvent(event); event.getEntity().getServer().getPluginManager().callEvent(event);
} }
if (!event.isCancelled()) { if (event.isCancelled() && this.getAirSupply() != -1) {
this.entityData.set(DATA_AIR_SUPPLY_ID, event.getAmount()); 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 // CraftBukkit end
} }

View File

@ -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);
});
}
}

View File

@ -219,4 +219,8 @@ public abstract class AbstractFurnaceBlockEntityMixin extends LockableBlockEntit
public boolean bridge$isLit() { public boolean bridge$isLit() {
return this.isLit(); return this.isLit();
} }
public Object2IntOpenHashMap<ResourceLocation> getRecipesUsed() {
return this.recipesUsed;
}
} }

View File

@ -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;
}
}

View File

@ -100,6 +100,7 @@
"world.entity.ai.behavior.AssignProfessionFromJobSiteMixin", "world.entity.ai.behavior.AssignProfessionFromJobSiteMixin",
"world.entity.ai.behavior.HarvestFarmlandMixin", "world.entity.ai.behavior.HarvestFarmlandMixin",
"world.entity.ai.behavior.InteractWithDoorMixin", "world.entity.ai.behavior.InteractWithDoorMixin",
"world.entity.ai.behavior.PrepareRamNearestTargetMixin",
"world.entity.ai.behavior.ResetProfessionMixin", "world.entity.ai.behavior.ResetProfessionMixin",
"world.entity.ai.behavior.StartAttackingMixin", "world.entity.ai.behavior.StartAttackingMixin",
"world.entity.ai.behavior.StopAttackingIfTargetInvalidMixin", "world.entity.ai.behavior.StopAttackingIfTargetInvalidMixin",