Hello there \o/
So I took a try at making a custom arrow.
Everything works fine, except one little detail: it shakes like there's no tomorrow.
After some research, I saw a few people having similar issues but they never got an answer.
Here's mah code :
(the entity)
package be.bluexin.rwbym.weaponry;
import be.bluexin.rwbym.RWBYModels;
import be.bluexin.rwbym.weaponry.dto.AmmoCapDTO;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.datasync.DataParameter;
import net.minecraft.network.datasync.DataSerializers;
import net.minecraft.network.datasync.EntityDataManager;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
/**
* Part of rwbym by Bluexin.
*
* @author Bluexin
*/
@MethodsReturnNonnullByDefault
public class RWBYAmmoEntity extends EntityArrow { // FIXME: for some reason these are shaking like a superpowered vibrator
private static final DataParameter<String> RS = EntityDataManager.createKey(RWBYAmmoEntity.class, DataSerializers.STRING);
private ResourceLocation rs = new ResourceLocation("minecraft", "textures/entity/projectiles/spectral_arrow.png");
private RWBYAmmoItem itemRef;
public RWBYAmmoEntity(World world) {
super(world);
this.dataManager.set(RS, this.rs.toString());
}
public RWBYAmmoEntity(World worldIn, double x, double y, double z, AmmoCapDTO capabilities, RWBYAmmoItem from) {
super(worldIn, x, y, z);
this.rs = new ResourceLocation(RWBYModels.MODID, capabilities.getTexture());
this.dataManager.set(RS, this.rs.toString());
this.setDamage(capabilities.getBaseDamage());
this.setNoGravity(!capabilities.obeysGravity());
this.itemRef = from;
} // TODO: add to dispenser registries (see usage of this constructor in other impl of EntityArrow
public RWBYAmmoEntity(World worldIn, EntityLivingBase shooter, AmmoCapDTO capabilities, RWBYAmmoItem from) {
this(worldIn, shooter.posX, shooter.posY + (double) shooter.getEyeHeight() - 0.10000000149011612D, shooter.posZ, capabilities, from);
this.shootingEntity = shooter;
if (shooter instanceof EntityPlayer && capabilities.canPickup()) this.pickupStatus = PickupStatus.ALLOWED;
}
protected void entityInit() {
super.entityInit();
this.dataManager.register(RS, "");
}
@Override
protected ItemStack getArrowStack() {
return new ItemStack(itemRef);
}
public ResourceLocation getRs() {
return new ResourceLocation(this.dataManager.get(RS));
}
public void writeEntityToNBT(NBTTagCompound compound) {
super.writeEntityToNBT(compound);
compound.setString("itemRef", this.itemRef == null ? "" : this.itemRef.getRegistryName().toString());
compound.setString("texture", this.rs.toString());
}
public void readEntityFromNBT(NBTTagCompound compound) {
super.readEntityFromNBT(compound);
if (compound.hasKey("itemRef"))
this.itemRef = (RWBYAmmoItem) Item.getByNameOrId(compound.getString("itemRef"));
if (compound.hasKey("texture")) {
String s = compound.getString("texture");
this.rs = s.length() > 0 ? new ResourceLocation(s) : null;
if (this.rs != null) this.dataManager.set(RS, this.rs.toString());
}
}
}
(the render)
package be.bluexin.rwbym.weaponry;
import mcp.MethodsReturnNonnullByDefault;
import net.minecraft.client.renderer.entity.RenderArrow;
import net.minecraft.client.renderer.entity.RenderManager;
import net.minecraft.util.ResourceLocation;
import javax.annotation.ParametersAreNonnullByDefault;
/**
* Part of rwbym by Bluexin.
*
* @author Bluexin
*/
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
public class RWBYAmmoRender extends RenderArrow<RWBYAmmoEntity> {
public RWBYAmmoRender(RenderManager renderManagerIn) {
super(renderManagerIn);
}
@Override
protected ResourceLocation getEntityTexture(RWBYAmmoEntity entity) {
return entity.getRs();
}
}
I made these by looking at how the vanilla ones (tipped and spectral) were made, but I must have overlooked something.
Any clues?
Also, how I register the render (jic)
RenderingRegistry.registerEntityRenderingHandler(RWBYAmmoEntity.class, RWBYAmmoRender::new);
In my client proxy, called on preinit (FMLPreInitializationEvent)