Exemplo n.º 1
0
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;
}