mirror of
https://github.com/ChocoTaco1/TacoServer.git
synced 2026-01-19 16:14:44 +00:00
Fix Cloak Lak Perk
Restore old behavior via gamemode override
This commit is contained in:
parent
12a99ce7c5
commit
1c9ef79d26
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue