Turtledove Posted May 10, 2020 Posted May 10, 2020 (edited) Based on the default player inputs (left click with WASD), I'm trying to change the behavior of sword attacks, however I've run into a problem. 1. Server-side, I've gone and cancelled the event whenever the player is attacking an entity with a sword, this is the event thats called whenever attackEntityFrom is called. 2. Client-side, when the player presses the left key and strike, I cancel the vanilla sword animations + rendering, and do my own. Then I send a packet to server to let it know to do my logic there. 3.???? Step 3 is the problem, I then need to be able to call attackEntityFrom, but it would get cancelled because of #1, correct? What do I need to do to circumvent this? Edited May 10, 2020 by Turtledove Quote
Turtledove Posted May 10, 2020 Author Posted May 10, 2020 (edited) I wonder if it'll work if I do something stupid like: if damage source is player { if damage source's main hand is sword { cancel event //call replacement logic call attackEntityFrom(CUSTOM DAMAGE SOURCE, 100.0F) } } else //let the event happen Is there a better way to do this? Edited May 10, 2020 by Turtledove Quote
Turtledove Posted May 10, 2020 Author Posted May 10, 2020 6 hours ago, diesieben07 said: I am not sure why you need step one at all. If you cancel the client-side left-click handling the server will never know you left clicked and will never execute the attack logic. I don't cancel anything related to attack logic clientside, I only cancel the render event there. I cancel the event that attackentity calls, on the server. So the results should be something like: Player left clicks -> Cancel render event, render my own weapon animation -> send packet to server -> Cancel the attack event if the source is from a player holding a sword, otherwise leave it alone -> call attackentity manually, but change damage source to custom, that way it can pass through the previous step when it's called a second time. And I'm not sure if there's a better way to do this Quote
Turtledove Posted May 10, 2020 Author Posted May 10, 2020 44 minutes ago, diesieben07 said: Prevent the client from ever sending the "I attacked" action? You can cancel InputEvent.ClickInputEvent (which I assume you are using to detect attacking on the client side), which will prevent the server from ever knowing about the attack. I see, it's better to be more direct. But cancelling the input event prevents the sword swing from activating, the render hand event relies on the sword swing progress values to animate properly. In that case how would I manually initialize the swing progress counter? Quote
Turtledove Posted May 10, 2020 Author Posted May 10, 2020 18 minutes ago, diesieben07 said: Looking at the code what you said does not seem correct. Cancelling ClickInputEvent will still swing the hand. Preventing that would be a separate call (ClickInputEvent#setSwingHand). Is that not what you are talking about? Hm right now I've something like: public static void onMouseEvent(InputEvent.ClickInputEvent event) { if (player is holding sword) { if (player attacks) return; } } And the sword doesn't swing. Quote
Turtledove Posted May 10, 2020 Author Posted May 10, 2020 (edited) 39 minutes ago, diesieben07 said: Please do not post pseudocode... Apologies, I was out and about when I posted that Anyhow, the more i think about it I think it's best if I do more of the logic server-side instead, with what I'm trying to do. I need to prevent the player from swinging the sword until a certain number of ticks pass, so I'll probably just attach a value to the player whether they can swing by incrementing a tick counter on the server. Then send a packet to the client when they can swing again, and either let it happen or cancel swinghand like you said. Edited May 10, 2020 by Turtledove Quote
Turtledove Posted May 10, 2020 Author Posted May 10, 2020 3 hours ago, diesieben07 said: Please do not post pseudocode... One last question, how would I get the current attack cooldown value? Is that on the server or both? Quote
Recommended Posts
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.