Jump to content

[SOLVED] [1.19.2] My method call is not changing my entity's texture


TheMajorN

Recommended Posts

Heya, so I'll explain this in the clearest way I can, but forgive me if it gets confusing:

I'm creating a behavior for my entity, where every now and then it petrifies and animates from statue to golem (It's a tuff golem, I wish it won so I'm making it myself).

I have a method to petrify it that looks like the following (There's also a complimentary animate() method that does the exact opposite):

public void petrify() {
        this.isPetrifying = true;	// The animation controller sets this to false when it's done animating
        this.setSpeed(0.0F);
        this.isAnimated = false;
        this.isPetrified = true;
    }

When it's petrified, I have it set so that it's texture changes to match the petrification.  For testing purposes, I made it so that whenever I right click it with the tuff block, it will induce petrification and animation. <- This changes the texture no problem.

Here's the snippet of code that induces petrification in the mobInteract method in the entity class:

if (itemInPlayerHand.is(Items.TUFF) && player.isCrouching()) {
            if (this.isAnimated) {
                petrify();
            } else {
                animate();
            }
        }

Here's what it looks like in the model class:

@Override
    public ResourceLocation getTextureResource(TuffGolemEntity object) {
        if (object.isPetrified()) {
            return  new ResourceLocation(TuffGolem.MOD_ID, "textures/entities/tuff_golem_petrified.png");
        } else {
            return  new ResourceLocation(TuffGolem.MOD_ID, "textures/entities/tuff_golem.png");
        }
    }

However, when I use the behavior, I call upon this exact method.  When this happens, the movement speed reduces to zero, but the texture doesn't change despite the entity being marked as petrified.  I'm thinking it somehow got convoluted or for some reason the change isn't making it to the model class.

Here's what the behavior method looks like:

protected void start(ServerLevel level, TuffGolemEntity tuffGolem, long l) {
        if (tuffGolem.isPetrified()) {
            tuffGolem.animate();
            TuffGolem.LOGGER.info("Tuff Golem Animated!"); // for testing
        } else {
            tuffGolem.petrify();
            TuffGolem.LOGGER.info("Tuff Golem Petrified!"); // for testing
        }
        tuffGolem.playSound(getAnimateOrPetrifySound);
    }

Here's the full behavior class if you'd like to take a look: https://github.com/TheMajorN/Tuff-Golem/blob/master/src/main/java/com/themajorn/tuffgolem/common/behaviors/PetrifyOrAnimate.java

Here's the full entity class as well: https://github.com/TheMajorN/Tuff-Golem/blob/master/src/main/java/com/themajorn/tuffgolem/common/entities/TuffGolemEntity.java#L242

And finally here's the full model class: https://github.com/TheMajorN/Tuff-Golem/blob/master/src/main/java/com/themajorn/tuffgolem/client/models/TuffGolemModel.java

 

I'd just appreciate any indications as to why I can induce the new texture in the mobInteract method, but can't change the texture with the exact same method in the behavior class.

Edited by TheMajorN
Issue resolved
Link to comment
Share on other sites

Your behaviour class runs on the server. While the mobInteract runs on both the client and server.

https://forge.gemwire.uk/wiki/Sides

So you are only modifying that value on the server. But it needs to be on the client for rendering.

You should define the petrified flag like you have the cloak color so the data is synched from the server to the client.

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Link to comment
Share on other sites

Hey warjort, I'm fairly new to entity data syncing, and I don't think I did it right.  It still isn't working in the game.

I made the variable in my entity class:

private static final EntityDataAccessor<Byte> DATA_IS_PETRIFIED = SynchedEntityData.defineId(TuffGolemEntity.class, EntityDataSerializers.BYTE);

And added it to the define, addSaveData and addSaveData methods:

protected void defineSynchedData() {
        super.defineSynchedData();
        this.entityData.define(DATA_FLAGS_ID, (byte)0);
        this.entityData.define(DATA_CLOAK_COLOR, DyeColor.WHITE.getId());
        this.entityData.define(DATA_IS_PETRIFIED, isPetrified());
    }

    public void addAdditionalSaveData(CompoundTag tag) {
        super.addAdditionalSaveData(tag);
        tag.put("Inventory", this.inventory.createTag());
        tag.putBoolean("PlayerCreated", this.isPlayerCreated());
        tag.putBoolean("isPetrified", this.isPetrified());
        tag.putByte("CloakColor", (byte)this.getCloakColor().getId());
    }

    public void readAdditionalSaveData(CompoundTag tag) {
        super.readAdditionalSaveData(tag);
        this.inventory.fromTag(tag.getList("Inventory", 10));
        this.setPlayerCreated(tag.getBoolean("PlayerCreated"));
        this.setPetrified(tag.getBoolean("isPetrified"));
        if (tag.contains("CloakColor", 99)) {
            this.setCloakColor(DyeColor.byId(tag.getInt("CloakColor")));
        }
    }

For the readAdditionalSaveData method I took from the setPlayerCreated method and tried to make the setPetrified equivalent:

public void setPetrified(boolean petrified) {
        byte b0 = this.entityData.get(DATA_IS_PETRIFIED);
        if (petrified) {
            this.entityData.set(DATA_IS_PETRIFIED, (byte)(b0 | 1));
        } else {
            this.entityData.set(DATA_IS_PETRIFIED, (byte)(b0 & -2));
        }
    }

Am I missing anything?

Link to comment
Share on other sites

You should just remove the normal isPetrified field.

Then make your isPetrified()/setPetrified() access the entityData.

 

Just doing isPetrifed = false isn't going to call setPetrified() and so it won't sync to the client.

Similarly doing if (isPetrified) on the client isn't going reference the entityData which has the value sent from the server.

Edited by warjort

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Link to comment
Share on other sites

  • TheMajorN changed the title to [SOLVED] [1.19.2] My method call is not changing my entity's texture

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



×
×
  • Create New...

Important Information

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