etqw-sdk/base/script/vehicles/weapons/plasmacannon.script

98 lines
2.6 KiB
Plaintext

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();
}