/**
* Copyright (c) Lambda Innovation, 2013-2015
* 本作品版权由Lambda Innovation所有。
* http://www.li-dev.cn/
*
* This project is open-source, and it is distributed under
* the terms of GNU General Public License. You can modify
* and distribute freely as long as you follow the license.
* 本项目是一个开源项目,且遵循GNU通用公共授权协议。
* 在遵照该协议的情况下,您可以自由传播和修改。
* http://www.gnu.org/licenses/gpl.html
*/
package cn.weaponry.core.ctrl;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import org.lwjgl.input.Keyboard;
import cn.annoreg.core.Registrant;
import cn.annoreg.mc.RegEventHandler;
import cn.annoreg.mc.RegEventHandler.Bus;
import cn.annoreg.mc.RegInit;
import cn.annoreg.mc.network.RegNetworkCall;
import cn.annoreg.mc.s11n.StorageOption;
import cn.liutils.util.helper.KeyHandler;
import cn.liutils.util.helper.KeyManager;
import cn.weaponry.api.ctrl.IItemCtrlListener;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent.ClientTickEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/**
* @author WeAthFolD
*/
@Registrant
@RegInit(side = RegInit.Side.CLIENT_ONLY)
@RegEventHandler(Bus.FML)
public class WeaponControllerClient {
public static int KEYS[] = { KeyManager.MOUSE_LEFT, KeyManager.MOUSE_RIGHT, Keyboard.KEY_R };
@SideOnly(Side.CLIENT)
private static KH handlers[];
@SideOnly(Side.CLIENT)
public static void init() {
handlers = new KH[3];
for(int i = 0; i < 3; ++i) {
KeyManager.dynamic.addKeyHandler("weaponry_" + i, KEYS[i], handlers[i] = new KH(i));
}
}
@SubscribeEvent
public void onClientTick(ClientTickEvent event) {
if(event.phase == Phase.END) return;
for(KH kh : handlers) {
kh.tick();
}
}
@RegNetworkCall(side = Side.SERVER)
static void serverSendEvent(
@StorageOption.Instance EntityPlayer player,
@StorageOption.Data Byte keyID,
@StorageOption.Instance SyncEventType type) {
WeaponControllerServer.sendEvent(player, keyID, type);
}
private static void localSendEvent(EntityPlayer player, int keyID, SyncEventType type) {
ItemStack stack = player.getCurrentEquippedItem();
if(stack != null && stack.getItem() instanceof IItemCtrlListener) {
((IItemCtrlListener)stack.getItem()).onKeyEvent(player, keyID, type.keyEvent);
}
}
@SideOnly(Side.CLIENT)
private static class KH extends KeyHandler {
final int virtualKey;
boolean keyDown;
int ticker;
int tickSendCounter = 0;
public KH(int i) {
virtualKey = i;
}
@Override
public void onKeyDown() {
doKeyDown();
}
@Override
public void onKeyUp() {
doKeyUp();
}
@Override
public void onKeyTick() {
doKeyTick();
}
@Override
public void onKeyAbort() {
doKeyAbort();
}
public void tick() {
if(keyDown) {
if(++ticker > 5) {
ticker = 0;
doKeyAbort();
}
}
}
private void doKeyDown() {
if(!keyDown) {
sendEvent(SyncEventType.DOWN);
keyDown = true;
}
}
private void doKeyAbort() {
if(keyDown) {
sendEvent(SyncEventType.ABORT);
keyDown = false;
}
}
private void doKeyUp() {
if(keyDown) {
sendEvent(SyncEventType.UP);
keyDown = false;
}
}
private void doKeyTick() {
if(keyDown) {
if(++tickSendCounter == 5) { //Only send once per 5 ticks~
tickSendCounter = 0;
sendEvent(SyncEventType.KEEPALIVE);
}
ticker = 0;
}
}
@SideOnly(Side.CLIENT)
private void sendEvent(SyncEventType type) {
//Check player
if(Minecraft.getMinecraft().thePlayer == null)
return;
localSendEvent(Minecraft.getMinecraft().thePlayer, virtualKey, type); //Dispatch to Client
serverSendEvent(Minecraft.getMinecraft().thePlayer, (byte) virtualKey, type); //Dispatch to Server
}
}
}