97 lines
2.6 KiB
Text
97 lines
2.6 KiB
Text
|
|
|
|
object vehicle_weapon_plasmacannon : vehicle_weapon_base {
|
|
void preinit();
|
|
void init();
|
|
void Fire();
|
|
|
|
void UpdateCharge();
|
|
|
|
string muzzleFlashFX;
|
|
|
|
float spread;
|
|
float projectileIndex;
|
|
|
|
float spreadSiege;
|
|
float chargePerUseSiegeScale;
|
|
|
|
float jointHandle;
|
|
float jointHandleParent;
|
|
float feedback;
|
|
float baseChargeMax;
|
|
|
|
vector velocity;
|
|
};
|
|
|
|
void vehicle_weapon_plasmacannon::preinit() {
|
|
projectileIndex = GetEntityDef( getKey( "def_projectile" ) );
|
|
|
|
entity vehicle = getVehicle();
|
|
jointHandle = vehicle.getJointHandle( getKey( "muzzle" ) );
|
|
jointHandleParent = vehicle.getJointHandle( getKey( "muzzle_parent" ) );
|
|
|
|
muzzleFlashFX = getKey( "muzzle_flash" );
|
|
|
|
spread = getFloatKey( "spread" );
|
|
velocity = getVectorKey( "velocity" );
|
|
feedback = getFloatKey( "feedback" );
|
|
|
|
spreadSiege = getFloatKey( "spread_siege" );
|
|
chargePerUseSiegeScale = getFloatKey( "charge_per_use_siege_scale" );
|
|
baseChargeMax = getFloatKey( "charge_max" );
|
|
|
|
}
|
|
|
|
void vehicle_weapon_plasmacannon::init() {
|
|
}
|
|
|
|
void vehicle_weapon_plasmacannon::Fire() {
|
|
|
|
vector origin = myVehicle.getJointPos( jointHandle );
|
|
boolean allowFire = true;
|
|
|
|
if ( jointHandleParent != INVALID_JOINT ) {
|
|
vector muzzleCheckOrigin = myVehicle.getJointPos( jointHandleParent );
|
|
if ( sys.tracePoint( muzzleCheckOrigin, origin, MASK_PROJECTILE, myVehicle ) != 1.f ) {
|
|
allowFire = false;
|
|
}
|
|
}
|
|
|
|
|
|
if ( allowFire ) {
|
|
float spreadActual = spread;
|
|
if ( myVehicle.inSiegeMode() ) {
|
|
myVehicle.startSound ( "snd_recharge_2s", SND_VEHICLE_INTERIOR_POWERUP );
|
|
spreadActual = spreadSiege;
|
|
}
|
|
else {
|
|
myVehicle.startSound ( "snd_recharge_4s", SND_VEHICLE_INTERIOR_POWERUP );
|
|
}
|
|
|
|
RemoveCharge();
|
|
|
|
myVehicle.launchMissileSimple( user, myVehicle, $null_entity, projectileIndex, -1, spreadActual, origin, myVehicle.jointToWorldSpace( jointHandle, velocity ) );
|
|
myVehicle.applyImpulse( origin, -feedback * myVehicle.getJointAxis( jointHandle, 0 ) );
|
|
myVehicle.playJointEffect( muzzleFlashFX, jointHandle, 0 );
|
|
} else {
|
|
// Gordon: FIXME: Play error sound/tooltip
|
|
}
|
|
|
|
GoToIdle();
|
|
}
|
|
|
|
void vehicle_weapon_plasmacannon::UpdateCharge() {
|
|
float percentChargeUsed = CalcChargeUsed() / chargeMax;
|
|
|
|
chargePerUse = userChargePerUse;
|
|
chargeMax = baseChargeMax;
|
|
if ( myVehicle.inSiegeMode() ) {
|
|
chargePerUse = chargePerUse * chargePerUseSiegeScale;
|
|
chargeMax = chargeMax * chargePerUseSiegeScale;
|
|
}
|
|
|
|
// recalculate the charge time to be the same %
|
|
chargeTime = sys.getTime() + chargeMax * percentChargeUsed;
|
|
|
|
UpdateCharge_Base();
|
|
}
|