Jump to content

[1.6.x]Subscribing to LEFT_CLICK / (swingItem());


Recommended Posts

Posted

Hello,

Seems like I've got another issue.

Is there a ForgeSubscribe event that can track player LEFT-click swing?

        RIGHT_CLICK_AIR,

        RIGHT_CLICK_BLOCK,

        LEFT_CLICK_BLOCK

 

WHY THERE IS NO LEFT_CLICK_AIR :C

If not (which seems like there is not), would LivingUpdateEvent be good to track if(player.swingItem())? (pseudo)?

Any other thoughts? (I need to play sound when player uses swords and shit)

1.7.10 is no longer supported by forge, you are on your own.

Posted

Well,

I've been doing some researches and tests.

Put up something via PlayerInteractEvent.

Checking with:

if (player.isSwingInProgress) playSound()

Sadly this means that turbo-swing-speed gives you milti-sound effect which we don't want to get, so I used:

player.swingProgressInt

Value above is totally I-don't-know-what, beacuse it runs from -1, 0, 1, sometimes 3, 4 or even 5; yet I cannot resolve which is called in what situation, my best shot was to test them, and what I got now is

if (player.isSwingInProgress && player.swingProgressInt != 0) playSound()

Which gives me BEARABLE effect (not spamming so much during multi-click)

*If anyone is interested "0" value is when you you are not performing leftclick.

 

Well, this is one way to do this, yet there is still problem:

isSwingInProgress is NOT called when you click on AIR, which makes me want to use pain-in-the-ass-ointment.

Second:

PlayerInteractEvent is being called for every other something-click (right-click and shit), can it be shortened? (I mean only to left-clicks)

 

Cmon ppl, some ideas? Maybe there is a better way of doing something like this?

 

Thanks :)

 

 

1.7.10 is no longer supported by forge, you are on your own.

Posted

I actually looked at this a few months ago when I was trying to fix the way attacking was handled. And yeah, it was a giant pain in the ass.

These are the methods I created for testing (all of them were in my EventHandler) and pulled out of my Github repo; hopefully something here will be helpful. Note: this is very hacky and almost certainly won't work outside of an integrated server environment.

 


        public static EntityPlayer player = null;
        public static final int MOUSE_LEFT_CLICK = 0;
        public static final int MOUSE_RIGHT_CLICK = 1;
        public static final int MOUSE_MIDDLE_CLICK = 2;

//        @ForgeSubscribe
//        public void onPlayerInteractEvent(PlayerInteractEvent event) {
//                if (!event.entityPlayer.worldObj.isRemote) {
//                        if (event.action == Action.LEFT_CLICK_BLOCK
//                                        && event.entityPlayer.swingProgressInt == -1) {
//                                System.out.println("Click");
//                        } else {
//                                System.out.println("Bad swing");
//                                event.entityPlayer.isSwingInProgress = false;
//                        }
//
//                }
//        }

        @ForgeSubscribe
        public void onMouseClick(MouseEvent event) {
//                logMousePress(event);
                if(player == null) {
                        player = Minecraft.getMinecraft().thePlayer;
                }
                if(event.button == MOUSE_LEFT_CLICK && event.buttonstate) {
                        if(player.swingProgressInt != 0) {
                                event.setCanceled(true);
                        }
                }
        }

private void logMousePress(MouseEvent event) {
        if(event.button != -1) {
                StringBuilder builder = new StringBuilder();
                builder.append("Button: ");
                builder.append(event.button);
                builder.append(" ButtonState: ");
                builder.append(event.buttonstate);
                builder.append(" Nanoseconds: ");
                builder.append(event.nanoseconds);
            builder.append(" X: ");
            builder.append(event.x);
            builder.append(" Y: ");
            builder.append(event.y);
            builder.append(" Dx: ");
            builder.append(event.dx);
            builder.append(" Dy: ");
            builder.append(event.dy);
            builder.append(" Dwheel: ");
            builder.append(event.dwheel);

                System.out.println(builder);
        }
}

Posted

You can intercept all mouse actions using MouseEvent from minecraft.forge.net.client.event.

event.button // id of button: 0 left, 1, right, -1 wheel
event.buttonstate // true when pressed, false when released
event.dwheel // mouse wheel amount
event.setResult(Event.Result.DENY) // prevents the click from processing, but button.pressed will still be true
event.setCanceled(true) // completely cancels the button press, such that button.pressed is not set to true

If you want to see this in action, you can take a look at how I handle user input for my Zelda Sword Skills mod. In the ZSSEventHandler class, search for 'onMouseChanged'. Here's the github link:

https://github.com/coolAlias/ZeldaSwordSkills/blob/master/src/zeldaswordskills/handler/ZSSEventHandler.java

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.