Posted April 10, 20169 yr Hi everyone, I have an item that stores an entity. I want this item to spawn the entity a given distance away from wherever the player right clicked the item based on a raytrace. I now have an issue if (world.isRemote){ MovingObjectPosition mop = player.rayTrace(5, 1.0F); int xCoord; int yCoord; int zCoord; if (!world.isAirBlock(mop.blockX, mop.blockY, mop.blockZ)){ xCoord = mop.blockX; yCoord= mop.blockY + 1; zCoord = mop.blockZ; } else { xCoord = mop.blockX; yCoord= mop.blockY; zCoord = mop.blockZ; } //send the packet here to update the server values so that I can then spawn my entity at a later time in the code } The ray trace has to occur client side but I need the results of the ray trace on server side. How would you suggest the packet to work so that I can pass the values from the client player to the server so that they can be used to spawn the entity? public class PacketC2SUpdateRayTraceCoords extends AbstractMessageToServer<PacketC2SUpdateRayTraceCoords> { private int xCoord; private int yCoord; private int zCoord; public PacketC2SUpdateRayTraceCoords() { } public PacketC2SUpdateRayTraceCoords(int xCoord, int yCoord, int zCoord) { //these are obtained from the client this.xCoord = xCoord; this.yCoord = yCoord; this.zCoord = zCoord; } @Override protected void read(PacketBuffer buffer) throws IOException { xCoord = buffer.readInt(); yCoord = buffer.readInt(); zCoord = buffer.readInt(); } @Override protected void write(PacketBuffer buffer) throws IOException { buffer.writeInt(xCoord); buffer.writeInt(yCoord); buffer.writeInt(zCoord); } @Override public void process(EntityPlayer player, Side side) { //The stuff in here occurs server side } }
April 10, 20169 yr Author My thoughts were to use my IEEP class for my player so that I can simply grab the values from the ray trace send them to the IEEP class on server side and then access the IEEP class from server side in the onItemRightClick method to use them for my spawning coordinates but I feel like there is a better way to achieve this since my rayTrace would happen in the onItemRightClick method
April 10, 20169 yr Raytracing doesn't have to happen on the client side, you've just picked a client-only method. Look at ItemMonsterPlacer#onItemRightClick to see how it raytraces on the server side. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
April 11, 20169 yr Author I have been looking at it but when I try to use their method i cannot achieve what i want since the movingObjectPosition is null when you aim into the sky and I want my mob to spawn regardless of where you point the mouse (at a set radius) and if you point it on the ground it spawns just above the block you pointed at.
April 11, 20169 yr The last argument of World#rayTraceBlocks (used by both EntityLivingBase#rayTrace and Item#getMovingObjectPositionFromPlayer ) determines whether it should return the MovingObjectPosition of the last uncollidable block or null when the raytrace doesn't hit anything. You'll need to call this yourself with the appropriate arguments rather than using one of its wrappers, though you can reuse the code from Item#getMovingObjectPositionFromPlayer . Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
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.