Update upstream
This commit is contained in:
parent
cb35340211
commit
0adff5f573
|
@ -21,7 +21,8 @@ public class SWorldBorderPacketMixin {
|
||||||
|
|
||||||
@Inject(method = "<init>(Lnet/minecraft/world/level/border/WorldBorder;)V", at = @At("RETURN"))
|
@Inject(method = "<init>(Lnet/minecraft/world/level/border/WorldBorder;)V", at = @At("RETURN"))
|
||||||
private void arclight$nether(WorldBorder border, CallbackInfo ci) {
|
private void arclight$nether(WorldBorder border, CallbackInfo ci) {
|
||||||
this.newCenterX = border.getCenterX() * (((WorldBorderBridge) border).bridge$getWorld().dimensionType().coordinateScale());
|
var level = ((WorldBorderBridge) border).bridge$getWorld();
|
||||||
this.newCenterZ = border.getCenterZ() * (((WorldBorderBridge) border).bridge$getWorld().dimensionType().coordinateScale());
|
this.newCenterX = border.getCenterX() * (level != null ? level.dimensionType().coordinateScale() : 1.0);
|
||||||
|
this.newCenterZ = border.getCenterZ() * (level != null ? level.dimensionType().coordinateScale() : 1.0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package io.izzel.arclight.common.mixin.core.world.entity.item;
|
package io.izzel.arclight.common.mixin.core.world.entity.item;
|
||||||
|
|
||||||
|
import io.izzel.arclight.common.bridge.core.world.WorldBridge;
|
||||||
import io.izzel.arclight.common.mixin.core.world.entity.EntityMixin;
|
import io.izzel.arclight.common.mixin.core.world.entity.EntityMixin;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.world.damagesource.DamageSource;
|
import net.minecraft.world.damagesource.DamageSource;
|
||||||
|
@ -8,6 +9,7 @@ import net.minecraft.world.level.Level;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.state.BlockState;
|
import net.minecraft.world.level.block.state.BlockState;
|
||||||
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
||||||
|
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
@ -19,7 +21,10 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
|
||||||
@Mixin(FallingBlockEntity.class)
|
@Mixin(FallingBlockEntity.class)
|
||||||
public abstract class FallingBlockEntityMixin extends EntityMixin {
|
public abstract class FallingBlockEntityMixin extends EntityMixin {
|
||||||
|
|
||||||
|
// @formatter:off
|
||||||
@Shadow private BlockState blockState;
|
@Shadow private BlockState blockState;
|
||||||
|
@Shadow public static FallingBlockEntity fall(Level p_201972_, BlockPos p_201973_, BlockState p_201974_) { return null; }
|
||||||
|
// @formatter:on
|
||||||
|
|
||||||
@Inject(method = "tick", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z"))
|
@Inject(method = "tick", cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD, at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/Level;setBlock(Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;I)Z"))
|
||||||
private void arclight$entityChangeBlock(CallbackInfo ci, Block block, BlockPos pos) {
|
private void arclight$entityChangeBlock(CallbackInfo ci, Block block, BlockPos pos) {
|
||||||
|
@ -44,4 +49,9 @@ public abstract class FallingBlockEntityMixin extends EntityMixin {
|
||||||
cir.setReturnValue(entity);
|
cir.setReturnValue(entity);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static FallingBlockEntity fall(Level level, BlockPos pos, BlockState state, CreatureSpawnEvent.SpawnReason spawnReason) {
|
||||||
|
((WorldBridge) level).bridge$pushAddEntityReason(spawnReason);
|
||||||
|
return fall(level, pos, state);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,9 @@ import io.izzel.arclight.common.bridge.core.entity.MobEntityBridge;
|
||||||
import io.izzel.arclight.common.bridge.core.world.WorldBridge;
|
import io.izzel.arclight.common.bridge.core.world.WorldBridge;
|
||||||
import io.izzel.arclight.common.mixin.core.world.entity.PathfinderMobMixin;
|
import io.izzel.arclight.common.mixin.core.world.entity.PathfinderMobMixin;
|
||||||
import io.izzel.arclight.mixin.Eject;
|
import io.izzel.arclight.mixin.Eject;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.nbt.NbtOps;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.world.DifficultyInstance;
|
import net.minecraft.world.DifficultyInstance;
|
||||||
import net.minecraft.world.damagesource.DamageSource;
|
import net.minecraft.world.damagesource.DamageSource;
|
||||||
|
@ -15,6 +17,7 @@ import net.minecraft.world.entity.LivingEntity;
|
||||||
import net.minecraft.world.entity.Mob;
|
import net.minecraft.world.entity.Mob;
|
||||||
import net.minecraft.world.entity.MobSpawnType;
|
import net.minecraft.world.entity.MobSpawnType;
|
||||||
import net.minecraft.world.entity.SpawnGroupData;
|
import net.minecraft.world.entity.SpawnGroupData;
|
||||||
|
import net.minecraft.world.entity.monster.ZombieVillager;
|
||||||
import net.minecraft.world.entity.npc.Villager;
|
import net.minecraft.world.entity.npc.Villager;
|
||||||
import net.minecraft.world.level.ServerLevelAccessor;
|
import net.minecraft.world.level.ServerLevelAccessor;
|
||||||
import net.minecraftforge.event.entity.living.ZombieEvent;
|
import net.minecraftforge.event.entity.living.ZombieEvent;
|
||||||
|
@ -80,4 +83,23 @@ public abstract class ZombieMixin extends PathfinderMobMixin {
|
||||||
private void arclight$mount(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, SpawnGroupData spawnDataIn, CompoundTag dataTag, CallbackInfoReturnable<SpawnGroupData> cir) {
|
private void arclight$mount(ServerLevelAccessor worldIn, DifficultyInstance difficultyIn, MobSpawnType reason, SpawnGroupData spawnDataIn, CompoundTag dataTag, CallbackInfoReturnable<SpawnGroupData> cir) {
|
||||||
((WorldBridge) worldIn.getLevel()).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.MOUNT);
|
((WorldBridge) worldIn.getLevel()).bridge$pushAddEntityReason(CreatureSpawnEvent.SpawnReason.MOUNT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ZombieVillager zombifyVillager(ServerLevel level, Villager villager, BlockPos blockPosition, boolean silent, CreatureSpawnEvent.SpawnReason spawnReason) {
|
||||||
|
((WorldBridge) villager.level).bridge$pushAddEntityReason(spawnReason);
|
||||||
|
((MobEntityBridge) villager).bridge$pushTransformReason(EntityTransformEvent.TransformReason.INFECTION);
|
||||||
|
ZombieVillager zombieVillager = villager.convertTo(EntityType.ZOMBIE_VILLAGER, false);
|
||||||
|
if (zombieVillager != null) {
|
||||||
|
zombieVillager.finalizeSpawn(level, level.getCurrentDifficultyAt(zombieVillager.blockPosition()), MobSpawnType.CONVERSION, new net.minecraft.world.entity.monster.Zombie.ZombieGroupData(false, true), null);
|
||||||
|
zombieVillager.setVillagerData(villager.getVillagerData());
|
||||||
|
zombieVillager.setGossips(villager.getGossips().store(NbtOps.INSTANCE).getValue());
|
||||||
|
zombieVillager.setTradeOffers(villager.getOffers().createTag());
|
||||||
|
zombieVillager.setVillagerXp(villager.getVillagerXp());
|
||||||
|
net.minecraftforge.event.ForgeEventFactory.onLivingConvert(villager, zombieVillager);
|
||||||
|
if (!silent) {
|
||||||
|
level.levelEvent(null, 1026, blockPosition, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return zombieVillager;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,12 +80,12 @@ import net.minecraftforge.common.ForgeHooks;
|
||||||
import net.minecraftforge.common.util.ITeleporter;
|
import net.minecraftforge.common.util.ITeleporter;
|
||||||
import net.minecraftforge.event.ForgeEventFactory;
|
import net.minecraftforge.event.ForgeEventFactory;
|
||||||
import net.minecraftforge.server.ServerLifecycleHooks;
|
import net.minecraftforge.server.ServerLifecycleHooks;
|
||||||
import org.slf4j.Logger;
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.WeatherType;
|
import org.bukkit.WeatherType;
|
||||||
import org.bukkit.craftbukkit.v.CraftServer;
|
import org.bukkit.craftbukkit.v.CraftServer;
|
||||||
import org.bukkit.craftbukkit.v.CraftWorld;
|
import org.bukkit.craftbukkit.v.CraftWorld;
|
||||||
|
import org.bukkit.craftbukkit.v.CraftWorldBorder;
|
||||||
import org.bukkit.craftbukkit.v.block.CraftBlock;
|
import org.bukkit.craftbukkit.v.block.CraftBlock;
|
||||||
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
|
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
|
||||||
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
|
||||||
|
@ -102,6 +102,7 @@ import org.bukkit.event.player.PlayerLocaleChangeEvent;
|
||||||
import org.bukkit.event.player.PlayerPortalEvent;
|
import org.bukkit.event.player.PlayerPortalEvent;
|
||||||
import org.bukkit.event.player.PlayerTeleportEvent;
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
import org.bukkit.inventory.MainHand;
|
import org.bukkit.inventory.MainHand;
|
||||||
|
import org.slf4j.Logger;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Overwrite;
|
import org.spongepowered.asm.mixin.Overwrite;
|
||||||
|
@ -304,6 +305,9 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla
|
||||||
CraftEventFactory.callPlayerLevelChangeEvent(this.getBukkitEntity(), this.oldLevel, this.experienceLevel);
|
CraftEventFactory.callPlayerLevelChangeEvent(this.getBukkitEntity(), this.oldLevel, this.experienceLevel);
|
||||||
this.oldLevel = this.experienceLevel;
|
this.oldLevel = this.experienceLevel;
|
||||||
}
|
}
|
||||||
|
if (this.getBukkitEntity().hasClientWorldBorder()) {
|
||||||
|
((CraftWorldBorder) this.getBukkitEntity().getWorldBorder()).getHandle().tick();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -49,8 +49,9 @@ public abstract class FoodDataMixin implements FoodStatsBridge {
|
||||||
this.entityhuman = playerEntity;
|
this.entityhuman = playerEntity;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Redirect(method = "eat(Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/LivingEntity;)V", at = @At(value = "INVOKE", remap = false, target = "Lnet/minecraft/world/food/FoodData;eat(IF)V"))
|
@Redirect(method = "eat(Lnet/minecraft/world/item/Item;Lnet/minecraft/world/item/ItemStack;Lnet/minecraft/world/entity/LivingEntity;)V", remap = false,
|
||||||
public void arclight$foodLevelChange(FoodData foodStats, int foodLevelIn, float foodSaturationModifier, Item maybeFood, ItemStack stack, @Nullable LivingEntity entity) {
|
at = @At(value = "INVOKE", remap = true, target = "Lnet/minecraft/world/food/FoodData;eat(IF)V"))
|
||||||
|
private void arclight$foodLevelChange(FoodData foodStats, int foodLevelIn, float foodSaturationModifier, Item maybeFood, ItemStack stack, @Nullable LivingEntity entity) {
|
||||||
var player = this.entityhuman != null ? this.entityhuman : (entity instanceof Player p ? p : null);
|
var player = this.entityhuman != null ? this.entityhuman : (entity instanceof Player p ? p : null);
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
foodStats.eat(foodLevelIn, foodSaturationModifier);
|
foodStats.eat(foodLevelIn, foodSaturationModifier);
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
package io.izzel.arclight.common.mixin.optimization.general;
|
||||||
|
|
||||||
|
import net.minecraft.resources.ResourceKey;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
|
@Mixin(ResourceKey.class)
|
||||||
|
public class ResourceKeyMixin_Optimize {
|
||||||
|
|
||||||
|
@Redirect(method = "<clinit>", at = @At(value = "INVOKE", remap = false, target = "Ljava/util/Collections;synchronizedMap(Ljava/util/Map;)Ljava/util/Map;"))
|
||||||
|
private static <K, V> Map<K, V> arclight$useHashMap(Map<K, V> m) {
|
||||||
|
return new ConcurrentHashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Redirect(method = "create(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/resources/ResourceLocation;)Lnet/minecraft/resources/ResourceKey;",
|
||||||
|
at = @At(value = "INVOKE", remap = false, target = "Ljava/lang/String;intern()Ljava/lang/String;"))
|
||||||
|
private static String arclight$dropIntern(String instance) {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,28 +0,0 @@
|
||||||
package io.izzel.arclight.common.mixin.optimization.general;
|
|
||||||
|
|
||||||
import net.minecraft.Util;
|
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
|
||||||
import org.spongepowered.asm.mixin.Overwrite;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.CompletableFuture;
|
|
||||||
|
|
||||||
@Mixin(Util.class)
|
|
||||||
public class UtilMixin_Optimize {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author IzzelAliz
|
|
||||||
* @reason original method allocates tons of garbage
|
|
||||||
*/
|
|
||||||
@Overwrite
|
|
||||||
public static <V> CompletableFuture<List<V>> sequence(List<? extends CompletableFuture<V>> futures) {
|
|
||||||
if (futures.isEmpty()) {
|
|
||||||
return CompletableFuture.completedFuture(List.of());
|
|
||||||
} else if (futures.size() == 1) {
|
|
||||||
return futures.get(0).thenApply(List::of);
|
|
||||||
} else {
|
|
||||||
return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]))
|
|
||||||
.thenApply(it -> futures.stream().map(CompletableFuture::join).toList());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -89,6 +89,20 @@ public class ArclightMixinPlugin implements IMixinConfigPlugin {
|
||||||
new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "reload", "(Lnet/minecraft/server/MinecraftServer;)V", null, null)
|
new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "reload", "(Lnet/minecraft/server/MinecraftServer;)V", null, null)
|
||||||
)
|
)
|
||||||
))
|
))
|
||||||
|
.put("net.minecraft.world.entity.monster.Zombie",
|
||||||
|
Map.entry(
|
||||||
|
List.of(),
|
||||||
|
List.of(
|
||||||
|
new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "zombifyVillager", "(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/npc/Villager;Lnet/minecraft/core/BlockPos;ZLorg/bukkit/event/entity/CreatureSpawnEvent$SpawnReason;)Lnet/minecraft/world/entity/monster/ZombieVillager;", null, null)
|
||||||
|
)
|
||||||
|
))
|
||||||
|
.put("net.minecraft.world.entity.item.FallingBlockEntity",
|
||||||
|
Map.entry(
|
||||||
|
List.of(),
|
||||||
|
List.of(
|
||||||
|
new MethodNode(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "fall", "(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;Lnet/minecraft/world/level/block/state/BlockState;Lorg/bukkit/event/entity/CreatureSpawnEvent$SpawnReason;)Lnet/minecraft/world/entity/item/FallingBlockEntity;", null, null)
|
||||||
|
)
|
||||||
|
))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
// damn spigot
|
// damn spigot
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
"EntityDataManagerMixin_Optimize",
|
"EntityDataManagerMixin_Optimize",
|
||||||
"GoalMixin",
|
"GoalMixin",
|
||||||
"MobMixin_Optimization",
|
"MobMixin_Optimization",
|
||||||
"UtilMixin_Optimize",
|
"ResourceKeyMixin_Optimize",
|
||||||
"VoxelShapesMixin",
|
"VoxelShapesMixin",
|
||||||
"activationrange.ActivationRangeMixin",
|
"activationrange.ActivationRangeMixin",
|
||||||
"activationrange.EntityMixin_ActivationRange",
|
"activationrange.EntityMixin_ActivationRange",
|
||||||
|
|
Loading…
Reference in New Issue
Block a user