Update upstream

This commit is contained in:
IzzelAliz 2022-02-08 14:41:27 +08:00
parent df6f31d605
commit 20b21c4ce7
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338
5 changed files with 27 additions and 82 deletions

View File

@ -1,11 +1,13 @@
package io.izzel.arclight.common.bridge.core.world;
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap;
import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.dimension.LevelStem;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.CraftWorld;
import org.bukkit.entity.SpawnCategory;
import org.bukkit.generator.ChunkGenerator;
import org.spigotmc.SpigotWorldConfig;
@ -29,17 +31,7 @@ public interface WorldBridge extends IWorldWriterBridge, IWorldBridge {
SpigotWorldConfig bridge$spigotConfig();
long bridge$ticksPerAnimalSpawns();
long bridge$ticksPerMonsterSpawns();
long bridge$ticksPerWaterSpawns();
long bridge$ticksPerAmbientSpawns();
long bridge$ticksPerWaterAmbientSpawns();
long bridge$ticksPerWaterUndergroundSpawns();
Object2LongOpenHashMap<SpawnCategory> bridge$ticksPerSpawnCategory();
ResourceKey<LevelStem> bridge$getTypeKey();
}

View File

@ -16,6 +16,7 @@ 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;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@ -95,7 +96,7 @@ public abstract class ServerChunkCacheMixin implements ServerChunkProviderBridge
@Redirect(method = "tickChunks", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/storage/LevelData;getGameTime()J"))
private long arclight$ticksPer(LevelData worldInfo) {
long gameTime = worldInfo.getGameTime();
long ticksPer = ((WorldBridge) this.level).bridge$ticksPerAnimalSpawns();
long ticksPer = ((WorldBridge) this.level).bridge$ticksPerSpawnCategory().getLong(SpawnCategory.ANIMAL);
return (ticksPer != 0L && gameTime % ticksPer == 0) ? 0 : 1;
}

View File

@ -873,6 +873,11 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge,
return null;
} else {
ServerLevel world = ((PortalInfoBridge) portalinfo).bridge$getWorld() == null ? server : ((PortalInfoBridge) portalinfo).bridge$getWorld();
if (world == server) {
this.moveTo(portalinfo.pos.x, portalinfo.pos.y, portalinfo.pos.z, portalinfo.yRot, this.getXRot());
this.setDeltaMovement(portalinfo.speed);
return (Entity) (Object) this;
}
this.unRide();
Entity transportedEntity = teleporter.placeEntity((Entity) (Object) this, (ServerLevel) this.level, server, this.getYRot(), spawnPortal -> { //Forge: Start vanilla logic
this.level.getProfiler().popPush("reloading");

View File

@ -9,6 +9,7 @@ import io.izzel.arclight.common.bridge.core.world.server.ServerWorldBridge;
import io.izzel.arclight.common.mod.server.ArclightServer;
import io.izzel.arclight.common.mod.server.world.WrappedWorlds;
import io.izzel.arclight.common.mod.util.ArclightCaptures;
import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Registry;
import net.minecraft.resources.ResourceKey;
@ -42,6 +43,8 @@ import org.bukkit.craftbukkit.v.generator.CraftWorldInfo;
import org.bukkit.craftbukkit.v.generator.CustomChunkGenerator;
import org.bukkit.craftbukkit.v.generator.CustomWorldChunkManager;
import org.bukkit.craftbukkit.v.util.CraftNamespacedKey;
import org.bukkit.craftbukkit.v.util.CraftSpawnCategory;
import org.bukkit.entity.SpawnCategory;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.world.GenericGameEvent;
@ -81,12 +84,7 @@ public abstract class LevelMixin implements WorldBridge, LevelWriter {
protected CraftWorld world;
public boolean pvpMode;
public boolean keepSpawnInMemory = true;
public long ticksPerAnimalSpawns;
public long ticksPerMonsterSpawns;
public long ticksPerWaterSpawns;
public long ticksPerWaterAmbientSpawns;
public long ticksPerWaterUndergroundCreatureSpawns;
public long ticksPerAmbientSpawns;
public final Object2LongOpenHashMap<SpawnCategory> ticksPerSpawnCategory = new Object2LongOpenHashMap<>();
public boolean populating;
public org.bukkit.generator.ChunkGenerator generator;
protected org.bukkit.World.Environment environment;
@ -111,42 +109,16 @@ public abstract class LevelMixin implements WorldBridge, LevelWriter {
@Inject(method = "<init>(Lnet/minecraft/world/level/storage/WritableLevelData;Lnet/minecraft/resources/ResourceKey;Lnet/minecraft/world/level/dimension/DimensionType;Ljava/util/function/Supplier;ZZJ)V", at = @At("RETURN"))
private void arclight$init(WritableLevelData info, ResourceKey<Level> dimension, DimensionType dimType, Supplier<ProfilerFiller> profiler, boolean isRemote, boolean isDebug, long seed, CallbackInfo ci) {
((WorldBorderBridge) this.worldBorder).bridge$setWorld((Level) (Object) this);
this.ticksPerAnimalSpawns = this.getCraftServer().getTicksPerAnimalSpawns();
this.ticksPerMonsterSpawns = this.getCraftServer().getTicksPerMonsterSpawns();
this.ticksPerWaterSpawns = this.getCraftServer().getTicksPerWaterSpawns();
this.ticksPerWaterAmbientSpawns = this.getCraftServer().getTicksPerWaterAmbientSpawns();
this.ticksPerWaterUndergroundCreatureSpawns = this.getCraftServer().getTicksPerWaterUndergroundCreatureSpawns();
this.ticksPerAmbientSpawns = this.getCraftServer().getTicksPerAmbientSpawns();
for (SpawnCategory spawnCategory : SpawnCategory.values()) {
if (CraftSpawnCategory.isValidForLimits(spawnCategory)) {
this.ticksPerSpawnCategory.put(spawnCategory, this.getCraftServer().getTicksPerSpawns(spawnCategory));
}
}
}
@Override
public long bridge$ticksPerAnimalSpawns() {
return ticksPerAnimalSpawns;
}
@Override
public long bridge$ticksPerMonsterSpawns() {
return ticksPerMonsterSpawns;
}
@Override
public long bridge$ticksPerWaterSpawns() {
return ticksPerWaterSpawns;
}
@Override
public long bridge$ticksPerAmbientSpawns() {
return ticksPerAmbientSpawns;
}
@Override
public long bridge$ticksPerWaterAmbientSpawns() {
return ticksPerWaterAmbientSpawns;
}
@Override
public long bridge$ticksPerWaterUndergroundSpawns() {
return ticksPerWaterUndergroundCreatureSpawns;
public Object2LongOpenHashMap<SpawnCategory> bridge$ticksPerSpawnCategory() {
return this.ticksPerSpawnCategory;
}
public abstract ResourceKey<LevelStem> getTypeKey();

View File

@ -14,6 +14,8 @@ import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.storage.LevelData;
import org.bukkit.craftbukkit.v.util.CraftSpawnCategory;
import org.bukkit.entity.SpawnCategory;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
@ -53,40 +55,13 @@ public abstract class WorldEntitySpawnerMixin {
world.getProfiler().push("spawner");
MobCategory[] classifications = SPAWNING_CATEGORIES;
LevelData worldInfo = world.getLevelData();
boolean spawnAnimalThisTick = ((WorldBridge) world).bridge$ticksPerAnimalSpawns() != 0L && worldInfo.getGameTime() % ((WorldBridge) world).bridge$ticksPerAnimalSpawns() == 0L;
boolean spawnMonsterThisTick = ((WorldBridge) world).bridge$ticksPerMonsterSpawns() != 0L && worldInfo.getGameTime() % ((WorldBridge) world).bridge$ticksPerMonsterSpawns() == 0L;
boolean spawnWaterThisTick = ((WorldBridge) world).bridge$ticksPerWaterSpawns() != 0L && worldInfo.getGameTime() % ((WorldBridge) world).bridge$ticksPerWaterSpawns() == 0L;
boolean spawnAmbientThisTick = ((WorldBridge) world).bridge$ticksPerAmbientSpawns() != 0L && worldInfo.getGameTime() % ((WorldBridge) world).bridge$ticksPerAmbientSpawns() == 0L;
boolean spawnWaterAmbientThisTick = ((WorldBridge) world).bridge$ticksPerWaterAmbientSpawns() != 0L && worldInfo.getGameTime() % ((WorldBridge) world).bridge$ticksPerWaterAmbientSpawns() == 0L;
boolean spawnWaterUndergroundThisTick = ((WorldBridge) world).bridge$ticksPerWaterUndergroundSpawns() != 0L && worldInfo.getGameTime() % ((WorldBridge) world).bridge$ticksPerWaterUndergroundSpawns() == 0L;
for (MobCategory classification : classifications) {
boolean spawnThisTick = true;
int limit = classification.getMaxInstancesPerChunk();
switch (classification) {
case MONSTER -> {
spawnThisTick = spawnMonsterThisTick;
limit = ((WorldBridge) world).bridge$getWorld().getMonsterSpawnLimit();
}
case CREATURE -> {
spawnThisTick = spawnAnimalThisTick;
limit = ((WorldBridge) world).bridge$getWorld().getAnimalSpawnLimit();
}
case UNDERGROUND_WATER_CREATURE -> {
spawnThisTick = spawnWaterUndergroundThisTick;
limit = ((WorldBridge) world).bridge$getWorld().getWaterUndergroundCreatureSpawnLimit();
}
case WATER_CREATURE -> {
spawnThisTick = spawnWaterThisTick;
limit = ((WorldBridge) world).bridge$getWorld().getWaterAnimalSpawnLimit();
}
case AMBIENT -> {
spawnThisTick = spawnAmbientThisTick;
limit = ((WorldBridge) world).bridge$getWorld().getAmbientSpawnLimit();
}
case WATER_AMBIENT -> {
spawnThisTick = spawnWaterAmbientThisTick;
limit = ((WorldBridge) world).bridge$getWorld().getWaterAmbientSpawnLimit();
}
SpawnCategory spawnCategory = CraftSpawnCategory.toBukkit(classification);
if (CraftSpawnCategory.isValidForLimits(spawnCategory)) {
spawnThisTick = ((WorldBridge) world).bridge$ticksPerSpawnCategory().getLong(spawnCategory) != 0 && worldInfo.getGameTime() % ((WorldBridge) world).bridge$ticksPerSpawnCategory().getLong(spawnCategory) == 0;
limit = ((WorldBridge) world).bridge$getWorld().getSpawnLimit(spawnCategory);
}
if (spawnThisTick) {
if (limit != 0) {