Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

Hi, I maked a custom packet to with the scope to use Minecraft.partciles.emitParticlesAtEntity(), but minecraft give me an error:
 

Internal Exception: io.netty.handler.codec.EncoderException: java.lang.RuntimeException: ConnectionProtocol unknown: me.foxware.potions.network.packets.SEmitParticlesPacket@389b00f

Here the packet code:

public class SEmitParticlesPacket implements IPacket<IClientPlayNetHandler> {
	private Minecraft client = Minecraft.getInstance();
	
	private int entityID;
	private IParticleData particle;
	private int lifeTime;
	
	public <T extends IParticleData> SEmitParticlesPacket(Entity entityIn, T particleIn, int lifeTimeIn) {
		this.entityID = entityIn.getEntityId();
		this.particle = particleIn;
		this.lifeTime = lifeTimeIn;
	}
	
	@Override
	public void readPacketData(PacketBuffer bufIn) throws IOException {
		ParticleType<?> particleType = Registry.PARTICLE_TYPE.getByValue(bufIn.readInt());
		if(particleType == null) {
			particleType = ParticleTypes.BARRIER;
		}
		
		this.entityID = bufIn.readInt();
		this.lifeTime = bufIn.readInt();
		this.particle = readParticle(bufIn, particleType);
	}

	@Override
	public void writePacketData(PacketBuffer bufIn) throws IOException {
		bufIn.writeInt(Registry.PARTICLE_TYPE.getId(this.particle.getType()));
		bufIn.writeInt(this.entityID);
		bufIn.writeInt(this.lifeTime);
		
		this.particle.write(bufIn);
	}
	private <T extends IParticleData> T readParticle(PacketBuffer bufIn, ParticleType<T> particleType) {
		return particleType.getDeserializer().read(particleType, bufIn);
	}
	
	public int getEntityID() {
		return this.entityID;
	}
	public IParticleData getParticle() {
		return this.particle;
	}
	public int getLifeTime() {
		return this.lifeTime;
	}
	
	@Override
	public void processPacket(IClientPlayNetHandler handlerIn) {
		this.client.particles.emitParticleAtEntity(this.client.world.getEntityByID(getEntityID()), getParticle(), getLifeTime());
	}
}

Here where is used:
 

@SubscribeEvent
public static void onEntityDeath(LivingDeathEvent eventIn) throws InterruptedException {
	LivingEntity entity = eventIn.getEntityLiving();
	if(entity.getActivePotionEffect(ModEffects.IMMORTALITY.get()) != null) {
		entity.setHealth(entity.getMaxHealth() * 25 / 100);
		entity.removePotionEffect(ModEffects.IMMORTALITY.get());
		
		entity.world.playSound(null, entity.getPosX(), entity.getPosY(), entity.getPosZ(), SoundEvents.ITEM_TOTEM_USE, entity.getSoundCategory(), 1.0F, 1.0F);
		for(PlayerEntity p : entity.world.getPlayers()) {
			((ServerPlayerEntity) p).connection.sendPacket(new SEmitParticlesPacket(entity, ParticleTypes.TOTEM_OF_UNDYING, 30));
		}
		
		eventIn.setCanceled(true);
	}
}

Thanks for everyone helps me!

  • Author
15 minutes ago, ChampionAsh5357 said:

Use Forge's network system.

Ok, i do something but are some issues...


Here Packet class:

public class EmitParticlesPacket {
	private int entityID;
	private IParticleData particle;
	private int lifeTime;
	
	public <T extends IParticleData> EmitParticlesPacket(Entity entityIn, T particleIn, int lifeTimeIn) {
		this.entityID = entityIn.getEntityId();
		this.particle = particleIn;
		this.lifeTime = lifeTimeIn;
	}
	
	public EmitParticlesPacket(PacketBuffer bufIn) throws IOException {
		ParticleType<?> particleType = Registry.PARTICLE_TYPE.getByValue(bufIn.readInt());
		if(particleType == null) {
			particleType = ParticleTypes.BARRIER;
		}
		
		this.entityID = bufIn.readInt();
		this.lifeTime = bufIn.readInt();
		this.particle = readParticle(bufIn, particleType);
	}

	public void encoder(EmitParticlesPacket msg, PacketBuffer bufIn) throws IOException {
		bufIn.writeInt(Registry.PARTICLE_TYPE.getId(this.particle.getType()));
		bufIn.writeInt(this.entityID);
		bufIn.writeInt(this.lifeTime);
		
		this.particle.write(bufIn);
	}
	
	private <T extends IParticleData> T readParticle(PacketBuffer bufIn, ParticleType<T> particleType) {
		return particleType.getDeserializer().read(particleType, bufIn);
	}
	
	public int getEntityID() {
		return this.entityID;
	}
	public IParticleData getParticle() {
		return this.particle;
	}
	public int getLifeTime() {
		return this.lifeTime;
	}
	
	public static void handle(EmitParticlesPacket msg, Supplier<NetworkEvent.Context> ctx) {
		ctx.get().enqueueWork(() -> {
			if(ctx.get().getDirection().getReceptionSide().equals(LogicalSide.CLIENT)) {
				Minecraft client = Minecraft.getInstance();
				client.particles.emitParticleAtEntity(client.world.getEntityByID(msg.getEntityID()), msg.getParticle(), msg.getLifeTime());
			}
		});
		ctx.get().setPacketHandled(true);
	}
}

 

Here the PacketHandler... here eclipse gives some errors at ISTANCE.registerMessage():
2 arg: The type EmitParticlesPacket does not define encoder(MSG, PacketBuffer) that is applicable here
3 arg: The constructed object of type EmitParticlesPacket is incompatible with the descriptor's return type: MSG
4 arg: The type EmitParticlesPacket does not define handle(MSG, Supplier<NetworkEvent.Context>) that is applicable here
Here the class of Packet Handler:

public class ModPacketHandler {
	private static final String PROTOCOL_VER = "1";
	public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel(
		new ResourceLocation(FurtherPotionsMain.MODID, "main"),
		() -> PROTOCOL_VER,
		PROTOCOL_VER::equals,
		PROTOCOL_VER::equals
	);
	
	public static void register() {
		int ID = 0;
		INSTANCE.registerMessage(ID++, EmitParticlesPacket.class, EmitParticlesPacket::encoder, EmitParticlesPacket::new, EmitParticlesPacket::handle);
	}
}

 

39 minutes ago, FoxWare said:

The type EmitParticlesPacket does not define encoder(MSG, PacketBuffer) that is applicable here

Learn a bit more about Functional Interfaces. The function is non-static, so why do you need to pass in an instance you already have?

40 minutes ago, FoxWare said:

The constructed object of type EmitParticlesPacket is incompatible with the descriptor's return type: MSG

The decoder requires a return value, something you are not providing.

41 minutes ago, FoxWare said:

The type EmitParticlesPacket does not define handle(MSG, Supplier<NetworkEvent.Context>) that is applicable here

Look at the parameter needed to supply the method.

39 minutes ago, FoxWare said:

The type EmitParticlesPacket does not define encoder(MSG, PacketBuffer) that is applicable here

Learn a bit more about Functional Interfaces. The function is non-static, so why do you need to pass in an instance you already have?

40 minutes ago, FoxWare said:

The constructed object of type EmitParticlesPacket is incompatible with the descriptor's return type: MSG

The decoder requires a return value, something you are not providing.

41 minutes ago, FoxWare said:

The type EmitParticlesPacket does not define handle(MSG, Supplier<NetworkEvent.Context>) that is applicable here

Look at the parameter needed to supply the method.

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.