home *** CD-ROM | disk | FTP | other *** search
- #include "Vehicle.h"
-
- #include "Game.h"
- #include "Renderer.h"
- #include "log.h"
- #include "intersection.h"
- #include "Network.h"
- #include "Gui.h"
-
- #include "Alleycat.h"
- #include "Dragonfly.h"
- #include "Sledgehammer.h"
- #include "VehicleEffectsParticleClusters.h"
-
- #include <math.h>
-
- Vehicle::Vehicle(Client* client){
- this->client = client;
-
- vectorCopy3d(client->cs.pos, pos);
- vectorCopy3d(client->cs.dir, dir);
- vectorCopy3d(client->cs.up, up);
- vectorCopy3d(client->cs.vel, vel); // THINKABOUTME: oder auf 0??
-
- vectorCopy3d(client->cs.vel, vel_inp);
- // vectorInit3d(0.0f, 0.0f, 0.0f, vel_phy);
-
- vectorInit3d(-1.0f, -1.0f, -1.0f, moveAABB.min);
- vectorInit3d(+1.0f, +1.0f, +1.0f, moveAABB.max);
-
- vectorInit3d(-1.0f, -1.0f, -1.0f, hitAABB.min);
- vectorInit3d(+1.0f, +1.0f, +1.0f, hitAABB.max);
-
- boundingSphereRadius = 5.0f;
-
-
- reconstructVectors();
-
- lastProcessMillis = SDL_GetTicks();
- lastMoveMillis = SDL_GetTicks();
- lastRecoveryMillis = SDL_GetTicks();
- lastTakeDamageMillis = 0;
-
- moveSpeed = 1.0f;
- turnSpeed = 1.0f;
-
- maxArmor = 100;
- maxEnergy = 100;
- energyRecovery = 0.0f;
- armor = client->cs.armor;
- energy = client->cs.energy;
-
- for(int i=0;i<4;i++){
- weapons[i] = NULL;
- }
- }
-
- Vehicle::~Vehicle(){
- for(int i=0;i<4;i++){
- if( weapons[i] != NULL ){
- delete weapons[i];
- }
- }
-
- }
-
- void Vehicle::processInputArray(inputArray_t inputArray){
- unsigned int currentMillis = SDL_GetTicks();
-
- if( lastProcessMillis >= currentMillis ) // sanity check
- return;
-
- float deltaT = (currentMillis - lastProcessMillis)/1000.0f;
- lastProcessMillis = currentMillis;
-
- // printf("deltaT: %f\n", deltaT);
-
- vectorInit3d(0.0f, 0.0f, 0.0f, vel_inp);
-
- if(inputArray[TURN_UP].pressed){
- turnUp(deltaT);
- }
- if(inputArray[TURN_DOWN].pressed){
- turnDown(deltaT);
- }
- if(inputArray[TURN_LEFT].pressed){
- turnLeft(deltaT);
- }
- if(inputArray[TURN_RIGHT].pressed){
- turnRight(deltaT);
- }
-
- if(inputArray[MOVE_FORWARD].pressed){
- moveForward(deltaT);
- }
- if(inputArray[MOVE_BACKWARD].pressed){
- moveBackward(deltaT);
- }
- if(inputArray[MOVE_LEFT].pressed){
- moveLeft(deltaT);
- }
- if(inputArray[MOVE_RIGHT].pressed){
- moveRight(deltaT);
- }
- if(inputArray[MOVE_UP].pressed){
- moveUp(deltaT);
- }
- if(inputArray[MOVE_DOWN].pressed){
- moveDown(deltaT);
- }
-
- if(inputArray[FIRE_WEAPON_1].pressed && weapons[0] != NULL && weapons[0]->isReadyToFire() ){
- weapons[0]->fire();
- }
- if(inputArray[FIRE_WEAPON_2].pressed && weapons[1] != NULL && weapons[1]->isReadyToFire() ){
- weapons[1]->fire();
- }
- if(inputArray[FIRE_WEAPON_3].pressed && weapons[2] != NULL && weapons[2]->isReadyToFire() ){
- weapons[2]->fire();
- }
- if(inputArray[FIRE_WEAPON_4].pressed && weapons[3] != NULL && weapons[3]->isReadyToFire() ){
- weapons[3]->fire();
- }
-
- vectorsFromAngles();
-
- if( vectorLengthSquared3d(vel_inp) > 0.001f ){
- vectorNormalize3d(vel_inp, vel_inp);
- }else{
- vectorInit3d(0.0f, 0.0f, 0.0f, vel_inp);
- }
-
- }
-
- void Vehicle::turnLeft(float deltaT){
- yaw = (float)fmod( yaw-(turnSpeed * deltaT), (2*PI));
- if(yaw<0.0f)
- yaw=yaw+(2*PI);
- }
-
- void Vehicle::turnRight(float deltaT){
- yaw = (float)fmod( yaw+(turnSpeed * deltaT), (2*PI));
- }
-
- void Vehicle::turnUp(float deltaT){
- pitch -= (turnSpeed * deltaT);
- if(pitch<GAME_OBJECT_MIN_PITCH)
- pitch=GAME_OBJECT_MIN_PITCH;
- }
-
- void Vehicle::turnDown(float deltaT){
- pitch += (turnSpeed * deltaT);
- if(pitch>GAME_OBJECT_MAX_PITCH)
- pitch=GAME_OBJECT_MAX_PITCH;
- }
-
- void Vehicle::moveForward(float deltaT){
- vectorMA3d(vel_inp, deltaT*moveSpeed, dir, vel_inp);
- }
- void Vehicle::moveBackward(float deltaT){
- vectorMA3d(vel_inp, -deltaT*moveSpeed, dir, vel_inp);
- }
- void Vehicle::moveLeft(float deltaT){
- vectorMA3d(vel_inp, deltaT*moveSpeed, left, vel_inp);
- }
- void Vehicle::moveRight(float deltaT){
- vectorMA3d(vel_inp, -deltaT*moveSpeed, left, vel_inp);
- }
- void Vehicle::moveUp(float deltaT){
- vectorMA3d(vel_inp, deltaT*moveSpeed, e2, vel_inp);
- }
- void Vehicle::moveDown(float deltaT){
- vectorMA3d(vel_inp, -deltaT*moveSpeed, e2, vel_inp);
- }
-
-
- void Vehicle::move(){
- }
-
- bool Vehicle::collisionDetection(vec3_t displacement){
- unsigned int i;
- int numIterations = 0;
- vec3_t testPos, normal;
- float t;
- trace_t trace;
- trace.ignoreFlags = 0 | COLLISION_FLAG_BACKFACES | COLLISION_FLAG_WALK_THROUGH /*| COLLISION_FLAG_SUBSEQUENT_HITS*/;
-
- bool positionOk = true;
- do{
- positionOk = true;
-
- vectorAdd3d(pos, displacement, testPos);
-
- // check if pos is save inside arena
- // Game::arena->sptree->traceAABB(pos, testPos, moveAABB.min, moveAABB.max, &trace);
- traceAABB(pos, testPos, moveAABB, &trace);
-
- // TODO: nach dp sortieren!!!
- for(i=0;i<trace.hits.size();i++){
- // printf("trace: %i hits. Processing hit %i\n", trace.hits.size(), i);
-
- if( trace.hits[i].face != NULL ){ // hit a face of the arena
- Face* f = trace.hits[i].face;
-
- // find biggest dp
- float maxDp = vectorDotP3d(displacement, trace.hits[i].face->normal);
- for(int j=i+1;j<trace.hits.size();j++){
- if( trace.hits[j].face == NULL )
- continue;
-
- float dp = vectorDotP3d(displacement, trace.hits[j].face->normal);
- if( dp > maxDp && dp < 0.0f ){
- maxDp = dp;
- f = trace.hits[j].face;
- }
- }
-
- vectorCopy3d(f->normal, normal);
-
- // TODO: Push!
-
- positionOk = false;
- }
- if( trace.hits[i].vehicle != NULL ){ // hit a vehicle
- if( trace.hits[i].vehicle == this )
- continue;
-
- // printf("Collided with Vehicle!\n");
-
- vectorSub3d(this->pos, trace.hits[i].vehicle->pos, normal);
- vectorNormalize3d(normal, normal);
-
- // push
- vec3_t u1, u2;
- float m1 = this->physicsInfo.m;
- float m2 = trace.hits[i].vehicle->physicsInfo.m;
- vectorLinCombi3d( (m1-m2)/(m1+m2), this->vel, (2.0f*m2)/(m1+m2), trace.hits[i].vehicle->vel, u1);
- vectorLinCombi3d( (m2-m1)/(m1+m2), trace.hits[i].vehicle->vel, (2.0f*m1)/(m1+m2), this->vel, u2);
- vectorCopy3d(u1, this->vel);
- vectorCopy3d(u2, trace.hits[i].vehicle->vel);
-
- positionOk = false;
- }
-
- t = vectorDotP3d(normal, displacement);
- // printf("t: %f\n", t);
-
- if( t > 0.0f ){
- // ignore
- }else if( t < -0.001f ){
- vectorMA3d(displacement, -t, normal, displacement);
- }else{
- t = -0.001f;
- vectorMA3d(displacement, -t, normal, displacement);
- }
-
- break;
- }
-
-
- // count iterations
- numIterations++;
- if(numIterations > 10 ){
- // warn("(in Vehicle::collisionDetection()): Too many iterations. Aborting move.\n\n");
- vectorInit3d(0.0f, 0.0f, 0.0f, displacement);
- return false;
- }
-
- }while( !positionOk );
-
-
- // check if pos is in arenas box
- if(testPos[0]+moveAABB.min[0] < Game::arena->min[0] && displacement[0] < 0.0f
- || testPos[0]+moveAABB.max[0] > Game::arena->max[0] && displacement[0] > 0.0f){
- displacement[0] = 0.0f;
- }
- if(testPos[1]+moveAABB.min[1] < Game::arena->min[1] && displacement[1] < 0.0f
- || testPos[1]+moveAABB.max[1] > Game::arena->max[1] && displacement[1] > 0.0f){
- displacement[1] = 0.0f;
- }
- if(testPos[2]+moveAABB.min[2] < Game::arena->min[2] && displacement[2] < 0.0f
- || testPos[2]+moveAABB.max[2] > Game::arena->max[2] && displacement[2] > 0.0f){
- displacement[2] = 0.0f;
- }
-
-
- return true;
- }
-
- void Vehicle::calcRecovery(){
- unsigned int currentMillis = SDL_GetTicks();
- float deltaT = (currentMillis - lastRecoveryMillis)/1000.0f;
- lastRecoveryMillis = currentMillis;
-
- energy += deltaT * energyRecovery;
-
- // FIXME: supplypad-rec is done in sp-effect!!
- /*
- for(int i=0;i<Game::arena->supplypads.size();i++){
- vec3_t relPos;
- vectorSub3d(pos, Game::arena->supplypads[i].pos, relPos);
- relPos[1] -= 1.0f;
- if( pointIntersectsAABB(relPos, moveAABB.min, moveAABB.max) ){ // standing on supplypad
- // printf("ARGH!\n");
- energy += 10;//deltaT * energyRecovery * 3;
- armor += 10;
- }
- }
- */
- if( energy > maxEnergy )
- energy = maxEnergy;
- if( armor > maxArmor )
- armor = maxArmor;
-
- for(int k=0;k<4;k++){
- if( weapons[k] != NULL && weapons[k]->maxEnergy > 0 ){
- weapons[k]->energy += deltaT * 10.0f;
- if( weapons[k]->energy > weapons[k]->maxEnergy ){
- weapons[k]->energy = weapons[k]->maxEnergy;
- }
- }
- }
- }
-
- void Vehicle::takeDamage(int amount){
- armor -= amount;
- if( armor < 0 ){
- armor = 0;
- }
-
- // THINKABOUTME: in cs kopieren?
-
- lastTakeDamageMillis = SDL_GetTicks();
- }
-
- void Vehicle::explode(){
- Renderer::particleSystem.linkParticleCluster( new ExplodingVehicleParticleCluster(this) );
- }
-
-
-
-
- void Vehicle::addDynamicLightParticleCluster(DynamicLightParticleCluster* dlpc){
- printf("added!\n");
- }
- void Vehicle::removeDynamicLightParticleCluster(DynamicLightParticleCluster* dlpc){
- printf("removed!\n");
- }
-
- void Vehicle::render(){
-
- if( Renderer::info.var.renderBoundingBoxes == 1 ){
- Renderer::disableLighting();
-
- glPushMatrix();
- glTranslatef(pos[0], pos[1], pos[2]);
- glColor3f(0.0f, 1.0f, 0.0f);
- Renderer::debug_renderAABB(moveAABB.min, moveAABB.max);
- glColor3f(1.0f, 0.0f, 0.0f);
- Renderer::debug_renderAABB(hitAABB.min, hitAABB.max);
- glPopMatrix();
-
- Renderer::enableLighting();
- }
-
- if( Gui::info.var.hud_draw && Gui::info.var.hud_markTeamMembers
- && Game::info.var.mode == GAME_MODE_TEAM_DEATHMATCH
- && this->client->ci.team == Network::client->ci.team
- ){
-
- vec3_t p;
- vectorMA3d(this->pos, 1.5f, Game::cam.up, p);
- if( Renderer::info.var.useTransparentPolysList ){
- Renderer::addBillboardToTransparentPolys(p, 1.0f, 1.0f, Gui::hud->teamMarkerShader, SDL_GetTicks());
- }else{
- Renderer::renderBillboard(p, 1.0f, 1.0f, Gui::hud->teamMarkerShader, SDL_GetTicks());
- }
- }
-
- }
-
-
-
-
- Vehicle* Vehicle::createVehicleForClient(Client* client){
- Vehicle* ret = NULL;
-
- switch( client->ci.vehicle ){
- case GAME_VEHICLE_DRAGONFLY:
- ret = new Dragonfly(client);
- break;
-
- case GAME_VEHICLE_ALLEYCAT:
- ret = new Alleycat(client);
- break;
-
- // case GAME_VEHICLE_SLEDGEHAMMER:
- // ret = new Sledgehammer(client);
- // break;
-
- default:
- ret = new Dragonfly(client);
- break;
- }
- return ret;
- }
-
-