Skip to content

Commit

Permalink
Update upstream (#1243)
Browse files Browse the repository at this point in the history
  • Loading branch information
IzzelAliz committed Mar 3, 2024
1 parent 7dae8b8 commit b656342
Show file tree
Hide file tree
Showing 84 changed files with 909 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import net.minecraft.world.entity.boss.enderdragon.EnderDragon;
import net.minecraft.world.phys.Vec3;
import org.bukkit.craftbukkit.v.entity.CraftEntity;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.bukkit.projectiles.ProjectileSource;

import java.util.List;
Expand Down Expand Up @@ -69,6 +70,8 @@ public interface EntityBridge extends ICommandSourceBridge, InjectEntityBridge {

void bridge$revive();

void bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause cause);

default boolean bridge$forge$isPartEntity() {
return this instanceof EnderDragonPart;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import org.bukkit.craftbukkit.v.entity.CraftLivingEntity;
import org.bukkit.event.entity.EntityKnockbackEvent;
import org.bukkit.event.entity.EntityPotionEffectEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;

Expand Down Expand Up @@ -53,6 +54,8 @@ public interface LivingEntityBridge extends EntityBridge {

Optional<EntityPotionEffectEvent.Cause> bridge$getEffectCause();

void bridge$pushKnockbackCause(Entity attacker, EntityKnockbackEvent.KnockbackCause cause);

@Override
CraftLivingEntity bridge$getBukkitEntity();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package io.izzel.arclight.common.bridge.core.world.level.levelgen;

import org.bukkit.craftbukkit.v.persistence.CraftPersistentDataContainer;
import org.bukkit.event.world.AsyncStructureGenerateEvent;

public interface StructureStartBridge {

void bridge$setGenerateCause(AsyncStructureGenerateEvent.Cause cause);

CraftPersistentDataContainer bridge$getPersistentDataContainer();
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package io.izzel.arclight.common.bridge.inject;

import io.izzel.arclight.common.bridge.core.entity.EntityBridge;
import org.bukkit.craftbukkit.v.entity.CraftEntity;

public interface InjectEntityBridge {

default CraftEntity bridge$getBukkitEntity() {
throw new IllegalStateException("Not implemented");
}

default EntityBridge bridge() {
return (EntityBridge) this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@
import org.bukkit.craftbukkit.v.entity.CraftPlayer;
import org.bukkit.craftbukkit.v.util.CraftChatMessage;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerLoginEvent;
Expand Down Expand Up @@ -594,4 +595,10 @@ public ServerStatsCounter getPlayerStats(UUID uuid, String displayName) {
}
return serverstatisticmanager;
}

@Inject(method = "remove", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;stopRiding()V"))
private void arclight$removeMount(ServerPlayer serverPlayer, CallbackInfo ci) {
serverPlayer.getRootVehicle().getPassengersAndSelf().forEach(entity ->
((EntityBridge) entity).bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.PLAYER_QUIT));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.bukkit.craftbukkit.v.entity.CraftLivingEntity;
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
import org.bukkit.event.entity.AreaEffectCloudApplyEvent;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
Expand Down Expand Up @@ -107,6 +108,7 @@ public void tick() {
}
} else {
if (this.tickCount >= this.waitTime + this.duration) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.DESPAWN);
this.discard();
return;
}
Expand All @@ -123,6 +125,7 @@ public void tick() {
if (this.radiusPerTick != 0.0F) {
f += this.radiusPerTick;
if (f < 0.5F) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.DESPAWN);
this.discard();
return;
}
Expand Down Expand Up @@ -176,6 +179,7 @@ public void tick() {
if (this.radiusOnUse != 0.0F) {
f += this.radiusOnUse;
if (f < 0.5F) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.DESPAWN);
this.discard();
return;
}
Expand All @@ -186,6 +190,7 @@ public void tick() {
if (this.durationOnUse != 0) {
this.duration += this.durationOnUse;
if (this.duration <= 0) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.DESPAWN);
this.discard();
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@
import org.bukkit.event.entity.EntityDropItemEvent;
import org.bukkit.event.entity.EntityPortalEvent;
import org.bukkit.event.entity.EntityPoseChangeEvent;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.bukkit.event.hanging.HangingBreakByEntityEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.vehicle.VehicleBlockCollisionEvent;
Expand Down Expand Up @@ -326,6 +327,39 @@ public SoundEvent getSwimHighSpeedSplashSound0() {
this.unsetRemoved();
}

private transient EntityRemoveEvent.Cause arclight$removeCause;

@Override
public void bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause cause) {
this.arclight$removeCause = cause;
}

public void discard(EntityRemoveEvent.Cause cause) {
this.arclight$removeCause = cause;
this.discard();
}

public void remove(Entity.RemovalReason removalReason, EntityRemoveEvent.Cause cause) {
this.arclight$removeCause = cause;
this.remove(removalReason);
}

@Inject(method = "kill", at = @At("HEAD"))
private void arclight$killed(CallbackInfo ci) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.DEATH);
}

@Inject(method = "onBelowWorld", at = @At("HEAD"))
private void arclight$outOfWorld(CallbackInfo ci) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.OUT_OF_WORLD);
}

@Inject(method = "setRemoved", at = @At("HEAD"))
private void arclight$removeEvent(Entity.RemovalReason removalReason, CallbackInfo ci) {
CraftEventFactory.callEntityRemoveEvent((Entity) (Object) this, arclight$removeCause);
arclight$removeCause = null;
}

@Inject(method = "getMaxAirSupply", cancellable = true, at = @At("RETURN"))
private void arclight$useBukkitMaxAir(CallbackInfoReturnable<Integer> cir) {
cir.setReturnValue(this.maxAirTicks);
Expand Down Expand Up @@ -461,7 +495,7 @@ public void postTick() {
@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) {
if ((Object) this instanceof LivingEntity && remainingFireTicks <= 0) {
var damager = (lastLavaContact == null) ? null : CraftBlock.at(level(), lastLavaContact);
var damager = (lastLavaContact == null) ? null : CraftBlock.at(level(), lastLavaContact);
var damagee = this.getBukkitEntity();
EntityCombustEvent combustEvent = new EntityCombustByBlockEvent(damager, damagee, 15);
Bukkit.getPluginManager().callEvent(combustEvent);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import net.minecraft.world.item.enchantment.Enchantments;
import org.bukkit.craftbukkit.v.entity.CraftLivingEntity;
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
import org.bukkit.event.player.PlayerExpCooldownChangeEvent;
Expand Down Expand Up @@ -38,6 +39,21 @@ public abstract class ExperienceOrbMixin extends EntityMixin {

private transient Player arclight$lastPlayer;

@Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/ExperienceOrb;discard()V"))
private void arclight$tickDespawn(CallbackInfo ci) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.DESPAWN);
}

@Inject(method = "merge", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/ExperienceOrb;discard()V"))
private void arclight$merge(CallbackInfo ci) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.MERGE);
}

@Inject(method = "playerTouch", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/ExperienceOrb;discard()V"))
private void arclight$pickup(CallbackInfo ci) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.PICKUP);
}

@Inject(method = "tick", at = @At(value = "INVOKE", shift = At.Shift.AFTER, target = "Lnet/minecraft/world/entity/Entity;tick()V"))
private void arclight$captureLast(CallbackInfo ci) {
arclight$lastPlayer = this.followingPlayer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.objectweb.asm.Opcodes;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
Expand All @@ -22,6 +23,11 @@ public abstract class LightningBoltMixin extends EntityMixin {

public boolean isSilent = false;

@Inject(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LightningBolt;discard()V"))
private void arclight$tickDespawn(CallbackInfo ci) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.DESPAWN);
}

@Redirect(method = "tick", at = @At(value = "FIELD", opcode = Opcodes.GETFIELD, ordinal = 0, target = "Lnet/minecraft/world/entity/LightningBolt;life:I"))
private int arclight$silent(LightningBolt lightningBolt) {
return isSilent ? 0 : this.life;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.gameevent.GameEvent;
import net.minecraft.world.phys.Vec3;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.craftbukkit.v.CraftEquipmentSlot;
Expand All @@ -64,8 +65,10 @@
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityExhaustionEvent;
import org.bukkit.event.entity.EntityKnockbackEvent;
import org.bukkit.event.entity.EntityPotionEffectEvent;
import org.bukkit.event.entity.EntityRegainHealthEvent;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.bukkit.event.entity.EntityResurrectEvent;
import org.bukkit.event.entity.EntityTeleportEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
Expand Down Expand Up @@ -493,6 +496,38 @@ public boolean isAlive() {
}
}

@Inject(method = "blockedByShield", at = @At("HEAD"))
private void arclight$shieldKnockback(LivingEntity livingEntity, CallbackInfo ci) {
this.bridge$pushKnockbackCause(null, EntityKnockbackEvent.KnockbackCause.SHIELD_BLOCK);
}

private transient Entity arclight$knockbackAttacker;
private transient EntityKnockbackEvent.KnockbackCause arclight$knockbackCause;

@Override
public void bridge$pushKnockbackCause(Entity attacker, EntityKnockbackEvent.KnockbackCause cause) {
this.arclight$knockbackAttacker = attacker;
this.arclight$knockbackCause = cause;
}

public void knockback(double d, double e, double f, Entity attacker, EntityKnockbackEvent.KnockbackCause cause) {
this.bridge$pushKnockbackCause(attacker, cause);
this.knockback(d, e, f);
}

@Redirect(method = "knockback", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;setDeltaMovement(DDD)V"))
private void arclight$knockbackEvent(LivingEntity instance, double x, double y, double z, double d, double e, double f) {
var attacker = arclight$knockbackAttacker;
var cause = arclight$knockbackCause == null ? EntityKnockbackEvent.KnockbackCause.UNKNOWN : arclight$knockbackCause;
arclight$knockbackAttacker = null;
arclight$knockbackCause = null;
var raw = (new Vec3(e, 0.0, f)).normalize().scale(d);
var event = CraftEventFactory.callEntityKnockbackEvent(this.getBukkitEntity(), attacker, cause, d, raw, x, y, z);
if (!event.isCancelled()) {
instance.setDeltaMovement(event.getFinalKnockback().getX(), event.getFinalKnockback().getY(), event.getFinalKnockback().getZ());
}
}

/**
* @author IzzelAliz
* @reason
Expand Down Expand Up @@ -608,6 +643,7 @@ public boolean hurt(DamageSource source, float amount) {
d1 = (Math.random() - Math.random()) * 0.01D;
}

this.bridge$pushKnockbackCause(entity1, entity1 == null ? EntityKnockbackEvent.KnockbackCause.DAMAGE : EntityKnockbackEvent.KnockbackCause.ENTITY_ATTACK);
this.knockback(0.4F, d1, d0);
if (!flag) {
this.indicateDamage(d1, d0);
Expand Down Expand Up @@ -1176,4 +1212,9 @@ protected void equipEventAndSound(EquipmentSlot slot, ItemStack oldItem, ItemSta
public void bridge$playEquipSound(EquipmentSlot slot, ItemStack oldItem, ItemStack newItem, boolean silent) {
this.equipEventAndSound(slot, oldItem, newItem, silent);
}

@Inject(method = "tickDeath", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;remove(Lnet/minecraft/world/entity/Entity$RemovalReason;)V"))
private void arclight$killedCause(CallbackInfo ci) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.DEATH);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityCombustByEntityEvent;
import org.bukkit.event.entity.EntityKnockbackEvent;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
import org.bukkit.event.entity.EntityTransformEvent;
Expand Down Expand Up @@ -211,6 +213,11 @@ public boolean setTarget(LivingEntity livingEntity, EntityTargetEvent.TargetReas
arclight$item = itemEntity;
}

@Inject(method = "pickUpItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/item/ItemEntity;discard()V"))
private void arclight$pickupCause(ItemEntity itemEntity, CallbackInfo ci) {
itemEntity.bridge().bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.PICKUP);
}

@Override
public void bridge$captureItemDrop(ItemEntity itemEntity) {
this.arclight$item = itemEntity;
Expand Down Expand Up @@ -336,6 +343,11 @@ public ItemStack equipItemIfPossible(ItemStack stack) {
this.arclight$transform = null;
}

@Inject(method = "convertTo", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Mob;discard()V"))
private <T extends Mob> void arclight$transformCause(EntityType<T> entityType, boolean bl, CallbackInfoReturnable<T> cir) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.TRANSFORMATION);
}

public <T extends Mob> T convertTo(EntityType<T> entityType, boolean flag, EntityTransformEvent.TransformReason transformReason, CreatureSpawnEvent.SpawnReason spawnReason) {
((WorldBridge) this.level()).bridge$pushAddEntityReason(spawnReason);
bridge$pushTransformReason(transformReason);
Expand All @@ -351,13 +363,23 @@ public <T extends Mob> T convertTo(EntityType<T> entityType, boolean flag, Entit

@Redirect(method = "doHurtTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;setSecondsOnFire(I)V"))
public void arclight$attackCombust(Entity entity, int seconds) {
EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), ((EntityBridge) entity).bridge$getBukkitEntity(), seconds);
EntityCombustByEntityEvent combustEvent = new EntityCombustByEntityEvent(this.getBukkitEntity(), entity.bridge$getBukkitEntity(), seconds);
org.bukkit.Bukkit.getPluginManager().callEvent(combustEvent);
if (!combustEvent.isCancelled()) {
((EntityBridge) entity).bridge$setOnFire(combustEvent.getDuration(), false);
}
}

@Inject(method = "doHurtTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;knockback(DDD)V"))
private void arclight$attackKnockback(Entity entity, CallbackInfoReturnable<Boolean> cir) {
((LivingEntityBridge) entity).bridge$pushKnockbackCause((Entity) (Object) this, EntityKnockbackEvent.KnockbackCause.ENTITY_ATTACK);
}

@Inject(method = "checkDespawn", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Mob;discard()V"))
private void arclight$naturalDespawn(CallbackInfo ci) {
this.bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.DESPAWN);
}

@Override
public ResourceLocation bridge$getLootTable() {
return this.getDefaultLootTable();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package io.izzel.arclight.common.mixin.core.world.entity.ai.behavior.warden;

import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.ai.behavior.warden.Digging;
import net.minecraft.world.entity.monster.warden.Warden;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(Digging.class)
public class DiggingMixin<E extends Warden> {

@Inject(method = "stop(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/entity/monster/warden/Warden;J)V", at = @At("HEAD"))
private void arclight$despawn(ServerLevel serverLevel, E warden, long l, CallbackInfo ci) {
warden.bridge().bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.DESPAWN);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import net.minecraft.world.level.Level;
import org.bukkit.craftbukkit.v.event.CraftEventFactory;
import org.bukkit.craftbukkit.v.inventory.CraftItemStack;
import org.bukkit.event.entity.EntityRemoveEvent;
import org.bukkit.event.player.PlayerBucketEntityEvent;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
Expand Down Expand Up @@ -53,6 +54,7 @@ static <T extends LivingEntity & Bucketable> Optional<InteractionResult> bucketM
CriteriaTriggers.FILLED_BUCKET.trigger((ServerPlayer) player, itemstack1);
}

entity.bridge().bridge$pushEntityRemoveCause(EntityRemoveEvent.Cause.PICKUP);
entity.discard();
return Optional.of(InteractionResult.sidedSuccess(level.isClientSide));
} else {
Expand Down
Loading

0 comments on commit b656342

Please sign in to comment.