mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
train collision dummies
This commit is contained in:
parent
c7f28e8853
commit
b8f32a511b
@ -110,7 +110,7 @@ public class EntityMappings {
|
|||||||
addEntity(EntityTSmokeFX.class, "entity_t_smoke_fx", 1000);
|
addEntity(EntityTSmokeFX.class, "entity_t_smoke_fx", 1000);
|
||||||
addEntity(EntityNukeExplosionMK3.class, "entity_nuke_mk3", 1000);
|
addEntity(EntityNukeExplosionMK3.class, "entity_nuke_mk3", 1000);
|
||||||
addEntity(EntityVortex.class, "entity_vortex", 250);
|
addEntity(EntityVortex.class, "entity_vortex", 250);
|
||||||
addEntity(EntityMeteor.class, "entity_meteor", 1000);
|
addEntity(EntityMeteor.class, "entity_meteor", 250);
|
||||||
addEntity(EntityLaser.class, "entity_laser", 1000);
|
addEntity(EntityLaser.class, "entity_laser", 1000);
|
||||||
addEntity(EntityBoxcar.class, "entity_boxcar", 1000);
|
addEntity(EntityBoxcar.class, "entity_boxcar", 1000);
|
||||||
addEntity(EntityMissileTaint.class, "entity_missile_taint", 1000);
|
addEntity(EntityMissileTaint.class, "entity_missile_taint", 1000);
|
||||||
|
|||||||
@ -74,7 +74,7 @@ public class EntityMeteor extends Entity {
|
|||||||
@Override
|
@Override
|
||||||
@SideOnly(Side.CLIENT)
|
@SideOnly(Side.CLIENT)
|
||||||
public boolean isInRangeToRenderDist(double distance) {
|
public boolean isInRangeToRenderDist(double distance) {
|
||||||
return distance < 500000;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -9,13 +9,15 @@ import cpw.mods.fml.relauncher.Side;
|
|||||||
import cpw.mods.fml.relauncher.SideOnly;
|
import cpw.mods.fml.relauncher.SideOnly;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.util.DamageSource;
|
||||||
import net.minecraft.util.MathHelper;
|
import net.minecraft.util.MathHelper;
|
||||||
import net.minecraft.util.Vec3;
|
import net.minecraft.util.Vec3;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public abstract class EntityRailCarBase extends Entity {
|
public abstract class EntityRailCarBase extends Entity {
|
||||||
|
|
||||||
public boolean isOnRail = true;
|
public boolean isOnRail = true;
|
||||||
private int turnProgress;
|
private int turnProgress;
|
||||||
private double trainX;
|
private double trainX;
|
||||||
@ -27,6 +29,9 @@ public abstract class EntityRailCarBase extends Entity {
|
|||||||
@SideOnly(Side.CLIENT) private double velocityX;
|
@SideOnly(Side.CLIENT) private double velocityX;
|
||||||
@SideOnly(Side.CLIENT) private double velocityY;
|
@SideOnly(Side.CLIENT) private double velocityY;
|
||||||
@SideOnly(Side.CLIENT) private double velocityZ;
|
@SideOnly(Side.CLIENT) private double velocityZ;
|
||||||
|
|
||||||
|
public boolean initDummies = false;
|
||||||
|
public BoundingBoxDummyEntity[] dummies = new BoundingBoxDummyEntity[0];
|
||||||
|
|
||||||
public EntityRailCarBase(World world) {
|
public EntityRailCarBase(World world) {
|
||||||
super(world);
|
super(world);
|
||||||
@ -68,6 +73,22 @@ public abstract class EntityRailCarBase extends Entity {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
DummyConfig[] definitions = this.getDummies();
|
||||||
|
|
||||||
|
if(!this.initDummies) {
|
||||||
|
this.dummies = new BoundingBoxDummyEntity[definitions.length];
|
||||||
|
|
||||||
|
for(int i = 0; i < definitions.length; i++) {
|
||||||
|
DummyConfig def = definitions[i];
|
||||||
|
BoundingBoxDummyEntity dummy = new BoundingBoxDummyEntity(worldObj, this, def.width, def.height);
|
||||||
|
dummy.setPosition(posX, posY, posZ);
|
||||||
|
worldObj.spawnEntityInWorld(dummy);
|
||||||
|
this.dummies[i] = dummy;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.initDummies = true;
|
||||||
|
}
|
||||||
|
|
||||||
BlockPos anchor = this.getCurentAnchorPos();
|
BlockPos anchor = this.getCurentAnchorPos();
|
||||||
Vec3 corePos = getRelPosAlongRail(anchor, this.getCurrentSpeed());
|
Vec3 corePos = getRelPosAlongRail(anchor, this.getCurrentSpeed());
|
||||||
|
|
||||||
@ -81,6 +102,7 @@ public abstract class EntityRailCarBase extends Entity {
|
|||||||
|
|
||||||
if(frontPos == null || backPos == null) {
|
if(frontPos == null || backPos == null) {
|
||||||
this.derail();
|
this.derail();
|
||||||
|
return;
|
||||||
} else {
|
} else {
|
||||||
this.prevRotationYaw = this.rotationYaw;
|
this.prevRotationYaw = this.rotationYaw;
|
||||||
this.rotationYaw = this.movementYaw = generateYaw(frontPos, backPos);
|
this.rotationYaw = this.movementYaw = generateYaw(frontPos, backPos);
|
||||||
@ -88,6 +110,18 @@ public abstract class EntityRailCarBase extends Entity {
|
|||||||
this.velocityChanged = true;
|
this.velocityChanged = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < definitions.length; i++) {
|
||||||
|
DummyConfig def = definitions[i];
|
||||||
|
BoundingBoxDummyEntity dummy = dummies[i];
|
||||||
|
Vec3 rot = Vec3.createVectorHelper(def.offset.xCoord, def.offset.yCoord, def.offset.zCoord);
|
||||||
|
rot.rotateAroundY((float) (-this.rotationYaw * Math.PI / 180));
|
||||||
|
double x = posX + rot.xCoord;
|
||||||
|
double y = posY + rot.yCoord;
|
||||||
|
double z = posZ + rot.zCoord;
|
||||||
|
dummy.setSize(def.width, def.height); // TEMP
|
||||||
|
dummy.setPosition(x, y, z);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -199,11 +233,85 @@ public abstract class EntityRailCarBase extends Entity {
|
|||||||
|
|
||||||
/** Invisible entities that make up the dynamic bounding structure of the train, moving as the train rotates. */
|
/** Invisible entities that make up the dynamic bounding structure of the train, moving as the train rotates. */
|
||||||
public static class BoundingBoxDummyEntity extends Entity {
|
public static class BoundingBoxDummyEntity extends Entity {
|
||||||
public BoundingBoxDummyEntity(World world) { this(world, 1F, 1F); }
|
|
||||||
public BoundingBoxDummyEntity(World world, float width, float height) { super(world); this.setSize(width, height);}
|
private int turnProgress;
|
||||||
@Override protected void entityInit() { }
|
private double trainX;
|
||||||
|
private double trainY;
|
||||||
|
private double trainZ;
|
||||||
|
public EntityRailCarBase train;
|
||||||
|
|
||||||
|
public BoundingBoxDummyEntity(World world) { this(world, null, 1F, 1F); }
|
||||||
|
public BoundingBoxDummyEntity(World world, EntityRailCarBase train, float width, float height) {
|
||||||
|
super(world);
|
||||||
|
this.setSize(width, height);
|
||||||
|
this.train = train;
|
||||||
|
if(train != null) this.dataWatcher.updateObject(3, train.getEntityId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected void setSize(float width, float height) {
|
||||||
|
super.setSize(width, height);
|
||||||
|
this.dataWatcher.updateObject(4, width);
|
||||||
|
this.dataWatcher.updateObject(5, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override protected void entityInit() {
|
||||||
|
this.dataWatcher.addObject(3, new Integer(1));
|
||||||
|
this.dataWatcher.addObject(4, new Float(1F));
|
||||||
|
this.dataWatcher.addObject(5, new Float(1F));
|
||||||
|
}
|
||||||
|
|
||||||
@Override protected void writeEntityToNBT(NBTTagCompound nbt) { }
|
@Override protected void writeEntityToNBT(NBTTagCompound nbt) { }
|
||||||
@Override public boolean writeToNBTOptional(NBTTagCompound nbt) { return false; }
|
@Override public boolean writeToNBTOptional(NBTTagCompound nbt) { return false; }
|
||||||
@Override public void readEntityFromNBT(NBTTagCompound nbt) { this.setDead(); }
|
@Override public void readEntityFromNBT(NBTTagCompound nbt) { this.setDead(); }
|
||||||
|
@Override public boolean canBePushed() { return true; }
|
||||||
|
@Override public boolean canBeCollidedWith() { return !this.isDead; }
|
||||||
|
|
||||||
|
@Override public boolean attackEntityFrom(DamageSource source, float amount) { if(train != null) return train.attackEntityFrom(source, amount); return super.attackEntityFrom(source, amount); }
|
||||||
|
@Override public boolean interactFirst(EntityPlayer player) { if(train != null) return train.interactFirst(player); return super.interactFirst(player); }
|
||||||
|
|
||||||
|
@Override public void onUpdate() {
|
||||||
|
if(!worldObj.isRemote) {
|
||||||
|
if(this.train.isDead) {
|
||||||
|
this.setDead();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if(this.turnProgress > 0) {
|
||||||
|
this.prevRotationYaw = this.rotationYaw;
|
||||||
|
double x = this.posX + (this.trainX - this.posX) / (double) this.turnProgress;
|
||||||
|
double y = this.posY + (this.trainY - this.posY) / (double) this.turnProgress;
|
||||||
|
double z = this.posZ + (this.trainZ - this.posZ) / (double) this.turnProgress;
|
||||||
|
--this.turnProgress;
|
||||||
|
this.setPosition(x, y, z);
|
||||||
|
} else {
|
||||||
|
this.setPosition(this.posX, this.posY, this.posZ);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setSize(this.dataWatcher.getWatchableObjectFloat(4), this.dataWatcher.getWatchableObjectFloat(5));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override @SideOnly(Side.CLIENT) public void setPositionAndRotation2(double posX, double posY, double posZ, float yaw, float pitch, int turnProg) {
|
||||||
|
this.trainX = posX;
|
||||||
|
this.trainY = posY;
|
||||||
|
this.trainZ = posZ;
|
||||||
|
this.turnProgress = turnProg + 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DummyConfig[] getDummies() {
|
||||||
|
return new DummyConfig[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class DummyConfig {
|
||||||
|
public Vec3 offset;
|
||||||
|
public float width;
|
||||||
|
public float height;
|
||||||
|
|
||||||
|
public DummyConfig(float width, float height, Vec3 offset) {
|
||||||
|
this.width = width;
|
||||||
|
this.height = height;
|
||||||
|
this.offset = offset;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,8 +1,11 @@
|
|||||||
package com.hbm.entity.train;
|
package com.hbm.entity.train;
|
||||||
|
|
||||||
|
import com.hbm.util.BobMathUtil;
|
||||||
|
|
||||||
import net.minecraft.entity.Entity;
|
import net.minecraft.entity.Entity;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.nbt.NBTTagCompound;
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.util.MathHelper;
|
||||||
import net.minecraft.util.Vec3;
|
import net.minecraft.util.Vec3;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
@ -32,9 +35,13 @@ public abstract class EntityRailCarRidable extends EntityRailCarCargo {
|
|||||||
|
|
||||||
seat.rotateAroundY((float) (-this.rotationYaw * Math.PI / 180));
|
seat.rotateAroundY((float) (-this.rotationYaw * Math.PI / 180));
|
||||||
double x = posX + seat.xCoord;
|
double x = posX + seat.xCoord;
|
||||||
double y = posY + seat.yCoord;
|
|
||||||
double z = posZ + seat.zCoord;
|
double z = posZ + seat.zCoord;
|
||||||
double dist = Vec3.createVectorHelper(player.posX - x, player.posY - y, player.posZ - z).lengthVector();
|
|
||||||
|
double deltaX = player.posX - x;
|
||||||
|
double deltaZ = player.posZ - z;
|
||||||
|
double radians = -Math.atan2(deltaX, deltaZ);
|
||||||
|
double degrees = MathHelper.wrapAngleTo180_double(radians * 180D / Math.PI - 90);
|
||||||
|
double dist = Math.abs(BobMathUtil.angularDifference(degrees, player.rotationYaw));
|
||||||
|
|
||||||
if(dist < nearestDist) {
|
if(dist < nearestDist) {
|
||||||
nearestDist = dist;
|
nearestDist = dist;
|
||||||
@ -46,9 +53,13 @@ public abstract class EntityRailCarRidable extends EntityRailCarCargo {
|
|||||||
Vec3 seat = getRiderSeatPosition();
|
Vec3 seat = getRiderSeatPosition();
|
||||||
seat.rotateAroundY((float) (-this.rotationYaw * Math.PI / 180));
|
seat.rotateAroundY((float) (-this.rotationYaw * Math.PI / 180));
|
||||||
double x = posX + seat.xCoord;
|
double x = posX + seat.xCoord;
|
||||||
double y = posY + seat.yCoord;
|
|
||||||
double z = posZ + seat.zCoord;
|
double z = posZ + seat.zCoord;
|
||||||
double dist = Vec3.createVectorHelper(player.posX - x, player.posY - y, player.posZ - z).lengthVector();
|
|
||||||
|
double deltaX = player.posX - x;
|
||||||
|
double deltaZ = player.posZ - z;
|
||||||
|
double radians = -Math.atan2(deltaX, deltaZ);
|
||||||
|
double degrees = MathHelper.wrapAngleTo180_double(radians * 180D / Math.PI - 90);
|
||||||
|
double dist = Math.abs(BobMathUtil.angularDifference(degrees, player.rotationYaw));
|
||||||
|
|
||||||
if(dist < nearestDist) {
|
if(dist < nearestDist) {
|
||||||
nearestDist = dist;
|
nearestDist = dist;
|
||||||
@ -56,7 +67,7 @@ public abstract class EntityRailCarRidable extends EntityRailCarCargo {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(nearestDist > 20) return true;
|
if(nearestDist > 180) return true;
|
||||||
|
|
||||||
if(nearestSeat == -1) {
|
if(nearestSeat == -1) {
|
||||||
player.mountEntity(this);
|
player.mountEntity(this);
|
||||||
|
|||||||
@ -30,7 +30,7 @@ public class TrainCargoTram extends EntityRailCarRidable implements IGUIProvider
|
|||||||
|
|
||||||
public TrainCargoTram(World world) {
|
public TrainCargoTram(World world) {
|
||||||
super(world);
|
super(world);
|
||||||
this.setSize(2F, 1F);
|
this.setSize(1F, 1F);
|
||||||
}
|
}
|
||||||
|
|
||||||
public double speed = 0;
|
public double speed = 0;
|
||||||
@ -78,7 +78,16 @@ public class TrainCargoTram extends EntityRailCarRidable implements IGUIProvider
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean attackEntityFrom(DamageSource p_70097_1_, float p_70097_2_) {
|
public DummyConfig[] getDummies() {
|
||||||
|
return new DummyConfig[] {
|
||||||
|
new DummyConfig(2F, 1F, Vec3.createVectorHelper(0, 0, 1.5)),
|
||||||
|
new DummyConfig(2F, 1F, Vec3.createVectorHelper(0, 0, 0)),
|
||||||
|
new DummyConfig(2F, 1F, Vec3.createVectorHelper(0, 0, -1.5))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean attackEntityFrom(DamageSource source, float amount) {
|
||||||
if(!this.worldObj.isRemote && !this.isDead) {
|
if(!this.worldObj.isRemote && !this.isDead) {
|
||||||
this.setDead();
|
this.setDead();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -61,6 +61,7 @@ import com.hbm.entity.mob.siege.*;
|
|||||||
import com.hbm.entity.particle.*;
|
import com.hbm.entity.particle.*;
|
||||||
import com.hbm.entity.projectile.*;
|
import com.hbm.entity.projectile.*;
|
||||||
import com.hbm.entity.train.*;
|
import com.hbm.entity.train.*;
|
||||||
|
import com.hbm.entity.train.EntityRailCarBase.BoundingBoxDummyEntity;
|
||||||
import com.hbm.entity.train.EntityRailCarRidable.SeatDummyEntity;
|
import com.hbm.entity.train.EntityRailCarRidable.SeatDummyEntity;
|
||||||
import com.hbm.handler.CasingEjector;
|
import com.hbm.handler.CasingEjector;
|
||||||
import com.hbm.handler.HbmKeybinds;
|
import com.hbm.handler.HbmKeybinds;
|
||||||
@ -685,6 +686,7 @@ public class ClientProxy extends ServerProxy {
|
|||||||
RenderingRegistry.registerEntityRenderingHandler(EntityMagnusCartus.class, new RenderMagnusCartus());
|
RenderingRegistry.registerEntityRenderingHandler(EntityMagnusCartus.class, new RenderMagnusCartus());
|
||||||
//trains
|
//trains
|
||||||
RenderingRegistry.registerEntityRenderingHandler(SeatDummyEntity.class, new RenderEmpty());
|
RenderingRegistry.registerEntityRenderingHandler(SeatDummyEntity.class, new RenderEmpty());
|
||||||
|
RenderingRegistry.registerEntityRenderingHandler(BoundingBoxDummyEntity.class, new RenderEmpty());
|
||||||
RenderingRegistry.registerEntityRenderingHandler(TrainCargoTram.class, new RenderTrainCargoTram());
|
RenderingRegistry.registerEntityRenderingHandler(TrainCargoTram.class, new RenderTrainCargoTram());
|
||||||
//items
|
//items
|
||||||
RenderingRegistry.registerEntityRenderingHandler(EntityMovingItem.class, new RenderMovingItem());
|
RenderingRegistry.registerEntityRenderingHandler(EntityMovingItem.class, new RenderMovingItem());
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
package com.hbm.util;
|
package com.hbm.util;
|
||||||
|
|
||||||
|
import java.lang.reflect.Field;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
import java.math.RoundingMode;
|
import java.math.RoundingMode;
|
||||||
import java.text.NumberFormat;
|
import java.text.NumberFormat;
|
||||||
@ -9,6 +10,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import javax.annotation.Nonnegative;
|
import javax.annotation.Nonnegative;
|
||||||
|
|
||||||
|
import cpw.mods.fml.relauncher.ReflectionHelper;
|
||||||
import net.minecraft.util.MathHelper;
|
import net.minecraft.util.MathHelper;
|
||||||
import net.minecraft.util.Vec3;
|
import net.minecraft.util.Vec3;
|
||||||
import net.minecraftforge.common.util.ForgeDirection;
|
import net.minecraftforge.common.util.ForgeDirection;
|
||||||
@ -193,4 +195,15 @@ public class BobMathUtil {
|
|||||||
public static double squirt(double x) {
|
public static double squirt(double x) {
|
||||||
return Math.sqrt(x + 1D / ((x + 2D) * (x + 2D))) - 1D / (x + 2D);
|
return Math.sqrt(x + 1D / ((x + 2D) * (x + 2D))) - 1D / (x + 2D);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** A convenient way to re-define the value of pi, should the laws of nature change. */
|
||||||
|
public static void setPi(double pi) {
|
||||||
|
Field field = ReflectionHelper.findField(Math.class, "PI");
|
||||||
|
try { field.setDouble(null, pi); } catch(Exception e) { }
|
||||||
|
}
|
||||||
|
|
||||||
|
public static double angularDifference(double alpha, double beta) {
|
||||||
|
double delta = (beta - alpha + 180) % 360 - 180;
|
||||||
|
return delta < -180 ? delta + 360 : delta;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user