Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions src/main/java/com/syuto/bytes/eventbus/impl/AttackEntityEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,26 @@
import lombok.Getter;
import lombok.Setter;
import net.minecraft.entity.Entity;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;

public class AttackEntityEvent implements Event {
public enum Mode { Pre, Post }

@Getter
private final Entity target;

@Getter
private Entity target;
private final Mode mode;

@Getter
@Setter
private boolean cancelled;

public AttackEntityEvent(Entity target) {
this(target, Mode.Pre);
}

public AttackEntityEvent(Entity target, Mode mode) {
this.target = target;
this.mode = mode;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.syuto.bytes.Byte;
import com.syuto.bytes.eventbus.impl.AttackEntityEvent;
import com.syuto.bytes.eventbus.impl.AttackEntityEvent.Mode;
import net.minecraft.client.network.ClientPlayerInteractionManager;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
Expand All @@ -20,13 +21,23 @@ public class ClientPlayerInteractionManagerMixin {
cancellable = true
)
private void attackEntity(PlayerEntity player, Entity target, CallbackInfo ci) {
AttackEntityEvent event = new AttackEntityEvent(target);
AttackEntityEvent event = new AttackEntityEvent(target, Mode.Pre);
Byte.INSTANCE.eventBus.post(event);

if (event.isCancelled()) {
ci.cancel();
}
}

@Inject(
method = "attackEntity",
at = @At("TAIL"),
cancellable = false
)
private void attackEntityPost(PlayerEntity player, Entity target, CallbackInfo ci) {
AttackEntityEvent post = new AttackEntityEvent(target, Mode.Post);
Byte.INSTANCE.eventBus.post(post);
}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.syuto.bytes.module.impl.combat;

import com.syuto.bytes.eventbus.EventHandler;
import com.syuto.bytes.eventbus.impl.AttackEntityEvent;
import com.syuto.bytes.eventbus.impl.AttackEntityEvent.Mode;
import com.syuto.bytes.module.Module;
import com.syuto.bytes.module.api.Category;
import com.syuto.bytes.utils.impl.client.ChatUtils;
import com.syuto.bytes.utils.impl.player.PlayerUtil;
import net.minecraft.item.ItemStack;
import net.minecraft.item.MaceItem;
import net.minecraft.network.packet.c2s.play.UpdateSelectedSlotC2SPacket;

/**
* Swaps to mace on attack, then swaps back on next tick.
*/
public class AttributeSwap extends Module {

private int previousSlot = -1;

public AttributeSwap() {
super("AttributeSwap", "Swap to mace during attacks", Category.COMBAT);
}

@EventHandler
public void onAttack(AttackEntityEvent event) {
if (mc.player == null || mc.interactionManager == null) return;

if (event.getMode() == Mode.Pre) {
int current = mc.player.getInventory().selectedSlot;
previousSlot = current;
if (PlayerUtil.isHoldingWeapon()) {
int maceSlot = findMaceInHotbar();
if (maceSlot != -1) {
mc.player.getInventory().selectedSlot = maceSlot;
if (mc.getNetworkHandler() != null) {
mc.getNetworkHandler().sendPacket(new UpdateSelectedSlotC2SPacket(maceSlot));
}
ChatUtils.print("Swapped to mace " + maceSlot + " from " + current);
}
}
}

if (event.getMode() == Mode.Post) {
if (previousSlot >= 0) {
mc.player.getInventory().selectedSlot = previousSlot;
if (mc.getNetworkHandler() != null) {
mc.getNetworkHandler().sendPacket(new UpdateSelectedSlotC2SPacket(previousSlot));
}
ChatUtils.print("Swapped back " + previousSlot);
previousSlot = -1;
}
}
}

private int findMaceInHotbar() {
for (int i = 0; i < 9; i++) {
ItemStack stack = mc.player.getInventory().getStack(i);
if (stack != null && stack.getItem() instanceof MaceItem) {
return i;
}
}
return -1;
}
}