150 lines
5.5 KiB
Java
150 lines
5.5 KiB
Java
package electroblob.wizardry.client;
|
|
|
|
import electroblob.wizardry.Wizardry;
|
|
import electroblob.wizardry.client.gui.GuiSpellDisplay;
|
|
import electroblob.wizardry.item.ISpellCastingItem;
|
|
import electroblob.wizardry.packet.PacketControlInput;
|
|
import electroblob.wizardry.packet.PacketSpellQuickAccess;
|
|
import electroblob.wizardry.packet.WizardryPacketHandler;
|
|
import electroblob.wizardry.registry.WizardrySounds;
|
|
import net.minecraft.client.Minecraft;
|
|
import net.minecraft.client.audio.PositionedSoundRecord;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraftforge.client.event.MouseEvent;
|
|
import net.minecraftforge.fml.common.Mod;
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
|
import net.minecraftforge.fml.common.gameevent.TickEvent;
|
|
import net.minecraftforge.fml.common.network.simpleimpl.IMessage;
|
|
import net.minecraftforge.fml.relauncher.Side;
|
|
|
|
/** Event handler class responsible for handling wizardry's controls. */
|
|
//@SideOnly(Side.CLIENT)
|
|
@Mod.EventBusSubscriber(Side.CLIENT)
|
|
public class WizardryControlHandler {
|
|
|
|
static boolean NkeyPressed = false;
|
|
static boolean BkeyPressed = false;
|
|
static boolean[] quickAccessKeyPressed = new boolean[ClientProxy.SPELL_QUICK_ACCESS.length];
|
|
|
|
// Changed to a tick event to allow mouse button keybinds
|
|
// The 'lag' that happened previously was actually because the code only fired when a keyboard key was pressed!
|
|
@SubscribeEvent
|
|
public static void onTickEvent(TickEvent.ClientTickEvent event){
|
|
|
|
if(event.phase == TickEvent.Phase.END) return; // Only really needs to be once per tick
|
|
|
|
if(Wizardry.proxy instanceof ClientProxy){
|
|
|
|
EntityPlayer player = Minecraft.getMinecraft().player;
|
|
|
|
if(player != null){
|
|
|
|
ItemStack wand = getWandInUse(player);
|
|
if(wand == null) return;
|
|
|
|
if(ClientProxy.NEXT_SPELL.isKeyDown() && Minecraft.getMinecraft().inGameHasFocus){
|
|
if(!NkeyPressed){
|
|
NkeyPressed = true;
|
|
selectNextSpell(wand);
|
|
}
|
|
}else{
|
|
NkeyPressed = false;
|
|
}
|
|
|
|
if(ClientProxy.PREVIOUS_SPELL.isKeyDown() && Minecraft.getMinecraft().inGameHasFocus){
|
|
if(!BkeyPressed){
|
|
BkeyPressed = true;
|
|
// Packet building
|
|
selectPreviousSpell(wand);
|
|
}
|
|
}else{
|
|
BkeyPressed = false;
|
|
}
|
|
|
|
for(int i = 0; i < ClientProxy.SPELL_QUICK_ACCESS.length; i++){
|
|
if(ClientProxy.SPELL_QUICK_ACCESS[i].isKeyDown() && Minecraft.getMinecraft().inGameHasFocus){
|
|
if(!quickAccessKeyPressed[i]){
|
|
quickAccessKeyPressed[i] = true;
|
|
// Packet building
|
|
selectSpell(wand, i);
|
|
}
|
|
}else{
|
|
quickAccessKeyPressed[i] = false;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
// Shift-scrolling to change spells
|
|
@SubscribeEvent
|
|
public static void onMouseEvent(MouseEvent event){
|
|
|
|
EntityPlayer player = Minecraft.getMinecraft().player;
|
|
ItemStack wand = getWandInUse(player);
|
|
if(wand == null) return;
|
|
|
|
if(Minecraft.getMinecraft().inGameHasFocus && !wand.isEmpty() && event.getDwheel() != 0 && player.isSneaking()
|
|
&& Wizardry.settings.shiftScrolling){
|
|
|
|
event.setCanceled(true);
|
|
|
|
int d = Wizardry.settings.reverseScrollDirection ? -event.getDwheel() : event.getDwheel();
|
|
|
|
if(d > 0){
|
|
selectNextSpell(wand);
|
|
}else if(d < 0){
|
|
selectPreviousSpell(wand);
|
|
}
|
|
}
|
|
}
|
|
|
|
private static ItemStack getWandInUse(EntityPlayer player){
|
|
|
|
ItemStack wand = player.getHeldItemMainhand();
|
|
|
|
// Only bother sending packets if the player is holding a spellcasting item with more than one spell slot
|
|
if(!(wand.getItem() instanceof ISpellCastingItem) || ((ISpellCastingItem)wand.getItem()).getSpells(wand).length < 2){
|
|
wand = player.getHeldItemOffhand();
|
|
if(!(wand.getItem() instanceof ISpellCastingItem) || ((ISpellCastingItem)wand.getItem()).getSpells(wand).length < 2) return null;
|
|
}
|
|
|
|
return wand;
|
|
}
|
|
|
|
private static void selectNextSpell(ItemStack wand){
|
|
// Packet building
|
|
IMessage msg = new PacketControlInput.Message(PacketControlInput.ControlType.NEXT_SPELL_KEY);
|
|
WizardryPacketHandler.net.sendToServer(msg);
|
|
// GUI switch animation
|
|
((ISpellCastingItem)wand.getItem()).selectNextSpell(wand); // Makes sure the spell is set immediately for the client
|
|
GuiSpellDisplay.playSpellSwitchAnimation(true);
|
|
Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(WizardrySounds.ITEM_WAND_SWITCH_SPELL, 1));
|
|
}
|
|
|
|
private static void selectPreviousSpell(ItemStack wand){
|
|
// Packet building
|
|
IMessage msg = new PacketControlInput.Message(PacketControlInput.ControlType.PREVIOUS_SPELL_KEY);
|
|
WizardryPacketHandler.net.sendToServer(msg);
|
|
// GUI switch animation
|
|
((ISpellCastingItem)wand.getItem()).selectPreviousSpell(wand); // Makes sure the spell is set immediately for the client
|
|
GuiSpellDisplay.playSpellSwitchAnimation(false);
|
|
Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(WizardrySounds.ITEM_WAND_SWITCH_SPELL, 1));
|
|
}
|
|
|
|
private static void selectSpell(ItemStack wand, int index){
|
|
// GUI switch animation
|
|
if(((ISpellCastingItem)wand.getItem()).selectSpell(wand, index)){ // Makes sure the spell is set immediately for the client
|
|
// Packet building (no point sending it unless the client-side spell selection succeeded
|
|
IMessage msg = new PacketSpellQuickAccess.Message(index);
|
|
WizardryPacketHandler.net.sendToServer(msg);
|
|
|
|
GuiSpellDisplay.playSpellSwitchAnimation(true); // This will do, it's only an animation
|
|
Minecraft.getMinecraft().getSoundHandler().playSound(PositionedSoundRecord.getMasterRecord(WizardrySounds.ITEM_WAND_SWITCH_SPELL, 1));
|
|
}
|
|
}
|
|
|
|
}
|