mirror of
https://github.com/exogen/t2-mapper.git
synced 2026-01-20 04:35:05 +00:00
430 lines
10 KiB
C#
430 lines
10 KiB
C#
exec("scripts/weapons/TR2disc.cs");
|
|
exec("scripts/weapons/TR2grenadeLauncher.cs");
|
|
exec("scripts/weapons/TR2chaingun.cs");
|
|
exec("scripts/weapons/TR2grenade.cs");
|
|
exec("scripts/weapons/TR2targetingLaser.cs");
|
|
exec("scripts/packs/TR2energypack.cs");
|
|
exec("scripts/weapons/TR2shocklance.cs");
|
|
exec("scripts/weapons/TR2mortar.cs");
|
|
|
|
datablock StaticShapeData(TR2DeployedBeacon) : StaticShapeDamageProfile
|
|
{
|
|
shapeFile = "beacon.dts";
|
|
explosion = DeployablesExplosion;
|
|
maxDamage = 0.45;
|
|
disabledLevel = 0.45;
|
|
destroyedLevel = 0.45;
|
|
targetNameTag = 'beacon';
|
|
|
|
deployedObject = true;
|
|
|
|
dynamicType = $TypeMasks::SensorObjectType;
|
|
|
|
debrisShapeName = "debris_generic_small.dts";
|
|
debris = SmallShapeDebris;
|
|
};
|
|
|
|
datablock ItemData(RedNexus)
|
|
{
|
|
catagory = "Objectives";
|
|
shapefile = "nexus_effect.dts";
|
|
mass = 10;
|
|
elasticity = 0.2;
|
|
friction = 0.6;
|
|
pickupRadius = 2;
|
|
icon = "CMDNexusIcon";
|
|
targetTypeTag = 'Nexus';
|
|
|
|
computeCRC = false;
|
|
};
|
|
|
|
datablock ItemData(YellowNexus)
|
|
{
|
|
catagory = "Objectives";
|
|
shapefile = "nexus_effect.dts";
|
|
mass = 10;
|
|
elasticity = 0.2;
|
|
friction = 0.6;
|
|
pickupRadius = 2;
|
|
icon = "CMDNexusIcon";
|
|
targetTypeTag = 'Nexus';
|
|
|
|
computeCRC = false;
|
|
};
|
|
|
|
function serverCmdStartFlagThrowCount(%client, %data)
|
|
{
|
|
%client.player.flagThrowStart = getSimTime();
|
|
}
|
|
|
|
function serverCmdEndFlagThrowCount(%client, %data)
|
|
{
|
|
if(%client.player.flagThrowStart == 0)
|
|
return;
|
|
|
|
%time = getSimTime();
|
|
%result = %time - %client.player.flagThrowStart;
|
|
if( %result >= $TR2::MaxFlagChargeTime )
|
|
{
|
|
%client.player.flagThrowStart = 0;
|
|
return;
|
|
}
|
|
|
|
// throwStrength will be how many seconds the key was held
|
|
%throwStrength = (getSimTime() - %client.player.flagThrowStart) / 1000;
|
|
// trim the time to fit between 0.2 and 1.2
|
|
if(%throwStrength > 1.2)
|
|
%throwStrength = 1.2;
|
|
else if(%throwStrength < 0.2)
|
|
%throwStrength = 0.2;
|
|
|
|
%client.player.flagThrowStrength = %throwStrength;
|
|
|
|
%client.player.flagThrowStart = 0;
|
|
}
|
|
|
|
datablock AudioProfile(LauncherSound)
|
|
{
|
|
volume = 1.0;
|
|
filename = "fx/misc/launcher.wav";
|
|
description = AudioClose3d;
|
|
preload = true;
|
|
};
|
|
|
|
datablock StaticShapeData(Launcher)
|
|
{
|
|
catagory = "Objectives";
|
|
className = "Launcher";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
shapeFile = "stackable3m.dts";
|
|
soundEffect = LauncherSound;
|
|
scale = "1 1 0.14";
|
|
};
|
|
|
|
function Launcher::onCollision(%this, %obj, %col)
|
|
{
|
|
//echo("LAUNCHER: " @ %col);
|
|
%newVel = %col.getVelocity();
|
|
%normVel = VectorNormalize(%newVel);
|
|
%speed = %col.getSpeed();
|
|
|
|
// If the player walks on it, boost him upward
|
|
if (%speed < 30)
|
|
{
|
|
%newVel = %normVel;
|
|
%newVel = VectorScale(%newVel, 10);
|
|
%newVel = setWord(%newVel, 2, 72);
|
|
}
|
|
// If he has decent speed, give him a static boost
|
|
else if (%speed < 100)
|
|
{
|
|
%newVel = %normVel;
|
|
%newVel = VectorScale(%newVel, 100);
|
|
// Otherwise, give him a slightly scaled boost
|
|
} else
|
|
%newVel = VectorScale(%newVel, 1.05);
|
|
//%newVel = setWord(%newVel, 2, getWord(%newVel, 2) * -1);
|
|
//%col.applyImpulse(%col.getWorldBoxCenter(), VectorScale(%newVel, 200));
|
|
%col.setVelocity(%newVel);
|
|
%obj.playAudio(0, %this.soundEffect);
|
|
}
|
|
|
|
datablock TriggerData(cannonTrigger)
|
|
{
|
|
tickPeriodMS = 1000;
|
|
};
|
|
|
|
datablock TriggerData(goalZoneTrigger)
|
|
{
|
|
tickPeriodMS = 1000;
|
|
};
|
|
|
|
datablock TriggerData(defenseZoneTrigger)
|
|
{
|
|
tickPeriodMS = 1000;
|
|
};
|
|
|
|
datablock AudioProfile(CannonShotSound)
|
|
{
|
|
volume = 1.0;
|
|
filename = "fx/misc/cannonshot.wav";
|
|
description = AudioClose3d;
|
|
preload = true;
|
|
};
|
|
|
|
datablock AudioProfile(CannonStartSound)
|
|
{
|
|
volume = 1.0;
|
|
filename = "fx/misc/cannonstart.wav";
|
|
description = AudioClose3d;
|
|
preload = true;
|
|
};
|
|
|
|
function cannonTrigger::onEnterTrigger(%this, %trigger, %obj)
|
|
{
|
|
if (%obj.getState $= "Dead")
|
|
return;
|
|
|
|
%client = %obj.client;
|
|
%obj.playAudio(0, CannonStartSound);
|
|
%obj.inCannon = true;
|
|
%obj.setInvincible(true);
|
|
%client.cannonThread = %this.schedule(500, "ShootCannon", %trigger, %obj);
|
|
}
|
|
|
|
function cannonTrigger::onLeaveTrigger(%this, %trigger, %obj)
|
|
{
|
|
%client = %obj.client;
|
|
%obj.setInvincible(false);
|
|
cancel(%client.cannonThread);
|
|
}
|
|
|
|
function cannonTrigger::onTickTrigger(%this, %trigger)
|
|
{
|
|
}
|
|
|
|
function cannonTrigger::shootCannon(%this, %trigger, %obj)
|
|
{
|
|
%obj.applyImpulse(%obj.getWorldBoxCenter(), "0 0 20000");
|
|
%obj.setInvincible(false);
|
|
%obj.inCannon = false;
|
|
|
|
%newEmitter = new ParticleEmissionDummy(CannonEffect) {
|
|
position = %trigger.position;
|
|
rotation = %trigger.rotation;
|
|
scale = "1 1 1";
|
|
dataBlock = "defaultEmissionDummy";
|
|
emitter = "CannonEmitter";
|
|
velocity = "1";
|
|
};
|
|
|
|
%obj.playAudio(0, CannonShotSound);
|
|
%newEmitter.schedule(%newEmitter.emitter.lifetimeMS, "delete");
|
|
}
|
|
|
|
function goalZoneTrigger::onEnterTrigger(%this, %trigger, %obj)
|
|
{
|
|
if (!$TR2::EnableRoles || %trigger.team != %obj.team)
|
|
return;
|
|
|
|
if (!%obj.client.enableZones)
|
|
return;
|
|
|
|
|
|
Game.trySetRole(%obj, Goalie);
|
|
}
|
|
|
|
function goalZoneTrigger::onLeaveTrigger(%this, %trigger, %obj)
|
|
{
|
|
if (!$TR2::EnableRoles)
|
|
return;
|
|
|
|
if (!%obj.client.enableZones)
|
|
return;
|
|
|
|
if (!Game.trySetRole(%obj, Defense))
|
|
Game.trySetRole(%obj, Offense);
|
|
}
|
|
|
|
function defenseZoneTrigger::onEnterTrigger(%this, %trigger, %obj)
|
|
{
|
|
if (!$TR2::EnableRoles || %trigger.team != %obj.team)
|
|
return;
|
|
|
|
if (!%obj.client.enableZones)
|
|
return;
|
|
|
|
|
|
Game.trySetRole(%obj, Defense);
|
|
}
|
|
|
|
function defenseZoneTrigger::onLeaveTrigger(%this, %trigger, %obj)
|
|
{
|
|
if (!$TR2::EnableRoles)
|
|
return;
|
|
|
|
if (!%obj.client.enableZones)
|
|
return;
|
|
|
|
if (!Game.trySetRole(%obj, Offense))
|
|
error("TR2 role change error: couldn't change to Offense");
|
|
}
|
|
|
|
datablock StaticShapeData(Goal)
|
|
{
|
|
className = "Goal";
|
|
catagory = "Objectives";
|
|
shapefile = "goal_panel.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(GoalPost)
|
|
{
|
|
className = "GoalPost";
|
|
catagory = "Objectives";
|
|
shapefile = "goal_side.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(GoalCrossbar)
|
|
{
|
|
className = "GoalCrossbar";
|
|
catagory = "Objectives";
|
|
shapefile = "goal_top.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(GoalBack)
|
|
{
|
|
className = "GoalBack";
|
|
catagory = "Objectives";
|
|
shapefile = "goal_back.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(GoldGoalPost)
|
|
{
|
|
className = "GoalPost";
|
|
catagory = "Objectives";
|
|
shapefile = "gold_goal_side.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(GoldGoalCrossbar)
|
|
{
|
|
className = "GoalCrossbar";
|
|
catagory = "Objectives";
|
|
shapefile = "gold_goal_top.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(GoldGoalBack)
|
|
{
|
|
className = "GoalBack";
|
|
catagory = "Objectives";
|
|
shapefile = "gold_goal_back.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
|
|
datablock StaticShapeData(GoldPole)
|
|
{
|
|
className = "GoldPole";
|
|
catagory = "Objectives";
|
|
shapefile = "golden_pole.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(SilverPole)
|
|
{
|
|
className = "SilverPole";
|
|
catagory = "Objectives";
|
|
shapefile = "silver_pole.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(Billboard1)
|
|
{
|
|
className = "Billboard";
|
|
catagory = "Misc";
|
|
shapefile = "billboard_1.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(Billboard2)
|
|
{
|
|
className = "Billboard";
|
|
catagory = "Misc";
|
|
shapefile = "billboard_2.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(Billboard3)
|
|
{
|
|
className = "Billboard";
|
|
catagory = "Misc";
|
|
shapefile = "billboard_3.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
datablock StaticShapeData(Billboard4)
|
|
{
|
|
className = "Billboard";
|
|
catagory = "Misc";
|
|
shapefile = "billboard_4.dts";
|
|
isInvincible = true;
|
|
needsNoPower = true;
|
|
};
|
|
|
|
|
|
function GoalCrossbar::onCollision(%this, %obj, %col)
|
|
{
|
|
return;
|
|
if (%col.getClassName() !$= "Player")
|
|
return;
|
|
|
|
if (getWord(%col.getPosition(), 2) > getWord(%obj.getPosition(), 2))
|
|
{
|
|
// Ooo...the quick 1-2 punch to defeat a potential exploit
|
|
%this.nudgeObject(%obj, %col, 10);
|
|
%obj.schedule(100, "nudgeObject", %obj, %col, -70);
|
|
}
|
|
}
|
|
|
|
function GoalCrossbar::nudgeObject(%this, %obj, %col, %vertNudge)
|
|
{
|
|
%center = $TheFlag.originalPosition;
|
|
|
|
// Determine if the object is on the front or back part of the crossbar
|
|
%colDist = VectorDist(%col.getPosition(), %center);
|
|
%goalDist = VectorDist(%obj.getPosition(), %center);
|
|
%nudgeDir = (%goalDist > %colDist) ? 1 : -1;
|
|
|
|
// Nudge the player towards the center of the map
|
|
%nudgeVec = VectorNormalize($TheFlag.originalPosition);
|
|
%nudgeVec = VectorScale(%nudgeVec, %nudgeDir);
|
|
%nudgeVec = VectorScale(%nudgeVec, 40);
|
|
%nudgeVec = setWord(%nudgeVec, 2, %vertNudge);
|
|
|
|
%col.setVelocity(%nudgeVec);
|
|
}
|
|
|
|
datablock ForceFieldBareData(TR2defaultForceFieldBare)
|
|
{
|
|
fadeMS = 1000;
|
|
baseTranslucency = 0.80;
|
|
powerOffTranslucency = 0.0;
|
|
teamPermiable = true;
|
|
otherPermiable = true;
|
|
color = "0.0 0.55 0.99";
|
|
powerOffColor = "0.0 0.0 0.0";
|
|
targetNameTag = 'Force Field';
|
|
targetTypeTag = 'ForceField';
|
|
|
|
texture[0] = "skins/forcef1";
|
|
texture[1] = "skins/forcef2";
|
|
texture[2] = "skins/forcef3";
|
|
texture[3] = "skins/forcef4";
|
|
texture[4] = "skins/forcef5";
|
|
|
|
framesPerSec = 10;
|
|
numFrames = 5;
|
|
scrollSpeed = 15;
|
|
umapping = 1.0;
|
|
vmapping = 0.15;
|
|
};
|
|
|