From ba61e57a6df356291faa4915277394dd33bdffa5 Mon Sep 17 00:00:00 2001 From: canefe <8518141+canefe@users.noreply.github.com> Date: Mon, 26 May 2025 12:43:01 +0100 Subject: [PATCH 1/3] feat(event): new COMBAT event --- .../reactivemusic/PlayerThread.java | 2 +- .../circuitlord/reactivemusic/SongPicker.java | 8 ++++ .../reactivemusic/SongpackEventType.java | 2 + .../mixin/PlayerEntityMixin.java | 44 +++++++++++++++++++ .../rm_javazoom/jl/player/PlayerApplet.java | 1 + src/main/resources/reactivemusic.mixins.json | 3 +- 6 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java diff --git a/src/main/java/circuitlord/reactivemusic/PlayerThread.java b/src/main/java/circuitlord/reactivemusic/PlayerThread.java index 3dab344..f7e975b 100644 --- a/src/main/java/circuitlord/reactivemusic/PlayerThread.java +++ b/src/main/java/circuitlord/reactivemusic/PlayerThread.java @@ -235,7 +235,7 @@ public void processRealGain() { /* public int getFramesPlayed() { return player == null ? 0 : player.getFrames(); }*/ - +@SuppressWarnings("removal") public void forceKill() { try { resetPlayer(); diff --git a/src/main/java/circuitlord/reactivemusic/SongPicker.java b/src/main/java/circuitlord/reactivemusic/SongPicker.java index 12b5ab0..501c2b3 100644 --- a/src/main/java/circuitlord/reactivemusic/SongPicker.java +++ b/src/main/java/circuitlord/reactivemusic/SongPicker.java @@ -53,6 +53,9 @@ public final class SongPicker { public static boolean wasSleeping = false; + public static long lastCombatTime = -1; + public static final long COMBAT_TIMEOUT = 200; // ticks (5 seconds) + static { for (Field field : BIOME_TAG_FIELDS) { @@ -243,6 +246,11 @@ public static void tickEventMap() { } + // Check if player was recently in combat (attacked or was attacked) + boolean inCombat = (world.getTime() - lastCombatTime) < COMBAT_TIMEOUT; + ReactiveMusic.LOGGER.info("In combat: " + inCombat + ", last combat time: " + lastCombatTime + ", current time: " + world.getTime()); + songpackEventMap.put(SongpackEventType.COMBAT, inCombat); + //songpackEventMap.put(SongpackEventType.HOSTILE_MOBS, aggroMobsCount >= 4); diff --git a/src/main/java/circuitlord/reactivemusic/SongpackEventType.java b/src/main/java/circuitlord/reactivemusic/SongpackEventType.java index baea764..f0236f0 100644 --- a/src/main/java/circuitlord/reactivemusic/SongpackEventType.java +++ b/src/main/java/circuitlord/reactivemusic/SongpackEventType.java @@ -52,6 +52,8 @@ public enum SongpackEventType { NEARBY_MOBS, + COMBAT, + diff --git a/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java b/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java new file mode 100644 index 0000000..8e451bc --- /dev/null +++ b/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java @@ -0,0 +1,44 @@ +package circuitlord.reactivemusic.mixin; + +import circuitlord.reactivemusic.SongPicker; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.damage.DamageSource; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.World; +import org.slf4j.Logger; +import org.spongepowered.asm.mixin.Final; +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(PlayerEntity.class) +public abstract class PlayerEntityMixin { + @Shadow @Final private static Logger LOGGER; + + @Inject(method = "attack", at = @At("HEAD")) + private void onAttack(Entity target, CallbackInfo ci) { + if ((Object)this instanceof ClientPlayerEntity) { + ClientPlayerEntity player = (ClientPlayerEntity)(Object)this; + World world = player.getWorld(); + LOGGER.info("Player attacked: {} at time: {}", player.getName().getString(), world.getTime()); + SongPicker.lastCombatTime = world.getTime(); + } + } + @Inject(method = "damage", at = @At("HEAD")) + private void onDamage(ServerWorld world, DamageSource source, float amount, CallbackInfoReturnable cir) { + LOGGER.info("Player damaged: {} at time: {}", ((LivingEntity) (Object) this).getName().getString(), world.getTime()); + PlayerEntity player = (PlayerEntity) (Object) this; + World playerWorld = player.getWorld(); + // cause of source + if (source.getAttacker() != null) { + LOGGER.info("Damage source attacker: {}", source.getAttacker().getName().getString()); + SongPicker.lastCombatTime = playerWorld.getTime(); + } + } +} \ No newline at end of file diff --git a/src/main/java/rm_javazoom/jl/player/PlayerApplet.java b/src/main/java/rm_javazoom/jl/player/PlayerApplet.java index 2f75666..839c00a 100644 --- a/src/main/java/rm_javazoom/jl/player/PlayerApplet.java +++ b/src/main/java/rm_javazoom/jl/player/PlayerApplet.java @@ -35,6 +35,7 @@ * @author Mat McGowan * @since 0.0.8 */ +@SuppressWarnings("removal") public class PlayerApplet extends Applet implements Runnable { static public final String AUDIO_PARAMETER = "audioURL"; diff --git a/src/main/resources/reactivemusic.mixins.json b/src/main/resources/reactivemusic.mixins.json index 3d71331..ee399e8 100644 --- a/src/main/resources/reactivemusic.mixins.json +++ b/src/main/resources/reactivemusic.mixins.json @@ -11,6 +11,7 @@ "MinecraftClientMixin", "MusicTrackerMixin", "BossBarHudAccessor", - "SoundManagerMixin" + "SoundManagerMixin", + "PlayerEntityMixin" ] } \ No newline at end of file From f3d89aad668809bf69d760bd3a1cee81a8873552 Mon Sep 17 00:00:00 2001 From: canefe <8518141+canefe@users.noreply.github.com> Date: Mon, 26 May 2025 12:58:29 +0100 Subject: [PATCH 2/3] fix(debug): remove spammy debug logs --- .../java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java b/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java index 8e451bc..16b4844 100644 --- a/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java +++ b/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java @@ -32,7 +32,6 @@ private void onAttack(Entity target, CallbackInfo ci) { } @Inject(method = "damage", at = @At("HEAD")) private void onDamage(ServerWorld world, DamageSource source, float amount, CallbackInfoReturnable cir) { - LOGGER.info("Player damaged: {} at time: {}", ((LivingEntity) (Object) this).getName().getString(), world.getTime()); PlayerEntity player = (PlayerEntity) (Object) this; World playerWorld = player.getWorld(); // cause of source From d70fc9dd5b49e07a14eb9afa5fd1f5a406a9cbf4 Mon Sep 17 00:00:00 2001 From: canefe <8518141+canefe@users.noreply.github.com> Date: Mon, 26 May 2025 13:01:40 +0100 Subject: [PATCH 3/3] fix(debug): remove spammy debug logs --- src/main/java/circuitlord/reactivemusic/SongPicker.java | 1 - .../java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/circuitlord/reactivemusic/SongPicker.java b/src/main/java/circuitlord/reactivemusic/SongPicker.java index 501c2b3..f256232 100644 --- a/src/main/java/circuitlord/reactivemusic/SongPicker.java +++ b/src/main/java/circuitlord/reactivemusic/SongPicker.java @@ -248,7 +248,6 @@ public static void tickEventMap() { // Check if player was recently in combat (attacked or was attacked) boolean inCombat = (world.getTime() - lastCombatTime) < COMBAT_TIMEOUT; - ReactiveMusic.LOGGER.info("In combat: " + inCombat + ", last combat time: " + lastCombatTime + ", current time: " + world.getTime()); songpackEventMap.put(SongpackEventType.COMBAT, inCombat); diff --git a/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java b/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java index 16b4844..2f27bd0 100644 --- a/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java +++ b/src/main/java/circuitlord/reactivemusic/mixin/PlayerEntityMixin.java @@ -36,7 +36,6 @@ private void onDamage(ServerWorld world, DamageSource source, float amount, Call World playerWorld = player.getWorld(); // cause of source if (source.getAttacker() != null) { - LOGGER.info("Damage source attacker: {}", source.getAttacker().getName().getString()); SongPicker.lastCombatTime = playerWorld.getTime(); } }