diff --git a/README.md b/README.md index 66177804..88131617 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ A Bukkit server implementation utilizing Mixin. | Minecraft | Forge | Status | Build | | :----: | :----: | :---: | :---: | | 1.18.x | 38.0.12 | ACTIVE | [![1.18 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-18?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-18) | -| 1.17.x | 37.1.0 | [LEGACY](https://github.com/IzzelAliz/Arclight/releases/tag/1.17/1.0.1) | [![1.17 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-17?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-17) | +| 1.17.x | 37.1.0 | [LEGACY](https://github.com/IzzelAliz/Arclight/releases/tag/1.17/1.0.2) | [![1.17 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-17?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-17) | | 1.16.x | 36.2.19 | ACTIVE | [![1.16 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-16?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-16) | | 1.15.x | 31.2.48 | [LEGACY](https://github.com/IzzelAliz/Arclight/releases/tag/1.15/1.0.19) | [![1.15 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight-15?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight-15) | | 1.14.x | 28.2.0 | [LEGACY](https://github.com/IzzelAliz/Arclight/releases/tag/1.0.6) | [![1.14 Status](https://img.shields.io/appveyor/build/IzzelAliz/arclight?style=flat-square)](https://ci.appveyor.com/project/IzzelAliz/arclight) | diff --git a/arclight-common/bukkit.at b/arclight-common/bukkit.at index bf0f279e..f7406ee3 100644 --- a/arclight-common/bukkit.at +++ b/arclight-common/bukkit.at @@ -27,4 +27,4 @@ public org/bukkit/craftbukkit/v/inventory/CraftMetaTropicalFishBucket/(Lor public org/bukkit/craftbukkit/v/inventory/CraftMetaCrossbow/(Lorg/bukkit/craftbukkit/v/inventory/CraftMetaItem;)V public org/bukkit/craftbukkit/v/inventory/CraftMetaSuspiciousStew/(Lorg/bukkit/craftbukkit/v/inventory/CraftMetaItem;)V public org/spigotmc/ActivationRange$ActivationType/boundingBox -public org/bukkit/craftbukkit/v/inventory/CraftMetaItem/(Lnet/minecraft/nbt/CompoundNBT;)V \ No newline at end of file +public org/bukkit/craftbukkit/v/inventory/CraftMetaItem/(Lnet/minecraft/nbt/CompoundTag;)V \ No newline at end of file diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java index 4d97d97d..c09a38eb 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/network/ServerPlayNetHandlerMixin.java @@ -566,7 +566,7 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB } this.player.move(MoverType.PLAYER, new Vec3(d7, d8, d9)); - this.player.setOnGround(packetplayinflying.isOnGround()); // CraftBukkit - SPIGOT-5810, SPIGOT-5835: reset by this.player.move + this.player.onGround = packetplayinflying.isOnGround(); double d12 = d8; d7 = d0 - this.player.getX(); @@ -634,9 +634,9 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB // CraftBukkit end this.player.getLevel().getChunkSource().move(this.player); this.player.doCheckFallDamage(this.player.getY() - d6, packetplayinflying.isOnGround()); - // this.player.setOnGround(packetplayinflying.b()); // CraftBukkit - moved up + this.player.setOnGround(packetplayinflying.isOnGround()); if (flag) { - this.player.fallDistance = 0.0F; + this.player.resetFallDistance(); } this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java index baf5b43c..bf724fe5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java @@ -22,9 +22,12 @@ import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.Commands; import net.minecraft.core.BlockPos; import net.minecraft.core.RegistryAccess; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.protocol.status.ServerStatus; import net.minecraft.obfuscate.DontObfuscate; +import net.minecraft.resources.RegistryReadOps; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.server.ServerResources; @@ -134,6 +137,7 @@ public abstract class MinecraftServerMixin extends ReentrantBlockableEventLoop registryreadops; private boolean forceTicks; public CraftServer server; public OptionSet options; @@ -172,6 +176,7 @@ public abstract class MinecraftServerMixin extends ReentrantBlockableEventLoop tag) { + if (tag == FluidTags.LAVA) { + lastLavaContact = pos.immutable(); + } + return instance.getFlow(level, pos); + } + + @Redirect(method = "baseTick", at = @At(value = "INVOKE", ordinal = 1, target = "Lnet/minecraft/world/entity/Entity;isInLava()Z")) + private boolean arclight$resetLava(Entity instance) { + var ret = instance.isInLava(); + if (!ret) { + this.lastLavaContact = null; + } + return ret; + } + @Redirect(method = "lavaHurt", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V")) public void arclight$setOnFireFromLava$bukkitEvent(Entity entity, int seconds) { + var damager = (lastLavaContact == null) ? null : CraftBlock.at(level, lastLavaContact); + CraftEventFactory.blockDamage = damager; if ((Object) this instanceof LivingEntity && remainingFireTicks <= 0) { - org.bukkit.block.Block damager = null; // ((WorldServer) this.l).getWorld().getBlockAt(i, j, k); - org.bukkit.entity.Entity damagee = this.getBukkitEntity(); + var damagee = this.getBukkitEntity(); EntityCombustEvent combustEvent = new EntityCombustByBlockEvent(damager, damagee, 15); Bukkit.getPluginManager().callEvent(combustEvent); @@ -387,6 +412,11 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, } } + @Inject(method = "lavaHurt", at = @At("RETURN")) + private void arclight$resetBlockDamage(CallbackInfo ci) { + CraftEventFactory.blockDamage = null; + } + public void setSecondsOnFire(int seconds, boolean callEvent) { if (callEvent) { EntityCombustEvent event = new EntityCombustEvent(this.getBukkitEntity(), seconds); diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/horse/LlamaMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/horse/LlamaMixin.java new file mode 100644 index 00000000..27b745c0 --- /dev/null +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/animal/horse/LlamaMixin.java @@ -0,0 +1,17 @@ +package io.izzel.arclight.common.mixin.core.world.entity.animal.horse; + +import net.minecraft.world.entity.animal.horse.Llama; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(Llama.class) +public abstract class LlamaMixin { + + // @formatter:off + @Shadow private void setStrength(int p_30841_) {} + // @formatter:on + + public void setStrengthPublic(int i) { + this.setStrength(i); + } +} diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java index 1cb16315..262d58d5 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java @@ -162,6 +162,7 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla @Shadow public abstract void setLevel(ServerLevel p_143426_); @Shadow(remap = false) private boolean hasTabListName; @Shadow(remap = false) private Component tabListDisplayName; + @Shadow public abstract void resetFallDistance(); // @formatter:on public String displayName; @@ -919,7 +920,7 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla this.setHealth(this.getMaxHealth()); this.stopUsingItem(); this.remainingFireTicks = 0; - this.fallDistance = 0.0f; + this.resetFallDistance(); this.foodData = new FoodData(); ((FoodStatsBridge) this.foodData).bridge$setEntityHuman((ServerPlayer) (Object) this); this.experienceLevel = this.newLevel; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/ChunkAccessMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/ChunkAccessMixin.java index 188c5ca7..439b1356 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/ChunkAccessMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/ChunkAccessMixin.java @@ -20,8 +20,8 @@ import net.minecraft.world.level.chunk.FeatureAccess; import net.minecraft.world.level.chunk.LevelChunkSection; import net.minecraft.world.level.chunk.UpgradeData; import net.minecraft.world.level.levelgen.blending.BlendingData; -import org.bukkit.craftbukkit.v.persistence.CraftPersistentDataContainer; import org.bukkit.craftbukkit.v.persistence.CraftPersistentDataTypeRegistry; +import org.bukkit.craftbukkit.v.persistence.DirtyCraftPersistentDataContainer; import org.bukkit.persistence.PersistentDataContainer; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -29,6 +29,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.util.Map; @@ -47,13 +48,24 @@ public abstract class ChunkAccessMixin implements BlockGetter, BiomeManager.Nois private static final CraftPersistentDataTypeRegistry DATA_TYPE_REGISTRY = new CraftPersistentDataTypeRegistry(); - public CraftPersistentDataContainer persistentDataContainer = new CraftPersistentDataContainer(DATA_TYPE_REGISTRY); + public DirtyCraftPersistentDataContainer persistentDataContainer = new DirtyCraftPersistentDataContainer(DATA_TYPE_REGISTRY); public Registry biomeRegistry; @Inject(method = "", at = @At("RETURN")) private void arclight$init(ChunkPos p_187621_, UpgradeData p_187622_, LevelHeightAccessor p_187623_, Registry registry, long p_187625_, LevelChunkSection[] p_187626_, BlendingData p_187627_, CallbackInfo ci) { this.biomeRegistry = registry; - this.persistentDataContainer.setCallback(() -> this.setUnsaved(true)); + } + + @Inject(method = "setUnsaved", at = @At("HEAD")) + private void arclight$dirty(boolean flag, CallbackInfo ci) { + if (!flag) { + this.persistentDataContainer.dirty(false); + } + } + + @Inject(method = "isUnsaved", cancellable = true, at = @At("RETURN")) + private void arclight$isDirty(CallbackInfoReturnable cir) { + cir.setReturnValue(cir.getReturnValueZ() || this.persistentDataContainer.dirty()); } @Override diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java index 3db006bc..abae4d8e 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/level/chunk/LevelChunkMixin.java @@ -19,6 +19,7 @@ import net.minecraft.world.ticks.LevelChunkTicks; import org.bukkit.Bukkit; import org.bukkit.craftbukkit.v.CraftChunk; import org.bukkit.craftbukkit.v.persistence.CraftPersistentDataContainer; +import org.bukkit.craftbukkit.v.persistence.DirtyCraftPersistentDataContainer; import org.bukkit.event.world.ChunkLoadEvent; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -53,7 +54,7 @@ public abstract class LevelChunkMixin extends ChunkAccessMixin implements ChunkB @Inject(method = "(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/level/chunk/ProtoChunk;Lnet/minecraft/world/level/chunk/LevelChunk$PostLoadProcessor;)V", at = @At("RETURN")) private void arclight$init(ServerLevel p_196850_, ProtoChunk protoChunk, @Nullable LevelChunk.PostLoadProcessor p_196852_, CallbackInfo ci) { this.needsDecoration = true; - this.persistentDataContainer = (CraftPersistentDataContainer) ((ChunkAccessBridge) protoChunk).bridge$getPersistentDataContainer(); + this.persistentDataContainer = (DirtyCraftPersistentDataContainer) ((ChunkAccessBridge) protoChunk).bridge$getPersistentDataContainer(); } @Inject(method = "removeBlockEntity", at = @At(value = "INVOKE_ASSIGN", remap = false, target = "Ljava/util/Map;remove(Ljava/lang/Object;)Ljava/lang/Object;")) diff --git a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg index bd95130f..4e1e73e6 100644 --- a/arclight-common/src/main/resources/META-INF/accesstransformer.cfg +++ b/arclight-common/src/main/resources/META-INF/accesstransformer.cfg @@ -1,5 +1,7 @@ # Arclight 1.18 public net.minecraft.server.level.PlayerRespawnLogic m_183928_(Lnet/minecraft/server/level/ServerLevel;II)Lnet/minecraft/core/BlockPos; +public net.minecraft.world.entity.npc.Villager m_35524_()V # releaseAllPois +public net.minecraft.world.entity.Entity f_19861_ # onGround # Arclight 1.17 public net.minecraft.world.entity.Entity f_19851_ public net.minecraft.world.entity.raid.Raider$HoldGroundAttackGoal @@ -268,7 +270,6 @@ public net.minecraft.world.entity.player.Player m_6101_()I public net.minecraft.world.entity.player.Player m_36364_(Lnet/minecraft/nbt/CompoundTag;)V public net.minecraft.world.entity.player.Player m_36362_(Lnet/minecraft/nbt/CompoundTag;)V public net.minecraft.world.entity.player.Player m_6915_()V -public net.minecraft.world.entity.animal.horse.Llama m_30840_(I)V public net.minecraft.server.level.Ticket f_9422_ public net.minecraft.server.level.Ticket m_9429_(J)V public net.minecraft.server.level.Ticket (Lnet/minecraft/server/level/TicketType;ILjava/lang/Object;)V diff --git a/arclight-common/src/main/resources/mixins.arclight.core.json b/arclight-common/src/main/resources/mixins.arclight.core.json index aa8cfbe2..d79160ba 100644 --- a/arclight-common/src/main/resources/mixins.arclight.core.json +++ b/arclight-common/src/main/resources/mixins.arclight.core.json @@ -74,10 +74,10 @@ "server.management.ServerPlayerGameModeMixin", "server.management.UserListMixin", "stats.StatisticsCounterMixin", + "world.BlockGetterMixin", "world.CompoundContainerMixin", "world.ContainerMixin", "world.ExplosionMixin", - "world.BlockGetterMixin", "world.IServerWorldMixin", "world.IWorldMixin", "world.IWorldWriterMixin", @@ -151,6 +151,7 @@ "world.entity.animal.TurtleMixin", "world.entity.animal.WolfMixin", "world.entity.animal.horse.AbstractHorseMixin", + "world.entity.animal.horse.LlamaMixin", "world.entity.animal.horse.TraderLlamaEntity_FollowTraderGoalMixin", "world.entity.boss.enderdragon.EnderCrystalMixin", "world.entity.boss.enderdragon.EnderDragonMixin", @@ -430,8 +431,8 @@ "world.level.entity.PersistentEntitySectionManagerMixin", "world.level.levelgen.ChunkGeneratorMixin", "world.level.portal.PortalForcerMixin", - "world.level.saveddata.maps.MapItemSavedData_HoldingPlayerMixin", "world.level.saveddata.maps.MapDataMixin", + "world.level.saveddata.maps.MapItemSavedData_HoldingPlayerMixin", "world.level.storage.loot.LootTableManagerMixin", "world.level.storage.loot.LootTableMixin", "world.level.storage.loot.entries.LootEntry_SerializerMixin",