diff --git a/Classic/scripts/LakRabbitGame.cs b/Classic/scripts/LakRabbitGame.cs index 528523f..6481263 100644 --- a/Classic/scripts/LakRabbitGame.cs +++ b/Classic/scripts/LakRabbitGame.cs @@ -920,6 +920,287 @@ function Player::setKnockback(%this, %val) // } //} +//Old Behavior +function ShapeBaseImageData::onFire(%data, %obj, %slot) +{ + // --------------------------------------------------------------------------- + // z0dd - ZOD, 9/3/02. Anti rapid fire mortar/missile fix. + // if (%obj.cantFire !$= "") + // { + // return 0; + // } + + // %wpnName = %data.getName(); + // if((%wpnName $= "MortarImage") || (%wpnName $= "MissileLauncherImage")) + // { + // %obj.cantFire = 1; + // %preventTime = %data.stateTimeoutValue[4]; + // //%preventTime = (%data.stateTimeoutValue[4] + %data.stateTimeoutValue[3]) - 0.032; + // %obj.reloadSchedule = schedule(%preventTime * 1000, %obj, resetFire, %obj); + // } + // --------------------------------------------------------------------------- + %obj.lfireTime[%data.getName()] = getSimTime(); + + %data.lightStart = getSimTime(); + + if( %obj.station $= "" && %obj.isCloaked() ) + { + if( %obj.respawnCloakThread !$= "" ) + { + Cancel(%obj.respawnCloakThread); + %obj.setCloaked( false ); + %obj.respawnCloakThread = ""; + } + else + { + if( %obj.getEnergyLevel() > 20 ) + { + %obj.setCloaked( false ); + %obj.reCloak = %obj.schedule( 500, "setCloaked", true ); + } + + //We check if the player is still cloaked now. So no need to limit to 20% energy for the cloak in/out animation + //%obj.setCloaked( false ); + //%obj.reCloak = schedule( 500, 0, "checkCloakState", %obj); + } + } + + if( %obj.client > 0 ) + { + %obj.setInvincibleMode(0 ,0.00); + %obj.setInvincible( false ); // fire your weapon and your invincibility goes away. + } + + %vehicle = 0; + if(%data.usesEnergy) + { + if(%data.useMountEnergy) + { + %useEnergyObj = %obj.getObjectMount(); + if(!%useEnergyObj) + %useEnergyObj = %obj; + %energy = %useEnergyObj.getEnergyLevel(); + %vehicle = %useEnergyObj; + } + else + %energy = %obj.getEnergyLevel(); + + if(%data.useCapacitor && %data.usesEnergy) + { + if( %useEnergyObj.turretObject.getCapacitorLevel() < %data.minEnergy ) + { + return; + } + } + else if(%energy < %data.minEnergy) + return; + } + // --------------------------------------------------------------------- + // z0dd - ZOD, 4/24/02. Code optimization + if(%data.projectileSpread) + { + %vec = %obj.getMuzzleVector(%slot); + %x = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread; + %y = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread; + %z = (getRandom() - 0.5) * 2 * 3.1415926 * %data.projectileSpread; + %mat = MatrixCreateFromEuler(%x @ " " @ %y @ " " @ %z); + %vector = MatrixMulVector(%mat, %vec); + } + else + { + // z0dd - ZOD, 4/10/02. Founder - fixes off center projectile drift. + //%vector = %obj.getMuzzleVector(%slot); + %vector = MatrixMulVector("0 0 0 0 0 1 0", %obj.getMuzzleVector(%slot)); + } + + %p = new (%data.projectileType)() { + dataBlock = %data.projectile; + initialDirection = %vector; + initialPosition = %obj.getMuzzlePoint(%slot); + sourceObject = %obj; + sourceSlot = %slot; + vehicleObject = %vehicle; + }; + // End streamlining + // --------------------------------------------------------------------- + if (isObject(%obj.lastProjectile) && %obj.deleteLastProjectile) + %obj.lastProjectile.delete(); + + %obj.lastProjectile = %p; + %obj.deleteLastProjectile = %data.deleteLastProjectile; + MissionCleanup.add(%p); + + // AI hook + if(%obj.client) + %obj.client.projectile = %p; + + if(%data.usesEnergy) + { + if(%data.useMountEnergy) + { + if( %data.useCapacitor ) + { + %vehicle.turretObject.setCapacitorLevel( %vehicle.turretObject.getCapacitorLevel() - %data.fireEnergy ); + } + else + %useEnergyObj.setEnergyLevel(%energy - %data.fireEnergy); + } + else + %obj.setEnergyLevel(%energy - %data.fireEnergy); + } + else + %obj.decInventory(%data.ammo,1); + return %p; +} + +//Old Behavior +function ShockLanceImage::onFire(%this, %obj, %slot) +{ + // Added Spawn Invinciblity check + if(%obj.client > 0) + { + %obj.setInvincibleMode(0, 0.00); + %obj.setInvincible( false ); + } + + // z0dd - ZOD, 4/10/04. ilys - Added rapidfire shocklance fix + if(%obj.cantfire !$= "") + return; + + %obj.cantfire = 1; + %preventTime = %this.stateTimeoutValue[4]; + %obj.reloadSchedule = schedule(%preventTime * 1000, %obj, resetFire, %obj); + + if( %obj.getEnergyLevel() < %this.minEnergy ) // z0dd - ZOD, 5/22/03. Check energy level first + { + %obj.playAudio(0, ShockLanceMissSound); + return; + } + if( %obj.isCloaked() ) + { + if( %obj.respawnCloakThread !$= "" ) + { + Cancel(%obj.respawnCloakThread); + %obj.setCloaked( false ); + } + else + { + if( %obj.getEnergyLevel() > 20 ) + { + %obj.setCloaked( false ); + %obj.reCloak = %obj.schedule( 500, "setCloaked", true ); + } + + //We check if the player is still cloaked now. So no need to limit to 20% energy for the cloak in/out animation + //%obj.setCloaked( false ); + //%obj.reCloak = schedule( 500, 0, "checkCloakState", %obj); + } + } + + %muzzlePos = %obj.getMuzzlePoint(%slot); + %muzzleVec = %obj.getMuzzleVector(%slot); + %endPos = VectorAdd(%muzzlePos, VectorScale(%muzzleVec, %this.projectile.extension)); + %damageMasks = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType | + $TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType | + $TypeMasks::SensorObjectType | $TypeMasks::TurretObjectType; + + %everythingElseMask = $TypeMasks::TerrainObjectType | + $TypeMasks::InteriorObjectType | + $TypeMasks::ForceFieldObjectType | + $TypeMasks::StaticObjectType | + $TypeMasks::MoveableObjectType | + $TypeMasks::DamagableItemObjectType; + + // did I miss anything? players, vehicles, stations, gens, sensors, turrets + %hit = ContainerRayCast(%muzzlePos, %endPos, %damageMasks | %everythingElseMask, %obj); + %noDisplay = true; + + if(%hit !$= "0") + { + %obj.setEnergyLevel(%obj.getEnergyLevel() - %this.hitEnergy); + %hitobj = getWord(%hit, 0); + %hitpos = getWord(%hit, 1) @ " " @ getWord(%hit, 2) @ " " @ getWord(%hit, 3); + + if(%hitObj.getType() & %damageMasks) + { + // z0dd - ZOD, 5/18/03. Do not apply impulse to MPB. + if(%hitObj.getDataBlock().classname !$= WheeledVehicleData) + %hitobj.applyImpulse(%hitpos, VectorScale(%muzzleVec, %this.projectile.impulse)); + + %obj.playAudio(0, ShockLanceHitSound); + + // This is truly lame, but we need the sourceobject property present... + %p = new ShockLanceProjectile() { + dataBlock = %this.projectile; + initialDirection = %obj.getMuzzleVector(%slot); + initialPosition = %obj.getMuzzlePoint(%slot); + sourceObject = %obj; + sourceSlot = %slot; + targetId = %hit; + }; + MissionCleanup.add(%p); + + %damageMultiplier = 1.0; + + if(%hitObj.getDataBlock().getClassName() $= "PlayerData") + { + // Now we see if we hit from behind... + %forwardVec = %hitobj.getForwardVector(); + %objDir2D = getWord(%forwardVec, 0) @ " " @ getWord(%forwardVec,1) @ " " @ "0.0"; + %objPos = %hitObj.getPosition(); + %dif = VectorSub(%objPos, %muzzlePos); + %dif = getWord(%dif, 0) @ " " @ getWord(%dif, 1) @ " 0"; + %dif = VectorNormalize(%dif); + %dot = VectorDot(%dif, %objDir2D); + + // 120 Deg angle test... + // 1.05 == 60 degrees in radians + if (%dot >= mCos(1.05)) + { + // Rear hit + %damageMultiplier = 3.0; + if(!%hitObj.getOwnerClient().isAIControlled()) + %hitObj.getOwnerClient().rearshot = 1; // z0dd - ZOD, 8/25/02. Added Lance rear shot messages + } + // -------------------------------------------------------------- + // z0dd - ZOD, 8/25/02. Added Lance rear shot messages + else + { + if(!%hitObj.getOwnerClient().isAIControlled()) + %hitObj.getOwnerClient().rearshot = 0; + } + // -------------------------------------------------------------- + } + + %totalDamage = %this.Projectile.DirectDamage * %damageMultiplier; + %hitObj.getDataBlock().damageObject(%hitobj, %p.sourceObject, %hitpos, %totalDamage, $DamageType::ShockLance); + + %noDisplay = false; + } + } + + if( %noDisplay ) + { + // Miss + %obj.setEnergyLevel(%obj.getEnergyLevel() - %this.missEnergy); + %obj.playAudio(0, ShockLanceMissSound); + + %p = new ShockLanceProjectile() { + dataBlock = %this.projectile; + initialDirection = %obj.getMuzzleVector(%slot); + initialPosition = %obj.getMuzzlePoint(%slot); + sourceObject = %obj; + sourceSlot = %slot; + }; + MissionCleanup.add(%p); + } + // z0dd - ZOD, 4/10/04. AI hook + if(%obj.client != -1) + %obj.client.projectile = %p; + + return %p; +} + }; //Put everyone on NonRabbit Team