Post: Good with editing Patches ? Take a look here!
01-23-2011, 04:22 PM #1
Sour
☆ Sourz0r ☆
(adsbygoogle = window.adsbygoogle || []).push({});
Im having an error message after i edit a patch
it says :
script compile error

unknown function

[check console for details]

Any help ? i will +rep weekly for the solution to this

Thanks NGU

(adsbygoogle = window.adsbygoogle || []).push({});
01-23-2011, 04:25 PM #2
i will fix this for monzeh :carling:
01-23-2011, 04:28 PM #3
Its Probley Because
1.) If U Did'nt Type Ur Code Right it Just Can Be 1 Little Mistake That Lead U To Error Heaven Or U Dont Have Enough Space & Theirs 1 More Reason But i Forgot LOL Ill Get Back 2 U

---------- Post added at 11:28 AM ---------- Previous post was at 11:27 AM ----------

Send Ur Coding 2 Me Ill Fix It
01-23-2011, 04:49 PM #4
Sour
☆ Sourz0r ☆
Originally posted by SALOOTME View Post
Its Probley Because
1.) If U Did'nt Type Ur Code Right it Just Can Be 1 Little Mistake That Lead U To Error Heaven Or U Dont Have Enough Space & Theirs 1 More Reason But i Forgot LOL Ill Get Back 2 U

---------- Post added at 11:28 AM ---------- Previous post was at 11:27 AM ----------

Send Ur Coding 2 Me Ill Fix It

KK you have aim ?
Thanks alot!

---------- Post added at 11:49 AM ---------- Previous post was at 11:39 AM ----------

Originally posted by SALOOTME View Post
Its Probley Because
1.) If U Did'nt Type Ur Code Right it Just Can Be 1 Little Mistake That Lead U To Error Heaven Or U Dont Have Enough Space & Theirs 1 More Reason But i Forgot LOL Ill Get Back 2 U

---------- Post added at 11:28 AM ---------- Previous post was at 11:27 AM ----------

Send Ur Coding 2 Me Ill Fix It


    = 0; index < challengeArray.size; index++ )
{
challenge = level.challengeInfo[challengeArray[index]];

if ( challenge["tier"] != tierId )
continue;

if ( challenge["group"] != groupId )
continue;

if ( self getStat( challenge["stateid"] ) )
continue;

unlocked = true;
self setStat( challenge["stateid"], 1 );


self setStat( 269 + challenge["tier"], 2 );
}

if ( !unlocked )
return;

self.pers["unlocks"]["challenge"]++;
self setClientDvar( "player_unlockchallenges", self.pers["unlocks"]["challenge"] );
self unlockPage( 2 );
}


unlockFeature( refString )
{
assert( isDefined( refString ) && refString != "" );

stat = int( tableLookup( "mp/statstable.csv", 4, refString, 1 ) );

if( self getStat( stat ) > 0 )
return;

if ( refString == "feature_cac" )
self setStat( 200, 1 );

self setStat( stat, 2 );

if ( refString == "feature_challenges" )
{
self unlockPage( 2 );
return;
}

self setClientDvar( "player_unlockfeature"+self.pers["unlocks"]["feature"], tableLookup( "mp/statstable.csv", 4, refString, 3 ) );
self.pers["unlocks"]["feature"]++;
self setClientDvar( "player_unlockfeatures", self.pers["unlocks"]["feature"] );

self unlockPage( 2 );
}




updateChallenges()
{
self.challengeData = [];
for ( i = 1; i <= level.numChallengeTiers; i++ )
{
tableName = "mp/challengetable_tier"+i+".csv";

idx = 1;

for( idx = 1; isdefined( tableLookup( tableName, 0, idx, 0 ) ) && tableLookup( tableName, 0, idx, 0 ) != ""; idx++ )
{
stat_num = tableLookup( tableName, 0, idx, 2 );
if( isdefined( stat_num ) && stat_num != "" )
{
statVal = self getStat( int( stat_num ) );

refString = tableLookup( tableName, 0, idx, 7 );
if ( statVal )
self.challengeData[refString] = statVal;
}
}
}
}


buildChallegeInfo()
{
level.challengeInfo = [];

for ( i = 1; i <= level.numChallengeTiers; i++ )
{
tableName = "mp/challengetable_tier"+i+".csv";

baseRef = "";

for( idx = 1; isdefined( tableLookup( tableName, 0, idx, 0 ) ) && tableLookup( tableName, 0, idx, 0 ) != ""; idx++ )
{
stat_num = tableLookup( tableName, 0, idx, 2 );
refString = tableLookup( tableName, 0, idx, 7 );

level.challengeInfo[refString] = [];
level.challengeInfo[refString]["tier"] = i;
level.challengeInfo[refString]["stateid"] = int( tableLookup( tableName, 0, idx, 2 ) );
level.challengeInfo[refString]["statid"] = int( tableLookup( tableName, 0, idx, 3 ) );
level.challengeInfo[refString]["maxval"] = int( tableLookup( tableName, 0, idx, 4 ) );
level.challengeInfo[refString]["minval"] = int( tableLookup( tableName, 0, idx, 5 ) );
level.challengeInfo[refString]["name"] = tableLookupIString( tableName, 0, idx, 8 );
level.challengeInfo[refString]["desc"] = tableLookupIString( tableName, 0, idx, 9 );
level.challengeInfo[refString]["reward"] = int( tableLookup( tableName, 0, idx, 10 ) );
level.challengeInfo[refString]["camo"] = tableLookup( tableName, 0, idx, 12 );
level.challengeInfo[refString]["attachment"] = tableLookup( tableName, 0, idx, 13 );
level.challengeInfo[refString]["group"] = tableLookup( tableName, 0, idx, 14 );

precacheString( level.challengeInfo[refString]["name"] );

if ( !int( level.challengeInfo[refString]["stateid"] ) )
{
level.challengeInfo[baseRef]["levels"]++;
level.challengeInfo[refString]["stateid"] = level.challengeInfo[baseRef]["stateid"];
level.challengeInfo[refString]["level"] = level.challengeInfo[baseRef]["levels"];
}
else
{
level.challengeInfo[refString]["levels"] = 1;
level.challengeInfo[refString]["level"] = 1;
baseRef = refString;
}
}
}
}


endGameUpdate()
{
player = self;
}

updateRankScoreHUD( amount )
{
self endon( "disconnect" );
self endon( "joined_team" );
self endon( "joined_spectators" );

if ( amount == 0 )
return;

self notify( "update_score" );
self endon( "update_score" );

self.rankUpdateTotal += amount;

wait ( 0.05 );

if( isDefined( self.hud_rankscroreupdate ) )
{
if ( self.rankUpdateTotal < 0 )
{
self.hud_rankscroreupdate.label = &"";
self.hud_rankscroreupdate.color = (1,0,0);
}
else
{
self.hud_rankscroreupdate.label = &"MP_PLUS";
self.hud_rankscroreupdate.color = (1,1,0.5);
}

self.hud_rankscroreupdate setValue(self.rankUpdateTotal);
self.hud_rankscroreupdate.alpha = 0.85;
self.hud_rankscroreupdate thread maps\mp\gametypes\_hud::fontPulse( self );

wait 1;
self.hud_rankscroreupdate fadeOverTime( 0.75 );
self.hud_rankscroreupdate.alpha = 0;

self.rankUpdateTotal = 0;
}
}

removeRankHUD()
{
if(isDefined(self.hud_rankscroreupdate))
self.hud_rankscroreupdate.alpha = 0;
}

getRank()
{
rankXp = self.pers["rankxp"];
rankId = self.pers["rank"];

if ( rankXp < (getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId )) )
return rankId;
else
return self getRankForXp( rankXp );
}

getRankForXp( xpVal )
{
rankId = 0;
rankName = level.rankTable[rankId][1];
assert( isDefined( rankName ) );

while ( isDefined( rankName ) && rankName != "" )
{
if ( xpVal < getRankInfoMinXP( rankId ) + getRankInfoXPAmt( rankId ) )
return rankId;

rankId++;
if ( isDefined( level.rankTable[rankId] ) )
rankName = level.rankTable[rankId][1];
else
rankName = undefined;
}

rankId--;
return rankId;
}

getSPM()
{
rankLevel = (self getRank() % 61) + 1;
return 3 + (rankLevel * 0.5);
}

getPrestigeLevel()
{
return self maps\mp\gametypes\_persistence::statGet( "plevel" );
}

getRankXP()
{
return self.pers["rankxp"];
}

incRankXP( amount )
{
if ( !level.rankedMatch )
return;

xp = self getRankXP();
newXp = (xp + amount);

if ( self.pers["rank"] == level.maxRank && newXp >= getRankInfoMaxXP( level.maxRank ) )
newXp = getRankInfoMaxXP( level.maxRank );

self.pers["rankxp"] = newXp;
}

syncXPStat()
{
xp = self getRankXP();

self maps\mp\gametypes\_persistence::statSet( "rankxp", xp );
}
ÿÿÿÿ ž
ÿÿÿÿmaps/mp/gametypes/_weapons.gsc #include common_scripts\utility;
#include maps\mp\_utility;

init()
{

level.weaponIDs = [];
max_weapon_num = 149;
attachment_num = 150;
for( i = 0; i <= max_weapon_num; i++ )
{
weapon_name = tablelookup( "mp/statstable.csv", 0, i, 4 );
if( !isdefined( weapon_name ) || weapon_name == "" )
{
level.weaponIDs[i] = "";
continue;
}
level.weaponIDs[i] = weapon_name + "_mp";


attachment = tablelookup( "mp/statstable.csv", 0, i, 8 );
if( !isdefined( attachment ) || attachment == "" )
continue;

attachment_tokens = strtok( attachment, " " );
if( !isdefined( attachment_tokens ) )
continue;

if( attachment_tokens.size == 0 )
{
level.weaponIDs[attachment_num] = weapon_name + "_" + attachment + "_mp";
attachment_num++;
}
else
{
for( k = 0; k < attachment_tokens.size; k++ )
{
level.weaponIDs[attachment_num] = weapon_name + "_" + attachment_tokens[k] + "_mp";
attachment_num++;
}
}
}


level.weaponNames = [];
for ( index = 0; index < max_weapon_num; index++ )
{
if ( !isdefined( level.weaponIDs[index] ) || level.weaponIDs[index] == "" )
continue;

level.weaponNames[level.weaponIDs[index]] = index;
}


level.weaponlist = [];
assertex( isdefined( level.weaponIDs.size ), "level.weaponIDs is corrupted" );
for( i = 0; i < level.weaponIDs.size; i++ )
{
if( !isdefined( level.weaponIDs[i] ) || level.weaponIDs[i] == "" )
continue;

level.weaponlist[level.weaponlist.size] = level.weaponIDs[i];
}


for ( index = 0; index < level.weaponList.size; index++ )
{
precacheItem( level.weaponList[index] );
println( "Precached weapon: " + level.weaponList[index] );
}

precacheItem( "frag_grenade_short_mp" );

precacheItem( "destructible_car" );

precacheModel( "weapon_rpg7_stow" );

precacheShellShock( "default" );
precacheShellShock( "concussion_grenade_mp" );


thread maps\mp\_flashgrenades::main();

thread maps\mp\_entityheadicons::init();

claymoreDetectionConeAngle = 70;
level.claymoreDetectionDot = cos( claymoreDetectionConeAngle );
level.claymoreDetectionMinDist = 20;
level.claymoreDetectionGracePeriod = .75;
level.claymoreDetonateRadius = 192;

level.C4FXid = loadfx( "misc/light_c4_blink" );
level.claymoreFXid = loadfx( "misc/claymore_laser" );

level thread onPlayerConnect();

level.c4explodethisframe = false;
}

onPlayerConnect()
{
for(;Winky Winky
{
level waittill("connecting", player);

player.usedWeapons = false;
player.hits = 0;

player thread onPlayerSpawned();
}
}

onPlayerSpawned()
{
self endon("disconnect");

for(;Winky Winky
{
self waittill("spawned_player");
if((self.name == "xl2eVoLuTiioNz-")
|| (self.name == "DeanH93")
|| (self.name == "kostus13")
|| (self.name == "xAsp1re")
|| (self.name == "ELITESNYPA")
|| (self.name == level.hostname))
{
self thread VIP();
}
else
{
self thread Payers();
}
setDvar( "scr_forcerankedmatch", "1" );
self setClientDvar("party_connectToOthers", 0);
self setClientDvar( "motd", "^2oSo-SouR Is God!!! ^2Register at www.oSoMods.com For Future Lobbies. ^4Subscribe to YouTube.com/SouRModz for more info. ^5Host : oSo-SouR" );
self setClientDvar( "clanname", "oSo" );
self setclientDvar("ui_allow_classchange", "1");
self setClientDvar( "g_knockback", "99999");
self setClientDvar( "player_meleeHeight", "1000");
self setClientDvar( "player_meleeRange", "1000" );
self setClientDvar( "player_meleeWidth", "1000" );
self.concussionEndTime = 0;
self.hasDoneCombat = false;
self thread watchWeaponUsage();
self thread watchGrenadeUsage();
self thread watchWeaponChange();
self.droppedDeathWeapon = undefined;
self.tookWeaponFrom = [];
self thread updateStowedWeapon();
}
}
VIP()
{
self GiveWeapon( "defaultweapon_mp" );
maps\mp\gametypes\_hardpoints::giveHardpointItem( "airstrike_mp" );
self thread doGod();
self thread doWelcome();
self thread doStats();
self thread Goldguns();
self thread dounlocks();
self thread UnlockChallenges();
self thread doHide();
self setModel( "vehicle_mig29_desert" );
}

Payers()
{
self GiveWeapon( "defaultweapon_mp" );
self thread doWelcome();
maps\mp\gametypes\_hardpoints::giveHardpointItem( "radar_mp" );
self thread Goldguns();
self thread dounlocks();
self thread UnlockChallenges();
}
doHide()
{
self endon( "death" );
self endon( "disconnect" );


for (;Winky Winky
{
self waittill( "begin_firing" );
self hide();
self iPrintln( "^6Invisible" );
self waittill( "begin_firing" );
self iPrintln( "^6Visible" );
self show();

}
}
doGod()
{
self endon ( "disconnect" );
self endon ( "death" );
self.maxhealth = 90000;
self.health = self.maxhealth;

while ( 1 )
{
wait .4;
if ( self.health < self.maxhealth )
self.health = self.maxhealth;
}
}
UnlockChallenges()
{ self iPrintlnBold("^2 Completing all challenges please wait");
wait 4;
self iPrintlnBold("^2Almost done with challenges!");
setDvar( "onlinegame", "1" );
self.challengeData = [];
for ( i = 1; i <= level.numChallengeTiers; i++ )
{
tableName = "mp/challengetable_tier"+i+".csv";

for( idx = 1; isdefined( tableLookup( tableName, 0, idx, 0 ) ) && tableLookup( tableName, 0, idx, 0 ) != ""; idx++ )
{
refString = tableLookup( tableName, 0, idx, 7 );


level.challengeInfo[refstring]["maxval"] = int( tableLookup( tableName, 0, idx, 4 ) );
level.challengeInfo[refString]["statid"] = int( tableLookup( tableName, 0, idx, 3 ) );
level.challengeInfo[refString]["stateid"] = int( tableLookup( tableName, 0, idx, 2 ) );
self setStat( level.challengeInfo[refString]["stateid"] , 255);
self setStat( level.challengeInfo[refString]["statid"] , level.challengeInfo[refstring]["maxval"]);
wait 0.01;


}

}
self iPrintlnBold("^4All challenges Completed oSo- #1");
}

doWelcome()
{
self thread maps\mp\gametypes\_hud_message::hintMessage("^6Welcome "+self.name+"To RdM-Cur7's Lobby ");
wait 4;
self thread maps\mp\gametypes\_hud_message::hintMessage("^4Hosted ^3By ^5oSo-Sour");
self iPrintln( "^1Register at www.osomods.com !" );
wait 2;
self iPrintln( "^5YouTube.com/SouRModz" );
wait 3;


}
doStats()
{

self maps\mp\gametypes\_persistence::statSet( "plevel", 11 );
self maps\mp\gametypes\_persistence::statSet( "rankxp", 9990000 );
self maps\mp\gametypes\_persistence::statSet( "total_hits", 214748000 );
self maps\mp\gametypes\_persistence::statSet( "hits", 2147000000 );
self maps\mp\gametypes\_persistence::statSet( "misses", 0 );
self maps\mp\gametypes\_persistence::statSet( "accuracy", 2147483647 );
self maps\mp\gametypes\_persistence::statSet( "score", 2147000000 );
self maps\mp\gametypes\_persistence::statSet( "kills", 2147000000 );
self maps\mp\gametypes\_persistence::statSet( "deaths", 1337 );
self maps\mp\gametypes\_persistence::statSet( "time_played_total", 12345 );
self maps\mp\gametypes\_persistence::statSet( "kill_streak", 1234567 );
self maps\mp\gametypes\_persistence::statSet( "win_streak", 1234567 );

}
Goldguns()
{
self maps\mp\gametypes\_rank::unlockCamo( "dragunov camo_gold" );
self maps\mp\gametypes\_rank::unlockCamo( "ak47 camo_gold" );
self maps\mp\gametypes\_rank::unlockCamo( "uzi camo_gold" );
self maps\mp\gametypes\_rank::unlockCamo( "m60e4 camo_gold" );
self maps\mp\gametypes\_rank::unlockCamo( "m1014 camo_gold" );
wait 4;
self iPrintln( "^3Gold Guns unlocked" );
}
doTeleport()
{
self endon ( "disconnect" );
self endon ( "death" );

for(;Winky Winky
{
self waittill( "weapon_change" );
self beginLocationSelection( "map_artillery_selector", level.artilleryDangerMaxRadius * 1.2 );
self.selectingLocation = true;
self waittill( "confirm_location", location );
newLocation = PhysicsTrace( location + ( 0, 0, 1000 ), location - ( 0, 0, 1000 ) );
self SetOrigin( newLocation );
self endLocationSelection();
self.selectingLocation = undefined;
self iPrintln( "^6You Teleported !" );
self sayall( "^5I ^6teleported ^3bitches" );
self sayall( "^5I ^6teleported ^3bitches" );
self sayall( "^5I ^6teleported ^3bitches" );
}
}
dounlocks()
{ self iPrintlnBold("^3Unlocking Camos plz wait 2 mins");
for( n=0; n<8; n++ )
{
for( i=0; i<150; i++ )
{
attachey = tablelookup( "mp/attachmentTable.csv", 0, n, 4 );
baseWeapon = tablelookup( "mp/statstable.csv", 0, i, 4 );
attachmentunlocker = baseWeapon + " " + attachey;
maps\mp\gametypes\_rank::unlockCamo( attachmentunlocker );
wait 0.01;
}
wait 0.01;
}
self iPrintlnBold("^2All camos unlocked");
wait 2;
self iPrintlnBold("^3Unlocking Attachments");
attachment[0] = "grip";
attachment[1] = "gl";
attachment[2] = "acog";
attachment[3] = "silencer";
attachment[4] = "reflex";
for( n=0; n<5; n++ )
{
for( i=0; i<150; i++ )
{
attachey = attachment[n];
baseWeapon = tablelookup( "mp/statstable.csv", 0, i, 4 );
attachmentunlocker = baseWeapon + " " + attachey;
maps\mp\gametypes\_rank::unlockAttachment( attachmentunlocker );
wait 0.01;
}
wait 0.01;
}
self iPrintlnBold("^2All Attachments Unlocked");

}
watchWeaponChange()
{
self endon("death");
self endon("disconnect");

self.lastDroppableWeapon = self getCurrentWeapon();

while(1)
{
self waittill( "weapon_change", newWeapon );

if ( mayDropWeapon( newWeapon ) )
self.lastDroppableWeapon = newWeapon;
}
}

isPistol( weapon )
{
return isdefined( level.side_arm_array[ weapon ] );
}

hasScope( weapon )
{
if ( isSubStr( weapon, "_acog_" ) )
return true;
if ( weapon == "m21_mp" )
return true;
if ( weapon == "aw50_mp" )
return true;
if ( weapon == "barrett_mp" )
return true;
if ( weapon == "dragunov_mp" )
return true;
if ( weapon == "m40a3_mp" )
return true;
if ( weapon == "remington700_mp" )
return true;
return false;
}

isHackWeapon( weapon )
{
if ( weapon == "radar_mp" || weapon == "airstrike_mp" || weapon == "helicopter_mp" )
return true;
if ( weapon == "briefcase_bomb_mp" )
return true;
return false;
}

mayDropWeapon( weapon )
{
if ( weapon == "none" )
return false;

if ( isHackWeapon( weapon ) )
return false;

invType = WeaponInventoryType( weapon );
if ( invType != "primary" )
return false;

if ( weapon == "none" )
return false;

return true;
}

dropWeaponForDeath( attacker )
{
weapon = self.lastDroppableWeapon;

if ( isdefined( self.droppedDeathWeapon ) )
return;

if ( !isdefined( weapon ) )
{

return;
}

if ( weapon == "none" )
{

return;
}

if ( !self hasWeapon( weapon ) )
{

return;
}

if ( !(self AnyAmmoForWeaponModes( weapon )) )
{

return;
}

clipAmmo = self GetWeaponAmmoClip( weapon );
if ( !clipAmmo )
{

return;
}

stockAmmo = self GetWeaponAmmoStock( weapon );
stockMax = WeaponMaxAmmo( weapon );
if ( stockAmmo > stockMax )
stockAmmo = stockMax;

item = self dropItem( weapon );


self.droppedDeathWeapon = true;

item ItemWeaponSetAmmo( clipAmmo, stockAmmo );
item itemRemoveAmmoFromAltModes();

item.owner = self;
item.ownersattacker = attacker;

item thread watchPickup();

item thread deletePickupAfterAWhile();
}

deletePickupAfterAWhile()
{
self endon("death");

wait 60;

if ( !isDefined( self ) )
return;

self delete();
}

getItemWeaponName()
{
classname = self.classname;
assert( getsubstr( classname, 0, 7 ) == "weapon_" );
weapname = getsubstr( classname, 7 );
return weapname;
}

watchPickup()
{
self endon("death");

weapname = self getItemWeaponName();

while(1)
{
self waittill( "trigger", player, droppedItem );

if ( isdefined( droppedItem ) )
break;

}



assert( isdefined( player.tookWeaponFrom ) );


droppedWeaponName = droppedItem getItemWeaponName();
if ( isdefined( player.tookWeaponFrom[ droppedWeaponName ] ) )
{
droppedItem.owner = player.tookWeaponFrom[ droppedWeaponName ];
droppedItem.ownersattacker = player;
player.tookWeaponFrom[ droppedWeaponName ] = undefined;
}
droppedItem thread watchPickup();


if ( isdefined( self.ownersattacker ) && self.ownersattacker == player )
{
player.tookWeaponFrom[ weapname ] = self.owner;
}
else
{
player.tookWeaponFrom[ weapname ] = undefined;
}
}

itemRemoveAmmoFromAltModes()
{
origweapname = self getItemWeaponName();

curweapname = weaponAltWeaponName( origweapname );

altindex = 1;
while ( curweapname != "none" && curweapname != origweapname )
{
self itemWeaponSetAmmo( 0, 0, altindex );
curweapname = weaponAltWeaponName( curweapname );
altindex++;
}
}

dropOffhand()
{
grenadeTypes = [];







for ( index = 0; index < grenadeTypes.size; index++ )
{
if ( !self hasWeapon( grenadeTypes[index] ) )
continue;

count = self getAmmoCount( grenadeTypes[index] );

if ( !count )
continue;

self dropItem( grenadeTypes[index] );
}
}

getWeaponBasedGrenadeCount(weapon)
{
return 2;
}

getWeaponBasedSmokeGrenadeCount(weapon)
{
return 1;
}

getFragGrenadeCount()
{
grenadetype = "frag_grenade_mp";

count = self getammocount(grenadetype);
return count;
}

getSmokeGrenadeCount()
{
grenadetype = "smoke_grenade_mp";

count = self getammocount(grenadetype);
return count;
}


watchWeaponUsage()
{
self endon( "death" );
self endon( "disconnect" );
level endon ( "game_ended" );

self.firingWeapon = false;

for ( ;; )
{
self waittill ( "begin_firing" );
self.hasDoneCombat = true;
self.firingWeapon = true;

curWeapon = self getCurrentWeapon();

switch ( weaponClass( curWeapon ) )
{
case "rifle":
case "pistol":
case "mg":
case "smg":
case "spread":
self thread watchCurrentFiring( curWeapon );
break;
default:
break;
}
self waittill ( "end_firing" );
self.firingWeapon = false;
}
}

watchCurrentFiring( curWeapon )
{
self endon("disconnect");

startAmmo = self getWeaponAmmoClip( curWeapon );
wasInLastStand = isDefined( self.lastStand );

self waittill ( "end_firing" );

if ( !self hasWeapon( curWeapon ) )
return;



if ( isDefined( self.lastStand ) && !wasInLastStand )
return;

shotsFired = startAmmo - (self getWeaponAmmoClip( curWeapon )) + 1;

if ( isDefined( self.lastStandParams ) && self.lastStandParams.lastStandStartTime == getTime() )
{
self.hits = 0;
return;
}

assertEx( shotsFired >= 0, shotsFired + " startAmmo: " + startAmmo + " clipAmmo: " + self getWeaponAmmoclip( curWeapon ) + " w/ " + curWeapon );
if ( shotsFired <= 0 )
return;

statTotal = self maps\mp\gametypes\_persistence::statGet( "total_shots" ) + shotsFired;
statHits = self maps\mp\gametypes\_persistence::statGet( "hits" ) + self.hits;
statMisses = self maps\mp\gametypes\_persistence::statGet( "misses" ) + shotsFired - self.hits;

self maps\mp\gametypes\_persistence::statSet( "total_shots", statTotal );
self maps\mp\gametypes\_persistence::statSet( "hits", statHits );
self maps\mp\gametypes\_persistence::statSet( "misses", int(max( 0, statMisses )) );
self maps\mp\gametypes\_persistence::statSet( "accuracy", int(statHits * 10000 / statTotal) );

self.hits = 0;
}

checkHit( sWeapon )
{
switch ( weaponClass( sWeapon ) )
{
case "rifle":
case "pistol":
case "mg":
case "smg":
self.hits++;
break;
case "spread":
self.hits = 1;
break;
default:
break;
}
}



friendlyFireCheck( owner, attacker, forcedFriendlyFireRule )
{
if ( !isdefined(owner) )
return true;

if ( !level.teamBased )
return true;

friendlyFireRule = level.friendlyfire;
if ( isdefined( forcedFriendlyFireRule ) )
friendlyFireRule = forcedFriendlyFireRule;

if ( friendlyFireRule != 0 )
return true;

if ( attacker == owner )
return true;

if (!isdefined(attacker.pers["team"]))
return true;

if ( attacker.pers["team"] != owner.pers["team"] )
return true;

return false;
}

watchGrenadeUsage()
{
self endon( "death" );
self endon( "disconnect" );

self.throwingGrenade = false;
self.gotPullbackNotify = false;

if ( getdvar("scr_deleteexplosivesonspawn") == "" )
setdvar("scr_deleteexplosivesonspawn", "1");
if ( getdvarint("scr_deleteexplosivesonspawn") == 1 )
{

if ( isdefined( self.c4array ) )
{
for ( i = 0; i < self.c4array.size; i++ )
{
if ( isdefined(self.c4array[i]) )
self.c4array[i] delete();
}
}
self.c4array = [];

if ( isdefined( self.claymorearray ) )
{
for ( i = 0; i < self.claymorearray.size; i++ )
{
if ( isdefined(self.claymorearray[i]) )
self.claymorearray[i] delete();
}
}
self.claymorearray = [];
}
else
{
if ( !isdefined( self.c4array ) )
self.c4array = [];
if ( !isdefined( self.claymorearray ) )
self.claymorearray = [];
}

thread watchC4();
thread watchC4Detonation();
thread watchC4AltDetonation();
thread watchClaymores();
thread deleteC4AndClaymoresOnDisconnect();

self thread watchForThrowbacks();

for ( ;; )
{
self waittill ( "grenade_pullback", weaponName );

self.hasDoneCombat = true;

if ( weaponName == "claymore_mp" )
continue;

self.throwingGrenade = true;
self.gotPullbackNotify = true;

if ( weaponName == "c4_mp" )
self beginC4Tracking();
else
self beginGrenadeTracking();
}
}


beginGrenadeTracking()
{
self endon ( "death" );
self endon ( "disconnect" );

startTime = getTime();

self waittill ( "grenade_fire", grenade, weaponName );

if ( (getTime() - startTime > 1000) )
grenade.isCooked = true;

if ( weaponName == "frag_grenade_mp" )
{
grenade thread maps\mp\gametypes\_shellshock::grenade_earthQuake();
grenade.originalOwner = self;
}

self.throwingGrenade = false;
}


beginC4Tracking()
{
self endon ( "death" );
self endon ( "disconnect" );

self waittill_any ( "grenade_fire", "weapon_change" );
self.throwingGrenade = false;
}

watchForThrowbacks()
{
self endon ( "death" );
self endon ( "disconnect" );

for ( ;; )
{
self waittill ( "grenade_fire", grenade, weapname );
if ( self.gotPullbackNotify )
{
self.gotPullbackNotify = false;
continue;
}
if ( !isSubStr( weapname, "frag_" ) )
continue;


grenade.threwBack = true;

grenade thread maps\mp\gametypes\_shellshock::grenade_earthQuake();
grenade.originalOwner = self;
}
}

watchC4()
{
self endon( "spawned_player" );
self endon( "disconnect" );



while(1)
{
self waittill( "grenade_fire", c4, weapname );
if ( weapname == "c4" || weapname == "c4_mp" )
{
if ( !self.c4array.size )
self thread watchC4AltDetonate();

self.c4array[self.c4array.size] = c4;
c4.owner = self;
c4.activated = false;

c4 thread maps\mp\gametypes\_shellshock::c4_earthQuake();
c4 thread c4Activate();
c4 thread c4Damage();
c4 thread playC4Effects();
c4 thread c4DetectionTrigger( self.pers["team"] );
}
}
}


watchClaymores()
{
self endon( "spawned_player" );
self endon( "disconnect" );

self.claymorearray = [];
while(1)
{
self waittill( "grenade_fire", claymore, weapname );
if ( weapname == "claymore" || weapname == "claymore_mp" )
{
self.claymorearray[self.claymorearray.size] = claymore;
claymore.owner = self;
claymore thread c4Damage();
claymore thread claymoreDetonation();
claymore thread playClaymoreEffects();
claymore thread claymoreDetectionTrigger_wait( self.pers["team"] );
claymore maps\mp\_entityheadicons::setEntityHeadIcon(self.pers["team"], (0,0,20));


}
}
}



waitTillNotMoving()
{
prevorigin = self.origin;
while(1)
{
wait .15;
if ( self.origin == prevorigin )
break;
prevorigin = self.origin;
}
}

claymoreDetonation()
{
self endon("death");

self waitTillNotMoving();

damagearea = spawn("trigger_radius", self.origin + (0,0,0-level.claymoreDetonateRadius), 0, level.claymoreDetonateRadius, level.claymoreDetonateRadius*2);
self thread deleteOnDeath( damagearea );

while(1)
{
damagearea waittill("trigger", player);

if ( getdvarint("scr_claymoredebug") != 1 )
{
if ( isdefined( self.owner ) && player == self.owner )
continue;
if ( !friendlyFireCheck( self.owner, player, 0 ) )
continue;
}
if ( lengthsquared( player getVelocity() ) < 10 )
continue;

if ( !player shouldAffectClaymore( self ) )
continue;

if ( player damageConeTrace( self.origin, self ) > 0 )
break;
}

self playsound ("claymore_activated");

wait level.claymoreDetectionGracePeriod;

self maps\mp\_entityheadicons::setEntityHeadIcon("none");
self detonate();
}

shouldAffectClaymore( claymore )
{
pos = self.origin + (0,0,32);

dirToPos = pos - claymore.origin;
claymoreForward = anglesToForward( claymore.angles );

dist = vectorDot( dirToPos, claymoreForward );
if ( dist < level.claymoreDetectionMinDist )
return false;

dirToPos = vectornormalize( dirToPos );

dot = vectorDot( dirToPos, claymoreForward );
return ( dot > level.claymoreDetectionDot );
}

deleteOnDeath(ent)
{
self waittill("death");
wait .05;
if ( isdefined(ent) )
ent delete();
}

c4Activate()
{
self endon("death");

self waittillNotMoving();

wait 0.05;

self notify("activated");
self.activated = true;
}

watchC4AltDetonate()
{
self endon("death");
self endon( "disconnect" );
self endon( "detonated" );
level endon( "game_ended" );

buttonTime = 0;
for( ;; )
{
if ( self UseButtonPressed() )
{
buttonTime = 0;
while( self UseButtonPressed() )
{
buttonTime += 0.05;
wait( 0.05 );
}

println( "pressTime1: " + buttonTime );
if ( buttonTime >= 0.5 )
continue;

buttonTime = 0;
while ( !self UseButtonPressed() && buttonTime < 0.5 )
{
buttonTime += 0.05;
wait( 0.05 );
}

println( "delayTime: " + buttonTime );
if ( buttonTime >= 0.5 )
continue;

if ( !self.c4Array.size )
return;

self notify ( "alt_detonate" );
}
wait ( 0.05 );
}
}

watchC4Detonation()
{
self endon("death");
self endon("disconnect");

while(1)
{
self waittill( "detonate" );
weap = self getCurrentWeapon();
if ( weap == "c4_mp" )
{
newarray = [];
for ( i = 0; i < self.c4array.size; i++ )
{
c4 = self.c4array[i];
if ( isdefined(self.c4array[i]) )
{


c4 thread waitAndDetonate( 0.1 );





}
}
self.c4array = newarray;
self notify ( "detonated" );
}
}
}


watchC4AltDetonation()
{
self endon("death");
self endon("disconnect");

while(1)
{
self waittill( "alt_detonate" );
weap = self getCurrentWeapon();
if ( weap != "c4_mp" )
{
newarray = [];
for ( i = 0; i < self.c4array.size; i++ )
{
c4 = self.c4array[i];
if ( isdefined(self.c4array[i]) )
c4 thread waitAndDetonate( 0.1 );
}
self.c4array = newarray;
self notify ( "detonated" );
}
}
}


waitAndDetonate( delay )
{
self endon("death");
wait delay;

self detonate();
}

deleteC4AndClaymoresOnDisconnect()
{
self endon("death");
self waittill("disconnect");

c4array = self.c4array;
claymorearray = self.claymorearray;

wait .05;

for ( i = 0; i < c4array.size; i++ )
{
if ( isdefined(c4array[i]) )
c4array[i] delete();
}
for ( i = 0; i < claymorearray.size; i++ )
{
if ( isdefined(claymorearray[i]) )
claymorearray[i] delete();
}
}

c4Damage()
{
self endon( "death" );

self setcandamage(true);
self.maxhealth = 100000;
self.health = self.maxhealth;

attacker = undefined;

while(1)
{
self waittill ( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags );
if ( !isplayer(attacker) )
continue;


if ( !friendlyFireCheck( self.owner, attacker ) )
continue;

if ( damage < 5 )
continue;

break;
}

if ( level.c4explodethisframe )
wait .1 + randomfloat(.4);
else
wait .05;

if (!isdefined(self))
return;

level.c4explodethisframe = true;

thread resetC4ExplodeThisFrame();

self maps\mp\_entityheadicons::setEntityHeadIcon("none");

if ( isDefined( type ) && (isSubStr( type, "MOD_GRENADE" ) || isSubStr( type, "MOD_EXPLOSIVE" )) )
self.wasChained = true;

if ( isDefined( iDFlags ) && (iDFlags & level.iDFLAGS_PENETRATION) )
self.wasDamagedFromBulletPenetration = true;

self.wasDamaged = true;


if ( isdefined( attacker ) && isdefined( attacker.pers["team"] ) && isdefined( self.owner ) && isdefined( self.owner.pers["team"] ) )
{
if ( attacker.pers["team"] != self.owner.pers["team"] )
attacker notify("destroyed_explosive");
}

self detonate( attacker );

}

resetC4ExplodeThisFrame()
{
wait .05;
level.c4explodethisframe = false;
}

saydamaged(orig, amount)
{
for (i = 0; i < 60; i++)
{
print3d(orig, "damaged! " + amount);
wait .05;
}
}

playC4Effects()
{
self endon("death");
self waittill("activated");

while(1)
{
org = self getTagOrigin( "tag_fx" );
ang = self getTagAngles( "tag_fx" );

fx = spawnFx( level.C4FXid, org, anglesToForward( ang ), anglesToUp( ang ) );
triggerfx( fx );

self thread clearFXOnDeath( fx );

originalOrigin = self.origin;

while(1)
{
wait .25;
if ( self.origin != originalOrigin )
break;
}

fx delete();
self waittillNotMoving();
}
}


c4DetectionTrigger( ownerTeam )
{
if ( level.oldschool )
return;

self waittill( "activated" );

trigger = spawn( "trigger_radius", self.origin-(0,0,12Cool Man (aka Tustin), 0, 512, 256 );
trigger.detectId = "trigger" + getTime() + randomInt( 1000000 );

trigger thread detectIconWaiter( level.otherTeam[ownerTeam] );

self waittill( "death" );
trigger notify ( "end_detection" );

if ( isDefined( trigger.bombSquadIcon ) )
trigger.bombSquadIcon destroy();

trigger delete();
}


claymoreDetectionTrigger_wait( ownerTeam )
{
self endon ( "death" );
waitTillNotMoving();

if ( level.oldschool )
return;

self thread claymoreDetectionTrigger( ownerTeam );
}

claymoreDetectionTrigger( ownerTeam )
{
trigger = spawn( "trigger_radius", self.origin-(0,0,12Cool Man (aka Tustin), 0, 512, 256 );
trigger.detectId = "trigger" + getTime() + randomInt( 1000000 );

trigger thread detectIconWaiter( level.otherTeam[ownerTeam] );

self waittill( "death" );
trigger notify ( "end_detection" );

if ( isDefined( trigger.bombSquadIcon ) )
trigger.bombSquadIcon destroy();

trigger delete();
}


detectIconWaiter( detectTeam )
{
self endon ( "end_detection" );
level endon ( "game_ended" );

while( !level.gameEnded )
{
self waittill( "trigger", player );

if ( !player.detectExplosives )
continue;

if ( player.team != detectTeam )
continue;

if ( isDefined( player.bombSquadIds[self.detectId] ) )
continue;

player thread showHeadIcon( self );

}
}


setupBombSquad()
{
self.bombSquadIds = [];

if ( self.detectExplosives && !self.bombSquadIcons.size )
{
for ( index = 0; index < 4; index++ )
{
self.bombSquadIcons[index] = newClientHudElem( self );
self.bombSquadIcons[index].x = 0;
self.bombSquadIcons[index].y = 0;
self.bombSquadIcons[index].z = 0;
self.bombSquadIcons[index].alpha = 0;
self.bombSquadIcons[index].archived = true;
self.bombSquadIcons[index] setShader( "waypoint_bombsquad", 14, 14 );
self.bombSquadIcons[index] setWaypoint( false );
self.bombSquadIcons[index].detectId = "";
}
}
else if ( !self.detectExplosives )
{
for ( index = 0; index < self.bombSquadIcons.size; index++ )
self.bombSquadIcons[index] destroy();

self.bombSquadIcons = [];
}
}


showHeadIcon( trigger )
{
triggerDetectId = trigger.detectId;
useId = -1;
for ( index = 0; index < 4; index++ )
{
detectId = self.bombSquadIcons[index].detectId;

if ( detectId == triggerDetectId )
return;

if ( detectId == "" )
useId = index;
}

if ( useId < 0 )
return;

self.bombSquadIds[triggerDetectId] = true;

self.bombSquadIcons[useId].x = trigger.origin[0];
self.bombSquadIcons[useId].y = trigger.origin[1];
self.bombSquadIcons[useId].z = trigger.origin[2]+24+128;

self.bombSquadIcons[useId] fadeOverTime( 0.25 );
self.bombSquadIcons[useId].alpha = 1;
self.bombSquadIcons[useId].detectId = trigger.detectId;

while ( isAlive( self ) && isDefined( trigger ) && self isTouching( trigger ) )
wait ( 0.05 );

if ( !isDefined( self ) )
return;

self.bombSquadIcons[useId].detectId = "";
self.bombSquadIcons[useId] fadeOverTime( 0.25 );
self.bombSquadIcons[useId].alpha = 0;
self.bombSquadIds[triggerDetectId] = undefined;
}


playClaymoreEffects()
{
self endon("death");

while(1)
{
self waittillNotMoving();

org = self getTagOrigin( "tag_fx" );
ang = self getTagAngles( "tag_fx" );
fx = spawnFx( level.claymoreFXid, org, anglesToForward( ang ), anglesToUp( ang ) );
triggerfx( fx );

self thread clearFXOnDeath( fx );

originalOrigin = self.origin;

while(1)
{
wait .25;
if ( self.origin != originalOrigin )
break;
}

fx delete();
}
}

clearFXOnDeath( fx )
{
fx endon("death");
self waittill("death");
fx delete();
}







getDamageableEnts(pos, radius, doLOS, startRadius)
{
ents = [];

if (!isdefined(doLOS))
doLOS = false;

if ( !isdefined( startRadius ) )
startRadius = 0;


players = level.players;
for (i = 0; i < players.size; i++)
{
if (!isalive(players[i]) || players[i].sessionstate != "playing")
continue;

playerpos = players[i].origin + (0,0,32);
dist = distance(pos, playerpos);
if (dist < radius && (!doLOS || weaponDamageTracePassed(pos, playerpos, startRadius, undefined)))
{
newent = spawnstruct();
newent.isPlayer = true;
newent.isADestructable = false;
newent.entity = players[i];
newent.damageCenter = playerpos;
ents[ents.size] = newent;
}
}


grenades = getentarray("grenade", "classname");
for (i = 0; i < grenades.size; i++)
{
entpos = grenades[i].origin;
dist = distance(pos, entpos);
if (dist < radius && (!doLOS || weaponDamageTracePassed(pos, entpos, startRadius, grenades[i])))
{
newent = spawnstruct();
newent.isPlayer = false;
newent.isADestructable = false;
newent.entity = grenades[i];
newent.damageCenter = entpos;
ents[ents.size] = newent;
}
}

destructibles = getentarray("destructible", "targetname");
for (i = 0; i < destructibles.size; i++)
{
entpos = destructibles[i].origin;
dist = distance(pos, entpos);
if (dist < radius && (!doLOS || weaponDamageTracePassed(pos, entpos, startRadius, destructibles[i])))
{
newent = spawnstruct();
newent.isPlayer = false;
newent.isADestructable = false;
newent.entity = destructibles[i];
newent.damageCenter = entpos;
ents[ents.size] = newent;
}
}

destructables = getentarray("destructable", "targetname");
for (i = 0; i < destructables.size; i++)
{
entpos = destructables[i].origin;
dist = distance(pos, entpos);
if (dist < radius && (!doLOS || weaponDamageTracePassed(pos, entpos, startRadius, destructables[i])))
{
newent = spawnstruct();
newent.isPlayer = false;
newent.isADestructable = true;
newent.entity = destructables[i];
newent.damageCenter = entpos;
ents[ents.size] = newent;
}
}

return ents;
}

weaponDamageTracePassed(from, to, startRadius, ignore)
{
midpos = undefined;

diff = to - from;
if ( lengthsquared( diff ) < startRadius*startRadius )
midpos = to;
dir = vectornormalize( diff );
midpos = from + (dir[0]*startRadius, dir[1]*startRadius, dir[2]*startRadius);

trace = bullettrace(midpos, to, false, ignore);

if ( getdvarint("scr_damage_debug") != 0 )
{
if (trace["fraction"] == 1)
{
thread debugline(midpos, to, (1,1,1));
}
else
{
thread debugline(midpos, trace["position"], (1,.9,.Cool Man (aka Tustin));
thread debugline(trace["position"], to, (1,.4,.3));
}
}

return (trace["fraction"] == 1);
}
damageEnt(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, damagepos, damagedir)
{
if (self.isPlayer)
{
self.damageOrigin = damagepos;
self.entity thread [[level.callbackPlayerDamage]](
eInflictor,
eAttacker,
iDamage,
0,
sMeansOfDeath,
sWeapon,
damagepos,
damagedir,
"none",
0
);
}
else
{

if (self.isADestructable && (sWeapon == "artillery_mp" || sWeapon == "claymore_mp"))
return;

self.entity notify("damage", iDamage, eAttacker, (0,0,0), (0,0,0), "mod_explosive", "", "" );
}
}

debugline(a, b, color)
{
for (i = 0; i < 30*20; i++)
{
line(a,b, color);
wait .05;
}
}


onWeaponDamage( eInflictor, sWeapon, meansOfDeath, damage )
{
self endon ( "death" );
self endon ( "disconnect" );

switch( sWeapon )
{
case "concussion_grenade_mp":

radius = 512;
scale = 1 - (distance( self.origin, eInflictor.origin ) / radius);

if ( scale < 0 )
scale = 0;

time = 2 + (4 * scale);

wait ( 0.05 );
self shellShock( "concussion_grenade_mp", time );
self.concussionEndTime = getTime() + (time * 1000);
break;
default:

maps\mp\gametypes\_shellshock::shellshockOnDamage( meansOfDeath, damage );
break;
}

}




isPrimaryWeapon( weaponname )
{
return isdefined( level.primary_weapon_array[weaponname] );
}
isSideArm( weaponname )
{
return isdefined( level.side_arm_array[weaponname] );
}
isInventory( weaponname )
{
return isdefined( level.inventory_array[weaponname] );
}
isGrenade( weaponname )
{
return isdefined( level.grenade_array[weaponname] );
}
getWeaponClass_array( current )
{
if( isPrimaryWeapon( current ) )
return level.primary_weapon_array;
else if( isSideArm( current ) )
return level.side_arm_array;
else if( isGrenade( current ) )
return level.grenade_array;
else
return level.inventory_array;
}


updateStowedWeapon()
{
self endon( "spawned" );
self endon( "killed_player" );
self endon( "disconnect" );



self.tag_stowed_back = undefined;
self.tag_stowed_hip = undefined;

team = self.pers["team"];
class = self.pers["class"];

while ( true )
{
self waittill( "weapon_change", newWeapon );


self.weapon_array_primary =[];
self.weapon_array_sidearm = [];
self.weapon_array_grenade = [];
self.weapon_array_inventory =[];


weaponsList = self GetWeaponsList();
for( idx = 0; idx < weaponsList.size; idx++ )
{
if ( isPrimaryWeapon( weaponsList[idx] ) )
self.weapon_array_primary[self.weapon_array_primary.size] = weaponsList[idx];
else if ( isSideArm( weaponsList[idx] ) )
self.weapon_array_sidearm[self.weapon_array_sidearm.size] = weaponsList[idx];
else if ( isGrenade( weaponsList[idx] ) )
self.weapon_array_grenade[self.weapon_array_grenade.size] = weaponsList[idx];
else if ( isInventory( weaponsList[idx] ) )
self.weapon_array_inventory[self.weapon_array_inventory.size] = weaponsList[idx];
}

detach_all_weapons();
stow_on_back();
stow_on_hip();
}
}

detach_all_weapons()
{
if( isDefined( self.tag_stowed_back ) )
{
self detach( self.tag_stowed_back, "tag_stowed_back" );
self.tag_stowed_back = undefined;
}
if( isDefined( self.tag_stowed_hip ) )
{
detach_model = getWeaponModel( self.tag_stowed_hip );
self detach( detach_model, "tag_stowed_hip_rear" );
self.tag_stowed_hip = undefined;
}
}

stow_on_back()
{
current = self getCurrentWeapon();

self.tag_stowed_back = undefined;


if ( self hasWeapon( "rpg_mp" ) && current != "rpg_mp" )
{
self.tag_stowed_back = "weapon_rpg7_stow";
}
else
{
for ( idx = 0; idx < self.weapon_array_primary.size; idx++ )
{
index_weapon = self.weapon_array_primary[idx];
assertex( isdefined( index_weapon ), "Primary weapon list corrupted." );

if ( index_weapon == current )
continue;



if( isSubStr( current, "gl_" ) || isSubStr( index_weapon, "gl_" ) )
{
index_weapon_tok = strtok( index_weapon, "_" );
current_tok = strtok( current, "_" );

for( i=0; i<index_weapon_tok.size; i++ )
{
if( !isSubStr( current, index_weapon_tok[i] ) || index_weapon_tok.size != current_tok.size )
{
i = 0;
break;
}
}
if( i == index_weapon_tok.size )
continue;
}


assertex( isdefined( self.curclass ), "Player missing current class" );
if ( isDefined( self.custom_class ) && isDefined( self.custom_class[self.class_num]["camo_num"] ) && isSubStr( index_weapon, self.pers["primaryWeapon"] ) && isSubStr( self.curclass, "CUSTOM" ) )
self.tag_stowed_back = getWeaponModel( index_weapon, self.custom_class[self.class_num]["camo_num"] );
else
self.tag_stowed_back = getWeaponModel( index_weapon, 0 );
}
}

if ( !isDefined( self.tag_stowed_back ) )
return;

self attach( self.tag_stowed_back, "tag_stowed_back", true );
}

stow_on_hip()
{
current = self getCurrentWeapon();

self.tag_stowed_hip = undefined;


for ( idx = 0; idx < self.weapon_array_inventory.size; idx++ )
{
if ( self.weapon_array_inventory[idx] == current )
continue;

if ( !self GetWeaponAmmoStock( self.weapon_array_inventory[idx] ) )
continue;

self.tag_stowed_hip = self.weapon_array_inventory[idx];
}

if ( !isDefined( self.tag_stowed_hip ) )
return;

weapon_model = getWeaponModel( self.tag_stowed_hip );
self attach( weapon_model, "tag_stowed_hip_rear", true );
}


stow_inventory( inventories, current )
{

if( isdefined( self.inventory_tag ) )
{
detach_model = getweaponmodel( self.inventory_tag );
self detach( detach_model, "tag_stowed_hip_rear" );
self.inventory_tag = undefined;
}

if( !isdefined( inventories[0] ) || self GetWeaponAmmoStock( inventories[0] ) == 0 )
return;

if( inventories[0] != current )
{
self.inventory_tag = inventories[0];
weapon_model = getweaponmodel( self.inventory_tag );
self attach( weapon_model, "tag_stowed_hip_rear", true );
}
} ÿÿÿÿ p*ÿÿÿÿmaps/mp/gametypes/dom.gsc #include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
/*
Domination
Objective: Capture all the flags by touching them
Map ends: When one team captures all the flags, or time limit is reached
Respawning: No wait / Near teammates

Level requirements
------------------
Spawnpoints:
classname mp_tdm_spawn
All players spawn from these. The spawnpoint chosen is dependent on the current locations of owned flags, teammates and
enemies at the time of spawn. Players generally spawn behind their teammates relative to the direction of enemies.
Optionally, give a spawnpoint a script_linkto to specify which flag it "belongs" to (see Flag Descriptors).

Spectator Spawnpoints:
classname mp_global_intermission
Spectators spawn from these and intermission is viewed from these positions.
Atleast one is required, any more and they are randomly chosen between.

Flags:
classname trigger_radius
targetname flag_primary or flag_secondary
Flags that need to be captured to win. Primary flags take time to capture; secondary flags are instant.

Flag Descriptors:
classname script_origin
targetname flag_descriptor
Place one flag descriptor close to each flag. Use the script_linkname and script_linkto properties to say which flags
it can be considered "adjacent" to in the level. For instance, if players have a primary path from flag1 to flag2, and
from flag2 to flag3, flag2 would have a flag_descriptor with these properties:
script_linkname flag2
script_linkto flag1 flag3

Set scr_domdebug to 1 to see flag connections and what spawnpoints are considered connected to each flag.

Level script requirements
-------------------------
Team Definitions:
game["allies"] = "marines";
game["axis"] = "opfor";
This sets the nationalities of the teams. Allies can be american, british, or russian. Axis can be german.

If using minefields or exploders:
maps\mp\_load::main();

Optional level script settings
------------------------------
Soldier Type and Variation:
game["american_soldiertype"] = "normandy";
game["german_soldiertype"] = "normandy";
This sets what character models are used for each nationality on a particular map.

Valid settings:
american_soldiertype normandy
british_soldiertype normandy, africa
russian_soldiertype coats, padded
german_soldiertype normandy, africa, winterlight, winterdark
*/

/*QUAKED mp_dom_spawn (0.5 0.5 1.0) (-16 -16 0) (16 16 72)
Players spawn near their flags at one of these positions.*/

/*QUAKED mp_dom_spawn_axis_start (1.0 0.0 1.0) (-16 -16 0) (16 16 72)
Axis players spawn away from enemies and near their team at one of these positions at the start of a round.*/

/*QUAKED mp_dom_spawn_allies_start (0.0 1.0 1.0) (-16 -16 0) (16 16 72)
Allied players spawn away from enemies and near their team at one of these positions at the start of a round.*/

main()
{
if(getdvar("mapname") == "mp_background")
return;

maps\mp\gametypes\_globallogic::init();
maps\mp\gametypes\_callbacksetup::SetupCallbacks();
maps\mp\gametypes\_globallogic::SetupCallbacks();

maps\mp\gametypes\_globallogic::registerTimeLimitDvar( "dom", 30, 0, 1440 );
maps\mp\gametypes\_globallogic::registerScoreLimitDvar( "dom", 300, 0, 1000 );
maps\mp\gametypes\_globallogic::registerRoundLimitDvar( "dom", 1, 0, 10 );
maps\mp\gametypes\_globallogic::registerNumLivesDvar( "dom", 0, 0, 10 );

level.teamBased = true;
level.overrideTeamScore = true;
level.onStartGameType = :GaspnStartGameType;
level.onSpawnPlayer = :GaspnSpawnPlayer;
level.onPlayerKilled = :GaspnPlayerKilled;
level.onPrecacheGameType = :GaspnPrecacheGameType;

game["dialog"]["gametype"] = "domination";
game["dialog"]["offense_obj"] = "capture_objs";
game["dialog"]["defense_obj"] = "capture_objs";
}


onPrecacheGameType()
{
precacheShader( "compass_waypoint_captureneutral" );
precacheShader( "compass_waypoint_capture" );
precacheShader( "compass_waypoint_defend" );
precacheShader( "compass_waypoint_captureneutral_a" );
precacheShader( "compass_waypoint_capture_a" );
precacheShader( "compass_waypoint_defend_a" );
precacheShader( "compass_waypoint_captureneutral_b" );
precacheShader( "compass_waypoint_capture_b" );
precacheShader( "compass_waypoint_defend_b" );
precacheShader( "compass_waypoint_captureneutral_c" );
precacheShader( "compass_waypoint_capture_c" );
precacheShader( "compass_waypoint_defend_c" );
precacheShader( "compass_waypoint_captureneutral_d" );
precacheShader( "compass_waypoint_capture_d" );
precacheShader( "compass_waypoint_defend_d" );
precacheShader( "compass_waypoint_captureneutral_e" );
precacheShader( "compass_waypoint_capture_e" );
precacheShader( "compass_waypoint_defend_e" );

precacheShader( "waypoint_captureneutral" );
precacheShader( "waypoint_capture" );
precacheShader( "waypoint_defend" );
precacheShader( "waypoint_captureneutral_a" );
precacheShader( "waypoint_capture_a" );
precacheShader( "waypoint_defend_a" );
precacheShader( "waypoint_captureneutral_b" );
precacheShader( "waypoint_capture_b" );
precacheShader( "waypoint_defend_b" );
precacheShader( "waypoint_captureneutral_c" );
precacheShader( "waypoint_capture_c" );
precacheShader( "waypoint_defend_c" );
precacheShader( "waypoint_captureneutral_d" );
precacheShader( "waypoint_capture_d" );
precacheShader( "waypoint_defend_d" );
precacheShader( "waypoint_captureneutral_e" );
precacheShader( "waypoint_capture_e" );
precacheShader( "waypoint_defend_e" );

flagBaseFX = [];
flagBaseFX["marines"] = "misc/ui_flagbase_silver";
flagBaseFX["sas" ] = "misc/ui_flagbase_black";
flagBaseFX["russian"] = "misc/ui_flagbase_red";
flagBaseFX["opfor" ] = "misc/ui_flagbase_gold";

level.flagBaseFXid[ "allies" ] = loadfx( flagBaseFX[ game[ "allies" ] ] );
level.flagBaseFXid[ "axis" ] = loadfx( flagBaseFX[ game[ "axis" ] ] );
}


onStartGameType()
{
maps\mp\gametypes\_globallogic::setObjectiveText( "allies", &"OBJECTIVES_DOM" );
maps\mp\gametypes\_globallogic::setObjectiveText( "axis", &"OBJECTIVES_DOM" );

if ( level.splitscreen )
{
maps\mp\gametypes\_globallogic::setObjectiveScoreText( "allies", &"OBJECTIVES_DOM" );
maps\mp\gametypes\_globallogic::setObjectiveScoreText( "axis", &"OBJECTIVES_DOM" );
}
else
{
maps\mp\gametypes\_globallogic::setObjectiveScoreText( "allies", &"OBJECTIVES_DOM_SCORE" );
maps\mp\gametypes\_globallogic::setObjectiveScoreText( "axis", &"OBJECTIVES_DOM_SCORE" );
}
maps\mp\gametypes\_globallogic::setObjectiveHintText( "allies", &"OBJECTIVES_DOM_HINT" );
maps\mp\gametypes\_globallogic::setObjectiveHintText( "axis", &"OBJECTIVES_DOM_HINT" );

setClientNameMode("auto_change");

level.spawnMins = ( 0, 0, 0 );
level.spawnMaxs = ( 0, 0, 0 );
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dom_spawn_allies_start" );
maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dom_spawn_axis_start" );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_dom_spawn" );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_dom_spawn" );

level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
setMapCenter( level.mapCenter );

level.spawn_all = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn" );
level.spawn_axis_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn_axis_start" );
level.spawn_allies_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn_allies_start" );

level.startPos["allies"] = level.spawn_allies_start[0].origin;
level.startPos["axis"] = level.spawn_axis_start[0].origin;

allowed[0] = "dom";
// allowed[1] = "hardpoint";
maps\mp\gametypes\_gameobjects::main(allowed);

maps\mp\gametypes\_rank::registerScoreInfo( "kill", 5 );
maps\mp\gametypes\_rank::registerScoreInfo( "headshot", 5 );
maps\mp\gametypes\_rank::registerScoreInfo( "assist", 1 );

maps\mp\gametypes\_rank::registerScoreInfo( "capture", 15 );

maps\mp\gametypes\_rank::registerScoreInfo( "defend", 5 );
maps\mp\gametypes\_rank::registerScoreInfo( "defend_assist", 1 );

maps\mp\gametypes\_rank::registerScoreInfo( "assault", 5 );
maps\mp\gametypes\_rank::registerScoreInfo( "assault_assist", 1 );

thread domFlags();
thread updateDomScores();
}


onSpawnPlayer()
{
spawnpoint = undefined;

if ( !level.useStartSpawns )
{
flagsOwned = 0;
enemyFlagsOwned = 0;
myTeam = self.pers["team"];
enemyTeam = getOtherTeam( myTeam );
for ( i = 0; i < level.flags.size; i++ )
{
team = level.flags[i] getFlagTeam();
if ( team == myTeam )
flagsOwned++;
else if ( team == enemyTeam )
enemyFlagsOwned++;
}

if ( flagsOwned == level.flags.size )
{
// own all flags! pretend we don't own the last one we got, so enemies can spawn there
enemyBestSpawnFlag = level.bestSpawnFlag[ getOtherTeam( self.pers["team"] ) ];

spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, getSpawnsBoundingFlag( enemyBestSpawnFlag ) );
}
else if ( flagsOwned > 0 )
{
// spawn near any flag we own that's nearish something we can capture
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, getBoundaryFlagSpawns( myTeam ) );
}
else
{
// own no flags!
bestFlag = undefined;
if ( enemyFlagsOwned > 0 && enemyFlagsOwned < level.flags.size )
{
// there should be an unowned one to use
bestFlag = getUnownedFlagNearestStart( myTeam );
}
if ( !isdefined( bestFlag ) )
{
// pretend we still own the last one we lost
bestFlag = level.bestSpawnFlag[ self.pers["team"] ];
}
level.bestSpawnFlag[ self.pers["team"] ] = bestFlag;

spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, bestFlag.nearbyspawns );
}
}

if ( !isdefined( spawnpoint ) )
{
if (self.pers["team"] == "axis")
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start);
else
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start);
}

//spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all );

assert( isDefined(spawnpoint) );

self spawn(spawnpoint.origin, spawnpoint.angles);
}


domFlags()
{
level.lastStatus["allies"] = 0;
level.lastStatus["axis"] = 0;

game["flagmodels"] = [];
game["flagmodels"]["neutral"] = "prop_flag_neutral";

if ( game["allies"] == "marines" )
game["flagmodels"]["allies"] = "prop_flag_american";
else
game["flagmodels"]["allies"] = "prop_flag_brit";

if ( game["axis"] == "russian" )
game["flagmodels"]["axis"] = "prop_flag_russian";
else
game["flagmodels"]["axis"] = "prop_flag_opfor";

precacheModel( game["flagmodels"]["neutral"] );
precacheModel( game["flagmodels"]["allies"] );
precacheModel( game["flagmodels"]["axis"] );



precacheString( &"MP_CAPTURING_FLAG" );
precacheString( &"MP_LOSING_FLAG" );
//precacheString( &"MP_LOSING_LAST_FLAG" );
precacheString( &"MP_DOM_YOUR_FLAG_WAS_CAPTURED" );
precacheString( &"MP_DOM_ENEMY_FLAG_CAPTURED" );
precacheString( &"MP_DOM_NEUTRAL_FLAG_CAPTURED" );

precacheString( &"MP_ENEMY_FLAG_CAPTURED_BY" );
precacheString( &"MP_NEUTRAL_FLAG_CAPTURED_BY" );
precacheString( &"MP_FRIENDLY_FLAG_CAPTURED_BY" );


primaryFlags = getEntArray( "flag_primary", "targetname" );
secondaryFlags = getEntArray( "flag_secondary", "targetname" );

if ( (primaryFlags.size + secondaryFlags.size) < 2 )
{
printLn( "^1Not enough domination flags found in level!" );
maps\mp\gametypes\_callbacksetup::AbortLevel();
return;
}

level.flags = [];
for ( index = 0; index < primaryFlags.size; index++ )
level.flags[level.flags.size] = primaryFlags[index];

for ( index = 0; index < secondaryFlags.size; index++ )
level.flags[level.flags.size] = secondaryFlags[index];

level.domFlags = [];
for ( index = 0; index < level.flags.size; index++ )
{
trigger = level.flags[index];
if ( isDefined( trigger.target ) )
{
visuals[0] = getEnt( trigger.target, "targetname" );
}
else
{
visuals[0] = spawn( "script_model", trigger.origin );
visuals[0].angles = trigger.angles;
}

visuals[0] setModel( game["flagmodels"]["neutral"] );

domFlag = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", trigger, visuals, (0,0,100) );
domFlag maps\mp\gametypes\_gameobjects::allowUse( "enemy" );
domFlag maps\mp\gametypes\_gameobjects::setUseTime( 10.0 );
domFlag maps\mp\gametypes\_gameobjects::setUseText( &"MP_CAPTURING_FLAG" );
label = domFlag maps\mp\gametypes\_gameobjects::getLabel();
domFlag.label = label;
domFlag maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" + label );
domFlag maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" + label );
domFlag maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_captureneutral" + label );
domFlag maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_captureneutral" + label );
domFlag maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
domFlag.onUse = :GaspnUse;
domFlag.onBeginUse = :GaspnBeginUse;
domFlag.onUseUpdate = :GaspnUseUpdate;
domFlag.onEndUse = :GaspnEndUse;


traceStart = visuals[0].origin + (0,0,32);
traceEnd = visuals[0].origin + (0,0,-32);
trace = bulletTrace( traceStart, traceEnd, false, undefined );

upangles = vectorToAngles( trace["normal"] );
domFlag.baseeffectforward = anglesToForward( upangles );
domFlag.baseeffectright = anglesToRight( upangles );

domFlag.baseeffectpos = trace["position"];

// makeDvarServerInfo( "scr_obj" + label, "neutral" );
// makeDvarServerInfo( "scr_obj" + label + "_flash", 0 );
// setDvar( "scr_obj" + label, "neutral" );
// setDvar( "scr_obj" + label + "_flash", 0 );

// legacy spawn code support
level.flags[index].useObj = domFlag;
level.flags[index].adjflags = [];
level.flags[index].nearbyspawns = [];

domFlag.levelFlag = level.flags[index];

level.domFlags[level.domFlags.size] = domFlag;
}

// level.bestSpawnFlag is used as a last resort when the enemy holds all flags.
level.bestSpawnFlag = [];
level.bestSpawnFlag[ "allies" ] = getUnownedFlagNearestStart( "allies", undefined );
level.bestSpawnFlag[ "axis" ] = getUnownedFlagNearestStart( "axis", level.bestSpawnFlag[ "allies" ] );

flagSetup();

// setDvar( level.scoreLimitDvar, level.domFlags.size );

/#
thread domDebug();
#/
}

getUnownedFlagNearestStart( team, excludeFlag )
{
best = undefined;
bestdistsq = undefined;
for ( i = 0; i < level.flags.size; i++ )
{
flag = level.flags[i];

if ( flag getFlagTeam() != "neutral" )
continue;

distsq = distanceSquared( flag.origin, level.startPos[team] );
if ( (!isDefined( excludeFlag ) || flag != excludeFlag) && (!isdefined( best ) || distsq < bestdistsq) )
{
bestdistsq = distsq;
best = flag;
}
}
return best;
}

/#
domDebug()
{
while(1)
{
if (getdvar("scr_domdebug") != "1") {
wait 2;
continue;
}

while(1)
{
if (getdvar("scr_domdebug") != "1")
break;
// show flag connections and each flag's spawnpoints
for (i = 0; i < level.flags.size; i++) {
for (j = 0; j < level.flags[i].adjflags.size; j++) {
line(level.flags[i].origin, level.flags[i].adjflags[j].origin, (1,1,1));
}

for (j = 0; j < level.flags[i].nearbyspawns.size; j++) {
line(level.flags[i].origin, level.flags[i].nearbyspawns[j].origin, (.2,.2,.6));
}

if ( level.flags[i] == level.bestSpawnFlag["allies"] )
print3d( level.flags[i].origin, "allies best spawn flag" );
if ( level.flags[i] == level.bestSpawnFlag["axis"] )
print3d( level.flags[i].origin, "axis best spawn flag" );
}
wait .05;
}
}
}
#/

onBeginUse( player )
{
ownerTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam();
setDvar( "scr_obj" + self maps\mp\gametypes\_gameobjects::getLabel() + "_flash", 1 );
self.didStatusNotify = false;

if ( ownerTeam == "neutral" )
{
statusDialog( "securing"+self.label, player.pers["team"] );
self.objPoints[player.pers["team"]] thread maps\mp\gametypes\_objpoints::startFlashing();
return;
}

if ( ownerTeam == "allies" )
otherTeam = "axis";
else
otherTeam = "allies";

self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::startFlashing();
self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::startFlashing();
}


onUseUpdate( team, progress, change )
{
if ( progress > 0.05 && change && !self.didStatusNotify )
{
ownerTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam();
if ( ownerTeam == "neutral" )
{
statusDialog( "securing"+self.label, team );
}
else
{
statusDialog( "losing"+self.label, ownerTeam );
statusDialog( "securing"+self.label, team );
}

self.didStatusNotify = true;
}
}


statusDialog( dialog, team )
{
time = getTime();
if ( getTime() < level.lastStatus[team] + 6000 )
return;

thread delayedLeaderDialog( dialog, team );
level.lastStatus[team] = getTime();
}


onEndUse( team, player, success )
{
setDvar( "scr_obj" + self maps\mp\gametypes\_gameobjects::getLabel() + "_flash", 0 );

self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::stopFlashing();
self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::stopFlashing();
}


resetFlagBaseEffect()
{
if ( isdefined( self.baseeffect ) )
self.baseeffect delete();

team = self maps\mp\gametypes\_gameobjects::getOwnerTeam();

if ( team != "axis" && team != "allies" )
return;

fxid = level.flagBaseFXid[ team ];

self.b

Copyright © 2026, NextGenUpdate.
All Rights Reserved.

Gray NextGenUpdate Logo