Update upstream

We have again predicted what upstream will do and delete all related patch
This commit is contained in:
IzzelAliz 2023-08-17 23:11:45 +08:00
parent 196bf7034d
commit 6562f3289e
17 changed files with 180 additions and 262 deletions

View File

@ -4,14 +4,11 @@ import io.izzel.arclight.common.mod.server.entity.ArclightFakePlayer;
import io.izzel.arclight.common.mod.server.entity.ArclightModChestedHorse;
import io.izzel.arclight.common.mod.server.entity.ArclightModEntity;
import io.izzel.arclight.common.mod.server.entity.ArclightModHorse;
import io.izzel.arclight.common.mod.server.entity.ArclightModLivingEntity;
import io.izzel.arclight.common.mod.server.entity.ArclightModMinecart;
import io.izzel.arclight.common.mod.server.entity.ArclightModMinecartContainer;
import io.izzel.arclight.common.mod.server.entity.ArclightModMob;
import io.izzel.arclight.common.mod.server.entity.ArclightModProjectile;
import io.izzel.arclight.common.mod.server.entity.ArclightModRaider;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.AgeableMob;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.FlyingMob;
@ -26,15 +23,13 @@ import net.minecraft.world.entity.raid.Raider;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraft.world.entity.vehicle.AbstractMinecartContainer;
import net.minecraftforge.common.util.FakePlayer;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftAgeable;
import org.bukkit.craftbukkit.v.entity.CraftEntity;
import org.bukkit.craftbukkit.v.entity.CraftFlying;
import org.bukkit.craftbukkit.v.entity.CraftGolem;
import org.bukkit.craftbukkit.v.entity.CraftLivingEntity;
import org.bukkit.craftbukkit.v.entity.CraftTameableAnimal;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
@ -42,31 +37,12 @@ import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Locale;
import java.util.Objects;
@Mixin(value = CraftEntity.class, remap = false)
public abstract class CraftEntityMixin implements org.bukkit.entity.Entity {
@Shadow protected Entity entity;
@Shadow @Final protected CraftServer server;
private EntityType arclight$type;
@Override
public @NotNull EntityType getType() {
if (this.arclight$type == null) {
ResourceLocation location = ForgeRegistries.ENTITY_TYPES.getKey(entity.getType());
if (location == null) throw new IllegalArgumentException("Unregistered entity type " + entity.getType());
if (location.getNamespace().equals("minecraft")) {
this.arclight$type = Objects.requireNonNull(EntityType.fromName(location.getPath().toUpperCase(Locale.ROOT)));
} else {
this.arclight$type = EntityType.valueOf(ResourceLocationUtil.standardize(location));
}
}
return this.arclight$type;
}
@Inject(method = "getEntity", cancellable = true, at = @At("HEAD"))
private static void arclight$fakePlayer(CraftServer server, Entity entity, CallbackInfoReturnable<CraftEntity> cir) {
if (entity instanceof FakePlayer) {
@ -109,7 +85,7 @@ public abstract class CraftEntityMixin implements org.bukkit.entity.Entity {
cir.setReturnValue(new ArclightModMob(server, (Mob) entity));
return;
}
cir.setReturnValue(new ArclightModLivingEntity(server, (LivingEntity) entity));
cir.setReturnValue(new CraftLivingEntity(server, (LivingEntity) entity));
return;
}
if (entity instanceof AbstractMinecart) {

View File

@ -11,6 +11,7 @@ import io.izzel.arclight.common.bridge.core.network.play.TimestampedPacket;
import io.izzel.arclight.common.bridge.core.server.MinecraftServerBridge;
import io.izzel.arclight.common.bridge.core.server.management.PlayerInteractionManagerBridge;
import io.izzel.arclight.common.bridge.core.server.management.PlayerListBridge;
import io.izzel.arclight.common.bridge.core.world.WorldBridge;
import io.izzel.arclight.common.mod.ArclightConstants;
import io.izzel.arclight.common.mod.server.ArclightServer;
import io.izzel.arclight.common.mod.util.ArclightCaptures;
@ -26,10 +27,49 @@ import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.StringTag;
import net.minecraft.network.Connection;
import net.minecraft.network.PacketSendListener;
import net.minecraft.network.chat.*;
import net.minecraft.network.chat.ChatType;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.LastSeenMessages;
import net.minecraft.network.chat.OutgoingChatMessage;
import net.minecraft.network.chat.PlayerChatMessage;
import net.minecraft.network.chat.SignableCommand;
import net.minecraft.network.chat.SignedMessageChain;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.PacketUtils;
import net.minecraft.network.protocol.game.*;
import net.minecraft.network.protocol.game.ClientboundAddEntityPacket;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
import net.minecraft.network.protocol.game.ClientboundDisconnectPacket;
import net.minecraft.network.protocol.game.ClientboundMoveVehiclePacket;
import net.minecraft.network.protocol.game.ClientboundPlayerPositionPacket;
import net.minecraft.network.protocol.game.ClientboundSetCarriedItemPacket;
import net.minecraft.network.protocol.game.ClientboundSetDefaultSpawnPositionPacket;
import net.minecraft.network.protocol.game.ClientboundSetEntityLinkPacket;
import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
import net.minecraft.network.protocol.game.ClientboundSystemChatPacket;
import net.minecraft.network.protocol.game.ServerboundAcceptTeleportationPacket;
import net.minecraft.network.protocol.game.ServerboundChatCommandPacket;
import net.minecraft.network.protocol.game.ServerboundChatPacket;
import net.minecraft.network.protocol.game.ServerboundContainerButtonClickPacket;
import net.minecraft.network.protocol.game.ServerboundContainerClickPacket;
import net.minecraft.network.protocol.game.ServerboundContainerClosePacket;
import net.minecraft.network.protocol.game.ServerboundCustomPayloadPacket;
import net.minecraft.network.protocol.game.ServerboundEditBookPacket;
import net.minecraft.network.protocol.game.ServerboundInteractPacket;
import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket;
import net.minecraft.network.protocol.game.ServerboundMoveVehiclePacket;
import net.minecraft.network.protocol.game.ServerboundPlaceRecipePacket;
import net.minecraft.network.protocol.game.ServerboundPlayerAbilitiesPacket;
import net.minecraft.network.protocol.game.ServerboundPlayerActionPacket;
import net.minecraft.network.protocol.game.ServerboundPlayerCommandPacket;
import net.minecraft.network.protocol.game.ServerboundResourcePackPacket;
import net.minecraft.network.protocol.game.ServerboundSelectTradePacket;
import net.minecraft.network.protocol.game.ServerboundSetCarriedItemPacket;
import net.minecraft.network.protocol.game.ServerboundSetCreativeModeSlotPacket;
import net.minecraft.network.protocol.game.ServerboundSignUpdatePacket;
import net.minecraft.network.protocol.game.ServerboundSwingPacket;
import net.minecraft.network.protocol.game.ServerboundTeleportToEntityPacket;
import net.minecraft.network.protocol.game.ServerboundUseItemOnPacket;
import net.minecraft.network.protocol.game.ServerboundUseItemPacket;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerLevel;
@ -43,7 +83,12 @@ import net.minecraft.util.StringUtil;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.*;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.ExperienceOrb;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.RelativeMovement;
import net.minecraft.world.entity.animal.Bucketable;
import net.minecraft.world.entity.animal.allay.Allay;
import net.minecraft.world.entity.item.ItemEntity;
@ -72,25 +117,53 @@ import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftEntity;
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
import org.bukkit.craftbukkit.v.inventory.CraftItemStack;
import org.bukkit.craftbukkit.v.util.CraftChatMessage;
import org.bukkit.craftbukkit.v.util.CraftMagicNumbers;
import org.bukkit.craftbukkit.v.util.CraftNamespacedKey;
import org.bukkit.craftbukkit.v.util.LazyPlayerSet;
import org.bukkit.craftbukkit.v.util.Waitable;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.*;
import org.bukkit.event.player.*;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.CraftItemEvent;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCreativeEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.inventory.SmithItemEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerAnimationEvent;
import org.bukkit.event.player.PlayerAnimationType;
import org.bukkit.event.player.PlayerChatEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerResourcePackStatusEvent;
import org.bukkit.event.player.PlayerSwapHandItemsEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.player.PlayerToggleFlightEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.event.player.PlayerToggleSprintEvent;
import org.bukkit.inventory.CraftingInventory;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.SmithingInventory;
import org.slf4j.Logger;
import org.spigotmc.SpigotConfig;
import org.spongepowered.asm.mixin.*;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.Overwrite;
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.Redirect;
@ -101,7 +174,12 @@ import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.function.UnaryOperator;
@ -398,8 +476,8 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
}
@Inject(method = "handleAcceptTeleportPacket",
at = @At(value = "FIELD", shift = At.Shift.AFTER, target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;awaitingPositionFromClient:Lnet/minecraft/world/phys/Vec3;"),
slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;isChangingDimension()Z")))
at = @At(value = "FIELD", shift = At.Shift.AFTER, target = "Lnet/minecraft/server/network/ServerGamePacketListenerImpl;awaitingPositionFromClient:Lnet/minecraft/world/phys/Vec3;"),
slice = @Slice(from = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;isChangingDimension()Z")))
private void arclight$updateLoc(ServerboundAcceptTeleportationPacket packetIn, CallbackInfo ci) {
if (((ServerPlayerEntityBridge) this.player).bridge$isValid()) {
this.player.serverLevel().getChunkSource().move(this.player);
@ -996,7 +1074,6 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
}
}
// TODO ChatType.RAW
public void chat(String s, PlayerChatMessage original, boolean async) {
if (s.isEmpty() || this.player.getChatVisibility() == ChatVisiblity.HIDDEN) {
return;
@ -1026,9 +1103,6 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
if (!org.spigotmc.SpigotConfig.bungee && originalFormat.equals(queueEvent.getFormat()) && originalMessage.equals(queueEvent.getMessage()) && queueEvent.getPlayer().getName().equalsIgnoreCase(queueEvent.getPlayer().getDisplayName())) { // Spigot
server.getPlayerList().broadcastChatMessage(original, player, ChatType.bind(ChatType.CHAT, player));
return null;
} else if (!org.spigotmc.SpigotConfig.bungee && CraftChatMessage.fromComponent(original.decoratedContent()).equals(message)) { // Spigot
// TODO server.getPlayerList().broadcastChatMessage(original, player, ChatType.bind(ChatType.RAW, player));
return null;
}
for (ServerPlayer recipient : server.getPlayerList().players) {
((ServerPlayerEntityBridge) recipient).bridge$getBukkitEntity().sendMessage(player.getUUID(), message);
@ -1067,9 +1141,6 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
if (!org.spigotmc.SpigotConfig.bungee && originalFormat.equals(event.getFormat()) && originalMessage.equals(event.getMessage()) && event.getPlayer().getName().equalsIgnoreCase(event.getPlayer().getDisplayName())) { // Spigot
server.getPlayerList().broadcastChatMessage(original, player, ChatType.bind(ChatType.CHAT, player));
return;
} else if (!org.spigotmc.SpigotConfig.bungee && CraftChatMessage.fromComponent(original.decoratedContent()).equals(s)) { // Spigot
// TODO server.getPlayerList().broadcastChatMessage(original, player, ChatType.bind(ChatType.RAW, player));
return;
}
for (ServerPlayer recipient : server.getPlayerList().players) {
@ -1139,17 +1210,13 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
double d0 = this.player.getX();
double d2 = this.player.getY() + this.player.getEyeHeight();
double d3 = this.player.getZ();
Vec3 vec3d = new Vec3(d0, d2, d3);
float f3 = Mth.cos(-f2 * 0.017453292f - 3.1415927f);
float f4 = Mth.sin(-f2 * 0.017453292f - 3.1415927f);
float f5 = -Mth.cos(-f1 * 0.017453292f);
float f6 = Mth.sin(-f1 * 0.017453292f);
float f7 = f4 * f5;
float f8 = f3 * f5;
double d4 = this.player.getBlockReach();
Vec3 vec3d2 = vec3d.add(f7 * d4, f6 * d4, f8 * d4);
HitResult result = this.player.level().clip(new ClipContext(vec3d, vec3d2, ClipContext.Block.OUTLINE, ClipContext.Fluid.NONE, this.player));
if (result == null || result.getType() != HitResult.Type.BLOCK) {
var origin = new Location(((WorldBridge) this.player.level()).bridge$getWorld(), d0, d2, d3, f1, f2);
var result = ((WorldBridge) this.player.level()).bridge$getWorld().rayTrace(origin, origin.getDirection(), d4, org.bukkit.FluidCollisionMode.NEVER, false, 0.1, entity -> {
Entity handle = ((CraftEntity) entity).getHandle();
return handle != this.player && ((ServerPlayerEntityBridge) this.player).bridge$getBukkitEntity().canSee(entity) && !handle.isSpectator() && handle.isPickable() && !handle.isPassengerOfSameVehicle(player);
});
if (result == null) {
CraftEventFactory.callPlayerInteractEvent(this.player, Action.LEFT_CLICK_AIR, this.player.getInventory().getSelected(), InteractionHand.MAIN_HAND);
}
PlayerAnimationEvent event = new PlayerAnimationEvent(this.getCraftPlayer(), packet.getHand() == InteractionHand.MAIN_HAND ? PlayerAnimationType.ARM_SWING : PlayerAnimationType.OFF_ARM_SWING);
@ -1262,19 +1329,19 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
@Override
public void onInteraction(InteractionHand hand) {
this.performInteraction(hand, net.minecraft.world.entity.player.Player::interactOn,
new PlayerInteractEntityEvent(getCraftPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(),
(hand == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND));
new PlayerInteractEntityEvent(getCraftPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(),
(hand == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND));
}
@Override
public void onInteraction(InteractionHand hand, Vec3 vec) {
this.performInteraction(hand, (player, e, h) -> {
var onInteractEntityAtResult = ForgeHooks.onInteractEntityAt(player, entity, vec, hand);
if (onInteractEntityAtResult != null) return onInteractEntityAtResult;
return e.interactAt(player, vec, h);
},
new PlayerInteractAtEntityEvent(getCraftPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(),
new org.bukkit.util.Vector(vec.x, vec.y, vec.z), (hand == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND));
var onInteractEntityAtResult = ForgeHooks.onInteractEntityAt(player, entity, vec, hand);
if (onInteractEntityAtResult != null) return onInteractEntityAtResult;
return e.interactAt(player, vec, h);
},
new PlayerInteractAtEntityEvent(getCraftPlayer(), ((EntityBridge) entity).bridge$getBukkitEntity(),
new org.bukkit.util.Vector(vec.x, vec.y, vec.z), (hand == InteractionHand.OFF_HAND) ? EquipmentSlot.OFF_HAND : EquipmentSlot.HAND));
}
@Override
@ -1624,6 +1691,20 @@ public abstract class ServerPlayNetHandlerMixin implements ServerPlayNetHandlerB
}
}
@Redirect(method = "handlePlaceRecipe", at = @At(value = "INVOKE", target = "Lnet/minecraft/network/protocol/game/ServerboundPlaceRecipePacket;getRecipe()Lnet/minecraft/resources/ResourceLocation;"))
private ResourceLocation arclight$recipeBookClick(ServerboundPlaceRecipePacket instance) {
var location = instance.getRecipe();
org.bukkit.inventory.Recipe recipe = this.cserver.getRecipe(CraftNamespacedKey.fromMinecraft(location));
if (recipe == null) {
return location;
}
var event = CraftEventFactory.callRecipeBookClickEvent(this.player, recipe, instance.isShiftDown());
if (event.getRecipe() instanceof org.bukkit.Keyed keyed) {
return CraftNamespacedKey.toMinecraft(keyed.getKey());
}
return location;
}
@Inject(method = "handleContainerButtonClick", cancellable = true, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;resetLastActionTime()V"))
private void arclight$noEnchant(ServerboundContainerButtonClickPacket packetIn, CallbackInfo ci) {
if (((ServerPlayerEntityBridge) player).bridge$isMovementBlocked()) {

View File

@ -15,7 +15,6 @@ import net.minecraft.network.protocol.game.ClientboundSetEquipmentPacket;
import net.minecraft.network.protocol.game.ClientboundSetPassengersPacket;
import net.minecraft.network.protocol.game.ClientboundTeleportEntityPacket;
import net.minecraft.network.protocol.game.ClientboundUpdateAttributesPacket;
import net.minecraft.network.protocol.game.ClientboundUpdateMobEffectPacket;
import net.minecraft.network.protocol.game.VecDeltaCodec;
import net.minecraft.network.syncher.SynchedEntityData;
import net.minecraft.server.level.ServerEntity;
@ -23,7 +22,6 @@ import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerPlayerConnection;
import net.minecraft.util.Mth;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.entity.LivingEntity;
@ -290,9 +288,13 @@ public abstract class ServerEntityMixin implements ServerEntityBridge {
if (!list.isEmpty()) {
consumer.accept(new ClientboundSetEquipmentPacket(this.entity.getId(), list));
}
((LivingEntity) this.entity).detectEquipmentUpdates();
}
this.yHeadRotp = Mth.floor(this.entity.getYHeadRot() * 256.0f / 360.0f);
consumer.accept(new ClientboundRotateHeadPacket(this.entity, (byte) this.yHeadRotp));
// CraftBukkit start - MC-109346: Fix for nonsensical head yaw
if (this.entity instanceof ServerPlayer) {
consumer.accept(new ClientboundRotateHeadPacket(this.entity, (byte) Mth.floor(this.entity.getYHeadRot() * 256.0F / 360.0F)));
}
// CraftBukkit end
if (!this.entity.getPassengers().isEmpty()) {
consumer.accept(new ClientboundSetPassengersPacket(this.entity));
}

View File

@ -713,6 +713,10 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled()) {
ci.cancel();
} else {
if (this.connection != null) {
((ServerPlayNetHandlerBridge) this.connection).bridge$pushTeleportCause(PlayerTeleportEvent.TeleportCause.EXIT_BED);
}
}
}

View File

@ -0,0 +1,52 @@
package io.izzel.arclight.common.mixin.core.world.level.block;
import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.SignBlock;
import net.minecraft.world.level.block.entity.SignBlockEntity;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.BlockHitResult;
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
import org.bukkit.event.player.PlayerSignOpenEvent;
import org.spongepowered.asm.mixin.Mixin;
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;
@Mixin(SignBlock.class)
public abstract class SignBlockMixin {
// @formatter:off
@Shadow public abstract void openTextEdit(Player p_277738_, SignBlockEntity p_277467_, boolean p_277771_);
// @formatter:on
private transient PlayerSignOpenEvent.Cause arclight$edit;
@Inject(method = "use", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/SignBlock;openTextEdit(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/block/entity/SignBlockEntity;Z)V"))
private void arclight$beforeEdit(BlockState p_56278_, Level p_56279_, BlockPos p_56280_, Player p_56281_, InteractionHand p_56282_, BlockHitResult p_56283_, CallbackInfoReturnable<InteractionResult> cir) {
arclight$edit = PlayerSignOpenEvent.Cause.INTERACT;
}
@Inject(method = "use", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/world/level/block/SignBlock;openTextEdit(Lnet/minecraft/world/entity/player/Player;Lnet/minecraft/world/level/block/entity/SignBlockEntity;Z)V"))
private void arclight$afterEdit(BlockState p_56278_, Level p_56279_, BlockPos p_56280_, Player p_56281_, InteractionHand p_56282_, BlockHitResult p_56283_, CallbackInfoReturnable<InteractionResult> cir) {
arclight$edit = null;
}
public void openTextEdit(Player p_277738_, SignBlockEntity p_277467_, boolean p_277771_, PlayerSignOpenEvent.Cause cause) {
arclight$edit = cause;
this.openTextEdit(p_277738_, p_277467_, p_277771_);
arclight$edit = null;
}
@Inject(method = "openTextEdit", cancellable = true, at = @At("HEAD"))
private void arclight$signEdit(Player player, SignBlockEntity signBlockEntity, boolean flag, CallbackInfo ci) {
if (!CraftEventFactory.callPlayerSignOpenEvent(player, signBlockEntity, flag, arclight$edit != null ? arclight$edit : (flag ? PlayerSignOpenEvent.Cause.PLACE : PlayerSignOpenEvent.Cause.UNKNOWN))) {
ci.cancel();
}
}
}

View File

@ -1,27 +1,16 @@
package io.izzel.arclight.common.mod.server.entity;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.world.entity.animal.horse.AbstractChestedHorse;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftChestedHorse;
import org.bukkit.entity.EntityCategory;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Horse;
import org.jetbrains.annotations.NotNull;
public class ArclightModChestedHorse extends CraftChestedHorse {
private final EntityType entityType;
public ArclightModChestedHorse(CraftServer server, AbstractChestedHorse entity) {
super(server, entity);
this.entityType = EntityType.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.ENTITY_TYPES.getKey(entity.getType())));
}
@Override
public @NotNull EntityType getType() {
return this.entityType;
}
@Override
@ -29,11 +18,6 @@ public class ArclightModChestedHorse extends CraftChestedHorse {
return Horse.Variant.HORSE;
}
@Override
public String toString() {
return "ArclightModChestedHorse{" + entityType + '}';
}
@Override
public @NotNull EntityCategory getCategory() {
return EntityCategory.NONE;

View File

@ -1,29 +1,12 @@
package io.izzel.arclight.common.mod.server.entity;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.world.entity.Entity;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftEntity;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.NotNull;
public class ArclightModEntity extends CraftEntity {
private final EntityType entityType;
public ArclightModEntity(CraftServer server, Entity entity) {
super(server, entity);
this.entityType = EntityType.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.ENTITY_TYPES.getKey(entity.getType())));
}
@Override
public @NotNull EntityType getType() {
return entityType;
}
@Override
public String toString() {
return "ArclightModEntity{" + entityType + '}';
}
}

View File

@ -1,28 +1,16 @@
package io.izzel.arclight.common.mod.server.entity;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.world.entity.animal.horse.AbstractHorse;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftAbstractHorse;
import org.bukkit.entity.EntityCategory;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Horse;
import org.jetbrains.annotations.NotNull;
public class ArclightModHorse extends CraftAbstractHorse {
private final EntityType entityType;
public ArclightModHorse(CraftServer server, AbstractHorse entity) {
super(server, entity);
this.entityType = EntityType.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.ENTITY_TYPES.getKey(entity.getType())));
}
@Override
@NotNull
public EntityType getType() {
return this.entityType;
}
@Override
@ -30,11 +18,6 @@ public class ArclightModHorse extends CraftAbstractHorse {
return Horse.Variant.HORSE;
}
@Override
public String toString() {
return "ArclightModHorse{" + entityType + '}';
}
@Override
public @NotNull EntityCategory getCategory() {
return EntityCategory.NONE;

View File

@ -1,29 +0,0 @@
package io.izzel.arclight.common.mod.server.entity;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.world.entity.LivingEntity;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftLivingEntity;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.NotNull;
public class ArclightModLivingEntity extends CraftLivingEntity {
private final EntityType entityType;
public ArclightModLivingEntity(CraftServer server, LivingEntity entity) {
super(server, entity);
this.entityType = EntityType.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.ENTITY_TYPES.getKey(entity.getType())));
}
@Override
public @NotNull EntityType getType() {
return entityType;
}
@Override
public String toString() {
return "ArclightModLivingEntity{" + entityType + '}';
}
}

View File

@ -1,29 +1,12 @@
package io.izzel.arclight.common.mod.server.entity;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.world.entity.vehicle.AbstractMinecart;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftMinecart;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.NotNull;
public class ArclightModMinecart extends CraftMinecart {
private final EntityType entityType;
public ArclightModMinecart(CraftServer server, AbstractMinecart entity) {
super(server, entity);
this.entityType = EntityType.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.ENTITY_TYPES.getKey(entity.getType())));
}
@Override
public @NotNull EntityType getType() {
return entityType;
}
@Override
public String toString() {
return "ArclightModMinecart{" + entityType + '}';
}
}

View File

@ -1,29 +1,12 @@
package io.izzel.arclight.common.mod.server.entity;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.world.entity.vehicle.AbstractMinecartContainer;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftMinecartContainer;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.NotNull;
public class ArclightModMinecartContainer extends CraftMinecartContainer {
private final EntityType entityType;
public ArclightModMinecartContainer(CraftServer server, AbstractMinecartContainer entity) {
super(server, entity);
this.entityType = EntityType.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.ENTITY_TYPES.getKey(entity.getType())));
}
@Override
public @NotNull EntityType getType() {
return entityType;
}
@Override
public String toString() {
return "ArclightModMinecartContainer{" + entityType + '}';
}
}

View File

@ -1,35 +1,12 @@
package io.izzel.arclight.common.mod.server.entity;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.world.entity.Mob;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftMob;
import org.bukkit.entity.EntityCategory;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.NotNull;
public class ArclightModMob extends CraftMob {
private final EntityType entityType;
public ArclightModMob(CraftServer server, Mob entity) {
super(server, entity);
this.entityType = EntityType.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.ENTITY_TYPES.getKey(entity.getType())));
}
@Override
public @NotNull EntityType getType() {
return entityType;
}
@Override
public String toString() {
return "ArclightModMob{" + entityType + '}';
}
@Override
public @NotNull EntityCategory getCategory() {
return EntityCategory.NONE;
}
}

View File

@ -1,30 +1,13 @@
package io.izzel.arclight.common.mod.server.entity;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.projectile.Projectile;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftProjectile;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.NotNull;
public class ArclightModProjectile extends CraftProjectile {
private final EntityType entityType;
public ArclightModProjectile(CraftServer server, Entity entity) {
super(server, (Projectile) entity);
this.entityType = EntityType.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.ENTITY_TYPES.getKey(entity.getType())));
}
@Override
public @NotNull EntityType getType() {
return entityType;
}
@Override
public String toString() {
return "ArclightModProjectile{" + entityType + '}';
}
}

View File

@ -1,35 +1,12 @@
package io.izzel.arclight.common.mod.server.entity;
import io.izzel.arclight.common.mod.util.ResourceLocationUtil;
import net.minecraft.world.entity.raid.Raider;
import net.minecraftforge.registries.ForgeRegistries;
import org.bukkit.craftbukkit.v.CraftServer;
import org.bukkit.craftbukkit.v.entity.CraftRaider;
import org.bukkit.entity.EntityCategory;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.NotNull;
public class ArclightModRaider extends CraftRaider {
private final EntityType entityType;
public ArclightModRaider(CraftServer server, Raider entity) {
super(server, entity);
this.entityType = EntityType.valueOf(ResourceLocationUtil.standardize(ForgeRegistries.ENTITY_TYPES.getKey(entity.getType())));
}
@Override
public @NotNull EntityType getType() {
return entityType;
}
@Override
public String toString() {
return "ArclightModRaider{" + entityType + '}';
}
@Override
public @NotNull EntityCategory getCategory() {
return EntityCategory.ILLAGER;
}
}

View File

@ -418,6 +418,7 @@
"world.level.block.SculkSensorBlockMixin",
"world.level.block.SculkShriekerBlockMixin",
"world.level.block.SculkVeinBlockMixin",
"world.level.block.SignBlockMixin",
"world.level.block.SnowBlockMixin",
"world.level.block.SnowLayerBlockMixin",
"world.level.block.SpongeBlockMixin",

View File

@ -61,7 +61,6 @@ public class ArclightImplementer implements ILaunchPluginService {
this.implementers.put("inventory", new InventoryImplementer());
this.implementers.put("switch", SwitchTableFixer.INSTANCE);
this.implementers.put("async", AsyncCatcher.INSTANCE);
this.implementers.put("entitytype", EntityTypePatcher.INSTANCE);
this.implementers.put("enum", new EnumDefinalizer());
if (this.logger) {
this.implementers.put("logger", new LoggerTransformer());

View File

@ -1,21 +0,0 @@
package io.izzel.arclight.boot.asm;
import cpw.mods.modlauncher.serviceapi.ILaunchPluginService;
import io.izzel.arclight.api.ArclightVersion;
import org.objectweb.asm.tree.ClassNode;
public class EntityTypePatcher implements Implementer {
public static final EntityTypePatcher INSTANCE = new EntityTypePatcher();
private final String entityPackage = "org/bukkit/craftbukkit/" + ArclightVersion.current().packageName() + "/entity";
@Override
public boolean processClass(ClassNode node, ILaunchPluginService.ITransformerLoader transformerLoader) {
if (node.name.startsWith(entityPackage) && !node.name.endsWith("CraftEntity")) {
return node.methods.removeIf(methodNode -> methodNode.name.equals("getType")
&& methodNode.desc.equals("()Lorg/bukkit/entity/EntityType;"));
}
return false;
}
}