Jump to content

Recommended Posts

Posted

good nigths

 

this is little hard topic to explain, english is not mi native languague but event in espanish is hard to explain,

 

vainilla minecraft has a custom animation on the items when you switch items , i dont know how is called ill named it  "switch animation" 

you has a ironsword in the first slot of the hotbar then you change to the second slot that has an apple  so minecraft do animated in way the iron sword moves down and then the apple comes up,

 

this is a video showing what im talking about 

 

i discover this animation gets executed when an item enter in use whith the command playerIn.setItemInUse(ItemStack this.getMaxItemUseDuration(ItemStack));

when you have a bow and begin to pull it actualy do "switch animation" one time, then behaves normaly switch textures while you hold rigth click until you release the arrow

and this is a trouble for what im triying to do,

in this video i show the issue whith vainilla bow then whit mi custom bow and last mi custom pistol. 

 

this is what im triying to do, "fireguns", in this one when i shoot it does "switch animation" the pistol moves down change texture and then comes up, i put the zomby pigman to state that the pistol actualy works i du not know why mi videos dont get the sounds but well thats another trouble 

 

i been doing some experiments to realize whats happening.

first this is the base of this type of animations this is my way of doit based more or less the way vainilla bow behaves

 

//######################################################################################3	

public ModelResourceLocation getModel(ItemStack prueba, EntityPlayer playerIn, int useRemaining){

ModelResourceLocation modelresourcelocation= new ModelResourceLocation("modmercenario:prueba/prueba00", "inventory");

	 int texturajson=getInttag(prueba, "texturajson");
	             }
    
	 switch(texturajson){
	    default : modelresourcelocation = new ModelResourceLocation("modmercenario:prueba/prueba00", "inventory");break;
	    case   1: modelresourcelocation = new ModelResourceLocation("modmercenario:prueba/prueba01", "inventory");break;
	    case   2: modelresourcelocation = new ModelResourceLocation("modmercenario:prueba/prueba02", "inventory");break;
	    case   3: modelresourcelocation = new ModelResourceLocation("modmercenario:prueba/prueba03", "inventory");break;
	    case   4: modelresourcelocation = new ModelResourceLocation("modmercenario:prueba/prueba04", "inventory");break;
	    case   5: modelresourcelocation = new ModelResourceLocation("modmercenario:prueba/prueba05", "inventory");break;
	    
	                    }
	                   	 
	 	return  modelresourcelocation;	
	} 	

//######################################################################################3	
public static int getInttag(ItemStack item, String tag){	

		NBTTagCompound taggs = item.getTagCompound();
		if (taggs == null){ 
			intialize(item);	
			taggs = item.getTagCompound();
		                      }

		int ex=taggs.getInteger(tag); 
		return ex;

}

//#########################################################################3
public static void intialize(ItemStack prueba){

	setInttag(prueba, "itemtick", 0);   //count ticks especial cases
	setInttag(prueba, "texturajson", 0);  //set json file in use 
	setInttag(prueba, "municion", 0);
	setInttag(prueba, "municionmaxima", 20);
	setInttag(prueba, "municiondisponible", 0);
	setInttag(prueba, "munitiontype", 0);
	setInttag(prueba, "cliptype", 1);
	setBooleantag(prueba, "reload", false);
	setBooleantag(prueba, "shoot", false);
	setBooleantag(prueba, "unload", false);
	setBooleantag(prueba, "enable", false);  //enables the onUpdate method


}

//#########################################################################3


 

in this case i select the texture to use whith the item based on the value of nbttag "texturejson" it has a trouble, and this was hard to understand

at first sig it looks like a normal behaveor that minecraft do "swicht animation" every time i change the nbttag "texturejson" but its not

i discover in mi experiments that when you change  any nbttag its does the "swicht animation"

 

i make take this custom item prueba.java and using onupdate() method to change nbttag "texturejson" from 0 to 6 and then stop , and it do this every time i touch left click

 

in first person you can see the freeky "swicht animation" muving the item up and down the thirth person view is not afected, in this onupdate() method  i comented everithing it has to be whith nbt "texturejson" just let the reading and writhing of  nbttag "itemtick" and happend the same the item bounds up and down like crazy,

but this time has nothing to do  whit onItemRigthclick or  set item on use.

 

im to tired now to continue but the point its

 

is posible to disable "swicht animation" just let item desapear and another apear in its place whitout animation,

or how are they doing to animate items in [1.8]

 

 

 

 

Posted

I beleive there is no option to disable this in minecraft right now.

it is a naitive part of the game, and is likely not to change.

Also, I should have you know that you are reading my signature.

Posted

I can't tell most of what you are saying, but one thing I can say is, the way the vanilla bow works is with a custom animation. whenever an item's ID changes, it triggers the animation, but the bow doesn't change ID at all while it is being pulled back, it's just an internal variable that saves the pulled-back-ness of it, and triggers certain frames in the animation.

If I ever say something stupid, or simply incorrect, please excuse me. I don't know anything about 1.8 modding, and I don't know much about entities either, But I try to help when I can.

Posted

I know this. I think he was asking how to get his item to change texture without triggering that animation. that is what I was attempting to help him with.

If I ever say something stupid, or simply incorrect, please excuse me. I don't know anything about 1.8 modding, and I don't know much about entities either, But I try to help when I can.

Posted

 

yes at mostly

 

there is this animation who ocurs when receeds to grab the next item in the hotbar.

like i was teling later  it makes the item to go down and then to come up but whith the next item

in the series of experiments, i do realize  that when you change any nbt tag in a item this does the "swicth animation" no matter what i change

i think is becose the item get reset minecraft someway deletes the old one and create a new one whith the new data  then  minecraft reloaded it as new  so it makes the "switch animation" to change from the old item to the new whithin the new data

 

soo could'n be posible to make an animation based in Nbttags  whithout this anoying feature

 

//##################################################################################
public ModelResourceLocation getModel(ItemStack prueba, EntityPlayer playerIn, int useRemaining){
ModelResourceLocation modelresourcelocation= new ModelResourceLocation("modmercenario:prueba/prueba00", "inventory");

 int texturajson=getInttag(prueba, "texturajson");  //nbtTag gets read here
	             
	 switch(texturajson){
	    default : modelresourcelocation = new ModelResourceLocation("modmercenario:prueba/prueba00", "inventory");break;
	    case   1: modelresourcelocation = new ModelResourceLocation("modmercenario:prueba/prueba01", "inventory");break;
	    case   2: modelresourcelocation = new ModelResourceLocation("modmercenario:prueba/prueba02", "inventory");break;
	    case   3: modelresourcelocation = new ModelResourceLocation("modmercenario:prueba/prueba03", "inventory");break;
	                               }
	                   	 
	 	return  modelresourcelocation;	
	} 	

 

conclusion :

minecraft does "switch animation" When

 

* you switch items

• nbttag data change

• when yo rigth click aiming to a close block but not an entity

     

 

 

based on this I reddo mi code way it only write nbttags on onPlayerStoppedUsing()  and calculate how many bullets has been shoot and do swicht textures based on the value of int timeLeft and int useRemaining

 

still less anoying but still anoying it does the switch animation everytime i release rigth click thats when it writes the nbttags values for munition remaining and stuff

 

look at this other video

what i wanna fix its this gun moving up and down every time i shoot.  that moving up and down animation is what i call "switch animation"

 

and this last one

im pretty pride of this machine gun

it just do "switch animation" when onPlayerStoppedUsing()  just when end shooting or when end load or reload animation

the 64 bullets are done in just 4 seconds

 

 

 

if there is no way to dissably "switch animation"  the only i could thing is make my own nbttag system reading and writing to plain text file every gun value per gun

and my own ticking class based in onUpdate().  just to not use nbttags

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

    • Version 1.19 - Forge 41.0.63 I want to create a wolf entity that I can ride, so far it seems to be working, but the problem is that when I get on the wolf, I can’t control it. I then discovered that the issue is that the server doesn’t detect that I’m riding the wolf, so I’m struggling with synchronization. However, it seems to not be working properly. As I understand it, the server receives the packet but doesn’t register it correctly. I’m a bit new to Java, and I’ll try to provide all the relevant code and prints *The comments and prints are translated by chatgpt since they were originally in Spanish* Thank you very much in advance No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. No player is mounted, or the passenger is not a player. MountableWolfEntity package com.vals.valscraft.entity; import com.vals.valscraft.network.MountSyncPacket; import com.vals.valscraft.network.NetworkHandler; import net.minecraft.client.Minecraft; import net.minecraft.network.syncher.EntityDataAccessor; import net.minecraft.network.syncher.EntityDataSerializers; import net.minecraft.network.syncher.SynchedEntityData; import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.ai.attributes.AttributeSupplier; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.animal.Wolf; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec3; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.network.PacketDistributor; public class MountableWolfEntity extends Wolf { private boolean hasSaddle; private static final EntityDataAccessor<Byte> DATA_ID_FLAGS = SynchedEntityData.defineId(MountableWolfEntity.class, EntityDataSerializers.BYTE); public MountableWolfEntity(EntityType<? extends Wolf> type, Level level) { super(type, level); this.hasSaddle = false; } @Override protected void defineSynchedData() { super.defineSynchedData(); this.entityData.define(DATA_ID_FLAGS, (byte)0); } public static AttributeSupplier.Builder createAttributes() { return Wolf.createAttributes() .add(Attributes.MAX_HEALTH, 20.0) .add(Attributes.MOVEMENT_SPEED, 0.3); } @Override public InteractionResult mobInteract(Player player, InteractionHand hand) { ItemStack itemstack = player.getItemInHand(hand); if (itemstack.getItem() == Items.SADDLE && !this.hasSaddle()) { if (!player.isCreative()) { itemstack.shrink(1); } this.setSaddle(true); return InteractionResult.SUCCESS; } else if (!level.isClientSide && this.hasSaddle()) { player.startRiding(this); MountSyncPacket packet = new MountSyncPacket(true); // 'true' means the player is mounted NetworkHandler.CHANNEL.sendToServer(packet); // Ensure the server handles the packet return InteractionResult.SUCCESS; } return InteractionResult.PASS; } @Override public void travel(Vec3 travelVector) { if (this.isVehicle() && this.getControllingPassenger() instanceof Player) { System.out.println("The wolf has a passenger."); System.out.println("The passenger is a player."); Player player = (Player) this.getControllingPassenger(); // Ensure the player is the controller this.setYRot(player.getYRot()); this.yRotO = this.getYRot(); this.setXRot(player.getXRot() * 0.5F); this.setRot(this.getYRot(), this.getXRot()); this.yBodyRot = this.getYRot(); this.yHeadRot = this.yBodyRot; float forward = player.zza; float strafe = player.xxa; if (forward <= 0.0F) { forward *= 0.25F; } this.flyingSpeed = this.getSpeed() * 0.1F; this.setSpeed((float) this.getAttributeValue(Attributes.MOVEMENT_SPEED) * 1.5F); this.setDeltaMovement(new Vec3(strafe, travelVector.y, forward).scale(this.getSpeed())); this.calculateEntityAnimation(this, false); } else { // The wolf does not have a passenger or the passenger is not a player System.out.println("No player is mounted, or the passenger is not a player."); super.travel(travelVector); } } public boolean hasSaddle() { return this.hasSaddle; } public void setSaddle(boolean hasSaddle) { this.hasSaddle = hasSaddle; } @Override protected void dropEquipment() { super.dropEquipment(); if (this.hasSaddle()) { this.spawnAtLocation(Items.SADDLE); this.setSaddle(false); } } @SubscribeEvent public static void onServerTick(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.START) { MinecraftServer server = net.minecraftforge.server.ServerLifecycleHooks.getCurrentServer(); if (server != null) { for (ServerPlayer player : server.getPlayerList().getPlayers()) { if (player.isPassenger() && player.getVehicle() instanceof MountableWolfEntity) { MountableWolfEntity wolf = (MountableWolfEntity) player.getVehicle(); System.out.println("Tick: " + player.getName().getString() + " is correctly mounted on " + wolf); } } } } } private boolean lastMountedState = false; @Override public void tick() { super.tick(); if (!this.level.isClientSide) { // Only on the server boolean isMounted = this.isVehicle() && this.getControllingPassenger() instanceof Player; // Only print if the state changed if (isMounted != lastMountedState) { if (isMounted) { Player player = (Player) this.getControllingPassenger(); // Verify the passenger is a player System.out.println("Server: Player " + player.getName().getString() + " is now mounted."); } else { System.out.println("Server: The wolf no longer has a passenger."); } lastMountedState = isMounted; } } } @Override public void addPassenger(Entity passenger) { super.addPassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(true)); } } } @Override public void removePassenger(Entity passenger) { super.removePassenger(passenger); if (passenger instanceof Player) { Player player = (Player) passenger; if (!this.level.isClientSide && player instanceof ServerPlayer) { // Send the packet to the server to indicate the player is no longer mounted NetworkHandler.CHANNEL.send(PacketDistributor.PLAYER.with(() -> (ServerPlayer) player), new MountSyncPacket(false)); } } } @Override public boolean isControlledByLocalInstance() { Entity entity = this.getControllingPassenger(); return entity instanceof Player; } @Override public void positionRider(Entity passenger) { if (this.hasPassenger(passenger)) { double xOffset = Math.cos(Math.toRadians(this.getYRot() + 90)) * 0.4; double zOffset = Math.sin(Math.toRadians(this.getYRot() + 90)) * 0.4; passenger.setPos(this.getX() + xOffset, this.getY() + this.getPassengersRidingOffset() + passenger.getMyRidingOffset(), this.getZ() + zOffset); } } } MountSyncPacket package com.vals.valscraft.network; import com.vals.valscraft.entity.MountableWolfEntity; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.player.Player; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class MountSyncPacket { private final boolean isMounted; public MountSyncPacket(boolean isMounted) { this.isMounted = isMounted; } public void encode(FriendlyByteBuf buffer) { buffer.writeBoolean(isMounted); } public static MountSyncPacket decode(FriendlyByteBuf buffer) { return new MountSyncPacket(buffer.readBoolean()); } public void handle(NetworkEvent.Context context) { context.enqueueWork(() -> { ServerPlayer player = context.getSender(); // Get the player from the context if (player != null) { // Verifies if the player has dismounted if (!isMounted) { Entity vehicle = player.getVehicle(); if (vehicle instanceof MountableWolfEntity wolf) { // Logic to remove the player as a passenger wolf.removePassenger(player); System.out.println("Server: Player " + player.getName().getString() + " is no longer mounted."); } } } }); context.setPacketHandled(true); // Marks the packet as handled } } networkHandler package com.vals.valscraft.network; import com.vals.valscraft.valscraft; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import net.minecraftforge.network.NetworkEvent; import java.util.function.Supplier; public class NetworkHandler { private static final String PROTOCOL_VERSION = "1"; public static final SimpleChannel CHANNEL = NetworkRegistry.newSimpleChannel( new ResourceLocation(valscraft.MODID, "main"), () -> PROTOCOL_VERSION, PROTOCOL_VERSION::equals, PROTOCOL_VERSION::equals ); public static void init() { int packetId = 0; // Register the mount synchronization packet CHANNEL.registerMessage( packetId++, MountSyncPacket.class, MountSyncPacket::encode, MountSyncPacket::decode, (msg, context) -> msg.handle(context.get()) // Get the context with context.get() ); } }  
    • Do you use features of inventory profiles next (ipnext) or is there a change without it?
    • Remove rubidium - you are already using embeddium, which is a fork of rubidium
  • Topics

×
×
  • Create New...

Important Information

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