Jump to content

Recommended Posts

Posted

This code is in EntityWolf

 

     /**
     * Determines whether this wolf is angry or not.
     */
    public boolean isAngry()
    {
        return (this.dataWatcher.getWatchableObjectByte(16) & 2) != 0;
    }

    /**
     * Sets whether this wolf is angry or not.
     */
    public void setAngry(boolean par1)
    {
        byte var2 = this.dataWatcher.getWatchableObjectByte(16);

        if (par1)
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 2)));
        }
        else
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -3)));
        }
    }

 

And this code is in EntityTameable

 

public boolean isTamed()
    {
        return (this.dataWatcher.getWatchableObjectByte(16) & 4) != 0;
    }

    public void setTamed(boolean par1)
    {
        byte var2 = this.dataWatcher.getWatchableObjectByte(16);

        if (par1)
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 4)));
        }
        else
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -5)));
        }
    }

 

I have looked this up online, and haven't been able to quite figure it out yet. I'm assuming that these functions are saving or loading a byte. Another assumption I'm making is that 16 is the number referencing to which byte to save or load. What really confuses me though, is that both taming and angry use 16, so wouldn't these override each other? I'm messing with this because I need to do the same thing as isTamed and isAngry do, to change the texture of my animal if you click it with a pink dye. Since this is how the game does it, I figured I should do it this way as well. If you can help me understand what this function does, I would really appreciate it.

Posted

I also found it here

 

public boolean isSitting()
    {
        return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0;
    }

    public void setSitting(boolean par1)
    {
        byte var2 = this.dataWatcher.getWatchableObjectByte(16);

        if (par1)
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 | 1)));
        }
        else
        {
            this.dataWatcher.updateObject(16, Byte.valueOf((byte)(var2 & -2)));
        }
    }

Posted

Minecraft uses Bit operations here to store multiple things in one byte.

e.g.: 14 & 1 gives you the value of the first bit in 14 (which is 0, because 14 = 1110 in binary) and 15 & 4 gives 4 (15 = 1111 in binary).

 

I'm still a little bit confused. If I understand correctly with the function (dataWatcher.getWatchableObjectByte(16) & 1), this means the value in the first byte of 16 (which I believe to be 10000) which would normally be 0) since the zero in that bit means false to that value. Now if it had been (17) & 1, or (10001), it would have returned 1 since a one in that bit means true to that value, and that bit represents a value of one.

 

If I have that correct, then here is my confusion, in your example above you state (15) & 1 gives 4, but wouldn't it give 8, since the fourth bit over represents a value of 8 and the third byte over represents 4.

 

If I am wrong in my above statements, I would appreciate it if you would explain what I've done wrong. If I am correct I hope I have not offended you, as you just saved my butt majorly. I have been looking all over the place and asking a lot of people and getting no help at all. You are amazing!

Posted

I decided to try and step through isSitting() and setSitting(), to see if I now understand them. And I'm just going to assume I misunderstood something, since the way I'm doing it will always come up with the same return in isSitting(). If it isn't to much to ask, would you mind stepping through isSitting() and setSitting() and explaining them. If it is unreasonable, I understand.

Posted

Ok, why not :)

First isSitting():

return (this.dataWatcher.getWatchableObjectByte(16) & 1) != 0;

dataWatcher.getWatchableObjectByte(16) gets a byte with Index 16 from the data watcher (the data watcher is the thing that syncs entity data between client & server).

A byte is 8 bits, e.g. 0000 0001, their "values" are 1, 2, 4, 8, 16, ... (2^n).

The & operator compares two numbers bitwise. If you compare lets say 1010 and 1000 with & you get: 1010 & 1000 = 1000 (only the bits which are set in both numbers are set in the result).

Now the number 1 looks like this (only 4 bits for simplicity): 0001. If you now compare that to any byte with & you only get the first bit of that byte. Examples:

1010 & 0001 == 0000

1011 & 0001 == 0001

So isSitting returns true if the first bit of the byte with ID 16 in the data watcher is set.

 

Now setSitting(boolean sitting).

First it gets the byte value with ID 16 again.

Then there are 2 options: either sitting is true or false. If its true we want to set the first bit to 1. Therefor we use the | (bitwise or) operator. Examples:

1010 | 0001 == 1011

1011 | 0001 == 1011

You see: If you combine any byte value with 1  by bitwise or, you get the same byte back, except that the first bit is always set, no matter if it was set before or not. That's exactly what we want for letting the dog sit (sitting == true).

 

Now if the dog should stop sitting. Now we need to set the first bit to 0, no matter what it was before. Easy task:

1010 & 1110 == 1010

1011 & 1110 == 1010

Now whats the value of 1111 1110? -2 :D

There you go, I hope that was at least a bit helpful :D

 

Yes Sir/Mam, that makes sense now. So with your previous example, it gave four because it was returning the byte in the bit representing four, not returning the bit four places over.

 

The only thing I don't understand is why 1111 1110 becomes a negative number, but I'm sure I can find that on the internet. I'm assuming we need a number with all ones (except for in the place we are resetting to 0) so that any other ones won't be reset. So if I wanted to change the bit representing 8 to 0, I would use, 1111 0111.

 

I should be able to continue now!!!!!!

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Yep I did upgrade just because it showed me a new version available.  I'll redownload the mod list and make sure anything works.  Thanks!
    • The latest log was taken down by pastebin for some reason. Did you try removing the mods you added? The mods you updated, was there a specific reason you updated, or just because? It's possible the updates introduced incompatibilitie, or even need a newer build of forge. If you didn't need the updates for a specific reason, you could also try downgrading those mods.
    • Please read the FAQ, and post logs as described there. https://forums.minecraftforge.net/topic/125488-rules-and-frequently-asked-questions-faq/
    • I am using forge 1.20.1 (version 47.3.0). My pc has an RTX 4080 super and an i9 14900 KF, I am on the latest Nvidia graphics driver, latest windows 10 software, I have java 23, forge 1.12.2 works and so does all vanilla versions but for some reason no version of forge 1.20.1 works and instead the game just crashes with the error code "-1." I have no mods in my mods fodler, I have deleted my options.txt and forge.cfg files in case my settings were causing a crash and have tried removing my forge version from the installations folder and reinstalling but no matter what I still crash with the same code and my log doesn't tell me anything: 18:34:53.924 game 2025-02-06 18:34:53,914 main WARN Advanced terminal features are not available in this environment 18:34:54.023 game [18:34:54] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher running: args [--username, mrmirchi, --version, 1.20.1-forge-47.3.0, --gameDir, C:\Users\aryam\AppData\Roaming\.minecraft, --assetsDir, C:\Users\aryam\AppData\Roaming\.minecraft\assets, --assetIndex, 5, --uuid, 2db00ea8d678420a8956109a85d90e9d, --accessToken, ????????, --clientId, ZWI3NThkNzMtNmNlZS00MGI5LTgyZTgtYmZkNzcwMTM5MGMx, --xuid, 2535436222989555, --userType, msa, --versionType, release, --quickPlayPath, C:\Users\aryam\AppData\Roaming\.minecraft\quickPlay\java\1738838092785.json, --launchTarget, forgeclient, --fml.forgeVersion, 47.3.0, --fml.mcVersion, 1.20.1, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20230612.114412] 18:34:54.027 game [18:34:54] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher 10.0.9+10.0.9+main.dcd20f30 starting: java version 17.0.8 by Microsoft; OS Windows 10 arch amd64 version 10.0 18:34:54.132 game [18:34:54] [main/INFO] [ne.mi.fm.lo.ImmediateWindowHandler/]: Loading ImmediateWindowProvider fmlearlywindow 18:34:54.191 game [18:34:54] [main/INFO] [EARLYDISPLAY/]: Trying GL version 4.6 18:34:54.303 game [18:34:54] [main/INFO] [EARLYDISPLAY/]: Requested GL version 4.6 got version 4.6 18:34:54.367 monitor Process Monitor Process crashed with exit code -1     screenshot of log: https://drive.google.com/file/d/1WdkH88H865XErvmIqAKjlg7yrmj8EYy7/view?usp=sharing
    • I am currently working on a big mod, but I'm having trouble with my tabs, I want to find a way to add tabs inside tabs, like how in mrcrayfishes furniture mod, his furniture tab has multiple other sub tabs to them, so i know it is possible but i just don't know how it is possible, any help would be appreciated, thanks
  • Topics

×
×
  • Create New...

Important Information

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