void CPieceProjectile::Update() { if (flags & PF_Fall) { speed.y += gravity; } speed *= 0.997f; pos += speed; spinAngle += spinSpeed; if (flags & PF_Fire && HasVertices()) { OldInfo* tempOldInfo = oldInfos[7]; for (int a = 6; a >= 0; --a) { oldInfos[a + 1] = oldInfos[a]; } CMatrix44f m(pos); m.Rotate(spinAngle * PI / 180.0f, spinVec); float3 pos = RandomVertexPos(); m.Translate(pos.x, pos.y, pos.z); oldInfos[0] = tempOldInfo; oldInfos[0]->pos = m.GetPos(); oldInfos[0]->size = gu->usRandFloat() * 1 + 1; } age++; if (flags & PF_NoCEGTrail) { if (!(age & 7) && (flags & PF_Smoke)) { float3 dir = speed; dir.Normalize(); if (curCallback) curCallback->drawCallbacker = 0; curCallback = new CSmokeTrailProjectile(pos, oldSmoke, dir, oldSmokeDir, owner(), age == 8, false, 14, Smoke_Time, 0.5f, drawTrail, this, &ph->smoketrailtex); useAirLos = curCallback->useAirLos; oldSmoke = pos; oldSmokeDir = dir; if (!drawTrail) { float3 camDir = (pos - camera->pos).Normalize(); if (camera->pos.distance(pos) + (1 - fabs(camDir.dot(dir))) * 3000 > 300) { drawTrail = true; } } } } else { // TODO: pass a more sensible ttl to the CEG (age-related?) ceg.Explosion(pos, 100, 0.0f, 0x0, 0.0f, 0x0, speed); } if (age > 10) checkCol = true; }
void CPieceProjectile::Update() { if (flags & PP_Fall) speed.y += gs->gravity; /* speed.x *= 0.994f; speed.z *= 0.994f; if(speed.y > 0) speed.y *= 0.998f;*/ speed*=0.997f; pos += speed; spinPos+=spinSpeed; *numCallback=0; if ((flags & PP_Fire && HasVertices() )/* && (gs->frameNum & 1)*/) { ENTER_MIXED; OldInfo* tempOldInfo=oldInfos[7]; for(int a=6;a>=0;--a){ oldInfos[a+1]=oldInfos[a]; } CMatrix44f m; m.Translate(pos.x,pos.y,pos.z); m.Rotate(spinPos*PI/180,spinVec); float3 pos=RandomVertexPos(); m.Translate(pos.x,pos.y,pos.z); oldInfos[0]=tempOldInfo; oldInfos[0]->pos=m.GetPos(); oldInfos[0]->size=gu->usRandFloat()*1+1; ENTER_SYNCED; } age++; if(!(age & 7) && (flags & PP_Smoke)){ float3 dir=speed; dir.Normalize(); if(curCallback) curCallback->drawCallbacker=0; curCallback=SAFE_NEW CSmokeTrailProjectile(pos,oldSmoke,dir,oldSmokeDir,owner,age==8,false,14,Smoke_Time,0.5f,drawTrail,this); useAirLos=curCallback->useAirLos; oldSmoke=pos; oldSmokeDir=dir; if(!drawTrail){ float3 camDir=(pos-camera->pos).Normalize(); if(camera->pos.distance(pos)+(1-fabs(camDir.dot(dir)))*3000 > 300) drawTrail=true; } } if(age>10) checkCol=true; }