superb-warfare/src/main/java/com/atsuishio/superbwarfare/mixins/MinecraftMixin.java
2025-03-15 15:07:58 +08:00

77 lines
2.7 KiB
Java

package com.atsuishio.superbwarfare.mixins;
import com.atsuishio.superbwarfare.ModUtils;
import com.atsuishio.superbwarfare.entity.vehicle.base.VehicleEntity;
import com.atsuishio.superbwarfare.entity.vehicle.base.WeaponVehicleEntity;
import com.atsuishio.superbwarfare.network.message.ChangeVehicleSeatMessage;
import com.atsuishio.superbwarfare.network.message.SwitchVehicleWeaponMessage;
import net.minecraft.client.Minecraft;
import net.minecraft.client.Options;
import net.minecraft.client.player.LocalPlayer;
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 javax.annotation.Nullable;
@Mixin(Minecraft.class)
public class MinecraftMixin {
@Shadow
@Nullable
public LocalPlayer player;
@Shadow
@Final
public Options options;
/**
* 在可切换座位的载具上,按下潜行键+数字键时切换座位
* 在有武器的载具上,按下数字键时切换武器
*/
@Inject(method = "handleKeybinds()V", at = @At("HEAD"), cancellable = true)
private void handleKeybinds(CallbackInfo ci) {
if (player == null || !(player.getVehicle() instanceof VehicleEntity vehicle)) return;
var index = -1;
for (int i = 0; i < 9; ++i) {
if (options.keyHotbarSlots[i].isDown()) {
index = i;
break;
}
}
if (index == -1) return;
// shift+数字键 座位更改
if (vehicle.getMaxPassengers() > 1
&& options.keyShift.isDown()
&& index < vehicle.getMaxPassengers()
&& vehicle.getNthEntity(index) == null
) {
ci.cancel();
options.keyHotbarSlots[index].consumeClick();
ModUtils.PACKET_HANDLER.sendToServer(new ChangeVehicleSeatMessage(index));
vehicle.changeSeat(player, index);
return;
}
var seatIndex = vehicle.getSeatIndex(player);
if (vehicle instanceof WeaponVehicleEntity weaponVehicle && weaponVehicle.banHand(player)) {
ci.cancel();
options.keyHotbarSlots[index].consumeClick();
// 数字键 武器切换
if (!options.keyShift.isDown()
&& weaponVehicle.hasWeapon(seatIndex)
&& weaponVehicle.getWeaponIndex(seatIndex) != index) {
ModUtils.PACKET_HANDLER.sendToServer(new SwitchVehicleWeaponMessage(seatIndex, index, false));
}
}
}
}