Entity class:
public abstract class EntityTrainBase extends Entity {
public float speed = 0;
public int connectedTrain = -1;
public EntityTrainBase(World world) {
super(world);
}
@Override
public void entityInit() {
this.preventEntitySpawning = false;
this.setSize(2F, 2F);
DataWatcher dw = this.getDataWatcher();
dw.addObject(20, speed);
dw.addObject(21, connectedTrain);
}
@Override
public abstract double getMountedYOffset();
public abstract float getCartLength();
public abstract float getMaxSpeed();
public abstract boolean isDriver();
@Override
public boolean canBeCollidedWith() {
return true;
}
@Override
public void onEntityUpdate() {
super.onEntityUpdate();
//if(worldObj.isRemote) {
if(riddenByEntity != null && riddenByEntity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) riddenByEntity;
this.speed = this.getDataWatcher().getWatchableObjectFloat(20) + player.moveForward * .01f;
this.speed = Math.min(this.speed, this.getMaxSpeed());
this.speed = Math.max(this.speed, 0);
this.getDataWatcher().updateObject(20, this.speed);
}
//}
moveCart(speed, this);
}
public void moveCart(float sp, EntityTrainBase cart) {
if(!(worldObj.getBlockState(cart.getPosition()).getBlock() instanceof BlockRail)) {return;}
EnumRailDirection rd = (EnumRailDirection) worldObj.getBlockState(cart.getPosition()).getValue(BlockRail.SHAPE);
float yaw = cart.rotationYaw;
int y1 = (int) (RailHelper.getYaw1(rd));
int y2 = (int) (RailHelper.getYaw2(rd));
if(MathHelper.angleDistance(yaw, y1) < MathHelper.angleDistance(yaw, y2))
yaw = y1;
else
yaw = y2;
if(riddenByEntity != null && riddenByEntity instanceof EntityPlayer)
cart.riddenByEntity.rotationYaw += net.minecraft.util.MathHelper.wrapAngleTo180_float(yaw)-cart.rotationYaw;
cart.rotationYaw = net.minecraft.util.MathHelper.wrapAngleTo180_float(yaw);
cart.speed = cart.getDataWatcher().getWatchableObjectFloat(20);
cart.moveEntity(Math.sin(Math.toRadians(yaw))*-cart.speed, 0, Math.cos(Math.toRadians(yaw))*cart.speed);
//cart.setPositionAndUpdate(cart.posX + Math.sin(Math.toRadians(yaw))*-cart.speed, cart.posY, cart.posZ + Math.cos(Math.toRadians(yaw))*cart.speed);
}
@Override
public boolean interactFirst(EntityPlayer player) {
if(player.inventory.getCurrentItem() != null && player.inventory.getCurrentItem().isItemEqual(new ItemStack(ModItems.coupler))) {
((ItemCoupler) ModItems.coupler).interactTrain(player.inventory.getCurrentItem(), player, this);
} else if(!this.worldObj.isRemote) {
if(this.riddenByEntity == null || player.ridingEntity == null) {
player.mountEntity(this);
}
}
return true;
}
}
I looked at both the horse and minecart classes and it looks like they use motionX / motionY / motionZ variables. I tried setting those variables instead already but the entity didn't move.