Jump to content

[SOLVED] Custom EntityHanging EntityTracking (teleport/setPositionAndRotation2)


Recommended Posts

Hello everyone,


I apologize for this being my first post on the forums being a question seeking assistance, I normally try to work out my issues myself, but I know that you all more familiar with Forge than I am.


While playing Minecraft with my friend on my private server I had the idea of creating custom paintings but without using a texture pack.  The result of this was a mod that allows you to place paintings on the wall specifying a URL and blocks wide and high and it will display the picture on the wall after loading.


It works almost perfectly, there's only one issue I found and I'm not sure what to do about it.


I found that my entity would move up periodically on the EntityTracking updates a certain distance depending on varying factors and then move back down on the force teleport section.


I found that by overriding the setPositionAndRotation2 method and just having it do nothing at all it fixed the problem and I was okay with that for a while.  The problem I found though that was if the painting has a block in the center of it at the very top it will display completely black (or if GL lighting is turned off it will dim).


Here are a few snapshots of it in action:


Note in this image above the painting on the right working perfectly fine.


To remedy this, I found that it was actually the fault of me overriding setPositionAndRotation2, and so by adding the code found in the EntityPainting for this method, it displayed the picture fine for a moment, until it then moved up like it once did before.


Here are some snapshots of how it works (please note the image is stretched on purpose):


Here you can see the picture actually moves up half of a block space initially.



Here you can see once it receives the forced teleport it shifts up a full block from the half it originally moved up.


I'm not sure what is causing this, but it is also causing my bounding box to screw up as well, and by looking slightly away from the painting it will be seen as out of view in the frustum and disappear, also this makes trying to hit it off the wall impossible only in the "center".


Here is a picture of the image not being black once you remove the center block at the top:



Here is a picture of the middle block not blocked, you'll note that you can actually block off any other block except this one:



You can view the entire mod's source code here.


Edit: One final note, if you actually set the bounding box size to be 16 for width and height, it will actually render just fine, even if you put it flush with the top of a block, however, because of this it wont render in the frustum correctly, and you cannot hit it off the wall unless in the center of the entity.


I hope that someone can be of assistance, it's a fun idea to be able to put images in Minecraft like this, my friend and I both have laughed at the funny pictures put up, and making bilboards with ads on them as a joke.  I hope that I can get this small problem fixed so that it will be perfect.



There's no place like ~/

Link to comment
Share on other sites

I ended up solving my problem.


I couldn't figure out what was happening, but my bounding box was completely screwing up because of the entity tracking so removing the code from the setPositionAndRotation2 is my temporary solution which I don't mind.


As for the black entity problem, I added this to my rendering:

int fX = MathHelper.floor_double(entity.posX);
int fY = MathHelper.floor_double(entity.posY + (double)(y / 16.0F));
int fZ = MathHelper.floor_double(entity.posZ);


And then where I check for hanging direction on the render I change the fX or fZ depending on what side it's hanging like this:

if (entity.hangingDirection == 2)
    fX = MathHelper.floor_double(entity.posX + (double)(x / 16.0F));

if (entity.hangingDirection == 1)
    fZ = MathHelper.floor_double(entity.posZ - (double)(x / 16.0F));

if (entity.hangingDirection == 0)
fX = MathHelper.floor_double(entity.posX - (double)(x / 16.0F));

if (entity.hangingDirection == 3)
fZ = MathHelper.floor_double(entity.posZ + (double)(x / 16.0F));


Then finally this:

// get the proper light value
int light = this.renderManager.worldObj.getLightBrightnessForSkyBlocks(fX, fY, fZ, 0);
// get the x bit
int lightX = light % 65536;
// get the y bit
int lightY = light / 65536;
// set the lightmap texture coords
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)lightX, (float)lightY);
// ensure gl color is white
GL11.glColor3f(1.0F, 1.0F, 1.0F);


You can view the commit for these changes here.


I hope this helps someone who has this problem in the future.



There's no place like ~/

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.

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.


  • Create New...

Important Information

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