// Diese Funktion führt einen Beamangriff gegen das Ziel durch, welches in der Variablen <code>m_pTarget<code> // gespeichert ist CPoint CCombatShip::AttackEnemyWithBeam(const CPoint& beamStart) { // Wenn wir ein Ziel aufgeschaltet haben if (m_pTarget != NULL) { m_Fire.phaserIsShooting = FALSE; // Nur wenn die Distanz größer als ein Feld ist wird geschossen, sonst ja gerammt int distance = m_KO.Distance(m_pTarget->m_KO); if (distance >= 1) { // Bonus durch Schiffsspezialeigenschaften besorgen BYTE boni = GetAccBoniFromSpecials(); int nBeamWeapon = beamStart.x; int nBeamRay = beamStart.y; // alle Beamwaffen durchgehen for (int i = nBeamWeapon; i < m_pShip->GetBeamWeapons()->GetSize(); i++) { if (nBeamRay >= m_pShip->GetBeamWeapons()->GetAt(i).GetBeamNumber()) { nBeamRay = 0; continue; } // Solange der Counter größer als die Rechargetime ist wird geschossen. Dann wird diese runtergezählt. if (m_Fire.phaser[i] > m_pShip->GetBeamWeapons()->GetAt(i).GetRechargeTime() || m_Fire.phaser[i] == NULL) { // Reichweite = Type(MK)*5 + (Bonus durch Feuer-System) + 50 (um auf 60 bis 160 zu kommen) if (distance <= (m_pShip->GetBeamWeapons()->GetAt(i).GetBeamType()*5 + m_pShip->GetBeamWeapons()->GetAt(i).GetBonus() + 50)) { if (AllowFire(m_pShip->GetBeamWeapons()->GetAt(i).GetFirearc())) { // Hier wird der Phasercounter auf die Rechargetime + die Beamschussdauer festgelegt. // Solange also dieser Counter größer als die Rechargetime ist wird geschossen. Dann wird gewartet // bis die Rechargetime auch verstrichen ist. Erst dann erfolgt wieder diese Zuweisung. if (m_Fire.phaser[i] == NULL) m_Fire.phaser[i] = m_pShip->GetBeamWeapons()->GetAt(i).GetRechargeTime() + m_pShip->GetBeamWeapons()->GetAt(i).GetBeamLenght(); // Hier den Schaden für jeden Beamstrahl einzeln berechnen. Also die Schleife gleich der Anzahl der // Beamstrahlen der Beamwaffe durchlaufen while (nBeamRay++ < m_pShip->GetBeamWeapons()->GetAt(i).GetBeamNumber()) { m_Fire.phaserIsShooting = FALSE; // Nur für die Darstellung im CombatSimulator // ------------------------------------------ m_bPulseFire = FALSE; if (m_pShip->GetBeamWeapons()->GetAt(i).GetShootNumber() > 1) m_bPulseFire = TRUE; // ------------------------------------------ // Ende der besonderen Darstellung // Angriff und Schadensberechnung FireBeam(i, distance, boni); // Wenn das Ziel keine Hülle mehr hat, dann geben wir die aktuelle Nummer des Beams zurück. // Dies bedeutet, das wir kein Ziel mehr haben und uns ein neues suchen müssen. Bei der aktuellen // Nummer des Beams geht dann die Berechnung weiter if (m_pTarget->m_pShip->GetHull()->GetCurrentHull() == 0) return CPoint(i, nBeamRay); } // bei der nächsten Waffe kann wieder mit dem ersten Strahl geschossen werden nBeamRay = 0; } } } } } } return CPoint(-1,-1); }
void CFuncMachinegun::PostFrame( CBasePlayer *pActivator ) { Vector plAngles = pActivator->pev->angles; while (plAngles.y < 0) plAngles.y += 360; float yawAngle = plAngles.y - pev->angles.y; float pitchAngle = pActivator->pev->angles.x * -3; SetBoneController( 0, yawAngle ); SetBoneController( 1, pitchAngle ); StudioFrameAdvance(); // return to idle after fire anim if (m_fSequenceFinished) { pev->sequence = TURRET_IDLE; pev->frame = 0; ResetSequenceInfo(); m_fSequenceLoops = TRUE; } if ( gpGlobals->time < m_flNextAttack ) return; if ( pActivator->pev->button & IN_ATTACK && (m_iAmmo > 0 || m_iAmmo == -1)) { // fire Vector vecForward, vecSrc, vecAngles; vecAngles = pActivator->pev->angles; vecAngles.x = vecAngles.x * -3; // invert anf scale pitch UTIL_MakeVectorsPrivate( vecAngles, vecForward, NULL, NULL ); GetAttachment(0, vecSrc, vecAngles); pev->sequence = TURRET_SHOOT_SOLID; // sounds, muzzleflashes, and shells will go by anim event pev->frame = 0; ResetSequenceInfo(); m_fSequenceLoops = FALSE; switch( m_projectileType ) { default: case TANK_BULLET_9MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_6DEGREES, 16384, BULLET_9MM, pActivator->pev); break; case TANK_BULLET_12MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_6DEGREES, 16384, BULLET_12MM, pActivator->pev); break; case TANK_BULLET_14MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_7DEGREES, 16384, BULLET_14MM, pActivator->pev); break; case TANK_BULLET_BUCKSHOT: for ( i = 0; i < 8; i++ ) FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_10DEGREES, 16384, BULLET_BUCKSHOT, pActivator->pev); break; case TANK_BULLET_12G: for ( i = 0; i < 4; i++ ) FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_15DEGREES, 16384, BULLET_12G, pActivator->pev); break; case TANK_BULLET_57MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_2DEGREES, 16384, BULLET_57mm, pActivator->pev); break; case TANK_BULLET_762NATO: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_3DEGREES, 16384, BULLET_762Nato, pActivator->pev); break; case TANK_BULLET_338MAGNUM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_0DEGREES, 16384, BULLET_338Magnum, pActivator->pev); break; case TANK_BULLET_762X54: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_4DEGREES, 16384, BULLET_762x54, pActivator->pev); break; case TANK_BULLET_86MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_8DEGREES, 16384, BULLET_86mm, pActivator->pev); break; case TANK_BULLET_32MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_5DEGREES, 16384, BULLET_32mm, pActivator->pev); break; case TANK_BULLET_127MM: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_1DEGREES, 16384, BULLET_127MM, pActivator->pev); break; case TANK_BULLET_BFG: for ( i = 0; i < 8; i++ ) FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_40DEGREES, 16384, BULLET_BFG, pActivator->pev); break; case TANK_BULLET_NAIL: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_0DEGREES, 16384, BULLET_NAILGUN, pActivator->pev); break; case TANK_BULLET_BOLT: CBolt::ShootBolt(pActivator->pev, vecSrc + vecForward*16, vecForward * 5000, 0 ); break; case TANK_ENERGY_HOMINGSHOCK: CShock::ShootShock(pActivator->pev, vecSrc + vecForward*16, vecForward * 400, FALSE ); break; case TANK_ENERGY_SHOCK: CShock::ShootShock(pActivator->pev, vecSrc + vecForward*16, vecForward * 700, TRUE ); break; case TANK_ENERGY_PLASMA: CPlasma::ShootPlasma(pActivator->pev, vecSrc + vecForward*16, vecForward * 20000 ); break; case TANK_ENERGY_PLASMALARGE: CPlasma2::ShootPlasma2(pActivator->pev, vecSrc + vecForward*16, vecForward * 20000 ); break; case TANK_ENERGY_FLAME: CFlame::ShootFlame(pActivator->pev, vecSrc + vecForward*16, vecForward * 900 ); break; case TANK_ENERGY_ECHARGE: CEnergycharge::ShootEnergycharge(pActivator->pev, vecSrc + vecForward*16, vecForward * 8000); break; case TANK_ENERGY_FROSTBALL: CFrostball::ShootFrostball(pActivator->pev, vecSrc + vecForward*16, vecForward * 5000); break; case TANK_ENERGY_GLUON: CGluon::ShootGluon(pActivator->pev, vecSrc + vecForward*16, vecForward * 2500 ); break; case TANK_ENERGY_GLUONLARGE: CGluon2::ShootGluon2(pActivator->pev, vecSrc + vecForward*16, vecForward * 6800, 10); break; case TANK_ENERGY_DISPBALL_HALF: CDispball::ShootDispball(pActivator->pev, vecSrc + vecForward*16, vecForward * 3000, 1); break; case TANK_ENERGY_DISPBALL_FULL: CDispball::ShootDispball(pActivator->pev, vecSrc + vecForward*16, vecForward * 1500, 2); break; case TANK_ENERGY_PBOLT: CPBolt::ShootPBolt(pActivator->pev, vecSrc + vecForward*16, vecForward * 15000 ); break; case TANK_ROCKET_XBOLT: CBolt::ShootBolt(pActivator->pev, vecSrc + vecForward*16, vecForward * 7500, 2); break; case TANK_ROCKET_CLUSTER: CClMomma::ShootClusterMomma(pActivator->pev, vecSrc + vecForward*16, vecForward * 1250, 3 ); break; case TANK_ROCKET_M203GREN: CM203grenade::ShootM203grenade(pActivator->pev, vecSrc + vecForward*16, vecForward * 1800); break; case TANK_ROCKET_AK74GREN: CAK74grenade::ShootAK74grenade(pActivator->pev, vecSrc + vecForward*16, vecForward * 4000); break; case TANK_ROCKET_HANDGREN: CGrenade::ShootGrenade(pActivator->pev, vecSrc + vecForward*16, vecForward * 1500, 3.5); break; case TANK_ROCKET_NGGREN: CNGgrenade::ShootNGgrenade(pActivator->pev, vecSrc + vecForward*16, vecForward * 2000, 3 ); break; case TANK_ROCKET_U2: CU2Momma::ShootU2Momma(pActivator->pev, vecSrc + vecForward*16, vecForward * 900, 1 ); break; case TANK_ROCKET_TESLAGREN: CTeslagren::ShootTeslagren(pActivator->pev, vecSrc + vecForward*16, vecForward * 3000); break; case TANK_ROCKET_MMISSILE: CMmissile::ShootMmissile(pActivator->pev, vecSrc + vecForward*16, vecForward * 5250 ); break; case TANK_ROCKET_DEMOLITION: CWhlProjectile::ShootWhlProjectile(pActivator->pev, vecSrc + vecForward*16, vecForward * 2250, FALSE ); break; case TANK_ROCKET_RPG: CRpgRocket::ShootRpgRocket(pActivator->pev, vecSrc + vecForward*16, vecForward * 2500, FALSE, NULL); break; case TANK_ROCKET_DUMBFIRE: CDumbfire::ShootDumbfire(pActivator->pev, vecSrc + vecForward*16, vecForward * 250); break; case TANK_ROCKET_HELLFIRE: Chellfire::ShootHellfire(pActivator->pev, vecSrc + vecForward*16, vecForward * 300, TRUE); break; case TANK_MORTAR: CTankProj::ShootTankProj(pActivator->pev, vecSrc + vecForward*16, vecForward * 100000); break; case TANK_ROCKET_NUKE: CNuke::ShootNuke(pActivator->pev, vecSrc + vecForward*16, vecForward * 1500, FALSE); break; case TANK_ROCKET_NUKE_CONTROLLED: CNuke::ShootNuke(pActivator->pev, vecSrc + vecForward*16, vecForward * 800, TRUE); break; case TANK_ROCKET_FLAKBOMB: CFlakBomb::ShootFlakBomb(pActivator->pev, vecSrc + vecForward*16, vecForward * 1800); break; case TANK_ROCKET_30MMGREN: C30mmgren::Shoot30mmgren(pActivator->pev, vecSrc + vecForward*16, vecForward * 4500); break; case TANK_ROCKET_BIOMASS: CBiomass::ShootBiomass(pActivator->pev, vecSrc + vecForward*16, vecForward * 3000, 200); break; case TANK_BEAM_BLASTER: FireBeam(vecSrc, vecForward, BEAM_BLASTER, 0, pActivator->pev); break; case TANK_BEAM_GAUSS: FireBeam(vecSrc, vecForward, BEAM_GAUSS, 0, pActivator->pev); break; case TANK_BEAM_GAUSSCHARGED: FireBeam(vecSrc, vecForward, BEAM_GAUSSCHARGED, 420, pActivator->pev); break; case TANK_BEAM_PHOTONGUN: FireBeam(vecSrc, vecForward, BEAM_PHOTONGUN, 0, pActivator->pev); break; case TANK_BEAM_PHOTONGUN_EXP: FireBeam(vecSrc, vecForward, BEAM_PHOTONGUN_EXP, 0, pActivator->pev); break; case TANK_BEAM_TAUCANNON: FireBeam(vecSrc, vecForward, BEAM_TAUCANNON, 0, pActivator->pev); break; case TANK_BEAM_PULSERIFLE: FireBeam(vecSrc, vecForward, BEAM_PULSERIFLE, 0, pActivator->pev); break; case TANK_BEAM_M72: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_0DEGREES, 16384, BULLET_2MM, pActivator->pev); break; case TANK_BEAM_M72QUAD: FireMagnumBullets(vecSrc, vecForward, VECTOR_CONE_0DEGREES, 16384, BULLET_2MM_QUAD, pActivator->pev); break; case TANK_BEAM_IONTURRET: FireBeam(vecSrc, vecForward, BEAM_IONTURRET, 0, pActivator->pev); break; case TANK_BEAM_TESLAGUN: FireBeam(vecSrc, vecForward, BEAM_TESLAGUN, 0, pActivator->pev); break; } if (m_iAmmo > 0) m_iAmmo--; // update ammo counter MESSAGE_BEGIN( MSG_ONE, gmsgSpecTank, NULL, pActivator->pev ); WRITE_BYTE( 2 ); // ammo update WRITE_LONG(m_iAmmo); WRITE_BYTE( m_spread ); // crosshair update MESSAGE_END(); m_flNextAttack = gpGlobals->time + (1/m_fireRate); } else if ( pActivator->pev->button & IN_ATTACK2 && m_AllowZoom) { if (m_fInZoom == 0) { pActivator->m_iFOV = 25; m_fInZoom = 1; } else if (m_fInZoom == 1) { pActivator->m_iFOV = 90; m_fInZoom = 0; } m_flNextAttack = gpGlobals->time + 0.3; } }