Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public void moveRiders(Entity rider)
- {
- if(isPartOfThis(rider)) return;
- boolean isHuman = false;
- boolean isDriveable = false;
- if(!(rider instanceof EntityPlayer)) return;
- Vector3f riderPos = new Vector3f (rider.posX, rider.posY, rider.posZ);
- Vector3f riderMotion = new Vector3f(rider.motionX, rider.motionY, rider.motionY);
- Vector3f vehicleMotion = new Vector3f(posX - lastPos.x, posY - lastPos.y, posZ - lastPos.z);
- if(rider instanceof EntityVehicle) vehicleMotion = ((EntityVehicle)rider).lastPos;
- //riderMotion = Vector3f.sub(riderMotion, vehicleMotion, riderMotion);
- Vector3f vehiclePos = new Vector3f(this.posX, this.posY, this.posZ);
- Vector3f relativePos = Vector3f.sub(riderPos, vehiclePos, null);
- if(rider instanceof EntityPlayer) isHuman = true;
- if(rider instanceof EntityDriveable) isDriveable = true;
- relativePos = new Vector3f(relativePos.x, relativePos.y - ((isHuman)?0.55F:0), relativePos.z);
- Vector3f rotatedPosVector = axes.findGlobalVectorLocally(relativePos);
- Vector3f rotatedMotionVector = axes.findGlobalVectorLocally(riderMotion);
- Vector3f ellipsoid = new Vector3f(rider.width/2, rider.height, rider.width/2);
- CollisionTest test = new CollisionTest(ellipsoid, new Vector3f(relativePos.x, relativePos.y, relativePos.z), riderMotion);
- test.collisionRecursiveDepth = 0;
- Vector3f eSpacePosition = test.ConvertR3ToESpace(test.R3Position);
- Vector3f eSpaceVelocity = test.velocity;
- //Vector3f finalPos = collideWithDriveable(test, eSpacePosition, eSpaceVelocity);
- DriveableType type = getDriveableType();
- //Check parts for collision
- if(type.fancyCollision)
- {
- //checkCollision(test, getDriveableType().colbox);
- for(CollisionShapeBox sbox: type.collisionBox)
- {
- checkCollision(test, sbox);
- }
- } else {
- for(DriveablePart ppart : getDriveableData().parts.values())
- {
- ppart.rayTraceRider(this, test);
- }
- }
- if(test.didCollide){
- Vector3f finalPos = collideWithDriveable(test, eSpacePosition, eSpaceVelocity);
- if(rider instanceof EntityAnimal) return;
- Vector3f velocity = Vector3f.sub(finalPos, test.basePoint, null);
- test.ConvertESpaceToR3(velocity);
- finalPos = new Vector3f(finalPos.x * test.eRad.x, finalPos.y * test.eRad.y, finalPos.z * test.eRad.z);
- Vector3f diff = Vector3f.sub(finalPos, vehiclePos, null);
- if(rider.onGround && (posY + finalPos.y + 10/16F) < riderPos.y)
- {
- //finalPos = new Vector3f(finalPos.x, 0, finalPos.z);
- }
- //boolean onTop = (rider.posY + 0.65 > test.intersectionPoint.y);
- boolean stationary = (throttle == 0);
- //If finalPos returns null, do something about it. Probably not the best way to handle this.
- if(finalPos == null) finalPos = new Vector3f(0,0,0);
- test.ConvertESpaceToR3(finalPos);
- boolean onTop = (test.collisionPlaneNormal.y >= 0.5F);
- if(!hugeBoat)
- rider.setPosition((!onTop)?riderPos.x + finalPos.x/(48*Math.abs(relativePos.x)): riderPos.x,(onTop)?posY + finalPos.y + 10/16F:riderPos.y,(!onTop)?riderPos.z + finalPos.z/(48*Math.abs(relativePos.z)): riderPos.z);
- //test.ConvertESpaceToR3(test.intersectionPoint);
- //FlansMod.proxy.spawnParticle("flame", test.intersectionPoint.x + posX, test.intersectionPoint.y + posY - 1, test.intersectionPoint.z + posZ, 0, 0, 0);
- if(hugeBoat && !stationary){
- rider.setPosition(riderPos.x, posY + finalPos.y + 9.5/16F,riderPos.z);
- } else if (hugeBoat && stationary) {
- rider.setPosition(riderPos.x, posY + finalPos.y + 10/16F,riderPos.z);
- }
- finalPos = Vector3f.sub(finalPos, riderPos, null);
- finalPos.normalise();
- //rider.motionX = rider.motionX * finalPos.x;
- rider.motionY = 0;
- //rider.motionZ = rider.motionZ * finalPos.z;
- //Vector3f intersect = test.intersectionPoint;
- //worldObj.spawnParticle((test.isOnTop)?"fireworksSpark":"explode", posX + intersect.x, posY + intersect.y, posZ + intersect.z, 0,1,0);
- //worldObj.spawnParticle((test.isOnTop)?"fireworksSpark":"explode", posX, posY, posZ, 0,1,0);
- //worldObj.spawnParticle((test.isOnTop)?"fireworksSpark":"explode", riderPos.x, riderPos.y, riderPos.z, 0,1,0);
- //worldObj.spawnParticle("crit", posX + finalPos.x, posY + finalPos.y, posZ + finalPos.z, 0,0,0);
- //worldObj.spawnParticle("reddust", riderPos.x, riderPos.y - 0.65, riderPos.z, 0,0,0);
- updateRiderPos(rider, test, finalPos, riderMotion);
- if(getDriveableType().collisionDamageEnable && !test.isOnTop)
- {
- if(throttle > getDriveableType().collisionDamageThrottle)
- {
- boolean canDamage = true;
- if(TeamsManager.getInstance() != null && TeamsManager.getInstance().currentRound != null && rider instanceof EntityPlayerMP && seats[0].riddenByEntity instanceof EntityPlayer)
- {
- EntityPlayerMP attacker = (EntityPlayerMP)seats[0].riddenByEntity;
- EntityPlayerMP player = (EntityPlayerMP)rider;
- if(TeamsManager.getInstance().currentRound.gametype.getPlayerData(attacker) != null && TeamsManager.getInstance().currentRound.gametype.getPlayerData(attacker).team != null)
- {
- if(TeamsManager.getInstance().currentRound.gametype.getPlayerData(player) != null && TeamsManager.getInstance().currentRound.gametype.getPlayerData(player).team != null)
- {
- if(TeamsManager.getInstance().currentRound.gametype.getPlayerData(player).team == TeamsManager.getInstance().currentRound.gametype.getPlayerData(attacker).team)
- {
- canDamage = false;
- }
- }
- }
- }
- for(EntitySeat seat : seats)
- {
- if(rider == seat.lastRiddenByEntity)
- canDamage = false;
- }
- if(canDamage){
- if(rider instanceof EntityLiving){
- rider.attackEntityFrom(DamageSource.generic, throttle*getDriveableType().collisionDamageTimes);
- }else if(rider instanceof EntityPlayer){
- rider.attackEntityFrom(DamageSource.generic, throttle*getDriveableType().collisionDamageTimes);
- }
- }
- }
- }
- if(rider instanceof EntityPlayer){
- EntityPlayer player = (EntityPlayer)rider;
- //playerIDs.add(player);
- player.onGround = true;
- player.isAirBorne = false;
- player.fallDistance = 0;
- }
- }
- else
- {
- if(rider instanceof EntityDriveable)
- {
- //((EntityDriveable)rider).onDeck = false;
- ((EntityDriveable)rider).deckHeight = 0;
- }
- }
- }
- /**
- @SubscribeEvent
- public void updateRiders(LivingUpdateEvent event){
- for(EntityPlayer player: playerIDs){
- Entity p = (Entity)player;
- if(p == event.entity){
- player.onGround = true;
- player.isAirBorne = false;
- player.fallDistance = 0;
- playerIDs.remove(player);
- }
- }
- }
- */
- public void checkCollision(CollisionTest tester, CollisionShapeBox box)
- {
- {
- double distance = tester.nearestDistance;
- Vector3f collisionPoint = new Vector3f(0,0,0);
- int surface = 0;
- Vector3f pos = new Vector3f(this.posX, this.posY, this.posZ);
- RotatedAxes shift = axes;
- float f4 = box.pos.x + box.size.x;
- float f5 = -box.pos.y + box.size.y;
- float f6 = box.pos.z + box.size.z;
- box.pos = new Vector3f(box.pos.x, box.pos.y, box.pos.z);
- //if(EnumDriveablePart.getPart(box.part) == EnumDriveablePart.turret) return;
- //Define box verticies, where z > 0 is right. See shapeboxes in the toolbox for a visual reference
- Vector3f p1 = new Vector3f(box.pos.x - box.p1.x, box.pos.y + box.size.y + box.p1.y - box.size.y + 0.625F, box.pos.z - box.p1.z);
- Vector3f p2 = new Vector3f(box.pos.x + box.size.x + box.p2.x,box.pos.y + box.size.y + box.p2.y - box.size.y + 0.625F, box.pos.z - box.p2.z);
- Vector3f p3 = new Vector3f(box.pos.x + box.size.x + box.p3.x, box.pos.y + box.size.y + box.p3.y - box.size.y + 0.625F, box.pos.z + box.size.z + box.p3.z);
- Vector3f p4 = new Vector3f(box.pos.x - box.p4.x, box.pos.y + box.size.y + box.p4.y - box.size.y + 0.625F, box.pos.z + box.size.z + box.p4.z);
- Vector3f p5 = new Vector3f(box.pos.x - box.p5.x, box.pos.y - box.p5.y - box.size.y + 0.625F, box.pos.z - box.p5.z);
- Vector3f p6 = new Vector3f(box.pos.x + box.size.x + box.p6.x, box.pos.y - box.p6.y - box.size.y + 0.625F, box.pos.z - box.p6.z);
- Vector3f p7 = new Vector3f(box.pos.x + box.size.x + box.p7.x, box.pos.y - box.p7.y - box.size.y + 0.625F, box.pos.z + box.size.z + box.p7.z);
- Vector3f p8 = new Vector3f(box.pos.x - box.p8.x, box.pos.y - box.p8.y - box.size.y + 0.625F, box.pos.z + box.size.z + box.p8.z);
- if(EnumDriveablePart.getPart(box.part) == EnumDriveablePart.turret && seats[0] != null)
- {
- p1 = getPositionOnTurret(p1, false); //Front upper left
- p2 = getPositionOnTurret(p2, false); //Front upper right
- p3 = getPositionOnTurret(p3, false); //Rear upper right
- p4 = getPositionOnTurret(p4, false); //Rear upper left
- p5 = getPositionOnTurret(p5, false); //Front lower left
- p6 = getPositionOnTurret(p6, false); //Front lower right
- p7 = getPositionOnTurret(p7, false); //Rear lower right
- p8 = getPositionOnTurret(p8, false); //Rear lower left
- } else {
- p1 = shift.findLocalVectorGlobally(p1);
- p2 = shift.findLocalVectorGlobally(p2);
- p3 = shift.findLocalVectorGlobally(p3);
- p4 = shift.findLocalVectorGlobally(p4);
- p5 = shift.findLocalVectorGlobally(p5);
- p6 = shift.findLocalVectorGlobally(p6);
- p7 = shift.findLocalVectorGlobally(p7);
- p8 = shift.findLocalVectorGlobally(p8);
- }
- //Check top face
- double topFaceDist = 100;
- tester.checkTriangle(tester, p3, p2, p1);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- collisionPoint = tester.intersectionPoint;
- surface = 1;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- tester.checkTriangle(tester, p4, p3, p1);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- collisionPoint = tester.intersectionPoint;
- surface = 1;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- if(tester.didCollide){
- tester.isOnTop = true;
- topFaceDist = tester.nearestDistance;
- }
- //Check front face
- tester.checkTriangle(tester, p6, p7, p3);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- distance = tester.nearestDistance;
- collisionPoint = tester.intersectionPoint;
- surface = 2;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- tester.checkTriangle(tester, p3, p2, p6);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- distance = tester.nearestDistance;
- collisionPoint = tester.intersectionPoint;
- surface = 2;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- //Check rear face
- tester.checkTriangle(tester, p4, p1, p5);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- distance = tester.nearestDistance;
- collisionPoint = tester.intersectionPoint;
- surface = 3;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- tester.checkTriangle(tester, p5, p8, p4);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- distance = tester.nearestDistance;
- collisionPoint = tester.intersectionPoint;
- surface = 3;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- //Check Left Face
- tester.checkTriangle(tester, p6, p5, p1);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- distance = tester.nearestDistance;
- collisionPoint = tester.intersectionPoint;
- surface = 4;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- tester.checkTriangle(tester, p1, p2, p6);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- distance = tester.nearestDistance;
- collisionPoint = tester.intersectionPoint;
- surface = 4;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- //Check right face
- tester.checkTriangle(tester, p8, p7, p3);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- distance = tester.nearestDistance;
- collisionPoint = tester.intersectionPoint;
- surface = 5;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- tester.checkTriangle(tester, p3, p4, p8);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- distance = tester.nearestDistance;
- collisionPoint = tester.intersectionPoint;
- surface = 5;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- //Check bottom face
- tester.checkTriangle(tester, p5, p6, p7);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- collisionPoint = tester.intersectionPoint;
- surface = 1;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- tester.checkTriangle(tester, p8, p7, p5);
- if(tester.didCollide && tester.nearestDistance < distance)
- {
- collisionPoint = tester.intersectionPoint;
- surface = 1;
- tester.part = EnumDriveablePart.getPart(box.part);
- }
- if(tester.didCollide){
- tester.isOnTop = true;
- topFaceDist = tester.nearestDistance;
- }
- Vector3f.add(p1, pos, p1);
- Vector3f.add(p2, pos, p2);
- Vector3f.add(p3, pos, p3);
- Vector3f.add(p4, pos, p4);
- Vector3f.add(p5, pos, p5);
- Vector3f.add(p6, pos, p6);
- Vector3f.add(p7, pos, p7);
- Vector3f.add(p8, pos, p8);
- boolean muff = true;
- String wank = "crit";
- /**
- FlansMod.proxy.spawnParticle(wank, p1.x,p1.y,p1.z, 0,0,0);
- FlansMod.proxy.spawnParticle(wank, p2.x,p2.y,p2.z, 0,0,0);
- FlansMod.proxy.spawnParticle(wank, p3.x,p3.y,p3.z, 0,0,0);
- FlansMod.proxy.spawnParticle(wank, p4.x,p4.y,p4.z, 0,0,0);
- FlansMod.proxy.spawnParticle(wank, p5.x,p5.y,p5.z, 0,0,0);
- FlansMod.proxy.spawnParticle(wank, p6.x,p6.y,p6.z, 0,0,0);
- FlansMod.proxy.spawnParticle(wank, p7.x,p7.y,p7.z, 0,0,0);
- FlansMod.proxy.spawnParticle(wank, p8.x,p8.y,p8.z, 0,0,0);
- */
- //renderTri(p1,p2,p3);
- //renderTri(p3,p4,p1);
- if(tester.nearestDistance < topFaceDist) tester.isOnTop = false;
- if(surface == 1) tester.isOnTop = true;
- }
- }
- public void renderTri(Vector3f p1, Vector3f p2, Vector3f p3)
- {
- Vector3f pos = new Vector3f (posX, posY, posZ);
- Vector3f p1a = Vector3f.add(p1, pos, null);
- Vector3f p2a = Vector3f.add(p2, pos, null);
- Vector3f p3a = Vector3f.add(p3, pos, null);
- renderLine(p1a,p2a);
- renderLine(p2a,p3a);
- renderLine(p3a,p1a);
- }
- public void renderLine(Vector3f in, Vector3f out)
- {
- float dx = out.x - in.x;
- float dy = out.y - in.y;
- float dz = out.z - in.z;
- Vector3f diff = Vector3f.sub(out, in, null);
- diff.normalise();
- float distance = (float)Math.sqrt((dx * dx) + (dy * dy) + (dz * dz));
- for(int i = 0; i < 10; i++)
- {
- float dist2 = (distance/10) * i;
- Vector3f newVec = new Vector3f(in.x + (dist2*diff.x),in.y + (dist2*diff.y), in.z + (dist2*diff.z));
- FlansMod.proxy.spawnParticle("reddust", newVec.x, newVec.y, newVec.z, 0, 0, 0);
- }
- }
- public Vector3f collideWithDriveable(CollisionTest tester, Vector3f Pos, Vector3f vel)
- {
- float unitScale = 1/16F;
- float veryCloseDistance = 0.005F * unitScale;
- if(tester.collisionRecursiveDepth > 2) return Pos;
- tester.basePoint = Pos;
- tester.didCollide = false;
- if(getDriveableType().fancyCollision)
- {
- //checkCollision(tester, getDriveableType().colbox);
- for(CollisionShapeBox sbox: getDriveableType().collisionBox)
- {
- checkCollision(tester, sbox);
- }
- } else {
- for(DriveablePart ppart : getDriveableData().parts.values())
- {
- ppart.rayTraceRider(this, tester);
- }
- }
- //If no collision, we just move along the velocity
- if(tester.didCollide = false) return Vector3f.add(Pos, vel, null);
- //Collision occured, time to sort this out
- Vector3f destinationPoint = Vector3f.add(Pos, vel, null);
- Vector3f newBasePoint = Pos;
- if(tester.nearestDistance >= veryCloseDistance)
- {
- Vector3f V = vel;
- V.normalise();
- V.scale((float)(tester.nearestDistance - veryCloseDistance));
- newBasePoint = Vector3f.add(tester.basePoint, V, null);
- if(V.normalise() == new Vector3f(0,0,0)) return Vector3f.add(Pos, vel, null);
- V.normalise();
- //Change polygon intersection point so that the sliding plane is unaffected by the fact we move slightly less than collision tells us
- Vector3f.sub(tester.intersectionPoint, new Vector3f(V.x * veryCloseDistance, V.y * veryCloseDistance, V.z * veryCloseDistance), tester.intersectionPoint);
- }
- //Determine the sliding plane
- Vector3f slidePlaneOrigin = tester.intersectionPoint;
- if(tester.intersectionPoint == null) return Vector3f.add(Pos, vel, null);
- Vector3f slidePlaneNormal = Vector3f.sub(newBasePoint, tester.intersectionPoint, null);
- slidePlaneNormal.normalise();
- tester.collisionPlaneNormal = slidePlaneNormal;
- CollisionPlane plane = new CollisionPlane(slidePlaneOrigin, slidePlaneNormal);
- double sDV = plane.signedDistanceTo(destinationPoint);
- Vector3f scaledNormal = new Vector3f(slidePlaneNormal.x * sDV, slidePlaneNormal.y * sDV, slidePlaneNormal.z * sDV);
- Vector3f newDestPoint = Vector3f.sub(destinationPoint, scaledNormal, null);
- //Generate slide vector
- Vector3f newVelocityVector = Vector3f.sub(newDestPoint, tester.intersectionPoint, null);
- if(newVelocityVector.length() < veryCloseDistance)
- {
- return newBasePoint;
- }
- tester.collisionRecursiveDepth++;
- return collideWithDriveable(tester, newBasePoint, newVelocityVector);
- }
- public void updateRiderPos (Entity rider, CollisionTest test, Vector3f pos, Vector3f motion)
- {
- boolean isDriveable = false;
- if(rider instanceof EntityDriveable) isDriveable = true;
- Vector3f vehicleMotion = lastPos;
- Vector3f riderMountPoint = new Vector3f(rider.posX - posX, rider.posY - posY, rider.posZ - posZ);
- float yawDiff = axes.getYaw() - prevAxes.getYaw();
- float pitchDiff = axes.getPitch() - prevAxes.getPitch();
- float rollDiff = axes.getRoll() - prevAxes.getRoll();
- RotatedAxes velAxes = new RotatedAxes(axes.getYaw() + yawDiff, axes.getPitch() + pitchDiff, axes.getRoll() + rollDiff);
- Vector3f currentLocalPos = axes.findGlobalVectorLocally(riderMountPoint);
- Vector3f nextGlobalPos = velAxes.findLocalVectorGlobally(currentLocalPos);
- Vector3f diff = new Vector3f(0,0,0);
- //Some rubbish null checks
- if(nextGlobalPos == null) nextGlobalPos = new Vector3f(0,0,0);
- if(diff == null) diff = new Vector3f(0,0,0);
- Vector3f.add(vehicleMotion, diff, diff);
- rider.setPosition(nextGlobalPos.x + posX + ((hugeBoat)?diff.x/(1.5):0), (!isDriveable)?rider.posY:((EntityDriveable)rider).deckHeight, nextGlobalPos.z + posZ + ((hugeBoat)?diff.z/(1.5):0));
- if(hugeBoat){
- if(lastPos.x == 0 && lastPos.y == 0 && lastPos.z == 0)
- {
- rider.motionX = rider.motionX;
- rider.motionY = rider.motionY;
- rider.motionZ = rider.motionZ;
- }
- else
- {
- //rider.motionX = -rider.motionX + diff.x;
- //rider.motionY = 0;
- //rider.motionZ = -rider.motionZ + diff.z;
- }
- }
- else
- {
- if(lastPos.x == 0 && lastPos.y == 0 && lastPos.z == 0)
- {
- rider.motionX = rider.motionX;
- rider.motionY = rider.motionY;
- rider.motionZ = rider.motionZ;
- }
- else
- {
- rider.motionX = diff.x;
- rider.motionY = diff.y;
- rider.motionZ = diff.z;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement