mirror of
https://github.com/ChocoTaco1/TacoServer.git
synced 2026-01-19 16:14:44 +00:00
Merge branch 'Dev' into Stable
This commit is contained in:
commit
5470c7dc16
|
|
@ -9,6 +9,9 @@
|
|||
// $Host::AntiPackPlayerCount = 6;
|
||||
//
|
||||
|
||||
if(!$Host::AntiPackEnable)
|
||||
return;
|
||||
|
||||
// Choose which packs to limit
|
||||
$AntiPackIncludeCloak = 1;
|
||||
$AntiPackIncludeShield = 0;
|
||||
|
|
|
|||
|
|
@ -86,7 +86,9 @@ function Observer::onTrigger(%data, %obj, %trigger, %state)
|
|||
if(%client.observeClient != -1)
|
||||
{
|
||||
observerFollowUpdate(%client, -1, false);
|
||||
messageClient(%client.observeClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);
|
||||
if(!%client.isAdmin && !%client.isWatchOnly){
|
||||
messageClient(%client.observeClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);
|
||||
}
|
||||
%client.observeClient = -1;
|
||||
}
|
||||
%obj.mode = "observerFly";
|
||||
|
|
@ -219,7 +221,9 @@ function observeFlag(%client, %target, %type, %flagTeam)
|
|||
if(%client.observeClient != -1)
|
||||
{
|
||||
observerFollowUpdate(%client, -1, false);
|
||||
messageClient(%client.observeClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);
|
||||
if(!%client.isAdmin && !%client.isWatchOnly){
|
||||
messageClient(%client.observeClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);
|
||||
}
|
||||
%client.observeClient = -1;
|
||||
}
|
||||
}
|
||||
|
|
@ -246,10 +250,12 @@ function observeFlag(%client, %target, %type, %flagTeam)
|
|||
|
||||
observerFollowUpdate(%client, %target, true);
|
||||
displayObserverHud(%client, %target);
|
||||
messageClient(%target, 'Observer', '\c1%1 is now observing you.', %client.name);
|
||||
if(!%client.isAdmin && !%client.isWatchOnly){
|
||||
messageClient(%target, 'Observer', '\c1%1 is now observing you.', %client.name);
|
||||
}
|
||||
|
||||
// was the client observing a player before?
|
||||
if(%client.observeClient != -1)
|
||||
if(%client.observeClient != -1 && !%client.isAdmin && !%client.isWatchOnly)
|
||||
messageClient(%client.observeClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);
|
||||
|
||||
%client.camera.getDataBlock().setMode(%client.camera, "observerFollow", %target.player);
|
||||
|
|
|
|||
16
Classic/scripts/autoexec/TacoOverrides.cs
Executable file → Normal file
16
Classic/scripts/autoexec/TacoOverrides.cs
Executable file → Normal file
|
|
@ -324,15 +324,15 @@ function serverCmdScopeCommanderMap(%client, %scope)
|
|||
}
|
||||
|
||||
//Mortar Throw Reload Fix
|
||||
function ShapeBase::throwWeapon(%this)
|
||||
{
|
||||
if((%this.getMountedImage($WeaponSlot).getName() $= "MortarImage" || %this.getMountedImage($WeaponSlot).getName() $= "MissileLauncherImage" || %this.getMountedImage($WeaponSlot).getName() $= "ShockLanceImage") &&
|
||||
(%this.getImageState($WeaponSlot) $= "Reload" || %this.getImageState($WeaponSlot) $= "Fire")){
|
||||
return;
|
||||
}
|
||||
// function ShapeBase::throwWeapon(%this)
|
||||
// {
|
||||
// if((%this.getMountedImage($WeaponSlot).getName() $= "MortarImage" || %this.getMountedImage($WeaponSlot).getName() $= "MissileLauncherImage" || %this.getMountedImage($WeaponSlot).getName() $= "ShockLanceImage") &&
|
||||
// (%this.getImageState($WeaponSlot) $= "Reload" || %this.getImageState($WeaponSlot) $= "Fire")){
|
||||
// return;
|
||||
// }
|
||||
|
||||
parent::throwWeapon(%this);
|
||||
}
|
||||
// parent::throwWeapon(%this);
|
||||
// }
|
||||
|
||||
|
||||
// Added object check
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
//banList();in console
|
||||
//unbanIndex(%index) %index is the number next to the players name from listBans();
|
||||
//Example: unbanold(555555,"22.222.222.222"); put ip in quotes
|
||||
|
||||
$dtBanList::save =1;
|
||||
package dtBan
|
||||
{
|
||||
|
||||
|
|
@ -103,7 +103,7 @@ function banList_checkIP(%client){
|
|||
%ip = strReplace(%ip, ".", "_");
|
||||
|
||||
%time = $dtBanList::IP[%ip];
|
||||
if(%time $= "BAN")
|
||||
if(getField(%time,4) $= "BAN")
|
||||
return 1;
|
||||
if (getFieldCount(%time) > 0){
|
||||
%delta = getBanCount(getField(%time,0), getField(%time,1),getField(%time,2),getField(%time,3));
|
||||
|
|
@ -127,7 +127,7 @@ function banList_checkIP(%client){
|
|||
|
||||
function banList_checkGUID(%guid){
|
||||
%time = $dtBanList::GUID[%guid];
|
||||
if(%time $= "BAN")
|
||||
if(getField(%time,4) $= "BAN")
|
||||
return 1;
|
||||
if (getFieldCount(%time) > 0){
|
||||
%delta = getBanCount(getField(%time,0), getField(%time,1),getField(%time,2),getField(%time,3));
|
||||
|
|
@ -320,7 +320,7 @@ function banListClean(){
|
|||
%ip = getField($dtBanList::NameList[%i], 2);
|
||||
%time = $dtBanList::GUID[%guid];
|
||||
%delta = getBanCount(getField(%time,0), getField(%time,1),getField(%time,2),getField(%time,3));
|
||||
if (%delta > getField(%time,4)){
|
||||
if (getField(%time,4) !$= "BAN" && %delta > getField(%time,4)){
|
||||
$dtBanList::NameList[%i] = "";
|
||||
$dtBanList::GUID[%guid] = "";
|
||||
$dtBanList::IP[%ip] = "";
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ $flagSimTime = 60;//note a higher the time, the larger the sweep scans will be
|
|||
$flagCheckRadius = 50;
|
||||
$playerBoxA = "-0.6 -0.6 0";
|
||||
$playerBoxB = "0.6 0.6 2.3";
|
||||
|
||||
$flagStuckTime = 1000;
|
||||
package flagFix{
|
||||
function CTFGame::startFlagCollisionSearch(%game, %flag){
|
||||
parent::startFlagCollisionSearch(%game, %flag);
|
||||
|
|
@ -35,6 +35,7 @@ package flagFix{
|
|||
if(!isEventPending(Game.flagLoop)){
|
||||
%game.atHomeFlagLoop();
|
||||
}
|
||||
%game.fcs = getSimTime();
|
||||
}
|
||||
|
||||
function SCtFGame::startMatch(%game){
|
||||
|
|
@ -56,6 +57,19 @@ package flagFix{
|
|||
activatePackage(flagFix);
|
||||
|
||||
function DefaultGame::flagColTest(%game, %flag){
|
||||
if( !%flag.isHome ){// keeps flags from getting stuck in ceilings
|
||||
%flag.stuckChkTimer += $flagSimTime;
|
||||
if(%flag.stuckChkTimer > $flagStuckTime){
|
||||
%fpos = %flag.getPosition();
|
||||
%upRay = containerRayCast(%fpos, vectorAdd(%fpos,"0 0 2.4"), $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType | $TypeMasks::ForceFieldObjectType, %flag);
|
||||
if(%upRay){
|
||||
%dist = vectorDist(%fpos,getWords(%upRay,1,3));
|
||||
//error(%dist);
|
||||
%flag.setPosition(vectorSub(%fpos,"0 0" SPC (2.5 - %dist)));
|
||||
}
|
||||
%flag.stuckChkTimer = 0;
|
||||
}
|
||||
}
|
||||
%Box2 = %flag.getWorldBox();
|
||||
InitContainerRadiusSearch( %flag.getWorldBoxCenter(), $flagCheckRadius, $TypeMasks::PlayerObjectType);
|
||||
while((%player = containerSearchNext()) != 0){
|
||||
|
|
|
|||
|
|
@ -2340,7 +2340,7 @@ function dtGameLink(%game, %client, %arg1, %arg2, %arg3, %arg4, %arg5){
|
|||
serverCmdObserveClient(%client, %targetClient);
|
||||
displayObserverHud(%client, %targetClient);
|
||||
|
||||
if (%targetClient != %prevObsClient)
|
||||
if (!%client.isAdmin && !%client.isWatchOnly && %targetClient != %prevObsClient)
|
||||
{
|
||||
messageClient(%targetClient, 'Observer', '\c1%1 is now observing you.', %client.name);
|
||||
messageClient(%prevObsClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);
|
||||
|
|
@ -3596,9 +3596,9 @@ function dtStatsMissionDropReady(%game, %client){ // called when client has fini
|
|||
|
||||
%dtStats.skin = getTaggedString(%client.skin);
|
||||
%dtStats.race = %client.race;
|
||||
%dtStats.sex = %client.sex;
|
||||
%dtStats.voice = %client.voice;
|
||||
|
||||
%dtStats.sex = %client.sex;
|
||||
%dtStats.voice = %client.voice;
|
||||
|
||||
%dtStats.joinPCT = (isGameRun() == 1) ? %game.getGamePct() : 0;
|
||||
updateTeamTime(%dtStats, -1);
|
||||
%dtStats.team = %client.team;// should be 0
|
||||
|
|
@ -4403,7 +4403,7 @@ function incGameStats(%dtStats,%game) {// record that games stats and inc by one
|
|||
case "Min":
|
||||
%val = getDynamicField(%dtStats,%varName);
|
||||
setValueField(%dtStats,%varNameType,"g",%game,%c,%val);
|
||||
|
||||
|
||||
for(%x = 1; %x <= 9; %x+=2){
|
||||
%t = getField(%dtStats.gameStats[%varNameType,"t",%game],%x);
|
||||
if(%val < %t && %val != 0 || !%t){ setValueField(%dtStats,%varNameType,"t",%game,%x,%val);}
|
||||
|
|
@ -9522,7 +9522,7 @@ function testVarsRandomAll(%max){
|
|||
//
|
||||
// 9.5
|
||||
// Removed Map Stats
|
||||
// Removed all stat menus other then leaderboard stuff and server panel
|
||||
// Removed all stat menus other then leaderboard stuff and server panel
|
||||
// Made Live Stats Admin only its useful for testing stats
|
||||
// Changed stats compile speed to 64ms with map stats gone
|
||||
// Extra stats for player model
|
||||
|
|
@ -80,7 +80,7 @@ function Observer::onTrigger(%data,%obj,%trigger,%state)
|
|||
serverCmdObserveClient(%client, -1);
|
||||
|
||||
displayObserverHud(%client, %client.observeClient);
|
||||
if(!%client.isAdmin) // z0dd - ZOD, 7/15/03. Only warn them if it isn't an admin watching.
|
||||
if(!%client.isAdmin && !%client.isWatchOnly) // z0dd - ZOD, 7/15/03. Only warn them if it isn't an admin watching.
|
||||
messageClient(%client.observeClient, 'Observer', '\c1%1 is now observing you.', %client.name);
|
||||
}
|
||||
|
||||
|
|
@ -172,7 +172,7 @@ function Observer::onTrigger(%data,%obj,%trigger,%state)
|
|||
|
||||
observerFollowUpdate( %client, %client.observeClient, false );
|
||||
displayObserverHud(%client, %client.observeClient);
|
||||
if(!%client.isAdmin) // z0dd - ZOD, 7/15/03. Only warn them if it isn't an admin watching.
|
||||
if(!%client.isAdmin && !%client.isWatchOnly) // z0dd - ZOD, 7/15/03. Only warn them if it isn't an admin watching.
|
||||
messageClient(%client.observeClient, 'Observer', '\c1%1 is now observing you.', %client.name);
|
||||
}
|
||||
|
||||
|
|
@ -224,7 +224,7 @@ function Observer::onTrigger(%data,%obj,%trigger,%state)
|
|||
observerFollowUpdate( %client, %client.observeClient, false );
|
||||
|
||||
displayObserverHud(%client, %client.observeClient);
|
||||
if(!%client.isAdmin) // z0dd - ZOD, 7/15/03. Only warn them if it isn't an admin watching.
|
||||
if(!%client.isAdmin && !%client.isWatchOnly) // z0dd - ZOD, 7/15/03. Only warn them if it isn't an admin watching.
|
||||
messageClient(%client.observeClient, 'Observer', '\c1%1 is now observing you.', %client.name);
|
||||
}
|
||||
|
||||
|
|
@ -265,7 +265,7 @@ function Observer::onTrigger(%data,%obj,%trigger,%state)
|
|||
|
||||
//send the message(s)
|
||||
displayObserverHud(%client, %nextClient);
|
||||
if(!%client.isAdmin) // z0dd - ZOD, 7/15/03. Only warn them if it isn't an admin watching.
|
||||
if(!%client.isAdmin && !%client.isWatchOnly) // z0dd - ZOD, 7/15/03. Only warn them if it isn't an admin watching.
|
||||
{
|
||||
messageClient(%nextClient, 'Observer', '\c1%1 is now observing you.', %client.name);
|
||||
messageClient(%prevObsClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);
|
||||
|
|
@ -305,7 +305,7 @@ function Observer::onTrigger(%data,%obj,%trigger,%state)
|
|||
}
|
||||
//send the message(s)
|
||||
displayObserverHud(%client, %prevClient);
|
||||
if(!%client.isAdmin) // z0dd - ZOD, 7/15/03. Only warn them if it isn't an admin watching.
|
||||
if(!%client.isAdmin && !%client.isWatchOnly) // z0dd - ZOD, 7/15/03. Only warn them if it isn't an admin watching.
|
||||
{
|
||||
messageClient(%prevClient, 'Observer', '\c1%1 is now observing you.', %client.name);
|
||||
messageClient(%prevObsClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);
|
||||
|
|
@ -402,25 +402,27 @@ function Observer::setMode(%data, %obj, %mode, %targetObj)
|
|||
%obj.setTransform(%transform);
|
||||
|
||||
case "observerFollow":
|
||||
// Observer attached to a moving object (assume player for now...)
|
||||
%transform = %targetObj.getTransform();
|
||||
if(isObject(%targetObj)){
|
||||
// Observer attached to a moving object (assume player for now...)
|
||||
%transform = %targetObj.getTransform();
|
||||
|
||||
if( !%targetObj.isMounted() )
|
||||
{
|
||||
//z0dd - ZOD, 7/15/03. Use datablock of armor for observer params
|
||||
%params = %targetObj.getDataBlock().observeParameters;
|
||||
%obj.setOrbitMode(%targetObj, %transform, getWord( %params, 0 ), getWord( %params, 1 ), getWord( %params, 2 ));
|
||||
//%obj.setOrbitMode(%targetObj, %transform, 0.5, 4.5, 4.5);
|
||||
}
|
||||
else
|
||||
{
|
||||
%mount = %targetObj.getObjectMount();
|
||||
if( %mount.getDataBlock().observeParameters $= "" )
|
||||
%params = %transform;
|
||||
else
|
||||
%params = %mount.getDataBlock().observeParameters;
|
||||
if( !%targetObj.isMounted() )
|
||||
{
|
||||
//z0dd - ZOD, 7/15/03. Use datablock of armor for observer params
|
||||
%params = %targetObj.getDataBlock().observeParameters;
|
||||
%obj.setOrbitMode(%targetObj, %transform, getWord( %params, 0 ), getWord( %params, 1 ), getWord( %params, 2 ));
|
||||
//%obj.setOrbitMode(%targetObj, %transform, 0.5, 4.5, 4.5);
|
||||
}
|
||||
else
|
||||
{
|
||||
%mount = %targetObj.getObjectMount();
|
||||
if( %mount.getDataBlock().observeParameters $= "" )
|
||||
%params = %transform;
|
||||
else
|
||||
%params = %mount.getDataBlock().observeParameters;
|
||||
|
||||
%obj.setOrbitMode(%mount, %mount.getTransform(), getWord( %params, 0 ), getWord( %params, 1 ), getWord( %params, 2 ));
|
||||
%obj.setOrbitMode(%mount, %mount.getTransform(), getWord( %params, 0 ), getWord( %params, 1 ), getWord( %params, 2 ));
|
||||
}
|
||||
}
|
||||
|
||||
case "observerTimeout":
|
||||
|
|
|
|||
20
Classic/scripts/defaultGame.cs
Executable file → Normal file
20
Classic/scripts/defaultGame.cs
Executable file → Normal file
|
|
@ -1162,7 +1162,7 @@ function DefaultGame::forceObserver( %game, %client, %reason )
|
|||
%scheduleAutoKick = true;
|
||||
}
|
||||
|
||||
if(%scheduleAutoKick && !%client.isAdmin && !$Host::TournamentMode && $Host::KickObserverTimeout)
|
||||
if(%scheduleAutoKick && !%client.isAdmin && !%client.isWatchOnly && !$Host::TournamentMode && $Host::KickObserverTimeout)
|
||||
{
|
||||
if(isEventPending(%client.okschedule))
|
||||
cancel(%client.okschedule);
|
||||
|
|
@ -1204,11 +1204,21 @@ function DefaultGame::forceObserver( %game, %client, %reason )
|
|||
|
||||
}
|
||||
|
||||
|
||||
function serverCmdWatchOnly(%client, %pass){
|
||||
if($Host::ObserverOnlyPass $= ""){
|
||||
$Host::ObserverOnlyPass = "ImaWatcher";// set a default one if not defined
|
||||
}
|
||||
if(%pass $= $Host::ObserverOnlyPass){
|
||||
%client.isWatchOnly = 1;
|
||||
}
|
||||
}
|
||||
|
||||
// cmdAutoKickObserver(%client)
|
||||
// Info: Will kick the player if he/she is still in observer.
|
||||
function cmdAutoKickObserver(%client, %key) // Edit GG
|
||||
{
|
||||
if (($Host::TournamentMode) || (!$MissionRunning) || (%client.isAdmin) || (%client.team != 0) || (!%client.okkey) || (%client.okkey != %key))
|
||||
if (($Host::TournamentMode) || (!$MissionRunning) || (%client.isWatchOnly) || (%client.isAdmin) || (%client.team != 0) || (!%client.okkey) || (%client.okkey != %key))
|
||||
return;
|
||||
|
||||
if(isEventPending(%client.okschedule))
|
||||
|
|
@ -1826,9 +1836,9 @@ function DefaultGame::clientMissionDropReady(%game, %client)
|
|||
for(%i = 1; %i <= 13; %i++)
|
||||
$stats::weapon_damage[%client, %i] = "";
|
||||
|
||||
if(%client.team $=0 && $Host::KickObserverStartOnJoin) //Observer only
|
||||
if(%client.team $= 0 && $Host::KickObserverStartOnJoin) //Observer only
|
||||
{
|
||||
if(!%client.isAdmin && !$Host::TournamentMode && $Host::KickObserverTimeout)
|
||||
if(!%client.isAdmin && !%client.isWatchOnly && !$Host::TournamentMode && $Host::KickObserverTimeout)
|
||||
{
|
||||
if(isEventPending(%client.okschedule))
|
||||
cancel(%client.okschedule);
|
||||
|
|
@ -3423,7 +3433,7 @@ function DefaultGame::processGameLink(%game, %client, %arg1, %arg2, %arg3, %arg4
|
|||
serverCmdObserveClient(%client, %targetClient);
|
||||
displayObserverHud(%client, %targetClient);
|
||||
|
||||
if (%targetClient != %prevObsClient)
|
||||
if (%targetClient != %prevObsClient && !%client.isWatchOnly)
|
||||
{
|
||||
messageClient(%targetClient, 'Observer', '\c1%1 is now observing you.', %client.name);
|
||||
messageClient(%prevObsClient, 'ObserverEnd', '\c1%1 is no longer observing you.', %client.name);
|
||||
|
|
|
|||
1174
Classic/scripts/inventoryHud.cs
Normal file
1174
Classic/scripts/inventoryHud.cs
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -62,20 +62,21 @@ function ShapeBaseImageData::onFire(%data, %obj, %slot)
|
|||
{
|
||||
// ---------------------------------------------------------------------------
|
||||
// z0dd - ZOD, 9/3/02. Anti rapid fire mortar/missile fix.
|
||||
if (%obj.cantFire !$= "")
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
// 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);
|
||||
}
|
||||
// %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();
|
||||
|
||||
|
|
@ -411,7 +412,6 @@ function ShockLanceImage::onFire(%this, %obj, %slot)
|
|||
|
||||
%obj.cantfire = 1;
|
||||
%preventTime = %this.stateTimeoutValue[4];
|
||||
//%preventTime = (%data.stateTimeoutValue[4] + %data.stateTimeoutValue[3]) - 0.032;
|
||||
%obj.reloadSchedule = schedule(%preventTime * 1000, %obj, resetFire, %obj);
|
||||
|
||||
if( %obj.getEnergyLevel() < %this.minEnergy ) // z0dd - ZOD, 5/22/03. Check energy level first
|
||||
|
|
|
|||
|
|
@ -890,7 +890,7 @@ function GameConnection::onConnect( %client, %name, %raceGender, %skin, %voice,
|
|||
//messageClient( %client, 'MsgClassic', 'Classic \c2V-Ramming Mod: \c3%1.', ($Host::ClassicLoadVRamChanges ? 'Enabled' : 'Disabled') );
|
||||
|
||||
// z0dd - ZOD, 9/29/02. Removed T2 demo code from here
|
||||
messageClient(%client, 'MsgClientJoin', 'Welcome to Tribes2 %1.',
|
||||
messageClient(%client, 'MsgClientJoin', '\c2Welcome to Tribes2 %1.',
|
||||
%client.name,
|
||||
%client,
|
||||
%client.target,
|
||||
|
|
|
|||
|
|
@ -319,3 +319,7 @@ function TSStatic::onTrigger(%this, %triggerId, %on){
|
|||
function TSStatic::onTriggerTick(%this, %triggerId){
|
||||
//anti console spam
|
||||
}
|
||||
|
||||
function SimObject::setPosition(%obj, %pos){
|
||||
%obj.setTransform(%pos SPC getWords(%obj.getTransform(), 3, 6));
|
||||
}
|
||||
856
Classic/scripts/weapons/missileLauncher.cs
Normal file
856
Classic/scripts/weapons/missileLauncher.cs
Normal file
|
|
@ -0,0 +1,856 @@
|
|||
//--------------------------------------
|
||||
// Missile launcher
|
||||
//--------------------------------------
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Sounds
|
||||
//--------------------------------------
|
||||
datablock AudioProfile(MissileSwitchSound)
|
||||
{
|
||||
filename = "fx/weapons/missile_launcher_activate.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MissileFireSound)
|
||||
{
|
||||
filename = "fx/weapons/missile_fire.WAV";
|
||||
description = AudioDefault3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MissileProjectileSound)
|
||||
{
|
||||
filename = "fx/weapons/missile_projectile.wav";
|
||||
description = ProjectileLooping3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MissileReloadSound)
|
||||
{
|
||||
filename = "fx/weapons/weapon.missilereload.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MissileLockSound)
|
||||
{
|
||||
filename = "fx/weapons/missile_launcher_searching.WAV";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MissileExplosionSound)
|
||||
{
|
||||
filename = "fx/explosions/explosion.xpl23.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MissileDryFireSound)
|
||||
{
|
||||
filename = "fx/weapons/missile_launcher_dryfire.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Splash Debris
|
||||
//----------------------------------------------------------------------------
|
||||
datablock ParticleData( MDebrisSmokeParticle )
|
||||
{
|
||||
dragCoeffiecient = 1.0;
|
||||
gravityCoefficient = 0.10;
|
||||
inheritedVelFactor = 0.1;
|
||||
|
||||
lifetimeMS = 1000;
|
||||
lifetimeVarianceMS = 100;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
// useInvAlpha = true;
|
||||
|
||||
spinRandomMin = -60.0;
|
||||
spinRandomMax = 60.0;
|
||||
|
||||
colors[0] = "0.7 0.8 1.0 1.0";
|
||||
colors[1] = "0.7 0.8 1.0 0.5";
|
||||
colors[2] = "0.7 0.8 1.0 0.0";
|
||||
sizes[0] = 0.0;
|
||||
sizes[1] = 0.8;
|
||||
sizes[2] = 0.8;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData( MDebrisSmokeEmitter )
|
||||
{
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 1;
|
||||
|
||||
ejectionVelocity = 1.0; // A little oomph at the back end
|
||||
velocityVariance = 0.2;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 40.0;
|
||||
|
||||
particles = "MDebrisSmokeParticle";
|
||||
};
|
||||
|
||||
|
||||
datablock DebrisData( MissileSplashDebris )
|
||||
{
|
||||
emitters[0] = MDebrisSmokeEmitter;
|
||||
|
||||
explodeOnMaxBounce = true;
|
||||
|
||||
elasticity = 0.4;
|
||||
friction = 0.2;
|
||||
|
||||
lifetime = 0.3;
|
||||
lifetimeVariance = 0.1;
|
||||
|
||||
numBounces = 1;
|
||||
};
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Missile smoke spike (for debris)
|
||||
//----------------------------------------------------------------------------
|
||||
datablock ParticleData( MissileSmokeSpike )
|
||||
{
|
||||
dragCoeffiecient = 1.0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.2;
|
||||
|
||||
lifetimeMS = 1000;
|
||||
lifetimeVarianceMS = 100;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = true;
|
||||
|
||||
spinRandomMin = -60.0;
|
||||
spinRandomMax = 60.0;
|
||||
|
||||
colors[0] = "0.6 0.6 0.6 1.0";
|
||||
colors[1] = "0.4 0.4 0.4 0.5";
|
||||
colors[2] = "0.4 0.4 0.4 0.0";
|
||||
sizes[0] = 0.0;
|
||||
sizes[1] = 1.0;
|
||||
sizes[2] = 0.5;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData( MissileSmokeSpikeEmitter )
|
||||
{
|
||||
ejectionPeriodMS = 7;
|
||||
periodVarianceMS = 1;
|
||||
|
||||
ejectionVelocity = 1.0; // A little oomph at the back end
|
||||
velocityVariance = 0.2;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 40.0;
|
||||
|
||||
particles = "MissileSmokeSpike";
|
||||
};
|
||||
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Explosion smoke particles
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
datablock ParticleData(MissileExplosionSmoke)
|
||||
{
|
||||
dragCoeffiecient = 0.3;
|
||||
gravityCoefficient = -0.2;
|
||||
inheritedVelFactor = 0.025;
|
||||
|
||||
lifetimeMS = 1250;
|
||||
lifetimeVarianceMS = 0;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = true;
|
||||
spinRandomMin = -100.0;
|
||||
spinRandomMax = 100.0;
|
||||
|
||||
textureName = "special/Smoke/bigSmoke";
|
||||
|
||||
colors[0] = "1.0 0.7 0.0 1.0";
|
||||
colors[1] = "0.4 0.4 0.4 0.5";
|
||||
colors[2] = "0.4 0.4 0.4 0.0";
|
||||
sizes[0] = 1.0;
|
||||
sizes[1] = 3.0;
|
||||
sizes[2] = 1.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(MissileExplosionSmokeEMitter)
|
||||
{
|
||||
ejectionOffset = 0.0;
|
||||
ejectionPeriodMS = 5;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 3.25;
|
||||
velocityVariance = 0.25;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 180.0;
|
||||
|
||||
lifetimeMS = 250;
|
||||
|
||||
particles = "MissileExplosionSmoke";
|
||||
};
|
||||
|
||||
|
||||
|
||||
datablock DebrisData( MissileSpikeDebris )
|
||||
{
|
||||
emitters[0] = MissileSmokeSpikeEmitter;
|
||||
explodeOnMaxBounce = true;
|
||||
elasticity = 0.4;
|
||||
friction = 0.2;
|
||||
lifetime = 0.3;
|
||||
lifetimeVariance = 0.02;
|
||||
};
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Explosions
|
||||
//---------------------------------------------------------------------------
|
||||
datablock ExplosionData(MissileExplosion)
|
||||
{
|
||||
explosionShape = "effect_plasma_explosion.dts";
|
||||
playSpeed = 1.5;
|
||||
soundProfile = MissileExplosionSound;
|
||||
faceViewer = true;
|
||||
|
||||
sizes[0] = "0.5 0.5 0.5";
|
||||
sizes[1] = "0.5 0.5 0.5";
|
||||
sizes[2] = "0.5 0.5 0.5";
|
||||
|
||||
emitter[0] = MissileExplosionSmokeEmitter;
|
||||
|
||||
debris = MissileSpikeDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 170;
|
||||
debrisNum = 8;
|
||||
debrisNumVariance = 6;
|
||||
debrisVelocity = 15.0;
|
||||
debrisVelocityVariance = 2.0;
|
||||
|
||||
shakeCamera = true;
|
||||
camShakeFreq = "6.0 7.0 7.0";
|
||||
camShakeAmp = "70.0 70.0 70.0";
|
||||
camShakeDuration = 1.0;
|
||||
camShakeRadius = 7.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(MissileSplashExplosion)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
|
||||
faceViewer = true;
|
||||
explosionScale = "1.0 1.0 1.0";
|
||||
|
||||
debris = MissileSplashDebris;
|
||||
debrisThetaMin = 10;
|
||||
debrisThetaMax = 80;
|
||||
debrisNum = 10;
|
||||
debrisVelocity = 10.0;
|
||||
debrisVelocityVariance = 4.0;
|
||||
|
||||
sizes[0] = "0.35 0.35 0.35";
|
||||
sizes[1] = "0.15 0.15 0.15";
|
||||
sizes[2] = "0.15 0.15 0.15";
|
||||
sizes[3] = "0.15 0.15 0.15";
|
||||
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.333;
|
||||
times[2] = 0.666;
|
||||
times[3] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Splash
|
||||
//--------------------------------------------------------------------------
|
||||
datablock ParticleData(MissileMist)
|
||||
{
|
||||
dragCoefficient = 2.0;
|
||||
gravityCoefficient = -0.05;
|
||||
inheritedVelFactor = 0.0;
|
||||
constantAcceleration = 0.0;
|
||||
lifetimeMS = 400;
|
||||
lifetimeVarianceMS = 100;
|
||||
useInvAlpha = false;
|
||||
spinRandomMin = -90.0;
|
||||
spinRandomMax = 500.0;
|
||||
textureName = "particleTest";
|
||||
colors[0] = "0.7 0.8 1.0 1.0";
|
||||
colors[1] = "0.7 0.8 1.0 0.5";
|
||||
colors[2] = "0.7 0.8 1.0 0.0";
|
||||
sizes[0] = 0.5;
|
||||
sizes[1] = 0.5;
|
||||
sizes[2] = 0.8;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(MissileMistEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 5;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 6.0;
|
||||
velocityVariance = 4.0;
|
||||
ejectionOffset = 0.0;
|
||||
thetaMin = 85;
|
||||
thetaMax = 85;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
lifetimeMS = 250;
|
||||
particles = "MissileMist";
|
||||
};
|
||||
|
||||
datablock ParticleData( MissileSplashParticle )
|
||||
{
|
||||
dragCoefficient = 1;
|
||||
gravityCoefficient = 0.2;
|
||||
inheritedVelFactor = 0.2;
|
||||
constantAcceleration = -0.0;
|
||||
lifetimeMS = 600;
|
||||
lifetimeVarianceMS = 0;
|
||||
textureName = "special/droplet";
|
||||
colors[0] = "0.7 0.8 1.0 1.0";
|
||||
colors[1] = "0.7 0.8 1.0 0.5";
|
||||
colors[2] = "0.7 0.8 1.0 0.0";
|
||||
sizes[0] = 0.5;
|
||||
sizes[1] = 0.5;
|
||||
sizes[2] = 0.5;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData( MissileSplashEmitter )
|
||||
{
|
||||
ejectionPeriodMS = 1;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 6;
|
||||
velocityVariance = 3.0;
|
||||
ejectionOffset = 0.0;
|
||||
thetaMin = 60;
|
||||
thetaMax = 80;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
orientParticles = true;
|
||||
lifetimeMS = 100;
|
||||
particles = "MissileSplashParticle";
|
||||
};
|
||||
|
||||
|
||||
datablock SplashData(MissileSplash)
|
||||
{
|
||||
numSegments = 15;
|
||||
ejectionFreq = 0.0001;
|
||||
ejectionAngle = 45;
|
||||
ringLifetime = 0.5;
|
||||
lifetimeMS = 400;
|
||||
velocity = 5.0;
|
||||
startRadius = 0.0;
|
||||
acceleration = -3.0;
|
||||
texWrap = 5.0;
|
||||
|
||||
explosion = MissileSplashExplosion;
|
||||
|
||||
texture = "special/water2";
|
||||
|
||||
emitter[0] = MissileSplashEmitter;
|
||||
emitter[1] = MissileMistEmitter;
|
||||
|
||||
colors[0] = "0.7 0.8 1.0 0.0";
|
||||
colors[1] = "0.7 0.8 1.0 1.0";
|
||||
colors[2] = "0.7 0.8 1.0 0.0";
|
||||
colors[3] = "0.7 0.8 1.0 0.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.4;
|
||||
times[2] = 0.8;
|
||||
times[3] = 1.0;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Particle effects
|
||||
//--------------------------------------
|
||||
datablock ParticleData(MissileSmokeParticle)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = -0.02;
|
||||
inheritedVelFactor = 0.1;
|
||||
|
||||
lifetimeMS = 1200;
|
||||
lifetimeVarianceMS = 100;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = true;
|
||||
spinRandomMin = -90.0;
|
||||
spinRandomMax = 90.0;
|
||||
|
||||
colors[0] = "1.0 0.75 0.0 0.0";
|
||||
colors[1] = "0.5 0.5 0.5 1.0";
|
||||
colors[2] = "0.3 0.3 0.3 0.0";
|
||||
sizes[0] = 1;
|
||||
sizes[1] = 2;
|
||||
sizes[2] = 3;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.1;
|
||||
times[2] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(MissileSmokeEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 1.5;
|
||||
velocityVariance = 0.3;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 50.0;
|
||||
|
||||
particles = "MissileSmokeParticle";
|
||||
};
|
||||
|
||||
datablock ParticleData(MissileFireParticle)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 1.0;
|
||||
|
||||
lifetimeMS = 300;
|
||||
lifetimeVarianceMS = 000;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
spinRandomMin = -135;
|
||||
spinRandomMax = 135;
|
||||
|
||||
colors[0] = "1.0 0.75 0.2 1.0";
|
||||
colors[1] = "1.0 0.5 0.0 1.0";
|
||||
colors[2] = "1.0 0.40 0.0 0.0";
|
||||
sizes[0] = 0;
|
||||
sizes[1] = 1;
|
||||
sizes[2] = 1.5;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.3;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(MissileFireEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 15;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 15.0;
|
||||
velocityVariance = 0.0;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 0.0;
|
||||
|
||||
particles = "MissileFireParticle";
|
||||
};
|
||||
|
||||
datablock ParticleData(MissilePuffParticle)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.0;
|
||||
|
||||
lifetimeMS = 500;
|
||||
lifetimeVarianceMS = 300;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
spinRandomMin = -135;
|
||||
spinRandomMax = 135;
|
||||
|
||||
colors[0] = "1.0 1.0 1.0 0.5";
|
||||
colors[1] = "0.7 0.7 0.7 0.0";
|
||||
sizes[0] = 0.25;
|
||||
sizes[1] = 1.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(MissilePuffEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 50;
|
||||
periodVarianceMS = 3;
|
||||
|
||||
ejectionVelocity = 0.5;
|
||||
velocityVariance = 0.0;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 90.0;
|
||||
|
||||
particles = "MissilePuffParticle";
|
||||
};
|
||||
|
||||
datablock ParticleData(MissileLauncherExhaustParticle)
|
||||
{
|
||||
dragCoeffiecient = 0.0;
|
||||
gravityCoefficient = 0.01;
|
||||
inheritedVelFactor = 1.0;
|
||||
|
||||
lifetimeMS = 500;
|
||||
lifetimeVarianceMS = 300;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = true;
|
||||
spinRandomMin = -135;
|
||||
spinRandomMax = 135;
|
||||
|
||||
colors[0] = "1.0 1.0 1.0 0.5";
|
||||
colors[1] = "0.7 0.7 0.7 0.0";
|
||||
sizes[0] = 0.25;
|
||||
sizes[1] = 1.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(MissileLauncherExhaustEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 15;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionVelocity = 3.0;
|
||||
velocityVariance = 0.0;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 20.0;
|
||||
|
||||
particles = "MissileLauncherExhaustParticle";
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Debris
|
||||
//--------------------------------------
|
||||
datablock DebrisData( FlechetteDebris )
|
||||
{
|
||||
shapeName = "weapon_missile_fleschette.dts";
|
||||
|
||||
lifetime = 5.0;
|
||||
|
||||
minSpinSpeed = -320.0;
|
||||
maxSpinSpeed = 320.0;
|
||||
|
||||
elasticity = 0.2;
|
||||
friction = 0.3;
|
||||
|
||||
numBounces = 3;
|
||||
|
||||
gravModifier = 0.40;
|
||||
|
||||
staticOnMaxBounce = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Projectile
|
||||
//--------------------------------------
|
||||
datablock SeekerProjectileData(ShoulderMissile)
|
||||
{
|
||||
casingShapeName = "weapon_missile_casement.dts";
|
||||
projectileShapeName = "weapon_missile_projectile.dts";
|
||||
hasDamageRadius = true;
|
||||
indirectDamage = 0.8;
|
||||
damageRadius = 8.0;
|
||||
radiusDamageType = $DamageType::Missile;
|
||||
kickBackStrength = 2000;
|
||||
|
||||
explosion = "MissileExplosion";
|
||||
splash = MissileSplash;
|
||||
velInheritFactor = 1.0; // to compensate for slow starting velocity, this value
|
||||
// is cranked up to full so the missile doesn't start
|
||||
// out behind the player when the player is moving
|
||||
// very quickly - bramage
|
||||
|
||||
baseEmitter = MissileSmokeEmitter;
|
||||
delayEmitter = MissileFireEmitter;
|
||||
puffEmitter = MissilePuffEmitter;
|
||||
bubbleEmitter = GrenadeBubbleEmitter;
|
||||
bubbleEmitTime = 1.0;
|
||||
|
||||
exhaustEmitter = MissileLauncherExhaustEmitter;
|
||||
exhaustTimeMs = 300;
|
||||
exhaustNodeName = "muzzlePoint1";
|
||||
|
||||
lifetimeMS = 7000; // z0dd - ZOD, 4/14/02. Was 6000
|
||||
muzzleVelocity = 10.0;
|
||||
maxVelocity = 90.0; // z0dd - ZOD, 4/14/02. Was 80.0
|
||||
turningSpeed = 110.0;
|
||||
acceleration = 200.0;
|
||||
|
||||
proximityRadius = 3;
|
||||
|
||||
terrainAvoidanceSpeed = 180;
|
||||
terrainScanAhead = 25;
|
||||
terrainHeightFail = 12;
|
||||
terrainAvoidanceRadius = 100;
|
||||
|
||||
flareDistance = 200;
|
||||
flareAngle = 30;
|
||||
|
||||
sound = MissileProjectileSound;
|
||||
|
||||
hasLight = true;
|
||||
lightRadius = 5.0;
|
||||
lightColor = "0.2 0.05 0";
|
||||
|
||||
useFlechette = true;
|
||||
flechetteDelayMs = 550;
|
||||
casingDeb = FlechetteDebris;
|
||||
|
||||
explodeOnWaterImpact = false;
|
||||
};
|
||||
|
||||
datablock LinearProjectileData(Rocket)
|
||||
{
|
||||
projectileShapeName = "weapon_missile_projectile.dts";
|
||||
emitterDelay = -1;
|
||||
baseEmitter = MissileSmokeEmitter;
|
||||
delayEmitter = MissileFireEmitter;
|
||||
bubbleEmitter = GrenadeBubbleEmitter;
|
||||
bubbleEmitTime = 1.0;
|
||||
directDamage = 0.0;
|
||||
hasDamageRadius = true;
|
||||
indirectDamage = 0.5;
|
||||
damageRadius = 7.5;
|
||||
radiusDamageType = $DamageType::Missile;
|
||||
kickBackStrength = 2000;
|
||||
sound = MissileProjectileSound;
|
||||
explosion = "MissileExplosion";
|
||||
underwaterExplosion = "UnderwaterDiscExplosion";
|
||||
splash = MissileSplash;
|
||||
dryVelocity = 90;
|
||||
wetVelocity = 50;
|
||||
velInheritFactor = 0.75;
|
||||
fizzleTimeMS = 5000;
|
||||
lifetimeMS = 5000;
|
||||
explodeOnDeath = true;
|
||||
reflectOnWaterImpactAngle = 15.0;
|
||||
explodeOnWaterImpact = false;
|
||||
deflectionOnWaterImpact = 20.0;
|
||||
fizzleUnderwaterMS = 5000;
|
||||
// activateDelayMS = 200;
|
||||
hasLight = true;
|
||||
lightRadius = 6.0;
|
||||
lightColor = "0.175 0.175 0.5";
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Ammo
|
||||
//--------------------------------------
|
||||
|
||||
datablock ItemData(MissileLauncherAmmo)
|
||||
{
|
||||
className = Ammo;
|
||||
catagory = "Ammo";
|
||||
shapeFile = "ammo_missile.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
pickUpName = "some missiles";
|
||||
|
||||
computeCRC = true;
|
||||
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Weapon
|
||||
//--------------------------------------
|
||||
datablock ItemData(MissileLauncher)
|
||||
{
|
||||
className = Weapon;
|
||||
catagory = "Spawn Items";
|
||||
shapeFile = "weapon_missile.dts";
|
||||
image = MissileLauncherImage;
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
pickUpName = "a missile launcher";
|
||||
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(MissileLauncherImage)
|
||||
{
|
||||
className = WeaponImage;
|
||||
shapeFile = "weapon_missile.dts";
|
||||
item = MissileLauncher;
|
||||
ammo = MissileLauncherAmmo;
|
||||
offset = "0 0 0";
|
||||
armThread = lookms;
|
||||
emap = true;
|
||||
|
||||
projectile = ShoulderMissile;
|
||||
projectileType = SeekerProjectile;
|
||||
|
||||
isSeeker = true;
|
||||
seekRadius = 400;
|
||||
maxSeekAngle = 8;
|
||||
seekTime = 0.5;
|
||||
minSeekHeat = $Host::ClassicLoadMissileChanges ? 1.0 : 0.6; // the heat that must be present on a target to lock it. // z0dd - ZOD, 8/22/02. Was 0.7
|
||||
|
||||
// only target objects outside this range
|
||||
minTargetingDistance = 40;
|
||||
|
||||
stateName[0] = "Activate";
|
||||
stateTransitionOnTimeout[0] = "ActivateReady";
|
||||
stateTimeoutValue[0] = 0.5;
|
||||
stateSequence[0] = "Activate";
|
||||
stateSound[0] = MissileSwitchSound;
|
||||
|
||||
stateName[1] = "ActivateReady";
|
||||
stateTransitionOnAmmo[1] = "Ready";
|
||||
stateTransitionOnNoAmmo[1] = "FirstLoad";
|
||||
|
||||
stateName[2] = "Ready";
|
||||
stateTransitionOnNoAmmo[2] = "NoAmmo";
|
||||
stateTransitionOnTriggerDown[2] = "CheckWet";
|
||||
|
||||
stateName[3] = "Fire";
|
||||
stateTransitionOnTimeout[3] = "Reload";
|
||||
stateTimeoutValue[3] = 0.4;
|
||||
stateFire[3] = true;
|
||||
stateRecoil[3] = LightRecoil;
|
||||
stateAllowImageChange[3] = false;
|
||||
stateSequence[3] = "Fire";
|
||||
stateScript[3] = "onFire";
|
||||
stateSound[3] = MissileFireSound;
|
||||
|
||||
stateName[4] = "Reload";
|
||||
stateTransitionOnNoAmmo[4] = "NoAmmo";
|
||||
stateTransitionOnTimeout[4] = "Ready";
|
||||
stateTimeoutValue[4] = 2.5;
|
||||
stateAllowImageChange[4] = false;
|
||||
stateSequence[4] = "Reload";
|
||||
stateSound[4] = MissileReloadSound;
|
||||
|
||||
stateName[5] = "NoAmmo";
|
||||
stateTransitionOnAmmo[5] = "Reload";
|
||||
stateSequence[5] = "NoAmmo";
|
||||
stateTransitionOnTriggerDown[5] = "DryFire";
|
||||
|
||||
stateName[6] = "DryFire";
|
||||
stateSound[6] = MissileDryFireSound;
|
||||
stateTimeoutValue[6] = 1.0;
|
||||
stateTransitionOnTimeout[6] = "ActivateReady";
|
||||
|
||||
stateName[7] = "CheckTarget";
|
||||
// z0dd - ZOD, 5/07/04. Shoot one off if gameplay changes are in affect.
|
||||
//stateTransitionOnNoTarget[7] = "DryFire";
|
||||
stateTransitionOnNoTarget[7] = $Host::ClassicLoadMissileChanges ? "DumbFire" : "DryFire";
|
||||
stateTransitionOnTarget[7] = "Fire";
|
||||
|
||||
stateName[8] = "CheckWet";
|
||||
stateTransitionOnWet[8] = "WetFire";
|
||||
stateTransitionOnNotWet[8] = "CheckTarget";
|
||||
|
||||
stateName[9] = "WetFire";
|
||||
stateTransitionOnNoAmmo[9] = "NoAmmo";
|
||||
stateTransitionOnTimeout[9] = "Reload";
|
||||
stateSound[9] = MissileFireSound;
|
||||
stateRecoil[3] = LightRecoil;
|
||||
stateTimeoutValue[9] = 0.4;
|
||||
stateSequence[3] = "Fire";
|
||||
stateScript[9] = "onWetFire";
|
||||
stateAllowImageChange[9] = false;
|
||||
|
||||
stateName[10] = "DumbFire";
|
||||
stateTransitionOnTimeout[10] = "Reload";
|
||||
stateTimeoutValue[10] = 0.4;
|
||||
stateFire[10] = true;
|
||||
stateRecoil[10] = LightRecoil;
|
||||
stateAllowImageChange[10] = false;
|
||||
stateSequence[10] = "Fire";
|
||||
stateScript[10] = "onDumbFire";
|
||||
stateSound[10] = MissileFireSound;
|
||||
|
||||
stateName[11] = "FirstLoad";
|
||||
stateTransitionOnAmmo[11] = "Ready";
|
||||
};
|
||||
|
||||
function MissileLauncherImage::onDumbFire(%data,%obj,%slot)
|
||||
{
|
||||
%data.lightStart = getSimTime();
|
||||
%p = new (LinearProjectile)() {
|
||||
dataBlock = Rocket;
|
||||
initialDirection = MatrixMulVector("0 0 0 0 0 1 0", %obj.getMuzzleVector(%slot));
|
||||
initialPosition = %obj.getMuzzlePoint(%slot);
|
||||
sourceObject = %obj;
|
||||
sourceSlot = %slot;
|
||||
};
|
||||
%obj.lastProjectile = %p;
|
||||
MissionCleanup.add(%p);
|
||||
if(%obj.client)
|
||||
%obj.client.projectile = %p;
|
||||
|
||||
%obj.decInventory(%data.ammo, 1);
|
||||
return %p;
|
||||
}
|
||||
function MissileLauncherImage::onUnmount(%this,%obj,%slot){
|
||||
parent::onUnmount(%this,%obj,%slot);
|
||||
if(isEventPending(%obj.reloadDelaySch))
|
||||
cancel(%obj.reloadDelaySch);
|
||||
}
|
||||
function MissileLauncherImage::onMount(%this,%obj,%slot){
|
||||
|
||||
if(%obj.getClassName() !$= "Player")
|
||||
return;
|
||||
|
||||
if (%this.armthread $= "")
|
||||
%obj.setArmThread(look);
|
||||
else
|
||||
%obj.setArmThread(%this.armThread);
|
||||
|
||||
if(%obj.getMountedImage($WeaponSlot).ammo !$= ""){
|
||||
if (%obj.getInventory(%this.ammo)){
|
||||
|
||||
%fireAndReloadTime = mFloor((%this.stateTimeoutValue[4] + %this.stateTimeoutValue[3]) * 1000);
|
||||
|
||||
if(%obj.lfireTime[%this.getName()] && (getSimTime() - %obj.lfireTime[%this.getName()]) < %fireAndReloadTime){
|
||||
if(isEventPending(%obj.reloadDelaySch)){
|
||||
cancel(%obj.reloadDelaySch);
|
||||
}
|
||||
%time = mFloor(%fireAndReloadTime - (getSimTime() - %obj.lfireTime[%this.getName()]));
|
||||
%obj.reloadDelaySch = schedule(%time, 0, "ammoStateDelay", %obj, %slot, true);
|
||||
}
|
||||
else{
|
||||
%obj.setImageAmmo(%slot,true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%obj.client.setWeaponsHudActive(%this.item);
|
||||
if(%obj.getMountedImage($WeaponSlot).ammo !$= "")
|
||||
%obj.client.setAmmoHudCount(%obj.getInventory(%this.ammo));
|
||||
else
|
||||
%obj.client.setAmmoHudCount(-1);
|
||||
}
|
||||
824
Classic/scripts/weapons/mortar.cs
Normal file
824
Classic/scripts/weapons/mortar.cs
Normal file
|
|
@ -0,0 +1,824 @@
|
|||
//--------------------------------------
|
||||
// Mortar
|
||||
//--------------------------------------
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Sounds
|
||||
//--------------------------------------
|
||||
datablock AudioProfile(MortarSwitchSound)
|
||||
{
|
||||
filename = "fx/weapons/mortar_activate.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarReloadSound)
|
||||
{
|
||||
filename = "fx/weapons/mortar_reload.wav";
|
||||
description = AudioClosest3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarIdleSound)
|
||||
{
|
||||
//filename = "fx/weapons/weapon.mortarIdle.wav";
|
||||
filename = "fx/weapons/plasma_rifle_idle.wav";
|
||||
description = ClosestLooping3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarFireSound)
|
||||
{
|
||||
filename = "fx/weapons/mortar_fire.wav";
|
||||
description = AudioDefault3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarProjectileSound)
|
||||
{
|
||||
filename = "fx/weapons/mortar_projectile.wav";
|
||||
description = ProjectileLooping3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarExplosionSound)
|
||||
{
|
||||
filename = "fx/weapons/mortar_explode.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(UnderwaterMortarExplosionSound)
|
||||
{
|
||||
filename = "fx/weapons/mortar_explode_UW.wav";
|
||||
description = AudioBIGExplosion3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
datablock AudioProfile(MortarDryFireSound)
|
||||
{
|
||||
filename = "fx/weapons/mortar_dryfire.wav";
|
||||
description = AudioClose3d;
|
||||
preload = true;
|
||||
};
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Bubbles
|
||||
//----------------------------------------------------------------------------
|
||||
datablock ParticleData(MortarBubbleParticle)
|
||||
{
|
||||
dragCoefficient = 0.0;
|
||||
gravityCoefficient = -0.25;
|
||||
inheritedVelFactor = 0.0;
|
||||
constantAcceleration = 0.0;
|
||||
lifetimeMS = 1500;
|
||||
lifetimeVarianceMS = 600;
|
||||
useInvAlpha = false;
|
||||
textureName = "special/bubbles";
|
||||
|
||||
spinRandomMin = -100.0;
|
||||
spinRandomMax = 100.0;
|
||||
|
||||
colors[0] = "0.7 0.8 1.0 0.4";
|
||||
colors[1] = "0.7 0.8 1.0 0.4";
|
||||
colors[2] = "0.7 0.8 1.0 0.0";
|
||||
sizes[0] = 0.8;
|
||||
sizes[1] = 0.8;
|
||||
sizes[2] = 0.8;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(MortarBubbleEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 9;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 1.0;
|
||||
ejectionOffset = 0.1;
|
||||
velocityVariance = 0.5;
|
||||
thetaMin = 0;
|
||||
thetaMax = 80;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
particles = "MortarBubbleParticle";
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Splash
|
||||
//--------------------------------------------------------------------------
|
||||
datablock ParticleData( MortarSplashParticle )
|
||||
{
|
||||
dragCoefficient = 1;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.2;
|
||||
constantAcceleration = -1.4;
|
||||
lifetimeMS = 300;
|
||||
lifetimeVarianceMS = 0;
|
||||
textureName = "special/droplet";
|
||||
colors[0] = "0.7 0.8 1.0 1.0";
|
||||
colors[1] = "0.7 0.8 1.0 0.5";
|
||||
colors[2] = "0.7 0.8 1.0 0.0";
|
||||
sizes[0] = 0.05;
|
||||
sizes[1] = 0.2;
|
||||
sizes[2] = 0.2;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData( MortarSplashEmitter )
|
||||
{
|
||||
ejectionPeriodMS = 4;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 3;
|
||||
velocityVariance = 1.0;
|
||||
ejectionOffset = 0.0;
|
||||
thetaMin = 0;
|
||||
thetaMax = 50;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
orientParticles = true;
|
||||
lifetimeMS = 100;
|
||||
particles = "MortarSplashParticle";
|
||||
};
|
||||
|
||||
|
||||
datablock SplashData(MortarSplash)
|
||||
{
|
||||
numSegments = 10;
|
||||
ejectionFreq = 10;
|
||||
ejectionAngle = 20;
|
||||
ringLifetime = 0.4;
|
||||
lifetimeMS = 400;
|
||||
velocity = 3.0;
|
||||
startRadius = 0.0;
|
||||
acceleration = -3.0;
|
||||
texWrap = 5.0;
|
||||
|
||||
texture = "special/water2";
|
||||
|
||||
emitter[0] = MortarSplashEmitter;
|
||||
|
||||
colors[0] = "0.7 0.8 1.0 0.0";
|
||||
colors[1] = "0.7 0.8 1.0 1.0";
|
||||
colors[2] = "0.7 0.8 1.0 0.0";
|
||||
colors[3] = "0.7 0.8 1.0 0.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.4;
|
||||
times[2] = 0.8;
|
||||
times[3] = 1.0;
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Mortar Shockwaves
|
||||
//---------------------------------------------------------------------------
|
||||
datablock ShockwaveData(UnderwaterMortarShockwave)
|
||||
{
|
||||
width = 6.0;
|
||||
numSegments = 32;
|
||||
numVertSegments = 6;
|
||||
velocity = 10;
|
||||
acceleration = 20.0;
|
||||
lifetimeMS = 900;
|
||||
height = 1.0;
|
||||
verticalCurve = 0.5;
|
||||
is2D = false;
|
||||
|
||||
texture[0] = "special/shockwave4";
|
||||
texture[1] = "special/gradient";
|
||||
texWrap = 6.0;
|
||||
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
colors[0] = "0.4 0.4 1.0 0.50";
|
||||
colors[1] = "0.4 0.4 1.0 0.25";
|
||||
colors[2] = "0.4 0.4 1.0 0.0";
|
||||
|
||||
mapToTerrain = true;
|
||||
orientToNormal = false;
|
||||
renderBottom = false;
|
||||
};
|
||||
|
||||
datablock ShockwaveData(MortarShockwave)
|
||||
{
|
||||
width = 6.0;
|
||||
numSegments = 32;
|
||||
numVertSegments = 6;
|
||||
velocity = 15;
|
||||
acceleration = 20.0;
|
||||
lifetimeMS = 500;
|
||||
height = 1.0;
|
||||
verticalCurve = 0.5;
|
||||
is2D = false;
|
||||
|
||||
texture[0] = "special/shockwave4";
|
||||
texture[1] = "special/gradient";
|
||||
texWrap = 6.0;
|
||||
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
colors[0] = "0.4 1.0 0.4 0.50";
|
||||
colors[1] = "0.4 1.0 0.4 0.25";
|
||||
colors[2] = "0.4 1.0 0.4 0.0";
|
||||
|
||||
mapToTerrain = true;
|
||||
orientToNormal = false;
|
||||
renderBottom = false;
|
||||
};
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Mortar Explosion Particle effects
|
||||
//--------------------------------------
|
||||
datablock ParticleData( MortarCrescentParticle )
|
||||
{
|
||||
dragCoefficient = 2;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.2;
|
||||
constantAcceleration = -0.0;
|
||||
lifetimeMS = 600;
|
||||
lifetimeVarianceMS = 000;
|
||||
textureName = "special/crescent3";
|
||||
colors[0] = "0.7 1.0 0.7 1.0";
|
||||
colors[1] = "0.7 1.0 0.7 0.5";
|
||||
colors[2] = "0.7 1.0 0.7 0.0";
|
||||
sizes[0] = 4.0;
|
||||
sizes[1] = 8.0;
|
||||
sizes[2] = 9.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData( MortarCrescentEmitter )
|
||||
{
|
||||
ejectionPeriodMS = 25;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 40;
|
||||
velocityVariance = 5.0;
|
||||
ejectionOffset = 0.0;
|
||||
thetaMin = 0;
|
||||
thetaMax = 80;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
orientParticles = true;
|
||||
lifetimeMS = 200;
|
||||
particles = "MortarCrescentParticle";
|
||||
};
|
||||
|
||||
|
||||
datablock ParticleData(MortarExplosionSmoke)
|
||||
{
|
||||
dragCoeffiecient = 0.4;
|
||||
gravityCoefficient = -0.30; // rises slowly
|
||||
inheritedVelFactor = 0.025;
|
||||
|
||||
lifetimeMS = 1250;
|
||||
lifetimeVarianceMS = 500;
|
||||
|
||||
textureName = "particleTest";
|
||||
|
||||
useInvAlpha = true;
|
||||
spinRandomMin = -100.0;
|
||||
spinRandomMax = 100.0;
|
||||
|
||||
textureName = "special/Smoke/bigSmoke";
|
||||
|
||||
colors[0] = "0.7 0.7 0.7 0.0";
|
||||
colors[1] = "0.4 0.4 0.4 0.5";
|
||||
colors[2] = "0.4 0.4 0.4 0.5";
|
||||
colors[3] = "0.4 0.4 0.4 0.0";
|
||||
sizes[0] = 5.0;
|
||||
sizes[1] = 6.0;
|
||||
sizes[2] = 10.0;
|
||||
sizes[3] = 12.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.333;
|
||||
times[2] = 0.666;
|
||||
times[3] = 1.0;
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(MortarExplosionSmokeEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 0;
|
||||
|
||||
ejectionOffset = 8.0;
|
||||
|
||||
|
||||
ejectionVelocity = 1.25;
|
||||
velocityVariance = 1.2;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 90.0;
|
||||
|
||||
lifetimeMS = 500;
|
||||
|
||||
particles = "MortarExplosionSmoke";
|
||||
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Underwater Explosion
|
||||
//---------------------------------------------------------------------------
|
||||
datablock ParticleData(UnderwaterExplosionSparks)
|
||||
{
|
||||
dragCoefficient = 0;
|
||||
gravityCoefficient = 0.0;
|
||||
inheritedVelFactor = 0.2;
|
||||
constantAcceleration = 0.0;
|
||||
lifetimeMS = 500;
|
||||
lifetimeVarianceMS = 350;
|
||||
textureName = "special/crescent3";
|
||||
colors[0] = "0.4 0.4 1.0 1.0";
|
||||
colors[1] = "0.4 0.4 1.0 1.0";
|
||||
colors[2] = "0.4 0.4 1.0 0.0";
|
||||
sizes[0] = 3.5;
|
||||
sizes[1] = 3.5;
|
||||
sizes[2] = 3.5;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ParticleEmitterData(UnderwaterExplosionSparksEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 2;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 17;
|
||||
velocityVariance = 4;
|
||||
ejectionOffset = 0.0;
|
||||
thetaMin = 0;
|
||||
thetaMax = 60;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
orientParticles = true;
|
||||
lifetimeMS = 100;
|
||||
particles = "UnderwaterExplosionSparks";
|
||||
};
|
||||
|
||||
datablock ParticleData(MortarExplosionBubbleParticle)
|
||||
{
|
||||
dragCoefficient = 0.0;
|
||||
gravityCoefficient = -0.25;
|
||||
inheritedVelFactor = 0.0;
|
||||
constantAcceleration = 0.0;
|
||||
lifetimeMS = 1500;
|
||||
lifetimeVarianceMS = 600;
|
||||
useInvAlpha = false;
|
||||
textureName = "special/bubbles";
|
||||
|
||||
spinRandomMin = -100.0;
|
||||
spinRandomMax = 100.0;
|
||||
|
||||
colors[0] = "0.7 0.8 1.0 0.0";
|
||||
colors[1] = "0.7 0.8 1.0 0.4";
|
||||
colors[2] = "0.7 0.8 1.0 0.0";
|
||||
sizes[0] = 2.0;
|
||||
sizes[1] = 2.0;
|
||||
sizes[2] = 2.0;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.8;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
datablock ParticleEmitterData(MortarExplosionBubbleEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 5;
|
||||
periodVarianceMS = 0;
|
||||
ejectionVelocity = 1.0;
|
||||
ejectionOffset = 7.0;
|
||||
velocityVariance = 0.5;
|
||||
thetaMin = 0;
|
||||
thetaMax = 80;
|
||||
phiReferenceVel = 0;
|
||||
phiVariance = 360;
|
||||
overrideAdvances = false;
|
||||
particles = "MortarExplosionBubbleParticle";
|
||||
};
|
||||
|
||||
datablock DebrisData( UnderwaterMortarDebris )
|
||||
{
|
||||
emitters[0] = MortarExplosionBubbleEmitter;
|
||||
|
||||
explodeOnMaxBounce = true;
|
||||
|
||||
elasticity = 0.4;
|
||||
friction = 0.2;
|
||||
|
||||
lifetime = 1.5;
|
||||
lifetimeVariance = 0.2;
|
||||
|
||||
numBounces = 1;
|
||||
};
|
||||
|
||||
datablock ExplosionData(UnderwaterMortarSubExplosion1)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
delayMS = 100;
|
||||
offset = 3.0;
|
||||
playSpeed = 1.5;
|
||||
|
||||
sizes[0] = "0.75 0.75 0.75";
|
||||
sizes[1] = "1.0 1.0 1.0";
|
||||
sizes[2] = "0.5 0.5 0.5";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ExplosionData(UnderwaterMortarSubExplosion2)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
delayMS = 50;
|
||||
offset = 3.0;
|
||||
playSpeed = 0.75;
|
||||
|
||||
sizes[0] = "1.5 1.5 1.5";
|
||||
sizes[1] = "1.5 1.5 1.5";
|
||||
sizes[2] = "1.0 1.0 1.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(UnderwaterMortarSubExplosion3)
|
||||
{
|
||||
explosionShape = "disc_explosion.dts";
|
||||
faceViewer = true;
|
||||
delayMS = 0;
|
||||
offset = 0.0;
|
||||
playSpeed = 0.5;
|
||||
|
||||
sizes[0] = "1.0 1.0 1.0";
|
||||
sizes[1] = "2.0 2.0 2.0";
|
||||
sizes[2] = "1.5 1.5 1.5";
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ExplosionData(UnderwaterMortarExplosion)
|
||||
{
|
||||
soundProfile = UnderwaterMortarExplosionSound;
|
||||
|
||||
shockwave = UnderwaterMortarShockwave;
|
||||
shockwaveOnTerrain = true;
|
||||
|
||||
subExplosion[0] = UnderwaterMortarSubExplosion1;
|
||||
subExplosion[1] = UnderwaterMortarSubExplosion2;
|
||||
subExplosion[2] = UnderwaterMortarSubExplosion3;
|
||||
|
||||
emitter[0] = MortarExplosionBubbleEmitter;
|
||||
emitter[1] = UnderwaterExplosionSparksEmitter;
|
||||
|
||||
shakeCamera = true;
|
||||
camShakeFreq = "8.0 9.0 7.0";
|
||||
camShakeAmp = "100.0 100.0 100.0";
|
||||
camShakeDuration = 1.3;
|
||||
camShakeRadius = 25.0;
|
||||
};
|
||||
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Explosion
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
datablock ExplosionData(MortarSubExplosion1)
|
||||
{
|
||||
explosionShape = "mortar_explosion.dts";
|
||||
faceViewer = true;
|
||||
|
||||
delayMS = 100;
|
||||
|
||||
offset = 5.0;
|
||||
|
||||
playSpeed = 1.5;
|
||||
|
||||
sizes[0] = "0.5 0.5 0.5";
|
||||
sizes[1] = "0.5 0.5 0.5";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ExplosionData(MortarSubExplosion2)
|
||||
{
|
||||
explosionShape = "mortar_explosion.dts";
|
||||
faceViewer = true;
|
||||
|
||||
delayMS = 50;
|
||||
|
||||
offset = 5.0;
|
||||
|
||||
playSpeed = 1.0;
|
||||
|
||||
sizes[0] = "1.0 1.0 1.0";
|
||||
sizes[1] = "1.0 1.0 1.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
};
|
||||
|
||||
datablock ExplosionData(MortarSubExplosion3)
|
||||
{
|
||||
explosionShape = "mortar_explosion.dts";
|
||||
faceViewer = true;
|
||||
delayMS = 0;
|
||||
offset = 0.0;
|
||||
playSpeed = 0.7;
|
||||
|
||||
sizes[0] = "1.0 1.0 1.0";
|
||||
sizes[1] = "2.0 2.0 2.0";
|
||||
times[0] = 0.0;
|
||||
times[1] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
datablock ExplosionData(MortarExplosion)
|
||||
{
|
||||
soundProfile = MortarExplosionSound;
|
||||
|
||||
shockwave = MortarShockwave;
|
||||
shockwaveOnTerrain = true;
|
||||
|
||||
subExplosion[0] = MortarSubExplosion1;
|
||||
subExplosion[1] = MortarSubExplosion2;
|
||||
subExplosion[2] = MortarSubExplosion3;
|
||||
|
||||
emitter[0] = MortarExplosionSmokeEmitter;
|
||||
emitter[1] = MortarCrescentEmitter;
|
||||
|
||||
shakeCamera = true;
|
||||
camShakeFreq = "8.0 9.0 7.0";
|
||||
camShakeAmp = "100.0 100.0 100.0";
|
||||
camShakeDuration = 1.3;
|
||||
camShakeRadius = 25.0;
|
||||
};
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// Smoke particles
|
||||
//---------------------------------------------------------------------------
|
||||
datablock ParticleData(MortarSmokeParticle)
|
||||
{
|
||||
dragCoeffiecient = 0.4;
|
||||
gravityCoefficient = -0.3; // rises slowly
|
||||
inheritedVelFactor = 0.125;
|
||||
|
||||
lifetimeMS = 1200;
|
||||
lifetimeVarianceMS = 200;
|
||||
useInvAlpha = true;
|
||||
spinRandomMin = -100.0;
|
||||
spinRandomMax = 100.0;
|
||||
|
||||
animateTexture = false;
|
||||
|
||||
textureName = "special/Smoke/bigSmoke";
|
||||
|
||||
colors[0] = "0.7 1.0 0.7 0.5";
|
||||
colors[1] = "0.3 0.7 0.3 0.8";
|
||||
colors[2] = "0.0 0.0 0.0 0.0";
|
||||
sizes[0] = 1.0;
|
||||
sizes[1] = 2.0;
|
||||
sizes[2] = 4.5;
|
||||
times[0] = 0.0;
|
||||
times[1] = 0.5;
|
||||
times[2] = 1.0;
|
||||
|
||||
};
|
||||
|
||||
|
||||
datablock ParticleEmitterData(MortarSmokeEmitter)
|
||||
{
|
||||
ejectionPeriodMS = 10;
|
||||
periodVarianceMS = 3;
|
||||
|
||||
ejectionVelocity = 2.25;
|
||||
velocityVariance = 0.55;
|
||||
|
||||
thetaMin = 0.0;
|
||||
thetaMax = 40.0;
|
||||
|
||||
particles = "MortarSmokeParticle";
|
||||
};
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Projectile
|
||||
//--------------------------------------
|
||||
datablock GrenadeProjectileData(MortarShot)
|
||||
{
|
||||
projectileShapeName = "mortar_projectile.dts";
|
||||
emitterDelay = -1;
|
||||
directDamage = 0.0;
|
||||
hasDamageRadius = true;
|
||||
indirectDamage = 1.0;
|
||||
damageRadius = 19.0; // z0dd - ZOD, 8/13/02. Was 20.0
|
||||
radiusDamageType = $DamageType::Mortar;
|
||||
kickBackStrength = 2500;
|
||||
|
||||
explosion = "MortarExplosion";
|
||||
underwaterExplosion = "UnderwaterMortarExplosion";
|
||||
velInheritFactor = 0.5;
|
||||
splash = MortarSplash;
|
||||
depthTolerance = 10.0; // depth at which it uses underwater explosion
|
||||
|
||||
baseEmitter = MortarSmokeEmitter;
|
||||
bubbleEmitter = MortarBubbleEmitter;
|
||||
|
||||
grenadeElasticity = 0.15;
|
||||
grenadeFriction = 0.4;
|
||||
armingDelayMS = 1500; // z0dd - ZOD, 4/14/02. Was 2000
|
||||
|
||||
gravityMod = 1.1; // z0dd - ZOD, 5/18/02. Make mortar projectile heavier, less floaty
|
||||
muzzleVelocity = 75.95; // z0dd - ZOD, 8/13/02. More velocity to compensate for higher gravity. Was 63.7
|
||||
drag = 0.1;
|
||||
sound = MortarProjectileSound;
|
||||
|
||||
hasLight = true;
|
||||
lightRadius = 4;
|
||||
lightColor = "0.05 0.2 0.05";
|
||||
|
||||
hasLightUnderwaterColor = true;
|
||||
underWaterLightColor = "0.05 0.075 0.2";
|
||||
|
||||
// z0dd - ZOD, 5/22/03. Limit the mortars effective range to around 450 meters.
|
||||
// Addresses long range mortar spam exploit.
|
||||
explodeOnDeath = $Host::ClassicLoadMortarChanges ? true : false;
|
||||
fizzleTimeMS = $Host::ClassicLoadMortarChanges ? 8000 : -1;
|
||||
lifetimeMS = $Host::ClassicLoadMortarChanges ? 10000 : -1;
|
||||
fizzleUnderwaterMS = $Host::ClassicLoadMortarChanges ? 8000 : -1;
|
||||
reflectOnWaterImpactAngle = 0.0;
|
||||
explodeOnWaterImpact = false;
|
||||
deflectionOnWaterImpact = 0.0;
|
||||
};
|
||||
|
||||
// z0dd - ZOD, 5/20/03. New block, spawn this at end of MortarShots lifetime.
|
||||
datablock ItemData(MortarGrenadeThrown)
|
||||
{
|
||||
className = Weapon;
|
||||
shapeFile = "mortar_projectile.dts";
|
||||
mass = 0.7;
|
||||
elasticity = 0.15;
|
||||
friction = 1;
|
||||
pickupRadius = 2;
|
||||
maxDamage = 0.5;
|
||||
explosion = "mortarExplosion";
|
||||
underwaterExplosion = UnderwaterMortarExplosion;
|
||||
indirectDamage = 1.0;
|
||||
damageRadius = 19.0;
|
||||
radiusDamageType = $DamageType::Mortar;
|
||||
kickBackStrength = 2500;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Ammo
|
||||
//--------------------------------------
|
||||
|
||||
datablock ItemData(MortarAmmo)
|
||||
{
|
||||
className = Ammo;
|
||||
catagory = "Ammo";
|
||||
shapeFile = "ammo_mortar.dts";
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
pickUpName = "some mortar ammo";
|
||||
computeCRC = true;
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------------
|
||||
// Weapon
|
||||
//--------------------------------------
|
||||
datablock ItemData(Mortar)
|
||||
{
|
||||
className = Weapon;
|
||||
catagory = "Spawn Items";
|
||||
shapeFile = "weapon_mortar.dts";
|
||||
image = MortarImage;
|
||||
mass = 1;
|
||||
elasticity = 0.2;
|
||||
friction = 0.6;
|
||||
pickupRadius = 2;
|
||||
pickUpName = "a mortar gun";
|
||||
computeCRC = true;
|
||||
emap = true;
|
||||
};
|
||||
|
||||
datablock ShapeBaseImageData(MortarImage)
|
||||
{
|
||||
className = WeaponImage;
|
||||
shapeFile = "weapon_mortar.dts";
|
||||
item = Mortar;
|
||||
ammo = MortarAmmo;
|
||||
offset = "0 0 0";
|
||||
emap = true;
|
||||
|
||||
projectile = MortarShot;
|
||||
projectileType = GrenadeProjectile;
|
||||
|
||||
stateName[0] = "Activate";
|
||||
stateTransitionOnTimeout[0] = "ActivateReady";
|
||||
stateTimeoutValue[0] = 0.5;
|
||||
stateSequence[0] = "Activate";
|
||||
stateSound[0] = MortarSwitchSound;
|
||||
|
||||
stateName[1] = "ActivateReady";
|
||||
stateTransitionOnAmmo[1] = "Ready";
|
||||
stateTransitionOnNoAmmo[1] = "FirstLoad";
|
||||
|
||||
stateName[2] = "Ready";
|
||||
stateTransitionOnNoAmmo[2] = "NoAmmo";
|
||||
stateTransitionOnTriggerDown[2] = "Fire";
|
||||
stateSound[2] = MortarIdleSound;
|
||||
|
||||
stateName[3] = "Fire";
|
||||
stateSequence[3] = "Recoil";
|
||||
stateTransitionOnTimeout[3] = "Reload";
|
||||
stateTimeoutValue[3] = 0.8;
|
||||
stateFire[3] = true;
|
||||
stateRecoil[3] = LightRecoil;
|
||||
stateAllowImageChange[3] = false;
|
||||
stateScript[3] = "onFire";
|
||||
stateSound[3] = MortarFireSound;
|
||||
|
||||
stateName[4] = "Reload";
|
||||
stateTransitionOnNoAmmo[4] = "NoAmmo";
|
||||
stateTransitionOnTimeout[4] = "Ready";
|
||||
stateTimeoutValue[4] = 2.0;
|
||||
stateAllowImageChange[4] = false;
|
||||
stateSequence[4] = "Reload";
|
||||
stateSound[4] = MortarReloadSound;
|
||||
|
||||
stateName[5] = "NoAmmo";
|
||||
stateTransitionOnAmmo[5] = "Reload";
|
||||
stateSequence[5] = "NoAmmo";
|
||||
stateTransitionOnTriggerDown[5] = "DryFire";
|
||||
|
||||
stateName[6] = "DryFire";
|
||||
stateSound[6] = MortarDryFireSound;
|
||||
stateTimeoutValue[6] = 1.5;
|
||||
stateTransitionOnTimeout[6] = "NoAmmo";
|
||||
|
||||
stateName[7] = "FirstLoad";
|
||||
stateTransitionOnAmmo[7] = "Ready";
|
||||
};
|
||||
|
||||
function MortarImage::onUnmount(%this,%obj,%slot){
|
||||
parent::onUnmount(%this,%obj,%slot);
|
||||
if(isEventPending(%obj.reloadDelaySch))
|
||||
cancel(%obj.reloadDelaySch);
|
||||
}
|
||||
function MortarImage::onMount(%this,%obj,%slot){
|
||||
|
||||
if(%obj.getClassName() !$= "Player")
|
||||
return;
|
||||
|
||||
if (%this.armthread $= "")
|
||||
%obj.setArmThread(look);
|
||||
else
|
||||
%obj.setArmThread(%this.armThread);
|
||||
|
||||
if(%obj.getMountedImage($WeaponSlot).ammo !$= ""){
|
||||
if (%obj.getInventory(%this.ammo)){
|
||||
%fireAndReloadTime = mFloor((%this.stateTimeoutValue[4] + %this.stateTimeoutValue[3]) * 1000);
|
||||
if(%obj.lfireTime[%this.getName()] && (getSimTime() - %obj.lfireTime[%this.getName()]) < %fireAndReloadTime){
|
||||
if(isEventPending(%obj.reloadDelaySch)){
|
||||
cancel(%obj.reloadDelaySch);
|
||||
}
|
||||
%time = mFloor(%fireAndReloadTime - (getSimTime() - %obj.lfireTime[%this.getName()]));
|
||||
%obj.reloadDelaySch = schedule(%time, 0, "ammoStateDelay", %obj, %slot, true);
|
||||
}
|
||||
else{
|
||||
%obj.setImageAmmo(%slot,true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
%obj.client.setWeaponsHudActive(%this.item);
|
||||
if(%obj.getMountedImage($WeaponSlot).ammo !$= "")
|
||||
%obj.client.setAmmoHudCount(%obj.getInventory(%this.ammo));
|
||||
else
|
||||
%obj.client.setAmmoHudCount(-1);
|
||||
}
|
||||
|
||||
function ammoStateDelay(%obj, %slot, %state){
|
||||
if(isObject(%obj) && %obj.getState() !$= "Dead")
|
||||
%obj.setImageAmmo(%slot, %state);
|
||||
}
|
||||
Loading…
Reference in a new issue