77 lines
2.7 KiB
Java
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));
|
|
}
|
|
}
|
|
}
|
|
}
|