TWM2/scripts/weapons/Other/ShadowRifle.cs
Robert Fritzen 5ebf31e057 3.9.1 Update
Patched up some TWM2 bugs, re-did the Vardison Boss.
2015-02-12 19:45:18 -06:00

168 lines
5.3 KiB
C#

datablock LinearFlareProjectileData(ShadowRifleBolt) {
projectileShapeName = "turret_muzzlepoint.dts";
scale = "1.0 1.0 1.0";
faceViewer = true;
directDamage = 0.02;
hasDamageRadius = true;
indirectDamage = 0.1;
damageRadius = 4.0;
kickBackStrength = 0.0;
radiusDamageType = $DamageType::Shadow;
explosion = "BlasterExplosion";
splash = PlasmaSplash;
baseEmitter = NMMissileBaseEmitter;
ImageSource = "ShadowRifleImage";
dryVelocity = 120.0; // z0dd - ZOD, 7/20/02. Faster plasma projectile. was 55
wetVelocity = -1;
velInheritFactor = 0.3;
fizzleTimeMS = 250;
lifetimeMS = 8000;
explodeOnDeath = false;
reflectOnWaterImpactAngle = 0.0;
explodeOnWaterImpact = true;
deflectionOnWaterImpact = 0.0;
fizzleUnderwaterMS = -1;
//activateDelayMS = 100;
activateDelayMS = -1;
size[0] = 0.2;
size[1] = 0.5;
size[2] = 0.1;
numFlares = 35;
flareColor = "1 0.18 0.03";
flareModTexture = "flaremod";
flareBaseTexture = "flarebase";
sound = PlasmaProjectileSound;
fireSound = FlamethrowerFireSound;
wetFireSound = PlasmaFireWetSound;
hasLight = true;
lightRadius = 10.0;
lightColor = "0.94 0.03 0.12";
};
datablock ItemData(ShadowRifle) {
className = Weapon;
catagory = "Spawn Items";
shapeFile = "weapon_sniper.dts";
image = ShadowRifleImage;
mass = 1;
elasticity = 0.2;
friction = 0.6;
pickupRadius = 2;
pickUpName = "a shadow rifle";
computeCRC = true;
};
datablock ShapeBaseImageData(ShadowRifleImage) {
className = WeaponImage;
shapeFile = "weapon_sniper.dts";
item = ShadowRifle;
projectile = ShadowRifleBolt;
projectileType = LinearFlareProjectile;
MedalRequire = 1;
usesEnergy = true;
minEnergy = 6;
stateName[0] = "Activate";
stateTransitionOnTimeout[0] = "ActivateReady";
stateSound[0] = SniperRifleSwitchSound;
stateTimeoutValue[0] = 0.5;
stateSequence[0] = "Activate";
stateName[1] = "ActivateReady";
stateTransitionOnLoaded[1] = "Ready";
stateTransitionOnNoAmmo[1] = "NoAmmo";
stateName[2] = "Ready";
stateTransitionOnNoAmmo[2] = "NoAmmo";
stateTransitionOnTriggerDown[2] = "CheckWet";
stateName[3] = "Fire";
stateTransitionOnTimeout[3] = "Reload";
stateTimeoutValue[3] = 0.5;
stateFire[3] = true;
stateAllowImageChange[3] = false;
stateSequence[3] = "Fire";
stateScript[3] = "onFire";
stateName[4] = "Reload";
stateTransitionOnTimeout[4] = "Ready";
stateTimeoutValue[4] = 2.5;
stateAllowImageChange[4] = false;
stateName[5] = "CheckWet";
stateTransitionOnWet[5] = "DryFire";
stateTransitionOnNotWet[5] = "Fire";
stateName[6] = "NoAmmo";
stateTransitionOnAmmo[6] = "Reload";
stateTransitionOnTriggerDown[6] = "DryFire";
stateSequence[6] = "NoAmmo";
stateName[7] = "DryFire";
stateSound[7] = SniperRifleDryFireSound;
stateTimeoutValue[7] = 0.5;
stateTransitionOnTimeout[7] = "Ready";
};
function ShadowRifleBolt::onCollision(%data,%projectile,%targetObject,%modifier,%position,%normal) {
Parent::OnCollision(%data,%projectile,%targetObject,%modifier,%position,%normal);
%cn = %targetObject.getClassName();
if(%cn $= "Player") {
if($Host::TeamDamageOn == 0) {
if(%targetObject.team == %projectile.sourceObject.team) {
return;
}
}
if(%targetObject.beingSapped) {
return;
}
if(%targetObject.isBoss) {
%targetObject.playShieldEffect("1 1 1");
%vec = vectorsub(%projectile.sourceObject.getworldboxcenter(),vectorAdd(%targetObject.getPosition(), "0 0 1"));
%vec = vectoradd(%vec, vectorscale(%projectile.sourceObject.getvelocity(),vectorlen(%vec)/100));
%p = new LinearFlareProjectile() {
dataBlock = ShadowRifleBolt; //burn :)
initialDirection = %vec;
initialPosition = vectorAdd(%targetObject.getPosition(), "0 0 1");
sourceObject = %targetObject;
sourceSlot = 0;
};
messageClient(%projectile.sourceObject.client, 'MsgWarn', "WARNING: The boss deflects the pulse back at you!");
return;
}
else {
%targetObject.beingSapped = 1;
SapLoop(%projectile.sourceObject, %targetObject);
}
}
}
function SapLoop(%source, %target) {
if(!%source.isAlive()) {
return;
}
if(!%target.isAlive()) {
createBlood(%target);
return;
}
%target.zapObject();
%target.getDatablock().damageObject(%target, %source, %source.getPosition, 0.05, $DamageType::Shadow);
%target.lastDamagedImage = "ShadowRifleImage";
%source.applyRepair(0.05);
schedule(500, 0, "SapLoop", %source, %target);
}