Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Implementing abilities


Recommended Posts

My mod adds abilities. These abilities range from spawning entities, spawning blocks, to changing the player's renderer and such. I am not sure how to implement it for multi-player.

I believe I can send a packet from the client to the server indicating that the ability has been executed, the server checks if the player can use the ability (to prevent cheating), and then sends that same packet to the other players that are in range (?). 


What do you think? Is this the optimal way to do it?

Link to comment
Share on other sites

23 minutes ago, diesieben07 said:

Okay then you'll have to send a packet to the server when this is done. This is the case in both singleplayer and multiplayer. The two are fundamentally the same thing, both use a server and a client. You shouldn't treat them any different, it only leads to bugs.

This answer does not help me. 

Is sending a packet to the server, then the server sending a packet to all the other clients ultimately the best way of doing it? Would it complicate rendering effects on other players? Has it been done before? How do I know which players to send the packet to (other players which can see the player executing the ability)?

Link to comment
Share on other sites

1 hour ago, diesieben07 said:

Yes that is the way to go.

To send a packet to all tracking players you can use PacketDistributor.TRACKING_ENTITY or TRACKING_ENTITY_AND_SELF to also include the player themselves.

Not sure why it would complicate rendering. It is the only way to do it.

What happens if a player e.g teleports to another player which is using an ability? wouldn't that break the system?

Link to comment
Share on other sites

You can use PlayerEvent.StartTracking for that.

To keep data in sync with all players you need to do the following:

  • In PlayerLoggedInEvent, PlayerRespawnEvent, PlayerChangedDimensionEvent send the player their own data.
  • In PlayerEvent.StartTracking send the data of getTarget (if it is a player) to getPlayer.
  • Whenever the data changes send it using TRACKING_ENTITY_AND_SELF.
Link to comment
Share on other sites

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.

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.


  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • you need to create your own FoliagePlacer, then use BiomeLoadingEvent to loop through the Features, check if the Feature is an TreeFeature then replace the original FoliagePlacer with Reflection or use an AT
    • 1.12 is no longer supported on this forum. Please update to a modern version of Minecraft to receive support.
    • I don’t know if you were addressing me but I can’t add an image for some reason, also I am just using the Forge website
    • I am not sure I follow. I will only need to get the block position very rarely. How is this a problem?
    • I am getting this ghost stripe:   textureManager.bind(TextureLocations.OVERLAY_CHAKRA_BAR); RenderSystem.enableBlend(); RenderSystem.blendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); matrix.pushPose(); AbstractGui.blit(matrix, x, y, 0, 0, selectedWidth, 4, TEX_WIDTH, TEX_HEIGHT); AbstractGui.blit(matrix, x - 18, y - 11, 0, 4, 205, 20, TEX_WIDTH, TEX_HEIGHT); if (jutsuData.hasNatures() && jutsuData.hasSelectedJutsu()) { float ratioAfterUse = (chakraData.getCurrentValue() - chakraCost) / (float) chakraData.getMaxValue(); int selectedWidthAfterUse = (int) (width * ratioAfterUse); if (chakraCost <= chakraData.getCurrentValue()) { AbstractGui.blit(matrix, x, y, 0, 23, selectedWidthAfterUse, 4, TEX_WIDTH, TEX_HEIGHT); AbstractGui.drawCenteredString( matrix, hud.getFont(), "after: " + (chakraData.getCurrentValue() - chakraCost), 60, y + 30, 0x00CCFF); } else { AbstractGui.blit(matrix, x, y, 0, 23, width, 4, TEX_WIDTH, TEX_HEIGHT); AbstractGui.drawCenteredString( matrix, hud.getFont(), "insufficient chakra!", 60, y + 30, 0xFF0000); } } AbstractGui.drawCenteredString( matrix, hud.getFont(), chakraData.getCurrentValue() + " / " + chakraData.getMaxValue(), 60, y + 50, 0x00CCFF); matrix.popPose(); RenderSystem.disableBlend(); Here is the texture: this is weird because the red texture was drawn correctly on top of the other one.
  • Topics

  • Who's Online (See full list)

  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.