Skip to content

Commit

Permalink
Update and optimize attack injections
Browse files Browse the repository at this point in the history
  • Loading branch information
Yeregorix committed Mar 11, 2025
1 parent 98780cb commit 1363974
Show file tree
Hide file tree
Showing 5 changed files with 69 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ public final class SpongeDamageStepType implements DamageStepType {
public String toString() {
return RegistryTypes.DAMAGE_STEP_TYPE.get().findValueKey(this)
.map(ResourceKey::toString)
.map("DamageStepType[%s]"::formatted)
.orElseGet(super::toString);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,13 @@ public SpongeDamageStep newStep(final DefaultedRegistryReference<DamageStepType>
step.populateChildren();

if (this.postEvent != null) {
LOGGER.warn("A new root step {} is being captured after the post event.", step);
LOGGER.warn("A new root step {} is being captured after the post event.", step.type());
}

if (!this.rootSteps.isEmpty()) {
final SpongeDamageStep previous = this.rootSteps.getLast();
if (previous.damageAfterChildren().isEmpty()) {
LOGGER.warn("A new root step {} is being captured but previous root step {} hasn't finished.", step, previous);
LOGGER.warn("A new root step {} is being captured but previous root step {} hasn't finished.", step.type(), previous.type());
this.rootSteps.removeLast();
}
}
Expand All @@ -116,7 +116,7 @@ public float startStep(final DefaultedRegistryReference<DamageStepType> typeRef,
final DamageStepType type = typeRef.get();
final SpongeDamageStep step = this.rootSteps.getLast();
if (step.type() != type) {
LOGGER.warn("Expected a current root step of type {} but got {}.", type, step);
LOGGER.warn("Expected a current root step of type {} but got {}.", type, step.type());
return null;
}
return step;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,21 +24,25 @@
*/
package org.spongepowered.common.mixin.core.world.entity;

import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.Mob;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.spongepowered.api.event.cause.entity.damage.DamageStepTypes;
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.Redirect;
import org.spongepowered.asm.mixin.injection.Slice;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import org.spongepowered.common.bridge.world.entity.TrackedAttackBridge;
import org.spongepowered.common.event.cause.entity.damage.SpongeAttackTracker;
import org.spongepowered.common.event.cause.entity.damage.SpongeDamageStep;

import java.util.Deque;
import java.util.LinkedList;
Expand Down Expand Up @@ -68,8 +72,23 @@ public abstract class MobMixin_Attack extends LivingEntityMixin_Damage implement
}
}

@Redirect(method = "doHurtTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;hurtServer(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/damagesource/DamageSource;F)Z"))
private boolean attack$firePostEvent(final Entity target, final ServerLevel level, final DamageSource source, float damage) {
@WrapOperation(method = "doHurtTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/item/Item;getAttackDamageBonus(Lnet/minecraft/world/entity/Entity;FLnet/minecraft/world/damagesource/DamageSource;)F"))
private float attack$modifyBeforeAndAfterWeaponBonus(final Item item, final Entity target, final float originalDamage, final DamageSource source, final Operation<Float> original) {
final SpongeAttackTracker tracker = this.attack$tracker();
if (tracker == null) {
return original.call(item, target, originalDamage, source);
}

final SpongeDamageStep step = tracker.newStep(DamageStepTypes.WEAPON_BONUS, tracker.weaponSnapshot());
float damage = (float) step.applyChildrenBefore(originalDamage);
if (!step.isSkipped()) {
damage += original.call(item, target, damage, source);
}
return (float) step.applyChildrenAfter(damage) - originalDamage;
}

@WrapOperation(method = "doHurtTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Entity;hurtServer(Lnet/minecraft/server/level/ServerLevel;Lnet/minecraft/world/damagesource/DamageSource;F)Z"))
private boolean attack$firePostEvent(final Entity target, final ServerLevel level, final DamageSource source, float damage, final Operation<Boolean> original) {
final SpongeAttackTracker tracker = this.attack$tracker();
if (tracker != null) {
final float knockbackModifier = this.shadow$getKnockback(target, source);
Expand All @@ -78,13 +97,13 @@ public abstract class MobMixin_Attack extends LivingEntityMixin_Damage implement
}
damage = (float) tracker.postEvent().finalDamage();
}
return target.hurtServer(level, source, damage);
return original.call(target, level, source, damage);
}

@Redirect(method = "doHurtTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Mob;getKnockback(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;)F"))
private float attack$knockbackModifier(final Mob self, final Entity target, final DamageSource source) {
@WrapOperation(method = "doHurtTarget", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/Mob;getKnockback(Lnet/minecraft/world/entity/Entity;Lnet/minecraft/world/damagesource/DamageSource;)F"))
private float attack$knockbackModifier(final Mob self, final Entity target, final DamageSource source, final Operation<Float> original) {
final SpongeAttackTracker tracker = this.attack$tracker();
return tracker == null ? this.shadow$getKnockback(target, source) : (float) tracker.postEvent().knockbackModifier();
return tracker == null ? original.call(self, target, source) : (float) tracker.postEvent().knockbackModifier();
}

@Inject(method = "doHurtTarget", at = @At("RETURN"), slice = @Slice(
Expand Down
Loading

0 comments on commit 1363974

Please sign in to comment.