Выполнение действий при зажатии кнопки мыши.

68
0
Здраствуйте, потскажите пожалуйста как лучше реализовать зажатие кнопки мыши в эвенте мышки. 
1. При зажатии кнопки менять на клиенте переменную (например назову ее lclick) c false на true и каждый тик (в методе update) если переменная lclick равна true отправлять пакет на сервер. А при отпускании менять переменную lclick с true на false.

2. При нажатии кнопки мыши посылать пакет об этом на сервер и там каждый тик делать действие до тех пор пока с клиента не придёт пакет сообщающий об отпускании кнопки.

Подскажите какой способ лучше , по оптимизации и по безопасности сервера. Или если вы знаете способ лучше поделитесь им пожалуйста. Заранее спасибо.
 
Agravaine написал(а):
Опиши конкретно для чего тебе нужно.
Мне нужно чтобы автомат стрелял раз в 10 тиков пока зажата кнопка. А при отпускании переставал стрелять . А при 1 нажании (без зажатия) стрелял 1 раз.
 
cfif31 написал(а):
Agravaine написал(а):
Опиши конкретно для чего тебе нужно.
Мне нужно чтобы автомат стрелял раз в 10 тиков пока зажата кнопка. А при отпускании переставал стрелять . А при 1 нажании (без зажатия) стрелял 1 раз.
Щас напишу...
[merge_posts_bbcode]Добавлено: 25.03.2015 23:16:29[/merge_posts_bbcode]

Код:
package com.svk.industrialGuns.Event;

import org.lwjgl.input.Mouse;

import scala.swing.event.MouseButtonEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;

import com.svk.industrialGuns.base.CommonProxy;
import com.svk.industrialGuns.guns.AutomaticFirearm;
import com.svk.industrialGuns.guns.Guns;
import com.svk.industrialGuns.guns.GunsAutomatic;
import com.svk.industrialGuns.guns.PistolFirearm;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.InputEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.relauncher.Side;

public class EventAutomaticFire 
{
    @SubscribeEvent
    public void TickEvent(TickEvent.ClientTickEvent e) 
    {
        if(Mouse.isButtonDown(0) && Minecraft.getMinecraft().thePlayer != null)
        {
            ItemStack item = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem();
            if(item != null && item.getItem() instanceof GunsAutomatic)
            {
                CommonProxy.packetSender.sendToServer(CommonProxy.packetSender.createPacket((byte)0, item));
            }
        }
    }
}
И
Код:
package com.svk.industrialGuns.Event;

import org.lwjgl.input.Mouse;

import scala.swing.event.MouseButtonEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;

import com.svk.industrialGuns.base.CommonProxy;
import com.svk.industrialGuns.guns.Guns;
import com.svk.industrialGuns.guns.GunsPistol;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.InputEvent;
import net.minecraftforge.client.event.MouseEvent;;

public class EventPistolFire 
{
    @SubscribeEvent
    public void MouseEvent(MouseEvent e) 
    {    
        if(e.buttonstate && e.button == 0)
        {
            ItemStack item = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem();

            if(item != null && item.getItem() instanceof GunsPistol)
            {
                CommonProxy.packetSender.sendToServer(CommonProxy.packetSender.createPacket((byte)0, item));
            }
        }
    }
}
И пакет:
Код:
            if(player.getCurrentEquippedItem() != null)
            {
                ItemStack item = ByteBufUtils.readItemStack(buf);
                if(player.getCurrentEquippedItem().getItem() == item.getItem())
                {
                    player.getCurrentEquippedItem().getTagCompound().setBoolean("isFire", true);
                }
            }

[merge_posts_bbcode]Добавлено: 25.03.2015 23:18:56[/merge_posts_bbcode]

Кажись что-то пропустил...
 
svk написал(а):
cfif31 написал(а):
Agravaine написал(а):
Опиши конкретно для чего тебе нужно.
Мне нужно чтобы автомат стрелял раз в 10 тиков пока зажата кнопка. А при отпускании переставал стрелять . А при 1 нажании (без зажатия) стрелял 1 раз.
Щас напишу...
[merge_posts_bbcode]Добавлено: 25.03.2015 23:16:29[/merge_posts_bbcode]

Код:
package com.svk.industrialGuns.Event;

import org.lwjgl.input.Mouse;

import scala.swing.event.MouseButtonEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;

import com.svk.industrialGuns.base.CommonProxy;
import com.svk.industrialGuns.guns.AutomaticFirearm;
import com.svk.industrialGuns.guns.Guns;
import com.svk.industrialGuns.guns.GunsAutomatic;
import com.svk.industrialGuns.guns.PistolFirearm;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.InputEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import cpw.mods.fml.relauncher.Side;

public class EventAutomaticFire 
{
    @SubscribeEvent
    public void TickEvent(TickEvent.ClientTickEvent e) 
    {
        if(Mouse.isButtonDown(0) && Minecraft.getMinecraft().thePlayer != null)
        {
            ItemStack item = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem();
            if(item != null && item.getItem() instanceof GunsAutomatic)
            {
                CommonProxy.packetSender.sendToServer(CommonProxy.packetSender.createPacket((byte)0, item));
            }
        }
    }
}
И
Код:
package com.svk.industrialGuns.Event;

import org.lwjgl.input.Mouse;

import scala.swing.event.MouseButtonEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.item.ItemStack;

import com.svk.industrialGuns.base.CommonProxy;
import com.svk.industrialGuns.guns.Guns;
import com.svk.industrialGuns.guns.GunsPistol;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.InputEvent;
import net.minecraftforge.client.event.MouseEvent;;

public class EventPistolFire 
{
    @SubscribeEvent
    public void MouseEvent(MouseEvent e) 
    {    
        if(e.buttonstate && e.button == 0)
        {
            ItemStack item = Minecraft.getMinecraft().thePlayer.getCurrentEquippedItem();

            if(item != null && item.getItem() instanceof GunsPistol)
            {
                CommonProxy.packetSender.sendToServer(CommonProxy.packetSender.createPacket((byte)0, item));
            }
        }
    }
}
И пакет:
Код:
            if(player.getCurrentEquippedItem() != null)
            {
                ItemStack item = ByteBufUtils.readItemStack(buf);
                if(player.getCurrentEquippedItem().getItem() == item.getItem())
                {
                    player.getCurrentEquippedItem().getTagCompound().setBoolean("isFire", true);
                }
            }
Большее спасибо. То что нужно. Спасибо.
 
А вот,пакет клиентский...
Вот серверный: 
Код:
            if(player.getCurrentEquippedItem() != null)
            {
                ItemStack item = ByteBufUtils.readItemStack(buf);
                if(player.getCurrentEquippedItem().getItem() == item.getItem())
                {
                    player.getCurrentEquippedItem().getTagCompound().setBoolean("isFire", true);
                    CommonProxy.packetSender.sendToClients(CommonProxy.packetSender.createPacket((byte)0, item));
                }
            }

Если менять isFire из евента - будет не хилая рассинхронизация, так-что надо серверу слать пакет клиенту (Поставить оба пакета)
 
svk написал(а):
А вот,пакет клиентский...
Вот серверный: 
Код:
            if(player.getCurrentEquippedItem() != null)
            {
                ItemStack item = ByteBufUtils.readItemStack(buf);
                if(player.getCurrentEquippedItem().getItem() == item.getItem())
                {
                    player.getCurrentEquippedItem().getTagCompound().setBoolean("isFire", true);
                    CommonProxy.packetSender.sendToClients(CommonProxy.packetSender.createPacket((byte)0, item));
                }
            }

Если менять isFire из евента - будет не хилая рассинхронизация, так-что надо серверу слать пакет клиенту (Поставить оба пакета)
Сейчас протестирую Спасибо за ответ.
 
Назад
Сверху