rendered paste body#include "StdAfx.h"
// ExplosiveProjectile.cpp: implementation of the CExplosiveProjectile class.
//
//////////////////////////////////////////////////////////////////////
#include "ExplosiveProjectile.h"
#include "Game/GameHelper.h"
#include "Map/Ground.h"
#include "Game/Camera.h"
#include "Rendering/GL/VertexArray.h"
#include "Rendering/Textures/ColorMap.h"
#include "Sim/Weapons/WeaponDefHandler.h"
#include "Sim/Misc/InterceptHandler.h"
#include "mmgr.h"
#include "ProjectileHandler.h"
CR_BIND_DERIVED(CExplosiveProjectile, CWeaponProjectile, (float3(0,0,0),float3(0,0,0),NULL,NULL,0,0));
CR_REG_METADATA(CExplosiveProjectile, (
CR_MEMBER(ttl),
CR_MEMBER(areaOfEffect)
));
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CExplosiveProjectile::CExplosiveProjectile(const float3& pos,const float3& speed,CUnit* owner, WeaponDef *weaponDef, int ttl,float areaOfEffect)
: CWeaponProjectile(pos,speed,owner, 0,ZeroVector,weaponDef,0, true),
ttl(ttl),
areaOfEffect(areaOfEffect),
curTime(0)
{
useAirLos=true;
SetRadius(weaponDef->collisionSize);
drawRadius=weaponDef->size;
invttl=1.0f/ttl;
#ifdef TRACE_SYNC
tracefile << "New explosive: ";
tracefile << pos.x << " " << pos.y << " " << pos.z << " " << speed.x << " " << speed.y << " " << speed.z << "\n";
#endif
}
CExplosiveProjectile::~CExplosiveProjectile()
{
}
void CExplosiveProjectile::Update()
{
pos+=speed;
speed.y+=gs->gravity;
if(!--ttl)
Collision();
if(weaponDef->noExplode) {
if(TraveledRange())
CProjectile::Collision();
}
curTime+=invttl;
if(curTime>1)
curTime=1;
}
void CExplosiveProjectile::Collision()
{
if (!weaponDef->noExplode) {
float h=ground->GetHeight2(pos.x,pos.z);
if(h>pos.y){
float3 n=ground->GetNormal(pos.x,pos.z);
pos-=speed*max(0.0f,min(1.0f,float((h-pos.y)*n.y/n.dot(speed)+0.1f)));
}
}
// helper->Explosion(pos,damages,areaOfEffect,owner);
CWeaponProjectile::Collision();
}
void CExplosiveProjectile::Collision(CUnit *unit)
{
// unit->DoDamage(damages,owner);
// helper->Explosion(pos,damages,areaOfEffect,owner);
CWeaponProjectile::Collision(unit);
}
void CExplosiveProjectile::Draw(void)
{
if(s3domodel) //dont draw if a 3d model has been defined for us
return;
inArray=true;
unsigned char col[4];
if(weaponDef->visuals.colorMap) {
weaponDef->visuals.colorMap->GetColor(col, curTime);
} else {
col[0]=int(weaponDef->visuals.color.x*255);
col[1]=int(weaponDef->visuals.color.y*255);
col[2]=int(weaponDef->visuals.color.z*255);
col[3]=int(weaponDef->intensity*255);
}
float3 dir=speed;
dir.Normalize();
if (weaponDef->visuals.blend) {
for(int a=0;a<5;++a){
col[0]=int((5-a)*0.2f*col[0]);
col[1]=int((5-a)*0.2f*col[1]);
col[2]=int((5-a)*0.2f*col[2]);
col[3]=int((5-a)*0.2f*col[3]);
float3 interPos=pos+speed*gu->timeOffset-dir*drawRadius*0.6f*a;
va->AddVertexTC(interPos-camera->right*drawRadius-camera->up*drawRadius,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->ystart,col);
va->AddVertexTC(interPos+camera->right*drawRadius-camera->up*drawRadius,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->ystart,col);
va->AddVertexTC(interPos+camera->right*drawRadius+camera->up*drawRadius,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->yend,col);
va->AddVertexTC(interPos-camera->right*drawRadius+camera->up*drawRadius,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->yend,col);
}
} else {
float3 interPos=pos+speed*gu->timeOffset-dir*drawRadius*0.6f*5;
va->AddVertexTC(interPos-camera->right*drawRadius-camera->up*drawRadius,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->ystart,col);
va->AddVertexTC(interPos+camera->right*drawRadius-camera->up*drawRadius,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->ystart,col);
va->AddVertexTC(interPos+camera->right*drawRadius+camera->up*drawRadius,weaponDef->visuals.texture1->xend,weaponDef->visuals.texture1->yend,col);
va->AddVertexTC(interPos-camera->right*drawRadius+camera->up*drawRadius,weaponDef->visuals.texture1->xstart,weaponDef->visuals.texture1->yend,col);
}
}
int CExplosiveProjectile::ShieldRepulse(CPlasmaRepulser* shield,float3 shieldPos, float shieldForce, float shieldMaxSpeed)
{
float3 dir=pos-shieldPos;
dir.Normalize();
if(dir.dot(speed)<shieldMaxSpeed){
speed+=dir*shieldForce;
return 2;
}
return 0;
}