Skip to content

Commit

Permalink
Triggers: Implement EntityDamage and EntityDeath
Browse files Browse the repository at this point in the history
  • Loading branch information
camnwalter authored and mattco98 committed Mar 18, 2024
1 parent a6473ed commit 658d20a
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 7 deletions.
1 change: 0 additions & 1 deletion api/ctjs.api
Original file line number Diff line number Diff line change
Expand Up @@ -2075,7 +2075,6 @@ public final class com/chattriggers/ctjs/api/triggers/TriggerType : java/lang/En
public static final field GUI_RENDER Lcom/chattriggers/ctjs/api/triggers/TriggerType;
public static final field ITEM_TOOLTIP Lcom/chattriggers/ctjs/api/triggers/TriggerType;
public static final field MESSAGE_SENT Lcom/chattriggers/ctjs/api/triggers/TriggerType;
public static final field MIXIN Lcom/chattriggers/ctjs/api/triggers/TriggerType;
public static final field OTHER Lcom/chattriggers/ctjs/api/triggers/TriggerType;
public static final field PACKET_RECEIVED Lcom/chattriggers/ctjs/api/triggers/TriggerType;
public static final field PACKET_SENT Lcom/chattriggers/ctjs/api/triggers/TriggerType;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.chattriggers.ctjs.internal.mixins;

import com.chattriggers.ctjs.api.triggers.TriggerType;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.damage.DamageSource;
import net.minecraft.world.World;
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;

@Mixin(LivingEntity.class)
public abstract class LivingEntityMixin extends Entity {
public LivingEntityMixin(EntityType<?> type, World world) {
super(type, world);
}

@Inject(method = "onDeath", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/LivingEntity;setPose(Lnet/minecraft/entity/EntityPose;)V"))
private void chattriggers$entityDeath(DamageSource damageSource, CallbackInfo ci) {
if (getWorld().isClient) {
TriggerType.ENTITY_DEATH.triggerAll(this);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,27 +1,64 @@
package com.chattriggers.ctjs.internal.mixins;

import com.chattriggers.ctjs.api.triggers.TriggerType;
import com.chattriggers.ctjs.internal.NameTagOverridable;
import com.chattriggers.ctjs.api.message.TextComponent;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityType;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.text.MutableText;
import net.minecraft.world.World;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.ModifyVariable;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

@Mixin(PlayerEntity.class)
public class PlayerEntityMixin implements NameTagOverridable {
public abstract class PlayerEntityMixin extends LivingEntity implements NameTagOverridable {
@Unique
private TextComponent overriddenNametagName;

protected PlayerEntityMixin(EntityType<? extends LivingEntity> entityType, World world) {
super(entityType, world);
}

@ModifyVariable(method = "getDisplayName", at = @At(value = "STORE", ordinal = 0))
private MutableText injectGetName(MutableText original) {
if (overriddenNametagName != null)
return overriddenNametagName.toMutableText$ctjs();
return original;
}

@Inject(
method = "attack",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/entity/Entity;damage(Lnet/minecraft/entity/damage/DamageSource;F)Z"
)
)
private void chattriggers$entityDamage(Entity target, CallbackInfo ci) {
if (getWorld().isClient) {
TriggerType.ENTITY_DAMAGE.triggerAll(com.chattriggers.ctjs.api.entity.Entity.fromMC(target));
}
}

@Inject(
method = "attack",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/entity/LivingEntity;damage(Lnet/minecraft/entity/damage/DamageSource;F)Z"
)
)
private void chattriggers$entityDamageSweeping(Entity target, CallbackInfo ci) {
if (getWorld().isClient) {
TriggerType.ENTITY_DAMAGE.triggerAll(com.chattriggers.ctjs.api.entity.Entity.fromMC(target));
}
}

@Override
public void ctjs_setOverriddenNametagName(@Nullable TextComponent component) {
overriddenNametagName = component;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,6 @@ enum class TriggerType : ITriggerType {
ENTITY_DAMAGE,

// misc
MIXIN,
COMMAND,
OTHER
}
Expand Down
7 changes: 3 additions & 4 deletions src/main/kotlin/com/chattriggers/ctjs/engine/Register.kt
Original file line number Diff line number Diff line change
Expand Up @@ -496,11 +496,10 @@ object Register {
}

/**
* Registers a new trigger that runs before an entity is damaged
* Registers a new trigger that runs when an entity is damaged by the player
*
* Passes through two arguments:
* Passes through one argument:
* - The target Entity that is damaged
* - The PlayerMP attacker
*
* @param method The method to call when the event is fired
* @return The trigger for additional modification
Expand All @@ -511,7 +510,7 @@ object Register {
}

/**
* Registers a new trigger that runs before an entity dies
* Registers a new trigger that runs when an entity dies
*
* Passes through one argument:
* - The Entity that died
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/chattriggers.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
"InGameHudMixin",
"ItemStackMixin",
"KeyBindingAccessor",
"LivingEntityMixin",
"MinecraftClientMixin",
"MouseMixin",
"NbtCompoundAccessor",
Expand Down

0 comments on commit 658d20a

Please sign in to comment.