diff --git a/BO1/PC/ZM/aim_assist/view_input_0.graph b/BO1/PC/ZM/aim_assist/view_input_0.graph new file mode 100644 index 0000000..2d775ec --- /dev/null +++ b/BO1/PC/ZM/aim_assist/view_input_0.graph @@ -0,0 +1,18 @@ +GRAPH_FLOAT_FILE + +15 +0.0000 0.0000 +0.1218 0.0171 +0.1972 0.0295 +0.2612 0.0451 +0.3244 0.0644 +0.3872 0.0897 +0.4543 0.1281 +0.5149 0.1729 +0.5723 0.2203 +0.6263 0.2771 +0.6771 0.3483 +0.7288 0.4296 +0.7781 0.5157 +0.8387 0.6301 +1.0000 1.0000 diff --git a/BO1/PC/ZM/aim_assist/view_input_1.graph b/BO1/PC/ZM/aim_assist/view_input_1.graph new file mode 100644 index 0000000..b50cb83 --- /dev/null +++ b/BO1/PC/ZM/aim_assist/view_input_1.graph @@ -0,0 +1,16 @@ +GRAPH_FLOAT_FILE + +13 +0.0000 0.0000 +0.1323 0.0235 +0.2102 0.0469 +0.2939 0.0778 +0.3741 0.1170 +0.4555 0.1724 +0.5401 0.2400 +0.6118 0.3149 +0.6726 0.4018 +0.7268 0.4906 +0.7797 0.5833 +0.8386 0.6926 +1.0000 1.0000 diff --git a/BO1/PC/ZM/aim_assist/view_input_2.graph b/BO1/PC/ZM/aim_assist/view_input_2.graph new file mode 100644 index 0000000..9692037 --- /dev/null +++ b/BO1/PC/ZM/aim_assist/view_input_2.graph @@ -0,0 +1,15 @@ +GRAPH_FLOAT_FILE + +12 +0.0000 0.0000 +0.1322 0.0396 +0.2338 0.0780 +0.3235 0.1267 +0.4022 0.1812 +0.4809 0.2479 +0.5561 0.3254 +0.6205 0.3936 +0.6930 0.4771 +0.7819 0.5943 +0.8598 0.7299 +1.0000 1.0000 diff --git a/BO1/PC/ZM/aim_assist/view_input_3.graph b/BO1/PC/ZM/aim_assist/view_input_3.graph new file mode 100644 index 0000000..1fe0a67 --- /dev/null +++ b/BO1/PC/ZM/aim_assist/view_input_3.graph @@ -0,0 +1,10 @@ +GRAPH_FLOAT_FILE + +7 +0.0000 0.0000 +0.1242 0.0423 +0.2238 0.0885 +0.3210 0.1553 +0.4118 0.2419 +0.5116 0.3508 +1.0000 1.0000 diff --git a/BO1/PC/ZM/aitype/axis_zombie_jp_swamp.gsc b/BO1/PC/ZM/aitype/axis_zombie_jp_swamp.gsc new file mode 100644 index 0000000..911c9f8 Binary files /dev/null and b/BO1/PC/ZM/aitype/axis_zombie_jp_swamp.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_coast_zombie_barechest.gsc b/BO1/PC/ZM/aitype/zombie_coast_zombie_barechest.gsc new file mode 100644 index 0000000..c87829d Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_coast_zombie_barechest.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_coast_zombie_scuba.gsc b/BO1/PC/ZM/aitype/zombie_coast_zombie_scuba.gsc new file mode 100644 index 0000000..6339e45 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_coast_zombie_scuba.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_coast_zombie_soldier.gsc b/BO1/PC/ZM/aitype/zombie_coast_zombie_soldier.gsc new file mode 100644 index 0000000..fe02a13 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_coast_zombie_soldier.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_director_romero.gsc b/BO1/PC/ZM/aitype/zombie_director_romero.gsc new file mode 100644 index 0000000..4ca94ff Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_director_romero.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_dog.gsc b/BO1/PC/ZM/aitype/zombie_dog.gsc new file mode 100644 index 0000000..46379e0 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_dog.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_engineer.gsc b/BO1/PC/ZM/aitype/zombie_engineer.gsc new file mode 100644 index 0000000..20e3707 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_engineer.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_ger_zombie.gsc b/BO1/PC/ZM/aitype/zombie_ger_zombie.gsc new file mode 100644 index 0000000..54b336b Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_ger_zombie.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_ger_zombietron.gsc b/BO1/PC/ZM/aitype/zombie_ger_zombietron.gsc new file mode 100644 index 0000000..7deca6d Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_ger_zombietron.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_monkey_01.gsc b/BO1/PC/ZM/aitype/zombie_monkey_01.gsc new file mode 100644 index 0000000..cb920ed Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_monkey_01.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_monkey_02.gsc b/BO1/PC/ZM/aitype/zombie_monkey_02.gsc new file mode 100644 index 0000000..fd32ad5 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_monkey_02.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_monkey_stealer.gsc b/BO1/PC/ZM/aitype/zombie_monkey_stealer.gsc new file mode 100644 index 0000000..3d67218 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_monkey_stealer.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_moon_quad.gsc b/BO1/PC/ZM/aitype/zombie_moon_quad.gsc new file mode 100644 index 0000000..d9a1cf2 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_moon_quad.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_moon_zombie_astronaut.gsc b/BO1/PC/ZM/aitype/zombie_moon_zombie_astronaut.gsc new file mode 100644 index 0000000..209b978 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_moon_zombie_astronaut.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_moon_zombie_militarypolice.gsc b/BO1/PC/ZM/aitype/zombie_moon_zombie_militarypolice.gsc new file mode 100644 index 0000000..33767bb Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_moon_zombie_militarypolice.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_moss.gsc b/BO1/PC/ZM/aitype/zombie_moss.gsc new file mode 100644 index 0000000..835f4d9 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_moss.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_napalm.gsc b/BO1/PC/ZM/aitype/zombie_napalm.gsc new file mode 100644 index 0000000..d99df7f Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_napalm.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_quad.gsc b/BO1/PC/ZM/aitype/zombie_quad.gsc new file mode 100644 index 0000000..6a3421f Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_quad.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_rus_zombie_cosmonaut.gsc b/BO1/PC/ZM/aitype/zombie_rus_zombie_cosmonaut.gsc new file mode 100644 index 0000000..dc6d35c Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_rus_zombie_cosmonaut.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_rus_zombie_scientist.gsc b/BO1/PC/ZM/aitype/zombie_rus_zombie_scientist.gsc new file mode 100644 index 0000000..a35642c Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_rus_zombie_scientist.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_sonic.gsc b/BO1/PC/ZM/aitype/zombie_sonic.gsc new file mode 100644 index 0000000..a2cbf56 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_sonic.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_usa_zombie_militarypolice.gsc b/BO1/PC/ZM/aitype/zombie_usa_zombie_militarypolice.gsc new file mode 100644 index 0000000..53ca92f Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_usa_zombie_militarypolice.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_usa_zombie_officeworker.gsc b/BO1/PC/ZM/aitype/zombie_usa_zombie_officeworker.gsc new file mode 100644 index 0000000..f1c436a Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_usa_zombie_officeworker.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_usa_zombie_scientist.gsc b/BO1/PC/ZM/aitype/zombie_usa_zombie_scientist.gsc new file mode 100644 index 0000000..1a62a6a Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_usa_zombie_scientist.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_usa_zombietron_militarypolice.gsc b/BO1/PC/ZM/aitype/zombie_usa_zombietron_militarypolice.gsc new file mode 100644 index 0000000..5516e7d Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_usa_zombietron_militarypolice.gsc differ diff --git a/BO1/PC/ZM/aitype/zombie_viet.gsc b/BO1/PC/ZM/aitype/zombie_viet.gsc new file mode 100644 index 0000000..b36eb25 Binary files /dev/null and b/BO1/PC/ZM/aitype/zombie_viet.gsc differ diff --git a/BO1/PC/ZM/animscripts/anims.gsc b/BO1/PC/ZM/animscripts/anims.gsc new file mode 100644 index 0000000..abcbfeb Binary files /dev/null and b/BO1/PC/ZM/animscripts/anims.gsc differ diff --git a/BO1/PC/ZM/animscripts/battlechatter.gsc b/BO1/PC/ZM/animscripts/battlechatter.gsc new file mode 100644 index 0000000..489c9b3 --- /dev/null +++ b/BO1/PC/ZM/animscripts/battlechatter.gsc @@ -0,0 +1,1405 @@ + +#include common_scripts\utility; +#include animscripts\utility; +#include maps\_utility; +#include animscripts\battlechatter_ai; +init_battleChatter() +{ +} +player_init() +{ +} +shutdown_battleChatter() +{ + anim.countryIDs = undefined; + anim.eventTypeMinWait = undefined; + anim.eventActionMinWait = undefined; + anim.eventTypeMinWait = undefined; + anim.eventPriority = undefined; + anim.eventDuration = undefined; + anim.chatCount = undefined; + anim.moveOrigin = undefined; + anim.areas = undefined; + anim.locations = undefined; + anim.landmarks = undefined; + anim.usedIDs = undefined; + anim.chatInitialized = false; + level.battlechatter = undefined; + for (i = 0; i < anim.squadCreateFuncs.size; i++) + { + if (anim.squadCreateStrings[i] != "::init_squadBattleChatter") + { + continue; + } + if (i != (anim.squadCreateFuncs.size - 1)) + { + anim.squadCreateFuncs[i] = anim.squadCreateFuncs[anim.squadCreateFuncs.size - 1]; + anim.squadCreateStrings[i] = anim.squadCreateStrings[anim.squadCreateStrings.size - 1]; + } + anim.squadCreateFuncs[anim.squadCreateFuncs.size - 1] = undefined; + anim.squadCreateStrings[anim.squadCreateStrings.size - 1] = undefined; + } + level notify ("battlechatter disabled"); + anim notify ("battlechatter disabled"); +} +resetSayTime(name) +{ + self.nextSayTimes[name] = GetTime() + 50; +} +resetSayTimes() +{ + self.nextSayTime = GetTime(); + resetSayTime("threat"); + resetSayTime("order"); + resetSayTime("reaction"); + resetSayTime("response"); + resetSayTime("inform"); + resetSayTime("custom"); +} +init_squadBattleChatter() +{ +} +shutdown_squadBattleChatter() +{ + squad = self; + squad.maxSpeakers = undefined; + squad.nextSayTime = undefined; + squad.nextSayTimes = undefined; + squad.nextTypeSayTimes = undefined; + squad.isMemberSaying = undefined; + for (i = 0; i < squad.memberAddFuncs.size; i++) + { + if (squad.memberAddStrings[i] != "::addToSystem") + { + continue; + } + if (i != (squad.memberAddFuncs.size - 1)) + { + squad.memberAddFuncs[i] = squad.memberAddFuncs[squad.memberAddFuncs.size - 1]; + squad.memberAddStrings[i] = squad.memberAddStrings[squad.memberAddStrings.size - 1]; + } + squad.memberAddFuncs[squad.memberAddFuncs.size - 1] = undefined; + squad.memberAddStrings[squad.memberAddStrings.size - 1] = undefined; + } + for (i = 0; i < squad.memberRemoveFuncs.size; i++) + { + if (squad.memberRemoveStrings[i] != "::removeFromSystem" ) + { + continue; + } + if (i != (squad.memberRemoveFuncs.size - 1)) + { + squad.memberRemoveFuncs[i] = squad.memberRemoveFuncs[squad.memberRemoveFuncs.size - 1]; + squad.memberRemoveStrings[i] = squad.memberRemoveStrings[squad.memberRemoveStrings.size - 1]; + } + squad.memberRemoveFuncs[squad.memberRemoveFuncs.size - 1] = undefined; + squad.memberRemoveStrings[squad.memberRemoveStrings.size - 1] = undefined; + } + for (i = 0; i < squad.squadUpdateFuncs.size; i++) + { + if (squad.squadUpdateStrings[i] != "::initContact") + { + continue; + } + if (i != (squad.squadUpdateFuncs.size - 1)) + { + squad.squadUpdateFuncs[i] = squad.squadUpdateFuncs[squad.squadUpdateFuncs.size - 1]; + squad.squadUpdateStrings[i] = squad.squadUpdateStrings[squad.squadUpdateStrings.size - 1]; + } + squad.squadUpdateFuncs[squad.squadUpdateFuncs.size - 1] = undefined; + squad.squadUpdateStrings[squad.squadUpdateStrings.size - 1] = undefined; + } + for (i = 0; i < anim.squadIndex.size; i++) + { + squad shutdownContact (anim.squadIndex[i].squadName); + } + squad.chatInitialized = false; +} +initContact (squadName) +{ + if (!IsDefined (self.squadList[squadName].calledOut)) + { + self.squadList[squadName].calledOut = false; + } + if (!IsDefined (self.squadList[squadName].firstContact)) + { + self.squadList[squadName].firstContact = 2000000000; + } + if (!IsDefined (self.squadList[squadName].lastContact)) + { + self.squadList[squadName].lastContact = 0; + } +} +shutdownContact (squadName) +{ + self.squadList[squadName].calledOut = undefined; + self.squadList[squadName].firstContact = undefined; + self.squadList[squadName].lastContact = undefined; +} +bcsEnabled() +{ + return anim.chatInitialized; +} +bcsDebugWaiter() +{ +} +enableBattleChatter() +{ +} +disableBattleChatter() +{ +} +playBattleChatter() +{ +} +samePhrase(a,b) +{ + assert(IsDefined(a)); + assert(IsDefined(b)); + if(a.soundAliases.size != b.soundAliases.size) + { + return false; + } + for (i = 0; i < a.soundAliases.size; i++) + { + if(a.soundAliases[i] != b.soundAliases[i]) + { + return false; + } + } + return true; +} +initHistory() +{ + level.bcHistoryCount = 100; + level.bcHistoryPhrases = []; + level.bcHistoryTimes = []; + level.bcHistoryIndex = 0; +} +addPhraseToHistory(phrase) +{ + assert(IsDefined(level.bcHistoryIndex)); + i = level.bcHistoryIndex; + assert(IsDefined(i)); + level.bcHistoryPhrases[i] = phrase; + level.bcHistoryTimes[i] = GetTime(); + assert(IsDefined(i)); + level.bcHistoryIndex = (i+1)%level.bcHistoryCount; +} +isDupePhrase(phrase, threshold) +{ + for (i=0; i self.squad.nextTypeSayTimes[strAction][strType]) + { + return (false); + } + return (true); +} +doTypeLimit(strAction, strType) +{ + if (!IsDefined (anim.eventTypeMinWait[strAction][strType])) + { + return; + } + self.squad.nextTypeSayTimes[strAction][strType] = GetTime() + anim.eventTypeMinWait[strAction][strType]; +} +bcIsSniper() +{ + if ( IsPlayer( self ) ) + { + return (false); + } + return animscripts\combat_utility::isSniperRifle( self.weapon ); +} +isExposed() +{ +} +isClaimedNodeCover() +{ + node = self bcGetClaimedNode(); + if (!IsDefined (node)) + { + return (false); + } + if ((node.type[0] == "C") && + (node.type[1] == "o") && + (node.type[2] == "v")) + { + return (true); + } + return (false); +} +isNodeCover() +{ + node = self.node; + if (!IsDefined (node)) + { + return (false); + } + if ((node.type[0] == "C") && + (node.type[1] == "o") && + (node.type[2] == "v")) + { + return (true); + } + return (false); +} +isOfficer() +{ + fullRank = self getRank(); + if (fullRank == "sergeant" || fullRank == "lieutenant" || fullRank == "captain" || fullRank == "sergeant") + { + return (true); + } + return (false); +} +bcGetClaimedNode() +{ + if ( IsPlayer( self ) ) + { + node =self.node; + } + else + { + node = self GetClaimedNode(); + } +} +getName() +{ + name = undefined; + if ( self.team == "axis" ) + { + name = self.name; + } + else if ( self.team == "allies" ) + { + name = self.name; + } + if(!IsDefined(name) && IsDefined(self.script_friendname)) + { + name = self.script_friendname; + } + if (!IsDefined (name) || self.voice == "british" ) + { + return ( undefined ); + } + tokens = strtok( name, " " ); + if ( tokens.size == 1 ) + { + return tokens[0]; + } + if (tokens.size >= 2) + { + return tokens[1]; + } + return undefined; +} +getRank() +{ + return self.airank; +} +getClosestSpeaker (strAction, strType, officerOnly) +{ + speakers = self getSpeakers (strAction, strType, officerOnly); + speaker = getClosest(self.origin, speakers); + return (speaker); +} +getSpeakers (strAction, strType, officersOnly) +{ + speakers = []; + soldiers = GetAIArray( self.team ); + if (IsDefined (officersOnly) && officersOnly) + { + officers = []; + for (i = 0; i < soldiers.size; i++) + { + if (soldiers[i] isOfficer()) + { + officers[officers.size] = soldiers[i]; + } + } + soldiers = officers; + } + for (i = 0; i < soldiers.size; i++) + { + if (soldiers[i] == self) + { + continue; + } + if (!soldiers[i] bcCanSay(strAction, strType)) + { + continue; + } + speakers[speakers.size] = soldiers[i]; + } + return (speakers); +} +getArea() +{ + areas = anim.areas; + for (i = 0; i < areas.size; i++) + { + if (self istouching (areas[i]) && IsDefined (areas[i].script_area)) + { + return (areas[i]); + } + } + return (undefined); +} +getLocation() +{ + locations = anim.locations; + for (i = 0; i < locations.size; i++) + { + if (self istouching (locations[i]) && IsDefined (locations[i].script_location)) + { + return (locations[i]); + } + } + return (undefined); +} +getLandmark() +{ + landmarks = anim.landmarks; + for (i = 0; i < landmarks.size; i++) + { + if (self istouching (landmarks[i]) && IsDefined (landmarks[i].script_landmark)) + { + return (landmarks[i]); + } + } + return (undefined); +} +getDirectionCompass (vOrigin, vPoint) +{ + angles = VectorToAngles (vPoint - vOrigin); + angle = angles[1]; + northYaw = getnorthyaw(); + angle -= northYaw; + if (angle < 0) + { + angle += 360; + } + else if (angle > 360) + { + angle -= 360; + } + if (angle < 22.5 || angle > 337.5) + { + direction = "north"; + } + else if (angle < 67.5) + { + direction = "northwest"; + } + else if (angle < 112.5) + { + direction = "west"; + } + else if (angle < 157.5) + { + direction = "southwest"; + } + else if (angle < 202.5) + { + direction = "south"; + } + else if (angle < 247.5) + { + direction = "southeast"; + } + else if (angle < 292.5) + { + direction = "east"; + } + else if (angle < 337.5) + { + direction = "northeast"; + } + else + { + direction = "impossible"; + } + return (direction); +} +getDirectionReferenceSide (vOrigin, vPoint, vReference) +{ + anglesToReference = VectorToAngles (vReference - vOrigin); + anglesToPoint = VectorToAngles (vPoint - vOrigin); + angle = anglesToReference[1] - anglesToPoint[1]; + angle += 360; + angle = int (angle) % 360; + if (angle > 180) + { + angle -= 360; + } + if (angle > 2 && angle < 45) + { + side = "right"; + } + else if (angle < -2 && angle > -45) + { + side = "left"; + } + else + { + if (distance (vOrigin, vPoint) < distance (vOrigin, vReference)) + { + side = "front"; + } + else + { + side = "rear"; + } + } + return (side); +} +getDirectionFacingFlank (vOrigin, vPoint, vFacing) +{ + anglesToFacing = VectorToAngles (vFacing); + anglesToPoint = VectorToAngles (vPoint - vOrigin); + angle = anglesToFacing[1] - anglesToPoint[1]; + angle += 360; + angle = int (angle) % 360; + if (angle > 315 || angle < 45) + { + direction = "front"; + } + else if (angle < 135) + { + direction = "right"; + } + else if (angle < 225) + { + direction = "rear"; + } + else + { + direction = "left"; + } + return (direction); +} +getVectorRightAngle (vDir) +{ + return (vDir[1], 0 - vDir[0], vDir[2]); +} +getVectorArrayAverage (avAngles) +{ + vDominantDir = (0,0,0); + for (i = 0; i < avAngles.size; i++) + { + vDominantDir += avAngles[i]; + } + return (vDominantDir[0] / avAngles.size, vDominantDir[1] / avAngles.size, vDominantDir[2] / avAngles.size); +} +addAlias(name) +{ + if(soundExists(name)) + { + self.soundAliases[self.soundAliases.size] = name; + return true; + } + else + { + println("ERROR BC cannot find alias "+name); + return false; + } +} +createChatPhrase() +{ + chatPhrase = SpawnStruct(); + chatPhrase.owner = self; + chatPhrase.soundAliases = []; + chatPhrase.master = false; + return chatPhrase; +} +canSeePoint(origin) +{ + forward = AnglesToForward(self.angles); + return (vectordot(forward, origin - self.origin) > 0.766); +} +pointInFov(origin) +{ + forward = AnglesToForward(self.angles); + return (vectordot(forward, origin - self.origin) > 0.766); +} +resetNextSayTimes( team, action ) +{ +} +bcGetName() +{ + name = undefined; + if ( self.team == "axis" ) + { + name = self.name; + } + else if ( self.team == "allies" ) + { + name = self.name; + } + if(!IsDefined(name) && IsDefined(self.script_friendname)) + { + name = self.script_friendname; + } + if (!IsDefined (name) || self.voice == "british" ) + { + return ( undefined ); + } + tokens = strtok( name, " " ); + if ( tokens.size == 1 ) + { + return tokens[0]; + } + if (tokens.size >= 2) + { + return tokens[1]; + } + return undefined; +} +bcCanSay (eventAction, eventType, priority, modifier) +{ + assert(IsDefined(eventAction)); + assert(IsDefined(eventType)); + isGrenade = false; + if( IsDefined(eventAction) && eventAction == "inform" + && IsDefined(eventType) && eventType == "incoming" + && IsDefined(modifier) && modifier == "grenade" + ) + { + isGrenade = true; + } + if( IsDefined(eventAction) && eventAction == "inform" + && IsDefined(eventType) && eventType == "attack" + && IsDefined(modifier) && modifier == "grenade" + ) + { + isGrenade = true; + } + if( IsDefined(eventAction) && eventAction == "threat" + && IsDefined(eventType) && eventType == "bansai" + ) + { + isGrenade = true; + } + if (IsPlayer(self)) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG cannot say because i'm a player "+self.bcname); + } + return false; + } + if(IsDefined(self.isTalking) && self.isTalking) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG cannot say because i'm talking "+self.bcname); + } + return false; + } + if(IsDefined(self.isSpeaking) && self.isSpeaking) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG cannot say because i'm speaking "+self.bcname); + } + return false; + } + if( !IsDefined( self.nextSayTimes ) ) + { + msg = "AI at origin " + self.origin + ", classname " + self.classname; + msg += ", doesn't have the self.nextSayTimes array set up, which the battlechatter system needs! "; + msg += "This likely means that animscripts\battlechatter_ai::removeFromSystem() was run "; + msg += "on this guy, but he hasn't been deleted. "; + msg += "Did you accidentally notify \'death\' without deleting the AI?"; + ASSERTMSG( msg ); + return false; + } + if (!IsDefined( self.battlechatter ) || !self.battlechatter) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG cannot say because of self.battlechatter "+self.bcname); + } + return false; + } + if(!isGrenade && IsDefined(level.NumberOfImportantPeopleTalking) && level.NumberOfImportantPeopleTalking > 0) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG cannot say because important people are talking "+level.NumberOfImportantPeopleTalking+" "+self.bcname); + } + return false; + } + timeout = 3000; + if(self.team == "axis") + { + timeout = 1800; + } + else if(self.team == "allies") + { + timeout = 1000; + } + if(IsDefined(level.ImportantPeopleTalkingTime) && (GetTime()-level.ImportantPeopleTalkingTime) cullDist*cullDist) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG cannot say, too far from player "+self.bcname); + } + return false; + } + if (!isGrenade && GetTime() < self.nextSayTimes[eventAction]) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG cannot say because of self wait "+self.bcname); + } + return (false); + } + if (!isGrenade && GetTime() < self.squad.nextSayTimes[eventAction]) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG cannot say because of squad wait "+self.bcname+ " "+self.squad.squadName); + } + return (false); + } + if (!isGrenade && IsDefined (eventType) && typeLimited (eventAction, eventType)) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG cannot say because of typeLimit "+self.bcname); + } + return (false); + } + if(IsDefined (eventType) && !IsDefined(anim.eventPriority[eventAction][eventType])) + { + println("BC priority not set for eventType "+eventType+ " "+eventAction); + } + else if (!isGrenade && IsDefined (eventType) && anim.eventPriority[eventAction][eventType] < self.bcs_minPriority) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG cannot say because of minPriority "+self.bcname); + } + return (false); + } + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG can say because of self wait "+GetTime()+" "+anim.eventActionMinWait[eventAction]["self"]+" "+self.nextSayTimes[eventAction]+" "+self.bcname); + println("BC DEBUG can say because of squad wait "+GetTime()+" "+anim.eventActionMinWait[eventAction]["squad"]+" "+self.squad.nextSayTimes[eventAction]+" "+self.bcname); + } + return (true); +} +bcPlayPhrase(eventAction, eventType, chatPhrase, decCallCount) +{ + if(!IsDefined(decCallCount)) + { + decCallCount = false; + } + if (GetDvar( #"debug_bclotsoprint") == "on") + { + a = ""; + for (i = 0; i < chatPhrase.soundAliases.size; i++) + { + a += chatPhrase.soundAliases[i] + " "; + } + println("BC DEBUG saying "+a); + } + if(chatPhrase.soundAliases.size == 0) + { + println("BC ERROR tried to play empty phrase" + self.bcname); + return; + } + if(isDupePhrase(chatPhrase, 10000)) + { + if (GetDvar( #"debug_bclotsoprint") == "on") + { + println("BC DEBUG skipping because of identical phrase "+self.bcname); + } + return; + } + addPhraseToHistory(chatPhrase); + squad = self.squad; + team = self.team; + self.isSpeaking = true; + self.nextSayTimes[eventAction] = GetTime() + anim.eventActionMinWait[eventAction]["self"]; + squad.nextSayTimes[eventAction] = GetTime() + anim.eventActionMinWait[eventAction]["squad"]; + for (i = 0; i < chatPhrase.soundAliases.size; i++) + { + if(SoundExists(chatPhrase.soundAliases[i])) + { + self animscripts\face::PlayFaceThread(undefined, chatPhrase.soundAliases[i], .5, chatPhrase.soundAliases[i]); + if(!IsDefined(self)) + { + break; + } + } + else + { + println("ERROR BC: needed alias does not exist:"+chatPhrase.soundAliases[i]); + wait(1.0); + } + } + if (GetDvar( #"debug_bclotsoprint") == "on") + { + a = ""; + for (i = 0; i < chatPhrase.soundAliases.size; i++) + { + a += chatPhrase.soundAliases[i] + " "; + } + println("BC DEBUG done saying "+a); + } + if(IsDefined(self)) + { + self.isSpeaking = false; + self doTypeLimit (eventAction, eventType); + if(IsDefined(self.bcCalling) && IsDefined(self.bcCalling.bcCallCount) && decCallCount) + { + self.bcCalling.bcCallCount[self.team] -= 1; + } + } +} +filter(potentialThreats, isThreat) +{ + threats = []; + for (i = 0; i < potentialThreats.size; i++) + { + players = GetPlayers(); + for(p=0; p 1000) + { + return false; + } + if(distance(self.origin, player.origin) > 400) + { + return false; + } + return true; +} +isMg(player) +{ + if(IsDefined(self.bcCalloutTime)) + { + if((GetTime() - self.bcCalloutTime) < 6000) + { + return false; + } + if((GetTime() - self.bcCalloutTime) > 30000) + { + self.bcCalloutTime = undefined; + self.bcCallCount["axis"] = 0; + self.bcCallCount["allies"] = 0; + } + } + return self cansee(player) || distance(player.origin, self.origin) < 300; +} +isBanzai(player) +{ + playerIsTarget = false; + if(IsDefined(self.banzai) && self.banzai) + { + if(IsDefined(self.enemy) && IsPlayer(self.enemy)) + { + playerIsTarget = true; + } + if(IsDefined(self.target) && IsPlayer(self.target)) + { + playerIsTarget = true; + } + if(IsDefined(self.favoriteenemy) && IsPlayer(self.favoriteenemy)) + { + playerIsTarget = true; + } + if(!playerIsTarget) + { + return false; + } + if(!IsDefined(self.bcNoticeTime)) + { + self.bcNoticeTime = GetTime(); + } + if(GetTime() - self.bcNoticeTime < 1000) + { + return false; + } + if(IsDefined(self.bcCalloutTime)) + { + return (GetTime() - self.bcCalloutTime) < 4000; + } + return true; + } + return false; +} +isInfantry(player) +{ + return self cansee(player) && distance(player.origin, self.origin) < 1000; +} +getAllTurrets(team) +{ + t = []; + turrets = array_combine(getentarray("misc_mg42", "classname"), getentarray("misc_turret", "classname")); + for(i=0; i 3000; + } + } + if(valid) + { + valid = self bcCanSay("inform", "supressed", 1.0, "generic"); + } + return valid; +} +trySurpressed(team) +{ + players = GetPlayers(); + sp = filter(team, ::isSurpressed); + talker = getNearestTalker(players[0], undefined, sp, "inform", "supressed"); + if(!IsDefined(talker)) + { + return false; + } + talker.bcSurpressedTime = GetTime(); + phrase = talker createChatPhrase(); + phrase addAlias( talker getAlias("inform", "supressed", 1.0, "generic") ); + talker thread bcPlayPhrase("inform", "supressed", phrase, false); + return true; +} +findGuyToYellAt(team,notme) +{ + for(i=0; i 2000 + ) + { + team[i].bcOrderTime = undefined; + team[i].bcOrderType = undefined; + team[i].bcOrderModifier = undefined; + continue; + } + if(IsDefined(team[i].bcOrderTime) + &&(GetTime() - team[i].bcOrderTime ) < 2000 + &&team[i] bcCanSay("order", team[i].bcOrderType) + ) + { + thread doOrder(team[i],findGuyToYellAt(team, team[i]), team[i].bcOrderType, team[i].bcOrderModifier); + return true; + } + } + return false; +} +hasKill(player) +{ + return IsDefined(self.bcKillTime) && (GetTime() - self.bcKillTime) < 2000 && self bcCanSay("inform", "killfirm"); +} +tryKill(team) +{ + dude = getClosestToPlayer(filter(team, ::hasKill)); + if(!IsDefined(dude)) + { + return false; + } + modifier = "infantry"; + if(RandomFloat(1.0) < .35) + { + modifier = "generic"; + } + phrase = dude createChatPhrase(); + phrase addAlias( dude getAlias("inform", "killfirm", modifier)); + dude thread bcPlayPhrase("inform", "killfirm", phrase, false); + dude.bcKillTime = undefined; + return true; +} +hasCasualty(player) +{ + return IsDefined(self.bcFriendDeathTime) && (GetTime() - self.bcFriendDeathTime) < 3000 && self bcCanSay("reaction", "casualty"); +} +tryCasualty(team) +{ + dude = getClosestToPlayer(filter(team, ::hasCasualty)); + if(!IsDefined(dude)) + { + return false; + } + modifier = "generic"; + phrase = dude createChatPhrase(); + phrase addAlias( dude getAlias("reaction", "casualty", modifier)); + dude thread bcPlayPhrase("reaction", "casualty", phrase, false); + dude.bcFriendDeathTime = undefined; + return true; +} +tryGrenade(player) +{ + return IsDefined(self.bcThrewGrenadeTime) && (GetTime() - self.bcThrewGrenadeTime) < 2000 && self bcCanSay("inform", "attack"); +} +tryGrenadeInform(team) +{ + dude = getClosestToPlayer(filter(team, ::hasCasualty)); + if(!IsDefined(dude)) + { + return false; + } + modifier = "grenade"; + phrase = dude createChatPhrase(); + phrase addAlias( dude getAlias("inform", "attack", modifier)); + dude thread bcPlayPhrase("inform", "attack", phrase, false); + dude.bcThrewGrenadeTime = undefined; + return true; +} +tryFireInform(team,others) +{ + if(!IsDefined(level.bcOnFireTime)) + { + return false; + } + if((GetTime() - level.bcOnFireTime) >3000) + { + level.bcOnFireTime = undefined; + level.bcOnFireOrg = undefined; + return false; + } + if(IsDefined(level.bcOnFireLastSayTime) && (GetTime()-level.bcOnFireLastSayTime) < 10) + { + return false; + } + talker = getNearestTalker(level.bcOnFireOrg, undefined, team, "inform", "burning"); + if(!IsDefined(talker)) + { + return false; + } + level.bcOnFireLastSayTime = GetTime(); + phrase = talker createChatPhrase(); + phrase addAlias( talker getAlias("inform", "burning")); + level.bcOnFireTime = undefined; + level.bcOnFireOrg = undefined; + talker thread bcPlayPhrase("inform", "burning", phrase, false); + return true; +} +bccycle(team,otherteam) +{ + if (!bcsEnabled()) + { + return false; + } + if(tryThreat(GetAIArray (team), getentarray ("grenade", "classname"), 300, 1, ::isGrenade, "inform", "incoming", "grenade", true)) + { + return true; + } + if(team == "allies" && tryThreat(GetAIArray (team), GetAIArray(otherteam), 1000, 3, ::isBanzai, "threat", "banzai", undefined, false)) + { + return true; + } + wait(.01); + if(team == "allies" && tryThreat(GetAIArray (team), getAllTurrets(otherteam), 3000, 1, ::isMg, "threat", "mg", undefined, true)) + { + return true; + } + if(tryOrder(GetAIArray(team))) + { + return true; + } + wait(.01); + if(trySurpressed(GetAIArray(team))) + { + return true; + } + if(GetAIArray(otherteam).size > 1 && tryReload(GetAIArray(team),GetAIArray(otherteam))) + { + return true; + } + wait(.01); + if(tryKill(GetAIArray(team))) + { + return true; + } + if(tryCasualty(GetAIArray(team))) + { + return true; + } + wait(.01); + if(tryGrenadeInform(GetAIArray(team))) + { + return true; + } + wait(.01); + us = GetAIArray(team); + them = GetAIArray(otherteam); + if(us.size + 4 < them.size && RandomFloat(1) < .3) + { + tryThreat(us, them, 2000, 1, ::isInfantry, "threat", "infantry", "multiple", false); + } + else + { + tryThreat(us, them, 2000, 1, ::isInfantry, "threat", "infantry", "generic", true); + } + return false; +} +bcthread(us,them,talkdelay, nontalkdelay) +{ + while(1) + { + wait(nontalkdelay); + while(bccycle(us,them)) + { + wait(RandomFloat(2*talkdelay)); + } + } +} +bcmain() +{ + thread bcthread("axis", "allies", 2, 2); + thread bcthread("allies", "axis", 1, .5); +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/battlechatter_ai.gsc b/BO1/PC/ZM/animscripts/battlechatter_ai.gsc new file mode 100644 index 0000000..314128f Binary files /dev/null and b/BO1/PC/ZM/animscripts/battlechatter_ai.gsc differ diff --git a/BO1/PC/ZM/animscripts/combat_utility.gsc b/BO1/PC/ZM/animscripts/combat_utility.gsc new file mode 100644 index 0000000..427ddf0 --- /dev/null +++ b/BO1/PC/ZM/animscripts/combat_utility.gsc @@ -0,0 +1,1519 @@ +#include animscripts\Utility; +#include animscripts\Debug; +#include animscripts\SetPoseMovement; +#include animscripts\anims; +#include common_scripts\utility; +#include maps\_gameskill; +#include maps\_utility; +#using_animtree ("generic_human"); +player_init() +{ +} +EnemiesWithinStandingRange() +{ + enemyDistanceSq = self MyGetEnemySqDist(); + return ( enemyDistanceSq < anim.standRangeSq ); +} +MyGetEnemySqDist() +{ + dist = self GetClosestEnemySqDist(); + if (!IsDefined(dist)) + { + dist = 100000000000; + } + return dist; +} +getTargetAngleOffset(target) +{ + pos = self GetShootAtPos() + (0,0,-3); + dir = (pos[0] - target[0], pos[1] - target[1], pos[2] - target[2]); + dir = VectorNormalize( dir ); + fact = dir[2] * -1; + return fact; +} +getSniperBurstDelayTime() +{ + return RandomFloatRange( anim.min_sniper_burst_delay_time, anim.max_sniper_burst_delay_time ); +} +getRemainingBurstDelayTime() +{ + timeSoFar = (GetTime() - self.a.lastShootTime) / 1000; + delayTime = getBurstDelayTime(); + if ( delayTime > timeSoFar ) + { + return delayTime - timeSoFar; + } + return 0; +} +getBurstDelayTime() +{ + if ( self usingSidearm() ) + { + return RandomFloatRange( .15, .55 ); + } + else if ( self usingShotgun() ) + { + return RandomFloatRange( 1.0, 1.7 ); + } + else if ( self isSniper() ) + { + return getSniperBurstDelayTime(); + } + else if ( self.fastBurst ) + { + return RandomFloatRange( .1, .35 ); + } + else if ( self usingBoltActionWeapon() ) + { + return RandomFloatRange( 1.0, 1.5 ); + } + else if ( self usingGrenadeLauncher() ) + { + return RandomFloatRange( 1.5, 2.0 ); + } + else if ( is_rusher() && self.rusherType == "pistol" ) + { + return RandomFloatRange( .1, .3 ); + } + else + { + return RandomFloatRange( .4, .9 ); + } +} +burstDelay() +{ + if ( self.bulletsInClip ) + { + if ( self.shootStyle == "full" && !self.fastBurst ) + { + if ( self.a.lastShootTime == GetTime() ) + { + wait .05; + } + return; + } + delayTime = getRemainingBurstDelayTime(); + if ( delayTime ) + { + wait delayTime; + } + } +} +cheatAmmoIfNecessary() +{ + assert( !self.bulletsInClip ); + if ( !IsDefined( self.enemy ) ) + { + return false; + } + if( self is_rusher() ) + { + self.bulletsInClip = weaponClipSize( self.weapon ); + return true; + } + if( self.a.idleStrafing ) + { + self.bulletsInClip = int( min(10, weaponClipSize( self.weapon )) ); + self.nextCheatTime = GetTime() + 8000; + return true; + } + if ( self is_banzai() ) + { + self.bulletsInClip = weaponClipSize( self.weapon ); + return true; + } + if ( self.team == "allies" ) + { + return false; + } + if ( !IsPlayer( self.enemy ) ) + { + return false; + } + if ( weaponClipSize( self.weapon ) < 15 ) + { + return false; + } + if ( flag("player_is_invulnerable") ) + { + return false; + } + if ( self weaponAnims() == "pistol" ) + { + return false; + } + if ( self weaponAnims() == "rocketlauncher" ) + { + return false; + } + if ( self weaponAnims() == "grenade" ) + { + return false; + } + if ( IsDefined( self.nextCheatTime ) && GetTime() < self.nextCheatTime ) + { + return false; + } + if ( !self canSee( self.enemy ) ) + { + return false; + } + if (IsDefined (self.cheatammo_override) && (self.cheatammo_override == true)) + { + return false; + } + else + { + self.bulletsInClip = 10; + } + if ( self.bulletsInClip > weaponClipSize( self.weapon ) ) + { + self.bulletsInClip = weaponClipSize( self.weapon ); + } + self.nextCheatTime = GetTime() + 8000; + return true; +} +shootUntilShootBehaviorChange() +{ + self endon("shoot_behavior_change"); + self endon("stopShooting"); + if ( self weaponAnims() == "rocketlauncher" || self isSniper() ) + { + players = GetPlayers(); + if( IsDefined( players ) && players.size > 0 ) + { + if ( IsDefined( self.enemy ) && !IsPlayer(self.enemy) && IsSentient( self.enemy ) ) + { + if( DistanceSquared( players[0].origin, self.enemy.origin ) < 384*384 ) + { + self.enemy animscripts\battlechatter_ai::addThreatEvent( "infantry", self, 1.0 ); + } + } + } + if ( self weaponAnims() == "rocketlauncher" && IsSentient( self.enemy ) ) + { + wait ( RandomFloat( 2.0 ) ); + } + } + if ( IsDefined(self.enemy) && DistanceSquared(self.origin, self.enemy.origin) > 400*400 ) + burstCount = RandomIntRange( 1, 5 ); + else + burstCount = 10; + while(1) + { + burstDelay(); + animPrefix = getShootAnimPrefix(); + if ( self.shootStyle == "full" ) + { + self FireUntilOutOfAmmo( animArray( animPrefix + "fire" ), false, animscripts\shared::decideNumShotsForFull() ); + } + else if ( self.shootStyle == "burst" || self.shootStyle == "single" || self.shootStyle == "semi" ) + { + numShots = 1; + if ( self.shootStyle == "burst" || self.shootStyle == "semi" ) + { + numShots = animscripts\shared::decideNumShotsForBurst(); + } + if ( numShots == 1 ) + { + self FireUntilOutOfAmmo( animArrayPickRandom( animPrefix + "single" ), true, numShots ); + } + else + { + self FireUntilOutOfAmmo( animArray( animPrefix + self.shootStyle + numShots ), true, numShots ); + } + } + else + { + assert( self.shootStyle == "none" ); + self waittill( "hell freezes over" ); + } + if ( !self.bulletsInClip ) + { + break; + } + if ( self usingBoltActionWeapon() ) + { + break; + } + if( animscripts\shared::shouldSwitchWeapons() ) + { + self notify("need_to_switch_weapons"); + break; + } + burstCount--; + if ( burstCount < 0 ) + { + self.shouldReturnToCover = true; + break; + } + } +} +getUniqueFlagNameIndex() +{ + anim.animFlagNameIndex++; + return anim.animFlagNameIndex; +} +FireUntilOutOfAmmo( fireAnim, stopOnAnimationEnd, maxshots ) +{ + animName = "fireAnim_" + getUniqueFlagNameIndex(); + maps\_gameskill::resetMissTime(); + while( !aimedAtShootEntOrPos() ) + { + wait .05; + } + self SetAnim( %add_fire, 1, .1, 1 ); + rate = RandomFloatRange( 0.3, 2.0 ); + if ( self.shootStyle == "full" || self.shootStyle == "burst" ) + { + rate = animscripts\weaponList::autoShootAnimRate(); + if ( rate > 1.999 ) + { + rate = 1.999; + } + } + else if ( IsDefined( self.shootEnt ) && IsDefined( self.shootEnt.magic_bullet_shield ) ) + { + rate = 0.25; + } + else if( is_rusher() && self.rusherType == "pistol" ) + { + rate = 2.0; + } + if ( self usingBoltActionWeapon() ) + { + rate = 1.0; + } + else if ( self usingGasWeapon() ) + { + rate = 1.0; + } + else if ( self usingShotgun() ) + { + rate = 1.0; + } + else if ( self usingRocketLauncher() ) + { + rate = 1.0; + } + self SetFlaggedAnimKnobRestart( animName, fireAnim, 1, .2, rate ); + self updatePlayerSightAccuracy(); + FireUntilOutOfAmmoInternal( animName, fireAnim, stopOnAnimationEnd, maxshots ); + self ClearAnim( %add_fire, .2 ); +} +FireUntilOutOfAmmoInternal( animName, fireAnim, stopOnAnimationEnd, maxshots ) +{ + self endon("enemy"); + if ( IsPlayer( self.enemy ) && (self.shootStyle == "full" || self.shootStyle == "semi") ) + { + level endon("player_becoming_invulnerable"); + } + if ( stopOnAnimationEnd ) + { + self thread NotifyOnAnimEnd( animName, "fireAnimEnd" ); + self endon( "fireAnimEnd" ); + } + if ( !IsDefined( maxshots ) ) + { + maxshots = -1; + } + numshots = 0; + hasFireNotetrack = animHasNoteTrack( fireAnim, "fire" ); + usingRocketLauncher = (weaponClass( self.weapon ) == "rocketlauncher"); + while(1) + { + if ( hasFireNotetrack ) + { + if (self usingBoltActionWeapon() && numshots > 0) + { + break; + } + self waittillmatch( animName, "fire" ); + if ( self usingBoltActionWeapon()) + { + self.a.needsToRechamber = 1; + } + } + if ( numshots == maxshots ) + { + break; + } + if ( !self.bulletsInClip ) + { + if ( !cheatAmmoIfNecessary() ) + { + break; + } + } + if ( aimedAtShootEntOrPos() && GetTime() > self.a.lastShootTime ) + { + self shootAtShootEntOrPos(); + assertex( self.bulletsInClip >= 0, self.bulletsInClip ); + if ( IsPlayer( self.enemy ) && flag("player_is_invulnerable") ) + { + if ( RandomInt(3) == 0 ) + { + self.bulletsInClip--; + } + } + else + { + self.bulletsInClip--; + } + if ( usingRocketLauncher ) + { + self.a.rockets--; + if ( isSubStr(self.weapon, "rpg") ) + { + self hidepart("tag_rocket"); + self.a.rocketVisible = false; + } + } + } + numshots++; + self thread shotgunPumpSound( animName ); + if ( self.fastBurst && numshots == maxshots ) + { + break; + } + if ( !hasFireNotetrack ) + { + self waittillmatch( animName, "end" ); + } + if (self usingBoltActionWeapon () ) + { + wait 0.5; + } + } + if ( stopOnAnimationEnd ) + { + self notify( "fireAnimEnd" ); + } +} +aimedAtShootEntOrPos() +{ + tag_weapon = self gettagorigin("tag_weapon"); + if ( !IsDefined(tag_weapon) ) + { + return false; + } + if ( !IsDefined( self.shootPos ) ) + { + assert( !IsDefined( self.shootEnt ) ); + return true; + } + weaponAngles = self GetTagAngles("tag_weapon"); + anglesToShootPos = VectorToAngles( self.shootPos - tag_weapon ); + absyawdiff = AbsAngleClamp180( weaponAngles[1] - anglesToShootPos[1] ); + if ( absyawdiff > self.aimThresholdYaw ) + { + if ( DistanceSquared( self GetShootAtPos(), self.shootPos ) > 64*64 || absyawdiff > 45 ) + { + return false; + } + } + return AbsAngleClamp180( weaponAngles[0] - anglesToShootPos[0] ) <= self.aimThresholdPitch; +} +NotifyOnAnimEnd( animNotify, endNotify ) +{ + self endon("killanimscript"); + self endon( endNotify ); + self waittillmatch( animNotify, "end" ); + self notify( endNotify ); +} +shootAtShootEntOrPos() +{ + if( IsDefined( self.shoot_notify ) ) + { + self notify( self.shoot_notify ); + } + self shoot_notify_wrapper(); + if ( IsDefined( self.shootEnt ) ) + { + if ( IsDefined( self.enemy ) && self.shootEnt == self.enemy ) + { + self shootEnemyWrapper(); + } + } + else + { + assert( IsDefined( self.shootPos ) ); + self shootPosWrapper( self.shootPos ); + } +} +showRocket() +{ + if ( !isSubStr(self.weapon, "rpg") ) + { + return; + } + self.a.rocketVisible = true; + self showpart("tag_rocket"); + self notify("showing_rocket"); +} +showRocketWhenReloadIsDone() +{ + if ( self.weapon != "rpg" ) + { + return; + } + self endon("death"); + self endon("showing_rocket"); + self waittill("killanimscript"); + self showRocket(); +} +decrementBulletsInClip() +{ + if ( self.bulletsInClip ) + { + self.bulletsInClip--; + } +} +shotgunPumpSound( animName ) +{ + if ( !self usingShotgun() ) + { + return; + } + self endon("killanimscript"); + self notify("shotgun_pump_sound_end"); + self endon("shotgun_pump_sound_end"); + self thread stopShotgunPumpAfterTime( 2.0 ); + self waittillmatch( animName, "rechamber" ); + self PlaySound( "wpn_shotgun_pump" ); + self notify("shotgun_pump_sound_end"); +} +stopShotgunPumpAfterTime( timer ) +{ + self endon("killanimscript"); + self endon("shotgun_pump_sound_end"); + wait timer; + self notify("shotgun_pump_sound_end"); +} +NeedToReload( thresholdFraction ) +{ + if ( IsDefined( self.noreload ) ) + { + assertex( self.noreload, ".noreload must be true or undefined" ); + if ( self.bulletsinclip < weaponClipSize( self.weapon ) * 0.5 ) + { + self.bulletsinclip = int( weaponClipSize( self.weapon ) * 0.5 ); + } + return false; + } + if ( self.weapon == "none" ) + { + return false; + } + if ( self.bulletsInClip <= weaponClipSize( self.weapon ) * thresholdFraction ) + { + if ( thresholdFraction == 0 ) + { + if ( cheatAmmoIfNecessary() ) + { + return false; + } + } + return true; + } + return false; +} +putGunBackInHandOnKillAnimScript() +{ + self endon ( "weapon_switch_done" ); + self endon ( "death" ); + self notify( "put gun back in hand end unique" ); + self endon( "put gun back in hand end unique" ); + self waittill( "killanimscript" ); + animscripts\shared::placeWeaponOn( self.primaryweapon, "right" ); +} +Reload( thresholdFraction, optionalAnimation ) +{ + if( self usingGasWeapon() ) + { + return flamethrower_reload(); + } + self endon("killanimscript"); + if ( !NeedToReload( thresholdFraction ) ) + { + return false; + } + self.a.Alertness = "casual"; + self animscripts\battleChatter_ai::evaluateReloadEvent(); + self maps\_dds::dds_notify_reload( undefined, ( self.team == "allies" ) ); + if ( IsDefined( optionalAnimation ) ) + { + self ClearAnim( %body, .1 ); + self SetFlaggedAnimKnobAll( "reloadanim", optionalAnimation, %body, 1, .1, 1 ); + animscripts\shared::DoNoteTracks( "reloadanim" ); + self animscripts\weaponList::RefillClip(); + } + else + { + if (self.a.pose == "prone") + { + self SetFlaggedAnimKnobAll("reloadanim", animArrayPickRandom("reload"), %body, 1, .1, 1); + self UpdateProne(%prone_legs_up, %prone_legs_down, 1, 0.1, 1); + } + else + { + println ("Bad anim_pose in combat::Reload"); + wait 2; + return; + } + animscripts\shared::DoNoteTracks("reloadanim"); + animscripts\weaponList::RefillClip(); + self ClearAnim(%upperbody, .1); + } + return true; +} +flamethrower_reload() +{ + wait( 0.05 ); + self animscripts\weaponList::RefillClip(); + return true; +} +getGrenadeThrowOffset( throwAnim ) +{ + offset = (0, 0, 64); + if ( IsDefined( throwAnim ) ) + { + if ( throwAnim == %exposed_grenadethrowb ) offset = (41.5391, 7.28883, 72.2128); + else if ( throwAnim == %exposed_grenadethrowc ) offset = (34.8849, -4.77048, 74.0488); + else if ( throwAnim == %exposed_grenadethrowb ) offset = (41.5391, 7.28883, 72.2128); + else if ( throwAnim == %exposed_grenadethrowc ) offset = (34.8849, -4.77048, 74.0488); + else if ( throwAnim == %corner_standl_grenade_a ) offset = (41.605, 6.80107, 81.4785); + else if ( throwAnim == %corner_standl_grenade_b ) offset = (24.1585, -14.7221, 29.2992); + else if ( throwAnim == %cornercrl_grenadea ) offset = (25.8988, -10.2811, 30.4813); + else if ( throwAnim == %cornercrl_grenadeb ) offset = (24.688, 45.0702, 64.377); + else if ( throwAnim == %corner_standr_grenade_a ) offset = (37.1254, -32.7053, 76.5745); + else if ( throwAnim == %corner_standr_grenade_b ) offset = (19.356, 15.5341, 16.5036); + else if ( throwAnim == %cornercrr_grenadea ) offset = (39.8857, 5.92472, 24.5878); + else if ( throwAnim == %covercrouch_grenadea ) offset = (-1.6363, -0.693674, 60.1009); + else if ( throwAnim == %covercrouch_grenadeb ) offset = (-1.6363, -0.693674, 60.1009); + else if ( throwAnim == %coverstand_grenadea ) offset = (10.8573, 7.12614, 77.2356); + else if ( throwAnim == %coverstand_grenadeb ) offset = (19.1804, 5.68214, 73.2278); + else if ( throwAnim == %prone_grenade_a ) offset = (12.2859, -1.3019, 33.4307); + else if ( throwAnim == %ai_pillar_stand_grenade_throw_01 ) offset = (3.33533, 25.1428, 33.6935); + else if ( throwAnim == %ai_pillar_stand_grenade_throw_02 ) offset = (15.8536, -12.6112, 66.6897); + else if ( throwAnim == %ai_pillar_stand_grenade_throw_03 ) offset = (25.7513, -19.2158, 23.2601); + else if ( throwAnim == %ai_pillar_crouch_grenade_throw_01 ) offset = (13.3738, -22.7841, 44.6094); + else if ( throwAnim == %ai_pillar_crouch_grenade_throw_02 ) offset = (19.3524, -16.1327, 18.6373); + else if ( throwAnim == %ai_pillar_crouch_grenade_throw_03 ) offset = (18.614, 19.1907, 15.9741); + } + if ( offset[2] == 64 ) + { + if ( IsDefined( throwAnim ) ) + { + println( "^1Warning: undefined grenade throw animation used; hand offset unknown" ); + } + else + { + println( "^1Warning: grenade throw animation ", throwAnim, " has no recorded hand offset" ); + } + } + return offset; +} +ThrowGrenadeAtPlayerASAP_combat_utility() +{ + if ( anim.numGrenadesInProgressTowardsPlayer == 0 ) + { + anim.grenadeTimers["player_fraggrenade"] = 0; + anim.grenadeTimers["player_flash_grenade"] = 0; + } + anim.throwGrenadeAtPlayerASAP = true; +} +setActiveGrenadeTimer( throwingAt ) +{ + if ( IsPlayer( throwingAt ) ) + { + self.activeGrenadeTimer = "player_" + self.grenadeWeapon; + } + else + { + self.activeGrenadeTimer = "AI_" + self.grenadeWeapon; + } + if( !IsDefined(anim.grenadeTimers[self.activeGrenadeTimer]) ) + { + anim.grenadeTimers[self.activeGrenadeTimer] = randomIntRange( 1000, 20000 ); + } +} +considerChangingTarget( throwingAt ) +{ + if ( !IsPlayer( throwingAt ) && self.team == "axis" ) + { + players = GetPlayers(); + for( i = 0; i < players.size; i++ ) + { + player = players[i]; + if ( GetTime() < anim.grenadeTimers[self.activeGrenadeTimer] ) + { + if ( player.ignoreme ) + { + return throwingAt; + } + myGroup = self getthreatbiasgroup(); + playerGroup = player getthreatbiasgroup(); + if ( myGroup != "" && playerGroup != "" && getThreatBias( playerGroup, myGroup ) < -10000 ) + { + return throwingAt; + } + if ( self canSee( player ) || (isAI( throwingAt ) && throwingAt canSee( player )) ) + { + if ( IsDefined( self.covernode ) ) + { + angles = VectorToAngles( player.origin - self.origin ); + yawDiff = AngleClamp180( self.covernode.angles[1] - angles[1] ); + } + else + { + yawDiff = self GetYawToSpot( player.origin ); + } + if ( abs( yawDiff ) < 60 ) + { + throwingAt = player; + self setActiveGrenadeTimer( throwingAt ); + } + } + } + } + } + return throwingAt; +} +usingPlayerGrenadeTimer() +{ + return self.activeGrenadeTimer == "player_" + self.grenadeWeapon; +} +setGrenadeTimer( grenadeTimer, newValue ) +{ + oldValue = anim.grenadeTimers[ grenadeTimer ]; + anim.grenadeTimers[ grenadeTimer ] = max( newValue, oldValue ); +} +getDesiredGrenadeTimerValue() +{ + nextGrenadeTimeToUse = undefined; + if ( self usingPlayerGrenadeTimer() ) + { + nextGrenadeTimeToUse = GetTime() + anim.playerGrenadeBaseTime + RandomInt(anim.playerGrenadeRangeTime); + } + else + { + nextGrenadeTimeToUse = GetTime() + 40000 + RandomInt(60000); + } + return nextGrenadeTimeToUse; +} +mayThrowDoubleGrenade() +{ + assert( self.activeGrenadeTimer == "player_fraggrenade" ); + if ( player_died_recently() ) + { + return false; + } + if ( !anim.double_grenades_allowed ) + { + return false; + } + if ( GetTime() < anim.grenadeTimers[ "player_double_grenade" ] ) + { + return false; + } + if ( GetTime() > anim.lastFragGrenadeToPlayerStart + 3000 ) + { + return false; + } + return anim.numGrenadesInProgressTowardsPlayer < 2; +} +myGrenadeCoolDownElapsed() +{ + if ( player_died_recently() ) + { + return false; + } + return ( GetTime() >= self.a.nextGrenadeTryTime ); +} +grenadeCoolDownElapsed() +{ + if (self.script_forcegrenade == 1) + { + return true; + } + if ( !myGrenadeCoolDownElapsed() ) + { + return false; + } + if ( GetTime() >= anim.grenadeTimers[self.activeGrenadeTimer] ) + { + return true; + } + if ( self.activeGrenadeTimer == "player_fraggrenade" ) + { + return mayThrowDoubleGrenade(); + } + return false; +} +isGrenadePosSafe( throwingAt, destination ) +{ + if ( IsDefined( anim.throwGrenadeAtPlayerASAP ) && self usingPlayerGrenadeTimer() ) + { + return true; + } + distanceThreshold = 200; + if ( self.grenadeWeapon == "flash_grenade" ) + { + distanceThreshold = 512; + } + distanceThresholdSq = distanceThreshold * distanceThreshold; + closest = undefined; + closestdist = 100000000; + secondclosest = undefined; + secondclosestdist = 100000000; + for ( i = 0; i < self.squad.members.size; i++ ) + { + if ( !IsAlive( self.squad.members[i] ) ) + { + continue; + } + dist = DistanceSquared( self.squad.members[i].origin, destination ); + if ( dist > distanceThresholdSq ) + { + continue; + } + if ( dist < closestdist ) + { + secondclosestdist = closestdist; + secondclosest = closest; + closestdist = dist; + closest = self.squad.members[i]; + } + else if ( dist < secondclosestdist ) + { + secondclosestdist = dist; + secondclosest = self.squad.members[i]; + } + } + if ( IsDefined( closest ) && sightTracePassed( closest getEye(), destination, false, undefined ) ) + { + return false; + } + if ( IsDefined( secondclosest ) && sightTracePassed( closest getEye(), destination, false, undefined ) ) + { + return false; + } + return true; +} +TryGrenadePosProc( throwingAt, destination, optionalAnimation, armOffset ) +{ + if ( !isGrenadePosSafe( throwingAt, destination ) ) + { + return false; + } + else if ( DistanceSquared( self.origin, destination ) < 200 * 200 ) + { + return false; + } + trace = PhysicsTrace( destination + (0,0,1), destination + (0,0,-500) ); + if ( trace == destination + (0,0,-500) ) + { + return false; + } + trace += (0,0,.1); + return TryGrenadeThrow( throwingAt, trace, optionalAnimation, armOffset ); +} +TryGrenade( throwingAt, optionalAnimation ) +{ + if( self usingGasWeapon() ) + { + return false; + } + if ( self.weapon=="mg42" || self.grenadeammo <= 0 ) + { + return false; + } + self setActiveGrenadeTimer( throwingAt ); + throwingAt = considerChangingTarget( throwingAt ); + if ( !grenadeCoolDownElapsed() ) + { + return false; + } + armOffset = getGrenadeThrowOffset( optionalAnimation ); + if ( IsDefined( self.enemy ) && throwingAt == self.enemy ) + { + if ( self.grenadeWeapon == "flash_grenade" && !shouldThrowFlashBangAtEnemy() ) + { + return false; + } + if ( self canSeeEnemyFromExposed() ) + { + if ( !isGrenadePosSafe( throwingAt, throwingAt.origin ) ) + { + return false; + } + return TryGrenadeThrow( throwingAt, undefined, optionalAnimation, armOffset ); + } + else if ( self canSuppressEnemyFromExposed() ) + { + return TryGrenadePosProc( throwingAt, self getEnemySightPos(), optionalAnimation, armOffset ); + } + else + { + if ( !isGrenadePosSafe( throwingAt, throwingAt.origin ) ) + { + return false; + } + return TryGrenadeThrow( throwingAt, undefined, optionalAnimation, armOffset ); + } + return false; + } + else + { + return TryGrenadePosProc( throwingAt, throwingAt.origin, optionalAnimation, armOffset ); + } +} +TryGrenadeThrow( throwingAt, destination, optionalAnimation, armOffset ) +{ + if( self usingGasWeapon() ) + { + return false; + } + if ( GetTime() < 10000 ) + { + return false; + } + if (IsDefined(optionalAnimation)) + { + throw_anim = optionalAnimation; + gunHand = self.a.gunHand; + } + else + { + switch (self.a.special) + { + case "cover_crouch": + case "none": + if (self.a.pose == "stand") + { + armOffset = (0,0,80); + throw_anim = animArray("grenade_throw"); + } + else + { + armOffset = (0,0,65); + throw_anim = animArray("grenade_throw"); + } + gunHand = "left"; + break; + default: + throw_anim = undefined; + gunHand = undefined; + break; + } + } + if (!IsDefined(throw_anim)) + { + return (false); + } + if (IsDefined (destination)) + { + throwvel = self checkGrenadeThrowPos(armOffset, "min energy", destination); + if (!IsDefined(throwvel)) + { + throwvel = self checkGrenadeThrowPos(armOffset, "min time", destination); + } + if (!IsDefined(throwvel)) + { + throwvel = self checkGrenadeThrowPos(armOffset, "max time", destination); + } + } + else + { + throwvel = self checkGrenadeThrow(armOffset, "min energy", self.randomGrenadeRange); + if (!IsDefined(throwvel)) + { + throwvel = self checkGrenadeThrow(armOffset, "min time", self.randomGrenadeRange); + } + if (!IsDefined(throwvel)) + { + throwvel = self checkGrenadeThrow(armOffset, "max time", self.randomGrenadeRange); + } + } + self.a.nextGrenadeTryTime = GetTime() + randomintrange(1000,2000); + if ( IsDefined(throwvel) ) + { + if (!IsDefined(self.oldGrenAwareness)) + { + self.oldGrenAwareness = self.grenadeawareness; + } + self.grenadeawareness = 0; + nextGrenadeTimeToUse = self getDesiredGrenadeTimerValue(); + setGrenadeTimer( self.activeGrenadeTimer, min( GetTime() + 3000, nextGrenadeTimeToUse ) ); + secondGrenadeOfDouble = false; + if ( self usingPlayerGrenadeTimer() ) + { + anim.numGrenadesInProgressTowardsPlayer++; + self thread reduceGIPTPOnKillanimscript(); + if ( anim.numGrenadesInProgressTowardsPlayer > 1 ) + { + secondGrenadeOfDouble = true; + } + } + if ( self.activeGrenadeTimer == "player_fraggrenade" && anim.numGrenadesInProgressTowardsPlayer <= 1 ) + { + anim.lastFragGrenadeToPlayerStart = GetTime(); + } + DoGrenadeThrow( throw_anim, nextGrenadeTimeToUse, secondGrenadeOfDouble ); + return true; + } + else + { + } + return false; +} +reduceGIPTPOnKillanimscript() +{ + self endon("dont_reduce_giptp_on_killanimscript"); + self waittill("killanimscript"); + anim.numGrenadesInProgressTowardsPlayer--; +} +DoGrenadeThrow( throw_anim, nextGrenadeTimeToUse, secondGrenadeOfDouble ) +{ + self animscripts\battleChatter_ai::evaluateAttackEvent("grenade"); + self notify ("stop_aiming_at_enemy"); + self SetFlaggedAnimKnobAllRestart("throwanim", throw_anim, %body, 1, 0.1, 1); + self thread animscripts\shared::DoNoteTracksForever("throwanim", "killanimscript"); + model = getGrenadeModel(); + attachside = "none"; + for (;;) + { + self waittill("throwanim", notetrack); + if ( notetrack == "grenade_left" || notetrack == "grenade_right" ) + { + attachside = attachGrenadeModel(model, "TAG_INHAND"); + self.isHoldingGrenade = true; + } + if ( notetrack == "grenade_throw" || notetrack == "grenade throw" ) + { + break; + } + assert(notetrack != "end"); + if ( notetrack == "end" ) + { + anim.numGrenadesInProgressTowardsPlayer--; + self notify("dont_reduce_giptp_on_killanimscript"); + return false; + } + } + self notify("dont_reduce_giptp_on_killanimscript"); + if ( self usingPlayerGrenadeTimer() ) + { + self thread watchGrenadeTowardsPlayer( nextGrenadeTimeToUse ); + } + self maps\_dds::dds_notify_grenade( self.grenadeweapon, ( self.team == "allies" ), false ); + self throwGrenade(); + if ( !self usingPlayerGrenadeTimer() ) + { + setGrenadeTimer( self.activeGrenadeTimer, nextGrenadeTimeToUse ); + } + if ( secondGrenadeOfDouble ) + { + if ( anim.numGrenadesInProgressTowardsPlayer > 1 || GetTime() - anim.lastGrenadeLandedNearPlayerTime < 2000 ) + { + anim.grenadeTimers["player_double_grenade"] = GetTime() + min( 5000, anim.playerDoubleGrenadeTime ); + } + } + self notify ("stop grenade check"); + if ( attachSide != "none" ) + { + self detach(model, attachside); + } + else + { + print ("No grenade hand set: "); + println (throw_anim); + println("animation in console does not specify grenade hand"); + } + self.isHoldingGrenade = undefined; + self.grenadeawareness = self.oldGrenAwareness; + self.oldGrenAwareness = undefined; + self waittillmatch("throwanim", "end"); + self SetAnim(%exposed_modern,1,.2); + self SetAnim(%exposed_aiming,1); + self ClearAnim(throw_anim,.2); +} +watchGrenadeTowardsPlayer( nextGrenadeTimeToUse ) +{ + watchGrenadeTowardsPlayerInternal( nextGrenadeTimeToUse ); + anim.numGrenadesInProgressTowardsPlayer--; +} +watchGrenadeTowardsPlayerInternal( nextGrenadeTimeToUse ) +{ + activeGrenadeTimer = self.activeGrenadeTimer; + timeoutObj = SpawnStruct(); + timeoutObj thread watchGrenadeTowardsPlayerTimeout( 5 ); + timeoutObj endon("watchGrenadeTowardsPlayerTimeout"); + type = self.grenadeWeapon; + grenade = self getGrenadeIThrew(); + if ( !IsDefined( grenade ) ) + { + return; + } + setGrenadeTimer( activeGrenadeTimer, min( GetTime() + 5000, nextGrenadeTimeToUse ) ); + goodRadiusSqrd = 250 * 250; + giveUpRadiusSqrd = 400 * 400; + if ( type == "flash_grenade" ) + { + goodRadiusSqrd = 900 * 900; + giveUpRadiusSqrd = 1300 * 1300; + } + players = GetPlayers(); + prevorigin = grenade.origin; + while(1) + { + wait .1; + if ( !IsDefined( grenade ) ) + { + break; + } + if ( grenade.origin == prevorigin ) + { + if ( DistanceSquared( grenade.origin, players[0].origin ) < goodRadiusSqrd || DistanceSquared( grenade.origin, players[0].origin ) > giveUpRadiusSqrd ) + { + break; + } + } + prevorigin = grenade.origin; + } + grenadeorigin = prevorigin; + if ( IsDefined( grenade ) ) + { + grenadeorigin = grenade.origin; + } + if ( DistanceSquared( grenadeorigin, players[0].origin ) < goodRadiusSqrd ) + { + level notify("threw_grenade_at_player"); + anim.throwGrenadeAtPlayerASAP = undefined; + if ( GetTime() - anim.lastGrenadeLandedNearPlayerTime < 3000 ) + { + anim.grenadeTimers["player_double_grenade"] = GetTime() + anim.playerDoubleGrenadeTime; + } + anim.lastGrenadeLandedNearPlayerTime = GetTime(); + setGrenadeTimer( activeGrenadeTimer, nextGrenadeTimeToUse ); + } + else + { + } +} +getGrenadeIThrew() +{ + self endon("killanimscript"); + self waittill( "grenade_fire", grenade ); + return grenade; +} +watchGrenadeTowardsPlayerTimeout( timerlength ) +{ + wait timerlength; + self notify("watchGrenadeTowardsPlayerTimeout"); +} +attachGrenadeModel(model, tag) +{ + self attach (model, tag); + thread detachGrenadeOnScriptChange(model, tag); + return tag; +} +detachGrenadeOnScriptChange(model, tag) +{ + self endon ("stop grenade check"); + self waittill ("killanimscript"); + if ( !IsDefined( self ) ) + { + return; + } + if (IsDefined(self.oldGrenAwareness)) + { + self.grenadeawareness = self.oldGrenAwareness; + self.oldGrenAwareness = undefined; + } + self detach(model, tag); +} +offsetToOrigin(start) +{ + forward = AnglesToForward(self.angles); + right = AnglesToRight(self.angles); + up = anglestoup(self.angles); + forward = vector_scale (forward, start[0]); + right = vector_scale (right, start[1]); + up = vector_scale (up, start[2]); + return (forward + right + up); +} +grenadeLine(start, end) +{ + level notify ("armoffset"); + level endon ("armoffset"); + start = self.origin + offsetToOrigin(start); + for (;;) + { + line (start, end, (1,0,1)); + Print3d (start, start, (0.2,0.5,1.0), 1, 1); + Print3d (end, end, (0.2,0.5,1.0), 1, 1); + wait (0.05); + } +} +getGrenadeDropVelocity() +{ + yaw = RandomFloat( 360 ); + pitch = RandomFloatRange( 30, 75 ); + amntz = sin( pitch ); + cospitch = cos( pitch ); + amntx = cos( yaw ) * cospitch; + amnty = sin( yaw ) * cospitch; + speed = RandomFloatRange( 100, 200 ); + velocity = (amntx, amnty, amntz) * speed; + return velocity; +} +dropGrenade() +{ + grenadeOrigin = self GetTagOrigin ( "tag_inhand" ); + velocity = getGrenadeDropVelocity(); + self MagicGrenadeManual( grenadeOrigin, velocity, 3 ); +} +EyesAtEnemy() +{ + self notify ("stop EyesAtEnemy internal"); + self endon ("death"); + self endon ("stop EyesAtEnemy internal"); + for (;;) + { + if (IsDefined(self.enemy)) + { + } + wait 2; + } +} +FindCoverNearSelf() +{ + oldKeepNodeInGoal = self.keepClaimedNodeInGoal; + oldKeepNode = self.keepClaimedNode; + self.keepClaimedNodeInGoal = false; + self.keepClaimedNode = false; + node = self FindBestCoverNode(); + if ( IsDefined( node ) ) + { + if ( self.a.script != "combat" ) + { + if ( self UseCoverNode( node ) ) + { + return true; + } + else + { + } + } + } + self.keepClaimedNodeInGoal = oldKeepNodeInGoal; + self.keepClaimedNode = oldKeepNode; + return false; +} +lookForBetterCover() +{ + if ( !isValidEnemy( self.enemy ) ) + { + return false; + } + if ( self.fixedNode ) + { + return false; + } + node = self getBestCoverNodeIfAvailable(); + if ( IsDefined( node ) ) + { + return useCoverNodeIfPossible( node ); + } + return false; +} +getBestCoverNodeIfAvailable() +{ + node = self FindBestCoverNode(); + if ( !IsDefined(node) ) + { + return undefined; + } + currentNode = self GetClaimedNode(); + if ( IsDefined( currentNode ) && node == currentNode ) + { + return undefined; + } + if ( IsDefined( self.coverNode ) && node == self.coverNode ) + { + return undefined; + } + return node; +} +useCoverNodeIfPossible( node ) +{ + oldKeepNodeInGoal = self.keepClaimedNodeInGoal; + oldKeepNode = self.keepClaimedNode; + self.keepClaimedNodeInGoal = false; + self.keepClaimedNode = false; + if ( self UseCoverNode( node ) ) + { + return true; + } + else + { + } + self.keepClaimedNodeInGoal = oldKeepNodeInGoal; + self.keepClaimedNode = oldKeepNode; + return false; +} +tryRunningToEnemy( ignoreSuppression ) +{ + if ( !isValidEnemy( self.enemy ) ) + { + return false; + } + if ( self.fixedNode ) + { + return false; + } + if ( self IsInGoal( self.enemy.origin ) ) + { + self FindReacquireDirectPath( ignoreSuppression ); + } + else + { + self FindReacquireProximatePath( ignoreSuppression ); + } + if ( self ReacquireMove() ) + { + self.keepClaimedNodeInGoal = false; + self.keepClaimedNode = false; + self.a.magicReloadWhenReachEnemy = true; + return true; + } + return false; +} +getGunYawToShootEntOrPos() +{ + if ( !IsDefined( self.shootPos ) ) + { + assert( !IsDefined( self.shootEnt ) ); + return 0; + } + yaw = self GetTagAngles("tag_weapon")[1] - GetYaw( self.shootPos ); + yaw = AngleClamp180( yaw ); + return yaw; +} +getGunPitchToShootEntOrPos() +{ + if ( !IsDefined( self.shootPos ) ) + { + assert( !IsDefined( self.shootEnt ) ); + return 0; + } + pitch = self GetTagAngles("tag_weapon")[0] - VectorToAngles( self.shootPos - self gettagorigin("tag_weapon") )[0]; + pitch = AngleClamp180( pitch ); + return pitch; +} +getPitchToEnemy() +{ + if(!IsDefined(self.enemy)) + { + return 0; + } + vectorToEnemy = self.enemy GetShootAtPos() - self GetShootAtPos(); + vectorToEnemy = VectorNormalize(vectortoenemy); + pitchDelta = 360 - VectorToAngles(vectorToEnemy)[0]; + return AngleClamp180( pitchDelta ); +} +getPitchToSpot(spot) +{ + if(!IsDefined(spot)) + { + return 0; + } + vectorToEnemy = spot - self GetShootAtPos(); + vectorToEnemy = VectorNormalize(vectortoenemy); + pitchDelta = 360 - VectorToAngles(vectorToEnemy)[0]; + return AngleClamp180( pitchDelta ); +} +anim_set_next_move_to_new_cover() +{ + self.a.next_move_to_new_cover = randomintrange( 1, 4 ); +} +watchReloading() +{ + self.isreloading = false; + while(1) + { + self waittill("reload_start"); + self maps\_dds::dds_notify_reload( self GetCurrentWeapon(), ( self.team == "allies" ) ); + self.isreloading = true; + self waittillreloadfinished(); + self.isreloading = false; + } +} +waittillReloadFinished() +{ + self thread timedNotify( 4, "reloadtimeout" ); + self endon("reloadtimeout"); + while(1) + { + self waittill("reload"); + weap = self getCurrentWeapon(); + if ( weap == "none" ) + { + break; + } + if ( self getCurrentWeaponClipAmmo() >= weaponClipSize( weap ) ) + { + break; + } + } + self notify("reloadtimeout"); +} +timedNotify( time, msg ) +{ + self endon( msg ); + wait time; + self notify( msg ); +} +attackEnemyWhenFlashed() +{ + self endon("killanimscript"); + while(1) + { + if ( !IsDefined( self.enemy ) || !IsAlive( self.enemy ) || !IsSentient( self.enemy ) ) + { + self waittill("enemy"); + continue; + } + attackSpecificEnemyWhenFlashed(); + } +} +attackSpecificEnemyWhenFlashed() +{ + self endon("enemy"); + self.enemy endon("death"); + if ( IsDefined( self.enemy.flashendtime ) && GetTime() < self.enemy.flashendtime ) + { + tryToAttackFlashedEnemy(); + } + while ( 1 ) + { + self.enemy waittill("flashed"); + tryToAttackFlashedEnemy(); + } +} +tryToAttackFlashedEnemy() +{ + if ( self.enemy.flashingTeam != self.team ) + { + return; + } + if ( DistanceSquared( self.origin, self.enemy.origin ) > 1024*1024 ) + { + return; + } + while ( GetTime() < self.enemy.flashendtime - 500 ) + { + if ( !self cansee( self.enemy ) && DistanceSquared( self.origin, self.enemy.origin ) < 800*800 ) + { + tryRunningToEnemy( true ); + } + wait .05; + } +} +shouldThrowFlashBangAtEnemy() +{ + if ( DistanceSquared( self.origin, self.enemy.origin ) > 768 * 768 ) + { + return false; + } + return true; +} +startFlashBanged() +{ + if ( IsDefined( self.flashduration ) ) + { + duration = self.flashduration; + } + else + { + duration = self getFlashBangedStrength() * 1000; + } + self.flashendtime = GetTime() + duration; + self notify("flashed"); + return duration; +} +monitorFlash() +{ + self endon("death"); + self endon("stop_monitoring_flash"); + while(1) + { + self waittill( "flashbang", amount_distance, amount_angle, attacker, attackerteam ); + if ( self.flashbangImmunity ) + { + continue; + } + if( IsDefined( self.script_immunetoflash ) && self.script_immunetoflash != 0 ) + { + continue; + } + if ( IsDefined( self.team ) && IsDefined( attackerteam ) && self.team == attackerteam ) + { + amount_distance = 3 * (amount_distance - .75); + if ( amount_distance < 0 ) + { + continue; + } + } + minamountdist = 0.2; + if ( amount_distance > 1 - minamountdist ) + { + amount_distance = 1.0; + } + else + { + amount_distance = amount_distance / (1 - minamountdist); + } + duration = 4.5 * amount_distance; + if ( duration < 0.25 ) + { + continue; + } + self.flashingTeam = attackerteam; + self SetFlashBanged( true, duration ); + self notify( "doFlashBanged", attacker ); + } +} +isSniper() +{ + return self.isSniper; +} +isSniperRifle( weapon ) +{ + return WeaponClass(weapon) == "rifle" && WeaponIsSemiAuto(weapon) && WeaponFireTime(weapon) > 0.2; +} +isCrossbow( weapon ) +{ + return ( IsSubstr(weapon, "crossbow") && !IsSubstr(weapon, "explosive") ); +} +NeedToRechamber( ) +{ + if ( self usingBoltActionWeapon() && self.bulletsInClip && self.a.needsToRechamber ) + { + return true; + } + return false; +} +getShootAnimPrefix() +{ + if( self.a.script == "cover_left" || self.a.script == "cover_right" || self.a.script == "cover_pillar" ) + { + if( IsDefined(self.cornerAiming) && self.cornerAiming && IsDefined(self.a.cornerMode) && self.a.cornerMode == "lean" ) + { + return "lean_"; + } + } + return ""; +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/death.gsc b/BO1/PC/ZM/animscripts/death.gsc new file mode 100644 index 0000000..2be530e --- /dev/null +++ b/BO1/PC/ZM/animscripts/death.gsc @@ -0,0 +1,2057 @@ +#include common_scripts\utility; +#include animscripts\utility; +#include animscripts\anims; +#include maps\_utility; +#using_animtree( "generic_human" ); +main() +{ + self trackScriptState( "Death Main", "code" ); + self endon( "killanimscript" ); + self stopsounds(); + if( IsDefined( self.coverLookAtTrigger ) ) + { + self.coverLookAtTrigger Delete(); + } + self flamethrower_stop_shoot(); + self LookAtEntity(); + if( IsDefined( level.missionCallbacks ) ) + { + } + if( self.a.nodeath == true ) + { + wait 0.1; + return; + } + if( IsDefined( self.deathFunction ) ) + { + successful_death = self[[self.deathFunction]](); + if( !IsDefined( successful_death ) || successful_death ) + { + return; + } + } + changeTime = 0.3; + self ClearAnim( %scripted_look_straight, changeTime ); + self ClearAnim( %scripted_talking, changeTime ); + animscripts\utility::initialize( "death" ); + self notify( "never look at anything again" ); + removeSelfFrom_SquadLastSeenEnemyPos( self.origin ); + anim.numDeathsUntilCrawlingPain--; + anim.numDeathsUntilCornerGrenadeDeath--; + if( IsDefined( self.deathanim ) ) + { + return playCustomDeathAnim(); + } + explosiveDamage = self call_overloaded_func( "animscripts\pain", "wasDamagedByExplosive" ); + explosiveDamage = explosiveDamage && ( !IsDefined(self.noExplosiveDeathAnim) || !self.noExplosiveDeathAnim ); + if( self.damageLocation == "helmet" ) + { + self helmetPop(); + } + else if( explosiveDamage && RandomInt( 2 ) == 0 ) + { + self helmetPop(); + } + self ClearAnim( %root, 0.3 ); + playDeathSound(); + if( explosiveDamage && play_explosion_death() ) + { + return; + } + if( special_death() ) + { + return; + } + if( play_flame_death_anim() ) + { + return; + } + if( play_gas_death_anim() ) + { + return; + } + if( play_bulletgibbed_death_anim() ) + { + return; + } + if( GetDvarFloat( #"kill_slowmo_time" ) > 0 ) + { + if( damageLocationIsAny( "head", "helmet" ) ) + { + self thread goSlowMo(); + } + } + if( play_bayonet_death_anim() ) + { + return; + } + if( play_hit_by_vehicle_anim() ) + { + return; + } + deathAnim = get_death_anim(); + play_death_anim( deathAnim ); +} +play_hit_by_vehicle_anim() +{ + if( self.damagemod == "MOD_CRUSH" ) + { + deathAnim = get_death_anim(); + self thread play_death_anim( deathAnim ); + self thread do_gib(); + self launch_ragdoll_based_on_damage_type(); + wait 0.5; + return true; + } + return false; +} +goSlowMo() +{ + if( GetPlayers().size > 1 ) + { + return; + } + if( !IsPlayer(self.attacker) ) + { + return; + } + if( self.team == self.attacker.team ) + { + return; + } + SetTimeScale(0.2); + time = GetDvarFloat( #"kill_slowmo_time" ); + wait(time); + SetTimeScale(1); +} +waitForRagdoll( time ) +{ + wait( time ); + do_ragdoll = true; + if( is_true(self.nodeathragdoll) ) + { + do_ragdoll = false; + } + if( IsDefined( self ) && do_ragdoll ) + { + self StartRagDoll(); + } + if( IsDefined( self ) ) + { + self animscripts\shared::DropAllAIWeapons(); + } +} +get_extended_death_seq( deathAnim ) +{ + deathSeq = []; + if( animArrayExist("flameA_start") && deathAnim == animArray("flameA_start") ) + { + deathSeq[0] = animArray("flameA_start"); + deathSeq[1] = animArray("flameA_loop"); + deathSeq[2] = animArray("flameA_end"); + } + else if( animArrayExist("flameB_start") && deathAnim == animArray("flameB_start") ) + { + deathSeq[0] = animArray("flameB_start"); + deathSeq[1] = animArray("flameB_loop"); + deathSeq[2] = animArray("flameB_end"); + } + else if( animArrayExist("gasA_start") && deathAnim == animArray("gasA_start") ) + { + deathSeq[0] = animArray("gasA_start"); + deathSeq[1] = animArray("gasA_loop"); + deathSeq[2] = animArray("gasA_end"); + } + else if( animArrayExist("gasB_start") && deathAnim == animArray("gasB_start") ) + { + deathSeq[0] = animArray("gasB_start"); + deathSeq[1] = animArray("gasB_loop"); + deathSeq[2] = animArray("gasB_end"); + } + else if( animArrayExist("left_leg_start") && deathAnim == animArray("left_leg_start") ) + { + deathSeq[0] = animArray("left_leg_start"); + deathSeq[1] = animArray("left_leg_loop"); + deathSeq[2] = animArray("left_leg_end"); + } + else if( animArrayExist("right_leg_start") && deathAnim == animArray("right_leg_start") ) + { + deathSeq[0] = animArray("right_leg_start"); + deathSeq[1] = animArray("right_leg_loop"); + deathSeq[2] = animArray("right_leg_end"); + } + else if( animArrayExist("torso_start") && deathAnim == animArray("torso_start") ) + { + deathSeq[0] = animArray("torso_start"); + deathSeq[1] = animArray("torso_loop"); + deathSeq[2] = animArray("torso_end"); + } + if( deathSeq.size == 3 ) + { + return deathSeq; + } + return undefined; +} +play_death_anim( deathAnim ) +{ + deathSeq = get_extended_death_seq( deathAnim ); + if( IsDefined( deathSeq ) ) + { + do_extended_death( deathSeq ); + self maps\_dds::dds_notify_casualty(); + return; + } + self thread death_anim_short_circuit(); + if( !animHasNoteTrack( deathAnim, "dropgun" ) && !animHasNoteTrack( deathAnim, "fire_spray" ) ) + { + self animscripts\shared::DropAllAIWeapons(); + } + if( animHasNoteTrack( deathAnim, "death_neckgrab_spurt" ) && is_mature() ) + { + PlayFXOnTag( anim._effect["death_neckgrab_spurt"], self, "j_neck" ); + } + if( is_true(self.skipDeathAnim) ) + { + self thread do_gib(); + self launch_ragdoll_based_on_damage_type(); + wait 0.5; + return; + } + else + { + if( IsDefined(self.animTranslationScale) && self.animTranslationScale > 0 ) + { + self setFlaggedAnimKnobAllRestart( "deathanim", deathAnim, %body, 1, .1, 1.0 / self.animTranslationScale ); + } + else + { + self setFlaggedAnimKnobAllRestart( "deathanim", deathAnim, %body, 1, .1 ); + } + } + self thread do_gib(); + if( !animHasNotetrack( deathanim, "start_ragdoll" ) ) + { + self thread waitForRagdoll( getanimlength( deathanim ) * 0.35 ); + } + self animscripts\shared::DoNoteTracks( "deathanim" ); + self animscripts\shared::DropAllAIWeapons(); + self maps\_dds::dds_notify_casualty(); +} +special_death() +{ + if( self.a.special == "none" ) + { + return false; + } + switch( self.a.special ) + { + case "cover_right": + if( self.a.pose == "stand" ) + { + deathArray = animArray("cover_right_front"); + DoDeathFromArray( deathArray ); + } + else + { + assert( self.a.pose == "crouch" ); + return false; + } + return true; + case "cover_left": + if( self.a.pose == "stand" ) + { + deathArray = animArray("cover_left_front"); + DoDeathFromArray( deathArray ); + } + else + { + assert( self.a.pose == "crouch" ); + return false; + } + return true; + case "cover_stand": + if( self.a.pose == "stand" ) + { + deathArray = animArray("cover_stand_front"); + } + else + { + assert( self.a.pose == "crouch" ); + deathArray = array( animArray("cover_crouch_front_1"), animArray("cover_crouch_front_2") ); + } + DoDeathFromArray( deathArray ); + return true; + case "cover_crouch": + deathArray = []; + if( damageLocationIsAny( "head", "neck" ) &&( self.damageyaw > 135 || self.damageyaw <= -45 ) ) + { + deathArray[deathArray.size] = animArray("cover_crouch_front_1"); + } + if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = animArray("cover_crouch_back"); + } + deathArray[deathArray.size] = animArray("cover_crouch_front_2"); + DoDeathFromArray( deathArray ); + return true; + case "cover_pillar": + deathArray = []; + if( ( self.damageyaw > -135 ) &&( self.damageyaw <= -45 ) ) + { + deathArray[deathArray.size] = animArrayPickRandom("cover_pillar_left"); + } + if( ( self.damageyaw < 135 ) &&( self.damageyaw > 45 ) ) + { + deathArray[deathArray.size] = animArrayPickRandom("cover_pillar_right"); + } + else + { + deathArray[deathArray.size] = animArrayPickRandom("cover_pillar_front"); + } + DoDeathFromArray( deathArray ); + return true; + case "saw": + DoDeathFromArray( array( animArray("front") ) ); + return true; + case "dying_crawl": + assertex( self.a.pose == "prone" || self.a.pose == "back", self.a.pose ); + deathArray = animArray("crawl"); + DoDeathFromArray( deathArray ); + return true; + case "bleeder_death": + if( self.a.pose == "back" ) + { + deathArray = animArray("crawl"); + DoDeathFromArray( deathArray ); + return true; + } + return false; + } + return false; +} +DoDeathFromArray( deathArray ) +{ + deathAnim = deathArray[RandomInt( deathArray.size )]; + play_death_anim( deathAnim ); +} +helmetPop() +{ + if( !IsDefined( self ) ) + { + return; + } + if( !IsDefined( self.hatModel ) || !ModelHasPhysPreset( self.hatModel ) ) + { + return; + } + partName = GetPartName( self.hatModel, 0 ); + origin = self GetTagOrigin( partName ); + angles = self GetTagAngles( partName ); + helmetLaunch( self.hatModel, origin, angles, self.damageDir ); + hatModel = self.hatModel; + self.hatModel = undefined; + self.helmetPopper = self.attacker; + wait 0.05; + if( !IsDefined( self ) ) + { + return; + } + self detach( hatModel, "" ); +} +helmetLaunch( model, origin, angles, damageDir ) +{ + launchForce = damageDir; + launchForce = launchForce * RandomFloatRange( 1100, 4000 ); + forcex = launchForce[0]; + forcey = launchForce[1]; + forcez = RandomFloatRange( 800, 3000 ); + contactPoint = self.origin +( RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ) ) * 5; + CreateDynEntAndLaunch( model, origin, angles, contactPoint, ( forcex, forcey, forcez ) ); +} +removeSelfFrom_SquadLastSeenEnemyPos( org ) +{ + for( i = 0; i < anim.squadIndex.size; i++ ) + { + anim.squadIndex[i] clearSightPosNear( org ); + } +} +clearSightPosNear( org ) +{ + if( !IsDefined( self.sightPos ) ) + { + return; + } + if( distance( org, self.sightPos ) < 80 ) + { + self.sightPos = undefined; + self.sightTime = GetTime(); + } +} +shouldDoRunningForwardDeath() +{ + if( self.a.movement != "run" ) + { + return false; + } + if( self getMotionAngle() > 60 || self getMotionAngle() < -60 ) + { + return false; + } + if( ( self.damageyaw >= 135 ) ||( self.damageyaw <= -135 ) ) + { + return true; + } + if( ( self.damageyaw >= -45 ) &&( self.damageyaw <= 45 ) ) + { + return true; + } + return false; +} +get_death_anim() +{ + if( self.a.pose == "stand" ) + { + if( shouldDoRunningForwardDeath() ) + { + return getRunningForwardDeathAnim(); + } + return getStandDeathAnim(); + } + else if( self.a.pose == "crouch" ) + { + return getCrouchDeathAnim(); + } + else if( self.a.pose == "prone" ) + { + return getProneDeathAnim(); + } + else + { + assert( self.a.pose == "back" ); + return getBackDeathAnim(); + } +} +getRunningForwardDeathAnim() +{ + deathArray = []; + if( WeaponClass( self.damageWeapon ) == "spread" ) + { + deathArray = getStandPowerDeathAnimArray(); + } + else if( animscripts\combat_utility::isCrossbow(self.damageWeapon) ) + { + deathArray = getRunCrossbowDeathAnimArray(); + } + else + { + deathArray[deathArray.size] = animArray("run_back_1", "death"); + deathArray[deathArray.size] = animArray("run_back_2", "death"); + if( ( self.damageyaw >= 135 ) ||( self.damageyaw <= -135 ) ) + { + deathArray[deathArray.size] = animArray("run_front_1", "death"); + deathArray[deathArray.size] = animArray("run_front_2", "death"); + } + else if( ( self.damageyaw >= -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = animArray("run_back_1", "death"); + deathArray[deathArray.size] = animArray("run_back_2", "death"); + } + } + deathArray = array_removeUndefined( deathArray ); + deathArray = call_overloaded_func( "animscripts\pain", "removeBlockedAnims", deathArray ); + if( !deathArray.size ) + { + return getStandDeathAnim(); + } + return deathArray[RandomInt( deathArray.size )]; +} +getStandDeathAnim() +{ + deathArray = []; + if( weaponAnims() == "pistol" ) + { + deathArray = getStandPistolDeathAnimArray(); + } + else if( self usingGasWeapon() ) + { + deathArray[deathArray.size] = animArray("front", "death"); + } + else if( self usingRocketLauncher() && RandomFloat( 1 ) > 0.65 ) + { + deathArray = getStandRPGDeathAnimArray(); + } + else if( WeaponClass( self.damageWeapon ) == "spread" ) + { + deathArray = getStandPowerDeathAnimArray(); + } + else if( animscripts\combat_utility::isSniperRifle(self.damageWeapon) ) + { + deathArray = getStandSniperDeathAnimArray(); + } + else if( animscripts\combat_utility::isCrossbow(self.damageWeapon) ) + { + deathArray = getStandCrossbowDeathAnimArray(); + } + else + { + if( damageLocationIsAny( "torso_lower", "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = animArray("groin", "death"); + deathArray[deathArray.size] = animArray("gutshot", "death"); + deathArray[deathArray.size] = animArray("crotch", "death"); + deathArray[deathArray.size] = animArray("guts", "death"); + deathArray[deathArray.size] = animArray("leg", "death"); + } + else if( damageLocationIsAny( "torso_upper", "torso_lower" ) ) + { + deathArray[deathArray.size] = animArray("torso_start", "death"); + deathArray[deathArray.size] = animArray("deadfallknee", "death"); + deathArray[deathArray.size] = animArray("forwardtoface", "death"); + if( damageLocationIsAny( "torso_upper" ) ) + { + deathArray[deathArray.size] = animArray("nerve", "death"); + deathArray[deathArray.size] = animArray("tumbleforward", "death"); + deathArray[deathArray.size] = animArray("fallside", "death"); + } + } + else if( damageLocationIsAny( "head", "helmet" ) ) + { + deathArray[deathArray.size] = animArray("head_1", "death"); + deathArray[deathArray.size] = animArray("head_2", "death"); + deathArray[deathArray.size] = animArray("collapse", "death"); + } + else if( damageLocationIsAny( "neck" ) ) + { + deathArray[deathArray.size] = animArray("neckgrab", "death"); + deathArray[deathArray.size] = animArray("neckgrab2", "death"); + } + if( longDeathAllowed() ) + { + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "left_foot" ) ) + { + deathArray[deathArray.size] = animArray("left_leg_start", "death"); + } + else if( damageLocationIsAny( "right_leg_upper", "right_leg_lower", "right_foot" ) ) + { + deathArray[deathArray.size] = animArray("right_leg_start", "death"); + } + } + if( ( self.damageyaw > 135 ) ||( self.damageyaw <= -135 ) ) + { + if( damageLocationIsAny( "torso_upper", "left_arm_upper", "right_arm_upper" ) ) + { + if( firingDeathAllowed() && RandomInt(100) < 35 ) + { + deathArray[deathArray.size] = animArray("firing_1", "death"); + deathArray[deathArray.size] = animArray("firing_2", "death"); + } + } + if ( damageLocationIsAny( "neck", "head", "helmet" ) ) + { + deathArray[ deathArray.size ] = animArray("face", "death"); + deathArray[ deathArray.size ] = animArray("headshot_slowfall", "death"); + deathArray[ deathArray.size ] = animArray("head_straight_back", "death"); + } + else if ( damageLocationIsAny( "torso_upper" ) ) + { + deathArray[ deathArray.size ] = animArray("tumbleback", "death"); + deathArray[ deathArray.size ] = animArray("chest_stunned", "death"); + deathArray[ deathArray.size ] = animArray("fall_to_knees_2", "death"); + } + else if ( damageLocationIsAny( "left_arm_upper" ) ) + { + deathArray[deathArray.size] = animArray("shoulder_stumble", "death"); + deathArray[deathArray.size] = animArray("shoulder_spin", "death"); + deathArray[deathArray.size] = animArray("shoulderback", "death"); + } + } + else if( ( self.damageyaw > 45 ) &&( self.damageyaw <= 135 ) ) + { + if( damageLocationIsAny( "torso_upper", "right_arm_upper", "head" ) ) + { + deathArray[deathArray.size] = animArray("fallforward", "death"); + } + deathArray[deathArray.size] = animArray("fall_to_knees_2", "death"); + } + else if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + if( usingGasWeapon() ) + { + deathArray = []; + deathArray[0] = animArray("back", "death"); + } + else + { + deathArray[deathArray.size] = animArray("fall_to_knees_1", "death"); + deathArray[deathArray.size] = animArray("fall_to_knees_2", "death"); + deathArray[deathArray.size] = animArray("stumblefall", "death"); + } + } + else + { + if( damageLocationIsAny( "torso_upper", "left_arm_upper", "head" ) ) + { + deathArray[deathArray.size] = animArray("twist", "death"); + deathArray[deathArray.size] = animArray("fallforward_b", "death"); + } + deathArray[deathArray.size] = animArray("fall_to_knees_2", "death"); + } + if( deathArray.size < 2 || RandomInt( 100 ) < 15 ) + { + deathArray[deathArray.size] = animArray("front", "death"); + deathArray[deathArray.size] = animArray("front_2", "death"); + } + assertex( deathArray.size > 0, deathArray.size ); + } + deathArray = array_removeUndefined( deathArray ); + if( deathArray.size == 0 ) + { + deathArray[deathArray.size] = animArray("front", "death"); + } + return deathArray[RandomInt( deathArray.size )]; +} +getStandRPGDeathAnimArray() +{ + deathArray = []; + deathArray[deathArray.size] = animArray("front", "death"); + deathArray[deathArray.size] = animArray("stagger", "death"); + return deathArray; +} +getStandPistolDeathAnimArray() +{ + deathArray = []; + if( abs( self.damageYaw ) < 50 ) + { + deathArray[deathArray.size] = animArray("back", "death"); + } + else + { + if( abs( self.damageYaw ) < 110 ) + { + deathArray[deathArray.size] = animArray("back", "death"); + } + if( damageLocationIsAny( "torso_lower", "torso_upper", "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = animArray("groin", "death"); + if( !damageLocationIsAny( "torso_upper" ) ) + { + deathArray[deathArray.size] = animArray("groin", "death"); + } + } + if( !damageLocationIsAny( "head", "neck", "helmet", "left_foot", "right_foot", "left_hand", "right_hand", "gun" ) && RandomInt( 2 ) == 0 ) + { + deathArray[deathArray.size] = animArray("head", "death"); + } + if( deathArray.size == 0 || damageLocationIsAny( "torso_lower", "torso_upper", "neck", "head", "helmet", "right_arm_upper", "left_arm_upper" ) ) + { + deathArray[deathArray.size] = animArray("front", "death"); + } + } + return deathArray; +} +getStandPowerDeathAnimArray() +{ + deathArray = []; + if( damageLocationIsAny( "neck" ) ) + { + deathArray[deathArray.size] = animArray("neckgrab", "death"); + deathArray[deathArray.size] = animArray("neckgrab2", "death"); + } + if( ( self.damageyaw > 135 ) ||( self.damageyaw <= -135 ) ) + { + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = animArray("faceplant", "death"); + } + else + { + deathArray[deathArray.size] = animArray("armslegsforward", "death"); + deathArray[deathArray.size] = animArray("flyback", "death"); + deathArray[deathArray.size] = animArray("flyback_far", "death"); + deathArray[deathArray.size] = animArray("jackiespin_inplace", "death"); + deathArray[deathArray.size] = animArray("heavy_flyback", "death"); + deathArray[deathArray.size] = animArray("chest_blowback", "death"); + deathArray[deathArray.size] = animArray("chest_spin", "death"); + } + } + else if( ( self.damageyaw > 45 ) &&( self.damageyaw <= 135 ) ) + { + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = animArray("legsout_right", "death"); + } + else + { + deathArray[deathArray.size] = animArray("jackiespin_left", "death"); + deathArray[deathArray.size] = animArray("chest_spin", "death"); + } + } + else if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = animArray("gib_no_legs_start", "death"); + } + else + { + deathArray[deathArray.size] = animArray("jackiespin_vertical", "death"); + deathArray[deathArray.size] = animArray("faceplant", "death"); + } + } + else + { + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = animArray("legsout_left", "death"); + } + else + { + deathArray[deathArray.size] = animArray("jackiespin_right", "death"); + } + } + assertex( deathArray.size > 0, deathArray.size ); + return deathArray; +} +getStandSniperDeathAnimArray() +{ + deathArray = []; + if( ( self.damageyaw > 135 ) ||( self.damageyaw <= -135 ) ) + { + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = animArray("faceplant", "death"); + } + else if( damageLocationIsAny( "torso_upper", "neck", "head", "helmet" ) ) + { + deathArray[deathArray.size] = animArray("upontoback", "death"); + } + else + { + deathArray[deathArray.size] = animArray("flatonback", "death"); + } + } + else if( ( self.damageyaw > 45 ) &&( self.damageyaw <= 135 ) ) + { + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = animArray("legsout_right", "death"); + } + else + { + deathArray[deathArray.size] = animArray("legsout_left", "death"); + } + } + else if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = animArray("gib_no_legs_start", "death"); + } + else + { + deathArray[deathArray.size] = animArray("faceplant", "death"); + } + } + else + { + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "right_leg_upper", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = animArray("legsout_left", "death"); + } + else + { + deathArray[deathArray.size] = animArray("legsout_right", "death"); + } + } + assertex( deathArray.size > 0, deathArray.size ); + return deathArray; +} +getStandCrossbowDeathAnimArray() +{ + deathArray = []; + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "left_foot" ) ) + { + deathArray[deathArray.size] = animArray("crossbow_l_leg", "death"); + deathArray[deathArray.size] = animArray("left_leg_start", "death"); + } + else if( damageLocationIsAny( "right_leg_upper", "right_leg_lower", "right_foot" ) ) + { + deathArray[deathArray.size] = animArray("crossbow_r_leg", "death"); + deathArray[deathArray.size] = animArray("right_leg_start", "death"); + } + else if( damageLocationIsAny( "left_arm_upper", "left_arm_lower", "left_hand" ) ) + { + deathArray[deathArray.size] = animArray("crossbow_l_arm", "death"); + } + else if( damageLocationIsAny( "right_arm_upper", "right_arm_lower", "right_arm" ) ) + { + deathArray[deathArray.size] = animArray("crossbow_r_arm", "death"); + } + else if( damageLocationIsAny( "neck" ) ) + { + deathArray[deathArray.size] = animArray("neckgrab", "death"); + deathArray[deathArray.size] = animArray("neckgrab2", "death"); + } + else if( damageLocationIsAny( "head", "helmet" ) ) + { + deathArray[deathArray.size] = animArray("head_1", "death"); + deathArray[deathArray.size] = animArray("head_2", "death"); + deathArray[deathArray.size] = animArray("collapse", "death"); + } + else if( ( self.damageyaw > 135 ) ||( self.damageyaw <= -135 ) ) + { + deathArray[deathArray.size] = animArray("crossbow_front", "death"); + deathArray[deathArray.size] = animArray("front", "death"); + deathArray[deathArray.size] = animArray("front_2", "death"); + } + else if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = animArray("crossbow_back", "death"); + deathArray[deathArray.size] = animArray("fall_to_knees_1", "death"); + deathArray[deathArray.size] = animArray("fall_to_knees_2", "death"); + deathArray[deathArray.size] = animArray("stumblefall", "death"); + } + else + { + deathArray[deathArray.size] = animArray("front", "death"); + deathArray[deathArray.size] = animArray("front_2", "death"); + } + assertex( deathArray.size > 0, deathArray.size ); + return deathArray; +} +getRunCrossbowDeathAnimArray() +{ + deathArray = []; + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "left_foot" ) ) + { + deathArray[deathArray.size] = animArray("crossbow_run_l_leg", "death"); + } + else if( damageLocationIsAny( "right_leg_upper", "right_leg_lower", "right_foot" ) ) + { + deathArray[deathArray.size] = animArray("crossbow_run_r_leg", "death"); + } + else if( damageLocationIsAny( "left_arm_upper", "left_arm_lower", "left_hand" ) ) + { + deathArray[deathArray.size] = animArray("crossbow_run_l_arm", "death"); + } + else if( damageLocationIsAny( "right_arm_upper", "right_arm_lower", "right_arm" ) ) + { + deathArray[deathArray.size] = animArray("crossbow_run_r_arm", "death"); + } + else if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = animArray("crossbow_run_back", "death"); + } + else if( ( self.damageyaw > 135 ) ||( self.damageyaw <= -135 ) ) + { + if( damageLocationIsAny( "head", "helmet", "neck" ) ) + { + deathArray[deathArray.size] = animArray("run_front_2", "death"); + } + else + { + deathArray[deathArray.size] = animArray("crossbow_run_front", "death"); + } + } + else + { + deathArray[deathArray.size] = animArray("crossbow_run_front", "death"); + } + deathArray = array_removeUndefined( deathArray ); + deathArray = call_overloaded_func( "animscripts\pain", "removeBlockedAnims", deathArray ); + if( !deathArray.size ) + { + deathArray[deathArray.size] = getStandDeathAnim(); + } + return deathArray; +} +getCrouchDeathAnim() +{ + deathArray = []; + if( self usingGasWeapon() ) + { + deathArray[deathArray.size] = animArray("front", "death"); + } + else + { + if( damageLocationIsAny( "head", "neck" ) ) + { + deathArray[deathArray.size] = animArray("front", "death"); + } + if( damageLocationIsAny( "torso_upper", "torso_lower", "left_arm_upper", "right_arm_upper", "neck" ) ) + { + deathArray[deathArray.size] = animArray("front_3", "death"); + } + if( deathArray.size < 2 ) + { + deathArray[deathArray.size] = animArray("front_2", "death"); + } + if( deathArray.size < 2 ) + { + deathArray[deathArray.size] = animArray("front_3", "death"); + } + } + deathArray = array_removeUndefined( deathArray ); + assertex( deathArray.size > 0, deathArray.size ); + return deathArray[RandomInt( deathArray.size )]; +} +getProneDeathAnim() +{ + return animArray("front", "death"); +} +getBackDeathAnim() +{ + return animArrayPickRandom("front", "death"); +} +tryAddDeathAnim( animName ) +{ + assert( !animHasNoteTrack( animName, "fire" ) && !animHasNoteTrack( animName, "fire_spray" ) ); + return animName; +} +tryAddFiringDeathAnim( animName ) +{ + assert( animHasNoteTrack( animName, "fire" ) || animHasNoteTrack( animName, "fire_spray" ) ); + return animName; +} +firingDeathAllowed() +{ + if ( !isdefined( self.weapon ) || !self animscripts\weaponList::usingAutomaticWeapon() ) + return false; + if ( self.a.weaponPos[ "right" ] == "none" ) + return false; + if( is_true(self.dieQuietly) ) + return false; + if( is_false(self.dofiringdeath) ) + return false; + return true; +} +longDeathAllowed() +{ + if ( is_true(level.disableLongDeaths) ) + return false; + if ( is_true(self.a.disableLongDeath) ) + return false; + return true; +} +play_explosion_death() +{ + if( self.damageLocation != "none" ) + { + return false; + } + if( self.a.pose == "prone" ) + { + return false; + } + wantUpwardsDeath = false; + deathArray = []; + if( self.a.movement != "run" ) + { + if( self.mayDoUpwardsDeath && GetTime() > anim.lastUpwardsDeathTime + 6000 ) + { + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_up_1") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_up_2") ); + wantUpwardsDeath = true; + get_gib_ref( "up" ); + } + else + { + if( ( self.damageyaw > 135 ) ||( self.damageyaw <= -135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_front_1") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_front_2") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_front_3") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_front_4") ); + get_gib_ref( "back" ); + } + else if( ( self.damageyaw > 45 ) &&( self.damageyaw <= 135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_right_1") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_right_2") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_right_3") ); + get_gib_ref( "left" ); + } + else if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_back_1") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_back_2") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_back_3") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_back_4") ); + get_gib_ref( "forward" ); + } + else + { + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_left_1") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_left_2") ); + get_gib_ref( "right" ); + } + } + } + else + { + if( self.mayDoUpwardsDeath && GetTime() > anim.lastUpwardsDeathTime + 2000 ) + { + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_up_1") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_up_2") ); + wantUpwardsDeath = true; + get_gib_ref( "up" ); + } + else + { + if( ( self.damageyaw > 135 ) ||( self.damageyaw <= -135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_run_front_1") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_run_front_2") ); + get_gib_ref( "back" ); + } + else if( ( self.damageyaw > 45 ) &&( self.damageyaw <= 135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_run_right_1") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_run_right_2") ); + get_gib_ref( "left" ); + } + else if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_run_back_1") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_run_back_2") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_run_back_3") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_run_back_4") ); + get_gib_ref( "forward" ); + } + else + { + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_run_left_1") ); + deathArray[deathArray.size] = tryAddDeathAnim( animArray("explode_run_left_2") ); + get_gib_ref( "right" ); + } + } + } + gib_chance = 50; + deathAnim = deathArray[RandomInt( deathArray.size )]; + if( GetDvar( #"scr_expDeathMayMoveCheck" ) == "on" ) + { + localDeltaVector = getMoveDelta( deathAnim, 0, 1 ); + endPoint = self localToWorldCoords( localDeltaVector ); + if( !self mayMoveToPoint( endPoint, false ) ) + { + if( try_gib_extended_death( gib_chance ) ) + { + return true; + } + return false; + } + } + self AnimMode( "nogravity" ); + if( try_gib_extended_death( gib_chance ) ) + { + return true; + } + if( wantUpwardsDeath ) + { + anim.lastUpwardsDeathTime = GetTime(); + } + play_death_anim( deathAnim ); + return true; +} +play_flame_death_anim() +{ + if(self.damagemod =="MOD_MELEE" ) + { + return false; + } + if ( !is_mature() ) + { + return false; + } + if( is_gib_restricted_build() ) + { + return false; + } + if(self.team == "axis") + { + level.bcOnFireTime = GetTime(); + level.bcOnFireOrg = self.origin; + } + if( !IsDefined( self.a.forceflamedeath ) || !self.a.forceflamedeath ) + { + if( self.damagemod != "MOD_BURNED" ) + { + return false; + } + } + deathArray = []; + if( self usingGasWeapon() ) + { + if( self.a.pose == "crouch" ) + { + deathArray[0] = animArray("flame_front_1"); + deathArray[1] = animArray("flame_front_2"); + deathArray[2] = animArray("flame_front_3"); + deathArray[3] = animArray("flame_front_4"); + deathArray[4] = animArray("flame_front_5"); + deathArray[5] = animArray("flame_front_6"); + deathArray[6] = animArray("flame_front_7"); + deathArray[7] = animArray("flame_front_8"); + } + else + { + deathArray[0] = animArray("flame_front_2"); + } + } + else + { + if( self.a.pose == "prone" ) + { + deathArray[0] = get_death_anim(); + } + else if( self.a.pose == "back" ) + { + deathArray[0] = get_death_anim(); + } + else if( self.a.pose == "crouch" ) + { + deathArray[0] = animArray("flame_front_1"); + deathArray[1] = animArray("flame_front_2"); + deathArray[2] = animArray("flame_front_3"); + deathArray[3] = animArray("flame_front_4"); + deathArray[4] = animArray("flame_front_5"); + deathArray[5] = animArray("flame_front_6"); + deathArray[6] = animArray("flame_front_7"); + deathArray[7] = animArray("flame_front_8"); + } + else + { + deathArray[0] = animArray("flame_front_1"); + deathArray[1] = animArray("flame_front_2"); + deathArray[2] = animArray("flame_front_3"); + deathArray[3] = animArray("flame_front_4"); + deathArray[4] = animArray("flame_front_5"); + deathArray[5] = animArray("flame_front_6"); + deathArray[6] = animArray("flame_front_7"); + deathArray[7] = animArray("flame_front_8"); + deathArray[8] = animArray("flameA_start"); + deathArray[9] = animArray("flameB_start"); + } + } + self.fire_footsteps = true; + if( deathArray.size == 0 ) + { + return false; + } + deathArray = call_overloaded_func( "animscripts\pain", "removeBlockedAnims", deathArray ); + if( deathArray.size == 0 ) + { + return false; + } + randomChoice = RandomInt( deathArray.size ); + self thread flame_death_fx(); + deathAnim = deathArray[randomChoice]; + play_death_anim( deathAnim ); + return true; +} +flame_death_fx() +{ + self endon( "death" ); + if ( is_true(self.is_on_fire) ) + { + return; + } + self.is_on_fire = true; + self thread on_fire_timeout(); + if ( GetDvar( #"zombiemode" ) != "1" ) + { + if(IsDefined(level.ACTOR_CHARRING)) + { + self SetClientFlag(level.ACTOR_CHARRING); + } + self StartTanning(); + } + if(self.team == "axis") + { + level.bcOnFireTime = GetTime(); + level.bcOnFireOrg = self.origin; + } + if( IsDefined( level._effect ) && IsDefined( level._effect["character_fire_death_torso"] ) ) + { + PlayFxOnTag( level._effect["character_fire_death_torso"], self, "J_SpineLower" ); + } + else + { + } + if( IsDefined( level._effect ) && IsDefined( level._effect["character_fire_death_sm"] ) ) + { + wait 1; + tagArray = []; + tagArray[0] = "J_Elbow_LE"; + tagArray[1] = "J_Elbow_RI"; + tagArray[2] = "J_Knee_RI"; + tagArray[3] = "J_Knee_LE"; + tagArray = randomize_array( tagArray ); + PlayFxOnTag( level._effect["character_fire_death_sm"], self, tagArray[0] ); + wait 1; + tagArray[0] = "J_Wrist_RI"; + tagArray[1] = "J_Wrist_LE"; + if( !IsDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" ) + { + tagArray[2] = "J_Ankle_RI"; + tagArray[3] = "J_Ankle_LE"; + } + tagArray = randomize_array( tagArray ); + PlayFxOnTag( level._effect["character_fire_death_sm"], self, tagArray[0] ); + PlayFxOnTag( level._effect["character_fire_death_sm"], self, tagArray[1] ); + } + else + { + } +} +on_fire_timeout() +{ + self endon ("death"); + wait 12; + if (IsDefined(self) && IsAlive(self)) + { + self.is_on_fire = false; + self notify ("stop_flame_damage"); + } +} +play_gas_death_anim() +{ + if ( !is_mature() ) + { + return false; + } + if( is_gib_restricted_build() ) + { + return false; + } + if( !IsDefined( self.a.forcegasdeath ) || !self.a.forcegasdeath ) + { + if( self.damagemod != "MOD_GAS" ) + { + return false; + } + } + deathArray = []; + if( self.a.pose == "stand" ) + { + deathArray[0] = animArray("gas_front_1"); + deathArray[1] = animArray("gas_front_2"); + deathArray[2] = animArray("gas_front_3"); + deathArray[3] = animArray("gas_front_4"); + deathArray[4] = animArray("gas_front_5"); + deathArray[5] = animArray("gas_front_6"); + deathArray[6] = animArray("gas_front_7"); + deathArray[7] = animArray("gas_front_8"); + deathArray[8] = animArray("gasA_start"); + deathArray[9] = animArray("gasB_start"); + } + else + { + deathArray[0] = get_death_anim(); + } + if( deathArray.size == 0 ) + { + return false; + } + deathArray = call_overloaded_func( "animscripts\pain", "removeBlockedAnims", deathArray ); + if( deathArray.size == 0 ) + { + return false; + } + randomChoice = RandomInt( deathArray.size ); + deathAnim = deathArray[randomChoice]; + play_death_anim( deathAnim ); + return true; +} +play_bulletgibbed_death_anim() +{ + maxDist = 300; + if( self.damagemod == "MOD_MELEE" ) + { + return false; + } + if ( IsDefined( self.no_gib ) && ( self.no_gib == 1 ) ) + { + return false; + } + gib_chance = 75; + shotty_gib = false; + force_gib = IsDefined( self.force_gib ) && self.force_gib; + if( WeaponClass( self.damageWeapon ) == "spread" ) + { + maxDist = 300; + shotty_gib = true; + distSquared = DistanceSquared( self.origin, self.attacker.origin ); + if( distSquared < 110*110 ) + { + gib_chance = 100; + } + else if( distSquared < 200*200 ) + { + gib_chance = 75; + } + else if( distSquared < 270*270 ) + { + gib_chance = 50; + } + else if( distSquared < 330*330 ) + { + if( RandomInt( 100 ) < 50 ) + { + gib_chance = 50; + } + else + { + return false; + } + } + else + { + return false; + } + } + else if( IsDefined(self.damageWeapon) && self.damageWeapon != "none" && IsSubStr( self.damageWeapon, "dragunov" ) ) + { + maxDist = WeaponMaxGibDistance( self.damageWeapon ); + gib_chance = 30; + } + else if( IsDefined(self.damageWeapon) && self.damageWeapon != "none" && WeaponDoGibbing( self.damageWeapon ) ) + { + maxDist = WeaponMaxGibDistance( self.damageWeapon ); + gib_chance = 101; + } + else if( !force_gib ) + { + return false; + } + if( force_gib ) + { + maxDist = 6000; + gib_chance = 101; + } + if( !IsDefined( self.attacker ) || !IsDefined( self.damageLocation ) ) + { + return false; + } + if( self.damagetaken < 50 && !shotty_gib && !force_gib) + { + return false; + } + self.a.gib_ref = undefined; + distSquared = DistanceSquared( self.origin, self.attacker.origin ); + if( RandomInt( 100 ) < gib_chance && distSquared < maxDist*maxDist && (force_gib || GetTime() > anim.lastGibTime + anim.gibDelay) ) + { + anim.lastGibTime = GetTime(); + refs = []; + switch( self.damageLocation ) + { + case "torso_upper": + case "torso_lower": + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + break; + case "right_arm_upper": + case "right_arm_lower": + case "right_hand": + refs[refs.size] = "right_arm"; + break; + case "left_arm_upper": + case "left_arm_lower": + case "left_hand": + refs[refs.size] = "left_arm"; + break; + case "right_leg_upper": + case "right_leg_lower": + case "right_foot": + refs[refs.size] = "right_leg"; + refs[refs.size] = "no_legs"; + break; + case "left_leg_upper": + case "left_leg_lower": + case "left_foot": + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + break; + case "helmet": + case "head": + refs[refs.size] = "head"; + break; + } + if( is_true(self.thunder_death) ) + { + refs = []; + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + refs[refs.size] = "head"; + } + if( IsDefined( self.custom_gib_refs ) ) + { + refs = self.custom_gib_refs; + } + if( refs.size ) + { + self.a.gib_ref = get_random( refs ); + } + } + range = 600; + nrange = -600; + self.gib_vel = self.damagedir * RandomIntRange( 500, 900 ); + self.gib_vel += ( RandomIntRange( nrange, range ), RandomIntRange( nrange, range ), RandomIntRange( 400, 1000 ) ); + if( try_gib_extended_death( 50 ) ) + { + return true; + } + deathAnim = get_death_anim(); + play_death_anim( deathAnim ); + return true; +} +isValidGibRef( gib_ref ) +{ + refs = []; + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + refs[refs.size] = "head"; + if( is_in_array( refs, gib_ref ) ) + return true; + return false; +} +try_gib_extended_death( chance ) +{ + if( RandomInt( 100 ) >= chance ) + { + return false; + } + if( self.a.pose == "prone" || self.a.pose == "back" ) + { + return false; + } + if( is_true(self.noGibDeathAnim) ) + { + return false; + } + if( !is_true(self.dieQuietly) && self.type == "human" ) + { + self thread animscripts\face::SaySpecificDialogue( undefined, "chr_spl_generic_gib_" + self.voice, 1.6 ); + } + deathseq = get_gib_extended_death_anims(); + if( deathSeq.size == 3 ) + { + do_extended_death( deathSeq ); + return true; + } + return false; +} +do_extended_death( deathSeq ) +{ + self animscripts\shared::DropAllAIWeapons(); + self thread do_gib(); + self SetPlayerCollision(false); + self thread death_anim_short_circuit(); + self setFlaggedAnimKnobAllRestart( "deathhitanim", deathSeq[0], %body, 1, .1 ); + self animscripts\shared::DoNoteTracks( "deathhitanim" ); + self notify( "stop_death_anim_short_circuit" ); + self thread end_extended_death( deathSeq ); + numDeathLoops = RandomInt( 2 ) + 1; + self thread extended_death_loop( deathSeq, numDeathLoops ); + self waittill( "extended_death_ended" ); +} +end_extended_death( deathSeq ) +{ + assert( IsDefined( deathSeq[2] ) ); + self waittill_any( "damage_afterdeath", "ending_extended_death" ); + self setFlaggedAnimKnobAllRestart( "deathdieanim", deathSeq[2], %body, 1, .1 ); + self animscripts\shared::DoNoteTracks( "deathdieanim" ); + self notify( "extended_death_ended" ); +} +extended_death_loop( deathSeq, numLoops ) +{ + self endon( "damage" ); + assert( IsDefined( deathSeq[1] ) ); + animLength = GetAnimLength( deathSeq[1] ); + for( i = 0; i < numLoops; i++ ) + { + self setFlaggedAnimKnobAllRestart( "deathloopanim", deathSeq[1], %body, 1, .1 ); + self animscripts\shared::DoNoteTracks( "deathloopanim" ); + } + self notify( "ending_extended_death" ); +} +get_gib_extended_death_anims() +{ + hitfrom = undefined; + if( ( self.damageyaw > 90 ) ||( self.damageyaw <= -90 ) ) + { + hitfrom = "front"; + } + else + { + hitfrom = "back"; + } + gib_ref = self.a.gib_ref; + deathSeq = []; + if( IsDefined( hitfrom ) && IsDefined( gib_ref ) && gib_ref != "head" ) + { + hitIndex = 0; + loopIndex = 1; + dieIndex = 2; + if( gib_ref == "guts" || gib_ref == "no_legs" ) + { + hitfrom = ""; + } + else + { + hitfrom = "_" + hitfrom; + } + deathSeq[hitIndex] = animArray("gib_" + gib_ref + hitfrom + "_start"); + deathSeq[loopIndex] = animArray("gib_" + gib_ref + hitfrom + "_loop"); + deathSeq[dieIndex] = animArray("gib_" + gib_ref + hitfrom + "_end"); + } + return deathSeq; +} +randomize_array( array ) +{ + for( i = 0; i < array.size; i++ ) + { + j = RandomInt( array.size ); + temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + return array; +} +play_bayonet_death_anim() +{ + if( self.damagemod != "MOD_BAYONET" ) + { + return false; + } + if( self.a.pose != "stand" ) + { + return false; + } + deathAnim = ""; + side = "front"; + if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathAnim = animArray("bayonet_back"); + side = "back"; + } + else if( ( self.damageyaw > 45 ) &&( self.damageyaw <= 135 ) ) + { + deathAnim = animArray("bayonet_right"); + side = "right"; + } + else if( ( self.damageyaw < -45 ) &&( self.damageyaw >= -135 ) ) + { + deathAnim = animArray("bayonet_left"); + side = "left"; + } + else if( damageLocationIsAny( "helmet", "head", "neck", "torso_upper" ) ) + { + deathAnim = animArray("bayonet_head"); + side = "front"; + } + else + { + deathAnim = animArray("bayonet_front"); + side = "front"; + } + if( GetDvarInt( #"cg_blood" ) > 0 ) + { + self thread bayonet_death_fx( side ); + } + play_death_anim( deathAnim ); + return true; +} +get_tag_for_damage_location() +{ + tag = "J_SpineLower"; + if( self.damagelocation == "helmet" ) + { + tag = "j_head"; + } + else if( self.damagelocation == "head" ) + { + tag = "j_head"; + } + else if( self.damagelocation == "neck" ) + { + tag = "j_neck"; + } + else if( self.damagelocation == "torso_upper" ) + { + tag = "j_spineupper"; + } + else if( self.damagelocation == "torso_lower" ) + { + tag = "j_spinelower"; + } + else if( self.damagelocation == "right_arm_upper" ) + { + tag = "j_elbow_ri"; + } + else if( self.damagelocation == "left_arm_upper" ) + { + tag = "j_elbow_le"; + } + else if( self.damagelocation == "right_arm_lower" ) + { + tag = "j_wrist_ri"; + } + else if( self.damagelocation == "left_arm_lower" ) + { + tag = "j_wrist_le"; + } + return tag; +} +bayonet_death_fx( side ) +{ + tag = self get_tag_for_damage_location(); + if( IsDefined( level._effect ) && IsDefined( level._effect["character_bayonet_blood_in"] ) ) + { + PlayFxOnTag( level._effect["character_bayonet_blood_in"], self, tag ); + } + else + { + } + wait 0.2; + if( IsDefined( level._effect ) ) + { + if( !IsDefined( level._effect["character_bayonet_blood_front"] ) || + !IsDefined( level._effect["character_bayonet_blood_back"] ) || + !IsDefined( level._effect["character_bayonet_blood_left"] ) || + !IsDefined( level._effect["character_bayonet_blood_right"] ) ) + { + println( "^3ANIMSCRIPT WARNING: You are missing level._effect[\"character_bayonet_blood_out\"], please set it in your levelname_fx.gsc." ); + println( "^3\"impacts/fx_flesh_bayonet_fatal_fr\" and " ); + println( "^3\"impacts/fx_flesh_bayonet_fatal_bk\" and " ); + println( "^3\"impacts/fx_flesh_bayonet_fatal_rt\" and " ); + println( "^3\"impacts/fx_flesh_bayonet_fatal_lf\"." ); + } + else + { + if( side == "front" ) + { + PlayFxOnTag( level._effect["character_bayonet_blood_front"], self, "j_spine4" ); + } + else if( side == "back" ) + { + PlayFxOnTag( level._effect["character_bayonet_blood_back"], self, "j_spine4" ); + } + else if( side == "right" ) + { + PlayFxOnTag( level._effect["character_bayonet_blood_right"], self, "j_spine4" ); + } + else if( side == "left" ) + { + PlayFxOnTag( level._effect["character_bayonet_blood_left"], self, "j_spine4" ); + } + } + } + else + { + } +} +get_gib_ref( direction ) +{ + if( IsDefined( self.a.gib_ref ) ) + { + return; + } + if( self.damageTaken < 165 ) + { + return; + } + if( GetTime() > anim.lastGibTime + anim.gibDelay && anim.totalGibs > 0 ) + { + anim.totalGibs--; + anim thread set_last_gib_time(); + refs = []; + switch( direction ) + { + case "right": + refs[refs.size] = "left_arm"; + refs[refs.size] = "left_leg"; + gib_ref = get_random( refs ); + break; + case "left": + refs[refs.size] = "right_arm"; + refs[refs.size] = "right_leg"; + gib_ref = get_random( refs ); + break; + case "forward": + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + gib_ref = get_random( refs ); + break; + case "back": + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + gib_ref = get_random( refs ); + break; + default: + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + gib_ref = get_random( refs ); + break; + } + self.a.gib_ref = gib_ref; + } + else + { + self.a.gib_ref = undefined; + } +} +set_last_gib_time() +{ + anim notify( "stop_last_gib_time" ); + anim endon( "stop_last_gib_time" ); + wait( 0.05 ); + anim.lastGibTime = GetTime(); + anim.totalGibs = RandomIntRange( anim.minGibs, anim.maxGibs ); +} +get_random( array ) +{ + return array[RandomInt( array.size )]; +} +do_gib() +{ + if( !is_mature() ) + { + return; + } + if( is_gib_restricted_build() ) + { + return; + } + if( !IsDefined( self.a.gib_ref ) ) + { + return; + } + if( self is_zombie_gibbed() ) + { + return; + } + if ( IsDefined(self.damageWeapon) ) + { + if (isSubStr( self.damageWeapon, "flame" ) || isSubStr( self.damageWeapon, "molotov" ) || isSubStr( self.damageWeapon, "napalmblob" ) ) + { + return; + } + } + self set_zombie_gibbed(); + if( GetDvarFloat( #"kill_slowmo_time" ) > 0 ) + { + self thread goSlowMo(); + } + gib_ref = self.a.gib_ref; + limb_data = get_limb_data( gib_ref ); + if( !IsDefined( limb_data ) ) + { + return; + } + forward = undefined; + velocity = undefined; + pos1 = []; + pos2 = []; + velocities = []; + if( gib_ref == "head" ) + { + self Detach( self.headModel, "" ); + self helmetPop(); + if( IsDefined( self.hatModel ) ) + { + self detach( self.hatModel, "" ); + self.hatModel = undefined; + } + } + if( limb_data["spawn_tags"][0] != "" ) + { + if( IsDefined( self.gib_vel ) ) + { + for( i = 0; i < limb_data["spawn_tags"].size; i++ ) + { + velocities[i] = self.gib_vel; + } + } + else + { + for( i = 0; i < limb_data["spawn_tags"].size; i++ ) + { + pos1[pos1.size] = self GetTagOrigin( limb_data["spawn_tags"][i] ); + } + wait( 0.05 ); + for( i = 0; i < limb_data["spawn_tags"].size; i++ ) + { + pos2[pos2.size] = self GetTagOrigin( limb_data["spawn_tags"][i] ); + } + for( i = 0; i < pos1.size; i++ ) + { + forward = VectorNormalize( pos2[i] - pos1[i] ); + velocities[i] = forward * RandomIntRange( 600, 1000 ); + velocities[i] = velocities[i] +( 0, 0, RandomIntRange( 400, 700 ) ); + } + } + } + if( IsDefined( limb_data["fx"] ) ) + { + for( i = 0; i < limb_data["spawn_tags"].size; i++ ) + { + if( limb_data["spawn_tags"][i] == "" ) + { + continue; + } + PlayFxOnTag( anim._effect[limb_data["fx"]], self, limb_data["spawn_tags"][i] ); + } + } + PlaySoundAtPosition( "chr_death_gibs", self.origin ); + self thread maps\_dds::dds_notify( "gib", ( self.team != "allies" ) ); + self thread throw_gib( limb_data["spawn_models"], limb_data["spawn_tags"], velocities ); + self SetModel( limb_data["body_model"] ); + self Attach( limb_data["legs_model"] ); +} +precache_gib_fx() +{ + anim._effect["animscript_gib_fx"] = LoadFx( "weapon/bullet/fx_flesh_gib_fatal_01" ); + anim._effect["animscript_gibtrail_fx"] = LoadFx( "trail/fx_trail_blood_streak" ); + anim._effect["death_neckgrab_spurt"] = LoadFx( "impacts/fx_flesh_hit_neck_fatal" ); +} +get_limb_data( gib_ref ) +{ + temp_array = []; + torsoDmg1_defined = IsDefined( self.torsoDmg1 ); + torsoDmg2_defined = IsDefined( self.torsoDmg2 ); + torsoDmg3_defined = IsDefined( self.torsoDmg3 ); + torsoDmg4_defined = IsDefined( self.torsoDmg4 ); + torsoDmg5_defined = IsDefined( self.torsoDmg5 ); + legDmg1_defined = IsDefined( self.legDmg1 ); + legDmg2_defined = IsDefined( self.legDmg2 ); + legDmg3_defined = IsDefined( self.legDmg3 ); + legDmg4_defined = IsDefined( self.legDmg4 ); + gibSpawn1_defined = IsDefined( self.gibSpawn1 ); + gibSpawn2_defined = IsDefined( self.gibSpawn2 ); + gibSpawn3_defined = IsDefined( self.gibSpawn3 ); + gibSpawn4_defined = IsDefined( self.gibSpawn4 ); + gibSpawn5_defined = IsDefined( self.gibSpawn5 ); + gibSpawnTag1_defined = IsDefined( self.gibSpawnTag1 ); + gibSpawnTag2_defined = IsDefined( self.gibSpawnTag2 ); + gibSpawnTag3_defined = IsDefined( self.gibSpawnTag3 ); + gibSpawnTag4_defined = IsDefined( self.gibSpawnTag4 ); + gibSpawnTag5_defined = IsDefined( self.gibSpawnTag5 ); + if( torsoDmg2_defined && legDmg1_defined && gibSpawn1_defined && gibSpawnTag1_defined ) + { + temp_array["right_arm"]["body_model"] = self.torsoDmg2; + temp_array["right_arm"]["legs_model"] = self.legDmg1; + temp_array["right_arm"]["spawn_models"][0] = self.gibSpawn1; + temp_array["right_arm"]["spawn_tags"][0] = self.gibSpawnTag1; + temp_array["right_arm"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg3_defined && legDmg1_defined && gibSpawn2_defined && gibSpawnTag2_defined ) + { + temp_array["left_arm"]["body_model"] = self.torsoDmg3; + temp_array["left_arm"]["legs_model"] = self.legDmg1; + temp_array["left_arm"]["spawn_models"][0] = self.gibSpawn2; + temp_array["left_arm"]["spawn_tags"][0] = self.gibSpawnTag2; + temp_array["left_arm"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg1_defined && legDmg2_defined && gibSpawn3_defined && gibSpawnTag3_defined ) + { + temp_array["right_leg"]["body_model"] = self.torsoDmg1; + temp_array["right_leg"]["legs_model"] = self.legDmg2; + temp_array["right_leg"]["spawn_models"][0] = self.gibSpawn3; + temp_array["right_leg"]["spawn_tags"][0] = self.gibSpawnTag3; + temp_array["right_leg"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg1_defined && legDmg3_defined && gibSpawn4_defined && gibSpawnTag4_defined ) + { + temp_array["left_leg"]["body_model"] = self.torsoDmg1; + temp_array["left_leg"]["legs_model"] = self.legDmg3; + temp_array["left_leg"]["spawn_models"][0] = self.gibSpawn4; + temp_array["left_leg"]["spawn_tags"][0] = self.gibSpawnTag4; + temp_array["left_leg"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg1_defined && legDmg4_defined && gibSpawn4_defined && gibSpawn3_defined && gibSpawnTag3_defined && gibSpawnTag4_defined ) + { + temp_array["no_legs"]["body_model"] = self.torsoDmg1; + temp_array["no_legs"]["legs_model"] = self.legDmg4; + temp_array["no_legs"]["spawn_models"][0] = self.gibSpawn4; + temp_array["no_legs"]["spawn_models"][1] = self.gibSpawn3; + temp_array["no_legs"]["spawn_tags"][0] = self.gibSpawnTag4; + temp_array["no_legs"]["spawn_tags"][1] = self.gibSpawnTag3; + temp_array["no_legs"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg4_defined && legDmg1_defined ) + { + temp_array["guts"]["body_model"] = self.torsoDmg4; + temp_array["guts"]["legs_model"] = self.legDmg1; + temp_array["guts"]["spawn_models"][0] = ""; + temp_array["guts"]["spawn_tags"][0] = ""; + temp_array["guts"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg5_defined && legDmg1_defined ) + { + temp_array["head"]["body_model"] = self.torsoDmg5; + temp_array["head"]["legs_model"] = self.legDmg1; + if( gibSpawn5_defined && gibSpawnTag5_defined ) + { + temp_array["head"]["spawn_models"][0] = self.gibSpawn5; + temp_array["head"]["spawn_tags"][0] = self.gibSpawnTag5; + } + else + { + temp_array["head"]["spawn_models"][0] = ""; + temp_array["head"]["spawn_tags"][0] = ""; + } + temp_array["head"]["fx"] = "animscript_gib_fx"; + } + if( IsDefined( temp_array[gib_ref] ) ) + { + return temp_array[gib_ref]; + } + else + { + return undefined; + } +} +throw_gib( spawn_models, spawn_tags, velocities ) +{ + if( velocities.size < 1 ) + { + return; + } + for( i = 0; i < spawn_models.size; i++ ) + { + origin = self GetTagOrigin( spawn_tags[i] ); + angles = self GetTagAngles( spawn_tags[i] ); + CreateDynEntAndLaunch( spawn_models[i], origin, angles, origin, velocities[i], anim._effect["animscript_gibtrail_fx"], 1 ); + } +} +death_anim_short_circuit() +{ + self endon( "stop_death_anim_short_circuit" ); + wait 0.3; + totalDamageTaken = 0; + while( 1 ) + { + self waittill( "damage_afterdeath", damagetaken, attacker, dir, point, mod ); + waittillframeend; + if( IsDefined( self.damageMod ) && self.damageMod != "MOD_BURNED" ) + { + totalDamageTaken += self.damageTaken; + if( totalDamageTaken > 100 ) + { + self launch_ragdoll_based_on_damage_type(); + break; + } + } + } +} +launch_ragdoll_based_on_damage_type( bullet_scale ) +{ + if( self call_overloaded_func( "animscripts\pain", "wasDamagedByExplosive" ) ) + { + force = 1.6; + } + else if( WeaponClass( self.damageWeapon ) == "spread" ) + { + distSquared = DistanceSquared( self.origin, self.attacker.origin ); + maxDistSquared = 300*300; + if( distSquared > maxDistSquared ) + { + distSquared = maxDistSquared; + } + force = .3; + force += .7 *( 1.0 - ( distSquared /( maxDistSquared ) ) ); + } + else + { + if( self.damagetaken < 75 ) + { + force = .35; + } + else + { + force = .45; + } + if( IsDefined( bullet_scale ) ) + { + force *= bullet_scale; + } + } + initial_force = self.damagedir + ( 0, 0, 0.2 ); + initial_force *= 60 * force; + if( damageLocationIsAny( "head", "helmet", "neck" ) ) + { + initial_force *= 0.5; + } + self startragdoll(); + self launchragdoll( initial_force, self.damageLocation ); +} +playCustomDeathAnim() +{ + if( !animHasNoteTrack( self.deathanim, "dropgun" ) && !animHasNoteTrack( self.deathanim, "fire_spray" ) ) + { + self animscripts\shared::DropAllAIWeapons(); + } + self thread do_gib(); + self SetFlaggedAnimKnobAll( "deathanim", self.deathanim, %root, 1, .05, 1 ); + if( !animHasNotetrack( self.deathanim, "start_ragdoll" ) ) + { + self thread waitForRagdoll( getanimlength( self.deathanim ) * 0.35 ); + } + self animscripts\shared::DoNoteTracks( "deathanim" ); + if( IsDefined( self.deathanimloop ) ) + { + self SetFlaggedAnimKnobAll( "deathanim", self.deathanimloop, %root, 1, .05, 1 ); + for( ;; ) + { + self animscripts\shared::DoNoteTracks( "deathanim" ); + } + } + return; +} +playDeathSound() +{ + if( !damageLocationIsAny( "head", "helmet" ) ) + { + if( !is_true(self.dieQuietly) ) + { + self animscripts\face::SayGenericDialogue( "death" ); + if (IsDefined(self.team)) + { + self maps\_dds::dds_notify_mod( ( self.team != "allies" ) ); + } + } + } + else + { + if( self.damageLocation == "helmet" && IsDefined( self.hatModel ) && + ModelHasPhysPreset( self.hatModel ) && + issubstr(self.hatmodel, "helm") ) + { + self PlaySound( "prj_bullet_impact_headshot_helmet" ); + } + else + { + self PlaySound( "prj_bullet_impact_headshot" ); + } + if (IsDefined(self.team)) + { + self maps\_dds::dds_notify_mod( ( self.team != "allies" ), "headshot" ); + } + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/debug.gsc b/BO1/PC/ZM/animscripts/debug.gsc new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/BO1/PC/ZM/animscripts/debug.gsc differ diff --git a/BO1/PC/ZM/animscripts/face.gsc b/BO1/PC/ZM/animscripts/face.gsc new file mode 100644 index 0000000..447fe74 Binary files /dev/null and b/BO1/PC/ZM/animscripts/face.gsc differ diff --git a/BO1/PC/ZM/animscripts/melee.gsc b/BO1/PC/ZM/animscripts/melee.gsc new file mode 100644 index 0000000..21a0050 --- /dev/null +++ b/BO1/PC/ZM/animscripts/melee.gsc @@ -0,0 +1,513 @@ +#include maps\_utility; +#include animscripts\Utility; +#include animscripts\SetPoseMovement; +#include animscripts\Combat_Utility; +#include animscripts\Debug; +#include animscripts\anims; +#include common_scripts\Utility; +#using_animtree ("generic_human"); +MeleeCombat() +{ + self endon("killanimscript"); + self melee_notify_wrapper(); + assert( CanMeleeAnyRange() ); + if(IsDefined(level.allow_ai_vs_ai_melee )) + { + doingAIMelee = (isAI( self.enemy ) && self.enemy.type == "human"); + } + else + { + doingAIMelee = false; + } + if ( doingAiMelee ) + { + assert( animscripts\utility::okToMelee( self.enemy ) ); + animscripts\utility::IAmMeleeing( self.enemy ); + AiVsAiMeleeCombat(); + animscripts\utility::ImNotMeleeing( self.enemy ); + scriptChange(); + return; + } + realMelee = true; + if ( animscripts\utility::okToMelee(self.enemy) ) + { + animscripts\utility::IAmMeleeing(self.enemy); + } + else + { + realMelee = false; + } + self thread EyesAtEnemy(); + self OrientMode("face enemy"); + MeleeDebugPrint("Melee begin"); + self AnimMode( "zonly_physics" ); + resetGiveUpTime(); + first_time = true; + for ( ;; ) + { + if ( !PrepareToMelee(first_time) ) + { + self.lastMeleeGiveUpTime = GetTime(); + break; + } + first_time = false; + assert( self.a.pose == "stand"); + MeleeDebugPrint("Melee main loop" + RandomInt(100)); + if ( !realMelee && animscripts\utility::okToMelee(self.enemy) ) + { + realMelee = true; + animscripts\utility::IAmMeleeing(self.enemy); + } + self thread EyesAtEnemy(); + self OrientMode("face current"); + if ( self maps\_bayonet::has_bayonet() && RandomInt( 100 ) < 0 ) + { + self SetFlaggedAnimKnobAllRestart("meleeanim", animArray("bayonet"), %body, 1, .2, 1); + } + else + { + self SetFlaggedAnimKnobAllRestart("meleeanim", animArray("melee"), %body, 1, .2, 1); + } + while ( 1 ) + { + self waittill("meleeanim", note); + if ( note == "end" ) + { + break; + } + else if ( note == "fire" ) + { + if ( !IsDefined( self.enemy ) ) + { + break; + } + oldhealth = self.enemy.health; + self melee(); + if ( self.enemy.health < oldhealth ) + { + resetGiveUpTime(); + } + } + else if ( note == "stop" ) + { + if ( !CanContinueToMelee() ) + { + break; + } + } + } + self OrientMode("face default"); + } + if (realMelee) + { + animscripts\utility::ImNotMeleeing(self.enemy); + } + self AnimMode("none"); + self thread backToCombat(); +} +backToCombat() +{ + self notify("killanimscript"); + waittillframeend; + self thread animscripts\combat::main(); + self notify ("stop EyesAtEnemy"); + self notify ("stop_melee_debug_print"); + scriptChange(); +} +resetGiveUpTime() +{ + if ( DistanceSquared( self.origin, self.enemy.origin ) > anim.chargeRangeSq ) + { + self.giveUpOnMeleeTime = GetTime() + randomintrange( 2700, 3300 ); + } + else + { + self.giveUpOnMeleeTime = GetTime() + randomintrange( 1700, 2300 ); + } +} +MeleeDebugPrint(text) +{ + return; + self.meleedebugprint = text; + self thread meleeDebugPrintThreadWrapper(); +} +meleeDebugPrintThreadWrapper() +{ + if ( !IsDefined(self.meleedebugthread) ) + { + self.meleedebugthread = true; + self meleeDebugPrintThread(); + self.meleedebugthread = undefined; + } +} +meleeDebugPrintThread() +{ + self endon("death"); + self endon("killanimscript"); + self endon("stop_melee_debug_print"); + while(1) + { + Print3d(self.origin + (0,0,60), self.meleedebugprint, (1,1,1), 1, .1); + wait .05; + } +} +debug_melee_on_actor() +{ + return false; +} +debug_melee( msg ) +{ +} +debug_melee_line( start, end, color, duration ) +{ +} +getEnemyPose() +{ + if ( IsPlayer( self.enemy ) ) + { + return self.enemy getStance(); + } + else + { + return self.enemy.a.pose; + } +} +CanContinueToMelee() +{ + return CanMeleeInternal( "already started" ); +} +CanMeleeAnyRange() +{ + return CanMeleeInternal( "any range" ); +} +CanMeleeDesperate() +{ + return CanMeleeInternal( "long range" ); +} +CanMelee() +{ + return CanMeleeInternal( "normal" ); +} +CanMeleeInternal( state ) +{ + if ( !IsSentient( self.enemy ) ) + { + debug_melee( "Not doing melee - Does not have a valid target." ); + return false; + } + if (!IsAlive(self.enemy)) + { + return false; + } + if ( IsDefined( self.disableMelee ) ) + { + assert( self.disableMelee ); + debug_melee( "Not doing melee - Melee is disabled, self.disableMelee is set to true." ); + return false; + } + if (self.a.pose != "stand") + { + debug_melee( "Not doing melee - Cant melee in " + self.a.pose ); + return false; + } + enemypose = getEnemyPose(); + if ( !IsPlayer( self.enemy ) && enemypose != "stand" && enemypose != "crouch" ) + { + if ( !( self is_banzai() && enemypose == "prone" ) ) + { + debug_melee( "Not doing melee - Enemy is in prone." ); + return false; + } + } + yaw = abs(getYawToEnemy()); + if ( self.a.allow_shooting && ((yaw > 60 && state != "already started") || yaw > 110) ) + { + debug_melee( "Not doing melee - Not facing the enemy." ); + return false; + } + enemyPoint = self.enemy GetOrigin(); + vecToEnemy = enemyPoint - self.origin; + self.enemyDistanceSq = lengthSquared( vecToEnemy ); + nearest_enemy_sqrd_dist = self GetClosestEnemySqDist(); + epsilon = 0.1; + if( IsDefined( nearest_enemy_sqrd_dist ) && ( nearest_enemy_sqrd_dist - epsilon > self.enemyDistanceSq ) ) + { + debug_melee( "Not doing melee - Entity " + self getEntityNumber() + " can't melee entity " + self.enemy getEntityNumber() + " at distSq " + self.enemyDistanceSq + " because there is a closer enemy at distSq " + nearest_enemy_sqrd_dist + "." ); + return false; + } + if(IsDefined(level.allow_ai_vs_ai_melee )) + { + doingAIMelee = (isAI( self.enemy ) && self.enemy.type == "human"); + } + else + { + doingAIMelee = false; + } + if ( doingAIMelee ) + { + if ( !animscripts\utility::okToMelee(self.enemy) ) + { + debug_melee( "Not doing melee - Enemy is already being meleed." ); + return false; + } + if ( IsDefined( self.magic_bullet_shield ) && self.magic_bullet_shield && IsDefined( self.enemy.magic_bullet_shield ) && self.enemy.magic_bullet_shield ) + { + debug_melee( "Not doing melee - Enemy has magic bullet shield." ); + return false; + } + if ( !isMeleePathClear( vecToEnemy, enemyPoint ) ) + { + self notify("melee_path_blocked"); + return false; + } + } + else + { + if ( IsDefined( self.enemy.magic_bullet_shield ) && self.enemy.magic_bullet_shield ) + { + if ( !( self is_banzai() ) ) + { + debug_melee( "Not doing melee - Enemy has magic bullet shield." ); + return false; + } + } + if (self.enemyDistanceSq <= anim.meleeRangeSq) + { + if ( !isMeleePathClear( vecToEnemy, enemyPoint ) ) + { + if ( !self is_banzai() ) + { + self notify("melee_path_blocked"); + return false; + } + } + return true; + } + else if ( self is_banzai() ) + { + return false; + } + if ( state != "any range" ) + { + chargeRangeSq = anim.chargeRangeSq; + if ( state == "long range" ) + { + chargeRangeSq = anim.chargeLongRangeSq; + } + if (self.enemyDistanceSq > chargeRangeSq) + { + debug_melee( "Not doing melee - Enemy is not close enough to charge." ); + return false; + } + } + if ( state == "already started" ) + { + return false; + } + if ( ( !self is_banzai() || IsPlayer( self.enemy ) ) && self.a.allow_shooting && IsDefined( self.lastMeleeGiveUpTime ) && GetTime() - self.lastMeleeGiveUpTime < 3000 ) + { + debug_melee( "Not doing melee - Recently meleed someone and missed." ); + return false; + } + if ( !animscripts\utility::okToMelee(self.enemy) ) + { + debug_melee( "Not doing melee - Enemy is being meleed." ); + return false; + } + if ( self.enemy animscripts\banzai::in_banzai_attack() ) + { + return false; + } + if ( self animscripts\banzai::in_banzai_attack() ) + { + return false; + } + if( !isMeleePathClear( vecToEnemy, enemyPoint ) ) + { + self notify("melee_path_blocked"); + return false; + } + } + return true; +} +isMeleePathClear( vecToEnemy, enemyPoint ) +{ + dirToEnemy = VectorNormalize( (vecToEnemy[0], vecToEnemy[1], 0 ) ); + meleePoint = enemyPoint - ( dirToEnemy[0]*32, dirToEnemy[1]*32, 0 ); + thread debug_melee_line( self.origin, meleePoint, ( 1,0,0 ), 1.5 ); + if ( !self IsInGoal( meleePoint ) ) + { + debug_melee( "Not doing melee - Enemy is outside not in goal." ); + return false; + } + if ( self maymovetopoint(meleePoint) ) + { + return true; + } + debug_melee( "Not doing melee - Can not move to the melee point, MayMoveToPoint failed." ); + return false; +} +PrepareToMelee(first_time) +{ + if ( !CanMeleeAnyRange() ) + { + return false; + } + if (self.enemyDistanceSq <= anim.meleeRangeSq) + { + isBatonGuard = IsDefined(self.baton_guard) && self.baton_guard; + isRegularAi = self.animType != "spetsnaz" && !isBatonGuard; + if( first_time || isRegularAi ) + { + self SetFlaggedAnimKnobAll("readyanim", animArray("stand_2_melee"), %body, 1, .3, 1); + self animscripts\shared::DoNoteTracks("readyanim"); + } + return true; + } + self PlayMeleeSound(); + prevEnemyPos = self.enemy.origin; + sampleTime = 0.1; + runToMeleeAnim = animArray("run_2_melee"); + raiseGunAnimTravelDist = length(getmovedelta(runToMeleeAnim, 0, 1)); + meleeAnimTravelDist = 32; + shouldRaiseGunDist = anim.meleeRange * 0.75 + meleeAnimTravelDist + raiseGunAnimTravelDist; + shouldRaiseGunDistSq = shouldRaiseGunDist * shouldRaiseGunDist; + shouldMeleeDist = anim.meleeRange + meleeAnimTravelDist; + shouldMeleeDistSq = shouldMeleeDist * shouldMeleeDist; + raiseGunFullDuration = getanimlength(runToMeleeAnim) * 1000; + raiseGunFinishDuration = raiseGunFullDuration - 100; + raiseGunPredictDuration = raiseGunFullDuration - 200; + raiseGunStartTime = 0; + predictedEnemyDistSqAfterRaiseGun = undefined; + runAnim = animscripts\run::GetRunAnim(); + self SetFlaggedAnimKnobAll("chargeanim", runAnim, %body, 1, .3, 1); + raisingGun = false; + while ( 1 ) + { + MeleeDebugPrint("PrepareToMelee loop" + RandomInt(100)); + time = GetTime(); + willBeWithinRangeWhenGunIsRaised = (IsDefined( predictedEnemyDistSqAfterRaiseGun ) && predictedEnemyDistSqAfterRaiseGun <= shouldRaiseGunDistSq); + if ( !raisingGun ) + { + if ( willBeWithinRangeWhenGunIsRaised ) + { + self SetFlaggedAnimKnobAllRestart("chargeanim", runToMeleeAnim, %body, 1, .2, 1); + raiseGunStartTime = time; + raisingGun = true; + } + } + else + { + withinRangeNow = self.enemyDistanceSq <= shouldRaiseGunDistSq; + if ( time - raiseGunStartTime >= raiseGunFinishDuration || (!willBeWithinRangeWhenGunIsRaised && !withinRangeNow) ) + { + self SetFlaggedAnimKnobAll("chargeanim", runAnim, %body, 1, .3, 1); + raisingGun = false; + } + } + self animscripts\shared::DoNoteTracksForTime(sampleTime, "chargeanim"); + if ( !CanMeleeAnyRange() ) + { + return false; + } + assert( IsDefined( self.enemyDistanceSq ) ); + enemyVel = vector_scale( self.enemy.origin - prevEnemyPos, 1 / (GetTime() - time) ); + prevEnemyPos = self.enemy.origin; + predictedEnemyPosAfterRaiseGun = self.enemy.origin + vector_scale( enemyVel, raiseGunPredictDuration ); + predictedEnemyDistSqAfterRaiseGun = DistanceSquared( self.origin, predictedEnemyPosAfterRaiseGun ); + if ( raisingGun && self.enemyDistanceSq <= shouldMeleeDistSq && GetTime() - raiseGunStartTime >= raiseGunFinishDuration ) + { + break; + } + if ( !raisingGun && GetTime() >= self.giveUpOnMeleeTime ) + { + return false; + } + } + return true; +} +PlayMeleeSound() +{ + if ( !IsDefined ( self.a.nextMeleeChargeSound ) ) + { + self.a.nextMeleeChargeSound = 0; + } + if ( GetTime() > self.a.nextMeleeChargeSound ) + { + self animscripts\face::SaySpecificDialogue( undefined, "chr_play_grunt_" + self.voice, 0.3 ); + self.a.nextMeleeChargeSound = GetTime() + 8000; + } +} +AiVsAiMeleeCombat() +{ + self endon("killanimscript"); + self melee_notify_wrapper(); + self OrientMode("face enemy"); + self ClearAnim( %root, 0.3 ); + IWin = ( RandomInt(10) < 8 ); + if ( IsDefined( self.magic_bullet_shield ) && self.magic_bullet_shield ) + { + IWin = true; + } + if ( IsDefined( self.enemy.magic_bullet_shield ) && self.enemy.magic_bullet_shield ) + { + IWin = false; + } + winAnim = animArray("ai_vs_ai_win"); + loseAnim = animArray("ai_vs_ai_lose"); + if ( IWin ) + { + myAnim = winAnim; + theirAnim = loseAnim; + } + else + { + myAnim = loseAnim; + theirAnim = winAnim; + } + desiredDistSqrd = 72 * 72; + self PlayMeleeSound(); + AiVsAiMeleeCharge( desiredDistSqrd ); + if ( DistanceSquared( self.origin, self.enemy.origin ) > desiredDistSqrd ) + { + return false; + } + self.meleePartner = self.enemy; + self.enemy.meleePartner = self; + self.enemy.meleeAnim = theirAnim; + self.enemy animcustom( ::AiVsAiAnimCustom ); + self.meleeAnim = myAnim; + self animcustom( ::AiVsAiAnimCustom ); +} +AiVsAiMeleeCharge( desiredDistSqrd ) +{ + giveUpTime = GetTime() + 2500; + self SetAnimKnobAll( animscripts\run::GetRunAnim(), %body, 1, 0.2 ); + while ( DistanceSquared( self.origin, self.enemy.origin ) > desiredDistSqrd && GetTime() < giveUpTime ) + { + wait .05; + } +} +AiVsAiAnimCustom() +{ + self endon("killanimscript"); + self AiVsAiMeleeAnim( self.meleeAnim ); +} +AiVsAiMeleeAnim( myAnim ) +{ + self endon("end_melee"); + self thread endMeleeOnKillanimscript(); + partnerDir = self.meleePartner.origin - self.origin; + self OrientMode( "face angle", VectorToAngles( partnerDir )[1] ); + self AnimMode( "zonly_physics" ); + self SetFlaggedAnimKnobAllRestart( "meleeAnim", myAnim, %body, 1, 0.2 ); + self animscripts\shared::DoNoteTracks( "meleeAnim" ); + self notify("end_melee"); +} +endMeleeOnKillanimscript() +{ + self endon("end_melee"); + self waittill("killanimscript"); + self.meleePartner notify("end_melee"); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/mg42/crouch.gsc b/BO1/PC/ZM/animscripts/mg42/crouch.gsc new file mode 100644 index 0000000..bfcfe36 Binary files /dev/null and b/BO1/PC/ZM/animscripts/mg42/crouch.gsc differ diff --git a/BO1/PC/ZM/animscripts/mg42/prone.gsc b/BO1/PC/ZM/animscripts/mg42/prone.gsc new file mode 100644 index 0000000..4d54b17 Binary files /dev/null and b/BO1/PC/ZM/animscripts/mg42/prone.gsc differ diff --git a/BO1/PC/ZM/animscripts/revive.gsc b/BO1/PC/ZM/animscripts/revive.gsc new file mode 100644 index 0000000..21a610f --- /dev/null +++ b/BO1/PC/ZM/animscripts/revive.gsc @@ -0,0 +1,540 @@ +#include maps\_utility; +#include common_scripts\utility; +#include animscripts\Utility; +#include animscripts\Debug; +#include maps\_anim; +#using_animtree ("generic_human"); +precacheReviveModels() +{ + if ( IsDefined( level.reviveFeature ) && !level.reviveFeature ) + return; + precacheModel( "char_rus_bandages1" ); +} +revive_main() +{ + anim.nextReviveSequenceTime = GetTime() + RandomIntRange(0, 20000); + anim.nextReviveSequencePlayerTimeMin = 15000; + anim.nextReviveSequencePlayerTimeMax = 30000; + anim.nextReviveSequenceTimeMin = 5000; + anim.nextReviveSequenceTimeMax = 10000; + anim.bleederBleedOutTimeMin = 5000; + anim.bleederBleedOutTimeMax = 10000; + anim.reviverPingDist = 512; + anim.reviverIgnorePlayerDistSq = 200*200; + anim.reviveSequencePlayerVisibleDistSq = 1000*1000; + anim.revive = []; + anim.bleed["stand"]["fall"] = %ai_revive_wounded_onback_fall_stand; + anim.bleed["crouch"]["fall"] = %ai_revive_wounded_onback_fall_crouch; + anim.bleed["prone"]["fall"] = %ai_dying_crawl_2_back_revive; + anim.bleed["bleed_loop"] = %ai_revive_wounded_onback_loop; + anim.bleed["left"]["being_revived"] = %ai_revive_wounded_onback_left_revive; + anim.bleed["left"]["get_up"] = %ai_revive_wounded_onback_left_get_up; + anim.revive["left"]["reviving"] = %ai_revive_reviver_onback_left_revive; + anim.revive["left"]["get_up"] = %ai_revive_reviver_onback_left_get_up; +} +revive_init() +{ + self.a.revivedOnce = false; + self.a.reviveMe = false; + self.a.falling = false; + self.a.bleeding = false; + self.a.isReviver = false; + self.a.isReviving = false; + self.a.canBleed = true; + self.a.canRevive = true; + self.a.reviver = undefined; + self.a.bleeder = undefined; + self.a.oldRevivers = []; +} +tryGoingDown(damage, hitloc) +{ + Assert(IsDefined(level.reviveFeature), "level.reviveFeature is not initialized."); + if(!level.reviveFeature) + return false; + if(!GetDvarInt( #"scr_aiReviveFeature")) + { + if(!shouldReviveSequenceHappen()) + return false; + } + if( !IsAI( self ) || !IsAlive(self) || (self.isdog) || (self.team != "axis") || (self.a.canBleed == false) || (self.a.pose == "back") ) + return false; + if( self.a.pose == "prone" ) + return false; + if( IsDefined( self.a.usingTurret ) ) + return false; + if(!GetDvarInt( #"scr_aiReviveFeature")) + { + friendlies = GetAIArray(self.team); + alive_nearby_ai = get_array_of_closest( self.origin, friendlies, undefined, undefined, anim.reviverPingDist ); + if( alive_nearby_ai.size <= 2 ) + return false; + } + if( (self.a.isreviver == false ) && (self.a.revivedOnce == false) && (self.a.reviveMe == false) && isAIDamageFatal(damage) && !damageLocation(hitloc) ) + { + if( !IsReviveOnSafeTerrain() ) + return false; + Assert(IsAlive(self) == true, "AI is already dead or in extended death and cant be put down."); + self.a.reviveMe = true; + self thread killMeOnScriptInterrupt(); + self.health = self.health + damage + RandomIntRange(60,100); + return true; + } + return false; +} +killMeOnScriptInterrupt() +{ + self endon( "death" ); + self waittill( "killanimscript" ); + self waittill( "killanimscript" ); + if( self isBleeder() && IsAlive(self) ) + { + self DoDamage( self.health + 200, self.origin ); + } +} +revive_strat() +{ + self endon("death"); + self endon("killanimscript"); + self thread bleeder_bleed_to_death(); + self thread fall_down_to_bleed(); + self waittill("ready_after_revived"); +} +reviver_selection_think(team) +{ + self endon("death"); + self endon("revived"); + self endon("reevaluate_reviver"); + self endon("killanimscript"); + Assert(IsAlive(self) == true, "AI is already dead or in extended death and cant be put down."); + if( self.a.revivedOnce != true ) + { + self waittill_players_goes_away(); + reviver_found = false; + while(!reviver_found) + { + friendlies = GetAIArray( self.team ); + if( self.a.oldRevivers.size > 0 ) + ai = get_array_of_closest( self.origin, friendlies, self.a.oldRevivers, undefined, anim.reviverPingDist ); + else + ai = get_array_of_closest( self.origin, friendlies, undefined, undefined, anim.reviverPingDist ); + for( i = 0; i < ai.size; i++ ) + { + current_ai = ai[i]; + if( isAIOldReviver( current_ai ) || ( current_ai.a.canRevive == false ) ) + continue; + if( IsDefined( current_ai.ignoreall ) && current_ai.ignoreall == true ) + continue; + if( ( current_ai != self ) && IsDefined( current_ai.a.revivedOnce ) && ( current_ai.a.reviveMe == false ) && ( current_ai.a.isReviver == false ) ) + { + AssertEx(IsDefined(self.predictedRevivePoint), "Predicted revive point is not calculated."); + if( findpath( current_ai.origin, self.predictedRevivePoint ) ) + { + reviver_found = true; + self.a.oldRevivers[self.a.oldRevivers.size] = current_ai; + self.a.reviver = current_ai; + current_ai.a.bleeder = self; + self thread revive_process(); + break; + } + } + } + if( !reviver_found ) + wait(2); + } + } +} +revive_process() +{ + self endon("death"); + self.a.reviver thread reviver_think(); + self thread handle_bleeder_death(); + self.a.reviver thread handle_reviver_death(); +} +waittill_players_goes_away() +{ + while( IsAlive(self) ) + { + player = get_closest_player(self.origin); + if( DistanceSquared( player.origin, self.origin) > anim.reviverIgnorePlayerDistSq ) + break; + wait(1); + } +} +handle_reviver_death() +{ + self endon("revive_complete"); + self endon("bleeder_death"); + self waittill_any( "death" ); + self free_reviver("death"); + wait(0.05); + if( IsDefined( self.a.bleeder ) && IsAlive(self.a.bleeder)) + { + if( self.a.revivedOnce ) + { + self.a.bleeder thread bleeder_getup(); + } + else + { + self .a.bleeder play_bleed_loop(); + self.a.bleeder thread reviver_selection_think(self.a.bleeder.team); + } + } +} +handle_reviver_goal_change() +{ + self endon("revive_complete"); + self endon("bleeder_death"); + self endon("reevaluate_reviver"); + self endon("reviving_bleeder"); + self waittill_any("goalradius_changed"); + self free_reviver("goalradius_changed"); + wait(0.05); + if( IsDefined( self.a.bleeder ) && IsAlive(self.a.bleeder) ) + { + if( self.a.revivedOnce ) + self.a.bleeder thread bleeder_getup(); + else + self.a.bleeder thread reviver_selection_think(self.a.bleeder.team); + } +} +handle_bleeder_death(reviver) +{ + self endon("revived"); + self endon("reevaluate_reviver"); + self waittill("death"); + self.a.reviver notify("bleeder_death"); + self.a.reviver free_reviver("bleeder_death"); +} +reviver_think() +{ + self endon("death"); + self endon("bleeder_death"); + self endon("reevaluate_reviver"); + self.a.isReviver = true; + while(!self.a.bleeder.a.bleeding) + { + wait(0.05); + } + self.ReviveOldgoalradius = self.goalradius; + self.goalradius = 4; + self thread handle_reviver_goal_change(); + revive_anim = getReviverReviveAnim(); + approach_angle = GetStartAngles( self.a.bleeder.origin, self.a.bleeder.angles, revive_anim ); + revive_point = getRevivePoint(self.a.bleeder); + self SetGoalPos(revive_point, approach_angle); + self waittill("goal"); + self reviver_revive(revive_anim, revive_point); +} +free_reviver(reason) +{ + self endon("death"); + if( IsDefined(self) ) + { + self.a.isReviver = false; + self.a.isReviving = false; + self.ignoreme = false; + if( IsDefined(reason) && ( (reason == "death") || (reason == "goalradius_changed" ) ) ) + { + self notify("reevaluate_reviver"); + self.a.bleeder notify("reevaluate_reviver"); + } + if( IsDefined(self.ReviveOldgoalradius) ) + self.goalradius = self.ReviveOldgoalradius; + if( IsAlive(self) && IsDefined(reason) && reason != "death" ) + { + self notify( "killanimscript" ); + waittillframeend; + self thread call_overloaded_func( "animscripts\combat", "main" ); + } + } +} +free_bleeder() +{ + self endon("death"); + if (IsDefined(self)) + { + self.a.reviveMe = false; + self.a.bleeding = false; + self.a.falling = false; + self.health = RandomIntRange(90, 120); + self notify("ready_after_revived"); + if( IsDefined( self.a.special ) && self.a.special == "bleeder_death" ) + self.a.special = "none"; + if( IsAlive(self) ) + { + self notify( "killanimscript" ); + waittillframeend; + self thread call_overloaded_func( "animscripts\combat", "main" ); + } + } +} +reviver_revive(revive_anim, revive_point) +{ + self endon("bleeder_death"); + self.a.isReviving = true; + bleeder = self.a.bleeder; + bleeder notify("being_revived"); + self notify("reviving_bleeder"); + self.ignoreme = true; + resetReviveSequenceTimer(); + bleeder SetFlaggedAnimKnob( "being_revived", getBleederReviveAnim(), 1, 0.1, 1 ); + self AnimScripted( "revive", bleeder.origin, bleeder.angles, revive_anim, "normal", %body, 1 ); + self animscripts\shared::DoNoteTracks("revive", ::handleReviverNotetracks); + self notify("revive_complete"); + self revive_getup_process(); +} +revive_getup_process() +{ + self.a.bleeder thread bleeder_getup(); + self animcustom( ::reviver_getup ); +} +bleeder_getup() +{ + self SetFlaggedAnimKnobAllRestart( "bleeder_get_up", getBleederGetUpAnim(), %body ,1, 0.1, 1.0 ); + self animscripts\shared::DoNoteTracks( "bleeder_get_up" ); + self free_bleeder(); +} +reviver_getup() +{ + self SetFlaggedAnimKnobAllRestart( "reviver_get_up", getReviverGetUpAnim(), %body, 1, 0.1, 1.0 ); + self animscripts\shared::DoNoteTracks( "reviver_get_up" ); + self free_reviver("revive_complete"); +} +bleeder_bleed_to_death() +{ + self endon("revived"); + self.bleedOutTime = RandomIntRange(anim.bleederBleedOutTimeMin,anim.bleederBleedOutTimeMax); + wait( self.bleedOutTime/1000 ); + if( IsDefined(self) && IsAlive(self) ) + self DoDamage( self.health + 200, self.origin ); +} +fall_down_to_bleed() +{ + self endon("death"); + self endon("revived"); + self endon("being_revived"); + self endon("killanimscript"); + self SetAnimKnobAll( %revive, %body, 1, 0.1, 1 ); + transAnim = getTransitionAnim(); + self.a.falling = true; + self SetFlaggedAnimKnob( "fall_transition", transAnim, 1, 0.1, 1.5 ); + self thread handleBleederNotetracks("fall_transition"); + self animscripts\shared::DoNoteTracks( "fall_transition"); + Assert( self.a.pose == "back", "Fall transition animation is missing the anim_pose = back notetrack." ); + self ClearAnim(transAnim, 0.2); + self.a.bleeding = true; + self play_bleed_loop(); +} +play_bleed_loop() +{ + self SetFlaggedAnimKnobAllRestart( "bleeding", getBleedLoopAnim(), %body ,1, 0.1, 1.0 ); +} +handleBleederNotetracks(anim_name) +{ + self endon("death"); + for (;;) + { + self waittill(anim_name, note); + switch ( note ) + { + case "reviver_selection": + { + self thread reviver_selection_think(self.team); + break; + } + case "anim_pose = \"back\"": + { + self.a.special = "bleeder_death"; + break; + } + } + if(note == "end") + { + break; + } + } +} +handleReviverNotetracks(note) +{ + switch ( note ) + { + case "attach_bandage": + { + bleeder = self.a.bleeder; + bleeder Attach("char_rus_bandages1"); + bleeder.a.revivedOnce = true; + bleeder notify("revived"); + break; + } + } +} +getTransitionAnim() +{ + assert( self.a.pose == "stand" || self.a.pose == "crouch" || self.a.pose == "prone" ); + transitionAnim = anim.bleed[self.a.pose]["fall"]; + Assert(animHasNoteTrack( transitionAnim, "anim_pose = \"back\"" )); + Assert(animHasNoteTrack( transitionAnim, "reviver_selection" )); + return transitionAnim; +} +getBleedLoopAnim() +{ + bleedLoopAnim = anim.bleed["bleed_loop"]; + return bleedLoopAnim; +} +getBleederReviveAnim() +{ + reviveAnim = anim.bleed["left"]["being_revived"]; + return reviveAnim; +} +getReviverReviveAnim() +{ + reviveAnim = anim.revive["left"]["reviving"]; + Assert(animHasNoteTrack( reviveAnim, "anim_pose = \"crouch\"" )); + Assert(animHasNoteTrack( reviveAnim, "attach_bandage" )); + return reviveAnim; +} +getBleederGetUpAnim() +{ + bleederGetUpAnim = anim.bleed["left"]["get_up"]; + Assert(animHasNoteTrack( bleederGetUpAnim, "anim_pose = \"stand\"" )); + return bleederGetUpAnim; +} +getReviverGetUpAnim() +{ + reviverGetUpAnim = anim.revive["left"]["get_up"]; + Assert(animHasNoteTrack( reviverGetUpAnim, "anim_pose = \"stand\"" )); + return reviverGetUpAnim; +} +damageLocation(hitloc) +{ + if( hitloc == "helmet" || hitloc == "head" ) + return true; + return false; +} +isAIOldReviver(ai) +{ + if( self.a.oldRevivers.size > 0 ) + { + for( i = 0; i < self.a.oldRevivers.size; i++ ) + { + if( IsDefined( self.a.oldRevivers[i] ) && self.a.oldRevivers[i] == ai ) + return true; + } + } + return false; +} +getRevivePoint(bleeder) +{ + revive_point = GetStartOrigin(bleeder.origin, bleeder.angles, getReviverReviveAnim() ); + return revive_point; +} +IsReviveOnSafeTerrain() +{ + self endon("death"); + groundPos = physicstrace( self.origin, self.origin - ( 0, 0, 10000 ) ); + bleederDistanceFromGround = distance( self.origin, groundPos ); + if( ( bleederDistanceFromGround > 2 ) || ( bleederDistanceFromGround < 0 ) ) + return false; + angleDelta = getAngleDelta(anim.bleed[self.a.pose]["fall"], 0, 1); + finalYaw = self.angles[1] + angleDelta; + finalAngles = ( self.angles[0], finalYaw, self.angles[2] ); + moveDelta = GetMoveDelta( anim.bleed[self.a.pose]["fall"], 0, 1 ); + endPoint = self localToWorldCoords( moveDelta ); + if( !self mayMoveToPoint( endPoint ) ) + return false; + self.predictedRevivePoint = getPredictedRevivePoint( endPoint, finalAngles ); + groundPos = physicstrace( self.predictedRevivePoint, self.predictedRevivePoint - ( 0, 0, 10000 ) ); + revivePointDistanceFromGround = distance( self.predictedRevivePoint, groundPos ); + if( revivePointDistanceFromGround < 0 || revivePointDistanceFromGround > 15 ) + return false; + diff = abs( bleederDistanceFromGround - revivePointDistanceFromGround ); + if( diff > 15 ) + return false; + return true; +} +getPredictedRevivePoint( endPoint, finalAngles ) +{ + revive_point = GetStartOrigin(endPoint, finalAngles, getReviverReviveAnim()); + return revive_point; +} +isAIDamageFatal(damage) +{ + Assert(IsAlive(self) == true, "AI is already dead or in extended death and cant be put down."); + health = self.health - damage; + if( health <= 0 ) + return true; + return false; +} +shouldBleed() +{ + self endon("death"); + Assert(IsAlive(self) == true, "AI is already dead or in extended death and cant be put down."); + Assert(IsAlive(self.a.revivedOnce) == false, "AI is already revived/bleeded once."); + if( ( self.a.reviveMe == true ) && ( self.a.bleeding == false ) && ( self.a.falling == false ) ) + return true; + return false; +} +isBleedingOrFalling() +{ + Assert(IsAlive(self) == true, "AI is already dead or in extended death and cant be put down."); + if( (self.a.bleeding == true) || (self.a.falling == true) ) + return true; + return false; +} +shouldReviveSequenceHappen() +{ + if ( GetTime() < anim.nextReviveSequenceTime ) + { + return false; + } + if( ( randomint(100) > 40 ) ) + return false; + return true; +} +resetReviveSequenceTimer() +{ + players = GetPlayers(); + anybody_nearby = 0; + for (i=0;i 0 && isValidEnemy( self.enemy ) ) + { + shouldShootWhileMoving = true; + if( self.a.pose == "stand" ) + { + runAnimName = "run_n_gun_f"; + } + if( call_overloaded_func( "animscripts\run", "ShouldShootWhileRunningBackward" ) ) + { + self OrientMode( "face direction", vector_scale(self.lookaheaddir, -1) ); + } + } + } + self SetAnimKnobLimited( animArray(runAnimName), 1, runAnimTransTime, 1 ); + if( shouldShootWhileMoving && self.a.pose == "stand" ) + { + self thread call_overloaded_func( "animscripts\run", "UpdateRunWeights", "BlendIntoStandRun", + forwardRunAnim, + animArray("run_n_gun_b") + ); + } + else if( useLeans && self.isfacingmotion ) + { + self thread call_overloaded_func( "animscripts\run", "UpdateRunWeights", "BlendIntoStandRun", + forwardRunAnim, + animArray("combat_run_b"), + animArray("combat_run_lean_l"), + animArray("combat_run_lean_r") + ); + } + else + { + self thread call_overloaded_func( "animscripts\run", "UpdateRunWeights", "BlendIntoStandRun", + forwardRunAnim, + animArray("combat_run_b"), + animArray("combat_run_l"), + animArray("combat_run_r") + ); + } + PlayBlendTransitionStandRun(transitionAnimParent); + } + self notify ("BlendIntoStandRun"); +} +PlayBlendTransitionStandWalk(animname) +{ + if (self.a.movement != "stop") + self endon("movemode"); + PlayBlendTransition(animname, 0.6, "stand", "walk", 1); +} +BlendIntoStandWalk() +{ + walkanim = animscripts\walk::getStandWalkAnim(); + PlayBlendTransitionStandWalk( walkanim ); +} +CrouchToStand() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToStand "+self.a.pose); + assertEX(self.a.movement == "stop", "SetPoseMovement::CrouchToStand "+self.a.movement); + standSpeed = 0.5; + if (IsDefined (self.fastStand)) + { + standSpeed = 1.8; + self.fastStand = undefined; + } + if ( (self animscripts\utility::weaponAnims() == "pistol") || (self animscripts\utility::weaponAnims() == "none") ) + { + PlayTransitionAnimation( animArray("crouch_2_stand"), "stand", "stop", standSpeed ); + } + else + { + self randomizeIdleSet(); + PlayTransitionAnimation( animArray("crouch_2_stand"), "stand", "stop", standSpeed ); + } + self ClearAnim(%shoot, 0); +} +CrouchToCrouchWalk() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToCrouchWalk "+self.a.pose); + assertEX(self.a.movement == "stop", "SetPoseMovement::CrouchToCrouchWalk "+self.a.movement); + BlendIntoCrouchWalk(); +} +CrouchToStandWalk() +{ + CrouchToCrouchWalk(); + BlendIntoStandWalk(); +} +CrouchWalkToCrouch() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchWalkToCrouch "+self.a.pose); + assertEX(self.a.movement == "walk", "SetPoseMovement::CrouchWalkToCrouch "+self.a.movement); + self.a.movement = "stop"; +} +CrouchWalkToStand() +{ + CrouchWalkToCrouch(); + CrouchToStand(); +} +CrouchRunToCrouch() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchRunToCrouch "+self.a.pose); + assertEX(self.a.movement == "run", "SetPoseMovement::CrouchRunToCrouch "+self.a.movement); + self.a.movement = "stop"; +} +CrouchRunToStand() +{ + CrouchRunToCrouch(); + CrouchToStand(); +} +CrouchToCrouchRun() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToCrouchRun "+self.a.pose); + assertEX(self.a.movement == "stop", "SetPoseMovement::CrouchToCrouchRun "+self.a.movement); + BlendIntoCrouchRun(); +} +CrouchToStandRun() +{ + BlendIntoStandRun(); +} +BlendIntoCrouchRun() +{ + if (IsDefined(self.crouchrun_combatanim)) + { + self SetAnimKnobAll(self.crouchrun_combatanim, %body, 1, 0.4); + PlayBlendTransition(self.crouchrun_combatanim, 0.6, "crouch", "run", 0); + self notify ("BlendIntoCrouchRun"); + } + else + { + self setanimknob( call_overloaded_func( "animscripts\run", "GetCrouchRunAnim" ), 1, 0.4 ); + self thread call_overloaded_func( "animscripts\run", "UpdateRunWeights", "BlendIntoCrouchRun", + %combatrun_forward, + animArray("combat_run_b"), + animArray("combat_run_l"), + animArray("combat_run_r") + ); + PlayBlendTransition(%combatrun, 0.6, "crouch", "run", 0); + self notify ("BlendIntoCrouchRun"); + } +} +ProneToCrouchRun() +{ + assertEX(self.a.pose == "prone", "SetPoseMovement::ProneToCrouchRun "+self.a.pose); + self OrientMode ("face current"); + self ExitProneWrapper(1.0); + ProneLegsStraightTree(0.2); + self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 ); + PlayTransitionAnimation( animArray("prone_2_crouch_run"), "crouch", "run", 0, animArray("crouch_run_f") ); +} +ProneToStandRun() +{ + ProneToCrouchRun(); + BlendIntoStandRun(); +} +ProneToCrouchWalk() +{ + ProneToCrouchRun(); + BlendIntoCrouchWalk(); +} +BlendIntoCrouchWalk() +{ + if (IsDefined(self.crouchrun_combatanim)) + { + self SetAnimKnobAll(self.crouchrun_combatanim, %body, 1, 0.4); + PlayBlendTransition(self.crouchrun_combatanim, 0.6, "crouch", "walk", 0); + self notify ("BlendIntoCrouchWalk"); + } + else + { + PlayBlendTransition( animArray("crouch_run_f"), 0.8, "crouch", "walk", 1 ); + } +} +StandToCrouch() +{ + assertEX(self.a.pose == "stand", "SetPoseMovement::StandToCrouch "+self.a.pose); + assertEX(self.a.movement == "stop", "SetPoseMovement::StandToCrouch "+self.a.movement); + self randomizeIdleSet(); + crouchSpeed = 0.5; + if (IsDefined (self.fastCrouch)) + { + crouchSpeed = 1.8; + self.fastCrouch = undefined; + } + if( self is_zombie() ) + { + self ClearAnim(%shoot, 0); + return; + } + PlayTransitionAnimation( animArray("stand_2_crouch"), "crouch", "stop", 1, undefined, crouchspeed ); + self ClearAnim(%shoot, 0); +} +ProneToCrouch() +{ + assertEX(self.a.pose == "prone", "SetPoseMovement::StandToCrouch "+self.a.pose); + self randomizeIdleSet(); + self OrientMode("face current"); + self ExitProneWrapper(1.0); + ProneLegsStraightTree(0.1); + self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 ); + PlayTransitionAnimation( animArray("prone_2_crouch"), "crouch", "stop", 1 ); +} +ProneToStand() +{ + assertEx( self.a.pose == "prone", self.a.pose ); + self OrientMode ("face current"); + self ExitProneWrapper(1.0); + ProneLegsStraightTree(0.1); + self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 ); + PlayTransitionAnimation( animArray("prone_2_stand"), "stand", "stop", 1 ); +} +ProneToStandWalk() +{ + ProneToCrouch(); + CrouchToCrouchWalk(); + BlendIntoStandWalk(); +} +ProneToProneMove(movement) +{ + assertEX(self.a.pose == "prone", "SetPoseMovement::ProneToProneMove "+self.a.pose); + assertEX(self.a.movement == "stop", "SetPoseMovement::ProneToProneMove "+self.a.movement); + assertEX( (movement == "walk" || movement == "run"), "SetPoseMovement::ProneToProneMove got bad parameter "+movement); + ProneLegsStraightTree(0.1); + PlayTransitionAnimation( animArray("aim_2_crawl"), "prone", movement, 0, animArray("combat_run_f") ); + self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 ); +} +ProneToProneRun() +{ + ProneToProneMove("run"); +} +ProneCrawlToProne() +{ + assertEX(self.a.pose == "prone", "SetPoseMovement::ProneCrawlToProne "+self.a.pose); + assertEX( (self.a.movement=="walk" || self.a.movement=="run"), "SetPoseMovement::ProneCrawlToProne "+self.a.movement); + ProneLegsStraightTree(0.1); + self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 ); + PlayTransitionAnimation( animArray("crawl_2_aim"), "prone", "stop", 1 ); + self ClearAnim( %exposed_modern, 0.2 ); +} +CrouchToProne() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToProne "+self.a.pose); + self setProneAnimNodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up ); + self EnterProneWrapper(1.0); + ProneLegsStraightTree(0.3); + self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 ); + PlayTransitionAnimation( animArray("crouch_2_prone"), "prone", "stop", 1 ); + self ClearAnim( %exposed_modern, 0.2 ); +} +CrouchToProneWalk() +{ + CrouchToProne(); + ProneToProneRun(); +} +CrouchToProneRun() +{ + CrouchToProne(); + ProneToProneRun(); +} +StandToProne() +{ + assertEX(self.a.pose == "stand", "SetPoseMovement::StandToProne "+self.a.pose); + proneTime = 0.5; + transAnim = animArray("stand_2_prone"); + thread PlayTransitionAnimationThread_WithoutWaitSetStates( transAnim, "prone", "stop", proneTime ); + self waittillmatch("transAnimDone2", "anim_pose = \"prone\""); + waittillframeend; + self setProneAnimNodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up ); + self EnterProneWrapper(proneTime); + self.a.movement = "stop"; + self waittillmatch("transAnimDone2", "end"); + self ClearAnim( %exposed_modern, 0.2 ); +} +StandToProneWalk() +{ + StandToProne(); + ProneToProneRun(); +} +StandToProneRun() +{ + StandToProne(); + ProneToProneRun(); +} +CrouchRunToProne() +{ + assertEX((self.a.pose == "crouch")||(self.a.pose == "stand"), "SetPoseMovement::CrouchRunToProne "+self.a.pose); + assertEX((self.a.movement == "run"||self.a.movement == "walk"), "SetPoseMovement::CrouchRunToProne "+self.a.movement); + pronetime = 0.5; + self setProneAnimNodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up ); + self EnterProneWrapper(proneTime); + ProneLegsStraightTree(0.2); + self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 ); + runDirection = animscripts\utility::getQuadrant ( self getMotionAngle() ); + diveanim = animArray("run_2_prone_dive", "move"); + localDeltaVector = GetMoveDelta (diveanim, 0, 1); + endPoint = self LocalToWorldCoords( localDeltaVector ); + if (self maymovetopoint(endPoint)) + { + PlayTransitionAnimation( diveanim, "prone", "stop", pronetime ); + } + else + { + PlayTransitionAnimation( animArray("run_2_prone_gunsupport", "move"), "prone", "stop", pronetime ); + } +} +CrouchRunToProneWalk() +{ + CrouchRunToProne(); + ProneToProneRun(); +} +CrouchRunToProneRun() +{ + CrouchRunToProne(); + ProneToProneRun(); +} +PlayTransitionAnimationThread_WithoutWaitSetStates(transAnim, endPose, endMovement, endAiming, finalAnim, rate) +{ + self endon ("killanimscript"); + self endon ("entered_pose" + endPose); + PlayTransitionAnimationFunc(transAnim, endPose, endMovement, endAiming, finalAnim, rate, false); +} +PlayTransitionAnimation(transAnim, endPose, endMovement, endAiming, finalAnim, rate) +{ + PlayTransitionAnimationFunc(transAnim, endPose, endMovement, endAiming, finalAnim, rate, true); +} +PlayTransitionAnimationFunc(transAnim, endPose, endMovement, endAiming, finalAnim, rate, waitSetStatesEnabled) +{ + if (!IsDefined (rate)) + rate = 1; + if (waitSetStatesEnabled) + { + self thread waitSetStates ( getanimlength(transAnim)/2.0, "killtimerscript", endPose); + } + self SetFlaggedAnimKnobAllRestart("transAnimDone2", transAnim, %body, 1, .2, rate); + if (!IsDefined(self.a.pose)) + { + self.pose = "undefined"; + } + if (!IsDefined(self.a.movement)) + { + self.movement = "undefined"; + } + debugIdentifier = ""; + self animscripts\shared::DoNoteTracks("transAnimDone2", undefined, debugIdentifier); + self notify ("killtimerscript"); + self.a.pose = endPose; + self notify ("entered_pose" + endPose); + self.a.movement = endMovement; + if (endAiming) + { + self.a.alertness = "aiming"; + } + else + { + self.a.alertness = "casual"; + } + if (IsDefined(finalAnim)) + { + self SetAnimKnobAll(finalAnim, %body, 1, 0.3, rate); + } +} +waitSetStates ( timetowait, killmestring, endPose ) +{ + self endon("killanimscript"); + self endon ("death"); + self endon(killmestring); + oldpose = self.a.pose; + wait timetowait; + if ( oldpose!="prone" && endPose =="prone" ) + { + self call_overloaded_func( "animscripts\cover_prone", "UpdateProneWrapper", 0.1 ); + self EnterProneWrapper(1.0); + } + else if ( oldpose=="prone" && endPose !="prone" ) + { + self ExitProneWrapper(1.0); + self OrientMode ("face default"); + } +} +ProneLegsStraightTree(blendtime) +{ +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/shared.gsc b/BO1/PC/ZM/animscripts/shared.gsc new file mode 100644 index 0000000..ef4c076 --- /dev/null +++ b/BO1/PC/ZM/animscripts/shared.gsc @@ -0,0 +1,1948 @@ + +#include maps\_utility; +#include animscripts\utility; +#include animscripts\combat_utility; +#include animscripts\anims; +#include common_scripts\utility; +#using_animtree ("generic_human"); +placeWeaponOn( weapon, position ) +{ + self notify("weapon_position_change"); + if (!IsDefined(self.weaponInfo[weapon])) + { + self call_overloaded_func( "animscripts\init", "initWeapon", weapon ); + } + curPosition = self.weaponInfo[weapon].position; + assert( curPosition == "none" || self.a.weaponPos[curPosition] == weapon ); + if ( position != "none" && self.a.weaponPos[position] == weapon ) + { + return; + } + self detachAllWeaponModels(); + if ( curPosition != "none" ) + { + self detachWeapon( weapon ); + } + if ( position == "none" ) + { + self updateAttachedWeaponModels(); + call_overloaded_func( "animscripts\init", "SetWeaponDist" ); + return; + } + if ( self.a.weaponPos[position] != "none" ) + { + self detachWeapon( self.a.weaponPos[position] ); + } + if ( position == "left" || position == "right" ) + { + self attachWeapon( weapon, position ); + self.weapon = weapon; + self animscripts\anims::clearAnimCache(); + self.aimThresholdYaw = 10; + self.aimThresholdPitch = 20; + if( weaponIsGasWeapon( self.weapon ) ) + { + self.aimThresholdYaw = 25; + self.aimThresholdPitch = 25; + } + } + else + { + self attachWeapon( weapon, position ); + } + self updateAttachedWeaponModels(); + call_overloaded_func( "animscripts\init", "SetWeaponDist" ); + assert( self.a.weaponPos["left"] == "none" || self.a.weaponPos["right"] == "none" ); +} +detachWeapon( weapon ) +{ + self.a.weaponPos[self.weaponInfo[weapon].position] = "none"; + self.weaponInfo[weapon].position = "none"; +} +attachWeapon( weapon, position ) +{ + self.weaponInfo[weapon].position = position; + self.a.weaponPos[position] = weapon; +} +detachAllWeaponModels() +{ + if( isdefined(self.weapon_positions) ) + { + for ( index = 0; index < self.weapon_positions.size; index++ ) + { + weapon = self.a.weaponPos[self.weapon_positions[index]]; + if ( weapon == "none" ) + { + continue; + } + self detach( getWeaponModel( weapon ), getTagForPos( self.weapon_positions[index] ) ); + } + } +} +updateAttachedWeaponModels() +{ + if( isdefined(self.weapon_positions) ) + { + for ( index = 0; index < self.weapon_positions.size; index++ ) + { + weapon = self.a.weaponPos[self.weapon_positions[index]]; + if ( weapon == "none" ) + { + continue; + } + self attach( getWeaponModel( weapon ), getTagForPos( self.weapon_positions[index] ) ); + if ( self.weaponInfo[weapon].useClip && !self.weaponInfo[weapon].hasClip ) + { + self hidepart( "tag_clip" ); + } + } + } +} +getTagForPos( position ) +{ + switch ( position ) + { + case "chest": + return "tag_weapon_chest"; + case "back": + return "tag_stowed_back"; + case "left": + return "tag_weapon_left"; + case "right": + return "tag_weapon_right"; + case "hand": + return "tag_inhand"; + default: + assertMsg( "unknown weapon placement position: " + position ); + break; + } +} +DropAIWeapon() +{ + if (is_true(self.a.dropping_weapons)) + { + return; + } + if( self.weapon == "none" || self.weapon == "") + { + return; + } + if (is_true(self.script_nodropsecondaryweapon) && (self.weapon == self.initial_secondaryweapon)) + { + PrintLn("Not dropping secondary weapon '" + self.weapon + "'"); + return; + } + else if (is_true(self.script_nodropsidearm) && (self.weapon == self.sidearm)) + { + PrintLn("Not dropping sidearm '" + self.weapon + "'"); + return; + } + self swapDropWeapon(); + current_weapon = self.weapon; + position = self.weaponInfo[ current_weapon ].position; + if( IsDefined( current_weapon ) && current_weapon != "none" ) + { + animscripts\shared::placeWeaponOn( current_weapon, "none" ); + if( current_weapon == self.primaryweapon ) + { + self.primaryweapon = "none"; + } + else if( current_weapon == self.secondaryweapon ) + { + self.secondaryweapon = "none"; + } + } + if( self.dropWeapon ) + { + dropWeaponName = player_weapon_drop(self.weapon); + velocity = self GetAiVelocity(); + speed = Length( velocity ) * 0.5; + droppedWeapon = self DropWeapon( dropWeaponName, position, speed ); + } + self.weapon = "none"; +} +DropAllAIWeapons() +{ + if (is_true(self.a.dropping_weapons)) + { + return; + } + if( !self.dropweapon ) + { + if( self.weapon != "none" ) + { + animscripts\shared::placeWeaponOn( self.weapon, "none" ); + self.weapon = "none"; + } + return; + } + self.a.dropping_weapons = true; + self swapDropWeapon(); + self detachAllWeaponModels(); + if( isdefined(self.weapon_positions) ) + { + for ( index = 0; index < self.weapon_positions.size; index++ ) + { + weapon = self.a.weaponPos[ self.weapon_positions[ index ] ]; + if ( weapon != "none" ) + { + self.weaponInfo[ weapon ].position = "none"; + self.a.weaponPos[ self.weapon_positions[ index ] ] = "none"; + if (is_true(self.script_nodropsecondaryweapon) && (weapon == self.initial_secondaryweapon)) + { + PrintLn("Not dropping secondary weapon '" + weapon + "'"); + } + else if (is_true(self.script_nodropsidearm) && (weapon == self.sidearm)) + { + PrintLn("Not dropping sidearm '" + weapon + "'"); + } + else + { + weapon = player_weapon_drop(weapon); + velocity = self GetAiVelocity(); + speed = Length( velocity ) * 0.5; + droppedWeapon = self DropWeapon( weapon, self.weapon_positions[ index ], speed ); + } + } + } + } + self.weapon = "none"; + self.a.dropping_weapons = undefined; +} +swapDropWeapon() +{ + if (has_script_drop_weapon()) + { + found_weapon = false; + for ( i = 0; i < self.weapon_positions.size; i++ ) + { + weapon = self.a.weaponPos[ self.weapon_positions[ i ] ]; + weapon_toks = StrTok(weapon, "_"); + drop_weapon_toks = StrTok(self.script_dropweapon, "_"); + if ( weapon_toks[0] == drop_weapon_toks[0] ) + { + PrintLn("Swapping out weapon '" + weapon + "' for script_dropweapon '" + self.script_dropweapon + "'"); + self placeWeaponOn(weapon, "none"); + if (self.weapon == weapon) + { + self.weapon = self.script_dropweapon; + } + self placeWeaponOn(self.script_dropweapon, self.weapon_positions[i]); + found_weapon = true; + break; + } + } + if (!found_weapon) + { + self swapDropWeaponPrimary(); + } + self.script_dropweapon = undefined; + } +} +swapDropWeaponPrimary() +{ + if (has_script_drop_weapon()) + { + position = self.weaponInfo[ self.primaryweapon ].position; + if (position != "none") + { + PrintLn("Swapping out weapon '" + self.primaryweapon + "' for script_dropweapon '" + self.script_dropweapon + "'"); + self placeWeaponOn(self.primaryweapon, "none"); + self placeWeaponOn(self.script_dropweapon, position); + } + } +} +addPhysWeapon() +{ + self thread deleteAtLimit(); +} +has_script_drop_weapon() +{ + if (IsDefined(self.script_dropweapon) && IsString(self.script_dropweapon) && (self.script_dropweapon != "")) + { + return true; + } + return false; +} +player_weapon_drop(weapon_name) +{ + if (IsSubStr( ToLower( weapon_name ), "rpg" )) + { + return "rpg_player_sp"; + } + else if (IsSubStr( ToLower( weapon_name ), "panzerschreck" )) + { + return "panzerschreck_player_sp"; + } + return weapon_name; +} +deleteAtLimit() +{ + wait 30.0; + self delete(); +} +HandleDogSoundNoteTracks( note ) +{ + if ( note == "sound_dogstep_run_default" ) + { + self PlaySound( "fly_dog_step_run_default" ); + return true; + } + prefix = getsubstr( note, 0, 5 ); + if ( prefix != "sound" ) + { + return false; + } + alias = "aml" + getsubstr( note, 5 ); + if ( IsAlive( self ) ) + { + self thread play_sound_on_tag_endon_death( alias, "tag_eye" ); + } + else + { + self thread play_sound_in_space( alias, self gettagorigin( "tag_eye" ) ); + } + return true; +} +registerNoteTracks() +{ + anim.notetracks["anim_pose = \"stand\""] = ::noteTrackPoseStand; + anim.notetracks["anim_pose = \"crouch\""] = ::noteTrackPoseCrouch; + anim.notetracks["anim_pose = \"prone\""] = ::noteTrackPoseProne; + anim.notetracks["anim_pose = \"crawl\""] = ::noteTrackPoseCrawl; + anim.notetracks["anim_pose = \"back\""] = ::noteTrackPoseBack; + anim.notetracks["anim_movement = \"stop\""] = ::noteTrackMovementStop; + anim.notetracks["anim_movement = \"walk\""] = ::noteTrackMovementWalk; + anim.notetracks["anim_movement = \"run\""] = ::noteTrackMovementRun; + anim.notetracks["anim_aiming = 1"] = ::noteTrackAlertnessAiming; + anim.notetracks["anim_aiming = 0"] = ::noteTrackAlertnessAlert; + anim.notetracks["anim_alertness = causal"] = ::noteTrackAlertnessCasual; + anim.notetracks["anim_alertness = alert"] = ::noteTrackAlertnessAlert; + anim.notetracks["anim_alertness = aiming"] = ::noteTrackAlertnessAiming; + anim.notetracks["gunhand = (gunhand)_left"] = ::noteTrackGunhand; + anim.notetracks["anim_gunhand = \"left\""] = ::noteTrackGunhand; + anim.notetracks["anim_gunhand = \"leftright\""] = ::noteTrackGunhand; + anim.notetracks["gunhand = (gunhand)_right"] = ::noteTrackGunhand; + anim.notetracks["anim_gunhand = \"right\""] = ::noteTrackGunhand; + anim.notetracks["anim_gunhand = \"none\""] = ::noteTrackGunhand; + anim.notetracks["gun drop"] = ::noteTrackGunDrop; + anim.notetracks["dropgun"] = ::noteTrackGunDrop; + anim.notetracks["gun_2_chest"] = ::noteTrackGunToChest; + anim.notetracks["gun_2_back"] = ::noteTrackGunToBack; + anim.notetracks["chest_2_back"] = ::noteTrackChestToBack; + anim.notetracks["pistol_pickup"] = ::noteTrackPistolPickup; + anim.notetracks["pistol_putaway"] = ::noteTrackPistolPutaway; + anim.notetracks["drop clip"] = ::noteTrackDropClip; + anim.notetracks["refill clip"] = ::noteTrackRefillClip; + anim.notetracks["reload done"] = ::noteTrackRefillClip; + anim.notetracks["load_shell"] = ::noteTrackLoadShell; + anim.notetracks["pistol_rechamber"] = ::noteTrackPistolRechamber; + anim.notetracks["weapon_switch"] = ::noteTrackWeaponSwitch; + anim.notetracks["gravity on"] = ::noteTrackGravity; + anim.notetracks["gravity off"] = ::noteTrackGravity; + anim.notetracks["bodyfall large"] = ::noteTrackBodyFall; + anim.notetracks["bodyfall small"] = ::noteTrackBodyFall; + anim.notetracks["footstep"] = ::noteTrackFootStep; + anim.notetracks["step"] = ::noteTrackFootStep; + anim.notetracks["footstep_right_large"] = ::noteTrackFootStep; + anim.notetracks["footstep_right_small"] = ::noteTrackFootStep; + anim.notetracks["footstep_left_large"] = ::noteTrackFootStep; + anim.notetracks["footstep_left_small"] = ::noteTrackFootStep; + anim.notetracks["footscrape"] = ::noteTrackFootScrape; + anim.notetracks["land"] = ::noteTrackLand; + anim.notetracks["start_ragdoll"] = ::noteTrackStartRagdoll; + anim.notetracks["fire"] = ::noteTrackFire; + anim.notetracks["fire_spray"] = ::noteTrackFireSpray; + anim.notetracks["fire spray"] = ::noteTrackFireSpray; + anim.notetracks["lookat = \"player\""] = ::noteTrackLookatPlayer; + anim.notetracks["headlookat = \"player\""] =::noteTrackHeadLookatPlayer; + anim.notetracks["lookat = \"\""] = ::noteTrackClearLookAt; +} +noteTrackLookAtPlayer(note, flagName) +{ + if(!IsSentient(self)) + { + return; + } + relax_ik_headtracking_limits(); + self.lookat_set_in_anim = true; + self LookAtEntity(get_players()[0]); +} +noteTrackHeadLookAtPlayer(note, flagName) +{ + if(!IsSentient(self)) + { + return; + } + relax_ik_headtracking_limits(); + SetSavedDvar("ik_dvar_lookatentity_notorso", true); + self.lookat_set_in_anim = true; + self LookAtEntity(get_players()[0]); +} +noteTrackClearLookAt(note, flagName) +{ + if(!IsSentient(self)) + { + return; + } + restore_ik_headtracking_limits(); + self.lookat_set_in_anim = false; + SetSavedDvar("ik_dvar_lookatentity_notorso", false); + self LookAtEntity(); +} +noteTrackFire( note, flagName ) +{ + if (!IsSentient(self)) + { + return; + } + if ( IsDefined( anim.fire_notetrack_functions[ self.a.script ] ) ) + { + thread [[ anim.fire_notetrack_functions[ self.a.script ] ]](); + } + else + { + thread [[ animscripts\shared::shootNotetrack ]](); + } +} +noteTrackStopAnim( note, flagName ) +{ +} +noteTrackStartRagdoll( note, flagName ) +{ + if( IsDefined( self.noragdoll ) ) + { + return; + } + self do_ragdoll_death(); +} +noteTrackMovementStop( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.movement = "stop"; + } +} +noteTrackMovementWalk( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.movement = "walk"; + } +} +noteTrackMovementRun( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.movement = "run"; + } +} +noteTrackAlertnessAiming( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.alertness = "aiming"; + } +} +noteTrackAlertnessCasual( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.alertness = "casual"; + } +} +noteTrackAlertnessAlert( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.alertness = "alert"; + } +} +noteTrackPoseStand( note, flagName ) +{ + if( IsSentient( self ) ) + { + if (self.a.pose == "prone") + { + self OrientMode ("face default"); + self ExitProneWrapper(1.0); + } + self.a.pose = "stand"; + self notify ("entered_pose" + "stand"); + } +} +noteTrackPoseCrouch( note, flagName ) +{ + if( IsSentient( self ) ) + { + if (self.a.pose == "prone") + { + self OrientMode ("face default"); + self ExitProneWrapper(1.0); + } + self.a.pose = "crouch"; + self notify ("entered_pose" + "crouch"); + if (self.a.crouchPain) + { + self.a.crouchPain = false; + self.health = 150; + } + } +} +noteTrackPoseProne( note, flagName ) +{ + if( IsSentient( self ) ) + { + self setProneAnimNodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up ); + self EnterProneWrapper(1.0); + self.a.pose = "prone"; + self notify ("entered_pose" + "prone"); + } +} +noteTrackPoseCrawl( note, flagName ) +{ + if( IsSentient( self ) ) + { + self setProneAnimNodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up ); + self EnterProneWrapper(1.0); + self.a.pose = "prone"; + self notify ("entered_pose" + "prone"); + } +} +noteTrackPoseBack( note, flagName ) +{ + if (self.a.pose == "prone") + { + self ExitProneWrapper(1.0); + } + self.a.pose = "back"; + self notify ("entered_pose" + "back"); + self.a.movement = "stop"; +} +noteTrackGunHand( note, flagName ) +{ + if ( isSubStr( note, "leftright" ) ) + { + animscripts\shared::placeWeaponOn( self.weapon, "left" ); + self thread placeWeaponOnRightOnInterrupt(); + } + else if ( isSubStr( note, "left" ) ) + { + animscripts\shared::placeWeaponOn( self.weapon, "left" ); + self notify( "placed_weapon_on_left" ); + } + else if ( isSubStr( note, "right" ) ) + { + animscripts\shared::placeWeaponOn( self.weapon, "right" ); + self notify( "placed_weapon_on_right" ); + } + else if ( isSubStr( note, "none" ) ) + { + animscripts\shared::placeWeaponOn( self.weapon, "none" ); + } +} +placeWeaponOnRightOnInterrupt( ) +{ + self endon( "death" ); + self endon( "placed_weapon_on_right" ); + self waittill( "killanimscript" ); + if ( AIHasWeapon( self.weapon ) ) + { + animscripts\shared::placeWeaponOn( self.weapon, "right" ); + } +} +noteTrackGunDrop( note, flagName ) +{ + self.lastWeapon = self.weapon; + primaryweapon = self.primaryweapon; + secondaryweapon = self.secondaryweapon; + pistolOnlyAI = AIHasOnlyPistol(); + self animscripts\shared::DropAIWeapon(); + if ( self.lastWeapon == primaryweapon ) + { + self.weapon = self.secondaryweapon; + } + else if ( self.lastWeapon == secondaryweapon ) + { + self.weapon = self.primaryweapon; + } + self animscripts\anims::clearAnimCache(); +} +noteTrackGunToChest( note, flagName ) +{ + animscripts\shared::placeWeaponOn( self.weapon, "chest" ); +} +noteTrackGunToBack( note, flagName ) +{ + animscripts\shared::placeWeaponOn( self.weapon, "back" ); + self.weapon = self getPreferredWeapon(); + self.bulletsInClip = weaponClipSize( self.weapon ); + self animscripts\anims::clearAnimCache(); +} +noteTrackChestToBack( note, flagName ) +{ + assert( hasSecondaryWeapon() ); + animscripts\shared::placeWeaponOn( getSecondaryWeapon(), "back" ); +} +noteTrackPistolPickup( note, flagName ) +{ + if( AIHasSidearm() ) + { + animscripts\shared::placeWeaponOn( self.sidearm, "right" ); + self.bulletsInClip = weaponClipSize( self.weapon ); + self notify ( "weapon_switch_done" ); + } +} +noteTrackPistolPutaway( note, flagName ) +{ + animscripts\shared::placeWeaponOn( self.weapon, "none" ); + self.weapon = self getPreferredWeapon(); + self.bulletsInClip = weaponClipSize( self.weapon ); + self animscripts\anims::clearAnimCache(); +} +noteTrackWeaponSwitch( note, flagName ) +{ + assertex( hasSecondaryWeapon(), "no secondary weapon available! check the aitype for this actor. " ); + if( self.weapon == self.primaryweapon ) + { + if( self.weapon != "none" ) + { + self animscripts\shared::placeWeaponOn( self.weapon, "back" ); + } + self animscripts\shared::placeWeaponOn( self.secondaryweapon, "right" ); + } + else + { + if( self.weapon != "none" ) + { + self animscripts\shared::placeWeaponOn( self.weapon, "back" ); + } + self animscripts\shared::placeWeaponOn( self.primaryweapon, "right" ); + } + clipSize = weaponClipSize( self.weapon ); + if (NeedToReload( 0.5 )) + { + if(clipSize > 1) + { + self.bulletsInClip = Int(clipSize * 0.5); + } + else + { + self.bulletsInClip = clipSize; + } + } + else if( self.bulletsInClip > clipSize ) + { + self.bulletsInClip = clipSize; + } + self notify( "complete_weapon_switch" ); + noteTrackWeaponSwitchGlint( note, flagName ); + self.lastWeapon = self.weapon; +} +noteTrackWeaponSwitchGlint( note, flagName ) +{ + if (IsDefined(self.weapon)) + { + } +} +noteTrackDropClip( note, flagName ) +{ + self thread handleDropClip( flagName ); +} +noteTrackRefillClip( note, flagName ) +{ + if ( weaponClass( self.weapon ) == "rocketlauncher" ) + { + self showRocket(); + } + self animscripts\weaponList::RefillClip(); +} +noteTrackLoadShell( note, flagName ) +{ +} +noteTrackPistolRechamber( note, flagName ) +{ +} +noteTrackGravity( note, flagName ) +{ + if ( isSubStr( note, "on" ) ) + { + self AnimMode( "gravity" ); + } + else if ( isSubStr( note, "off" ) ) + { + self AnimMode( "nogravity" ); + } +} +noteTrackBodyFall( note, flagName ) +{ + if ( IsDefined( self.groundType ) ) + { + groundType = self.groundType; + } + else + { + groundType = "dirt"; + } + if ( isSubStr( note, "large" ) ) + { + self PlaySound ("fly_bodyfall_large_" + groundType); + } + else if ( isSubStr( note, "small" ) ) + { + self PlaySound ("fly_bodyfall_small_" + groundType); + } +} +noteTrackFootStep( note, flagName ) +{ + if ( isSubStr( note, "left" ) ) + { + playFootStep( "J_Ball_LE" ); + } + else + { + playFootStep( "J_BALL_RI" ); + } + if(!level.clientScripts) + { + self PlaySound( "fly_gear_run" ); + } +} +noteTrackFootScrape( note, flagName ) +{ + if ( IsDefined( self.groundType ) ) + { + groundType = self.groundType; + } + else + { + groundType = "dirt"; + } + self PlaySound ("fly_step_scrape_" + groundType ); +} +noteTrackLand( note, flagName ) +{ + if ( IsDefined( self.groundType ) ) + { + groundType = self.groundType; + } + else + { + groundType = "dirt"; + } + if(IsPlayer ( self )) + { + self PlaySound ("fly_land_plr_" + groundType ); + } + else + { + self PlaySound ("fly_land_npc_" + groundType); + } +} +HandleNoteTrack( note, flagName, customFunction, var1 ) +{ + if ( isAI( self ) && self.isdog ) + { + if ( HandleDogSoundNoteTracks( note ) ) + { + return; + } + } + notetrackFunc = anim.notetracks[note]; + if ( IsDefined( notetrackFunc ) ) + { + return [[notetrackFunc]]( note, flagName ); + } + switch ( note ) + { + case "end": + case "finish": + case "undefined": + if ( isAI(self) && self.a.pose=="back" ) + { + } + return note; + case "swish small": + self thread play_sound_in_space ("wpn_melee_swing_large", self gettagorigin ("TAG_WEAPON_RIGHT")); + break; + case "swish large": + self thread play_sound_in_space ("wpn_melee_swing_large", self gettagorigin ("TAG_WEAPON_RIGHT")); + break; + case "rechamber": + if ( self usingShotgun() ) + break; + case "no death": + self.a.nodeath = true; + break; + case "no pain": + self disable_pain(); + break; + case "allow pain": + self enable_pain(); + break; + case "anim_melee = right": + case "anim_melee = \"right\"": + self.a.meleeState = "right"; + break; + case "anim_melee = left": + case "anim_melee = \"left\"": + self.a.meleeState = "left"; + break; + case "weapon_retrieve": + break; + case "swap taghelmet to tagleft": + if ( IsDefined ( self.hatModel ) ) + { + if (IsDefined(self.helmetSideModel)) + { + self detach(self.helmetSideModel, "TAG_HELMETSIDE"); + self.helmetSideModel = undefined; + } + self detach ( self.hatModel, ""); + self attach ( self.hatModel, "TAG_WEAPON_LEFT"); + self.hatModel = undefined; + } + break; + case "stop anim": + anim_stopanimscripted(); + return note; + default: + if (IsDefined(customFunction)) + { + if (!IsDefined(var1)) + { + return [[customFunction]] (note); + } + else + { + return [[customFunction]] (note, var1); + } + } + break; + } +} +DoNoteTracks( flagName, customFunction, debugIdentifier, var1 ) +{ + for (;;) + { + self waittill (flagName, note); + if ( !IsDefined( note ) ) + { + note = "undefined"; + } + val = self HandleNoteTrack( note, flagName, customFunction, var1 ); + if ( IsDefined( val ) ) + { + return val; + } + } +} +DoNoteTracksIntercept( flagName, interceptFunction, debugIdentifier ) +{ + assert( IsDefined( interceptFunction ) ); + for (;;) + { + self waittill ( flagName, note ); + if ( !IsDefined( note ) ) + { + note = "undefined"; + } + intercepted = [[interceptFunction]]( note ); + if ( IsDefined( intercepted ) && intercepted ) + { + continue; + } + val = self HandleNoteTrack( note, flagName ); + if ( IsDefined( val ) ) + { + return val; + } + } +} +DoNoteTracksPostCallback( flagName, postFunction ) +{ + assert( IsDefined( postFunction ) ); + for (;;) + { + self waittill ( flagName, note ); + if ( !IsDefined( note ) ) + { + note = "undefined"; + } + val = self HandleNoteTrack( note, flagName ); + [[postFunction]]( note ); + if ( IsDefined( val ) ) + { + return val; + } + } +} +DoNoteTracksForever(flagName, killString, customFunction, debugIdentifier) +{ + DoNoteTracksForeverProc( ::DoNoteTracks, flagName, killString, customFunction, debugIdentifier); +} +DoNoteTracksForeverIntercept(flagName, killString, interceptFunction, debugIdentifier) +{ + DoNoteTracksForeverProc( ::DoNoteTracksIntercept, flagName, killString, interceptFunction, debugIdentifier ); +} +DoNoteTracksForeverProc( notetracksFunc, flagName, killString, customFunction, debugIdentifier ) +{ + if (IsDefined (killString)) + { + self endon (killString); + } + self endon ("killanimscript"); + if (!IsDefined(debugIdentifier)) + { + debugIdentifier = "undefined"; + } + for (;;) + { + time = GetTime(); + returnedNote = [[notetracksFunc]](flagName, customFunction, debugIdentifier); + timetaken = GetTime() - time; + if ( timetaken < 0.05) + { + time = GetTime(); + returnedNote = [[notetracksFunc]](flagName, customFunction, debugIdentifier); + timetaken = GetTime() - time; + if ( timetaken < 0.05) + { + println (GetTime()+" "+debugIdentifier+" animscripts\shared::DoNoteTracksForever is trying to cause an infinite loop on anim "+flagName+", returned "+returnedNote+"."); + wait ( 0.05 - timetaken ); + } + } + } +} +DoNoteTracksForTime(time, flagName, customFunction, debugIdentifier) +{ + ent = SpawnStruct(); + ent thread doNoteTracksForTimeEndNotify(time); + DoNoteTracksForTimeProc( ::DoNoteTracksForever, time, flagName, customFunction, debugIdentifier, ent); +} +DoNoteTracksForTimeIntercept( time, flagName, interceptFunction, debugIdentifier) +{ + ent = SpawnStruct(); + ent thread doNoteTracksForTimeEndNotify(time); + DoNoteTracksForTimeProc( ::DoNoteTracksForeverIntercept, time, flagName, interceptFunction, debugIdentifier, ent); +} +DoNoteTracksForTimeProc( doNoteTracksForeverFunc, time, flagName, customFunction, debugIdentifier, ent) +{ + ent endon ("stop_notetracks"); + [[doNoteTracksForeverFunc]](flagName, undefined, customFunction, debugIdentifier); +} +doNoteTracksForTimeEndNotify(time) +{ + wait (time); + self notify ("stop_notetracks"); +} +playFootStep(foot) +{ + if(!level.clientScripts) + { + if (! isAI(self) ) + { + self PlaySound ("fly_step_run_dirt"); + return; + } + } + groundType = undefined; + if (!IsDefined(self.groundtype)) + { + if (!IsDefined(self.lastGroundtype)) + { + if(!level.clientScripts) + { + self PlaySound ("fly_step_run_dirt"); + } + return; + } + groundtype = self.lastGroundtype; + } + else + { + groundtype = self.groundtype; + self.lastGroundtype = self.groundType; + } + if(!level.clientScripts) + { + self PlaySound ("fly_step_run_" + groundType); + } + [[anim.optionalStepEffectFunction]](foot, groundType); +} +playFootStepEffect(foot, groundType) +{ + if(level.clientScripts) + { + return; + } + for (i=0;i self.a.lastShootTime ) + { + self.a.lastShootTime = now; + self shootEnemyWrapper(); + self decrementBulletsInClip(); + if ( weaponClass( self.weapon ) == "rocketlauncher" ) + { + self.a.rockets--; + } + } +} +fire_straight() +{ + if( self.a.weaponPos[ "right" ] == "none" && self.a.weaponPos[ "left" ] == "none" ) + { + return; + } + if ( IsDefined( self.dontShootStraight ) ) + { + shootNotetrack(); + return; + } + weaporig = self gettagorigin( "tag_weapon" ); + dir = AnglesToForward( self GetTagAngles( "tag_weapon" ) ); + pos = weaporig + vector_scale( dir, 1000 ); + self.a.lastShootTime = GetTime(); + self shoot( 1, pos ); + self decrementBulletsInClip(); +} +noteTrackFireSpray( note, flagName ) +{ + if ( self.a.weaponPos["right"] == "none" ) + { + return; + } + weaporig = self gettagorigin("tag_weapon"); + dir = AnglesToForward( self GetTagAngles( "tag_weapon" ) ); + hitenemy = false; + if ( IsSentient(self.enemy) && IsAlive(self.enemy) && self canShoot( self.enemy GetShootAtPos() ) ) + { + enemydir = VectorNormalize(self.enemy geteye() - weaporig); + if ( vectordot(dir, enemydir) > cos(10) ) + { + hitenemy = true; + } + } + if ( hitenemy ) + { + self shootEnemyWrapper(); + } + else + { + dir += ((RandomFloat(2)-1) * .1, (RandomFloat(2)-1) * .1, (RandomFloat(2)-1) * .1); + pos = weaporig + vector_scale(dir, 1000); + self shootPosWrapper( pos ); + } + self decrementBulletsInClip(); +} +getPredictedAimYawToShootEntOrPos(time) +{ + if ( !IsDefined( self.shootEnt ) ) + { + if ( !IsDefined( self.shootPos ) ) + { + return 0; + } + return getAimYawToPoint( self.shootPos ); + } + predictedPos = self.shootEnt.origin + vector_scale( self.shootEntVelocity, time ); + return getAimYawToPoint( predictedPos ); +} +getAimYawToShootEntOrPos() +{ + if ( !IsDefined( self.shootEnt ) ) + { + if ( !IsDefined( self.shootPos ) ) + { + return 0; + } + return getAimYawToPoint( self.shootPos ); + } + return getAimYawToPoint( self.shootEnt GetShootAtPos(self) ); +} +getAimPitchToShootEntOrPos() +{ + pitch = getPitchToShootEntOrPos(); + if ( self.a.script == "cover_crouch" && IsDefined( self.a.coverMode ) && self.a.coverMode == "lean" ) + { + pitch -= anim.coverCrouchLeanPitch; + } + return pitch; +} +getPitchToShootEntOrPos() +{ + if ( !IsDefined( self.shootEnt ) ) + { + if ( !IsDefined( self.shootPos ) ) + { + return 0; + } + return animscripts\combat_utility::getPitchToSpot( self.shootPos ); + } + return animscripts\combat_utility::getPitchToSpot( self.shootEnt GetShootAtPos(self) ); +} +getAimYawToPoint(point) +{ + yaw = GetYawToSpot(point); + dist = distance(self.origin,point); + if(dist > 3) + { + angleFudge = asin(-3/dist); + yaw += angleFudge; + } + yaw = AngleClamp180( yaw ); + return yaw; +} +trackShootEntOrPos() +{ + self animscripts\shared::setAimingAnims( %aim_2, %aim_4, %aim_6, %aim_8 ); + self animscripts\shared::trackLoopStart(); +} +trackLoopStart() +{ + self notify("trackLoopStart"); + self.pauseTrackLoop = false; +} +trackLoopPause() +{ + self endon("death"); + while(1) + { + self waittill_any( "killanimscript", "stop tracking", "melee" ); + self.pauseTrackLoop = true; + } +} +trackLoopPacer() +{ + self endon("death"); + wait(0.05); + self notify("trackLoopStart"); +} +scriptNeedsTagAim() +{ + if( IsDefined( self.a.script ) ) + { + if( self.a.script == "move" || self.a.script == "cover_right" || self.a.script == "cover_left" || self.a.script == "cover_pillar" ) + { + return true; + } + } + return false; +} +trackLoopGetShootFromPos() +{ + origin = undefined; + if( scriptNeedsTagAim() ) + { + origin = self getTagOrigin( "tag_aim" ); + } + if( !IsDefined(origin) ) + { + eyeHeight = self geteyeapprox()[2]; + if( self.a.pose == "crouch" ) + { + eyeHeight = self.origin[2] + (eyeHeight - self.origin[2]) * 0.5; + } + origin = (self.origin[0], self.origin[1], eyeHeight); + } + return origin; +} +trackLoopGetShootFromAngles() +{ + angles = undefined; + if( scriptNeedsTagAim() ) + { + angles = self getTagAngles( "tag_aim" ); + } + if( !IsDefined(angles) ) + { + angles = self.angles; + } + return angles; +} +trackLoop() +{ + self endon("death"); + self.aimAngleOffset = 0; + self.pitchAngleOffset = 0; + self waittill("trackLoopStart"); + players = GetPlayers(); + prevYawDelta = 0; + prevPitchDelta = 0; + prevAim2 = self.a.aim_2; + maxYawDeltaChange = 5; + maxPitchDeltaChange = 5; + yawDelta = 0; + yawAdd = 0; + pitchDelta = 0; + pitchAdd = 0; + if ( self.isdog ) + { + doMaxAngleCheck = false; + self.shootEnt = self.enemy; + } + else + { + doMaxAngleCheck = true; + } + firstFrame = true; + self.pauseTrackLoop = false; + self thread trackLoopPause(); + shootFromAngles = self trackLoopGetShootFromAngles(); + prevshootFromYawAngle = shootFromAngles[1] + self.aimAngleOffset; + prevshootFromPitchAngle = shootFromAngles[0] + self.pitchAngleOffset; + for(;;) + { + rightAimLimit = self.rightAimLimit; + leftAimLimit = self.leftAimLimit; + upAimLimit = self.upAimLimit; + downAimLimit = self.downAimLimit; + if ( prevYawDelta > rightAimLimit ) + { + prevYawDelta = rightAimLimit; + } + else if ( prevYawDelta < leftAimLimit ) + { + prevYawDelta = leftAimLimit; + } + if ( prevPitchDelta > upAimLimit ) + { + prevPitchDelta = upAimLimit; + } + else if ( prevPitchDelta < downAimLimit ) + { + prevPitchDelta = downAimLimit; + } + aimingAnimsChanged = false; + aimBlendTime = .05; + if( prevAim2 != self.a.aim_2 ) + { + aimingAnimsChanged = true; + aimBlendTime = 0; + prevAim2 = self.a.aim_2; + } + incrAnimAimWeight(); + shootFromPos = self trackLoopGetShootFromPos(); + shootPos = self.shootPos; + if ( IsDefined( self.shootEnt ) ) + { + shootPos = self.shootEnt GetShootAtPos(self, self, self); + } + if ( !IsDefined( shootPos ) && self call_overloaded_func( "animscripts\cqb", "shouldCQB" ) ) + { + selfForward = AnglesToForward( self.angles ); + if ( IsDefined( self.cqb_target ) ) + { + shootPos = self.cqb_target GetShootAtPos(self); + dir = shootPos - shootFromPos; + vdot = vectorDot( dir, selfForward ); + if ( ( vdot < 0.0 ) || ( vdot * vdot < 0.413449 * lengthsquared( dir ) ) ) + { + shootPos = undefined; + } + } + if ( !IsDefined( shootPos ) && IsDefined( self.cqb_point_of_interest ) ) + { + shootPos = self.cqb_point_of_interest; + dir = shootPos - shootFromPos; + vdot = vectorDot( dir, selfForward ); + if ( ( vdot < 0.0 ) || ( vdot * vdot < 0.413449 * lengthsquared( dir ) ) ) + { + shootPos = undefined; + } + } + } + shootFromAngles = self trackLoopGetShootFromAngles(); + shootFromYawAngle = shootFromAngles[1] + self.aimAngleOffset; + shootFromPitchAngle = shootFromAngles[0] + self.pitchAngleOffset; + shootFromYawDelta = AngleClamp180(shootFromYawAngle - prevshootFromYawAngle); + shootFromPitchDelta = AngleClamp180(shootFromPitchAngle - prevshootFromPitchAngle); + maxAngleDelta = 10; + if( abs(shootFromYawDelta) > maxAngleDelta ) + { + shootFromYawAngle = prevshootFromYawAngle + maxAngleDelta * sign(shootFromYawDelta); + } + if( abs(shootFromPitchDelta) > maxAngleDelta ) + { + shootFromPitchAngle = prevshootFromPitchAngle + maxAngleDelta * sign(shootFromPitchDelta); + } + shootFromAngles = ( shootFromPitchAngle, shootFromYawAngle, shootFromAngles[2] ); + if ( !IsDefined( shootPos ) ) + { + assert( !IsDefined( self.shootEnt ) ); + if ( IsDefined( self.node ) && self.node.type == "Guard" && DistanceSquared(self.origin, self.node.origin) < 16 ) + { + yawDelta = AngleClamp180( shootFromYawAngle - self.node.angles[1] ); + pitchDelta = 0; + } + else + { + likelyEnemyDir = self getAnglesToLikelyEnemyPath(); + if ( IsDefined( likelyEnemyDir ) ) + { + yawDelta = AngleClamp180( shootFromYawAngle - likelyEnemyDir[1] ); + pitchDelta = AngleClamp180( 360 - likelyEnemyDir[0] ); + } + else + { + yawDelta = 0; + pitchDelta = 0; + } + } + } + else + { + vectorToShootPos = shootPos - shootFromPos; + anglesToShootPos = VectorToAngles( vectorToShootPos ); + yawDelta = shootFromYawAngle - anglesToShootPos[1]; + yawDelta = AngleClamp180( yawDelta + yawAdd ); + pitchDelta = shootFromPitchAngle - anglesToShootPos[0]; + pitchDelta = AngleClamp180( pitchDelta + pitchAdd ); + } + if ( doMaxAngleCheck && !aimingAnimsChanged && ( abs( yawDelta ) > 60 || abs( pitchDelta ) > 60 ) ) + { + yawDelta = 0; + pitchDelta = 0; + } + else + { + if ( yawDelta > rightAimLimit ) + { + yawDelta = rightAimLimit; + } + else if ( yawDelta < leftAimLimit ) + { + yawDelta = leftAimLimit; + } + if ( pitchDelta > upAimLimit ) + { + pitchDelta = upAimLimit; + } + else if ( pitchDelta < downAimLimit ) + { + pitchDelta = downAimLimit; + } + } + if ( firstFrame ) + { + firstFrame = false; + yawDelta = 0; + pitchDelta = 0; + } + else + { + adjustedMaxYawDeltaChange = maxYawDeltaChange + abs(shootFromYawDelta); + adjustedMaxPitchDeltaChange = maxPitchDeltaChange + abs(shootFromPitchDelta); + yawDeltaChange = yawDelta - prevYawDelta; + if ( abs( yawDeltaChange ) > adjustedMaxYawDeltaChange ) + yawDelta = prevYawDelta + adjustedMaxYawDeltaChange * sign( yawDeltaChange ); + pitchDeltaChange = pitchDelta - prevPitchDelta; + if ( abs( pitchDeltaChange ) > adjustedMaxPitchDeltaChange ) + pitchDelta = prevPitchDelta + adjustedMaxPitchDeltaChange * sign( pitchDeltaChange ); + } + prevshootFromYawAngle = shootFromYawAngle; + prevshootFromPitchAngle = shootFromPitchAngle; + prevYawDelta = yawDelta; + prevPitchDelta = pitchDelta; + if ( yawDelta > 0 ) + { + assert( yawDelta <= rightAimLimit ); + weight = yawDelta / rightAimLimit * self.a.aimweight; + self SetAnimLimited( self.a.aim_4, 0, aimBlendTime ); + self SetAnimLimited( self.a.aim_6, weight, aimBlendTime ); + } + else if ( yawDelta < 0 ) + { + assert( yawDelta >= leftAimLimit ); + weight = yawDelta / leftAimLimit * self.a.aimweight; + self SetAnimLimited( self.a.aim_6, 0, aimBlendTime ); + self SetAnimLimited( self.a.aim_4, weight, aimBlendTime ); + } + if ( pitchDelta > 0 ) + { + assert( pitchDelta <= upAimLimit ); + weight = pitchDelta / upAimLimit * self.a.aimweight; + self SetAnimLimited( self.a.aim_2, 0, aimBlendTime ); + self SetAnimLimited( self.a.aim_8, weight, aimBlendTime ); + } + else if ( pitchDelta < 0 ) + { + assert( pitchDelta >= downAimLimit ); + weight = pitchDelta / downAimLimit * self.a.aimweight; + self SetAnimLimited( self.a.aim_8, 0, aimBlendTime ); + self SetAnimLimited( self.a.aim_2, weight, aimBlendTime ); + } + if ( players.size == 1 ) + { + self thread trackLoopPacer(); + self waittill("trackLoopStart"); + waittillframeend; + } + else + { + wait( 1 ); + } + if( self.pauseTrackLoop ) + { + self.aimAngleOffset = 0; + self.pitchAngleOffset = 0; + self waittill("trackLoopStart"); + self.pauseTrackLoop = false; + firstFrame = true; + prevYawDelta = 0; + prevPitchDelta = 0; + shootFromAngles = self trackLoopGetShootFromAngles(); + prevshootFromYawAngle = shootFromAngles[1] + self.aimAngleOffset; + prevshootFromPitchAngle = shootFromAngles[0] + self.pitchAngleOffset; + } + } +} +setAnimAimWeight(goalweight, goaltime) +{ + if ( !IsDefined( goaltime ) || goaltime <= 0 ) + { + self.a.aimweight = goalweight; + self.a.aimweight_start = goalweight; + self.a.aimweight_end = goalweight; + self.a.aimweight_transframes = 0; + } + else + { + if ( !isdefined( self.a.aimweight ) ) + self.a.aimweight = 0; + self.a.aimweight_start = self.a.aimweight; + self.a.aimweight_end = goalweight; + self.a.aimweight_transframes = int(goaltime * 20); + } + self.a.aimweight_t = 0; +} +incrAnimAimWeight() +{ + if ( self.a.aimweight_t < self.a.aimweight_transframes ) + { + self.a.aimweight_t++; + t = 1.0 * self.a.aimweight_t / self.a.aimweight_transframes; + self.a.aimweight = self.a.aimweight_start * (1 - t) + self.a.aimweight_end * t; + } +} +decideNumShotsForBurst() +{ + numShots = 0; + if ( animscripts\weaponList::usingSemiAutoWeapon() ) + { + numShots = anim.semiFireNumShots[ RandomInt( anim.semiFireNumShots.size ) ]; + } + else if ( self.fastBurst ) + { + numShots = anim.fastBurstFireNumShots[ RandomInt( anim.fastBurstFireNumShots.size ) ]; + } + else + { + numShots = anim.burstFireNumShots[ RandomInt( anim.burstFireNumShots.size ) ]; + } + if ( numShots <= self.bulletsInClip ) + { + return numShots; + } + assertex( self.bulletsInClip >= 0, self.bulletsInClip ); + if ( self.bulletsInClip <= 0 ) + { + return 1; + } + return self.bulletsInClip; +} +decideNumShotsForFull() +{ + numShots = self.bulletsInClip; + if ( weaponClass( self.weapon ) == "mg" ) + { + choice = RandomFloat(10); + if ( choice < 3 ) + { + numShots = randomIntRange( 2, 6 ); + } + else if ( choice < 8 ) + { + numShots = randomIntRange( 6, 12 ); + } + else + { + numShots = randomIntRange( 12, 20 ); + } + } + return numShots; +} +handleDropClip( flagName ) +{ + self endon ( "killanimscript" ); + self endon ( "abort_reload" ); + if ( !IsSentient( self ) ) + { + return; + } + clipModel = undefined; + if ( self.weaponInfo[self.weapon].useClip ) + { + clipModel = getWeaponClipModel( self.weapon ); + if ( !IsDefined( level.weaponClipModelsLoaded ) || !IsDefined( anim._effect[ clipModel ] ) ) + { + println("^1Warning: Couldn't drop clip model " + clipModel + " because it is not in level.weaponClipModels so it probably wasn't precached."); + println("^1Set dvar scr_generateClipModels to 1 and map_restart, then follow instructions in console."); + clipModel = undefined; + } + } + if ( self.weaponInfo[self.weapon].hasClip ) + { + if ( weaponAnims() == "pistol" ) + { + } + else + { + } + if ( IsDefined( clipModel ) ) + { + self hidepart( "tag_clip" ); + assert( IsDefined( anim._effect[clipModel] ) ); + playFxOnTag( anim._effect[clipModel], self, "tag_clip" ); + self.weaponInfo[self.weapon].hasClip = false; + self thread resetClipOnAbort( clipModel ); + } + } + for ( ;; ) + { + self waittill( flagName, noteTrack ); + switch ( noteTrack ) + { + case "attach clip left": + case "attach clip right": + if ( IsDefined( clipModel ) ) + { + self attach( clipModel, "tag_inhand" ); + self hidepart( "tag_clip" ); + self thread resetClipOnAbort( clipModel, "tag_inhand" ); + } + self animscripts\weaponList::RefillClip(); + break; + case "detach clip right": + case "detach clip left": + if ( IsDefined( clipModel ) ) + { + self detach( clipModel, "tag_inhand" ); + self showpart( "tag_clip" ); + self notify ( "clip_detached" ); + self.weaponInfo[self.weapon].hasClip = true; + } + if ( weaponAnims() == "pistol" ) + { + } + else + { + } + return; + } + } +} +resetClipOnAbort( clipModel, currentTag ) +{ + self notify ( "clip_detached" ); + self endon ( "clip_detached" ); + self waittill_any( "killanimscript", "abort_reload" ); + if ( !IsDefined( self ) ) + { + return; + } + if ( IsDefined( currentTag ) ) + { + self detach( clipModel, currentTag ); + } + if ( IsAlive( self ) ) + { + self showpart( "tag_clip" ); + self.weaponInfo[self.weapon].hasClip = true; + } + else + { + if ( IsDefined( currentTag ) && IsDefined( anim._effect[clipModel] ) ) + { + playFxOnTag( anim._effect[clipModel], self, currentTag ); + } + } +} +moveToOriginOverTime( origin, time ) +{ + self endon("killanimscript"); + if ( DistanceSquared( self.origin, origin ) > 16*16 && !self mayMoveToPoint( origin ) ) + { + return; + } + self.keepClaimedNodeInGoal = true; + offset = self.origin - origin; + frames = int(time * 20); + offsetreduction = vector_scale( offset, 1.0 / frames ); + for ( i = 0; i < frames; i++ ) + { + offset -= offsetreduction; + self Teleport( origin + offset ); + wait .05; + } + self.keepClaimedNodeInGoal = false; +} +returnTrue() { return true; } +playLookAnimation( lookAnim, lookTime, canStopCallback ) +{ + if ( !IsDefined( canStopCallback ) ) + { + canStopCallback = ::returnTrue; + } + for ( i = 0; i < lookTime * 10; i++ ) + { + if ( IsAlive( self.enemy ) ) + { + if ( self canSeeEnemy() && [[ canStopCallback ]]() ) + { + return; + } + } + if ( self isSuppressedWrapper() && [[ canStopCallback ]]() ) + { + return; + } + self SetAnimKnobAll( lookAnim, %body, 1, .1 ); + wait (0.1); + } +} +getSecondaryWeapon() +{ + if( IsDefined(self.weapon) ) + { + if( self.weapon == self.primaryweapon && AIHasWeapon(self.secondaryweapon) && weaponClass(self.secondaryweapon) != "pistol" ) + { + return self.secondaryweapon; + } + else if( self.weapon == self.secondaryweapon && AIHasWeapon(self.primaryweapon) && weaponClass(self.secondaryweapon) != "pistol" ) + { + return self.primaryweapon; + } + } + return undefined; +} +hasSecondaryWeapon() +{ + weapon = getSecondaryWeapon(); + return( IsDefined(weapon) && (weapon != "none") ); +} +shouldThrowDownWeapon() +{ + if( !hasSecondaryWeapon() ) + { + return false; + } + if( !self.a.allow_weapon_switch ) + { + return false; + } + curWeaponClass = weaponAnims(); + if( curWeaponClass == "none" ) + { + return false; + } + if( IsDefined(self.shootPos) ) + { + distSqToShootPos = lengthsquared( self.origin - self.shootPos ); + if ( weaponAnims() == "rocketlauncher" && (distSqToShootPos < squared( 512 ) || self.a.rockets < 1 ) ) + { + return true; + } + } + return false; +} +throwDownWeapon() +{ + self endon ( "killanimscript" ); + swapAnim = animArray("throw_down_weapon"); + if( !IsDefined(swapAnim) || swapAnim == %void ) + { + return; + } + self AnimMode( "angle deltas" ); + self SetFlaggedAnimKnobAllRestart( "weapon swap", swapAnim, %body, 1, .1, 1 ); + note = ""; + while (note!="end") + { + self waittill("weapon swap",note); + if ( note == "dropgun" || note == "gun drop") + { + DropAIWeapon(); + } + if ( note == "anim_gunhand = \"right\"" ) + { + assertex( hasSecondaryWeapon(), "self.secondaryweapon not defined! check the aitype for this actor. " ); + if( AIHasWeapon(self.secondaryweapon) ) + { + self animscripts\shared::placeWeaponOn( self.secondaryweapon, "right" ); + } + else + { + self animscripts\shared::placeWeaponOn( self.primaryweapon, "right" ); + } + } + } + if( self.bulletsInClip > weaponClipSize( self.weapon ) ) + { + self.bulletsInClip = weaponClipSize( self.weapon ); + } + self maps\_gameskill::didSomethingOtherThanShooting(); +} +shouldSwitchWeapons() +{ + if (!hasSecondaryWeapon() || !self.a.allow_weapon_switch) + { + return false; + } + if( self.a.atPillarNode ) + { + return false; + } + if( IsDefined(self.a.weapon_switch_ASAP) && (self.a.weapon_switch_ASAP) ) + { + assertex( hasSecondaryWeapon(), "self.secondaryweapon not defined! check the aitype for this actor. " ); + self.a.weapon_switch_ASAP = false; + return true; + } + if( (gettime() - self.a.weapon_switch_time) < 1000 ) + { + return false; + } + if(GetDvarInt( #"aiForceSwitchWeapons")) + { + return true; + } + curWeaponClass = weaponAnims(); + if( curWeaponClass == "none" ) + { + return true; + } + if( shouldSwitchWeaponForSituation() ) + { + return true; + } + if ( shouldSwitchWeaponForDistance() ) + { + return true; + } + return false; +} +shouldSwitchWeaponForDistance() +{ + if( ( weaponAnims() == "rocketlauncher" && isEnemyInExplodableVolume() ) || !IsSentient( self.enemy ) ) + { + return false; + } + if ( IsDefined( self.shootPos ) ) + { + distSqToShootPos = lengthsquared( self.origin - self.shootPos ); + shouldUseWeapon = undefined; + Assert( IsDefined( self.primaryweapon_fightdist_minSq ) ); + Assert( IsDefined( self.secondaryweapon_fightdist_minSq ) ); + withinPrimaryRange = ( ( self.primaryweapon_fightdist_minSq < distSqToShootPos ) && ( distSqToShootPos < self.primaryweapon_fightdist_maxSq ) ); + withinSecondaryRange = ( ( self.secondaryweapon_fightdist_minSq < distSqToShootPos ) && ( distSqToShootPos < self.secondaryweapon_fightdist_maxSq ) ); + if( ( withinPrimaryRange && withinSecondaryRange ) || ( !withinPrimaryRange && !withinSecondaryRange ) ) + { + if (IsDefined(self.enemy)) + { + primaryweapon_accuracy = getweaponaccuracy(self, self.primaryweapon); + secondaryweapon_accuracy = getweaponaccuracy(self, self.secondaryweapon); + if ( primaryweapon_accuracy > secondaryweapon_accuracy ) + { + shouldUseWeapon = self.primaryweapon; + } + else + { + shouldUseWeapon = self.secondaryweapon; + } + } + else + { + shouldUseWeapon = self.weapon; + } + } + else + { + if ( withinPrimaryRange ) + { + shouldUseWeapon = self.primaryweapon; + } + else if ( withinSecondaryRange ) + { + shouldUseWeapon = self.secondaryweapon; + } + } + Assert( IsDefined(shouldUseWeapon) ); + if ( self.weapon != shouldUseWeapon ) + { + if( self.a.weapon_switch_for_distance_time < 0 ) + { + self.a.weapon_switch_for_distance_time = GetTime() + RandomFloatRange(2, 4) * 1000; + } + if( isExposed() && GetTime() < self.a.weapon_switch_for_distance_time ) + { + return false; + } + return true; + } + self.a.weapon_switch_for_distance_time = -1; + return false; + } + self.a.weapon_switch_for_distance_time = -1; + return false; +} +isExposed() +{ + if( self.a.script == "cover_crouch" || self.a.script == "cover_stand" ) + { + if( IsDefined(self.a.coverMode) && self.a.coverMode == "Hide" ) + { + return false; + } + } + else if( self.a.script == "cover_left" || self.a.script == "cover_right" || self.a.script == "cover_pillar" ) + { + if( !IsDefined(self.cornerAiming) || !self.cornerAiming ) + { + return false; + } + } + return true; +} +getWeaponSwitchAnim() +{ + animName = "weapon_switch"; + if( !isExposed() ) + { + animName = "weapon_switch_cover"; + if(GetDvarInt( #"aiQuadrantSwitch") == 1) + { + animName = "weapon_switch_quadrants_cover"; + } + else if(GetDvarInt( #"aiQuadrantSwitch") == 2) + { + animName = "weapon_putaway_cover"; + } + } + else + { + if(GetDvarInt( #"aiQuadrantSwitch") == 1) + { + animName = "weapon_switch_quadrants"; + } + else if(GetDvarInt( #"aiQuadrantSwitch") == 2) + { + animName = "weapon_putaway"; + } + } + if( IsArray( animArray(animName) ) ) + { + return animArrayPickRandom( animName ); + } + return animArray(animName); +} +getWeaponPulloutAnim() +{ + animName = "weapon_pullout"; + if( !isExposed() ) + { + animName = "weapon_pullout_cover"; + } + assert( animArrayExist(animName) ); + if( IsArray( animArray(animName) ) ) + { + return animArrayPickRandom( animName ); + } + return animArray(animName); +} +switchWeapons() +{ + swapAnim = getWeaponSwitchAnim(); + if( !IsDefined(swapAnim) ) + { + return; + } + self animMode( "angle deltas" ); + self SetFlaggedAnimKnobAllRestart( "weapon swap", swapAnim, %body, 1, .1, 1 ); + self DoNoteTracks( "weapon swap" ); + if( GetDvarInt( #"aiQuadrantSwitch") == 2 ) + { + pulloutAnim = getWeaponPulloutAnim(); + if( IsDefined(swapAnim) ) + { + self SetFlaggedAnimKnobAllRestart( "weapon swap", pulloutAnim, %body, 1, .1, 1 ); + self DoNoteTracks( "weapon swap" ); + } + } + self ClearAnim(%weapon_switch, 0.2); + self.a.weapon_switch_time = gettime(); + self.a.weapon_switch_for_distance_time = -1; + self notify("weapon_switched"); + self maps\_gameskill::didSomethingOtherThanShooting(); +} +isEnemyInExplodableVolume() +{ + if (!IsDefined(self.enemy)) + { + return false; + } + if (IsDefined(self.enemy._explodable_targets) ) + { + for (i = 0; i < self.enemy._explodable_targets.size; i++) + { + if (IsDefined(self.enemy._explodable_targets[i]) && self CanSee(self.enemy._explodable_targets[i])) + { + return true; + } + } + } + else if( IsDefined(self.enemy.script_exploder) || self.enemy is_destructible()) + { + return true; + } + return false; +} +shouldSwitchWeaponForSituation() +{ + self endon( "death" ); + secondaryWeaponClass = weaponClass( self getSecondaryWeapon() ); + if( isEnemyInExplodableVolume() && secondaryWeaponClass == "rocketlauncher" && WeaponClass(self.weapon) != "rocketlauncher" ) + { + return true; + } + return false; +} +setAimingAnims( aim_2, aim_4, aim_6, aim_8 ) +{ + assert( IsDefined(aim_2) ); + assert( IsDefined(aim_4) ); + assert( IsDefined(aim_6) ); + assert( IsDefined(aim_8) ); + self.a.aim_2 = aim_2; + self.a.aim_4 = aim_4; + self.a.aim_6 = aim_6; + self.a.aim_8 = aim_8; +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/squadmanager.gsc b/BO1/PC/ZM/animscripts/squadmanager.gsc new file mode 100644 index 0000000..f8bcfff --- /dev/null +++ b/BO1/PC/ZM/animscripts/squadmanager.gsc @@ -0,0 +1,741 @@ + +init_squadManager() +{ + if (IsDefined (anim.squadInitialized) && anim.squadInitialized) + { + return; + } + anim.squadCreateFuncs = []; + anim.squadCreateStrings = []; + anim.squads = []; + anim.squadIndex = []; + anim.squadRand = 0; + anim.squadInitialized = true; +} +createSquad(squadName) +{ + assertex (!IsDefined (anim.squads[squadName]), "createSquad attempted to create a squad with the same name as an existing squad"); + anim.squads[squadName] = SpawnStruct(); + squad = anim.squads[squadName]; + squad.squadName = squadName; + squad.sightTime = 0; + squad.origin = undefined; + squad.forward = undefined; + squad.enemy = undefined; + squad.isInCombat = false; + squad.memberCount = 0; + squad.members = []; + squad.officers = []; + squad.officerCount = 0; + squad.squadList = []; + squad.memberAddFuncs = []; + squad.memberAddStrings = []; + squad.memberRemoveFuncs = []; + squad.memberRemoveStrings = []; + squad.squadUpdateFuncs = []; + squad.squadUpdateStrings = []; + squad.squadID = anim.squadIndex.size; + squad initState ("combat", 0.75); + squad initState ("cover", 0.75); + squad initState ("move", 0.75); + squad initState ("stop", 0.75); + squad initState ("death", 0.75); + squad initState ("suppressed", 0.75); + squad initState ("attacking", 0.5); + anim.squadIndex[anim.squadIndex.size] = squad; + squad updateSquadList(); + level notify ("squad created " + squadName); + anim notify ("squad created " + squadName); + for (i = 0; i < anim.squadCreateFuncs.size; i++) + { + squadCreateFunc = anim.squadCreateFuncs[i]; + squad thread [[squadCreateFunc]] (); + } + for (i = 0; i < anim.squadIndex.size; i++) + { + anim.squadIndex[i] updateSquadList(); + } + squad thread updateMemberStates(); + return (squad); +} +deleteSquad(squadName) +{ + assertex (IsDefined (anim.squads[squadName]), "deleteSquad attempted to delete a squad that does not exist"); + if (squadName == "axis" || squadName == "allies") + { + return; + } + squadID = anim.squads[squadName].squadID; + squad = anim.squads[squadName]; + while (squad.members.size) + { + squad.members[0] addToSquad(squad.members[0].team); + } + anim.squadIndex[squadID] = anim.squadIndex[anim.squadIndex.size - 1]; + anim.squadIndex[squadID].squadID = squadID; + anim.squadIndex[anim.squadIndex.size - 1] = undefined; + anim.squads[squadName] = undefined; + level notify ("squad deleted " + squadName); + anim notify ("squad deleted " + squadName); + for (i = 0; i < anim.squadIndex.size; i++) + { + anim.squadIndex[i] updateSquadList(); + } +} +generateSquadName() +{ + squadName = "auto" + anim.squadRand; + anim.squadRand++; + return (squadName); +} +addPlayerToSquad(squadName) +{ + if (!IsDefined (squadName)) + { + if (IsDefined (self.script_squadname)) + { + squadName = self.script_squadname; + } + else + { + squadName = self.team; + } + } + if (!IsDefined (anim.squads[squadName])) + { + anim createSquad (squadName); + } + squad = anim.squads[squadName]; + self.squad = squad; +} +squadChange() +{ + self endon ("death"); + wait (10.0); + if (!IsDefined (self.script_squadname)) + { + squadName = (self.team + self.script_flanker); + } + else + { + squadName = (self.script_squadname + self.script_flanker); + } + self addToSquad (squadName); +} +addToSquad( squadName ) +{ + assertex (IsSentient (self), "addToSquad attempted to add a non-sentient member to a squad"); + if ( !IsDefined( squadName ) ) + { + if ( IsDefined( self.script_flanker ) ) + { + self thread squadChange(); + } + if (IsDefined (self.script_squadname)) + { + squadName = self.script_squadname; + } + else + { + squadName = self.team; + } + } + if ( !IsDefined( anim.squads[squadName] ) ) + { + anim createSquad( squadName ); + } + squad = anim.squads[squadName]; + if ( IsDefined( self.squad ) ) + { + if ( self.squad == squad ) + { + return; + } + else + { + self removeFromSquad(); + } + } + self.lastEnemySightTime = 0; + self.combatTime = 0; + self.squad = squad; + self.memberID = squad.members.size; + squad.members[self.memberID] = self; + squad.memberCount = squad.members.size; + if ( IsDefined( level.loadoutComplete ) ) + { + if ( self.team == "allies" && self isOfficer() ) + { + self addOfficerToSquad(); + } + } + for (i = 0; i < self.squad.memberAddFuncs.size; i++) + { + memberAddFunc = self.squad.memberAddFuncs[i]; + self thread [[memberAddFunc]] (self.squad.squadName); + } + self thread memberDeathWaiter(); +} +removeFromSquad() +{ + assertex (IsDefined (self.squad), "removeFromSquad attempted to remove a member who was not part of a squad (self.squad == undefined)"); + squad = self.squad; + memberID = -1; + if (IsDefined (self)) + { + memberID = self.memberID; + } + else + { + for (i = 0; i < squad.members.size; i++) + { + if (squad.members[i] == self) + { + memberID = i; + } + } + } + assertex (memberID > -1, "removeFromSquad could not find memberID"); + if (memberID != squad.members.size - 1) + { + other = squad.members[squad.members.size - 1]; + squad.members[memberID] = other; + if (IsDefined (other)) + { + other.memberID = memberID; + } + } + squad.members[squad.members.size - 1] = undefined; + squad.memberCount = squad.members.size; + if (IsDefined (self.officerID)) + { + self removeOfficerFromSquad(); + } + for (i = 0; i < self.squad.memberRemoveFuncs.size; i++) + { + memberRemoveFunc = self.squad.memberRemoveFuncs[i]; + self thread [[memberRemoveFunc]] (squad.squadName); + } + assert (squad.members.size == squad.memberCount); + if (squad.memberCount == 0) + { + deleteSquad (squad.squadName); + } + if (IsDefined (self)) + { + self.squad = undefined; + self.memberID = undefined; + } + self notify ("removed from squad"); +} +addOfficerToSquad() +{ + squad = self.squad; + if (IsDefined (self.officerID)) + { + return; + } + assertex (!IsDefined (self.officerID), "addOfficerToSquad attempted to add a member that is already in an officers"); + self.officerID = squad.officers.size; + squad.officers[self.officerID] = self; + squad.officerCount = squad.officers.size; +} +removeOfficerFromSquad() +{ + squad = self.squad; + officerID = -1; + if (IsDefined (self)) + { + officerID = self.officerID; + } + else + { + for (i = 0; i < squad.officers.size; i++) + { + if (squad.officers[i] == self) + { + officerID = i; + } + } + } + assertex (officerID > -1, "removeOfficerFromSquad could not find officerID"); + if (officerID != squad.officers.size - 1) + { + other = squad.officers[squad.officers.size - 1]; + squad.officers[officerID] = other; + if (IsDefined (other)) + { + other.officerID = officerID; + } + } + squad.officers[squad.officers.size - 1] = undefined; + squad.officerCount = squad.officers.size; + assert (squad.officers.size == squad.officerCount); + if (IsDefined (self)) + { + self.officerID = undefined; + } +} +officerWaiter() +{ + if (!IsDefined (level.loadoutComplete)) + { + anim waittill ("loadout complete"); + } + for (i = 0; i < self.members.size; i++) + { + if (self.members[i] isOfficer()) + { + self.members[i] addOfficerToSquad(); + } + } +} +updateWaiter() +{ + while (1) + { + anim waittill ("squadupdate", action); + switch (action) + { + case "squadlist": + self updateSquadList(); + break; + case "combat": + self updateCombat(); + break; + case "origin": + self updateOrigin(); + break; + case "forward": + self updateHeading(); + break; + } + } +} +squadTracker() +{ + anim endon ("squad deleted " + self.squadName); + while (1) + { + self updateAll(); + wait (0.1); + } +} +memberDeathWaiter() +{ + self endon ("removed from squad"); + self waittill ("death", attacker); + self removeFromSquad(); +} +memberCombatWaiter() +{ + self endon ("removed from squad"); + while (1) + { + self waittill ("enemy"); + if (!IsDefined (self.enemy)) + { + self.squad notify ("squadupdate", "combat"); + } + else + { + self.squad.isInCombat = true; + } + wait ( 0.05 ); + } +} +updateHeading() +{ + if (IsDefined (self.enemy)) + { + self.forward = VectorNormalize (self.enemy.origin - self.origin); + return; + } + newHeading = (0, 0, 0); + numInfluences = 0; + for (i = 0; i < self.members.size; i++) + { + if (!IsAlive(self.members[i])) + { + continue; + } + newHeading += AnglesToForward (self.members[i].angles); + numInfluences++; + } + if (numInfluences) + { + self.forward = (newHeading[0] / numInfluences, newHeading[1] / numInfluences, newHeading[2] / numInfluences); + } + else + { + self.forward = newHeading; + } +} +updateOrigin() +{ + newOrigin = (0, 0, 0); + numInfluences = 0; + for (i = 0; i < self.members.size; i++) + { + if (!IsAlive (self.members[i])) + { + continue; + } + newOrigin += self.members[i].origin; + numInfluences++; + } + if (numInfluences) + { + self.origin = (newOrigin[0] / numInfluences, newOrigin[1] / numInfluences, newOrigin[2] / numInfluences); + } + else + { + self.origin = newOrigin; + } +} +updateCombat() +{ + self.isInCombat = false; + for (i = 0; i < anim.squadIndex.size; i++) + { + if (IsDefined (anim.squadIndex[i].squadName) ) + { + self.squadList[anim.squadIndex[i].squadName].isInContact = false; + } + } + for (i = 0; i < self.members.size; i++) + { + if (IsDefined (self.members[i].enemy) && + IsDefined (self.members[i].enemy.squad) && + IsDefined(self.members[i].enemy.squad.squadName) && + self.members[i].combatTime > 0) + { + if( isdefined( self.squadList[self.members[i].enemy.squad.squadName] ) ) + { + self.squadList[self.members[i].enemy.squad.squadName].isInContact = true; + } + } + } +} +updateAll() +{ + newOrigin = (0, 0, 0); + numInfluences = 0; + curEnemy = undefined; + isInCombat = false; + self updateCombat(); + for (i = 0; i < self.members.size; i++) + { + if (!IsAlive (self.members[i])) + { + continue; + } + newOrigin += self.members[i].origin; + numInfluences++; + if (IsDefined (self.members[i].enemy) && IsDefined (self.members[i].enemy.squad)) + { + if (!IsDefined (curEnemy)) + { + curEnemy = self.members[i].enemy.squad; + } + else if (self.members[i].enemy.squad.memberCount > curEnemy.memberCount) + { + curEnemy = self.members[i].enemy.squad; + } + } + } + if (numInfluences) + { + self.origin = (newOrigin[0] / numInfluences, newOrigin[1] / numInfluences, newOrigin[2] / numInfluences); + } + else + { + self.origin = newOrigin; + } + self.isInCombat = isInCombat; + self.enemy = curEnemy; + self updateHeading(); +} +updateSquadList() +{ + for (i = 0; i < anim.squadIndex.size; i++) + { + if (!IsDefined (self.squadList[anim.squadIndex[i].squadName])) + { + self.squadList[anim.squadIndex[i].squadName] = SpawnStruct(); + self.squadList[anim.squadIndex[i].squadName].isInContact = false; + } + for (j = 0; j < self.squadUpdateFuncs.size; j++) + { + squadUpdateFunc = self.squadUpdateFuncs[j]; + self thread [[squadUpdateFunc]] (anim.squadIndex[i].squadName); + } + } +} +isOfficer() +{ + fullRank = self animscripts\battlechatter::getRank(); + return (fullRank == "sergeant" || fullRank == "lieutenant" || fullRank == "captain" || fullRank == "sergeant"); +} +aiUpdateAnimState(animscript) +{ + switch (animscript) + { + case "combat": + case "move": + case "stop": + case "death": + self.a.state = animscript; + break; + case "pain": + case "grenadecower": + break; + case "cover_crouch": + case "cover_left": + case "cover_prone": + case "cover_right": + case "cover_stand": + case "cover_wide_left": + case "cover_wide_right": + case "concealment_crouch": + case "concealment_prone": + case "concealment_stand": + case "stalingrad_cover_crouch": + self.a.state = "cover"; + break; + case "aim": + case "l33t truckride combat": + self.a.state = "combat"; + break; + } +} +updateStates() +{ + self resetState ("combat"); + self resetState ("cover"); + self resetState ("move"); + self resetState ("stop"); + self resetState ("death"); + self resetState ("suppressed"); + self resetState ("attacking"); + for (i = 0; i < self.members.size; i++) + { + if (!IsAlive (self.members[i])) + { + continue; + } + self queryMemberAnimState (self.members[i]); + self queryMemberState (self.members[i], "suppressed"); + self queryMemberState (self.members[i], "combat"); + self queryMemberState (self.members[i], "attacking"); + self queryMemberState (self.members[i], "cover"); + } +} +updateMemberStates() +{ + anim endon ("squad deleted " + self.squadName); + timeSlice = 0.2; + while (1) + { + for (i = 0; i < self.members.size; i++) + { + if (!IsAlive (self.members[i])) + { + continue; + } + self.members[i] aiUpdateMessages(timeSlice); + } + wait (timeSlice); + } +} +aiUpdateCombat(timeSlice) +{ + if (IsDefined (self.lastEnemySightPos)) + { + if (self.combatTime < 0) + { + self.combatTime = timeSlice; + } + else + { + self.combatTime += timeSlice; + } + self.lastEnemySightTime = GetTime(); + return; + } + else if (self issuppressed()) + { + self.combatTime += timeSlice; + return; + } + if (self.combatTime > 0) + { + self.combatTime = (0 - timeSlice); + } + else + { + self.combatTime -= timeSlice; + } +} +aiUpdateSuppressed(timeSlice) +{ + if (self.suppressed) + { + if (self.suppressedTime < 0) + { + self.suppressedTime = timeSlice; + } + else + { + self.suppressedTime += timeSlice; + } + return; + } + if (self.suppressedTime > 0) + { + self.suppressedTime = (0 - timeSlice); + } + else + { + self.suppressedTime -= timeSlice; + } +} +initState(state, activateRatio) +{ + self.squadStates[state] = SpawnStruct(); + self.squadStates[state].activateRatio = activateRatio; + self.squadStates[state].isActive = false; + self.squadStates[state].numActive = 0; +} +resetState(state) +{ + self.squadStates[state].isActive = false; + self.squadStates[state].numActive = 0; +} +queryMemberAnimState(member) +{ + self.squadStates[member.a.state].numActive++; + if (self.squadStates[member.a.state].numActive > (self.squadStates[member.a.state].activateRatio * self.members.size)) + { + self.squadStates[member.a.state].isActive = true; + } +} +queryMemberState(member, state) +{ + switch (state) + { + case "suppressed": + if (member.suppressedTime > 1.0) + { + self.squadStates[state].numActive++; + } + break; + case "combat": + if (member.combatTime > 0.0) + { + self.squadStates[state].numActive++; + } + break; + case "attacking": + if (GetTime() < member.a.lastShootTime + 2000) + { + self.squadStates[state].numActive++; + } + break; + case "cover": + if (!member animscripts\battlechatter::isExposed()) + { + self.squadStates[state].numActive++; + } + break; + } + if (self.squadStates[state].numActive > (self.squadStates[state].activateRatio * self.members.size)) + { + self.squadStates[state].isActive = true; + } +} +aiUpdateMessages(timeSlice) +{ + self removeExpiredMessages(); +} +constructMessage(contents, lifetime, sender) +{ + assert( IsDefined(contents) ); + if( IsDefined(contents) ) + { + message = SpawnStruct(); + if( !IsDefined(lifetime) ) + { + lifetime = 0.05; + } + message.contents = contents; + message.sender = sender; + message.sendTime = GetTime(); + message.expireTime = GetTime() + lifetime * 1000; + return message; + } + return undefined; +} +postSquadMessage(contents, lifetime) +{ + assert( IsDefined(self.squad) ); + assert( IsDefined(self.squad.members) ); + message = constructMessage( contents, lifetime, self ); + if( IsDefined(message) ) + { + for( i=0; i < self.squad.members.size; i++ ) + { + if( !IsAlive(self.squad.members[i]) || self == self.squad.members[i] ) + { + continue; + } + self.squad.members[i] postMessage(message); + } + } +} +postMessage(message) +{ + assert( IsDefined(message) ); + if( IsDefined(message) ) + { + if( !IsDefined(self.messages) ) + { + self.messages = []; + } + self.messages[ self.messages.size ] = message; + } +} +hasMessage(contents) +{ + if( IsDefined(self.messages) && self.messages.size > 0 ) + { + for( i=0; i < self.messages.size; i++ ) + { + message = self.messages[i]; + if( IsDefined(message) && message.contents == contents ) + { + return true; + } + } + } + return false; +} +removeExpiredMessages() +{ + if( IsDefined(self.messages) && self.messages.size > 0 ) + { + newArray = []; + for( i=0; i < self.messages.size; i++ ) + { + message = self.messages[i]; + if( !IsDefined(message) || message.expireTime < GetTime() ) + { + continue; + } + newArray[newArray.size] = message; + } + self.messages = newArray; + } +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/traverse/crouch_jump_down_40.gsc b/BO1/PC/ZM/animscripts/traverse/crouch_jump_down_40.gsc new file mode 100644 index 0000000..5a6dd5e Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/crouch_jump_down_40.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/jump_across_72.gsc b/BO1/PC/ZM/animscripts/traverse/jump_across_72.gsc new file mode 100644 index 0000000..6df6c9f Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/jump_across_72.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_120.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_120.gsc new file mode 100644 index 0000000..d782acb Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_120.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_127.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_127.gsc new file mode 100644 index 0000000..2d786f0 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_127.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_184.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_184.gsc new file mode 100644 index 0000000..03676ec Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_184.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_190.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_190.gsc new file mode 100644 index 0000000..9abf452 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_190.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_222.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_222.gsc new file mode 100644 index 0000000..1d47d76 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_222.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_232_coast.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_232_coast.gsc new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_240.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_240.gsc new file mode 100644 index 0000000..08dbab4 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_240.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_286.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_286.gsc new file mode 100644 index 0000000..4813cc3 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_286.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_386.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_386.gsc new file mode 100644 index 0000000..ee9b058 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_386.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_40.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_40.gsc new file mode 100644 index 0000000..1ff938d Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_40.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_48.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_48.gsc new file mode 100644 index 0000000..f9961f4 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_48.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_72.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_72.gsc new file mode 100644 index 0000000..94993c3 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_72.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_90_temple.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_90_temple.gsc new file mode 100644 index 0000000..4f75f47 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_90_temple.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_96.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_96.gsc new file mode 100644 index 0000000..4ce7633 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_down_96.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_222.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_222.gsc new file mode 100644 index 0000000..f15c1c2 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_222.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_222_coast.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_222_coast.gsc new file mode 100644 index 0000000..80d8d32 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_222_coast.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_90_temple.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_90_temple.gsc new file mode 100644 index 0000000..2e92e6b Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_90_temple.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_mine_cart.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_mine_cart.gsc new file mode 100644 index 0000000..b90c40a Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_mine_cart.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_temple_pap.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_temple_pap.gsc new file mode 100644 index 0000000..f82372f Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_temple_pap.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_to_climb.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_to_climb.gsc new file mode 100644 index 0000000..70be152 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_to_climb.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_to_climb_coast.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_to_climb_coast.gsc new file mode 100644 index 0000000..bf8a11c Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_to_climb_coast.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_to_climb_reverse_coast.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_to_climb_reverse_coast.gsc new file mode 100644 index 0000000..935bc10 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_jump_up_to_climb_reverse_coast.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_mantle_over_40.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_mantle_over_40.gsc new file mode 100644 index 0000000..2d76654 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_mantle_over_40.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_quad_vent_jump_down.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_quad_vent_jump_down.gsc new file mode 100644 index 0000000..10bff3f Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_quad_vent_jump_down.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_shared.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_shared.gsc new file mode 100644 index 0000000..08ed8d7 --- /dev/null +++ b/BO1/PC/ZM/animscripts/traverse/zombie_shared.gsc @@ -0,0 +1,364 @@ +#include common_scripts\utility; +#using_animtree ("generic_human"); +init_traverse() +{ + point = GetEnt(self.target, "targetname"); + if (IsDefined(point)) + { + self.traverse_height = point.origin[2]; + point Delete(); + } + else + { + point = getstruct(self.target, "targetname"); + if (IsDefined(point)) + { + self.traverse_height = point.origin[2]; + } + } +} +teleportThread( verticalOffset ) +{ + self endon ("killanimscript"); + self notify("endTeleportThread"); + self endon("endTeleportThread"); + reps = 5; + offset = ( 0, 0, verticalOffset / reps); + for ( i = 0; i < reps; i++ ) + { + self Teleport( self.origin + offset ); + wait .05; + } +} +teleportThreadEx( verticalOffset, delay, frames ) +{ + self endon ("killanimscript"); + self notify("endTeleportThread"); + self endon("endTeleportThread"); + if ( verticalOffset == 0 ) + return; + wait delay; + amount = verticalOffset / frames; + if ( amount > 10.0 ) + amount = 10.0; + else if ( amount < -10.0 ) + amount = -10.0; + offset = ( 0, 0, amount ); + for ( i = 0; i < frames; i++ ) + { + self Teleport( self.origin + offset ); + wait .05; + } +} +PrepareForTraverse() +{ + self.a.pose = "stand"; +} +DoTraverse( traverseData ) +{ + self endon( "killanimscript" ); + self.traverseAnimIsSequence = ( + IsDefined(traverseData[ "traverseAnimType" ]) + && (traverseData[ "traverseAnimType" ] == "sequence") + ); + self.traverseAnim = traverseData[ "traverseAnim" ]; + self.traverseAnimTransIn = traverseData[ "traverseAnimTransIn" ]; + self.traverseAnimTransOut = traverseData[ "traverseAnimTransOut" ]; + self.traverseSound = traverseData[ "traverseSound" ]; + self.traverseAlertness = traverseData[ "traverseAlertness" ]; + self.traverseStance = traverseData[ "traverseStance" ]; + self.traverseHeight = traverseData[ "traverseHeight" ]; + self.traverseMovement = traverseData[ "traverseMovement" ]; + self.traverseToCoverAnim = traverseData[ "traverseToCoverAnim" ]; + self.traverseToCoverSound = traverseData[ "traverseToCoverSound" ]; + self.traverseDeathAnim = traverseData[ "interruptDeathAnim" ]; + self.traverseDeathIndex = 0; + self traverseMode( "nogravity" ); + self traverseMode( "noclip" ); + if (!IsDefined(self.traverseStance)) + { + self.desired_anim_pose = "stand"; + } + else + { + self.desired_anim_pose = self.traverseStance; + } + animscripts\zombie_utility::UpdateAnimPose(); + self.traverseStartNode = self GetNegotiationStartNode(); + self.traverseEndNode = self GetNegotiationEndNode(); + assert( IsDefined( self.traverseStartNode ) ); + assert( IsDefined( self.traverseEndNode ) ); + self OrientMode( "face angle", self.traverseStartNode.angles[1] ); + self.traverseStartZ = self.origin[2]; + toCover = false; + if ( IsDefined( self.traverseToCoverAnim ) && IsDefined( self.node ) && self.node.type == traverseData[ "coverType" ] && DistanceSquared( self.node.origin, self.traverseEndNode.origin ) < 25 * 25 ) + { + if ( AbsAngleClamp180( self.node.angles[1] - self.traverseEndNode.angles[1] ) > 160 ) + { + toCover = true; + self.traverseAnim = self.traverseToCoverAnim; + } + } + if (IsArray(self.traverseAnim) && !self.traverseAnimIsSequence) + { + self.traverseAnim = random(self.traverseAnim); + } + self DoTraverse_Animation(); + self traverseMode("gravity"); + if (self.delayedDeath) + { + return; + } + self.a.nodeath = false; + if (toCover && IsDefined(self.node) && DistanceSquared(self.origin, self.node.origin) < 16 * 16) + { + self.a.movement = "stop"; + self Teleport( self.node.origin ); + } + else + { + if (IsDefined(self.traverseAlertness)) + { + self.a.alertness = self.traverseAlertness; + } + if (IsDefined(self.traverseMovement)) + { + self.a.movement = self.traverseMovement; + } + self SetAnimKnobAllRestart( animscripts\zombie_run::GetRunAnim(), %body, 1, 0.2, 1 ); + wait(.2); + } +} +DoTraverse_Animation() +{ + traverseAnim = self.traverseAnim; + if (!IsArray(traverseAnim)) + { + traverseAnim = add_to_array(undefined, traverseAnim); + } + self ClearAnim(%body, 0.2); + played_trans_in = false; + if (IsDefined(self.traverseAnimTransIn)) + { + played_trans_in = true; + self SetFlaggedAnimKnobRestart("traverseAnim", self.traverseAnimTransIn, 1, 0.2, 1); + if (traverseAnim.size || IsDefined(self.traverseAnimTransOut)) + { + self animscripts\zombie_shared::DoNoteTracks("traverseAnim", ::handleTraverseNotetracks); + } + else + { + self thread animscripts\zombie_shared::DoNoteTracks("traverseAnim", ::handleTraverseNotetracks); + wait_anim_length(self.traverseAnimTransIn, .2); + } + } + blend = .2; + for (i = 0; i < traverseAnim.size; i++) + { + if (played_trans_in || i > 0 ) + { + blend = 0; + } + DoMainTraverse_Animation(traverseAnim[i], blend); + } + if (IsDefined(self.traverseAnimTransOut)) + { + self SetFlaggedAnimKnobRestart("traverseAnim", self.traverseAnimTransOut, 1, 0, 1); + self thread animscripts\zombie_shared::DoNoteTracks("traverseAnim", ::handleTraverseNotetracks); + wait_anim_length(self.traverseAnimTransOut, .2); + } +} +DoMainTraverse_Animation(animation, blend) +{ + self SetFlaggedAnimKnobRestart("traverseAnim", animation, 1, blend, 1); + self thread TraverseRagdollDeath(animation); + self animscripts\zombie_shared::DoNoteTracks("traverseAnim", ::handleTraverseNotetracks); +} +wait_anim_length(animation, blend) +{ + len = GetAnimLength(animation) - blend; + if (len > 0) + { + wait len; + } +} +handleTraverseNotetracks( note ) +{ + if ( note == "traverse_death" ) + { + return handleTraverseDeathNotetrack(); + } +} +handleTraverseDeathNotetrack() +{ + self endon( "killanimscript" ); + if ( self.delayedDeath ) + { + self.a.noDeath = true; + self.exception["move"] = ::doNothingFunc; + self traverseDeath(); + return true; + } + self.traverseDeathIndex++; +} +handleTraverseAlignment() +{ + self traverseMode( "nogravity" ); + self traverseMode( "noclip" ); + if ( IsDefined( self.traverseHeight ) && IsDefined( self.traverseStartNode.traverse_height ) ) + { + currentHeight = self.traverseStartNode.traverse_height - self.traverseStartZ; + self thread teleportThread( currentHeight - self.traverseHeight ); + } +} +doNothingFunc() +{ + self AnimMode( "zonly_physics" ); + self waittill ( "killanimscript" ); +} +traverseDeath() +{ + self notify("traverse_death"); + if ( !IsDefined( self.triedTraverseRagdoll ) ) + self animscripts\zombie_death::PlayDeathSound(); + deathAnimArray = self.traverseDeathAnim[ self.traverseDeathIndex ]; + deathAnim = deathAnimArray[ RandomInt( deathAnimArray.size ) ]; + animscripts\zombie_death::play_death_anim( deathAnim ); + self DoDamage( self.health + 5, self.origin ); +} +TraverseStartRagdollDeath() +{ + self.prevDelayedDeath = self.delayedDeath; + self.prevAllowDeath = self.allowDeath; + self.prevDeathFunction = self.deathFunction; + self.delayedDeath = false; + self.allowDeath = true; + self.deathFunction = ::TraverseRagdollDeathSimple; +} +TraverseStopRagdollDeath() +{ + self.delayedDeath = self.prevDelayedDeath; + self.allowDeath = self.prevAllowDeath; + self.deathFunction = self.prevDeathFunction; + self.prevDelayedDeath = undefined; + self.prevAllowDeath = undefined; + self.prevDeathFunction = undefined; +} +TraverseRagdollDeathSimple() +{ + self animscripts\zombie_death::PlayDeathSound(); + self startRagdoll(); + deathAnim = animscripts\zombie_death::get_death_anim(); + self SetFlaggedAnimKnobAllRestart( "deathanim", deathAnim, %body, 1, .1 ); + if( AnimHasNotetrack( deathAnim, "death_neckgrab_spurt" ) ) + { + PlayFXOnTag( level._effects[ "death_neckgrab_spurt" ], self, "j_neck" ); + } + wait 0.5; + return true; +} +TraverseRagdollDeath( traverseAnim ) +{ + self notify("TraverseRagdollDeath"); + self endon("TraverseRagdollDeath"); + self endon("traverse_death"); + self endon("killanimscript"); + while(1) + { + self waittill("damage"); + if ( !self.delayedDeath ) + { + continue; + } + scriptedDeathTimes = GetNotetrackTimes( traverseAnim, "traverse_death" ); + currentTime = self GetAnimTime( traverseAnim ); + scriptedDeathTimes[ scriptedDeathTimes.size ] = 1.0; + for ( i = 0; i < scriptedDeathTimes.size; i++ ) + { + if ( scriptedDeathTimes[i] > currentTime ) + { + animLength = GetAnimLength( traverseAnim ); + timeUntilScriptedDeath = (scriptedDeathTimes[i] - currentTime) * animLength; + if ( timeUntilScriptedDeath < 0.5 ) + { + return; + } + break; + } + } + self.deathFunction = ::postTraverseDeathAnim; + self.exception["move"] = ::doNothingFunc; + self animscripts\zombie_death::PlayDeathSound(); + behindMe = self.origin + (0,0,30) - AnglesToForward( self.angles ) * 20; + self startRagdoll(); + thread physExplosionForRagdoll( behindMe ); + self.a.triedTraverseRagdoll = true; + break; + } +} +physExplosionForRagdoll( pos ) +{ + wait .1; + physicsExplosionSphere( pos, 55, 35, 1 ); +} +postTraverseDeathAnim() +{ + self endon( "killanimscript" ); + if ( !IsDefined( self ) ) + return; + deathAnim = animscripts\zombie_death::get_death_anim(); + self SetFlaggedAnimKnobAllRestart( "deathanim", deathAnim, %body, 1, .1 ); + if( animHasNoteTrack( deathAnim, "death_neckgrab_spurt" ) ) + { + PlayFXOnTag( level._effects[ "death_neckgrab_spurt" ], self, "j_neck" ); + } +} +#using_animtree ("dog"); +dog_wall_and_window_hop( traverseName, height ) +{ + self endon("killanimscript"); + self traverseMode("nogravity"); + self traverseMode("noclip"); + startnode = self GetNegotiationStartNode(); + assert( IsDefined( startnode ) ); + self OrientMode( "face angle", startnode.angles[1] ); + if (IsDefined(startnode.traverse_height)) + { + realHeight = startnode.traverse_height - startnode.origin[2]; + self thread teleportThread( realHeight - height ); + } + self ClearAnim(%root, 0.2); + self SetFlaggedAnimRestart( "dog_traverse", anim.dogAnims["zombie"].traverse[ traverseName ], 1, 0.2, 1); + self animscripts\zombie_shared::DoNoteTracks( "dog_traverse" ); + self.traverseComplete = true; +} +dog_jump_down( height, frames ) +{ + self endon("killanimscript"); + self traverseMode("noclip"); + startnode = self GetNegotiationStartNode(); + assert( IsDefined( startnode ) ); + self OrientMode( "face angle", startnode.angles[1] ); + self thread teleportThreadEx( 40.0 - height, 0.1, frames ); + self ClearAnim(%root, 0.2); + self SetFlaggedAnimRestart( "traverse", anim.dogAnims["zombie"].traverse["jump_down_40"], 1, 0.2, 1); + self animscripts\zombie_shared::DoNoteTracks( "traverse" ); + self ClearAnim(anim.dogAnims["zombie"].traverse["jump_down_40"], 0); + self traverseMode("gravity"); + self.traverseComplete = true; +} +dog_jump_up( height, frames ) +{ + self endon("killanimscript"); + self traverseMode("noclip"); + startnode = self GetNegotiationStartNode(); + assert( IsDefined( startnode ) ); + self OrientMode( "face angle", startnode.angles[1] ); + self thread teleportThreadEx( height - 40.0, 0.2, frames ); + self ClearAnim(%root, 0.25); + self SetFlaggedAnimRestart( "traverse", anim.dogAnims["zombie"].traverse["jump_up_40"], 1, 0.2, 1); + self animscripts\zombie_shared::DoNoteTracks( "traverse" ); + self ClearAnim(anim.dogAnims["zombie"].traverse["jump_up_40"], 0); + self traverseMode("gravity"); + self.traverseComplete = true; +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_wall_crawl_drop.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_wall_crawl_drop.gsc new file mode 100644 index 0000000..b735f70 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_wall_crawl_drop.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_water_slide_exit.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_water_slide_exit.gsc new file mode 100644 index 0000000..be0da70 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_water_slide_exit.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_waterfall_down.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_waterfall_down.gsc new file mode 100644 index 0000000..f1c2890 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_waterfall_down.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_waterfall_up.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_waterfall_up.gsc new file mode 100644 index 0000000..860d773 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_waterfall_up.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_watervator_400.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_watervator_400.gsc new file mode 100644 index 0000000..f1dedd4 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_watervator_400.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_watervator_400_alt.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_watervator_400_alt.gsc new file mode 100644 index 0000000..7e4a39d Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_watervator_400_alt.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_watervator_down_400_alt.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_watervator_down_400_alt.gsc new file mode 100644 index 0000000..be82895 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_watervator_down_400_alt.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_zipline_traverse_lighthouse.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_zipline_traverse_lighthouse.gsc new file mode 100644 index 0000000..8ea8820 Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_zipline_traverse_lighthouse.gsc differ diff --git a/BO1/PC/ZM/animscripts/traverse/zombie_zipline_traverse_ship.gsc b/BO1/PC/ZM/animscripts/traverse/zombie_zipline_traverse_ship.gsc new file mode 100644 index 0000000..ac393ec Binary files /dev/null and b/BO1/PC/ZM/animscripts/traverse/zombie_zipline_traverse_ship.gsc differ diff --git a/BO1/PC/ZM/animscripts/utility.gsc b/BO1/PC/ZM/animscripts/utility.gsc new file mode 100644 index 0000000..94e6549 --- /dev/null +++ b/BO1/PC/ZM/animscripts/utility.gsc @@ -0,0 +1,2089 @@ +#include animscripts\SetPoseMovement; +#include animscripts\combat_utility; +#include animscripts\debug; +#include animscripts\anims; +#include common_scripts\utility; +#include maps\_utility; +#using_animtree ("generic_human"); +initAnimTree(animscript) +{ + if ( isValidEnemy( self.a.personImMeleeing ) ) + { + ImNotMeleeing( self.a.personImMeleeing ); + } + self ClearAnim( %body, 0.3 ); + self SetAnim( %body, 1, 0 ); + if ( animscript != "pain" && animscript != "death" && animscript != "react" ) + { + self.a.special = "none"; + } + self.missedSightChecks = 0; + self.a.aimweight = 1.0; + self.a.aimweight_start = 1.0; + self.a.aimweight_end = 1.0; + self.a.aimweight_transframes = 0; + self.a.aimweight_t = 0; + self.a.isAiming = false; + self SetAnim( %shoot, 0, 0.2, 1 ); + IsInCombat(); + assertEX( IsDefined( animscript ), "Animscript not specified in initAnimTree" ); + self.a.prevScript = self.a.script; + self.a.script = animscript; + self.a.script_suffix = undefined; + self animscripts\anims::clearAnimCache(); + [[self.a.StopCowering]](); +} +UpdateAnimPose() +{ + assertEX( self.a.movement=="stop" || self.a.movement=="walk" || self.a.movement=="run", "UpdateAnimPose "+self.a.pose+" "+self.a.movement ); + if ( IsDefined( self.desired_anim_pose ) && self.desired_anim_pose != self.a.pose ) + { + if ( self.a.pose == "prone" ) + { + self ExitProneWrapper( 0.5 ); + } + if ( self.desired_anim_pose == "prone" ) + { + self SetProneAnimNodes( -45, 45, %prone_legs_down, %exposed_aiming, %prone_legs_up); + self EnterProneWrapper(0.5); + self SetAnimKnobAll( animArray("straight_level", "combat"), %body, 1, 0.1, 1 ); + } + } + self.desired_anim_pose = undefined; +} +initialize( animscript ) +{ + if ( IsDefined( self.longDeathStarting ) ) + { + if ( animscript != "pain" && animscript != "death" ) + { + self DoDamage( self.health + 100, self.origin ); + } + if ( animscript != "pain" ) + { + self.longDeathStarting = undefined; + self notify( "kill_long_death" ); + } + } + if ( IsDefined( self.a.mayOnlyDie ) && animscript != "death" ) + { + self DoDamage( self.health + 100, self.origin ); + } + if ( IsDefined( self.a.postScriptFunc ) ) + { + scriptFunc = self.a.postScriptFunc; + self.a.postScriptFunc = undefined; + [[scriptFunc]]( animscript ); + } + if ( animscript != "combat" && animscript != "pain" && animscript != "death" && usingSidearm() && (!IsDefined(self.forceSideArm) || !self.forceSideArm) ) + { + self animscripts\shared::placeWeaponOn( self.primaryweapon, "right" ); + } + if( animscript != "combat" && animscript != "move" && animscript != "pain" ) + { + self.a.magicReloadWhenReachEnemy = false; + } + if ( animscript != "death" ) + { + self.a.nodeath = false; + } + if ( IsDefined( self.isHoldingGrenade ) && (animscript == "pain" || animscript == "death" || animscript == "flashed") ) + { + self dropGrenade(); + } + self.isHoldingGrenade = undefined; + self animscripts\squadmanager::aiUpdateAnimState( animscript ); + self.coverNode = undefined; + self.suppressed = false; + self.isReloading = false; + self.changingCoverPos = false; + self.a.scriptStartTime = GetTime(); + self.a.atConcealmentNode = false; + self.a.atPillarNode = false; + if ( IsDefined( self.node ) ) + { + if( self.node.type == "Conceal Prone" || self.node.type == "Conceal Crouch" || self.node.type == "Conceal Stand" ) + { + self.a.atConcealmentNode = true; + } + else if( self.node.type == "Cover Pillar" ) + { + self.a.atPillarNode = true; + } + } + initAnimTree( animscript ); + UpdateAnimPose(); +} +getPreferredWeapon() +{ + if ( IsDefined( self.wantshotgun ) && self.wantshotgun ) + { + if ( weaponclass( self.primaryweapon ) == "spread" ) + { + return self.primaryweapon; + } + else if ( weaponclass( self.secondaryweapon ) == "spread" ) + { + return self.secondaryweapon; + } + } + return self.primaryweapon; +} +badplacer(time, org, radius) +{ + for (i=0;i 4 ) + { + self lookForBetterCover(); + self . missedSightChecks = 0; + } + return canShootAt; +} +sightCheckNode_invalidate(viewOffset) +{ + return sightCheckNodeProc(true, viewOffset); +} +sightCheckNode(viewOffset) +{ + return sightCheckNodeProc(false, viewOffset); +} +IsInCombat() +{ + if ( isValidEnemy( self.enemy ) ) + { + self.a.combatEndTime = GetTime() + anim.combatMemoryTimeConst + RandomInt(anim.combatMemoryTimeRand); + return true; + } + return ( self.a.combatEndTime > GetTime() ); +} +holdingWeapon() +{ + if (self.a.weaponPos["right"] == "none" && self.a.weaponPos["left"] == "none") + { + return (false); + } + if (!IsDefined (self.holdingWeapon)) + { + return (true); + } + return (self.holdingWeapon); +} +canShootEnemyFromPose( pose, offset, useSightCheck ) +{ + if (self.weapon=="mg42") + { + return false; + } + switch (pose) + { + case "stand": + if (self.a.pose == "stand") + { + poseOffset = (0,0,0); + } + else if (self.a.pose == "crouch") + { + poseOffset = (0,0,20); + } + else if (self.a.pose == "prone") + { + poseOffset = (0,0,55); + } + else + { + assertEX(0, "init::canShootEnemyFromPose "+self.a.pose); + poseOffset = (0,0,0); + } + break; + case "crouch": + if (self.a.pose == "stand") + { + poseOffset = (0,0,-20); + } + else if (self.a.pose == "crouch") + { + poseOffset = (0,0,0); + } + else if (self.a.pose == "prone") + { + poseOffset = (0,0,35); + } + else + { + assertEX(0, "init::canShootEnemyFromPose "+self.a.pose); + poseOffset = (0,0,0); + } + break; + case "prone": + if (self.a.pose == "stand") + { + poseOffset = (0,0,-55); + } + else if (self.a.pose == "crouch") + { + poseOffset = (0,0,-35); + } + else if (self.a.pose == "prone") + { + poseOffset = (0,0,0); + } + else + { + assertEX(0, "init::canShootEnemyFromPose "+self.a.pose); + poseOffset = (0,0,0); + } + break; + default: + assertEX(0, "init::canShootEnemyFromPose - bad supplied pose: "+pose); + poseOffset = (0,0,0); + break; + } + if (IsDefined(offset)) + { + poseOffset = poseOffset + self LocalToWorldCoords(offset) - self.origin; + } + return canShootEnemyFrom( poseOffset, undefined, useSightCheck ); +} +canShootEnemy(posOverrideEntity, useSightCheck) +{ + return canShootEnemyFrom( (0,0,0), posOverrideEntity, useSightCheck ); +} +canShootEnemyPos( posOverrideOrigin ) +{ + return canShootEnemyFrom( (0,0,0), undefined, true, posOverrideOrigin ); +} +canShootEnemyFrom( offset, posOverrideEntity, useSightCheck, posOverrideOrigin ) +{ + if ( !isValidEnemy( self.enemy ) && !isValidEnemy( posOverrideEntity ) ) + { + return false; + } + if ( !holdingWeapon() ) + { + return false; + } + if (IsDefined(posOverrideEntity)) + { + if (IsSentient(posOverrideEntity)) + { + eye = posOverrideEntity GetEye(); + chest = eye + ( 0,0,-20); + } + else + { + eye = posOverrideEntity.origin; + chest = eye; + } + } + else if (IsDefined(posOverrideOrigin)) + { + eye = posOverrideOrigin; + chest = eye + ( 0,0,-20); + } + else + { + eye = GetEnemyEyePos(); + chest = eye + ( 0,0,-20); + } + myGunPos = self GetTagOrigin ("tag_flash"); + if (!IsDefined(useSightCheck)) + { + useSightCheck = true; + } + if (useSightCheck) + { + myEyeOffset = ( self GetShootAtPos() - myGunPos ); + canSee = self canshoot( eye, myEyeOffset+offset ); + } + else + { + canSee = true; + } + if (!canSee) + { + return false; + } + canShoot = self canshoot( eye, offset ) || self canshoot( chest, offset ); + return ( canShoot ); +} +GetEnemyEyePos() +{ + if ( isValidEnemy( self.enemy ) ) + { + self.a.lastEnemyPos = self.enemy GetShootAtPos(); + self.a.lastEnemyTime = GetTime(); + return self.a.lastEnemyPos; + } + else if ( IsDefined(self.a.lastEnemyTime) + && IsDefined(self.a.lastEnemyPos) + && (self.a.lastEnemyTime + 3000) < GetTime()) + { + return self.a.lastEnemyPos; + } + else + { + targetPos = self GetShootAtPos(); + targetPos = targetPos + (196*self.lookforward[0], 196*self.lookforward[1], 196*self.lookforward[2]); + return targetPos; + } +} +GetNodeYawToOrigin(pos) +{ + if (IsDefined (self.node)) + { + yaw = self.node.angles[1] - GetYaw(pos); + } + else + { + yaw = self.angles[1] - GetYaw(pos); + } + yaw = AngleClamp180( yaw ); + return yaw; +} +GetNodeYawToEnemy() +{ + pos = undefined; + if ( isValidEnemy( self.enemy ) ) + { + pos = self.enemy.origin; + } + else + { + if (IsDefined (self.node)) + { + forward = AnglesToForward(self.node.angles); + } + else + { + forward = AnglesToForward(self.angles); + } + forward = vector_scale (forward, 150); + pos = self.origin + forward; + } + if (IsDefined (self.node)) + { + yaw = self.node.angles[1] - GetYaw(pos); + } + else + { + yaw = self.angles[1] - GetYaw(pos); + } + yaw = AngleClamp180( yaw ); + return yaw; +} +GetCoverNodeYawToEnemy() +{ + pos = undefined; + if ( isValidEnemy( self.enemy ) ) + { + pos = self.enemy.origin; + } + else + { + forward = AnglesToForward(self.coverNode.angles + self.animarray["angle_step_out"][self.a.cornerMode]); + forward = vector_scale (forward, 150); + pos = self.origin + forward; + } + yaw = self.CoverNode.angles[1] + self.animarray["angle_step_out"][self.a.cornerMode] - GetYaw(pos); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetYawToSpot(spot) +{ + pos = spot; + yaw = self.angles[1] - GetYaw(pos); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetYawToEnemy() +{ + pos = undefined; + if ( isValidEnemy( self.enemy ) ) + { + pos = self.enemy.origin; + } + else + { + forward = AnglesToForward(self.angles); + forward = vector_scale (forward, 150); + pos = self.origin + forward; + } + yaw = self.angles[1] - GetYaw(pos); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetYaw(org) +{ + angles = VectorToAngles(org-self.origin); + return angles[1]; +} +GetPitch(org) +{ + angles = VectorToAngles(org-self.origin); + return angles[0]; +} +GetYaw2d(org) +{ + angles = VectorToAngles((org[0], org[1], 0)-(self.origin[0], self.origin[1], 0)); + return angles[1]; +} +AbsYawToEnemy() +{ + assert( isValidEnemy( self.enemy ) ); + yaw = self.angles[1] - GetYaw(self.enemy.origin); + yaw = AngleClamp180( yaw ); + if (yaw < 0) + { + yaw = -1 * yaw; + } + return yaw; +} +AbsYawToEnemy2d() +{ + assert( isValidEnemy( self.enemy ) ); + yaw = self.angles[1] - GetYaw2d(self.enemy.origin); + yaw = AngleClamp180( yaw ); + if (yaw < 0) + { + yaw = -1 * yaw; + } + return yaw; +} +AbsYawToOrigin(org) +{ + yaw = self.angles[1] - GetYaw(org); + yaw = AngleClamp180( yaw ); + if (yaw < 0) + { + yaw = -1 * yaw; + } + return yaw; +} +AbsYawToAngles(angles) +{ + yaw = self.angles[1] - angles; + yaw = AngleClamp180( yaw ); + if (yaw < 0) + { + yaw = -1 * yaw; + } + return yaw; +} +GetYawFromOrigin(org, start) +{ + angles = VectorToAngles(org-start); + return angles[1]; +} +GetYawToTag(tag, org) +{ + yaw = self GetTagAngles( tag )[1] - GetYawFromOrigin(org, self GetTagOrigin(tag)); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetYawToOrigin(org) +{ + yaw = self.angles[1] - GetYaw(org); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetEyeYawToOrigin(org) +{ + yaw = self GetTagAngles("TAG_EYE")[1] - GetYaw(org); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetCoverNodeYawToOrigin(org) +{ + yaw = self.coverNode.angles[1] + self.animarray["angle_step_out"][self.a.cornerMode] - GetYaw(org); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetPitchToOrigin(org) +{ + pitch = self.angles[0] - GetPitch(org); + pitch = AngleClamp180( pitch ); + return pitch; +} +isStanceAllowedWrapper( stance ) +{ + if ( IsDefined( self.coverNode ) ) + { + return self.coverNode doesNodeAllowStance( stance ); + } + return self IsStanceAllowed( stance ); +} +choosePose(preferredPose) +{ + if ( !IsDefined( preferredPose ) ) + { + preferredPose = self.a.pose; + } + if ( EnemiesWithinStandingRange() ) + { + preferredPose = "stand"; + } + switch (preferredPose) + { + case "stand": + if (self isStanceAllowedWrapper("stand")) + { + resultPose = "stand"; + } + else if (self isStanceAllowedWrapper("crouch")) + { + resultPose = "crouch"; + } + else if (self isStanceAllowedWrapper("prone")) + { + resultPose = "prone"; + } + else + { + println ("No stance allowed! Remaining standing."); + resultPose = "stand"; + } + break; + case "crouch": + if (self isStanceAllowedWrapper("crouch")) + { + resultPose = "crouch"; + } + else if (self isStanceAllowedWrapper("stand")) + { + resultPose = "stand"; + } + else if (self isStanceAllowedWrapper("prone")) + { + resultPose = "prone"; + } + else + { + println ("No stance allowed! Remaining crouched."); + resultPose = "crouch"; + } + break; + case "prone": + if (self isStanceAllowedWrapper("prone")) + { + resultPose = "prone"; + } + else if (self isStanceAllowedWrapper("crouch")) + { + resultPose = "crouch"; + } + else if (self isStanceAllowedWrapper("stand")) + { + resultPose = "stand"; + } + else + { + println ("No stance allowed! Remaining prone."); + resultPose = "prone"; + } + break; + default: + println ("utility::choosePose, called in "+self.a.script+" script: Unhandled anim_pose "+self.a.pose+" - using stand."); + resultPose = "stand"; + break; + } + return resultPose; +} +okToMelee(person) +{ + assert( IsDefined( person ) ); + if (IsDefined(self.a.personImMeleeing)) + { + ImNotMeleeing(self.a.personImMeleeing); + assert(!IsDefined(self.a.personImMeleeing)); + } + if (IsDefined(person.a.personMeleeingMe)) + { + oldAttacker = person.a.personMeleeingMe; + if ( IsDefined(oldAttacker.a.personImMeleeing) && oldAttacker.a.personImMeleeing == person ) + { + return false; + } + println("okToMelee - Shouldn't get to here"); + person.a.personMeleeingMe = undefined; + assert(!IsDefined(self.a.personImMeleeing)); + assert(!IsDefined(person.a.personMeleeingMe)); + return true; + } + assert(!IsDefined(self.a.personImMeleeing)); + assert(!IsDefined(person.a.personMeleeingMe)); + return true; +} +IAmMeleeing(person) +{ + assert(IsDefined(person)); + assert(!IsDefined(person.a.personMeleeingMe)); + assert(!IsDefined(self.a.personImMeleeing)); + person.a.personMeleeingMe = self; + self.a.personImMeleeing = person; +} +ImNotMeleeing(person) +{ + if ( (IsDefined(person)) && (IsDefined(self.a.personImMeleeing)) && (self.a.personImMeleeing==person) ) + { + assert(IsDefined(person.a.personMeleeingMe)); + assert(person.a.personMeleeingMe == self); + } + if (!IsDefined(person)) + { + self.a.personImMeleeing = undefined; + } + else if ( (IsDefined(person.a.personMeleeingMe)) && (person.a.personMeleeingMe==self) ) + { + person.a.personMeleeingMe = undefined; + assert(self.a.personImMeleeing==person); + self.a.personImMeleeing = undefined; + } + assert( !IsDefined(person) || !IsDefined(self.a.personImMeleeing) || (self.a.personImMeleeing!=person) ); + assert( !IsDefined(person) || !IsDefined(person.a.personMeleeingMe) || (person.a.personMeleeingMe!=self) ); +} +WeaponAnims() +{ + weaponModel = getWeaponModel( self.weapon ); + if ( (IsDefined(self.holdingWeapon) && !self.holdingWeapon) || weaponModel=="" ) + { + return "none"; + } + class = weaponClass( self.weapon ); + switch ( class ) + { + case "smg": + if( is_true(level.supportsPistolAnimations) && self holdingWeapon() ) + return "pistol"; + return "rifle"; + case "mg": + case "rifle": + case "pistol": + case "rocketlauncher": + case "spread": + case "gas": + case "grenade": + return class; + default: + return "rifle"; + } +} +GetClaimedNode() +{ + myNode = self.node; + if ( IsDefined(myNode) && (self nearNode(myNode) || (IsDefined( self.coverNode ) && myNode == self.coverNode)) ) + { + return myNode; + } + return undefined; +} +GetNodeType() +{ + myNode = GetClaimedNode(); + if (IsDefined(myNode)) + { + return myNode.type; + } + return "none"; +} +GetNodeDirection() +{ + myNode = GetClaimedNode(); + if (IsDefined(myNode)) + { + return myNode.angles[1]; + } + return self.desiredAngle; +} +GetNodeForward() +{ + myNode = GetClaimedNode(); + if (IsDefined(myNode)) + { + return AnglesToForward ( myNode.angles ); + } + return AnglesToForward( self.angles ); +} +GetNodeOrigin() +{ + myNode = GetClaimedNode(); + if (IsDefined(myNode)) + { + return myNode.origin; + } + return self.origin; +} +safemod(a,b) +{ + result = int(a) % b; + result += b; + return result % b; +} +AngleClamp( angle ) +{ + angleFrac = angle / 360.0; + angle = (angleFrac - floor( angleFrac )) * 360.0; + return angle; +} +QuadrantAnimWeights( yaw ) +{ + forwardWeight = (90 - abs(yaw)) / 90; + leftWeight = (90 - AbsAngleClamp180(abs(yaw-90))) / 90; + result["front"] = 0; + result["right"] = 0; + result["back"] = 0; + result["left"] = 0; + if ( IsDefined( self.alwaysRunForward ) ) + { + assert( self.alwaysRunForward ); + result["front"] = 1; + return result; + } + useLeans = true; + if (forwardWeight > 0) + { + result["front"] = forwardWeight; + if (leftWeight > 0) + { + result["left"] = leftWeight; + } + else + { + result["right"] = -1 * leftWeight; + } + } + else if( useLeans ) + { + result["back"] = -1 * forwardWeight; + if (leftWeight > 0) + { + result["left"] = leftWeight; + } + else + { + result["right"] = -1 * leftWeight; + } + } + else + { + backWeight = -1 * forwardWeight; + if ( leftWeight > backWeight ) + { + result["left"] = 1; + } + else if ( leftWeight < forwardWeight ) + { + result["right"] = 1; + } + else + { + result["back"] = 1; + } + } + return result; +} +getQuadrant(angle) +{ + angle = AngleClamp(angle); + if (angle<45 || angle>315) + { + quadrant = "front"; + } + else if (angle<135) + { + quadrant = "left"; + } + else if (angle<225) + { + quadrant = "back"; + } + else + { + quadrant = "right"; + } + return quadrant; +} +NotifyAfterTime(notifyString, killmestring, time) +{ + self endon("death"); + self endon(killmestring); + wait time; + self notify (notifyString); +} +drawString(stringtodraw) +{ + self endon("killanimscript"); + self endon("enddrawstring"); + for (;;) + { + wait .05; + Print3d ((self GetDebugEye()) + (0,0,8), stringtodraw, (1, 1, 1), 1, 0.2); + } +} +drawStringTime(msg, org, color, timer) +{ + maxtime = timer*20; + for (i=0;i self.a.flamethrowerShootSwitchTimer ) + { + self.a.flamethrowerShootSwitch = true; + self.a.flamethrowerShootSwitchTimer = self.a.lastShootTime + RandomIntRange( self.a.flamethrowerShootTime_min, self.a.flamethrowerShootTime_max ); + self shoot( self.script_accuracy ); + } + else if( self.a.flamethrowerShootSwitch && self.a.lastShootTime > self.a.flamethrowerShootSwitchTimer ) + { + self.a.flamethrowerShootSwitch = false; + flamethrower_stop_shoot(); + self.a.flamethrowerShootSwitchTimer = self.a.lastShootTime + RandomIntRange( self.a.flamethrowerShootDelay_min, self.a.flamethrowerShootDelay_max ); + } +} +flamethrower_stop_shoot( set_switch_timer ) +{ + if( self usingGasWeapon() ) + { + if( IsDefined( set_switch_timer ) ) + { + self.a.flamethrowerShootSwitchTimer = GetTime() + set_switch_timer; + self.a.flamethrowerShootSwitch = false; + } + self notify( "flame stop shoot" ); + self StopShoot(); + } +} +shootPosWrapper( shootPos ) +{ + endpos = bulletSpread( self GetTagOrigin( "tag_flash" ), shootPos, 4 ); + self.a.lastShootTime = GetTime(); + self shoot( 1, endpos ); +} +getAimDelay() +{ + return 0.001; +} +setEnv(env) +{ + if (env == "cold") + { + array_thread(GetAIArray(),::PersonalColdBreath); + array_thread(getspawnerarray(),::PersonalColdBreathSpawner); + } +} +PersonalColdBreath() +{ + tag = "TAG_EYE"; + self endon ("death"); + self notify ("stop personal effect"); + self endon ("stop personal effect"); + for (;;) + { + if (self.a.movement != "run") + { + playfxOnTag ( level._effect["cold_breath"], self, tag ); + wait (2.5 + RandomFloat(3)); + } + else + { + wait (0.5); + } + } +} +PersonalColdBreathSpawner() +{ + self endon ("death"); + self notify ("stop personal effect"); + self endon ("stop personal effect"); + for (;;) + { + self waittill ("spawned", Spawn); + if (maps\_utility::spawn_failed(Spawn)) + { + continue; + } + Spawn thread PersonalColdBreath(); + } +} +isSuppressedWrapper() +{ + if (forcedCover("Show")) + { + return false; + } + if ( forcedCover( "Hide" ) ) + { + return true; + } + if ( IsDefined(self.coverNode) && IsDefined(self.playerAimSuppression) && self.playerAimSuppression ) + { + return true; + } + if (self.suppressionMeter <= self.suppressionThreshold) + { + return false; + } + return self issuppressed(); +} +isPartiallySuppressedWrapper() +{ + if (forcedCover("Show")) + { + return false; + } + if ( IsDefined(self.coverNode) && IsDefined(self.playerAimSuppression) && self.playerAimSuppression ) + { + return true; + } + if ( self.suppressionMeter <= self.suppressionThreshold * 0.25 ) + { + return false; + } + return (self issuppressed()); +} +getNodeOffset(node) +{ + if ( IsDefined( node.offset ) ) + { + return node.offset; + } + cover_left_crouch_offset = (-26, .4, 36); + cover_left_stand_offset = (-32, 7, 63); + cover_right_crouch_offset = (43.5, 11, 36); + cover_right_stand_offset = (36, 8.3, 63); + cover_crouch_offset = (3.5, -12.5, 45); + cover_stand_offset = (-3.7, -22, 63); + cornernode = false; + nodeOffset = (0,0,0); + right = AnglesToRight(node.angles); + forward = AnglesToForward(node.angles); + switch(node.type) + { + case "Cover Left": + case "Cover Left Wide": + if ( node isNodeDontStand() && !node isNodeDontCrouch() ) + { + nodeOffset = calculateNodeOffset( right, forward, cover_left_crouch_offset ); + } + else + { + nodeOffset = calculateNodeOffset( right, forward, cover_left_stand_offset ); + } + break; + case "Cover Right": + case "Cover Right Wide": + if ( node isNodeDontStand() && !node isNodeDontCrouch() ) + { + nodeOffset = calculateNodeOffset( right, forward, cover_right_crouch_offset ); + } + else + { + nodeOffset = calculateNodeOffset( right, forward, cover_right_stand_offset ); + } + break; + case "Cover Stand": + case "Conceal Stand": + case "Turret": + nodeOffset = calculateNodeOffset( right, forward, cover_stand_offset ); + break; + case "Cover Crouch": + case "Cover Crouch Window": + case "Conceal Crouch": + nodeOffset = calculateNodeOffset( right, forward, cover_crouch_offset ); + break; + } + node.offset = nodeOffset; + return node.offset; +} +calculateNodeOffset( right, forward, baseoffset ) +{ + return vector_scale( right, baseoffset[0] ) + vector_scale( forward, baseoffset[1] ) + (0, 0, baseoffset[2]); +} +canSeeEnemy() +{ + if ( !isValidEnemy( self.enemy ) ) + { + return false; + } + if ( (self canSee(self.enemy) && checkPitchVisibility(self geteye(), self.enemy GetShootAtPos()) ) || + (IsDefined(self.cansee_override) && self.cansee_override) ) + { + self.goodShootPosValid = true; + self.goodShootPos = GetEnemyEyePos(); + dontGiveUpOnSuppressionYet(); + return true; + } + return false; +} +canSeeEnemyFromExposed() +{ + if ( !isValidEnemy( self.enemy ) ) + { + self.goodShootPosValid = false; + return false; + } + enemyEye = GetEnemyEyePos(); + if ( !IsDefined( self.node ) ) + { + result = self canSee( self.enemy ); + } + else + { + result = canSeePointFromExposedAtNode( enemyEye, self.node ); + } + if ( result ) + { + self.goodShootPosValid = true; + self.goodShootPos = enemyEye; + dontGiveUpOnSuppressionYet(); + } + else + { + } + return result; +} +canSeePointFromExposedAtNode( point, node ) +{ + if ( node.type == "Cover Left" || node.type == "Cover Right" || node.type == "Cover Left Wide" || node.type == "Cover Right Wide" || node.type == "Cover Pillar" ) + { + if ( !self call_overloaded_func( "animscripts\corner", "canSeePointFromExposedAtCorner", point, node ) ) + { + return false; + } + } + nodeOffset = getNodeOffset( node ); + lookFromPoint = node.origin + nodeOffset; + if( node.type == "Cover Pillar" ) + { + nodeOffsets = []; + if( node isNodeDontStand() ) + { + if( !node IsNodeDontRight() ) + { + nodeOffsets[ nodeOffsets.size ] = (32, -10, 30); + } + if( !node IsNodeDontLeft() ) + { + nodeOffsets[ nodeOffsets.size ] = (-28, -10, 30); + } + } + else + { + if( !node IsNodeDontRight() ) + { + nodeOffsets[ nodeOffsets.size ] = (34, 0.2, 60); + } + if( !node IsNodeDontLeft() ) + { + nodeOffsets[ nodeOffsets.size ] = (-32, 3.7, 60); + } + } + if( nodeOffsets.size > 1 && IsDefined(node.desiredCornerDirection) && node.desiredCornerDirection == "left" ) + { + nodeOffsets = array_swap( nodeOffsets, 0, 1 ); + } + right = AnglesToRight(node.angles); + forward = AnglesToForward(node.angles); + for( i=0; i < nodeOffsets.size; i++ ) + { + nodeOffset = calculateNodeOffset( right, forward, nodeOffsets[i] ); + lookFromPoint = node.origin + nodeOffset; + if( canSeePointFromExposedAtNodeWithOffset(point, node, lookFromPoint) ) + { + if( nodeOffsets[i][0] < 0 ) + { + node.desiredCornerDirection = "left"; + } + else + { + node.desiredCornerDirection = "right"; + } + node.offset = nodeOffset; + return true; + } + } + return false; + } + else if( !canSeePointFromExposedAtNodeWithOffset(point, node, lookFromPoint) ) + { + return false; + } + return true; +} +canSeePointFromExposedAtNodeWithOffset( point, node, lookFromPoint ) +{ + if ( !checkPitchVisibility( lookFromPoint, point, node ) ) + { + return false; + } + if ( !sightTracePassed( lookFromPoint, point, false, undefined ) ) + { + if ( node.type == "Cover Crouch" || node.type == "Conceal Crouch" ) + { + lookFromPoint = (0,0,64) + node.origin; + return sightTracePassed( lookFromPoint, point, false, undefined ); + } + return false; + } + return true; +} +checkPitchVisibility( fromPoint, toPoint, atNode ) +{ + pitch = AngleClamp180( VectorToAngles( toPoint - fromPoint )[0] ); + if ( abs( pitch ) > 45 ) + { + if ( IsDefined( atNode ) && atNode.type != "Cover Crouch" && atNode.type != "Conceal Crouch" ) + { + return false; + } + if ( pitch > 45 || pitch < anim.coverCrouchLeanPitch - 45 ) + { + dist = DistanceSquared( fromPoint, toPoint ); + if( pitch < 75 && dist < 64*64 ) + { + return true; + } + return false; + } + } + return true; +} +dontGiveUpOnSuppressionYet() +{ + self.a.shouldResetGiveUpOnSuppressionTimer = true; +} +updateGiveUpOnSuppressionTimer() +{ + if ( !IsDefined( self.a.shouldResetGiveUpOnSuppressionTimer ) ) + { + self.a.shouldResetGiveUpOnSuppressionTimer = true; + } + if ( self.a.shouldResetGiveUpOnSuppressionTimer ) + { + self.a.giveUpOnSuppressionTime = GetTime() + randomintrange( 15000, 30000 ); + self.a.shouldResetGiveUpOnSuppressionTimer = false; + } +} +aiSuppressAI() +{ + if ( !self canAttackEnemyNode() ) + { + return false; + } + shootPos = undefined; + if ( IsDefined( self.enemy.node ) ) + { + nodeOffset = getNodeOffset(self.enemy.node); + shootPos = self.enemy.node.origin + nodeOffset; + } + else + { + shootPos = self.enemy GetShootAtPos(); + } + if ( !self canShoot( shootPos ) ) + { + return false; + } + if( self.a.script == "combat" ) + { + if( !sighttracepassed( self geteye(), self GetTagOrigin( "tag_flash" ), false, undefined ) ) + { + return false; + } + } + self.goodShootPosValid = true; + self.goodShootPos = shootPos; + return true; +} +canSuppressEnemyFromExposed() +{ + if ( !hasSuppressableEnemy() ) + { + self.goodShootPosValid = false; + return false; + } + if ( !IsPlayer(self.enemy) ) + { + return aiSuppressAI(); + } + if ( IsDefined(self.node) ) + { + if ( self.node.type == "Cover Left" || self.node.type == "Cover Right" || self.node.type == "Cover Left Wide" || self.node.type == "Cover Right Wide" ) + { + if ( !self call_overloaded_func( "animscripts\corner", "canSeePointFromExposedAtCorner", self GetEnemyEyePos(), self.node ) ) + { + return false; + } + } + nodeOffset = getNodeOffset(self.node); + startOffset = self.node.origin + nodeOffset; + } + else + { + startOffset = self GetTagOrigin ("tag_flash"); + } + if ( !checkPitchVisibility( startOffset, self.lastEnemySightPos ) ) + { + return false; + } + return findGoodSuppressSpot(startOffset); +} +canSuppressEnemy() +{ + if ( !hasSuppressableEnemy() ) + { + self.goodShootPosValid = false; + return false; + } + hasTagFlash = self GetTagOrigin ("tag_flash"); + if( !IsDefined( hasTagFlash ) ) + return false; + if ( !IsPlayer(self.enemy) ) + { + return aiSuppressAI(); + } + startOffset = self GetTagOrigin ("tag_flash"); + if ( !checkPitchVisibility( startOffset, self.lastEnemySightPos ) ) + { + return false; + } + return findGoodSuppressSpot(startOffset); +} +hasSuppressableEnemy() +{ + if ( !isValidEnemy( self.enemy ) ) + { + return false; + } + if ( !IsDefined(self.lastEnemySightPos) ) + { + return false; + } + updateGiveUpOnSuppressionTimer(); + if ( GetTime() > self.a.giveUpOnSuppressionTime ) + { + return false; + } + if ( !needRecalculateSuppressSpot() ) + { + return self.goodShootPosValid; + } + return true; +} +canSeeAndShootPoint( point ) +{ + if ( !sightTracePassed( self GetShootAtPos(), point, false, undefined ) ) + { + return false; + } + if ( self.a.weaponPos["right"] == "none" ) + { + return false; + } + gunpoint = self GetTagOrigin ("tag_flash"); + return sightTracePassed( gunpoint, point, false, undefined ); +} +needRecalculateSuppressSpot() +{ + if ( self.goodShootPosValid && !self canSeeAndShootPoint( self.goodShootPos ) ) + { + return true; + } + return ( + !IsDefined(self.lastEnemySightPosOld) || + self.lastEnemySightPosOld != self.lastEnemySightPos || + DistanceSquared( self.lastEnemySightPosSelfOrigin, self.origin ) > 1024 + ); +} +findGoodSuppressSpot(startOffset) +{ + if ( !needRecalculateSuppressSpot() ) + { + return self.goodShootPosValid; + } + if ( !sightTracePassed(self GetShootAtPos(), startOffset, false, undefined) ) + { + self.goodShootPosValid = false; + return false; + } + self.lastEnemySightPosSelfOrigin = self.origin; + self.lastEnemySightPosOld = self.lastEnemySightPos; + currentEnemyPos = GetEnemyEyePos(); + trace = bullettrace(self.lastEnemySightPos, currentEnemyPos, false, undefined); + startTracesAt = trace["position"]; + percievedMovementVector = self.lastEnemySightPos - startTracesAt; + lookVector = VectorNormalize( self.lastEnemySightPos - startOffset ); + percievedMovementVector = percievedMovementVector - vector_scale( lookVector, vectorDot( percievedMovementVector, lookVector ) ); + idealTraceInterval = 20.0; + numTraces = int( Length( percievedMovementVector ) / idealTraceInterval + 0.5 ); + if ( numTraces < 1 ) + { + numTraces = 1; + } + if ( numTraces > 20 ) + { + numTraces = 20; + } + vectorDif = self.lastEnemySightPos - startTracesAt; + vectorDif = (vectorDif[0]/numTraces, vectorDif[1]/numTraces, vectorDif[2]/numTraces); + numTraces++; + traceTo = startTracesAt; + self.goodShootPosValid = false; + goodTraces = 0; + neededGoodTraces = 2; + for ( i = 0; i < numTraces + neededGoodTraces; i++ ) + { + tracePassed = sightTracePassed(startOffset, traceTo, false, undefined); + thisTraceTo = traceTo; + if ( i == numTraces - 1 ) + { + vectorDif = vectorDif - vector_scale( lookVector, vectorDot( vectorDif, lookVector ) ); + } + traceTo += vectorDif; + if (tracePassed) + { + goodTraces++; + self.goodShootPosValid = true; + self.goodShootPos = thisTraceTo; + if ( i > 0 && goodTraces < neededGoodTraces && i < numTraces + neededGoodTraces - 1 ) + { + continue; + } + return true; + } + else + { + goodTraces = 0; + } + } + return self.goodShootPosValid; +} +anim_array(animArray, animWeights) +{ + total_anims = animArray.size; + idleanim = RandomInt(total_anims); + assert (total_anims); + assert (animArray.size == animWeights.size); + if (total_anims == 1) + { + return animArray[0]; + } + weights = 0; + total_weight = 0; + for (i = 0; i < total_anims; i++) + { + total_weight += animWeights[i]; + } + anim_play = RandomFloat(total_weight); + current_weight = 0; + for (i = 0; i < total_anims; i++) + { + current_weight += animWeights[i]; + if (anim_play >= current_weight) + { + continue; + } + idleanim = i; + break; + } + return animArray[idleanim]; +} +forcedCover(msg) +{ + return IsDefined(self.a.forced_cover) && (self.a.forced_cover == msg); +} +print3dtime(timer, org, msg, color, alpha, scale) +{ + newtime = timer / 0.05; + for (i=0;i 0); +} +scriptChange() +{ + self.a.current_script = "none"; + self notify (anim.scriptChange); +} +getGrenadeModel() +{ + return getWeaponModel(self.grenadeweapon); +} +canThrowGrenade() +{ + if (!self.grenadeAmmo) + { + return false; + } + if (self.script_forceGrenade) + { + return true; + } + return (IsPlayer(self.enemy)); +} +usingBoltActionWeapon() +{ + if (!IsDefined (self.weapon) || self.weapon == "none" || self usingShotgun() ) + { + return false; + } + return ( weaponIsBoltAction( self.weapon ) ); +} +usingGasWeapon() +{ + return ( weaponIsGasWeapon( self.weapon ) ); +} +metalHat() +{ + if (!IsDefined (self.hatmodel)) + { + return false; + } + return (IsDefined(anim.metalHat[self.model])); +} +setFootstepEffect(name, fx) +{ + assertEx(IsDefined(name), "Need to define the footstep surface type."); + assertEx(IsDefined(fx), "Need to define the mud footstep effect."); + if (!IsDefined(anim.optionalStepEffects)) + { + anim.optionalStepEffects = []; + } + anim.optionalStepEffects[anim.optionalStepEffects.size] = name; + level._effect["step_" + name] = fx; + anim.optionalStepEffectFunction = animscripts\shared::playFootStepEffect; +} +persistentDebugLine(start, end) +{ + self endon ("death"); + level notify ("newdebugline"); + level endon ("newdebugline"); + for (;;) + { + line (start,end, (0.3,1,0), 1); + wait (0.05); + } +} +EnterProneWrapper(timer) +{ + thread enterProneWrapperProc(timer); +} +enterProneWrapperProc(timer) +{ + self endon ("death"); + self notify ("anim_prone_change"); + self endon ("anim_prone_change"); + self EnterProne(timer); + self waittill ("killanimscript"); + if (self.a.pose != "prone") + { + self.a.pose = "prone"; + } +} +ExitProneWrapper(timer) +{ + thread ExitProneWrapperProc(timer); +} +ExitProneWrapperProc(timer) +{ + self endon ("death"); + self notify ("anim_prone_change"); + self endon ("anim_prone_change"); + self ExitProne(timer); + self waittill ("killanimscript"); + if (self.a.pose == "prone") + { + self.a.pose = "crouch"; + } +} +canBlindfire() +{ + if ( self.a.atConcealmentNode ) + { + return false; + } + if ( !animscripts\weaponList::usingAutomaticWeapon() && !usingPistol() ) + { + return false; + } + if ( weaponClass( self.weapon ) == "mg" ) + { + return false; + } + if (IsDefined(self.disable_blindfire) && self.disable_blindfire == true) + { + return false; + } + return true; +} +canSwitchSides() +{ + if ( !self.a.atPillarNode ) + { + return false; + } + if( GetTime() < self.a.nextAllowedSwitchSidesTime ) + { + return false; + } + if( self usingPistol() ) + { + return false; + } + return true; +} +canHitSuppressSpot() +{ + if (!hasEnemySightPos()) + { + return false; + } + myGunPos = self GetTagOrigin ("tag_flash"); + return (sightTracePassed(myGunPos, getEnemySightPos(), false, undefined)); +} +isNodeDontStand() +{ + return (self has_spawnflag(level.SPAWNFLAG_PATH_DONT_STAND)); +} +isNodeDontCrouch() +{ + return (self has_spawnflag(level.SPAWNFLAG_PATH_DONT_CROUCH)); +} +isNodeDontProne() +{ + return (self has_spawnflag(level.SPAWNFLAG_PATH_DONT_PRONE)); +} +doesNodeAllowStance( stance ) +{ + if ( stance == "stand" ) + { + return !self isNodeDontStand(); + } + else if ( stance == "crouch" ) + { + return !self isNodeDontCrouch(); + } + else + { + assert( stance == "prone" ); + return !self isNodeDontProne(); + } +} +isNodeDontLeft() +{ + return (self has_spawnflag(level.SPAWNFLAG_PATH_DONT_LEFT)); +} +isNodeDontRight() +{ + return (self has_spawnflag(level.SPAWNFLAG_PATH_DONT_RIGHT)); +} +getAIPrimaryWeapon() +{ + return self.primaryweapon; +} +getAISecondaryWeapon() +{ + return self.secondaryweapon; +} +getAISidearmWeapon() +{ + return self.sidearm; +} +getAICurrentWeapon() +{ + return self.weapon; +} +usingSecondary() +{ + return ( self.weapon == self.secondaryweapon ); +} +usingSidearm() +{ + return ( self.weapon == self.sidearm ); +} +getAICurrentWeaponSlot() +{ + if ( self.weapon == self.primaryweapon ) + { + return "primary"; + } + else if ( self.weapon == self.secondaryweapon ) + { + return "secondary"; + } + else if ( self.weapon == self.sidearm ) + { + return "sidearm"; + } + else + { + assertMsg( "self.weapon does not match any known slot" ); + } +} +AIHasWeapon( weapon ) +{ + if ( IsDefined(weapon) && weapon != "" && IsDefined( self.weaponInfo[weapon] ) ) + { + return true; + } + return false; +} +AIHasPrimaryWeapon() +{ + return ( self.primaryweapon != "" && self.primaryweapon != "none" ); +} +AIHasSecondaryWeapon() +{ + return ( self.secondaryweapon != "" && self.secondaryweapon != "none" ); +} +AIHasSidearm() +{ + return ( self.sidearm != "" && self.sidearm != "none" ); +} +AIHasOnlyPistol() +{ + return ( self.primaryweapon == self.weapon && usingPistol() ); +} +getAnimEndPos( theanim ) +{ + moveDelta = GetMoveDelta( theanim, 0, 1 ); + return self localToWorldCoords( moveDelta ); +} +isValidEnemy( enemy ) +{ + if ( !IsDefined( enemy ) ) + { + return false; + } + return true; +} +damageLocationIsAny( a, b, c, d, e, f, g, h, i, j, k, ovr ) +{ + if (!IsDefined(self.damageLocation)) + { + return false; + } + if ( !IsDefined( a ) ) return false; if ( self.damageLocation == a ) return true; + if ( !IsDefined( b ) ) return false; if ( self.damageLocation == b ) return true; + if ( !IsDefined( c ) ) return false; if ( self.damageLocation == c ) return true; + if ( !IsDefined( d ) ) return false; if ( self.damageLocation == d ) return true; + if ( !IsDefined( e ) ) return false; if ( self.damageLocation == e ) return true; + if ( !IsDefined( f ) ) return false; if ( self.damageLocation == f ) return true; + if ( !IsDefined( g ) ) return false; if ( self.damageLocation == g ) return true; + if ( !IsDefined( h ) ) return false; if ( self.damageLocation == h ) return true; + if ( !IsDefined( i ) ) return false; if ( self.damageLocation == i ) return true; + if ( !IsDefined( j ) ) return false; if ( self.damageLocation == j ) return true; + if ( !IsDefined( k ) ) return false; if ( self.damageLocation == k ) return true; + AssertEx( !IsDefined(ovr), "Too many parameters" ); + return false; +} +usingRifle() +{ + return weaponClass( self.weapon ) == "rifle"; +} +usingShotgun() +{ + return weaponClass( self.weapon ) == "spread"; +} +usingRocketLauncher() +{ + return weaponClass( self.weapon ) == "rocketlauncher"; +} +usingGrenadeLauncher() +{ + return weaponClass( self.weapon ) == "grenade"; +} +usingPistol() +{ + return (self WeaponAnims()) == "pistol"; +} +ragdollDeath( moveAnim ) +{ + self endon ( "killanimscript" ); + lastOrg = self.origin; + moveVec = (0,0,0); + for ( ;; ) + { + wait ( 0.05 ); + force = distance( self.origin, lastOrg ); + lastOrg = self.origin; + if ( self.health == 1 ) + { + self.a.nodeath = true; + self startRagdoll(); + self ClearAnim( moveAnim, 0.1 ); + wait ( 0.05 ); + physicsExplosionSphere( lastOrg, 600, 0, force * 0.1 ); + self notify ( "killanimscript" ); + return; + } + } +} +isCQBWalking() +{ + return IsDefined( self.cqbwalking ) && self.cqbwalking && !usingPistol(); +} +squared( value ) +{ + return value * value; +} +randomizeIdleSet() +{ + idleAnimArray = animArray("idle", "stop"); + self.a.idleSet = RandomInt( idleAnimArray.size ); +} +weapon_spread() +{ + return weaponclass( self.weapon ) == "spread"; +} +getRandomIntFromSeed( intSeed, intMax ) +{ + assert( intMax > 0 ); + index = intSeed % anim.randomIntTableSize; + return anim.randomIntTable[ index ] % intMax; +} +is_banzai() +{ + return IsDefined( self.banzai ) && self.banzai; +} +is_rusher() +{ + return IsDefined( self.rusher ) && self.rusher; +} +is_heavy_machine_gun() +{ + return IsDefined( self.heavy_machine_gunner ) && self.heavy_machine_gunner; +} +is_zombie() +{ + if (IsDefined(self.is_zombie) && self.is_zombie) + { + return true; + } + return false; +} +is_civilian() +{ + if (IsDefined(self.is_civilian) && self.is_civilian) + { + return true; + } + return false; +} +is_zombie_gibbed() +{ + return ( self is_zombie() && self.gibbed ); +} +set_zombie_gibbed() +{ + if ( self is_zombie() ) + { + self.gibbed = true; + } +} +is_skeleton(skeleton) +{ + if ((skeleton == "base") && IsSubStr(get_skeleton(), "scaled")) + { + return true; + } + return (get_skeleton() == skeleton); +} +get_skeleton() +{ + if (IsDefined(self.skeleton)) + { + return self.skeleton; + } + else + { + return "base"; + } +} +isBalconyNode(node) +{ + return ( ( IsDefined(anim.balcony_node_types[node.type]) ) + && ( node has_spawnflag( level.SPAWNFLAG_PATH_BALCONY ) || node has_spawnflag( level.SPAWNFLAG_PATH_BALCONY_NORAILING ) ) + ); +} +isBalconyNodeNoRailing(node) +{ + return ( ( isBalconyNode(node) ) + && node has_spawnflag( level.SPAWNFLAG_PATH_BALCONY_NORAILING ) + ); +} +do_ragdoll_death() +{ + AssertEx(!is_true(self.magic_bullet_shield), "Cannot ragdoll death on guy with magic bullet shield."); + self Unlink(); + self StartRagdoll(); + self call_overloaded_func( "animscripts\death", "PlayDeathSound" ); + if (IsAI(self)) + { + self.a.doingRagdollDeath = true; + } + wait(0.1); + if( IsAlive(self) ) + { + if (IsAI(self)) + { + self.a.nodeath = true; + self.a.doingRagdollDeath = true; + self animscripts\shared::DropAllAIWeapons(); + } + self BloodImpact( "none" ); + self.allowdeath = true; + self DoDamage( self.health + 100, self.origin, self.attacker ); + } +} +LookingAtEntity() +{ + return self.looking_at_entity; +} +SetLookAtEntity(ent) +{ + self LookAtEntity(ent); + self.looking_at_entity = true; +} +StopLookingAtEntity() +{ + if(! (IsDefined(self.lookat_set_in_anim) && self.lookat_set_in_anim) ) + { + self LookAtEntity(); + } + self.looking_at_entity = false; +} +idleLookatBehaviorTidyup() +{ + self waittill_either("killanimscript", "newLookAtBehavior" ); + if(IsDefined(self)) + { + self StopLookingAtEntity(); + } +} +IsOkToLookAtEntity() +{ + if(IsDefined(level._dont_look_at_player) && level._dont_look_at_player) + { + return false; + } + if(IsDefined(self.lookat_set_in_anim) && self.lookat_set_in_anim) + { + return false; + } + if(IsDefined(self.coverNode) && IsDefined(self.coverNode.script_dont_look)) + { + return false; + } + if(IsDefined(self.coverNode) && IsDefined(self.a.script) && (self.a.script == "cover_right" || self.a.script == "cover_left") && self.a.pose == "crouch") + { + return false; + } + return true; +} +entityInFront(origin) +{ + forward = AnglesToForward(self.angles); + dot = VectorDot(forward, VectorNormalize(origin - self.origin)); + return(dot > 0.3); +} +idleLookatBehavior(dist_thresh, dot_check) +{ + self notify( "newLookAtBehavior" ); + self endon( "newLookAtBehavior" ); + if(self.team == "axis") + { + return; + } + self endon("killanimscript"); + self thread idleLookatBehaviorTidyup(); + dist_thresh *= dist_thresh; + looking = false; + flag_wait("all_players_connected"); + wait(RandomFloatRange(0.05, 0.1)); + while(1) + { + if(self animscripts\utility::IsInCombat() || !IsOkToLookAtEntity()) + { + self StopLookingAtEntity(); + } + dot_check_passed = true; + player = get_players()[0]; + if(IsDefined(dot_check) && dot_check && !self entityInFront(player.origin)) + { + dot_check_passed = false; + } + player_dist = DistanceSquared(self.origin, player.origin); + if(((player_dist > dist_thresh) || (!dot_check_passed)) && looking) + { + self StopLookingAtEntity(); + looking = false; + } + else if((player_dist < dist_thresh) && !looking && dot_check_passed) + { + self SetLookAtEntity(player); + looking = true; + } + wait(1.0); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/walk.gsc b/BO1/PC/ZM/animscripts/walk.gsc new file mode 100644 index 0000000..babe918 Binary files /dev/null and b/BO1/PC/ZM/animscripts/walk.gsc differ diff --git a/BO1/PC/ZM/animscripts/weaponlist.gsc b/BO1/PC/ZM/animscripts/weaponlist.gsc new file mode 100644 index 0000000..b867524 Binary files /dev/null and b/BO1/PC/ZM/animscripts/weaponlist.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_combat.gsc b/BO1/PC/ZM/animscripts/zombie_combat.gsc new file mode 100644 index 0000000..270af17 Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_combat.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_death.gsc b/BO1/PC/ZM/animscripts/zombie_death.gsc new file mode 100644 index 0000000..1920f80 --- /dev/null +++ b/BO1/PC/ZM/animscripts/zombie_death.gsc @@ -0,0 +1,1324 @@ +#include common_scripts\utility; +#include animscripts\zombie_utility; +#using_animtree( "generic_human" ); +main() +{ + self trackScriptState( "Death Main", "code" ); + self endon( "killanimscript" ); + self stopsounds(); + if( IsDefined( self.deathFunction ) ) + { + successful_death = self[[self.deathFunction]](); + if( !IsDefined( successful_death ) || successful_death ) + { + return; + } + } + if( self.a.nodeath == true ) + { + wait 0.1; + return; + } + changeTime = 0.3; + self ClearAnim( %scripted_look_straight, changeTime ); + self ClearAnim( %scripted_talking, changeTime ); + animscripts\zombie_utility::initialize( "zombie_death" ); + self notify( "never look at anything again" ); + removeSelfFrom_SquadLastSeenEnemyPos( self.origin ); + if( IsDefined( self.deathanim ) ) + { + self thread do_gib(); + self SetFlaggedAnimKnobAll( "deathanim", self.deathanim, %root, 1, .05, 1 ); + if( !animHasNotetrack( self.deathanim, "start_ragdoll" ) ) + { + self thread waitForRagdoll( getanimlength( self.deathanim ) * 0.35 ); + } + self thread death_anim_short_circuit(); + if ( isDefined( self.skip_death_notetracks ) && self.skip_death_notetracks ) + { + self waittillmatch( "deathanim", "end" ); + } + else + { + self animscripts\zombie_shared::DoNoteTracks( "deathanim", self.handle_death_notetracks ); + } + if( IsDefined( self.deathanimloop ) ) + { + self SetFlaggedAnimKnobAll( "deathanim", self.deathanimloop, %root, 1, .05, 1 ); + for( ;; ) + { + self animscripts\zombie_shared::DoNoteTracks( "deathanim", self.handle_death_notetracks ); + } + } + if( IsDefined( self.deathanimscript ) ) + { + self[[self.deathanimscript]](); + } + return; + } + explosiveDamage = self animscripts\zombie_pain::wasDamagedByExplosive(); + if( self.damageLocation == "helmet" ) + { + self helmetPop(); + } + else if( explosiveDamage && RandomInt( 2 ) == 0 ) + { + self helmetPop(); + } + self ClearAnim( %root, 0.3 ); + if( !damageLocationIsAny( "head", "helmet" ) ) + { + if( !IsDefined( self.dieQuietly ) || !self.dieQuietly ) + { + PlayDeathSound(); + } + } + if( damageLocationIsAny( "head", "helmet" ) ) + { + if( self.damageLocation == "helmet" && IsDefined( self.hatModel ) && + ModelHasPhysPreset( self.hatModel ) && + issubstr(self.hatmodel, "helm") ) + { + self PlaySound( "bullet_impact_headshot_helmet" ); + } + else + { + self PlaySound( "bullet_impact_headshot" ); + } + } + if( explosiveDamage && play_explosion_death() ) + { + return; + } + if( special_death() ) + { + return; + } + if( play_flame_death_anim() ) + { + return; + } + if( play_bulletgibbed_death_anim() ) + { + return; + } + if( GetDvarFloat( #"kill_slowmo_time" ) > 0 ) + { + if( damageLocationIsAny( "head", "helmet" ) ) + { + self thread goSlowMo(); + } + } + if( play_bayonet_death_anim() ) + { + return; + } + if( play_hit_by_vehicle_anim() ) + { + return; + } + deathAnim = get_death_anim(); + play_death_anim( deathAnim ); +} +play_hit_by_vehicle_anim() +{ + if( self.damagemod == "MOD_CRUSH" ) + { + self thread do_gib(); + self launch_ragdoll_based_on_damage_type(); + wait 0.5; + return true; + } + return false; +} +goSlowMo() +{ + if( GetPlayers().size > 1 ) + { + return; + } + if( !IsPlayer(self.attacker) ) + { + return; + } + if( self.team == self.attacker.team ) + { + return; + } + SetTimeScale(0.2); + time = GetDvarFloat( #"kill_slowmo_time" ); + wait(time); + SetTimeScale(1); +} +waitForRagdoll( time ) +{ + wait( time ); + do_ragdoll = true; + if( IsDefined( self.nodeathragdoll ) && self.nodeathragdoll ) + { + do_ragdoll = false; + } + if( IsDefined( self ) && do_ragdoll ) + { + self StartRagDoll(); + } +} +play_death_anim( deathAnim ) +{ + self thread death_anim_short_circuit(); + if( animHasNoteTrack( deathAnim, "death_neckgrab_spurt" ) && is_mature() ) + { + PlayFXOnTag( anim._effect["death_neckgrab_spurt"], self, "j_neck" ); + } + if( IsDefined( self.skipDeathAnim ) && self.skipDeathAnim ) + { + self thread do_gib(); + self launch_ragdoll_based_on_damage_type(); + wait 0.5; + return; + } + else + { + if( IsDefined(self.animTranslationScale) && self.animTranslationScale > 0 ) + { + self setFlaggedAnimKnobAllRestart( "deathanim", deathAnim, %body, 1, .1, 1.0 / self.animTranslationScale ); + } + else + { + self setFlaggedAnimKnobAllRestart( "deathanim", deathAnim, %body, 1, .1 ); + } + } + self thread do_gib(); + if( !animHasNotetrack( deathanim, "start_ragdoll" ) ) + { + self thread waitForRagdoll( getanimlength( deathanim ) * 0.35 ); + } + self animscripts\zombie_shared::DoNoteTracks( "deathanim" ); +} +special_death() +{ + if( self.a.special == "none" ) + { + return false; + } + switch( self.a.special ) + { + case "cover_right": + if( self.a.pose == "stand" ) + { + deathArray = []; + deathArray[0] = %corner_standr_deathA; + deathArray[1] = %corner_standr_deathB; + DoDeathFromArray( deathArray ); + } + else + { + assert( self.a.pose == "crouch" ); + return false; + } + return true; + case "cover_left": + if( self.a.pose == "stand" ) + { + deathArray = []; + deathArray[0] = %corner_standl_deathA; + deathArray[1] = %corner_standl_deathB; + DoDeathFromArray( deathArray ); + } + else + { + assert( self.a.pose == "crouch" ); + return false; + } + return true; + case "cover_stand": + deathArray = []; + deathArray[0] = %coverstand_death_left; + deathArray[1] = %coverstand_death_right; + DoDeathFromArray( deathArray ); + return true; + case "cover_crouch": + deathArray = []; + if( damageLocationIsAny( "head", "neck" ) &&( self.damageyaw > 135 || self.damageyaw <= -45 ) ) + { + deathArray[deathArray.size] = %covercrouch_death_1; + } + if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = %covercrouch_death_3; + } + deathArray[deathArray.size] = %covercrouch_death_2; + DoDeathFromArray( deathArray ); + return true; + case "saw": + if( self.a.pose == "stand" ) + { + DoDeathFromArray( array( %saw_gunner_death ) ); + } + else + { + DoDeathFromArray( array( %saw_gunner_lowwall_death ) ); + } + return true; + } + return false; +} +DoDeathFromArray( deathArray ) +{ + deathAnim = deathArray[RandomInt( deathArray.size )]; + play_death_anim( deathAnim ); + if( IsDefined( self.deathanimscript ) ) + { + self[[self.deathanimscript]](); + } +} +PlayDeathSound() +{ + self animscripts\face::SayGenericDialogue( "death" ); +} +helmetPop() +{ + if( !IsDefined( self ) ) + { + return; + } + if( !IsDefined( self.hatModel ) || !ModelHasPhysPreset( self.hatModel ) ) + { + return; + } + partName = GetPartName( self.hatModel, 0 ); + origin = self GetTagOrigin( partName ); + angles = self GetTagAngles( partName ); + helmetLaunch( self.hatModel, origin, angles, self.damageDir ); + hatModel = self.hatModel; + self.hatModel = undefined; + self.helmetPopper = self.attacker; + wait 0.05; + if( !IsDefined( self ) ) + { + return; + } + self detach( hatModel, "" ); +} +helmetLaunch( model, origin, angles, damageDir ) +{ + launchForce = damageDir; + launchForce = launchForce * RandomFloatRange( 1100, 4000 ); + forcex = launchForce[0]; + forcey = launchForce[1]; + forcez = RandomFloatRange( 800, 3000 ); + contactPoint = self.origin +( RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ) ) * 5; + CreateDynEntAndLaunch( model, origin, angles, contactPoint, ( forcex, forcey, forcez ) ); +} +removeSelfFrom_SquadLastSeenEnemyPos( org ) +{ + for( i = 0; i < anim.squadIndex.size; i++ ) + { + anim.squadIndex[i] clearSightPosNear( org ); + } +} +clearSightPosNear( org ) +{ + if( !IsDefined( self.sightPos ) ) + { + return; + } + if( distance( org, self.sightPos ) < 80 ) + { + self.sightPos = undefined; + self.sightTime = GetTime(); + } +} +shouldDoRunningForwardDeath() +{ + if( self.a.movement != "run" ) + { + return false; + } + if( self getMotionAngle() > 60 || self getMotionAngle() < -60 ) + { + return false; + } + if( ( self.damageyaw >= 135 ) ||( self.damageyaw <= -135 ) ) + { + return true; + } + if( ( self.damageyaw >= -45 ) &&( self.damageyaw <= 45 ) ) + { + return true; + } + return false; +} +get_death_anim() +{ + if( self.a.pose == "stand" ) + { + if( shouldDoRunningForwardDeath() ) + { + return getRunningForwardDeathAnim(); + } + return getStandDeathAnim(); + } + else if( self.a.pose == "crouch" ) + { + return getCrouchDeathAnim(); + } +} +getRunningForwardDeathAnim() +{ + deathArray = []; + deathArray[deathArray.size] = tryAddDeathAnim( %run_death_facedown ); + deathArray[deathArray.size] = tryAddDeathAnim( %run_death_roll ); + if( ( self.damageyaw >= 135 ) ||( self.damageyaw <= -135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %run_death_fallonback ); + deathArray[deathArray.size] = tryAddDeathAnim( %run_death_fallonback_02 ); + } + else if( ( self.damageyaw >= -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %run_death_roll ); + deathArray[deathArray.size] = tryAddDeathAnim( %run_death_facedown ); + } + deathArray = tempClean( deathArray ); + deathArray = animscripts\zombie_pain::removeBlockedAnims( deathArray ); + if( !deathArray.size ) + { + return getStandDeathAnim(); + } + return deathArray[RandomInt( deathArray.size )]; +} +tempClean( array ) +{ + newArray = []; + for( index = 0; index < array.size; index++ ) + { + if( !IsDefined( array[index] ) ) + { + continue; + } + newArray[newArray.size] = array[index]; + } + return newArray; +} +getStandDeathAnim() +{ + deathArray = []; + if( RandomInt( 3 ) < 2 ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death ); + } + if( RandomInt( 3 ) < 2 ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_firing_02 ); + } + if( damageLocationIsAny( "torso_lower", "left_leg_upper", "left_leg_lower", "right_leg_lower", "right_leg_lower" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_groin ); + } + if( damageLocationIsAny( "left_leg_upper", "left_leg_lower", "left_foot" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %ai_deadly_wounded_leg_L_hit ); + } + else if( damageLocationIsAny( "right_leg_upper", "right_leg_lower", "right_foot" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %ai_deadly_wounded_leg_R_hit ); + } + else if( damageLocationIsAny( "torso_upper", "torso_lower" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %ai_deadly_wounded_torso_hit ); + } + if( damageLocationIsAny( "head", "neck", "helmet" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_headshot ); + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_headtwist ); + } + if( damageLocationIsAny( "torso_upper", "neck" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_nerve ); + if( self.damageTaken <= 70 ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_neckgrab ); + } + } + if( ( self.damageyaw > 135 ) ||( self.damageyaw <= -135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_02 ); + if( damageLocationIsAny( "torso_upper", "left_arm_upper", "right_arm_upper" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_firing ); + } + if( damageLocationIsAny( "torso_upper", "neck", "head", "helmet" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_falltoknees_02 ); + } + } + else if( ( self.damageyaw > 45 ) &&( self.damageyaw <= 135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_falltoknees_02 ); + } + else if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_falltoknees ); + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_falltoknees_02 ); + } + else + { + if( damageLocationIsAny( "torso_upper", "left_arm_upper", "head" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_twist ); + } + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_death_falltoknees_02 ); + } + assertex( deathArray.size > 0, deathArray.size ); + deathArray = tempClean( deathArray ); + if( deathArray.size == 0 ) + { + deathArray[deathArray.size] = %exposed_death; + } + return deathArray[RandomInt( deathArray.size )]; +} +getCrouchDeathAnim() +{ + deathArray = []; + if( damageLocationIsAny( "head", "neck" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_crouch_death_fetal ); + } + if( damageLocationIsAny( "torso_upper", "torso_lower", "left_arm_upper", "right_arm_upper", "neck" ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_crouch_death_flip ); + } + if( deathArray.size < 2 ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_crouch_death_twist ); + } + if( deathArray.size < 2 ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %exposed_crouch_death_flip ); + } + deathArray = tempClean( deathArray ); + assertex( deathArray.size > 0, deathArray.size ); + return deathArray[RandomInt( deathArray.size )]; +} +tryAddDeathAnim( animName ) +{ + if( !animHasNoteTrack( animName, "fire" ) ) + { + return animName; + } + if( IsDefined( self.dieQuietly ) && self.dieQuietly ) + { + return undefined; + } + return animName; +} +play_explosion_death() +{ + if( self.damageLocation != "none" ) + { + return false; + } + deathArray = []; + if( self.a.movement != "run" ) + { + if( self.mayDoUpwardsDeath && GetTime() > anim.lastUpwardsDeathTime + 6000 ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_UP_v1 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_UP_v2 ); + anim.lastUpwardsDeathTime = GetTime(); + get_gib_ref( "up" ); + } + else + { + if( ( self.damageyaw > 135 ) ||( self.damageyaw <= -135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_B_v1 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_B_v2 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_B_v3 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_B_v4 ); + get_gib_ref( "back" ); + } + else if( ( self.damageyaw > 45 ) &&( self.damageyaw <= 135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_L_v1 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_L_v2 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_L_v3 ); + get_gib_ref( "left" ); + } + else if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_F_v1 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_F_v2 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_F_v3 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_F_v4 ); + get_gib_ref( "forward" ); + } + else + { + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_R_v1 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_R_v2 ); + get_gib_ref( "right" ); + } + } + } + else + { + if( self.mayDoUpwardsDeath && GetTime() > anim.lastUpwardsDeathTime + 2000 ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_UP_v1 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_stand_UP_v2 ); + anim.lastUpwardsDeathTime = GetTime(); + get_gib_ref( "up" ); + } + else + { + if( ( self.damageyaw > 135 ) ||( self.damageyaw <= -135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_run_B_v1 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_run_B_v2 ); + get_gib_ref( "back" ); + } + else if( ( self.damageyaw > 45 ) &&( self.damageyaw <= 135 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_run_L_v1 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_run_L_v2 ); + get_gib_ref( "left" ); + } + else if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_run_F_v1 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_run_F_v2 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_run_F_v3 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_run_F_v4 ); + get_gib_ref( "forward" ); + } + else + { + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_run_R_v1 ); + deathArray[deathArray.size] = tryAddDeathAnim( %death_explosion_run_R_v2 ); + get_gib_ref( "right" ); + } + } + } + deathAnim = deathArray[RandomInt( deathArray.size )]; + if( GetDvar( #"scr_expDeathMayMoveCheck" ) == "on" ) + { + localDeltaVector = getMoveDelta( deathAnim, 0, 1 ); + endPoint = self localToWorldCoords( localDeltaVector ); + if( !self mayMoveToPoint( endPoint, false ) ) + { + return false; + } + } + self AnimMode( "nogravity" ); + play_death_anim( deathAnim ); + return true; +} +play_flame_death_anim() +{ + if(self.damagemod =="MOD_MELEE" ) + { + return false; + } + if ( !is_mature() ) + { + return false; + } + if( is_german_build() ) + { + return false; + } + if(self.team == "axis") + { + level.bcOnFireTime = GetTime(); + level.bcOnFireOrg = self.origin; + } + if( !IsDefined( self.a.forceflamedeath ) || !self.a.forceflamedeath ) + { + if( WeaponClass( self.damageWeapon ) == "turret" ) + { + if( !IsDefined( WeaponType( self.damageWeapon ) ) || WeaponType( self.damageWeapon ) != "gas" ) + { + return false; + } + } + else if( weaponClass( self.damageWeapon ) != "gas" && self.damageWeapon != "molotov" && WeaponType( self.damageWeapon ) != "gas" ) + { + return false; + } + } + deathArray = []; + if( self.a.pose == "crouch" ) + { + deathArray[0] = %ai_flame_death_crouch_a; + deathArray[1] = %ai_flame_death_crouch_b; + deathArray[2] = %ai_flame_death_crouch_c; + deathArray[3] = %ai_flame_death_crouch_d; + deathArray[4] = %ai_flame_death_crouch_e; + deathArray[5] = %ai_flame_death_crouch_f; + deathArray[6] = %ai_flame_death_crouch_g; + deathArray[7] = %ai_flame_death_crouch_h; + } + else + { + deathArray[0] = %ai_flame_death_A; + deathArray[1] = %ai_flame_death_B; + deathArray[2] = %ai_flame_death_C; + deathArray[3] = %ai_flame_death_D; + deathArray[4] = %ai_flame_death_E; + deathArray[5] = %ai_flame_death_F; + deathArray[6] = %ai_flame_death_G; + deathArray[7] = %ai_flame_death_H; + deathArray[8] = %ai_deadly_wounded_flamedA_hit; + deathArray[9] = %ai_deadly_wounded_flamedB_hit; + } + self.fire_footsteps = true; + if( deathArray.size == 0 ) + { + return false; + } + deathArray = animscripts\zombie_pain::removeBlockedAnims( deathArray ); + if( deathArray.size == 0 ) + { + return false; + } + randomChoice = RandomInt( deathArray.size ); + self thread flame_death_fx(); + deathAnim = deathArray[randomChoice]; + play_death_anim( deathAnim ); + return true; +} +flame_death_fx() +{ + self endon( "death" ); + if (IsDefined(self.is_on_fire) && self.is_on_fire ) + { + return; + } + self.is_on_fire = true; + self thread on_fire_timeout(); + if(self.team == "axis") + { + level.bcOnFireTime = GetTime(); + level.bcOnFireOrg = self.origin; + } + if( IsDefined( level._effect ) && IsDefined( level._effect["character_fire_death_torso"] ) ) + { + if ( !self.isdog ) + { + PlayFxOnTag( level._effect["character_fire_death_torso"], self, "J_SpineLower" ); + } + } + else + { + } + if( IsDefined( level._effect ) && IsDefined( level._effect["character_fire_death_sm"] ) ) + { + wait 1; + tagArray = []; + tagArray[0] = "J_Elbow_LE"; + tagArray[1] = "J_Elbow_RI"; + tagArray[2] = "J_Knee_RI"; + tagArray[3] = "J_Knee_LE"; + tagArray = randomize_array( tagArray ); + PlayFxOnTag( level._effect["character_fire_death_sm"], self, tagArray[0] ); + wait 1; + tagArray[0] = "J_Wrist_RI"; + tagArray[1] = "J_Wrist_LE"; + if( !IsDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" ) + { + tagArray[2] = "J_Ankle_RI"; + tagArray[3] = "J_Ankle_LE"; + } + tagArray = randomize_array( tagArray ); + PlayFxOnTag( level._effect["character_fire_death_sm"], self, tagArray[0] ); + PlayFxOnTag( level._effect["character_fire_death_sm"], self, tagArray[1] ); + } + else + { + } +} +on_fire_timeout() +{ + self endon ("death"); + wait 12; + if (IsDefined(self) && IsAlive(self)) + { + self.is_on_fire = false; + self notify ("stop_flame_damage"); + } +} +play_bulletgibbed_death_anim() +{ + maxDist = 300; + if( self.damagemod == "MOD_MELEE" ) + { + return false; + } + if ( IsDefined( self.no_gib ) && ( self.no_gib == 1 ) ) + { + return false; + } + gib_chance = 75; + shotty_gib = false; + if( WeaponClass( self.damageWeapon ) == "spread" ) + { + maxDist = 300; + shotty_gib = true; + distSquared = DistanceSquared( self.origin, self.attacker.origin ); + if( distSquared < 110*110 ) + { + gib_chance = 100; + } + else if( distSquared < 200*200 ) + { + gib_chance = 75; + } + else if( distSquared < 270*270 ) + { + gib_chance = 50; + } + else if( distSquared < 330*330 ) + { + if( RandomInt( 100 ) < 50 ) + { + gib_chance = 50; + } + else + { + return false; + } + } + else + { + return false; + } + } + else if( WeaponClass( self.damageWeapon ) == "turret" || WeaponMountable( self.damageWeapon ) ) + { + maxDist = 750; + } + else if( self.damageWeapon == "dp28" || self.damageWeapon == "dp28_wet" || + self.damageWeapon == "type99_lmg" || self.damageWeapon == "type99_lmg_wet" || + self.damageWeapon == "30cal" || self.damageWeapon == "30cal_wet" || + self.damageWeapon == "mg42" || self.damageWeapon == "fg42" || + self.damageWeapon == "30cal_bipod" || self.damageWeapon == "30cal_bipod_wet" ) + { + maxDist = 1000; + } + else if( self.damageWeapon == "ptrs41" ) + { + maxDist = 3500; + } + else if( self.damageWeapon == "triple25_turret" ) + { + maxDist = 3500; + gib_chance = 100; + anim.lastGibTime = anim.lastGibTime - 3000; + } + else if( IsDefined( self.force_gib ) && self.force_gib ) + { + maxDist = 6000; + } + else + { + return false; + } + if( !IsDefined( self.attacker ) || !IsDefined( self.damageLocation ) ) + { + return false; + } + if( self.damagetaken < 50 && !shotty_gib ) + { + return false; + } + self.a.gib_ref = undefined; + distSquared = DistanceSquared( self.origin, self.attacker.origin ); + if( RandomInt( 100 ) < gib_chance && distSquared < maxDist*maxDist && GetTime() > anim.lastGibTime + anim.gibDelay ) + { + anim.lastGibTime = GetTime(); + refs = []; + switch( self.damageLocation ) + { + case "torso_upper": + case "torso_lower": + refs[refs.size] = "guts"; + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + break; + case "right_arm_upper": + case "right_arm_lower": + case "right_hand": + refs[refs.size] = "right_arm"; + break; + case "left_arm_upper": + case "left_arm_lower": + case "left_hand": + refs[refs.size] = "left_arm"; + break; + case "right_leg_upper": + case "right_leg_lower": + case "right_foot": + refs[refs.size] = "right_leg"; + refs[refs.size] = "no_legs"; + break; + case "left_leg_upper": + case "left_leg_lower": + case "left_foot": + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + break; + case "helmet": + case "head": + refs[refs.size] = "head"; + break; + } + if( IsDefined( self.thunder_death ) && self.thunder_death ) + { + refs = []; + refs[refs.size] = "guts"; + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + refs[refs.size] = "head"; + } + if( refs.size ) + { + self.a.gib_ref = get_random( refs ); + } + } + range = 600; + nrange = -600; + self.gib_vel = self.damagedir * RandomIntRange( 500, 900 ); + self.gib_vel += ( RandomIntRange( nrange, range ), RandomIntRange( nrange, range ), RandomIntRange( 400, 1000 ) ); + self thread do_gib(); + deathAnim = get_death_anim(); + self setFlaggedAnimKnobAllRestart( "deathanim", deathAnim, %body, 1, .1 ); + wait 0.05; + self launch_ragdoll_based_on_damage_type( 2.0 ); + self thread death_anim_short_circuit(); + wait 0.5; + return true; +} +randomize_array( array ) +{ + for( i = 0; i < array.size; i++ ) + { + j = RandomInt( array.size ); + temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + return array; +} +play_bayonet_death_anim() +{ + if( self.damagemod != "MOD_BAYONET" ) + { + return false; + } + if( self.a.pose != "stand" ) + { + return false; + } + deathAnim = ""; + side = "front"; + if( ( self.damageyaw > -45 ) &&( self.damageyaw <= 45 ) ) + { + deathAnim = %ai_bayonet_back_death; + side = "back"; + } + else if( ( self.damageyaw > 45 ) &&( self.damageyaw <= 135 ) ) + { + deathAnim = %ai_bayonet_right_death; + side = "right"; + } + else if( ( self.damageyaw < -45 ) &&( self.damageyaw >= -135 ) ) + { + deathAnim = %ai_bayonet_left_death; + side = "left"; + } + else if( damageLocationIsAny( "helmet", "head", "neck", "torso_upper" ) ) + { + deathAnim = %ai_bayonet_shoulder_death; + side = "front"; + } + else + { + deathAnim = %ai_bayonet_thrust_death; + side = "front"; + } + if( GetDvarInt( #"cg_blood" ) > 0 ) + { + self thread bayonet_death_fx( side ); + } + play_death_anim( deathAnim ); + return true; +} +get_tag_for_damage_location() +{ + tag = "J_SpineLower"; + if( self.damagelocation == "helmet" ) + { + tag = "j_head"; + } + else if( self.damagelocation == "head" ) + { + tag = "j_head"; + } + else if( self.damagelocation == "neck" ) + { + tag = "j_neck"; + } + else if( self.damagelocation == "torso_upper" ) + { + tag = "j_spineupper"; + } + else if( self.damagelocation == "torso_lower" ) + { + tag = "j_spinelower"; + } + else if( self.damagelocation == "right_arm_upper" ) + { + tag = "j_elbow_ri"; + } + else if( self.damagelocation == "left_arm_upper" ) + { + tag = "j_elbow_le"; + } + else if( self.damagelocation == "right_arm_lower" ) + { + tag = "j_wrist_ri"; + } + else if( self.damagelocation == "left_arm_lower" ) + { + tag = "j_wrist_le"; + } + return tag; +} +bayonet_death_fx( side ) +{ + tag = self get_tag_for_damage_location(); + if( IsDefined( level._effect ) && IsDefined( level._effect["character_bayonet_blood_in"] ) ) + { + PlayFxOnTag( level._effect["character_bayonet_blood_in"], self, tag ); + } + else + { + } + wait 0.2; + if( IsDefined( level._effect ) ) + { + if( !IsDefined( level._effect["character_bayonet_blood_front"] ) || + !IsDefined( level._effect["character_bayonet_blood_back"] ) || + !IsDefined( level._effect["character_bayonet_blood_left"] ) || + !IsDefined( level._effect["character_bayonet_blood_right"] ) ) + { + println( "^3ANIMSCRIPT WARNING: You are missing level._effect[\"character_bayonet_blood_out\"], please set it in your levelname_fx.gsc." ); + println( "^3\"impacts/fx_flesh_bayonet_fatal_fr\" and " ); + println( "^3\"impacts/fx_flesh_bayonet_fatal_bk\" and " ); + println( "^3\"impacts/fx_flesh_bayonet_fatal_rt\" and " ); + println( "^3\"impacts/fx_flesh_bayonet_fatal_lf\"." ); + } + else + { + if( side == "front" ) + { + PlayFxOnTag( level._effect["character_bayonet_blood_front"], self, "j_spine4" ); + } + else if( side == "back" ) + { + PlayFxOnTag( level._effect["character_bayonet_blood_back"], self, "j_spine4" ); + } + else if( side == "right" ) + { + PlayFxOnTag( level._effect["character_bayonet_blood_right"], self, "j_spine4" ); + } + else if( side == "left" ) + { + PlayFxOnTag( level._effect["character_bayonet_blood_left"], self, "j_spine4" ); + } + } + } + else + { + } +} +get_gib_ref( direction ) +{ + if( IsDefined( self.a.gib_ref ) ) + { + return; + } + if( self.damageTaken < 165 ) + { + return; + } + if( GetTime() > anim.lastGibTime + anim.gibDelay && anim.totalGibs > 0 ) + { + anim.totalGibs--; + anim thread set_last_gib_time(); + refs = []; + switch( direction ) + { + case "right": + refs[refs.size] = "left_arm"; + refs[refs.size] = "left_leg"; + gib_ref = get_random( refs ); + break; + case "left": + refs[refs.size] = "right_arm"; + refs[refs.size] = "right_leg"; + gib_ref = get_random( refs ); + break; + case "forward": + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "guts"; + refs[refs.size] = "no_legs"; + gib_ref = get_random( refs ); + break; + case "back": + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + gib_ref = get_random( refs ); + break; + default: + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + refs[refs.size] = "guts"; + gib_ref = get_random( refs ); + break; + } + self.a.gib_ref = gib_ref; + } + else + { + self.a.gib_ref = undefined; + } +} +set_last_gib_time() +{ + anim notify( "stop_last_gib_time" ); + anim endon( "stop_last_gib_time" ); + wait( 0.05 ); + anim.lastGibTime = GetTime(); + anim.totalGibs = RandomIntRange( anim.minGibs, anim.maxGibs ); +} +get_random( array ) +{ + return array[RandomInt( array.size )]; +} +do_gib() +{ + if( !is_mature() ) + { + return; + } + if( is_german_build() ) + { + return; + } + if( !IsDefined( self.a.gib_ref ) ) + { + return; + } + if (IsDefined(self.is_on_fire) && self.is_on_fire) + { + return; + } + if( self is_zombie_gibbed() ) + { + return; + } + self set_zombie_gibbed(); + if( GetDvarFloat( #"kill_slowmo_time" ) > 0 ) + { + self thread goSlowMo(); + } + gib_ref = self.a.gib_ref; + limb_data = get_limb_data( gib_ref ); + if( !IsDefined( limb_data ) ) + { + return; + } + self thread throw_gib( limb_data["spawn_tags_array"] ); + if ( gib_ref == "head" ) + { + size = self GetAttachSize(); + for( i = 0; i < size; i++ ) + { + model = self GetAttachModelName( i ); + if( IsSubStr( model, "head" ) ) + { + if(isdefined(self.hatmodel)) + { + self detach( self.hatModel, "" ); + } + self Detach( model, "", true ); + if ( isDefined(self.torsoDmg5) ) + { + self Attach( self.torsoDmg5, "", true ); + } + break; + } + } + } + else + { + self SetModel( limb_data["body_model"] ); + self Attach( limb_data["legs_model"] ); + } +} +precache_gib_fx() +{ + anim._effect["animscript_gib_fx"] = LoadFx( "weapon/bullet/fx_flesh_gib_fatal_01" ); + anim._effect["animscript_gibtrail_fx"] = LoadFx( "trail/fx_trail_blood_streak" ); + anim._effect["death_neckgrab_spurt"] = LoadFx( "impacts/fx_flesh_hit_neck_fatal" ); +} +get_limb_data( gib_ref ) +{ + temp_array = []; + if( "right_arm" == gib_ref && IsDefined( self.torsoDmg2 ) && IsDefined( self.legDmg1 ) && IsDefined( self.gibSpawn1 ) && IsDefined( self.gibSpawnTag1 ) ) + { + temp_array["right_arm"]["body_model"] = self.torsoDmg2; + temp_array["right_arm"]["legs_model"] = self.legDmg1; + temp_array["right_arm"]["spawn_tags_array"] = []; + temp_array["right_arm"]["spawn_tags_array"][0] = level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM; + } + if( "left_arm" == gib_ref && IsDefined( self.torsoDmg3 ) && IsDefined( self.legDmg1 ) && IsDefined( self.gibSpawn2 ) && IsDefined( self.gibSpawnTag2 ) ) + { + temp_array["left_arm"]["body_model"] = self.torsoDmg3; + temp_array["left_arm"]["legs_model"] = self.legDmg1; + temp_array["left_arm"]["spawn_tags_array"] = []; + temp_array["left_arm"]["spawn_tags_array"][0] = level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM; + } + if( "right_leg" == gib_ref && IsDefined( self.torsoDmg1 ) && IsDefined( self.legDmg2 ) && IsDefined( self.gibSpawn3 ) && IsDefined( self.gibSpawnTag3 ) ) + { + temp_array["right_leg"]["body_model"] = self.torsoDmg1; + temp_array["right_leg"]["legs_model"] = self.legDmg2; + temp_array["right_leg"]["spawn_tags_array"] = []; + temp_array["right_leg"]["spawn_tags_array"][0] = level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG; + } + if( "left_leg" == gib_ref && IsDefined( self.torsoDmg1 ) && IsDefined( self.legDmg3 ) && IsDefined( self.gibSpawn4 ) && IsDefined( self.gibSpawnTag4 ) ) + { + temp_array["left_leg"]["body_model"] = self.torsoDmg1; + temp_array["left_leg"]["legs_model"] = self.legDmg3; + temp_array["left_leg"]["spawn_tags_array"] = []; + temp_array["left_leg"]["spawn_tags_array"][0] = level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG; + } + if( "no_legs" == gib_ref && IsDefined( self.torsoDmg1 ) && IsDefined( self.legDmg4 ) && IsDefined( self.gibSpawn4 ) && IsDefined( self.gibSpawn3 ) && IsDefined( self.gibSpawnTag3 ) && IsDefined( self.gibSpawnTag4 ) ) + { + temp_array["no_legs"]["body_model"] = self.torsoDmg1; + temp_array["no_legs"]["legs_model"] = self.legDmg4; + temp_array["no_legs"]["spawn_tags_array"] = []; + temp_array["no_legs"]["spawn_tags_array"][0] = level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG; + temp_array["no_legs"]["spawn_tags_array"][1] = level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG; + } + if( "guts" == gib_ref && IsDefined( self.torsoDmg4 ) && IsDefined( self.legDmg1 ) ) + { + temp_array["guts"]["body_model"] = self.torsoDmg4; + temp_array["guts"]["legs_model"] = self.legDmg1; + temp_array["guts"]["spawn_tags_array"] = []; + temp_array["guts"]["spawn_tags_array"][0] = level._ZOMBIE_GIB_PIECE_INDEX_GUTS; + if ( IsDefined( self.gibSpawn2 ) && IsDefined( self.gibSpawnTag2 ) ) + { + temp_array["guts"]["spawn_tags_array"][1] = level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM; + } + } + if( "head" == gib_ref && IsDefined( self.torsoDmg5 ) && IsDefined( self.legDmg1 ) ) + { + temp_array["head"]["body_model"] = self.torsoDmg5; + temp_array["head"]["legs_model"] = self.legDmg1; + temp_array["head"]["spawn_tags_array"] = []; + temp_array["head"]["spawn_tags_array"][0] = level._ZOMBIE_GIB_PIECE_INDEX_HEAD; + } + if( IsDefined( temp_array[gib_ref] ) ) + { + return temp_array[gib_ref]; + } + else + { + return undefined; + } +} +throw_gib( limb_tags_array ) +{ + if(IsDefined(limb_tags_array)) + { + if(IsDefined(self.launch_gib_up)) + { + self gib("up", limb_tags_array ); + } + else + { + self gib("normal", limb_tags_array ); + } + } +} +death_anim_short_circuit() +{ + self endon( "stop_death_anim_short_circuit" ); + wait 0.3; + totalDamageTaken = 0; + while( 1 ) + { + self waittill( "damage", damagetaken, attacker, dir, point, mod ); + waittillframeend; + if( IsDefined( self.damageMod ) && self.damageMod != "MOD_BURNED" ) + { + totalDamageTaken += self.damageTaken; + if( totalDamageTaken > 100 ) + { + self launch_ragdoll_based_on_damage_type(); + break; + } + } + } +} +launch_ragdoll_based_on_damage_type( bullet_scale ) +{ + if( self animscripts\zombie_pain::wasDamagedByExplosive() ) + { + force = 1.6; + } + else if( WeaponClass( self.damageWeapon ) == "spread" ) + { + distSquared = DistanceSquared( self.origin, self.attacker.origin ); + force = .3; + force += .7 *( 1.0 -( distSquared /( 300*300 ) ) ); + } + else + { + if( self.damagetaken < 75 ) + { + force = .35; + } + else + { + force = .45; + } + if( IsDefined( bullet_scale ) ) + { + force *= bullet_scale; + } + } + initial_force = self.damagedir + ( 0, 0, 0.2 ); + initial_force *= 60 * force; + if( damageLocationIsAny( "head", "helmet", "neck" ) ) + { + initial_force *= 0.5; + } + self startragdoll(); + self launchragdoll( initial_force, self.damageLocation ); +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/zombie_dog_combat.gsc b/BO1/PC/ZM/animscripts/zombie_dog_combat.gsc new file mode 100644 index 0000000..3c1ffd1 Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_dog_combat.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_dog_death.gsc b/BO1/PC/ZM/animscripts/zombie_dog_death.gsc new file mode 100644 index 0000000..230cc2c Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_dog_death.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_dog_flashed.gsc b/BO1/PC/ZM/animscripts/zombie_dog_flashed.gsc new file mode 100644 index 0000000..1a88213 Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_dog_flashed.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_dog_init.gsc b/BO1/PC/ZM/animscripts/zombie_dog_init.gsc new file mode 100644 index 0000000..39b3a3a Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_dog_init.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_dog_move.gsc b/BO1/PC/ZM/animscripts/zombie_dog_move.gsc new file mode 100644 index 0000000..72ccec4 Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_dog_move.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_dog_pain.gsc b/BO1/PC/ZM/animscripts/zombie_dog_pain.gsc new file mode 100644 index 0000000..ebdb15c Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_dog_pain.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_dog_scripted.gsc b/BO1/PC/ZM/animscripts/zombie_dog_scripted.gsc new file mode 100644 index 0000000..10d76f4 Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_dog_scripted.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_dog_stop.gsc b/BO1/PC/ZM/animscripts/zombie_dog_stop.gsc new file mode 100644 index 0000000..87d2308 --- /dev/null +++ b/BO1/PC/ZM/animscripts/zombie_dog_stop.gsc @@ -0,0 +1,352 @@ +#include animscripts\zombie_utility; +#include animscripts\weaponList; +#include common_scripts\utility; +#include animscripts\Combat_Utility; +#include maps\_utility; +#using_animtree ("zombie_dog"); +main() +{ + self endon("killanimscript"); + self ClearAnim( %root, 0.2 ); + self ClearAnim( anim.dogAnims[self.animSet].idle, 0.2 ); + self ClearAnim( anim.dogAnims[self.animSet].attack["attackidle_knob"], 0.2 ); + self thread lookAtTarget( "attackIdle" ); + while (1) + { + if ( shouldAttackIdle() ) + { + self ClearAnim( anim.dogAnims[self.animSet].idle, 0.2 ); + self randomAttackIdle(); + } + else + { + self OrientMode( "face current" ); + self ClearAnim( anim.dogAnims[self.animSet].attack["attackidle_knob"], 0.2 ); + self SetFlaggedAnimRestart( "dog_idle", anim.dogAnims[self.animSet].idle, 1, 0.2, self.animplaybackrate ); + } + animscripts\zombie_shared::DoNoteTracks( "dog_idle", ::dogIdleNotetracks ); + } +} +dogIdleNotetracks(note) +{ + if ( note == "breathe_fire" ) + { + if(IsDefined(level._effect["dog_breath"])) + { + self.breath_fx = Spawn( "script_model", self GetTagOrigin( "TAG_MOUTH_FX" ) ); + self.breath_fx.angles = self GetTagAngles( "TAG_MOUTH_FX" ); + self.breath_fx SetModel( "tag_origin" ); + self.breath_fx LinkTo( self, "TAG_MOUTH_FX" ); + PlayFxOnTag( level._effect["dog_breath"], self.breath_fx, "tag_origin" ); + } + } +} +isFacingEnemy( toleranceCosAngle ) +{ + assert( IsDefined( self.enemy ) ); + vecToEnemy = self.enemy.origin - self.origin; + distToEnemy = length( vecToEnemy ); + if ( distToEnemy < 1 ) + { + return true; + } + forward = AnglesToForward( self.angles ); + return ( ( forward[0] * vecToEnemy[0] ) + ( forward[1] * vecToEnemy[1] ) ) / distToEnemy > toleranceCosAngle; +} +randomAttackIdle() +{ + if ( isFacingEnemy( -0.5 ) ) + { + self OrientMode( "face current" ); + } + else + { + self OrientMode( "face enemy" ); + } + self ClearAnim( anim.dogAnims[self.animSet].attack["attackidle_knob"], 0.1 ); + if ( IsDefined( self.enemy ) && IsPlayer( self.enemy ) && IsAlive( self.enemy ) ) + { + range = GetDvarFloat( "ai_meleeRange" ); + distance_ok = DistanceSquared( self.origin, self.enemy.origin ) < ( range * range ); + if ( distance_ok == true ) + { + self notify( "dog_combat" ); + self animscripts\zombie_dog_combat::meleeBiteAttackPlayer( self.enemy ); + return; + } + } + if ( should_growl() ) + { + self SetFlaggedAnimRestart( "dog_idle", anim.dogAnims[self.animSet].combatIdle["attackidle_growl"], 1, 0.2, 1 ); + return; + } + idleChance = 33; + barkChance = 66; + if ( IsDefined( self.mode ) ) + { + if ( self.mode == "growl" ) + { + idleChance = 15; + barkChance = 30; + } + else if ( self.mode == "bark" ) + { + idleChance = 15; + barkChance = 85; + } + } + rand = RandomInt( 100 ); + if ( rand < idleChance ) + { + self SetFlaggedAnimRestart( "dog_idle", anim.dogAnims[self.animSet].combatIdle["attackidle_growl"], 1, 0.2, self.animplaybackrate ); + } + else if ( rand < barkChance ) + { + self SetFlaggedAnimRestart( "dog_idle", anim.dogAnims[self.animSet].combatIdle["attackidle_bark"], 1, 0.2, self.animplaybackrate ); + } + else + { + self SetFlaggedAnimRestart( "dog_idle", anim.dogAnims[self.animSet].combatIdle["attackidle_growl"], 1, 0.2, self.animplaybackrate ); + } +} +shouldAttackIdle() +{ + return ( IsDefined( self.enemy ) && IsAlive( self.enemy ) && DistanceSquared( self.origin, self.enemy.origin ) < 1000000 ); +} +should_growl() +{ + if ( IsDefined( self.script_growl ) ) + { + return true; + } + if ( !IsAlive( self.enemy ) ) + { + return true; + } + return !( self cansee( self.enemy ) ); +} +lookAtTarget( lookPoseSet ) +{ + self endon( "killanimscript" ); + self endon( "stop tracking" ); + self ClearAnim( anim.dogAnims[self.animSet].lookKnob[2], 0 ); + self ClearAnim( anim.dogAnims[self.animSet].lookKnob[4], 0 ); + self ClearAnim( anim.dogAnims[self.animSet].lookKnob[6], 0 ); + self ClearAnim( anim.dogAnims[self.animSet].lookKnob[8], 0 ); + self.rightLookLimit = 90; + self.leftLookLimit = -90; + self.upLookLimit = 45; + self.downLookLimit = -45; + self SetAnimLimited( anim.dogAnims[self.animSet].look[lookPoseSet][2], 1, 0 ); + self SetAnimLimited( anim.dogAnims[self.animSet].look[lookPoseSet][4], 1, 0 ); + self SetAnimLimited( anim.dogAnims[self.animSet].look[lookPoseSet][6], 1, 0 ); + self SetAnimLimited( anim.dogAnims[self.animSet].look[lookPoseSet][8], 1, 0 ); + self setAnimLookWeight( 1, 0.2 ); + self trackLoop( anim.dogAnims[self.animSet].lookKnob[2], anim.dogAnims[self.animSet].lookKnob[4], anim.dogAnims[self.animSet].lookKnob[6], anim.dogAnims[self.animSet].lookKnob[8] ); +} +trackLoop( look2, look4, look6, look8 ) +{ + players = GetPlayers(); + deltaChangePerFrame = 5; + lookBlendTime = .05; + prevYawDelta = 0; + prevPitchDelta = 0; + maxYawDeltaChange = 5; + maxPitchDeltaChange = 5; + pitchAdd = 0; + yawAdd = 0; + doMaxAngleCheck = false; + self.lookEnt = self.enemy; + yawDelta = 0; + pitchDelta = 0; + firstFrame = true; + for(;;) + { + rightLookLimit = self.rightLookLimit; + leftLookLimit = self.leftLookLimit; + upLookLimit = self.upLookLimit; + downLookLimit = self.downLookLimit; + if ( prevYawDelta > rightLookLimit ) + { + prevYawDelta = rightLookLimit; + } + else if ( prevYawDelta < leftLookLimit ) + { + prevYawDelta = leftLookLimit; + } + if ( prevPitchDelta > upLookLimit ) + { + prevPitchDelta = upLookLimit; + } + else if ( prevPitchDelta < downLookLimit ) + { + prevPitchDelta = downLookLimit; + } + incrAnimLookWeight(); + selfLookAtPos = (self.origin[0], self.origin[1], self geteyeapprox()[2]); + lookPos = self.lookPos; + if ( IsDefined( self.lookEnt ) ) + { + lookPos = self.lookEnt GetLookAtPos(); + } + if ( !IsDefined( lookPos ) ) + { + assert( !IsDefined( self.lookEnt ) ); + if ( IsDefined( self.node ) && self.node.type == "Guard" && DistanceSquared(self.origin, self.node.origin) < 16 ) + { + yawDelta = AngleClamp180( self.angles[1] - self.node.angles[1] ); + pitchDelta = 0; + } + else + { + likelyEnemyDir = self getAnglesToLikelyEnemyPath(); + if ( IsDefined( likelyEnemyDir ) ) + { + yawDelta = AngleClamp180( self.angles[1] - likelyEnemyDir[1] ); + pitchDelta = AngleClamp180( 360 - likelyEnemyDir[0] ); + } + else + { + yawDelta = 0; + pitchDelta = 0; + } + } + } + else + { + vectorToLookPos = lookPos - selfLookAtPos; + anglesToLookPos = VectorToAngles( vectorToLookPos ); + pitchDelta = 360 - anglesToLookPos[0]; + pitchDelta = AngleClamp180( pitchDelta + pitchAdd ); + yawDelta = self.angles[1] - anglesToLookPos[1]; + yawDelta = AngleClamp180( yawDelta + yawAdd ); + } + if ( doMaxAngleCheck && ( abs( yawDelta ) > 60 || abs( pitchDelta ) > 60 ) ) + { + yawDelta = 0; + pitchDelta = 0; + } + else + { + if ( yawDelta > rightLookLimit ) + { + yawDelta = rightLookLimit; + } + else if ( yawDelta < leftLookLimit ) + { + yawDelta = leftLookLimit; + } + if ( pitchDelta > upLookLimit ) + { + pitchDelta = upLookLimit; + } + else if ( pitchDelta < downLookLimit ) + { + pitchDelta = downLookLimit; + } + } + if ( firstFrame ) + { + firstFrame = false; + } + else + { + yawDeltaChange = yawDelta - prevYawDelta; + if ( abs( yawDeltaChange ) > maxYawDeltaChange ) + yawDelta = prevYawDelta + maxYawDeltaChange * sign( yawDeltaChange ); + pitchDeltaChange = pitchDelta - prevPitchDelta; + if ( abs( pitchDeltaChange ) > maxPitchDeltaChange ) + pitchDelta = prevPitchDelta + maxPitchDeltaChange * sign( pitchDeltaChange ); + } + prevYawDelta = yawDelta; + prevPitchDelta = pitchDelta; + if ( yawDelta > 0 ) + { + assert( yawDelta <= rightLookLimit ); + weight = yawDelta / rightLookLimit * self.a.lookweight; + self SetAnimLimited( look4, 0, lookBlendTime ); + self SetAnimLimited( look6, weight, lookBlendTime ); + } + else if ( yawDelta < 0 ) + { + assert( yawDelta >= leftLookLimit ); + weight = yawDelta / leftLookLimit * self.a.lookweight; + self SetAnimLimited( look6, 0, lookBlendTime ); + self SetAnimLimited( look4, weight, lookBlendTime ); + } + if ( pitchDelta > 0 ) + { + assert( pitchDelta <= upLookLimit ); + weight = pitchDelta / upLookLimit * self.a.lookweight; + self SetAnimLimited( look2, 0, lookBlendTime ); + self SetAnimLimited( look8, weight, lookBlendTime ); + } + else if ( pitchDelta < 0 ) + { + assert( pitchDelta >= downLookLimit ); + weight = pitchDelta / downLookLimit * self.a.lookweight; + self SetAnimLimited( look8, 0, lookBlendTime ); + self SetAnimLimited( look2, weight, lookBlendTime ); + } + if ( players.size == 1 ) + { + wait( 0.2 ); + } + else + { + wait( 1 ); + } + } +} +setAnimLookWeight(goalweight, goaltime) +{ + if ( !IsDefined( goaltime ) || goaltime <= 0 ) + { + self.a.lookweight = goalweight; + self.a.lookweight_start = goalweight; + self.a.lookweight_end = goalweight; + self.a.lookweight_transframes = 0; + } + else + { + self.a.lookweight = goalweight; + self.a.lookweight_start = self.a.lookweight; + self.a.lookweight_end = goalweight; + self.a.lookweight_transframes = int(goaltime * 20); + } + self.a.lookweight_t = 0; +} +incrAnimLookWeight() +{ + if ( self.a.lookweight_t < self.a.lookweight_transframes ) + { + self.a.lookweight_t++; + t = 1.0 * self.a.lookweight_t / self.a.lookweight_transframes; + self.a.lookweight = self.a.lookweight_start * (1 - t) + self.a.lookweight_end * t; + } +} +getPitchToLookEntOrPos() +{ + pitch = getPitchToLookEntOrPos(); + if ( self.a.script == "cover_crouch" && IsDefined( self.a.coverMode ) && self.a.coverMode == "lean" ) + { + pitch -= anim.coverCrouchLeanPitch; + } + return pitch; +} +getLookYawToPoint(point) +{ + yaw = GetYawToSpot(point); + dist = distance(self.origin,point); + if(dist > 3) + { + angleFudge = asin(-3/dist); + yaw += angleFudge; + } + yaw = AngleClamp180( yaw ); + return yaw; +} +GetLookAtPos() +{ + return self GetShootAtPos(); +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/zombie_dog_turn.gsc b/BO1/PC/ZM/animscripts/zombie_dog_turn.gsc new file mode 100644 index 0000000..36da57a Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_dog_turn.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_init.gsc b/BO1/PC/ZM/animscripts/zombie_init.gsc new file mode 100644 index 0000000..62fd1c3 --- /dev/null +++ b/BO1/PC/ZM/animscripts/zombie_init.gsc @@ -0,0 +1,814 @@ + +#include animscripts\zombie_utility; +#include maps\_utility; +#include animscripts\Combat_utility; +#include common_scripts\Utility; +#using_animtree ("generic_human"); +main() +{ + prof_begin("animscript_init"); + self.a = SpawnStruct(); + self.root_anim = %root; + self thread beginGrenadeTracking(); + firstInit(); + anim.reacquireNum--; + if (anim.reacquireNum <= 0 && self.team == "axis") + { + anim.reacquireNum = 1; + self.a.reacquireGuy = true; + } + else + { + self.a.reacquireGuy = false; + } + self.a.pose = "stand"; + self.a.movement = "stop"; + self.a.state = "stop"; + self.a.special = "none"; + self.a.combatEndTime = GetTime(); + self.a.script = "init"; + self.a.alertness = "casual"; + self.a.lastEnemyTime = GetTime(); + self.a.forced_cover = "none"; + self.a.desired_script = "none"; + self.a.current_script = "none"; + self.a.disableLongDeath = self.team != "axis"; + self.a.lookangle = 0; + self.a.painTime = 0; + self.a.nextGrenadeTryTime = 0; + self.walk = false; + self.sprint = false; + self.a.flamepainTime = 0; + self.a.postScriptFunc = undefined; + self.a.stance = "stand"; + self._animActive = 0; + self._lastAnimTime = 0; + self thread deathNotify(); + self.baseAccuracy = self.accuracy; + if( !IsDefined(self.script_accuracy) ) + { + self.script_accuracy = 1; + } + if (self.team == "axis") + { + self thread maps\_gameskill::axisAccuracyControl(); + } + else if (self.team == "allies") + { + self thread maps\_gameskill::alliesAccuracyControl(); + } + self.a.missTime = 0; + self.a.yawTransition = "none"; + self.a.nodeath = false; + self.a.missTime = 0; + self.a.missTimeDebounce = 0; + self.a.disablePain = false; + self.accuracyStationaryMod = 1; + self.chatInitialized = false; + self.sightPosTime = 0; + self.sightPosLeft = true; + self.preCombatRunEnabled = true; + self.is_zombie = true; + self.a.grenadeFlee = animscripts\zombie_run::GetRunAnim(); + self.a.crouchpain = false; + self.a.nextStandingHitDying = false; + anim_set_next_move_to_new_cover(); + if (!IsDefined (self.script_forcegrenade)) + { + self.script_forcegrenade = 0; + } + self.a.StopCowering = ::DoNothing; + SetupUniqueAnims(); + self.lastEnemySightTime = 0; + self.combatTime = 0; + if ( self.team == "allies" ) + { + self.randomGrenadeRange = 0; + } + else + { + self.randomGrenadeRange = 128; + } + self.ramboChance = 0; + if (self.team == "axis") + { + self.ramboChance *= 2; + } + self.coverIdleSelectTime = -696969; + self.exception = []; + self.exception[ "corner" ] = 1; + self.exception[ "cover_crouch" ] = 1; + self.exception[ "stop" ] = 1; + self.exception[ "stop_immediate" ] = 1; + self.exception[ "move" ] = 1; + self.exception[ "exposed" ] = 1; + self.exception[ "corner_normal" ] = 1; + keys = getArrayKeys( self.exception ); + for ( i=0; i < keys.size; i++ ) + { + clear_exception( keys[ i ] ); + } + self.old = SpawnStruct(); + self.reacquire_state = 0; + self thread setNameAndRank(); + self.shouldConserveAmmoTime = 0; + self thread onDeath(); + self.a.allow_shooting = false; + prof_end("animscript_init"); +} +setNameAndRank() +{ + self endon ( "death" ); + if (!IsDefined (level.loadoutComplete)) + { + level waittill ("loadout complete"); + } + self maps\_names::get_name(); +} +DoNothing() +{ +} +SetupUniqueAnims() +{ + if ( !IsDefined( self.animplaybackrate ) || !IsDefined( self.moveplaybackrate ) ) + { + set_anim_playback_rate(); + } +} +set_anim_playback_rate() +{ + self.animplaybackrate = 0.9 + RandomFloat( 0.2 ); + self.moveplaybackrate = 1; +} +infiniteLoop(one, two, three, whatever) +{ + anim waittill("new exceptions"); +} +empty(one, two, three, whatever) +{ +} +clearEnemy() +{ + self notify ("stop waiting for enemy to die"); + self endon ("stop waiting for enemy to die"); + self.sightEnemy waittill ("death"); + self.sightpos = undefined; + self.sightTime = 0; + self.sightEnemy = undefined; +} +previewSightPos() +{ +} +previewAccuracy() +{ +} +trackVelocity() +{ + self endon ("death"); + for (;;) + { + self.oldOrigin = self.origin; + wait (0.2); + } +} +deathNotify() +{ + self waittill( "death", other ); + self notify( anim.scriptChange ); +} +setupHats() +{ + anim.noHat = []; + addNoHat("character_british_africa_price"); + addNoHat("character_british_normandy_price"); + addNoHat("character_british_normandy_price"); + addNoHat("character_german_winter_masked_dark"); + addNoHat("character_russian_trench_d"); + anim.noHatClassname = []; + addNoHatClassname("actor_ally_rus_volsky"); + anim.metalHat = []; + addMetalHat("character_british_duhoc_driver"); + addMetalHat("character_us_ranger_cpl_a"); + addMetalHat("character_us_ranger_lt_coffey"); + addMetalHat("character_us_ranger_medic_wells"); + addMetalHat("character_us_ranger_pvt_a"); + addMetalHat("character_us_ranger_pvt_a_low"); + addMetalHat("character_us_ranger_pvt_a_wounded"); + addMetalHat("character_us_ranger_pvt_b"); + addMetalHat("character_us_ranger_pvt_b_low"); + addMetalHat("character_us_ranger_pvt_b_wounded"); + addMetalHat("character_us_ranger_pvt_braeburn"); + addMetalHat("character_us_ranger_pvt_c"); + addMetalHat("character_us_ranger_pvt_c_low"); + addMetalHat("character_us_ranger_pvt_d"); + addMetalHat("character_us_ranger_pvt_d_low"); + addMetalHat("character_us_ranger_pvt_mccloskey"); + addMetalHat("character_us_ranger_radio"); + addMetalHat("character_us_ranger_sgt_randall"); + addMetalHat("character_us_wet_ranger_cpl_a"); + addMetalHat("character_us_wet_ranger_lt_coffey"); + addMetalHat("character_us_wet_ranger_medic_wells"); + addMetalHat("character_us_wet_ranger_pvt_a"); + addMetalHat("character_us_wet_ranger_pvt_a_low"); + addMetalHat("character_us_wet_ranger_pvt_a_wounded"); + addMetalHat("character_us_wet_ranger_pvt_b"); + addMetalHat("character_us_wet_ranger_pvt_b_low"); + addMetalHat("character_us_wet_ranger_pvt_b_wounded"); + addMetalHat("character_us_wet_ranger_pvt_braeburn"); + addMetalHat("character_us_wet_ranger_pvt_c"); + addMetalHat("character_us_wet_ranger_pvt_c_low"); + addMetalHat("character_us_wet_ranger_pvt_d"); + addMetalHat("character_us_wet_ranger_pvt_d_low"); + addMetalHat("character_us_wet_ranger_pvt_mccloskey"); + addMetalHat("character_us_wet_ranger_radio"); + addMetalHat("character_us_wet_ranger_sgt_randall"); + addMetalHat("character_british_afrca_body"); + addMetalHat("character_british_afrca_body_low"); + addMetalHat("character_british_afrca_mac_body"); + addMetalHat("character_british_afrca_mac_radio"); + addMetalHat("character_british_afrca_mcgregor_low"); + addMetalHat("character_british_afrca_shortsleeve_body"); + addMetalHat("character_british_normandy_a"); + addMetalHat("character_british_normandy_b"); + addMetalHat("character_british_normandy_c"); + addMetalHat("character_british_normandy_mac_body"); + addMetalHat("character_german_afrca_body"); + addMetalHat("character_german_afrca_casualbody"); + addMetalHat("character_german_camo_fat"); + addMetalHat("character_german_normandy_coat_dark"); + addMetalHat("character_german_normandy_fat"); + addMetalHat("character_german_normandy_fat_injured"); + addMetalHat("character_german_normandy_officer"); + addMetalHat("character_german_normandy_thin"); + addMetalHat("character_german_normandy_thin_injured"); + addMetalHat("character_german_winter_light"); + addMetalHat("character_german_winter_masked_dark"); + addMetalHat("character_german_winter_mg42_low"); + addMetalHat("character_russian_padded_b"); + addMetalHat("character_russian_trench_b"); + anim.fatGuy = []; + addFatGuy("character_german_camo_fat"); + addFatGuy("character_german_normandy_fat"); + addFatGuy("character_russian_trench_a"); + addFatGuy("character_german_normandy_fat_injured"); +} +addNoHat(model) +{ + anim.noHat[model] = 1; +} +addNoHatClassname(model) +{ + anim.noHatClassname[model] = 1; +} +addMetalHat(model) +{ + anim.metalHat[model] = 1; +} +addFatGuy(model) +{ + anim.fatGuy[model] = 1; +} +initWindowTraverse() +{ + level.window_down_height[0] = -36.8552; + level.window_down_height[1] = -27.0095; + level.window_down_height[2] = -15.5981; + level.window_down_height[3] = -4.37769; + level.window_down_height[4] = 17.7776; + level.window_down_height[5] = 59.8499; + level.window_down_height[6] = 104.808; + level.window_down_height[7] = 152.325; + level.window_down_height[8] = 201.052; + level.window_down_height[9] = 250.244; + level.window_down_height[10] = 298.971; + level.window_down_height[11] = 330.681; +} +initMoveStartStopTransitions() +{ + transTypes = []; + transTypes[0] = "left"; + transTypes[1] = "right"; + transTypes[2] = "left_crouch"; + transTypes[3] = "right_crouch"; + transTypes[4] = "crouch"; + transTypes[5] = "stand"; + transTypes[6] = "exposed"; + transTypes[7] = "exposed_crouch"; + transTypes[8] = "stand_saw"; + transTypes[9] = "crouch_saw"; + anim.approach_types = []; + standing = 0; + crouching = 1; + anim.approach_types[ "Cover Left" ] = []; + anim.approach_types[ "Cover Left" ][ standing ] = "left"; + anim.approach_types[ "Cover Left" ][ crouching ] = "left_crouch"; + anim.approach_types[ "Cover Left Wide" ] = anim.approach_types[ "Cover Left" ]; + anim.approach_types[ "Cover Right" ] = []; + anim.approach_types[ "Cover Right" ][ standing ] = "right"; + anim.approach_types[ "Cover Right" ][ crouching ] = "right_crouch"; + anim.approach_types[ "Cover Right Wide" ] = anim.approach_types[ "Cover Right" ]; + anim.approach_types[ "Cover Crouch" ] = []; + anim.approach_types[ "Cover Crouch" ][ standing ] = "crouch"; + anim.approach_types[ "Cover Crouch" ][ crouching ] = "crouch"; + anim.approach_types[ "Conceal Crouch" ] = anim.approach_types[ "Cover Crouch" ]; + anim.approach_types[ "Cover Crouch Window" ] = anim.approach_types[ "Cover Crouch" ]; + anim.approach_types[ "Cover Stand" ] = []; + anim.approach_types[ "Cover Stand" ][ standing ] = "stand"; + anim.approach_types[ "Cover Stand" ][ crouching ] = "stand"; + anim.approach_types[ "Conceal Stand" ] = anim.approach_types[ "Cover Stand" ]; + anim.approach_types[ "Path" ] = []; + anim.approach_types[ "Path" ][ standing ] = "exposed"; + anim.approach_types[ "Path" ][ crouching ] = "exposed_crouch"; + anim.approach_types[ "Guard"] = anim.approach_types[ "Path" ]; + anim.approach_types[ "Turret"] = anim.approach_types[ "Path" ]; + anim.coverTrans = []; + anim.coverExit = []; + anim.traverseInfo = []; + anim.coverTrans["right" ][1] = %corner_standR_trans_IN_1; + anim.coverTrans["right" ][2] = %corner_standR_trans_IN_2; + anim.coverTrans["right" ][3] = %corner_standR_trans_IN_3; + anim.coverTrans["right" ][4] = %corner_standR_trans_IN_4; + anim.coverTrans["right" ][6] = %corner_standR_trans_IN_6; + anim.coverTrans["right" ][8] = %corner_standR_trans_IN_8; + anim.coverTrans["right" ][9] = %corner_standR_trans_IN_9; + anim.coverTrans["right_crouch"][1] = %CornerCrR_trans_IN_ML; + anim.coverTrans["right_crouch"][2] = %CornerCrR_trans_IN_M; + anim.coverTrans["right_crouch"][3] = %CornerCrR_trans_IN_MR; + anim.coverTrans["right_crouch"][4] = %CornerCrR_trans_IN_L; + anim.coverTrans["right_crouch"][6] = %CornerCrR_trans_IN_R; + anim.coverTrans["right_crouch"][8] = %CornerCrR_trans_IN_F; + anim.coverTrans["right_crouch"][9] = %CornerCrR_trans_IN_MF; + anim.coverTrans["left" ][1] = %corner_standL_trans_IN_1; + anim.coverTrans["left" ][2] = %corner_standL_trans_IN_2; + anim.coverTrans["left" ][3] = %corner_standL_trans_IN_3; + anim.coverTrans["left" ][4] = %corner_standL_trans_IN_4; + anim.coverTrans["left" ][6] = %corner_standL_trans_IN_6; + anim.coverTrans["left" ][7] = %corner_standL_trans_IN_7; + anim.coverTrans["left" ][8] = %corner_standL_trans_IN_8; + anim.coverTrans["left_crouch" ][1] = %CornerCrL_trans_IN_ML; + anim.coverTrans["left_crouch" ][2] = %CornerCrL_trans_IN_M; + anim.coverTrans["left_crouch" ][3] = %CornerCrL_trans_IN_MR; + anim.coverTrans["left_crouch" ][4] = %CornerCrL_trans_IN_L; + anim.coverTrans["left_crouch" ][6] = %CornerCrL_trans_IN_R; + anim.coverTrans["left_crouch" ][7] = %CornerCrL_trans_IN_MF; + anim.coverTrans["left_crouch" ][8] = %CornerCrL_trans_IN_F; + anim.coverTrans["crouch" ][1] = %covercrouch_run_in_ML; + anim.coverTrans["crouch" ][2] = %covercrouch_run_in_M; + anim.coverTrans["crouch" ][3] = %covercrouch_run_in_MR; + anim.coverTrans["crouch" ][4] = %covercrouch_run_in_L; + anim.coverTrans["crouch" ][6] = %covercrouch_run_in_R; + anim.coverTrans["stand" ][1] = %coverstand_trans_IN_ML; + anim.coverTrans["stand" ][2] = %coverstand_trans_IN_M; + anim.coverTrans["stand" ][3] = %coverstand_trans_IN_MR; + anim.coverTrans["stand" ][4] = %coverstand_trans_IN_L; + anim.coverTrans["stand" ][6] = %coverstand_trans_IN_R; + anim.coverTrans["stand_saw" ][1] = %saw_gunner_runin_ML; + anim.coverTrans["stand_saw" ][2] = %saw_gunner_runin_M; + anim.coverTrans["stand_saw" ][3] = %saw_gunner_runin_MR; + anim.coverTrans["stand_saw" ][4] = %saw_gunner_runin_L; + anim.coverTrans["stand_saw" ][6] = %saw_gunner_runin_R; + anim.coverTrans["crouch_saw" ][1] = %saw_gunner_lowwall_runin_ML; + anim.coverTrans["crouch_saw" ][2] = %saw_gunner_lowwall_runin_M; + anim.coverTrans["crouch_saw" ][3] = %saw_gunner_lowwall_runin_MR; + anim.coverTrans["crouch_saw" ][4] = %saw_gunner_lowwall_runin_L; + anim.coverTrans["crouch_saw" ][6] = %saw_gunner_lowwall_runin_R; + anim.coverTrans["exposed" ] = []; + anim.coverTrans["exposed" ][1] = undefined; + anim.coverTrans["exposed" ][2] = %run_2_stand_F_6; + anim.coverTrans["exposed" ][3] = undefined; + anim.coverTrans["exposed" ][4] = %run_2_stand_90L; + anim.coverTrans["exposed" ][6] = %run_2_stand_90R; + anim.coverTrans["exposed" ][7] = undefined; + anim.coverTrans["exposed" ][8] = %run_2_stand_180L; + anim.coverTrans["exposed" ][9] = undefined; + anim.coverTrans["exposed_crouch"] = []; + anim.coverTrans["exposed_crouch"][1] = undefined; + anim.coverTrans["exposed_crouch"][2] = %run_2_crouch_F; + anim.coverTrans["exposed_crouch"][3] = undefined; + anim.coverTrans["exposed_crouch"][4] = %run_2_crouch_90L; + anim.coverTrans["exposed_crouch"][6] = %run_2_crouch_90R; + anim.coverTrans["exposed_crouch"][7] = undefined; + anim.coverTrans["exposed_crouch"][8] = %run_2_crouch_180L; + anim.coverTrans["exposed_crouch"][9] = undefined; + anim.coverExit["right" ][1] = %corner_standR_trans_OUT_1; + anim.coverExit["right" ][2] = %corner_standR_trans_OUT_2; + anim.coverExit["right" ][3] = %corner_standR_trans_OUT_3; + anim.coverExit["right" ][4] = %corner_standR_trans_OUT_4; + anim.coverExit["right" ][6] = %corner_standR_trans_OUT_6; + anim.coverExit["right" ][8] = %corner_standR_trans_OUT_8; + anim.coverExit["right" ][9] = %corner_standR_trans_OUT_9; + anim.coverExit["right_crouch"][1] = %CornerCrR_trans_OUT_ML; + anim.coverExit["right_crouch"][2] = %CornerCrR_trans_OUT_M; + anim.coverExit["right_crouch"][3] = %CornerCrR_trans_OUT_MR; + anim.coverExit["right_crouch"][4] = %CornerCrR_trans_OUT_L; + anim.coverExit["right_crouch"][6] = %CornerCrR_trans_OUT_R; + anim.coverExit["right_crouch"][8] = %CornerCrR_trans_OUT_F; + anim.coverExit["right_crouch"][9] = %CornerCrR_trans_OUT_MF; + anim.coverExit["left" ][1] = %corner_standL_trans_OUT_1; + anim.coverExit["left" ][2] = %corner_standL_trans_OUT_2; + anim.coverExit["left" ][3] = %corner_standL_trans_OUT_3; + anim.coverExit["left" ][4] = %corner_standL_trans_OUT_4; + anim.coverExit["left" ][6] = %corner_standL_trans_OUT_6; + anim.coverExit["left" ][7] = %corner_standL_trans_OUT_7; + anim.coverExit["left" ][8] = %corner_standL_trans_OUT_8; + anim.coverExit["left_crouch" ][1] = %CornerCrL_trans_OUT_ML; + anim.coverExit["left_crouch" ][2] = %CornerCrL_trans_OUT_M; + anim.coverExit["left_crouch" ][3] = %CornerCrL_trans_OUT_MR; + anim.coverExit["left_crouch" ][4] = %CornerCrL_trans_OUT_L; + anim.coverExit["left_crouch" ][6] = %CornerCrL_trans_OUT_R; + anim.coverExit["left_crouch" ][7] = %CornerCrL_trans_OUT_MF; + anim.coverExit["left_crouch" ][8] = %CornerCrL_trans_OUT_F; + anim.coverExit["crouch" ][1] = %covercrouch_run_out_ML; + anim.coverExit["crouch" ][2] = %covercrouch_run_out_M; + anim.coverExit["crouch" ][3] = %covercrouch_run_out_MR; + anim.coverExit["crouch" ][4] = %covercrouch_run_out_L; + anim.coverExit["crouch" ][6] = %covercrouch_run_out_R; + anim.coverExit["stand" ][1] = %coverstand_trans_OUT_ML; + anim.coverExit["stand" ][2] = %coverstand_trans_OUT_M; + anim.coverExit["stand" ][3] = %coverstand_trans_OUT_MR; + anim.coverExit["stand" ][4] = %coverstand_trans_OUT_L; + anim.coverExit["stand" ][6] = %coverstand_trans_OUT_R; + anim.coverExit["stand_saw" ][1] = %saw_gunner_runout_ML; + anim.coverExit["stand_saw" ][2] = %saw_gunner_runout_M; + anim.coverExit["stand_saw" ][3] = %saw_gunner_runout_MR; + anim.coverExit["stand_saw" ][4] = %saw_gunner_runout_L; + anim.coverExit["stand_saw" ][6] = %saw_gunner_runout_R; + anim.coverExit["crouch_saw" ][1] = %saw_gunner_lowwall_runout_ML; + anim.coverExit["crouch_saw" ][2] = %saw_gunner_lowwall_runout_M; + anim.coverExit["crouch_saw" ][3] = %saw_gunner_lowwall_runout_MR; + anim.coverExit["crouch_saw" ][4] = %saw_gunner_lowwall_runout_L; + anim.coverExit["crouch_saw" ][6] = %saw_gunner_lowwall_runout_R; + anim.coverExit["exposed" ] = []; + anim.coverExit["exposed" ][1] = undefined; + anim.coverExit["exposed" ][2] = %stand_2_run_180_med; + anim.coverExit["exposed" ][3] = undefined; + anim.coverExit["exposed" ][4] = %stand_2_run_L; + anim.coverExit["exposed" ][6] = %stand_2_run_R; + anim.coverExit["exposed" ][7] = undefined; + anim.coverExit["exposed" ][8] = %stand_2_run_F_2; + anim.coverExit["exposed" ][9] = undefined; + anim.coverExit["exposed_crouch"] = []; + anim.coverExit["exposed_crouch"][1] = undefined; + anim.coverExit["exposed_crouch"][2] = %crouch_2run_180; + anim.coverExit["exposed_crouch"][3] = undefined; + anim.coverExit["exposed_crouch"][4] = %crouch_2run_L; + anim.coverExit["exposed_crouch"][6] = %crouch_2run_R; + anim.coverExit["exposed_crouch"][7] = undefined; + anim.coverExit["exposed_crouch"][8] = %crouch_2run_F; + anim.coverExit["exposed_crouch"][9] = undefined; + anim.coverTransDist = []; + anim.coverExitDist = []; + anim.coverExitPostDist = []; + anim.coverTransPreDist = []; + anim.coverTransAngles = []; + anim.coverExitAngles = []; + for ( i = 1; i <= 6; i++ ) + { + if ( i == 5 ) + { + continue; + } + for ( j = 0; j < transTypes.size; j++ ) + { + trans = transTypes[j]; + if ( IsDefined( anim.coverTrans[ trans ][i] ) ) + { + anim.coverTransDist [ trans ][i] = getMoveDelta ( anim.coverTrans[ trans ][i], 0, 1 ); + anim.coverTransAngles[ trans ][i] = getAngleDelta( anim.coverTrans[ trans ][i], 0, 1 ); + } + if ( IsDefined( anim.coverExit [ trans ] ) && IsDefined( anim.coverExit [ trans ][i] ) ) + { + anim.coverExitDist [ trans ][i] = getMoveDelta ( anim.coverExit [ trans ][i], 0, 1 ); + anim.coverExitAngles [ trans ][i] = getAngleDelta( anim.coverExit [ trans ][i], 0, 1 ); + } + } + } + exposedTransTypes = []; + exposedTransTypes[0] = "exposed"; + exposedTransTypes[1] = "exposed_crouch"; + anim.longestExposedApproachDist = 0; + for ( j = 0; j < exposedTransTypes.size; j++ ) + { + trans = exposedTransTypes[j]; + for ( i = 7; i <= 9; i++ ) + { + if ( IsDefined( anim.coverTrans[ trans ][i] ) ) + { + anim.coverTransDist [ trans ][i] = getMoveDelta ( anim.coverTrans[ trans ][i], 0, 1 ); + anim.coverTransAngles[ trans ][i] = getAngleDelta( anim.coverTrans[ trans ][i], 0, 1 ); + } + if ( IsDefined( anim.coverExit [ trans ][i] ) ) + { + anim.coverExitDist [ trans ][i] = getMoveDelta ( anim.coverExit [ trans ][i], 0, 1 ); + anim.coverExitAngles [ trans ][i] = getAngleDelta( anim.coverExit [ trans ][i], 0, 1 ); + } + } + for ( i = 1; i <= 9; i++ ) + { + if ( !IsDefined( anim.coverTrans[trans][i] ) ) + { + continue; + } + len = length( anim.coverTransDist[trans][i] ); + if ( len > anim.longestExposedApproachDist ) + { + anim.longestExposedApproachDist = len; + } + } + } + anim.coverExitSplit = []; + anim.coverTransSplit = []; + anim.coverTransSplit["left"][7] = 0.369369; + anim.coverTransSplit["left_crouch"][7] = 0.277277; + anim.coverExitSplit["left"][7] = 0.646647; + anim.coverExitSplit["left_crouch"][7] = 0.764765; + anim.coverTransSplit["left"][8] = 0.463463; + anim.coverTransSplit["left_crouch"][8] = 0.339339; + anim.coverExitSplit["left"][8] = 0.677678; + anim.coverExitSplit["left_crouch"][8] = 0.58959; + anim.coverTransSplit["right"][8] = 0.458458; + anim.coverTransSplit["right_crouch"][8] = 0.329329; + anim.coverExitSplit["right"][8] = 0.457457; + anim.coverExitSplit["right_crouch"][8] = 0.636637; + anim.coverTransSplit["right"][9] = 0.546547; + anim.coverTransSplit["right_crouch"][9] = 0.349349; + anim.coverExitSplit["right"][9] = 0.521522; + anim.coverExitSplit["right_crouch"][9] = 0.664665; + for ( i = 7; i <= 8; i++ ) + { + anim.coverTransPreDist["left" ][i] = getMoveDelta ( anim.coverTrans["left" ][i], 0, getTransSplitTime( "left", i ) ); + anim.coverTransDist ["left" ][i] = getMoveDelta ( anim.coverTrans["left" ][i], 0, 1 ) - anim.coverTransPreDist["left"][i]; + anim.coverTransAngles ["left" ][i] = getAngleDelta( anim.coverTrans["left" ][i], 0, 1 ); + anim.coverTransPreDist["left_crouch" ][i] = getMoveDelta ( anim.coverTrans["left_crouch" ][i], 0, getTransSplitTime( "left_crouch", i ) ); + anim.coverTransDist ["left_crouch" ][i] = getMoveDelta ( anim.coverTrans["left_crouch" ][i], 0, 1 ) - anim.coverTransPreDist["left_crouch"][i]; + anim.coverTransAngles ["left_crouch" ][i] = getAngleDelta( anim.coverTrans["left_crouch" ][i], 0, 1 ); + anim.coverExitDist ["left" ][i] = getMoveDelta ( anim.coverExit ["left" ][i], 0, getExitSplitTime( "left", i ) ); + anim.coverExitPostDist["left" ][i] = getMoveDelta ( anim.coverExit ["left" ][i], 0, 1 ) - anim.coverExitDist["left"][i]; + anim.coverExitAngles ["left" ][i] = getAngleDelta( anim.coverExit ["left" ][i], 0, 1 ); + anim.coverExitDist ["left_crouch" ][i] = getMoveDelta ( anim.coverExit ["left_crouch" ][i], 0, getExitSplitTime( "left_crouch", i ) ); + anim.coverExitPostDist["left_crouch" ][i] = getMoveDelta ( anim.coverExit ["left_crouch" ][i], 0, 1 ) - anim.coverExitDist["left_crouch"][i]; + anim.coverExitAngles ["left_crouch" ][i] = getAngleDelta( anim.coverExit ["left" ][i], 0, 1 ); + } + for ( i = 8; i <= 9; i++ ) + { + anim.coverTransPreDist["right" ][i] = getMoveDelta ( anim.coverTrans["right" ][i], 0, getTransSplitTime( "right", i ) ); + anim.coverTransDist ["right" ][i] = getMoveDelta ( anim.coverTrans["right" ][i], 0, 1 ) - anim.coverTransPreDist["right"][i]; + anim.coverTransAngles ["right" ][i] = getAngleDelta( anim.coverTrans["right" ][i], 0, 1 ); + anim.coverTransPreDist["right_crouch"][i] = getMoveDelta ( anim.coverTrans["right_crouch"][i], 0, getTransSplitTime( "right_crouch", i ) ); + anim.coverTransDist ["right_crouch"][i] = getMoveDelta ( anim.coverTrans["right_crouch"][i], 0, 1 ) - anim.coverTransPreDist["right_crouch"][i]; + anim.coverTransAngles ["right_crouch"][i] = getAngleDelta( anim.coverTrans["right_crouch"][i], 0, 1 ); + anim.coverExitDist ["right" ][i] = getMoveDelta ( anim.coverExit ["right" ][i], 0, getExitSplitTime( "right", i ) ); + anim.coverExitPostDist["right" ][i] = getMoveDelta ( anim.coverExit ["right" ][i], 0, 1 ) - anim.coverExitDist["right"][i]; + anim.coverExitAngles ["right" ][i] = getAngleDelta( anim.coverExit ["right" ][i], 0, 1 ); + anim.coverExitDist ["right_crouch"][i] = getMoveDelta ( anim.coverExit ["right_crouch"][i], 0, getExitSplitTime( "right_crouch", i ) ); + anim.coverExitPostDist["right_crouch"][i] = getMoveDelta ( anim.coverExit ["right_crouch"][i], 0, 1 ) - anim.coverExitDist["right_crouch"][i]; + anim.coverExitAngles ["right_crouch"][i] = getAngleDelta( anim.coverExit ["right_crouch"][i], 0, 1 ); + } + anim.coverNotetrackExitInfo = []; + anim.coverNotetrackArrivalInfo = []; + for( i = 1; i <= 9; i++ ) + { + for( j = 0; j < transTypes.size - 1; j++ ) + { + trans = transTypes[j]; + if( IsDefined( anim.coverTrans[ trans ] ) && IsDefined( anim.coverTrans[ trans ][i] ) ) + { + notetracks = getnotetracksindelta( anim.coverTrans[ trans ][i], 0, 9999 ); + if(notetracks.size > 0) + { + anim.coverNotetrackArrivalInfo[ trans + "_" + i ] = []; + anim.coverNotetrackArrivalInfo[ trans + "_" + i ] = notetracks; + } + } + if( IsDefined( anim.coverExit[ trans ] ) && IsDefined( anim.coverExit[ trans ][i] ) ) + { + notetracks = getnotetracksindelta( anim.coverExit[ trans ][i], 0, 9999 ); + if(notetracks.size > 0) + { + anim.coverNotetrackExitInfo[ trans + "_" + i ] = []; + anim.coverNotetrackExitInfo[ trans + "_" + i ] = notetracks; + } + } + } + } +} +getExitSplitTime( approachType, dir ) +{ + return anim.coverExitSplit[ approachType ][ dir ]; +} +getTransSplitTime( approachType, dir ) +{ + return anim.coverTransSplit[ approachType ][ dir ]; +} +firstInit() +{ + if ( IsDefined (anim.NotFirstTime) ) + { + return; + } + anim.NotFirstTime = true; + anim.useFacialAnims = false; + if ( !IsDefined( anim.dog_health ) ) + { + anim.dog_health = 1; + } + if ( !IsDefined( anim.dog_presstime ) ) + { + anim.dog_presstime = 350; + } + if ( !IsDefined( anim.dog_hits_before_kill ) ) + { + anim.dog_hits_before_kill = 1; + } + level.nextGrenadeDrop = RandomInt(3); + level.lastPlayerSighted = 100; + anim.defaultException = animscripts\zombie_init::empty; + anim.sniperRifles = []; + anim.sniperRifles["aw50"] = 1; + anim.sniperRifles["dragunov"] = 1; + anim.sniperRifles["m14_scoped"] = 1; + anim.sniperRifles["m14_scoped_ghil"] = 1; + anim.sniperRifles["m14_scoped_silencer"] = 1; + anim.sniperRifles["m14_scoped_silencer_woodland"] = 1; + anim.sniperRifles["m14_scoped_woodland"] = 1; + anim.sniperRifles["m40a3"] = 1; + anim.sniperRifles["remington700"] = 1; + anim.sniperRifles["barrett"] = 1; + SetDvar( "scr_expDeathMayMoveCheck", "on" ); + maps\_names::setup_names(); + anim.lastSideStepAnim = 0; + anim.meleeRange = 64; + anim.meleeRangeSq = anim.meleeRange * anim.meleeRange; + anim.standRangeSq = 512*512; + anim.chargeRangeSq = 200*200; + anim.chargeLongRangeSq = 512*512; + anim.aiVsAiMeleeRangeSq = 400*400; + anim.animFlagNameIndex = 0; + if (!IsDefined (level.squadEnt)) + { + level.squadEnt = []; + } + anim.masterGroup["axis"] = SpawnStruct(); + anim.masterGroup["axis"].sightTime = 0; + anim.masterGroup["allies"] = SpawnStruct(); + anim.masterGroup["allies"].sightTime = 0; + anim.scriptSquadGroup = []; + initMoveStartStopTransitions(); + thread setupHats(); + anim.lastUpwardsDeathTime = 0; + anim.backpedalRangeSq = 60*60; + anim.dodgeRangeSq = 300*300; + anim.blindAccuracyMult["allies"] = 0.5; + anim.blindAccuracyMult["axis"] = 0.1; + anim.ramboAccuracyMult = 1.0; + anim.runAccuracyMult = 0.5; + anim.combatMemoryTimeConst = 10000; + anim.combatMemoryTimeRand = 6000; + anim.scriptChange = "script_change"; + anim.grenadeTimers["player_fraggrenade"] = randomIntRange( 1000, 20000 ); + anim.grenadeTimers["player_flash_grenade"] = randomIntRange( 1000, 20000 ); + anim.grenadeTimers["player_double_grenade"] = randomIntRange( 10000, 60000 ); + anim.grenadeTimers["AI_fraggrenade"] = randomIntRange( 0, 20000 ); + anim.grenadeTimers["AI_flash_grenade"] = randomIntRange( 0, 20000 ); + anim.numGrenadesInProgressTowardsPlayer = 0; + anim.lastGrenadeLandedNearPlayerTime = -1000000; + anim.lastFragGrenadeToPlayerStart = -1000000; + thread setNextPlayerGrenadeTime(); + anim.lastGibTime = 0; + anim.gibDelay = 3 * 1000; + anim.minGibs = 2; + anim.maxGibs = 4; + anim.totalGibs = RandomIntRange( anim.minGibs, anim.maxGibs ); + setEnv("none"); + anim.corner_straight_yaw_limit = 36; + if (!IsDefined(anim.optionalStepEffectFunction)) + { + anim.optionalStepEffects = []; + anim.optionalStepEffectFunction = ::empty; + } + anim.notetracks = []; + animscripts\zombie_shared::registerNoteTracks(); + if ( !IsDefined( level.flag ) ) + { + level.flag = []; + level.flags_lock = []; + } + maps\_gameskill::setSkill(undefined,1); + level.painAI = undefined; + animscripts\zombie_SetPoseMovement::InitPoseMovementFunctions(); + animscripts\face::InitLevelFace(); + anim.set_a_b[0] = "a"; + anim.set_a_b[1] = "b"; + anim.set_a_b_c[0] = "a"; + anim.set_a_b_c[1] = "b"; + anim.set_a_b_c[2] = "c"; + anim.set_a_c[0] = "a"; + anim.set_a_c[1] = "c"; + anim.num_to_letter[1] = "a"; + anim.num_to_letter[2] = "b"; + anim.num_to_letter[3] = "c"; + anim.num_to_letter[4] = "d"; + anim.num_to_letter[5] = "e"; + anim.num_to_letter[6] = "f"; + anim.num_to_letter[7] = "g"; + anim.num_to_letter[8] = "h"; + anim.num_to_letter[9] = "i"; + anim.num_to_letter[10] = "j"; + anim.maymoveCheckEnabled = true; + anim.badPlaces = []; + anim.badPlaceInt = 0; + animscripts\squadmanager::init_squadManager(); + anim thread animscripts\battleChatter::bcsDebugWaiter(); + anim.reacquireNum = 0; + initWindowTraverse(); + anim.coverCrouchLeanPitch = -55; + anim.lastCarExplosionTime = -100000; + setupRandomTable(); +} +onPlayerConnect() +{ + player = self; + firstInit(); + player.invul = false; + println("*************************************init::onPlayerConnect"); + player thread animscripts\battlechatter::player_init(); + player thread animscripts\combat_utility::player_init(); + player thread maps\_serverfaceanim::init_serverfaceanim(); + player thread animscripts\combat_utility::watchReloading(); + player thread animscripts\squadManager::addPlayerToSquad(); + player thread animscripts\battleChatter_ai::addToSystem(); +} +setNextPlayerGrenadeTime() +{ + waittillframeend; + if ( IsDefined( anim.playerGrenadeRangeTime ) ) + { + maxTime = int( anim.playerGrenadeRangeTime * 0.7 ); + if ( maxTime < 1 ) + { + maxTime = 1; + } + anim.grenadeTimers["player_fraggrenade"] = randomIntRange( 0, maxTime ); + anim.grenadeTimers["player_flash_grenade"] = randomIntRange( 0, maxTime ); + } + if ( IsDefined( anim.playerDoubleGrenadeTime ) ) + { + maxTime = int( anim.playerDoubleGrenadeTime ); + minTime = int( maxTime / 2 ); + if ( maxTime <= minTime ) + { + maxTime = minTime + 1; + } + anim.grenadeTimers["player_double_grenade"] = randomIntRange( minTime, maxTime ); + } +} +beginGrenadeTracking() +{ + self endon ( "death" ); + for ( ;; ) + { + self waittill ( "grenade_fire", grenade, weaponName ); + grenade thread grenade_earthQuake(); + } +} +setupRandomTable() +{ + anim.randomIntTableSize = 60; + anim.randomIntTable = []; + for ( i = 0; i < anim.randomIntTableSize; i++ ) + { + anim.randomIntTable[i] = i; + } + for ( i = 0; i < anim.randomIntTableSize; i++ ) + { + switchwith = RandomInt( anim.randomIntTableSize ); + temp = anim.randomIntTable[i]; + anim.randomIntTable[i] = anim.randomIntTable[switchwith]; + anim.randomIntTable[switchwith] = temp; + } +} +endOnDeath() +{ + self waittill( "death" ); + waittillframeend; + self notify ( "end_explode" ); +} +grenade_earthQuake() +{ + self thread endOnDeath(); + self endon( "end_explode" ); + self waittill( "explode", position ); + PlayRumbleOnPosition( "grenade_rumble", position ); + earthquake( 0.3, 0.5, position, 400 ); +} +onDeath() +{ + self waittill("death"); + if ( !IsDefined( self ) ) + { + if ( IsDefined( self.a.usingTurret ) ) + { + self.a.usingTurret delete(); + } + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/zombie_melee.gsc b/BO1/PC/ZM/animscripts/zombie_melee.gsc new file mode 100644 index 0000000..788015d --- /dev/null +++ b/BO1/PC/ZM/animscripts/zombie_melee.gsc @@ -0,0 +1,502 @@ +#include maps\_utility; +#include animscripts\zombie_utility; +#include animscripts\zombie_SetPoseMovement; +#include animscripts\Combat_Utility; +#include animscripts\Debug; +#include common_scripts\utility; +#using_animtree ("generic_human"); +MeleeCombat() +{ + self endon( "end_melee" ); + self endon("killanimscript"); + self melee_notify_wrapper(); + assert( CanMeleeAnyRange() ); + if(IsDefined(level.allow_ai_vs_ai_melee )) + { + doingAIMelee = (isAI( self.enemy ) && self.enemy.type == "human"); + } + else + { + doingAIMelee = false; + } + if ( doingAiMelee ) + { + assert( animscripts\zombie_utility::okToMelee( self.enemy ) ); + animscripts\zombie_utility::IAmMeleeing( self.enemy ); + AiVsAiMeleeCombat(); + animscripts\zombie_utility::ImNotMeleeing( self.enemy ); + scriptChange(); + return; + } + realMelee = true; + if ( animscripts\zombie_utility::okToMelee(self.enemy) ) + { + animscripts\zombie_utility::IAmMeleeing(self.enemy); + } + else + { + realMelee = false; + } + self thread EyesAtEnemy(); + self OrientMode("face enemy"); + MeleeDebugPrint("Melee begin"); + self AnimMode( "zonly_physics" ); + resetGiveUpTime(); + for ( ;; ) + { + if ( IsDefined(self.marked_for_death) ) + { + return; + } + MeleeDebugPrint("Melee main loop" + RandomInt(100)); + if ( !realMelee && animscripts\zombie_utility::okToMelee(self.enemy) ) + { + realMelee = true; + animscripts\zombie_utility::IAmMeleeing(self.enemy); + } + self thread EyesAtEnemy(); + self animscripts\battleChatter_ai::evaluateMeleeEvent(); + if( IsDefined( self.enemy ) ) + { + angles = VectorToAngles( self.enemy.origin - self.origin ); + self OrientMode( "face angle", angles[1] ); + } + if( !IsDefined(level.zombietron_mode) ) + { + switch( self.animname ) + { + case "zombie": + self PlaySound( "zmb_vocals_zombie_attack" ); + break; + case "quad_zombie": + self PlaySound( "zmb_vocals_quad_attack" ); + break; + case "boss_zombie": + self PlaySound( "zmb_vocals_boss_attack" ); + break; + case "napalm_zombie": + self PlaySound( "zmb_vocals_napalm_attack" ); + break; + case "sonic_zombie": + self PlaySound( "zmb_vocals_sonic_attack" ); + break; + } + } + if ( is_true( self.noChangeDuringMelee ) ) + { + self.safeToChangeScript = false; + } + zombie_attack = pick_zombie_melee_anim( self ); + if ( isDefined( self.melee_anim_func ) ) + { + self thread [[ self.melee_anim_func ]]( zombie_attack ); + } + self SetFlaggedAnimKnobAllRestart("meleeanim", zombie_attack, %body, 1, .2, 1); + while ( 1 ) + { + self waittill("meleeanim", note); + if ( note == "end" ) + { + break; + } + else if ( note == "fire" ) + { + if ( !IsDefined( self.enemy ) ) + { + break; + } + oldhealth = self.enemy.health; + self melee(); + if ( self.enemy.health < oldhealth ) + { + resetGiveUpTime(); + } + else + { + if ( isDefined( self.melee_miss_func ) ) + { + self [[ self.melee_miss_func ]](); + } + else if ( isDefined( level.melee_miss_func ) ) + { + self [[ level.melee_miss_func ]](); + } + } + } + else if ( note == "stop" ) + { + if ( !CanContinueToMelee() ) + { + break; + } + } + } + self OrientMode("face default"); + if ( is_true( self.noChangeDuringMelee ) ) + { + if ( isDefined( self.enemy ) ) + { + dist_sq = DistanceSquared( self.origin, self.enemy.origin ); + if ( dist_sq > self.meleeAttackDist * self.meleeAttackDist ) + { + self.safeToChangeScript = true; + wait_network_frame(); + break; + } + } + else + { + self.safeToChangeScript = true; + wait_network_frame(); + break; + } + } + } + if (realMelee) + { + animscripts\zombie_utility::ImNotMeleeing(self.enemy); + } + self AnimMode("none"); + self thread animscripts\zombie_combat::main(); + self notify ("stop EyesAtEnemy"); + self notify ("stop_melee_debug_print"); + scriptChange(); +} +resetGiveUpTime() +{ + if ( DistanceSquared( self.origin, self.enemy.origin ) > anim.chargeRangeSq ) + { + self.giveUpOnMeleeTime = GetTime() + randomintrange( 2700, 3300 ); + } + else + { + self.giveUpOnMeleeTime = GetTime() + randomintrange( 1700, 2300 ); + } +} +MeleeDebugPrint(text) +{ + return; + self.meleedebugprint = text; + self thread meleeDebugPrintThreadWrapper(); +} +meleeDebugPrintThreadWrapper() +{ + if ( !IsDefined(self.meleedebugthread) ) + { + self.meleedebugthread = true; + self meleeDebugPrintThread(); + self.meleedebugthread = undefined; + } +} +meleeDebugPrintThread() +{ + self endon("death"); + self endon("killanimscript"); + self endon("stop_melee_debug_print"); + while(1) + { + Print3d(self.origin + (0,0,60), self.meleedebugprint, (1,1,1), 1, .1); + wait .05; + } +} +debug_melee_on_actor() +{ + return false; +} +debug_melee( msg ) +{ + if ( !debug_melee_on_actor() ) + { + return; + } + PrintLn( msg ); +} +debug_melee_line( start, end, color, duration ) +{ +} +CanContinueToMelee() +{ + return CanMeleeInternal( "already started" ); +} +CanMeleeAnyRange() +{ + return CanMeleeInternal( "any range" ); +} +CanMeleeDesperate() +{ + return CanMeleeInternal( "long range" ); +} +CanMelee() +{ + return CanMeleeInternal( "normal" ); +} +CanMeleeInternal( state ) +{ + if ( !IsSentient( self.enemy ) ) + { + debug_melee( "Not doing melee - Does not have a valid target." ); + return false; + } + if (!IsAlive(self.enemy)) + { + return false; + } + if ( IsDefined( self.disableMelee ) ) + { + assert( self.disableMelee ); + debug_melee( "Not doing melee - Melee is disabled, self.disableMelee is set to true." ); + return false; + } + yaw = abs(getYawToEnemy()); + if ( (yaw > 60 && state != "already started") || yaw > 110 ) + { + debug_melee( "Not doing melee - Not facing the enemy." ); + return false; + } + enemyPoint = self.enemy GetOrigin(); + vecToEnemy = enemyPoint - self.origin; + self.enemyDistanceSq = lengthSquared( vecToEnemy ); + nearest_enemy_sqrd_dist = self GetClosestEnemySqDist(); + epsilon = 0.1; + if( IsDefined( nearest_enemy_sqrd_dist ) && ( nearest_enemy_sqrd_dist - epsilon > self.enemyDistanceSq ) ) + { + debug_melee( "Not doing melee - Entity " + self getEntityNumber() + " can't melee entity " + self.enemy getEntityNumber() + " at distSq " + self.enemyDistanceSq + " because there is a closer enemy at distSq " + nearest_enemy_sqrd_dist + "." ); + return false; + } + if(IsDefined(level.allow_ai_vs_ai_melee )) + { + doingAIMelee = (isAI( self.enemy ) && self.enemy.type == "human"); + } + else + { + doingAIMelee = false; + } + if ( doingAIMelee ) + { + if ( !animscripts\zombie_utility::okToMelee(self.enemy) ) + { + debug_melee( "Not doing melee - Enemy is already being meleed." ); + return false; + } + if ( IsDefined( self.magic_bullet_shield ) && self.magic_bullet_shield && IsDefined( self.enemy.magic_bullet_shield ) && self.enemy.magic_bullet_shield ) + { + debug_melee( "Not doing melee - Enemy has magic bullet shield." ); + return false; + } + if ( !isMeleePathClear( vecToEnemy, enemyPoint ) ) + { + return false; + } + } + else + { + if ( IsDefined( self.enemy.magic_bullet_shield ) && self.enemy.magic_bullet_shield ) + { + if ( !( self is_banzai() ) ) + { + debug_melee( "Not doing melee - Enemy has magic bullet shield." ); + return false; + } + } + if (self.enemyDistanceSq <= anim.meleeRangeSq) + { + if ( !isMeleePathClear( vecToEnemy, enemyPoint ) ) + { + if ( !self is_banzai() ) + { + return false; + } + } + return true; + } + else if ( self is_banzai() ) + { + return false; + } + if ( state != "any range" ) + { + chargeRangeSq = anim.chargeRangeSq; + if ( state == "long range" ) + { + chargeRangeSq = anim.chargeLongRangeSq; + } + if (self.enemyDistanceSq > chargeRangeSq) + { + debug_melee( "Not doing melee - Enemy is not close enough to charge." ); + return false; + } + } + if ( state == "already started" ) + { + return false; + } + if ( ( !self is_banzai() || IsPlayer( self.enemy ) ) && IsDefined( self.lastMeleeGiveUpTime ) && GetTime() - self.lastMeleeGiveUpTime < 3000 ) + { + debug_melee( "Not doing melee - Recently meleed someone and missed." ); + return false; + } + if ( !animscripts\zombie_utility::okToMelee(self.enemy) ) + { + debug_melee( "Not doing melee - Enemy is being meleed." ); + return false; + } + if ( is_true( self.check_melee_path ) ) + { + if( !isMeleePathClear( vecToEnemy, enemyPoint ) ) + { + self notify("melee_path_blocked"); + return false; + } + } + } + return true; +} +isMeleePathClear( vecToEnemy, enemyPoint ) +{ + dirToEnemy = VectorNormalize( (vecToEnemy[0], vecToEnemy[1], 0 ) ); + meleePoint = enemyPoint - ( dirToEnemy[0]*28, dirToEnemy[1]*28, 0 ); + thread debug_melee_line( self.origin, meleePoint, ( 1,0,0 ), 1.5 ); + if ( !self IsInGoal( meleePoint ) ) + { + debug_melee( "Not doing melee - Enemy is outside not in goal." ); + return false; + } + if ( self maymovetopoint(meleePoint) ) + { + return true; + } + trace1 = bullettrace( self.origin + (0,0,20), meleePoint + (0,0,20), true, self ); + trace2 = bullettrace( self.origin + (0,0,72), meleePoint + (0,0,72), true, self ); + if ( isDefined(trace1["fraction"]) && trace1["fraction"] == 1 && + isDefined(trace2["fraction"]) && trace2["fraction"] == 1 ) + { + return true; + } + if ( isDefined(trace1["entity"]) && trace1["entity"] == self.enemy && + isDefined(trace2["entity"]) && trace2["entity"] == self.enemy ) + { + return true; + } + if ( is_true( level.zombie_melee_in_water ) ) + { + if ( isDefined( trace1["surfacetype"] ) && trace1["surfacetype"] == "water" && + isDefined( trace2["fraction"] ) && trace2["fraction"] == 1 ) + { + return true; + } + } + debug_melee( "Not doing melee - Can not move to the melee point, MayMoveToPoint failed." ); + return false; +} +PlayMeleeSound() +{ + if ( !IsDefined ( self.a.nextMeleeChargeSound ) ) + { + self.a.nextMeleeChargeSound = 0; + } + if ( GetTime() > self.a.nextMeleeChargeSound ) + { + self animscripts\face::SaySpecificDialogue( undefined, "chr_play_grunt_" + self.voice, 0.3 ); + self.a.nextMeleeChargeSound = GetTime() + 8000; + } +} +AiVsAiMeleeCombat() +{ + self endon("killanimscript"); + self melee_notify_wrapper(); + self OrientMode("face enemy"); + self ClearAnim( %root, 0.3 ); + IWin = ( RandomInt(10) < 8 ); + if ( IsDefined( self.magic_bullet_shield ) && self.magic_bullet_shield ) + { + IWin = true; + } + if ( IsDefined( self.enemy.magic_bullet_shield ) && self.enemy.magic_bullet_shield ) + { + IWin = false; + } + winAnim = %bog_melee_R_attack; + loseAnim = %bog_melee_R_defend; + if ( IWin ) + { + myAnim = winAnim; + theirAnim = loseAnim; + } + else + { + myAnim = loseAnim; + theirAnim = winAnim; + } + desiredDistSqrd = 72 * 72; + self PlayMeleeSound(); + AiVsAiMeleeCharge( desiredDistSqrd ); + if ( DistanceSquared( self.origin, self.enemy.origin ) > desiredDistSqrd ) + { + return false; + } + self.meleePartner = self.enemy; + self.enemy.meleePartner = self; + self.enemy.meleeAnim = theirAnim; + self.enemy animcustom( ::AiVsAiAnimCustom ); + self.meleeAnim = myAnim; + self animcustom( ::AiVsAiAnimCustom ); +} +AiVsAiMeleeCharge( desiredDistSqrd ) +{ + giveUpTime = GetTime() + 2500; + self SetAnimKnobAll( animscripts\zombie_run::GetRunAnim(), %body, 1, 0.2 ); + while ( DistanceSquared( self.origin, self.enemy.origin ) > desiredDistSqrd && GetTime() < giveUpTime ) + { + wait .05; + } +} +AiVsAiAnimCustom() +{ + self endon("killanimscript"); + self AiVsAiMeleeAnim( self.meleeAnim ); +} +AiVsAiMeleeAnim( myAnim ) +{ + self endon("end_melee"); + self thread endMeleeOnKillanimscript(); + partnerDir = self.meleePartner.origin - self.origin; + self OrientMode( "face angle", VectorToAngles( partnerDir )[1] ); + self AnimMode( "zonly_physics" ); + self SetFlaggedAnimKnobAllRestart( "meleeAnim", myAnim, %body, 1, 0.2 ); + self animscripts\zombie_shared::DoNoteTracks( "meleeAnim" ); + self notify("end_melee"); +} +endMeleeOnKillanimscript() +{ + self endon("end_melee"); + self waittill("killanimscript"); + self.meleePartner notify("end_melee"); +} +pick_zombie_melee_anim( zombie_guy ) +{ + melee_anim = undefined; + if ( zombie_guy.has_legs ) + { + switch(zombie_guy.zombie_move_speed) + { + case "walk": + anims = array_combine(level._zombie_melee[zombie_guy.animname],level._zombie_walk_melee[zombie_guy.animname]); + melee_anim = random(anims); + break; + case "run": + case "sprint": + anims = array_combine(level._zombie_melee[zombie_guy.animname],level._zombie_run_melee[zombie_guy.animname]); + melee_anim = random(anims); + break; + } + } + else if(zombie_guy.a.gib_ref == "no_legs") + { + melee_anim = random(level._zombie_stumpy_melee[zombie_guy.animname]); + } + else + { + melee_anim = random(level._zombie_melee_crawl[zombie_guy.animname]); + } + return melee_anim; +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/zombie_move.gsc b/BO1/PC/ZM/animscripts/zombie_move.gsc new file mode 100644 index 0000000..537c57e --- /dev/null +++ b/BO1/PC/ZM/animscripts/zombie_move.gsc @@ -0,0 +1,396 @@ +#include animscripts\zombie_SetPoseMovement; +#include animscripts\combat_utility; +#include animscripts\zombie_utility; +#include animscripts\zombie_shared; +#include common_scripts\utility; +#using_animtree ("generic_human"); +main() +{ + self endon("killanimscript"); + [[ self.exception[ "move" ] ]](); + previousScript = self.a.script; + animscripts\zombie_utility::initialize("zombie_move"); + if (self.moveMode == "run") + { + switch (previousScript) + { + case "combat": + case "stop": + self animscripts\battleChatter_ai::evaluateMoveEvent (false); + break; + case "cover_crouch": + case "cover_left": + case "cover_right": + case "cover_stand": + case "concealment_crouch": + case "concealment_stand": + case "cover_wide_left": + case "cover_wide_right": + case "stalingrad_cover_crouch": + case "Hide": + case "turret": + self animscripts\battleChatter_ai::evaluateMoveEvent (true); + break; + default: + self animscripts\battleChatter_ai::evaluateMoveEvent (false); + break; + } + } + MoveMainLoop(); +} +MoveMainLoop() +{ + prevLoopTime = self getAnimTime( %walk_and_run_loops ); + self.a.runLoopCount = RandomInt( 10000 ); + moveMode = self.moveMode; + if ( IsDefined( self.pathGoalPos ) && DistanceSquared( self.origin, self.pathGoalPos ) < 4096 ) + { + moveMode = "walk"; + } + self.needs_run_update = true; + self sideStepInit(); + for (;;) + { + loopTime = self getAnimTime( %walk_and_run_loops ); + if ( loopTime < prevLoopTime ) + { + self.a.runLoopCount++; + } + prevLoopTime = loopTime; + self animscripts\face::SetIdleFaceDelayed( anim.alertface ); + self animscripts\zombie_run::MoveRun(); + self.exitingCover = false; + self trySideStep(); + } +} +moveAgain() +{ + self notify("killanimscript"); + animscripts\zombie_move::main(); +} +sideStepInit() +{ + self.a.steppedDir = 0; + self.a.lastSideStepTime = GetTime(); + if( !IsDefined( level.sideStepAnims ) ) + { + level.MIN_REACTION_DIST_SQ = 64*64; + level.MAX_REACTION_DIST_SQ = 1000*1000; + level.REACTION_INTERVAL = 2000; + level.SIDE_STEP_CHANCE = 0.7; + level.RIGHT_STEP_CHANCE = 0.5; + level.FORWARD_REACTION_INTERVAL = 2000; + level.FORWARD_MIN_REACTION_DIST_SQ = 120*120; + level.FORWARD_MAX_REACTION_DIST_SQ = 2400*2400; + level.sideStepAnims = []; + level.sideStepAnims["step_left"] = array( %ai_zombie_spets_sidestep_left_a, %ai_zombie_spets_sidestep_left_b ); + level.sideStepAnims["step_right"] = array( %ai_zombie_spets_sidestep_right_a, %ai_zombie_spets_sidestep_right_b ); + level.sideStepAnims["roll_forward"] = array( %ai_zombie_spets_roll_a, %ai_zombie_spets_roll_b, %ai_zombie_spets_roll_c ); + } +} +trySideStep() +{ + if ( isdefined( self.shouldSideStepFunc ) ) + { + self.sideStepType = self [[ self.shouldSideStepFunc ]](); + } + else + { + self.sideStepType = shouldSideStep(); + } + if( self.sideStepType == "none" ) + { + if ( is_true( self.zombie_can_forwardstep ) ) + { + self.sideStepType = shouldForwardStep(); + } + } + if( self.sideStepType == "none" ) + { + return false; + } + self.desiredStepDir = getDesiredSideStepDir( self.sideStepType ); + animName = self.sideStepType + "_" + self.desiredStepDir; + sideStepAnims = level.sideStepAnims; + if ( IsDefined( self.sideStepAnims ) ) + { + sideStepAnims = self.sideStepAnims; + } + self.stepAnim = sideStepAnims[ animName ][RandomInt( sideStepAnims[ animName ].size )]; + assertex( IsDefined(self.stepAnim), "Sidestep anim " + animName + " not found" ); + if ( !self checkRoomForAnim( self.stepAnim ) ) + { + hasRoom = false; + if( self.sideStepType == "roll" && self.desiredStepDir != "forward" ) + { + self.desiredStepDir = "forward"; + animName = self.sideStepType + "_" + self.desiredStepDir; + self.stepAnim = sideStepAnims[ animName ][RandomInt( sideStepAnims[ animName ].size )]; + assertex( IsDefined(self.stepAnim), "Sidestep anim " + animName + " not found" ); + hasRoom = self checkRoomForAnim( self.stepAnim ); + } + if( !hasRoom ) + { + return false; + } + } + self AnimCustom( ::doSideStep ); +} +getDesiredSideStepDir( sideStepType ) +{ + if( sideStepType == "roll" || sideStepType == "phase" ) + { + self.desiredStepDir = "forward"; + return self.desiredStepDir; + } + AssertEx( sideStepType == "step", "Unsupported SideStepType" ); + randomRoll = RandomFloat(1); + if( self.a.steppedDir < 0 ) + { + self.desiredStepDir = "right"; + } + else if( self.a.steppedDir > 0 ) + { + self.desiredStepDir = "left"; + } + else if( randomRoll < level.RIGHT_STEP_CHANCE ) + { + self.desiredStepDir = "right"; + } + else if( randomRoll < level.RIGHT_STEP_CHANCE*2 ) + { + self.desiredStepDir = "left"; + } + return self.desiredStepDir; +} +checkRoomForAnim( stepAnim ) +{ + if ( !self MayMoveFromPointToPoint( self.origin, getAnimEndPos( stepAnim ) ) ) + { + return false; + } + return true; +} +shouldSideStep() +{ + if( canSideStep() && IsPlayer(self.enemy) && self.enemy IsLookingAt(self) ) + { + if( self.zombie_move_speed != "sprint" || RandomFloat(1) < level.SIDE_STEP_CHANCE ) + return "step"; + else + return "roll"; + } + return "none"; +} +canSideStep() +{ + if ( !IsDefined( self.zombie_can_sidestep ) || !self.zombie_can_sidestep ) + { + if( !issubstr( self.classname, "zombie_spetznaz" ) ) + return false; + } + if( GetTime() - self.a.lastSideStepTime < level.REACTION_INTERVAL ) + return false; + if( !IsDefined(self.enemy) ) + return false; + if( self.a.pose != "stand" ) + return false; + distSqFromEnemy = DistanceSquared(self.origin, self.enemy.origin); + if( distSqFromEnemy < level.MIN_REACTION_DIST_SQ ) + { + return false; + } + if( distSqFromEnemy > level.MAX_REACTION_DIST_SQ ) + { + return false; + } + if( !IsDefined(self.pathgoalpos) || DistanceSquared(self.origin, self.pathgoalpos) < level.MIN_REACTION_DIST_SQ ) + { + return false; + } + if( abs(self GetMotionAngle()) > 15 ) + { + return false; + } + yaw = GetYawToOrigin(self.enemy.origin); + if( abs(yaw) > 45 ) + { + return false; + } + return true; +} +shouldForwardStep() +{ + if ( canForwardStep() && IsPlayer( self.enemy ) ) + { + return "phase"; + } + return "none"; +} +canForwardStep() +{ + if ( !isdefined( self.zombie_can_forwardstep ) || !self.zombie_can_forwardstep ) + { + return false; + } + if( GetTime() - self.a.lastSideStepTime < level.FORWARD_REACTION_INTERVAL ) + return false; + if( !IsDefined(self.enemy) ) + return false; + if( self.a.pose != "stand" ) + return false; + distSqFromEnemy = DistanceSquared(self.origin, self.enemy.origin); + if( distSqFromEnemy < level.FORWARD_MIN_REACTION_DIST_SQ ) + { + return false; + } + if( distSqFromEnemy > level.FORWARD_MAX_REACTION_DIST_SQ ) + { + return false; + } + if( !IsDefined(self.pathgoalpos) || DistanceSquared(self.origin, self.pathgoalpos) < level.MIN_REACTION_DIST_SQ ) + { + return false; + } + if( abs(self GetMotionAngle()) > 15 ) + { + return false; + } + yaw = GetYawToOrigin(self.enemy.origin); + if( abs(yaw) > 45 ) + { + return false; + } + return true; +} +doSideStep() +{ + self endon("death"); + self endon("killanimscript"); + playSideStepAnim( self.stepAnim, self.sideStepType ); + if( self.desiredStepDir == "left" ) + { + self.a.steppedDir--; + } + else + { + self.a.steppedDir++; + } + self.a.lastSideStepTime = GetTime(); + return true; +} +playSideStepAnim( stepAnim, sideStepType ) +{ + self AnimMode( "gravity", false ); + self OrientMode( "face angle", self.angles[1] ); + runBlendOutTime = 0.20; + if ( isdefined( self.sideStepFunc ) ) + { + self thread [[ self.sideStepFunc ]]( "stepAnim", stepAnim ); + } + self ClearAnim( %body, runBlendOutTime ); + self SetFlaggedAnimRestart( "stepAnim", stepAnim, 1, runBlendOutTime, self.moveplaybackrate ); + animStartTime = GetTime(); + animLength = GetAnimLength(stepAnim); + hasExitAlign = animHasNotetrack( stepAnim, "exit_align" ); + if ( !hasExitAlign ) + { + println("^1Side step animation has no \"exit_align\" notetrack"); + } + self thread animscripts\shared::DoNoteTracks( "stepAnim" ); + self thread sideStepBlendOut( animLength, "stepAnim", hasExitAlign ); + self.exit_align = false; + self waittillmatch( "stepAnim", "exit_align" ); + self.exit_align = true; + elapsed = (getTime() - animStartTime) / 1000.0; + timeLeft = animLength - elapsed; + hasCodeMoveNoteTrack = animHasNotetrack( stepAnim, "code_move" ); + if( hasCodeMoveNoteTrack ) + { + times = getNotetrackTimes( stepAnim, "code_move" ); + assertEx( times.size == 1, "More than one code_move notetrack found" ); + timeLeft = times[0] * animLength - elapsed; + } + self AnimMode( "pos deltas", false ); + maxYawDelta = 2; + timer = 0; + while( timer < timeLeft ) + { + lookaheadAngles = VectorToAngles( self.lookaheaddir ); + yawDelta = AngleClamp180(lookaheadAngles[1] - self.angles[1]); + if( yawDelta > maxYawDelta ) + { + yawDelta = maxYawDelta; + } + else if( yawDelta < maxYawDelta*-1 ) + { + yawDelta = maxYawDelta*-1; + } + newAngles = (self.angles[0], self.angles[1] + yawDelta, self.angles[2]); + self Teleport( self.origin, newAngles ); + timer += 0.05 * self.moveplaybackrate; + wait( 0.05 ); + } + self OrientMode( "face angle", self.angles[1] ); + elapsed = (getTime() - animStartTime) / 1000.0; + timeLeft = animLength - elapsed; + if( timeLeft > 0 ) + { + wait(timeLeft / self.moveplaybackrate); + } + if( IsAlive(self) ) + { + self thread faceLookaheadForABit(); + restorePain(); + self.deathFunction = maps\_zombiemode_spawner::zombie_death_animscript; + } +} +faceLookaheadForABit() +{ + self endon("death"); + self endon("killanimscript"); + lookaheadAngles = VectorToAngles(self.lookaheaddir); + self OrientMode( "face angle", lookaheadAngles[1] ); + wait(0.2); + self AnimMode( "normal", false ); + self OrientMode( "face default" ); +} +sideStepBlendOut( animLength, animName, hasExitAlign ) +{ + self endon("killanimscript"); + self endon("death"); + self endon("stopTurnBlendOut"); + runBlendInTime = 0.2; + assert( animLength > runBlendInTime ); + wait( (animLength - runBlendInTime) / self.moveplaybackrate ); + if( !hasExitAlign ) + { + self notify( animName, "exit_align" ); + } + self ClearAnim( %exposed_modern, 0 ); + self SetFlaggedAnimKnobAllRestart( "run_anim", animscripts\zombie_run::GetRunAnim(), %body, 1, runBlendInTime, self.moveplaybackrate ); +} +restorePainOnKillanimscript() +{ + self waittill("killanimscript"); + if( IsDefined(self) && IsAlive(self) ) + { + restorePain(); + self.deathFunction = undefined; + } +} +disablePain() +{ + self.a.storedDisablePain = self.a.disablePain; + self.a.storedAllowPain = self.a.allowPain; + self.a.disablePain = true; + self.allowPain = false; +} +restorePain() +{ + if( IsDefined(self.a.storedDisablePain) && IsDefined(self.a.storedAllowPain) ) + { + self.a.disablePain = self.a.storedDisablePain; + self.allowPain = self.a.storedAllowPain; + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/zombie_pain.gsc b/BO1/PC/ZM/animscripts/zombie_pain.gsc new file mode 100644 index 0000000..5f41177 --- /dev/null +++ b/BO1/PC/ZM/animscripts/zombie_pain.gsc @@ -0,0 +1,478 @@ +#include animscripts\zombie_utility; +#include animscripts\weaponList; +#include common_scripts\utility; +#include animscripts\Combat_Utility; +#include maps\_utility; +#using_animtree ("generic_human"); +main() +{ + self SetFlashBanged(false); + if ( IsDefined( self.longDeathStarting ) ) + { + self waittill("killanimscript"); + return; + } + if ( is_true(self.lander_knockdown) && (self.animname == "zombie" || self.animname == "napalm_zombie" || self.animname == "sonic_zombie") ) + { + self playThundergunPainAnim(); + self.lander_knockdown = undefined; + return; + } + if ( IsDefined( self.damageweapon ) && (self.damageweapon == "thundergun_zm" || self.damageweapon == "thundergun_upgraded_zm") && (self.damagemod != "MOD_GRENADE" && self.damagemod != "MOD_GRENADE_SPLASH") && self.animname == "zombie" ) + { + self playThundergunPainAnim(); + return; + } + if ( [[ anim.pain_test ]]() ) + { + return; + } + if ( self.a.disablePain ) + { + return; + } + self notify( "kill_long_death" ); + self.a.painTime = GetTime(); + if( self.a.flamepainTime > self.a.painTime ) + { + return; + } + if (self.a.nextStandingHitDying) + { + self.health = 1; + } + dead = false; + stumble = false; + ratio = self.health / self.maxHealth; + self trackScriptState( "Pain Main", "code" ); + self notify ("anim entered pain"); + self endon("killanimscript"); + animscripts\zombie_utility::initialize("zombie_pain"); + self AnimMode("gravity"); + self animscripts\face::SayGenericDialogue("pain"); + if ( self.damageLocation == "helmet" ) + { + self animscripts\zombie_death::helmetPop(); + } + if ( specialPain( self.a.special ) ) + { + return; + } + self.a.special = "none"; + painAnim = getPainAnim(); + playPainAnim( painAnim ); +} +wasDamagedByExplosive() +{ + if ( self.damageWeapon != "none" ) + { + if ( weaponClass( self.damageWeapon ) == "rocketlauncher" || weaponClass( self.damageWeapon ) == "grenade" || self.damageWeapon == "fraggrenade" || self.damageWeapon == "c4" || self.damageWeapon == "claymore" || self.damageWeapon == "satchel_charge_new" || self.damageWeapon == "frag_grenade_sp") + { + self.mayDoUpwardsDeath = (self.damageTaken > 300); + return true; + } + } + if ( GetTime() - anim.lastCarExplosionTime <= 50 ) + { + rangesq = anim.lastCarExplosionRange * anim.lastCarExplosionRange * 1.2 * 1.2; + if ( DistanceSquared( self.origin, anim.lastCarExplosionDamageLocation ) < rangesq ) + { + upwardsDeathRangeSq = rangesq * 0.5 * 0.5; + self.mayDoUpwardsDeath = (DistanceSquared( self.origin, anim.lastCarExplosionLocation ) < upwardsDeathRangeSq ); + return true; + } + } + return false; +} +getPainAnim() +{ + if ( self.a.pose == "stand" ) + { + if( IsDefined( self.damagemod ) && self.damagemod == "MOD_BURNED" ) + { + return get_flamethrower_pain(); + } + else if ( self.a.movement == "run" && (self getMotionAngle()<60) && (self getMotionAngle()>-60) ) + { + return getRunningForwardPainAnim(); + } + self.a.movement = "stop"; + return getStandPainAnim(); + } + else if ( self.a.pose == "crouch" ) + { + if( IsDefined( self.damagemod ) && self.damagemod == "MOD_BURNED" ) + { + return get_flamethrower_crouch_pain(); + } + self.a.movement = "stop"; + return getCrouchPainAnim(); + } + else + { + assert( self.a.pose == "back" ); + self.a.movement = "stop"; + return %back_pain; + } +} +get_flamethrower_pain() +{ + painArray = array( %ai_flame_wounded_stand_a, %ai_flame_wounded_stand_b, %ai_flame_wounded_stand_c, %ai_flame_wounded_stand_d ); + tagArray = array( "J_Elbow_RI", "J_Wrist_LE", "J_Wrist_RI", "J_Head" ); + painArray = removeBlockedAnims( painArray ); + if ( !painArray.size ) + { + self.a.movement = "stop"; + return getStandPainAnim(); + } + anim_num = RandomInt( painArray.size ); + if( self.team == "axis" && IsDefined( level._effect["character_fire_pain_sm"] ) ) + { + PlayFxOnTag( level._effect["character_fire_pain_sm"], self, tagArray[anim_num] ); + } + else + { + } + pain_anim = painArray[anim_num]; + time = GetAnimLength( pain_anim ); + self.a.flamepainTime = GetTime() + ( time * 1000 ); + return pain_anim; +} +get_flamethrower_crouch_pain() +{ + painArray = array( %ai_flame_wounded_crouch_a, %ai_flame_wounded_crouch_b, %ai_flame_wounded_crouch_c, %ai_flame_wounded_crouch_d ); + tagArray = array( "J_Elbow_LE", "J_Wrist_LE", "J_Wrist_RI", "J_Head" ); + painArray = removeBlockedAnims( painArray ); + if ( !painArray.size ) + { + self.a.movement = "stop"; + return getStandPainAnim(); + } + anim_num = RandomInt( painArray.size ); + if( self.team == "axis" && IsDefined( level._effect["character_fire_pain_sm"] ) ) + { + PlayFxOnTag( level._effect["character_fire_pain_sm"], self, tagArray[anim_num] ); + } + else + { + } + pain_anim = painArray[anim_num]; + time = GetAnimLength( pain_anim ); + self.a.flamepainTime = GetTime() + ( time * 1000 ); + return pain_anim; +} +getRunningForwardPainAnim() +{ + painArray = array( %run_pain_fallonknee, %run_pain_fallonknee_02, %run_pain_fallonknee_03, %run_pain_stomach, %run_pain_stumble ); + painArray = removeBlockedAnims( painArray ); + if ( !painArray.size ) + { + self.a.movement = "stop"; + return getStandPainAnim(); + } + return painArray[ RandomInt( painArray.size ) ]; +} +getStandPainAnim() +{ + painArray = []; + damageAmount = self.damageTaken / self.maxhealth; + if ( damageAmount > .4 && !damageLocationIsAny( "left_hand", "right_hand", "left_foot", "right_foot", "helmet" ) ) + { + painArray[painArray.size] = %exposed_pain_2_crouch; + } + if ( self damageLocationIsAny( "torso_upper", "torso_lower", "left_arm_upper", "right_arm_upper", "neck" ) ) + { + painArray[painArray.size] = %exposed_pain_back; + } + if ( self damageLocationIsAny( "right_hand", "right_arm_upper", "right_arm_lower", "torso_upper" ) ) + { + painArray[painArray.size] = %exposed_pain_dropgun; + } + if ( self damageLocationIsAny( "torso_lower", "left_leg_upper", "right_leg_upper" ) ) + { + painArray[painArray.size] = %exposed_pain_groin; + } + if ( self damageLocationIsAny( "left_hand", "left_arm_lower", "left_arm_upper" ) ) + { + painArray[painArray.size] = %exposed_pain_left_arm; + } + if ( self damageLocationIsAny( "right_hand", "right_arm_lower", "right_arm_upper" ) ) + { + painArray[painArray.size] = %exposed_pain_right_arm; + } + if ( self damageLocationIsAny( "left_foot", "right_foot", "left_leg_lower", "right_leg_lower", "left_leg_upper", "right_leg_upper" ) ) + { + painArray[painArray.size] = %exposed_pain_leg; + } + if ( painArray.size < 2 ) + { + painArray[painArray.size] = %exposed_pain_back; + } + if ( painArray.size < 2 ) + { + painArray[painArray.size] = %exposed_pain_dropgun; + } + assertex( painArray.size > 0, painArray.size ); + return painArray[ RandomInt( painArray.size ) ]; +} +removeBlockedAnims( array ) +{ + newArray = []; + for ( index = 0; index < array.size; index++ ) + { + localDeltaVector = getMoveDelta( array[index], 0, 1 ); + endPoint = self localToWorldCoords( localDeltaVector ); + if ( self mayMoveToPoint( endPoint ) ) + { + newArray[newArray.size] = array[index]; + } + } + return newArray; +} +getCrouchPainAnim() +{ + painArray = []; + if ( damageLocationIsAny( "torso_upper", "torso_lower", "left_arm_upper", "right_arm_upper", "neck" ) ) + { + painArray[painArray.size] = %exposed_crouch_pain_chest; + } + if ( damageLocationIsAny( "head", "neck", "torso_upper" ) ) + { + painArray[painArray.size] = %exposed_crouch_pain_headsnap; + } + if ( damageLocationIsAny( "left_hand", "left_arm_lower", "left_arm_upper" ) ) + { + painArray[painArray.size] = %exposed_crouch_pain_left_arm; + } + if ( damageLocationIsAny( "right_hand", "right_arm_lower", "right_arm_upper" ) ) + { + painArray[painArray.size] = %exposed_crouch_pain_right_arm; + } + if ( painArray.size < 2 ) + { + painArray[painArray.size] = %exposed_crouch_pain_flinch; + } + if ( painArray.size < 2 ) + { + painArray[painArray.size] = %exposed_crouch_pain_chest; + } + assertex( painArray.size > 0, painArray.size ); + return painArray[ RandomInt( painArray.size ) ]; +} +playPainAnim( painAnim ) +{ + if ( IsDefined( self.magic_bullet_shield ) ) + { + rate = 1.5; + } + else + { + rate = self.animPlayBackRate; + } + self SetFlaggedAnimKnobAllRestart( "painanim", painAnim, %body, 1, .1, rate ); + self animscripts\zombie_shared::DoNoteTracks( "painanim" ); +} +playThundergunPainAnim() +{ + self notify( "end_play_thundergun_pain_anim" ); + self endon( "killanimscript" ); + self endon( "death" ); + self endon( "end_play_thundergun_pain_anim" ); + if( isDefined( self.marked_for_death ) && self.marked_for_death ) + { + return; + } + if ( self.damageYaw <= -135 || self.damageYaw >= 135 ) + { + if ( !self.has_legs ) + { + fallAnim = random( level._zombie_knockdowns[self.animname]["front"]["no_legs"] ); + if ( isdefined( level.thundergun_last_knockdown_anim ) && level.thundergun_last_knockdown_anim == fallAnim ) + { + fallAnim = random( level._zombie_knockdowns[self.animname]["front"]["no_legs"] ); + } + } + else + { + fallAnim = random( level._zombie_knockdowns[self.animname]["front"]["has_legs"] ); + if ( isdefined( level.thundergun_last_knockdown_anim ) && level.thundergun_last_knockdown_anim == fallAnim ) + { + fallAnim = random( level._zombie_knockdowns[self.animname]["front"]["has_legs"] ); + } + } + level.thundergun_last_knockdown_anim = fallAnim; + if ( fallAnim == %ai_zombie_thundergun_hit_deadfallknee || fallAnim == %ai_zombie_thundergun_hit_forwardtoface ) + { + getupAnim = random( level._zombie_getups[self.animname]["belly"]["early"] ); + } + else + { + getupAnim = random( level._zombie_getups[self.animname]["back"]["early"] ); + } + } + else if ( self.damageYaw > -135 && self.damageYaw < -45 ) + { + fallAnim = random( level._zombie_knockdowns[self.animname]["left"] ); + getupAnim = random( level._zombie_getups[self.animname]["belly"]["early"] ); + } + else if ( self.damageYaw > 45 && self.damageYaw < 135 ) + { + fallAnim = random( level._zombie_knockdowns[self.animname]["right"] ); + getupAnim = random( level._zombie_getups[self.animname]["belly"]["early"] ); + } + else + { + fallAnim = random( level._zombie_knockdowns[self.animname]["back"] ); + getupAnim = random( level._zombie_getups[self.animname]["belly"]["early"] ); + } + self SetFlaggedAnimKnobAllRestart( "painanim", fallAnim, %body, 1, .2, self.animPlayBackRate ); + self animscripts\zombie_shared::DoNoteTracks( "painanim", self.thundergun_handle_pain_notetracks ); + if( !IsDefined( self ) || !IsAlive( self ) || !self.has_legs || (isDefined( self.marked_for_death ) && self.marked_for_death) ) + { + return; + } + if ( getupAnim == %ai_zombie_thundergun_getup_quick_a && (self.a.gib_ref == "left_arm" || self.a.gib_ref == "right_arm") ) + { + return; + } + self SetFlaggedAnimKnobAllRestart( "painanim", getupAnim, %body, 1, .2, self.animPlayBackRate ); + self animscripts\zombie_shared::DoNoteTracks( "painanim" ); +} +specialPain( anim_special ) +{ + if (anim_special == "none") + { + return false; + } + switch ( anim_special ) + { + case "cover_left": + if (self.a.pose == "stand") + { + painArray = []; + if ( self damageLocationIsAny("torso_lower", "left_leg_upper", "right_leg_upper") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %corner_standl_painB; + } + if ( self damageLocationIsAny("torso_lower", "torso_upper", "left_arm_upper", "right_arm_upper", "neck") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %corner_standl_painC; + } + if ( self damageLocationIsAny("left_leg_upper", "left_leg_lower", "left_foot") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %corner_standl_painD; + } + if ( self damageLocationIsAny("right_leg_upper", "right_leg_lower", "right_foot") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %corner_standl_painE; + } + if ( painArray.size < 2 ) + { + painArray[painArray.size] = %corner_standl_pain; + } + DoPainFromArray(painArray); + handled = true; + } + else + { + handled = false; + } + break; + case "cover_right": + if (self.a.pose == "stand") + { + painArray = []; + if ( self damageLocationIsAny("right_arm_upper", "torso_upper", "neck") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %corner_standr_pain; + } + if ( self damageLocationIsAny("right_leg_upper", "right_leg_lower", "right_foot") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %corner_standr_painB; + } + if ( self damageLocationIsAny("torso_lower", "left_leg_upper", "right_leg_upper") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %corner_standr_painC; + } + if ( painArray.size == 0 ) + { + painArray[0] = %corner_standr_pain; + painArray[1] = %corner_standr_painB; + painArray[2] = %corner_standr_painC; + } + DoPainFromArray(painArray); + handled = true; + } + else + { + handled = false; + } + break; + case "cover_crouch": + handled = false; + break; + case "cover_stand": + painArray = []; + if ( self damageLocationIsAny("torso_lower", "left_leg_upper", "right_leg_upper") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %coverstand_pain_groin; + } + if ( self damageLocationIsAny("torso_lower", "torso_upper", "left_arm_upper", "right_arm_upper", "neck") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %coverstand_pain_groin; + } + if ( self damageLocationIsAny("left_leg_upper", "left_leg_lower", "left_foot") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %coverstand_pain_leg; + } + if ( self damageLocationIsAny("right_leg_upper", "right_leg_lower", "right_foot") || RandomFloat(10) < 3 ) + { + painArray[painArray.size] = %coverstand_pain_leg; + } + if ( painArray.size < 2 ) + { + painArray[painArray.size] = %coverstand_pain_leg; + } + DoPainFromArray(painArray); + handled = true; + break; + case "saw": + if ( self.a.pose == "stand" ) + { + painAnim = %saw_gunner_pain; + } + else + { + painAnim = %saw_gunner_lowwall_pain_02; + } + self SetFlaggedAnimKnob( "painanim", painAnim, 1, .3, 1); + self animscripts\zombie_shared::DoNoteTracks ("painanim"); + handled = true; + break; + case "mg42": + mg42pain( self.a.pose ); + handled = true; + break; + case "corner_right_mode_b": + case "rambo_left": + case "rambo_right": + case "rambo": + handled = false; + break; + default: + println ("Unexpected anim_special value : "+anim_special+" in specialPain."); + handled = false; + } + return handled; +} +DoPainFromArray( painArray ) +{ + painAnim = painArray[RandomInt(painArray.size)]; + self SetFlaggedAnimKnob( "painanim", painAnim, 1, .3, 1); + self animscripts\zombie_shared::DoNoteTracks ("painanim"); +} +mg42pain( pose ) +{ + self SetFlaggedAnimKnob( "painanim", level.mg_animmg[ "pain_" + pose ], 1, .1, 1); + self animscripts\zombie_shared::DoNoteTracks ("painanim"); +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/zombie_run.gsc b/BO1/PC/ZM/animscripts/zombie_run.gsc new file mode 100644 index 0000000..8b4a7b7 --- /dev/null +++ b/BO1/PC/ZM/animscripts/zombie_run.gsc @@ -0,0 +1,340 @@ +#include animscripts\zombie_utility; +#include animscripts\Combat_Utility; +#include animscripts\zombie_SetPoseMovement; +#include animscripts\debug; +#include common_scripts\utility; +#using_animtree ("generic_human"); +MoveRun() +{ + desiredPose = self animscripts\zombie_utility::choosePose( "stand" ); + switch ( desiredPose ) + { + case "stand": + if ( BeginStandRun() ) + { + return; + } + if ( self animscripts\zombie_utility::IsInCombat() ) + { + if ( IsDefined( self.run_combatanim ) ) + { + MoveStandCombatOverride(); + } + else + { + MoveStandCombatNormal(); + } + } + else + { + if ( IsDefined( self.run_noncombatanim ) ) + { + MoveStandNoncombatOverride(); + } + else + { + MoveStandNoncombatNormal(); + } + } + break; + case "crouch": + if ( BeginCrouchRun() ) + { + return; + } + if ( IsDefined( self.crouchrun_combatanim ) ) + { + MoveCrouchRunOverride(); + } + else + { + MoveCrouchRunNormal(); + } + break; + default: + break; + } +} +GetRunAnim() +{ + run_anim = undefined; + if ( IsDefined( self.a.combatRunAnim ) ) + { + run_anim = self.a.combatRunAnim; + } + else + { + run_anim = %run_lowready_F; + } + assertex(IsDefined(run_anim), "run.gsc - No run animation for this AI."); + return run_anim; +} +GetCrouchRunAnim() +{ + if ( IsDefined( self.a.crouchRunAnim ) ) + { + return self.a.crouchRunAnim; + } + return %crouch_fastwalk_F; +} +MoveStandCombatOverride() +{ + if( IsDefined( self.needs_run_update ) && !self.needs_run_update ) + { + wait( GetRunAnimUpdateFrequency() ); + return; + } + self ClearAnim(%combatrun, 0.2); + self SetAnimKnobAll(%combatrun, %body, 1, 0.2, self.moveplaybackrate); + self SetFlaggedAnimKnob("runanim", self.run_combatanim, 1, 0.2, self.moveplaybackrate); + animscripts\zombie_shared::DoNoteTracksForTime(getRunAnimUpdateFrequency(), "runanim"); + self.needs_run_update = false; +} +MoveStandCombatNormal() +{ + self ClearAnim( %walk_and_run_loops, 0.2 ); + self setanimknob( %combatrun, 1.0, 0.2, self.moveplaybackrate ); + decidedAnimation = false; + if ( IsDefined( self.sprint ) && self.sprint ) + { + self SetFlaggedAnimKnob("runanim", %sprint1_loop, 1, 0.2, self.moveplaybackrate ); + decidedAnimation = true; + } + if ( !decidedAnimation ) + { + runAnim = GetRunAnim(); + self SetFlaggedAnimKnob ("runanim", runAnim, 1, self.a.runBlendTime, self.moveplaybackrate ); + } + useLeans = GetDvarInt( #"ai_useLeanRunAnimations"); + if( useLeans && self.isfacingmotion ) + { + self UpdateRunWeightsOnce( + %combatrun_forward, + %run_lowready_B, + %ai_run_lowready_f_lean_l, + %ai_run_lowready_f_lean_r + ); + } + else + { + self UpdateRunWeightsOnce( + %combatrun_forward, + %run_lowready_B, + %run_lowready_L, + %run_lowready_R + ); + } + animscripts\zombie_shared::DoNoteTracksForTime(getRunAnimUpdateFrequency(), "runanim"); + self notify("stopRunning"); +} +MoveStandNoncombatOverride() +{ + self endon("movemode"); + if( IsDefined( self.needs_run_update ) && !self.needs_run_update ) + { + wait( GetRunAnimUpdateFrequency() ); + return; + } + self ClearAnim(%combatrun, 0.6); + self SetFlaggedAnimKnobAll("runanim", self.run_noncombatanim, %body, 1, 0.2, self.moveplaybackrate ); + animscripts\zombie_shared::DoNoteTracksForTime(0.2, "runanim"); + self.needs_run_update = false; +} +MoveStandNoncombatNormal() +{ + self endon("movemode"); + self ClearAnim(%combatrun, 0.6); + self SetAnimKnobAll(%combatrun, %body, 1, 0.2, self.moveplaybackrate); + prerunAnim = GetRunAnim(); + self SetFlaggedAnimKnob("runanim", prerunAnim, 1, 0.2); + useLeans = GetDvarInt( #"ai_useLeanRunAnimations"); + if( useLeans && self.isfacingmotion ) + { + self UpdateRunWeightsOnce( + %combatrun_forward, + %run_lowready_B, + %ai_run_lowready_f_lean_l, + %ai_run_lowready_f_lean_r + ); + } + else + { + self UpdateRunWeightsOnce( + %combatrun_forward, + %run_lowready_B, + %run_lowready_L, + %run_lowready_R + ); + } + animscripts\zombie_shared::DoNoteTracksForTime(getRunAnimUpdateFrequency(), "runanim"); +} +MoveCrouchRunOverride() +{ + self endon("movemode"); + if( IsDefined( self.needs_run_update ) && !self.needs_run_update ) + { + wait( GetRunAnimUpdateFrequency() ); + return; + } + self SetFlaggedAnimKnobAll("runanim", self.crouchrun_combatanim, %body, 1, 0.2, self.moveplaybackrate); + animscripts\zombie_shared::DoNoteTracksForTime(0.2, "runanim"); + self.needs_run_update = false; +} +MoveCrouchRunNormal() +{ + self endon("movemode"); + if( IsDefined( self.needs_run_update ) && !self.needs_run_update ) + { + wait( GetRunAnimUpdateFrequency() ); + return; + } + forward_anim = GetCrouchRunAnim(); + self setanimknob( forward_anim, 1, 0.2 ); + animWeights = animscripts\zombie_utility::QuadrantAnimWeights( self getMotionAngle() ); + self SetAnim(forward_anim , animWeights["front"], 0.2, 1); + self SetAnim(%crouch_fastwalk_B, animWeights["back"], 0.2, 1); + self SetAnim(%crouch_fastwalk_L, animWeights["left"], 0.2, 1); + self SetAnim(%crouch_fastwalk_R, animWeights["right"], 0.2, 1); + self SetFlaggedAnimKnobAll("runanim", %combatrun_forward, %body, 1, 0.2, self.moveplaybackrate); + animscripts\zombie_shared::DoNoteTracksForTime(0.2, "runanim"); + self.needs_run_update = false; +} +runLoopIsNearBeginning() +{ + animfraction = self getAnimTime( %walk_and_run_loops ); + loopLength = getAnimLength( animscripts\zombie_run::GetRunAnim() ) / 3.0; + animfraction *= 3.0; + if ( animfraction > 3 ) + { + animfraction -= 2.0; + } + else if ( animfraction > 2 ) + { + animfraction -= 1.0; + } + if ( animfraction < .15 / loopLength ) + { + return true; + } + if ( animfraction > 1 - .3 / loopLength ) + { + return true; + } + return false; +} +UpdateRunWeights(notifyString, frontAnim, backAnim, leftAnim, rightAnim) +{ + self endon("killanimscript"); + self endon(notifyString); + if ( GetTime() == self.a.scriptStartTime ) + { + UpdateRunWeightsOnce( frontAnim, backAnim, leftAnim, rightAnim ); + wait 0.05; + } + for (;;) + { + UpdateRunWeightsOnce( frontAnim, backAnim, leftAnim, rightAnim ); + wait getRunAnimUpdateFrequency(); + } +} +GetLookaheadAngle() +{ + yawDiff = VectorToAngles(self.lookaheaddir)[1] - self.angles[1]; + yawDiff = yawDiff * (1.0 / 360.0); + yawDiff = (yawDiff - floor(yawDiff + 0.5)) * 360.0; + return yawDiff; +} +UpdateRunWeightsOnce( frontAnim, backAnim, leftAnim, rightAnim ) +{ + blendTime = 0.2; + rate = 1; + yawDiff = 0; + useLeans = GetDvarInt( #"ai_useLeanRunAnimations"); + if( IsDefined( self.needs_run_update ) && !self.needs_run_update ) + { + wait( GetRunAnimUpdateFrequency() ); + return; + } + if(useLeans && self.isfacingmotion) + { + yawDiff = self GetLookaheadAngle(); + animWeights = animscripts\zombie_utility::QuadrantAnimWeights( yawDiff ); + tempYawDiff = yawDiff; + if( tempYawDiff < 0 ) + tempYawDiff *= -1; + minYaw = GetDvarFloat( #"ai_slowdownMinYawDiff"); + if( tempYawDiff >= minYaw ) + { + maxYaw = GetDvarFloat( #"ai_slowdownMaxYawDiff"); + if( tempYawDiff > maxYaw ) + tempYawDiff = maxYaw; + maxYaw -= minYaw; + tempYawDiff -= minYaw; + minRate = GetDvarFloat( #"ai_slowdownMinRate"); + rate = minRate + (1 - minRate) * ((maxYaw - tempYawDiff) / maxYaw); + } + } + else + { + yawDiff = self getMotionAngle(); + animWeights = animscripts\zombie_utility::QuadrantAnimWeights( yawDiff ); + } + if( IsDefined(self.lastRunRate) ) + { + rateBlendFactor = GetDvarFloat( #"ai_slowdownRateBlendFactor"); + rate = rate * rateBlendFactor + (1-rateBlendFactor) * self.lastRunRate; + } + self.lastRunRate = rate; + if( useLeans && animWeights["back"] > 0 ) + { + animWeights["left"] = 0; + animWeights["right"] = 0; + animWeights["back"] = 1; + } + self SetAnim(frontAnim, animWeights["front"], blendTime, rate ); + self SetAnim(backAnim, animWeights["back"] , blendTime, rate ); + self SetAnim(leftAnim, animWeights["left"] , blendTime, rate ); + self SetAnim(rightAnim, animWeights["right"], blendTime, rate ); + self.needs_run_update = false; +} +UpdateRunWeightsBiasForward(notifyString, frontAnim, backAnim, leftAnim, rightAnim) +{ + self endon("killanimscript"); + self endon(notifyString); + for (;;) + { + animWeights = animscripts\zombie_utility::QuadrantAnimWeights( self getMotionAngle() ); + if ( animWeights["front"] < .2 ) + { + animWeights["front"] = .2; + if ( animWeights["front"] < 0 ) + { + animWeights["left"] = 0.0; + animWeights["right"] = 0.0; + } + } + self SetAnim(frontAnim, animWeights["front"], 0.2, 1); + self SetAnim(backAnim, 0.0 , 0.2, 1); + self SetAnim(leftAnim, animWeights["left"] , 0.2, 1); + self SetAnim(rightAnim, animWeights["right"], 0.2, 1); + wait getRunAnimUpdateFrequency(); + } +} +MakeRunSounds ( notifyString ) +{ + self endon("killanimscript"); + self endon(notifyString); + for (;;) + { + wait .5; + self PlaySound ("fly_step_run_npc_concrete"); + wait .5; + self PlaySound ("fly_step_run_npc_concrete"); + } +} +getRunAnimUpdateFrequency() +{ + return GetDvarFloat( #"ai_runAnimUpdateFrequency"); +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/zombie_scripted.gsc b/BO1/PC/ZM/animscripts/zombie_scripted.gsc new file mode 100644 index 0000000..2ae5e01 Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_scripted.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_setposemovement.gsc b/BO1/PC/ZM/animscripts/zombie_setposemovement.gsc new file mode 100644 index 0000000..d0eb670 --- /dev/null +++ b/BO1/PC/ZM/animscripts/zombie_setposemovement.gsc @@ -0,0 +1,554 @@ + +#include animscripts\zombie_Utility; +#include maps\_Utility; +#include common_scripts\utility; +#using_animtree ("generic_human"); +SetPoseMovement(desiredPose, desiredMovement) +{ + if (desiredPose=="") + { + desiredPose = self.a.pose; + } + if (!IsDefined(desiredMovement) || desiredMovement=="") + { + desiredMovement = self.a.movement; + } + [[anim.SetPoseMovementFnArray[desiredPose][desiredMovement]]](); +} +InitPoseMovementFunctions() +{ + anim.SetPoseMovementFnArray["stand"]["stop"] = ::BeginStandStop; + anim.SetPoseMovementFnArray["stand"]["walk"] = ::BeginStandWalk; + anim.SetPoseMovementFnArray["stand"]["run"] = ::BeginStandRun; + anim.SetPoseMovementFnArray["crouch"]["stop"] = ::BeginCrouchStop; + anim.SetPoseMovementFnArray["crouch"]["walk"] = ::BeginCrouchWalk; + anim.SetPoseMovementFnArray["crouch"]["run"] = ::BeginCrouchRun; +} +BeginStandStop() +{ + switch (self.a.pose) + { + case "stand": + switch (self.a.movement) + { + case "stop": + return false; + case "walk": + StandWalkToStand(); + break; + default: + assert(self.a.movement == "run"); + StandRunToStand(); + break; + } + break; + case "crouch": + switch (self.a.movement) + { + case "stop": + CrouchToStand(); + break; + case "walk": + CrouchWalkToStand(); + break; + default: + assert(self.a.movement == "run"); + CrouchRunToStand(); + break; + } + break; + default: + assertEX(0, "SetPoseMovement::BeginStandStop "+self.a.pose+" "+self.a.movement); + break; + } + return true; +} +BeginStandWalk() +{ + switch (self.a.pose) + { + case "stand": + switch (self.a.movement) + { + case "stop": + BlendIntoStandWalk(); + break; + case "walk": + return false; + default: + assert(self.a.movement == "run"); + BlendIntoStandWalk(); + break; + } + break; + case "crouch": + switch (self.a.movement) + { + case "stop": + CrouchToStandWalk(); + break; + case "walk": + BlendIntoStandWalk(); + break; + default: + assert(self.a.movement == "run"); + BlendIntoStandWalk(); + break; + } + break; + default: + assertEX(0, "SetPoseMovement::BeginStandWalk "+self.a.pose+" "+self.a.movement); + break; + } + return true; +} +BeginStandRun() +{ + switch (self.a.pose) + { + case "stand": + switch (self.a.movement) + { + case "stop": + BlendIntoStandRun(); + break; + case "walk": + BlendIntoStandRun(); + break; + default: + assert(self.a.movement == "run"); + return false; + } + break; + case "crouch": + switch (self.a.movement) + { + case "stop": + CrouchToStandRun(); + break; + default: + assert(self.a.movement == "run" || self.a.movement == "walk"); + BlendIntoStandRun(); + break; + } + break; + default: + assertEX(0, "SetPoseMovement::BeginStandRun "+self.a.pose+" "+self.a.movement); + break; + } + return true; +} +BeginCrouchStop() +{ + switch (self.a.pose) + { + case "stand": + switch (self.a.movement) + { + case "stop": + StandToCrouch(); + break; + case "walk": + StandWalkToCrouch(); + break; + case "run": + StandRunToCrouch(); + break; + default: + assertEX(0, "SetPoseMovement::BeginCrouchStop "+self.a.pose+" "+self.a.movement); + } + break; + case "crouch": + switch (self.a.movement) + { + case "stop": + break; + case "walk": + CrouchWalkToCrouch(); + break; + case "run": + CrouchRunToCrouch(); + break; + default: + assertEX(0, "SetPoseMovement::BeginCrouchStop "+self.a.pose+" "+self.a.movement); + } + break; + default: + assertEX(0, "SetPoseMovement::BeginCrouchStop "+self.a.pose+" "+self.a.movement); + } +} +BeginCrouchWalk() +{ + switch (self.a.pose) + { + case "stand": + switch (self.a.movement) + { + case "stop": + BlendIntoStandWalk(); + BlendIntoCrouchWalk(); + break; + case "walk": + BlendIntoCrouchWalk(); + break; + default: + assert(self.a.movement == "run"); + BlendIntoCrouchWalk(); + break; + } + break; + case "crouch": + switch (self.a.movement) + { + case "stop": + CrouchToCrouchWalk(); + break; + case "walk": + return false; + default: + assert(self.a.movement == "run"); + BlendIntoCrouchWalk(); + break; + } + break; + default: + assertEX(0, "SetPoseMovement::BeginCrouchWalk "+self.a.pose+" "+self.a.movement); + break; + } + return true; +} +BeginCrouchRun() +{ + switch (self.a.pose) + { + case "stand": + switch (self.a.movement) + { + case "stop": + BlendIntoStandRun(); + BlendIntoCrouchRun(); + break; + default: + assert(self.a.movement == "run" || self.a.movement == "walk"); + BlendIntoCrouchRun(); + break; + } + break; + case "crouch": + switch (self.a.movement) + { + case "stop": + CrouchToCrouchRun(); + break; + case "walk": + BlendIntoCrouchRun(); + break; + default: + assert(self.a.movement == "run"); + return false; + } + break; + default: + assertEX(0, "SetPoseMovement::BeginCrouchRun "+self.a.pose+" "+self.a.movement); + break; + } + return true; +} +PlayBlendTransition( transAnim, crossblendTime, endPose, endMovement ) +{ + endTime = GetTime() + crossblendTime * 1000; + self SetFlaggedAnimKnobAll( "blendTransition", transAnim, %body, 1, crossblendTime, 1 ); + wait crossblendTime / 2; + self.a.pose = endPose; + self.a.movement = endMovement; + self.a.alertness = "casual"; + waittime = (endTime - GetTime()) / 1000; + if ( waittime < 0.05 ) + { + waittime = 0.05; + } + wait waittime; +} +PlayTransitionStandWalk(transAnim, finalAnim) +{ + PlayTransitionAnimation(transAnim, "stand", "walk", 1, finalAnim); +} +StandWalkToStand() +{ + assertEX(self.a.pose == "stand", "SetPoseMovement::StandWalkToStand "+self.a.pose); + assertEX(self.a.movement == "walk", "SetPoseMovement::StandWalkToStand "+self.a.movement); + self.a.movement = "stop"; +} +StandWalkToCrouch() +{ + StandWalkToStand(); + StandToCrouch(); +} +StandRunToStand() +{ + assertEX(self.a.pose == "stand", "SetPoseMovement::StandRunToStand "+self.a.pose); + assertEX(self.a.movement == "run", "SetPoseMovement::StandRunToStand "+self.a.movement); + self.a.movement = "stop"; +} +StandRunToCrouch() +{ + self.a.movement = "stop"; + self.a.pose = "crouch"; +} +PlayBlendTransitionStandRun(animname) +{ + transtime = 0.2; + PlayBlendTransition(animname, transtime, "stand", "run"); +} +BlendIntoStandRun() +{ + if ( self animscripts\utility::IsInCombat() ) + { + if (IsDefined(self.run_combatanim)) + { + PlayBlendTransitionStandRun(self.run_combatanim); + } + else + { + self SetAnimKnobLimited( animscripts\zombie_run::GetRunAnim(), 1, 0.2, 1 ); + useLeans = GetDvarInt( #"ai_useLeanRunAnimations"); + if( useLeans && self.isfacingmotion ) + { + self thread animscripts\zombie_run::UpdateRunWeights( "BlendIntoStandRun", + %combatrun_forward, + %run_lowready_B, + %ai_run_lowready_f_lean_l, + %ai_run_lowready_f_lean_r + ); + } + else + { + self thread animscripts\zombie_run::UpdateRunWeights( "BlendIntoStandRun", + %combatrun_forward, + %run_lowready_B, + %run_lowready_L, + %run_lowready_R + ); + } + PlayBlendTransitionStandRun(%combatrun); + } + } + else + { + if (IsDefined(self.run_noncombatanim)) + { + PlayBlendTransitionStandRun(self.run_noncombatanim); + } + else + { + self SetAnimKnobLimited( animscripts\zombie_run::GetRunAnim(), 1, 0.2, 1 ); + useLeans = GetDvarInt( #"ai_useLeanRunAnimations"); + if( useLeans && self.isfacingmotion ) + { + self thread animscripts\zombie_run::UpdateRunWeights( "BlendIntoStandRun", + %combatrun_forward, + %run_lowready_B, + %ai_run_lowready_f_lean_l, + %ai_run_lowready_f_lean_r + ); + } + else + { + self thread animscripts\zombie_run::UpdateRunWeights( "BlendIntoStandRun", + %combatrun_forward, + %run_lowready_B, + %run_lowready_L, + %run_lowready_R + ); + } + PlayBlendTransitionStandRun(%combatrun); + } + } + self notify ("BlendIntoStandRun"); +} +PlayBlendTransitionStandWalk(animname) +{ + if (self.a.movement != "stop") + self endon("movemode"); + PlayBlendTransition(animname, 0.2, "stand", "walk"); +} +BlendIntoStandWalk() +{ + walkanim = animscripts\walk::getStandWalkAnim(); + PlayBlendTransitionStandWalk( walkanim ); +} +CrouchToStand() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToStand "+self.a.pose); + assertEX(self.a.movement == "stop", "SetPoseMovement::CrouchToStand "+self.a.movement); + standSpeed = 0.5; + if (IsDefined (self.fastStand)) + { + standSpeed = 1.8; + self.fastStand = undefined; + } + self randomizeIdleSet(); + PlayTransitionAnimation(%crouch2stand, "stand", "stop", standSpeed); +} +CrouchToCrouchWalk() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToCrouchWalk "+self.a.pose); + assertEX(self.a.movement == "stop", "SetPoseMovement::CrouchToCrouchWalk "+self.a.movement); + BlendIntoCrouchWalk(); +} +CrouchToStandWalk() +{ + CrouchToCrouchWalk(); + BlendIntoStandWalk(); +} +CrouchWalkToCrouch() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchWalkToCrouch "+self.a.pose); + assertEX(self.a.movement == "walk", "SetPoseMovement::CrouchWalkToCrouch "+self.a.movement); + self.a.movement = "stop"; +} +CrouchWalkToStand() +{ + CrouchWalkToCrouch(); + CrouchToStand(); +} +CrouchRunToCrouch() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchRunToCrouch "+self.a.pose); + assertEX(self.a.movement == "run", "SetPoseMovement::CrouchRunToCrouch "+self.a.movement); + self.a.movement = "stop"; +} +CrouchRunToStand() +{ + CrouchRunToCrouch(); + CrouchToStand(); +} +CrouchToCrouchRun() +{ + assertEX(self.a.pose == "crouch", "SetPoseMovement::CrouchToCrouchRun "+self.a.pose); + assertEX(self.a.movement == "stop", "SetPoseMovement::CrouchToCrouchRun "+self.a.movement); + BlendIntoCrouchRun(); +} +CrouchToStandRun() +{ + BlendIntoStandRun(); +} +BlendIntoCrouchRun() +{ + if (IsDefined(self.crouchrun_combatanim)) + { + self SetAnimKnobAll(self.crouchrun_combatanim, %body, 1, 0.2); + PlayBlendTransition(self.crouchrun_combatanim, 0.2, "crouch", "run"); + self notify ("BlendIntoCrouchRun"); + } + else + { + self setanimknob( animscripts\zombie_run::GetCrouchRunAnim(), 1, 0.2 ); + self thread animscripts\zombie_run::UpdateRunWeights( "BlendIntoCrouchRun", + %crouch_fastwalk_F, + %crouch_fastwalk_B, + %crouch_fastwalk_L, + %crouch_fastwalk_R + ); + PlayBlendTransition(%combatrun_forward, 0.2, "crouch", "run"); + self notify ("BlendIntoCrouchRun"); + } +} +BlendIntoCrouchWalk() +{ + if (IsDefined(self.crouchrun_combatanim)) + { + self SetAnimKnobAll(self.crouchrun_combatanim, %body, 1, 0.2); + PlayBlendTransition(self.crouchrun_combatanim, 0.2, "crouch", "walk"); + self notify ("BlendIntoCrouchWalk"); + } + else + { + PlayBlendTransition( %crouch_fastwalk_F, 0.2, "crouch", "walk" ); + } +} +StandToCrouch() +{ + assertEX(self.a.pose == "stand", "SetPoseMovement::StandToCrouch "+self.a.pose); + assertEX(self.a.movement == "stop", "SetPoseMovement::StandToCrouch "+self.a.movement); + self randomizeIdleSet(); + crouchSpeed = 0.5; + if (IsDefined (self.fastCrouch)) + { + crouchSpeed = 1.8; + self.fastCrouch = undefined; + } + if( self is_zombie() ) + { + return; + } + PlayTransitionAnimation( %exposed_stand_2_crouch, "crouch", "stop", 1, undefined, crouchspeed ); +} +PlayTransitionAnimation2(transAnim, endPose, endMovement, finalAnim) +{ + self SetFlaggedAnimKnobAll("transAnimDone1", transAnim, %body, 1, 0.2, 1); + if (!IsDefined(self.a.pose)) + { + self.pose = "undefined"; + } + if (!IsDefined(self.a.movement)) + { + self.movement = "undefined"; + } + debugIdentifier = self.a.pose+" to "+endPose+", "+self.a.movement+" to "+endMovement; + self animscripts\zombie_shared::DoNoteTracks("transAnimDone1", undefined, debugIdentifier); + self.a.pose = endPose; + self.a.movement = endMovement; + self.a.alertness = "casual"; + if (IsDefined(finalAnim)) + { + self SetAnimKnobAll(finalAnim, %body, 1, 0.2, 1); + } +} +PlayTransitionAnimationThread_WithoutWaitSetStates(transAnim, endPose, endMovement, finalAnim, rate) +{ + self endon ("killanimscript"); + self endon ("entered_pose" + endPose); + PlayTransitionAnimationFunc(transAnim, endPose, endMovement, finalAnim, rate, false); +} +PlayTransitionAnimation(transAnim, endPose, endMovement, finalAnim, rate) +{ + PlayTransitionAnimationFunc(transAnim, endPose, endMovement, finalAnim, rate, true); +} +PlayTransitionAnimationFunc(transAnim, endPose, endMovement, finalAnim, rate, waitSetStatesEnabled) +{ + if (!IsDefined (rate)) + rate = 1; + if (waitSetStatesEnabled) + { + self thread waitSetStates ( getanimlength(transAnim)/2.0, "killtimerscript", endPose); + } + self SetFlaggedAnimKnobAllRestart("transAnimDone2", transAnim, %body, 1, .2, rate); + if (!IsDefined(self.a.pose)) + { + self.pose = "undefined"; + } + if (!IsDefined(self.a.movement)) + { + self.movement = "undefined"; + } + debugIdentifier = ""; + self animscripts\zombie_shared::DoNoteTracks("transAnimDone2", undefined, debugIdentifier); + self notify ("killtimerscript"); + self.a.pose = endPose; + self notify ("entered_pose" + endPose); + self.a.movement = endMovement; + self.a.alertness = "casual"; + if (IsDefined(finalAnim)) + { + self SetAnimKnobAll(finalAnim, %body, 1, 0.2, rate); + } +} +waitSetStates ( timetowait, killmestring, endPose ) +{ + self endon("killanimscript"); + self endon ("death"); + self endon(killmestring); + oldpose = self.a.pose; + wait timetowait; +} \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/zombie_shared.gsc b/BO1/PC/ZM/animscripts/zombie_shared.gsc new file mode 100644 index 0000000..ab9bfbd --- /dev/null +++ b/BO1/PC/ZM/animscripts/zombie_shared.gsc @@ -0,0 +1,507 @@ + +#include maps\_utility; +#include animscripts\zombie_utility; +#include animscripts\combat_utility; +#include common_scripts\utility; +#using_animtree ("generic_human"); +deleteAtLimit() +{ + wait 30.0; + self delete(); +} +LookAtEntity(lookTargetEntity, lookDuration, lookSpeed, eyesOnly, interruptOthers) +{ + return; +} +LookAtPosition(lookTargetPos, lookDuration, lookSpeed, eyesOnly, interruptOthers) +{ + assertEX(isAI(self), "Can only call this function on an AI character"); + assertEX(self.a.targetLookInitilized == true, "LookAtPosition called on AI that lookThread was not called on"); + assertEX( (lookSpeed == "casual") || (lookSpeed == "alert"), "lookSpeed must be casual or alert"); + if ( !IsDefined(interruptOthers) || (interruptOthers=="interrupt others") || (GetTime() > self.a.lookEndTime) ) + { + self.a.lookTargetPos = lookTargetPos; + self.a.lookEndTime = GetTime() + (lookDuration*1000); + if(lookSpeed == "casual") + { + self.a.lookTargetSpeed = 800; + } + else + { + self.a.lookTargetSpeed = 1600; + } + if ( IsDefined(eyesOnly) && (eyesOnly=="eyes only") ) + { + self notify("eyes look now"); + } + else + { + self notify("look now"); + } + } +} +LookAtAnimations(leftanim, rightanim) +{ + self.a.LookAnimationLeft = leftanim; + self.a.LookAnimationRight = rightanim; +} +HandleDogSoundNoteTracks( note ) +{ + if ( note == "sound_dogstep_run_default" ) + { + self PlaySound( "fly_dog_step_run_default" ); + return true; + } + prefix = getsubstr( note, 0, 5 ); + if ( prefix != "sound" ) + { + return false; + } + alias = "aml" + getsubstr( note, 5 ); + if ( IsAlive( self ) ) + { + self thread play_sound_on_tag_endon_death( alias, "tag_eye" ); + } + else + { + self thread play_sound_in_space( alias, self gettagorigin( "tag_eye" ) ); + } + return true; +} +growling() +{ + return IsDefined( self.script_growl ); +} +registerNoteTracks() +{ + anim.notetracks["anim_pose = \"stand\""] = ::noteTrackPoseStand; + anim.notetracks["anim_pose = \"crouch\""] = ::noteTrackPoseCrouch; + anim.notetracks["anim_movement = \"stop\""] = ::noteTrackMovementStop; + anim.notetracks["anim_movement = \"walk\""] = ::noteTrackMovementWalk; + anim.notetracks["anim_movement = \"run\""] = ::noteTrackMovementRun; + anim.notetracks["anim_alertness = causal"] = ::noteTrackAlertnessCasual; + anim.notetracks["anim_alertness = alert"] = ::noteTrackAlertnessAlert; + anim.notetracks["gravity on"] = ::noteTrackGravity; + anim.notetracks["gravity off"] = ::noteTrackGravity; + anim.notetracks["gravity code"] = ::noteTrackGravity; + anim.notetracks["bodyfall large"] = ::noteTrackBodyFall; + anim.notetracks["bodyfall small"] = ::noteTrackBodyFall; + anim.notetracks["footstep"] = ::noteTrackFootStep; + anim.notetracks["step"] = ::noteTrackFootStep; + anim.notetracks["footstep_right_large"] = ::noteTrackFootStep; + anim.notetracks["footstep_right_small"] = ::noteTrackFootStep; + anim.notetracks["footstep_left_large"] = ::noteTrackFootStep; + anim.notetracks["footstep_left_small"] = ::noteTrackFootStep; + anim.notetracks["footscrape"] = ::noteTrackFootScrape; + anim.notetracks["land"] = ::noteTrackLand; + anim.notetracks["start_ragdoll"] = ::noteTrackStartRagdoll; +} +noteTrackStopAnim( note, flagName ) +{ +} +noteTrackStartRagdoll( note, flagName ) +{ + if( IsDefined( self.noragdoll ) ) + { + return; + } + self Unlink(); + self startRagdoll(); +} +noteTrackMovementStop( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.movement = "stop"; + } +} +noteTrackMovementWalk( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.movement = "walk"; + } +} +noteTrackMovementRun( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.movement = "run"; + } +} +noteTrackAlertnessCasual( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.alertness = "casual"; + } +} +noteTrackAlertnessAlert( note, flagName ) +{ + if( IsSentient( self ) ) + { + self.a.alertness = "alert"; + } +} +noteTrackPoseStand( note, flagName ) +{ + self.a.pose = "stand"; + self notify ("entered_pose" + "stand"); +} +noteTrackPoseCrouch( note, flagName ) +{ + self.a.pose = "crouch"; + self notify ("entered_pose" + "crouch"); + if (self.a.crouchPain) + { + self.a.crouchPain = false; + self.health = 150; + } +} +noteTrackGravity( note, flagName ) +{ + if ( isSubStr( note, "on" ) ) + { + self AnimMode( "gravity" ); + } + else if ( isSubStr( note, "off" ) ) + { + self AnimMode( "nogravity" ); + self.nogravity = true; + } + else if ( isSubStr( note, "code" ) ) + { + self AnimMode( "none" ); + self.nogravity = undefined; + } +} +noteTrackBodyFall( note, flagName ) +{ + if ( IsDefined( self.groundType ) ) + { + groundType = self.groundType; + } + else + { + groundType = "dirt"; + } + if ( isSubStr( note, "large" ) ) + { + self PlaySound ("fly_bodyfall_large_" + groundType); + } + else if ( isSubStr( note, "small" ) ) + { + self PlaySound ("fly_bodyfall_small_" + groundType); + } +} +noteTrackFootStep( note, flagName ) +{ + if ( isSubStr( note, "left" ) ) + { + playFootStep( "J_Ball_LE" ); + } + else + { + playFootStep( "J_BALL_RI" ); + } + if(!level.clientScripts) + { + self PlaySound( "fly_gear_run" ); + } +} +noteTrackFootScrape( note, flagName ) +{ + if ( IsDefined( self.groundType ) ) + { + groundType = self.groundType; + } + else + { + groundType = "dirt"; + } + self PlaySound ("fly_step_scrape_" + groundType ); +} +noteTrackLand( note, flagName ) +{ + if ( IsDefined( self.groundType ) ) + { + groundType = self.groundType; + } + else + { + groundType = "dirt"; + } + self PlaySound ("fly_land_npc_" + groundType ); +} +HandleNoteTrack( note, flagName, customFunction, var1 ) +{ + if ( isAI( self ) && self.isdog ) + { + if ( HandleDogSoundNoteTracks( note ) ) + { + return; + } + } + notetrackFunc = anim.notetracks[note]; + if ( IsDefined( notetrackFunc ) ) + { + return [[notetrackFunc]]( note, flagName ); + } + switch ( note ) + { + case "end": + case "finish": + case "undefined": + if ( isAI(self) && self.a.pose=="back" ) + { + } + return note; + case "swish small": + self thread play_sound_in_space ("fly_gear_enemy", self gettagorigin ("TAG_WEAPON_RIGHT")); + break; + case "swish large": + self thread play_sound_in_space ("fly_gear_enemy_large", self gettagorigin ("TAG_WEAPON_RIGHT")); + break; + case "no death": + self.a.nodeath = true; + break; + case "no pain": + self.allowpain = false; + break; + case "allow pain": + self.allowpain = true; + break; + case "anim_melee = right": + case "anim_melee = \"right\"": + self.a.meleeState = "right"; + break; + case "anim_melee = left": + case "anim_melee = \"left\"": + self.a.meleeState = "left"; + break; + case "swap taghelmet to tagleft": + if ( IsDefined ( self.hatModel ) ) + { + if (IsDefined(self.helmetSideModel)) + { + self detach(self.helmetSideModel, "TAG_HELMETSIDE"); + self.helmetSideModel = undefined; + } + self detach ( self.hatModel, ""); + self attach ( self.hatModel, "TAG_WEAPON_LEFT"); + self.hatModel = undefined; + } + break; + case "stop anim": + anim_stopanimscripted(); + return note; + default: + if (IsDefined(customFunction)) + { + if (!IsDefined(var1)) + { + return [[customFunction]] (note); + } + else + { + return [[customFunction]] (note, var1); + } + } + break; + } +} +DoNoteTracks( flagName, customFunction, debugIdentifier, var1 ) +{ + for (;;) + { + self waittill (flagName, note); + if ( !IsDefined( note ) ) + { + note = "undefined"; + } + val = self HandleNoteTrack( note, flagName, customFunction, var1 ); + if ( IsDefined( val ) ) + { + return val; + } + } +} +DoNoteTracksIntercept( flagName, interceptFunction, debugIdentifier ) +{ + assert( IsDefined( interceptFunction ) ); + for (;;) + { + self waittill ( flagName, note ); + if ( !IsDefined( note ) ) + { + note = "undefined"; + } + intercepted = [[interceptFunction]]( note ); + if ( IsDefined( intercepted ) && intercepted ) + { + continue; + } + val = self HandleNoteTrack( note, flagName ); + if ( IsDefined( val ) ) + { + return val; + } + } +} +DoNoteTracksPostCallback( flagName, postFunction ) +{ + assert( IsDefined( postFunction ) ); + for (;;) + { + self waittill ( flagName, note ); + if ( !IsDefined( note ) ) + { + note = "undefined"; + } + val = self HandleNoteTrack( note, flagName ); + [[postFunction]]( note ); + if ( IsDefined( val ) ) + { + return val; + } + } +} +DoNoteTracksForever(flagName, killString, customFunction, debugIdentifier) +{ + DoNoteTracksForeverProc( ::DoNoteTracks, flagName, killString, customFunction, debugIdentifier); +} +DoNoteTracksForeverIntercept(flagName, killString, interceptFunction, debugIdentifier) +{ + DoNoteTracksForeverProc( ::DoNoteTracksIntercept, flagName, killString, interceptFunction, debugIdentifier ); +} +DoNoteTracksForeverProc( notetracksFunc, flagName, killString, customFunction, debugIdentifier ) +{ + if (IsDefined (killString)) + { + self endon (killString); + } + self endon ("killanimscript"); + if (!IsDefined(debugIdentifier)) + { + debugIdentifier = "undefined"; + } + for (;;) + { + time = GetTime(); + returnedNote = [[notetracksFunc]](flagName, customFunction, debugIdentifier); + timetaken = GetTime() - time; + if ( timetaken < 0.05) + { + time = GetTime(); + returnedNote = [[notetracksFunc]](flagName, customFunction, debugIdentifier); + timetaken = GetTime() - time; + if ( timetaken < 0.05) + { + println (GetTime()+" "+debugIdentifier+" animscripts\zombie_shared::DoNoteTracksForever is trying to cause an infinite loop on anim "+flagName+", returned "+returnedNote+"."); + wait ( 0.05 - timetaken ); + } + } + } +} +DoNoteTracksForTime(time, flagName, customFunction, debugIdentifier) +{ + ent = SpawnStruct(); + ent thread doNoteTracksForTimeEndNotify(time); + DoNoteTracksForTimeProc( ::DoNoteTracksForever, time, flagName, customFunction, debugIdentifier, ent); +} +DoNoteTracksForTimeIntercept( time, flagName, interceptFunction, debugIdentifier) +{ + ent = SpawnStruct(); + ent thread doNoteTracksForTimeEndNotify(time); + DoNoteTracksForTimeProc( ::DoNoteTracksForeverIntercept, time, flagName, interceptFunction, debugIdentifier, ent); +} +DoNoteTracksForTimeProc( doNoteTracksForeverFunc, time, flagName, customFunction, debugIdentifier, ent) +{ + ent endon ("stop_notetracks"); + [[doNoteTracksForeverFunc]](flagName, undefined, customFunction, debugIdentifier); +} +doNoteTracksForTimeEndNotify(time) +{ + wait (time); + self notify ("stop_notetracks"); +} +playFootStep(foot) +{ + if(!level.clientScripts) + { + if (! isAI(self) ) + { + self PlaySound ("fly_step_run_dirt"); + return; + } + } + groundType = undefined; + if (!IsDefined(self.groundtype)) + { + if (!IsDefined(self.lastGroundtype)) + { + if(!level.clientScripts) + { + self PlaySound ("fly_step_run_dirt"); + } + return; + } + groundtype = self.lastGroundtype; + } + else + { + groundtype = self.groundtype; + self.lastGroundtype = self.groundType; + } + if(!level.clientScripts) + { + self PlaySound ("fly_step_run_" + groundType); + } + [[anim.optionalStepEffectFunction]](foot, groundType); +} +playFootStepEffect(foot, groundType) +{ + if(level.clientScripts) + { + return; + } + for (i=0;i 16*16 && !self mayMoveToPoint( origin ) ) + { + return; + } + self.keepClaimedNodeInGoal = true; + offset = self.origin - origin; + frames = int(time * 20); + offsetreduction = vector_scale( offset, 1.0 / frames ); + for ( i = 0; i < frames; i++ ) + { + offset -= offsetreduction; + self Teleport( origin + offset ); + wait .05; + } + self.keepClaimedNodeInGoal = false; +} +returnTrue() { return true; } + + + + + \ No newline at end of file diff --git a/BO1/PC/ZM/animscripts/zombie_stop.gsc b/BO1/PC/ZM/animscripts/zombie_stop.gsc new file mode 100644 index 0000000..70188c7 Binary files /dev/null and b/BO1/PC/ZM/animscripts/zombie_stop.gsc differ diff --git a/BO1/PC/ZM/animscripts/zombie_utility.gsc b/BO1/PC/ZM/animscripts/zombie_utility.gsc new file mode 100644 index 0000000..aa52531 --- /dev/null +++ b/BO1/PC/ZM/animscripts/zombie_utility.gsc @@ -0,0 +1,1204 @@ +#include animscripts\zombie_SetPoseMovement; +#include animscripts\combat_utility; +#include animscripts\debug; +#include common_scripts\utility; +#include maps\_utility; +#using_animtree ("generic_human"); +initAnimTree(animscript) +{ + if ( isValidEnemy( self.a.personImMeleeing ) ) + { + ImNotMeleeing( self.a.personImMeleeing ); + } + self ClearAnim( %body, 0.2 ); + if ( animscript != "pain" && animscript != "death" ) + { + self.a.special = "none"; + } + self.missedSightChecks = 0; + IsInCombat(); + assertEX( IsDefined( animscript ), "Animscript not specified in initAnimTree" ); + self.a.script = animscript; + [[self.a.StopCowering]](); +} +UpdateAnimPose() +{ + assertEX( self.a.movement=="stop" || self.a.movement=="walk" || self.a.movement=="run", "UpdateAnimPose "+self.a.pose+" "+self.a.movement ); + self.desired_anim_pose = undefined; +} +initialize( animscript ) +{ + if ( IsDefined( self.longDeathStarting ) ) + { + if ( animscript != "pain" && animscript != "death" ) + { + self DoDamage( self.health + 100, self.origin ); + } + if ( animscript != "pain" ) + { + self.longDeathStarting = undefined; + self notify( "kill_long_death" ); + } + } + if ( IsDefined( self.a.mayOnlyDie ) && animscript != "death" ) + { + self DoDamage( self.health + 100, self.origin ); + } + if ( IsDefined( self.a.postScriptFunc ) ) + { + scriptFunc = self.a.postScriptFunc; + self.a.postScriptFunc = undefined; + [[scriptFunc]]( animscript ); + } + if ( animscript != "death" ) + { + self.a.nodeath = false; + } + if ( IsDefined( self.isHoldingGrenade ) && (animscript == "pain" || animscript == "death" || animscript == "flashed") ) + { + self dropGrenade(); + } + self.isHoldingGrenade = undefined; + self.coverNode = undefined; + self.changingCoverPos = false; + self.a.scriptStartTime = GetTime(); + self.a.atConcealmentNode = false; + if ( IsDefined( self.node ) && (self.node.type == "Conceal Crouch" || self.node.type == "Conceal Stand") ) + { + self.a.atConcealmentNode = true; + } + initAnimTree( animscript ); + UpdateAnimPose(); +} +should_find_a_new_node() +{ + self.a.next_move_to_new_cover--; + if ( self.a.next_move_to_new_cover > 0 ) + { + return false; + } + anim_set_next_move_to_new_cover(); + return true; +} +badplacer(time, org, radius) +{ + for (i=0;i GetTime() ); +} +GetNodeYawToOrigin(pos) +{ + if (IsDefined (self.node)) + { + yaw = self.node.angles[1] - GetYaw(pos); + } + else + { + yaw = self.angles[1] - GetYaw(pos); + } + yaw = AngleClamp180( yaw ); + return yaw; +} +GetNodeYawToEnemy() +{ + pos = undefined; + if ( isValidEnemy( self.enemy ) ) + { + pos = self.enemy.origin; + } + else + { + if (IsDefined (self.node)) + { + forward = AnglesToForward(self.node.angles); + } + else + { + forward = AnglesToForward(self.angles); + } + forward = vector_scale (forward, 150); + pos = self.origin + forward; + } + if (IsDefined (self.node)) + { + yaw = self.node.angles[1] - GetYaw(pos); + } + else + { + yaw = self.angles[1] - GetYaw(pos); + } + yaw = AngleClamp180( yaw ); + return yaw; +} +GetCoverNodeYawToEnemy() +{ + pos = undefined; + if ( isValidEnemy( self.enemy ) ) + { + pos = self.enemy.origin; + } + else + { + forward = AnglesToForward(self.coverNode.angles + self.animarray["angle_step_out"][self.a.cornerMode]); + forward = vector_scale (forward, 150); + pos = self.origin + forward; + } + yaw = self.CoverNode.angles[1] + self.animarray["angle_step_out"][self.a.cornerMode] - GetYaw(pos); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetYawToSpot(spot) +{ + pos = spot; + yaw = self.angles[1] - GetYaw(pos); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetYawToEnemy() +{ + pos = undefined; + if ( isValidEnemy( self.enemy ) ) + { + pos = self.enemy.origin; + } + else + { + forward = AnglesToForward(self.angles); + forward = vector_scale (forward, 150); + pos = self.origin + forward; + } + yaw = self.angles[1] - GetYaw(pos); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetYaw(org) +{ + angles = VectorToAngles(org-self.origin); + return angles[1]; +} +GetYaw2d(org) +{ + angles = VectorToAngles((org[0], org[1], 0)-(self.origin[0], self.origin[1], 0)); + return angles[1]; +} +AbsYawToEnemy() +{ + assert( isValidEnemy( self.enemy ) ); + yaw = self.angles[1] - GetYaw(self.enemy.origin); + yaw = AngleClamp180( yaw ); + if (yaw < 0) + { + yaw = -1 * yaw; + } + return yaw; +} +AbsYawToEnemy2d() +{ + assert( isValidEnemy( self.enemy ) ); + yaw = self.angles[1] - GetYaw2d(self.enemy.origin); + yaw = AngleClamp180( yaw ); + if (yaw < 0) + { + yaw = -1 * yaw; + } + return yaw; +} +AbsYawToOrigin(org) +{ + yaw = self.angles[1] - GetYaw(org); + yaw = AngleClamp180( yaw ); + if (yaw < 0) + { + yaw = -1 * yaw; + } + return yaw; +} +AbsYawToAngles(angles) +{ + yaw = self.angles[1] - angles; + yaw = AngleClamp180( yaw ); + if (yaw < 0) + { + yaw = -1 * yaw; + } + return yaw; +} +GetYawFromOrigin(org, start) +{ + angles = VectorToAngles(org-start); + return angles[1]; +} +GetYawToTag(tag, org) +{ + yaw = self GetTagAngles( tag )[1] - GetYawFromOrigin(org, self GetTagOrigin(tag)); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetYawToOrigin(org) +{ + yaw = self.angles[1] - GetYaw(org); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetEyeYawToOrigin(org) +{ + yaw = self GetTagAngles("TAG_EYE")[1] - GetYaw(org); + yaw = AngleClamp180( yaw ); + return yaw; +} +GetCoverNodeYawToOrigin(org) +{ + yaw = self.coverNode.angles[1] + self.animarray["angle_step_out"][self.a.cornerMode] - GetYaw(org); + yaw = AngleClamp180( yaw ); + return yaw; +} +isStanceAllowedWrapper( stance ) +{ + if ( IsDefined( self.coverNode ) ) + { + return self.coverNode doesNodeAllowStance( stance ); + } + return self IsStanceAllowed( stance ); +} +choosePose(preferredPose) +{ + if ( !IsDefined( preferredPose ) ) + { + preferredPose = self.a.pose; + } + if ( EnemiesWithinStandingRange() ) + { + preferredPose = "stand"; + } + switch (preferredPose) + { + case "stand": + if (self isStanceAllowedWrapper("stand")) + { + resultPose = "stand"; + } + else if (self isStanceAllowedWrapper("crouch")) + { + resultPose = "crouch"; + } + else + { + println ("No stance allowed! Remaining standing."); + resultPose = "stand"; + } + break; + case "crouch": + if (self isStanceAllowedWrapper("crouch")) + { + resultPose = "crouch"; + } + else if (self isStanceAllowedWrapper("stand")) + { + resultPose = "stand"; + } + else + { + println ("No stance allowed! Remaining crouched."); + resultPose = "crouch"; + } + break; + default: + println ("utility::choosePose, called in "+self.a.script+" script: Unhandled anim_pose "+self.a.pose+" - using stand."); + resultPose = "stand"; + break; + } + return resultPose; +} +okToMelee(person) +{ + assert( IsDefined( person ) ); + if (IsDefined(self.a.personImMeleeing)) + { + ImNotMeleeing(self.a.personImMeleeing); + assert(!IsDefined(self.a.personImMeleeing)); + } + if (IsDefined(person.a.personMeleeingMe)) + { + oldAttacker = person.a.personMeleeingMe; + if ( IsDefined(oldAttacker.a.personImMeleeing) && oldAttacker.a.personImMeleeing == person ) + { + return false; + } + println("okToMelee - Shouldn't get to here"); + person.a.personMeleeingMe = undefined; + assert(!IsDefined(self.a.personImMeleeing)); + assert(!IsDefined(person.a.personMeleeingMe)); + return true; + } + assert(!IsDefined(self.a.personImMeleeing)); + assert(!IsDefined(person.a.personMeleeingMe)); + return true; +} +IAmMeleeing(person) +{ + assert(IsDefined(person)); + assert(!IsDefined(person.a.personMeleeingMe)); + assert(!IsDefined(self.a.personImMeleeing)); + person.a.personMeleeingMe = self; + self.a.personImMeleeing = person; +} +ImNotMeleeing(person) +{ + if ( (IsDefined(person)) && (IsDefined(self.a.personImMeleeing)) && (self.a.personImMeleeing==person) ) + { + assert(IsDefined(person.a.personMeleeingMe)); + assert(person.a.personMeleeingMe == self); + } + if (!IsDefined(person)) + { + self.a.personImMeleeing = undefined; + } + else if ( (IsDefined(person.a.personMeleeingMe)) && (person.a.personMeleeingMe==self) ) + { + person.a.personMeleeingMe = undefined; + assert(self.a.personImMeleeing==person); + self.a.personImMeleeing = undefined; + } + assert( !IsDefined(person) || !IsDefined(self.a.personImMeleeing) || (self.a.personImMeleeing!=person) ); + assert( !IsDefined(person) || !IsDefined(person.a.personMeleeingMe) || (person.a.personMeleeingMe!=self) ); +} +GetClaimedNode() +{ + myNode = self.node; + if ( IsDefined(myNode) && (self nearNode(myNode) || (IsDefined( self.coverNode ) && myNode == self.coverNode)) ) + { + return myNode; + } + return undefined; +} +GetNodeType() +{ + myNode = GetClaimedNode(); + if (IsDefined(myNode)) + { + return myNode.type; + } + return "none"; +} +GetNodeDirection() +{ + myNode = GetClaimedNode(); + if (IsDefined(myNode)) + { + return myNode.angles[1]; + } + return self.desiredAngle; +} +GetNodeForward() +{ + myNode = GetClaimedNode(); + if (IsDefined(myNode)) + { + return AnglesToForward ( myNode.angles ); + } + return AnglesToForward( self.angles ); +} +GetNodeOrigin() +{ + myNode = GetClaimedNode(); + if (IsDefined(myNode)) + { + return myNode.origin; + } + return self.origin; +} +safemod(a,b) +{ + result = int(a) % b; + result += b; + return result % b; +} +AngleClamp( angle ) +{ + angleFrac = angle / 360.0; + angle = (angleFrac - floor( angleFrac )) * 360.0; + return angle; +} +QuadrantAnimWeights( yaw ) +{ + forwardWeight = (90 - abs(yaw)) / 90; + leftWeight = (90 - AbsAngleClamp180(abs(yaw-90))) / 90; + result["front"] = 0; + result["right"] = 0; + result["back"] = 0; + result["left"] = 0; + if ( IsDefined( self.alwaysRunForward ) ) + { + assert( self.alwaysRunForward ); + result["front"] = 1; + return result; + } + useLeans = GetDvarInt( #"ai_useLeanRunAnimations"); + if (forwardWeight > 0) + { + result["front"] = forwardWeight; + if (leftWeight > 0) + { + result["left"] = leftWeight; + } + else + { + result["right"] = -1 * leftWeight; + } + } + else if( useLeans ) + { + result["back"] = -1 * forwardWeight; + if (leftWeight > 0) + { + result["left"] = leftWeight; + } + else + { + result["right"] = -1 * leftWeight; + } + } + else + { + backWeight = -1 * forwardWeight; + if ( leftWeight > backWeight ) + { + result["left"] = 1; + } + else if ( leftWeight < forwardWeight ) + { + result["right"] = 1; + } + else + { + result["back"] = 1; + } + } + return result; +} +getQuadrant(angle) +{ + angle = AngleClamp(angle); + if (angle<45 || angle>315) + { + quadrant = "front"; + } + else if (angle<135) + { + quadrant = "left"; + } + else if (angle<225) + { + quadrant = "back"; + } + else + { + quadrant = "right"; + } + return quadrant; +} +IsInSet(input, set) +{ + for (i = set.size - 1; i >= 0; i--) + { + if (input == set[i]) + { + return true; + } + } + return false; +} +playAnim(animation) +{ + if (IsDefined(animation)) + { + println ("NOW PLAYING: ",animation); + self SetFlaggedAnimKnobAllRestart("playAnim", animation, %root, 1, .2, 1); + timeToWait = getanimlength(animation); + timeToWait = ( 3 * timeToWait ) + 1; + self thread NotifyAfterTime("time is up", "time is up", timeToWait); + self waittill ("time is up"); + self notify("enddrawstring"); + } +} +NotifyAfterTime(notifyString, killmestring, time) +{ + self endon("death"); + self endon(killmestring); + wait time; + self notify (notifyString); +} +drawString(stringtodraw) +{ + self endon("killanimscript"); + self endon("enddrawstring"); + for (;;) + { + wait .05; + Print3d ((self GetDebugEye()) + (0,0,8), stringtodraw, (1, 1, 1), 1, 0.2); + } +} +drawStringTime(msg, org, color, timer) +{ + maxtime = timer*20; + for (i=0;i 45 ) + { + if ( IsDefined( atNode ) && atNode.type != "Cover Crouch" && atNode.type != "Conceal Crouch" ) + { + return false; + } + if ( pitch > 45 || pitch < anim.coverCrouchLeanPitch - 45 ) + { + return false; + } + } + return true; +} +showLines(start, end, end2) +{ + for (;;) + { + line(start, end, (1,0,0), 1); + wait (0.05); + line(start, end2, (0,0,1), 1); + wait (0.05); + } +} +anim_array(animArray, animWeights) +{ + total_anims = animArray.size; + idleanim = RandomInt(total_anims); + assert (total_anims); + assert (animArray.size == animWeights.size); + if (total_anims == 1) + { + return animArray[0]; + } + weights = 0; + total_weight = 0; + for (i = 0; i < total_anims; i++) + { + total_weight += animWeights[i]; + } + anim_play = RandomFloat(total_weight); + current_weight = 0; + for (i = 0; i < total_anims; i++) + { + current_weight += animWeights[i]; + if (anim_play >= current_weight) + { + continue; + } + idleanim = i; + break; + } + return animArray[idleanim]; +} +notForcedCover() +{ + return ((self.a.forced_cover == "none") || (self.a.forced_cover == "Show")); +} +forcedCover(msg) +{ + return IsDefined(self.a.forced_cover) && (self.a.forced_cover == msg); +} +print3dtime(timer, org, msg, color, alpha, scale) +{ + newtime = timer / 0.05; + for (i=0;i 0); +} +scriptChange() +{ + self.a.current_script = "none"; + self notify (anim.scriptChange); +} +delayedScriptChange() +{ + wait (0.05); + scriptChange(); +} +getGrenadeModel() +{ + return getWeaponModel(self.grenadeweapon); +} +sawEnemyMove(timer) +{ + if (!IsDefined(timer)) + { + timer = 500; + } + return (GetTime() - self.personalSightTime < timer); +} +canThrowGrenade() +{ + if (!self.grenadeAmmo) + { + return false; + } + if (self.script_forceGrenade) + { + return true; + } + return (IsPlayer(self.enemy)); +} +random_weight (array) +{ + idleanim = RandomInt (array.size); + if (array.size > 1) + { + anim_weight = 0; + for (i=0;i 0; +} +animArrayPickRandom( animname ) +{ + assert( IsDefined( self.a.array ) ); + assert( self.a.array[animname].size > 0 ); + if ( self.a.array[animname].size > 1 ) + { + index = RandomInt( self.a.array[animname].size ); + } + else + { + index = 0; + } + return self.a.array[animname][index]; +} +getAnimEndPos( theanim ) +{ + moveDelta = getMoveDelta( theanim, 0, 1 ); + return self localToWorldCoords( moveDelta ); +} +isValidEnemy( enemy ) +{ + if ( !IsDefined( enemy ) ) + { + return false; + } + return true; +} +damageLocationIsAny( a, b, c, d, e, f, g, h, i, j, k, ovr ) +{ + if ( !IsDefined( a ) ) return false; if ( self.damageLocation == a ) return true; + if ( !IsDefined( b ) ) return false; if ( self.damageLocation == b ) return true; + if ( !IsDefined( c ) ) return false; if ( self.damageLocation == c ) return true; + if ( !IsDefined( d ) ) return false; if ( self.damageLocation == d ) return true; + if ( !IsDefined( e ) ) return false; if ( self.damageLocation == e ) return true; + if ( !IsDefined( f ) ) return false; if ( self.damageLocation == f ) return true; + if ( !IsDefined( g ) ) return false; if ( self.damageLocation == g ) return true; + if( !IsDefined( h ) ) return false; if( self.damageLocation == h ) return true; + if( !IsDefined( i ) ) return false; if( self.damageLocation == i ) return true; + if( !IsDefined( j ) ) return false; if( self.damageLocation == j ) return true; + if( !IsDefined( k ) ) return false; if( self.damageLocation == k ) return true; + assert(!IsDefined(ovr)); + return false; +} +ragdollDeath( moveAnim ) +{ + self endon ( "killanimscript" ); + lastOrg = self.origin; + moveVec = (0,0,0); + for ( ;; ) + { + wait ( 0.05 ); + force = distance( self.origin, lastOrg ); + lastOrg = self.origin; + if ( self.health == 1 ) + { + self.a.nodeath = true; + self startRagdoll(); + self ClearAnim( moveAnim, 0.1 ); + wait ( 0.05 ); + physicsExplosionSphere( lastOrg, 600, 0, force * 0.1 ); + self notify ( "killanimscript" ); + return; + } + } +} +isCQBWalking() +{ + return IsDefined( self.cqbwalking ) && self.cqbwalking; +} +squared( value ) +{ + return value * value; +} +randomizeIdleSet() +{ + self.a.idleSet = RandomInt( 2 ); +} +getRandomIntFromSeed( intSeed, intMax ) +{ + assert( intMax > 0 ); + index = intSeed % anim.randomIntTableSize; + return anim.randomIntTable[ index ] % intMax; +} +is_banzai() +{ + return IsDefined( self.banzai ) && self.banzai; +} +is_heavy_machine_gun() +{ + return IsDefined( self.heavy_machine_gunner ) && self.heavy_machine_gunner; +} +is_zombie() +{ + if (IsDefined(self.is_zombie) && self.is_zombie) + { + return true; + } + return false; +} +is_civilian() +{ + if (IsDefined(self.is_civilian) && self.is_civilian) + { + return true; + } + return false; +} +is_zombie_gibbed() +{ + return ( self is_zombie() && self.gibbed ); +} +set_zombie_gibbed() +{ + if ( self is_zombie() ) + { + self.gibbed = true; + } +} +is_skeleton(skeleton) +{ + if ((skeleton == "base") && IsSubStr(get_skeleton(), "scaled")) + { + return true; + } + return (get_skeleton() == skeleton); +} +get_skeleton() +{ + if (IsDefined(self.skeleton)) + { + return self.skeleton; + } + else + { + return "base"; + } +} +debug_anim_print( text ) +{ +} +debug_turn_print( text, line ) +{ +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/animated_props.atr b/BO1/PC/ZM/animtrees/animated_props.atr new file mode 100644 index 0000000..9a8265d --- /dev/null +++ b/BO1/PC/ZM/animtrees/animated_props.atr @@ -0,0 +1,266 @@ +tree_desertpalm01_strongwind +tree_desertpalm01_still +tree_desertpalm02_strongwind +tree_desertpalm02_still +tree_desertpalm03_strongwind +tree_desertpalm03_still +palmtree_tall1_sway +palmtree_tall1_still +palmtree_tall2_sway +palmtree_tall2_still +palmtree_tall3_sway +palmtree_tall3_still +palmtree_med1_sway +palmtree_med1_still +palmtree_med2_sway +palmtree_med2_still +palmtree_bushy1_sway +palmtree_bushy1_still +palmtree_bushy2_sway +palmtree_bushy2_still +palmtree_bushy3_sway +palmtree_bushy3_still +ICBM_turbofan50_spin +ICBM_turbofan64_spin +ICBM_turbofan176_spin +launchfacility_b_emergencylight +me_statue_destroy_base_01 +o_peleliu1_b_outro_handset +o_peleliu1_b_outro_handset_loop +ch_incubator_ropebridge_collapsingbridge +prop_contextual_melee_garrote_garrotewire +prop_contextual_melee_garrote_garrotewire_quick +prop_contextual_melee_garrotesit_garrotewire +prop_contextual_melee_garrotesit_garrotewire_quick +prop_contextual_melee_garrotesit_chair +prop_contextual_melee_garrotesit_chair_quick +p_quag_b05_repeltomacv_carabiner +o_quag_b02_nvaambush_thatch +o_quag_b05_moris_code_chair +o_quag_b02_tree_falling_1 +o_quag_b02_tree_falling_2 +o_quag_b02_tree_falling_3 +o_quag_b02_tree_falling_4 +o_quag_b02_tree_falling_5 +o_quag_b06_doorbreach_door +p_quag_b05_repeltomacv_gun +o_pentagon_limo_doss_first +o_pentagon_limo_doss_second +o_pentagon_chair_typing01 +o_pentagon_chair_typing02 +o_pentagon_chair_pool07 +o_pentagon_chair_pool08 +o_pentagon_chair_pool01 +o_pentagon_chair_pool02 +o_pentagon_cart_cartpush_walk +o_pentagon_cart_cartpush_hurry +o_pentagon_rail_finest_people_cig +o_pentagon_rail_the_vip_phone +o_pentagon_rail_we_are_ready_phone +o_pentagon_rail_we_are_ready_clipboard +o_pentagon_chair_moon_walk01 +o_pentagon_chair_moon_walk02 +o_pentagon_rail_take_care_chair01 +o_pentagon_rail_take_care_chair02 +o_pentagon_rail_take_care_dossier +ch_hue_b02_killingcivilians1_chair +ch_hue_b02_killingcivilians1_chair_idle +o_hue_b01_reznov_reveal_dossier +v_hue_b02_tankblast_car +v_hue_b02_tankblast_tank +o_hue_b02_rope_bowman_A +o_hue_b02_rope_bowman_B +o_hue_b02_rope_troop1_A +o_hue_b02_rope_troop1_B +ch_flash_b01_kristinafight_door +ch_flash_b01_kristinafight_table +v_flash_b01_takeoutjeep_uaz +o_flash_ev04_comm_link_door +o_flash_ev04_comm_link_door_close +prop_comms_floor1_green_idle_chair +prop_comms_floor1_green_idle_2_alert_chair +prop_comms_floor2_green_idle_chair +prop_comms_floor2_green_idle_2_alert_chair +prop_comms_floor3_orange_idle_chair +prop_comms_floor3_orange_idle_2_alert_chair +prop_comms_floor3_green_idle_chair +prop_comms_floor3_green_idle_2_alert_chair +prop_contextual_melee_comms_floor3_green_chair +prop_comms_floor2_blue_idle_chair +prop_comms_floor2_blue_idle_2_alert_chair +prop_comms_floor2_blue_turn_2_left_chair +prop_comms_floor2_blue_left_idle_chair +prop_comms_floor2_blue_left_2_front_chair +prop_comms_floor2_blue_turn_2_right_chair +prop_comms_floor2_blue_right_idle_chair +prop_comms_floor2_blue_right_2_front_chair +prop_comms_floor2_blue_turn_2_back_chair +prop_comms_floor2_blue_back_idle_chair +prop_comms_floor2_blue_back_2_front_chair +o_flash_ev06_stilltime_door1 +o_flash_ev06_stilltime_door2 +o_flash_ev06_stilltime_door1_close +o_flash_ev06_stilltime_door1_open +o_flash_ev10_gastrap_door_left +o_flash_ev10_gastrap_door_right +o_flash_ev10_weavervomit_door_left +o_flash_ev10_weavervomit_door_right +o_flash_ev10_gastrap_playermask +o_flash_ev10_gastrap_weavermask_A +o_flash_ev10_gastrap_woodsmask_A +o_flash_ev10_weavervomit_playermask +o_flash_ev10_weavervomit_weavermask +o_flash_ev10_weavervomit_woodsmask +o_flash_ev09_one_handed_fire_table +fxanim_flash_car_crash_anim +o_incountry_spiketrap_launch +o_incountry_spiketrap__trap_death +o_incountry_spiketrap__trap_loop +o_incountry_b02_bike_equip +fxanim_quag_hueyExplode +prop_meatshield_bullet_tip_cam +prop_meatshield_bullet_tip_spin +prop_meatshield_bullet_tip_cam_cuba +o_pow_b01_1a_2_cage_lid +o_pow_b03_cockpit_headset_barnes +o_pow_b03_cockpit_headset_player +o_pow_b03_cockpit_headset_barnes_exit +o_pow_b03_cockpit_headset_player_exit +o_pow_b01_1a_cleaver +o_pow_b01_1a_roulettegun +o_pow_b01_1a_otherchair +o_pow_b01_1a_playerchair +o_pow_b01_1a_table +o_pow_b01_1b_cleaver +o_pow_b01_1b_roulettegun +o_pow_b01_1b_pipe +o_pow_b01_1b_otherchair +o_pow_b01_1b_playerchair +o_pow_b01_1b_table +o_pow_b01_1b2_cleaver +o_pow_b01_1b2_roulettegun +o_pow_b01_1b2_pipe +o_pow_b01_1b2_otherchair +o_pow_b01_1b2_playerchair +o_pow_b01_1b2_table +o_pow_b01_1c_cleaver +o_pow_b01_1c_roulettegun +o_pow_b01_1c_ak47 +o_pow_b01_1c_bookiegun +o_pow_b01_1c_pipe +o_pow_b01_1c_otherchair +o_pow_b01_1c_playerchair +o_pow_b01_1c_table +o_pow_b01_1d_cleaver +o_pow_b01_1d_roulettegun +o_pow_b01_1d_ak47 +o_pow_b01_1d_bookiegun +o_pow_b01_1d_pipe +o_pow_b01_1d_otherchair +o_pow_b01_1d_playerchair +o_pow_b01_1d_table +o_pow_b02_end_table +o_pow_b02_end_table_wrecked +o_pow_b02_end_door_opening +o_pow_b03_clearing_tentloop +o_pow_b04_cells_rescue_reznov_door +o_pow_b04_cells_rescue_reznov_door2 +o_pow_b04_cells_rescue_reznov_door3 +o_pow_b04_endfight_chair_enter +o_pow_b04_endfight_chair_firstattack +o_pow_b04_endfight_chair_gundraw +o_pow_b04_endfight_chair_gungrab +o_pow_b04_endfight_chair_kickblock +o_pow_b04_endfight_chair_shoot +o_pow_b04_endfight_pistol_enter +o_pow_b04_endfight_pistol_firstattack +o_pow_b04_endfight_pistol_gundraw +o_pow_b04_endfight_pistol_gungrab +o_pow_b04_endfight_pistol_kickblock +o_pow_b04_endfight_pistol_shoot +o_pow_b04_endfight_knife_enter +o_pow_b04_endfight_knife_firstattack +o_pow_b04_endfight_knife_gundraw +o_pow_b04_endfight_knife_gungrab +o_pow_b04_endfight_knife_kickblock +o_pow_b04_endfight_knife_shoot +o_slingshot_thirdpers_idle +o_slingshot_thirdpers_pull_start +o_slingshot_firstpers_pull_finish +o_slingshot_ammo_pull_finish +slingshot_pulled_idle : loopsync +{ +o_slingshot_firstpers_pulled_idle_straight +o_slingshot_firstpers_pulled_idle_left +o_slingshot_firstpers_pulled_idle_right +o_slingshot_ammo_pulled_idle_left +o_slingshot_ammo_pulled_idle_right +} +slingshot_ammo : additive +{ +o_slingshot_ammo_pulled_idle_straight +} +o_slingshot_firstpers_release_straight +o_slingshot_firstpers_release_left +o_slingshot_firstpers_release_right +o_slingshot_thirdpers_intro +o_slingshot_thirdpers_intro_death_reaction +o_slingshot_thirdpers_intro_wave_in +o_slingshot_thirdpers_ending +ch_vor_b02_minecart_slingshot +o_slingshot_ammo_release_straight +o_slingshot_ammo_release_left +o_slingshot_ammo_release_right +ch_vor_b01_intro_key_smash +ch_vor_b01_inclinator_door_idle +ch_vor_b01_inclinator_door_open +ch_vor_b01_inc_door_open +ch_vor_b01_inc_door_close +ch_b03_riot_shield_move_left_close +ch_b03_riot_shield_move_left_close_forward +ch_b03_riot_shield_move_left_far +ch_b03_riot_shield_move_left_far_forward +ch_vor_b03_reznov_lift_welder_torch +o_vor_b03_reznov_weld_exit_torch +ch_vor_b02_omaha_door +o_vor_b03_reznov_weld_exit_door +ch_vor_b03_rolling_door_start +ch_vor_b03_rolling_door_loop +ch_vor_b03_rolling_door_end +ch_vor_b03_rolling_door_close +ch_vor_b03_rolling_door_open +ch_vor_b04_step8_bike +ch_vor_b04_step8_bike_loop +ch_vor_b04_jump2truck_bike_player +ch_vor_b04_jump2truck_bike_reznov +o_kowloon_b01_fridge_loop +o_kowloon_b01_fridge_push +o_kowloon_b01_intro_chair +o_kowloon_b01_intro_glass +o_kowloon_b01_intro_hatch +o_kowloon_b01_intro_table +o_kowloon_b07_clarkdeath_gutter +o_kowloon_b01_fridge_push_door +p_interrogation_rightstrap_breakout +p_interrogation_leftstrap_breakout +p_interrogation_leftstrap_idle +p_interrogation_rightstrap_idle +p_interrogation_leftstrap_struggle_l +p_interrogation_rightstrap_struggle_l +p_interrogation_leftstrap_struggle_r +p_interrogation_rightstrap_struggle_r +o_int_ambient_cigarette_cig +o_int_ambient_coffee_mug +o_int_ambient_walk_mug +o_int_b01_hudson_unstraps_plyr_leftstrap +o_int_b01_hudson_unstraps_plyr_rightstrap +o_int_b01_hudson_unstraps_plyr_door +o_int_b02_open_double_doors_door_left +o_int_b02_open_double_doors_door_right +o_int_b02_plyr_enter_morgue_door_left +o_int_b02_plyr_enter_morgue_door_right +o_int_b02_corridor_stumble_cart +o_int_b03_plyr_view_brainwash_leftstrap +o_int_b03_plyr_view_brainwash_rightstrap +o_under_b05_moon_pool_door_entry_airlock_door +o_full_interstitial_03_camera diff --git a/BO1/PC/ZM/animtrees/civilian.atr b/BO1/PC/ZM/animtrees/civilian.atr new file mode 100644 index 0000000..22497e8 --- /dev/null +++ b/BO1/PC/ZM/animtrees/civilian.atr @@ -0,0 +1,3 @@ +civilian_anims +{ +} diff --git a/BO1/PC/ZM/animtrees/critter.atr b/BO1/PC/ZM/animtrees/critter.atr new file mode 100644 index 0000000..526e565 --- /dev/null +++ b/BO1/PC/ZM/animtrees/critter.atr @@ -0,0 +1,61 @@ +a_chicken_death +a_chicken_death_a +a_chicken_idle +a_chicken_idle_a +a_chicken_react +a_chicken_react_a +a_chicken_run +a_chicken_run_panic_a +a_chicken_run_panic_b +a_chicken_react_up_down +a_chicken_idle_peck +a_chicken_react_to_front +a_chicken_react_to_front_notrans +fxanim_zombies_crow_fly_anim +a_pig_death +a_pig_death_from_right +a_pig_death_from_back +a_pig_death_from_front +a_pig_death_from_left +a_pig_idle +a_pig_idle_a +a_pig_idle_scratch +a_pig_idle_scratch_fast +a_pig_react +a_pig_run +a_pig_run_fast +a_pig_run_panic_a +a_rebirth_pig_idle_a +a_rebirth_pig_idle_b +a_rebirth_pig_idle_c +a_rebirth_pig_hoist_squirm +a_rebirth_pig_hoist_death +a_rebirth_pig_hoist_deathpose +a_rebirth_pig_gas_death +a_water_buffalo_death_a +a_water_buffalo_death_b +a_water_buffalo_idle_a +a_water_buffalo_idle_b +a_water_buffalo_react_a +a_water_buffalo_react_b +a_water_buffalo_run_a +a_water_buffalo_run_b +a_monkey_calm_idle_01 +a_monkey_calm_idle_02 +a_monkey_calm_idle_2_pace +a_monkey_calm_pace +a_monkey_calm_pace_2_idle +a_monkey_calm_idle_03 +a_monkey_freaked_01 +a_monkey_freaked_02 +a_monkey_freaked_03 +a_monkey_gas_death +a_monkey_shot_death +a_seagull_take_off +a_seagull_fly +a_seagull_glide_twitch +a_seagull_glide +a_seagull_land +a_seagull_idle_twitch +a_seagull_idle +ai_zombie_monkey_calm_idle_03 diff --git a/BO1/PC/ZM/animtrees/dog.atr b/BO1/PC/ZM/animtrees/dog.atr new file mode 100644 index 0000000..35e6571 --- /dev/null +++ b/BO1/PC/ZM/animtrees/dog.atr @@ -0,0 +1,85 @@ +german_shepherd_death_front +german_shepherd_idle +german_shepherd_attackidle_knob +{ +german_shepherd_attackidle +german_shepherd_attackidle_bark +german_shepherd_attackidle_growl +} +german_shepherd_run_start_knob : nonloopsync +{ +german_shepherd_run_start +german_shepherd_run_start_L +german_shepherd_run_start_R +german_shepherd_run_start_180_R +} +german_shepherd_run_knob : loopsync +{ +german_shepherd_run +german_shepherd_run_lean_L +german_shepherd_run_lean_R +} +german_shepherd_run_jump_40 +german_shepherd_run_pain +german_shepherd_run_stop +german_shepherd_attack_AI_01_start_a +german_shepherd_attack_AI_02_idle_a +german_shepherd_attack_AI_03_pushed_a +german_shepherd_attack_AI_03_shot_a +german_shepherd_attack_AI_04_middle_a +german_shepherd_attack_AI_05_kill_a +german_shepherd_attack_player_miss +german_shepherd_traverse_down_40 +german_shepherd_traverse_up_40 +sniper_escape_dog_fence +german_shepherd_run_flashbang +german_shepherd_walk +german_shepherd_player_neck_miss +german_shepherd_player_neck_snap +german_shepherd_run_attack +german_shepherd_run_jump_window_40 +german_shepherd_attack_player_miss_turnR +german_shepherd_attack_player_miss_turnL +german_shepherd_traverse_up_80 +german_shepherd_eating +german_shepherd_eating_in +german_shepherd_eating_loop +german_shepherd_eating_out +german_shepherd_sleeping +german_shepherd_wakeup_slow +german_shepherd_wakeup_fast +attack_player : nonloopsync +{ +german_shepherd_attack_player +} +attack_player_late : nonloopsync +{ +german_shepherd_attack_player_late +} +german_shepherd_look_2 : additive +{ +german_shepherd_look_down +german_shepherd_attack_look_down +} +german_shepherd_look_4 : additive +{ +german_shepherd_look_right +german_shepherd_attack_look_right +} +german_shepherd_look_6 : additive +{ +german_shepherd_look_left +german_shepherd_attack_look_left +} +german_shepherd_look_8 : additive +{ +german_shepherd_look_up +german_shepherd_attack_look_up +} +incountry +{ +ch_incountry_dogattack_dog_start +ch_incountry_dogattack_dog_loop +ch_incountry_dogattack_dog_death +ch_incountry_dogattack_dog_kill +} \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/drones.atr b/BO1/PC/ZM/animtrees/drones.atr new file mode 100644 index 0000000..f2e0d02 --- /dev/null +++ b/BO1/PC/ZM/animtrees/drones.atr @@ -0,0 +1,23 @@ + +death_run_forward_crumple +death_run_onfront +death_run_onleft +death_explosion_up10 +death_explosion_back13 +death_explosion_forward13 +death_explosion_left11 +death_explosion_right13 +drone_run_forward_1 +death_stand_dropinplace +death_run_stumble +stand2crouch_attack +walk_run : loopsync +{ +pistol_crouchrun_loop_forward_1 +crouchrun_loop_forward_2 +combatrun +precombatrun1 +} +facial +{ +} \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/fakeshooters.atr b/BO1/PC/ZM/animtrees/fakeshooters.atr new file mode 100644 index 0000000..0feb3b8 --- /dev/null +++ b/BO1/PC/ZM/animtrees/fakeshooters.atr @@ -0,0 +1,106 @@ +body +{ +combat_directions +{ +combat_up +{ +stand_aim_up +stand_shoot_up +stand_shoot_auto_up +crouch_aim_up +crouch_shoot_up +crouch_shoot_auto_up +} +combat_straight +{ +stand_aim_straight +stand_shoot_straight +stand_shoot_auto_straight +crouch_aim_straight +crouch_shoot_straight +crouch_shoot_auto_straight +} +combat_down +{ +stand_aim_down +stand_shoot_down +stand_shoot_auto_down +crouch_aim_down +crouch_shoot_down +crouch_shoot_auto_down +} +} +reload_stand_rifle +exposed_reload +ai_mantle_on_48 +step_up_low_wall +traverse_wallhop +death_stand_dropinplace +death_run_forward_crumple +death_run_onleft +death_run_onfront +death_run_stumble +death_explosion_up10 +death_explosion_forward13 +death_explosion_back13 +death_explosion_left11 +death_explosion_right13 +ai_flame_death_a +ai_flame_death_b +ai_flame_death_c +ai_flame_death_d +ai_flame_death_run +duhoc_climber_dismount +combat_run_fast_3 +drone_run_forward_1 +jump_across_100 +jump_down_56 +stand_alert_1 +stand_alert_2 +stand_alert_3 +run_n_gun_F +ai_viet_run_n_gun_F +ai_viet_run_lowready_f +ch_khe_E1B_troopssprint_1 +ch_khe_E1B_troopssprint_2 +ch_khe_E1B_troopssprint_3 +ch_khe_E1B_troopssprint_4 +ch_khe_E1B_troopssprint_5 +ch_khe_E1B_troopssprint_6 +ch_khe_E1B_troopssprint_7 +coverstand_trans_OUT_M +coverstand_trans_IN_M +coverstand_hide_idle +coverstand_hide_idle_twitch01 +coverstand_hide_idle_twitch02 +coverstand_hide_idle_twitch03 +coverstand_hide_idle_twitch04 +coverstand_hide_idle_twitch05 +coverstand_react01 +coverstand_react02 +coverstand_react03 +coverstand_react04 +covercrouch_hide_idle +covercrouch_twitch_1 +covercrouch_twitch_2 +covercrouch_twitch_3 +covercrouch_twitch_4 +covercrouch_run_out_M +covercrouch_run_in_M +drone_gen_walk_01 +patrol_bored_patrolwalk +} +pow_drone +{ +patrol_bored_idle +patrol_bored_idle_smoke +patrol_bored_idle_cellphone +} +vorkuta_drone +{ +ai_prisoner_run_upright +ai_prisoner_run_hunched_A +ai_prisoner_run_hunched_B +ai_prisoner_run_hunched_C +ch_wmd_b01_grdweldingstand_loop +} \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/fxanim_props.atr b/BO1/PC/ZM/animtrees/fxanim_props.atr new file mode 100644 index 0000000..43031b4 --- /dev/null +++ b/BO1/PC/ZM/animtrees/fxanim_props.atr @@ -0,0 +1,371 @@ +fxanim_gp_windsock_anim +fxanim_gp_tarp1_anim +fxanim_gp_tarp2_anim +fxanim_gp_cloth01_anim +fxanim_gp_streamer01_anim +fxanim_gp_streamer02_anim +fxanim_gp_hueyinterior_anim +fxanim_gp_hueynecklace_anim +fxanim_gp_hueynecklace_drop_anim +fxanim_gp_distant_rappel_anim +fxanim_gp_crow_look_anim +fxanim_gp_crow_look02_anim +fxanim_gp_crow_eat_anim +fxanim_gp_crow_flap_anim +fxanim_gp_crow_jump_anim +fxanim_gp_crow_die_anim +fxanim_gp_crow_90rflyr_anim +fxanim_gp_crow_quickfly_anim +fxanim_gp_crow_walk01_anim +fxanim_gp_crow_90rfly_fast_anim +fxanim_gp_vinemed_anim +fxanim_gp_vinesm_anim +fxanim_gp_leafmed_anim +fxanim_gp_leafsm_anim +fxanim_gp_pant01_anim +fxanim_gp_shirt01_anim +fxanim_gp_shirt02_anim +fxanim_gp_snakeswim_anim +fxanim_gp_roaches_anim +fxanim_gp_blast_deflector_down_anim +fxanim_gp_tarp_wood_stack_anim +fxanim_gp_wirespark_long_anim +fxanim_gp_wirespark_med_anim +fxanim_gp_tree_aquilaria_dest01_anim +fxanim_gp_tree_aquilaria_dest02_anim +fxanim_gp_tree_palm_coco02_dest01_anim +fxanim_gp_tree_palm_coco02_dest02_anim +fxanim_gp_tarp_crate_stack_anim +fxanim_gp_blind_pulse01_full_anim +fxanim_gp_blind_pulse01_short_anim +fxanim_gp_blind_pulse01_torn_anim +fxanim_gp_blind_pulse01_open_anim +fxanim_gp_ceiling_light_swing_anim +fxanim_gp_hind_dashboard_break_anim +fxanim_gp_hind_dashboard_dmg_anim +fxanim_gp_hind_periscope_dmg_anim +fxanim_gp_hind_top_light_idle_anim +fxanim_gp_hind_top_light_break_anim +fxanim_gp_hind_top_light_dmg_anim +fxanim_gp_hind_wire01_break_anim +fxanim_gp_hind_wire01_dmg_anim +fxanim_gp_hind_wire02_break_anim +fxanim_gp_hind_wire02_dmg_anim +fxanim_gp_ceiling_fan_old_slow_anim +fxanim_gp_ceiling_fan_old_dest_anim +fxanim_gp_wire_sway_01_slow_anim +fxanim_gp_wire_sway_02_slow_anim +fxanim_gp_wire_sway_03_slow_anim +fxanim_gp_wire_sway_04_slow_anim +fxanim_gp_chain_650_anim +fxanim_gp_chain01_anim +fxanim_gp_chain02_anim +fxanim_gp_chain03_anim +fxanim_gp_snake_coiled_loop_anim +fxanim_gp_snake_coiled_death_anim +fxanim_gp_lantern_hang_on_anim +fxanim_gp_fence_tarp_01_anim +fxanim_gp_seagull_falling_anim +fxanim_gp_seagull_circle_01_anim +fxanim_gp_seagull_circle_02_anim +fxanim_gp_seagull_circle_03_anim +fxanim_gp_tree_aquilaria_dest01_sm_anim +fxanim_gp_tree_aquilaria_dest02_sm_anim +fxanim_gp_tree_palm_coco02_dest01_sm_anim +fxanim_gp_tree_palm_coco02_dest02_sm_anim +fxanim_gp_huey_int_idle_anim +fxanim_gp_huey_int_dmg_break_anim +fxanim_gp_huey_int_dmg_idle_anim +fxanim_gp_huey_uwb_necklace_idle_anim +fxanim_quag_hueyExplode_anim +fxanim_quag_courtyard_anim +fxanim_quag_bridgebreak_anim +fxanim_quag_shackfront_anim +fxanim_quag_shackside_anim +fxanim_quag_shacktop_anim +fxanim_quag_balcony01_anim +fxanim_quag_balcony02_anim +fxanim_quag_rappelcrash01_anim +fxanim_quag_rappelcrash02_anim +fxanim_quag_rappelfix_anim +fxanim_creek_fish1_anim +fxanim_creek_fish2_anim +fxanim_creek_fish3_anim +fxanim_creek_hut01_anim +fxanim_creek_windowdive_anim +fxanim_creek_windowshoot_anim +fxanim_creek_banner_anim +fxanim_creek_junk1_anim +fxanim_creek_junk2_anim +fxanim_creek_junk3_anim +fxanim_creek_waterhut_anim +fxanim_creek_vinecluster_anim +fxanim_creek_mg_anim +fxanim_creek_mgcurtainside_anim +fxanim_creek_mgcurtainfront_anim +fxanim_creek_overhang_anim +fxanim_creek_huey_debris01_anim +fxanim_creek_huey_debris02_anim +fxanim_creek_huey_debris03_anim +fxanim_creek_huey_debris04_anim +fxanim_creek_huey_debris05_anim +fxanim_creek_chickencoop_anim +fxanim_creek_cover_anim +fxanim_creek_hueydamage_anim +fxanim_creek_hueywire_anim +fxanim_creek_rat_01_anim +fxanim_creek_rat_02_anim +fxanim_creek_rat_03_anim +fxanim_creek_mgexplode_anim +fxanim_creek_rat_hole_lid_anim +fxanim_creek_cave_pillar_anim +fxanim_creek_cave_bolder_anim +fxanim_creek_cave_sprinkle_anim +fxanim_creek_cave_bolder_ceiling_anim +fxanim_creek_cave_fill_anim +fxanim_creek_net_anim +fxanim_creek_tarp_cover01_anim +fxanim_creek_crane01_anim +fxanim_creek_crane02_anim +fxanim_creek_cave_pillar_break_high_anim +fxanim_creek_cave_pillar_break_med_anim +fxanim_creek_cave_pillar_break_low_anim +fxanim_creek_cave_panel_anim +fxanim_creek_warroom_wires_anim +fxanim_creek_warroom_flags_anim +fxanim_creek_warroom_rocks_anim +fxanim_creek_zpu_hut_anim +fxanim_creek_door_kick_anim +fxanim_cuba_curtain_sheer_anim +fxanim_cuba_curtain_sheer_hang_anim +fxanim_cuba_lamppost_01_hit_anim +fxanim_cuba_lamppost_01_fall_anim +fxanim_cuba_line_flag01_anim +fxanim_cuba_line_flag02_anim +fxanim_cuba_radar_tower_anim +fxanim_cuba_truck_gaz63_flip_anim +fxanim_cuba_truck_gaz63_flip_01_anim +fxanim_cuba_truck_gaz63_flip_02_anim +fxanim_cuba_chandelier_fall_anim +fxanim_cuba_chandelier_sway_anim +fxanim_cuba_chandelier_boards_anim +fxanim_cuba_sign_anim +fxanim_cuba_car_anim +fxanim_cuba_car_fan_anim +fxanim_cuba_car_props_anim +fxanim_cuba_car_cig_anim +fxanim_cuba_rat_01_anim +fxanim_cuba_rat_02_anim +fxanim_flash_sheetmetal_anim +fxanim_flash_rockettarp_anim +fxanim_flash_trespassing_anim +fxanim_flash_lighttower_anim +fxanim_flash_rocket_explode_anim +fxanim_flash_rocket_launch_anim +fxanim_flash_rocket_panel_rattle_01_anim +fxanim_flash_rocket_panel_rattle_02_anim +fxanim_flash_rocket_wall_smash_anim +fxanim_flash_rocket_wall_debris_anim +fxanim_flash_rocket_debris_lrg_01_anim +fxanim_flash_c4_bunker_anim +fxanim_flash_ceiling_light_fall_anim +fxanim_flash_hide_body_tarp_anim +fxanim_flash_hide_body_tarp_idle_anim +fxanim_flash_snake_slither_anim +fxanim_flash_reel_rack_anim +fxanim_flash_table_throw_anim +fxanim_flash_chunk01smb_anim +fxanim_flash_chunk02lrgs_anim +fxanim_flash_chunk02sms_anim +fxanim_flash_chunk01lrgw_anim +fxanim_flash_barrel_01_anim +fxanim_flash_barrel_02_anim +fxanim_flash_barrel_03_anim +fxanim_flash_car_crash_anim +fxanim_flash_grenade_toss_anim +fxanim_fullahead_wires_anim +fxanim_fullahead_panel_rattle_anim +fxanim_fullahead_barrier_anim +fxanim_fullahead_bridge_anim +fxanim_fullahead_warehouse01_anim +fxanim_fullahead_ship_debris_anim +fxanim_fullahead_rocket_fall_anim +fxanim_mp_lift_anim +fxanim_mp_dustdevil_anim +fxanim_pow_woodbridge_anim +fxanim_pow_concbridge_sect01_anim +fxanim_pow_concbridge_sect02_anim +fxanim_pow_concbridge_sect03_anim +fxanim_pow_pipebridge_rope_anim +fxanim_pow_tent_collapse01_anim +fxanim_pow_cave_debris_anim +fxanim_pow_radar_tower_anim +fxanim_pow_tent_flap01_anim +fxanim_pow_tent_flap02_anim +fxanim_pow_rat_01_anim +fxanim_pow_rat_02_anim +fxanim_pow_rat_03_anim +fxanim_pow_cargohanging_hang_anim +fxanim_pow_cargohanging_lean_anim +fxanim_pow_cliff_debris1_01_anim +fxanim_pow_cliff_debris1_02_anim +fxanim_pow_cliff_debris2_01_anim +fxanim_pow_cliff_debris2_02_anim +fxanim_pow_cliff_debris3_03_anim +fxanim_pow_armoredwindow_break_anim +fxanim_hue_benches01_anim +fxanim_hue_wallshoot_anim +fxanim_hue_tile_broke_01_anim +fxanim_hue_tile_broke_03_anim +fxanim_hue_tile_broke_04_anim +fxanim_hue_tile_whole_01_anim +fxanim_hue_tile_whole_02_anim +fxanim_hue_ceiling_light_fall_anim +fxanim_hue_tank01_entrance_anim +fxanim_hue_tank01_death_anim +fxanim_hue_sign_leyna_anim +fxanim_hue_tank01_explode_anim +fxanim_hue_hatchback_anim +fxanim_hue_tank01_shake_anim +fxanim_hue_door_office_anim +fxanim_hue_balcony_anim +fxanim_hue_aagun_bldg_anim +fxanim_hue_aagun_anim +fxanim_hue_gate_kick_anim +fxanim_hue_gate_swing_anim +fxanim_hue_tank01_turret_anim +fxanim_wmd_fuel_hose_anim +fxanim_wmd_aspin_tanker_anim +fxanim_wmd_radar01_anim +fxanim_wmd_radar02_anim +fxanim_wmd_radar03_anim +fxanim_wmd_radar04_anim +fxanim_wmd_radar05_anim +fxanim_wmd_square_anetta_shake_anim +fxanim_wmd_truck_flip_anim +fxanim_wmd_catwalk_anim +fxanim_wmd_catwalk_fall_anim +fxanim_wmd_hangar_doors_anim +fxanim_wmd_heat_pipe01_anim +fxanim_wmd_heat_pipe02_anim +fxanim_wmd_electric_tower01_anim +fxanim_wmd_electric_tower02_anim +fxanim_wmd_electric_tower_top_anim +fxanim_wmd_ava_wall_anim +fxanim_wmd_avalanche_truck_anim +fxanim_wmd_parachute_anim +fxanim_kowloon_awning01_tear_anim +fxanim_kowloon_awning01_loop_anim +fxanim_kowloon_fishtank_lrg_loop_anim +fxanim_kowloon_fishtank_lrg_spill_anim +fxanim_kowloon_fishtank_sm_loop_anim +fxanim_kowloon_fishtank_sm_spill_01_anim +fxanim_kowloon_fishtank_sm_spill_02_anim +fxanim_kowloon_door_breach_anim +fxanim_kowloon_ceiling_collapse_anim +fxanim_kowloon_neon_sign_anim +fxanim_kowloon_ceiling_garbage_anim +fxanim_kowloon_neon_sign_alley_anim +fxanim_kowloon_weapon_cache_anim +fxanim_khesanh_tent_open_anim +fxanim_khesanh_apc_fall_01_anim +fxanim_khesanh_apc_fall_02_anim +fxanim_khesanh_hut_explode_anim +fxanim_khesanh_sandbags01_anim +fxanim_khesanh_sandbags_apc_anim +fxanim_khesanh_deadbody_tarp_idle_anim +fxanim_khesanh_deadbody_tarp_idle02_anim +fxanim_khesanh_barrel_01_anim +fxanim_khesanh_barrel_02_anim +fxanim_khesanh_barrel_03_anim +fxanim_khesanh_barrel_04_anim +fxanim_khesanh_barrel_05_anim +fxanim_khesanh_bunker01_anim +fxanim_khesanh_bunker02_anim +fxanim_khesanh_keychain_anim +fxanim_vorkuta_towers_anim +fxanim_vorkuta_heli_crash_anim +fxanim_vorkuta_elevator_wires_loop_anim +fxanim_vorkuta_elevator_wires_stop_anim +fxanim_vorkuta_doorblast_anim +fxanim_vorkuta_bridge01_anim +fxanim_vorkuta_bridge02_anim +fxanim_vorkuta_armory_anim +fxanim_vorkuta_canister_anim +fxanim_vorkuta_gate_locked_anim +fxanim_vorkuta_bike_tarp_anim +fxanim_rebirth_heli01_crash_anim +fxanim_rebirth_heli01_rotor_anim +fxanim_rebirth_heli01_chunks_anim +fxanim_rebirth_container_01_anim +fxanim_rebirth_container_02_anim +fxanim_rebirth_container_03_anim +fxanim_rebirth_gascan_01_anim +fxanim_rebirth_gascan_02_anim +fxanim_rebirth_gascan_03_anim +fxanim_rebirth_cargo_ropes_loop_anim +fxanim_rebirth_cargo_ropes_stop_anim +fxanim_river_woodbridge_anim +fxanim_river_tent01_anim +fxanim_river_tower_water_anim +fxanim_river_tower_land_anim +fxanim_river_tower_explode_anim +fxanim_river_pbr_props_anim +fxanim_river_bunker01_anim +fxanim_river_bunker02_anim +fxanim_river_boss_boat_death_anim +fxanim_river_plane_blocker_02_anim +fxanim_uwb_fwd_crows_nest_anim +fxanim_uwb_aft_crane_fall_anim +fxanim_uwb_aft_crane_fall_idle_anim +fxanim_uwb_aft_crane_idle_anim +fxanim_uwb_aft_railing_anim +fxanim_uwb_dbl_mast01_anim +fxanim_uwb_dbl_mast02_anim +fxanim_uwb_dbl_mast_platform_anim +fxanim_uwb_aft_radio_tower_anim +fxanim_uwb_aft_radio_flag_rail_anim +fxanim_uwb_fwd_radio_tower_anim +fxanim_uwb_fwd_radio_mast_anim +fxanim_uwb_aft_wire_tower_anim +fxanim_uwb_fwd_wire_tower_b_anim +fxanim_uwb_shiprope_sway_anim +fxanim_uwb_door_burst_anim +fxanim_uwb_sub_drop_anim +fxanim_uwb_sub_hoist_drop01_anim +fxanim_uwb_sub_hoist_drop02_anim +fxanim_uwb_sub_hoist_idle_anim +fxanim_uwb_sub_hoist_rise01_anim +fxanim_uwb_sub_hoist_rise02_anim +fxanim_uwb_sub_rise_anim +fxanim_uwb_umbilical_wires_amb_loop_anim +fxanim_uwb_umbilical_wires_pistons_loop_anim +fxanim_uwb_umbilical_wires_pistons_stop_anim +fxanim_uwb_umbilical_wires_spool_loop_anim +fxanim_uwb_umbilical_wires_spool_stop_anim +fxanim_uwb_umbilical_wires_taught_loop_anim +fxanim_uwb_umbilical_wires_taught_slack_anim +fxanim_uwb_umbilical_wires_taught_slack_loop_anim +fxanim_uwb_moon_pool_wires_anim +fxanim_uwb_panel_anim +fxanim_uwb_preserver_anim +fxanim_uwb_ropes_anim +fxanim_uwb_hallway1_anim +fxanim_uwb_hallway2_anim +fxanim_uwb_broadcast_pipe01_a_anim +fxanim_uwb_broadcast_pipe01_b_anim +fxanim_uwb_broadcast_pipe02_a_anim +fxanim_uwb_broadcast_pipe02_b_anim +fxanim_uwb_broadcast_wires_anim +fxanim_escape_respirator_anim +fxanim_escape_ceiling_sm_anim +fxanim_escape_ceiling_lrg_anim +fxanim_escape_ceiling_cement_anim +fxanim_escape_ui_throw_anim +fxanim_escape_wall_fall_anim +fxanim_escape_tray_curtains_anim +fxanim_escape_tray_anim +fxanim_escape_brainwash_wires_anim +fxanim_escape_brainwash_chains_anim +fxanim_escape_int_room_wires_single_anim +fxanim_escape_int_room_wires_multi_anim diff --git a/BO1/PC/ZM/animtrees/fxanim_props_dlc3.atr b/BO1/PC/ZM/animtrees/fxanim_props_dlc3.atr new file mode 100644 index 0000000..b324949 --- /dev/null +++ b/BO1/PC/ZM/animtrees/fxanim_props_dlc3.atr @@ -0,0 +1,31 @@ +fxanim_mp_roofvent_snow_anim +fxanim_mp_oildigger_anim +fxanim_mp_zoo_drapes_anim +fxanim_mp_zoo_lights_anim +fxanim_mp_zoo_lights_frnt_anim +fxanim_mp_zoo_lights_back_anim +fxanim_gp_streamer01_anim +fxanim_gp_streamer02_anim +fxanim_gp_wirespark_long_anim +fxanim_gp_wirespark_med_anim +fxanim_mp_os_contrl_wire_anim +fxanim_mp_os_pully_anim +fxanim_mp_os_sign_yellow_anim +fxanim_mp_os_sign_red_anim +fxanim_mp_os_light_hang_anim +fxanim_mp_zoo_fish_01_anim +fxanim_mp_zoo_rail_wire01_anim +fxanim_mp_zoo_rail_wire02_anim +fxanim_gp_chain01_anim +fxanim_gp_chain02_anim +fxanim_gp_chain03_anim +fxanim_zom_ship_crane01_hook_anim +fxanim_zom_ship_lifeboat_anim +fxanim_mp_grid_pennants_anim +fxanim_mp_htl_pool_umbrella_anim +fxanim_mp_htl_spotlight_anim +fxanim_mp_htl_pool_pennant1_anim +fxanim_mp_htl_pool_pennant2_anim +fxanim_mp_htl_pool_pennant3_anim +fxanim_mp_zoo_birdnet_ropes_anim +fxanim_mp_zoo_banner_anim \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/fxanim_props_dlc5.atr b/BO1/PC/ZM/animtrees/fxanim_props_dlc5.atr new file mode 100644 index 0000000..3d33d6d --- /dev/null +++ b/BO1/PC/ZM/animtrees/fxanim_props_dlc5.atr @@ -0,0 +1 @@ +fxanim_zom_ztem_crystal_small_anim \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/generic_human.atr b/BO1/PC/ZM/animtrees/generic_human.atr new file mode 100644 index 0000000..249e799 --- /dev/null +++ b/BO1/PC/ZM/animtrees/generic_human.atr @@ -0,0 +1,6031 @@ + +faces : client separate +{ +f_death_v1 +f_death_v2 +f_death_v3 +f_death_v4 +f_death_v5 +f_death_v6 +f_death_v7 +f_death_v8 +f_firing_v1 +f_firing_v2 +f_firing_v3 +f_firing_v4 +f_firing_v5 +f_firing_v6 +f_firing_v7 +f_firing_v8 +f_firing_v9 +f_firing_v10 +f_firing_v11 +f_firing_v12 +f_firing_v13 +f_firing_v14 +f_firing_v15 +f_idle_alert_v1 +f_idle_alert_v2 +f_idle_alert_v3 +f_idle_casual_v1 +f_im_reloading +f_melee_v1 +f_melee_v2 +f_melee_v3 +f_melee_v4 +f_pain_v1 +f_pain_v2 +f_pain_v3 +f_pain_v4 +f_pain_v5 +f_pain_v6 +f_react_v1 +f_react_v2 +f_react_v3 +f_react_v4 +f_react_v5 +f_running_v1 +f_running_v2 +} +body +{ +roebuck_80in_t_pose +void +ai_player_rig_test +rope_test +bh_rope_idle_le +bh_rope_idle_ri +bh_rope_idle_cargoship_begin_ri +bh_rope_drop_le +bh_rope_drop_ri +bh_rope_drop_cargoship_begin_ri +upperbody +{ +} +shoot +{ +stand_shoot : nonloopsync +{ +stand_shoot_straight +stand_shoot_up +stand_shoot_down +} +stand_shoot_auto : loopsync +{ +stand_shoot_auto_straight +stand_shoot_auto_up +stand_shoot_auto_down +} +crouch_shoot : nonloopsync +{ +crouch_shoot_straight +crouch_shoot_straight_cod5 +crouch_shoot_up +crouch_shoot_down +} +crouch_shoot_auto : loopsync +{ +crouch_shoot_auto_straight +crouch_shoot_auto_up +crouch_shoot_auto_down +} +stand_aim +{ +stand_aim_straight +stand_aim_up +stand_aim_down +pistol_standaim_idle +} +crouch_aim +{ +crouch_aim_straight +crouch_aim_straight_cod5 +crouch_aim_up +crouch_aim_down +pistol_crouchaim_idle +} +pistol_crouchaimstraight2stand +} +stand_and_crouch +{ +crouch_alert_A_idle +crouch_alert_A_twitch +crouch_alert_B_idle1 +crouch_alert_B_twitch1 +crouch2stand +unarmed_crouch_idle1 +unarmed_crouch_twitch1 +unarmed_walk_slow +standunarmed_idle_loop +casual_stand_v2_idle +casual_stand_v2_twitch_radio +casual_stand_v2_twitch_shift +casual_stand_v2_twitch_talk +ai_viet_casual_stand_v2_idle +ai_viet_casual_stand_v2_twitch_shift +ai_zombie_boss_enrage_start +ai_zombie_boss_enrage_start_coast +ai_zombie_boss_enrage_start_a_coast +ai_zombie_boss_enrage_start_scream_coast +ai_zombie_boss_enrage_start_slamground_coast +ai_zombie_boss_emerge_from_water +ai_zombie_boss_return_to_water +ai_zombie_boss_nuke_react_coast +ai_zombie_boss_stumble_coast +ai_zombie_boss_flinger_flail_coast +ai_zombie_boss_caveslide_traverse_coast +ai_zombie_boss_sprint_2_walk_coast +ai_zombie_boss_walk_2_sprint_coast +casual_crouch_idle +casual_crouch_idle_in +casual_crouch_idle_out +casual_crouch_twitch +casual_crouch_point +casual_stand_idle +casual_stand_idle_trans_in +casual_stand_idle_trans_out +casual_stand_idle_twitch +casual_stand_idle_twitchB +ai_viet_casual_stand_idle +ai_viet_casual_stand_idle_trans_in +ai_viet_casual_stand_idle_trans_out +ai_viet_casual_stand_idle_twitch +ai_viet_casual_stand_idle_twitchB +patrol_bored_walk_2_bored +patrol_bored_2_combat_alarm +patrol_bored_2_combat_alarm_short +patrol_bored_idle +patrol_bored_idle_smoke +patrol_bored_idle_cellphone +patrol_bored_twitch_bug +patrol_bored_twitch_checkphone +patrol_bored_twitch_salute +patrol_bored_twitch_stretch +patrol_bored_2_walk +patrol_bored_2_walk_180turn +patrol_bored_react_look_v1 +patrol_bored_react_look_v2 +patrol_bored_react_walkstop +patrol_bored_react_walkstop_short +patrol_bored_react_look_advance +patrol_bored_react_look_retreat +patrol_boredwalk_find +patrol_boredjog_find +patrol_boredrun_find +patrol_boredwalk_lookcycle_A +patrol_boredwalk_lookcycle_B +ai_spets_patrolwalk +ai_spets_patrolwalk_180turn +ai_spets_patrolwalk_2_stand +ai_spets_patrolstand_idle +ai_spets_patrolstand_2_walk +cqb_stand_idle +cqb_stand_twitch +stand_alert_1 +stand_alert_2 +stand_alert_3 +patrolstand_twitch +patrolstand_look +patrolstand_idle +RPG_stand_throw +RPG_crouch_throw +shuffle +{ +stand_alerta_shuffle_forward +stand_alertb_shuffle_forward +} +stand_alertb_idle1 +stand_alertb_twitch1 +ai_mg_shoulder_stand_idle +ai_mg_shoulder_run2stand +ai_mg_shoulder_crouch_idle +ai_mg_shoulder_run2crouch +ai_flamethrower_stand_idle_casual_v1 +ai_flamethrower_stand_twitch +ai_flamethrower_crouch_idle_a +ai_flamethrower_crouch_idle_b +ai_flamethrower_crouch_twitch +ai_zombie_idle_v1_delta +ai_zombie_idle_crawl_delta +ai_zombie_quad_idle +ai_zombie_quad_idle_2 +ai_zombie_boss_idle_a +ai_zombie_boss_idle_b +ai_zombie_boss_idle_confused +ai_zombie_boss_idle_a_coast +ai_zombie_boss_idle_b_coast +ai_semianaut_attack_v1 +ai_zombie_simianaut_chest_beat +ai_zombie_simianaut_ground_pound +ai_zombie_simianaut_idle +ai_zombie_simianaut_react_nuke +ai_zombie_simianaut_react_tgun +ai_zombie_simianaut_run +ai_zombie_simianaut_run_fast +ai_zombie_simianaut_run_man +ai_zombie_simianaut_run_side +ai_zombie_simianaut_run_wounded +ai_zombie_simianaut_taunt +ai_zombie_simianaut_walk +ai_zombie_monkey_attack_01 +ai_zombie_monkey_attack_02 +ai_zombie_monkey_attack_03 +ai_zombie_monkey_attack_04 +ai_zombie_monkey_attack_05 +ai_zombie_monkey_attack_06 +ai_zombie_monkey_attack_07 +ai_zombie_monkey_attack_perks_front +ai_zombie_monkey_attack_perks_left +ai_zombie_monkey_attack_perks_left_top +ai_zombie_monkey_attack_perks_right +ai_zombie_monkey_attack_perks_right_top +ai_zombie_monkey_attack_perks_left_top_jugg +ai_zombie_monkey_attack_perks_right_top_jugg +ai_zombie_monkey_attack_perks_left_top_marathon +ai_zombie_monkey_attack_perks_right_top_marathon +ai_zombie_monkey_attack_perks_left_top_revive +ai_zombie_monkey_attack_perks_right_top_revive +ai_zombie_monkey_attack_perks_left_top_speed +ai_zombie_monkey_attack_perks_right_top_speed +ai_zombie_monkey_portal_jump_01 +ai_zombie_monkey_groundpound_01 +ai_zombie_monkey_groundpound_02 +ai_zombie_monkey_groundpound_03 +ai_zombie_monkey_groundpound_04 +ai_zombie_monkey_idle_01 +ai_zombie_monkey_run_01 +ai_zombie_monkey_run_02 +ai_zombie_monkey_sprint_01 +ai_zombie_monkey_sprint_02 +ai_zombie_monkey_sprint_03 +ai_zombie_monkey_sprint_04 +ai_zombie_monkey_death_01 +ai_zombie_monkey_death_02 +ai_zombie_monkey_death_03 +ai_zombie_monkey_taunt_01 +ai_zombie_monkey_taunt_02 +ai_zombie_monkey_taunt_03 +ai_zombie_monkey_taunt_04 +ai_zombie_monkey_taunt_05 +ai_zombie_monkey_jump_up_222 +ai_zombie_monkey_jump_down_222 +ai_zombie_monkey_jump_down_40 +ai_zombie_monkey_jump_down_72 +ai_zombie_monkey_jump_down_127 +ai_zombie_monkey_jump_down_184 +ai_zombie_monkey_jump_down_190 +ai_zombie_monkey_jump_down_240 +ai_zombie_monkey_grenade_throw_back_run_01 +ai_zombie_monkey_grenade_throw_back_run_02 +ai_zombie_monkey_grenade_throw_back_run_03 +ai_zombie_monkey_grenade_throw_back_run_04 +ai_zombie_monkey_grenade_throw_back_still_01 +ai_zombie_monkey_grenade_throw_back_still_02 +ai_zombie_monkey_grenade_throw_back_still_03 +ai_zombie_monkey_grenade_throw_back_still_04 +ai_zombie_monkey_thundergun_roll_01 +ai_zombie_monkey_thundergun_roll_02 +ai_zombie_monkey_thundergun_roll_03 +ai_zombie_monkey_thundergun_roll_04 +ai_zombie_monkey_watervator_400 +ai_zombie_monkey_watervator_400_alt +ai_zombie_monkey_slide_traverse +ai_zombie_tech_idle_base +ai_zombie_tech_taunt_a +ai_zombie_tech_taunt_b +ai_zombie_electrician_run +ai_zombie_electrician_run_v2 +ai_zombie_electrician_walk +ai_zombie_tech_grab +ai_zombie_tech_death_fallbackward +ai_zombie_tech_death_fallforward +ai_zombie_blackhole_death_v1 +ai_zombie_blackhole_death_v2 +ai_zombie_blackhole_death_v3 +ai_zombie_blackhole_crawl_death_v1 +ai_zombie_blackhole_crawl_death_v2 +ai_zombie_blackhole_crawl_death_v3 +ai_zombie_blackhole_death_preburst_v1 +ai_zombie_blackhole_death_preburst_v2 +ai_zombie_blackhole_death_preburst_v3 +ai_zombie_blackhole_death_preburst_v4 +ai_zombie_quad_blackhole_death_v1 +ai_zombie_quad_blackhole_death_v2 +ai_zombie_quad_blackhole_death_preburst_v1 +ai_zombie_quad_blackhole_death_preburst_v2 +stand_grenade_throw +stand_grenade_return_throw +stand_grenade_return_kick +crouch_grenade_throw +crouch_grenade_return_throw +crouch_grenade_return_fumble +grenade_return_running_kick_forward_1 +grenade_return_running_kick_forward_2 +grenade_return_running_throw_forward +grenade_return_standing_throw_forward_1 +grenade_return_standing_throw_forward_2 +grenade_return_standing_throw_overhand_forward +stand2crouch_attack +crouch2crouchwalk_straight +ai_civilian_walk_slow +ch_interrogation_chair_idle_full_char +ch_inter_01_hudson +ch_inter_01_weaver +ch_inter_02_interrogator +ch_inter_03_hudson +ch_inter_03_weaver +ch_inter_04_interrogator +ch_inter_05_interrogator +ch_inter_06_interrogator +ch_frontend_guy_01_enter +ch_frontend_guy_01_exit +ch_frontend_guy_01_loop +ch_frontend_guy_02_enter +ch_frontend_guy_02_exit +ch_frontend_guy_02_loop +ai_sergei_stand_idle +ai_prisoner_stand_idle +ai_civ_gen_casual_stand_idle +ai_civ_gen_casual_stand_idle_twitch_01 +ai_civ_gen_casual_stand_idle_twitch_02 +ai_civ_gen_cower_stand_idle +ai_civ_gen_cower_stand_idle_twitch_01 +ai_civ_gen_cower_stand_idle_twitch_02 +ai_civ_gen_cower_stand_idle_twitch_03 +ai_baton_stand_idle +crouch2crouchrun : nonloopsync +{ +crouch2crouchrun_forward +crouch2crouchrun_back +crouch2crouchrun_left +crouch2crouchrun_right +pistol_crouch2crouchrun_forward +} +walk_and_run_loops : loopsync +{ +crouchwalk_loop +ai_civ_gen_walk_01 +ai_civ_gen_run_01 +civilian_run_hunched_A +civilian_run_hunched_B +civilian_run_hunched_C +civilian_run_upright +ai_prisoner_run_upright +ai_prisoner_run_hunched_A +ai_prisoner_run_hunched_B +ai_prisoner_run_hunched_C +ai_sergei_run_upright +combatrun[blend = 0.5] +{ +combatrun_forward +{ +run_lowready_F +crouch_fastwalk_F +combat_run_fast_pistol +combatrun_forward_1[blend = 0.5] +combatrun_forward_2[blend = 0.2, rate = 0.5] +combat_run_fast_3 +mocap_run +precombatrun1 +wounded_run_forward1 +run_CQB_F_search_v1 +run_CQB_F_search_v2 +unarmed_run_delta +bog_a_javelin_jog +sprint1_loop +huntedrun_1_idle +huntedrun_1_look_left +huntedrun_1_look_right +huntedrun_2 +ai_cqb_sprint +walk_CQB_F_search_v1 +walk_CQB_F_search_v2 +walk_CQB_F +walk_left +walk_right +Juggernaut_walkF +Juggernaut_sprint +hunted_dazed_walk_A_zombie +hunted_dazed_walk_B_blind +hunted_dazed_walk_C_limp +run_lowready_reload +ai_cqb_walk_f_reload +ai_cqb_run_f_reload +active_patrolwalk_v1 +active_patrolwalk_v2 +active_patrolwalk_v3 +active_patrolwalk_v4 +active_patrolwalk_v5 +shotgun_CQBrun_pullout +shotgun_CQBrun_putaway +ai_CQBrun_weaponswitch +ai_run_lowready_f_weaponswitch +ai_walk_deep_water_a +ai_walk_deep_water_b +ai_run_deep_water_a +ai_run_deep_water_b +ai_walk_shallow_water_a +ai_walk_shallow_water_b +ai_run_shallow_water_a +ai_run_shallow_water_b +run_n_gun_F +run_n_gun_l +run_n_gun_r +ai_rusher_semi_run_n_gun_F +ai_rusher_semi_run_n_gun_L +ai_rusher_semi_run_n_gun_R +ai_rusher_shotgun_walk_n_gun_F +ai_rusher_shotgun_walk_n_gun_L +ai_rusher_shotgun_walk_n_gun_R +ai_viet_run_n_gun_F +ai_viet_run_n_gun_L +ai_viet_run_n_gun_R +ai_zombie_walk_v1 +ai_zombie_walk_v2 +ai_zombie_walk_v3 +ai_zombie_walk_v4 +ai_zombie_walk_v6 +ai_zombie_walk_v7 +ai_zombie_walk_v8 +ai_zombie_walk_v9 +ai_zombie_jap_run_v1 +ai_zombie_jap_run_v2 +ai_zombie_jap_run_v3 +ai_zombie_jap_run_v4 +ai_zombie_jap_run_v5 +ai_zombie_jap_run_v6 +ai_zombie_jap_walk_v1 +ai_zombie_jap_walk_v2 +ai_zombie_jap_walk_v3 +ai_zombie_jap_walk_v4 +ai_zombie_jap_walk_B +ai_zombie_jap_walk_A +ai_zombie_walk_fast_v1 +ai_zombie_walk_fast_v2 +ai_zombie_walk_fast_v3 +ai_zombie_run_v1 +ai_zombie_run_v2 +ai_zombie_run_v3 +ai_zombie_run_v4 +ai_zombie_sprint_v1 +ai_zombie_sprint_v2 +ai_zombie_sprint_v3 +ai_zombie_sprint_v4 +ai_zombie_sprint_v5 +ai_zombie_fast_sprint_01 +ai_zombie_fast_sprint_02 +ai_zombie_crawl +ai_zombie_crawl_v1 +ai_zombie_crawl_v2 +ai_zombie_crawl_v3 +ai_zombie_crawl_v4 +ai_zombie_crawl_v5 +ai_zombie_crawl_v6 +ai_zombie_walk_on_hands_a +ai_zombie_walk_on_hands_b +ai_zombie_walk_on_hands_rise +ai_zombie_walk_on_hands_fall +ai_zombie_crawl_sprint +ai_zombie_crawl_sprint_1 +ai_zombie_crawl_sprint_2 +ai_zombie_crawl_supersprint +ai_zombie_boss_walk_a +ai_zombie_boss_sprint_a +ai_zombie_boss_sprint_b +ai_zombie_boss_walk_a_coast +ai_zombie_boss_walk_slow_coast +ai_zombie_boss_run_a_coast +ai_zombie_boss_run_b_coast +ai_zombie_boss_run_c_coast +ai_zombie_boss_run_d_coast +ai_zombie_boss_sprint_a_coast +ai_zombie_boss_sprint_b_coast +ai_zombie_quad_crawl +ai_zombie_quad_crawl_2 +ai_zombie_quad_crawl_3 +ai_zombie_quad_crawl_run +ai_zombie_quad_crawl_run_2 +ai_zombie_quad_crawl_run_3 +ai_zombie_quad_crawl_run_4 +ai_zombie_quad_crawl_run_5 +ai_zombie_quad_crawl_sprint +ai_zombie_quad_crawl_sprint_2 +ai_zombie_quad_crawl_sprint_3 +ai_zombie_quad_supersprint +ai_zombie_quad_crawl_01 +ai_zombie_quad_crawl_02 +ai_zombie_quad_crawl_03 +ai_zombie_napalm_run_01 +ai_zombie_napalm_run_02 +ai_zombie_napalm_run_03 +ai_zombie_sonic_run_01 +ai_zombie_sonic_run_02 +ai_zombie_sonic_run_03 +ai_zombie_blackhole_walk_slow_v1 +ai_zombie_blackhole_walk_slow_v2 +ai_zombie_blackhole_walk_slow_v3 +ai_zombie_blackhole_walk_fast_v1 +ai_zombie_blackhole_walk_fast_v2 +ai_zombie_blackhole_walk_fast_v3 +ai_zombie_blackhole_crawl_slow_v1 +ai_zombie_blackhole_crawl_slow_v2 +ai_zombie_blackhole_crawl_fast_v1 +ai_zombie_blackhole_crawl_fast_v2 +ai_zombie_blackhole_crawl_fast_v3 +ai_zombie_quad_blackhole_crawl_slow_v1 +ai_zombie_quad_blackhole_crawl_fast_v1 +ai_zombie_quad_blackhole_crawl_slow_v2 +ai_zombie_quad_blackhole_crawl_fast_v2 +ai_zombie_caveslide_traverse +ai_zombie_walk_moon_v1 +ai_zombie_walk_moon_v2 +ai_zombie_walk_moon_v3 +ai_zombie_walk_moon_v4 +ai_zombie_run_moon_v1 +ai_zombie_run_moon_v2 +ai_zombie_run_moon_v3 +ai_zombie_run_moon_v4 +ai_zombie_sprint_moon_v1 +ai_zombie_sprint_moon_v2 +ai_zombie_sprint_moon_v3 +ai_zombie_sprint_moon_v4 +ai_zombie_supersprint_lowg +ai_zombie_crawl_moon_v1 +ai_zombie_crawl_moon_v2 +ai_zombie_crawl_moon_v3 +ai_zombie_crawl_supersprint_lowg +ai_zombie_astro_walk_moon_v1 +ai_zombie_quad_crawl_moon +ai_zombie_quad_crawl_moon_01 +ai_zombie_quad_crawl_run_moon +ai_zombie_quad_crawl_run_moon_2 +ai_zombie_quad_crawl_run_moon_3 +ai_zombie_quad_crawl_run_moon_4 +ai_zombie_quad_crawl_run_moon_5 +ai_zombie_quad_crawl_sprint_moon +ai_zombie_quad_crawl_sprint_moon_2 +ai_zombie_quad_crawl_sprint_moon_3 +ai_zombie_quad_supersprint_lowg +patrol_bored_patrolwalk +patrol_bored_patrolwalk_twitch +patrol_jog +patrol_jog_look_up +patrol_jog_360 +patrol_jog_orders +combat_jog +combat_jog_lookback +combat_jog_lookside +ai_flamethrower_combatrun_a +ai_flamethrower_combatrun_b +ai_flamethrower_combatrun_c +ai_barnes_run_f +ai_reznov_run_f +ai_spetz_run_f +ai_viet_run_lowready_f +ai_rusher_semi_run_lowready_F +ai_rusher_shotgun_walk_lowready_F +ai_run_lowready_F_wounded +ai_viet_run_f_wounded +ai_viet_run_l_wounded +ai_viet_run_r_wounded +ai_spetz_run_f_wounded +ai_viet_ak47_rusher_run_f_wounded +ai_spets_rusher_run_f_01 +ai_spets_rusher_run_f_02 +ai_spets_rusher_run_f_03 +ai_spets_rusher_run_f_a_01 +ai_spets_rusher_run_f_a_02 +ai_spets_rusher_run_f_a_03 +ai_pistol_run_lowready_f +ai_pistol_run_n_gun_f +ai_pistol_run_n_gun_l +ai_pistol_run_n_gun_r +ai_pistol_rusher_run_f +ai_pistol_rusher_run_r +ai_pistol_rusher_run_l +ai_baton_run_f +ai_sprint_f +} +walk_backward +combatrun_back +combatrun_left +combatrun_right +run_lowready_L +run_lowready_R +run_lowready_B +run_n_gun_B +crouch_fastwalk_B +crouch_fastwalk_L +crouch_fastwalk_R +ai_rusher_semi_run_n_gun_B +ai_rusher_shotgun_walk_n_gun_B +ai_viet_run_n_gun_B +Juggernaut_walkR +Juggernaut_walkL +Juggernaut_walkB +ai_viet_run_lowready_r +ai_viet_run_lowready_l +ai_viet_run_lowready_b +ai_viet_run_lowready_f_lean_l +ai_viet_run_lowready_f_lean_r +ai_viet_run_b_wounded +ai_viet_run_lowready_l_wounded +ai_viet_run_lowready_r_wounded +ai_viet_run_f_wounded_lean_l +ai_viet_run_f_wounded_lean_r +ai_rusher_semi_run_lowready_R +ai_rusher_semi_run_lowready_L +ai_rusher_semi_run_lowready_B +ai_rusher_shotgun_walk_lowready_R +ai_rusher_shotgun_walk_lowready_L +ai_rusher_shotgun_walk_lowready_B +ai_run_lowready_f_lean_l +ai_run_lowready_f_lean_r +walk_lowready_L +walk_lowready_R +walk_lowready_B +walk_lowready_F +ai_bonzai_sprint_a +ai_bonzai_sprint_b +ai_bonzai_sprint_c +ai_bonzai_sprint_d +ai_mg_shoulder_run +ai_idle_strafe_forward_a +ai_idle_strafe_forward_b +ai_idle_strafe_forward_c +ai_idle_strafe_left_a +ai_idle_strafe_left_b +ai_idle_strafe_left_c +ai_idle_strafe_right_a +ai_idle_strafe_right_b +ai_idle_strafe_right_c +ai_pistol_idle_strafe_forward_a +ai_pistol_idle_strafe_forward_b +ai_pistol_idle_strafe_forward_c +ai_pistol_idle_strafe_left_a +ai_pistol_idle_strafe_left_b +ai_pistol_idle_strafe_left_c +ai_pistol_idle_strafe_right_a +ai_pistol_idle_strafe_right_b +ai_pistol_idle_strafe_right_c +ai_pistol_run_n_gun_b +ai_pistol_rusher_run_b +ai_pistol_run_r +ai_pistol_run_l +ai_pistol_run_b +ai_pistol_run_fwd_lean_l +ai_pistol_run_fwd_lean_r +run_aim_2 : additive +{ +ai_run_n_gun_f_aim_2 +ai_crouch_fastwalk_f_aim_2 +ai_viet_run_f_wounded_aim_2 +ai_viet_run_n_gun_F_aim_2 +ai_viet_run_n_gun_B_aim_2 +ai_pistol_run_f_aim_2 +ai_pistol_idle_strafe_forward_aim2 +ai_pistol_rusher_run_f_aim2 +walk_aim_2 +} +run_aim_4 : additive +{ +ai_run_n_gun_f_aim_4 +ai_crouch_fastwalk_f_aim_4 +ai_viet_run_f_wounded_aim_4 +ai_viet_run_n_gun_F_aim_4 +ai_viet_run_n_gun_B_aim_4 +ai_pistol_run_f_aim_4 +ai_pistol_idle_strafe_forward_aim4 +ai_pistol_rusher_run_f_aim4 +walk_aim_4 +} +run_aim_6 : additive +{ +ai_run_n_gun_f_aim_6 +ai_crouch_fastwalk_f_aim_6 +ai_viet_run_f_wounded_aim_6 +ai_viet_run_n_gun_F_aim_6 +ai_viet_run_n_gun_B_aim_6 +ai_pistol_run_f_aim_6 +ai_pistol_idle_strafe_forward_aim6 +ai_pistol_rusher_run_f_aim6 +walk_aim_6 +} +run_aim_8 : additive +{ +ai_run_n_gun_f_aim_8 +ai_crouch_fastwalk_f_aim_8 +ai_viet_run_f_wounded_aim_8 +ai_viet_run_n_gun_F_aim_8 +ai_viet_run_n_gun_B_aim_8 +ai_pistol_run_f_aim_8 +ai_pistol_idle_strafe_forward_aim8 +ai_pistol_rusher_run_f_aim8 +walk_aim_8 +} +} +stand_walk_combat_loop_01 +stand_walk_combat_loop_02 +stand_walk_combat_loop_03 +MG42_run +saw_gunner_run_fast +saw_gunner_run_slow +RPG_run_onshoulder +duhoc_german_shellshocked_walk +combat_run_onehand +combat_run_helmethand +unarmed_walk_russian +unarmed_run_russian +patrolwalk_tired +patrolwalk_swagger +patrolwalk_bounce +stand_shoot_run +{ +stand_shoot_run_forward +stand_shoot_run_back +stand_shoot_run_left +stand_shoot_run_right +} +crouch_shoot_run +{ +crouch_shoot_run_forward +crouch_shoot_run_back +crouch_shoot_run_left +crouch_shoot_run_right +} +} +stand_walk_stop_lff +stand_walk_stop_rff +crouchwalk_stop_rff +crouchrun2prone_straight +crouchrun2prone_left +crouchrun2prone_right +reloads +{ +reload_stand_rifle +} +exposed_dive_grenade_F +exposed_dive_grenade_B +exposed_squat_down_grenade_F +exposed_squat_idle_grenade_F +ai_exposed_dive_grenade_f_large +ai_exposed_dive_grenade_b_large +ai_exposed_squat_down_grenade_f_large +ai_exposed_squat_idle_grenade_f_large +grenadehide_crouch2left +grenadehide_left +grenadehide_left2crouch +grenadehide_crouch2right +grenadehide_right +grenadehide_right2crouch +} +exposed_modern +{ +CQB_stand_wave_on_me +CQB_stand_wave_go_v1 +CQB_stand_signal_stop +CQB_stand_signal_move_up +CQB_stand_signal_move_out +exposed_aiming +{ +ai_zombie_idle_base +ai_zombie_idle_crawl_base +exposed_aim_5 +exposed_crouch_aim_5 +covercrouch_aim5 +covercrouch_lean_aim5 +pistol_stand_aim_5 +RPG_stand_aim_5 +RPG_crouch_aim_5 +CornerStndL_lean_aim_5 +CornerStndR_lean_aim_5 +CQB_stand_aim5 +prone_aim_5 +shotgun_aim_5 +shotgun_crouch_aim_5 +heat_stand_aim_5 +Juggernaut_aim5 +ai_flamethrower_aim_5 +ai_flamethrower_crouch_aim_5 +covercrouch_rechamber +exposed_rechamber +ai_viet_exposed_aim_5 +ai_viet_exposed_crouch_aim_5 +ai_pillar_stand_aim5_r_idle +ai_pillar_stand_aim5_l_idle +ai_pillar_crouch_aim5_r_idle +ai_pillar_crouch_aim5_l_idle +ai_cover_crouch_suppressed_l_aim5 +ai_cover_crouch_suppressed_r_aim5 +ai_pistol_stand_exposed_aim_5 +ai_pistol_crouch_exposed_aim_5 +ai_pistol_rusher_stand_exposed_aim5 +ai_pistol_crouchcover_hide_aim_5 +ai_pistol_crouchcorner_right_aim_5 +ai_pistol_crouchcorner_left_aim_5 +ai_pistol_standcover_hide_aim_5 +ai_pistol_cornerstand_right_aim_5 +ai_pistol_cornerstand_left_aim_5 +ai_m202_heat_stand_aim_5 +evasive +{ +ai_spets_rusher_roll_forward_01 +ai_spets_rusher_roll_forward_02 +ai_spets_rusher_roll_45l_2_run_01 +ai_spets_rusher_roll_45l_2_run_02 +ai_spets_rusher_roll_45l_2_run_a_01 +ai_spets_rusher_roll_45l_2_run_a_02 +ai_spets_rusher_roll_45r_2_run_01 +ai_spets_rusher_roll_45r_2_run_02 +ai_spets_rusher_roll_45r_2_run_a_01 +ai_spets_rusher_roll_45r_2_run_a_02 +ai_spets_rusher_step_45l_2_run_01 +ai_spets_rusher_step_45l_2_run_02 +ai_spets_rusher_step_45l_2_run_a_01 +ai_spets_rusher_step_45l_2_run_a_02 +ai_spets_rusher_step_45r_2_run_01 +ai_spets_rusher_step_45r_2_run_02 +ai_spets_rusher_step_45r_2_run_a_01 +ai_spets_rusher_step_45r_2_run_a_02 +ai_spets_pistol_rusher_step_45l_2_run_01 +ai_spets_pistol_rusher_step_45r_2_run_01 +ai_spets_pistol_rusher_roll_45l_2_run_01 +ai_spets_pistol_rusher_roll_45r_2_run_01 +ai_spets_pistol_rusher_roll_forward_01 +exposed_crouch_2_stand +ai_flamethrower_crouch_2_stand +exposed_stand_2_crouch +ai_flamethrower_stand_2_crouch +ai_viet_exposed_crouch_2_stand +ai_spets_aim_aware_stand_1_a +ai_spets_aim_aware_stand_1_b +ai_spets_aim_aware_stand_3_a +ai_spets_aim_aware_stand_3_b +ai_spets_aim_aware_stand_4_a +ai_spets_aim_aware_stand_4_b +ai_spets_aim_aware_stand_6_a +ai_spets_aim_aware_stand_6_b +ai_spets_aim_aware_stand_7_a +ai_spets_aim_aware_stand_7_b +ai_spets_aim_aware_stand_9_a +ai_spets_aim_aware_stand_9_b +ai_spets_aim_aware_crouch_1_a +ai_spets_aim_aware_crouch_1_b +ai_spets_aim_aware_crouch_3_a +ai_spets_aim_aware_crouch_3_b +ai_spets_aim_aware_crouch_4_a +ai_spets_aim_aware_crouch_4_b +ai_spets_aim_aware_crouch_6_a +ai_spets_aim_aware_crouch_6_b +ai_spets_aim_aware_crouch_7_a +ai_spets_aim_aware_crouch_7_b +ai_spets_aim_aware_crouch_9_a +ai_spets_aim_aware_crouch_9_b +ai_pistol_crouch_2_stand +ai_pistol_stand_2_crouch +ai_idle_strafe_exposed_to_left +ai_idle_strafe_exposed_to_right +ai_idle_strafe_exposed_to_forward +ai_idle_strafe_left_to_exposed +ai_idle_strafe_right_to_exposed +ai_idle_strafe_forward_to_exposed +ai_pistol_idle_strafe_exposed_to_left +ai_pistol_idle_strafe_exposed_to_right +ai_pistol_idle_strafe_exposed_to_forward +ai_pistol_idle_strafe_left_to_exposed +ai_pistol_idle_strafe_right_to_exposed +ai_pistol_idle_strafe_forward_to_exposed +} +aim_4 : additive +{ +exposed_aim_4 +exposed_turn_aim_4 +exposed_crouch_aim_4 +exposed_crouch_turn_aim_4 +covercrouch_aim4_add +pistol_stand_aim_4_add +pistol_stand_aim_4_alt +RPG_stand_aim_4 +RPG_crouch_aim_4 +CornerStndL_lean_aim_4 +CornerStndR_lean_aim_4 +CQB_stand_aim4 +prone_aim_4_add +shotgun_aim_4 +shotgun_crouch_aim_4 +heat_stand_aim_4 +ai_flame_fire_left +ai_flamethrower_aim_4 +ai_flamethrower_crouch_aim_4 +covercrouch_rechamber_aim_left +exposed_rechamber_left +ai_viet_exposed_aim_4 +ai_viet_exposed_crouch_aim_4 +ai_viet_exposed_crouch_turn_aim_4 +ai_viet_exposed_turn_aim_4 +ai_pillar_crouch_aim4_r +ai_pillar_crouch_aim4_l +ai_pillar_stand_aim4_r +ai_pillar_stand_aim4_l +ai_cover_crouch_suppressed_l_aim4 +ai_cover_crouch_suppressed_r_aim4 +ai_run_f_aim_4 +ai_pistol_stand_exposed_aim_4 +ai_pistol_crouch_exposed_aim_4 +ai_pistol_rusher_stand_exposed_aim4 +ai_pistol_crouchcorner_left_aim_4 +ai_pistol_crouchcorner_right_aim_4 +ai_pistol_crouchcover_hide_aim_4 +ai_pistol_standcover_hide_aim_4 +ai_pistol_cornerstand_right_aim_4 +ai_pistol_cornerstand_left_aim_4 +ai_m202_heat_stand_aim_4 +} +aim_6 : additive +{ +exposed_aim_6 +exposed_turn_aim_6 +exposed_crouch_aim_6 +exposed_crouch_turn_aim_6 +covercrouch_aim6_add +pistol_stand_aim_6_add +pistol_stand_aim_6_alt +RPG_stand_aim_6 +RPG_crouch_aim_6 +CornerStndL_lean_aim_6 +CornerStndR_lean_aim_6 +CQB_stand_aim6 +prone_aim_6_add +shotgun_aim_6 +shotgun_crouch_aim_6 +heat_stand_aim_6 +ai_flame_fire_right +ai_flamethrower_aim_6 +ai_flamethrower_crouch_aim_6 +covercrouch_rechamber_aim_right +exposed_rechamber_right +ai_viet_exposed_aim_6 +ai_viet_exposed_crouch_aim_6 +ai_viet_exposed_crouch_turn_aim_6 +ai_viet_exposed_turn_aim_6 +ai_pillar_crouch_aim6_r +ai_pillar_crouch_aim6_l +ai_pillar_stand_aim6_r +ai_pillar_stand_aim6_l +ai_cover_crouch_suppressed_l_aim6 +ai_cover_crouch_suppressed_r_aim6 +ai_run_f_aim_6 +ai_pistol_stand_exposed_aim_6 +ai_pistol_crouch_exposed_aim_6 +ai_pistol_rusher_stand_exposed_aim6 +ai_pistol_crouchcorner_left_aim_6 +ai_pistol_crouchcorner_right_aim_6 +ai_pistol_crouchcover_hide_aim_6 +ai_pistol_standcover_hide_aim_6 +ai_pistol_cornerstand_right_aim_6 +ai_pistol_cornerstand_left_aim_6 +ai_m202_heat_stand_aim_6 +} +aim_2 : additive +{ +exposed_aim_2 +exposed_turn_aim_2 +exposed_crouch_aim_2 +exposed_crouch_turn_aim_2 +covercrouch_aim2_add +pistol_stand_aim_2_add +pistol_stand_aim_2_alt +RPG_stand_aim_2 +RPG_crouch_aim_2 +CornerStndL_lean_aim_2 +CornerStndR_lean_aim_2 +CQB_stand_aim2 +prone_aim_2_add +shotgun_aim_2 +ai_flamethrower_aim_2 +ai_flamethrower_crouch_aim_2 +shotgun_crouch_aim_2 +heat_stand_aim_2 +covercrouch_rechamber_aim_down +exposed_rechamber_down +ai_viet_exposed_aim_2 +ai_viet_exposed_crouch_aim_2 +ai_viet_exposed_crouch_turn_aim_2 +ai_viet_exposed_turn_aim_2 +ai_pillar_crouch_aim2_r +ai_pillar_crouch_aim2_l +ai_pillar_stand_aim2_r +ai_pillar_stand_aim2_l +ai_cover_crouch_suppressed_l_aim2 +ai_cover_crouch_suppressed_r_aim2 +ai_run_f_aim_2 +ai_pistol_stand_exposed_aim_2 +ai_pistol_crouch_exposed_aim_2 +ai_pistol_rusher_stand_exposed_aim2 +ai_pistol_crouchcorner_left_aim_2 +ai_pistol_crouchcorner_right_aim_2 +ai_pistol_crouchcover_hide_aim_2 +ai_pistol_standcover_hide_aim_2 +ai_pistol_cornerstand_right_aim_2 +ai_pistol_cornerstand_left_aim_2 +ai_m202_heat_stand_aim_2 +} +aim_8 : additive +{ +exposed_aim_8 +exposed_turn_aim_8 +exposed_crouch_aim_8 +exposed_crouch_turn_aim_8 +covercrouch_aim8_add +pistol_stand_aim_8_add +pistol_stand_aim_8_alt +RPG_stand_aim_8 +RPG_crouch_aim_8 +CornerStndL_lean_aim_8 +CornerStndR_lean_aim_8 +CQB_stand_aim8 +prone_aim_8_add +shotgun_aim_8 +ai_flamethrower_aim_8 +ai_flamethrower_crouch_aim_8 +shotgun_crouch_aim_8 +heat_stand_aim_8 +covercrouch_rechamber_aim_up +exposed_rechamber_up +ai_viet_exposed_aim_8 +ai_viet_exposed_crouch_aim_8 +ai_viet_exposed_crouch_turn_aim_8 +ai_viet_exposed_turn_aim_8 +ai_pillar_crouch_aim8_r +ai_pillar_crouch_aim8_l +ai_pillar_stand_aim8_r +ai_pillar_stand_aim8_l +ai_cover_crouch_suppressed_l_aim8 +ai_cover_crouch_suppressed_r_aim8 +ai_run_f_aim_8 +ai_pistol_stand_exposed_aim_8 +ai_pistol_crouch_exposed_aim_8 +ai_pistol_rusher_stand_exposed_aim8 +ai_pistol_crouchcorner_left_aim_8 +ai_pistol_crouchcorner_right_aim_8 +ai_pistol_crouchcover_hide_aim_8 +ai_pistol_standcover_hide_aim_8 +ai_pistol_cornerstand_right_aim_8 +ai_pistol_cornerstand_left_aim_8 +ai_m202_heat_stand_aim_8 +} +turn +{ +exposed_crouch_turn_left +exposed_crouch_turn_right +ai_viet_exposed_crouch_turn_left +ai_viet_exposed_crouch_turn_right +exposed_tracking_turn45L +exposed_tracking_turn90L +exposed_tracking_turn135L +exposed_tracking_turn45R +exposed_tracking_turn90R +exposed_tracking_turn135R +exposed_tracking_turn180L +ai_viet_exposed_tracking_turn45L +ai_viet_exposed_tracking_turn90L +ai_viet_exposed_tracking_turn135L +ai_viet_exposed_tracking_turn45R +ai_viet_exposed_tracking_turn90R +ai_viet_exposed_tracking_turn135R +ai_viet_exposed_tracking_turn180L +pistol_stand_turn45R +pistol_stand_turn45L +pistol_stand_turn90R +pistol_stand_turn90L +pistol_stand_turn180L +pistol_stand_turn180R +ai_pistol_stand_exposed_turn_180_l +ai_pistol_stand_exposed_turn_180_r +ai_pistol_stand_exposed_turn_135_l +ai_pistol_stand_exposed_turn_135_r +ai_pistol_stand_exposed_turn_45_l +ai_pistol_stand_exposed_turn_45_r +ai_pistol_stand_exposed_turn_90_l +ai_pistol_stand_exposed_turn_90_r +ai_pistol_crouch_exposed_turn_180_l +ai_pistol_crouch_exposed_turn_180_r +ai_pistol_crouch_exposed_turn_135_l +ai_pistol_crouch_exposed_turn_135_r +ai_pistol_crouch_exposed_turn_45_l +ai_pistol_crouch_exposed_turn_45_r +ai_pistol_crouch_exposed_turn_90_l +ai_pistol_crouch_exposed_turn_90_r +ai_pistol_rusher_stand_exposed_turn_180_l +ai_pistol_rusher_stand_exposed_turn_180_r +ai_pistol_rusher_stand_exposed_turn_135_l +ai_pistol_rusher_stand_exposed_turn_135_r +ai_pistol_rusher_stand_exposed_turn_45_l +ai_pistol_rusher_stand_exposed_turn_45_r +ai_pistol_rusher_stand_exposed_turn_90_l +ai_pistol_rusher_stand_exposed_turn_90_r +ai_flamethrower_turn45L +ai_flamethrower_turn45R +ai_flamethrower_turn90L +ai_flamethrower_turn90R +ai_flamethrower_turn135L +ai_flamethrower_turn135R +ai_flamethrower_turn180 +ai_flamethrower_crouch_turn90L +ai_flamethrower_crouch_turn90R +heat_stand_turn_180 +heat_stand_turn_L +heat_stand_turn_R +} +add_idle : additive +{ +exposed_idle_alert_v1 +exposed_idle_alert_v2 +exposed_idle_alert_v3 +exposed_crouch_idle_alert_v1 +exposed_crouch_idle_alert_v2 +exposed_crouch_idle_alert_v3 +covercrouch_hide_idlea +covercrouch_hide_idleb +ai_viet_exposed_idle_alert_v1 +ai_viet_exposed_idle_alert_v2 +ai_viet_exposed_idle_alert_v3 +ai_viet_exposed_idle_alert_v4 +ai_viet_exposed_idle_alert_v5 +ai_viet_exposed_idle_alert_v6 +ai_viet_exposed_crouch_idle_alert_v1 +ai_viet_exposed_crouch_idle_alert_v2 +ai_viet_exposed_crouch_idle_alert_v3 +CornerStndR_lean_idle +CornerStndL_lean_idle +RPG_stand_idle +RPG_crouch_idle +ai_flamethrower_stand_idle_alert_v1 +ai_flamethrower_crouch_idle_a_alert_v1 +pistol_stand_idle_alert +ai_pistol_stand_exposed_idle +ai_pistol_crouch_exposed_idle +ai_pistol_rusher_stand_exposed_idle +ai_zombie_idle_v1 +ai_zombie_idle_crawl +ai_stand_exposed_idle_alert_v1_large +prone_idle +ai_pillar_crouch_aim5_r +ai_pillar_crouch_aim5_l +ai_pillar_stand_aim5_r +ai_pillar_stand_aim5_l +ai_cover_crouch_suppressed_l_aim5_idle +ai_cover_crouch_suppressed_r_aim5_idle +heat_stand_idle +heat_stand_twitchA +heat_stand_twitchB +heat_stand_scanA +heat_stand_scanB +ai_stand_exposed_idle_movement +ai_pistol_cornerstand_left_aim_5_add +ai_pistol_cornerstand_right_aim_5_add +ai_pistol_crouchcorner_left_aim_5_add +ai_pistol_crouchcorner_right_aim_5_add +ai_m202_heat_stand_idle +ai_m202_heat_stand_idle_scan_a +ai_m202_heat_stand_idle_scan_b +ai_m202_heat_stand_twitch_a +ai_m202_heat_stand_twitch_b +} +prone_legs_up : additive +{ +prone_aim_feet_45up +} +prone_legs_down : additive +{ +prone_aim_feet_45down +} +corner +{ +corner_standL_trans_A_2_B +corner_standL_trans_A_2_B_v2 +corner_standL_trans_alert_2_A +corner_standL_trans_alert_2_A_v2 +corner_standL_trans_alert_2_A_v3 +corner_standL_trans_alert_2_B +corner_standL_trans_alert_2_B_v2 +corner_standL_trans_B_2_A +corner_standL_trans_B_2_A_v2 +corner_standR_trans_A_2_B +corner_standR_trans_A_2_B_v2 +corner_standR_trans_alert_2_A +corner_standR_trans_alert_2_A_v2 +corner_standR_trans_alert_2_B +corner_standR_trans_alert_2_B_v2 +corner_standR_trans_alert_2_B_v3 +corner_standR_trans_B_2_A +corner_standR_trans_B_2_A_v2 +CornerCrL_trans_A_2_B +CornerCrL_trans_B_2_A +CornerCrL_trans_alert_2_A +CornerCrL_trans_alert_2_B +CornerCrR_trans_A_2_B +CornerCrR_trans_B_2_A +CornerCrR_trans_alert_2_A +CornerCrR_trans_alert_2_B +corner_standL_trans_A_2_alert +corner_standL_trans_A_2_alert_v2 +corner_standL_trans_B_2_alert +corner_standL_trans_B_2_alert_v2 +corner_standR_trans_A_2_alert +corner_standR_trans_A_2_alert_v2 +corner_standR_trans_B_2_alert +corner_standR_trans_B_2_alert_v2 +corner_standR_trans_B_2_alert_v3 +CornerCrL_trans_B_2_alert +CornerCrL_trans_A_2_alert +CornerCrR_trans_B_2_alert +CornerCrR_trans_A_2_alert +RPG_conceal_2_standR +RPG_standR_2_conceal +CornerStndL_lean_2_alert +CornerStndL_alert_2_lean +CornerStndR_lean_2_alert +CornerStndR_alert_2_lean +ai_cover_crouch_suppressed_r_trans_2_aim5 +ai_cover_crouch_suppressed_r_aim5_2_cover +ai_cover_crouch_suppressed_l_trans_2_aim5 +ai_cover_crouch_suppressed_l_aim5_2_cover +ai_viet_cornerCrL_trans_alert_2_b +ai_viet_cornerCrL_trans_b_2_alert +ai_viet_cornerCrouchL_trans_b_2_alert +ai_viet_cornerCrouchR_alert_2_b +ai_viet_cornerCrR_reload_b_2_alert +ai_viet_cornerCrR_trans_alert_2_b +ai_viet_cornerCrR_trans_b_2_alert +ai_viet_corner_StandL_trans_alert_2_b +ai_viet_corner_StandL_trans_alert_2_b_v2 +ai_viet_corner_StandL_trans_b_2_alert +ai_viet_corner_StandL_trans_b_2_alert_v2 +ai_viet_corner_StandL_reload_b_2_alert +ai_viet_corner_StandR_trans_b_2_alert_v2 +ai_viet_corner_StandR_trans_b_2_alert_v3 +ai_viet_corner_StandR_trans_alert_2_b +ai_viet_corner_StandR_trans_b_2_alert +ai_viet_cornercrl_trans_a_2_alert +ai_viet_cornercrl_trans_a_2_b +ai_viet_cornercrl_trans_alert_2_a +ai_viet_cornercrl_trans_b_2_a +ai_viet_cornercrouchr_a_2_alert +ai_viet_cornercrouchr_a_2_alert_v2 +ai_viet_cornercrouchr_alert_2_a +ai_viet_cornercrouchr_alert_2_a_v2 +ai_viet_CornerCrouchR_A_2_B +ai_viet_cornercrouchr_b_2_a +ai_viet_cornerstndl_trans_a_2_alert +ai_viet_cornerstndl_trans_a_2_alert_v2 +ai_viet_cornerstndl_trans_a_2_b +ai_viet_cornerstndl_trans_a_2_b_v2 +ai_viet_cornerstndl_trans_alert_2_a +ai_viet_cornerstndl_trans_alert_2_a_v2 +ai_viet_cornerstndl_trans_alert_2_a_v3 +ai_viet_cornerstndl_trans_b_2_a +ai_viet_cornerstndl_trans_b_2_a_v2 +ai_viet_cornerstndr_trans_a_2_alert +ai_viet_cornerstndr_trans_a_2_alert_v2 +ai_viet_cornerstndr_trans_a_2_b +ai_viet_cornerstndr_trans_a_2_b_v2 +ai_viet_cornerstndr_trans_alert_2_a +ai_viet_cornerstndr_trans_alert_2_a_v2 +ai_viet_cornerstndr_trans_b_2_a +ai_pillar_crouch_aim5_l_2_idle +ai_pillar_crouch_aim5_r_2_idle +ai_pillar_stand_aim5_l_2_idle +ai_pillar_stand_aim5_r_2_idle +ai_pillar_cornercrl_trans_a_2_alert +ai_pillar_cornercrl_trans_a_2_b +ai_pillar_cornercrl_trans_alert_2_a +ai_pillar_cornercrl_trans_alert_2_b +ai_pillar_cornercrl_trans_b_2_a +ai_pillar_cornercrl_trans_b_2_alert +ai_pillar_cornercrouchr_reload_b_2_alert +ai_pillar_cornercrouchr_trans_a_2_alert +ai_pillar_cornercrouchr_trans_b_2_a +ai_pillar_cornercrouchr_trans_a_2_b +ai_pillar_cornercrouchr_trans_alert_2_a +ai_pillar_cornercrouchr_trans_alert_2_b +ai_pillar_cornercrouchr_trans_b_2_alert +ai_pillar_cornerstndl_reload_b_2_alert +ai_pillar_cornerstndl_trans_a_2_alert +ai_pillar_cornerstndl_trans_a_2_b +ai_pillar_cornerstndl_trans_alert_2_a +ai_pillar_cornerstndl_trans_alert_2_b +ai_pillar_cornerstndl_trans_b_2_a +ai_pillar_cornerstndl_trans_b_2_alert +ai_pillar_cornerstndr_trans_a_2_alert +ai_pillar_cornerstndr_trans_a_2_b +ai_pillar_cornerstndr_trans_alert_2_a +ai_pillar_cornerstndr_trans_alert_2_b +ai_pillar_cornerstndr_trans_b_2_a +ai_pillar_cornerstndr_trans_b_2_alert +ai_pistol_crouchcorner_left_to_aim5 +ai_pistol_crouchcorner_aim5_to_left +ai_pistol_crouchcorner_right_to_aim5 +ai_pistol_crouchcorner_aim5_to_right +ai_pistol_cornerstand_right_to_aim5 +ai_pistol_cornerstand_aim5_to_right +ai_pistol_cornerstand_left_to_aim5 +ai_pistol_cornerstand_aim5_to_left +} +rechamber : additive +{ +exposed_rechamber_v1 +covercrouch_rechamber_aim +exposed_crouch_rechamber_v1 +CornerStndL_lean_rechamber +CornerStndR_lean_rechamber +} +} +reload +{ +exposed_reload +exposed_reloadb +exposed_reloadc +exposed_topload +exposed_crouch_reload +exposed_crouch_topload +pistol_stand_reload_A +RPG_stand_reload +RPG_crouch_reload +shotgun_stand_reload_A +shotgun_stand_reload_B +shotgun_stand_reload_C +shotgun_crouch_reload +CornerCrL_toploadA +CornerCrL_toploadB +CornerCrR_toploadA +CornerCrR_toploadB +CornerStndR_lean_reload +CornerStndL_lean_reload +CQB_stand_reload_steady +CQB_stand_reload_knee +CornerStndR_lean_topload +CornerStndL_lean_topload +CornerStndR_reload_v1 +CornerStndL_reload_v1 +CornerStndL_topload +CornerStndR_topload +coverstand_topload +covercrouch_topload_hide +ai_viet_exposed_crouch_reload +ai_viet_exposed_reload +ai_viet_exposed_reloadb +heat_exposed_reload +ai_m202_heat_stand_reload +ai_pistol_crouch_exposed_reload +ai_pistol_rusher_stand_exposed_reload +} +exposed_melee +{ +melee_test_guy0_death_pose +} +pistol_stand_pullout +pistol_stand_switch +exposed_grenadeThrowB +exposed_grenadeThrowC +ai_viet_exposed_grenadeThrowB +ai_viet_exposed_grenadeThrowC +weapon_switch +{ +ai_stand_exposed_weaponswitch +ai_crouch_exposed_weaponswitch +ai_stand_cover_hide_weaponswitch +ai_crouch_cover_hide_weaponswitch +ai_corner_left_weaponswitch +ai_corner_right_weaponswitch +ai_crouch_corner_left_weaponswitch +ai_crouch_corner_right_weaponswitch +ai_shotgun_cob_weaponswitch +ai_cob_stand_weaponswitch +ai_cover_crouch_aim_weaponswitch +} +run_2_stand_F_6 +run_2_stand_90L +run_2_stand_90R +run_2_stand_180L +stand_2_run_L +stand_2_run_R +stand_2_run_F_2 +stand_2_run_180_med +run_2_crouch_F +run_2_crouch_90L +run_2_crouch_90R +run_2_crouch_180L +crouch_2run_L +crouch_2run_R +crouch_2run_F +crouch_2run_180 +ai_viet_run_2_stand_F_6 +ai_viet_run_2_stand_90L +ai_viet_run_2_stand_90R +ai_viet_run_2_stand_180l +ai_viet_run_2_crouch_F +ai_viet_run_2_crouch_90L +ai_viet_run_2_crouch_90R +ai_viet_run_2_crouch_180L +ai_viet_stand_2_run_180_med +ai_viet_stand_2_run_L +ai_viet_stand_2_run_R +ai_viet_stand_2_run_F_2 +ai_viet_crouch_2_run_180_f +ai_viet_crouch_2_run_L +ai_viet_crouch_2_run_R +ai_viet_crouch_2_run_F +ai_viet_run_2_crouch_180_l_wounded +ai_viet_run_2_crouch_180_r_wounded +ai_viet_run_2_crouch_90_l_wounded +ai_viet_run_2_crouch_90_r_wounded +ai_viet_run_2_crouch_f_wounded +ai_viet_run_2_stand_180_l_wounded +ai_viet_run_2_stand_180_r_wounded +ai_viet_run_2_stand_90_l_wounded +ai_viet_run_2_stand_90_r_wounded +ai_viet_run_2_stand_f_wounded +ai_viet_crouch_2_run_180_l_wounded +ai_viet_crouch_2_run_180_r_wounded +ai_viet_crouch_2_run_f_wounded +ai_viet_crouch_2_run_l_wounded +ai_viet_crouch_2_run_r_wounded +ai_viet_stand_2_run_r_wounded +ai_viet_stand_2_run_180_l_wounded +ai_viet_stand_2_run_180_r_wounded +ai_viet_stand_2_run_f_wounded +ai_viet_stand_2_run_l_wounded +ai_civ_gen_alert_stand_idle_2_run_b +ai_civ_gen_alert_stand_idle_2_run_l +ai_civ_gen_alert_stand_idle_2_run_r +ai_sergei_stand2run +ai_prisoner_stand2run +ai_sergei_run2stand +ai_prisoner_run2stand +ai_civilian_run_2_stand_90L +ai_civilian_run_2_stand_90R +ai_civilian_run_2_stand_180L +ai_run_b2f_a +ai_run_b2f +ai_run_f2b_a +ai_run_f2b +ai_pistol_run_b2f_a +ai_pistol_run_b2f +ai_pistol_run_f2b_a +ai_pistol_run_f2b +CQB_stop_1 +CQB_stop_2 +CQB_stop_3 +CQB_stop_4 +CQB_stop_6 +CQB_stop_7 +CQB_stop_8 +CQB_stop_9 +CQB_crouch_stop_1 +CQB_crouch_stop_2 +CQB_crouch_stop_3 +CQB_crouch_stop_4 +CQB_crouch_stop_6 +CQB_crouch_stop_7 +CQB_crouch_stop_8 +CQB_crouch_stop_9 +CQB_start_1 +CQB_start_2 +CQB_start_3 +CQB_start_4 +CQB_start_6 +CQB_start_7 +CQB_start_8 +CQB_start_9 +CQB_crouch_start_1 +CQB_crouch_start_2 +CQB_crouch_start_3 +CQB_crouch_start_4 +CQB_crouch_start_6 +CQB_crouch_start_7 +CQB_crouch_start_8 +CQB_crouch_start_9 +heat_approach_1 +heat_approach_2 +heat_approach_3 +heat_approach_4 +heat_approach_6 +heat_approach_8 +heat_exit_1 +heat_exit_2 +heat_exit_3 +heat_exit_4 +heat_exit_6 +heat_exit_7 +heat_exit_8 +heat_exit_9 +ai_pistol_run_to_exposed_1 +ai_pistol_run_to_exposed_2 +ai_pistol_run_to_exposed_3 +ai_pistol_run_to_exposed_4 +ai_pistol_run_to_exposed_6 +ai_pistol_run_to_exposed_7 +ai_pistol_run_to_exposed_8 +ai_pistol_run_to_exposed_9 +ai_pistol_run_2_crouch_exposed_1 +ai_pistol_run_2_crouch_exposed_2 +ai_pistol_run_2_crouch_exposed_3 +ai_pistol_run_2_crouch_exposed_4 +ai_pistol_run_2_crouch_exposed_6 +ai_pistol_run_2_crouch_exposed_7 +ai_pistol_run_2_crouch_exposed_8 +ai_pistol_run_2_crouch_exposed_9 +ai_pistol_exposed_to_run_1 +ai_pistol_exposed_to_run_2 +ai_pistol_exposed_to_run_3 +ai_pistol_exposed_to_run_4 +ai_pistol_exposed_to_run_6 +ai_pistol_exposed_to_run_7 +ai_pistol_exposed_to_run_8 +ai_pistol_exposed_to_run_9 +ai_pistol_crouch_exposed_2_run_1 +ai_pistol_crouch_exposed_2_run_2 +ai_pistol_crouch_exposed_2_run_3 +ai_pistol_crouch_exposed_2_run_4 +ai_pistol_crouch_exposed_2_run_6 +ai_pistol_crouch_exposed_2_run_7 +ai_pistol_crouch_exposed_2_run_8 +ai_pistol_crouch_exposed_2_run_9 +exposed_turn +{ +ai_run_lowready_f_turn_45_l +ai_run_lowready_f_turn_45_r +ai_run_lowready_f_turn_90_l +ai_run_lowready_f_turn_90_r +ai_run_lowready_f_turn_180_l +ai_run_lowready_f_turn_180_r +ai_rusher_shotgun_walk_lowready_f_turn_180_l +ai_rusher_shotgun_walk_lowready_f_turn_180_r +ai_rusher_shotgun_walk_lowready_f_turn_45_l +ai_rusher_shotgun_walk_lowready_f_turn_45_r +ai_rusher_shotgun_walk_lowready_f_turn_90_l +ai_rusher_shotgun_walk_lowready_f_turn_90_r +ai_viet_run_lowready_f_turn_45l +ai_viet_run_lowready_f_turn_90l +ai_viet_run_lowready_f_turn_180l +ai_viet_run_lowready_f_turn_45r +ai_viet_run_lowready_f_turn_90r +ai_viet_run_lowready_f_turn_180r +ai_viet_run_lowready_f_turn_180_l_wounded +ai_viet_run_lowready_f_turn_180_r_wounded +ai_viet_run_lowready_f_turn_45_l_wounded +ai_viet_run_lowready_f_turn_45_r_wounded +ai_viet_run_lowready_f_turn_90_l_wounded +ai_viet_run_lowready_f_turn_90_r_wounded +civilian_run_hunched_turnL45 +civilian_run_hunched_turnL90 +civilian_run_upright_turn180 +civilian_run_upright_turnR45 +civilian_run_upright_turnR90 +ai_prisoner_run_hunched_turn_l45 +ai_prisoner_run_hunched_turn_l90 +ai_prisoner_run_upright_turn_l180 +ai_prisoner_run_upright_turn_r45 +ai_prisoner_run_upright_turn_r90 +ai_prisoner_run_upright_turn_r180 +ai_sergei_run_hunched_turnL45 +ai_sergei_run_hunched_turnL90 +ai_sergei_run_upright_turn180 +ai_sergei_run_upright_turnR45 +ai_sergei_run_upright_turnR90 +CQB_walk_turn_7 +CQB_walk_turn_4 +CQB_walk_turn_9 +CQB_walk_turn_6 +CQB_walk_turn_2 +ai_pistol_run_f_turn_180_l +ai_pistol_run_f_turn_180_r +ai_pistol_run_f_turn_45_l +ai_pistol_run_f_turn_45_r +ai_pistol_run_f_turn_90_l +ai_pistol_run_f_turn_90_r +ai_sprint_turn_45_r +ai_sprint_turn_45_l +ai_sprint_turn_90_r +ai_sprint_turn_90_l +ai_sprint_turn_180_r +ai_sprint_turn_180_l +} +stand2prone_onehand +stand_2_prone +stand_2_prone_nodelta +stand_2_prone_firing +crouch_2_prone +crouch_2_prone_firing +prone_2_stand +prone_2_stand_nodelta +prone_2_stand_firing +prone_2_crouch +prone_2_crouch_firing +prone_legsstraight +{ +prone_crawl2aim +prone_crawl_2_prone +prone_crawl +prone_2_prone_crawl +prone_aim_idle +prone_aim2crawl +prone2crouchrun_straight +crouch2prone_gunsupport +reload_prone_rifle +} +prone_modern +{ +prone_grenade_a +prone_melee +prone_reaction_A +prone_reaction_B +prone_reload +prone_twitch_ammocheck +prone_twitch_look +prone_twitch_lookfast +prone_twitch_lookup +prone_twitch_scan +prone_twitch_ammocheck2 +prone_twitch_scan2 +} +} +juggernaut_pain : additive +{ +pain_add_standing_belly +pain_add_standing_left_arm +pain_add_standing_left_leg +pain_add_standing_right_arm +pain_add_standing_right_leg +} +add_fire : additive +{ +exposed_shoot_semi1 +exposed_shoot_semi2 +exposed_shoot_semi3 +exposed_shoot_semi4 +exposed_shoot_semi5 +exposed_shoot_auto_v2 +exposed_shoot_auto_v3 +exposed_shoot_burst3 +exposed_shoot_burst4 +exposed_shoot_burst5 +exposed_shoot_burst6 +exposed_crouch_shoot_auto_v2 +exposed_crouch_shoot_burst3 +exposed_crouch_shoot_burst4 +exposed_crouch_shoot_burst5 +exposed_crouch_shoot_burst6 +exposed_crouch_shoot_semi1 +exposed_crouch_shoot_semi2 +exposed_crouch_shoot_semi3 +exposed_crouch_shoot_semi4 +exposed_crouch_shoot_semi5 +ai_viet_exposed_shoot_semi1 +ai_viet_exposed_shoot_semi2 +ai_viet_exposed_shoot_semi3 +ai_viet_exposed_shoot_semi4 +ai_viet_exposed_shoot_semi5 +ai_viet_exposed_shoot_auto_v2 +ai_viet_exposed_shoot_auto_v3 +ai_viet_exposed_shoot_burst3 +ai_viet_exposed_shoot_burst4 +ai_viet_exposed_shoot_burst5 +ai_viet_exposed_shoot_burst6 +ai_viet_exposed_crouch_shoot_auto_v2 +ai_viet_exposed_crouch_shoot_burst3 +ai_viet_exposed_crouch_shoot_burst4 +ai_viet_exposed_crouch_shoot_burst5 +ai_viet_exposed_crouch_shoot_burst6 +ai_viet_exposed_crouch_shoot_semi1 +ai_viet_exposed_crouch_shoot_semi2 +ai_viet_exposed_crouch_shoot_semi3 +ai_viet_exposed_crouch_shoot_semi4 +ai_viet_exposed_crouch_shoot_semi5 +pistol_stand_fire_A +ai_pistol_fire +ai_pistol_stand_exposed_fire +ai_pistol_stand_exposed_shoot_semi1 +ai_pistol_stand_exposed_shoot_semi2 +ai_pistol_stand_exposed_shoot_semi3 +ai_pistol_stand_exposed_shoot_semi4 +ai_pistol_stand_exposed_shoot_semi5 +ai_pistol_crouch_exposed_shoot_semi1 +ai_pistol_crouch_exposed_shoot_semi2 +ai_pistol_crouch_exposed_shoot_semi3 +ai_pistol_crouch_exposed_shoot_semi4 +ai_pistol_crouch_exposed_shoot_semi5 +RPG_stand_fire +RPG_crouch_fire +shotgun_stand_fire_1A +shotgun_stand_fire_1B +shotgun_crouch_fire +CornerStndR_lean_auto +CornerStndR_lean_fire +CornerStndL_lean_auto +CornerStndL_lean_fire +ai_flame_fire_center +ai_flame_crouch_fire_center +ai_stand_exposed_semiauto_burst3_large +ai_stand_exposed_autofire_v2_large +ai_stand_exposed_burst3_large +prone_fire_1 +prone_fire_2 +prone_fire_burst +ai_pillar_stand_shoot_auto_r +ai_pillar_stand_shoot_semi1_r +ai_pillar_stand_shoot_semi2_r +ai_pillar_stand_shoot_semi3_r +ai_pillar_stand_shoot_semi4_r +ai_pillar_stand_shoot_semi5_r +ai_pillar_stand_shoot_burst3_r +ai_pillar_stand_shoot_burst4_r +ai_pillar_stand_shoot_burst5_r +ai_pillar_stand_shoot_burst6_r +ai_pillar_stand_shoot_auto_l +ai_pillar_stand_shoot_semi1_l +ai_pillar_stand_shoot_semi2_l +ai_pillar_stand_shoot_semi3_l +ai_pillar_stand_shoot_semi4_l +ai_pillar_stand_shoot_semi5_l +ai_pillar_stand_shoot_burst3_l +ai_pillar_stand_shoot_burst4_l +ai_pillar_stand_shoot_burst5_l +ai_pillar_stand_shoot_burst6_l +ai_pillar_crouch_shoot_auto_r +ai_pillar_crouch_shoot_semi1_r +ai_pillar_crouch_shoot_semi2_r +ai_pillar_crouch_shoot_semi3_r +ai_pillar_crouch_shoot_semi4_r +ai_pillar_crouch_shoot_semi5_r +ai_pillar_crouch_shoot_burst3_r +ai_pillar_crouch_shoot_burst4_r +ai_pillar_crouch_shoot_burst5_r +ai_pillar_crouch_shoot_burst6_r +ai_pillar_crouch_shoot_auto_l +ai_pillar_crouch_shoot_semi1_l +ai_pillar_crouch_shoot_semi2_l +ai_pillar_crouch_shoot_semi3_l +ai_pillar_crouch_shoot_semi4_l +ai_pillar_crouch_shoot_semi5_l +ai_pillar_crouch_shoot_burst3_l +ai_pillar_crouch_shoot_burst4_l +ai_pillar_crouch_shoot_burst5_l +ai_pillar_crouch_shoot_burst6_l +heat_stand_fire_single +heat_stand_fire_burst +heat_stand_fire_auto +ai_pistol_crouchcorner_left_shoot_semi1 +ai_pistol_crouchcorner_left_shoot_semi2 +ai_pistol_crouchcorner_left_shoot_semi3 +ai_pistol_crouchcorner_left_shoot_semi4 +ai_pistol_crouchcorner_left_shoot_semi5 +ai_pistol_crouchcorner_right_shoot_semi1 +ai_pistol_crouchcorner_right_shoot_semi2 +ai_pistol_crouchcorner_right_shoot_semi3 +ai_pistol_crouchcorner_right_shoot_semi4 +ai_pistol_crouchcorner_right_shoot_semi5 +ai_pistol_crouchcover_hide_shoot_semi1 +ai_pistol_crouchcover_hide_shoot_semi2 +ai_pistol_crouchcover_hide_shoot_semi3 +ai_pistol_crouchcover_hide_shoot_semi4 +ai_pistol_crouchcover_hide_shoot_semi5 +ai_pistol_standcover_hide_shoot_semi1 +ai_pistol_standcover_hide_shoot_semi2 +ai_pistol_standcover_hide_shoot_semi3 +ai_pistol_standcover_hide_shoot_semi4 +ai_pistol_standcover_hide_shoot_semi5 +ai_pistol_cornerstand_left_shoot_semi1 +ai_pistol_cornerstand_left_shoot_semi2 +ai_pistol_cornerstand_left_shoot_semi3 +ai_pistol_cornerstand_left_shoot_semi4 +ai_pistol_cornerstand_left_shoot_semi5 +ai_pistol_cornerstand_right_shoot_semi1 +ai_pistol_cornerstand_right_shoot_semi2 +ai_pistol_cornerstand_right_shoot_semi3 +ai_pistol_cornerstand_right_shoot_semi4 +ai_pistol_cornerstand_right_shoot_semi5 +ai_m202_heat_stand_fire +ai_pistol_rusher_stand_exposed_shoot_semi1 +ai_pistol_rusher_stand_exposed_shoot_semi2 +ai_pistol_rusher_stand_exposed_shoot_semi3 +ai_pistol_rusher_stand_exposed_shoot_semi4 +ai_pistol_rusher_stand_exposed_shoot_semi5 +covercrouch_hide_burst1 +covercrouch_hide_semiauto_burst2 +covercrouch_hide_burst3 +covercrouch_hide_burst4 +covercrouch_hide_burst5 +covercrouch_hide_burst6 +} +flashed +{ +exposed_flashbang_v1 +exposed_flashbang_v2 +exposed_flashbang_v3 +exposed_flashbang_v4 +exposed_flashbang_v5 +} +covercrouch_modern +{ +covercrouch_hide_idle +covercrouch_twitch_1 +covercrouch_twitch_2 +covercrouch_twitch_3 +covercrouch_twitch_4 +covercrouch_hide_2_stand +covercrouch_aim_2_hide +covercrouch_lean_2_hide +covercrouch_stand_2_hide +covercrouch_hide_2_lean +covercrouch_hide_2_aim +covercrouch_run_in_L +covercrouch_run_in_ML +covercrouch_run_in_M +covercrouch_run_in_MR +covercrouch_run_in_R +covercrouch_run_out_L +covercrouch_run_out_ML +covercrouch_run_out_M +covercrouch_run_out_MR +covercrouch_run_out_R +covercrouch_reload_hide +covercrouch_grenadeA +covercrouch_grenadeB +covercrouch_hide_look +covercrouch_blindfire_1 +covercrouch_blindfire_2 +covercrouch_blindfire_3 +covercrouch_blindfire_4 +covercrouch_death_1 +covercrouch_death_2 +covercrouch_death_3 +covercrouch_pain_front +covercrouch_pain_left_3 +covercrouch_pain_right +covercrouch_pain_right_2 +ai_spets_run_2_crouch_cover_hide_1 +ai_spets_run_2_crouch_cover_hide_2 +ai_spets_run_2_crouch_cover_hide_3 +ai_spets_crouch_cover_hide_2_run_4 +ai_spets_crouch_cover_hide_2_run_6 +ai_pistol_crouchcover_hide_arrive_1 +ai_pistol_crouchcover_hide_arrive_2 +ai_pistol_crouchcover_hide_arrive_3 +ai_pistol_crouchcover_hide_arrive_4 +ai_pistol_crouchcover_hide_arrive_6 +ai_pistol_crouchcover_hide_exit_1 +ai_pistol_crouchcover_hide_exit_2 +ai_pistol_crouchcover_hide_exit_3 +ai_pistol_crouchcover_hide_exit_4 +ai_pistol_crouchcover_hide_exit_6 +ai_pistol_crouchcover_hide_to_aim5 +ai_pistol_crouchcover_aim5_to_hide +ai_pistol_crouchcover_hide_idle_d +ai_pistol_crouchcover_hide_blindfire +ai_pistol_crouchcover_hide_reload +ai_pistol_crouchcover_hide_peek +ai_pistol_crouchcover_hide_twitch_v1 +ai_pistol_crouchcover_hide_twitch_v2 +ai_pistol_crouchcover_hide_twitch_v3 +ai_pistol_crouchcover_hide_pain_chest +ai_pistol_crouchcover_hide_pain_groin +ai_pistol_crouchcover_hide_pain_left +ai_pistol_crouchcover_hide_pain_right +} +ai_dive_over_40 +jump_over_high_wall +step_up_low_wall +ai_jump_down_36 +jump_down_96 +jump_down_56 +ai_jump_down_40 +ai_jump_down_56 +ai_jump_down_96 +ai_mantle_on_36 +ai_mantle_on_40 +ai_mantle_on_48 +ai_mantle_on_52 +ai_mantle_on_56 +ai_jump_across_72 +ladder_climbdown +ladder_climbon +ladder_climboff +ladder_climbup +ladder_climbon_bottom_walk +climbstairs_up +climbstairs_down +climbstairs_up_armed +climbstairs_down_armed +traverse_wallhop +traverse_wallhop_3 +ai_mantle_over_40_down_80 +ai_mantle_over_40_down_80_v2 +ai_mantle_over_36 +ai_mantle_over_40 +ai_mantle_over_96 +ai_prisoner_mantle_over_96 +ai_mantle_over_96_pistol +traverse40_death_start +traverse40_death_start_2 +traverse40_death_end +traverse40_death_end_2 +traverse40_2_cover +ai_jump_across_120 +windowclimb_fall +windowclimb_land +ai_viet_rathole_mantle_on_56_2_crch +ai_viet_rathole_mantle_on_56_2_run +ai_viet_rathole_mantle_on_56_2_stnd +traversal +{ +hill +{ +ai_run_slope_up_20_in +ai_run_slope_up_20_out +ai_run_slope_up_25_in +ai_run_slope_up_25_out +ai_run_slope_up_30_in +ai_run_slope_up_30_out +ai_run_slope_up_35_in +ai_run_slope_up_35_out +ai_run_slope_down_20_in +ai_run_slope_down_20_out +ai_run_slope_down_25_in +ai_run_slope_down_25_out +ai_run_slope_down_30_in +ai_run_slope_down_30_out +ai_run_slope_down_35_in +ai_run_slope_down_35_out +slope_runs : loopsync +{ +ai_run_slope_up_20 +ai_run_slope_up_25 +ai_run_slope_up_30 +ai_run_slope_up_35 +ai_run_slope_down_20 +ai_run_slope_down_25 +ai_run_slope_down_30 +ai_run_slope_down_35 +} +} +stairs +{ +ai_staircase_sprint_up_8x8_in +ai_staircase_sprint_up_8x8_in_even +ai_staircase_sprint_up_8x8_out +ai_staircase_sprint_up_8x8_1 +ai_staircase_sprint_up_8x8_2 +ai_staircase_sprint_up_8x8_3 +ai_staircase_sprint_up_8x8_4 +ai_staircase_sprint_up_8x8_5 +ai_staircase_sprint_down_8x8_in +ai_staircase_sprint_down_8x8_out +ai_staircase_sprint_down_8x8_out_even +ai_staircase_sprint_down_8x8_1 +ai_staircase_sprint_down_8x8_2 +ai_staircase_sprint_down_8x8_3 +ai_staircase_sprint_down_8x8_4 +ai_staircase_sprint_down_8x8_5 +ai_staircase_run_up_8x12_in +ai_staircase_run_up_8x12_in_even +ai_staircase_run_up_8x12_out +ai_staircase_run_up_8x12_1 +ai_staircase_run_up_8x12_2 +ai_staircase_run_up_8x12_3 +ai_staircase_run_up_8x12_4 +ai_staircase_run_up_8x12_5 +ai_staircase_sprint_up_8x12_in +ai_staircase_sprint_up_8x12_in_even +ai_staircase_sprint_up_8x12_out +ai_staircase_sprint_up_8x12_1 +ai_staircase_sprint_up_8x12_2 +ai_staircase_sprint_up_8x12_3 +ai_staircase_sprint_up_8x12_4 +ai_staircase_sprint_up_8x12_5 +ai_staircase_sprint_unarmed_up_8x12_in +ai_staircase_sprint_unarmed_up_8x12_in_even +ai_staircase_sprint_unarmed_up_8x12_out +ai_staircase_sprint_unarmed_up_8x12_1 +ai_staircase_sprint_unarmed_up_8x12_2 +ai_staircase_sprint_unarmed_up_8x12_3 +ai_staircase_sprint_unarmed_up_8x12_4 +ai_staircase_sprint_unarmed_up_8x12_5 +ai_staircase_run_down_8x12_in +ai_staircase_run_down_8x12_out +ai_staircase_run_down_8x12_out_even +ai_staircase_run_down_8x12_1 +ai_staircase_run_down_8x12_2 +ai_staircase_run_down_8x12_3 +ai_staircase_run_down_8x12_4 +ai_staircase_run_down_8x12_5 +ai_staircase_sprint_down_8x12_in +ai_staircase_sprint_down_8x12_out +ai_staircase_sprint_down_8x12_out_even +ai_staircase_sprint_down_8x12_1 +ai_staircase_sprint_down_8x12_2 +ai_staircase_sprint_down_8x12_3 +ai_staircase_sprint_down_8x12_4 +ai_staircase_sprint_down_8x12_5 +ai_staircase_run_up_8x16_in +ai_staircase_run_up_8x16_in_even +ai_staircase_run_up_8x16_out +ai_staircase_run_up_8x16_1 +ai_staircase_run_up_8x16_2 +ai_staircase_run_up_8x16_3 +ai_staircase_run_up_8x16_4 +ai_staircase_run_up_8x16_5 +ai_staircase_sprint_up_8x16_in +ai_staircase_sprint_up_8x16_in_even +ai_staircase_sprint_up_8x16_out +ai_staircase_sprint_up_8x16_1 +ai_staircase_sprint_up_8x16_2 +ai_staircase_sprint_up_8x16_3 +ai_staircase_sprint_up_8x16_4 +ai_staircase_sprint_up_8x16_5 +ai_staircase_run_down_8x16_in +ai_staircase_run_down_8x16_out +ai_staircase_run_down_8x16_out_even +ai_staircase_run_down_8x16_1 +ai_staircase_run_down_8x16_2 +ai_staircase_run_down_8x16_3 +ai_staircase_run_down_8x16_4 +ai_staircase_run_down_8x16_5 +ai_staircase_sprint_down_8x16_in +ai_staircase_sprint_down_8x16_out +ai_staircase_sprint_down_8x16_out_even +ai_staircase_sprint_down_8x16_1 +ai_staircase_sprint_down_8x16_2 +ai_staircase_sprint_down_8x16_3 +ai_staircase_sprint_down_8x16_4 +ai_staircase_sprint_down_8x16_5 +} +traverse_aim_2 : additive +{ +ai_stair_run_f_aim_2 +} +traverse_aim_4 : additive +{ +ai_stair_run_f_aim_4 +} +traverse_aim_6 : additive +{ +ai_stair_run_f_aim_6 +} +traverse_aim_8 : additive +{ +ai_stair_run_f_aim_8 +} +} +ai_slide_across_car +slide_across_car_2_cover +slide_across_car_death +traverse90_IN_M +traverse90_IN_ML +traverse90_IN_MR +traverse90_start_death +traverse90_end_death +ai_mantle_window_dive_36 +ai_mantle_window_36_run +ai_mantle_window_36_stop +traverse_window_death_start +traverse_window_death_end +ai_zombie_traverse_v1 +ai_zombie_traverse_v2 +ai_zombie_traverse_v3 +ai_zombie_traverse_v4 +ai_zombie_traverse_v5 +ai_zombie_traverse_v6 +ai_zombie_traverse_v7 +ai_zombie_traverse_crawl_v1 +ai_zombie_jump_up_2_climb +ai_zombie_jump_up_2_climb_coast +ai_zombie_jump_up_2_climb_reverse_coast +ai_zombie_jump_up_2_climb_reverse_crawler_coast +ai_zombie_crawl_jump_up_2_climb +ai_zombie_jump_up_90 +ai_zombie_jump_up_waterfall_barrier +ai_zombie_jump_up +ai_zombie_quad_crawl_sprint_wall_intro +ai_zombie_quad_crawl_sprint_wall_intro_2 +ai_zombie_quad_crawl_sprint_wall_intro_quick +ai_zombie_quad_wall_jump_off +ai_zombie_quad_jump_down_128 +ai_zombie_ceiling_crawl +ai_zombie_quad_crawl_sprint_wall +ai_zombie_quad_jump_down_vent +wall_death : nonloopsync +{ +ai_zombie_quad_wall_death_heavy +ai_zombie_quad_wall_death_heavy2 +ai_zombie_quad_wall_death_mg +ai_zombie_quad_wall_death_mg2 +} +ai_zombie_traverse_ground_v1_crawl +ai_zombie_traverse_ground_v1_crawlfast +ai_zombie_traverse_ground_v1_deathinside +ai_zombie_traverse_ground_v1_deathinside_alt +ai_zombie_traverse_ground_v1_deathoutside +ai_zombie_traverse_ground_v1_deathoutside_alt +ai_zombie_traverse_ground_v1_idle +ai_zombie_traverse_ground_v1_run +ai_zombie_traverse_ground_v1_walk +ai_zombie_traverse_ground_v2_death_high +ai_zombie_traverse_ground_v2_death_high_alt +ai_zombie_traverse_ground_v2_death_low +ai_zombie_traverse_ground_v2_death_low_alt +ai_zombie_traverse_ground_v2_walk +ai_zombie_traverse_ground_v2_walk_altA +ai_zombie_traverse_ground_v2_walk_altB +ai_zombie_traverse_ground_climbout_fast +ai_zombie_quad_traverse_ground_crawlfast +ai_zombie_lighthouse_crawl_down +ai_zombie_climb_chain +ai_zombie_climb_chain_coast +ai_zombie_zipline_traverse_ship +ai_zombie_zipline_traverse_lighthouse +ai_zombie_crawler_zipline_traverse_lighthouse +ai_zombie_crawler_zipline_traverse_ship +ai_zombie_climb_chain_fast +ai_zombie_climb_chain_fast_coast +ai_zombie_ladder_climb_loop +ai_zombie_ladder_climb_off +ai_zombie_ladder_climb_on +ai_zombie_boss_zipline_traverse_lighthouse +ai_zombie_boss_zipline_traverse_ship +ai_zombie_boss_jump_up_2_climb_coast +ai_zombie_boss_jump_up_2_climb_reverse_coast +ai_zombie_boss_icyramp_jump_up_2_climb_coast +ai_zombie_boss_jump_down_72_coast +ai_zombie_boss_jump_up_222_coast +ai_zombie_boss_jump_down_184_coast +ai_zombie_boss_jump_down_127_coast +ai_zombie_boss_jump_down_97_coast +ai_zombie_flinger_flail +ai_zombie_dying_back_idle +ai_zombie_jump_up_222 +ai_zombie_jump_down_222 +ai_zombie_jump_down_232 +ai_zombie_boss_jump_down_232_coast +ai_zombie_crawl_jump_down_48 +ai_zombie_jump_down_48 +ai_zombie_crawl_jump_down_386 +ai_zombie_crawl_jump_down_lowg_386 +ai_zombie_jump_down_386 +ai_zombie_quad_jump_down_386 +ai_zombie_watervator_400 +ai_zombie_watervator_400_alt +ai_zombie_crawl_watervator_400 +ai_zombie_crawl_watervator_400_alt +ai_zombie_jump_down_mine_cart +ai_zombie_jump_up_mine_cart +ai_zombie_crawl_jump_down_mine_cart +ai_zombie_crawl_jump_up_mine_cart +ai_zombie_monkey_jump_down_mine_cart +ai_zombie_monkey_jump_up_mine_cart +ai_zombie_jump_up_geyser_alt +ai_zombie_jump_down_geyser_alt +ai_zombie_crawl_jump_down_geyser_alt +ai_zombie_crawl_jump_up_geyser_alt +ai_zombie_monkey_jump_down_geyser_alt +ai_zombie_monkey_jump_up_geyser_alt +ai_zombie_jump_up_waterfall +ai_zombie_jump_down_waterfall +ai_zombie_crawl_jump_down_waterfall +ai_zombie_crawl_jump_up_waterfall +ai_zombie_monkey_jump_down_waterfall +ai_zombie_monkey_jump_up_waterfall +ai_zombie_temple_crawl_jump_up_pap +ai_zombie_temple_jump_up_pap +ai_zombie_monkey_jump_up_pap +ai_zombie_temple_slide_exit +ai_zombie_crawl_temple_slide_exit +ai_zombie_monkey_temple_slide_exit +ai_zombie_monkey_pap_escape +ai_zombie_jump_down_40 +ai_zombie_jump_down_72 +ai_zombie_jump_down_90 +ai_zombie_jump_down_96 +ai_zombie_jump_down_120 +ai_zombie_jump_down_127 +ai_zombie_jump_down_184 +ai_zombie_jump_down_189 +ai_zombie_jump_down_190 +ai_zombie_jump_down_240 +ai_zombie_jump_down_286 +ai_zombie_crawl_jump_down_40 +ai_zombie_crawl_jump_down_72 +ai_zombie_crawl_jump_down_90 +ai_zombie_crawl_jump_down_97 +ai_zombie_crawl_jump_down_120 +ai_zombie_crawl_jump_down_127 +ai_zombie_crawl_jump_down_184 +ai_zombie_crawl_jump_down_189 +ai_zombie_crawl_jump_down_240 +ai_zombie_crawl_jump_down_286 +ai_zombie_crawl_jump_down_222 +ai_zombie_crawl_jump_down_232 +ai_zombie_crawl_jump_up_222 +ai_zombie_crawl_jump_up_222_coast +ai_zombie_crawl_jump_up_90 +ai_zombie_crawl_jump_up_waterfall_barrier +ai_zombie_monkey_jump_down_90 +ai_zombie_monkey_jump_up_90 +ai_zombie_monkey_jump_up_waterfall_barrier +ai_zombie_ceiling_emerge_01 +ai_zombie_ceiling_dropdown_01 +ai_zombie_ceiling_fall_loop +ai_zombie_ceiling_fall_land +ai_zombie_ceiling_fall_land_02 +ai_zombie_ceiling_attack_01 +ai_zombie_ceiling_attack_02 +ai_zombie_ceiling_death +ai_zombie_spets_sidestep_left_a +ai_zombie_spets_sidestep_left_b +ai_zombie_spets_sidestep_right_a +ai_zombie_spets_sidestep_right_b +ai_zombie_spets_roll_a +ai_zombie_spets_roll_b +ai_zombie_spets_roll_c +ai_zombie_sonic_sidestep_left_a +ai_zombie_sonic_sidestep_left_b +ai_zombie_sonic_sidestep_right_a +ai_zombie_sonic_sidestep_right_b +ai_zombie_sonic_duck_a +ai_zombie_sonic_duck_b +ai_zombie_sonic_duck_c +ai_zombie_MP_sidestep_left_a +ai_zombie_MP_sidestep_left_b +ai_zombie_MP_sidestep_right_a +ai_zombie_MP_sidestep_right_b +ai_zombie_quad_phaseleft_long_a +ai_zombie_quad_phaseleft_long_b +ai_zombie_quad_phaseleft_short_a +ai_zombie_quad_phaseleft_short_b +ai_zombie_quad_phaseright_long_a +ai_zombie_quad_phaseright_long_b +ai_zombie_quad_phaseright_short_a +ai_zombie_quad_phaseright_short_b +ai_zombie_quad_phaseforward_long_a +ai_zombie_quad_phaseforward_long_b +ai_zombie_quad_phaseforward_short_a +ai_zombie_quad_phaseforward_short_b +ai_traverse_wallhop_large +melee +{ +ai_bonzai_buddy_success_front +ai_bonzai_buddy_success_left +ai_bonzai_buddy_success_right +ai_bonzai_buddy_success_rear +ai_bonzai_enemy_success_front +ai_bonzai_enemy_success_rear +ai_bonzai_enemy_attack_player_impact +ai_bonzai_enemy_attack_player +ai_bonzai_enemy_attack_player_intro +ai_bonzai_enemy_attack_player_fail +ai_bonzai_enemy_attack_player_success +ai_bayonet_stab_melee +run_2_melee_charge +stand_2_melee_1 +melee_1 +ai_baton_run_2_melee_charge +ai_baton_stand_2_melee_1 +ai_baton_melee_1 +ai_spets_run_2_melee_charge +ai_spets_stand_2_melee +ai_spets_melee +ai_pistol_run_2_melee_charge +ai_pistol_stand_2_melee +ai_pistol_melee +ai_zombie_attack_forward_v1 +ai_zombie_attack_forward_v2 +ai_zombie_attack_v1 +ai_zombie_attack_v2 +ai_zombie_attack_v3 +ai_zombie_attack_v4 +ai_zombie_attack_v6 +ai_zombie_walk_attack_v1 +ai_zombie_walk_attack_v2 +ai_zombie_walk_attack_v3 +ai_zombie_walk_attack_v4 +ai_zombie_run_attack_v1 +ai_zombie_run_attack_v2 +ai_zombie_run_attack_v3 +ai_zombie_attack_crawl +ai_zombie_attack_crawl_lunge +ai_zombie_crawl_attack_A +ai_zombie_window_attack_arm_R_out +ai_zombie_window_attack_arm_L_out +ai_zombie_window_attack_crawl_l +ai_zombie_window_attack_crawl_m +ai_zombie_window_attack_crawl_r +ai_zombie_walk_on_hands_shot_a +ai_zombie_walk_on_hands_shot_b +ai_zombie_jap_attack_v1 +ai_zombie_jap_attack_v2 +ai_zombie_jap_attack_v3 +ai_zombie_jap_attack_v4 +ai_zombie_jap_attack_v5 +ai_zombie_jap_attack_v6 +ai_zombie_jap_run_attack_v1 +ai_zombie_jap_run_attack_v2 +ai_zombie_thundergun_hit +ai_zombie_thundergun_idle +ai_zombie_thundergun_getup +ai_zombie_boss_attack_multiswing_a +ai_zombie_boss_attack_multiswing_b +ai_zombie_boss_attack_swing_overhead +ai_zombie_boss_attack_swing_swipe +ai_zombie_boss_headbutt +ai_zombie_boss_attack_running +ai_zombie_boss_attack_sprinting +ai_zombie_boss_run_hitground +ai_zombie_boss_push_coast +ai_zombie_boss_walk_headhit_coast +ai_zombie_boss_swing_coast +ai_zombie_boss_attack_multiswing_a_coast +ai_zombie_boss_attack_multiswing_b_coast +ai_zombie_boss_attack_swing_overhead_coast +ai_zombie_boss_attack_swing_swipe_coast +ai_zombie_boss_attack_running_coast +ai_zombie_boss_attack_sprinting_coast +ai_zombie_boss_run_hitground_coast +ai_zombie_quad_attack +ai_zombie_quad_attack_2 +ai_zombie_quad_attack_3 +ai_zombie_quad_attack_4 +ai_zombie_quad_attack_5 +ai_zombie_quad_attack_6 +ai_zombie_quad_attack_double +ai_zombie_quad_attack_double_2 +ai_zombie_quad_attack_double_3 +ai_zombie_quad_attack_double_4 +ai_zombie_quad_attack_double_5 +ai_zombie_quad_attack_double_6 +ai_zombie_quad_attack_leap_loop_in +ai_zombie_quad_attack_leap_loop +ai_zombie_quad_attack_leap_attack +ai_zombie_quad_attack_leap_loop_out +ai_zombie_napalm_attack_01 +ai_zombie_napalm_attack_02 +ai_zombie_napalm_attack_03 +ai_zombie_sonic_attack_01 +ai_zombie_sonic_attack_02 +ai_zombie_sonic_attack_03 +ai_zombie_astro_headbutt +ai_zombie_astro_headbutt_release +} +melee_dog +{ +AI_attacked_german_shepherd_01_start_a +AI_attacked_german_shepherd_02_idle_a +AI_attacked_german_shepherd_02_getup_a +AI_attacked_german_shepherd_03_push_a +AI_attacked_german_shepherd_03_shoot_a +AI_attacked_german_shepherd_04_middle_a +AI_attacked_german_shepherd_04_getup_a +AI_attacked_german_shepherd_05_death_a +} +cover +{ +pistol_leftcrouch_hide_idle +pistol_leftstand_hide_idle +pistol_rightcrouch_hide_idle +pistol_rightstand_hide_idle +corner_directions +{ +corner_45_left +{ +corner_right_stand_aim_45left +} +corner_45_right +{ +corner_right_stand_aim_45right +} +} +corner_pose +{ +corner_right_stand_aimbehind2alert +corner_right_stand_alert2aimbehind +corner_right_stand_aimleft2alert +corner_right_stand_alert2aimleft +corner_right_stand_aimright2alert +corner_right_stand_alert2aimright +corner_right_stand_aimstraight2alert +corner_right_stand_alert2aimstraight +corner_right_stand_left2straight +corner_right_stand_straight2left +corner_right_stand_straight2right +corner_right_stand_right2straight +corner_right_stand_right2behind +corner_right_stand_behind2right +corner_right_stand_alert2look +corner_right_stand_look2alert +corner_right_stand_alertlookidle +corner_right_crouch_alert2aimstraight +corner_right_crouch_aimstraight2alert +corner_right_crouch_alert2aimleft +corner_right_crouch_aimleft2alert +corner_right_crouch_alert2aimright +corner_right_crouch_aimright2alert +corner_right_crouch_alert2aimbehind +corner_right_crouch_aimbehind2alert +corner_right_crouch_left2straight +corner_right_crouch_straight2left +corner_right_crouch_straight2right +corner_right_crouch_right2straight +corner_right_crouch_right2behind +corner_right_crouch_behind2right +corner_right_crouch_alert2look +corner_right_crouch_alertlookidle +corner_right_crouch_look2alert +corner_left_stand_aimbehind2alert +corner_left_stand_alert2aimbehind +corner_left_stand_aimleft2alert +corner_left_stand_alert2aimleft +corner_left_stand_aimright2alert +corner_left_stand_alert2aimright +corner_left_stand_aimstraight2alert +corner_left_stand_alert2aimstraight +corner_left_stand_left2straight +corner_left_stand_straight2left +corner_left_stand_straight2right +corner_left_stand_right2straight +corner_left_stand_left2behind +corner_left_stand_behind2left +corner_left_stand_alert2look +corner_left_stand_look2alert +corner_left_stand_alertlookidle +corner_left_crouch_alert2aimstraight +corner_left_crouch_aimstraight2alert +corner_left_crouch_alert2aimleft +corner_left_crouch_alert2aimright +corner_left_crouch_aimright2alert +corner_left_crouch_alert2aimbehind +corner_left_crouch_aimbehind2alert +corner_left_crouch_left2straight +corner_left_crouch_straight2left +corner_left_crouch_straight2right +corner_left_crouch_right2straight +corner_left_crouch_left2behind +corner_left_crouch_behind2left +corner_left_crouch_alert2look +corner_left_crouch_alertlookidle +corner_left_crouch_look2alert +} +modern_corner +{ +corner_standL_reload_B_2_alert +corner_standR_reload_B_2_alert +corner_standL_alert_2_look +corner_standL_look_2_alert +corner_standl_look_2_alert_fast_v1 +corner_standL_look_idle +corner_standL_alert_idle +corner_standL_alert_twitch01 +corner_standL_alert_twitch02 +corner_standL_alert_twitch03 +corner_standL_alert_twitch04 +corner_standL_alert_twitch05 +corner_standL_alert_twitch06 +corner_standL_alert_twitch07 +corner_standL_blindfire_v1 +corner_standL_blindfire_v2 +corner_standL_rambo_jam +corner_standL_rambo_set +corner_standL_deathA +corner_standL_deathB +corner_standL_flinch +corner_standL_grenade_A +corner_standL_grenade_B +corner_standL_look +corner_standL_reload_v1 +corner_standL_reload_v2 +corner_standL_pain +corner_standL_painB +corner_standL_painC +corner_standL_painD +corner_standL_painE +CornerCrL_alert_idle +CornerCrL_look_fast +CornerCrL_reloadA +CornerCrL_reloadB +CornerCrL_grenadeA +CornerCrL_grenadeB +CornerCrL_alert_2_stand +CornerCrL_stand_2_alert +CornerCrL_trans_IN_F +CornerCrL_trans_IN_L +CornerCrL_trans_IN_M +CornerCrL_trans_IN_MF +CornerCrL_trans_IN_ML +CornerCrL_trans_IN_MR +CornerCrL_trans_IN_R +CornerCrL_trans_OUT_F +CornerCrL_trans_OUT_L +CornerCrL_trans_OUT_M +CornerCrL_trans_OUT_MF +CornerCrL_trans_OUT_ML +CornerCrL_trans_OUT_MR +CornerCrL_trans_OUT_R +ai_cover_crouch_suppressed_r_blindfire_01 +ai_cover_crouch_suppressed_r_blindfire_02 +ai_cover_crouch_suppressed_l_blindfire_01 +ai_cover_crouch_suppressed_l_blindfire_02 +corner_standR_alert_2_look +corner_standR_look_2_alert +corner_standR_look_2_alert_fast +corner_standR_look_idle +corner_standR_alert_idle +corner_standR_alert_twitch01 +corner_standR_alert_twitch02 +corner_standR_alert_twitch03 +corner_standR_alert_twitch04 +corner_standR_alert_twitch05 +corner_standR_alert_twitch06 +corner_standR_alert_twitch07 +corner_standR_blindfire_v1 +corner_standR_blindfire_v2 +corner_standR_rambo_short +corner_standR_rambo_jam +corner_standR_rambo_med +corner_standR_deathA +corner_standR_deathB +corner_standR_flinch +corner_standR_flinchB +corner_standR_grenade_A +corner_standR_grenade_B +corner_standR_look +corner_standR_reload_v1 +corner_standR_reload_v2 +corner_standR_death_grenade_explode +corner_standR_death_grenade_hit +corner_standR_death_grenade_idle +corner_standR_death_grenade_slump +corner_standR_pain +corner_standR_painB +corner_standR_painC +corner_standR_trans_IN_4 +corner_standR_trans_IN_2 +corner_standR_trans_IN_1 +corner_standR_trans_IN_3 +corner_standR_trans_IN_6 +corner_standR_trans_IN_8 +corner_standR_trans_IN_9 +corner_standR_trans_OUT_1 +corner_standR_trans_OUT_2 +corner_standR_trans_OUT_3 +corner_standR_trans_OUT_4 +corner_standR_trans_OUT_6 +corner_standR_trans_OUT_8 +corner_standR_trans_OUT_9 +corner_standL_trans_IN_4 +corner_standL_trans_IN_1 +corner_standL_trans_IN_2 +corner_standL_trans_IN_3 +corner_standL_trans_IN_6 +corner_standL_trans_IN_7 +corner_standL_trans_IN_8 +corner_standL_trans_OUT_1 +corner_standL_trans_OUT_2 +corner_standL_trans_OUT_3 +corner_standL_trans_OUT_4 +corner_standL_trans_OUT_6 +corner_standL_trans_OUT_7 +corner_standL_trans_OUT_8 +CornerCrR_alert_idle +CornerCrR_look_idle +CornerCrR_reloadA +CornerCrR_reloadB +CornerCrR_grenadeA +CornerCrR_alert_twitch_v1 +CornerCrR_alert_twitch_v2 +CornerCrR_alert_twitch_v3 +CornerCrR_alert_2_look +CornerCrR_look_2_alert +CornerCrR_look_2_alert_fast +CornerCrR_alert_2_stand +CornerCrR_stand_2_alert +CornerCrR_reload_B_2_alert +CornerCrR_trans_IN_F +CornerCrR_trans_IN_L +CornerCrR_trans_IN_M +CornerCrR_trans_IN_MF +CornerCrR_trans_IN_ML +CornerCrR_trans_IN_MR +CornerCrR_trans_IN_R +CornerCrR_trans_OUT_F +CornerCrR_trans_OUT_L +CornerCrR_trans_OUT_M +CornerCrR_trans_OUT_MF +CornerCrR_trans_OUT_ML +CornerCrR_trans_OUT_MR +CornerCrR_trans_OUT_R +corner_crouchR_grenade_alert +saw_gunner_prone_runin_M +saw_gunner_prone_runin_ML +saw_gunner_prone_runin_MR +saw_gunner_prone_runout_F +saw_gunner_prone_runout_M +saw_gunner_prone_runout_L +saw_gunner_prone_runout_R +ai_corner_r_2_crouch_corner_l +ai_corner_r_2_crouch_corner_r +ai_crouch_corner_r_2_corner_r +ai_crouch_corner_l_2_corner_l +ai_corner_l_2_corner_r +ai_corner_r_2_corner_l +ai_corner_l_2_crouch_corner_l +ai_corner_l_2_crouch_corner_r +ai_crouch_corner_l_2_corner_r +ai_crouch_corner_l_2_crouch_corner_r +ai_crouch_corner_r_2_corner_l +ai_crouch_corner_r_2_crouch_corner_l +corner_standR_trans_CQB_IN_1 +corner_standR_trans_CQB_IN_2 +corner_standR_trans_CQB_IN_3 +corner_standR_trans_CQB_IN_4 +corner_standR_trans_CQB_IN_6 +corner_standR_trans_CQB_IN_8 +corner_standR_trans_CQB_IN_9 +CornerCrR_CQB_trans_IN_1 +CornerCrR_CQB_trans_IN_2 +CornerCrR_CQB_trans_IN_3 +CornerCrR_CQB_trans_IN_4 +CornerCrR_CQB_trans_IN_6 +CornerCrR_CQB_trans_IN_8 +CornerCrR_CQB_trans_IN_9 +corner_standL_trans_CQB_IN_1 +corner_standL_trans_CQB_IN_2 +corner_standL_trans_CQB_IN_3 +corner_standL_trans_CQB_IN_4 +corner_standL_trans_CQB_IN_6 +corner_standL_trans_CQB_IN_7 +corner_standL_trans_CQB_IN_8 +CornerCrL_CQB_trans_IN_1 +CornerCrL_CQB_trans_IN_2 +CornerCrL_CQB_trans_IN_3 +CornerCrL_CQB_trans_IN_4 +CornerCrL_CQB_trans_IN_6 +CornerCrL_CQB_trans_IN_7 +CornerCrL_CQB_trans_IN_8 +corner_standR_trans_CQB_OUT_1 +corner_standR_trans_CQB_OUT_2 +corner_standR_trans_CQB_OUT_3 +corner_standR_trans_CQB_OUT_4 +corner_standR_trans_CQB_OUT_6 +corner_standR_trans_CQB_OUT_8 +corner_standR_trans_CQB_OUT_9 +CornerCrR_CQB_trans_OUT_1 +CornerCrR_CQB_trans_OUT_2 +CornerCrR_CQB_trans_OUT_3 +CornerCrR_CQB_trans_OUT_4 +CornerCrR_CQB_trans_OUT_6 +CornerCrR_CQB_trans_OUT_8 +CornerCrR_CQB_trans_OUT_9 +corner_standL_trans_CQB_OUT_1 +corner_standL_trans_CQB_OUT_2 +corner_standL_trans_CQB_OUT_3 +corner_standL_trans_CQB_OUT_4 +corner_standL_trans_CQB_OUT_6 +corner_standL_trans_CQB_OUT_7 +corner_standL_trans_CQB_OUT_8 +CornerCrL_CQB_trans_OUT_1 +CornerCrL_CQB_trans_OUT_2 +CornerCrL_CQB_trans_OUT_3 +CornerCrL_CQB_trans_OUT_4 +CornerCrL_CQB_trans_OUT_6 +CornerCrL_CQB_trans_OUT_7 +CornerCrL_CQB_trans_OUT_8 +ai_spets_run_2_corner_crouch_l_1 +ai_spets_run_2_corner_crouch_l_2 +ai_spets_run_2_corner_crouch_l_3 +ai_spets_run_2_corner_crouch_l_4 +ai_spets_run_2_corner_crouch_l_6 +ai_spets_run_2_corner_crouch_l_7 +ai_spets_run_2_corner_crouch_l_8 +ai_spets_run_2_corner_crouch_r_1 +ai_spets_run_2_corner_crouch_r_2 +ai_spets_run_2_corner_crouch_r_3 +ai_spets_run_2_corner_crouch_r_4 +ai_spets_run_2_corner_crouch_r_6 +ai_spets_run_2_corner_crouch_r_8 +ai_spets_run_2_corner_crouch_r_9 +ai_spets_run_2_corner_stand_l_1 +ai_spets_run_2_corner_stand_l_2 +ai_spets_run_2_corner_stand_l_3 +ai_spets_run_2_corner_stand_l_4 +ai_spets_run_2_corner_stand_l_6 +ai_spets_run_2_corner_stand_l_7 +ai_spets_run_2_corner_stand_l_8 +ai_spets_run_2_corner_stand_r_1 +ai_spets_run_2_corner_stand_r_2 +ai_spets_run_2_corner_stand_r_3 +ai_spets_run_2_corner_stand_r_4 +ai_spets_run_2_corner_stand_r_6 +ai_spets_run_2_corner_stand_r_8 +ai_spets_run_2_corner_stand_r_9 +ai_spets_corner_stand_r_2_run_4 +ai_spets_corner_stand_r_2_run_6 +ai_spets_corner_crouch_r_2_run_4 +ai_spets_corner_crouch_r_2_run_6 +ai_spets_corner_stand_l_2_run_4 +ai_spets_corner_stand_l_2_run_6 +ai_spets_corner_crouch_l_2_run_4 +ai_spets_corner_crouch_l_2_run_6 +ai_pistol_cornercrouch_left_arrive_1 +ai_pistol_cornercrouch_left_arrive_2 +ai_pistol_cornercrouch_left_arrive_3 +ai_pistol_cornercrouch_left_arrive_4 +ai_pistol_cornercrouch_left_arrive_6 +ai_pistol_cornercrouch_left_arrive_7 +ai_pistol_cornercrouch_left_arrive_8 +ai_pistol_cornercrouch_left_exit_1 +ai_pistol_cornercrouch_left_exit_2 +ai_pistol_cornercrouch_left_exit_3 +ai_pistol_cornercrouch_left_exit_4 +ai_pistol_cornercrouch_left_exit_6 +ai_pistol_cornercrouch_left_exit_7 +ai_pistol_cornercrouch_left_exit_8 +ai_pistol_cornercrouch_left_exit_9 +ai_pistol_cornercrouch_right_arrive_1 +ai_pistol_cornercrouch_right_arrive_2 +ai_pistol_cornercrouch_right_arrive_3 +ai_pistol_cornercrouch_right_arrive_4 +ai_pistol_cornercrouch_right_arrive_6 +ai_pistol_cornercrouch_right_arrive_8 +ai_pistol_cornercrouch_right_arrive_9 +ai_pistol_cornercrouch_right_exit_1 +ai_pistol_cornercrouch_right_exit_2 +ai_pistol_cornercrouch_right_exit_3 +ai_pistol_cornercrouch_right_exit_4 +ai_pistol_cornercrouch_right_exit_6 +ai_pistol_cornercrouch_right_exit_8 +ai_pistol_cornercrouch_right_exit_9 +ai_pistol_cornerstand_left_arrive_1 +ai_pistol_cornerstand_left_arrive_2 +ai_pistol_cornerstand_left_arrive_3 +ai_pistol_cornerstand_left_arrive_4 +ai_pistol_cornerstand_left_arrive_6 +ai_pistol_cornerstand_left_arrive_7 +ai_pistol_cornerstand_left_arrive_8 +ai_pistol_cornerstand_left_exit_1 +ai_pistol_cornerstand_left_exit_2 +ai_pistol_cornerstand_left_exit_3 +ai_pistol_cornerstand_left_exit_4 +ai_pistol_cornerstand_left_exit_6 +ai_pistol_cornerstand_left_exit_7 +ai_pistol_cornerstand_left_exit_8 +ai_pistol_cornerstand_right_arrive_1 +ai_pistol_cornerstand_right_arrive_2 +ai_pistol_cornerstand_right_arrive_3 +ai_pistol_cornerstand_right_arrive_4 +ai_pistol_cornerstand_right_arrive_6 +ai_pistol_cornerstand_right_arrive_8 +ai_pistol_cornerstand_right_arrive_9 +ai_pistol_cornerstand_right_exit_1 +ai_pistol_cornerstand_right_exit_2 +ai_pistol_cornerstand_right_exit_3 +ai_pistol_cornerstand_right_exit_4 +ai_pistol_cornerstand_right_exit_6 +ai_pistol_cornerstand_right_exit_8 +ai_pistol_cornerstand_right_exit_9 +ai_pistol_cornerstand_right_idle_d +ai_pistol_cornerstand_left_idle_d +ai_pistol_cornercrouch_right_idle_d +ai_pistol_cornercrouch_left_idle_d +ai_pistol_cornercrouch_left_reload +ai_pistol_cornercrouch_right_reload +ai_pistol_cornerstand_left_reload +ai_pistol_cornerstand_right_reload +ai_pistol_cornercrouch_left_blindfire +ai_pistol_cornercrouch_right_blindfire +ai_pistol_cornerstand_left_blindfire +ai_pistol_cornerstand_right_blindfire +ai_pistol_cornercrouch_left_peek +ai_pistol_cornercrouch_left_twitch_v1 +ai_pistol_cornercrouch_left_twitch_v2 +ai_pistol_cornercrouch_left_twitch_v3 +ai_pistol_cornercrouch_right_peek +ai_pistol_cornercrouch_right_twitch_v1 +ai_pistol_cornercrouch_right_twitch_v2 +ai_pistol_cornercrouch_right_twitch_v3 +ai_pistol_cornerstand_left_peek +ai_pistol_cornerstand_left_twitch_v1 +ai_pistol_cornerstand_left_twitch_v2 +ai_pistol_cornerstand_right_peek +ai_pistol_cornerstand_right_twitch_v1 +ai_pistol_cornerstand_right_twitch_v2 +ai_pistol_cornerstand_right_twitch_v3 +ai_pistol_cornerstand_left_pain_chest +ai_pistol_cornerstand_left_pain_groin +ai_pistol_cornerstand_left_pain_head +ai_pistol_cornerstand_left_pain_leftleg +ai_pistol_cornerstand_left_pain_rightleg +ai_pistol_cornerstand_right_pain_chest +ai_pistol_cornerstand_right_pain_groin +ai_pistol_cornerstand_right_pain_rightleg +ai_pistol_cornercrouch_left_pain_chest +ai_pistol_cornercrouch_left_pain_groin +ai_pistol_cornercrouch_left_pain_head +ai_pistol_cornercrouch_left_pain_leftleg +ai_pistol_cornercrouch_left_pain_rightleg +ai_pistol_cornercrouch_right_pain_chest +ai_pistol_cornercrouch_right_pain_groin +ai_pistol_cornercrouch_right_pain_rightleg +} +coverstand_modern +{ +coverstand_hide_idle +coverstand_hide_idle_twitch01 +coverstand_hide_idle_twitch02 +coverstand_hide_idle_twitch03 +coverstand_hide_idle_twitch04 +coverstand_hide_idle_twitch05 +coverstand_hide_idle_wave01 +coverstand_hide_idle_wave02 +coverstand_look_moveup +coverstand_look_idle +coverstand_look_movedown +coverstand_look_movedown_fast +coverstand_look_quick +coverstand_look_quick_v2 +coverstand_hide_2_aim +coverstand_aim_2_hide +coverstand_grenadeA +coverstand_grenadeB +coverstand_reloadA +coverstand_blindfire_1 +coverstand_blindfire_2 +coverstand_trans_OUT_L +coverstand_trans_OUT_M +coverstand_trans_OUT_R +coverstand_trans_OUT_ML +coverstand_trans_OUT_MR +coverstand_trans_IN_L +coverstand_trans_IN_M +coverstand_trans_IN_R +coverstand_trans_IN_ML +coverstand_trans_IN_MR +coverstand_death_left +coverstand_death_right +coverstand_pain_groin +coverstand_pain_leg +coverstand_react01 +coverstand_react02 +coverstand_react03 +coverstand_react04 +coverstand_mini_approach_1 +coverstand_mini_approach_2 +coverstand_mini_approach_3 +coverstand_mini_approach_4 +coverstand_mini_approach_6 +saw_gunner_runin_L +saw_gunner_runin_R +saw_gunner_runin_M +saw_gunner_runin_ML +saw_gunner_runin_MR +saw_gunner_runout_L +saw_gunner_runout_R +saw_gunner_runout_M +saw_gunner_runout_ML +saw_gunner_runout_MR +saw_gunner_lowwall_runin_L +saw_gunner_lowwall_runin_R +saw_gunner_lowwall_runin_M +saw_gunner_lowwall_runin_ML +saw_gunner_lowwall_runin_MR +saw_gunner_lowwall_runout_L +saw_gunner_lowwall_runout_R +saw_gunner_lowwall_runout_M +saw_gunner_lowwall_runout_ML +saw_gunner_lowwall_runout_MR +saw_gunner_reload +saw_gunner_prone_reload +saw_gunner_lowwall_reload +ai_spets_run_2_stand_cover_hide_1 +ai_spets_run_2_stand_cover_hide_2 +ai_spets_run_2_stand_cover_hide_3 +ai_spets_run_2_stand_cover_hide_4 +ai_spets_run_2_stand_cover_hide_6 +ai_spets_stand_cover_hide_2_run_4 +ai_spets_stand_cover_hide_2_run_6 +ai_pistol_standcover_hide_arrive_1 +ai_pistol_standcover_hide_arrive_2 +ai_pistol_standcover_hide_arrive_3 +ai_pistol_standcover_hide_arrive_4 +ai_pistol_standcover_hide_arrive_6 +ai_pistol_standcover_hide_exit_1 +ai_pistol_standcover_hide_exit_2 +ai_pistol_standcover_hide_exit_3 +ai_pistol_standcover_hide_exit_4 +ai_pistol_standcover_hide_exit_6 +ai_pistol_standcover_aim5_to_hide +ai_pistol_standcover_hide_to_aim5 +ai_pistol_standcover_hide_idle_d +ai_pistol_standcover_hide_blindfire +ai_pistol_standcover_hide_reload +ai_pistol_standcover_hide_peek +ai_pistol_standcover_hide_twitch_v1 +ai_pistol_standcover_hide_twitch_v2 +ai_pistol_standcover_hide_twitch_v3 +ai_pistol_standcover_hide_pain_chest +ai_pistol_standcover_hide_pain_groin +ai_pistol_standcover_hide_pain_leftleg +ai_pistol_standcover_hide_pain_rightleg +} +cover_pillar +{ +ai_pillar_stand_exit_1 +ai_pillar_stand_exit_2 +ai_pillar_stand_exit_3 +ai_pillar_stand_exit_4 +ai_pillar_stand_exit_6 +ai_pillar_stand_exit_7 +ai_pillar_stand_exit_8l +ai_pillar_stand_exit_8r +ai_pillar_stand_exit_9 +ai_pillar_crouch_exit_1 +ai_pillar_crouch_exit_2 +ai_pillar_crouch_exit_3 +ai_pillar_crouch_exit_4 +ai_pillar_crouch_exit_6 +ai_pillar_crouch_exit_7 +ai_pillar_crouch_exit_8r +ai_pillar_crouch_exit_9 +ai_pillar_stand_arrive_1 +ai_pillar_stand_arrive_2 +ai_pillar_stand_arrive_3 +ai_pillar_stand_arrive_4 +ai_pillar_stand_arrive_6 +ai_pillar_stand_arrive_7 +ai_pillar_stand_arrive_8l +ai_pillar_stand_arrive_8r +ai_pillar_stand_arrive_9 +ai_pillar_crouch_arrive_1 +ai_pillar_crouch_arrive_2 +ai_pillar_crouch_arrive_3 +ai_pillar_crouch_arrive_4 +ai_pillar_crouch_arrive_6 +ai_pillar_crouch_arrive_7 +ai_pillar_crouch_arrive_8r +ai_pillar_crouch_arrive_9 +ai_pillar_stand_idle +ai_pillar_stand_idle_twitch_01 +ai_pillar_stand_idle_twitch_02 +ai_pillar_stand_idle_twitch_03 +ai_pillar_crouch_idle +ai_pillar_crouch_idle_twitch_01 +ai_pillar_crouch_idle_twitch_02 +ai_pillar_crouch_idle_twitch_03 +ai_pillar_crouch_alert_l_01 +ai_pillar_crouch_alert_l_02 +ai_pillar_crouch_alert_l_03 +ai_pillar_stand_idle_2_aim5_l +ai_pillar_stand_idle_2_aim5_r +ai_pillar_crouch_idle_2_aim5_r +ai_pillar_crouch_idle_2_aim5_l +ai_pillar_stand_reload_01 +ai_pillar_stand_reload_02 +ai_pillar_stand_reload_03 +ai_pillar_crouch_reload_01 +ai_pillar_crouch_reload_02 +ai_pillar_crouch_reload_03 +ai_pillar_crouch_idle_2_stand_idle +ai_pillar_stand_idle_2_crouch_idle +ai_pillar_stand_pain_l_remain +ai_pillar_stand_pain_l_return +ai_pillar_stand_pain_r_remain +ai_pillar_stand_pain_r_return +ai_pillar_stand_death_idle +ai_pillar_stand_death_left +ai_pillar_stand_death_right +ai_pillar_stand_grenade_throw_01 +ai_pillar_stand_grenade_throw_02 +ai_pillar_stand_grenade_throw_03 +ai_pillar_crouch_pain_l_remain +ai_pillar_crouch_pain_l_return +ai_pillar_crouch_pain_r_remain +ai_pillar_crouch_pain_r_return +ai_pillar_crouch_death_idle_01 +ai_pillar_crouch_death_idle_02 +ai_pillar_crouch_death_left_01 +ai_pillar_crouch_death_left_02 +ai_pillar_crouch_death_right_01 +ai_pillar_crouch_death_right_02 +ai_pillar_crouch_grenade_throw_01 +ai_pillar_crouch_grenade_throw_02 +ai_pillar_crouch_grenade_throw_03 +} +casualcornerA_idle_left +} +death +{ +prone_death_quickdeath +crouch_death_clutchchest +death_stand_dropinplace +death_run_onfront +death_run_onleft +death_run_stumble +death_run_forward_crumple +death_explosion_up10 +death_explosion_back13 +death_explosion_forward13 +death_explosion_left11 +death_explosion_right13 +death_explosion_stand_B_v1 +death_explosion_stand_B_v2 +death_explosion_stand_B_v3 +death_explosion_stand_B_v4 +death_explosion_stand_F_v1 +death_explosion_stand_F_v2 +death_explosion_stand_F_v3 +death_explosion_stand_F_v4 +death_explosion_stand_L_v1 +death_explosion_stand_L_v2 +death_explosion_stand_L_v3 +death_explosion_stand_R_v1 +death_explosion_stand_R_v2 +death_explosion_run_F_v1 +death_explosion_run_F_v2 +death_explosion_run_F_v3 +death_explosion_run_F_v4 +death_explosion_run_B_v1 +death_explosion_run_B_v2 +death_explosion_run_R_v1 +death_explosion_run_R_v2 +death_explosion_run_L_v1 +death_explosion_run_L_v2 +death_explosion_stand_UP_v1 +death_explosion_stand_UP_v2 +crawl_death_front +balcony_stumble_forward +ai_balcony_death_01 +ai_balcony_death_02 +ai_balcony_death_03 +ai_balcony_death_04 +ai_balcony_death_05 +ai_roof_death_01 +ai_roof_death_02 +ai_roof_death_03 +ai_roof_death_04 +ai_roof_death_05 +ai_roof_death_06 +ai_roof_death_07 +RPG_stand_death +RPG_stand_death_stagger +exposed_crouch_death_fetal +exposed_crouch_death_flip +exposed_crouch_death_twist +ai_viet_exposed_crouch_death_fetal +ai_viet_exposed_crouch_death_flip +ai_viet_exposed_crouch_death_twist +exposed_death +exposed_death_02 +exposed_death_falltoknees +exposed_death_falltoknees_02 +exposed_death_firing +exposed_death_firing_02 +exposed_death_groin +exposed_death_headshot +exposed_death_headtwist +exposed_death_nerve +exposed_death_twist +exposed_death_neckgrab +run_death_facedown +run_death_fallonback +run_death_fallonback_02 +run_death_roll +saw_gunner_death +saw_gunner_prone_death +saw_gunner_lowwall_death +pistol_death_1 +pistol_death_2 +pistol_death_3 +pistol_death_4 +ai_flame_death_A +ai_flame_death_B +ai_flame_death_C +ai_flame_death_D +ai_flame_death_E +ai_flame_death_F +ai_flame_death_G +ai_flame_death_H +ai_flame_death_crouch_a +ai_flame_death_crouch_b +ai_flame_death_crouch_c +ai_flame_death_crouch_d +ai_flame_death_crouch_e +ai_flame_death_crouch_f +ai_flame_death_crouch_g +ai_flame_death_crouch_h +ai_deadly_wounded_flamedA_hit +ai_deadly_wounded_flamedA_loop +ai_deadly_wounded_flamedA_die +ai_deadly_wounded_flamedB_hit +ai_deadly_wounded_flamedB_loop +ai_deadly_wounded_flamedB_die +ai_gas_death_a +ai_gas_death_b +ai_gas_death_c +ai_gas_death_d +ai_gas_death_e +ai_gas_death_f +ai_gas_death_g +ai_gas_death_h +ai_deadly_wounded_gassedA_die +ai_deadly_wounded_gassedA_hit +ai_deadly_wounded_gassedA_loop +ai_deadly_wounded_gassedB_die +ai_deadly_wounded_gassedB_hit +ai_deadly_wounded_gassedB_loop +ai_deadly_wounded_leg_L_hit +ai_deadly_wounded_leg_L_loop +ai_deadly_wounded_leg_L_die +ai_deadly_wounded_leg_R_hit +ai_deadly_wounded_leg_R_loop +ai_deadly_wounded_leg_R_die +ai_deadly_wounded_torso_hit +ai_deadly_wounded_torso_loop +ai_deadly_wounded_torso_die +ai_gib_bothlegs_gib +ai_gib_bothlegs_loop +ai_gib_bothlegs_death +ai_gib_torso_gib +ai_gib_torso_loop +ai_gib_torso_death +ai_gib_leftarm_back_gib +ai_gib_leftarm_back_loop +ai_gib_leftarm_back_death +ai_gib_leftleg_front_gib +ai_gib_leftleg_front_loop +ai_gib_leftleg_front_death +ai_gib_rightarm_back_gib +ai_gib_rightarm_back_loop +ai_gib_rightarm_back_death +ai_gib_leftarm_front_gib +ai_gib_leftarm_front_loop +ai_gib_leftarm_front_death +ai_gib_leftleg_back_gib +ai_gib_leftleg_back_loop +ai_gib_leftleg_back_death +ai_gib_rightarm_front_gib +ai_gib_rightarm_front_loop +ai_gib_rightarm_front_death +ai_gib_rightleg_front_gib +ai_gib_rightleg_front_loop +ai_gib_rightleg_front_death +ai_gib_rightleg_back_gib +ai_gib_rightleg_back_loop +ai_gib_rightleg_back_death +ai_flamethrower_death_b +ai_flamethrower_stand_death +ai_flamethrower_crouch_death +ai_bayonet_thrust_death +ai_bayonet_shoulder_death +ai_bayonet_back_death +ai_bayonet_left_death +ai_bayonet_right_death +ai_bonzai_enemy_fail_front +ai_bonzai_enemy_fail_left +ai_bonzai_enemy_fail_right +ai_bonzai_enemy_fail_rear +ai_bonzai_buddy_fail_front +ai_bonzai_buddy_fail_rear +ai_death_armslegsforward +ai_death_flyback +ai_death_flyback_far +ai_death_jackiespin_inplace +ai_death_jackiespin_left +ai_death_jackiespin_right +ai_death_jackiespin_vertical +ai_death_collapse_in_place +ai_death_deadfallknee +ai_death_fallforward +ai_death_fallforward_b +ai_death_forwardtoface +ai_death_gutshot_fallback +ai_death_stumblefall +ai_death_throathit_collapse +ai_death_faceplant +ai_death_flatonback +ai_death_legsout_left +ai_death_legsout_right +ai_death_upontoback +ai_death_stand_heavyshot_back +ai_death_crossbow_back +ai_death_crossbow_back_panic_explode +ai_death_crossbow_back_reach_explode +ai_death_crossbow_front +ai_death_crossbow_front_panic_explode +ai_death_crossbow_front_warn_explode +ai_death_crossbow_l_arm +ai_death_crossbow_l_arm_explode +ai_death_crossbow_l_arm_panic_explode +ai_death_crossbow_l_leg +ai_death_crossbow_l_leg_explode +ai_death_crossbow_l_leg_hop_explode +ai_death_crossbow_r_arm +ai_death_crossbow_r_arm_explode +ai_death_crossbow_r_arm_panic_explode +ai_death_crossbow_r_leg +ai_death_crossbow_r_leg_explode +ai_death_crossbow_r_leg_hop_explode +ai_death_crossbow_run_back +ai_death_crossbow_run_back_explode +ai_death_crossbow_run_front +ai_death_crossbow_run_front_explode +ai_death_crossbow_run_l_arm +ai_death_crossbow_run_l_arm_explode +ai_death_crossbow_run_l_leg +ai_death_crossbow_run_l_leg_explode +ai_death_crossbow_run_r_arm +ai_death_crossbow_run_r_arm_explode +ai_death_crossbow_run_r_leg +ai_death_crossbow_run_r_leg_explode +stand_death_chest_blowback +stand_death_chest_spin +stand_death_chest_stunned +stand_death_crotch +stand_death_face +stand_death_fallside +stand_death_guts +stand_death_head_straight_back +stand_death_headshot_slowfall +stand_death_leg +stand_death_shoulder_spin +stand_death_shoulder_stumble +stand_death_shoulderback +stand_death_tumbleback +stand_death_tumbleforward +} +pain +{ +saw_gunner_pain +saw_gunner_prone_pain +saw_gunner_prone_pain2 +saw_gunner_lowwall_pain_01 +saw_gunner_lowwall_pain_02 +back_pain +exposed_crouch_pain_chest +exposed_crouch_pain_flinch +exposed_crouch_pain_headsnap +exposed_crouch_pain_left_arm +exposed_crouch_pain_right_arm +exposed_pain_2_crouch +exposed_pain_back +exposed_pain_dropgun +exposed_pain_groin +exposed_pain_left_arm +exposed_pain_leg +exposed_pain_right_arm +ai_viet_exposed_crouch_pain_chest +ai_viet_exposed_crouch_pain_flinch +ai_viet_exposed_crouch_pain_headsnap +ai_viet_exposed_crouch_pain_left_arm +ai_viet_exposed_crouch_pain_right_arm +ai_viet_exposed_pain_2_crouch +ai_viet_exposed_pain_back +ai_viet_exposed_pain_dropgun +ai_viet_exposed_pain_groin +ai_viet_exposed_pain_left_arm +ai_viet_exposed_pain_leg +ai_viet_exposed_pain_right_arm +pistol_stand_pain_chest +pistol_stand_pain_groin +pistol_stand_pain_head +pistol_stand_pain_leftshoulder +pistol_stand_pain_rightshoulder +ai_pistol_rusher_stand_exposed_pain_chest +ai_pistol_rusher_stand_exposed_pain_groin +ai_pistol_rusher_stand_exposed_pain_head +run_pain_fallonknee +run_pain_fallonknee_02 +run_pain_fallonknee_03 +run_pain_stomach +run_pain_stumble +ai_flame_wounded_crouch_a +ai_flame_wounded_crouch_b +ai_flame_wounded_crouch_c +ai_flame_wounded_crouch_d +ai_flame_wounded_stand_a +ai_flame_wounded_stand_b +ai_flame_wounded_stand_c +ai_flame_wounded_stand_d +ai_flamethrower_wounded_stand_arm +ai_flamethrower_wounded_stand_chest +ai_flamethrower_wounded_stand_head +ai_flamethrower_wounded_stand_leg +ai_flamethrower_stand_pain +ai_flamethrower_crouch_pain +ai_pistol_rusher_run_f_pain_chest +ai_pistol_rusher_run_f_pain_groin +ai_pistol_rusher_run_f_pain_leftleg_stumble +} +reaction +{ +ai_stand_exposed_miss_detect_left_head +ai_stand_exposed_miss_detect_left_torso +ai_stand_exposed_miss_detect_left_legs +ai_stand_exposed_miss_detect_right_head +ai_stand_exposed_miss_detect_right_torso +ai_stand_exposed_miss_detect_right_legs +ai_crouch_exposed_miss_detect_left_head +ai_crouch_exposed_miss_detect_left_torso +ai_crouch_exposed_miss_detect_left_legs +ai_crouch_exposed_miss_detect_right_head +ai_crouch_exposed_miss_detect_right_torso +ai_crouch_exposed_miss_detect_right_legs +ai_run_lowready_f_miss_detect_legs +ai_run_lowready_f_miss_detect_head +ai_run_lowready_f_miss_detect_stop +ai_sprint_f_miss_detect_head +ai_sprint_f_miss_detect_legs +ai_sprint_f_miss_detect_stop +civilian_run_hunched_dodge +civilian_run_hunched_flinch +ai_prisoner_run_hunched_dodge +ai_prisoner_run_hunched_flinch +ai_sergei_run_hunched_dodge +ai_sergei_run_hunched_flinch +exposed_idle_reactB +exposed_idle_reactA +exposed_idle_twitch +exposed_idle_twitch_v4 +ai_viet_exposed_idle_reactA +ai_viet_exposed_idle_reactB +ai_viet_exposed_idle_twitch +ai_viet_exposed_idle_twitch_v4 +} +minor_pain +{ +minorpain_head_front +minorpain_head_back +minorpain_head_left +minorpain_head_right +minorpain_chest_front +minorpain_chest_back +minorpain_chest_left +minorpain_chest_right +minorpain_leftarm_front +minorpain_leftarm_back +minorpain_leftarm_left +minorpain_leftarm_right +minorpain_rightarm_front +minorpain_rightarm_back +minorpain_rightarm_left +minorpain_rightarm_right +} +revive +{ +ai_revive_reviver_onback_left +ai_revive_reviver_onback_left_align +ai_revive_reviver_onback_left_align_2 +ai_revive_reviver_onback_left_align_end_a +ai_revive_reviver_onback_right_align +ai_revive_reviver_onback_toe_align +ai_revive_reviver_onback_head_align +ai_revive_wounded_onback_left_loop_2 +ai_revive_wounded_onback_left_get_up_2 +ai_revive_wounded_onback_right_loop +ai_revive_wounded_onback_right_get_up +ai_revive_wounded_onback_toe_loop +ai_revive_wounded_onback_toe_get_up +ai_revive_wounded_onback_head_loop +ai_revive_wounded_onback_head_get_up +ai_dying_stand_2_back_revive +ai_dying_crouch_2_back_revive +ai_dying_crawl_2_back_revive +ai_revive_wounded_onback_fall_stand +ai_revive_wounded_onback_fall_crouch +ai_revive_wounded_onback_loop +ai_revive_wounded_onback_left_revive +ai_revive_wounded_onback_left_get_up +ai_revive_reviver_onback_left_revive +ai_revive_reviver_onback_left_get_up +} +dying +{ +dying_base +{ +dying_pistol_death +wounded_bellycrawl_forward +wounded_bellycrawl_death +wounded_crawl2bellycrawl +dying_stand_2_crawl_v1 +dying_stand_2_crawl_v2 +dying_stand_2_crawl_v3 +dying_crouch_2_crawl +dying_crawl +dying_crawl_death_v1 +dying_crawl_death_v2 +dying_crawl_2_back +dying_stand_2_back_v1 +dying_stand_2_back_v2 +dying_stand_2_back_v3 +dying_crouch_2_back +dying_back_idle +dying_crawl_back +dying_back_death_v1 +dying_back_death_v2 +dying_back_death_v3 +dying_back_death_v4 +dying_back_twitch_A +dying_back_twitch_B +dying_back_fire +} +dying_back_aim_4_wrapper : additive +{ +dying_back_aim_4 +} +dying_back_aim_6_wrapper : additive +{ +dying_back_aim_6 +} +} +scripted +{ +door_kicking +{ +door_bash_and_block +clear_left_idle +stack1_stand_idle +stack_3_idle +stack1_shootandkick +door_kick_in +clear_left +} +doorpeek +{ +doorpeek_close +doorpeek_deathA +doorpeek_deathB +doorpeek_fireA +doorpeek_fireB +doorpeek_fireC +doorpeek_grenade +doorpeek_idle +doorpeek_jump +doorpeek_kick +doorpeek_open +} +shutterpeek +{ +ai_shutterpeek_close +ai_shutterpeek_death_a +ai_shutterpeek_death_b +ai_shutterpeek_fire_a +ai_shutterpeek_fire_b +ai_shutterpeek_fire_c +ai_shutterpeek_grenade +ai_shutterpeek_idle +ai_shutterpeek_melee +ai_shutterpeek_open +ai_shutterpeek_2ndstory_fire_a +ai_shutterpeek_2ndstory_fire_b +ai_shutterpeek_2ndstory_fire_c +ai_shutterpeek_hide_2_stand +ai_shutterpeek_stand_2_hide +} +special_turns +{ +run_CQB_F_turn_L +run_CQB_F_turn_R +walk_CQB_F_turn_L +walk_CQB_F_turn_R +} +shotgun_breach_mocap +{ +shotgunbreach_v1_shotgun +shotgunbreach_v1_shotgun_idle +shotgunbreach_v1_shotgun_ready_idle +shotgunbreach_v1_shotgun_runin +shotgunbreach_v1_stackA +shotgunbreach_v1_stackA_idle +shotgunbreach_v1_stackA_ready_idle +shotgunbreach_v1_stackA_runin +shotgunbreach_v1_shoot_hinge +shotgunbreach_v1_shoot_hinge_idle +shotgunbreach_v1_shoot_hinge_ready_idle +shotgunbreach_v1_shoot_hinge_runin +shotgunbreach_v1_stackB +shotgunbreach_v1_stackB_idle +shotgunbreach_v1_stackB_ready_idle +shotgunbreach_v1_stackB_runin +} +shotgun_breach_hinges_mocap +{ +breach_sh_breacherL1_idle +breach_sh_breacherL1_enter +breach_sh_stackR1_idle +breach_sh_stackR1_enter +} +ram_breach_mocap +{ +rambreach_v1_ram +rambreach_v1_ram_checkhandle +rambreach_v1_ram_idle +rambreach_v1_stackA +rambreach_v1_StackA_idle +} +explosive_breach_mocap +{ +breach_explosive_approach +breach_stackL_approach +explosivebreach_v1_detcord +explosivebreach_v1_detcord_idle +explosivebreach_v1_stackL +explosivebreach_v1_stackL_idle +} +test_breach_right +{ +test_breach_R_enter +test_breach_R_flashbang +test_breach_R_idle +test_breach_R2_enter +test_breach_R2_idle +} +flash_breach_mocap +{ +breach_flash_R1_idle +breach_flash_R1_throw +breach_flash_R1_enter +breach_flash_R2_idle +breach_flash_R2_throw +breach_flash_R2_enter +} +mocap_test +{ +mocap_corner_approach +mocap_corner_exit +mocap_corner_idle +} +stretcher +{ +stretcher_F_drop +stretcher_F_pickup +stretcher_F_wait_idle +stretcher_R_drop +stretcher_R_pickup +stretcher_R_wait_idle +} +tree_snipers +{ +ch_climb_tree_a +ch_fall_tree_a +ch_fall_tree_idle_a +} +corner_approach_test +{ +corner_approach_straight +corner_approach_45 +corner_approach_45_left +corner_approach_idle +} +descent +{ +backdraft +blow_through_wall +} +level_module_10_aitypes +{ +ai_untrained_idle_2 +ai_untrained_idle_3 +ai_untrained_walk_2 +ai_untrained_walk_3 +ai_untrained_run_1 +ai_untrained_run_2 +ai_untrained_run_3 +ai_untrained_dodge_run_1 +ai_untrained_dodge_run_2 +ai_untrained_dodge_run_3 +ai_untrained_sidestep_left_2 +ai_untrained_sidestep_left_3 +ai_untrained_sidestep_right_2 +ai_untrained_sidestep_right_3 +ai_command_megaphone_signals +} +insurgent +{ +insurgent_rambo_tagRifle_tagHands1 +insurgent_rambo_tagRifle_tagHands2 +} +turret_ai +{ +standSAWgunner_aim : complete nonloopsync +{ +standSAWgunner_aim_15down +{ +saw_gunner_aim_down_right45 +saw_gunner_aim_down_right30 +saw_gunner_aim_down_right15 +saw_gunner_aim_down_center +saw_gunner_aim_down_left15 +saw_gunner_aim_down_left30 +saw_gunner_aim_down_left45 +} +standSAWgunner_aim_level +{ +saw_gunner_aim_level_right45 +saw_gunner_aim_level_right30 +saw_gunner_aim_level_right15 +saw_gunner_aim_level_center +saw_gunner_aim_level_left15 +saw_gunner_aim_level_left30 +saw_gunner_aim_level_left45 +} +standSAWgunner_aim_15up +{ +saw_gunner_aim_up_right45 +saw_gunner_aim_up_right30 +saw_gunner_aim_up_right15 +saw_gunner_aim_up_center +saw_gunner_aim_up_left15 +saw_gunner_aim_up_left30 +saw_gunner_aim_up_left45 +} +} +proneSAWgunner_aim : complete nonloopsync +{ +proneSAWgunner_aim_15down +{ +saw_gunner_prone_aim_down_left40 +saw_gunner_prone_aim_down_left20 +saw_gunner_prone_aim_down_center +saw_gunner_prone_aim_down_right20 +saw_gunner_prone_aim_down_right40 +} +proneSAWgunner_aim_level +{ +saw_gunner_prone_aim_level_left40 +saw_gunner_prone_aim_level_left20 +saw_gunner_prone_aim_level_center +saw_gunner_prone_aim_level_right20 +saw_gunner_prone_aim_level_right40 +} +proneSAWgunner_aim_15up +{ +saw_gunner_prone_aim_up_left40 +saw_gunner_prone_aim_up_left20 +saw_gunner_prone_aim_up_center +saw_gunner_prone_aim_up_right20 +saw_gunner_prone_aim_up_right40 +} +} +technicalGunner_aim : complete nonloopsync +{ +technicalGunner_aim_15down +{ +technical_turret_aim_down_center +} +technicalGunner_aim_level +{ +technical_turret_aim_level_center +} +technicalGunner_aim_15up +{ +technical_turret_aim_up_center +} +} +crouchSAWgunner_aim : complete nonloopsync +{ +crouchSAWgunner_aim_15down +{ +saw_gunner_lowwall_aim_down_left45 +saw_gunner_lowwall_aim_down_left30 +saw_gunner_lowwall_aim_down_left15 +saw_gunner_lowwall_aim_down_center +saw_gunner_lowwall_aim_down_right15 +saw_gunner_lowwall_aim_down_right30 +saw_gunner_lowwall_aim_down_right45 +} +crouchSAWgunner_aim_level +{ +saw_gunner_lowwall_aim_level_left45 +saw_gunner_lowwall_aim_level_left30 +saw_gunner_lowwall_aim_level_left15 +saw_gunner_lowwall_aim_level_center +saw_gunner_lowwall_aim_level_right15 +saw_gunner_lowwall_aim_level_right30 +saw_gunner_lowwall_aim_level_right45 +} +crouchSAWgunner_aim_15up +{ +saw_gunner_lowwall_aim_up_left45 +saw_gunner_lowwall_aim_up_left30 +saw_gunner_lowwall_aim_up_left15 +saw_gunner_lowwall_aim_up_center +saw_gunner_lowwall_aim_up_right15 +saw_gunner_lowwall_aim_up_right30 +saw_gunner_lowwall_aim_up_right45 +} +} +additive_saw_idle : additive +{ +saw_gunner_idle +saw_gunner_lowwall_idle +saw_gunner_prone_idle +} +additive_saw_fire : additive +{ +saw_gunner_firing_add +saw_gunner_lowwall_firing +saw_gunner_prone_firing +} +} +mi17 +{ +mi17_1_drop +mi17_1_idle +mi17_2_idle +mi17_2_drop +mi17_3_idle +mi17_3_drop +mi17_4_idle +mi17_4_drop +mi17_5_idle +mi17_5_drop +mi17_6_idle +mi17_6_drop +mi17_7_idle +mi17_7_drop +mi17_8_idle +mi17_8_drop +mi17_pilot_idle +mi17_copilot_idle +mi17_heli_idle +ai_mi8_pilot1_idle_loop1 +ai_mi8_pilot1_idle_loop2 +} +blackhawk +{ +bh_side01_fastrope_whole_test +bh_side01_idle01_test +bh_side02_fastrope_whole_test +bh_side02_idle01_test +bh_fastrope_land +bh_fastrope_loop +bh_Pilot_idle +bh_coPilot_idle +bh_1_idle +bh_1_drop +bh_1_begining +bh_2_idle +bh_2_drop +bh_2_begining +bh_3_idle +bh_3_drop +bh_3_begining +bh_4_idle +bh_4_drop +bh_4_begining +bh_5_idle +bh_5_drop +bh_5_begining +bh_6_idle +bh_6_drop +bh_6_begining +bh_7_idle +bh_7_drop +bh_7_begining +bh_8_idle +bh_8_drop +bh_8_begining +bh_player_idle +bh_player_rope_end +bh_player_rope_start +bh_player_rope_middle +cs_bh_1_drop +cs_bh_2_drop +cs_bh_4_drop +cs_bh_5_drop +cs_bh_6_drop +cs_bh_1_idle_start +cs_bh_2_idle_start +cargoship_opening_position1 +cargoship_opening_price +bh_idle_start_guy1 +bh_idle_start_guy2 +bh_crew_idle_guy1 +bh_crew_idle_guy2 +} +huey +{ +ai_huey_pilot1_intro +ai_huey_pilot1_idle_loop1 +ai_huey_pilot2_idle_loop1 +ai_huey_gunner1 +ai_huey_gunner1_enter +ai_huey_gunner1_exit +ai_huey_gunner2 +ai_huey_gunner2_enter +ai_huey_gunner2_exit +ai_huey_passenger_b_lt +ai_huey_passenger_b_lt_enter +ai_huey_passenger_b_lt_exit +ai_huey_passenger_f_lt +ai_huey_passenger_f_lt_enter +ai_huey_passenger_f_lt_exit +ai_huey_passenger_m_lt +ai_huey_passenger_m_lt_enter +ai_huey_passenger_m_lt_exit +ai_huey_passenger_m_rt +ai_huey_passenger_m_rt_enter +ai_huey_passenger_m_rt_exit +ai_huey_passenger_f_rt +ai_huey_passenger_f_rt_enter +ai_huey_passenger_f_rt_exit +ai_huey_passenger_b_rt +ai_huey_passenger_b_rt_enter +ai_huey_passenger_b_rt_exit +ai_huey_passenger_b_lt_switch_exit +ai_huey_passenger_f_lt_switch_exit +ai_huey_gunner_aim_60down_60left +ai_huey_gunner_aim_60down_60right +ai_huey_gunner_aim_60left_level +ai_huey_gunner_aim_60right_level +ai_huey_gunner_aim_60up_60left +ai_huey_gunner_aim_60up_60right +ai_huey_gunner_aim_forward_60down +ai_huey_gunner_aim_forward_60up +ai_huey_gunner_aim_forward_level +ai_huey_passenger_switch +ai_huey_passenger_waiting +} +bmp +{ +bmp_exit_1 +bmp_exit_2 +bmp_exit_3 +bmp_exit_4 +bmp_idle_1 +bmp_idle_2 +bmp_idle_3 +bmp_idle_4 +} +ch46e +{ +ch_side01_idle01_test +ch_side01_fastrope_whole_test +ch_side01_idle02_test +ch_side02_idle01_test +ch_side02_fastrope_whole_test +ch_side02_idle02_test +} +humvee +{ +humvee_driver_climb_idle +humvee_driver_climb_in +humvee_driver_climb_out +humvee_passenger_idle_L +humvee_passenger_idle_R +humvee_passenger_in_L +humvee_passenger_in_R +humvee_passenger_out_L +humvee_passenger_out_R +humvee_turret_fire +humvee_turret_idle +} +technical +{ +pickup_driver_climb_in +pickup_passenger_climb_in +technical_driver_duck +technical_driver_idle +technical_driver_climb_out +pickup_driver_climb_out +technical_passenger_duck +technical_passenger_idle +technical_passenger_climb_out +pickup_passenger_climb_out +pickup_passenger_RL_idle +pickup_passenger_RL_climb_out +pickup_passenger_RR_idle +pickup_passenger_RR_climb_out +} +zpu +{ +zpu_gunner_deathslouch +zpu_gunner_deathslouchidle +zpu_gunner_dismount +zpu_gunner_fire_a +zpu_gunner_fire_b +} +BM21 +{ +bm21_driver_climbout +bm21_driver_idle +bm21_passenger_climbout +bm21_passenger_idle +} +flak88 +{ +ai_88antitank_aimer_idle +ai_88antitank_aimer_loadandfire +ai_88antitank_aimer_turnleft +ai_88antitank_aimer_turnright +ai_88antitank_aimer_twitch +ai_88antitank_ejecter_idle +ai_88antitank_ejecter_loadandfire +ai_88antitank_ejecter_turnleft +ai_88antitank_ejecter_turnright +ai_88antitank_ejecter_twitch +ai_88antitank_leader_commandleft +ai_88antitank_leader_commandright +ai_88antitank_leader_idle +ai_88antitank_leader_loadandfire +ai_88antitank_leader_turnleft +ai_88antitank_leader_turnright +ai_88antitank_leader_twitch +ai_88antitank_loader_idle +ai_88antitank_loader_loadandfire +ai_88antitank_loader_turnleft +ai_88antitank_loader_turnright +ai_88antitank_loader_twitch +ai_88antitank_passer_idle +ai_88antitank_passer_loadandfire +ai_88antitank_passer_turnleft +ai_88antitank_passer_turnright +ai_88antitank_passer_twitch +} +mortarteam +{ +ai_mortar_aimguy_fire +ai_mortar_aimguy_fire_alone +ai_mortar_aimguy_pickup +ai_mortar_aimguy_pickup_alone +ai_mortar_aimguy_readyidle +ai_mortar_aimguy_readyidle_alone +ai_mortar_aimguy_waitidle +ai_mortar_aimguy_waittwitch +ai_mortar_loadguy_fire +ai_mortar_loadguy_pickup +ai_mortar_loadguy_readyidle +ai_mortar_loadguy_run +ai_mortar_loadguy_setup +ai_mortar_loadguy_setup_left +ai_mortar_loadguy_setup_right +ai_mortar_loadguy_waitidle +ai_mortar_loadguy_waittwitch +ai_mortar_open_setup +ai_mortar_closed_setup +} +buffalo +{ +crew_lvt4_guy1_idle +crew_lvt4_guy1_exit_normal +crew_lvt4_guy2_idle +crew_lvt4_guy2_exit_normal +crew_lvt4_guy3_idle +crew_lvt4_guy3_exit_normal +crew_lvt4_guy4_idle +crew_lvt4_guy4_exit_normal +crew_lvt4_guy5_idle +crew_lvt4_guy5_exit_normal +crew_lvt4_guy6_idle +crew_lvt4_guy6_exit_normal +crew_lvt4_guy7_idle +crew_lvt4_guy7_exit_normal +crew_lvt4_guy8_idle +crew_lvt4_guy8_exit_normal +crew_lvt4_guy9_idle +crew_lvt4_guy9_exit_normal +crew_lvt4_guy10_idle +crew_lvt4_guy10_exit_normal +} +jeep +{ +crew_jeep1_driver_drive_idle +crew_jeep1_passenger1_drive_idle +crew_jeep1_passenger2_drive_idle +crew_jeep1_passenger3_drive_idle +crew_jeep1_driver_drive_under_fire +crew_jeep1_passenger1_drive_under_fire +crew_jeep1_passenger2_drive_under_fire +crew_jeep1_passenger3_drive_under_fire +crew_jeep1_driver_death_shot +crew_jeep1_passenger1_death_shot +crew_jeep1_passenger2_death_shot +crew_jeep1_passenger3_death_shot +crew_jeep1_driver_death_fire +crew_jeep1_passenger1_death_fire +crew_jeep1_passenger2_death_fire +crew_jeep1_passenger3_death_fire +crew_jeep1_driver_climbout +crew_jeep1_passenger1_climbout +crew_jeep1_passenger2_climbout +crew_jeep1_passenger3_climbout +crew_jeep1_driver_climbin +crew_jeep1_passenger1_climbin +crew_jeep1_passenger2_climbin +crew_jeep1_passenger3_climbin +crew_jeep1_driver_start +crew_jeep1_passenger1_start +crew_jeep1_passenger2_start +crew_jeep1_passenger3_start +crew_jeep1_driver_stop +crew_jeep1_passenger1_stop +crew_jeep1_passenger2_stop +crew_jeep1_passenger3_stop +crew_jeep1_driver_turn_left_light +crew_jeep1_passenger1_turn_left_light +crew_jeep1_passenger2_turn_left_light +crew_jeep1_passenger3_turn_left_light +crew_jeep1_driver_turn_left_heavy +crew_jeep1_passenger1_turn_left_heavy +crew_jeep1_passenger2_turn_left_heavy +crew_jeep1_passenger3_turn_left_heavy +crew_jeep1_driver_turn_right_light +crew_jeep1_passenger1_turn_right_light +crew_jeep1_passenger2_turn_right_light +crew_jeep1_passenger3_turn_right_light +crew_jeep1_driver_turn_right_heavy +crew_jeep1_passenger1_turn_right_heavy +crew_jeep1_passenger2_turn_right_heavy +crew_jeep1_passenger3_turn_right_heavy +} +uaz +{ +uaz_driver_idle_drive +uaz_passenger_idle_drive +crew_uaz_driver_climbout +crew_uaz_passenger1_climbout +crew_uaz_passenger2_climbout +crew_uaz_passenger3_climbout +uaz_driver_enter_from_huntedrun +crew_uaz_driver_tumbleout +crew_uaz_passenger1_tumbleout +crew_uaz_passenger2_tumbleout +crew_uaz_passenger3_tumbleout +uaz_driver_exit_into_run +uaz_passenger_enter_from_huntedrun +uaz_passenger_exit_into_run +crew_uaz_driver_idle +crew_uaz_passenger1_idle +crew_uaz_passenger2_idle +crew_uaz_passenger3_idle +} +police +{ +crew_police_driver_idle +crew_police_passenger_idle +crew_police_driver_climbout +crew_police_passenger_climbout +} +truck +{ +crew_gaz63_passenger_climbin +crew_truck_driver_sit_idle +crew_truck_passenger_sit_idle +crew_gaz63_passenger_sit_idle +crew_truck_guy1_sit_idle +crew_truck_guy2_sit_idle +crew_truck_guy3_sit_idle +crew_truck_guy4_sit_idle +crew_truck_guy5_sit_idle +crew_truck_guy6_sit_idle +crew_truck_guy7_sit_idle +crew_truck_guy8_sit_idle +crew_truck_driver_climbout +crew_truck_passenger_climbout +crew_truck_guy1_climbout +crew_truck_guy2_climbout +crew_truck_guy3_climbout +crew_truck_guy4_climbout +crew_truck_guy5_climbout +crew_truck_guy6_climbout +crew_truck_guy7_climbout +crew_truck_guy8_climbout +crew_gaz63_driver_jump_out +crew_gaz63_passenger_climbout_fast +crew_truck_guy1_climbout_fast +crew_truck_guy2_climbout_fast +crew_truck_guy5_climbout_fast +crew_truck_guy6_climbout_fast +crew_truck_turret_mount +crew_flak1_tag1_idle_1 +} +artillery +{ +crew_artillery1_commander_fire +crew_artillery1_commander_idle +crew_artillery1_commander_pinneddown +crew_artillery1_handleleft_push_medium +crew_artillery1_handleleft_stop +crew_artillery1_handleleft_start +crew_artillery1_handleleft_rotate_cw +crew_artillery1_handleleft_rotate_ccw +crew_artillery1_shieldleft_fire +crew_artillery1_shieldleft_idle +crew_artillery1_shieldleft_pinneddown +crew_artillery1_shieldleft_push_medium +crew_artillery1_shieldleft_push_stop +crew_artillery1_shieldleft_push_start +crew_artillery1_shieldleft_rotate_cw +crew_artillery1_shieldleft_rotate_ccw +crew_artillery1_shieldright_fire +crew_artillery1_shieldright_idle +crew_artillery1_shieldright_pinneddown +crew_artillery1_shieldright_push_medium +crew_artillery1_shieldright_push_stop +crew_artillery1_shieldright_push_start +crew_artillery1_shieldright_rotate_cw +crew_artillery1_shieldright_rotate_ccw +crew_artillery1_loader_fire +crew_artillery1_loader_idle +crew_artillery1_loader_pinneddown +crew_artillery1_handleright_push_medium +crew_artillery1_handleright_stop +crew_artillery1_handleright_start +crew_artillery1_handleright_rotate_cw +crew_artillery1_handleright_rotate_ccw +} +model3 +{ +crew_model3_driver_fire +crew_model3_driver_idle +crew_model3_loader_left_fire +crew_model3_loader_left_idle +crew_model3_loader_right_fire +crew_model3_loader_right_idle +} +halftrack +{ +crew_halftrack_guy1_exit_jumpout +crew_halftrack_guy1_exit_normal +crew_halftrack_guy1_idle +crew_halftrack_guy2_exit_jumpout +crew_halftrack_guy2_exit_normal +crew_halftrack_guy2_idle +crew_halftrack_guy3_exit_jumpout +crew_halftrack_guy3_exit_normal +crew_halftrack_guy3_idle +crew_halftrack_guy4_exit_jumpout +crew_halftrack_guy4_exit_normal +crew_halftrack_guy4_idle +crew_halftrack_guy5_exit_jumpout +crew_halftrack_guy5_exit_normal +crew_halftrack_guy5_idle +crew_halftrack_guy6_exit_jumpout +crew_halftrack_guy6_exit_normal +crew_halftrack_guy6_idle +} +vehicle_gunner_50cal +{ +ai_50cal_gunner_aim +ai_50cal_gunner_aim_up +ai_50cal_gunner_aim_down +} +vehicle_pbr_gunner +{ +ai_boat_pbr_gunner_aim +ai_boat_pbr_gunner_aim_down +ai_boat_pbr_gunner_aim_up +} +vehicle_apc +{ +ai_m113_gunner_aim +ai_m113_gunner_aim_down +ai_m113_gunner_aim_up +} +motorcycle +{ +crew_bike_m72_aim_gun_pullot +crew_bike_m72_aim_gun_putaway +crew_bike_m72_drive_straight +crew_bike_m72_jump_start_armed +crew_bike_m72_jump_start_unarmed +crew_bike_m72_jump_land_armed +crew_bike_m72_jump_land_unarmed +crew_bike_m72_lean_left_armed +crew_bike_m72_lean_left_unarmed +crew_bike_m72_lean_right_armed +crew_bike_m72_lean_right_unarmed +crew_bike_m72_blindfire +crew_bike_m72_aim_f_5 +crew_bike_m72_aim_l_5 +crew_bike_m72_aim_r_5 +moto_aim_2 : additive +{ +crew_bike_m72_aim_f_2 +crew_bike_m72_aim_l_2 +crew_bike_m72_aim_r_2 +} +moto_aim_4 : additive +{ +crew_bike_m72_aim_f_4 +crew_bike_m72_aim_l_4 +crew_bike_m72_aim_r_4 +} +moto_aim_6 : additive +{ +crew_bike_m72_aim_f_6 +crew_bike_m72_aim_l_6 +crew_bike_m72_aim_r_6 +} +moto_aim_8 : additive +{ +crew_bike_m72_aim_f_8 +crew_bike_m72_aim_l_8 +crew_bike_m72_aim_r_8 +} +moto_fire : additive loopsync +{ +crew_bike_m72_f_fire +crew_bike_m72_l_fire +crew_bike_m72_r_fire +} +} +bog +{ +bog_melee_R_attack +bog_melee_R_defend +} +zombie +{ +ai_zombie_door_tear_v1 +ai_zombie_door_tear_v2 +ai_zombie_door_tear_high +ai_zombie_door_tear_left +ai_zombie_door_tear_right +ai_zombie_door_tear_low +ai_zombie_door_pound_v1 +ai_zombie_door_pound_v2 +ai_zombie_shot_arm_left +ai_zombie_shot_arm_right +ai_zombie_shot_leg_left_2_crawl +ai_zombie_shot_leg_right_2_crawl +ai_zombie_taunts_1 +ai_zombie_taunts_2 +ai_zombie_taunts_3 +ai_zombie_taunts_4 +ai_zombie_taunts_5 +ai_zombie_taunts_5b +ai_zombie_taunts_5c +ai_zombie_taunts_5d +ai_zombie_taunts_5e +ai_zombie_taunts_5f +ai_zombie_taunts_6 +ai_zombie_taunts_7 +ai_zombie_taunts_8 +ai_zombie_taunts_9 +ai_zombie_quad_taunt +ai_zombie_quad_taunt_2 +ai_zombie_quad_taunt_3 +ai_zombie_quad_taunt_4 +ai_zombie_quad_taunt_5 +ai_zombie_quad_taunt_6 +ai_zombie_boardtear_l_1 +ai_zombie_boardtear_l_2 +ai_zombie_boardtear_l_3 +ai_zombie_boardtear_l_4 +ai_zombie_boardtear_l_5 +ai_zombie_boardtear_l_6 +ai_zombie_boardtear_m_1 +ai_zombie_boardtear_m_2 +ai_zombie_boardtear_m_3 +ai_zombie_boardtear_m_4 +ai_zombie_boardtear_m_5 +ai_zombie_boardtear_m_6 +ai_zombie_boardtear_r_1 +ai_zombie_boardtear_r_2 +ai_zombie_boardtear_r_3 +ai_zombie_boardtear_r_4 +ai_zombie_boardtear_r_5 +ai_zombie_boardtear_r_6 +ai_zombie_boardtear_roof +ai_zombie_boardtear_crawl_l_1 +ai_zombie_boardtear_crawl_l_2 +ai_zombie_boardtear_crawl_l_3 +ai_zombie_boardtear_crawl_l_4 +ai_zombie_boardtear_crawl_l_5 +ai_zombie_boardtear_crawl_l_6 +ai_zombie_boardtear_crawl_m_1 +ai_zombie_boardtear_crawl_m_2 +ai_zombie_boardtear_crawl_m_3 +ai_zombie_boardtear_crawl_m_4 +ai_zombie_boardtear_crawl_m_5 +ai_zombie_boardtear_crawl_m_6 +ai_zombie_boardtear_crawl_r_1 +ai_zombie_boardtear_crawl_r_2 +ai_zombie_boardtear_crawl_r_3 +ai_zombie_boardtear_crawl_r_4 +ai_zombie_boardtear_crawl_r_5 +ai_zombie_boardtear_crawl_r_6 +ai_zombie_bar_bend_l +ai_zombie_bar_bend_l_2 +ai_zombie_bar_bend_m_1 +ai_zombie_bar_bend_m_2 +ai_zombie_bar_bend_r +ai_zombie_bar_bend_r_2 +ai_zombie_bartear_l_1 +ai_zombie_bartear_l_2 +ai_zombie_bartear_l_3 +ai_zombie_bartear_l_4 +ai_zombie_bartear_l_5 +ai_zombie_bartear_l_6 +ai_zombie_bartear_m_1 +ai_zombie_bartear_m_2 +ai_zombie_bartear_m_3 +ai_zombie_bartear_m_4 +ai_zombie_bartear_m_5 +ai_zombie_bartear_m_6 +ai_zombie_bartear_r_1 +ai_zombie_bartear_r_2 +ai_zombie_bartear_r_3 +ai_zombie_bartear_r_4 +ai_zombie_bartear_r_5 +ai_zombie_bartear_r_6 +ai_zombie_bartear_crawl_l_1 +ai_zombie_bartear_crawl_l_2 +ai_zombie_bartear_crawl_l_3 +ai_zombie_bartear_crawl_l_4 +ai_zombie_bartear_crawl_l_5 +ai_zombie_bartear_crawl_l_6 +ai_zombie_bartear_crawl_m_1 +ai_zombie_bartear_crawl_m_2 +ai_zombie_bartear_crawl_m_3 +ai_zombie_bartear_crawl_m_4 +ai_zombie_bartear_crawl_m_5 +ai_zombie_bartear_crawl_m_6 +ai_zombie_bartear_crawl_r_1 +ai_zombie_bartear_crawl_r_2 +ai_zombie_bartear_crawl_r_3 +ai_zombie_bartear_crawl_r_4 +ai_zombie_bartear_crawl_r_5 +ai_zombie_bartear_crawl_r_6 +ch_dazed_a_death +ch_dazed_b_death +ch_dazed_c_death +ch_dazed_d_death +ai_zombie_death_v1 +ai_zombie_death_v2 +ai_zombie_crawl_death_v1 +ai_zombie_crawl_death_v2 +ai_zombie_tesla_death_a +ai_zombie_tesla_death_b +ai_zombie_tesla_death_c +ai_zombie_tesla_death_d +ai_zombie_tesla_death_e +ai_zombie_tesla_crawl_death_a +ai_zombie_tesla_crawl_death_b +ai_zombie_thundergun_getup_a +ai_zombie_thundergun_getup_quick_a +ai_zombie_thundergun_getup_b +ai_zombie_thundergun_getup_c +ai_zombie_thundergun_getup_quick_b +ai_zombie_thundergun_getup_quick_c +ai_zombie_thundergun_hit_faceplant +ai_zombie_thundergun_hit_armslegsforward +ai_zombie_thundergun_hit_deadfallknee +ai_zombie_thundergun_hit_doublebounce +ai_zombie_thundergun_hit_flatonback +ai_zombie_thundergun_hit_forwardtoface +ai_zombie_thundergun_hit_jackiespin_vertical +ai_zombie_thundergun_hit_stumblefall +ai_zombie_thundergun_hit_upontoback +ai_zombie_thundergun_hit_jackiespin_left +ai_zombie_thundergun_hit_legsout_left +ai_zombie_thundergun_hit_jackiespin_right +ai_zombie_thundergun_hit_legsout_right +ai_zombie_freeze_death_a +ai_zombie_freeze_death_b +ai_zombie_freeze_death_c +ai_zombie_freeze_death_d +ai_zombie_freeze_death_e +ai_zombie_crawl_freeze_death_01 +ai_zombie_crawl_freeze_death_02 +ai_zombie_humangun_run_a +ai_zombie_humangun_run_b +ai_zombie_humangun_react +ai_zombie_microwave_death_a +ai_zombie_microwave_death_b +ai_zombie_microwave_death_c +ai_zombie_microwave_death_walking_a +ai_zombie_microwave_death_walking_b +ai_zombie_microwave_death_walking_c +ai_zombie_crawl_microwave_death_a +ai_zombie_crawl_microwave_death_b +ai_zombie_crawl_microwave_death_c +ai_zombie_crawl_microwave_death_walking_a +ai_zombie_crawl_microwave_death_walking_b +ai_zombie_crawl_microwave_death_walking_c +ai_zombie_quad_death +ai_zombie_quad_death_2 +ai_zombie_quad_death_3 +ai_zombie_quad_death_4 +ai_zombie_quad_death_5 +ai_zombie_quad_death_6 +ai_zombie_quad_death_tesla +ai_zombie_quad_death_tesla_2 +ai_zombie_quad_death_tesla_3 +ai_zombie_quad_death_tesla_4 +ai_zombie_quad_freeze_death_a +ai_zombie_quad_freeze_death_b +ai_zombie_quad_microwave_death_a +ai_zombie_quad_microwave_death_b +ai_zombie_quad_microwave_death_c +ai_zombie_boss_death +ai_zombie_boss_death_a +ai_zombie_boss_death_explode +ai_zombie_boss_death_mg +ai_zombie_boss_tesla_death_a +ai_zombie_boss_death_coast +ai_zombie_boss_death_a_coast +ai_zombie_boss_death_explode_coast +ai_zombie_boss_death_mg_coast +ai_zombie_boss_tesla_death_a_coast +ai_zombie_napalm_death_01 +ai_zombie_napalm_death_02 +ai_zombie_napalm_death_03 +ai_zombie_sonic_death_01 +ai_zombie_sonic_death_02 +ai_zombie_sonic_death_03 +} +spiderhole +{ +ch_spiderHole1_jumpoff_A +ch_spiderHole1_jumpoff_B +ch_spiderHole2_jumpoff_A +ch_spiderHole2_jumpoff_B +ai_spiderhole_jump_out +ai_spiderhole_stumble_out +ai_spiderhole_grenade_toss +ai_spiderhole_gun_spray +ai_spiderhole_idle +ai_spiderhole_jump_attack +} +rappel +{ +ai_rappel_in +ai_rappel_loop_in_place +ai_rappel_loop +ai_rappel_out +} +basejump +{ +ai_base_jump_chuteopen_loop +ai_base_jump_cord_pull +ai_base_jump_freefall +ai_base_jump_jumpoff +ai_base_jump_jumpoff_leftguy +ai_base_jump_jumpoff_rightguy +ch_wmd_b01_freefall_fall_guy01 +ch_wmd_b01_freefall_chutepull_guy01 +ch_wmd_b01_freefall_chutefloat_guy01 +ch_wmd_b01_freefall_land_guy01 +ch_wmd_b01_freefall_fall_kristina +ch_wmd_b01_freefall_chutepull_kristina +ch_wmd_b01_freefall_chutefloat_kristina +ch_wmd_b01_freefall_land_kristina +ai_base_jump_freefall_left_loop +ai_base_jump_freefall_right_loop +ai_base_jump_deadfall_loop +ai_base_jump_deadfall2freefall +ch_wmd_b01_basejump_leadin_brooks +ch_wmd_b01_basejump_leadin_weaver +ch_wmd_b01_basejump_prepLoop_brooks +ch_wmd_b01_basejump_prepLoop_weaver +ch_wmd_b01_basejump_react_brooks +ch_wmd_b01_basejump_react_weaver +ch_wmd_b01_basejump_waitLoop_weaver +} +door_breach +{ +pb_breach_shoulder +} +freefall_ai +{ +ch_freefall_loop +} +humanshield_ai +{ +ai_humanshield_holder_back +ai_humanshield_holder_idle +ai_humanshield_victim_back +ai_humanshield_victim_idle +} +module_2_anims +{ +ai_flagbearer_pickup +ai_spawning_radio_crouched +ai_spawning_squad_enter_A_char1 +ai_spawning_squad_enter_A_char2 +ai_spawning_squad_enter_A_char3 +ai_spawning_squad_enter_B_char1 +ai_spawning_squad_enter_B_char2 +ai_spawning_squad_enter_B_char3 +ai_spawning_squad_enter_C_char1 +ai_spawning_squad_enter_C_char2 +ai_spawning_squad_enter_C_char3 +ch_makinraid_wounded_c +ch_makinraid_wounded_d +} +module_animation +{ +ch_antsnest_arguing1_loop +ch_antsnest_arguing2_loop +ch_makinraid_e2_arguing1_loop +ch_makinraid_e2_arguing2_loop +ch_sniper_resnov_cheer +ch_module_peleliu2_grenadethrow_guy1_out +ch_module_peleliu2_grenadethrow_guy2_out +ch_module_peleliu2_grenadethrow_guy3_out +ch_module_oki3_tableguys_guy1_loop +ch_module_oki3_tableguys_guy2_loop +ch_module_oki3_tableguys_guy3_loop +ch_module_carrybox_tandem1_guy1 +ch_module_carrybox_tandem1_guy1death +ai_module_flame_death_e +ai_stand_module_pistol_switch +} +techdemo_streaming_test +{ +crew_lvt4_peleliu1_character3 +} +module_3_anims +{ +ch_holland3_slipping_a +ch_holland3_slipping_b +} +module_5_anims +{ +crew_jeep1_driver_climbout_fast +crew_jeep1_passenger1_climbout_fast +crew_jeep1_passenger2_climbout_fast +crew_jeep1_passenger3_climbout_fast +crew_jeep1_driver_climbin_fast +crew_jeep1_passenger1_climbin_fast +crew_jeep1_passenger2_climbin_fast +crew_jeep1_passenger3_climbin_fast +crew_jeep1_passenger_to_driver +ai_carjack_jeep +} +module_4_anims +{ +crew_dpv_idle +crew_dpv_dissmount_high +crew_dpv_dissmount_low +ch_module4_swimming_crevasse_death +ch_module4_swimming_crevasse_guy_1 +ch_module4_swimming_crevasse_guy_2 +ch_module4_swimming_jump_cover +ch_module4_swimming_jump_cover_death +ch_module4_swimming_jump_shoot +ch_module4_swimming_moonpool_dive_attack +ch_module4_swimming_moonpool_fall_attack +} +level_module_8_boost +{ +ai_boost_loop +ai_boost_up +ai_grab_pull_up +ai_transition_to_boost +ai_transition_to_idle +} +level_module_12_core_movements +{ +ch_module_12_slide_base_legs +} +level_module_14_anims +{ +ch_cameratest +} +level_task6_sullivan_run +{ +ch_makinraid_sullivan_3_route +ch_makinraid_sullivan_3_route_fixed +ch_makinraid_sullivan_3_route_extended +} +level_scripted_anim_test +{ +ch_scripted_tests_b0_posetest +ch_scripted_tests_b0_reaction_explosion +ch_scripted_tests_b0_ice_slip +ch_scripted_tests_b0_grenadetoss_guy1_in +ch_scripted_tests_b0_grenadetoss_guy2_in +ch_scripted_tests_b0_grenadetoss_guy1_loop +ch_scripted_tests_b0_grenadetoss_guy2_loop +ch_scripted_tests_b0_grenadetoss_guy1_out +ch_scripted_tests_b0_grenadetoss_guy2_out +ch_scripted_tests_b0_coveralign +ch_scripted_tests_b0_interactive_enemy +ch_scripted_tests_b0_interactive_prisoner_alive +ch_scripted_tests_b0_interactive_prisoner_dead +ch_scripted_tests_b0_interactive_prisoner_died +ch_scripted_tests_death_ragdoll_loop +ch_scripted_tests_death_ragdoll +} +art_vignette +{ +rom_face_rig +air_field +mercy_killing_dave +mercy_killing_jeremy +mercy_killing_yanick +creekintro_inplace +} +contextual_melee +{ +int_contextual_melee_garrote +int_contextual_melee_garrotesit +int_contextual_melee_necksnap +int_contextual_melee_neckstab +int_contextual_melee_neckstabcrouch +int_contextual_melee_garrote_quick +int_contextual_melee_garrotesit_quick +int_contextual_melee_necksnap_quick +int_contextual_melee_neckstab_quick +int_contextual_melee_neckstabcrouch_quick +int_contextual_melee_crouch_neckstab_quick +int_contextual_melee_kneekick_quick +int_contextual_melee_elbow_hit_quick +int_contextual_melee_judochop_quick +int_contextual_melee_headpunch_quick +int_contextual_melee_karambit +int_contextual_melee_comms_floor1_tapemachine +int_contextual_melee_comms_floor4_orange +int_contextual_melee_hatchet_worker +int_contextual_melee_hatchet_to_throw +ai_contextual_melee_garrote +ai_contextual_melee_garrotesit_idle +ai_contextual_melee_garrotesit_death +ai_contextual_melee_garrotesit_deathpose +ai_contextual_melee_necksnap +ai_contextual_melee_neckstab +ai_contextual_melee_neckstabcrouch_idle +ai_contextual_melee_neckstabcrouch_death +ai_contextual_melee_garrote_quick +ai_contextual_melee_garrotesit_death_quick +ai_contextual_melee_necksnap_quick +ai_contextual_melee_neckstab_quick +ai_contextual_melee_neckstabcrouch_death_quick +ai_contextual_melee_crouch_neckstab_quick +ai_contextual_melee_kneekick_quick +ai_contextual_melee_elbow_hit_quick +ai_contextual_melee_judochop_quick +ai_contextual_melee_headpunch_quick +ai_contextual_melee_karambit +ai_contextual_melee_comms_floor1_tapemachine +ai_contextual_melee_comms_floor4_orange +ai_contextual_melee_comms_floor4_orange_deathpose +ai_contextual_melee_hatchet_worker +ai_contextual_melee_hatchet_worker_deathpose +ai_contextual_melee_hatchet_to_throw +ai_contextual_melee_hatchet_to_throw_deathpose +ai_contextual_melee_hatchet_patroller_deathpose +ai_contextual_melee_ladderpull +} +woundedman +{ +ch_incubator_wounded_guy_compress_trans_in +ch_incubator_wounded_guy_compress_trans_out +ch_incubator_wounded_guy_in_pain_a +ch_incubator_wounded_guy_in_pain_b +ch_incubator_wounded_guy_in_pain_c +ch_incubator_wounded_guy_in_pain_d +ch_incubator_wounded_guy_resting +ch_incubator_wounded_guy_hold_down_pain_large +ch_incubator_wounded_guy_hold_down_pain_small +ch_incubator_wounded_guy_hold_down_trans_in +ch_incubator_wounded_guy_hold_down_trans_out +ch_incubator_wounded_guy_1 +ch_incubator_wounded_guy_2 +ch_incubator_wounded_guy_3 +} +Ropebridge +{ +ch_incubator_ropebridge_ropebridgefallguy +ai_climb_rope_loop +ai_climb_rope_idle +} +gasmask +{ +ai_maskpull_on_crouch_cover_hide +} +animation_first_person_test_map +{ +cin_viewmodelanimationtest_char1 +cin_viewmodelanimationtest_char2 +cin_viewmodelanimationtest_player +} +zombie_cutscene +{ +ch_zom_s01_intro_pentzombie_castro +ch_zom_s02_intro_pentzombie_castro +ch_zom_s03_intro_pentzombie_castro +ch_zom_b03_lockandload_castro +ch_zom_s01_intro_pentzombie_jfk +ch_zom_s02_intro_pentzombie_jfk +ch_zom_s03_intro_pentzombie_jfk +ch_zom_b03_lockandload_jfk +ch_zom_s01_intro_pentzombie_mcnamara +ch_zom_s02_intro_pentzombie_mcnamara +ch_zom_s03_intro_pentzombie_mcnamara +ch_zom_b03_lockandload_mcnamara +ch_zom_s01_intro_pentzombie_nixon +ch_zom_s02_intro_pentzombie_nixon +ch_zom_s03_intro_pentzombie_nixon +ch_zom_b03_lockandload_nixon +} +collateral_damage +{ +ai_doorbreach_kick +ch_col_b04_jump4huey_bowman_idle +ch_col_b04_jump4huey_pfc_idle +ch_col_b04_jump4huey_woods_idle +ch_col_b04_jump4huey_bowman +ch_col_b04_jump4huey_pfc +ch_col_b04_jump4huey_woods +ch_col_b04_jump4huey_bowman_jump +ch_col_b04_jump4huey_woods_jump +} +quagmire +{ +ch_quag_b01_civilianwalkloops_civ1 +ch_quag_b01_civilianwalkloops_civ2 +ch_quag_b01_civilianwalkloops_civ3 +ch_quag_b01_escapetown1_civ1 +ch_quag_b01_escapetown1_civ2 +ch_quag_b01_escapetown1_civ3 +ch_quag_b01_escapetown1_civ4 +ch_quag_b01_escapetown1_civ5 +ch_quag_b01_escapetown1_civ6 +ch_quag_b01_escapetown2_civ1 +ch_quag_b01_escapetown2_civ2 +ch_quag_b01_escapetown2_civ3 +ch_quag_b01_escapetown2_civ4 +ch_quag_b01_escapetown2_civ5 +ch_quag_b01_escapetown3_civ1 +ch_quag_b01_roadsequence1_civ1 +ch_quag_b01_roadsequence1_civ10 +ch_quag_b01_roadsequence1_civ11 +ch_quag_b01_roadsequence1_civ12 +ch_quag_b01_roadsequence1_civ13 +ch_quag_b01_roadsequence1_civ14 +ch_quag_b01_roadsequence1_civ15 +ch_quag_b01_roadsequence1_civ16 +ch_quag_b01_roadsequence1_civ17 +ch_quag_b01_roadsequence1_civ18 +ch_quag_b01_roadsequence1_civ19 +ch_quag_b01_roadsequence1_civ2 +ch_quag_b01_roadsequence1_civ3 +ch_quag_b01_roadsequence1_civ4 +ch_quag_b01_roadsequence1_civ5 +ch_quag_b01_roadsequence1_civ6 +ch_quag_b01_roadsequence1_civ7 +ch_quag_b01_roadsequence1_civ8 +ch_quag_b01_roadsequence1_civ9 +ch_quag_b01_roadsequence2_civ1 +ch_quag_b01_roadsequence2_civ10 +ch_quag_b01_roadsequence2_civ11 +ch_quag_b01_roadsequence2_civ12 +ch_quag_b01_roadsequence2_civ13 +ch_quag_b01_roadsequence2_civ14 +ch_quag_b01_roadsequence2_civ15 +ch_quag_b01_roadsequence2_civ16 +ch_quag_b01_roadsequence2_civ17 +ch_quag_b01_roadsequence2_civ18 +ch_quag_b01_roadsequence2_civ19 +ch_quag_b01_roadsequence2_civ2 +ch_quag_b01_roadsequence2_civ3 +ch_quag_b01_roadsequence2_civ4 +ch_quag_b01_roadsequence2_civ5 +ch_quag_b01_roadsequence2_civ6 +ch_quag_b01_roadsequence2_civ7 +ch_quag_b01_roadsequence2_civ8 +ch_quag_b01_roadsequence2_civ9 +ch_quag_b01_roadsequence3_civ1 +ch_quag_b01_roadsequence3_civ2 +ch_quag_b01_roadsequence3_civ3 +ch_quag_b01_roadsequence3_civ4 +ch_quag_b01_roadsequence3_soldier1 +ch_quag_b01_roadsequence3_soldier2 +ch_quag_b01_roadsequence3_soldier3 +ch_quag_b01_roadsequence3_soldier4 +ch_quag_b01_roadsequence3_soldier5 +ch_quag_b01_roadsequence3_soldier6 +ch_quag_b01_roadsequence3_soldier7 +ch_quag_b01_roadsequence3_vc1 +ch_quag_b01_roadsequence3_vc2 +ch_quag_b01_roadsequence3_vc3 +ch_quag_b01_roadsequence4_civ1 +ch_quag_b01_roadsequence4_civ10 +ch_quag_b01_roadsequence4_civ11 +ch_quag_b01_roadsequence4_civ12 +ch_quag_b01_roadsequence4_civ13 +ch_quag_b01_roadsequence4_civ14 +ch_quag_b01_roadsequence4_civ2 +ch_quag_b01_roadsequence4_civ3 +ch_quag_b01_roadsequence4_civ4 +ch_quag_b01_roadsequence4_civ5 +ch_quag_b01_roadsequence4_civ6 +ch_quag_b01_roadsequence4_civ7 +ch_quag_b01_roadsequence4_civ8 +ch_quag_b01_roadsequence4_civ9 +ch_quag_b01_roadsequence5_civ1 +ch_quag_b01_roadsequence5_civ10 +ch_quag_b01_roadsequence5_civ11 +ch_quag_b01_roadsequence5_civ12 +ch_quag_b01_roadsequence5_civ13 +ch_quag_b01_roadsequence5_civ14 +ch_quag_b01_roadsequence5_civ2 +ch_quag_b01_roadsequence5_civ3 +ch_quag_b01_roadsequence5_civ4 +ch_quag_b01_roadsequence5_civ5 +ch_quag_b01_roadsequence5_civ6 +ch_quag_b01_roadsequence5_civ7 +ch_quag_b01_roadsequence5_civ8 +ch_quag_b01_roadsequence5_civ9 +ch_quag_b01_intro_copilot +ch_quag_b01_intro_pilot +ch_quag_b01_aa_ambush_guy1 +ch_quag_b01_aa_ambush_guy2 +ch_quag_b02_hatcrowd_front_civ1 +ch_quag_b02_hatcrowd_front_civ2 +ch_quag_b02_hatcrowd_front_civ3 +ch_quag_b02_hatcrowd_front_civ4 +ch_quag_b02_hatcrowd_front_civ5 +ch_quag_b02_hatcrowd_hatbomber +ch_quag_b02_hatcrowd_mid_civ1 +ch_quag_b02_hatcrowd_mid_civ2 +ch_quag_b02_hatcrowd_mid_civ3 +ch_quag_b02_hatcrowd_mid_civ4 +ch_quag_b02_hatcrowd_mid_civ5 +ch_quag_b02_hatcrowd_rear_civ1 +ch_quag_b02_hatcrowd_rear_civ2 +ch_quag_b02_hatcrowd_rear_civ3 +ch_quag_b02_hatcrowd_rear_civ4 +ch_quag_b02_hatcrowd_rear_civ5 +ch_quag_b02_crowd1_civ1 +ch_quag_b02_crowd1_civ2 +ch_quag_b02_crowd1_civ3 +ch_quag_b02_crowd1_civ4 +ch_quag_b02_crowd1_civ5 +ch_quag_b02_crowd1_soldier1 +ch_quag_b02_crowd3_civ1 +ch_quag_b02_crowd3_civ2 +ch_quag_b02_crowd3_civ3 +ch_quag_b02_crowd3_civ4 +ch_quag_b02_crowd3_civ5 +ch_quag_b02_crowd3_civ6 +ch_quag_b02_crowd5_civ1 +ch_quag_b02_crowd5_civ2 +ch_quag_b02_crowd5_civ3 +ch_quag_b02_crowd5_civ4 +ch_quag_b02_crowd5_civ5 +ch_quag_b02_crowd5_civ6 +ch_quag_b02_crowd6_civ1 +ch_quag_b02_crowd6_civ2 +ch_quag_b02_crowd6_civ3 +ch_quag_b02_crowd6_civ4 +ch_quag_b02_crowd6_soldier1 +ch_quag_b02_crowd6_soldier2 +ch_quag_b02_crowd7_civ1 +ch_quag_b02_crowd7_civ2 +ch_quag_b02_crowd7_civ3 +ch_quag_b02_crowd8_captain +ch_quag_b02_crowd8_civ1 +ch_quag_b02_crowd8_soldier1 +ch_quag_b02_crowd8_soldier2 +ch_quag_b2_crowd7_civ1 +ch_quag_b2_crowd7_civ2 +ch_quag_b2_crowd7_civ3 +ch_quag_b02_triagesequence_medic1 +ch_quag_b02_triagesequence_medic2 +ch_quag_b02_triagesequence_medic3 +ch_quag_b02_triagesequence_medic4 +ch_quag_b02_triagesequence_soldier1 +ch_quag_b02_triagesequence_soldier2 +ch_quag_b02_triagesequence_soldier3 +ch_quag_b02_triagesequence_soldier4 +ch_quag_b02_triagesequence_soldier5 +ch_quag_b02_triagesequence_soldier6 +ch_quag_b02_triagesequence_soldier7 +ch_quag_b02_triagesequence_stretcher1 +ch_quag_b02_triagesequence_stretcher2 +ch_quag_b02_triagesequence_stretcher3 +ch_quag_b02_troopclearingbuilding_civ1 +ch_quag_b02_troopclearingbuilding_civ2 +ch_quag_b02_troopclearingbuilding_civ3 +ch_quag_b02_troopclearingbuilding_civ4 +ch_quag_b02_troopclearingbuilding_soldier1 +ch_quag_b02_troopclearingbuilding_soldier2 +ch_quag_b02_hatbomber_at_player +ch_quag_b02_nvaambush_nva1 +ch_quag_b02_nvaambush_nva2 +ch_quag_b3_copilotdeath_copilot +ch_quag_b3_copilotdeath_pilot +crew_zpu4_death +crew_zpu4_fire +crew_zpu4_idle +ch_quag_b05_sldrrepel_sldr +ch_quag_b05_nvachasingafterncivs_civ1 +ch_quag_b05_nvachasingafterncivs_civ2 +ch_quag_b05_nvachasingafterncivs_civ3 +ch_quag_b05_nvachasingafterncivs_civ4 +ch_quag_b05_nvachasingafterncivs_civ5 +ch_quag_b05_nvachasingafterncivs_civ6 +ch_quag_b05_nvachasingafterncivs_civ7 +ch_quag_b05_nvachasingafterncivs_civ8 +ch_quag_b05_nvachasingafterncivs_nva1 +ch_quag_b05_nvachasingafterncivs_nva2 +ch_quag_b05_nvachasingafterncivsdeath_civ1 +ch_quag_b05_nvachasingafterncivsdeath_civ2 +ch_quag_b05_nvachasingafterncivsdeath_civ3 +ch_quag_b05_nvachasingafterncivsdeath_civ4 +ch_quag_b05_nvachasingafterncivsdeath_civ5 +ch_quag_b05_nvachasingafterncivsdeath_civ6 +ch_quag_b05_repeltomacv_barnes +ch_quag_b05_repeltomacv_player +ch_quag_b05_repeltomacv_soldier +ch_quag_b05_rifle_guy1_loop +ch_quag_b05_rifle_guy1_reaction +ch_quag_b05_rifle_guy2_loop +ch_quag_b05_rifle_guy2_reaction +ch_quag_b05_rifle_guy3_loop +ch_quag_b05_rifle_guy3_reaction +ch_quag_b05_table_map_guy1 +ch_quag_b05_table_map_guy2 +ch_quag_b05_table_map_guy3 +ch_quag_b05_hallway_huddle_guy1 +ch_quag_b05_hallway_huddle_guy2 +ch_quag_b05_moris_code_reaction +ch_quag_b05_beatendown_civ +ch_quag_b05_beatendown_civ_death_pose +ch_quag_b05_beatendown_nva +ch_quag_b05_beatenup_civ_alert +ch_quag_b05_beatenup_civ_idle +ch_quag_b05_beatenup_civ_loop +ch_quag_b05_beatenup_nva_alert +ch_quag_b05_beatenup_nva_loop +ch_quag_b05_repeltomacv_nva1 +ch_quag_b05_repeltomacv_nva2 +ch_quag_b05_repeltomacv_nva3 +ch_quag_b05_civsaroundcornersurprisedleft2_civ1 +ch_quag_b05_civsaroundcornersurprisedleft_civ2 +ch_quag_b05_civscowerincorner1_civ1 +ch_quag_b05_civscowerincorner1_civ2 +ch_quag_b05_civscowerincorner2_civ2 +ch_quag_b05_civscowering1_civ1 +ch_quag_b05_civscowering3_civ2 +ch_quag_b05_dead01 +ch_quag_b05_dead02 +ch_quag_b05_dead03 +ch_quag_b05_dead04 +ch_quag_b05_dead05 +ch_quag_b05_dead06 +ch_quag_b05_dead07 +ch_quag_b05_dead08 +ch_quag_b05_dead09 +ch_quag_b05_dead10 +ch_quag_b05_dead11 +ch_quag_b05_dead12 +ch_quag_b05_dead13 +ch_quag_b05_dead14 +ch_quag_b06_reznovreveal_barnes +ch_quag_b06_reznovreveal_reznov +ch_quag_b05_heli_shoot_nva1 +ch_quag_b05_heli_shoot_nva2 +ch_quag_b05_heli_shoot_nva3 +ch_quag_b05_heli_shoot_nva4 +ch_quag_b06_doorbreach_dead_guy_1 +ch_quag_b06_doorbreach_dead_guy_2 +ch_quag_b06_doorbreach_guy1 +ch_quag_b06_doorbreach_guy1_wave +ch_quag_b06_doorbreach_guy2 +ch_quag_b01_intro_barnes +ch_quag_b01_barnes_trans2door +ch_quag_b01_barnes_door_idle +ch_quag_b01_barnes_shootingloop +ch_quag_b01_barnes_trans2cover +ch_quag_b01_barnes_cover_idle +ch_quag_b01_barnes_cover_ruok +ch_quag_b01_barnes_trans2door2 +ch_quag_b01_barnes_cover_stream +ch_hue_b01_1sthallwaymowdown_civ1 +ch_hue_b01_1sthallwaymowdown_civ2 +ch_quag_b05_civscowering4_civ2 +ch_quag_b05_civscowering4_civ2_death +ch_hue_b01_choppermowdown_death_noragdoll_nva1 +ch_hue_b01_choppermowdown_loop_nva1 +ch_hue_b01_choppermowdown_death_ragdoll_nva2 +ch_hue_b01_choppermowdown_loop_nva2 +ch_hue_b01_choppermowdown_death_ragdoll_nva3 +ch_hue_b01_choppermowdown_loop_nva3 +ch_hue_b01_choppermowdown_death_ragdoll_nva4 +ch_hue_b01_choppermowdown_loop_nva4 +ch_hue_b01_stairtumbledeath_nva_back +ch_hue_b01_stairtumbledeath_nva_front +ch_hue_b01_shotguntothewall_death +ch_hue_b01_fieldagent_idle +ch_hue_b01_fieldagent_fires +ch_hue_b01_fieldagent_dies +ch_hue_b01_repelthroughceiling_bowman +ch_hue_b01_repelthroughceiling_troop1 +ch_hue_b01_repelthroughceiling_nva1 +ch_hue_b01_repelthroughceiling_nva2 +ch_hue_b05_civsaroundcornersurprisedleft_civ2 +ch_hue_b05_civsaroundcornersurprisedleft_civ2_cowerloop +ch_hue_b01_runningawaystairs_civ1 +ch_hue_b01_runningawaystairs_civ2 +ch_hue_b01_runningawaystairs_civ3 +ch_hue_b01_runningawaystairs_nva +ch_hue_b01_runningawaystairs_nva2 +} +hue_city +{ +ch_hue_b02_tankblast_crosby_coveridle +ch_hue_b02_tankblast_crosby_idle1 +ch_hue_b02_tankblast_crosby_intoposition +ch_hue_b02_tankblast_crosby_ohshit +ch_hue_b02_tankblast_redshirt1_coveridle +ch_hue_b02_tankblast_redshirt1_explosion +ch_hue_b02_tankblast_redshirt1_idle1 +ch_hue_b02_tankblast_redshirt1_intoposition +ch_hue_b02_tankblast_redshirt1_ohshit +ch_hue_b02_tankblast_redshirt2_coveridle +ch_hue_b02_tankblast_redshirt2_death +ch_hue_b02_tankblast_redshirt2_idle1 +ch_hue_b02_tankblast_redshirt2_intoposition +ch_hue_b02_tankblast_tank +ch_hue_b02_tankblast_woods_explosion +ch_hue_b02_tankblast_woods_helpmemason +ch_hue_b02_tankblast_woods_idle1 +ch_hue_b02_tankblast_woods_intoposition +ch_hue_b02_tankblast_woods_ohshit +ch_hue_b02_tankblast_woods_pushloop +ch_hue_b02_tankblast_crosby +ch_hue_b02_tankblast_idle_woods +ch_hue_b02_tankblast_troop1 +ch_hue_b02_tankblast_troop2 +ch_hue_b02_tankblast_woods +ch_hue_b02_badlyinjuredtroops_troop1 +ch_hue_b02_badlyinjuredtroops_troop2 +ch_hue_b02_badlyinjuredtroops_troop3 +ch_hue_b02_badlyinjuredtroops_troop4 +ch_hue_b02_badlyinjuredtroops_troop5 +ch_hue_b02_badlyinjuredtroops_troop5_idle +ch_hue_b02_badlyinjuredtroops_troop7 +ch_hue_b02_badlyinjuredtroops_troop7_idle +ch_hue_b02_badlyinjuredtroops_troop8 +ch_hue_b02_badlyinjuredtroops_troop9 +ch_hue_b02_badlyinjuredtroops_medic1 +ch_hue_b02_badlyinjuredtroops_medic2 +ch_hue_b02_badlyinjuredtroops_medic3 +ch_hue_b02_badlyinjuredtroops_medic3_idle +ch_hue_b02_badlyinjuredtroops_medic4 +ch_hue_b02_badlyinjuredtroops_medic4_idle +ch_hue_b02_mourndead_civ1 +ch_hue_b02_mourndead_civ2 +ch_hue_b02_killingcivilians1_civ1 +ch_hue_b02_killingcivilians1_civ1_idle +ch_hue_b02_killingcivilians1_nva1 +ch_hue_b02_killingcivilians1_nva1_idle +ch_hue_b02_killingcivilians2_nva1 +ch_hue_b02_killingcivilians2_nva2 +ch_hue_b02_killingcivilians2_civ1 +ch_hue_b02_killingcivilians2_civ2 +ch_hue_b02_killingcivilians2_civ3 +ch_hue_b02_killingcivilians2_civ4 +ch_hue_b02_crushedbytank_nva1 +ch_hue_b02_crushedbytank_nva2 +ch_hue_b02_commandeerradio_a_crosby +ch_hue_b02_commandeerradio_a_idle1_crosby +ch_hue_b02_commandeerradio_a_idle2_crosby +ch_hue_b02_commandeerradio_a_player +ch_hue_b02_commandeerradio_a_redshirt +ch_hue_b02_commandeerradio_b_crosby +ch_hue_b02_commandeerradio_c_crosby +ch_hue_b02_commandeerradio_idle1_crosby +ch_hue_b02_commandeerradio_idle2_crosby +ch_hue_b02_commandeerradio_idle3_crosby +ch_hue_b02_commandeerradio_idle4_crosby +ch_hue_b02_loading_wounded_a_troop1 +ch_hue_b02_loading_wounded_a_troop2 +ch_hue_b02_loading_wounded_a_troop3 +ch_hue_b02_loading_wounded_b_troop1 +ch_hue_b02_loading_wounded_b_troop2 +ch_hue_b02_loading_wounded_b_troop3 +ch_hue_b02_loading_wounded_idle1_troop1 +ch_hue_b02_loading_wounded_idle1_troop2 +ch_hue_b02_loading_wounded_idle1_troop3 +ch_hue_b02_loading_wounded_idle2_troop1 +ch_hue_b02_loading_wounded_idle2_troop2 +ch_hue_b02_loading_wounded_idle2_troop3 +ch_hue_b01_reznov_hallway_breach +ch_hue_b01_reznov_hallway_breach_idle +ch_hue_b02_mortar_spotters_a +ch_hue_b02_mortar_spotters_b +ch_hue_b02_mortar_spotters_c +ch_hue_b02_nva_shoot_at_heli_a +ch_hue_b02_nva_shoot_at_heli_b +ch_hue_b02_jumponboat_bowman +ch_hue_b02_jumponboat_reznov +ch_hue_b02_jumponboat_woods +ch_hue_b01_reznov_reveal_nva +ch_hue_b01_reznov_reveal_reznov +ch_hue_b01_reznov_reveal_deadguy +} +flashpoint +{ +ai_flashpoint_jump_down_330 +ch_flash_ev03_tire_change_brooks +ch_flash_ev03_tire_change_bowman +ch_flash_ev03_tire_change_spetz1 +ch_flash_ev03_tire_change_spetz2 +ch_flash_ev03_tire_change_woods +ch_flash_b01_barnes +ch_flash_b01_barnes4 +ch_flash_ev08_jump_across +ch_flash_ev01_intro_a_woods +ch_flash_ev01_aboutlaunch_idle_woods +ch_flash_ev01_aboutotlaunch_woods +ch_flash_ev01_woods_wait_idle +ch_flash_ev01_woodswalktogivebinocular +ch_flash_ev01_woodsgivesbinoculars_loop +ch_flash_ev01_woodsgivesbinoculars +ch_flash_ev01_poi_weaver_stab_krav +ch_flash_ev01_poi_weaver_stab_weaver +ch_flash_ev02_down_behind_pipe_idle_to_walk_woods +ch_flash_ev02_vault_over_pipe_woods +ch_flash_ev03_karambit_attack_soldier1 +ch_flash_ev03_karambit_attack_soldier2 +ch_flash_ev03_karambit_aim_idle_soldier2 +ch_flash_ev03_karambit_attack_woods +ch_flash_ev03_karambit_dead_idle_soldier1 +ch_flash_ev03_karambit_dead_idle_soldier2 +ch_flash_ev03_karambit_drag_body_woods +ch_flash_ev03_karambit_dragged_soldier1 +ch_flash_ev03_karambit_idle_soldier1 +ch_flash_ev03_karambit_idle_soldier2 +ch_flash_ev03_karambit_idle_woods +ch_flash_ev03_karambit_into_cover_idle_woods +ch_flash_ev03_karambit_into_cover_woods +ch_flash_ev03_karambit_patrolwalk_soldier1 +ch_flash_ev03_karambit_patrolwalk_soldier2 +ch_flash_ev03_karambit_wait_idle_woods +ai_hide_body_pickup +ai_hide_body_idle +ai_hide_body_walk +ai_hide_body_drop +ch_flash_ev03_inspect_sewers_woods +ch_flash_ev03_whats_that_noise_spetz1 +ch_flash_ev03_whats_that_noise_spetz2 +ch_flash_ev03_whats_that_noise_woods +ch_flash_ev04_walkingrail_loop_soldier1 +ch_flash_ev04_guardswalking_guard01 +ch_flash_ev04_guardswalking_guard01_idle +ch_flash_ev04_guardswalking_guard02 +ch_flash_ev04_guardswalking_guard02_idle +ch_flash_ev04_guardswalking_guard03 +ch_flash_ev04_guardswalking_guard03_idle +ch_flash_ev06_make_it_quick_handoff +ch_flash_ev06_make_it_quick_handoff_idle_woods +ch_flash_ev06_make_it_quick_idle_woods +ch_flash_ev06_make_it_quick_secure_line_woods +ch_flash_ev06_make_it_quick_woods +ch_flash_ev06_sniper_l_idle +ch_flash_ev06_sniper_l_in +ch_flash_ev06_sniper_l_out +ch_flash_ev06_sniper_r_idle +ch_flash_ev06_sniper_r_in +ch_flash_ev06_sniper_r_out +ch_flash_ev06_stunnedguard_guardbywindow_idle +ch_flash_ev06_stunnedguard_guardbywindow_looptoidle +ch_flash_ev06_stunnedguard_guardbywindow_pacingloop +ch_flash_ev06_stunnedguard_guardbywindow_reaction +ch_flash_ev06_stunnedguard_pistolguy +ch_flash_ev03_base_activity_spetz_crate +ch_flash_ev03_base_activity_spetz_truck1a +ch_flash_ev03_base_activity_spetz_truck1b +ch_flash_ev03_base_activity_spetz1a +ch_flash_ev03_base_activity_spetz1b +ch_flash_ev03_base_activity_spetz2a +ch_flash_ev03_base_activity_spetz2b +ch_flash_ev03_base_activity_spetz3a +ch_flash_ev03_base_activity_spetz3b +ch_flash_ev03_base_activity_spetz3c +ch_flash_ev03_base_activity_spetzalert1a +ch_flash_ev03_base_activity_spetzalert1b +ch_flash_ev03_base_activity_spetz_alertidle1 +ch_flash_ev03_base_activity_spetz_idle1 +ch_flash_ev03_base_activity_spetz_idle2 +ch_flash_ev03_base_activity_spetz_idle3 +ch_flash_ev04_play_it_cool_woods +ch_flash_ev04_play_it_cool_bowman +ch_flash_ev04_play_it_cool_spetz1 +ch_flash_ev04_play_it_cool_spetz2 +ch_flash_b04_reduced2one_friend1_idle +ch_flash_b04_reduced2one_friend2_idle +ch_flash_b04_reduced2one_friend1 +ch_flash_b04_reduced2one_friend2 +ch_flash_b04_reduced2one_guard1_action +ch_flash_b04_reduced2one_guard1_deadloop +ch_flash_b04_reduced2one_guard1_idle +ch_flash_b04_reduced2one_guard2_action +ch_flash_b04_reduced2one_guard2_deadloop +ch_flash_b04_reduced2one_guard2_idle +ch_flash_ev04_comm_link_woods_trans_in +ch_flash_ev04_comm_link_woods +ch_flash_ev04_reduced_to_one_woods_idle +ch_flash_ev16_limo_burning_guy_driver +ch_flash_ev16_limo_burning_guy_passenger +ch_flash_diorama01_mason +ch_flash_diorama01_vc +ch_flash_diorama01_weaver +ch_flash_diorama01_woods +ch_flash_diorama02_woods +ch_flash_diorama06_guard01 +ch_flash_diorama06_guard02 +ch_flash_diorama06_guard03 +ch_flash_diorama06_guard04 +ch_flash_diorama06_krav +ch_flash_diorama06_kravguard01 +ch_flash_diorama06_kravguard02 +ch_flash_diorama06_kravguard03 +ai_comms_floor1_orange_idle +ai_comms_floor1_blue_idle +ai_comms_floor1_blue_idle_2_inspect +ai_comms_floor1_blue_inspect_idle +ai_comms_floor1_blue_inspect_2_idle +ai_comms_floor1_green_idle +ai_comms_floor1_green_idle_2_alert +ai_comms_floor1_tapemachine_idle +ai_comms_floor1_tapemachine_idle_2_alert +ai_comms_floor4_orange_idle +ai_comms_floor4_orange_idle_2_alert +ch_flash_ev06_woodsladderattack_enemy +ch_flash_ev06_woodsladderattack_woods +ch_flash_ev06_woodsladderattack_woods_idle +ch_flash_ev06_stunnedguard_guardbyweaver +ch_flash_ev06_stunnedguard_guardbywindow +ch_flash_ev06_stunnedguard_weaver_idle +ch_flash_ev06_stilltime_bowman +ch_flash_ev06_stilltime_woods +ch_flash_ev06_stilltime_weaver +ch_flash_ev06_stilltime_brooks +ch_flash_ev06_weaverrescue_guard_act +ch_flash_ev06_weaverrescue_guard_idle +ch_flash_ev06_weaverrescue_weaver_act +ch_flash_ev06_weaverrescue_weaver_idle +ch_flash_ev06_squad_vault_wall_bowman +ch_flash_ev06_squad_vault_wall_brooks +ch_flash_ev06_squad_vault_wall_weaver +ch_flash_ev06_squad_vault_wall_woods +ch_flash_ev07_workers_upthestairs_wkr1 +ch_flash_ev07_workers_upthestairs_wkr2 +ch_flash_ev07_workers_upthestairs_wkr3 +ch_flash_ev07_workers_upthestairs_wkr4 +ch_flash_ev07_workers_upthestairs_wkr5 +ch_flash_b08_nomatterwhat_weaver_speech +ch_flash_b08_nomatterwhat_weaver_waitloop +ch_flash_b08_nomatterwhat_woods_speech +ch_flash_b08_nomatterwhat_woods_waitloop +ch_flash_b08_nomatterwhat_brooks_guardloop +ch_flash_b08_nomatterwhat_bowman_stairguard +ch_flash_b08_nomatterwhat_bowman_waitloop +ch_flash_b08_nomatterwhat_brooks_waitloop +ch_flash_b08_c4bunker_scientist1_cowerloop +ch_flash_b08_c4bunker_scientist1_explodereact +ch_flash_b08_c4bunker_scientist1_startloop +ch_flash_b08_c4bunker_scientist2_cowerloop +ch_flash_b08_c4bunker_scientist2_explodereact +ch_flash_b08_c4bunker_scientist2_startloop +ch_flash_b08_c4bunker_scientist3_cowerloop +ch_flash_b08_c4bunker_scientist3_explodereact +ch_flash_b08_c4bunker_scientist3_startloop +ch_flash_b08_c4bunker_scientist4_cowerloop +ch_flash_b08_c4bunker_scientist4_explodereact +ch_flash_b08_c4bunker_scientist4_startloop +ch_flash_b08_planb_woods +ch_flash_b08_planb_woods_launcher_wait_idle +ch_flash_b08_planb_bowman_guardloop +ch_flash_b08_planb_bowman_guard2give +ch_flash_b08_planb_bowman_giveidle +ch_flash_b08_planb_bowman_move2endguard +ch_flash_b08_planb_bowman_endguard_idle +ch_flash_ev08_weaverc4room_enter +ch_flash_ev08_weaverc4room_terminal +ch_flash_b08_holyshit_woods_talkexit +ch_flash_b08_holyshit_woods_waitloop +ch_flash_ev08_slidebeneath_woods +ch_flash_ev08_slidebeneath_bowman +ch_flash_ev08_slidebeneath_brooks +ch_flash_ev08_slidebeneath_weaver +ch_flash_ev08_workersonfire_guy01 +ch_flash_ev08_workersonfire_guy02 +ch_flash_ev08_workersonfire_guy03 +ch_flash_ev08_workersonfire_guy04 +ch_flash_ev08_steamreactions_weaver +ch_flash_ev08_steamreactions_woods +ch_flash_ev09_onehandedfire_spetznatz +ch_flash_casual_walk_woods +ch_flash_casual_walk_bowman +ch_flash_ev10_weavervomit_edit_weaver +ch_flash_ev10_gastrap_weaver_A +ch_flash_ev10_gastrap_weaver_B +ch_flash_ev10_gastrap_weaver_idle_A +ch_flash_ev10_gastrap_weaver_idle_B +ch_flash_ev10_gastrap_weaver_mantlewindow +ch_flash_ev10_gastrap_woods_A +ch_flash_ev10_gastrap_woods_B +ch_flash_ev10_gastrap_woods_idle_A +ch_flash_ev10_gastrap_woods_idle_B +ch_flash_ev10_gastrap_woods_mantlewindow +ch_flash_ev10_weavervomit_weaver +ch_flash_ev10_weavervomit_woods +ch_flash_ev13_boardingbtr_woods +ch_flash_ev13_boardingbtr_weaver +ch_flash_ev13_boardingbtr_bowman +ch_flash_ev13_boardingbtr_brooks +} +creek_1 +{ +ch_creek_b02_start_guy_1_start +ch_creek_b02_start_reznov_start +ch_creek_b02_start_vc_1_start +ch_creek_b02_start_vc_2_start +ch_creek_b02_start_swim_barnes +ch_creek_b02_start_move_to_look_barnes +ch_creek_b02_start_climb_onto_deck_barnes +ch_creek_b02_start_ifihadgun_barnes +ch_creek_b02_start_ifihadgun_reznov +ch_creek_b02_start_move_to_water_barnes +ch_creek_b02_start_pulled_under_water_vc_1 +ch_creek_b02_start_shot_and_die_vc_2 +ch_creek_b02_start_pull_vc_in_water_reznov +ch_creek_b02_start_shoot_vc_guy_1 +ch_creek_b02_village_hut_windowloop_barnes +ch_creek_b02_village_hut_windowaim_barnes +ch_creek_b02_village_hut_windowaimloop_barnes +ch_creek_b02_village_hut_window_barnes +ch_creek_b02_start_climb_out_water_hut_barnes +ch_creek_b02_start_open_window_shoot_climb_thru_barnes +ch_creek_b02_village_hut_encounter_barnes +ch_creek_b02_village_hut_encounter_guy_1 +ch_creek_b02_hey_charlie_woods_loop +ch_creek_b02_hey_charlie_bowman_loop +ch_creek_b02_hey_charlie_nva_1_loop +ch_creek_b02_hey_charlie_nva_2_loop +ch_creek_b02_hey_charlie_redshirt_loop +ch_creek_b02_hey_charlie_woods_approach +ch_creek_b02_hey_charlie_woods_approach_loop +ch_creek_b02_hey_charlie_woods +ch_creek_b02_hey_charlie_bowman +ch_creek_b02_hey_charlie_nva_1 +ch_creek_b02_hey_charlie_nva_2 +ch_creek_b02_hey_charlie_redshirt +ch_creek_b02_hey_charlie_reznov +ch_creek_b02_hey_charlie_nva_1_death_loop +ch_creek_b02_epilog_watching_you_barnes +ch_creek_b02_epilog_watching_you_guy_1 +ch_creek_b02_epilog_watching_you_reznov +ch_creek_b02_village_hut_encounter_reznoff +ch_creek_b02_stealth_vc1_kill +ch_creek_b02_stealth_vc1_kill_loop +ch_creek_b02_stealth_vc2_kill +ch_creek_b02_stealth_vc2_kill_loop +ai_deathbalcony_b +ai_deathbalcony_c +ch_creek_b02_distraction_idle_bowman +ch_creek_b02_distraction_idle_woods +ch_creek_b02_distraction_pt1_bowman +ch_creek_b02_distraction_pt1_woods +ch_creek_b02_distraction_pt2_bowman +ch_creek_b02_distraction_pt2_woods +ch_creek_b02_village_bridge_lower_idle +ch_creek_b02_village_bridge_lower_react +ch_creek_b02_village_bridge_upper_idle +ch_creek_b02_village_bridge_upper_react +ch_creek_b02_village_bridge_upper_death +ch_creek_b02_village_rooftop_rolloff_death +ch_creek_b02_village_window_dive +ch_creek_b02_village_attack_signal +ch_creek_b02_village_hut_corner_slide +ch_creek_b02_village_cook_idle +ch_creek_b02_village_cookexplo_react +ch_creek_b02_village_sitoncrate_idle +ch_creek_b02_village_sitoncrateexplo_react +ch_creek_b02_village_sitting_bridge_vc1 +ch_creek_b02_village_sitting_bridge_exploreact_vc1 +ch_creek_b02_village_sitting_bridge_vc2 +ch_creek_b02_village_sitting_bridge_exploreact_vc2 +ch_creek_b02_village_explointro_a_vc1 +ch_creek_b02_village_explointro_b_vc1 +ch_creek_b02_village_explointro_fail_vc1 +ch_creek_b02_village_explointro_a_vc2 +ch_creek_b02_village_explointro_b_vc2 +ch_creek_b02_village_explointro_fail_vc2 +ch_creek_b02_village_explointro_a_vc3 +ch_creek_b02_village_explointro_b_vc3 +ch_creek_b02_village_explointro_fail_vc3 +ch_creek_b02_village_hurdle2fight +ch_creek_b02_village_parkour2roof +ch_creek_b03_rpg_opens_flap +ch_creek_b03_opens_flap +ch_creek_b02_village_lewis_distraction +ch_creek_b02_vc_window_jump +ch_creek_b03_slope_slide_1 +ch_creek_b03_tree_slide_1 +ch_creek_b02_roof_traverse_A +crew_model3_driver_death +ch_creek_b03_sampan_offload_driver_death +ch_creek_b03_sampan_offload_driver_idle +ch_creek_b03_sampan_offload_guy_1 +ch_creek_b03_sampan_offload_guy_2 +ch_creek_b03_sampan_offload_guy_3 +ai_barnes_run_f_v2 +ai_barnes_walk_f +ai_barnes_walk_f_aim_up +ch_creek_b01_barnes_swim_ashore +ch_creek_b02_barnes_walk_jungle_path +ch_creek_b02_barnes_start2gap +ch_creek_b02_barnes_treadwatergap +ch_creek_b02_barnes_gap2sampan +ch_creek_b02_barnes_tread_sampan2 +ch_creek_b02_barnes_treadwatersampan +ch_creek_b02_sampan_barnes_swimtodock +ch_creek_b02_sampan_barnes_swimtodock_idle +ai_sampan_melee_search_close +ai_sampan_melee_search_medium +ai_sampan_melee_search_distant +ai_sampan_melee +ai_sampan_melee_crouch_2_stand +ai_sampan_melee_crouch_idle +ai_sampan_melee_flinch_2_stand +ai_sampan_melee_stand_2_flinch +ai_sampan_melee_stand_idle +ai_sampan_melee_barnesvictim_crouch_idle +ai_sampan_melee_barnesvictim_crouch_2_stand +ai_sampan_melee_barnesvictim_stand_idle +ai_sampan_melee_barnesvictim_stand_2_flinch +ai_sampan_melee_barnesvictim +ai_sampan_melee_barnes +ch_creek_b02_start_idle_vc_1 +ch_creek_b02_start_idle_vc_2 +ch_creek_b02_start_idle_shooter +ai_vc_eating_melee_curtain_open +ai_vc_eating_melee_attack_opportunity +ai_vc_eating_melee +ai_vc_eating_melee_fail_grabs_gun +ch_creek_b02_hammock_sleep_guy01 +ch_creek_b02_hammock_sleep_guy02 +ai_creek_hammock_melee_woods_guy01 +ai_creek_hammock_melee_woodsvictim_guy01 +ai_creek_hammock_melee_woods_guy02 +ai_creek_hammock_melee_woodsvictim_guy02 +ai_creek_hammock_melee_guy01 +ai_creek_hammock_melee_guy02 +ai_creek_hammock_melee_guy01_dead_idle +ai_creek_hammock_melee_guy02_dead_idle +ch_creek_b02_lewis_signaling +ch_creek_b02_woods_splittingup +ch_creek_b02_windowlook_woods +ch_creek_b02_windowlook_vc +ch_creek_b02_windowlook_vc2 +ch_creek_b02_barnes_swim_climb_dock +ch_creek_b02_barnes_swim_dock +ch_creek_b02_barnes_swim_climb_loop +ch_creek_b02_barnes_window_loop_left +ch_creek_b02_barnes_window_loop_right +ch_creek_b02_barnes_window_shimy +ch_creek_b02_barnes_window_sneek_in +ch_creek_b02_sleeping_guy_1 +ch_creek_b02_sleeping_guy_1_death +ch_creek_b02_sleeping_guy_2 +ch_creek_b02_sleeping_guy_2_death +ch_creek_b02_dock_gaurds_talking_guy_1_loop +ch_creek_b02_dock_gaurds_talking_guy_2_loop +ai_viet_splash_death +ch_creek_b02_regroup_before_village_barnes +ch_creek_b02_vc1_ridge +ch_creek_b02_vc2_ridge +ch_creek_b02_m202_guy_run_cycle +ch_creek_b02_m202_guy +ch_creek_b02_m202_wingman +ch_creek_b04_vc_tunnel_strafe +ch_creek_b04_rat_tunnel_intro_A_barnes +ch_creek_b04_rat_tunnel_intro_A_lewis +ch_creek_b04_rat_tunnel_intro_wait_barnes +ch_creek_b04_rat_tunnel_intro_wait_lewis +ch_creek_b04_rat_tunnel_intro_B_barnes +ch_creek_b04_rat_tunnel_intro_B_lewis +ch_creek_b04_rat_tunnel_intro_C_barnes +ch_creek_b04_rat_tunnel_intro_C_lewis +ch_creek_b04_rat_tunnel_intro_bowman +ch_creek_b04_rat_tunnel_intro_swift +ch_creek_b04_rat_tunnel_intro_woods +ai_reznov_crouchrun +ai_reznov_crouchsprint +ai_reznov_crouchwalk_b +ai_reznov_crouchwalk_f +ai_reznov_crouchwalk_slow_f +ai_reznov_crouchwalk_slow_knee_f +ai_reznov_crouchwalk_idle +ai_reznov_crouchwalk_idle_in +ai_reznov_crouchwalk_idle_out +ch_creek_b04_traphole_idle_vc +ch_creek_b04_traphole_stab_vc +ch_creek_b04_traphole_idle_death +ch_creek_b04_ambush_1 +ch_creek_b04_ambush_2 +ch_creek_b04_ambush_1_idle +ch_creek_b04_ambush_2_idle +ch_creek_b04_tunnel_swift_death +ch_creek_b04_tunnel_VC_attack +ch_creek_b04_tunnel_VC_death1 +ch_creek_b04_tunnel_VC_death2 +ch_creek_b04_tunnel_swift_death_loop +ch_creek_b02_reznov_move_shelf_enter_tunnel +ch_creek_b02_reznov_move_shelf_wait_loop +ch_creek_b02_reznov_pushvc_walktoshelf +ch_creek_b02_vc_deathandrop +ch_creek_b02_vc_firingloop +ch_creek_b04_tunnel_reznovdrown_rez +ch_creek_b04_tunnel_reznovdrown_vc +ch_creek_b04_tunnel_reznovdrown_rez_loop +ch_creek_b04_tunnel_reznovdrown_vc_loop +ch_creek_b04_tunnel_reznovblinded_idle +ch_creek_b04_tunnel_reznovblinded +ai_suicide_bomber_run +ai_huey_creek_passenger_b_lt_switch_exit +ai_huey_creek_passenger_b_rt_exit +ai_huey_creek_passenger_f_lt_switch_exit +ai_huey_creek_passenger_f_rt_exit +ch_creek_b04_end_rescue_barnes +ch_creek_b04_end_rescue_bowman +ch_creek_b04_tunnel_popout_vc_shoot_1 +ch_creek_b04_tunnel_popout_vc_shoot_2 +ch_creek_b04_tunnel_topofincline_vc_shoot_1 +ch_creek_b04_tunnel_topofincline_vc_shoot_2 +ch_creek_b04_tunnel_kravlair_reznov_enter +ch_creek_b04_tunnel_kravlair_reznov_exit +ch_creek_b04_tunnel_kravlair_reznov_searchloop +} +meatshield +{ +ch_creek_b01_huey_crash_VC1 +ch_creek_b01_huey_crash_VC1_shoot_loop +ch_creek_b01_huey_crash_VC1_death +ch_creek_b01_huey_crash_VC1_death_loop +ch_creek_b01_huey_crash_VC2 +ch_creek_b01_huey_crash_VC2_shoot_loop +ch_creek_b01_huey_crash_VC2_death +ch_creek_b01_huey_crash_VC2_death_loop +ch_creek_b01_huey_crash_barnes +ch_creek_b01_huey_crash_barnes_fall +ch_creek_b01_huey_crash_barnes_exit +ch_creek_b01_huey_woods_loop_at_door +ch_creek_b01_huey_woods_swim_away +ch_creek_b01_huey_crash_copilot +ch_creek_b01_huey_crash_copilot_loop +ch_creek_b01_huey_pilot_start_loop +ch_creek_b01_huey_crash_pilot +ch_creek_b01_huey_crash_pilot_loop +ch_creek_b01_huey_crash_reznov +ch_creek_b01_huey_crash_reznov_approach +ch_creek_b01_huey_crash_reznov_door_loop +ch_creek_b01_huey_crash_reznov_door_open +ch_creek_b01_huey_crash_reznov_door_exit +ch_creek_b01_huey_crash_reznov_sampan_wait +ch_creek_b01_huey_crash_reznov_killsign +ch_creek_b01_ms_vc1 +ch_creek_b01_ms_vc2_alerted +ch_creek_b01_ms_vc2_search_loop +ch_creek_b01_ms_vc2_shoot_loop +ch_creek_b01_ms_VC2_death +ch_creek_b01_ms_vc3_alerted +ch_creek_b01_ms_vc3_search_loop +ch_creek_b01_ms_vc3_shoot_loop +ch_creek_b01_ms_VC3_death +ch_creek_b01_ms_vc4_alerted +ch_creek_b01_ms_vc4_search_loop +ch_creek_b01_ms_vc4_shoot_loop +ch_creek_b01_ms_VC4_death +ch_creek_b01_ms_vc5_alerted +ch_creek_b01_ms_vc5_search_loop +ch_creek_b01_ms_vc5_shoot_loop +ch_creek_b01_ms_VC5_death +ch_creek_b01_ms_vc6_alerted +ch_creek_b01_ms_vc6_search_loop +ch_creek_b01_ms_vc6_shoot_loop +ch_creek_b01_ms_VC6_death +ch_creek_b01_ms_vc7_alerted +ch_creek_b01_ms_vc7_search_loop +ch_creek_b01_ms_vc7_shoot_loop +ch_creek_b01_ms_VC7_death +ch_creek_b01_ms_vc10_search_loop +ch_creek_b01_ms_vc10_shoot_loop +ch_creek_b01_ms_VC10_death +ch_creek_b01_ms_woods_sampan_melee +int_meatshield_grab +ai_meatshield_grab +int_meatshield_shot +ai_meatshield_shot +int_meatshield_drop +ai_meatshield_drop +int_meatshield_player_aim_idle_leftarm +ai_meatshield_victim_aim_idle +int_meatshield_player_aim_idle_leftarm_steady +ai_meatshield_victim_aim_idle_steady +int_meatshield_hostage_trans_2_dead +ai_meatshield_hostage_trans_2_dead +int_meatshield_hostage_dead_idle +ai_meatshield_hostage_dead_idle +int_meatshield_hostage_dead_idle_steady +ai_meatshield_hostage_dead_idle_steady +int_meatshield_hostage_dead_drop +ai_meatshield_hostage_dead_drop +} +river +{ +ch_river_b03_enemy_kick_gun +ch_river_b03_bowman +ch_river_b03_enemy_pick_up_bowman_guy1 +ch_river_b03_enemy_pick_up_bowman_guy2 +ch_river_b03_playerstruggle_kravchenko +ch_river_b03_playerstruggle_dragovich +ch_river_b03_playerstruggle_woods +ch_river_b03_c130_crate_bowman +ch_river_b03_c130_crate_bowman_loop +ch_river_b03_c130_crate_dead_guy +ch_river_b03_c130_crate_dead_guy_loop +ch_river_b03_c130_crate_woods +ch_river_b03_c130_crate_woods_loop +ch_river_b02_young_soldier_dead_woods +ch_river_b02_young_soldier_dead_bowman +ch_river_b02_young_soldier_dead_youngsoldier +ch_river_b02_young_soldier_dead_youngsoldier_death +ch_river_b02_young_soldier_dead_youngsoldier_death_idle +ch_river_b02_hookupropes_bowman_A +ch_river_b02_hookupropes_woods_A +ch_river_b02_hookupropes_bowman_B +ch_river_b02_hookupropes_woods_B +ch_upacreek_b03_dragged_pbr_guy_1 +ch_upacreek_b03_dragged_pbr_guy_2 +ch_upacreek_b03_dragged_pbr_guy_3 +ch_upacreek_b03_dragged_pbr_guy_4 +ch_upacreek_b03_dragged_pbr_ply_stdin +ch_river_b02_woods_binocs_down +ch_river_b02_woods_binocs_halfway_2_upidle +ch_river_b02_woods_binocs_halfway_idle +ch_river_b02_woods_binocs_up +ch_river_b02_woods_binocs_up_idle +ch_river_b02_woods_binocs_upidle_2_halfway +ch_river_b01_intro_activity_usher_01 +ch_river_b01_intro_activity_usher_02 +ch_river_intro_activity_guard_1 +ch_river_intro_activity_guard_2 +ch_river_b01_intro_activity_photographer +ch_river_b01_intro_activity_photographer_idle_a +ch_river_b01_intro_activity_photographer_idle_b +ch_river_b03_squaddeboard_bowman +ch_river_b03_squaddeboard_resnov +ch_river_b03_squaddeboard_woods +ch_river_b02_bowman_exit_turret +ch_river_b03_all_yours_soldier +ch_river_b03_all_yours_soldier_idle +ch_river_b03_all_yours_woods +ch_river_b03_all_yours_woods_idle +ch_river_intro_activity_bowman_reassures +ch_river_b02_stay_with_us_woods +ch_river_b02_gone_for_now_woods +ch_river_b01_soright_bowman +ch_river_b01_soright_bowman_loops +ch_river_b01_soright_kid +ch_river_b01_soright_kid_loop +ch_river_b01_soright_woods +ch_river_b01_soright_woods_loops +ch_river_b01_soright_woods_stall +ch_river_b01_soright_bowman_stall +ch_river_b01_soright_resnov_loops +ch_river_b01_soright_resnov +ch_river_b01_soright_resnov_stall +ch_river_b03_vc_appear_A_1 +ch_river_b03_vc_appear_A_2 +ch_river_b03_vc_appear_B_1 +ch_river_b03_vc_appear_B_2 +ch_river_b03_vc_appear_D_1 +ch_river_b03_vc_appear_D_2 +ch_river_b03_vc_appear_F_1 +ch_river_b03_vc_appear_F_2 +ch_river_b03_vc_appear_firstwave_1 +ch_river_b03_vc_appear_firstwave_2 +ch_river_b03_vc_appear_firstwave_3 +ch_river_b02_finallymason_reznov +ch_river_b02_kravchenkonear_reznov +} +cuba +{ +ch_cub_barscene_bowman +ch_cub_barscene_carlos +ch_cub_barscene_woman +ch_cub_barscene_woods +ch_cub_barscene_thug1 +ch_cub_barscene_thug2 +ch_cub_barscene_thug3 +ch_cub_barscene_thug3_shoot +ch_cub_barscene_leader +ch_cub_b01_bar_exit_leader +ch_cub_barscene_patron_chest +ch_cub_barscene_patron_1 +ch_cub_barscene_patron_2 +ch_cub_barscene_patron_pee +ch_cub_b01_bar_exit_bowman +ch_cub_b01_bar_exit_carlos +ch_cub_b01_bar_exit_woods +ch_cub_b01_bar_exit_coveridle_woods +ch_cub_b01_bar_exit_vaultsover_woods +ch_cub_b01_bar_exit_policecar_police1 +ch_cub_b01_bar_exit_policecar_police2 +ch_cub_b01_bar_exit_civ1 +ch_cub_b01_bar_exit_civ2 +ch_cub_b01_bar_exit_civ3 +ch_cub_b01_bar_exit_civ4 +ch_cub_b01_bar_exit_civ5 +ch_cub_b01_bar_exit_civ6 +ch_cub_b01_bar_exit_civ7 +ch_cub_b01_bar_exit_civ8 +ch_cub_b01_bar_exit_civ9 +ch_cub_b01_bar_exit_civ10 +ch_cub_b01_bar_exit_police1 +ch_cub_b01_bar_exit_police2 +ch_police_exit_car_01 +ch_police_exit_car_02 +ch_police_intro_pistol_driver +ch_police_intro_pistol_pass +ch_police_out_of_car_B_driver +ch_police_out_of_car_B_pass +ch_police_out_of_car_C_driver +ch_police_out_of_car_C_pass +ch_police_out_of_car_D_driver +ch_police_out_of_car_D_pass +ch_cub_out_of_way_woods +ch_cub_out_of_way_bowman +ai_cuba_woods_signal_01 +ai_cuba_woods_police01_kill +ai_cuba_police01_struggle +ai_cuba_police01_death +ai_cuba_police02_death +ai_cuba_police03_death +ai_cuba_police01_passenger_death +ai_cuba_woods_leapfrog_01 +ai_cuba_bowman_leapfrog_02 +ch_cub_b01_wave_carlos_intro +ch_cub_b01_wave_carlos +ch_cuba_b05_rifle_guy1_reaction +ch_cuba_b05_rifle_guy2_reaction +ch_cub_b01_carsequence_drivebwd_bowman +ch_cub_b01_carsequence_drivebwd_player +ch_cub_b01_carsequence_drivebwd_woods +ch_cub_b01_carsequence_drivefwd_1hand_bowman +ch_cub_b01_carsequence_drivefwd_1hand_player +ch_cub_b01_carsequence_drivefwd_1hand_woods +ch_cub_b01_carsequence_drivefwd_idle_1hand_bowman +ch_cub_b01_carsequence_drivefwd_idle_1hand_player +ch_cub_b01_carsequence_drivefwd_idle_1hand_woods +ch_cub_b01_carsequence_drivefwd_2hands_bowman +ch_cub_b01_carsequence_drivefwd_2hands_player +ch_cub_b01_carsequence_drivefwd_2hands_woods +ch_cub_b01_carsequence_into_bowman +ch_cub_b01_carsequence_into_carlos +ch_cub_b01_carsequence_into_player +ch_cub_b01_carsequence_into_woods +ch_cub_b01_carsequence_lookbwd_idle_bowman +ch_cub_b01_carsequence_lookbwd_idle2_bowman +ch_cub_b01_carsequence_lookbwd_idle_player +ch_cub_b01_carsequence_lookbwd_idle_woods +ch_cub_b01_carsequence_lookfwd_1hand_idle_bowman +ch_cub_b01_carsequence_lookfwd_1hand_idle_player +ch_cub_b01_carsequence_lookfwd_1hand_idle_woods +ch_cub_b01_carsequence_slowmo_bowman +ch_cub_b01_carsequence_slowmo_player +ch_cub_b01_carsequence_slowmo_woods +ch_cub_b01_carsequence_turnleft_1hand_bowman +ch_cub_b01_carsequence_turnleft_1hand_woods +ch_cub_b01_carsequence_turnleft_2hands_bowman +ch_cub_b01_carsequence_turnleft_2hands_woods +ch_cub_b01_carsequence_turnright_1hand_bowman +ch_cub_b01_carsequence_turnright_1hand_woods +ch_cub_b01_carsequence_turnright_2hands_bowman +ch_cub_b01_carsequence_turnright_2hands_woods +cuba_car_turning +{ +ch_cub_b01_carsequence_turnright_1hand_player_brian +ch_cub_b01_carsequence_turnleft_1hand_player_brian +ch_cub_b01_carsequence_turnright_2hands_player_brian +ch_cub_b01_carsequence_turnleft_2hands_player_brian +} +ch_zip_entry_bowman +ch_zip_entry_idle_bowman +ch_zip_entry2_line_bowman +ch_zip_idle_bowman +ch_zip_exit_bowman +ch_zip_entry_woods +ch_zip_entry_idle_woods +ch_zip_entry2_line_woods +ch_zip_idle_woods +ch_zip_exit_woods +ch_zip_idle_guard_left +ch_zip_idle_guard_right +ch_zip_death_guard_left +ch_zip_death_guard_right +ch_b02_guard_in_building_loop +ch_b02_guard_in_building_exit +ch_cuba_b02_troops_signal_1 +ch_cuba_b02_troops_signal_2 +ch_cuba_b02_troops_signal_3 +ch_cuba_b02_troops_signal_4 +ai_death_stair_a +ai_death_stair_b +ch_cuba_b02_cuba_door_breach_1_woods_reshoot +ch_cuba_b02_cuba_door_breach_1_bowman_reshoot +ch_cuba_b02_cuba_door_breach_1_bowman_reshoot_crouch +ch_cuba_b02_cuba_door_breach_1_bowman_reshoot_idle +ch_cuba_b02_cuba_door_breach_2_woods +ch_cuba_b02_cuba_door_breach_2_bowman +ch_cuba_b02_climb_out_window_bowman_002 +ch_cuba_b02_climb_out_window_woods +ch_cuba_b02_climb_out_window_cabinet_death_guard +ch_cuba_b02_climb_out_window_win_death_guard +ch_cuba_b02_door_breach_woods +ch_cuba_b02_door_breach_woods_loop +ch_cuba_b02_assig_pre_guard1_idle +ch_cuba_b02_assig_pre_guard1_attack +ch_cuba_b02_assig_pre_guard2_idle +ch_cuba_b02_assig_pre_guard2_attack +ch_cuba_b02_assig_pre_guard3_idle +ch_cuba_b02_assig_pre_guard3_attack +ch_cuba_b02_castro_assassination_part1_woods +ch_cuba_b02_castro_assassination_part2a_woods +ch_cuba_b02_castro_assassination_part2b_woods +ch_cuba_b02_castro_stack_up_woods_loop +ch_cuba_b02_castro_stack_up_woods_intro_to_loop +ch_cuba_b02_castro_assassination_part1_castro +ch_cuba_b02_castro_assassination_part2a_castro +ch_cuba_b02_castro_assassination_part2b_castro +ch_cuba_b02_castro_assassination_castro_death_loop +ch_cuba_b02_castro_assassination_part1_woman +ch_cuba_b02_castro_assassination_part2a_woman +ch_cuba_b02_castro_assassination_part2b_woman +ch_cuba_b02_castro_assassination_guard_left_death +ch_cuba_b02_castro_assassination_guard_right_death +ch_makinraid_showdown_guy1 +ch_makinraid_showdown_guy2 +ch_b03_guard_riddled_bowman +ch_b03_guard_riddled_guard +ch_b04_get_on_plane_bowman +ch_b04_get_on_plane_woods +ch_b04_get_on_plane_carlos_exit +ch_b04_get_on_plane_carlos_loop +ch_b04_getting_caught_enemy +ch_b04_getting_caught_enemy2 +ch_b04_youre_dead_castro +ch_b04_youre_dead_dragovich +ch_b04_youre_dead_kravchenko +ch_b03_radio_carlos_woods +ch_cuba_b02_make_cover_L +ch_cuba_b02_make_cover_R +ch_cuba_b02_shot_hit_table +ai_forward_rappel_leftguy_rappel +ai_forward_rappel_rightguy_rappel +ai_forward_rappel_leftguy_idle +ai_forward_rappel_rightguy_idle +ai_forward_rappel_leftguy_trans_2_idle +ai_forward_rappel_rightguy_trans_2_idle +} +incountry +{ +ch_incountry_unloading_guy_1 +ch_incountry_unloading_guy_2 +ch_incountry_truck_crate_guy_1 +ch_incountry_truck_crate_guy_2 +ch_incountry_truck_crate_guy_3 +ch_incountry_b02_shoveling_alert_guy_1 +ch_incountry_b02_shoveling_guy_1 +ch_incountry_dogattack_guy_start +ch_incountry_dogattack_guy_loop +ch_incountry_dogattack_guy_recover +ch_incountry_dogattack_guy_death +ch_incountry_spiketrap__guy_1_loop +ch_incountry_spiketrap__guy_1_death +ch_incountry_spiketrap__guy_2_loop +ch_incountry_spiketrap__guy_2_reaction +ch_incountry_b08_face_bash +ch_incountry_b01_slide_first_guy +ch_incountry_b01_slide_lift_branch +ch_incountry_b01_slide_lift_branch_loop +ch_incountry_b02_mele_tutlorial_guy_1 +ch_incountry_b02_mele_tutlorial_guy_1_loop +ch_incountry_b02_mele_tutlorial_nva +ch_incountry_b01_cliff_climb_woods_1 +ch_incountry_b01_cliff_climb_woods_2 +ch_incountry_b01_cliff_climb_woods_idle +ch_incountry_b01_cliff_climb_squad_2 +ch_incountry_b01_critical_in_helping_guy01_in +ch_incountry_b01_critical_in_helping_guy01_loop +ch_incountry_b01_critical_in_helping_guy01_out +ch_incountry_b01_critical_in_helping_guy02_in +ch_incountry_b01_critical_in_helping_guy02_loop +ch_incountry_b01_critical_in_helping_guy02_out +ch_incountry_b01_rock_attack_guy_1 +ch_incountry_b01_rock_attack_guy_2 +ch_incountry_b02_bike_equip +ch_incountry_b02_boxcheck_stand_guy_1 +ch_incountry_b02_boxcheck_stand_guy_2 +ch_incountry_b02_boxcheck_stand_alert_guy_1 +ch_incountry_b02_talking_guy_1 +ch_incountry_b02_talking_guy_2 +ch_incountry_b02_ruins_branch_off_guy_1 +ch_incountry_b02_ruins_branch_off_guy_2 +ch_incountry_b02_ruins_branch_off_guy_3 +ch_incountry_b03_mantle_up_96 +ch_incountry_b02_stealth_scare +ch_incountry_b05_heli_escape +ch_incountry_b05_line_up_guy_1 +ch_incountry_b05_line_up_guy_2 +ch_incountry_b05_line_up_guy_3 +ch_incountry_b05_line_up_guy_4 +ch_incountry_b05_line_up_nva_1 +ch_incountry_b05_line_up_nva_1_loop +ch_incountry_b04_throw_bodies_carrier1 +ch_incountry_b04_throw_bodies_carrier2 +ch_incountry_b04_throw_bodies_deadbody +ch_incountry_b04_setting_on_fire +ch_incountry_b02_veng_reveal_woods +ch_incountry_b02_veng_reveal_bowman +ch_incountry_b02_veng_reveal_reznov +ch_incountry_b02_veng_reveal_veng +ch_incountry_b02_veng_reveal_woods_loop +ch_incountry_b02_veng_reveal_bowman_loop +ch_incountry_b02_veng_reveal_reznov_loop +ch_incountry_b02_veng_reveal_veng_loop +ch_incountry_b02_the_brutality_bowmanloop +ch_incountry_b02_the_brutality_bowmanexit +ch_incountry_b02_the_brutality_woodsloop +ch_incountry_b02_the_brutality_woodsexit +ch_incountry_b03_veng_ask_villager_veng +ch_incountry_b03_veng_ask_villager_villagerloop +ch_incountry_b03_veng_ask_villager_villagertalk +} +kowloon +{ +ch_kowloon_136_dropdown_a +ch_kowloon_136_dropdown_run2run_leap +ch_kowloon_136_dropdown_run2run_roll +ch_kowloon_136_dropdown_run2stand_roll +ch_kowloon_136_dropdown_stand2stand +ch_kowloon_dropdown_awnings_01 +ch_kowloon_dropdown_awnings_02 +ch_kowloon_b01_intro_clark_escape +ch_kowloon_b01_intro_clark_table_idle +ch_kowloon_b01_intro_clark_glass +ch_kowloon_b01_intro_clark_glass_idle +ch_kowloon_b01_intro_clark_in +ch_kowloon_b01_intro_clark_out +ch_kowloon_b01_intro_clark_punch +ch_kowloon_b01_intro_clark_punch_idle +ch_kowloon_b01_intro_guy_glass +ch_kowloon_b01_intro_guy_glass_idle +ch_kowloon_b01_intro_guy_in +ch_kowloon_b01_intro_guy_out +ch_kowloon_b01_intro_guy_punch +ch_kowloon_b01_intro_guy_punch_idle +ch_kowloon_b01_first_jump_clark +ch_kowloon_b01_first_jump_weaver +ch_kowloon_b01_first_jump_guy_1 +ch_kowloon_b07_clarkdeath_clark +ch_kowloon_b07_clarkdeath_clark_jump +ch_kowloon_b07_clarkdeath_weaver +ch_kowloon_b07_clarkdeath_clark_loop +ch_kowloon_b04_pipe_slide_clark +ch_kowloon_b04_pipe_slide_weaver +ch_kowloon_b06_clark_move2lock +ch_kowloon_b06_clark_open2stand +ch_kowloon_b06_clark_unlockloop +ch_kowloon_b02_spetz_rappel_breach_1 +ch_kowloon_b02_spetz_rappel_breach_2 +ch_kowloon_b04_destroy_home_clark +ch_kowloon_b04_destroy_home_clark_loop +ch_kowloon_b04_destroy_home_spetz1 +ch_kowloon_b04_destroy_home_spetz2 +ch_kowloon_b01_fridge_clark_loop +ch_kowloon_b01_fridge_weaver_loop +ch_kowloon_b01_fridge_push_weaver +ch_kowloon_b01_fridge_push_clark +ch_kowloon_b01_fridge_push_wait_clark +ch_kowloon_b01_fridge_push_wait_weaver +ch_kowloon_b01_fridge_push_out_clark +ch_kowloon_b01_fridge_push_out_weaver +ch_kowloon_b04_window_push_civ +ch_kowloon_b04_window_push_spetz1 +ch_kowloon_b07_vancrash_hero_01 +ch_kowloon_b07_vancrash_hero_01_loop +ch_kowloon_b07_vancrash_hero_01_out +ch_kowloon_b07_vancrash_hero_02 +ch_kowloon_b07_vancrash_hero_02_loop +ch_kowloon_b07_vancrash_hero_02_out +ch_kowloon_b07_vancrash_passenger +ch_kowloon \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/mg42.atr b/BO1/PC/ZM/animtrees/mg42.atr new file mode 100644 index 0000000..274ce7e --- /dev/null +++ b/BO1/PC/ZM/animtrees/mg42.atr @@ -0,0 +1,12 @@ +additive_saw_idle +{ +saw_gunner_idle_mg +saw_gunner_lowwall_idle_mg +saw_gunner_prone_idle_mg +} +additive_saw_fire +{ +saw_gunner_firing_mg_add +saw_gunner_lowwall_firing_mg +saw_gunner_prone_firing_mg +} \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/mp_vehicles.atr b/BO1/PC/ZM/animtrees/mp_vehicles.atr new file mode 100644 index 0000000..ef4ff47 --- /dev/null +++ b/BO1/PC/ZM/animtrees/mp_vehicles.atr @@ -0,0 +1,7 @@ + +v_huey_door_open +v_huey_door_open_state +v_huey_door_close_state +int_huey_gunner_on +veh_car_destroy + diff --git a/BO1/PC/ZM/animtrees/multiplayer.atr b/BO1/PC/ZM/animtrees/multiplayer.atr new file mode 100644 index 0000000..5809de5 --- /dev/null +++ b/BO1/PC/ZM/animtrees/multiplayer.atr @@ -0,0 +1,1043 @@ + +head : client separate +{ +pf_casual_idle +pf_alert_idle +pf_firing +pf_melee +pf_pain +pf_death +} +main +{ +torso +{ +pt_chicken_dance +pt_chicken_dance_crouch +pt_stand_shoot +pt_stand_shoot_auto +pt_stand_shoot_pistol +pt_dw_botharms_fire +pt_stand_shoot_ads +pt_stand_shoot_auto_ads +pt_stand_shoot_ads_pistol +pt_stand_grenade_pullpin +pt_stand_shoot_shotgun +pt_rifle_fire_ads +pt_rifle_fire +pt_stand_shoot_RPG +pt_minigun_stand_fire +pt_hold_throw +p_revive_reviving +pt_grenade_stand_throw +pt_b_knife_stand_fire +pt_tomahawk_stand_throw +pt_crouch_shoot +pt_crouch_shoot_auto +pt_crouch_shoot_pistol +pt_crouch_dw_botharms_fire +pt_minigun_crouch_fire +pt_crouch_shoot_ads +pt_crouch_shoot_auto_ads +pt_crouch_shoot_ads_pistol +pt_crouch_grenade_throw +p_crouch_revive_reviving +pt_b_knife_crouch_fire +pt_tomahawk_crouch_throw +pt_prone_shoot +pt_prone_shoot_pistol +pt_prone_shoot_auto +pt_prone_dw_botharms_fire +pt_prone_ads_shoot +pt_prone_ads_shoot_pistol +pt_prone_ads_shoot_auto +pt_prone_grenade_throw +pt_prone_grenade_pullpin +pt_rifle_fire_prone +pt_prone_shoot_RPG +pt_hold_prone_throw +p_prone_revive_reviving +pt_b_knife_prone_fire +pt_tomahawk_prone_throw +pt_laststand_fire +pt_minigun_stand_reload +pt_m202_stand_reload +pt_rifle_stand_reload_rearclip +pt_lmg_stand_reload +pt_g11_stand_reload +pt_shot_stand_reload +pt_reload_stand_RPG +pt_reload_stand_pistol +pt_dw_botharms_reload +pt_reload_stand_rifle +pt_reload_stand_auto +pt_reload_stand_auto_mp40 +pt_crossbow_stand_reload +pt_b_knife_stand_reload +pt_minigun_crouch_reload +pt_m202_crouch_reload +pt_rifle_crouch_reload_rearclip +pt_lmg_crouch_reload +pt_g11_crouch_reload +pt_shot_crouch_reload +pt_reload_crouch_pistol +pt_crouch_dw_botharms_reload +pt_reload_crouch_rifle +pt_reload_crouchwalk +pt_reload_crouchwalk_pistol +pt_crossbow_crouch_reload +pt_b_knife_crouch_reload +pt_m202_prone_reload +pt_rifle_prone_reload_rearclip +pt_lmg_prone_reload +pt_g11_prone_reload +pt_shot_prone_reload +pt_reload_prone_pistol +pt_prone_dw_botharms_reload +pt_reload_prone_auto +pt_reload_prone_RPG +pt_crossbow_prone_reload +pt_b_knife_prone_reload +pt_laststand_reload +pt_melee_right2right_1 +pt_melee_right2right_2 +pt_melee_right2left +pt_melee_left2left_1 +pt_melee_left2right +pt_melee_pistol_1 +pt_melee_pistol_2 +pt_melee_pistol_3 +pt_melee_pistol_4 +pt_melee_hold_1 +pt_melee_hold_2 +pt_dw_stand_melee_swipe +pt_dw_stand_melee_stick +p_knife_stand_bazooka +p_knife_stand_bazooka_swipe +p_knife_stand_pistol +p_knife_stand_pistol_swipe +p_knife_stand_rifle +p_knife_stand_rifle_swipe +pt_b_knife_stand_melee +pt_melee_crouch_left2left +pt_melee_crouch_left2right +pt_melee_crouch_right2left +p_knife_crouch_bazooka +p_knife_crouch_bazooka_swipe +p_knife_crouch_pistol +p_knife_crouch_pistol_swipe +p_knife_crouch_rifle +p_knife_crouch_rifle_swipe +pt_b_knife_crouch_melee +pt_melee_prone +pt_melee_prone_pistol +pt_hold_melee_prone +pt_dw_prone_melee +p_knife_prone_bazooka +p_knife_prone_bazooka_swipe +p_knife_prone_pistol +p_knife_prone_pistol_swipe +p_knife_prone_rifle +p_knife_prone_rifle_swipe +p_revive_down_melee_swipe +pt_b_knife_prone_melee +pb_stand_shellshock +pb_stand_shellshock_hold +pb_dw_stand_shellshock +pb_crouch_shellshock +pb_crouch_shellshock_hold +pb_dw_crouch_shellshock +pb_rifle_prone_shellshock +pb_hold_prone_shellshock +pb_dw_prone_shellshock +pb_dw_stand_flare_loop +pb_dw_crouch_flare_loop +pb_dw_prone_flare_loop +pb_hold_stand_flare_loop +pb_hold_crouch_flare_loop +pb_hold_prone_flare_loop +pb_rifle_stand_flare_loop +pb_rifle_crouch_flare_loop +pb_rifle_prone_flare_loop +pt_stand_flinch_forward +pt_stand_flinch_back +pt_stand_flinch_left +pt_stand_flinch_right +pt_stand_flinch_pistol_left +pt_stand_flinch_pistol_forward +pt_stand_flinch_pistol_back +pt_stand_flinch_pistol_right +pt_stand_flinch_grenade_right +pt_stand_flinch_grenade_left +pt_stand_flinch_grenade_forward +pt_stand_flinch_grenade_back +pt_hold_stand_flinch_right +pt_hold_stand_flinch_left +pt_hold_stand_flinch_forward +pt_hold_stand_flinch_back +pt_dw_stand_flinch_right +pt_dw_stand_flinch_left +pt_dw_stand_flinch_forward +pt_dw_stand_flinch_back +pt_rc_stand_flinch_back +pt_rc_stand_flinch_forward +pt_rc_stand_flinch_left +pt_rc_stand_flinch_right +pt_crouch_flinch_forward +pt_crouch_flinch_back +pt_crouch_flinch_left +pt_crouch_flinch_right +pt_crouch_flinch_pistol_left +pt_crouch_flinch_pistol_forward +pt_crouch_flinch_pistol_back +pt_crouch_flinch_pistol_right +pt_crouch_flinch_grenade_right +pt_crouch_flinch_grenade_left +pt_crouch_flinch_grenade_forward +pt_crouch_flinch_grenade_back +pt_hold_crouch_flinch_right +pt_hold_crouch_flinch_left +pt_hold_crouch_flinch_forward +pt_hold_crouch_flinch_back +pt_dw_crouch_flinch_right +pt_dw_crouch_flinch_left +pt_dw_crouch_flinch_forward +pt_dw_crouch_flinch_back +pt_rc_crouch_flinch_back +pt_rc_crouch_flinch_forward +pt_rc_crouch_flinch_left +pt_rc_crouch_flinch_right +pt_prone_flinch_forward +pt_prone_flinch_back +pt_prone_flinch_left +pt_prone_flinch_right +pt_prone_flinch_pistol_left +pt_prone_flinch_pistol_forward +pt_prone_flinch_pistol_back +pt_prone_flinch_pistol_right +pt_prone_flinch_grenade_right +pt_prone_flinch_grenade_left +pt_prone_flinch_grenade_forward +pt_prone_flinch_grenade_back +pt_hold_prone_flinch_right +pt_hold_prone_flinch_left +pt_hold_prone_flinch_forward +pt_hold_prone_flinch_back +pt_dw_prone_flinch_right +pt_dw_prone_flinch_left +pt_dw_prone_flinch_forward +pt_dw_prone_flinch_back +pt_rc_prone_flinch_back +pt_rc_prone_flinch_forward +pt_rc_prone_flinch_left +pt_rc_prone_flinch_right +pt_minigun_stand_raise +pt_pistol_stand_raise +pt_rifle_stand_raise +pt_satchel_stand_raise +pt_dw_full_pullout +pt_rpg_stand_raise +pt_rc_stand_raise +pt_radio_stand_raise +pt_tomahawk_stand_pullout +pt_minigun_crouch_raise +pt_rifle_crouch_raise +pt_pistol_crouch_raise +pt_crouch_dw_raise +pt_rc_crouch_raise +pt_radio_crouch_raise +pt_tomahawk_crouch_pullout +pt_rifle_prone_raise +pt_pistol_prone_raise +pt_satchel_prone_raise +pt_prone_dw_raise +pt_rpg_prone_raise +pt_rc_prone_raise +pt_radio_prone_raise +pt_tomahawk_prone_pullout +pt_minigun_stand_putaway +pt_pistol_stand_putaway +pt_rifle_stand_putaway +pt_satchel_stand_putaway +pt_dw_full_putaway +pt_rpg_stand_putaway +pt_rc_stand_putaway +pt_radio_stand_putaway +pt_minigun_crouch_putaway +pt_rifle_crouch_putaway +pt_pistol_crouch_putaway +pt_crouch_dw_putaway +pt_rc_crouch_putaway +pt_radio_crouch_putaway +pt_rifle_prone_putaway +pt_pistol_prone_putaway +pt_satchel_prone_putaway +pt_prone_dw_putaway +pt_rpg_prone_putaway +pt_rc_prone_putaway +pt_radio_prone_putaway +pt_grenade_stand_prime +pt_grenade_crouch_prime +pt_grenade_prone_prime +} +legs +{ +pb_chicken_dance +pb_chicken_dance_crouch +pb_stand_alert +pb_stand_ads +pb_stand_alert_pistol +pb_stand_ads_pistol +pb_stand_alert_RPG +pb_stand_ads_RPG +pb_hold_idle +pb_minigun_stand_idle +pb_dw_botharms_idle_v1 +pb_stand_bombplant +p_bomb_stand_loop +p_handheldradio_idle +pb_rc_stand_idle +pb_grenade_stand_idle +pb_rifle_stand_cac_idle +pb_pistol_stand_cac_idle +pb_dw_stand_cac_idle +pb_lmg_stand_cac_idle +pb_shot_stand_cac_idle +pb_uzi_stand_cac_idle +pb_sniper_stand_cac_idle +pb_rpg_stand_cac_idle +pb_b_knife_cac_idle +pb_b_knife_stand_idle +pb_tomahawk_stand_idle +pb_crouch_alert +pb_crouch_ads +pb_crouch_alert_pistol +pb_crouch_ads_pistol +pb_crouch_alert_RPG +pb_crouch_ads_RPG +pb_crouch_hold_idle +pb_minigun_crouch_idle +pb_crouch_dw_idle_v1 +pb_crouch_bombplant +p_bomb_crouch_loop +p_handheldradio_crouch_idle +pb_rc_crouch_idle +pb_grenade_crouch_idle +pb_b_knife_crouch_idle +pb_tomahawk_crouch_idle +pb_prone_aim +pb_prone_aim_ads +pb_prone_aim_pistol +pb_prone_aim_ads_pistol +pb_prone_aim_RPG +pb_prone_hold +pb_prone_dw_idle_v1 +pb_prone_bombplant +p_bomb_prone_loop +p_handheldradio_prone_idle +pb_rc_prone_idle +pb_grenade_prone_idle +pb_b_knife_prone_idle +pb_tomahawk_prone_idle +pb_laststand_idle +pb_sprint +pb_sprint_RPG +pb_sprint_pistol +pb_grenade_sprint +pb_sprint_hold +pb_dw_sprint +pb_runjump_takeoff +pb_standjump_takeoff +pb_grenade_runjump_takeoff +pb_grenade_standjump_takeoff +pb_rpg_runjump_takeoff +pb_rpg_standjump_takeoff +pb_minigun_runjump_takeoff +pb_minigun_standjump_takeoff +pb_runjump_takeoff_pistol +pb_standjump_takeoff_pistol +pb_standjump_takeoff_satchel +pb_dw_standjump_takeoff +pb_runjump_land +pb_standjump_land +pb_rifle_pronejump_land +pb_grenade_runjump_land +pb_grenade_standjump_land +pb_rpg_runjump_land +pb_rpg_standjump_land +pb_minigun_runjump_land +pb_minigun_standjump_land +pb_runjump_land_pistol +pb_standjump_land_pistol +pb_standjump_land_satchel +pb_dw_standjump_land +pb_combatrun_forward_loop +pb_combatrun_back_loop +pb_combatrun_left_loop +pb_combatrun_right_loop +pb_rifle_stand_run_slopeup +pb_rifle_stand_run_slopedown +pb_minigun_stand_run +pb_minigun_stand_run_back +pb_minigun_stand_run_left +pb_minigun_stand_run_right +pb_pistol_run_fast +pb_combatrun_back_loop_pistol +pb_combatrun_left_loop_pistol +pb_combatrun_right_loop_pistol +pb_pistol_stand_run_slopeup +pb_pistol_stand_run_slopedown +pb_combatrun_forward_loop_stickgrenade +pb_combatrun_left_loop_grenade +pb_combatrun_right_loop_grenade +pb_combatrun_back_loop_grenade +pb_combatrun_forward_RPG +pb_combatrun_back_RPG +pb_combatrun_left_RPG +pb_combatrun_right_RPG +pb_hold_run +pb_hold_run_back +pb_hold_run_right +pb_hold_run_left +pb_dw_run_right +pb_dw_run_left +pb_dw_run_forward +pb_dw_run_back +pb_dw_stand_run_slopeup +pb_dw_stand_run_slopedown +pb_b_knife_run_right +pb_b_knife_run_left +pb_b_knife_run_forward +pb_b_knife_run_back +pb_crouch_run_forward +pb_crouch_run_back +pb_crouch_run_left +pb_crouch_run_right +pb_minigun_crouch_run_forward +pb_minigun_crouch_run_back +pb_minigun_crouch_run_left +pb_minigun_crouch_run_right +pb_crouch_run_forward_pistol +pb_crouch_run_back_pistol +pb_crouch_run_left_pistol +pb_crouch_run_right_pistol +pb_crouch_run_forward_grenade +pb_crouch_run_back_grenade +pb_crouch_run_left_grenade +pb_crouch_run_right_grenade +pb_crouch_run_back_RPG +pb_crouch_run_forward_RPG +pb_crouch_run_left_RPG +pb_crouch_run_right_RPG +pb_crouch_hold_run +pb_crouch_hold_run_back +pb_crouch_hold_run_left +pb_crouch_hold_run_right +pb_crouch_dw_run_left +pb_crouch_dw_run_right +pb_crouch_dw_run_forward +pb_crouch_dw_run_back +pb_b_knife_crouch_run_right +pb_b_knife_crouch_run_left +pb_b_knife_crouch_run_forward +pb_b_knife_crouch_run_back +pb_rifle_stand_shuffle_f +pb_rifle_stand_shuffle_b +pb_rifle_stand_shuffle_l +pb_rifle_stand_shuffle_r +pb_stand_shoot_walk_forward +pb_stand_shoot_walk_back +pb_stand_shoot_walk_left +pb_stand_shoot_walk_right +pb_minigun_stand_walk +pb_minigun_stand_walk_back +pb_minigun_stand_walk_left +pb_minigun_stand_walk_right +pb_combatwalk_forward_loop_pistol +pb_combatwalk_back_loop_pistol +pb_combatwalk_left_loop_pistol +pb_combatwalk_right_loop_pistol +pb_walk_forward_RPG_ads +pb_walk_back_RPG_ads +pb_walk_left_RPG_ads +pb_walk_right_RPG_ads +pb_dw_walk_left +pb_dw_walk_right +pb_dw_walk_forward +pb_dw_walk_back +pb_b_knife_walk_left +pb_b_knife_walk_right +pb_b_knife_walk_forward +pb_b_knife_walk_back +pb_stand_shoot_walk_forward_unarmed +pb_laststand_crawl_back +pb_laststand_crawl_forward +pb_laststand_crawl_left +pb_laststand_crawl_right +pb_crouch_shoot_run_forward +pb_crouch_shoot_run_back +pb_crouch_shoot_run_left +pb_crouch_shoot_run_right +pb_crouch_walk_forward_pistol +pb_crouch_walk_back_pistol +pb_crouch_walk_left_pistol +pb_crouch_walk_right_pistol +pb_crouch_walk_right_RPG +pb_crouch_walk_left_RPG +pb_crouch_walk_forward_RPG +pb_crouch_walk_back_RPG +pb_crouch_walk_forward_unarmed +pb_prone_crawl +pb_prone_crawl_left +pb_prone_crawl_right +pb_prone_crawl_back +pb_prone_crawl_pistol +pb_prone_crawl_pistol_back +pb_prone_pistol_crawl_left +pb_prone_pistol_crawl_right +pb_prone_grenade_crawl +pb_prone_grenade_crawl_back +pb_prone_grenade_crawl_left +pb_prone_grenade_crawl_right +pb_prone_crawl_hold +pb_prone_crawl_back_hold +pb_prone_crawl_left_hold +pb_prone_crawl_right_hold +pb_prone_dw_crawl_forward +pb_prone_dw_crawl_back +pb_prone_dw_crawl_left +pb_prone_dw_crawl_right +pb_rpg_prone_crawl_backward +pb_rpg_prone_crawl_forward +pb_rpg_prone_crawl_left +pb_rpg_prone_crawl_right +p_swim_left +p_swim_right +p_swim_forward +p_swim_tread +pb_climbdown +pb_climbup +pb_briefcase_crouch2prone +pb_crouch2prone +pb_rpg_crouch2prone +pb_hold_crouch2prone +pb_crouch2prone_pistol +pb_dw_crouch2prone +pb_grenade_crouch2prone +pb_briefcase_prone2crouch +pb_prone2crouch +pb_prone2crouchrun +pb_prone2crouchrun_back +pb_prone2crouchrun_left +pb_prone2crouchrun_right +pb_prone2crouch_pistol +pb_prone2crouchrun_pistol +pb_rpg_prone2crouch +pb_hold_prone2crouch +pb_hold_prone2crouchrun +pb_dw_prone2crouch +pb_dw_prone2crouchrun +pb_grenade_prone2crouch +pb_grenade_prone2crouchrun +pb_prone2stand +pb_prone2sprint +pb_prone2stand_pistol +pb_prone2sprint_pistol +pb_hold_prone2stand +pb_hold_prone2sprint +pb_dw_prone2stand +pb_dw_prone2sprint +pb_grenade_prone2stand +pb_grenade_prone2sprint +pb_rifle_stand2crouch +pb_pistol_stand2crouch +pb_hold_stand2crouch +pb_dw_stand2crouch +pb_rifle_crouch2stand +pb_pistol_crouch2stand +pb_hold_crouch2stand +pb_dw_crouch2stand +pb_stand2laststand +pb_crouch2laststand +pb_prone2laststand +pb_laststand2stand +pb_laststand2crouch +pb_laststand2prone +mp_mantle_up_57 +mp_mantle_up_51 +mp_mantle_up_45 +mp_mantle_up_39 +mp_mantle_up_33 +mp_mantle_up_27 +mp_mantle_up_21 +mp_mantle_over_high +mp_mantle_over_mid +mp_mantle_over_low +pb_dive_prone +pb_dive_prone_pistol +pb_dw_dive_prone +pb_hold_dive_prone +pb_rpg_dive_prone +pb_dive_prone_land +pb_pistol_dive_prone_land +pb_dw_dive_prone_land +pb_hold_dive_prone_land +pb_rpg_dive_prone_land +pb_breach_shoulder +pb_breach_slide +pb_breach_lift +pb_terrain_slide +standSAWgunner_aim : complete nonloopsync +{ +standSAWgunner_aim_15down +{ +pb_saw_gunner_aim_down_right45 +pb_saw_gunner_aim_down_right30 +pb_saw_gunner_aim_down_right15 +pb_saw_gunner_aim_down_center +pb_saw_gunner_aim_down_left15 +pb_saw_gunner_aim_down_left30 +pb_saw_gunner_aim_down_left45 +} +standSAWgunner_aim_level +{ +pb_saw_gunner_aim_level_right45 +pb_saw_gunner_aim_level_right30 +pb_saw_gunner_aim_level_right15 +pb_saw_gunner_aim_level_center +pb_saw_gunner_aim_level_left15 +pb_saw_gunner_aim_level_left30 +pb_saw_gunner_aim_level_left45 +} +standSAWgunner_aim_15up +{ +pb_saw_gunner_aim_up_right45 +pb_saw_gunner_aim_up_right30 +pb_saw_gunner_aim_up_right15 +pb_saw_gunner_aim_up_center +pb_saw_gunner_aim_up_left15 +pb_saw_gunner_aim_up_left30 +pb_saw_gunner_aim_up_left45 +} +} +proneSAWgunner_aim : complete nonloopsync +{ +proneSAWgunner_aim_15down +{ +pb_saw_gunner_prone_aim_down_left40 +pb_saw_gunner_prone_aim_down_left20 +pb_saw_gunner_prone_aim_down_center +pb_saw_gunner_prone_aim_down_right20 +pb_saw_gunner_prone_aim_down_right40 +} +proneSAWgunner_aim_level +{ +pb_saw_gunner_prone_aim_level_left40 +pb_saw_gunner_prone_aim_level_left20 +pb_saw_gunner_prone_aim_level_center +pb_saw_gunner_prone_aim_level_right20 +pb_saw_gunner_prone_aim_level_right40 +} +proneSAWgunner_aim_15up +{ +pb_saw_gunner_prone_aim_up_left40 +pb_saw_gunner_prone_aim_up_left20 +pb_saw_gunner_prone_aim_up_center +pb_saw_gunner_prone_aim_up_right20 +pb_saw_gunner_prone_aim_up_right40 +} +} +crouchSAWgunner_aim : complete nonloopsync +{ +crouchSAWgunner_aim_15down +{ +pb_saw_gunner_lowwall_aim_down_left45 +pb_saw_gunner_lowwall_aim_down_left30 +pb_saw_gunner_lowwall_aim_down_left15 +pb_saw_gunner_lowwall_aim_down_center +pb_saw_gunner_lowwall_aim_down_right15 +pb_saw_gunner_lowwall_aim_down_right30 +pb_saw_gunner_lowwall_aim_down_right45 +} +crouchSAWgunner_aim_level +{ +pb_saw_gunner_lowwall_aim_level_left45 +pb_saw_gunner_lowwall_aim_level_left30 +pb_saw_gunner_lowwall_aim_level_left15 +pb_saw_gunner_lowwall_aim_level_center +pb_saw_gunner_lowwall_aim_level_right15 +pb_saw_gunner_lowwall_aim_level_right30 +pb_saw_gunner_lowwall_aim_level_right45 +} +crouchSAWgunner_aim_15up +{ +pb_saw_gunner_lowwall_aim_up_left45 +pb_saw_gunner_lowwall_aim_up_left30 +pb_saw_gunner_lowwall_aim_up_left15 +pb_saw_gunner_lowwall_aim_up_center +pb_saw_gunner_lowwall_aim_up_right15 +pb_saw_gunner_lowwall_aim_up_right30 +pb_saw_gunner_lowwall_aim_up_right45 +} +} +proneMG42_fire : complete loopsync +{ +proneMG42_fire_15down +{ +pb_proneMG42gunner_fire_40left_15down +pb_proneMG42gunner_fire_20left_15down +pb_proneMG42gunner_fire_forward_15down +pb_proneMG42gunner_fire_20right_15down +pb_proneMG42gunner_fire_40right_15down +} +proneMG42_fire_level +{ +pb_proneMG42gunner_fire_40left_level +pb_proneMG42gunner_fire_20left_level +pb_proneMG42gunner_fire_forward_level +pb_proneMG42gunner_fire_20right_level +pb_proneMG42gunner_fire_40right_level +} +proneMG42_fire_15up +{ +pb_proneMG42gunner_fire_40left_15up +pb_proneMG42gunner_fire_20left_15up +pb_proneMG42gunner_fire_forward_15up +pb_proneMG42gunner_fire_20right_15up +pb_proneMG42gunner_fire_40right_15up +} +} +proneMG42_aim : complete nonloopsync +{ +proneMG42_aim_15down +{ +pb_proneMG42gunner_aim_40left_15down +pb_proneMG42gunner_aim_20left_15down +pb_proneMG42gunner_aim_forward_15down +pb_proneMG42gunner_aim_20right_15down +pb_proneMG42gunner_aim_40right_15down +} +proneMG42_aim_level +{ +pb_proneMG42gunner_aim_40left_level +pb_proneMG42gunner_aim_20left_level +pb_proneMG42gunner_aim_forward_level +pb_proneMG42gunner_aim_20right_level +pb_proneMG42gunner_aim_40right_level +} +proneMG42_aim_15up +{ +pb_proneMG42gunner_aim_40left_15up +pb_proneMG42gunner_aim_20left_15up +pb_proneMG42gunner_aim_forward_15up +pb_proneMG42gunner_aim_20right_15up +pb_proneMG42gunner_aim_40right_15up +} +} +standMG42_fire : complete loopsync +{ +standMG42_fire_15down +{ +pb_standMG42gunner_fire_45left_15down +pb_standMG42gunner_fire_30left_15down +pb_standMG42gunner_fire_15left_15down +pb_standMG42gunner_fire_forward_15down +pb_standMG42gunner_fire_15right_15down +pb_standMG42gunner_fire_30right_15down +pb_standMG42gunner_fire_45right_15down +} +standMG42_fire_level +{ +pb_standMG42gunner_fire_45left_level +pb_standMG42gunner_fire_30left_level +pb_standMG42gunner_fire_15left_level +pb_standMG42gunner_fire_forward_level +pb_standMG42gunner_fire_15right_level +pb_standMG42gunner_fire_30right_level +pb_standMG42gunner_fire_45right_level +} +standMG42_fire_15up +{ +pb_standMG42gunner_fire_45left_15up +pb_standMG42gunner_fire_30left_15up +pb_standMG42gunner_fire_15left_15up +pb_standMG42gunner_fire_forward_15up +pb_standMG42gunner_fire_15right_15up +pb_standMG42gunner_fire_30right_15up +pb_standMG42gunner_fire_45right_15up +} +} +standMG42_aim : complete nonloopsync +{ +standMG42_aim_15down +{ +pb_standMG42gunner_aim_45left_15down +pb_standMG42gunner_aim_30left_15down +pb_standMG42gunner_aim_15left_15down +pb_standMG42gunner_aim_forward_15down +pb_standMG42gunner_aim_15right_15down +pb_standMG42gunner_aim_30right_15down +pb_standMG42gunner_aim_45right_15down +} +standMG42_aim_level +{ +pb_standMG42gunner_aim_45left_level +pb_standMG42gunner_aim_30left_level +pb_standMG42gunner_aim_15left_level +pb_standMG42gunner_aim_forward_level +pb_standMG42gunner_aim_15right_level +pb_standMG42gunner_aim_30right_level +pb_standMG42gunner_aim_45right_level +} +standMG42_aim_15up +{ +pb_standMG42gunner_aim_45left_15up +pb_standMG42gunner_aim_30left_15up +pb_standMG42gunner_aim_15left_15up +pb_standMG42gunner_aim_forward_15up +pb_standMG42gunner_aim_15right_15up +pb_standMG42gunner_aim_30right_15up +pb_standMG42gunner_aim_45right_15up +} +} +pb_death_flyback +pb_death_flatonback +pb_death_forwardtoface +pb_death_jackiespin_inplace +pb_death_legsout_left +pb_death_legsout_right +pb_death_flyback_far +pb_death_armslegsforward +pb_death_armslegsforward_b +pb_death_upontoback +pb_death_faceplant +pb_death_jackiespin_vertical +pb_death_jackiespin_left +pb_death_jackiespin_right +pb_prone_death_quickdeath +pb_laststand_death +pb_crouch_death_headshot_front +pb_crouch_death_clutchchest +pb_crouch_death_flip +pb_crouch_death_fetal +pb_crouch_death_falltohands +pb_crouchrun_death_drop +pb_crouchrun_death_crumple +pb_stand_death_spin +pb_stand_death_legs +pb_stand_death_lowerback +pb_stand_death_head_collapse +pb_stand_death_neckdeath_thrash +pb_stand_death_neckdeath +pb_stand_death_nervedeath +pb_stand_death_frontspin +pb_stand_death_headchest_topple +pb_death_run_forward_crumple +pb_death_run_onfront +pb_death_run_stumble +pb_death_run_back +pb_death_run_left +pb_death_run_right +pb_stand_martyrdom_death +pb_crouch_martyrdom_death +pb_prone_martyrdom_death +pb_laststand_suicide +pb_laststand_suicide_death +pb_stumble_forward +pb_stumble_back +pb_stumble_left +pb_stumble_right +pb_stumble_pistol_right +pb_stumble_pistol_left +pb_stumble_pistol_forward +pb_stumble_pistol_back +pb_stumble_grenade_right +pb_stumble_grenade_left +pb_stumble_grenade_forward +pb_stumble_grenade_back +pb_hold_stumble_right +pb_hold_stumble_left +pb_hold_stumble_forward +pb_hold_stumble_back +pb_dw_stumble_right +pb_dw_stumble_left +pb_dw_stumble_forward +pb_dw_stumble_back +pb_stumble_walk_forward +pb_stumble_walk_back +pb_stumble_walk_left +pb_stumble_walk_right +pb_stumble_pistol_walk_right +pb_stumble_pistol_walk_left +pb_stumble_pistol_walk_forward +pb_stumble_pistol_walk_back +pb_hold_stumble_walk_right +pb_hold_stumble_walk_left +pb_hold_stumble_walk_forward +pb_hold_stumble_walk_back +pb_dw_stumble_walk_right +pb_dw_stumble_walk_left +pb_dw_stumble_walk_forward +pb_dw_stumble_walk_back +pb_briefcase_stand_turn_l90 [turn = 217.0] +pb_briefcase_stand_turn_r90 [turn = 217.0] +pb_briefcase_crouch_turn_l90 [turn = 90.0] +pb_briefcase_crouch_turn_r90 [turn = 90.0] +pb_briefcase_prone_turn_l90 [turn = 72.0] +pb_briefcase_prone_turn_r90 [turn = 72.0] +pb_hold_turn_90left [turn = 217.0] +pb_hold_turn_90right [turn = 217.0] +pb_hold_crouchturn_90left [turn = 90.0] +pb_hold_crouchturn_90right [turn = 90.0] +pb_minigun_stand_turn_90left [turn = 217.0] +pb_minigun_stand_turn_90right [turn = 217.0] +pb_minigun_crouch_turn_90left [turn = 90.0] +pb_minigun_crouch_turn_90right [turn = 90.0] +pb_rpg_stand_turn90L [turn = 217.0] +pb_rpg_stand_turn90R [turn = 217.0] +pb_rpg_crouch_turn90L [turn = 90.0] +pb_rpg_crouch_turn90R [turn = 90.0] +pb_dw_turn_90left [turn = 217.0] +pb_dw_turn_90right [turn = 217.0] +pb_dw_crouchturn_90right [turn = 90.0] +pb_dw_crouchturn_90left [turn = 90.0] +pb_pistol_turn_90left [turn = 217.0] +pb_pistol_turn_90right [turn = 217.0] +pb_pistol_crouchturn_90right [turn = 90.0] +pb_pistol_crouchturn_90left [turn = 90.0] +pb_pistol_crouch_start_turn_90right [turn = 217.0] +pb_pistol_crouch_start_turn_90left [turn = 217.0] +pb_grenade_turn_90left [turn = 217.0] +pb_grenade_turn_90right [turn = 217.0] +pb_grenade_crouchturn_90right [turn = 90.0] +pb_grenade_crouchturn_90left [turn = 90.0] +pb_turn_90left [turn = 217.0] +pb_turn_90right [turn = 217.0] +pb_crouchturn_90right [turn = 90.0] +pb_crouchturn_90left [turn = 90.0] +pb_prone_turn_90left [turn = 72.0] +pb_prone_turn_90right [turn = 72.0] +pb_grenade_prone_turn_90left [turn = 72.0] +pb_grenade_prone_turn_90right [turn = 72.0] +pb_pistol_prone_turn_90left [turn = 72.0] +pb_pistol_prone_turn_90right [turn = 72.0] +pb_dw_prone_turn_90right [turn = 72.0] +pb_dw_prone_turn_90left [turn = 72.0] +pb_rpg_prone_turn90L [turn = 72.0] +pb_rpg_prone_turn90R [turn = 72.0] +pb_hold_prone_turn_90left [turn = 72.0] +pb_hold_prone_turn_90right [turn = 72.0] +pb_laststand_turn_l90 [turn = 72.0] +pb_laststand_turn_r90 [turn = 72.0] +sitting_jeepgunner_aim : complete nonloopsync +{ +sitting_jeepgunner_aim_center +{ +p_driver_jeep_seated +} +} +hueypassenger1_aim : complete nonloopsync +{ +huey_passenger_b_lt_aim_60down +{ +pb_huey_passenger_b_lt_aim_60down_60left +pb_huey_passenger_b_lt_aim_forward_60down +pb_huey_passenger_b_lt_aim_60down_60right +} +huey_passenger_b_lt_aim_center +{ +pb_huey_passenger_b_lt_aim_60left_level +pb_huey_passenger_b_lt_aim_forward_level +pb_huey_passenger_b_lt_aim_60right_level +} +huey_passenger_b_lt_aim_60up +{ +pb_huey_passenger_b_lt_aim_60up_60left +pb_huey_passenger_b_lt_aim_forward_60up +pb_huey_passenger_b_lt_aim_60up_60right +} +} +hueypassenger2_aim : complete nonloopsync +{ +sitting_huey_passenger_f_lt_aim_center +{ +pb_huey_passenger_f_lt +} +} +hueypassenger3_aim : complete nonloopsync +{ +sitting_huey_passenger_m_lt_aim_center +{ +pb_huey_passenger_m_lt +} +} +hueypassenger4_aim : complete nonloopsync +{ +sitting_huey_passenger_m_rt_aim_center +{ +pb_huey_passenger_m_rt +} +} +hueypassenger5_aim : complete nonloopsync +{ +sitting_huey_passenger_f_rt_aim_center +{ +pb_huey_passenger_f_rt +} +} +hueypassenger6_aim : complete nonloopsync +{ +sitting_huey_passenger_b_rt_aim_center +{ +pb_huey_passenger_b_rt +} +} +pbrdriver : complete nonloopsync +{ +pbrdriver_aim_center +{ +pb_pbr_driver_idle +} +} +pbrgunner1_aim : complete nonloopsync +{ +pbrgunner1_aim_60down +{ +pb_huey_gunner_aim_forward_60down +} +pbrgunner1_aim_center +{ +pb_huey_gunner_aim_forward_level +} +pbrgunner1_aim_60up +{ +pb_huey_gunner_aim_forward_60up +} +} +fake_gunner_aim : complete nonloopsync +{ +fake_gunner_aim_60down +{ +pb_huey_gunner_aim_60down_60left +pb_huey_minigun_aim_down +pb_huey_gunner_aim_60down_60right +} +fake_gunner_aim_center +{ +pb_huey_gunner_aim_60left_level +pb_huey_minigun_aim +pb_huey_gunner_aim_60right_level +} +fake_gunner_aim_60up +{ +pb_huey_gunner_aim_60up_60left +pb_huey_minigun_aim_up +pb_huey_gunner_aim_60up_60right +} +} +} +} +turning +{ +placeholder +} \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/player.atr b/BO1/PC/ZM/animtrees/player.atr new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/animtrees/tank.atr b/BO1/PC/ZM/animtrees/tank.atr new file mode 100644 index 0000000..65f4668 --- /dev/null +++ b/BO1/PC/ZM/animtrees/tank.atr @@ -0,0 +1,8 @@ +bmp_doors_open +tigertank_hatch_open +tigertank_hatchopencloseandrun_hatch +british_crusader_tank_drive_idle +american_sherman_tank_drive_idle +german_tiger_tank_drive_idle +german_panzer_2_tank_drive_idle +panzertank2_tankhatchanim_grenadeguy \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/vehicles.atr b/BO1/PC/ZM/animtrees/vehicles.atr new file mode 100644 index 0000000..a7d9dbf --- /dev/null +++ b/BO1/PC/ZM/animtrees/vehicles.atr @@ -0,0 +1,289 @@ +v_lvt4_open_ramp +v_lvt4_ramp_close +v_lvt4_stuck +v_willys_peleliu1_jeep_destroyed +v_lvt4_peleliu1_jeep_destroyed +mi17_heli_idle +technical_driving_idle_forward +technical_driving_idle_backward +uaz_driving_idle_forward +uaz_driving_idle_backward +bh_rotors +mi17_heli_rotors +bh_cargo_path +bh_idle +door_pickup_driver_climb_in +door_pickup_passenger_climb_in +door_pickup_driver_climb_out +door_pickup_passenger_climb_out +door_pickup_passenger_RL_climb_out +door_pickup_passenger_RR_climb_out +cobra_crash +cobra_crash_relative +abrams_movement +abrams_movement_backwards +bmp_doors_open +bog_b_tank_explosion +veh_car_destroy +bm21_driver_climbout_door +bm21_passenger_climbout_door +cobra_copilot_idle +cobra_copilot_idle_l +cobra_copilot_idle_r +coup_opening_car +coup_opening_car_driving +sniper_escape_ch46_take_off +sniper_escape_ch46_land +sniper_escape_ch46_idle +v_gaz63_driver_door_open +v_gaz63_passenger_door_open +v_police_driver_door_open +v_police_passenger_door_open +v_huey_fly +v_huey_dash_dials_delta +huey_dials: additive +{ +v_huey_tag_gauge_horizon_jnt_pitch_additive +v_huey_tag_gauge_horizon_jnt_roll_additive +v_huey_tag_guage_airspeed_additive +v_huey_tag_guage_altitude_additive +v_huey_tag_guage_fuel_additive +v_huey_tag_guage_needle_A_additive +v_huey_tag_guage_needle_B_additive +v_huey_tag_guage_needle_C_additive +v_huey_tag_guage_needle_D_additive +v_huey_tag_guage_needle_E_additive +v_huey_tag_guage_needle_F_additive +v_huey_tag_guage_needle_G_additive +v_huey_tag_guage_rpm_additive +} +huey_aiming +{ +v_huey_rightgunner_base_idle +huey_right_gun_move_right : additive +{ +v_huey_rightgunner_slideback +} +huey_right_gun_move_left : additive +{ +v_huey_rightgunner_slideforward +} +v_huey_leftgunner_base_idle +huey_left_gun_move_right : additive +{ +v_huey_leftgunner_slideforward +} +huey_left_gun_move_left : additive +{ +v_huey_leftgunner_slideback +} +} +v_hind_dash_dials_delta +hind_dials: additive +{ +v_hind_dash_tag_artificial_horizon_pitch_additive +v_hind_dash_tag_artificial_horizon_roll_additive +v_hind_dash_tag_instrument_a_additive +v_hind_dash_tag_instrument_c1_additive +v_hind_dash_tag_instrument_c_additive +v_hind_dash_tag_instrument_d_additive +v_hind_dash_tag_instrument_g_additive +v_hind_dash_tag_instrument_h_additive +v_hind_dash_tag_instrument_i_additive +v_hind_dash_tag_instrument_j_additive +} +v_horse_idle1 +v_horse_idle2 +v_horse_run_forward +v_horse_run_left +v_horse_run_right +v_horse_sprint_forward +v_horse_sprint_left +v_horse_sprint_right +v_horse_walk_forward +v_horse_walk_left +v_horse_walk_right +v_horse_jump +v_horse_pullback +ch_vor_b04_jump2truck_truck +v_pbr_upacreek_b03_landing +v_pbr_upacreek_b03_landing_loop +v_pbr_upacreek_b03_dragged +v_chinook_upacreek_b03_landing +v_chinook_upacreek_b03_landing_loop +v_chinook_upacreek_b03_dragged +v_pbr_upacreek_b03_dragged_crash_1 +v_pbr_upacreek_b03_dragged_crash_2 +v_pbr_upacreek_b03_dragged_crash_3 +v_pbr_upacreek_b03_boat_released +v_pbr_upacreek_b03_landing_startidle +v_chinook_upacreek_b03_landing_startidle +v_creek_b04_end_rescue_huey +v_quag_b01_aa_ambush_gun +v_huey_quag_b3_copilotdeath +v_quag_b02_hueyguntransition_huey +v_quag_b02_covridlhuey_huey +v_quag_b02_outcovrhuey_huey +v_quag_b02_intocovrhuey_huey +v_quag_b05_repeltomacv_huey +v_hue_b02_tankblast_tank +v_hue_b02_jumponboat_boat +ch_wmd_b01_grdsopengarage_cat_death +ch_wmd_b01_grdsopengarage_cat_leadin +v_wmd_b01_sr71_intro_sr71 +v_wmd_b01_loading_boxes_intro_cat +ch_wmd_b01_snowcat_doors +v_pentagon_chopper_intro +v_pentagon_chopper_tarmack +v_pentagon_bike01 +v_pentagon_bike02 +v_pentagon_bike03 +v_pentagon_bike04 +v_pentagon_bike05 +v_pentagon_bike06 +v_pentagon_bike07 +v_pentagon_bike08 +v_pentagon_sedan_arrival01 +v_pentagon_sedan_arrival02 +v_pentagon_limo_arrival +v_pentagon_limo_first +v_pentagon_limo_accelerate +v_pentagon_sedan_accelerate01 +v_pentagon_sedan_accelerate02 +v_pentagon_bike_ride_generic +v_pow_b03_hind_landandout_exterior +v_pow_b03_hind_landandout_interior +v_pow_b03_hind_climbin_exterior +v_pow_b03_hind_climbin_interior +v_pow_b03_hind_exit_exterior +v_pow_b03_hind_exit_interior +v_pow_b03_hind_inandup_exterior +v_pow_b03_hind_inandup_interior +v_pow_b03_hind_landed +v_pow_b03_hind_crash_left1 +v_pow_b03_hind_crash_left2 +v_pow_b03_hind_crash_right1 +v_pow_b03_hind_crash_right2 +v_pow_b03_hip_crash_left +v_pow_b03_hip_crash_right +v_pow_b03_clearing_truckstart +v_pow_b04_scene_heli_takeoff_cockpit +v_pow_b03_cockpit_horizon_bankleft +v_pow_b03_cockpit_horizon_bankright +v_pow_b03_cockpit_horizon_tiltdown +v_pow_b03_cockpit_horizon_tiltup +v_pow_b03_cockpit_horizon_neutral +v_rebirth_b02_push_car +v_rebirth_b03_btr_crash +v_rebirth_b03_btr_crash_loop +v_khe_E1B_chinookdropoff_helo +v_kowloon_b04_destroy_home_heli +v_kowloon_b07_vancrash_van +v_kowloon_b04_destroy_home_heli_in +v_kowloon_b04_destroy_home_heli_loop +v_kowloon_b04_destroy_home_heli_death +v_under_b01_playerheli_crash_huey +v_uwb_b01_weavers_heli_crash +v_uwb_b01_huey_01_hit_by_missle +v_uwb_b01_huey_02_hit_by_missle +v_under_b02_huey_hit_by_hind +v_uwb_b01_huey_crash_spin_left_loop +v_uwb_b01_huey_crash_spin_right_loop +v_under_b09_F4_flyby_jet01 +v_under_b09_F4_flyby_jet02 +v_under_b09_F4_flyby_jet03 +v_under_b09_F4_flyby_jet04 +v_under_b09_F4_flyby_jet05 +v_under_b09_F4_flyby_jet06 +v_under_b09_p_am_rescue_boat_loop +v_under_b01_playerheli_crash_huey_rotor_hub +v_under_b01_playerheli_crash_huey_rotor_blade +v_under_b01_playerheli_crash_huey_door +v_jeep_driver_door_open +v_jeep_passenger_door_open +motorcycle_player +{ +player_motorcycle_left_arm +{ +player_motorcycle_drive_left_arm +{ +int_bike_m72_drive_turn_left2right_L +int_bike_m72_drive_turn_right2left_L +} +player_motorcycle_shoot_left_arm +{ +int_bike_m72_gun_fire +int_bike_m72_gun_idle +player_motorcycle_gun_pullout_root +{ +int_bike_m72_gun_pullout_L +int_bike_m72_gun_pullout +int_bike_m72_gun_pullout_R +} +player_motorcycle_gun_putaway_root +{ +int_bike_m72_gun_putaway_L +int_bike_m72_gun_putaway +int_bike_m72_gun_putaway_R +} +int_bike_m72_gun_reload +int_bike_m72_gun_rechamber +} +} +player_motorcycle_right_arm +{ +int_bike_m72_drive_turn_left2right_R +int_bike_m72_drive_turn_right2left_R +} +motorcycle_shotgun +{ +viewmodel_bike_m72_shotgun_fire +viewmodel_bike_m72_shotgun_last_fire +viewmodel_bike_m72_shotgun_reload +viewmodel_bike_m72_shotgun_rechamber +} +player_motorcycle_drive_throttle_add : additive +{ +int_bike_m72_drive_throttle +} +player_motorcycle_drive_throttle_add_left : additive +{ +int_bike_m72_drive_throttle_left +} +player_motorcycle_drive_throttle_add_right : additive +{ +int_bike_m72_drive_throttle_right +} +} +v_cub_b01_carsequence_drivebwd_car +v_cub_b01_carsequence_drivefwd_1hand_car +v_cub_b01_carsequence_drivefwd_2hands_car +v_cub_b01_carsequence_into_car +v_cub_b01_carsequence_lookbwd_idle_car +v_cub_b01_carsequence_lookfwd_1hand_idle_car +v_cub_b01_carsequence_drivefwd_idle_1hand_car +v_cub_b01_carsequence_slowmo_car +v_cub_b01_car_tag_speedometer_delta +car_dials: additive +{ +v_cub_b01_car_tag_speedometer_additive +} +cuba_car_turning +{ +v_cub_b01_carsequence_turnright_1hand_car_brian +v_cub_b01_carsequence_turnleft_1hand_car_brian +v_cub_b01_carsequence_turnright_2hands_car_brian +v_cub_b01_carsequence_turnleft_2hands_car_brian +} +veh_river_b01_dropoff_chin_01 +veh_river_b01_dropoff_chin_02 +veh_river_b01_dropoff_chin_03 +veh_river_b01_dropoff_pbr_01 +veh_river_b01_dropoff_pbr_02 +veh_river_b01_dropoff_pbr_02_loop +v_uaz_driver_door_open +v_uaz_passenger_door_open +v_uaz_passenger2_door_open +v_uaz_passenger3_door_open +v_full_b01_snowcat_idle + diff --git a/BO1/PC/ZM/animtrees/waw_zombie_factory.atr b/BO1/PC/ZM/animtrees/waw_zombie_factory.atr new file mode 100644 index 0000000..aca93fb --- /dev/null +++ b/BO1/PC/ZM/animtrees/waw_zombie_factory.atr @@ -0,0 +1,3 @@ +o_zombie_difference_engine_ani +o_zombie_lattice_gate_full +o_zombie_lattice_gate_half \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/zombie_coast.atr b/BO1/PC/ZM/animtrees/zombie_coast.atr new file mode 100644 index 0000000..17ad471 --- /dev/null +++ b/BO1/PC/ZM/animtrees/zombie_coast.atr @@ -0,0 +1,5 @@ +pb_zombie_zipline_grab +pb_zombie_zipline_loop +pb_zombie_zipline_release +pb_rifle_stand_flinger_flail +pb_rifle_prone_flinger_flail \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/zombie_cymbal_monkey.atr b/BO1/PC/ZM/animtrees/zombie_cymbal_monkey.atr new file mode 100644 index 0000000..191864e --- /dev/null +++ b/BO1/PC/ZM/animtrees/zombie_cymbal_monkey.atr @@ -0,0 +1 @@ +o_monkey_bomb \ No newline at end of file diff --git a/BO1/PC/ZM/animtrees/zombie_dog.atr b/BO1/PC/ZM/animtrees/zombie_dog.atr new file mode 100644 index 0000000..7c1aa35 --- /dev/null +++ b/BO1/PC/ZM/animtrees/zombie_dog.atr @@ -0,0 +1,108 @@ +zd_attack_player_late : nonloopsync +{ +zombie_dog_attack_player_late +} +zombie_dog_attackidle_knob +{ +zombie_dog_attackidle +zombie_dog_attackidle_bark +zombie_dog_attackidle_growl +} +zombie_dog_look_2 : additive +{ +zombie_dog_look_down +zombie_dog_attack_look_down +} +zombie_dog_look_4 : additive +{ +zombie_dog_look_right +zombie_dog_attack_look_right +} +zombie_dog_look_6 : additive +{ +zombie_dog_look_left +zombie_dog_attack_look_left +} +zombie_dog_look_8 : additive +{ +zombie_dog_look_up +zombie_dog_attack_look_up +} +zombie_dog_run_start_knob : nonloopsync +{ +zombie_dog_run_start +} +zombie_dog_run_knob : loopsync +{ +zombie_dog_run +zombie_dog_run_lean_l +zombie_dog_run_lean_r +} +zombie_dog_turn_knob : nonloopsync +{ +zombie_dog_turn_90_left +zombie_dog_turn_90_right +zombie_dog_turn_180_left +zombie_dog_turn_180_right +zombie_dog_run_turn_90_left +zombie_dog_run_turn_90_right +zombie_dog_run_turn_180_left +zombie_dog_run_turn_180_right +} +ai_zombie_dog_attack_v1 +zombie_dog_eating_loop +zombie_dog_eating_out +zombie_dog_idle +zombie_dog_look_forward +zombie_dog_player_neck_miss +zombie_dog_player_neck_snap +zombie_dog_run_attack +zombie_dog_run_attack_low +zombie_dog_run_attack_miss +zombie_dog_run_bark +zombie_dog_run_flashbang +zombie_dog_run_jump_30 +zombie_dog_run_jump_40 +zombie_dog_run_jump_window_40 +zombie_dog_run_lean_l_bark +zombie_dog_run_lean_r_bark +zombie_dog_run_pain +zombie_dog_run_start_180_l +zombie_dog_run_start_180_r +zombie_dog_run_start_l +zombie_dog_run_start_r +zombie_dog_run_stop +zombie_dog_sitting_idle +zombie_dog_sitting_look_down +zombie_dog_sitting_look_forward +zombie_dog_traverse_down_96 +zombie_dog_traverse_down_40 +zombie_dog_traverse_down_126 +zombie_dog_traverse_down_190 +zombie_dog_traverse_up_40 +zombie_dog_traverse_up_80 +zombie_dog_wakeup_fast +zombie_dog_wakeup_slow +zombie_dog_walk +zombie_dog_trot +zombie_dog_tesla_death_a +zombie_dog_tesla_death_b +zombie_dog_tesla_death_c +zombie_dog_tesla_death_d +zombie_dog_tesla_death_e +zombie_dog_death_front +zombie_dog_death_hit_back +zombie_dog_death_hit_left +zombie_dog_death_hit_right +zombie_dog_pain_hit_back +zombie_dog_pain_hit_front +zombie_dog_pain_hit_left +zombie_dog_pain_hit_right +zombie_dog_run_pain_front +zombie_dog_attack_player_miss_turnR +zombie_dog_attack_player_miss_turnL + + + + + diff --git a/BO1/PC/ZM/animtrees/zombie_theater.atr b/BO1/PC/ZM/animtrees/zombie_theater.atr new file mode 100644 index 0000000..1725dfc --- /dev/null +++ b/BO1/PC/ZM/animtrees/zombie_theater.atr @@ -0,0 +1 @@ +o_zombie_theatre_curtain \ No newline at end of file diff --git a/BO1/PC/ZM/buttons_charlie.cfg b/BO1/PC/ZM/buttons_charlie.cfg new file mode 100644 index 0000000..db33870 --- /dev/null +++ b/BO1/PC/ZM/buttons_charlie.cfg @@ -0,0 +1,48 @@ +set gpad_buttonsConfig "buttons_charlie" +unbind BUTTON_RSHLDR +unbind BUTTON_LSHLDR +unbind BUTTON_RTRIG +unbind BUTTON_LTRIG +unbind BUTTON_RSTICK +unbind BUTTON_LSTICK +unbind BUTTON_A +unbind BUTTON_B +unbind BUTTON_X +unbind BUTTON_Y +unbind DPAD_UP +unbind DPAD_DOWN +unbind DPAD_LEFT +unbind DPAD_RIGHT +unbind2 BUTTON_RSHLDR +unbind2 BUTTON_LSHLDR +unbind2 BUTTON_RTRIG +unbind2 BUTTON_LTRIG +unbind2 BUTTON_RSTICK +unbind2 BUTTON_LSTICK +unbind2 BUTTON_A +unbind2 BUTTON_B +unbind2 BUTTON_X +unbind2 BUTTON_Y +unbind2 DPAD_UP +unbind2 DPAD_DOWN +unbind2 DPAD_LEFT +unbind2 DPAD_RIGHT +bind BUTTON_RTRIG "+toggleads_throw" +bind BUTTON_LTRIG "+smoke" +bind BUTTON_RSHLDR "+attack" +bind BUTTON_LSHLDR "+frag" +bind BUTTON_RSTICK "+melee" +bind BUTTON_LSTICK "+breath_sprint" +set gpad_button_rstick_deflect_max 1.0 +set gpad_button_lstick_deflect_max 1.0 +bind BUTTON_A "+gostand" +bind BUTTON_B "+stance" +bind BUTTON_X "+usereload" +bind BUTTON_Y "weapnext" +bind DPAD_UP "+actionslot 1" +bind DPAD_DOWN "+actionslot 2" +bind DPAD_LEFT "+actionslot 3" +bind DPAD_RIGHT "+actionslot 4" +bind2 BUTTON_RTRIG "+gas" +bind2 BUTTON_LTRIG "+reverse" +bind2 BUTTON_B "+handbrake" diff --git a/BO1/PC/ZM/buttons_default.cfg b/BO1/PC/ZM/buttons_default.cfg new file mode 100644 index 0000000..8777486 --- /dev/null +++ b/BO1/PC/ZM/buttons_default.cfg @@ -0,0 +1,34 @@ +unbind BUTTON_RSHLDR +unbind BUTTON_LSHLDR +unbind BUTTON_RTRIG +unbind BUTTON_LTRIG +unbind BUTTON_RSTICK +unbind BUTTON_LSTICK +unbind BUTTON_A +unbind BUTTON_B +unbind BUTTON_X +unbind BUTTON_Y +unbind DPAD_UP +unbind DPAD_DOWN +unbind DPAD_LEFT +unbind DPAD_RIGHT +bind BUTTON_RTRIG "+frag" +bind BUTTON_LTRIG "+smoke" +bind BUTTON_RSHLDR "+attack" +bind BUTTON_LSHLDR "+speed_throw" +bind BUTTON_RSTICK "+melee" +bind BUTTON_LSTICK "+breath_sprint" +set gpad_button_rstick_deflect_max 1.0 +set gpad_button_lstick_deflect_max 1.0 +bind BUTTON_A "+gostand" +bind BUTTON_B "+stance" +bind BUTTON_X "+usereload" +bind BUTTON_Y "weapnext" +bind DPAD_UP "+actionslot 1" +bind DPAD_DOWN "+actionslot 2" +bind DPAD_LEFT "+actionslot 3" +bind DPAD_RIGHT "+actionslot 4" +bind2 BUTTON_A "+gas" +bind2 BUTTON_LTRIG "+gas" +bind2 BUTTON_B "+reverse" +bind2 BUTTON_Y "+switchseat" \ No newline at end of file diff --git a/BO1/PC/ZM/buttons_default_alt.cfg b/BO1/PC/ZM/buttons_default_alt.cfg new file mode 100644 index 0000000..f6e656f --- /dev/null +++ b/BO1/PC/ZM/buttons_default_alt.cfg @@ -0,0 +1,48 @@ +set gpad_buttonsConfig "buttons_default_alt" +unbind BUTTON_RSHLDR +unbind BUTTON_LSHLDR +unbind BUTTON_RTRIG +unbind BUTTON_LTRIG +unbind BUTTON_RSTICK +unbind BUTTON_LSTICK +unbind BUTTON_A +unbind BUTTON_B +unbind BUTTON_X +unbind BUTTON_Y +unbind DPAD_UP +unbind DPAD_DOWN +unbind DPAD_LEFT +unbind DPAD_RIGHT +unbind2 BUTTON_RSHLDR +unbind2 BUTTON_LSHLDR +unbind2 BUTTON_RTRIG +unbind2 BUTTON_LTRIG +unbind2 BUTTON_RSTICK +unbind2 BUTTON_LSTICK +unbind2 BUTTON_A +unbind2 BUTTON_B +unbind2 BUTTON_X +unbind2 BUTTON_Y +unbind2 DPAD_UP +unbind2 DPAD_DOWN +unbind2 DPAD_LEFT +unbind2 DPAD_RIGHT +bind BUTTON_RSHLDR "+frag" +bind BUTTON_LSHLDR "+smoke" +bind BUTTON_RTRIG "+attack" +bind BUTTON_LTRIG "+speed_throw" +bind BUTTON_RSTICK "+melee" +bind BUTTON_LSTICK "+breath_sprint" +set gpad_button_rstick_deflect_max 1.0 +set gpad_button_lstick_deflect_max 1.0 +bind BUTTON_A "+gostand" +bind BUTTON_B "+stance" +bind BUTTON_X "+usereload" +bind BUTTON_Y "weapnext" +bind DPAD_UP "+actionslot 1" +bind DPAD_DOWN "+actionslot 2" +bind DPAD_LEFT "+actionslot 3" +bind DPAD_RIGHT "+actionslot 4" +bind2 BUTTON_RTRIG "+gas" +bind2 BUTTON_LTRIG "+reverse" +bind2 BUTTON_B "+handbrake" diff --git a/BO1/PC/ZM/buttons_experimental.cfg b/BO1/PC/ZM/buttons_experimental.cfg new file mode 100644 index 0000000..cf8443a --- /dev/null +++ b/BO1/PC/ZM/buttons_experimental.cfg @@ -0,0 +1,21 @@ + +bind BUTTON_RTRIG "+frag" +bind BUTTON_LTRIG "+smoke" +bind BUTTON_RSHLDR "+attack" +bind BUTTON_LSHLDR "+speed_throw" +bind BUTTON_RSTICK "+stance" +bind BUTTON_LSTICK "+breath_sprint" +bind BUTTON_A "+gostand" +bind BUTTON_B "+melee" +bind BUTTON_X "+usereload" +bind BUTTON_Y "weapnext" +bind DPAD_UP "+actionslot 1" +bind DPAD_DOWN "+actionslot 2" +bind DPAD_LEFT "+actionslot 3" +bind DPAD_RIGHT "+actionslot 4" +set gpad_button_rstick_deflect_max 1.0 +set gpad_button_lstick_deflect_max 1.0 +bind2 BUTTON_RTRIG "+gas" +bind2 BUTTON_LTRIG "+reverse" +bind2 BUTTON_B "+handbrake" +bind2 BUTTON_A "+switchseat" diff --git a/BO1/PC/ZM/buttons_experimental_alt.cfg b/BO1/PC/ZM/buttons_experimental_alt.cfg new file mode 100644 index 0000000..ee6edc3 --- /dev/null +++ b/BO1/PC/ZM/buttons_experimental_alt.cfg @@ -0,0 +1,48 @@ +set gpad_buttonsConfig "buttons_experimental_alt" +unbind BUTTON_RSHLDR +unbind BUTTON_LSHLDR +unbind BUTTON_RTRIG +unbind BUTTON_LTRIG +unbind BUTTON_RSTICK +unbind BUTTON_LSTICK +unbind BUTTON_A +unbind BUTTON_B +unbind BUTTON_X +unbind BUTTON_Y +unbind DPAD_UP +unbind DPAD_DOWN +unbind DPAD_LEFT +unbind DPAD_RIGHT +unbind2 BUTTON_RSHLDR +unbind2 BUTTON_LSHLDR +unbind2 BUTTON_RTRIG +unbind2 BUTTON_LTRIG +unbind2 BUTTON_RSTICK +unbind2 BUTTON_LSTICK +unbind2 BUTTON_A +unbind2 BUTTON_B +unbind2 BUTTON_X +unbind2 BUTTON_Y +unbind2 DPAD_UP +unbind2 DPAD_DOWN +unbind2 DPAD_LEFT +unbind2 DPAD_RIGHT +bind BUTTON_RSHLDR "+frag" +bind BUTTON_LSHLDR "+smoke" +bind BUTTON_RTRIG "+attack" +bind BUTTON_LTRIG "+speed_throw" +bind BUTTON_RSTICK "+stance" +bind BUTTON_LSTICK "+breath_sprint" +set gpad_button_rstick_deflect_max 1.0 +set gpad_button_lstick_deflect_max 1.0 +bind BUTTON_A "+gostand" +bind BUTTON_B "+melee" +bind BUTTON_X "+usereload" +bind BUTTON_Y "weapnext" +bind DPAD_UP "+actionslot 1" +bind DPAD_DOWN "+actionslot 2" +bind DPAD_LEFT "+actionslot 3" +bind DPAD_RIGHT "+actionslot 4" +bind2 BUTTON_RTRIG "+gas" +bind2 BUTTON_LTRIG "+reverse" +bind2 BUTTON_B "+handbrake" diff --git a/BO1/PC/ZM/buttons_lefty.cfg b/BO1/PC/ZM/buttons_lefty.cfg new file mode 100644 index 0000000..3bb8a94 --- /dev/null +++ b/BO1/PC/ZM/buttons_lefty.cfg @@ -0,0 +1,21 @@ + +bind BUTTON_RTRIG "+smoke" +bind BUTTON_LTRIG "+frag" +bind BUTTON_RSHLDR "+speed_throw" +bind BUTTON_LSHLDR "+attack" +bind BUTTON_RSTICK "+breath_sprint" +bind BUTTON_LSTICK "+melee" +bind BUTTON_A "+gostand" +bind BUTTON_B "+stance" +bind BUTTON_X "+usereload" +bind BUTTON_Y "weapnext" +bind DPAD_UP "+actionslot 1" +bind DPAD_DOWN "+actionslot 2" +bind DPAD_LEFT "+actionslot 3" +bind DPAD_RIGHT "+actionslot 4" +set gpad_button_rstick_deflect_max 1.0 +set gpad_button_lstick_deflect_max 1.0 +bind2 BUTTON_RTRIG "+gas" +bind2 BUTTON_LTRIG "+reverse" +bind2 BUTTON_B "+handbrake" +bind2 BUTTON_A "+switchseat" diff --git a/BO1/PC/ZM/buttons_lefty_alt.cfg b/BO1/PC/ZM/buttons_lefty_alt.cfg new file mode 100644 index 0000000..6c43f61 --- /dev/null +++ b/BO1/PC/ZM/buttons_lefty_alt.cfg @@ -0,0 +1,48 @@ +set gpad_buttonsConfig "buttons_lefty_alt" +unbind BUTTON_RSHLDR +unbind BUTTON_LSHLDR +unbind BUTTON_RTRIG +unbind BUTTON_LTRIG +unbind BUTTON_RSTICK +unbind BUTTON_LSTICK +unbind BUTTON_A +unbind BUTTON_B +unbind BUTTON_X +unbind BUTTON_Y +unbind DPAD_UP +unbind DPAD_DOWN +unbind DPAD_LEFT +unbind DPAD_RIGHT +unbind2 BUTTON_RSHLDR +unbind2 BUTTON_LSHLDR +unbind2 BUTTON_RTRIG +unbind2 BUTTON_LTRIG +unbind2 BUTTON_RSTICK +unbind2 BUTTON_LSTICK +unbind2 BUTTON_A +unbind2 BUTTON_B +unbind2 BUTTON_X +unbind2 BUTTON_Y +unbind2 DPAD_UP +unbind2 DPAD_DOWN +unbind2 DPAD_LEFT +unbind2 DPAD_RIGHT +bind BUTTON_RSHLDR "+smoke" +bind BUTTON_LSHLDR "+frag" +bind BUTTON_RTRIG "+speed_throw" +bind BUTTON_LTRIG "+attack" +bind BUTTON_RSTICK "+breath_sprint" +bind BUTTON_LSTICK "+melee" +set gpad_button_rstick_deflect_max 1.0 +set gpad_button_lstick_deflect_max 1.0 +bind BUTTON_A "+gostand" +bind BUTTON_B "+stance" +bind BUTTON_X "+usereload" +bind BUTTON_Y "weapnext" +bind DPAD_UP "+actionslot 1" +bind DPAD_DOWN "+actionslot 2" +bind DPAD_LEFT "+actionslot 3" +bind DPAD_RIGHT "+actionslot 4" +bind2 BUTTON_RTRIG "+gas" +bind2 BUTTON_LTRIG "+reverse" +bind2 BUTTON_B "+handbrake" diff --git a/BO1/PC/ZM/buttons_nomad.cfg b/BO1/PC/ZM/buttons_nomad.cfg new file mode 100644 index 0000000..a5d7679 --- /dev/null +++ b/BO1/PC/ZM/buttons_nomad.cfg @@ -0,0 +1,17 @@ +set gpad_buttonsConfig "buttons_nomad" +bind BUTTON_RSHLDR "+attack" +bind BUTTON_LSHLDR "+toggleads_throw" +bind BUTTON_RTRIG "+frag" +bind BUTTON_LTRIG "+smoke" +bind BUTTON_RSTICK "+stance" +bind BUTTON_LSTICK "+breath_sprint" +set gpad_button_rstick_deflect_max 1.0 +set gpad_button_lstick_deflect_max 1.0 +bind BUTTON_A "+gostand" +bind BUTTON_B "+melee" +bind BUTTON_X "+usereload" +bind BUTTON_Y "weapnext" +bind DPAD_UP "+actionslot 1" +bind DPAD_DOWN "+actionslot 2" +bind DPAD_LEFT "+actionslot 3" +bind DPAD_RIGHT "+actionslot 4" diff --git a/BO1/PC/ZM/buttons_nomad_alt.cfg b/BO1/PC/ZM/buttons_nomad_alt.cfg new file mode 100644 index 0000000..cc96ccd --- /dev/null +++ b/BO1/PC/ZM/buttons_nomad_alt.cfg @@ -0,0 +1,17 @@ +set gpad_buttonsConfig "buttons_nomad_alt" +bind BUTTON_RSHLDR "+frag" +bind BUTTON_LSHLDR "+smoke" +bind BUTTON_RTRIG "+attack" +bind BUTTON_LTRIG "+toggleads_throw" +bind BUTTON_RSTICK "+stance" +bind BUTTON_LSTICK "+breath_sprint" +set gpad_button_rstick_deflect_max 1.0 +set gpad_button_lstick_deflect_max 1.0 +bind BUTTON_A "+gostand" +bind BUTTON_B "+melee" +bind BUTTON_X "+usereload" +bind BUTTON_Y "weapnext" +bind DPAD_UP "+actionslot 1" +bind DPAD_DOWN "+actionslot 2" +bind DPAD_LEFT "+actionslot 3" +bind DPAD_RIGHT "+actionslot 4" diff --git a/BO1/PC/ZM/buttons_zombietron.cfg b/BO1/PC/ZM/buttons_zombietron.cfg new file mode 100644 index 0000000..0d74d4d --- /dev/null +++ b/BO1/PC/ZM/buttons_zombietron.cfg @@ -0,0 +1,35 @@ + +set gpad_buttonsConfig "buttons_zombietron" +unbind BUTTON_RSHLDR +unbind BUTTON_LSHLDR +unbind BUTTON_RTRIG +unbind BUTTON_LTRIG +unbind BUTTON_RSTICK +unbind BUTTON_LSTICK +unbind BUTTON_A +unbind BUTTON_B +unbind BUTTON_X +unbind BUTTON_Y +unbind DPAD_UP +unbind DPAD_DOWN +unbind DPAD_LEFT +unbind DPAD_RIGHT +unbind2 BUTTON_RSHLDR +unbind2 BUTTON_LSHLDR +unbind2 BUTTON_RTRIG +unbind2 BUTTON_LTRIG +unbind2 BUTTON_RSTICK +unbind2 BUTTON_LSTICK +unbind2 BUTTON_A +unbind2 BUTTON_B +unbind2 BUTTON_X +unbind2 BUTTON_Y +unbind2 DPAD_UP +unbind2 DPAD_DOWN +unbind2 DPAD_LEFT +unbind2 DPAD_RIGHT +bind BUTTON_A "+activate" +bind BUTTON_LSHLDR "+frag" +bind BUTTON_RSHLDR "+gostand" +set gpad_button_rstick_deflect_max 1.0 +set gpad_button_lstick_deflect_max 1.0 diff --git a/BO1/PC/ZM/character/c_cub_castro_zt.gsc b/BO1/PC/ZM/character/c_cub_castro_zt.gsc new file mode 100644 index 0000000..917f2f8 Binary files /dev/null and b/BO1/PC/ZM/character/c_cub_castro_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_ger_honorguard_zombietron.gsc b/BO1/PC/ZM/character/c_ger_honorguard_zombietron.gsc new file mode 100644 index 0000000..49fa8e3 Binary files /dev/null and b/BO1/PC/ZM/character/c_ger_honorguard_zombietron.gsc differ diff --git a/BO1/PC/ZM/character/c_ger_honorguard_zt.gsc b/BO1/PC/ZM/character/c_ger_honorguard_zt.gsc new file mode 100644 index 0000000..3e8981e Binary files /dev/null and b/BO1/PC/ZM/character/c_ger_honorguard_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_ger_richtofen_dlc2.gsc b/BO1/PC/ZM/character/c_ger_richtofen_dlc2.gsc new file mode 100644 index 0000000..20b42a1 Binary files /dev/null and b/BO1/PC/ZM/character/c_ger_richtofen_dlc2.gsc differ diff --git a/BO1/PC/ZM/character/c_ger_richtofen_zt.gsc b/BO1/PC/ZM/character/c_ger_richtofen_zt.gsc new file mode 100644 index 0000000..5713303 Binary files /dev/null and b/BO1/PC/ZM/character/c_ger_richtofen_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_jap_takeo_zt.gsc b/BO1/PC/ZM/character/c_jap_takeo_zt.gsc new file mode 100644 index 0000000..c65415c Binary files /dev/null and b/BO1/PC/ZM/character/c_jap_takeo_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_moss_zt.gsc b/BO1/PC/ZM/character/c_moss_zt.gsc new file mode 100644 index 0000000..a67359e Binary files /dev/null and b/BO1/PC/ZM/character/c_moss_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_rus_nikolai_dlc2.gsc b/BO1/PC/ZM/character/c_rus_nikolai_dlc2.gsc new file mode 100644 index 0000000..d85c7c5 Binary files /dev/null and b/BO1/PC/ZM/character/c_rus_nikolai_dlc2.gsc differ diff --git a/BO1/PC/ZM/character/c_rus_nikolai_dlc5.gsc b/BO1/PC/ZM/character/c_rus_nikolai_dlc5.gsc new file mode 100644 index 0000000..3e3ec15 Binary files /dev/null and b/BO1/PC/ZM/character/c_rus_nikolai_dlc5.gsc differ diff --git a/BO1/PC/ZM/character/c_rus_nikolai_zt.gsc b/BO1/PC/ZM/character/c_rus_nikolai_zt.gsc new file mode 100644 index 0000000..9f59171 Binary files /dev/null and b/BO1/PC/ZM/character/c_rus_nikolai_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_rus_simianaut.gsc b/BO1/PC/ZM/character/c_rus_simianaut.gsc new file mode 100644 index 0000000..ca2887b Binary files /dev/null and b/BO1/PC/ZM/character/c_rus_simianaut.gsc differ diff --git a/BO1/PC/ZM/character/c_rus_spetsnaz2_zt.gsc b/BO1/PC/ZM/character/c_rus_spetsnaz2_zt.gsc new file mode 100644 index 0000000..74abe7c Binary files /dev/null and b/BO1/PC/ZM/character/c_rus_spetsnaz2_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_rus_spetsnaz_zt.gsc b/BO1/PC/ZM/character/c_rus_spetsnaz_zt.gsc new file mode 100644 index 0000000..880b642 Binary files /dev/null and b/BO1/PC/ZM/character/c_rus_spetsnaz_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_sprint1_marine_scot_player.gsc b/BO1/PC/ZM/character/c_sprint1_marine_scot_player.gsc new file mode 100644 index 0000000..343d087 Binary files /dev/null and b/BO1/PC/ZM/character/c_sprint1_marine_scot_player.gsc differ diff --git a/BO1/PC/ZM/character/c_sprint1_marine_yaw_player.gsc b/BO1/PC/ZM/character/c_sprint1_marine_yaw_player.gsc new file mode 100644 index 0000000..8df6ee9 Binary files /dev/null and b/BO1/PC/ZM/character/c_sprint1_marine_yaw_player.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_cia2_zt.gsc b/BO1/PC/ZM/character/c_usa_cia2_zt.gsc new file mode 100644 index 0000000..2832bb8 Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_cia2_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_cia_zt.gsc b/BO1/PC/ZM/character/c_usa_cia_zt.gsc new file mode 100644 index 0000000..ddf6420 Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_cia_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_dempsey_zt.gsc b/BO1/PC/ZM/character/c_usa_dempsey_zt.gsc new file mode 100644 index 0000000..b6d8f6e Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_dempsey_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_jfk_zt.gsc b/BO1/PC/ZM/character/c_usa_jfk_zt.gsc new file mode 100644 index 0000000..ac0d264 Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_jfk_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_marine_michael_carter_player.gsc b/BO1/PC/ZM/character/c_usa_marine_michael_carter_player.gsc new file mode 100644 index 0000000..7fccd8c Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_marine_michael_carter_player.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_marine_michael_carter_player_zm.gsc b/BO1/PC/ZM/character/c_usa_marine_michael_carter_player_zm.gsc new file mode 100644 index 0000000..8c539e2 Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_marine_michael_carter_player_zm.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_marine_winston_lewis_player.gsc b/BO1/PC/ZM/character/c_usa_marine_winston_lewis_player.gsc new file mode 100644 index 0000000..7fccd8c Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_marine_winston_lewis_player.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_mcnamara_zt.gsc b/BO1/PC/ZM/character/c_usa_mcnamara_zt.gsc new file mode 100644 index 0000000..803c6d9 Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_mcnamara_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_militarypolice_zombietron.gsc b/BO1/PC/ZM/character/c_usa_militarypolice_zombietron.gsc new file mode 100644 index 0000000..03c82a3 Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_militarypolice_zombietron.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_nixon_zt.gsc b/BO1/PC/ZM/character/c_usa_nixon_zt.gsc new file mode 100644 index 0000000..ff8a271 Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_nixon_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_pent_zombie_militarypolice.gsc b/BO1/PC/ZM/character/c_usa_pent_zombie_militarypolice.gsc new file mode 100644 index 0000000..afdbed8 Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_pent_zombie_militarypolice.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_pent_zombie_scientist.gsc b/BO1/PC/ZM/character/c_usa_pent_zombie_scientist.gsc new file mode 100644 index 0000000..2222071 Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_pent_zombie_scientist.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_sog2_zt.gsc b/BO1/PC/ZM/character/c_usa_sog2_zt.gsc new file mode 100644 index 0000000..e65d9be Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_sog2_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_usa_sog_zt.gsc b/BO1/PC/ZM/character/c_usa_sog_zt.gsc new file mode 100644 index 0000000..6192ed9 Binary files /dev/null and b/BO1/PC/ZM/character/c_usa_sog_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_viet_zombie_female_body.gsc b/BO1/PC/ZM/character/c_viet_zombie_female_body.gsc new file mode 100644 index 0000000..180f4f4 Binary files /dev/null and b/BO1/PC/ZM/character/c_viet_zombie_female_body.gsc differ diff --git a/BO1/PC/ZM/character/c_viet_zombie_female_body_alt.gsc b/BO1/PC/ZM/character/c_viet_zombie_female_body_alt.gsc new file mode 100644 index 0000000..2410741 Binary files /dev/null and b/BO1/PC/ZM/character/c_viet_zombie_female_body_alt.gsc differ diff --git a/BO1/PC/ZM/character/c_viet_zombie_napalm_body.gsc b/BO1/PC/ZM/character/c_viet_zombie_napalm_body.gsc new file mode 100644 index 0000000..1c6d7d2 Binary files /dev/null and b/BO1/PC/ZM/character/c_viet_zombie_napalm_body.gsc differ diff --git a/BO1/PC/ZM/character/c_viet_zombie_nva1.gsc b/BO1/PC/ZM/character/c_viet_zombie_nva1.gsc new file mode 100644 index 0000000..ba75210 Binary files /dev/null and b/BO1/PC/ZM/character/c_viet_zombie_nva1.gsc differ diff --git a/BO1/PC/ZM/character/c_viet_zombie_nva1_alt.gsc b/BO1/PC/ZM/character/c_viet_zombie_nva1_alt.gsc new file mode 100644 index 0000000..b1716cb Binary files /dev/null and b/BO1/PC/ZM/character/c_viet_zombie_nva1_alt.gsc differ diff --git a/BO1/PC/ZM/character/c_viet_zombie_vc.gsc b/BO1/PC/ZM/character/c_viet_zombie_vc.gsc new file mode 100644 index 0000000..b71bec7 Binary files /dev/null and b/BO1/PC/ZM/character/c_viet_zombie_vc.gsc differ diff --git a/BO1/PC/ZM/character/c_vtn_nva2_zt.gsc b/BO1/PC/ZM/character/c_vtn_nva2_zt.gsc new file mode 100644 index 0000000..59e8b6b Binary files /dev/null and b/BO1/PC/ZM/character/c_vtn_nva2_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_vtn_nva_zt.gsc b/BO1/PC/ZM/character/c_vtn_nva_zt.gsc new file mode 100644 index 0000000..d866f6c Binary files /dev/null and b/BO1/PC/ZM/character/c_vtn_nva_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_barechest.gsc b/BO1/PC/ZM/character/c_zom_barechest.gsc new file mode 100644 index 0000000..84d8561 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_barechest.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_blue_guy_zt.gsc b/BO1/PC/ZM/character/c_zom_blue_guy_zt.gsc new file mode 100644 index 0000000..34c81a3 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_blue_guy_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_cosmo_cosmonaut.gsc b/BO1/PC/ZM/character/c_zom_cosmo_cosmonaut.gsc new file mode 100644 index 0000000..a5b9a84 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_cosmo_cosmonaut.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_cosmo_spetznaz.gsc b/BO1/PC/ZM/character/c_zom_cosmo_spetznaz.gsc new file mode 100644 index 0000000..ccd9383 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_cosmo_spetznaz.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_electrician.gsc b/BO1/PC/ZM/character/c_zom_electrician.gsc new file mode 100644 index 0000000..b7a0593 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_electrician.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_george_romero_light.gsc b/BO1/PC/ZM/character/c_zom_george_romero_light.gsc new file mode 100644 index 0000000..3ecfcac Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_george_romero_light.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_monkey01.gsc b/BO1/PC/ZM/character/c_zom_monkey01.gsc new file mode 100644 index 0000000..68fb0cd Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_monkey01.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_monkey02.gsc b/BO1/PC/ZM/character/c_zom_monkey02.gsc new file mode 100644 index 0000000..8d88585 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_monkey02.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_monkey03.gsc b/BO1/PC/ZM/character/c_zom_monkey03.gsc new file mode 100644 index 0000000..fdfb6ae Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_monkey03.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_moon_pressure_suit_zombie.gsc b/BO1/PC/ZM/character/c_zom_moon_pressure_suit_zombie.gsc new file mode 100644 index 0000000..9c91699 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_moon_pressure_suit_zombie.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_moon_quad.gsc b/BO1/PC/ZM/character/c_zom_moon_quad.gsc new file mode 100644 index 0000000..09eeaec Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_moon_quad.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_moon_tech_zombie_1_2.gsc b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_1_2.gsc new file mode 100644 index 0000000..27f2fe5 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_1_2.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_moon_tech_zombie_1_3.gsc b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_1_3.gsc new file mode 100644 index 0000000..d3b7440 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_1_3.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_moon_tech_zombie_2.gsc b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_2.gsc new file mode 100644 index 0000000..7fe81a3 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_2.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_moon_tech_zombie_2_2.gsc b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_2_2.gsc new file mode 100644 index 0000000..3834bf4 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_2_2.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_moon_tech_zombie_3.gsc b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_3.gsc new file mode 100644 index 0000000..7fe81a3 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_3.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_moon_tech_zombie_3_2.gsc b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_3_2.gsc new file mode 100644 index 0000000..3834bf4 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_3_2.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_moon_tech_zombie_3_3.gsc b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_3_3.gsc new file mode 100644 index 0000000..a6befca Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_moon_tech_zombie_3_3.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_quad.gsc b/BO1/PC/ZM/character/c_zom_quad.gsc new file mode 100644 index 0000000..a971a27 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_quad.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_red_guy_zt.gsc b/BO1/PC/ZM/character/c_zom_red_guy_zt.gsc new file mode 100644 index 0000000..d1eea31 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_red_guy_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_robert_englund_player.gsc b/BO1/PC/ZM/character/c_zom_robert_englund_player.gsc new file mode 100644 index 0000000..12a65e0 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_robert_englund_player.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_sarah_michelle_gellar_player.gsc b/BO1/PC/ZM/character/c_zom_sarah_michelle_gellar_player.gsc new file mode 100644 index 0000000..df9d6a2 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_sarah_michelle_gellar_player.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_scuba.gsc b/BO1/PC/ZM/character/c_zom_scuba.gsc new file mode 100644 index 0000000..9d36342 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_scuba.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_snow_camo_zt.gsc b/BO1/PC/ZM/character/c_zom_snow_camo_zt.gsc new file mode 100644 index 0000000..b7e1683 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_snow_camo_zt.gsc differ diff --git a/BO1/PC/ZM/character/c_zom_yellow_guy_zt.gsc b/BO1/PC/ZM/character/c_zom_yellow_guy_zt.gsc new file mode 100644 index 0000000..13f8985 Binary files /dev/null and b/BO1/PC/ZM/character/c_zom_yellow_guy_zt.gsc differ diff --git a/BO1/PC/ZM/character/char_ger_engineer_zombies.gsc b/BO1/PC/ZM/character/char_ger_engineer_zombies.gsc new file mode 100644 index 0000000..29d516f Binary files /dev/null and b/BO1/PC/ZM/character/char_ger_engineer_zombies.gsc differ diff --git a/BO1/PC/ZM/character/char_jap_zombie_nocap.gsc b/BO1/PC/ZM/character/char_jap_zombie_nocap.gsc new file mode 100644 index 0000000..e96e41a Binary files /dev/null and b/BO1/PC/ZM/character/char_jap_zombie_nocap.gsc differ diff --git a/BO1/PC/ZM/character/character_sp_zombie_dog.gsc b/BO1/PC/ZM/character/character_sp_zombie_dog.gsc new file mode 100644 index 0000000..3b3cd67 Binary files /dev/null and b/BO1/PC/ZM/character/character_sp_zombie_dog.gsc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_ger_honorguard_zt.csc b/BO1/PC/ZM/character/clientscripts/c_ger_honorguard_zt.csc new file mode 100644 index 0000000..59bcbd7 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_ger_honorguard_zt.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_viet_zombie_female_body.csc b/BO1/PC/ZM/character/clientscripts/c_viet_zombie_female_body.csc new file mode 100644 index 0000000..4af2d74 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_viet_zombie_female_body.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_viet_zombie_female_body_alt.csc b/BO1/PC/ZM/character/clientscripts/c_viet_zombie_female_body_alt.csc new file mode 100644 index 0000000..a85d30d Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_viet_zombie_female_body_alt.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_viet_zombie_nva1.csc b/BO1/PC/ZM/character/clientscripts/c_viet_zombie_nva1.csc new file mode 100644 index 0000000..dc543cc Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_viet_zombie_nva1.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_viet_zombie_sonic.csc b/BO1/PC/ZM/character/clientscripts/c_viet_zombie_sonic.csc new file mode 100644 index 0000000..650554d Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_viet_zombie_sonic.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_cosmo_cosmonaut.csc b/BO1/PC/ZM/character/clientscripts/c_zom_cosmo_cosmonaut.csc new file mode 100644 index 0000000..7bc4f36 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_cosmo_cosmonaut.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_cosmo_scientist.csc b/BO1/PC/ZM/character/clientscripts/c_zom_cosmo_scientist.csc new file mode 100644 index 0000000..3900d93 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_cosmo_scientist.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_cosmo_spetznaz.csc b/BO1/PC/ZM/character/clientscripts/c_zom_cosmo_spetznaz.csc new file mode 100644 index 0000000..c6064e1 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_cosmo_spetznaz.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_1.csc b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_1.csc new file mode 100644 index 0000000..08fdd6d Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_1.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_1_3.csc b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_1_3.csc new file mode 100644 index 0000000..82d1a15 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_1_3.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_2.csc b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_2.csc new file mode 100644 index 0000000..ff141da Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_2.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_2_2.csc b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_2_2.csc new file mode 100644 index 0000000..ce89327 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_2_2.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_3_2.csc b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_3_2.csc new file mode 100644 index 0000000..ce89327 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_3_2.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_3_3.csc b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_3_3.csc new file mode 100644 index 0000000..76ada86 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_moon_tech_zombie_3_3.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_quad.csc b/BO1/PC/ZM/character/clientscripts/c_zom_quad.csc new file mode 100644 index 0000000..f2a5505 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_quad.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/c_zom_scuba.csc b/BO1/PC/ZM/character/clientscripts/c_zom_scuba.csc new file mode 100644 index 0000000..d8900e5 Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/c_zom_scuba.csc differ diff --git a/BO1/PC/ZM/character/clientscripts/char_jap_zombie_nocap.csc b/BO1/PC/ZM/character/clientscripts/char_jap_zombie_nocap.csc new file mode 100644 index 0000000..ee61a9d Binary files /dev/null and b/BO1/PC/ZM/character/clientscripts/char_jap_zombie_nocap.csc differ diff --git a/BO1/PC/ZM/clientscripts/_airsupport.csc b/BO1/PC/ZM/clientscripts/_airsupport.csc new file mode 100644 index 0000000..4a0895b --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_airsupport.csc @@ -0,0 +1,299 @@ +#include clientscripts\_utility; +#include clientscripts\_utility_code; +#include clientscripts\_vehicle; +planeSounds( spawnSound, flybySound, flybySoundLoop, lengthOfFlyby ) +{ + self endon("delete"); + fake_ent_plane = spawnfakeent( 0 ); + playsound (0, spawnSound, (0,0,0)); + thread plane_position_updater (fake_ent_plane, self, flybySound, flybySoundLoop, lengthOfFlyBy); +} +plane_position_updater ( fake_ent, plane, flybySound, flybySoundLoop, lengthOfFlyby ) +{ + soundid = -1; + dx = undefined; + lastTime = undefined; + lastPos = undefined; + startTime = 0; + while(IsDefined(plane)) + { + setfakeentorg(0, fake_ent, plane.origin); + if((soundid < 0) && isdefined(lastPos)) + { + dx = plane.origin - lastPos; + if(length(dx) > .01) + { + velocity = dx / (getrealtime()-lastTime); + assert(isdefined(velocity)); + players = getlocalplayers(); + assert(isdefined(players)); + other_point = plane.origin + (velocity * 100000); + point = closest_point_on_line_to_point(players[0].origin, plane.origin, other_point ); + assert(isdefined(point)); + dist = Distance( point, plane.origin ); + assert(isdefined(dist)); + time = dist / length(velocity); + assert(isdefined(time)); + if( time < lengthOfFlyby ) + { + if ( isdefined ( flybysoundloop ) ) + soundid = playloopsound(0, fake_ent, flybySoundLoop, 0 ); + if ( isdefined ( flybySound ) ) + plane playsound (0, flybySound); + startTime = getRealTime(); + } + } + } + lastPos = plane.origin; + lastTime = getrealtime(); + realwait(0.1); + } + wait (5); + deletefakeent(0, fake_ent); +} +closest_point_on_line_to_point( Point, LineStart, LineEnd ) +{ + LineMagSqrd = lengthsquared(LineEnd - LineStart); + t = ( ( ( Point[0] - LineStart[0] ) * ( LineEnd[0] - LineStart[0] ) ) + + ( ( Point[1] - LineStart[1] ) * ( LineEnd[1] - LineStart[1] ) ) + + ( ( Point[2] - LineStart[2] ) * ( LineEnd[2] - LineStart[2] ) ) ) / + ( LineMagSqrd ); + if( t < 0.0 ) + { + return LineStart; + } + else if( t > 1.0 ) + { + return LineEnd; + } + else + { + start_x = LineStart[0] + t * ( LineEnd[0] - LineStart[0] ); + start_y = LineStart[1] + t * ( LineEnd[1] - LineStart[1] ); + start_z = LineStart[2] + t * ( LineEnd[2] - LineStart[2] ); + return (start_x,start_y,start_z); + } +} +getPlaneModel( teamFaction ) +{ + switch ( teamFaction ) + { + case "vietcong": + planemodel = "t5_veh_air_mig_21_nva_flying"; + break; + case "nva": + planemodel = "t5_veh_air_mig_21_nva_flying"; + break; + case "japanese": + planemodel = "t5_veh_air_mig_21_ussr_flying"; + break; + case "russian": + planemodel = "t5_veh_air_mig_21_ussr_flying"; + break; + case "marines": + planemodel = "t5_veh_jet_f4_gearup"; + break; + case "specops": + planemodel = "t5_veh_jet_f4_gearup"; + break; + default: + println( "invalid faction, defaulting to marines" ); + planemodel = "t5_veh_jet_f4_gearup"; + break; + } + return planeModel; +} +planeTurnLeft( plane, yaw, halflife ) +{ + plane endon("delete"); + yawY = getDvarFloatDefault( #"scr_planeyaw", 0.6 ); + rollZ = getDvarFloatDefault( #"scr_planeroll", -1.5 ); + maxYaw = getDvarFloatDefault( #"scr_max_planeyaw", 45.0 ); + minRoll = getDvarFloatDefault( #"scr_min_planeroll", -60.0 ); + ox = getDvarFloatDefault( #"scr_planeox", 30000.0 ); + oy = getDvarFloatDefault( #"scr_planeoy", 30000.0 ); + maxoX = getDvarFloatDefault( #"scr_maxo_planex", -1.0 ); + maxoY = getDvarFloatDefault( #"scr_maxo_planey", -1.0 ); + if (plane.angles[1] == 360) + plane.angles = ( plane.angles[0], 0, plane.angles[2] ); + origX = plane.origin[0]; + origY = plane.origin[1]; + accumTurn = 0; + looptime = 0.1; + while( loopTime <= halflife ) + { + if (plane.angles[1] == 360) + plane.angles = ( plane.angles[0], 0, plane.angles[2] ); + if ( minRoll != -1 && plane.angles[2] <= minRoll ) + rollZ = 0.0; + accumTurn += yawY; + if ( accumTurn >= maxYaw ) + { + yawY = 0.0; + } + plane.angles = ( plane.angles[0], plane.angles[1] + yawY, plane.angles[2] + rollZ); + mathX = ( sin ( 45 * looptime / halflife ) ) * ox ; + mathY = ( cos ( 45 * looptime / halflife ) ) * oy ; + oldX = mathX; + oldY = oy - mathY; + rotatedX = Cos(yaw) * oldX - Sin(yaw) * oldY; + rotatedY = Sin(yaw) * oldX + Cos(yaw) * oldY; + endPoint = ( origX + rotatedX, origY + rotatedY, plane.origin[2]); + plane moveTo( endPoint, 0.1, 0, 0 ); + realwait (0.1); + loopTime += 0.1; + } + yawY = getDvarFloatDefault( #"scr_planeyaw2", 0.6 ); + rollZ = getDvarFloatDefault( #"scr_planeroll2", -0.9 ); + ox = getDvarFloatDefault( #"scr_planeox", 30000.0 ); + oy = getDvarFloatDefault( #"scr_planeoy", 30000.0 ); + maxoX = getDvarFloatDefault( #"scr_maxo_planex", -1.0 ); + maxoY = getDvarFloatDefault( #"scr_maxo_planey", -1.0 ); + y = getDvarFloatDefault( #"scr_planey2", 0.6 ); + z = getDvarFloatDefault( #"scr_planez2", -1.5 ); + maxy = getDvarFloatDefault( #"scr_max_planey2", 90); + accumTurn = 0; + while( loopTime < halflife + halflife ) + { + if (plane.angles[1] == 360) + plane.angles = ( plane.angles[0], 0, plane.angles[2] ); + if ( minRoll != -1 && plane.angles[2] >= 0 ) + rollZ = 0.0; + accumTurn += yawY; + if ( accumTurn >= maxYaw ) + { + yawY = 0.0; + } + plane.angles = ( plane.angles[0], plane.angles[1] + yawY, plane.angles[2] - rollZ); + mathX = ( sin ( 45 * looptime / halflife ) ) * ox ; + mathY = ( cos ( 45 * looptime / halflife ) ) * oy ; + oldX = mathX; + oldY = oy - mathY; + rotatedX = Cos(yaw) * oldX - Sin(yaw) * oldY; + rotatedY = Sin(yaw) * oldX + Cos(yaw) * oldY; + endPoint = ( origX + rotatedX, origY + rotatedY, plane.origin[2]); + plane moveTo( endPoint, 0.1, 0, 0 ); + realwait (0.1); + loopTime += 0.1; + } +} +planeTurnRight( plane, yaw, halflife ) +{ + plane endon("delete"); + yawY = getDvarFloatDefault( #"scr_planeyaw", -0.6 ); + rollZ = getDvarFloatDefault( #"scr_planeroll", 1.5 ); + maxYaw = getDvarFloatDefault( #"scr_max_planeyaw", -45.0 ); + minRoll = getDvarFloatDefault( #"scr_min_planeroll", 60.0 ); + ox = getDvarFloatDefault( #"scr_planeox", 30000.0 ); + oy = getDvarFloatDefault( #"scr_planeoy", -30000.0 ); + maxoX = getDvarFloatDefault( #"scr_maxo_planex", -1.0 ); + maxoY = getDvarFloatDefault( #"scr_maxo_planey", -1.0 ); + if (plane.angles[1] == 360) + plane.angles = ( plane.angles[0], 0, plane.angles[2] ); + origX = plane.origin[0]; + origY = plane.origin[1]; + accumTurn = 0; + looptime = 0.1; + while( loopTime <= halflife ) + { + if (plane.angles[1] == 360) + plane.angles = ( plane.angles[0], 0, plane.angles[2] ); + if ( minRoll != -1 && plane.angles[2] >= minRoll ) + rollZ = 0.0; + accumTurn += yawY; + if ( accumTurn <= maxYaw ) + { + yawY = 0.0; + } + plane.angles = ( plane.angles[0], plane.angles[1] + yawY, plane.angles[2] + rollZ); + mathX = ( sin ( 45 * looptime / halflife ) ) * ox ; + mathY = ( cos ( 45 * looptime / halflife ) ) * oy ; + oldX = mathX; + oldY = oy - mathY; + rotatedX = Cos(yaw) * oldX - Sin(yaw) * oldY; + rotatedY = Sin(yaw) * oldX + Cos(yaw) * oldY; + println( rotatedX + " " + rotatedY + "\n" ); + endPoint = ( origX + rotatedX, origY + rotatedY, plane.origin[2]); + plane moveTo( endPoint, 0.1, 0, 0 ); + realwait (0.1); + loopTime += 0.1; + } + yawY = getDvarFloatDefault( #"scr_planeyaw2", 0.6 ); + rollZ = getDvarFloatDefault( #"scr_planeroll2", -0.9 ); + ox = getDvarFloatDefault( #"scr_planeox", 30000.0 ); + oy = getDvarFloatDefault( #"scr_planeoy", -30000.0 ); + maxoX = getDvarFloatDefault( #"scr_maxo_planex", -1.0 ); + maxoY = getDvarFloatDefault( #"scr_maxo_planey", -1.0 ); + y = getDvarFloatDefault( #"scr_planey2", 0.6 ); + z = getDvarFloatDefault( #"scr_planez2", -1.5 ); + maxy = getDvarFloatDefault( #"scr_max_planey2", 90); + accumTurn = 0; + while( loopTime < halflife + halflife ) + { + if (plane.angles[1] == 360) + plane.angles = ( plane.angles[0], 0, plane.angles[2] ); + if ( minRoll != -1 && plane.angles[2] >= 0 ) + rollZ = 0.0; + accumTurn += yawY; + if ( accumTurn >= maxYaw ) + { + yawY = 0.0; + } + plane.angles = ( plane.angles[0], plane.angles[1] + yawY, plane.angles[2] - rollZ); + mathX = ( sin ( 45 * looptime / halflife ) ) * ox ; + mathY = ( cos ( 45 * looptime / halflife ) ) * oy ; + oldX = mathX; + oldY = oy - mathY; + rotatedX = Cos(yaw) * oldX - Sin(yaw) * oldY; + rotatedY = Sin(yaw) * oldX + Cos(yaw) * oldY; + endPoint = ( origX + rotatedX, origY + rotatedY, plane.origin[2]); + plane moveTo( endPoint, 0.1, 0, 0 ); + realwait (0.1); + loopTime += 0.1; + } +} +doABarrelRoll( plane, endPoint, time ) +{ + plane endon("delete"); + plane moveTo( endPoint, time, 0, 0 ); + rollZ = getDvarFloatDefault( #"scr_barrelroll", 10 ); + degreesToRoll = getDvarFloatDefault( #"scr_degreesToRoll", 720 ); + degreesRolled = 0; + while ( degreesRolled < degreesToRoll ) + { + plane.angles = ( plane.angles[0], plane.angles[1], plane.angles[2] + rollZ); + degreesRolled += rollZ; + realwait (0.01); + } +} +planeGoStraight( plane, endPoint, time ) +{ + plane endon("delete"); + plane moveTo( endPoint, time, 0, 0 ); +} +debug_line( from, to, color, time ) +{ +} +debug_star( origin, color, time ) +{ +} +getDvarFloatDefault( dvarName, defaultValue) +{ + returnVal = defaultValue; + if (getDvar(dvarName) != "") + { + return getDvarFloat(dvarName); + } + return returnVal; +} +getDvarIntDefault( dvarName, defaultValue) +{ + returnVal = defaultValue; + if (getDvar(dvarName) != "") + { + return getDvarInt(dvarName); + } + return returnVal; +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_ambient.csc b/BO1/PC/ZM/clientscripts/_ambient.csc new file mode 100644 index 0000000..7350eb3 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_ambient.csc differ diff --git a/BO1/PC/ZM/clientscripts/_ambientpackage.csc b/BO1/PC/ZM/clientscripts/_ambientpackage.csc new file mode 100644 index 0000000..817c376 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_ambientpackage.csc @@ -0,0 +1,644 @@ +#include clientscripts\_utility; +deactivateAmbientPackage(client, package, priority) +{ + if ( !isdefined( level.ambientPackages[package] ) ) + { + assertmsg( "deactivateAmbientPackage: must declare ambient package \"" + package + "\" in level_amb main before it can be deactivated" ); + return; + } + for( i = 0; i < level.ambientPackages[package].priority.size; i++) + { + if ( level.ambientPackages[package].priority[i] == priority && level.ambientPackages[package].refcount[i] ) + { + level.ambientPackages[package].refcount[i]--; + level notify( "updateActiveAmbientPackage" ); + return; + } + } +} +deactivateAmbientRoom(client, room, priority) +{ + if ( !isdefined( level.ambientRooms[room] ) ) + { + assertmsg( "deactivateAmbientRoom: must declare ambient room \"" + room + "\" in level_amb main before it can be deactivated" ); + return; + } + for( i = 0; i < level.ambientRooms[room].priority.size; i++ ) + { + if( level.ambientRooms[room].priority[i] == priority && level.ambientRooms[room].refcount[i] ) + { + level.ambientRooms[room].refcount[i]--; + level notify( "updateActiveAmbientRoom" ); + return; + } + } +} +trig_enter(ent) +{ + if( self.useAmbientPackage ) + activateAmbientPackage( 0, self.script_ambientpackage, self.script_ambientpriority); + if( self.useAmbientRoom ) + activateAmbientRoom( 0, self.script_ambientroom, self.script_ambientpriority ); +} +trig_leave(ent) +{ + if( self.useAmbientPackage ) + deactivateAmbientPackage( 0, self.script_ambientpackage, self.script_ambientpriority ); + if( self.useAmbientRoom ) + deactivateAmbientRoom( 0, self.script_ambientroom, self.script_ambientpriority ); +} +AmbientPackageTrigger() +{ + hasAmbientRoom = isdefined ( self.script_ambientroom ); + useAmbientRoom = hasAmbientRoom && isdefined( level.ambientRooms[self.script_ambientroom] ); + hasAmbientPackage = isdefined ( self.script_ambientpackage ); + useAmbientPackage = hasAmbientPackage && isdefined( level.ambientPackages[self.script_ambientpackage] ); + self.useAmbientRoom = useAmbientRoom; + self.useAmbientPackage = useAmbientPackage; + if (hasAmbientRoom && !useAmbientRoom) + { + assertmsg( "Trigger at " + self.origin + " references ambient room '" + self.script_ambientroom + "', but no such room has been declared\n" ); + return; + } + if (hasAmbientPackage && !useAmbientPackage) + { + assertmsg( "Trigger at " + self.origin + " references ambient package '" + self.script_ambientpackage + "', but no such package has been declared\n" ); + return; + } + if(!useAmbientPackage && !useAmbientRoom) + { + assertmsg( "Trigger at " + self.origin + " is an ambient trigger but has no room or package \n" ); + return; + } + if ( !isdefined( self.script_ambientpriority ) ) + { + self.script_ambientpriority = 1; + } + self.in_volume = []; + for (;;) + { + self waittill ( "trigger", trigPlayer ); + if(trigPlayer issplitscreenhost()) + { + self thread trigger_thread(trigPlayer, ::trig_enter, ::trig_leave); + } + wait(0.01); + } +} +init_ambient_package_triggers() +{ + wait(0.1); + player = GetLocalPlayers()[0]; + remove_triggers_from_ent( player ); + trigs = GetEntArray( 0, "ambient_package","targetname"); + array_thread( trigs, ::ambientPackageTrigger); + println("Client : " + trigs.size + " ambient package triggers."); +} +init() +{ + level.activeAmbientPackage = ""; + level.ambientPackages = []; + level.ambientNumMissedSounds = 0; + level.ambientNumSeqMissedSounds = 0; + thread updateActiveAmbientPackage(); + thread saveRestore(); + level.ambientPackageScriptOriginPool = []; + for ( i = 0; i < 5; i++ ) + { + level.ambientPackageScriptOriginPool[i] = spawnStruct(); + level.ambientPackageScriptOriginPool[i].org = spawnfakeent(0); + level.ambientPackageScriptOriginPool[i].inuse = false; + level.ambientPackageScriptOriginPool[i] thread scriptOriginPoolThread(); + } + level.activeAmbientRoom = ""; + level.ambientRooms = []; + level thread updateActiveAmbientRoom(); + clientscripts\_utility::registerSystem("ambientPackageCmd", ::ambientPackageCmdHandler); + clientscripts\_utility::registerSystem("ambientRoomCmd", ::ambientRoomCmdHandler); + level thread init_ambient_package_triggers(); +} +declareAmbientPackage( package ) +{ + if ( isdefined( level.ambientPackages[package] ) ) + return; + level.ambientPackages[package] = spawnStruct(); + level.ambientPackages[package].priority = []; + level.ambientPackages[package].refcount = []; + level.ambientPackages[package].elements = []; +} +addAmbientElement( package, alias, spawnMin, spawnMax, distMin, distMax, angleMin, angleMax ) +{ + if ( !isdefined( level.ambientPackages[package] ) ) + { + assertmsg( "addAmbientElement: must declare ambient package \"" + package + "\" in level_amb main before it can have elements added to it" ); + return; + } + index = level.ambientPackages[package].elements.size; + level.ambientPackages[package].elements[index] = spawnStruct(); + level.ambientPackages[package].elements[index].alias = alias; + if ( spawnMin < 0 ) + spawnMin = 0; + if ( spawnMin >= spawnMax ) + spawnMax = spawnMin + 1; + level.ambientPackages[package].elements[index].spawnMin = spawnMin; + level.ambientPackages[package].elements[index].spawnMax = spawnMax; + level.ambientPackages[package].elements[index].distMin = -1; + level.ambientPackages[package].elements[index].distMax = -1; + if ( isdefined( distMin ) && isdefined( distMax ) && distMin >= 0 && distMin < distMax ) + { + level.ambientPackages[package].elements[index].distMin = distMin; + level.ambientPackages[package].elements[index].distMax = distMax; + } + level.ambientPackages[package].elements[index].angleMin = 0; + level.ambientPackages[package].elements[index].angleMax = 359; + if ( isdefined( angleMin ) && isdefined( angleMax ) && angleMin >= 0 && angleMin < angleMax && angleMax <= 720 ) + { + level.ambientPackages[package].elements[index].angleMin = angleMin; + level.ambientPackages[package].elements[index].angleMax = angleMax; + } +} +declareAmbientRoom( room ) +{ + if ( isdefined( level.ambientRooms[room] ) ) + return; + level.ambientRooms[room] = spawnStruct(); + level.ambientRooms[room].priority = []; + level.ambientRooms[room].refcount = []; + level.ambientRooms[room].ent = spawnfakeent(0); +} +setAmbientRoomTone( room, alias, fadeIn, fadeOut ) +{ + if ( !isdefined( level.ambientRooms[room] ) ) + { + assertmsg( "setAmbientRoomTone: must declare ambient room \"" + room + "\" in level_amb main before it can have a room tone set" ); + return; + } + level.ambientRooms[room].tone = alias; + level.ambientRooms[room].fadeIn = 2; + if ( isDefined( fadeIn ) && fadeIn >= 0 ) + { + level.ambientRooms[room].fadeIn = fadeIn; + } + level.ambientRooms[room].fadeOut = 2; + if ( isDefined( fadeOut ) && fadeOut >= 0 ) + { + level.ambientRooms[room].fadeOut = fadeOut; + } +} +setAmbientRoomSnapshot( room, snapshot) +{ + if ( !isdefined( level.ambientRooms[room] ) ) + { + assertmsg( "setAmbientRoomSnapshot: must declare ambient room \"" + room + "\" in level_amb main before it can have a room snapshot set" ); + return; + } + level.ambientRooms[room].snapshot = snapshot; +} +setAmbientRoomContext( room, type, value) +{ + if ( !isdefined( level.ambientRooms[room] ) ) + { + assertmsg( "setAmbientRoomContext: must declare ambient room \"" + room + "\" in level_amb main before it can have a room context set" ); + return; + } + if(!isdefined(level.ambientRooms[room].context)) + { + level.ambientRooms[room].context = []; + } + level.ambientRooms[room].context[type] = value; + if(!isdefined(level.ambientContexts)) + { + level.ambientContexts = []; + } + level.ambientContexts[type] = type; +} +setAmbientRoomReverb( room, reverbRoomType, dry, wet, fade ) +{ + if ( !isdefined( level.ambientRooms[room] ) ) + { + assertmsg( "setAmbientRoomReverb: must declare ambient room \"" + room + "\" in level_amb main before it can have a room reverb set" ); + return; + } + level.ambientRooms[room].reverb = spawnStruct(); + level.ambientRooms[room].reverb.reverbRoomType = reverbRoomType; + level.ambientRooms[room].reverb.dry = dry; + level.ambientRooms[room].reverb.wet = wet; + level.ambientRooms[room].reverb.fade = 2; + if ( isDefined( fade ) && fade >= 0 ) + { + level.ambientRooms[room].reverb.fade = fade; + } +} +activateAmbientPackage( clientNum, package, priority ) +{ + if ( !isdefined( level.ambientPackages[package] ) ) + { + assertmsg( "activateAmbientPackage: must declare ambient package \"" + package + "\" in level_amb.csc main before it can be activated" ); + return; + } + for ( i = 0; i < level.ambientPackages[package].priority.size; i++ ) + { + if ( level.ambientPackages[package].priority[i] == priority ) + { + level.ambientPackages[package].refcount[i]++; + break; + } + } + if ( i == level.ambientPackages[package].priority.size ) + { + level.ambientPackages[package].priority[i] = priority; + level.ambientPackages[package].refcount[i] = 1; + } + level notify( "updateActiveAmbientPackage" ); +} +activateAmbientRoom( clientNum, room, priority ) +{ + if ( !isdefined( level.ambientRooms[room] ) ) + { + assertmsg( "activateAmbientRoom: must declare ambient room \"" + room + "\" in level_amb.csc main before it can be activated" ); + return; + } + for ( i = 0; i < level.ambientRooms[room].priority.size; i++ ) + { + if ( level.ambientRooms[room].priority[i] == priority ) + { + level.ambientRooms[room].refcount[i]++; + break; + } + } + if ( i == level.ambientRooms[room].priority.size ) + { + level.ambientRooms[room].priority[i] = priority; + level.ambientRooms[room].refcount[i] = 1; + } + level notify( "updateActiveAmbientRoom" ); +} +ambientPackageCmdHandler(clientNum, state, oldState) +{ + if(state != "") + { + split_state = splitargs(state); + if(split_state.size != 3) + { + println("*** Client : Malformed arguements to ambient packages " + state); + } + else + { + command = split_state[0]; + package = split_state[1]; + priority = int(split_state[2]); + println("### APC : " + command + " " + package + " " + priority); + if(command == "A") + { + if ( !isdefined( level.ambientPackages[package] ) ) + { + assertmsg( "activateAmbientPackage: must declare ambient package \"" + package + "\" in level_amb.csc main before it can be activated" ); + return; + } + for ( i = 0; i < level.ambientPackages[package].priority.size; i++ ) + { + if ( level.ambientPackages[package].priority[i] == priority ) + { + level.ambientPackages[package].refcount[i]++; + break; + } + } + if ( i == level.ambientPackages[package].priority.size ) + { + level.ambientPackages[package].priority[i] = priority; + level.ambientPackages[package].refcount[i] = 1; + } + level notify( "updateActiveAmbientPackage" ); + } + else if(command == "D") + { + if ( !isdefined( level.ambientPackages[package] ) ) + { + assertmsg( "deactivateAmbientPackage: must declare ambient package \"" + package + "\" in level_amb.csc main before it can be deactivated" ); + return; + } + for ( i = 0; i < level.ambientPackages[package].priority.size; i++ ) + { + if ( level.ambientPackages[package].priority[i] == priority && level.ambientPackages[package].refcount[i] ) + { + level.ambientPackages[package].refcount[i]--; + level notify( "updateActiveAmbientPackage" ); + return; + } + } + } + else + { + assertmsg("Unknown command in ambientPackageCmdHandler " + state); + return; + } + } + } +} +ambientRoomCmdHandler(clientNum, state, oldState) +{ + if(state != "") + { + split_state = splitargs(state); + if(split_state.size != 3) + { + println("*** Client : Malformed arguements to ambient packages " + state); + } + else + { + command = split_state[0]; + room = split_state[1]; + priority = int(split_state[2]); + if(command == "A") + { + if ( !isdefined( level.ambientRooms[room] ) ) + { + assertmsg( "activateAmbientRoom: must declare ambient room \"" + room + "\" in level_amb.csc main before it can be activated" ); + return; + } + for ( i = 0; i < level.ambientRooms[room].priority.size; i++ ) + { + if ( level.ambientRooms[room].priority[i] == priority ) + { + level.ambientRooms[room].refcount[i]++; + break; + } + } + if ( i == level.ambientRooms[room].priority.size ) + { + level.ambientRooms[room].priority[i] = priority; + level.ambientRooms[room].refcount[i] = 1; + } + level notify( "updateActiveAmbientRoom" ); + } + else if(command == "D") + { + if ( !isdefined( level.ambientRooms[room] ) ) + { + assertmsg( "deactivateAmbientRoom: must declare ambient room \"" + room + "\" in level_amb.csc main before it can be deactivated" ); + return; + } + for ( i = 0; i < level.ambientRooms[room].priority.size; i++ ) + { + if ( level.ambientRooms[room].priority[i] == priority && level.ambientRooms[room].refcount[i] ) + { + level.ambientRooms[room].refcount[i]--; + level notify( "updateActiveAmbientRoom" ); + return; + } + } + } + else + { + assertmsg("Unknown command in ambientRoomCmdHandler " + state); + return; + } + } + } +} +ambientElementThread() +{ + level endon( "killambientElementThread" + level.activeAmbientPackage ); + timer = 0; + if ( self.distMin < 0 ) + { + for (;;) + { + timer = randomfloatrange( self.spawnMin, self.spawnMax ); + wait timer; + if( getdvarint( #"debug_audio" ) > 0 ) + { + } + playsound( 0, self.alias ); + } + } + else + { + dist = 0; + angle = 0; + offset = (0, 0, 0); + index = -1; + for (;;) + { + timer = randomfloatrange( self.spawnMin, self.spawnMax ); + wait timer; + index = getScriptOriginPoolIndex(); + if ( index >= 0 ) + { + dist = randomintrange( self.distMin, self.distMax ); + angle = randomintrange( self.angleMin, self.angleMax ); + player_angle = getlocalclientangles(0)[1]; + offset = anglestoforward( ( 0, angle + player_angle, 0 ) ); + offset = vector_scale( offset, dist ); + pos = getlocalclienteyepos(0) + offset; + setfakeentorg(0, level.ambientPackageScriptOriginPool[index].org, pos); + level.ambientPackageScriptOriginPool[index].soundId = playSound( 0, self.alias, pos ); + if( getdvarint( #"debug_audio" ) > 0 ) + { + if(level.ambientPackageScriptOriginPool[index].soundId == -1) + { + col = (0.8, 0.0, 0.0); + } + else + { + col = (0.0, 0.8, 0.0); + } + print3d (pos, "AP : " + self.alias, col, 1, 3, 30); + } + while(level.ambientPackageScriptOriginPool[index].soundId != -1) + { + wait(0.01); + } + } + } + } +} +getScriptOriginPoolIndex() +{ + for ( index = 0; index < level.ambientPackageScriptOriginPool.size; index++ ) + { + if ( !level.ambientPackageScriptOriginPool[index].inuse ) + { + level.ambientPackageScriptOriginPool[index].inuse = true; + level.ambientNumSeqMissedSounds = 0; + return index; + } + } + level.ambientNumMissedSounds++; + level.ambientNumSeqMissedSounds++; + if( getdvarint( #"debug_audio" ) > 0 ) + { + } + return -1; +} +scriptOriginPoolThread() +{ + for (;;) + { + if(self.inuse == true) + { + if(isdefined(self.soundId)) + { + if(self.SoundId != -1) + { + if(!SoundPlaying(self.soundId)) + { + self.inuse = false; + self.soundId = -1; + } + } + else + { + self.inUse = false; + } + } + } + wait(0.01); + } +} +findHighestPriorityAmbientPackage() +{ + package = ""; + priority = -1; + packageArray = getArrayKeys( level.ambientPackages ); + for ( i = 0; i < packageArray.size; i++ ) + { + for ( j = 0; j < level.ambientPackages[packageArray[i]].priority.size; j++ ) + { + if ( level.ambientPackages[packageArray[i]].refcount[j] && level.ambientPackages[packageArray[i]].priority[j] > priority ) + { + package = packageArray[i]; + priority = level.ambientPackages[packageArray[i]].priority[j]; + } + } + } + return package; +} +updateActiveAmbientPackage() +{ + for (;;) + { + level waittill( "updateActiveAmbientPackage" ); + newAmbientPackage = findHighestPriorityAmbientPackage(); + println("*** nap " + newAmbientPackage + " " + level.activeAmbientPackage); + if ( newAmbientPackage != "" && level.activeAmbientPackage != newAmbientPackage ) + { + level notify( "killambientElementThread" + level.activeAmbientPackage ); + level.activeAmbientPackage = newAmbientPackage; + array_thread( level.ambientPackages[level.activeAmbientPackage].elements, ::ambientElementThread ); + } + } +} +roomToneFadeOutTimerThread( fadeOut ) +{ + self endon( "killRoomToneFadeOutTimer" ); + wait fadeOut; + self.inuse = false; +} +findHighestPriorityAmbientRoom() +{ + room = ""; + priority = -1; + roomArray = getArrayKeys( level.ambientRooms ); + if(isdefined(roomArray)) + { + for ( i = 0; i < roomArray.size; i++ ) + { + for ( j = 0; j < level.ambientRooms[roomArray[i]].priority.size; j++ ) + { + if ( level.ambientRooms[roomArray[i]].refcount[j] ) + { + } + if ( level.ambientRooms[roomArray[i]].refcount[j] && level.ambientRooms[roomArray[i]].priority[j] > priority ) + { + room = roomArray[i]; + priority = level.ambientRooms[roomArray[i]].priority[j]; + } + } + } + } + return room; +} +saveRestore() +{ + for(;;) + { + level waittill("save_restore"); + level.activeAmbientRoom = ""; + level notify( "updateActiveAmbientRoom" ); + } +} +updateActiveAmbientRoom() +{ + for (;;) + { + newAmbientRoom = findHighestPriorityAmbientRoom(); + if(newAmbientRoom == level.activeAmbientRoom) + { + level waittill( "updateActiveAmbientRoom" ); + } + if(newAmbientRoom == level.activeAmbientRoom) + { + continue; + } + oldroom = level.ambientRooms[level.activeAmbientRoom]; + newroom = level.ambientRooms[newAmbientRoom]; + if(isdefined(oldroom) && isdefined(newroom) + && isdefined(oldroom.tone) && isdefined(newroom.tone) + && oldroom.tone == newroom.tone) + { + tmp = newroom.ent; + newroom.ent = oldroom.ent; + oldroom.ent = tmp; + } + else + { + if(isdefined(newroom) && isdefined(newroom.tone)) + { + newroom.id = playloopsound( 0, newroom.ent, newroom.tone, newroom.fadeIn ); + } + else + { + } + if(isdefined(oldroom) && isdefined(oldroom.tone)) + { + stoploopsound(0, oldroom.ent, oldroom.fadeOut); + } + else + { + } + } + if ( !isdefined( newroom ) || !isdefined( newroom.reverb ) ) + { + deactivateReverb( "snd_enveffectsprio_level", 2 ); + } + else + { + setReverb( "snd_enveffectsprio_level", newroom.reverb.reverbRoomType, newroom.reverb.dry, newroom.reverb.wet, newroom.reverb.fade ); + } + snapshot = "default"; + if( isdefined( newroom ) && isdefined( newroom.snapshot ) ) + { + snapshot = newroom.snapshot; + } + setAmbientSnapshot(snapshot); + if(isdefined(newroom) && isdefined(level.ambientContexts)) + { + contexts = getArrayKeys(level.ambientContexts); + for(i=0; i 0.0 ) + { + snapshot_value -= 0.05; + SetLevelFadeSnapshot( "fadein", snapshot_value ); + wait( 0.02 ); + } + SetLevelFadeSnapshot( "fadein", 0.0 ); + if( level.zombiemode == true ) + { + return; + } + player = getlocalplayer(0); + player waittill("respawn"); + } +} +soundRandom_Thread( localClientNum, randSound ) +{ + level endon( "save_restore" ); + if( !IsDefined( randSound.script_wait_min ) ) + { + randSound.script_wait_min = 1; + } + if( !IsDefined( randSound.script_wait_max ) ) + { + randSound.script_wait_max = 3; + } + while( 1 ) + { + wait( RandomFloatRange( randSound.script_wait_min, randSound.script_wait_max ) ); + if( !IsDefined( randSound.script_sound ) ) + { + println( "ambient sound at "+randSound.origin+" has undefined script_sound" ); + } + else + { + playsound( localClientNum, randSound.script_sound, randSound.origin ); + } + } +} +startSoundRandoms( localClientNum ) +{ + randoms = GetStructArray( "random", "script_label" ); + if( IsDefined( randoms ) && randoms.size > 0 ) + { + println( "*** Client : Initialising random sounds - " + randoms.size + " emitters." ); + for( i = 0; i < randoms.size; i++ ) + { + thread soundRandom_Thread( localClientNum, randoms[i] ); + } + } + else + { + println( "*** Client : No random sounds." ); + } +} +soundLoopThink() +{ + if( !IsDefined( self.script_sound ) ) + { + return; + } + if( !IsDefined( self.origin ) ) + { + return; + } + level endon( "save_restore" ); + notifyName = ""; + assert( IsDefined( notifyName ) ); + if( IsDefined( self.script_string ) ) + { + notifyName = self.script_string; + } + assert( IsDefined( notifyName ) ); + started = true; + if( IsDefined( self.script_int) ) + { + started = self.script_int != 0; + } + if( started ) + { + soundloopemitter( self.script_sound, self.origin ); + } + if( notifyName != "" ) + { + println( "starting loop notify" ); + for(;;) + { + level waittill( notifyName ); + if(started) + { + soundstoploopemitter( self.script_sound, self.origin ); + } + else + { + soundloopemitter( self.script_sound, self.origin ); + } + started = !started; + } + } + else + { + } +} +soundLineThink() +{ + level endon("save_restore"); + if( !IsDefined( self.target) ) + { + return; + } + target = getstruct( self.target, "targetname" ); + if( !IsDefined( target) ) + { + return; + } + notifyName = ""; + if( IsDefined( self.script_string ) ) + { + notifyName = self.script_string; + } + started = true; + if( IsDefined( self.script_int) ) + { + started = self.script_int != 0; + } + if( started ) + { + soundLineEmitter( self.script_sound, self.origin, target.origin ); + } + if( notifyName != "" ) + { + println( "starting line notify" ); + for(;;) + { + level waittill( notifyName ); + if( started ) + { + soundStopLineEmitter( self.script_sound, self.origin, target.origin ); + } + else + { + soundLineEmitter( self.script_sound, self.origin, target.origin ); + } + started = !started; + } + } + else + { + } +} +startSoundLoops() +{ + loopers = GetStructArray( "looper", "script_label" ); + if( IsDefined( loopers ) && loopers.size > 0 ) + { + delay = 0; + println( "*** Client : Initialising looper sounds - " + loopers.size + " emitters." ); + for( i = 0; i < loopers.size; i++ ) + { + loopers[i] thread soundLoopThink(); + delay += 1; + if( delay % 20 == 0 ) + { + wait( 0.01 ); + } + } + } + else + { + println( "*** Client : No looper sounds." ); + } +} +startLineEmitters() +{ + lineEmitters = GetStructArray( "line_emitter", "script_label" ); + if( IsDefined( lineEmitters ) && lineEmitters.size > 0 ) + { + delay = 0; + println( "*** Client : Initialising line emitter sounds - " + lineEmitters.size + " emitters." ); + for( i = 0; i < lineEmitters.size; i++ ) + { + lineEmitters[i] thread soundLineThink(); + delay += 1; + if( delay % 20 == 0 ) + { + wait( 0.01 ); + } + } + } + else + { + println( "*** Client : No line emitter sounds." ); + } +} +init_audio_step_triggers() +{ + waitforclient( 0 ); + trigs = GetEntArray( 0, "audio_step_trigger","targetname" ); + println( "Client : " + trigs.size + " audio_step_triggers." ); + array_thread( trigs, ::audio_step_trigger ); +} +audio_step_trigger( trig ) +{ + for(;;) + { + self waittill( "trigger", trigPlayer ); + self thread trigger_thread( trigPlayer, ::trig_enter_audio_step_trigger, ::trig_leave_audio_step_trigger ); + } +} +trig_enter_audio_step_trigger( trigPlayer ) +{ + if( !IsDefined( trigPlayer.movementtype ) ) + { + trigPlayer.movementtype = "null"; + } + if( Isdefined( self.script_label) ) + { + trigPlayer.step_sound = self.script_label; + } + if( Isdefined( self.script_sound ) && ( trigPlayer.movementtype == "sprint" ) ) + { + volume = 9; + self playsound( 0, self.script_sound, self.origin, volume ); + } +} +trig_leave_audio_step_trigger(trigPlayer) +{ + if( Isdefined( self.script_noteworthy ) && ( trigPlayer.movementtype == "sprint" ) ) + { + volume = 9; + self playsound( 0, self.script_noteworthy, self.origin, volume ); + } + trigPlayer.step_sound = "null"; +} +bump_trigger_start() +{ + bump_trigs = GetEntArray( 0, "audio_bump_trigger", "targetname" ); + for( i = 0; i < bump_trigs.size; i++) + { + bump_trigs[i] thread thread_bump_trigger(); + } +} +thread_bump_trigger() +{ + self thread bump_trigger_listener(); + if( !IsDefined( self.script_activated ) ) + { + self.script_activated = 1; + } + for(;;) + { + self waittill ( "trigger", trigPlayer ); + self thread trigger_thread( trigPlayer, ::trig_enter_bump, ::trig_leave_bump ); + } +} +trig_enter_bump( ent ) +{ + volume = get_vol_from_speed( ent ); + if( IsDefined( self.script_sound ) && self.script_activated ) + { + if( IsDefined( self.script_noteworthy ) && IsDefined(self.script_wait) && ( self.script_wait > volume ) ) + { + test_id = self playsound( 0, self.script_noteworthy,self.origin, volume ); + } + if( !IsDefined( self.script_wait ) || ( self.script_wait <= volume ) ) + { + test_id = self playsound( 0, self.script_sound, self.origin, volume ); + } + } +} +trig_leave_bump( ent ) +{ +} +bump_trigger_listener() +{ + if( IsDefined( self.script_label ) ) + { + level waittill( self.script_label ); + self.script_activated = 0; + } +} +start_player_health_snapshot() +{ + if( IsDefined( level.zombiemode ) && level.zombiemode == true ) + { + return; + } + level endon( "save_restore" ); + wait( 1 ); + max_health = GetLocalClientMaxHealth( 0 ); + last_health = 0; + health_snapshot = "pain_heavy_occlude"; + SetHealthSnapshot( health_snapshot, 0 ); + for( ;; ) + { + wait ( 0.05 ); + health = GetLocalClientHealth( 0 ); + if( health > 70 ) + { + health_scale = 0; + } + else + { + health_scale = 1 - ( health * ( 1 / 100 ) ); + } + SetHealthSnapshot( health_snapshot, health_scale ); + } +} +scale_speed(x1 ,x2 ,y1 ,y2 ,z ) +{ + if ( z < x1) + z = x1; + if ( z > x2) + z = x2; + dx = x2 - x1; + n = ( z - x1) / dx; + dy = y2 - y1; + w = (n*dy + y1); + return w; +} +get_vol_from_speed( player ) +{ + min_speed = 21; + max_speed = 285; + max_vol = 1; + min_vol = .1; + speed = player getspeed(); + if(speed == 0 ) + { + speed = 175; + } + if( IsDefined( level.footstep_vol_override ) ) + { + min_vol = .5; + } + abs_speed = absolute_value( int( speed ) ); + volume = scale_speed( min_speed, max_speed, min_vol, max_vol, abs_speed ); + return volume; +} +absolute_value( fowd ) +{ + if( fowd < 0 ) + return (fowd*-1); + else + return fowd; +} +closest_point_on_line_to_point( Point, LineStart, LineEnd ) +{ + self endon ("end line sound"); + LineMagSqrd = lengthsquared(LineEnd - LineStart); + t = ( ( ( Point[0] - LineStart[0] ) * ( LineEnd[0] - LineStart[0] ) ) + + ( ( Point[1] - LineStart[1] ) * ( LineEnd[1] - LineStart[1] ) ) + + ( ( Point[2] - LineStart[2] ) * ( LineEnd[2] - LineStart[2] ) ) ) / + ( LineMagSqrd ); + if( t < 0.0 ) + { + self.origin = LineStart; + } + else if( t > 1.0 ) + { + self.origin = LineEnd; + } + else + { + start_x = LineStart[0] + t * ( LineEnd[0] - LineStart[0] ); + start_y = LineStart[1] + t * ( LineEnd[1] - LineStart[1] ); + start_z = LineStart[2] + t * ( LineEnd[2] - LineStart[2] ); + self.origin = ( start_x, start_y, start_z ); + } +} +playloopat( localClientNum, aliasname, origin, fade ) +{ + if( !IsDefined( fade ) ) + fade = 0; + fake_ent = spawnfakeent( localClientNum ); + setfakeentorg( localClientNum, fake_ent, origin ); + playloopsound( localClientNum, fake_ent, aliasname, fade ); + return fake_ent; +} +snd_play_auto_fx( fxid, alias ) +{ + for( i = 0; i < level.createFXent.size; i++ ) + { + if( level.createFXent[i].v["fxid"] == fxid && !IsDefined( level.createFXent[i].soundEnt ) ) + { + level.createFXent[i].soundEnt = spawnFakeEnt( 0 ); + setfakeentorg( 0, level.createFXent[i].soundEnt, level.createFXent[i].v["origin"] ); + playloopsound( 0, level.createFXent[i].soundEnt, alias, .5 ); + } + } +} +snd_delete_auto_fx( fxid ) +{ + for( i = 0; i < level.createFXent.size; i++ ) + { + if( level.createFXent[i].v["fxid"] == fxid && IsDefined( level.createFXent[i].soundEnt ) ) + { + deletefakeent(0, level.createFXent[i].soundEnt); + level.createFXent[i].soundEnt = undefined; + } + } +} +snd_print_fx_id( fxid, type, ent ) +{ + printLn( "^5 ******* fxid; " + fxid + "^5 type; " + type ); +} +debug_line_emitter() +{ + while( 1 ) + { + } +} +move_sound_along_line() +{ + closest_dist = undefined; + while( 1 ) + { + self closest_point_on_line_to_point( getlocalclientpos( 0 ), self.start, self.end ); + if( IsDefined( self.fake_ent ) ) + { + setfakeentorg( self.localClientNum, self.fake_ent, self.origin ); + } + closest_dist = DistanceSquared( getlocalclientpos( 0 ), self.origin ); + if( closest_dist > 1024 * 1024 ) + { + wait( 2 ); + } + else if( closest_dist > 512 * 512 ) + { + wait( 0.2 ); + } + else + { + wait( 0.05 ); + } + } +} +line_sound_player() +{ + if( IsDefined( self.script_looping ) ) + { + self.fake_ent = spawnfakeent( self.localClientNum ); + setfakeentorg( self.localClientNum, self.fake_ent, self.origin ); + playloopsound( self.localClientNum, self.fake_ent, self.script_sound ); + } + else + { + playsound( self.localClientNum, self.script_sound, self.origin ); + } +} +soundwait( id ) +{ + while( soundplaying( id ) ) + { + wait( 0.1 ); + } +} +sound_movie_snapshot_start() +{ + while(1) + { + level waittill ("pms"); + wait(0.3); + snd_set_snapshot ("alloff_except_voice_music"); + } +} +sound_movie_snapshot_alloff_but_mid_start() +{ + while(1) + { + level waittill ("pmsao"); + wait(0.2); + snd_set_snapshot ("flashback_duck"); + } +} +sound_movie_snapshot_stop() +{ + while(1) + { + level waittill ("pmo"); + snd_set_snapshot ("default"); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_busing.csc b/BO1/PC/ZM/clientscripts/_busing.csc new file mode 100644 index 0000000..8cc09f8 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_busing.csc differ diff --git a/BO1/PC/ZM/clientscripts/_callbacks.csc b/BO1/PC/ZM/clientscripts/_callbacks.csc new file mode 100644 index 0000000..4a46747 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_callbacks.csc @@ -0,0 +1,496 @@ + +#include clientscripts\_utility; +#include clientscripts\_vehicle; +#include clientscripts\_lights; +#include clientscripts\_fx; +statechange(clientNum, system, newState) +{ + if(!isdefined(level._systemStates)) + { + level._systemStates = []; + } + if(!isdefined(level._systemStates[system])) + { + level._systemStates[system] = spawnstruct(); + } + level._systemStates[system].state = newState; + if(isdefined(level._systemStates[system].callback)) + { + [[level._systemStates[system].callback]](clientNum, newState); + } + else + { + println("*** Unhandled client system state change - " + system + " - has no registered callback function."); + } +} +maprestart() +{ + println("*** Client script VM map restart."); +} +glass_smash(org, dir) +{ + level notify("glass_smash", org, dir); +} +init_fx(clientNum) +{ + waitforclient(clientNum); + clientscripts\_fx::fx_init(clientNum); +} +AddCallback(event, func) +{ + AssertEx(IsDefined(event), "Trying to set a callback on an undefined event."); + if (!IsDefined(level._callbacks) || !IsDefined(level._callbacks[event])) + { + level._callbacks[event] = []; + } + level._callbacks[event] = add_to_array(level._callbacks[event], func, false); +} +Callback(event,clientNum) +{ + if (IsDefined(level._callbacks) && IsDefined(level._callbacks[event])) + { + for (i = 0; i < level._callbacks[event].size; i++) + { + callback = level._callbacks[event][i]; + if (IsDefined(callback)) + { + self thread [[callback]](clientNum); + } + } + } +} +localclientconnect(clientNum) +{ + println("*** Client script VM : Local client connect " + clientNum); + level.usetreadfx = 1; + if(isdefined(level._load_done) && clientNum > 0) + { + level notify( "kill_treads_forever" ); + level.usetreadfx = 0; + } + if(!isdefined(level._laststand)) + { + level._laststand = []; + } + level._laststand[clientNum] = false; + level notify("effects_init_"+clientNum); + level notify("connected", clientNum); + level thread localclientconnect_callback(clientNum); +} +localclientconnect_callback(clientNum) +{ + wait .01; + player = GetLocalPlayers()[clientNum]; + player Callback("on_player_connect",clientNum); +} +localclientdisconnect(clientNum) +{ + println("*** Client script VM : Local client disconnect " + clientNum); +} +playerspawned(localClientNum) +{ + self endon( "entityshutdown" ); + self thread clientscripts\_flamethrower_plight::play_pilot_light_fx( localClientNum ); + if(isdefined(level._faceAnimCBFunc)) + self thread [[level._faceAnimCBFunc]](localClientNum); + if(isdefined(level._playerCBFunc)) + self thread [[level._playerCBFunc]](localClientNum); + level thread localclientspawned_callback(localClientNum); +} +localclientspawned_callback(localClientNum) +{ + wait .01; + player = GetLocalPlayers()[localClientNum]; + player Callback( "playerspawned", localClientNum ); +} +CodeCallback_GibEvent( localClientNum, type, locations ) +{ + if ( isdefined( level._gibEventCBFunc ) ) + { + self thread [[level._gibEventCBFunc]]( localClientNum, type, locations ); + } +} +get_gib_def() +{ + if( !isdefined( level._gibbing_actor_models ) ) + { + return -1; + } + for ( i = 0; i < level._gibbing_actor_models.size; i++ ) + { + if ( self [[level._gibbing_actor_models[i].matches_me]]() ) + { + self._original_model = self.model; + return i; + } + } + return -1; +} +entityspawned(localClientNum) +{ + self endon( "entityshutdown" ); + if ( !isdefined( self.type ) ) + { + PrintLn( "Entity type undefined!" ); + return; + } + if ( self.type == "missile" ) + { + switch( self.weapon ) + { + case "explosive_bolt_sp": + self thread clientscripts\_explosive_bolt::spawned( localClientNum, true, false ); + break; + case "explosive_bolt_zm": + self thread clientscripts\_explosive_bolt::spawned( localClientNum, true, false ); + break; + case "explosive_bolt_upgraded_zm": + self thread clientscripts\_explosive_bolt::spawned( localClientNum, true, true ); + break; + case "crossbow_explosive_sp": + self thread clientscripts\_explosive_bolt::spawned( localClientNum, true, false ); + break; + case "crossbow_explosive_zm": + self thread clientscripts\_explosive_bolt::spawned( localClientNum, true, false ); + break; + case "crossbow_explosive_upgraded_zm": + self thread clientscripts\_explosive_bolt::spawned( localClientNum, false, true ); + break; + case "sticky_grenade_zm": + if ( isdefined( level.zombie_sticky_grenade_spawned_func ) ) + { + self thread [[level.zombie_sticky_grenade_spawned_func]]( localClientNum, true ); + } + break; + case "zombie_quantum_bomb": + if( isdefined( level.zombie_quantum_bomb_spawned_func ) ) + { + self thread [[level.zombie_quantum_bomb_spawned_func]]( localClientNum, true ); + } + } + } + if( self.type == "vehicle" ) + { + if( !isdefined( level.vehicles_inited ) ) + { + clientscripts\_vehicle::init_vehicles(); + } + clientscripts\_treadfx::loadtreadfx(self); + if( isdefined(level._customVehicleCBFunc) ) + { + self thread [[level._customVehicleCBFunc]](localClientNum); + } + if ( !( self is_plane() ) && !(self is_helicopter()) && level.usetreadfx == 1 ) + { + assert( isdefined( self.rumbleType ) ); + precacherumble( self.rumbleType ); + if( isdefined( self.exhaustfxname ) && self.exhaustfxname != "" ) + { + self.exhaust_fx = loadfx( self.exhaustfxname ); + } + self thread vehicle_treads(localClientNum); + self thread playTankExhaust(localClientNum); + self thread vehicle_rumble(localClientNum); + self thread vehicle_variants(localClientNum); + self thread vehicle_weapon_fired(); + } + else if (self is_plane()) + { + self thread aircraft_dustkick(); + } + else if(self is_helicopter()) + { + assert( isdefined( self.rumbleType ) ); + precacherumble( self.rumbleType ); + if( isdefined( self.exhaustfxname ) && self.exhaustfxname != "" ) + { + self.exhaust_fx = loadfx( self.exhaustfxname ); + } + self thread play_rotor_fx(localClientNum); + self thread delete_rotor_fx_on_save_restore(localClientNum); + self thread play_exhaust(localClientNum); + self thread aircraft_dustkick(); + self clientscripts\_helicopter_sounds::start_helicopter_sounds(); + } + self thread vehicle_clientmain(localClientNum); + } + else if (self.type == "actor" && GetDvarInt(#"zombiemode") > 0 ) + { + if(isdefined(level._zombieCBFunc)) + { + players = GetLocalPlayers(); + for ( i = 0; i < players.size; i++ ) + { + self thread [[level._zombieCBFunc]]( i ); + } + } + } + if (self.type == "actor") + { + if(isdefined(level._faceAnimCBFunc)) + self thread [[level._faceAnimCBFunc]](localClientNum); + if ( localClientNum == 0 ) + { + self._gib_def = get_gib_def(); + if( self._gib_def == -1 ) + { + PrintLn( "*** Actor with model " + self.model + " not set for client-side gibbing." ); + } + } + } + self.entity_spawned = true; + self notify("entity_spawned"); +} +entityshutdown_callback( localClientNum, entity ) +{ + if( IsDefined( level._entityShutDownCBFunc ) ) + { + [[level._entityShutDownCBFunc]]( localClientNum, entity ); + } +} +airsupport( localClientNum, x, y, z, type, yaw, team, teamfaction, owner, exittype ) +{ + pos = ( x, y, z ); + switch( teamFaction ) + { + case "v": + teamfaction = "vietcong"; + break; + case "n": + case "nva": + teamfaction = "nva"; + break; + case "j": + teamfaction = "japanese"; + break; + case "m": + teamfaction = "marines"; + break; + case "s": + teamfaction = "specops"; + break; + case "r": + teamfaction = "russian"; + break; + default: + println( "Warning: Invalid team char provided, defaulted to marines" ); + println( teamFaction + "\n" ); + teamfaction = "marines"; + break; + } + switch( team ) + { + case "x": + team = "axis"; + break; + case "l": + team = "allies"; + break; + case "r": + team = "free"; + break; + default: + println( "Invalid team used with playclientAirstike/napalm: " + team + "\n"); + team = "allies"; + break; + } + switch( exitType ) + { + case "l": + exitType = "left"; + break; + case "r": + exitType = "right"; + break; + case "s": + exitType = "straight"; + break; + case "b": + exitType = "barrelroll"; + break; + default: + println( "Warning: Incorret exit type, defaulting to left" ); + println( exitType + "\n" ); + team = "left"; + break; + } + if ( type == "n" ) + { + clientscripts\_napalm::startNapalm( localClientNum, pos, yaw, teamfaction, team, owner, exitType ); + } + else + { + println( "" ); + println( "Unhandled airsupport type, only A (airstrike) and N (napalm) supported" ); + println( type ); + println( "" ); + } +} +scriptmodelspawned(local_client_num, ent, destructable_index) +{ + if(destructable_index == 0) + return; + if(!isdefined(level.createFXent)) + return; + fixed = false; + for(i = 0; i < level.createFXent.size; i ++) + { + if(level.createFXent[i].v["type"] != "exploder") + continue; + exploder = level.createFXent[i]; + if(!isdefined(exploder.needs_fixup)) + continue; + if(exploder.needs_fixup == destructable_index) + { + exploder.v["angles"] = VectorToAngles( ent.origin - exploder.v["origin"] ); + exploder clientscripts\_fx::set_forward_and_up_vectors(); + exploder.needs_fixup = undefined; + fixed = true; + } + } +} +callback_activate_exploder(exploder_id) +{ + if(!isdefined(level._exploder_ids)) + return; + keys = getarraykeys(level._exploder_ids); + exploder = undefined; + for(i = 0; i < keys.size; i ++) + { + if(level._exploder_ids[keys[i]] == exploder_id) + { + exploder = keys[i]; + break; + } + } + if(!isdefined(exploder)) + { + println("*** Client : Exploder id " + exploder_id + " unknown."); + return; + } + println("*** Client callback - activate exploder " + exploder_id + " : " + exploder); + clientscripts\_fx::activate_exploder(exploder); +} +callback_deactivate_exploder(exploder_id) +{ + if(!isdefined(level._exploder_ids)) + return; + keys = getarraykeys(level._exploder_ids); + exploder = undefined; + for(i = 0; i < keys.size; i ++) + { + if(level._exploder_ids[keys[i]] == exploder_id) + { + exploder = keys[i]; + break; + } + } + if(!isdefined(exploder)) + { + println("*** Client : Exploder id " + exploder_id + " unknown."); + return; + } + println("*** Client callback - deactivate exploder " + exploder_id + " : " + exploder); + clientscripts\_fx::deactivate_exploder(exploder); +} +level_notify(notify_name, param1, param2) +{ + level notify(notify_name, param1, param2); +} +sound_notify(client_num, entity, note ) +{ + if ( note == "sound_dogstep_run_default" ) + { + entity playsound( client_num, "fly_dog_step_run_default" ); + return true; + } + prefix = getsubstr( note, 0, 5 ); + if ( prefix != "sound" ) + return false; + alias = "aml" + getsubstr( note, 5 ); + entity play_dog_sound( client_num, alias); +} +dog_sound_print( message ) +{ +} +play_dog_sound( localClientNum, sound, position ) +{ + dog_sound_print( "SOUND " + sound); + if ( isdefined( position ) ) + { + return self playsound( localClientNum, sound, position ); + } + return self playsound( localClientNum, sound ); +} +client_flag_callback(localClientNum, flag, set, newEnt) +{ + if ((self.type == "vehicle" || self.type == "actor" || self.type == "missle") && !IsDefined(self.entity_spawned)) + { + self waittill("entity_spawned"); + } + if(isdefined(level._client_flag_callbacks) && isdefined(level._client_flag_callbacks[self.type]) && IsDefined(level._client_flag_callbacks[self.type][flag])) + { + self thread [[level._client_flag_callbacks[self.type][flag]]](localClientNum, set, newEnt); + } + else + { + } +} +client_flagasval_callback(localClientNum, val) +{ + if(isdefined(level._client_flagasval_callbacks) && isdefined(level._client_flagasval_callbacks[self.type])) + { + self thread [[level._client_flagasval_callbacks[self.type]]](localClientNum, val); + } +} +CodeCallback_PlayerFootstep(client_num, player, movementtype, ground_type, firstperson, quiet) +{ + clientscripts\_footsteps::playerFootstep(client_num, player, movementtype, ground_type, firstperson, quiet); +} +CodeCallback_CreatingCorpse(localClientNum, player ) +{ + player notify( "face", "face_death" ); +} +CodeCallback_PlayerJump(client_num, player, ground_type, firstperson, quiet) +{ + clientscripts\_footsteps::playerJump(client_num, player, ground_type, firstperson, quiet); +} +CodeCallback_PlayerLand(client_num, player, ground_type, firstperson, quiet, damagePlayer) +{ + clientscripts\_footsteps::playerLand(client_num, player, ground_type, firstperson, quiet, damagePlayer); +} +CodeCallback_PlayerFoliage(client_num, player, firstperson, quiet) +{ + clientscripts\_footsteps::playerFoliage(client_num, player, firstperson, quiet); +} +AddPlayWeaponDeathEffectsCallback(weaponname, func) +{ + if (!IsDefined(level._playweapondeatheffectscallbacks)) + { + level._playweapondeatheffectscallbacks = []; + } + level._playweapondeatheffectscallbacks[weaponname] = func; +} +CodeCallback_PlayWeaponDeathEffects( localclientnum, weaponname, userdata ) +{ + if (IsDefined(level._playweapondeatheffectscallbacks) && IsDefined(level._playweapondeatheffectscallbacks[weaponname])) + { + self thread [[level._playweapondeatheffectscallbacks[weaponname]]]( localclientnum, weaponname, userdata ); + } +} +AddPlayWeaponDamageEffectsCallback(weaponname, func) +{ + if (!IsDefined(level._playweapondamageeffectscallbacks)) + { + level._playweapondamageeffectscallbacks = []; + } + level._playweapondamageeffectscallbacks[weaponname] = func; +} +CodeCallback_PlayWeaponDamageEffects( localclientnum, weaponname, userdata ) +{ + if (IsDefined(level._playweapondamageeffectscallbacks) && IsDefined(level._playweapondamageeffectscallbacks[weaponname])) + { + self thread [[level._playweapondamageeffectscallbacks[weaponname]]]( localclientnum, weaponname, userdata ); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_clientfaceanim.csc b/BO1/PC/ZM/clientscripts/_clientfaceanim.csc new file mode 100644 index 0000000..71b1b0e Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_clientfaceanim.csc differ diff --git a/BO1/PC/ZM/clientscripts/_contextual_melee.csc b/BO1/PC/ZM/clientscripts/_contextual_melee.csc new file mode 100644 index 0000000..41c9564 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_contextual_melee.csc differ diff --git a/BO1/PC/ZM/clientscripts/_destructibles.csc b/BO1/PC/ZM/clientscripts/_destructibles.csc new file mode 100644 index 0000000..3329543 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_destructibles.csc differ diff --git a/BO1/PC/ZM/clientscripts/_explosive_bolt.csc b/BO1/PC/ZM/clientscripts/_explosive_bolt.csc new file mode 100644 index 0000000..4957667 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_explosive_bolt.csc differ diff --git a/BO1/PC/ZM/clientscripts/_face_generichuman.csc b/BO1/PC/ZM/clientscripts/_face_generichuman.csc new file mode 100644 index 0000000..a2d912c Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_face_generichuman.csc differ diff --git a/BO1/PC/ZM/clientscripts/_face_utility.csc b/BO1/PC/ZM/clientscripts/_face_utility.csc new file mode 100644 index 0000000..e1fd82d --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_face_utility.csc @@ -0,0 +1,346 @@ + +setFaceRoot( root ) +{ + if( !IsDefined( level.faceStates ) ) + { + level.faceStates = []; + } + if( !IsDefined( level.faceStates[self.face_anim_tree] ) ) + { + level.faceStates[self.face_anim_tree] = []; + } + level.faceStates[self.face_anim_tree]["face_root"] = root; +} +buildFaceState( face_state, looping, timer, priority, statetype, animation ) +{ + if( !IsDefined( level.faceStates ) ) + { + level.faceStates = []; + } + if( !IsDefined( level.faceStates[self.face_anim_tree] ) ) + { + level.faceStates[self.face_anim_tree] = []; + } + level.faceStates[self.face_anim_tree][face_state][ "looping" ] = looping; + level.faceStates[self.face_anim_tree][face_state][ "timer" ] = timer; + level.faceStates[self.face_anim_tree][face_state][ "priority" ] = priority; + level.faceStates[self.face_anim_tree][face_state][ "statetype" ] = statetype; + level.faceStates[self.face_anim_tree][face_state][ "animation" ] = []; + level.faceStates[self.face_anim_tree][face_state][ "animation" ][0] = animation; +} +addAnimToFaceState( face_state, animation ) +{ + Assert( IsDefined( level.faceStates[self.face_anim_tree][face_state] ) ); + Assert( IsDefined( level.faceStates[self.face_anim_tree][face_state]["animation"] ) ); + curr_size = level.faceStates[self.face_anim_tree][face_state][ "animation" ].size; + level.faceStates[self.face_anim_tree][face_state][ "animation" ][curr_size] = animation; +} +isHigherPriority( new_state, old_state ) +{ + if( new_state == old_state && level.faceStates[self.face_anim_tree][old_state]["looping"] ) + { + return false; + } + if( level.faceStates[self.face_anim_tree][new_state]["priority"] >= level.faceStates[self.face_anim_tree][old_state]["priority"] ) + { + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "FaceState "+new_state+" is higher priority than "+old_state+" for entity "+self GetEntityNumber() ); + } + return true; + } + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "FaceState "+new_state+" is not higher priority than "+old_state+" for entity "+self GetEntityNumber() ); + } + return false; +} +faceFrameEndNotify() +{ + self endon( "entityshutdown" ); + self endon( "stop_facial_anims" ); + level endon( "save_restore" ); + waittillframeend; + self notify( "face", "frameend" ); +} +waitForAnyPriorityReturn( prevState ) +{ + self endon( "entityshutdown" ); + self endon( "stop_facial_anims" ); + level endon( "save_restore" ); + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "Waiting for priority return for "+prevState+" for entity "+self GetEntityNumber() ); + } + while( true ) + { + self waittill( "face", newState ); + if( isHigherPriority( newState, prevState ) ) + { + break; + } + } + self thread faceFrameEndNotify(); + while( true ) + { + self waittill( "face", tempState ); + if( tempState == "frameend" ) + { + break; + } + if( isHigherPriority( tempState, newState ) ) + { + newState = tempState; + } + } + return newState; +} +waitForFaceEventRepeat( base_time ) +{ + self endon( "entityshutdown" ); + self endon( "stop_face_anims" ); + self endon( "new_face_event" ); + self endon( "face_timer_expired" ); + level endon( "save_restore" ); + state = self.face_curr_event; + while( true ) + { + self waittill( "face", newState ); + if( newState == state ) + { + self.face_timer = base_time; + } + } +} +waitForFaceEventComplete() +{ + self endon( "entityshutdown" ); + self endon( "stop_face_anims" ); + self endon( "new_face_event" ); + level endon( "save_restore" ); + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "Trying to get animation for state "+self.face_curr_event+" # "+self.face_curr_event_idx+" for entity "+self GetEntityNumber() ); + } + Assert( IsDefined( level.faceStates[self.face_anim_tree][self.face_curr_event]["animation"][self.face_curr_event_idx] ) ); + if( IsDefined( level.faceStates[self.face_anim_tree][self.face_curr_event]["timer"] ) ) + { + self.face_timer = level.faceStates[self.face_anim_tree][self.face_curr_event]["timer"]; + } + else + { + self.face_timer = GetAnimLength( level.faceStates[self.face_anim_tree][self.face_curr_event]["animation"][self.face_curr_event_idx] ); + } + base_time = self.face_timer; + if( level.faceStates[self.face_anim_tree][self.face_curr_event]["looping"] ) + { + self thread waitForFaceEventRepeat( self.face_timer ); + } + while( true ) + { + if( self.face_timer <= 0 ) + { + break; + } + wait( 0.05 ); + self.face_timer -= 0.05; + } + self notify( "face_timer_expired" ); + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "Timing out face state "+self.face_curr_event+" # "+self.face_curr_event_idx+" for entity "+self GetEntityNumber()+" after "+base_time ); + } + self.face_curr_event = undefined; + self.face_curr_event_idx = undefined; + self SetAnimKnob( level.faceStates[self.face_anim_tree][self.face_curr_base]["animation"][self.face_curr_base_idx], 1.0, 0.1, 1.0 ); + self notify( "face", "face_advance" ); +} +processFaceEvents( localClientNum ) +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + state = "face_alert"; + self.face_curr_base = "face_alert"; + numAnims = level.faceStates[self.face_anim_tree][state]["animation"].size; + self.face_curr_base_idx = RandomInt( numAnims ); + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "Starting entity "+ self GetEntityNumber() +" in state face_alert" ); + PrintLn( "Found "+numAnims+" anims for state face_alert for entity "+self GetEntityNumber() ); + PrintLn( "Selected anim "+self.face_curr_base_idx+" for entity "+self GetEntityNumber() ); + } + self SetAnimKnob( level.faceStates[self.face_anim_tree][self.face_curr_base]["animation"][self.face_curr_base_idx], 1.0, 0.0, 1.0 ); + if ( isdefined( self.face_death ) && self.face_death ) + state = "face_death"; + self.face_state = state; + self thread showState(); + self thread watchfor_death(); + while ( true ) + { + if( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + if( !IsDefined( level.faceStates ) ) + { + PrintLn( "No face state array!\n" ); + } + else if( !IsDefined( self.face_anim_tree ) ) + { + PrintLn( "No face anim tree for entity "+self GetEntityNumber() ); + } + else if( !IsDefined( state ) ) + { + PrintLn( "No face state for entity "+self GetEntityNumber() ); + } + else if( !IsDefined( level.faceStates[self.face_anim_tree] ) ) + { + PrintLn( "No face state array for anim tree "+self.face_anim_tree+" used by entity "+self GetEntityNumber() ); + } + else if( !IsDefined( level.faceStates[self.face_anim_tree][state] ) ) + { + PrintLn( "No face state array entry for state "+state+" in anim tree "+self.face_anim_tree+" for entity "+self GetEntityNumber() ); + } + } + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "Found "+numAnims+" anims for state "+state+" for entity "+self GetEntityNumber() ); + } + if( IsDefined( self.face_disable ) && self.face_disable ) + { + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "Disabling face anims for entity "+self GetEntityNumber() ); + } + setFaceState( "face_disabled" ); + self ClearAnim( level.faceStates[self.face_anim_tree][ "face_root" ], 0 ); + self notify( "stop_face_anims" ); + self.face_curr_event = undefined; + self.face_curr_event_idx = undefined; + while( self.face_disable ) + { + wait( 0.05 ); + } + } + numAnims = level.faceStates[self.face_anim_tree][state]["animation"].size; + setFaceState( state ); + if( level.faceStates[self.face_anim_tree][state]["statetype"] == "nullstate" ) + { + if( IsDefined( self.face_curr_event ) ) + { + self SetAnimKnob( level.faceStates[self.face_anim_tree][self.face_curr_event]["animation"][self.face_curr_event_idx], 1.0, 0.1, 1.0 ); + } + else if( IsDefined( self.face_curr_base ) ) + { + self SetAnimKnob( level.faceStates[self.face_anim_tree][self.face_curr_base]["animation"][self.face_curr_base_idx], 1.0, 0.1, 1.0 ); + } + } + else if( level.faceStates[self.face_anim_tree][state]["statetype"] == "exitstate" ) + { + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "Exitstate found, returning for entity "+self GetEntityNumber() ); + } + self SetAnimKnob( level.faceStates[self.face_anim_tree][state]["animation"][RandomInt(numAnims)], 1.0, 0.1, 1.0 ); + self notify( "stop_face_anims" ); + self.face_curr_event = undefined; + self.face_curr_event_idx = undefined; + return; + } + else if( level.faceStates[self.face_anim_tree][state]["statetype"] == "basestate" ) + { + if( !IsDefined( self.face_curr_base ) || self.face_curr_base != state ) + { + self.face_curr_base = state; + self.face_curr_base_idx = RandomInt( numAnims ); + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "New base face anim state "+self.face_curr_base+" anim # "+self.face_curr_base_idx+" for entity "+self GetEntityNumber() ); + } + if( !IsDefined( self.face_curr_event ) ) + { + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "trying to play animation for state "+self.face_curr_base+" w/ index "+self.face_curr_base_idx+" for entity "+self GetEntityNumber() ); + } + self SetAnimKnob( level.faceStates[self.face_anim_tree][self.face_curr_base]["animation"][self.face_curr_base_idx], 1.0, 0.1, 1.0 ); + } + } + } + else if( level.faceStates[self.face_anim_tree][state]["statetype"] == "eventstate" ) + { + if( !IsDefined( self.face_curr_event ) || !level.faceStates[self.face_anim_tree][self.face_curr_event]["looping"] || self.face_curr_event != state ) + { + self.face_curr_event= state; + self.face_curr_event_idx = RandomInt( numAnims ); + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + PrintLn( "New face anim event "+self.face_curr_event+" anim # "+self.face_curr_event_idx+" for entity "+self GetEntityNumber() ); + } + self SetFlaggedAnimKnob( "face_event", level.faceStates[self.face_anim_tree][self.face_curr_event]["animation"][self.face_curr_event_idx], 1.0, 0.1, 1.0 ); + self thread waitForFaceEventComplete(); + } + } + if( IsDefined( self.face_curr_event ) ) + { + state = self waitForAnyPriorityReturn( self.face_curr_event ); + } + else + { + state = self waitForAnyPriorityReturn( self.face_curr_base ); + } + } +} +showState( state ) +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + while ( true ) + { + if ( GetDvarInt( #"cg_debugFace" ) != 0 ) + { + if ( isdefined( self.face_state ) && isdefined( self.origin ) ) + { + entNum = self getentitynumber(); + if ( !isdefined( entNum ) ) + entNum = "?"; + if ( isdefined( self.face_disable ) && self.face_disable ) + disableChar = "-"; + else + disableChar = "+"; + if ( isdefined( self.face_death ) && self.face_death ) + deathChar = "D"; + else + deathChar = "A"; + Print3d( self.origin + ( 0, 0, 72 ), disableChar + deathChar + "["+ entNum +"]" + self.face_state, (1,1,1), 1, 0.25 ); + } + } + wait( 0.01667 ); + } +} +setFaceState( state ) +{ + if( state == "face_advance" ) + { + if( IsDefined( self.face_curr_event ) ) + { + self.face_state = self.face_curr_event; + } + else if( IsDefined( self.face_curr_base ) ) + { + self.face_state = self.face_curr_base; + } + return; + } + self.face_state = state; +} +watchfor_death() +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + if ( !isdefined( self.face_death ) ) + { + self waittillmatch( "face", "face_death" ); + self.face_death = true; + } +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_filter.csc b/BO1/PC/ZM/clientscripts/_filter.csc new file mode 100644 index 0000000..5ebfa7d --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_filter.csc @@ -0,0 +1,364 @@ + +init_filter_indices() +{ + if ( isdefined( level.genericfilterinitialized ) ) + return; + level.genericfilterinitialized = true; + level.filter_matcount = 4; + level.targetid_none = 0; + level.targerid_small0 = 1; + level.targerid_small1 = 2; + level.targerid_scene = 3; + level.targerid_postsun = 4; + level.targerid_smallblur = 5; +} +map_material_helper( player, materialname ) +{ + level.filter_matid[materialname] = level.filter_matcount; + player map_material( level.filter_matcount, materialname ); + level.filter_matcount++; +} +init_filter_binoculars( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_binoculars" ); +} +enable_filter_binoculars( player, filterid, overlayid ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_binoculars"], level.targerid_scene, level.targerid_scene, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); +} +disable_filter_binoculars( player, filterid, overlayid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); +} +init_filter_warp_sr71( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_warp_sr71" ); +} +set_filter_warp_sr71_amount( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 0, amount ); +} +enable_filter_warp_sr71( player, filterid, amount ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_warp_sr71"], level.targerid_scene, level.targerid_smallblur, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + set_filter_warp_sr71_amount( player, filterid, amount ); +} +disable_filter_warp_sr71( player, filterid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); +} +init_filter_frost( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_frost" ); +} +set_filter_frost_opacity( player, filterid, opacity ) +{ + player set_filter_pass_constant( filterid, 0, 0, opacity ); +} +enable_filter_frost( player, filterid, opacity ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_frost"], level.targerid_scene, level.targerid_scene, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + set_filter_frost_opacity( player, filterid, opacity ); +} +disable_filter_frost( player, filterid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); +} +init_filter_pentagon_fullscreen( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_pentagon_fullscreen" ); +} +set_filter_pentagon_fullscreen_amount( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 0, amount ); +} +enable_filter_pentagon_fullscreen( player, filterid, amount ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_pentagon_fullscreen"], level.targerid_scene, level.targerid_scene, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + set_filter_pentagon_fullscreen_amount( player, filterid, amount ); +} +disable_filter_pentagon_fullscreen( player, filterid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); +} +init_filter_pentagon_blowout( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_pentagon_blowout" ); +} +set_filter_pentagon_blowout_amount( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 0, amount ); +} +enable_filter_pentagon_blowout( player, filterid, amount ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_pentagon_blowout"], level.targerid_scene, level.targerid_scene, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + set_filter_pentagon_blowout_amount( player, filterid, amount ); +} +disable_filter_pentagon_blowout( player, filterid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); +} +init_filter_pentagon_bulgeblur( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_pentagon_bulgeblur" ); +} +set_filter_pentagon_bulgeblur_amount( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 0, amount ); +} +enable_filter_pentagon_bulgeblur( player, filterid, amount ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_pentagon_bulgeblur"], level.targerid_scene, level.targerid_smallblur, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + set_filter_pentagon_bulgeblur_amount( player, filterid, amount ); +} +disable_filter_pentagon_bulgeblur( player, filterid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); +} +init_filter_pentagon_multicam1( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_pentagon_multicam1" ); +} +set_filter_pentagon_multicam1_amount( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 0, amount ); +} +set_filter_pentagon_multicam1_bink1( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 1, amount ); +} +set_filter_pentagon_multicam1_bink2( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 2, amount ); +} +enable_filter_pentagon_multicam1( player, filterid, amount ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_pentagon_multicam1"], level.targerid_scene, level.targerid_scene, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + set_filter_pentagon_multicam1_amount( player, filterid, amount ); +} +disable_filter_pentagon_multicam1( player, filterid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); +} +init_filter_pentagon_multicam2( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_pentagon_multicam2" ); +} +set_filter_pentagon_multicam2_amount( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 0, amount ); +} +set_filter_pentagon_multicam2_bink1( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 1, amount ); +} +set_filter_pentagon_multicam2_bink2( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 2, amount ); +} +enable_filter_pentagon_multicam2( player, filterid, amount ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_pentagon_multicam2"], level.targerid_scene, level.targerid_scene, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + set_filter_pentagon_multicam2_amount( player, filterid, amount ); +} +disable_filter_pentagon_multicam2( player, filterid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); +} +init_filter_hazmat( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_hazmat" ); + map_material_helper( player, "generic_overlay_hazmat_1" ); + map_material_helper( player, "generic_overlay_hazmat_2" ); + map_material_helper( player, "generic_overlay_hazmat_3" ); + map_material_helper( player, "generic_overlay_hazmat_4" ); +} +set_filter_hazmat_opacity( player, filterid, overlayid, opacity ) +{ + player set_filter_pass_constant( filterid, 0, 0, opacity ); + player set_overlay_constant( overlayid, 0, opacity ); +} +enable_filter_hazmat( player, filterid, overlayid, stage, opacity ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_hazmat"], level.targerid_scene, level.targerid_scene, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + if ( stage == 1 ) + player set_overlay_material( overlayid, level.filter_matid["generic_overlay_hazmat_1"], 1 ); + else if ( stage == 2 ) + player set_overlay_material( overlayid, level.filter_matid["generic_overlay_hazmat_2"], 1 ); + else if ( stage == 3 ) + player set_overlay_material( overlayid, level.filter_matid["generic_overlay_hazmat_3"], 1 ); + else if ( stage == 4 ) + player set_overlay_material( overlayid, level.filter_matid["generic_overlay_hazmat_4"], 1 ); + player set_overlay_enabled( overlayid, true ); + set_filter_hazmat_opacity( player, filterid, overlayid, opacity ); +} +disable_filter_hazmat( player, filterid, overlayid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); + player set_overlay_enabled( overlayid, false ); +} +init_filter_helmet( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_helmet" ); + map_material_helper( player, "generic_overlay_helmet" ); +} +enable_filter_helmet( player, filterid, overlayid ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_helmet"], level.targerid_scene, level.targerid_scene, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + player set_overlay_material( overlayid, level.filter_matid["generic_overlay_helmet"], 1 ); + player set_overlay_enabled( overlayid, true ); +} +disable_filter_helmet( player, filterid, overlayid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); + player set_overlay_enabled( overlayid, false ); +} +init_filter_tacticalmask( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_overlay_tacticalmask" ); +} +enable_filter_tacticalmask( player, filterid ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_overlay_tacticalmask"], level.targerid_scene, level.targerid_scene, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); +} +disable_filter_tacticalmask( player, filterid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); +} +init_filter_superflare( player, materialname ) +{ + init_filter_indices(); + map_material_helper( player, materialname ); +} +set_filter_superflare_position( player, filterid, passid, x, y, z ) +{ + player set_filter_pass_constant( filterid, passid, 0, x ); + player set_filter_pass_constant( filterid, passid, 1, y ); + player set_filter_pass_constant( filterid, passid, 2, z ); +} +set_filter_superflare_intensity( player, filterid, passid, intensity ) +{ + player set_filter_pass_constant( filterid, passid, 4, intensity ); +} +set_filter_superflare_radius( player, filterid, passid, radius ) +{ + player set_filter_pass_constant( filterid, passid, 5, radius ); +} +enable_filter_superflare( player, materialname, filterid, passid, quads, x, y, z, intensity, radius ) +{ + player set_filter_pass_material( filterid, passid, level.filter_matid[materialname], level.targerid_small0, level.targetid_none, level.targetid_none ); + player set_filter_pass_quads( filterid, passid, quads ); + player set_filter_pass_enabled( filterid, passid, true ); + set_filter_superflare_intensity( player, filterid, passid, intensity ); + set_filter_superflare_radius( player, filterid, passid, radius ); + set_filter_superflare_position( player, filterid, passid, x, y, z ); +} +disable_filter_superflare( player, materialname, filterid, passid ) +{ + player set_filter_pass_enabled( filterid, passid, false ); +} +init_filter_lensflare( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_lensflare_cutoff" ); + map_material_helper( player, "generic_filter_lensflare_flip" ); + map_material_helper( player, "generic_filter_lensflare_apply" ); +} +set_filter_lensflare_cutoff( player, filterid, cutoff ) +{ + player set_filter_pass_constant( filterid, 0, 0, cutoff ); +} +set_filter_lensflare_intensity( player, filterid, intensity ) +{ + player set_filter_pass_constant( filterid, 0, 1, intensity ); +} +set_filter_lensflare_brightness( player, filterid, brightness ) +{ + player set_filter_pass_constant( filterid, 1, 0, brightness ); +} +enable_filter_lensflare( player, filterid, cutoff, intensity, brightness ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_lensflare_cutoff"], level.targerid_small0, level.targerid_smallblur, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + player set_filter_pass_material( filterid, 1, level.filter_matid["generic_filter_lensflare_flip"], level.targerid_small0, level.targerid_small0, level.targetid_none ); + player set_filter_pass_enabled( filterid, 1, true ); + player set_filter_pass_material( filterid, 2, level.filter_matid["generic_filter_lensflare_apply"], level.targerid_scene, level.targerid_small0, level.targetid_none ); + player set_filter_pass_enabled( filterid, 2, true ); + set_filter_lensflare_cutoff( player, filterid, cutoff ); + set_filter_lensflare_intensity( player, filterid, intensity ); + set_filter_lensflare_brightness( player, filterid, brightness ); +} +disable_filter_lensflare( player, filterid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); + player set_filter_pass_enabled( filterid, 1, false ); + player set_filter_pass_enabled( filterid, 2, false ); +} +init_filter_scope( player ) +{ + init_filter_indices(); + if( !isps3() || getlocalplayers().size == 1 ) + player map_material( 0, "generic_filter_scope" ); +} +init_filter_infrared( player ) +{ + init_filter_indices(); + if( !isps3() || getlocalplayers().size == 1 ) + player map_material( 1, "generic_filter_infrared" ); +} +init_filter_tvguided( player ) +{ + init_filter_indices(); + player map_material( 2, "tow_filter_overlay" ); + player map_material( 3, "tow_overlay" ); +} +init_filter_teargas( player ) +{ + init_filter_indices(); + map_material_helper( player, "generic_filter_teargas" ); +} +set_filter_teargas_amount( player, filterid, amount ) +{ + player set_filter_pass_constant( filterid, 0, 0, amount ); +} +enable_filter_teargas( player, filterid, amount ) +{ + player set_filter_pass_material( filterid, 0, level.filter_matid["generic_filter_teargas"], level.targerid_scene, level.targerid_scene, level.targetid_none ); + player set_filter_pass_enabled( filterid, 0, true ); + set_filter_teargas_amount( player, filterid, amount ); +} +disable_filter_teargas( player, filterid ) +{ + player set_filter_pass_enabled( filterid, 0, false ); +} + + + + + + + + + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_flamethrower_plight.csc b/BO1/PC/ZM/clientscripts/_flamethrower_plight.csc new file mode 100644 index 0000000..6b82fa9 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_flamethrower_plight.csc differ diff --git a/BO1/PC/ZM/clientscripts/_footsteps.csc b/BO1/PC/ZM/clientscripts/_footsteps.csc new file mode 100644 index 0000000..97f988e Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_footsteps.csc differ diff --git a/BO1/PC/ZM/clientscripts/_fx.csc b/BO1/PC/ZM/clientscripts/_fx.csc new file mode 100644 index 0000000..7191499 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_fx.csc @@ -0,0 +1,487 @@ +#include clientscripts\_utility; +#include clientscripts\_music; +createLoopSound() +{ + ent = spawnStruct(); + if (!isdefined(level.createFXent)) + level.createFXent = []; + level.createFXent[level.createFXent.size] = ent; + ent.v = []; + ent.v["type"] = "soundfx"; + ent.v["fxid"] = "No FX"; + ent.v["soundalias"] = "nil"; + ent.v["angles"] = (0,0,0); + ent.v["origin"] = (0,0,0); + ent.drawn = true; + return ent; +} +createEffect( type, fxid ) +{ + ent = spawnStruct(); + if (!isdefined(level.createFXent)) + level.createFXent = []; + level.createFXent[level.createFXent.size] = ent; + ent.v = []; + ent.v["type"] = type; + ent.v["fxid"] = fxid; + ent.v["angles"] = (0,0,0); + ent.v["origin"] = (0,0,0); + ent.drawn = true; + return ent; +} +exploder_delay() +{ + if( !isdefined( self.v[ "delay" ] ) ) + self.v[ "delay" ] = 0; + min_delay = self.v[ "delay" ]; + max_delay = self.v[ "delay" ] + 0.001; + if( isdefined( self.v[ "delay_min" ] ) ) + min_delay = self.v[ "delay_min" ]; + if( isdefined( self.v[ "delay_max" ] ) ) + max_delay = self.v[ "delay_max" ]; + if( min_delay > 0 ) + realwait( randomfloatrange( min_delay, max_delay ) ); +} +fire_effect() +{ + forward = self.v[ "forward" ]; + up = self.v[ "up" ]; + org = undefined; + firefxSound = self.v[ "firefxsound" ]; + origin = self.v[ "origin" ]; + firefx = self.v[ "firefx" ]; + ender = self.v[ "ender" ]; + if( !isdefined( ender ) ) + ender = "createfx_effectStopper"; + timeout = self.v[ "firefxtimeout" ]; + fireFxDelay = 0.5; + if( isdefined( self.v[ "firefxdelay" ] ) ) + fireFxDelay = self.v[ "firefxdelay" ]; + self exploder_delay(); + if( isdefined( firefxSound ) ) + level thread clientscripts\_utility::loop_fx_sound( firefxSound, origin, ender, timeout ); + players = getlocalplayers(); + for(i = 0; i < players.size; i ++) + { + println("fire fx " + level._effect[ firefx ]); + playfx( i, level._effect[ firefx ], self.v[ "origin" ], forward, up ); + } +} +trail_effect() +{ + self exploder_delay(); + if( !IsDefined( self.v["trailfxtag"] ) ) + { + self.v["trailfxtag"] = "tag_origin"; + } + if(isdefined(self.v["target"])) + { + println("*** Client Trail : target defined."); + temp_ent = GetEnt(0, self.v["target"], "targetname" ); + if( IsDefined( temp_ent ) ) + { + println("*** Client : Trail found target ent."); + org = temp_ent.origin; + } + else + { + temp_ent = GetStruct( self.v["target"], "targetname" ); + org = temp_ent.origin; + } + if(isdefined(org)) + self.v["angles"] = VectorToAngles( org - self.v["origin"] ); + else + println("*** Client : Exploder " + self.v["trailfx"] + " Failed to find target " + self.v["target"]); + } + else + { + println("Client trail : target not defined."); + } + if(!isdefined(self.model)) + { + println("*** Client : Trail effect has no model."); + keys = getarraykeys(self.v); + for(i = 0; i < keys.size; i ++) + { + println(keys[i] + " " + self.v[keys[i]]); + } + return; + } + else + { + println("*** Client : I should be a " + self.v["trailfx"] + " trail, connected to " + self.model + " by the " + self.v["trailfxtag"]); + } +} +exploder_playSound() +{ + if( !isdefined( self.v[ "soundalias" ] ) || self.v[ "soundalias" ] == "nil" ) + return; + play_sound_in_space( 0, self.v[ "soundalias" ], self.v[ "origin" ] ); + println("***Client: Exploder plays sound " + self.v["soundalias"]); +} +cannon_effect() +{ + if( isdefined( self.v[ "repeat" ] ) ) + { + for( i = 0;i < self.v[ "repeat" ];i ++ ) + { + players = getlocalplayers(); + for(player = 0; player < players.size; player ++) + { + println("cannon fx " + level._effect[ self.v[ "fxid" ] ]); + playfx( player, level._effect[ self.v[ "fxid" ] ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); + } + self exploder_delay(); + } + return; + } + self exploder_delay(); + players = getlocalplayers(); + if ( isdefined( self.loopFX ) ) + { + for(i = 0; i < self.loopFX.size; i ++) + { + self.loopFX[i] delete(); + } + self.loopFX = []; + } + if(!isdefined(self.loopFX)) + { + self.loopFX = []; + } + if(!isdefined(level._effect[self.v["fxid"]])) + { + assertmsg("*** Client : Effect " + self.v["fxid"] + " not precached in level_fx.csc."); + return; + } + for(i = 0; i < players.size; i ++) + { + if(isdefined(self.v["fxid"])) + { + self.loopFX[i] = spawnFx( i, level._effect[ self.v[ "fxid" ] ], self.v[ "origin" ], self.v["delay"], self.v[ "forward" ], self.v[ "up" ] ); + triggerfx(self.loopFX[i]); + } + } + self exploder_playSound(); +} +exploder_earthquake() +{ + self exploder_delay(); + eq = level.earthquake[ self.v[ "earthquake" ] ]; + if(isdefined(eq)) + { + getlocalplayers()[0] earthquake( eq[ "magnitude" ], eq[ "duration" ], self.v[ "origin" ], eq[ "radius" ] ); + } + else + { + println("*** Client : Missing " + self.v[ "earthquake" ] + " from client side level object."); + } +} +activate_individual_exploder() +{ + if(!isdefined(self.v["angles"])) + { + self.v["angles"] = (0,0,0); + self set_forward_and_up_vectors(); + } + if( isdefined( self.v[ "firefx" ] ) ) + self thread fire_effect(); + if( isdefined( self.v[ "fxid" ] ) && self.v[ "fxid" ] != "No FX" ) + self thread cannon_effect(); + else + if( isdefined( self.v[ "soundalias" ] ) ) + { + println("** Client : missing sound_effect"); + } + if( isdefined( self.v[ "earthquake" ] ) ) + { + self thread exploder_earthquake(); + } + if( isdefined( self.v[ "rumble" ] ) ) + { + println("*** client : missing exploder_rumble"); + } +} +deactivate_exploder(num) +{ + println("*** Client : Delete exploder " + num); + num = int( num ); + for( i = 0;i < level.createFXent.size;i ++ ) + { + ent = level.createFXent[ i ]; + if( !IsDefined( ent ) ) + continue; + if( ent.v[ "type" ] != "exploder" ) + continue; + if( !isdefined( ent.v[ "exploder" ] ) ) + continue; + if( ent.v[ "exploder" ] != num ) + continue; + if(IsDefined(ent.soundEnt)) + { + deletefakeent(0, ent.soundEnt); + ent.soundEnt = undefined; + } + if(isdefined(ent.loopFX)) + { + for(j = 0; j < ent.loopFX.size; j ++) + { + if(isdefined(ent.loopFX[j])) + { + ent.loopFX[j] delete(); + ent.loopFX[j] = undefined; + } + } + ent.loopFX = []; + } + } +} +lightning(normalFunc, flashFunc) +{ + [[flashFunc]](); + realWait(RandomFloatRange( 0.05, 0.1 )); + [[normalFunc]](); +} +exploder_is_lightning_exploder(num) +{ + if (isdefined(level.lightningExploder)) + { + for(i = 0; i < level.lightningExploder.size; i ++) + { + if(level.lightningExploder[i] == num) + { + return true; + } + } + } + return false; +} +glass_exploder_watcher(num, dist, alias) +{ + ents = []; + for( i = 0;i < level.createFXent.size;i ++ ) + { + ent = level.createFXent[ i ]; + if( !IsDefined( ent ) ) + continue; + if( ent.v[ "type" ] != "exploder" ) + continue; + if( !isdefined( ent.v[ "exploder" ] ) ) + continue; + if( ent.v[ "exploder" ] != num ) + continue; + ents[ents.size] = ent; + } + if(ents.size == 0) + { + PrintLn("*** : No glass exploder with id " + num + " found."); + return; + } + dist_squared = dist * dist; + while(1) + { + level waittill("glass_smash", pos, vec); + for(i = 0; i < ents.size; i ++) + { + ds = DistanceSquared(pos, ents[i].v["origin"]); + if( ds <= dist_squared) + { + exploder(num); + if( IsDefined( alias ) ) + { + sound_ent = spawn( 0, pos, "script_origin" ); + sound_ent PlayLoopSound( alias, .25 ); + sound_ent thread delete_window_sound_ent(); + } + return; + } + } + } +} +exploder_is_glass_exploder(num, dist, alias) +{ + if(!IsDefined(dist)) + { + dist = 24; + } + level thread glass_exploder_watcher(num, dist, alias); +} +delete_window_sound_ent() +{ + wait(30); + self stoploopsound(2); + wait(2); + self Delete(); +} +activate_exploder( num ) +{ + num = int( num ); + prof_begin( "client activate_exploder" ); + for( i = 0;i < level.createFXent.size;i ++ ) + { + ent = level.createFXent[ i ]; + if( !IsDefined( ent ) ) + continue; + if( ent.v[ "type" ] != "exploder" ) + continue; + if( !isdefined( ent.v[ "exploder" ] ) ) + continue; + if( ent.v[ "exploder" ] != num ) + continue; + ent activate_individual_exploder(); + } + if(exploder_is_lightning_exploder(num)) + { + if(isdefined(level.lightningNormalFunc) && isdefined(level.lightningFlashFunc)) + { + thread lightning(level.lightningNormalFunc, level.lightningFlashFunc); + } + } + prof_end( "client activate_exploder" ); +} +exploder( num ) +{ + activate_exploder(num); +} +createOneshotEffect( fxid ) +{ + ent = createEffect( "oneshotfx", fxid ); + ent.v[ "delay" ] = -15; + return ent; +} +createLoopEffect( fxid ) +{ + ent = createEffect( "loopfx", fxid ); + ent.v[ "delay" ] = 0.5; + return ent; +} +createExploder( fxid ) +{ + ent = createEffect( "exploder", fxid ); + ent.v[ "delay" ] = 0; + ent.v[ "exploder_type" ] = "normal"; + return ent; +} +set_forward_and_up_vectors() +{ + self.v["up"] = anglestoup(self.v["angles"]); + self.v["forward"] = anglestoforward(self.v["angles"]); +} +create_triggerfx(clientNum) +{ + self.looperFX = playFx( clientNum, level._effect[self.v["fxid"]], self.v["origin"], self.v["forward"], self.v["up"], self.v["delay"] ); + create_loopsound(clientNum); +} +create_looper(clientNum) +{ + self thread loopfx(clientNum); + create_loopsound(clientNum); +} +loopfx(clientNum) +{ + self.looperFX = playFx( clientNum, level._effect[self.v["fxid"]], self.v["origin"], self.v["forward"], self.v["up"], self.v["delay"] ); + while( 1 ) + { + if( isdefined(self.v["delay"]) ) + realWait( self.v["delay"] ); + while( isfxplaying( clientNum, self.looperFX ) ) + wait 0.1; + self.looperFX = playFx( clientNum, level._effect[self.v["fxid"]], self.v["origin"], self.v["forward"], self.v["up"] ); + } +} +loopfxStop (clientNum, timeout) +{ + self endon("death"); + realwait(timeout); + if(isdefined(self.looper)) + self.looper delete(); + if(isdefined(self.looperFX)) + deletefx(clientNum, self.looperFX); +} +loopfxthread(clientNum) +{ + if (isdefined (self.fxStart)) + level waittill ("start fx" + self.fxStart); + while (1) + { + create_looper(clientNum); + if (isdefined (self.timeout)) + thread loopfxStop(clientNum, self.timeout); + if (isdefined (self.fxStop)) + level waittill ("stop fx" + self.fxStop); + else + return; + if (isdefined (self.looperFX)) + deletefx(clientNum, self.looperFX); + if (isdefined (self.fxStart)) + level waittill ("start fx" + self.fxStart); + else + return; + } +} +oneshotfxthread(clientNum) +{ + if ( self.v["delay"] > 0 ) + realWait(self.v["delay"]); + create_triggerfx(clientNum); +} +create_loopsound(clientNum) +{ + if(clientNum != 0) + return; + self notify( "stop_loop" ); + if ( isdefined( self.v["soundalias"] ) && ( self.v["soundalias"] != "nil" ) ) + { + if ( isdefined( self.v[ "stopable" ] ) && self.v[ "stopable" ] ) + { + thread clientscripts\_utility::loop_fx_sound( clientNum, self.v["soundalias"], self.v["origin"], "stop_loop" ); + } + else + { + thread clientscripts\_utility::loop_fx_sound( clientNum, self.v["soundalias"], self.v["origin"] ); + } + } +} +fx_init(clientNum) +{ + clientscripts\_lights::init_lights(clientNum); + if (!isdefined(level.createFX_enabled)) + return; + clientscripts\_destructibles::init(clientNum); + if(level.createFX_enabled) + return; + if(!isdefined(level.createFXent)) + return; + if(clientNum == 0) + { + clientscripts\_utility::init_exploders(); + } + println("*** Setting forward + up"); + for ( i=0; i 0 ) + { + println("Init Heli Sounds heli_type: " + heli_type ); + println("Init Heli Sounds part_type: " + part_type ); + println("Init Heli Sounds max_speed_vol: " + max_speed_vol ); + println("Init Heli Sounds min_vol: " + min_vol ); + println("Init Heli Sounds max_vol: " + max_vol ); + println("Init Heli Sounds max_speed_pitch: " + max_speed_pitch ); + println("Init Heli Sounds min_pitch: " + min_pitch ); + println("Init Heli Sounds max_pitch: " + max_pitch ); + } +} +init_heli_sounds_huey_toda() +{ + self setup_heli_sounds( "turbine", "engine", "snd_rotor", "veh_hind_turbine" ); + self setup_heli_sounds( "top_rotor", "engine", "snd_rotor", "veh_hind_rotor" ); + self setup_heli_sounds( "tail_rotor", "engine", "snd_tail_rotor", "veh_hind_tail" ); + self setup_heli_sounds( "lfe", "engine", "snd_rotor", "veh_hind_rotor_lfe" ); +} +init_heli_sounds_huey() +{ + self setup_heli_sounds( "cockpit", "engine", "snd_cockpit", "veh_huey_whine_int_idle" ); + self setup_heli_sounds( "cockpit2", "engine", "snd_rotor", "veh_huey_hf_int_idle" ); + self setup_heli_sounds( "int_eng", "engine", "snd_rotor", "veh_huey_lf_int_idle" ); + self setup_heli_sounds( "int_eng2", "engine", "snd_tail_rotor", "veh_huey_dist_idle" ); + self setup_heli_sounds( "int_eng3", "engine", "snd_wind_right", "veh_huey_ringing_dist" ); + self setup_heli_sounds( "ext_rotor", "engine", "snd_wind_left", "veh_huey_rotor_idle" ); +} +init_heli_sounds_hind() +{ + self setup_heli_sounds( "cockpit", "engine", "snd_cockpit", "veh_hind_whine_int_idle" ); + self setup_heli_sounds( "cockpit2", "engine", "snd_cockpit", "veh_hind_hf_int_idle" ); + self setup_heli_sounds( "int_eng", "engine", "snd_int_rotor", "veh_hind_lf_int_idle" ); + self setup_heli_sounds( "int_eng2", "engine", "snd_int_rotor", "veh_hind_dist_idle1" ); + self setup_heli_sounds( "ext_rotor", "engine", "snd_rotor", "veh_hind_rotor_idle" ); + self setup_heli_sounds( "eng_dmg", "engine", "snd_int_rotor", "veh_hind_sputter" ); + self setup_heli_sounds( "eng_dmg_alarm","engine", "snd_cockpit", "veh_hind_alarm_damage_high_loop" ); +} +init_heli_sounds_hip() +{ + self setup_heli_sounds( "turbine", "engine", "snd_rotor", "veh_hip_turbine" ); + self setup_heli_sounds( "top_rotor", "engine", "snd_rotor", "veh_hip_rotor" ); + self setup_heli_sounds( "tail_rotor", "engine", "snd_rotor", "veh_hip_tail" ); + self setup_heli_sounds( "lfe", "engine", "snd_rotor", "veh_hip_rotor_lfe" ); +} +init_heli_sounds_chinook() +{ + self setup_heli_sounds( "turbine", "engine", "tag_origin", "veh_chinook_turbine" ); + self setup_heli_sounds( "top_rotor", "engine", "main_rotor_jnt", "veh_chinook_rotor" ); + self setup_heli_sounds( "top_rotor", "engine", "tail_rotor_jnt", "veh_chinook_rotor" ); + self setup_heli_sounds( "lfe", "engine", "tag_origin", "veh_chinook_rotor_lfe" ); +} +init_heli_sounds_hind_enemy() +{ + self setup_heli_sounds( "lfe", "engine", "snd_cockpit", "veh_hind_epow_rotor_lfe" ); + self setup_heli_sounds( "turbine", "engine", "snd_rotor", "veh_hind_epow_turbine" ); + self setup_heli_sounds( "top_rotor", "engine", "snd_rotor", "veh_hind_epow_rotor" ); + self setup_heli_sounds( "tail_rotor", "engine", "snd_tail_rotor", "veh_hind_epow_tail" ); +} +init_heli_sounds_hind_vorkuta() +{ + self setup_heli_sounds( "lfe", "engine", "snd_cockpit", "veh_hind_rotor_lfe" ); + self setup_heli_sounds( "turbine", "engine", "snd_rotor", "veh_hind_turbine" ); + self setup_heli_sounds( "top_rotor", "engine", "snd_rotor", "veh_hind_rotor" ); + self setup_heli_sounds( "tail_rotor", "engine", "snd_tail_rotor", "veh_hind_tail" ); +} +init_heli_sounds_huey_player() +{ + setup_heli_sounds( "lfe", "engine", "snd_cockpit", "veh_huey_rotor_lfe" ); + setup_heli_sounds( "turbine", "engine", "snd_rotor", "veh_huey_turbine" ); + setup_heli_sounds( "top_rotor", "engine", "snd_rotor", "veh_huey_rotor" ); + setup_heli_sounds( "tail_rotor", "engine", "snd_tail_rotor", "veh_huey_tail" ); + setup_heli_sounds( "wind_rt", "engine", "snd_wind_right", "veh_huey_door_wind"); + setup_heli_sounds( "wind_lft", "engine", "snd_wind_left", "veh_huey_door_wind"); + setup_heli_sounds( "radio", "engine", "snd_cockpit", "veh_huey_radio"); +} +init_heli_sounds_zombietron() +{ + self setup_heli_sounds( "turbine", "engine", "snd_rotor", "veh_hind_turbine_zt" ); + self setup_heli_sounds( "top_rotor", "engine", "snd_rotor", "veh_hind_rotor_zt" ); +} +setup_heli_sounds( bone_location, type, tag, run, dmg1, dmg2, dmg3 ) +{ + self.heli[bone_location] = spawnStruct(); + self.heli[bone_location].sound_type = type; + self.heli[bone_location].run = spawn( 0, self.origin, "script_origin" ); + self.heli[bone_location].run linkto( self, tag ); + self.heli[bone_location].run.alias = run; + self.sound_ents[self.sound_ents.size] = self.heli[bone_location].run; + self thread delete_loop_sound_save_restore( self.heli[bone_location].run ); + if( IsDefined( dmg1 ) ) + { + self.heli[bone_location].dmg1 = spawn( 0, self.origin, "script_origin" ); + self.heli[bone_location].dmg1 linkto( self, tag ); + self.heli[bone_location].dmg1.alias = dmg1; + self.sound_ents[self.sound_ents.size] = self.heli[bone_location].dmg1; + self thread delete_loop_sound_save_restore( self.heli[bone_location].dmg1 ); + } + if( IsDefined( dmg2 ) ) + { + self.heli[bone_location].idle = spawn( 0, self.origin, "script_origin" ); + self.heli[bone_location].idle linkto( self, tag ); + self.heli[bone_location].idle.alias = dmg2; + self.sound_ents[self.sound_ents.size] = self.heli[bone_location].dmg2; + self thread delete_loop_sound_save_restore( self.heli[bone_location].dmg2 ); + } + if( IsDefined( dmg3 ) ) + { + self.heli[bone_location].idle = spawn( 0, self.origin, "script_origin" ); + self.heli[bone_location].idle linkto( self, tag ); + self.heli[bone_location].idle.alias = dmg3; + self.sound_ents[self.sound_ents.size] = self.heli[bone_location].dmg3; + self thread delete_loop_sound_save_restore( self.heli[bone_location].dmg3 ); + } +} +init_terrain_sounds() +{ + self.surface_type = []; + self.surface_type["default"] = "dirt"; + self.surface_type["metal"] = "dirt"; + self.surface_type["concrete"] = "dirt"; + self.surface_type["wood"] = "dirt"; + self.surface_type["dirt"] = "dirt"; + self.surface_type["gravel"] = "dirt"; + self.surface_type["grass"] = "dirt"; + self.surface_type["mud"] = "dirt"; + self.surface_type["snow"] = "dirt"; + self.surface_type["asphalt"] = "dirt"; + self.surface_type["brick"] = "dirt"; + self.surface_type["glass"] = "dirt"; + self.surface_type["plaster"] = "dirt"; + self.surface_type["sand"] = "dirt"; + self.surface_type["rock"] = "dirt"; + self.surface_type["water"] = "water"; + self.surface_type["foliage"] = "dirt"; + self setup_terrain_sounds( "dirt", "veh_chopper_prop_wash_dirt" ); + self setup_terrain_sounds( "water", "veh_chopper_prop_wash_water" ); +} +setup_terrain_sounds( surface_type, alias ) +{ + self.terrain_ent_array[surface_type] = spawn( 0, self.origin, "script_origin" ); + self.terrain_ent_array[surface_type].alias = alias; + self thread terrain_loop_sound_delete( self.terrain_ent_array[surface_type] ); +} +start_helicopter_sounds( localClientNum ) +{ + if( IsDefined( self.vehicletype ) ) + { + self.heli = []; + self.terrain = []; + self.sound_ents = []; + self.cur_speed = 0; + self.idle_run_trans_speed = 5; + play_terrain_sounds = true; + switch( self.vehicletype ) + { + case "zombie_cobra": + self init_heli_sounds_huey(); + self play_huey_sounds(); + printLn( "helicopter type: " + self.vehicletype + " found; playing helicopter sounds" ); + break; + case "heli_huey_small": + case "heli_huey_gunship": + self init_heli_sounds_huey(); + self play_huey_sounds(); + printLn( "helicopter type: " + self.vehicletype + " found; playing helicopter sounds" ); + break; + case "heli_hind_player": + self init_heli_sounds_hind(); + self play_hind_sounds(); + printLn( "helicopter type: " + self.vehicletype + " found; playing helicopter sounds" ); + break; + case "heli_hind": + case "heli_hind_doublesize": + case "heli_hind_doublesize_uwb": + case "heli_hind_river": + self init_heli_sounds_hind_enemy(); + self play_hind_enemy_sounds(); + printLn( "helicopter type: " + self.vehicletype + " found; playing helicopter sounds" ); + break; + case "heli_hip": + case "rebirth_heli_hip_sidegun_spotlight": + case "heli_hip_sidegun_spotlight": + case "heli_hip_noseturret": + case "heli_cobra": + case "heli_cobra_khesanh": + case "heli_hip_sidegun_uwb": + self init_heli_sounds_hip(); + self play_hip_sounds(); + printLn( "helicopter type: " + self.vehicletype + " found; playing helicopter sounds" ); + break; + case "heli_huey_assault": + case "heli_huey": + case "heli_huey_usmc_heavyhog": + case "heli_huey_usmc": + case "heli_huey_usmc_khesanh": + case "heli_huey_side_minigun": + case "heli_huey_player": + case "heli_huey_player_uwb": + case "heli_huey_heavyhog_river": + case "heli_huey_assault_river": + case "heli_huey_gunship_river": + case "heli_huey_usmc_khesanh_std": + case "heli_huey_medivac_khesanh": + case "heli_huey_usmc_heavyhog_khesanh": + case "heli_huey_medivac_river": + case "heli_huey_side_minigun_uwb": + case "heli_huey_vista": + self init_heli_sounds_huey_toda(); + self play_huey_toda_sounds(); + printLn( "helicopter type: " + self.vehicletype + " found; playing helicopter sounds" ); + break; + case "heli_chinook": + case "heli_seaknight": + self init_heli_sounds_chinook(); + self play_chinook_sounds(); + printLn( "helicopter type: " + self.vehicletype + " found; playing helicopter sounds" ); + break; + case "heli_huey_heavyhog_creek": + case "heli_huey_heavyhog": + case "heli_hip_sidegun": + case "heli_hip_spotlight": + self init_heli_sounds_hind_vorkuta(); + self play_hind_sounds_vorkuta(); + printLn( "helicopter type: " + self.vehicletype + " found; playing helicopter sounds" ); + break; + case "heli_mini_zt": + self init_heli_sounds_zombietron(); + self play_hind_sounds_zombietron(); + printLn( "helicopter type: " + self.vehicletype + " found; playing helicopter sounds" ); + break; + default: + play_terrain_sounds = false; + printLn( "^5helicopter type: " + self.vehicletype + " NOT FOUND; playing NO helicopter sounds" ); + break; + } + if( play_terrain_sounds ) + { + self init_terrain_sounds(); + self thread terrain_trace(); + } + } + else + { + printLn( "^6helicopter type: " + self.vehicletype + " not defined" ); + } +} +delete_loop_sound_save_restore( real_ent ) +{ + self endon( "heli_entityshutdown" ); + level waittill( "save_restore" ); + PrintLn( "heli_script: got save restoring" ); + if( IsDefined( real_ent ) ) + { + PrintLn( "heli_script: killing helicopter sound ent" ); + real_ent StopLoopSound( 0 ); + real_ent Delete(); + } +} +terrain_loop_sound_delete( real_ent ) +{ + self thread delete_loop_sound_save_restore( real_ent ); + level endon( "save_restore" ); + self waittill( "entityshutdown" ); + self notify( "heli_entityshutdown" ); + PrintLn( "heli_script: deleting terrain ents" ); + if( IsDefined( real_ent) ) + { + real_ent StopLoopSound( 4 ); + real_ent Delete(); + } +} +heli_linkto_sound_ents_delete( localClientNum, entity ) +{ + entity notify( "heli_entityshutdown" ); + array_thread( entity.sound_ents, ::heli_delete_sound_loops ); +} +heli_delete_sound_loops() +{ + PrintLn( "heli_script: deleting linkto ents" ); + if( IsDefined( self ) ) + { + self StopLoopSound( 4 ); + self Delete(); + } +} +play_hind_sounds() +{ + self thread heli_idle_run_transition( "hind", "cockpit" ); + self thread heli_idle_run_transition( "hind", "cockpit2"); + self thread heli_idle_run_transition( "hind", "int_eng"); + self thread heli_idle_run_transition( "hind", "int_eng2" ); + self thread heli_idle_run_transition( "hind", "ext_rotor"); +} +play_hind_enemy_sounds() +{ + self thread heli_sound_play( self.heli["lfe"] ); + self thread heli_idle_run_transition( "hind_enemy", "turbine" ); + self thread heli_idle_run_transition( "hind_enemy", "top_rotor"); + self thread heli_idle_run_transition( "hind_enemy", "tail_rotor"); +} +play_huey_sounds() +{ + self thread heli_sound_play( self.heli["lfe"] ); + self thread heli_idle_run_transition( "huey", "cockpit" ); + self thread heli_idle_run_transition( "huey", "cockpit2"); + self thread heli_idle_run_transition( "huey", "int_eng"); + self thread heli_idle_run_transition( "huey", "int_eng2" ); + self thread heli_idle_run_transition( "huey", "int_eng3"); + self thread heli_idle_run_transition( "huey", "ext_rotor" ); +} +play_hip_sounds() +{ + self thread heli_sound_play( self.heli["lfe"] ); + self thread heli_idle_run_transition( "hip", "turbine" ); + self thread heli_idle_run_transition( "hip", "top_rotor"); + self thread heli_idle_run_transition( "hip", "tail_rotor"); +} +play_huey_toda_sounds() +{ + self thread heli_sound_play( self.heli["lfe"] ); + self thread heli_idle_run_transition( "huey_toda", "turbine" ); + self thread heli_idle_run_transition( "huey_toda", "top_rotor"); + self thread heli_idle_run_transition( "huey_toda", "tail_rotor"); +} +play_chinook_sounds() +{ + self thread heli_idle_run_transition( "heli_chinook", "top_rotor"); + self thread heli_idle_run_transition( "heli_chinook", "turbine"); + self thread heli_sound_play( self.heli["lfe"] ); +} +play_hind_sounds_vorkuta() +{ + self thread heli_idle_run_transition( "hip", "turbine" ); + self thread heli_idle_run_transition( "hip", "top_rotor"); + self thread heli_idle_run_transition( "hip", "tail_rotor"); +} +play_hind_sounds_zombietron() +{ + self thread heli_idle_run_transition( "hip", "turbine" ); + self thread heli_idle_run_transition( "hip", "top_rotor"); +} +play_heli_sounds_huey_player() +{ + self heli_sound_play( self.heli["lfe"] ); + self heli_sound_play( self.heli["radio"] ); + self thread heli_idle_run_transition( "huey_player", "turbine" ); + self thread heli_idle_run_transition( "huey_player", "top_rotor"); + self thread heli_idle_run_transition( "huey_player", "tail_rotor"); + self thread heli_idle_run_transition( "huey_player", "wind_rt" ); + self thread heli_idle_run_transition( "huey_player", "wind_lft"); +} +heli_sound_play( heli_bone ) +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + while( 1 ) + { + if( IsDefined( self.should_not_play_sounds ) && self.should_not_play_sounds ) + { + heli_bone.run StopLoopSound( 0.5 ); + self waittill( "play_heli_sounds" ); + } + heli_bone.run PlayLoopSound( heli_bone.run.alias, 2 ); + self waittill( "stop_heli_sounds" ); + } +} +heli_idle_run_transition( heli_type, heli_part ) +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + MPH_TO_INCHES_PER_SEC = 17.6; + heli_bone = self.heli[heli_part]; + run_id = undefined; + heli_damage = "none"; + if( !IsDefined( level.heliSoundValues[heli_type] ) ) + { + printLn( "^5a speed vol/pitch parameter was not defined for heli_type '" + heli_type + "'." ); + return; + } + if( !IsDefined( level.heliSoundValues[heli_type][heli_part] ) ) + { + printLn( "^5a speed vol/pitch parameter was not defined for heli_type '" + heli_type + "' and heli_part '" + heli_part + "'." ); + return; + } + while( IsDefined( self ) ) + { + wait( 0.5 ); + if( IsDefined( self.should_not_play_sounds ) && self.should_not_play_sounds ) + { + heli_bone.run StopLoopSound( 0.5 ); + run_id = undefined; + self waittill( "play_heli_sounds" ); + continue; + } + if( !IsDefined( run_id ) ) + run_id = heli_bone.run PlayLoopSound( heli_bone.run.alias, 0.5 ); + max_speed_vol = level.heliSoundValues[heli_type][heli_part].speedVolumeMax; + min_vol = level.heliSoundValues[heli_type][heli_part].volumeMin; + max_vol = level.heliSoundValues[heli_type][heli_part].volumeMax; + max_speed_pitch = level.heliSoundValues[heli_type][heli_part].speedPitchMax; + min_pitch = level.heliSoundValues[heli_type][heli_part].pitchMin; + max_pitch = level.heliSoundValues[heli_type][heli_part].pitchMax; + self.cur_speed = self getspeed() / MPH_TO_INCHES_PER_SEC; + run_volume = scale_speed( self.idle_run_trans_speed, max_speed_vol, min_vol, max_vol, self.cur_speed ); + run_pitch = scale_speed( self.idle_run_trans_speed, max_speed_pitch, min_pitch, max_pitch, self.cur_speed ); + if( IsDefined( run_volume ) && IsDefined( run_pitch ) ) + { + setSoundVolume( run_id, run_volume ); + setSoundPitch( run_id, run_pitch ); + setSoundPitchRate( run_id, 0.25 ); + if( IsDefined ( self.isdamaged ) && ( heli_damage == "none" )) + { + return; + } + if( getdvarint( #"debug_heli" ) > 0 ) + { + printLn( "^5a self.cur_speed = " + self.cur_speed ); + printLn( "^5a run_pitch . " + run_pitch ); + printLn( "^5a self.cur_speed = " + self.cur_speed ); + printLn( "^5a run_volume. " + run_volume ); + } + } + } +} +terrain_trace() +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + trace = undefined; + trace_ent = self; + pre_terrain = undefined; + next_terrain = undefined; + pre_trace_real_ent = undefined; + trace_real_ent = undefined; + pre_origin = ( 100000, 100000, 100000 ); + while( IsDefined( self ) ) + { + wait( 1 + RandomFloatRange( 0.0, 0.2) ); + if( IsDefined( self.should_not_play_sounds ) && self.should_not_play_sounds ) + { + if( IsDefined( pre_trace_real_ent ) ) + pre_trace_real_ent StopLoopSound(); + if( IsDefined( trace_real_ent ) ) + trace_real_ent StopLoopSound(); + self waittill( "play_heli_sounds" ); + continue; + } + if( DistanceSquared( pre_origin, trace_ent.origin ) < 144 ) + { + continue; + } + pre_origin = trace_ent.origin; + trace = tracepoint( trace_ent.origin, trace_ent.origin - ( 0, 0, 100000 ) ); + trace_surface_type = trace["surfacetype"]; + if( !IsDefined( trace ) ) + continue; + pre_terrain = next_terrain; + next_terrain = trace_surface_type; + if( !IsDefined( pre_terrain ) || !IsDefined( next_terrain ) ) + { + continue; + } + if( !IsDefined( self.surface_type[next_terrain] ) || !IsDefined( self.surface_type[pre_terrain] ) ) + { + continue; + } + surf_type = self.surface_type[next_terrain]; + trace_real_ent = self.terrain_ent_array[surf_type]; + pre_surf_type = self.surface_type[pre_terrain]; + pre_trace_real_ent = self.terrain_ent_array[pre_surf_type]; + if( !IsDefined( trace["position"] ) ) + { + if( IsDefined( pre_trace_real_ent ) ) + { + pre_trace_real_ent StopLoopSound( 0.5 ); + } + continue; + } + trace_real_ent.origin = trace["position"]; + pre_trace_real_ent.origin = trace["position"]; + if( IsDefined( surf_type ) ) + { + if( ( surf_type == pre_surf_type ) && ( pre_trace_real_ent IsPlayingLoopSound() ) ) + continue; + pre_trace_real_ent StopLoopSound( 0.5 ); + trace_real_ent PlayLoopSound( trace_real_ent.alias, 0.5 ); + } + } +} +update_helicopter_sounds() +{ + if( IsDefined( self.engine_damage_low ) && self.engine_damage_low ) + { + switch( self.vehicletype ) + { + case "heli_hind_player": + if( !IsDefined( self.low_dmg ) ) + { + self thread heli_idle_run_transition( "hind", "eng_dmg" ); + } + self.low_dmg = true; + playsound( 0, "veh_hind_alarm_damage_high", (0,0,0) ); + level.heliSoundValues["hind"]["cockpit"].volumeMax = 1; + level.heliSoundValues["hind"]["ext_rotor"].pitchMax = 1.3; + printLn( "^5a activating heli sound damage stage 1"); + break; + default: + printLn( "^5helicopter type: " + self.vehicletype + " vehicletype; has no helicopter damage sounds" ); + break; + } + } + if( IsDefined( self.engine_damage_high ) && self.engine_damage_high && IsDefined( self.engine_damage_low ) && !self.engine_damage_low ) + { + switch( self.vehicletype ) + { + case "heli_hind_player": + level.heliSoundValues["hind"]["eng_dmg"].volumeMax = 1; + level.heliSoundValues["hind"]["ext_rotor"].pitchMax = 1.5; + wait( 0.1 ); + level.heliSoundValues["hind"]["eng_dmg"].volumeMin = 1; + printLn( "^5a activating heli sound damage stage 2"); + break; + default: + printLn( "^5helicopter type: " + self.vehicletype + " vehicletype; has no helicopter damage sounds" ); + break; + } + } + if( IsDefined( self.engine_damage_high ) && self.engine_damage_high && IsDefined( self.engine_damage_low ) && self.engine_damage_low ) + { + switch( self.vehicletype ) + { + case "heli_hind_player": + playsound( 0, "veh_hind_alarm_damage_high", (0,0,0) ); + level.heliSoundValues["hind"]["eng_dmg"].volumeMax = 1; + level.heliSoundValues["hind"]["ext_rotor"].pitchMax = 1.5; + wait( 0.1 ); + level.heliSoundValues["hind"]["eng_dmg"].volumeMin = 1; + printLn( "^5a activating heli sound damage stage 3"); + break; + default: + printLn( "^5helicopter type: " + self.vehicletype + " vehicletype; has no helicopter damage sounds" ); + break; + } + } + if( IsDefined( self.engine_damage_low ) && !self.engine_damage_low && IsDefined( self.engine_damage_high ) && !self.engine_damage_high ) + { + printLn( "^5helicopter type: " + self.vehicletype + " vehicletype; Atempting to reset Defaults" ); + switch( self.vehicletype ) + { + case "heli_hind_player": + init_heli_sound_values( "hind", "cockpit", 95, 0.6, 0.8, 95, 1, 1.1 ); + init_heli_sound_values( "hind", "cockpit2", 95, 0.5, 0.8, 95, 1, 1.2); + init_heli_sound_values( "hind", "int_eng", 65, 0.5, 0.8, 65, 1, 1.1 ); + init_heli_sound_values( "hind", "int_eng2", 65, 0.4, 0.9, 65, 1, 1.3 ); + init_heli_sound_values( "hind", "eng_dmg", 40, 0.2, 0.4, 65, 1, 1.1 ); + init_heli_sound_values( "hind", "ext_rotor", 70, 0.5, 1, 70, 0.95, 1.1); + printLn( "^5a Setting Defaults "); + break; + default: + printLn( "^5helicopter type: " + self.vehicletype + " vehicletype; has no helicopter damage sounds" ); + break; + } + } +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_lights.csc b/BO1/PC/ZM/clientscripts/_lights.csc new file mode 100644 index 0000000..76c8c7f --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_lights.csc @@ -0,0 +1,1333 @@ +#include clientscripts\_utility; +set_light_color(light_struct, col) +{ + light_struct.light_color = col; + if((self.mixer.active == 0) && (self.mixer.mix_pos == light_struct.side)) + { + for(i = 0; i < level.max_local_clients; i ++) + { + if(LocalClientActive(i) && isdefined(self.lights[i])) + { + self.lights[i] SetLightColor(col); + } + } + } +} +set_light_intensity(light_struct, intensity) +{ + if((light_struct.light_intensity > 0.05) && (intensity <= 0.05)) + { + set_light_notify(light_struct, "off"); + } + else if((light_struct.light_intensity) <= 0.05 && (intensity > 0.05)) + { + set_light_notify(light_struct, "on"); + } + intensity = Max(0, intensity); + light_struct.light_intensity = intensity; + if((self.mixer.active == 0) && (self.mixer.mix_val == light_struct.side)) + { + for(i = 0; i < level.max_local_clients; i ++) + { + if(LocalClientActive(i) && isdefined(self.lights[i])) + { + self.lights[i] SetLightIntensity(intensity); + } + } + } +} +set_light_radius(light_struct, rad) +{ + light_struct.light_radius = rad; + if((self.mixer.active == 0) && (self.mixer.mix_val == light_struct.side)) + { + for(i = 0; i < level.max_local_clients; i ++) + { + if(LocalClientActive(i) && isdefined(self.lights[i])) + { + self.lights[i] SetLightRadius(rad); + } + } + } +} +set_light_inner_fov(light_struct, inner) +{ + light_struct.light_inner_fov = inner; + if((self.mixer.active == 0) && (self.mixer.mix_val == light_struct.side)) + { + for(i = 0; i < level.max_local_clients; i ++) + { + if(LocalClientActive(i) && isdefined(self.lights[i])) + { + self.lights[i] SetLightFovRange(light_struct.light_inner_fov, light_struct.light_outer_fov); + } + } + } +} +set_light_outer_fov(light_struct, outer) +{ + light_struct.light_outer_fov = outer; + if((self.mixer.active == 0) && (self.mixer.mix_val == light_struct.side)) + { + for(i = 0; i < level.max_local_clients; i ++) + { + if(LocalClientActive(i) && isdefined(self.lights[i])) + { + self.lights[i] SetLightFovRange(light_struct.light_inner_fov, light_struct.light_outer_fov); + } + } + } +} +set_light_exponent(light_struct, exp) +{ + light_struct.light_exponent = exp; + if((self.mixer.active == 0) && (self.mixer.mix_val == light_struct.side)) + { + for(i = 0; i < level.max_local_clients; i ++) + { + if(LocalClientActive(i) && isdefined(self.lights[i])) + { + self.lights[i] SetLightExponent(exp); + } + } + } +} +set_light_notify(light_struct, name) +{ + light_struct.light_notify = name; + if(IsDefined(self.light_models)) + { + if((self.mixer.mix_pos == light_struct.side)) + { + for(i = 0; i < level.max_local_clients; i ++) + { + if(IsDefined(self.light_models[i])) + { + self.light_models[i] notify(name); + } + } + self.mixer.last_sent_notify = name; + } + } +} +play_light_sound(light_struct, sound) +{ + if((self.mixer.active == 0) && (self.mixer.mix_val == light_struct.side)) + { + PlaySound(0, sound , self.origin); + } +} +play_light_fx(light_struct, fx) +{ + if(!IsDefined(level._effect[fx])) + return; + if((self.mixer.active == 0) && (self.mixer.mix_val == light_struct.side)) + { + players = getlocalplayers(); + org = self.origin; + off = (0,0,0); + if(IsDefined(self.light_models) && IsDefined(self.light_models[0])) + { + org = self.light_models[0].origin; + if(IsDefined(self.script_light_fx_offset)) + { + atf = AnglesToForward(self.light_models[0].angles); + atr = AnglesToRight(self.light_models[0].angles); + atu = AnglesToUp(self.light_models[0].angles); + o = self.script_light_fx_offset; + off = ( (atf[0] * o[0]) + (atf[1] * o[0]) + (atf[2] * o[0]), + (atr[0] * o[1]) + (atr[1] * o[1]) + (atr[2] * o[1]), + (atu[0] * o[2]) + (atu[1] * o[2]) + (atu[2] * o[2])); + } + } + else + { + if(IsDefined(self.script_light_fx_offset)) + { + off = self.script_light_fx_offset; + } + } + for(i = 0; i < players.size; i ++) + { + PlayFX(i, level._effect[fx], org + off); + } + } +} +add_light(clientNum) +{ + light = spawn(clientNum, self.origin); + light makelight(self.pl); + if ( getdvar( #"r_reflectionProbeGenerate" ) == "1" ) + { + light setLightIntensity( 0 ); + } + return(light); +} +rotate_light_yaw() +{ + while(1) + { + for(i = 0; i < self.lights.size; i ++) + { + if(IsDefined(self.lights[i])) + { + self.lights[i] RotateYaw(360, self.script_light_rotate_yaw); + } + } + self.lights[0] waittill("rotatedone"); + } +} +create_lights(clientNum) +{ + if(!isdefined(self.lights)) + { + self.lights = []; + } + self.lights[clientNum] = self add_light(clientNum); + if(0 == clientNum && IsDefined(self.script_light_rotate_yaw)) + { + self thread rotate_light_yaw(); + } + if(isdefined(self.script_light_model) && IsDefined(self.script_light_on_model) && IsDefined(self.script_light_off_model)) + { + ent = getent(clientNum, self.script_light_model, "targetname"); + if(isdefined(ent)) + { + if(!isdefined(self.light_models)) + { + self.light_models = []; + } + while(!IsDefined(self.lights[0])) + { + wait(0.1); + } + self.light_models[clientNum] = ent; + self.light_models[clientNum] thread light_model_switch(clientNum, "on", self.script_light_on_model, self.lights[0], self.script_light_on_spin_model, self.script_light_spin_fx, self.script_light_spin_tag); + self.light_models[clientNum] thread light_model_switch(clientNum, "off", self.script_light_off_model, self.lights[0], self.script_light_off_spin_model); + } + } +} +light_off(light_struct) +{ + set_light_color(light_struct, (0,0,0)); + set_light_intensity(light_struct, 0); + level waittill("eternity"); +} +light_solid(light_struct) +{ + set_light_notify( light_struct, "on"); + level waittill("eternity"); +} +generic_pulsing(light_struct) +{ + on = light_struct.light_intensity; + off = .05; + curr = on; + transition_on = .3; + transition_off = .3; + increment_on = ( on - off ) / ( transition_on / .05 ); + increment_off = ( on - off ) / ( transition_off / .05 ); + for ( ;; ) + { + time = 0; + while ( ( time < transition_off ) ) + { + curr -= increment_off; + set_light_intensity( light_struct, curr ); + time += .05; + wait( .05 ); + } + wait( 0.25 ); + if(IsDefined(light_struct.script_light_fx)) + { + play_light_fx(light_struct, light_struct.script_light_fx); + } + time = 0; + while ( time < transition_on ) + { + curr += increment_on; + set_light_intensity( light_struct, curr ); + time += .05; + wait( .05 ); + } + wait( .75 ); + } +} +generic_double_strobe(light_struct) +{ + on = light_struct.light_intensity; + off = 0; + for ( ;; ) + { + set_light_intensity(light_struct, off); + wait( .4 ); + set_light_intensity(light_struct, on); + wait( .1 ); + set_light_intensity(light_struct, off); + wait( .15 ); + set_light_intensity(light_struct, on); + wait( .05 ); + } +} +ber3b_firelight(light_struct) +{ + full = light_struct.light_intensity; + old_intensity = full; + while( 1 ) + { + intensity = RandomFloatRange( full * 0.63, full * 1.2 ); + timer = RandomFloatRange( 2, 5 ); + for ( i = 0; i < timer; i ++ ) + { + new_intensity = intensity * ( i / timer ) + old_intensity * ( ( timer - i ) / timer ); + set_light_intensity( light_struct, new_intensity ); + wait( 0.05 ); + } + old_intensity = intensity; + } +} +generic_flickering(light_struct) +{ + if( IsDefined( light_struct.script_wait_min ) ) + { + min_flickerless_time = light_struct.script_wait_min; + } + else + { + min_flickerless_time = 0.2; + } + if( IsDefined( light_struct.script_wait_max ) ) + { + max_flickerless_time = light_struct.script_wait_max; + } + else + { + max_flickerless_time = 1.5; + } + if( IsDefined( light_struct.script_delay_min ) ) + { + min_flicker_delay = light_struct.script_delay_min; + } + else + { + min_flicker_delay = 0.05; + } + if( IsDefined( light_struct.script_delay_max ) ) + { + max_flicker_delay = light_struct.script_delay_max; + } + else + { + max_flicker_delay = 0.1; + } + if( IsDefined( light_struct.script_intensity_min ) ) + { + min_intensity = light_struct.script_intensity_min; + } + else + { + min_intensity = 0; + } + if( IsDefined( light_struct.script_intensity_max ) ) + { + max_intensity = light_struct.script_intensity_max; + } + else + { + max_intensity = 0.3; + } + if( IsDefined( light_struct.script_burst_min ) ) + { + min_burst = light_struct.script_burst_min; + } + else + { + min_burst = 1; + } + if( IsDefined( light_struct.script_burst_max ) ) + { + max_burst = light_struct.script_burst_max; + } + else + { + max_burst = 10; + } + on = light_struct.light_intensity; + off = 0; + curr = on; + num = 0; + for( ;; ) + { + num = RandomIntRange( min_burst, max_burst ); + while( num ) + { + wait( RandomFloatRange( min_flicker_delay, max_flicker_delay ) ); + if( curr > ( on * 0.5 ) ) + { + curr = RandomFloatRange( min_intensity, max_intensity ); + } + else + { + curr = on; + } + set_light_intensity(light_struct, curr); + num--; + } + set_light_intensity(light_struct, on); + wait( RandomFloatRange( min_flickerless_time, max_flickerless_time ) ); + } +} +fade_off_burst_intensity(light_struct, burst_intensity, min_intensity, fade_duration) +{ + min_intensity = Min(burst_intensity, min_intensity); + max_intensity = Max(burst_intensity, min_intensity); + fade_duration = fade_duration / 20; + step = (max_intensity - min_intensity) * fade_duration; + while(burst_intensity > min_intensity) + { + burst_intensity -= step; + set_light_intensity(light_struct, burst_intensity); + wait(0.05); + } +} +explode_then_flicker(light_struct) +{ + min_delay = 0.1; + max_delay = 0.2; + if( IsDefined( light_struct.script_delay_min ) ) + { + min_delay = light_struct.script_delay_min; + } + if( IsDefined( light_struct.script_delay_max ) ) + { + max_delay = light_struct.script_delay_max; + } + min_intensity = 0.5; + max_intensity = 1; + if( IsDefined( light_struct.script_intensity_min ) ) + { + min_intensity = light_struct.script_intensity_min; + } + if( IsDefined( light_struct.script_intensity_max ) ) + { + max_intensity = light_struct.script_intensity_max; + } + burst_time = 2.0; + if(IsDefined(light_struct.script_burst_time)) + { + burst_time = light_struct.script_burst_time; + } + fade_duration = 1.0; + if(IsDefined(light_struct.script_fade_duration)) + { + fade_duration = light_struct.script_fade_duration; + } + burst_intensity = 0.8; + if(IsDefined(light_struct.script_burst_intensity)) + { + burst_intensity = light_struct.script_burst_intensity; + } + intensity = light_struct.light_intensity; + curr_intensity = intensity; + set_light_intensity(light_struct, burst_intensity); + light_struct waittill("light_activated"); + wait(burst_time); + fade_off_burst_intensity(light_struct, burst_intensity, min_intensity, fade_duration); + realWait(0.016 * (light_struct.light_id % 3)); + for( ;; ) + { + temp_intensity = intensity * RandomFloatRange( min_intensity, max_intensity ); + time = RandomFloatRange( min_delay, max_delay ); + time = Max(time, 0.016); + steps = time * 20; + div = ( curr_intensity - temp_intensity ) / steps; + for( i = 0; i < steps; i++ ) + { + curr_intensity -= div; + if( curr_intensity < 0 ) + { + curr_intensity = 0; + } + set_light_intensity(light_struct, curr_intensity ); + realWait( 0.05 ); + } + if(isdefined(light_struct.script_light_sound)) + { + play_light_sound(light_struct, light_struct.script_light_sound); + } + curr_intensity = temp_intensity; + } +} +flicker_killer(light_struct, delay) +{ + light_struct waittill("activated"); + wait(delay); + light_struct notify("kill_flicker"); + set_light_intensity( light_struct, 0 ); +} +fire_flicker_then_stop(light_struct) +{ + light_struct endon("kill_flicker"); + min_delay = 0.1; + max_delay = 0.2; + if( IsDefined( light_struct.script_delay_min ) ) + { + min_delay = light_struct.script_delay_min; + } + if( IsDefined( light_struct.script_delay_max ) ) + { + max_delay = light_struct.script_delay_max; + } + min_intensity = 0.5; + max_intensity = 1; + if( IsDefined( light_struct.script_intensity_min ) ) + { + min_intensity = light_struct.script_intensity_min; + } + if( IsDefined( light_struct.script_intensity_max ) ) + { + max_intensity = light_struct.script_intensity_max; + } + burst_time = 2.0; + if(IsDefined(light_struct.script_burst_time)) + { + burst_time = light_struct.script_burst_time; + } + self thread flicker_killer(light_struct, burst_time); + intensity = light_struct.light_intensity; + curr_intensity = intensity; + realWait(0.016 * (light_struct.light_id % 3)); + for( ;; ) + { + temp_intensity = intensity * RandomFloatRange( min_intensity, max_intensity ); + time = RandomFloatRange( min_delay, max_delay ); + time = Max(time, 0.016); + steps = time * 20; + div = ( curr_intensity - temp_intensity ) / steps; + for( i = 0; i < steps; i++ ) + { + curr_intensity -= div; + if( curr_intensity < 0 ) + { + curr_intensity = 0; + } + set_light_intensity( light_struct, curr_intensity ); + wait( 0.05 ); + } + if(isdefined(light_struct.script_light_sound)) + { + play_light_sound(light_struct, light_struct.script_light_sound); + } + curr_intensity = temp_intensity; + } +} +electrical_flicker(light_struct) +{ + min_delay = 0.02; + max_delay = 0.1; + if( IsDefined( light_struct.script_delay_min ) ) + { + min_delay = light_struct.script_delay_min; + } + if( IsDefined( light_struct.script_delay_max ) ) + { + max_delay = light_struct.script_delay_max; + } + min_intensity = 0.25; + max_intensity = 1; + if( IsDefined( light_struct.script_intensity_min ) ) + { + min_intensity = light_struct.script_intensity_min; + } + if( IsDefined( light_struct.script_intensity_max ) ) + { + max_intensity = light_struct.script_intensity_max; + } + intensity = light_struct.light_intensity; + curr_intensity = intensity; + realWait(0.016 * (light_struct.light_id % 3)); + for( ;; ) + { + while( !ClientHasSnapshot(0) || DistanceSquared( self.origin, getlocalplayer(0).origin ) > 2250000 ) + { + wait( 2.0 ); + } + temp_intensity = intensity * RandomFloatRange( min_intensity, max_intensity ); + time = RandomFloatRange( min_delay, max_delay ); + time = Max(time, 0.016); + steps = time * 20; + div = ( curr_intensity - temp_intensity ) / steps; + for( i = 0; i < steps; i++ ) + { + curr_intensity -= div; + if( curr_intensity < 0 ) + { + curr_intensity = 0; + } + set_light_intensity( light_struct, curr_intensity ); + wait( 0.05 ); + } + if(isdefined(light_struct.script_light_sound)) + { + play_light_sound(light_struct, light_struct.script_light_sound); + } + curr_intensity = temp_intensity; + } +} +fire_flicker(light_struct) +{ + min_delay = 0.1; + max_delay = 0.2; + if( IsDefined( light_struct.script_delay_min ) ) + { + min_delay = light_struct.script_delay_min; + } + if( IsDefined( light_struct.script_delay_max ) ) + { + max_delay = light_struct.script_delay_max; + } + min_intensity = 0.5; + max_intensity = 1; + if( IsDefined( light_struct.script_intensity_min ) ) + { + min_intensity = light_struct.script_intensity_min; + } + if( IsDefined( light_struct.script_intensity_max ) ) + { + max_intensity = light_struct.script_intensity_max; + } + intensity = light_struct.light_intensity; + curr_intensity = intensity; + realWait(0.016 * (light_struct.light_id % 3)); + check_range = true; + if(isdefined(self.script_light_no_range_check)) + { + check_range = false; + } + for( ;; ) + { + if(check_range) + { + while( !ClientHasSnapshot(0) || DistanceSquared( self.origin, getlocalplayer(0).origin ) > 2250000 ) + { + wait( 2.0 ); + } + } + else + { + while( !ClientHasSnapshot(0)) + { + wait( 2.0 ); + } + } + temp_intensity = intensity * RandomFloatRange( min_intensity, max_intensity ); + time = RandomFloatRange( min_delay, max_delay ); + time = Max(time, 0.016); + steps = time * 20; + div = ( curr_intensity - temp_intensity ) / steps; + for( i = 0; i < steps; i++ ) + { + curr_intensity -= div; + if( curr_intensity < 0 ) + { + curr_intensity = 0; + } + set_light_intensity( light_struct, curr_intensity ); + wait( 0.05 ); + } + if(isdefined(light_struct.script_light_sound)) + { + play_light_sound(light_struct, light_struct.script_light_sound); + } + curr_intensity = temp_intensity; + } +} +television(light_struct) +{ + self thread tv_changes_intensity(light_struct); + self thread tv_changes_color(light_struct); +} +tv_changes_intensity(light_struct) +{ + full = light_struct.light_intensity; + old_intensity = full; + for ( ;; ) + { + intensity = randomfloatrange( full * 0.7, full * 1.2 ); + timer = randomfloatrange( 0.3, 1.2 ); + timer *= 20; + for ( i = 0; i < timer; i ++ ) + { + new_intensity = intensity * ( i / timer ) + old_intensity * ( ( timer - i ) / timer ); + set_light_intensity(light_struct, new_intensity ); + wait( 0.05 ); + } + old_intensity = intensity; + } +} +tv_changes_color(light_struct) +{ + range = 0.5; + base = 0.5; + rgb = []; + old_rgb = []; + for ( i = 0; i < 3; i++ ) + { + rgb[ i ] = 0; + old_rgb[ i ] = 0; + } + for ( ;; ) + { + for ( i = 0; i < rgb.size; i++ ) + { + old_rgb[ i ] = rgb[ i ]; + rgb[ i ] = randomfloat( range ) + base; + } + timer = randomfloatrange( 0.3, 1.2 ); + timer *= 20; + for( i = 0; i < timer; i ++ ) + { + new_rgb = []; + for ( p = 0; p < rgb.size; p++ ) + { + new_rgb[ p ] = rgb[ p ] * ( i / timer ) + old_rgb[ p ] * ( ( timer - i ) / timer ); + } + set_light_color( light_struct, ( new_rgb[ 0 ], new_rgb[ 1 ], new_rgb[ 2 ] ) ); + wait( 0.05 ); + } + } +} +triggered_lights_think(light_struct) +{ + if(!isDefined(self.script_noteworthy)) + return; + level waittill( self.script_noteworthy ); + if ( IsDefined( self.script_float ) ) + { + set_light_intensity( light_struct, self.script_float ); + } + else + { + set_light_intensity( light_struct, 1.5 ); + } +} +mixer_get_ramp() +{ + if(self.mixer.mix_pos == 0) + { + return self.mixer.right_to_left_ramp; + } + else + { + return self.mixer.left_to_right_ramp; + } +} +debug_draw_mixer() +{ +} +switch_light_once_only() +{ + if(self.script_light_onetime == 1) + { + self.script_light_onetime = -1; + return true; + } + return false; +} +mixer_level_activate() +{ + if(!isdefined(self.script_mixer_event)) + { + return; + } + while(1) + { + level waittill(self.script_mixer_event); + if(self.script_light_onetime >= 0) + { + self.mixer_activated = 1; + } + else + { + return; + } + if(switch_light_once_only()) + { + return; + } + } +} +mixer_self_activate() +{ + if(!isdefined(self.script_mixer_event)) + { + return; + } + while(1) + { + self waittill(self.script_mixer_event); + if(self.script_light_onetime >= 0) + { + self.mixer_activated = 1; + } + else + { + return; + } + if(switch_light_once_only()) + { + return; + } + } +} +mixer_event_monitor() +{ + if(!isdefined(self.script_mixer_event) && !isdefined(self.script_mixer_robot_min)) + { + return; + } + self thread debug_draw_mixer(); + self thread mixer_level_activate(); + self thread mixer_self_activate(); + self.mixer_activated = 0; + while(1) + { + self.mixer.active = 0; + while(!self.mixer_activated) + { + wait(0.01); + } + self.mixer_activated = 0; + self.mixer.active = 1; + self.mixer notify("activated"); + ramp = mixer_get_ramp(); + if(ramp) + { + start_time = GetRealTime(); + end_time = start_time + (ramp * 1000); + duration = end_time - start_time; + last_time = start_time; + if(self.mixer.mix_pos) + { + sign = -1; + } + else + { + sign = 1; + } + while(GetRealTime() < end_time) + { + time = GetRealTime(); + elapsed = time - last_time; + last_time = time; + step_size = (elapsed/duration) * sign; + self.mixer.mix_val += step_size; + wait(0.016); + } + } + self.mixer.mix_pos = !self.mixer.mix_pos; + self.mixer.lights[self.mixer.mix_pos] notify("light_activated"); + if(self.mixer.mix_pos) + { + self.mixer.mix_val = 1.0; + } + else + { + self.mixer.mix_val = 0.0; + } + } +} +init_mixer_lights(client_num) +{ + self.mixer.lights = []; + for(i = 0; i < 2; i ++) + { + self.mixer.lights[i] = spawnstruct(); + } + self.mixer.lights[0].light_color = self.lights[client_num] GetLightColor(); + self.mixer.lights[0].light_intensity = self.lights[client_num] GetLightIntensity(); + self.mixer.lights[0].light_radius = self.lights[client_num] GetLightRadius(); + self.mixer.lights[0].light_inner_fov = self.lights[client_num] GetLightFovInner(); + self.mixer.lights[0].light_outer_fov = self.lights[client_num] GetLightFovOuter(); + self.mixer.lights[0].light_exponent = self.lights[client_num] GetLightExponent(); + self.mixer.lights[0].script_delay_min = self.script_delay_min; + self.mixer.lights[0].script_delay_max = self.script_delay_max; + self.mixer.lights[0].script_intensity_min = self.script_intensity_min; + self.mixer.lights[0].script_intensity_max = self.script_intensity_max; + self.mixer.lights[0].script_burst_min = self.script_burst_min; + self.mixer.lights[0].script_burst_max = self.script_burst_max; + self.mixer.lights[0].script_burst_time = self.script_burst_time; + self.mixer.lights[0].script_fade_duration = self.script_fade_duration; + self.mixer.lights[0].script_burst_intensity = self.script_burst_intensity; + if(isdefined(self.script_light_sound)) + { + self.mixer.lights[0].script_light_sound = self.script_light_sound; + } + if(isdefined(self.script_light2_sound)) + { + self.mixer.lights[1].script_light_sound = self.script_light2_sound; + } + if(IsDefined(self.script_light_fx)) + { + self.mixer.lights[0].script_light_fx = self.script_light_fx; + } + if(IsDefined(self.script_light2_fx)) + { + self.mixer.lights[1].script_light_fx = self.script_light2_fx; + } + else + { + self.mixer.lights[1].script_light_fx = self.mixer.lights[0].script_light_fx; + } + if(IsDefined(self.script_light_fx_offset)) + { + self.mixer.lights[0].script_light_fx_offset = self.script_light_fx_offset; + self.mixer.lights[1].script_light_fx_offset = self.script_light_fx_offset; + } + if(isdefined(self.script_light2_color)) + { + self.mixer.lights[1].light_color = self.script_light2_color; + } + else + { + self.mixer.lights[1].light_color = self.mixer.lights[0].light_color; + } + if(isdefined(self.script_light2_intensity)) + { + self.mixer.lights[1].light_intensity = self.script_light2_intensity; + } + else + { + self.mixer.lights[1].light_intensity = self.mixer.lights[0].light_intensity; + } + if(isdefined(self.script_light2_radius)) + { + self.mixer.lights[1].light_radius = self.script_light2_radius; + } + else + { + self.mixer.lights[1].light_radius = self.mixer.lights[0].light_radius; + } + if(isdefined(self.script_light2_inner_fov)) + { + self.mixer.lights[1].light_inner_fov = self.script_light2_inner_fov; + } + else + { + self.mixer.lights[1].light_inner_fov = self.mixer.lights[0].light_inner_fov; + } + if(isdefined(self.script_light2_outer_fov)) + { + self.mixer.lights[1].light_outer_fov = self.script_light2_outer_fov; + } + else + { + self.mixer.lights[1].light_outer_fov = self.mixer.lights[0].light_outer_fov; + } + if(isdefined(self.script_light2_exponent)) + { + self.mixer.lights[1].light_exponent = self.script_light2_exponent; + } + else + { + self.mixer.lights[1].light_exponent = self.mixer.lights[0].light_exponent; + } + if(isdefined(self.script_light2_burst_max)) + { + self.mixer.lights[1].script_burst_max = self.script_light2_burst_max; + } + else + { + self.mixer.lights[1].script_burst_max = self.mixer.lights[0].script_burst_max; + } + if(isdefined(self.script_light2_burst_min)) + { + self.mixer.lights[1].script_burst_min = self.script_light2_burst_min; + } + else + { + self.mixer.lights[1].script_burst_min = self.mixer.lights[0].script_burst_min; + } + if(IsDefined(self.script_light2_burst_time)) + { + self.mixer.lights[1].script_burst_time = self.script_light2_burst_time; + } + else + { + self.mixer.lights[1].script_burst_time = self.mixer.lights[0].script_burst_time; + } + if(IsDefined(self.script_light2_fade_duration)) + { + self.mixer.lights[1].script_fade_duration = self.script_light2_fade_duration; + } + else + { + self.mixer.lights[1].script_fade_duration = self.mixer.lights[0].script_fade_duration; + } + if(IsDefined(self.script_light2_burst_intensity)) + { + self.mixer.lights[1].script_burst_intensity = self.script_light2_burst_intensity; + } + else + { + self.mixer.lights[1].script_burst_intensity = self.mixer.lights[0].script_burst_intensity; + } + self.mixer.lights[1].script_delay_min = self.script_light2_delay_min; + self.mixer.lights[1].script_delay_max = self.script_light2_delay_max; + self.mixer.lights[1].script_intensity_min = self.script_light2_intensity_min; + self.mixer.lights[1].script_intensity_max = self.script_light2_intensity_max; + self.mixer.lights[0].light_notify = ""; + self.mixer.lights[1].light_notify = ""; + self.mixer.lights[0].play_light_sound_alias = ""; + self.mixer.lights[1].play_light_sound_alias = ""; +} +clean_lights() +{ + self.mixer.last_mix_val = self.mixer.mix_val; +} +add_light_thread(light_struct, light_type, side, default_type) +{ + if(!IsDefined(level._next_light_id)) + { + level._next_light_id = 0; + } + light_struct.side = side; + light_struct.light_id = level._next_light_id; + level._next_light_id += 1; + if(isdefined(level._light_types[light_type])) + { + self thread [[level._light_types[light_type].func]](light_struct); + level._light_types[light_type].count[side] ++; + } + else if(isdefined(default_type)) + { + if(isdefined(level._light_types[default_type])) + { + self.script_light2_targetname = default_type; + self thread [[level._light_types[default_type].func]](light_struct); + level._light_types[default_type].count[side] ++; + } + else + { + println("*** Client : Unable to set up script thread for client light - default type " + light_type + " is unknown."); + } + } + else + { + println("*** Client : Unable to set up script thread for client light - " + light_type + " is unknown - and no default specified."); + } +} +setup_mixer_lights() +{ + light_type = self.targetname; + if( !isdefined(light_type) && !IsDefined(self.script_light_type)) + { + light_type = "light_off"; + } + else if(IsDefined(self.script_light_type) && isdefined(level._light_types[self.script_light_type])) + { + light_type = self.script_light_type; + } + add_light_thread(self.mixer.lights[0], light_type, 0); + add_light_thread(self.mixer.lights[1], self.script_light2_targetname, 1, "light_off"); +} +mixer_robot_think() +{ + if(!isdefined(self.script_mixer_robot_max)) + { + self.script_mixer_robot_max = self.script_mixer_robot_min; + } + if(self.script_mixer_robot_max < self.script_mixer_robot_min) + { + temp = self.script_mixer_robot_max; + self.script_mixer_robot_max = self.script_mixer_robot_min; + self.script_mixer_robot_min = temp; + } + if(self.script_mixer_robot_max == self.script_mixer_robot_min) + { + self.script_mixer_robot_max += 0.01; + } + while(1) + { + realwait(RandomFloatRange(self.script_mixer_robot_min, self.script_mixer_robot_max)); + self.mixer_activated = 1; + } +} +mixer_thread(client_num) +{ + if(!IsSplitScreenHost(client_num)) + { + return; + } + self.mixer = spawnstruct(); + self.mixer.mix_pos = 0; + self.mixer.mix_val = 0.0; + self.mixer.last_mix_val = 0.0; + self.mixer.active = 0; + self.mixer.last_sent_notify = ""; + if(isdefined(self.script_mixer_robot_min)) + { + self thread mixer_robot_think(); + } + init_mixer_lights(client_num); + if(!isdefined(self.script_mixer_ltr_ramp)) + { + self.script_mixer_ltr_ramp = 0.25; + } + if(!isdefined(self.script_mixer_rtl_ramp)) + { + self.script_mixer_rtl_ramp = 0.25; + } + if(isdefined(self.script_mixer_ltr_ramp)) + { + self.mixer.left_to_right_ramp = self.script_mixer_ltr_ramp; + } + if(isdefined(self.script_mixer_rtl_ramp)) + { + self.mixer.right_to_left_ramp = self.script_mixer_rtl_ramp; + } + if(!isdefined(self.script_light2_targetname)) + { + self.script_light2_targetname = ""; + } + if(!isdefined(self.script_light_onetime)) + { + self.script_light_onetime = 0; + } + setup_mixer_lights(); + self thread mixer_event_monitor(); + while(1) + { + self.mixer waittill("activated"); + while(self.mixer.active) + { + waittillframeend; + lerped_light_color = LerpVector(self.mixer.lights[0].light_color, self.mixer.lights[1].light_color, self.mixer.mix_val); + lerped_light_intensity = LerpFloat(self.mixer.lights[0].light_intensity, self.mixer.lights[1].light_intensity, self.mixer.mix_val); + lerped_light_radius = LerpFloat(self.mixer.lights[0].light_radius, self.mixer.lights[1].light_radius, self.mixer.mix_val); + lerped_light_inner_fov = LerpFloat(self.mixer.lights[0].light_inner_fov, self.mixer.lights[1].light_inner_fov, self.mixer.mix_val); + lerped_light_outer_fov = LerpFloat(self.mixer.lights[0].light_outer_fov, self.mixer.lights[1].light_outer_fov, self.mixer.mix_val); + lerped_light_exponent = int(LerpFloat(self.mixer.lights[0].light_exponent, self.mixer.lights[1].light_exponent, self.mixer.mix_val)); + for(i = 0; i < level.max_local_clients; i ++) + { + if(LocalClientActive(i) && isdefined(self.lights[i])) + { + self.lights[i] SetLightColor(lerped_light_color); + self.lights[i] SetLightIntensity(lerped_light_intensity); + self.lights[i] SetLightRadius(lerped_light_radius); + self.lights[i] SetLightFovRange(lerped_light_outer_fov, lerped_light_inner_fov); + self.lights[i] SetLightExponent(lerped_light_exponent); + } + } + wait(0.016); + } + if(IsDefined(self.light_models)) + { + if(self.mixer.last_sent_notify != "" && self.mixer.lights[self.mixer.mix_pos].light_notify != "") + { + if(self.mixer.last_sent_notify != self.mixer.lights[self.mixer.mix_pos].light_notify) + { + for(i = 0; i < level.max_local_clients; i ++) + { + if(IsDefined(self.light_models[i])) + { + self.light_models[i] notify(self.mixer.lights[self.mixer.mix_pos].light_notify); + } + } + self.mixer.last_sent_notify = self.mixer.lights[self.mixer.mix_pos].light_notify; + } + } + } + } +} +report_light_counts(clientnum, lights) +{ + if(!IsSplitScreenHost(clientnum)) + { + return; + } + lights_with_models = 0; + for(i = 0; i < lights.size; i ++) + { + if(isdefined(lights[i].script_light_model) && IsDefined(lights[i].script_light_on_model) && IsDefined(lights[i].script_light_off_model)) + { + lights_with_models ++; + } + } + numLights = lights.size; + println("*** Client : Lights " + numLights); + light_keys = GetArrayKeys(level._light_types); + for(i = 0; i < light_keys.size; i ++) + { + println("*** Client : " + light_keys[i] + " Left " + level._light_types[light_keys[i]].count[0] + " Right " + level._light_types[light_keys[i]].count[1]); + } + PrintLn("*** Client : Lights with models : " + lights_with_models); +} +register_light_type(type, func) +{ + if(!isdefined(level._light_types)) + { + level._light_types = []; + } + if(!isdefined(level._light_types[type])) + { + level._light_types[type] = spawnstruct(); + level._light_types[type].func = func; + level._light_types[type].count = []; + level._light_types[type].count[0] = 0; + level._light_types[type].count[1] = 0; + } +} +get_lights_by_label(label) +{ + lights = GetStructArray("light", "classname"); + return_array = []; + for(i = 0; i < lights.size; i ++) + { + if((isdefined(lights[i].script_light_label)) && (lights[i].script_light_label == label)) + { + return_array[return_array.size] = lights[i]; + } + } + return return_array; +} +get_lights_in_radius(pos, rad) +{ + lights = GetStructArray("light", "classname"); + return_array = []; + rad_squared = rad * rad; + for(i = 0; i < lights.size; i ++) + { + if(DistanceSquared(lights[i].origin, pos) < rad_squared) + { + return_array[return_array.size] = lights[i]; + } + } + return return_array; +} +get_labelled_lights_in_radius(label, pos, rad) +{ + lights = GetStructArray("light", "classname"); + return_array = []; + rad_squared = rad*rad; + for(i = 0; i < lights.size; i ++) + { + if((isdefined(lights[i].script_light_label)) && (lights[i].script_light_label == label)) + { + if(DistanceSquared(lights[i].origin, pos) < rad_squared) + { + return_array[return_array.size] = lights[i]; + } + } + } + return return_array; +} +switch_light_mixers(lights) +{ + if(isdefined(lights)) + { + for(i = 0; i = 0) + { + lights[i].mixer_activated = 1; + } + lights[i] switch_light_once_only(); + } + } +} +clean_up_spin_models() +{ + self waittill("destroy_spin_models"); + PrintLn("*** clean_up_spin_models"); + if(IsDefined(self.spin_models)) + { + for(i = 0; i < self.spin_models.size; i ++) + { + if(IsDefined(self.spin_models[i])) + { + self.spin_models[i] Delete(); + } + } + self.spin_models = undefined; + } +} +run_spin_model(notify_name, light, spin_model_name, spin_model_fx, spin_model_fx_tag) +{ + PrintLn("*** run spin model " + notify_name + " " + spin_model_name); + self endon("destroy_spin_models"); + self thread clean_up_spin_models(); + players = getlocalplayers(); + self.spin_models = []; + for(i = 0; i < players.size; i ++) + { + self.spin_models[i] = spawn(i, self.origin, "script_model"); + self.spin_models[i] SetModel(spin_model_name); + self.spin_models[i].angles = self.angles; + if(IsDefined(spin_model_fx) && IsDefined(level._effect[spin_model_fx]) && IsDefined(spin_model_fx_tag)) + { + PlayFXOnTag(i, level._effect[spin_model_fx], self.spin_models[i], spin_model_fx_tag); + } + } + if(notify_name == "on") + { + while(1) + { + waitforallclients(); + ang_x = self.spin_models[0].angles[0]; + ang_y = light.angles[1]; + ang_z = self.spin_models[0].angles[2]; + new_ang = (ang_x, ang_y, ang_z); + for(i = 0; i < self.spin_models.size; i ++) + { + self.spin_models[i].angles = new_ang; + } + wait(0.01); + } + } +} +light_model_switch(clientNum, notify_name, model_name, light, spin_model_name, spin_model_fx, spin_model_fx_tag) +{ + while(1) + { + self waittill(notify_name); + waitforallclients(); + PrintLn("*** Got notify name " + notify_name); + if(IsDefined(spin_model_name) && clientNum == 0) + { + self notify("destroy_spin_models"); + PrintLn("*** destroy spin models"); + waittillframeend; + self thread run_spin_model(notify_name, light, spin_model_name, spin_model_fx, spin_model_fx_tag); + } + self SetModel(model_name); + } +} +init_lights(clientNum) +{ + register_light_type("explode_then_flicker", ::explode_then_flicker); + register_light_type("firecaster", ::ber3b_firelight); + register_light_type("fire_flicker", ::fire_flicker); + register_light_type("electrical_flicker", ::electrical_flicker); + register_light_type("flicker_then_stop", ::fire_flicker_then_stop); + register_light_type("generic_double_strobe", ::generic_double_strobe); + register_light_type("generic_flickering", ::generic_flickering); + register_light_type("generic_pulsing", ::generic_pulsing); + register_light_type("light_off", ::light_off); + register_light_type("light_solid", ::light_solid); + register_light_type("television", ::television); + register_light_type("triggered_lights", ::triggered_lights_think); + lights = GetStructArray("light", "classname"); + level.max_local_clients = GetMaxLocalClients(); + if(isdefined(lights)) + { + array_thread(lights, ::create_lights, clientNum); + if ( getdvar( #"r_reflectionProbeGenerate" ) == "1" ) + { + return; + } + array_thread(lights, ::mixer_thread, clientNum); + } + report_light_counts(clientNum, lights); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_load.csc b/BO1/PC/ZM/clientscripts/_load.csc new file mode 100644 index 0000000..e5d16ab --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_load.csc @@ -0,0 +1,310 @@ + +#include clientscripts\_utility; +#include clientscripts\_lights; +#include clientscripts\_music; +#include clientscripts\_busing; +#include clientscripts\_clientfaceanim; +levelNotifyHandler(clientNum, state, oldState) +{ + if(state != "") + { + level notify(state, clientNum); + } +} +end_last_stand(clientNum) +{ + self waittill("lastStandEnd"); + println("Last stand ending for client " + clientNum); + if(getlocalplayers().size == 1) + { + setBusState("return_default"); + } + realwait(0.7); + println("Gasp."); + playsound(clientNum, "revive_gasp"); +} +last_stand_thread(clientNum) +{ + self thread end_last_stand(clientNum); + self endon("lastStandEnd"); + println("*** Client : Last stand starts on client " + clientNum); + if( IsDefined( level.zombie_intermission ) && level.zombie_intermission ) + { + setBusState("zombie_death"); + } + else if(getlocalplayers().size == 1) + { + setBusState("last_stand_start"); + realWait(0.1); + setBusState("last_stand_duration"); + } + startVol = 0.5; + maxVol = 1.0; + startPause = 0.5; + maxPause = 2.0; + pause = startPause; + vol = startVol; + while(1) + { + id = playsound(clientNum, "chr_heart_beat"); + setSoundVolume(id, vol); + realWait(pause); + if(pause < maxPause) + { + pause *= 1.05; + if(pause > maxPause) + { + pause = maxPause; + } + } + if(vol < maxVol) + { + vol *= 1.05; + if(vol > maxVol) + { + vol = maxVol; + } + } + } +} +last_stand_monitor(clientNum, state, oldState) +{ + player = getlocalplayers()[clientNum]; + players = getlocalplayers(); + if ( !isdefined( level._laststand ) ) + { + level._laststand = []; + } + if ( !isdefined( level._laststand[clientNum] ) ) + { + level._laststand[clientNum] = 0; + } + if(state == "1") + { + if(!level._laststand[clientNum]) + { + if(!isdefined(level.lslooper)) + { + level.lslooper = spawn(0, player.origin, "script.origin"); + } + player thread last_stand_thread(clientNum); + if( players.size <= 1 ) + { + level.lslooper playloopsound("evt_laststand_loop", 0.3); + } + level._laststand[clientNum] = true; + } + } + else + { + if(level._laststand[clientNum]) + { + if(isdefined(level.lslooper)) + { + level.lslooper stoploopsound(0.7); + } + player notify("lastStandEnd"); + level._laststand[clientNum] = false; + } + } +} +damage_visionset_think(local_client_num) +{ + player = getlocalplayers()[local_client_num]; + player endon("disconnect"); + level endon("save_restore"); + wait(1.0); + max_health = 100; + health_threshold = max_health * 0.75; + health_threshold_off = max_health; + visionset = false; + PrintLn("*** HTH " + health_threshold); + while(1) + { + health = GetLocalClientHealth(local_client_num); + if(visionset == false) + { + if(health < health_threshold) + { + VisionSetDamage(local_client_num, 1, "low_health", 2); + visionset = true; + } + } + else + { + if(health >= max_health) + { + PrintLn("*** VS OFF"); + VisionSetDamage(local_client_num, 0, "low_health", 2); + visionset = false; + } + } + realWait(0.01); + } +} +effects_init_thread(client, notify_name) +{ + if ( level.zombiemode && IsSplitscreen() && client == 1 ) + { + level.effects_init = undefined; + level thread effects_init_failsafe(); + } + level waittill(notify_name); + println("*** Client : Starting effects system for client " + client); + if ( level.zombiemode && IsSplitscreen() && client == 1 ) + { + level.effects_init = true; + } + clientscripts\_fx::fx_init(client); + clientscripts\_ambient::init(client); +} +effects_init_failsafe() +{ + wait( 1 ); + if ( !isdefined( level.effects_init ) ) + { + println( "**** Client : Effects never started for client 1" ); + level notify( "effects_init_1" ); + } +} +default_flag_change_handler(localClientNum, flag, set, newEnt) +{ +} +init_client_flags() +{ + level.CF_PLAYER_UNDERWATER = 15; +} +register_default_vehicle_callbacks() +{ + level._client_flag_callbacks["vehicle"] = []; + register_clientflag_callback("vehicle", 0, clientscripts\_vehicle::vehicle_flag_0_handler); + register_clientflag_callback("vehicle", 1, clientscripts\_vehicle::vehicle_flag_1_handler); + register_clientflag_callback("vehicle", 2, clientscripts\_vehicle::vehicle_flag_toggle_sounds); + register_clientflag_callback("vehicle", 3, clientscripts\_vehicle::vehicle_flag_3_handler); + register_clientflag_callback("vehicle", 4, clientscripts\_vehicle::vehicle_flag_4_handler); + register_clientflag_callback("vehicle", 6, clientscripts\_vehicle::vehicle_flag_turn_off_treadfx); + register_clientflag_callback("vehicle", 7, clientscripts\_vehicle::vehicle_flag_change_treadfx_handler); + register_clientflag_callback("vehicle", 8, clientscripts\_vehicle::vehicle_flag_toggle_exhaustfx_handler); + register_clientflag_callback("vehicle", 9, clientscripts\_vehicle::vehicle_flag_change_exhaustfx_handler); + register_clientflag_callback("vehicle", 10, clientscripts\_vehicle::vehicle_flag_toggle_lights_handler); + register_clientflag_callback("vehicle", 11, clientscripts\_vehicle::vehicle_flag_toggle_siren_lights_handler); + register_clientflag_callback("vehicle", 12, clientscripts\_vehicle::vehicle_flag_toggle_interior_lights_handler); +} +register_default_actor_callbacks() +{ + level._client_flag_callbacks["actor"] = []; +} +register_default_player_callbacks() +{ + level._client_flag_callbacks["player"] = []; + register_clientflag_callback("player", level.CF_PLAYER_UNDERWATER, ::player_underwater_flag_handler); +} +register_default_NA_callbacks() +{ + level._client_flag_callbacks["NA"] = []; +} +register_default_general_callbacks() +{ + level._client_flag_callbacks["general"] = []; +} +register_default_missile_callbacks() +{ + level._client_flag_callbacks["missile"] = []; +} +register_default_scriptmover_callbacks() +{ + level._client_flag_callbacks["scriptmover"] = []; +} +register_default_mg42_callbacks() +{ + level._client_flag_callbacks["mg42"] = []; +} +register_default_plane_callbacks() +{ + level._client_flag_callbacks["plane"] = []; + register_clientflag_callback("plane", 6, clientscripts\_vehicle::vehicle_flag_turn_off_treadfx); +} +setup_default_client_flag_callbacks() +{ + init_client_flags(); + level._client_flag_callbacks = []; + register_default_vehicle_callbacks(); + register_default_actor_callbacks(); + register_default_player_callbacks(); + register_default_NA_callbacks(); + register_default_general_callbacks(); + register_default_missile_callbacks(); + register_default_scriptmover_callbacks(); + register_default_mg42_callbacks(); + register_default_plane_callbacks(); +} +player_underwater_flag_handler(localClientNum, set, newEnt) +{ + action = "SET"; + if(!set) + { + action = "CLEAR"; + } + if(action == "SET") + { + if(isDefined(level.swimming_underwater_func)) + { + self [[level.swimming_underwater_func]](); + } + else + { + self clientscripts\_swimming::underwater(); + } + } + else + { + if(isDefined(level.swimming_surface_func)) + { + self [[level.swimming_surface_func]](); + } + else + { + self clientscripts\_swimming::surface(); + } + } +} +main() +{ + clientscripts\_utility_code::struct_class_init(); + clientscripts\_utility::registerSystem("levelNotify", ::levelNotifyHandler); + clientscripts\_utility::registerSystem("lsm", ::last_stand_monitor); + level.createFX_enabled = ( getdvar( #"createfx" ) != "" ); + level.zombiemode = ( GetDvar( #"zombiemode" ) == "1" ); + if( !isDefined( level.scr_anim ) ) + level.scr_anim[ 0 ][ 0 ] = 0; + setup_default_client_flag_callbacks(); + clientscripts\_global_fx::main(); + clientscripts\_busing::busInit(); + clientscripts\_ambientpackage::init(); + clientscripts\_music::music_init(); + clientscripts\_vehicle::init_vehicles(); + clientscripts\_contextual_melee::main(); + clientscripts\_footsteps::init(); + clientscripts\_helicopter_sounds::init(); + clientscripts\_face_generichuman::init(); + clientscripts\_clientfaceanim::init_clientfaceanim(); + if(IsDefined(level._uses_crossbow) && level._uses_crossbow == true) + { + level thread clientscripts\_explosive_bolt::main(); + } + for(i = 0; i < 4; i ++) + { + level thread effects_init_thread(i, "effects_init_"+i); + } + add_listen_thread( "rfo1", clientscripts\_utility::loop_sound_on_client, "chr_breathing_hurt", 0.3, 0.7, "rfo2" ); + add_listen_thread( "rfo3", clientscripts\_utility::play_sound_on_client, "chr_breathing_better" ); + add_listen_thread( "zi", ::zombie_intermission ); + level.onlineGame = GetDvarInt( #"onlinegame" ); + level._load_done = 1; +} +zombie_intermission() +{ + level.zombie_intermission = true; +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_meatshield.csc b/BO1/PC/ZM/clientscripts/_meatshield.csc new file mode 100644 index 0000000..e389681 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_meatshield.csc differ diff --git a/BO1/PC/ZM/clientscripts/_mortar.csc b/BO1/PC/ZM/clientscripts/_mortar.csc new file mode 100644 index 0000000..f99dee8 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_mortar.csc @@ -0,0 +1,519 @@ +#include clientscripts\_utility; +main() +{ +} +init_mortars() +{ + level._explosion_max_range = []; + level._explosion_min_range = []; + level._explosion_blast_radius = []; + level._explosion_quake_power = []; + level._explosion_quake_time = []; + level._explosion_quake_radius = []; + level._explosion_min_delay = []; + level._explosion_max_delay = []; + level._explosion_barrage_min_delay = []; + level._explosion_barrage_max_delay = []; + level._explosion_view_chance = []; + level._explosion_dust_range = []; + level._explosion_dust_name = []; +} +set_mortar_dust( mortar_name, dust_name, range ) +{ + if( !IsDefined( level._explosion_dust_range ) ) + { + init_mortars(); + } + level._explosion_dust_name[mortar_name] = dust_name; + if( !IsDefined( range ) ) + { + range = 512; + } + level._explosion_dust_range[mortar_name] = range; +} +set_mortar_quake( mortar_name, quake_power, quake_time, quake_radius, set_default ) +{ + if( !IsDefined( level._explosion_quake_power ) ) + { + init_mortars(); + } + if( IsDefined( set_default ) && set_default ) + { + if( !IsDefined( level._explosion_quake_power[mortar_name] ) ) + { + level._explosion_quake_power[mortar_name] = quake_power; + } + if( !IsDefined( level._explosion_quake_power[mortar_name] ) ) + { + level._explosion_quake_time[mortar_name] = quake_time; + } + if( !IsDefined( level._explosion_quake_radius[mortar_name] ) ) + { + level._explosion_quake_radius[mortar_name] = quake_radius; + } + } + else + { + level._explosion_quake_power[mortar_name] = quake_power; + level._explosion_quake_time[mortar_name] = quake_time; + level._explosion_quake_radius[mortar_name] = quake_radius; + } +} +set_mortar_range( mortar_name, min_range, max_range, set_default ) +{ + if( !IsDefined( level._explosion_min_range ) ) + { + init_mortars(); + } + if( IsDefined( set_default ) && set_default ) + { + if( !IsDefined( level._explosion_min_range[mortar_name] ) ) + { + level._explosion_min_range[mortar_name] = min_range; + } + if( !IsDefined( level._explosion_max_range[mortar_name] ) ) + { + level._explosion_max_range[mortar_name] = max_range; + } + } + else + { + level._explosion_min_range[mortar_name] = min_range; + level._explosion_max_range[mortar_name] = max_range; + } +} +set_mortar_delays( mortar_name, min_delay, max_delay, barrage_min_delay, barrage_max_delay, set_default ) +{ + if( !IsDefined( level._explosion_min_delay ) ) + { + init_mortars(); + } + if( IsDefined( set_default ) && set_default ) + { + if( !IsDefined( level._explosion_min_delay[mortar_name] ) && IsDefined( min_delay ) ) + { + level._explosion_min_delay[mortar_name] = min_delay; + } + if( !IsDefined( level._explosion_max_delay[mortar_name] ) && IsDefined( min_delay ) ) + { + level._explosion_max_delay[mortar_name] = max_delay; + } + if( !IsDefined( level._explosion_barrage_min_delay[mortar_name] ) && IsDefined( barrage_min_delay ) ) + { + level._explosion_barrage_min_delay[mortar_name] = barrage_min_delay; + } + if( !IsDefined( level._explosion_barrage_max_delay[mortar_name] ) && IsDefined( barrage_max_delay ) ) + { + level._explosion_barrage_max_delay[mortar_name] = barrage_max_delay; + } + } + else + { + if( IsDefined( min_delay ) ) + { + level._explosion_min_delay[mortar_name] = min_delay; + } + if( IsDefined( min_delay ) ) + { + level._explosion_max_delay[mortar_name] = max_delay; + } + if( IsDefined( barrage_min_delay ) ) + { + level._explosion_barrage_min_delay[mortar_name] = barrage_min_delay; + } + if( IsDefined( barrage_max_delay ) ) + { + level._explosion_barrage_max_delay[mortar_name] = barrage_max_delay; + } + } +} +set_mortar_chance( mortar_name, chance, set_default ) +{ + if( !IsDefined( level._explosion_view_chance ) ) + { + init_mortars(); + } + assertex( chance <= 1, "_mortar::set_mortar_chance(), the chance parameter needs to be between 0 and 1" ); + if( IsDefined( set_default ) && set_default ) + { + if( !IsDefined( level._explosion_view_chance[mortar_name] ) ) + { + level._explosion_view_chance[mortar_name] = chance; + } + } + else + { + level._explosion_view_chance[mortar_name] = chance; + } +} +player_view_chance( view_chance, explosion_point ) +{ + chance = RandomFloat( 1 ); + if( chance <= view_chance ) + { + if( within_fov( self GetEye(), self GetPlayerAngles(), explosion_point, cos( 30 ) ) ) + { + return true; + } + } + return false; +} +explosion_incoming( mortar_name, pos, soundnum ) +{ + if( !IsDefined( level._explosion_last_incoming ) ) + { + level._explosion_last_incoming = -1; + } + soundnum = RandomInt( 4 ) + 1; + while( soundnum == level._explosion_last_incoming ) + { + soundnum = RandomInt( 4 ) + 1; + } + level._explosion_last_incoming = soundnum; + if( level._effectType[mortar_name] == "mortar" ) + { + switch( soundnum ) + { + case 1: + PlaySound( 0, "mortar_incoming1", pos ); + wait( 1.07 - 0.25 ); + break; + case 2: + PlaySound( 0, "mortar_incoming2", pos ); + wait( 0.67 - 0.25 ); + break; + case 3: + PlaySound( 0, "mortar_incoming3", pos ); + wait( 1.55 - 0.25 ); + break; + default: + wait( 1.75 ); + break; + } + } + else if( level._effectType[mortar_name] == "artillery" ) + { + switch( soundnum ) + { + case 1: + PlaySound( 0, "mortar_incoming4", pos ); + wait( 1.07 - 0.25 ); + break; + case 2: + PlaySound( 0, "mortar_incoming4_new", pos ); + wait( 0.67 - 0.25 ); + break; + case 3: + PlaySound( 0, "mortar_incoming1_new", pos ); + wait( 1.55 - 0.25 ); + break; + default: + wait( 1.75 ); + break; + } + } + else if( level._effectType[mortar_name] == "bomb" ) + { + switch( soundnum ) + { + case 1: + PlaySound( 0, "mortar_incoming2_new", pos ); + wait( 1.75 ); + break; + case 2: + PlaySound( 0, "mortar_incoming3_new", pos ); + wait( 1.75 ); + break; + case 3: + PlaySound( 0, "mortar_incoming4_new", pos ); + wait( 1.75 ); + break; + default: + wait( 1.75 ); + break; + } + } +} +explosion_boom( mortar_name, explosion_origin, power, time, radius ) +{ + if( !IsDefined( power ) ) + { + power = 0.15; + } + if( !IsDefined( time ) ) + { + time = 2; + } + if( !IsDefined( radius ) ) + { + radius = 850; + } + explosion_sound( mortar_name, explosion_origin ); + PlayFx( 0, level._effect[mortar_name], explosion_origin ); + localPlayers = getlocalplayers(); + for(i = 0; i < localPlayers.size; i ++) + { + localPlayers[i] Earthquake( power, time, explosion_origin, radius ); + } +} +explosion_sound( mortar_name, pos ) +{ + if( !IsDefined( level._explosion_last_sound ) ) + { + level._explosion_last_sound = 0; + } + soundnum = RandomInt( 3 ) + 1; + while( soundnum == level._explosion_last_sound ) + { + soundnum = RandomInt( 3 ) + 1; + } + level._explosion_last_sound = soundnum; + if( level._effectType[mortar_name] == "mortar" ) + { + switch( soundnum ) + { + case 1: + PlaySound( 0, "mortar_dirt", pos ); + break; + case 2: + PlaySound( 0, "mortar_dirt", pos ); + break; + case 3: + PlaySound( 0, "mortar_dirt", pos ); + break; + } + } + if( level._effectType[mortar_name] == "mortar_water" ) + { + switch( soundnum ) + { + case 1: + PlaySound( 0, "mortar_water", pos ); + break; + case 2: + PlaySound( 0, "mortar_water", pos ); + break; + case 3: + PlaySound( 0, "mortar_water", pos ); + break; + } + } + else if( level._effectType[mortar_name] == "artillery" ) + { + switch( soundnum ) + { + case 1: + PlaySound( 0, "mortar_explosion4", pos ); + break; + case 2: + PlaySound( 0, "mortar_explosion5", pos ); + break; + case 3: + PlaySound( 0, "mortar_explosion1", pos ); + break; + } + } + else if( level._effectType[mortar_name] == "bomb" ) + { + switch( soundnum ) + { + case 1: + PlaySound( 0, "mortar_explosion1", pos ); + break; + case 2: + PlaySound( 0, "mortar_explosion4", pos ); + break; + case 3: + PlaySound( 0, "mortar_explosion5", pos ); + break; + } + } +} +explosion_activate( mortar_name, blast_radius, min_damage, max_damage, quake_power, quake_time, quake_radius, dust_points ) +{ + set_mortar_quake( mortar_name, 0.15, 2, 850, true ); + if( !IsDefined( blast_radius ) ) + { + blast_radius = level._explosion_blast_radius[mortar_name]; + } + if( !IsDefined( quake_power ) ) + { + quake_power = level._explosion_quake_power[mortar_name]; + } + if( !IsDefined( quake_time ) ) + { + quake_time = level._explosion_quake_time[mortar_name]; + } + if( !IsDefined( quake_radius ) ) + { + quake_radius = level._explosion_quake_radius[mortar_name]; + } + explosion_incoming( mortar_name, self.origin ); + level notify( "explosion", mortar_name ); + explosion_boom( mortar_name, self.origin, quake_power, quake_time, quake_radius ); + if( IsDefined( dust_points ) && dust_points.size > 0 ) + { + max_range = 384; + if( IsDefined( level._explosion_dust_range ) && IsDefined( level._explosion_dust_range[mortar_name] ) ) + { + max_range = level._explosion_dust_range[mortar_name]; + } + for( i = 0; i < dust_points.size; i++ ) + { + if( DistanceSquared( dust_points[i].origin, self.origin ) < max_range * max_range ) + { + if( IsDefined( dust_points[i].script_fxid ) ) + { + PlayFx( 0, level._effect[dust_points[i].script_fxid], dust_points[i].origin ); + } + else + { + PlayFx( 0, level._effect[level._explosion_dust_name[mortar_name]], dust_points[i].origin ); + } + } + } + } +} +mortar_loop( mortar_name, barrage_amount, no_terrain ) +{ + level endon( "stop_all_mortar_loops" ); + assertex( ( IsDefined( mortar_name ) &&( mortar_name != "" ) ), "mortar_name not passed. pass in level script" ); + assertex( ( IsDefined( level._effect ) && IsDefined( level._effect[mortar_name] ) ), "level._effect[strMortars] not defined. define in level script" ); + last_explosion = -1; + set_mortar_range( mortar_name, 300, 2200, true ); + set_mortar_delays( mortar_name, 5, 7, 5, 7, true ); + set_mortar_chance( mortar_name, 0, true ); + if( !IsDefined( barrage_amount ) || barrage_amount < 1 ) + { + barrage_amount = 1; + } + if( !IsDefined( no_terrain ) ) + { + no_terrain = false; + } + if( IsDefined( level._explosion_stopNotify ) && IsDefined( level._explosion_stopNotify[mortar_name] ) ) + { + level endon( level._explosion_stopNotify[mortar_name] ); + } + if( !IsDefined( level._explosion_stop_barrage ) || !IsDefined( level._explosion_stop_barrage[mortar_name] ) ) + { + level._explosion_stop_barrage[mortar_name] = false; + } + explosion_points = []; + explosion_points_structs = []; + num_points = 0; + while(num_points == 0) + { + explosion_points = GetEntArray( 0, mortar_name, "targetname" ); + explosion_points_structs = getstructarray( mortar_name, "targetname" ); + num_points = explosion_points.size + explosion_points_structs.size; + wait(0.5); + } + for( i = 0; i < explosion_points_structs.size; i++ ) + { + explosion_points_structs[i].is_struct = true; + explosion_points = add_to_array( explosion_points, explosion_points_structs[i] ); + } + explosion_points_structs = []; + dust_points = []; + if( IsDefined( level._explosion_dust_name[mortar_name] ) ) + { + dust_name = level._explosion_dust_name[mortar_name]; + dust_points = GetEntArray( 0, dust_name, "targetname" ); + dust_points_structs = []; + dust_points_structs = getstructarray( dust_name, "targetname" ); + for( i = 0; i < dust_points_structs.size; i++ ) + { + dust_points_structs[i].is_struct = true; + dust_points = add_to_array( dust_points, dust_points_structs[i] ); + } + dust_points_structs = []; + } + if( IsDefined( level._explosion_start_notify ) && IsDefined( level._explosion_start_notify[mortar_name] ) ) + { + level waittill( level._explosion_start_notify[mortar_name] ); + } + while( true ) + { + while( !level._explosion_stop_barrage[mortar_name] ) + { + do_mortar = false; + for( j = 0; j < barrage_amount; j++ ) + { + max_rangeSQ = level._explosion_max_range[mortar_name] * level._explosion_max_range[mortar_name]; + min_rangeSQ = level._explosion_min_range[mortar_name] * level._explosion_min_range[mortar_name]; + random_num = RandomInt( explosion_points.size ); + for( i = 0; i < explosion_points.size; i++ ) + { + num = ( i + random_num ) % explosion_points.size; + do_mortar = false; + players = getlocalplayers(); + for( q = 0; q < players.size; q++ ) + { + dist = DistanceSquared( players[q] GetOrigin(), explosion_points[num].origin ); + if( num != last_explosion && dist < max_rangeSQ && dist > min_rangeSQ ) + { + if( level._explosion_view_chance[mortar_name] > 0 ) + { + if( players[q] player_view_chance( level._explosion_view_chance[mortar_name], explosion_points[num].origin ) ) + { + do_mortar = true; + break; + } + else + { + do_mortar = false; + } + } + else + { + do_mortar = true; + break; + } + } + else + { + do_mortar = false; + } + } + if( do_mortar ) + { + explosion_points[num] thread explosion_activate( mortar_name, undefined, undefined, undefined, undefined, undefined, undefined, dust_points ); + last_explosion = num; + break; + } + } + last_explosion = -1; + if( do_mortar ) + { + if( IsDefined( level._explosion_delay ) && IsDefined( level._explosion_delay[mortar_name] ) ) + { + wait( level._explosion_delay[mortar_name] ); + } + else + { + wait( RandomFloatRange( level._explosion_min_delay[mortar_name], level._explosion_max_delay[mortar_name] ) ); + } + } + else + { + j--; + wait( 0.25 ); + } + } + if( barrage_amount > 1 ) + { + if( IsDefined( level._explosion_barrage_delay ) && IsDefined( level._explosion_barrage_delay[mortar_name] ) ) + { + wait( level._explosion_barrage_delay[mortar_name] ); + } + else + { + wait( RandomFloatRange( level._explosion_barrage_min_delay[mortar_name], level._explosion_barrage_max_delay[mortar_name] ) ); + } + } + } + wait( 0.05 ); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_music.csc b/BO1/PC/ZM/clientscripts/_music.csc new file mode 100644 index 0000000..32f4802 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_music.csc differ diff --git a/BO1/PC/ZM/clientscripts/_napalm.csc b/BO1/PC/ZM/clientscripts/_napalm.csc new file mode 100644 index 0000000..72f05c2 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_napalm.csc differ diff --git a/BO1/PC/ZM/clientscripts/_radiant_live_update.csc b/BO1/PC/ZM/clientscripts/_radiant_live_update.csc new file mode 100644 index 0000000..f246259 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_radiant_live_update.csc differ diff --git a/BO1/PC/ZM/clientscripts/_sticky_grenade.csc b/BO1/PC/ZM/clientscripts/_sticky_grenade.csc new file mode 100644 index 0000000..33ad374 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_sticky_grenade.csc differ diff --git a/BO1/PC/ZM/clientscripts/_swimming.csc b/BO1/PC/ZM/clientscripts/_swimming.csc new file mode 100644 index 0000000..eaab2b5 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_swimming.csc @@ -0,0 +1,1071 @@ + +#include clientscripts\_utility; +#include clientscripts\_audio; +#include clientscripts\_ambientpackage; +#using_animtree("player"); +settings() +{ + level._swimming = SpawnStruct(); + level._swimming.swim_times[0] = 0; + level._swimming.swim_times[1] = 15; + level._swimming.swim_times[2] = 25; + level._swimming.swim_times[3] = 32; + level._swimming.swim_times[4] = 37; + level._swimming.num_phases = level._swimming.swim_times.size - 1; + level._swimming.drown_reset_times[0] = 1; + level._swimming.drown_reset_times[1] = 2; + level._swimming.drown_reset_times[2] = 2; + level._swimming.drown_reset_times[3] = 4; + level._swimming.drown_reset_times[4] = 4; + self._swimming.is_swimming_enabled = true; + level._swimming.is_overriding_swim_movement = false; + level._swimming.override_swim_movement = (0,0,0); + level._swimming.swim_anim_rate = 1.0; +} +main() +{ + if ( IsDefined( level.swimmingFeature ) && !level.swimmingFeature ) + return; + if(level.createFX_enabled) + { + return; + } + settings(); + fx(); + anims(); + set_default_water_for_settings(); + OnPlayerConnect_Callback(::on_player_connect); + level thread underwater_ambient_package_setup(); +} +set_default_vision_set(vision_set) +{ +} +set_swimming_vision_set(vision_set) +{ + VisionSetUnderWater(self GetLocalClientNumber(), vision_set); + if (!IsDefined(self._swimming)) + { + self waittill("swimming_init"); + } + self._swimming.swimming_vision_set = vision_set; +} +fx() +{ + level._effect["underwater"] = LoadFX( "env/water/fx_water_particles_surface_fxr" ); + level._effect["deep"] = LoadFX( "env/water/fx_water_particle_dp_spawner" ); + level._effect["drowning"] = LoadFX( "bio/player/fx_player_underwater_bubbles_drowning" ); + level._effect["exhale"] = LoadFX( "bio/player/fx_player_underwater_bubbles_exhale" ); + level._effect["hands_bubbles_left"] = LoadFX( "bio/player/fx_player_underwater_bubbles_hand_fxr" ); + level._effect["hands_bubbles_right"] = LoadFX( "bio/player/fx_player_underwater_bubbles_hand_fxr_right" ); + level._effect["hands_debris_left"] = LoadFX( "bio/player/fx_player_underwater_hand_emitter"); + level._effect["hands_debris_right"] = LoadFX( "bio/player/fx_player_underwater_hand_emitter_right"); + level._effect["sediment"] = LoadFX( "bio/player/fx_player_underwater_sediment_spawner"); + level._effect["wake"] = LoadFX( "bio/player/fx_player_water_swim_wake" ); + level._effect["ripple"] = LoadFX( "bio/player/fx_player_water_swim_ripple" ); +} +anims() +{ + level._swimming.anims["breaststroke"][0] = %viewmodel_swim_breaststroke_a; + level._swimming.anims["breaststroke"][1] = %viewmodel_swim_breaststroke_b; + level._swimming.anims["breaststroke"][2] = %viewmodel_swim_breaststroke_c; + level._swimming.anims["backwards"][0] = %viewmodel_swim_backwards_a; + level._swimming.anims["backwards"][1] = %viewmodel_swim_backwards_b; + level._swimming.anims["backwards"][2] = %viewmodel_swim_backwards_c; + level._swimming.anims["left"][0] = %viewmodel_swim_to_left; + level._swimming.anims["right"][0] = %viewmodel_swim_to_right; + level._swimming.anims["tread"][0] = %viewmodel_swim_tread_water; +} +on_player_connect(clientNum) +{ + while ( !ClientHasSnapshot(clientNum) ) + { + wait 0.05; + } + wait( 0.05 ); + self init_player(); + self thread on_save_restore(); + PrintLn("^4_swimming - client: client player connect"); + self thread enable_swimming(); + self thread disable_swimming(); + self thread toggle_arms(); + self thread swimmingDrown(); + self thread waterLevelTag( clientNum ); + self thread dive_and_surface_audio(); + self thread dry_land_tracker(); + self thread toggle_swimming(); + if( self Swimming() ) + { + self notify("swimming_begin"); + } +} +on_save_restore() +{ + while (true) + { + level waittill("save_restore"); + self._swimming.is_underwater = false; + self notify("surface"); + PrintLn("^4_swimming - client: save restore"); + if( self Swimming() ) + { + self notify("swimming_begin"); + } + } +} +init_player() +{ + if( !isdefined( self._swimming ) ) + { + PrintLn("^4_swimming - client: defining self._swimming."); + self._swimming = SpawnStruct(); + } + self._swimming.is_arms_enabled = true; + self._swimming.is_swimming = false; + self._swimming.is_drowning = false; + self._swimming.is_underwater = false; + self._swimming.resetting_vision = false; + self._swimming.surface_vox = "chr_swimming_vox_surface_default"; + self._swimming.vec_movement = (0, 0, 0); + self notify("swimming_init"); +} +disable_swimming() +{ + self endon("disconnect"); + while (true) + { + level waittill("_swimming:disable"); + PrintLn("^4_swimming - client: swimming disabled"); + self notify("swimming_end"); + level._swimming.is_swimming_enabled = false; + } +} +enable_swimming() +{ + self endon("disconnect"); + while (true) + { + level waittill("_swimming:enable"); + PrintLn("^4_swimming - client: swimming enabled"); + if (self Swimming()) + { + self notify("swimming_begin"); + } + level._swimming.is_swimming_enabled = true; + } +} +hide_arms() +{ + self endon("disconnect"); + while (true) + { + level waittill("_swimming:hide_arms"); + self._swimming.is_arms_enabled = false; + self notify("_swimming:hide_arms"); + PrintLn("^4_swimming - client: hide arms"); + } +} +show_arms() +{ + self endon("disconnect"); + while (true) + { + level waittill("_swimming:show_arms"); + self._swimming.is_arms_enabled = true; + self notify("_swimming:show_arms"); + PrintLn("^4_swimming - client: show arms"); + } +} +set_default_water_for_settings() +{ + SetWaterFog( + 0, + 119.8, + 0, + -70.13, + 0.149, + 0.145, + 0.118, + 1.33, + 0.212, + 0.2, + 0.157, + -0.269, + -0.506, + 0.82, + 0, + 91.86, + 0.994 + ); +} +toggle_swimming() +{ + self endon("disconnect"); + while (true) + { + self waittill("swimming_begin"); + self._swimming.is_swimming = true; + PrintLn("^4_swimming - client: swimming begin"); + self thread swimmingTracker(); + self swimmingFX(); + self waittill("swimming_end"); + self._swimming.is_swimming = false; + PrintLn("^4_swimming - client: swimming end"); + } +} +toggle_arms() +{ + self endon("disconnect"); + self thread show_arms(); + self thread hide_arms(); + while (true) + { + waitforclient(0); + self waittill_any("underwater", "_swimming:show_arms"); + self thread swimmingArms(); + self waittill_any("surface", "swimming_end", "_swimming:hide_arms"); + } +} +swimmingTracker() +{ + self endon("disconnect"); + self endon("swimming_end"); + while (true) + { + waitforclient(0); + if (level._swimming.is_swimming_enabled) + { + self._swimming.current_depth = get_swimming_depth(); + } + else + { + self._swimming.current_depth = 0; + } + wait .05; + } +} +underwater() +{ + if (!self._swimming.is_underwater) + { + self._swimming.reset_time = 0; + self._swimming.is_underwater = true; + self._swimming.surface_vox = "chr_swimming_vox_surface_default"; + self notify("underwater"); + PrintLn("^4_swimming - client: underwater"); + } +} +surface() +{ + if (self._swimming.is_underwater) + { + self._swimming.is_underwater = false; + self notify("surface"); + PrintLn("^4_swimming - client: surface"); + } +} +get_swimming_depth() +{ + eye_height = self get_eye()[2]; + water_height = GetWaterHeight( self.origin ); + return (water_height - eye_height); +} +swimmingDrown() +{ + self endon("disconnect"); + phase = 0; + last_phase = 0; + self._swimming.swim_time = 0; + self._swimming.reset_time = 0; + while (true) + { + wait(.01); + waitforclient(0); + if (!self._swimming.is_underwater && !self._swimming.resetting_vision) + { + self._swimming.resetting_vision = true; + self thread swimmingDrownVision(0, last_phase); + } + phase = self advance_drowning_phase(last_phase); + if (phase != last_phase) + { + self notify( "drowning" ); + self thread swimming_drown_vox(); + self thread swimmingDrownDamage(phase); + self thread swimmingDrownVision(phase, last_phase); + self thread swimmingDrownFX(phase); + self.drowning_phase = phase; + last_phase = phase; + PrintLn("^4_swimming - client: phase " + phase); + } + } +} +advance_drowning_phase(phase) +{ + if( IsDefined(level._disable_drowning) && level._disable_drowning ) + { + return 0; + } + t_delta = swimming_get_time(); + if (self._swimming.is_underwater) + { + self._swimming.swim_time += t_delta; + for (phase = level._swimming.num_phases; phase >= 0; phase--) + { + if (self._swimming.swim_time >= get_phase_time(phase)) + { + return(phase); + } + } + } + else + { + self._swimming.reset_time += t_delta; + if (self._swimming.reset_time >= get_reset_time(phase)) + { + self._swimming.swim_time = 0; + return 0; + } + } + return phase; +} +swimming_get_time() +{ + t_now = GetRealTime(); + t_delta = 0; + if (IsDefined(self._swimming.last_get_time)) + { + t_delta = t_now - self._swimming.last_get_time; + if (t_delta >= 500) + { + PrintLn("^4_swimming - client: IGNORING TIME (" + t_delta + ")"); + t_delta = 0; + } + } + self._swimming.last_get_time = t_now; + return t_delta; +} +get_phase_time(phase) +{ + return (level._swimming.swim_times[phase] * 1000); +} +get_reset_time(phase) +{ + return (level._swimming.drown_reset_times[phase] * 1000); +} +swimmingDrownDamage(phase) +{ + self endon("disconnect"); + self notify("stop_swimming_drown_damage"); + self endon("stop_swimming_drown_damage"); + self endon("surface"); + self endon("swimming_end"); + pause = 1; + rumble = undefined; + if (phase == 1 || phase == 2) + { + pause = 3; + rumble = "damage_light"; + } + else if (phase == 3) + { + rumble = "damage_heavy"; + } + while (IsDefined(rumble)) + { + self PlayRumbleOnEntity(self GetLocalClientNumber(), rumble); + wait pause; + } +} +swimmingDrownVision(phase, last_phase) +{ + if (phase == 0) + { + PrintLn("^4_swimming - client: resetting client-side blur."); + self SetBlur(0, level._swimming.drown_reset_times[last_phase]); + if (self._swimming.is_drowning) + { + VisionSetUnderWater(self GetLocalClientNumber(), self._swimming.swimming_vision_set, 0); + self._swimming.is_drowning = false; + } + } + else + { + self._swimming.resetting_vision = false; + if (phase == 2) + { + PrintLn("^4_swimming - client: setting client-side blur."); + self SetBlur(10, level._swimming.swim_times[4] - level._swimming.swim_times[2]); + } + else if (phase == 3) + { + PrintLn("^4_swimming - client: setting drowning vision set."); + VisionSetUnderWater(self GetLocalClientNumber(), "drown", level._swimming.swim_times[4] - level._swimming.swim_times[3]); + self._swimming.is_drowning = true; + } + } +} +swimmingFX() +{ + self thread underWaterFX(); +} +waterLevelTag( clientNum ) +{ + self endon("disconnect"); + self._swimming.water_level_fx_tag = Spawn(clientNum, self.origin, "script_model"); + self._swimming.water_level_fx_tag SetModel("tag_origin"); + while (true) + { + while( !ClientHasSnapshot(clientNum)) + { + wait(0.1); + } + last_org = (0, 0, 0); + while (self._swimming.is_swimming) + { + while( !ClientHasSnapshot(clientNum)) + { + wait(0.1); + } + self._swimming.water_level_fx_tag.origin = ( self.origin[0], self.origin[1], GetWaterHeight( self.origin ) ); + new_org = self._swimming.water_level_fx_tag.origin; + if ((last_org != (0, 0, 0)) && (new_org != last_org)) + { + self._swimming.vec_movement = new_org - last_org; + self._swimming.water_level_fx_tag.angles = VectorToAngles(self._swimming.vec_movement * -1); + } + else + { + self._swimming.is_stationary = true; + } + wait .01; + last_org = new_org; + } + wait .01; + } +} +underWaterFX() +{ + self endon("swimming_end"); + fx_handle_underwater = undefined; + fx_handle_deep = undefined; + fx_handle_hand_le = undefined; + fx_handle_hand_rt = undefined; + while( true ) + { + self waittill("swim_arms_spawned"); + self thread exhaleFX(); + self thread debrisFX(); + self thread sedimentFX(); + fx_handle_hand_le = PlayFXOnTag(self GetLocalClientNumber(), level._effect["hands_bubbles_left"], self._swimming_arms, "J_WristTwist_LE"); + fx_handle_hand_rt = PlayFXOnTag(self GetLocalClientNumber(), level._effect["hands_bubbles_right"], self._swimming_arms, "J_WristTwist_RI"); + if( self._swimming.current_depth > 500) + { + if (IsDefined(fx_handle_underwater)) + { + DeleteFx( self GetLocalClientNumber(), fx_handle_underwater, true ); + } + fx_handle_deep = PlayFXOnTag(self GetLocalClientNumber(), level._effect["deep"], self._swimming_arms, "tag_origin"); + PrintLn("^4_swimming - client: deep fx"); + } + else + { + if (IsDefined(fx_handle_deep)) + { + DeleteFx( self GetLocalClientNumber(), fx_handle_deep, false ); + } + fx_handle_underwater = PlayFXOnTag(self GetLocalClientNumber(), level._effect["underwater"], self._swimming.water_level_fx_tag, "tag_origin"); + PrintLn("^4_swimming - client: underwater fx"); + } + self thread underWaterFXDelete(fx_handle_underwater, fx_handle_deep, fx_handle_hand_le, fx_handle_hand_rt); + } +} +underWaterFXDelete(fx_handle_underwater, fx_handle_deep, fx_handle_hand_le, fx_handle_hand_rt) +{ + self waittill_any("surface", "swimming_end"); + waitforclient(0); + if (IsDefined(fx_handle_underwater)) + { + DeleteFx( self GetLocalClientNumber(), fx_handle_underwater, true ); + } + if (IsDefined(fx_handle_deep)) + { + DeleteFx( self GetLocalClientNumber(), fx_handle_deep, false ); + } + if (IsDefined(fx_handle_hand_le)) + { + DeleteFx( self GetLocalClientNumber(), fx_handle_hand_le, true ); + } + if (IsDefined(fx_handle_hand_rt)) + { + DeleteFx( self GetLocalClientNumber(), fx_handle_hand_rt, true ); + } +} +exhaleFX() +{ + self endon("disconnect"); + self endon("surface"); + self endon("swimming_end"); + self endon("drowning"); + wait 3; + while (IsDefined(self._swimming_arms)) + { + waitforclient(0); + PlayFXOnTag(self GetLocalClientNumber(), level._effect["exhale"], self._swimming_arms, "tag_origin"); + wait RandomFloatRange(2.5,3.5); + } +} +swimmingDrownFX(phase) +{ + if (phase == 3) + { + if (IsDefined(self._swimming_arms)) + { + PlayFXOnTag(self GetLocalClientNumber(), level._effect["drowning"], self._swimming_arms, "tag_origin"); + } + } +} +debrisFX() +{ + self endon("disconnect"); + self endon("surface"); + self endon("swimming_end"); + while (IsDefined(self._swimming_arms)) + { + fx_handle_hand_le = PlayFXOnTag(self GetLocalClientNumber(), level._effect["hands_debris_left"], self._swimming_arms, "J_WristTwist_LE"); + fx_handle_hand_rt = PlayFXOnTag(self GetLocalClientNumber(), level._effect["hands_debris_right"], self._swimming_arms, "J_WristTwist_RI"); + self thread killUnderWaterFX(fx_handle_hand_le, 3); + self thread killUnderWaterFX(fx_handle_hand_rt, 3); + wait 1.5; + } +} +sedimentFX() +{ + self endon("disconnect"); + self endon("surface"); + self endon("swimming_end"); + while (true) + { + player_angles = self GetPlayerAngles(); + player_forward = AnglesToForward(player_angles); + fx_pos = self GetOrigin(); + fx_handle = PlayFx(self GetLocalClientNumber(), level._effect["sediment"], fx_pos ); + self thread killUnderWaterFX(fx_handle, 10); + wait 1; + } +} +killUnderWaterFX(fx_handle, time_out) +{ + self endon("disconnect"); + endon_string = get_kill_fx_endon(); + self endon(endon_string); + self thread notify_delay(endon_string, time_out); + self waittill_any("surface", "swimming_end"); + waitforclient(0); + if (IsDefined(fx_handle)) + { + DeleteFx( self GetLocalClientNumber(), fx_handle, true ); + } +} +get_kill_fx_endon() +{ + if (!IsDefined(level._swimming.fx_num)) + { + level._swimming.fx_num = 0; + } + else + { + level._swimming.fx_num++; + } + endon_string = "swimmin_fx_" + level._swimming.fx_num; + return(endon_string); +} +onWaterFX() +{ + self endon("disconnect"); + self endon("swimming_end"); + while( true ) + { + if (!self._swimming.is_underwater) + { + if (Length(self._swimming.vec_movement) > .4) + { + self onWaterWakeFXSpawn(); + self onWaterRippleFXDelete(); + } + else + { + self onWaterWakeFXDelete(); + self onWaterRippleFXSpawn(); + } + } + wait .01; + } +} +onWaterWakeFXSpawn() +{ + if (!IsDefined(self._swimming.fx_handle_wake)) + { + self notify("new_on_water_fx"); + PrintLn("^4_swimming - client: spawning wake"); + self._swimming.fx_handle_wake = PlayFXOnTag(self GetLocalClientNumber(), level._effect["wake"], self._swimming.water_level_fx_tag, "tag_origin"); + self thread onWaterWakeFXDeleteWhenDone(); + } +} +onWaterWakeFXDeleteWhenDone() +{ + self endon("new_on_water_fx"); + self waittill_any("underwater", "swimming_end"); + self onWaterWakeFXDelete(); +} +onWaterWakeFXDelete() +{ + if( IsDefined(self._swimming.fx_handle_wake) ) + { + PrintLn("^4_swimming - client: deleting wake"); + DeleteFx( self GetLocalClientNumber(), self._swimming.fx_handle_wake, 0 ); + self._swimming.fx_handle_wake = undefined; + } +} +onWaterRippleFXSpawn() +{ + if (!IsDefined(self._swimming.fx_handle_ripple)) + { + self notify("new_on_water_fx"); + PrintLn("^4_swimming - client: spawning ripple"); + self._swimming.fx_handle_ripple = PlayFXOnTag(self GetLocalClientNumber(), level._effect["ripple"], self._swimming.water_level_fx_tag, "tag_origin"); + self thread onWaterRippleFXDeleteWhenDone(); + } +} +onWaterRippleFXDeleteWhenDone() +{ + self endon("new_on_water_fx"); + self waittill_any("underwater", "swimming_end"); + self onWaterRippleFXDelete(); +} +onWaterRippleFXDelete() +{ + if( IsDefined(self._swimming.fx_handle_ripple) ) + { + PrintLn("^4_swimming - client: deleting ripple"); + DeleteFx( self GetLocalClientNumber(), self._swimming.fx_handle_ripple, 0 ); + self._swimming.fx_handle_ripple = undefined; + } +} +swimmingArmsSpawn() +{ + self endon("disconnect"); + self endon("swimming_end"); + self endon("surface"); + PrintLn("^4_swimming - client: swimmingArmsSpawn"); + if (!self._swimming.is_underwater) + { + self waittill("underwater"); + } + if (!self._swimming.is_arms_enabled) + { + self waittill("_swimming:show_arms"); + } + self thread swimmingArmsHide(); + PrintLn("^4_swimming - client: spawning arms"); + self._swimming_arms = spawn_player_arms(); + wait( 0.2 ); + PrintLn("^4_swimming - client: linking arms"); + self._swimming_arms UseAnimTree( #animtree ); + self._swimming_arms LinkToCamera(); + self notify("swim_arms_spawned"); +} +swimmingArmsHide() +{ + self endon("disconnect"); + msg = self waittill_any_return("swimming_end", "surface", "_swimming:hide_arms"); + if (msg == "_swimming:hide_arms") + { + self endon("_swimming:show_arms"); + } + else + { + self endon("underwater"); + } + self._swimming_arms waittillmatch("swimming_anim", "end"); + self._swimming_arms Delete(); +} +swimmingArms() +{ + self endon("disconnect"); + self endon("swimming_end"); + self endon("surface"); + self swimmingArmsSpawn(); + self._swimming_arms endon("death"); + blendtime = 0.3; + new_swim_state = 100; + new_rate = 1.0; + while( 1 ) + { + waitforclient(0); + move = self GetNormalizedMovement(); + if (level._swimming.is_overriding_swim_movement) + { + move = level._swimming.override_swim_movement; + } + len = Length( move ); + old_swim_state = new_swim_state; + if( len < 0.5 ) + { + new_swim_state = 0; + } + else + { + if( abs( move[0] ) > abs( move[1] ) ) + { + if( move[0] > 0 ) + { + new_swim_state = 1; + } + else + { + new_swim_state = 2; + } + } + else + { + if( move[1] < 0 ) + { + new_swim_state = 3; + } + else + { + new_swim_state = 4; + } + } + } + rand_anim = random(level._swimming.anims["tread"]); + switch( new_swim_state ) + { + case 100: + break; + case 0: + PrintLn( "_swimming: swim idle" ); + rand_anim = random(level._swimming.anims["tread"]); + break; + case 1: + PrintLn( "_swimming: swim forward" ); + rand_anim = random(level._swimming.anims["breaststroke"]); + break; + case 2: + PrintLn( "_swimming: swim backwards" ); + rand_anim = random(level._swimming.anims["backwards"]); + break; + case 3: + PrintLn( "_swimming: swim left" ); + rand_anim = random(level._swimming.anims["left"]); + break; + case 4: + PrintLn( "_swimming: swim right" ); + rand_anim = random(level._swimming.anims["right"]); + break; + } + self._swimming_arms.current_anim = rand_anim; + self._swimming_arms SetFlaggedAnim("swimming_anim", rand_anim, 1, 0.2, level._swimming.swim_anim_rate); + self._swimming_arms waittillmatch("swimming_anim", "end"); + self._swimming_arms ClearAnim(rand_anim, 0.0); + } +} +dive_and_surface_audio() +{ + self endon( "death" ); + if( !IsDefined( level.underwater_snapshot_override ) ) + level.underwater_snapshot_override = false; + while (true) + { + self waittill( "underwater" ); + activateAmbientRoom( 0, "underwater", 50 ); + snd_set_snapshot( "underwater" ); + self PlaySound( 0, "chr_swimming_dive_start_plr" ); + self PlaySound( 0, "chr_ear_fill" ); + self waittill( "surface" ); + deactivateAmbientRoom( 0, "underwater", 50 ); + snd_set_snapshot( "default" ); + self PlaySound( 0, self._swimming.surface_vox ); + self PlaySound( 0, "chr_swimming_surface_plr" ); + self PlaySound( 0, "chr_ear_drain" ); + } +} +swimming_loops_plr() +{ + self endon( "death" ); + swim_ent1 = Spawn( 0, (0,0,0), "script_origin" ); + swim_ent2 = Spawn( 0, (0,0,0), "script_origin" ); + while(1) + { + while( !self.is_on_dryland && !self._swimming.is_underwater && level._swimming.is_swimming_enabled ) + { + if( self GetSpeed() > 50 ) + { + swim_ent1 StopLoopSound( 1 ); + swim_ent2 PlayLoopSound( "chr_swimming_swim_loop_plr", 1 ); + } + else + { + swim_ent2 StopLoopSound( 1 ); + swim_ent1 PlayLoopSound( "chr_swimming_float_loop_plr", 1 ); + } + wait(.25); + } + swim_ent1 StopLoopSound( 1 ); + swim_ent2 StopLoopSound( 1 ); + wait(.25); + } +} +swimming_loops_ai() +{ + self endon( "death" ); + self endon( "entityshutdown" ); + level endon( "save_restore" ); + while(1) + { + while( self.is_on_dryland == true || !level._swimming.is_swimming_enabled ) + { + wait( 0.25 ); + } + real_ent1 = Spawn( 0, (0,0,0), "script_origin" ); + real_ent2 = Spawn( 0, (0,0,0), "script_origin" ); + real_ent1 LinkTo( self, "tag_origin" ); + real_ent2 LinkTo( self, "tag_origin" ); + self thread swimming_loop_delete( real_ent1, real_ent2 ); + self thread save_restore_ent_delete( real_ent1, real_ent2 ); + while( !self.is_on_dryland && level._swimming.is_swimming_enabled && IsDefined( real_ent1 ) && IsDefined( real_ent2 ) ) + { + if( !IsDefined( self ) ) + { + return; + } + if( self GetSpeed() > 50 ) + { + real_ent2 StopLoopSound( 1 ); + real_ent1 PlayLoopSound( "chr_swimming_swim_loop_npc", 1 ); + } + else + { + real_ent1 StopLoopSound( 1 ); + real_ent2 PlayLoopSound( "chr_swimming_float_loop_npc", 1 ); + } + wait(.25); + } + wait(.25); + } +} +dry_land_tracker() +{ + self endon( "death" ); + self endon( "entityshutdown" ); + self.is_on_dryland = true; + active_on_ai = true; + if( !IsDefined( level._swimming ) ) + return; + if( !level._swimming.is_swimming_enabled ) + return; + if( self IsPlayer() == false ) + { + if( active_on_ai ) + { + PrintLn( "***Swimming Threaded On AI***" ); + self thread swimming_loops_ai(); + self thread disable_ai_swimming(); + level endon( "save_restore" ); + } + else + { + return; + } + } + else + { + self thread swimming_loops_plr(); + } + while(1) + { + while( level._swimming.is_swimming_enabled ) + { + if( !IsDefined( self ) ) + { + return; + } + waitforclient(0); + eye_height = self get_eye(); + self.foot_depth = (eye_height[2] - GetWaterHeight( self.origin )) - 40; + if( self.foot_depth > 0 ) + { + if ( self.is_on_dryland == false ) + { + self.is_on_dryland = true; + self notify( "on_dryland" ); + } + } + else if ( self.is_on_dryland == true ) + { + self.is_on_dryland = false; + self notify( "!on_dryland" ); + } + wait(.25); + } + wait(.25); + } +} +swimming_loop_delete( ent1, ent2 ) +{ + level endon( "save_restore" ); + self waittill_any( "entityshutdown", "on_dryland", "swimming_end", "death" ); + ent1 delete(); + ent2 delete(); +} +save_restore_ent_delete( ent1, ent2 ) +{ + level waittill( "save_restore" ); + if( !IsDefined( ent1 ) || !IsDefined( ent2 ) ) + return; + PrintLn( "*#*#*#*#* Deleting Ents on Save Restore" ); + ent1 delete(); + ent2 delete(); +} +underwater_ambient_package_setup() +{ + declareAmbientRoom( "underwater" ); + setAmbientRoomTone( "underwater", "chr_swimming_underwater_amb", .25, .1 ); + setAmbientRoomReverb ("underwater","UNDERWATER", 1, 1, 1 ); +} +disable_ai_swimming() +{ + level endon( "save_restore" ); + while (true) + { + level waittill("_swimming:disable"); + if( !IsDefined( self ) ) + return; + self notify("swimming_end"); + } +} +disable_underwater_snapshot( value ) +{ + if( !IsDefined( level.underwater_snapshot_override ) ) + level.underwater_snapshot_override = false; + level.underwater_snapshot_override = value; +} +swimming_drown_vox() +{ + self endon( "death" ); + self endon( "disconnect" ); + if( !IsDefined( level.is_drowning ) ) + level.is_drowning = false; + if( level.is_drowning || !self._swimming.is_underwater ) + return; + level.is_drowning = true; + self thread audio_drowning_counter(); + self thread audio_drowning_loopers(); + self thread audio_drowning_vox(); + self waittill( "surface" ); + level.is_drowning = false; + snd_set_snapshot( "default" ); +} +audio_drowning_vox() +{ + self endon( "surface" ); + self endon( "death" ); + drown_vox = undefined; + surface_vox = undefined; + drown_time_change = 12; + while( self._swimming.is_underwater ) + { + if( level.audio_swimming_counter <= drown_time_change ) + { + drown_vox = "chr_swimming_vox_gulp_small"; + surface_vox = "chr_swimming_vox_surface_medium"; + waittime = RandomFloatRange( 2, 4 ); + } + else + { + drown_vox = "chr_swimming_vox_gulp_large"; + surface_vox = "chr_swimming_vox_surface_large"; + waittime = RandomFloatRange( .5, 2 ); + } + self PlaySound( 0, drown_vox ); + self._swimming.surface_vox = surface_vox; + wait waittime; + } +} +audio_drowning_loopers() +{ + self endon( "surface" ); + self endon( "death" ); + if( !self._swimming.is_underwater ) + return; + snd_set_snapshot( "drowning" ); + ent1 = Spawn( 0, (0,0,0), "script_origin" ); + ent2 = Spawn( 0, (0,0,0), "script_origin" ); + self thread delete_ents_on_surface( ent1, ent2 ); + self thread drowning_heartbeat(); + ent1 playloopsound( "chr_swimming_drowning_loop", 10 ); + while( level.audio_swimming_counter < 14 ) + { + wait(.1); + } + ent2 PlayLoopSound( "chr_shock_hfq", 1 ); +} +audio_drowning_counter() +{ + self endon( "surface" ); + self endon( "death" ); + self endon( "disconnect" ); + if( !self._swimming.is_underwater ) + return; + for( i=0; i<30; i++ ) + { + level.audio_swimming_counter = i; + realWait(1); + } +} +delete_ents_on_surface( ent1, ent2 ) +{ + self waittill_any( "surface", "death" ); + ent1 stoploopsound( .25 ); + ent2 stoploopsound( .25 ); + wait(.25); + ent1 Delete(); + ent2 Delete(); +} +drowning_heartbeat() +{ + self endon( "surface" ); + self endon( "death" ); + self endon( "disconnect" ); + wait1 = undefined; + wait2 = undefined; + while( self._swimming.is_underwater ) + { + if( level.audio_swimming_counter >= 18 ) + { + wait1 = .2; + wait2 = .4; + } + else if( level.audio_swimming_counter >= 12 ) + { + wait1 = .3; + wait2 = .6; + } + else if( level.audio_swimming_counter > 6 ) + { + wait1 = .4; + wait2 = .8; + } + else if( level.audio_swimming_counter <= 6 ) + { + wait1 = .5; + wait2 = 1; + } + PlaySound( 0, "chr_shock_hb1", (0,0,0) ); + wait( wait1 ); + PlaySound( 0, "chr_shock_hb2", (0,0,0) ); + wait( wait2 ); + } +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_treadfx.csc b/BO1/PC/ZM/clientscripts/_treadfx.csc new file mode 100644 index 0000000..a2d824e Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_treadfx.csc differ diff --git a/BO1/PC/ZM/clientscripts/_utility.csc b/BO1/PC/ZM/clientscripts/_utility.csc new file mode 100644 index 0000000..9a8da6d --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_utility.csc @@ -0,0 +1,1155 @@ +#include clientscripts\_utility_code; +#include clientscripts\_fx; +error( message ) +{ + println( "^c * ERROR * ", message ); + wait 0.05; +} +getstruct( name, type ) +{ + if(!IsDefined( level.struct_class_names ) ) + return undefined; + array = level.struct_class_names[ type ][ name ]; + if( !IsDefined( array ) ) + { + println("**** Getstruct returns undefined on " + name + " : " + " type."); + return undefined; + } + if( array.size > 1 ) + { + assertMsg( "getstruct used for more than one struct of type " + type + " called " + name + "." ); + return undefined; + } + return array[ 0 ]; +} +getstructarray( name, type ) +{ + assertEx( IsDefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); + array = level.struct_class_names[type][name]; + if(!IsDefined( array ) ) + { + return []; + } + else + { + return array; + } +} +play_sound_in_space( localClientNum, alias, origin) +{ + PlaySound( localClientNum, alias, origin); +} +vector_compare(vec1, vec2) +{ + return (abs(vec1[0] - vec2[0]) < .001) && (abs(vec1[1] - vec2[1]) < .001) && (abs(vec1[2] - vec2[2]) < .001); +} +vector_scale(vec, scale) +{ + vec = (vec * scale); + return vec; +} +vector_multiply( vec, vec2 ) +{ + vec = (vec * vec2); + return vec; +} +array_func(entities, func, arg1, arg2, arg3, arg4, arg5) +{ + if (!IsDefined( entities )) + { + return; + } + if (IsArray(entities)) + { + if (entities.size) + { + keys = GetArrayKeys( entities ); + for (i = 0; i < keys.size; i++) + { + single_func(entities[keys[i]], func, arg1, arg2, arg3, arg4, arg5); + } + } + } + else + { + single_func(entities, func, arg1, arg2, arg3, arg4, arg5); + } +} +single_func(entity, func, arg1, arg2, arg3, arg4, arg5) +{ + if (IsDefined(arg5)) + { + entity [[ func ]](arg1, arg2, arg3, arg4, arg5); + } + else if (IsDefined(arg4)) + { + entity [[ func ]](arg1, arg2, arg3, arg4); + } + else if (IsDefined(arg3)) + { + entity [[ func ]](arg1, arg2, arg3); + } + else if (IsDefined(arg2)) + { + entity [[ func ]](arg1, arg2); + } + else if (IsDefined(arg1)) + { + entity [[ func ]](arg1); + } + else + { + entity [[ func ]](); + } +} +array_thread( entities, func, arg1, arg2, arg3, arg4, arg5 ) +{ + if (!IsDefined( entities )) + { + return; + } + if (IsArray(entities)) + { + if (entities.size) + { + keys = GetArrayKeys( entities ); + for (i = 0; i < keys.size; i++) + { + single_thread(entities[keys[i]], func, arg1, arg2, arg3, arg4, arg5); + } + } + } + else + { + single_thread(entities, func, arg1, arg2, arg3, arg4, arg5); + } +} +single_thread(entity, func, arg1, arg2, arg3, arg4, arg5) +{ + if (IsDefined(arg5)) + { + entity thread [[ func ]](arg1, arg2, arg3, arg4, arg5); + } + else if (IsDefined(arg4)) + { + entity thread [[ func ]](arg1, arg2, arg3, arg4); + } + else if (IsDefined(arg3)) + { + entity thread [[ func ]](arg1, arg2, arg3); + } + else if (IsDefined(arg2)) + { + entity thread [[ func ]](arg1, arg2); + } + else if (IsDefined(arg1)) + { + entity thread [[ func ]](arg1); + } + else + { + entity thread [[ func ]](); + } +} +array(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z) +{ + array = []; + if ( IsDefined( a ) ) array[ 0] = a; else return array; + if ( IsDefined( b ) ) array[ 1] = b; else return array; + if ( IsDefined( c ) ) array[ 2] = c; else return array; + if ( IsDefined( d ) ) array[ 3] = d; else return array; + if ( IsDefined( e ) ) array[ 4] = e; else return array; + if ( IsDefined( f ) ) array[ 5] = f; else return array; + if ( IsDefined( g ) ) array[ 6] = g; else return array; + if ( IsDefined( h ) ) array[ 7] = h; else return array; + if ( IsDefined( i ) ) array[ 8] = i; else return array; + if ( IsDefined( j ) ) array[ 9] = j; else return array; + if ( IsDefined( k ) ) array[10] = k; else return array; + if ( IsDefined( l ) ) array[11] = l; else return array; + if ( IsDefined( m ) ) array[12] = m; else return array; + if ( IsDefined( n ) ) array[13] = n; else return array; + if ( IsDefined( o ) ) array[14] = o; else return array; + if ( IsDefined( p ) ) array[15] = p; else return array; + if ( IsDefined( q ) ) array[16] = q; else return array; + if ( IsDefined( r ) ) array[17] = r; else return array; + if ( IsDefined( s ) ) array[18] = s; else return array; + if ( IsDefined( t ) ) array[19] = t; else return array; + if ( IsDefined( u ) ) array[20] = u; else return array; + if ( IsDefined( v ) ) array[21] = v; else return array; + if ( IsDefined( w ) ) array[22] = w; else return array; + if ( IsDefined( x ) ) array[23] = x; else return array; + if ( IsDefined( y ) ) array[24] = y; else return array; + if ( IsDefined( z ) ) array[25] = z; + return array; +} +is_in_array( aeCollection, eFindee ) +{ + for( i = 0; i < aeCollection.size; i++ ) + { + if( aeCollection[ i ] == eFindee ) + { + return( true ); + } + } + return( false ); +} +add_to_array( array, ent, allow_dupes ) +{ + if( !IsDefined( ent ) ) + { + return array; + } + if (!IsDefined(allow_dupes)) + { + allow_dupes = true; + } + if( !IsDefined( array ) ) + { + array[ 0 ] = ent; + } + else if (allow_dupes || !is_in_array(array, ent)) + { + array[ array.size ] = ent; + } + return array; +} +array_add( array, ent ) +{ + array[ array.size ] = ent; + return array; +} +array_delete( array ) +{ + for( i = 0; i < array.size; i++ ) + { + array[ i ] delete(); + } +} +array_randomize( array ) +{ + for( i = 0; i < array.size; i++ ) + { + j = RandomInt( array.size ); + temp = array[ i ]; + array[ i ] = array[ j ]; + array[ j ] = temp; + } + return array; +} +array_reverse( array ) +{ + array2 = []; + for( i = array.size - 1; i >= 0; i-- ) + { + array2[ array2.size ] = array[ i ]; + } + return array2; +} +array_removeUndefined( array ) +{ + newArray = []; + for( i = 0; i < array.size; i++ ) + { + if( !IsDefined( array[ i ] ) ) + { + continue; + } + newArray[ newArray.size ] = array[ i ]; + } + return newArray; +} +array_insert( array, object, index ) +{ + if( index == array.size ) + { + temp = array; + temp[ temp.size ] = object; + return temp; + } + temp = []; + offset = 0; + for( i = 0; i < array.size; i++ ) + { + if( i == index ) + { + temp[ i ] = object; + offset = 1; + } + temp[ i + offset ] = array[ i ]; + } + return temp; +} +array_remove( ents, remover, keepArrayKeys ) +{ + newents = []; + keys = getArrayKeys( ents ); + if(IsDefined(keepArrayKeys)) + { + for( i = keys.size - 1; i >= 0; i-- ) + { + if( ents[ keys[ i ] ] != remover ) + { + newents[ keys[i] ] = ents[ keys[ i ] ]; + } + } + return newents; + } + for( i = keys.size - 1; i >= 0; i-- ) + { + if( ents[ keys[ i ] ] != remover ) + { + newents[ newents.size ] = ents[ keys[ i ] ]; + } + } + return newents; +} +array_remove_nokeys( ents, remover ) +{ + newents = []; + for ( i = 0; i < ents.size; i++ ) + { + if( ents[ i ] != remover ) + { + newents[ newents.size ] = ents[ i ]; + } + } + return newents; +} +array_remove_index( array, index ) +{ + newArray = []; + keys = getArrayKeys( array ); + for( i = ( keys.size - 1 );i >= 0 ; i-- ) + { + if( keys[ i ] != index ) + { + newArray[ newArray.size ] = array[ keys[ i ] ]; + } + } + return newArray; +} +array_combine( array1, array2 ) +{ + if( !array1.size ) + { + return array2; + } + array3 = []; + keys = GetArrayKeys( array1 ); + for( i = 0;i < keys.size;i++ ) + { + key = keys[ i ]; + array3[ array3.size ] = array1[ key ]; + } + keys = GetArrayKeys( array2 ); + for( i = 0;i < keys.size;i++ ) + { + key = keys[ i ]; + array3[ array3.size ] = array2[ key ]; + } + return array3; +} +array_merge( array1, array2 ) +{ + if( array1.size == 0 ) + { + return array2; + } + if( array2.size == 0 ) + { + return array1; + } + newarray = array1; + for( i = 0;i < array2.size;i++ ) + { + foundmatch = false; + for( j = 0;j < array1.size;j++ ) + { + if( array2[ i ] == array1[ j ] ) + { + foundmatch = true; + break; + } + } + if( foundmatch ) + { + continue; + } + else + { + newarray[ newarray.size ] = array2[ i ]; + } + } + return newarray; +} +array_exclude( array, arrayExclude ) +{ + newarray = array; + for( i = 0;i < arrayExclude.size;i++ ) + { + if( is_in_array( array, arrayExclude[ i ] ) ) + { + newarray = array_remove( newarray, arrayExclude[ i ] ); + } + } + return newarray; +} +array_notify( ents, notifier ) +{ + for( i = 0;i < ents.size;i++ ) + ents[ i ] notify( notifier ); +} +array_wait(array, msg, timeout) +{ + keys = getarraykeys(array); + structs = []; + for (i = 0; i < keys.size; i++) + { + key = keys[i]; + structs[ key ] = spawnstruct(); + structs[ key ]._array_wait = true; + structs[ key ] thread array_waitlogic1( array[ key ], msg, timeout ); + } + for (i = 0; i < keys.size; i++) + { + key = keys[i]; + if( IsDefined( array[ key ] ) && structs[ key ]._array_wait) + { + structs[ key ] waittill( "_array_wait" ); + } + } +} +array_waitlogic1( ent, msg, timeout ) +{ + self array_waitlogic2( ent, msg, timeout ); + self._array_wait = false; + self notify( "_array_wait" ); +} +array_waitlogic2( ent, msg, timeout ) +{ + ent endon( msg ); + ent endon( "death" ); + if( isdefined( timeout ) ) + { + wait timeout; + } + else + { + ent waittill( msg ); + } +} +array_check_for_dupes( array, single ) +{ + for( i = 0; i < array.size; i++ ) + { + if( array[i] == single ) + { + return false; + } + } + return true; +} +array_swap( array, index1, index2 ) +{ + assertEx( index1 < array.size, "index1 to swap out of range" ); + assertEx( index2 < array.size, "index2 to swap out of range" ); + temp = array[index1]; + array[index1] = array[index2]; + array[index2] = temp; + return array; +} +random( array ) +{ + return array [ randomint( array.size ) ]; +} +realWait(seconds) +{ + start = GetRealTime(); + while(GetRealTime() - start < seconds * 1000) + { + wait(.01); + } +} +registerSystem(sSysName, cbFunc) +{ + if(!IsDefined(level._systemStates)) + { + level._systemStates = []; + } + if(level._systemStates.size >= 32) + { + error("Max num client systems exceeded."); + return; + } + if(IsDefined(level._systemStates[sSysName])) + { + error("Attempt to re-register client system : " + sSysName); + return; + } + else + { + level._systemStates[sSysName] = spawnstruct(); + level._systemStates[sSysName].callback = cbFunc; + } +} +loop_sound_Delete( ender, entId ) +{ + self waittill( ender ); + deletefakeent(0, entId); +} +loop_fx_sound( clientNum, alias, origin, ender ) +{ + entId = spawnfakeent(clientNum); + if( IsDefined( ender ) ) + { + thread loop_sound_Delete( ender, entId ); + self endon( ender ); + } + setfakeentorg(clientNum, entId, origin); + playloopsound( clientNum, entId, alias ); +} +waitforallclients() +{ + localClient = 0; + while (localClient < getlocalplayers().size) + { + waitforclient(localClient); + localClient++; + } +} +waitforclient(client) +{ + while(!clienthassnapshot(client)) + { + wait(0.01); + } +} +waittill_string( msg, ent ) +{ + if ( msg != "death" ) + self endon ("death"); + ent endon ( "die" ); + self waittill ( msg ); + ent notify ( "returned", msg ); +} +waittill_any_return( string1, string2, string3, string4, string5, string6 ) +{ + if ((!IsDefined (string1) || string1 != "death") && + (!IsDefined (string2) || string2 != "death") && + (!IsDefined (string3) || string3 != "death") && + (!IsDefined (string4) || string4 != "death") && + (!IsDefined (string5) || string5 != "death") && + (!IsDefined (string6) || string6 != "death")) + self endon ("death"); + ent = SpawnStruct(); + if (IsDefined(string1)) + self thread waittill_string(string1, ent); + if (IsDefined(string2)) + self thread waittill_string(string2, ent); + if (IsDefined(string3)) + self thread waittill_string(string3, ent); + if (IsDefined(string4)) + self thread waittill_string(string4, ent); + if (IsDefined(string5)) + self thread waittill_string(string5, ent); + if (IsDefined(string6)) + self thread waittill_string(string6, ent); + ent waittill ("returned", msg); + ent notify ("die"); + return msg; +} +waittill_any( string1, string2, string3, string4, string5 ) +{ + assert( IsDefined( string1 ) ); + if ( IsDefined( string2 ) ) + self endon( string2 ); + if ( IsDefined( string3 ) ) + self endon( string3 ); + if ( IsDefined( string4 ) ) + self endon( string4 ); + if ( IsDefined( string5 ) ) + self endon( string5 ); + self waittill( string1 ); +} +waittill_multiple( string1, string2, string3, string4, string5 ) +{ + self endon ("death"); + ent = SpawnStruct(); + ent.threads = 0; + if (IsDefined (string1)) + { + self thread waittill_string (string1, ent); + ent.threads++; + } + if (IsDefined (string2)) + { + self thread waittill_string (string2, ent); + ent.threads++; + } + if (IsDefined (string3)) + { + self thread waittill_string (string3, ent); + ent.threads++; + } + if (IsDefined (string4)) + { + self thread waittill_string (string4, ent); + ent.threads++; + } + if (IsDefined (string5)) + { + self thread waittill_string (string5, ent); + ent.threads++; + } + while (ent.threads) + { + ent waittill ("returned"); + ent.threads--; + } + ent notify ("die"); +} +within_fov( start_origin, start_angles, end_origin, fov ) +{ + normal = VectorNormalize( end_origin - start_origin ); + forward = AnglesToForward( start_angles ); + dot = VectorDot( forward, normal ); + return dot >= fov; +} +setFootstepEffect(name, fx) +{ + assertEx(IsDefined(name), "Need to define the footstep surface type."); + assertEx(IsDefined(fx), "Need to define the footstep effect."); + if (!IsDefined(level._optionalStepEffects)) + level._optionalStepEffects = []; + level._optionalStepEffects[level._optionalStepEffects.size] = name; + level._effect["step_" + name] = fx; +} +getExploderId( ent ) +{ + if(!IsDefined(level._exploder_ids)) + { + level._exploder_ids = []; + level._exploder_id = 1; + } + if(!IsDefined(level._exploder_ids[ent.v["exploder"]])) + { + level._exploder_ids[ent.v["exploder"]] = level._exploder_id; + level._exploder_id ++; + } + return level._exploder_ids[ent.v["exploder"]]; +} +reportExploderIds() +{ + if(!IsDefined(level._exploder_ids)) + return; + keys = GetArrayKeys( level._exploder_ids ); + println("Client Exploder dictionary : "); + for( i = 0; i < keys.size; i++ ) + { + println(keys[i] + " : " + level._exploder_ids[keys[i]]); + } +} +init_exploders() +{ + println("*** Init exploders..."); + script_exploders = []; + ents = GetStructArray( "script_brushmodel", "classname" ); + println("Client : s_bm " + ents.size); + smodels = GetStructArray( "script_model", "classname" ); + println("Client : sm " + smodels.size); + for( i = 0; i < smodels.size; i++ ) + { + ents[ents.size] = smodels[i]; + } + for( i = 0; i < ents.size; i++ ) + { + if( IsDefined( ents[i].script_prefab_exploder ) ) + { + ents[i].script_exploder = ents[i].script_prefab_exploder; + } + } + potentialExploders = GetStructArray( "script_brushmodel", "classname" ); + println("Client : Potential exploders from script_brushmodel " + potentialExploders.size); + for( i = 0; i < potentialExploders.size; i++ ) + { + if( IsDefined( potentialExploders[i].script_prefab_exploder ) ) + { + potentialExploders[i].script_exploder = potentialExploders[i].script_prefab_exploder; + } + if( IsDefined( potentialExploders[i].script_exploder ) ) + { + script_exploders[script_exploders.size] = potentialExploders[i]; + } + } + potentialExploders = GetStructArray( "script_model", "classname" ); + println("Client : Potential exploders from script_model " + potentialExploders.size); + for( i = 0; i < potentialExploders.size; i++ ) + { + if( IsDefined( potentialExploders[i].script_prefab_exploder ) ) + { + potentialExploders[i].script_exploder = potentialExploders[i].script_prefab_exploder; + } + if( IsDefined( potentialExploders[i].script_exploder ) ) + { + script_exploders[script_exploders.size] = potentialExploders[i]; + } + } + for( i = 0; i < level.struct.size; i++ ) + { + if( IsDefined( level.struct[i].script_prefab_exploder ) ) + { + level.struct[i].script_exploder = level.struct[i].script_prefab_exploder; + } + if( IsDefined( level.struct[i].script_exploder ) ) + { + script_exploders[script_exploders.size] = level.struct[i]; + } + } + if( !IsDefined( level.createFXent ) ) + { + level.createFXent = []; + } + acceptableTargetnames = []; + acceptableTargetnames["exploderchunk visible"] = true; + acceptableTargetnames["exploderchunk"] = true; + acceptableTargetnames["exploder"] = true; + exploder_id = 1; + for( i = 0; i < script_exploders.size; i++ ) + { + exploder = script_exploders[i]; + ent = createExploder( exploder.script_fxid ); + ent.v = []; + if(!IsDefined(exploder.origin)) + { + println("************** NO EXPLODER ORIGIN." + i); + } + ent.v["origin"] = exploder.origin; + ent.v["angles"] = exploder.angles; + ent.v["delay"] = exploder.script_delay; + ent.v["firefx"] = exploder.script_firefx; + ent.v["firefxdelay"] = exploder.script_firefxdelay; + ent.v["firefxsound"] = exploder.script_firefxsound; + ent.v["firefxtimeout"] = exploder.script_firefxtimeout; + ent.v["trailfx"] = exploder.script_trailfx; + ent.v["trailfxtag"] = exploder.script_trailfxtag; + ent.v["trailfxdelay"] = exploder.script_trailfxdelay; + ent.v["trailfxsound"] = exploder.script_trailfxsound; + ent.v["trailfxtimeout"] = exploder.script_firefxtimeout; + ent.v["earthquake"] = exploder.script_earthquake; + ent.v["rumble"] = exploder.script_rumble; + ent.v["damage"] = exploder.script_damage; + ent.v["damage_radius"] = exploder.script_radius; + ent.v["repeat"] = exploder.script_repeat; + ent.v["delay_min"] = exploder.script_delay_min; + ent.v["delay_max"] = exploder.script_delay_max; + ent.v["target"] = exploder.target; + ent.v["ender"] = exploder.script_ender; + ent.v["physics"] = exploder.script_physics; + ent.v["type"] = "exploder"; + if( !IsDefined( exploder.script_fxid ) ) + { + ent.v["fxid"] = "No FX"; + } + else + { + ent.v["fxid"] = exploder.script_fxid; + } + ent.v["exploder"] = exploder.script_exploder; + if( !IsDefined( ent.v["delay"] ) ) + { + ent.v["delay"] = 0; + } + if( IsDefined( exploder.script_sound ) ) + { + ent.v["soundalias"] = exploder.script_sound; + } + else if( ent.v["fxid"] != "No FX" ) + { + if( IsDefined( level.scr_sound ) && IsDefined( level.scr_sound[ent.v["fxid"]] ) ) + { + ent.v["soundalias"] = level.scr_sound[ent.v["fxid"]]; + } + } + fixup_set = false; + if(IsDefined(ent.v["target"])) + { + ent.needs_fixup = exploder_id; + exploder_id++; + fixup_set = true; + { + temp_ent = GetStruct( ent.v["target"], "targetname" ); + org = temp_ent.origin; + } + if(IsDefined(org)) + { + ent.v["angles"] = VectorToAngles( org - ent.v["origin"] ); + } + else + { + println("*** Client : Exploder " + exploder.script_fxid + " Failed to find target "); + } + if(IsDefined(ent.v["angles"])) + { + ent set_forward_and_up_vectors(); + } + else + { + println("*** Client " + exploder.script_fxid + " has no angles."); + } + } + if( exploder.classname == "script_brushmodel" || IsDefined( exploder.model ) ) + { + if(IsDefined(exploder.model)) + { + println("*** exploder " + exploder_id + " model " + exploder.model); + } + ent.model = exploder; + if(fixup_set == false) + { + ent.needs_fixup = exploder_id; + exploder_id++; + } + } + if( IsDefined( exploder.targetname ) && IsDefined( acceptableTargetnames[exploder.targetname] ) ) + { + ent.v["exploder_type"] = exploder.targetname; + } + else + { + ent.v["exploder_type"] = "normal"; + } + } + for(i = 0; i < level.createFXent.size;i ++ ) + { + ent = level.createFXent[i]; + if(ent.v["type"] != "exploder") + continue; + ent.v["exploder_id"] = getExploderId( ent ); + } + reportExploderIds(); + println("*** Client : " + script_exploders.size + " exploders."); +} +playfx_for_all_local_clients( fx_id, pos, forward_vec, up_vec ) +{ + localPlayers = getlocalplayers(); + if( IsDefined( up_vec ) ) + { + for(i = 0; i < localPlayers.size; i ++) + { + playfx( i, fx_id, pos, forward_vec, up_vec ); + } + } + else if( IsDefined( forward_vec ) ) + { + for(i = 0; i < localPlayers.size; i ++) + { + playfx( i, fx_id, pos, forward_vec ); + } + } + else + { + for(i = 0; i < localPlayers.size; i ++) + { + playfx( i, fx_id, pos ); + } + } +} +play_sound_on_client( sound_alias ) +{ + players = GetLocalPlayers(); + PlaySound( 0, sound_alias, players[0].origin ); +} +loop_sound_on_client( sound_alias, min_delay, max_delay, end_on ) +{ + players = GetLocalPlayers(); + if( IsDefined( end_on ) ) + { + level endon( end_on ); + } + for( ;; ) + { + play_sound_on_client( sound_alias ); + wait( min_delay + RandomFloat( max_delay ) ); + } +} +add_listen_thread( wait_till, func, param1, param2, param3, param4, param5 ) +{ + level thread add_listen_thread_internal( wait_till, func, param1, param2, param3, param4, param5 ); +} +add_listen_thread_internal( wait_till, func, param1, param2, param3, param4, param5 ) +{ + for( ;; ) + { + level waittill( wait_till ); + single_thread(level, func, param1, param2, param3, param4, param5); + } +} +addLightningExploder(num) +{ + if (!isdefined(level.lightningExploder)) + { + level.lightningExploder = []; + level.lightningExploderIndex = 0; + } + level.lightningExploder[level.lightningExploder.size] = num; +} +splitscreen_populate_dvars( clientNum ) +{ + if ( getlocalplayers().size <= 1 ) + { + return; + } + UpdateDvarsFromProfile( clientNum ); +} +splitscreen_restore_dvars() +{ + if ( getlocalplayers().size <= 1 ) + { + return; + } + splitscreen_populate_dvars( 0 ); +} +is_plane() +{ + if(self.vehicleclass == "plane") + { + return true; + } + return false; +} +is_boat() +{ + if(self.vehicleclass == "boat") + { + return true; + } + return false; +} +is_mig() +{ + if(self.vehicletype == "plane_mig17" || self.vehicletype == "plane_mig21") + { + return true; + } + return false; +} +is_helicopter() +{ + if(self.vehicleclass == "helicopter") + { + return true; + } + return false; +} +is_tank() +{ + if(self.vehicleclass == "tank") + { + return true; + } + return false; +} +is_artillery() +{ + if(self.vehicleclass == "artillery") + { + return true; + } + return false; +} +is_4wheel() +{ + if(self.vehicleclass == "4 wheel") + { + return true; + } + return false; +} +add_trigger_to_ent(ent, trig) +{ + if(!isdefined(ent._triggers)) + { + ent._triggers = []; + } + ent._triggers[trig getentitynumber()] = 1; +} +remove_trigger_from_ent(ent, trig) +{ + if(!isdefined(ent._triggers)) + return; + if(!isdefined(ent._triggers[trig getentitynumber()])) + return; + ent._triggers[trig getentitynumber()] = 0; +} +ent_already_in_trigger(trig) +{ + if(!isdefined(self._triggers)) + return false; + if(!isdefined(self._triggers[trig getentitynumber()])) + return false; + if(!self._triggers[trig getentitynumber()]) + return false; + return true; +} +trigger_thread(ent, on_enter_payload, on_exit_payload) +{ + ent endon("entityshutdown"); + ent endon("death"); + if(ent ent_already_in_trigger(self)) + return; + add_trigger_to_ent(ent, self); + if(isdefined(on_enter_payload)) + { + [[on_enter_payload]](ent); + } + while(isdefined(ent) && ent istouching(self)) + { + wait(0.01); + } + if(ent IsPlayer()) + { + while(!ClientHasSnapshot(0)) + { + wait(0.01); + } + } + if(isdefined(ent) && isdefined(on_exit_payload)) + { + [[on_exit_payload]](ent); + } + if(isdefined(ent)) + { + remove_trigger_from_ent(ent, self); + } +} +remove_triggers_from_ent( ent ) +{ + if( IsDefined( ent._triggers ) ) + { + ent._triggers = []; + } +} +notify_delay( sNotifyString, fDelay ) +{ + assert( IsDefined( self ) ); + assert( IsDefined( sNotifyString ) ); + assert( IsDefined( fDelay ) ); + assert( fDelay > 0 ); + self endon( "death" ); + wait fDelay; + if( !IsDefined( self ) ) + { + return; + } + self notify( sNotifyString ); +} +OnPlayerConnect_Callback(func) +{ + clientscripts\_callbacks::AddCallback("on_player_connect", func); +} +set_player_viewmodel(viewmodel) +{ + level.player_viewmodel = viewmodel; +} +spawn_player_arms() +{ + arms = Spawn(self GetLocalClientNumber(), self GetOrigin() + ( 0, 0, -1000 ), "script_model"); + if (IsDefined(level.player_viewmodel)) + { + arms SetModel(level.player_viewmodel); + } + else + { + arms SetModel("viewmodel_usa_marine_arms"); + } + return arms; +} +get_eye() +{ + if (self IsPlayer()) + { + linked_ent = self GetLinkedEnt(); + if (IsDefined(linked_ent) && (GetDvarInt(#"cg_cameraUseTagCamera") > 0)) + { + camera = linked_ent GetTagOrigin("tag_camera"); + if (IsDefined(camera)) + { + return camera; + } + } + } + pos = self GetEye(); + return pos; +} +clamp(val, val_min, val_max) +{ + if (val < val_min) + { + val = val_min; + } + else if (val > val_max) + { + val = val_max; + } + return val; +} +waittill_either( msg1, msg2 ) +{ + self endon( msg1 ); + self waittill( msg2 ); +} +is_valid_type_for_callback(type) +{ + switch(type) + { + case "actor": + case "vehicle": + case "player": + case "NA": + case "general": + case "missile": + case "scriptmover": + case "mg42": + case "plane": + { + return true; + } + default: + { + return false; + } + } +} +register_clientflag_callback(type, flag, function) +{ + if(!is_valid_type_for_callback(type)) + { + AssertMsg(type + " is not a valid entity type to have a callback function registered."); + return; + } + if(IsDefined(level._client_flag_callbacks[type][flag])) + { + if(level._client_flag_callbacks[type][flag] == function) + { + return; + } + AssertMsg("Flag " + flag + " is already registered for ent type " + type + ". Please use a different flag number. See console for list of free flags for this type."); + return; + } + level._client_flag_callbacks[type][flag] = function; +} +is_mature() +{ + if ( level.onlineGame ) + return true; + return GetDvarInt( #"cg_mature" ); +} +is_german_build() +{ + if( GetDvar( #"language" ) == "german" ) + { + return true; + } + return false; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_utility_code.csc b/BO1/PC/ZM/clientscripts/_utility_code.csc new file mode 100644 index 0000000..40edac2 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_utility_code.csc differ diff --git a/BO1/PC/ZM/clientscripts/_vehicle.csc b/BO1/PC/ZM/clientscripts/_vehicle.csc new file mode 100644 index 0000000..d119430 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_vehicle.csc @@ -0,0 +1,1163 @@ +#include clientscripts\_utility; +init_vehicles() +{ + level.vehicles_inited = true; +} +vehicle_rumble( localClientNum ) +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + if( !isdefined( self.rumbletype ) || ( self.rumbleradius == 0 ) ) + { + return; + } + if( !isdefined( self.rumbleon ) ) + { + self.rumbleon = true; + } + height = self.rumbleradius * 2; + zoffset = -1 * self.rumbleradius; + self.player_touching = 0; + radius_squared = self.rumbleradius * self.rumbleradius; + wait 2; + while( 1 ) + { + if( ( distancesquared( self.origin, getlocalplayers()[localClientNum].origin ) > radius_squared ) || self getspeed() == 0 ) + { + wait( 0.2 ); + continue; + } + if( isdefined( self.rumbleon ) && !self.rumbleon ) + { + wait( 0.2 ); + continue; + } + self PlayRumbleLoopOnEntity( localClientNum, self.rumbletype ); + while( ( distancesquared( self.origin, getlocalplayers()[localClientNum].origin ) < radius_squared ) &&( self getspeed() > 0 ) ) + { + self earthquake( self.rumblescale, self.rumbleduration, self.origin, self.rumbleradius ); + wait( self.rumblebasetime + randomfloat( self.rumbleadditionaltime ) ); + } + self StopRumble( localClientNum, self.rumbletype ); + } +} +vehicle_treads( localClientNum ) +{ + waittillframeend; + PrintLn("****CLIENT:: Creating TreadFX: " + self GetEntityNumber()); + if( !isdefined( level.vehicles_inited ) || !isdefined(self.treadfx) ) + { + return; + } + if( IsDefined(self.csf_no_tread) && self.csf_no_tread ) + { + return; + } + if( self is_plane() ) + { + return; + } + if( self.vehicleclass == "boat" && self.vehicletype != "inc_base_jump_spotlight") + { + self thread wake( localClientNum, "tag_wake" ); + self thread splash( localClientNum ); + self thread splash_small(); + } + else if ( self.vehicleclass == "motorcycle" ) + { + self thread tread( localClientNum, "tag_wheel_back", "back_left" ); + } + else + { + self thread tread( localClientNum, "tag_wheel_back_left", "back_left" ); + self thread tread( localClientNum, "tag_wheel_back_right", "back_right" ); + } +} +vehicle_kill_treads_forever() +{ + PrintLn("****CLIENT:: killing the tread_fx"); + self notify( "kill_treads_forever" ); +} +get_throttle_effect( throttle ) +{ + if( IsDefined(self.throttlefx) ) + { + if( throttle < 0.3 ) + { + return self.throttlefx[0]; + } + else if( throttle < 0.7 ) + { + return self.throttlefx[1]; + } + else + { + return self.throttlefx[2]; + } + } + return undefined; +} +wake_mon(localClientNum) +{ + self waittill("kill_treads_forever"); + level endon( "save_restore" ); + self endon( "entityshutdown" ); + if(IsDefined(self.wake_fxHandle)) + { + deletefx( localClientNum, self.wake_fxHandle, 0 ); + self.wake_fxHandle = undefined; + } +} +wake( localClientNum, tagname ) +{ + self endon( "entityshutdown" ); + self endon( "kill_treads_forever" ); + level endon( "kill_treads_forever" ); + level endon( "save_restore" ); + treadfx = treadget( self, "back_left" ); + if( treadfx == -1 ) + { + return; + } + self thread wake_mon(localClientNum); + self.wake_fxHandle = undefined; + wakeState = -1; + inwater = true; + for( ;; ) + { + speed = self getspeed(); + if( !isdefined(self.wakefx) ) + { + if( speed < 50 ) + { + if( IsDefined(self.wake_fxHandle) ) + { + deletefx( localClientNum, self.wake_fxHandle, 0 ); + self.wake_fxHandle = undefined; + } + } + else if( !IsDefined(self.wake_fxHandle) ) + { + self.wake_fxHandle = PlayFXOnTag( localClientNum, treadfx, self, tagname ); + } + } + else + { + newState = 0; + if( speed > 150 && self getthrottle() < 0 ) + { + newState = 0; + } + else if( speed < 70 ) + { + newState = 1; + } + else if( speed < 300 ) + { + newState = 2; + } + else if( speed < 600 ) + { + newState = 3; + } + else + { + newState = 4; + } + if( wakeState != newState ) + { + if( IsDefined(self.wake_fxHandle) ) + { + deletefx( localClientNum, self.wake_fxHandle, 0 ); + self.wake_fxHandle = undefined; + } + wakeState = newState; + fx = self.wakefx[wakeState]; + self.wake_fxHandle = PlayFXOnTag( localClientNum, fx, self, tagname ); + } + } + throttle = self getthrottle(); + if( throttle > 0.0 ) + { + throttleEffect = self get_throttle_effect( throttle ); + if( IsDefined( throttleEffect ) ) + { + effectOrigin = self getTagOrigin( tagname ); + fwd = self gettagforwardvector( tagname ); + playfx( localClientNum, throttleEffect, effectOrigin, fwd ); + } + } + wait 0.1; + } +} +splash( localClientNum ) +{ + self endon( "entityshutdown" ); + self endon( "kill_treads_forever" ); + level endon( "kill_treads_forever" ); + level endon( "save_restore" ); + if( !IsDefined( self.splashfx ) ) + { + return; + } + wasinwater = true; + offset = (0,0,-10); + last_water_check_pos = self.origin + anglestoforward( self.angles ) * 100 + offset; + for( ;; ) + { + wait(0.5); + water_check_pos = self.origin + anglestoforward( self.angles ) * 100 + offset; + water_height = getwaterheight( water_check_pos ); + isinwater = water_check_pos[2] < water_height; + vertical_speed = water_check_pos[2] - last_water_check_pos[2]; + if( !wasinwater && isinwater ) + { + vertical_speed = water_check_pos[2] - last_water_check_pos[2]; + if( self getspeed() > 300 && vertical_speed < -2 ) + { + splashOrigin = self getTagOrigin( "snd_bow_center"); + effectOrigin = self getTagOrigin( "tag_wake" ); + fwd = self gettagforwardvector( "tag_wake" ); + playfx( localClientNum, self.splashfx, effectOrigin, fwd ); + id = playsound( 0, "veh_boat_splash", splashOrigin); + } + } + wasinwater = isinwater; + last_water_check_pos = water_check_pos; + } +} +splash_small() +{ + self endon( "entityshutdown" ); + self endon( "kill_treads_forever" ); + level endon( "kill_treads_forever" ); + level endon( "save_restore" ); + offset = (0,0,-10); + wait( randomfloat( 0.5 ) ); + for( ;; ) + { + water_check_pos = self.origin + anglestoforward( self.angles ) * 100 + offset; + wait( 0.5 ); + water_check_pos_2 = self.origin + anglestoforward( self.angles ) * 100 + offset; + water_height = getwaterheight( water_check_pos ); + isinwater = water_check_pos[2] < water_height; + vertical_speed = water_check_pos[2] - water_check_pos_2[2]; + if (isinwater) + { + vertical_speed = water_check_pos_2[2] - water_check_pos[2]; + if( self getspeed() > 100 && vertical_speed < -0.6 ) + { + splashOrigin = self getTagOrigin( "snd_bow_center"); + if( !isdefined(splashOrigin) ) + { + splashOrigin = self getTagOrigin( "tag_origin" ); + println( "***SOUND: Can't find snd_bow_center***" ); + } + id = playsound( 0, "veh_boat_splash_small", splashOrigin ); + wait(1.6); + } + } + } +} +tread( localClientNum, tagname, side, relativeOffset ) +{ + self endon( "entityshutdown" ); + self endon( "kill_treads_forever" ); + level endon( "kill_treads_forever" ); + level endon( "save_restore" ); + treadfx = treadget( self, side ); + if( treadfx == -1 ) + { + return; + } + wait( randomfloat( 0.5 ) ); + for( ;; ) + { + speed = self getspeed(); + if( speed == 0 || ( speed > -1 && speed < 1) ) + { + wait 0.11; + continue; + } + if( speed > 350 ) + { + waitTime = 0.1; + } + else if( speed < 166 ) + { + waitTime = 0.3; + } + else + { + waitTime = ( 35 / speed ); + } + wait waitTime; + treadfx = treadget( self, side ); + if( treadfx != -1 ) + { + forwardVec = self gettagforwardvector( tagname ); + effectOrigin = self getTagOrigin( tagname ); + forwardVec = vector_scale( forwardVec, waitTime ); + playfx( localClientNum, treadfx, effectOrigin, ( 0, 0, 0 ) - forwardVec ); + } + } +} +treadget( vehicle, side ) +{ + if( vehicle.vehicleclass == "boat" ) + { + if( !isdefined( vehicle.treadfx["water"] ) ) + { + println( "clientside treadfx not setup for boat type( only needs water ): ", vehicle.vehicletype ); + wait 10; + return -1; + } + return vehicle.treadfx["water"]; + } + surface = self getwheelsurface( side ); + if( !isdefined( vehicle.vehicletype ) ) + { + treadfx = -1; + return treadfx; + } + if( !isdefined( vehicle.treadfx[surface] ) ) + { + println( "clientside treadfx not setup for vehicle type: ", vehicle.vehicletype + " (surface: " + surface + ")" ); + wait 10; + return -1; + } + treadfx = vehicle.treadfx[surface]; + if( !isdefined( treadfx ) ) + { + treadfx = -1; + } + return treadfx; +} +playTankExhaust( localClientNum ) +{ + if( IsDefined(self.csf_no_exhaust) && self.csf_no_exhaust ) + { + return; + } + if( isdefined( self ) && ( self isalive() ) && isdefined( self.exhaust_fx ) ) + { + PlayFXOnTag( localClientNum, self.exhaust_fx, self, "tag_engine_left" ); + if( !self.oneexhaust ) + PlayFXOnTag( localClientNum, self.exhaust_fx, self, "tag_engine_right" ); + } +} +play_exhaust( localClientNum ) +{ + if( IsDefined(self.csf_no_exhaust) && self.csf_no_exhaust ) + { + return; + } + if( isdefined( self ) && ( self isalive() ) && isdefined( self.exhaust_fx ) ) + { + PlayFXOnTag( localClientNum, self.exhaust_fx, self, "tag_engine_left" ); + if( !self.oneexhaust ) + PlayFXOnTag( localClientNum, self.exhaust_fx, self, "tag_engine_right" ); + } +} +build_gear( vehicletype, model, tag ) +{ + index = 0; + if( isdefined( level.vehicleGearModels ) ) + { + if( isdefined( level.vehicleGearModels[vehicletype] ) ) + { + index = level.vehicleGearModels[vehicletype].size; + } + } + level.vehicleGearModels[vehicletype][index] = model; + level.vehicleGearTags[vehicletype][index] = tag; +} +vehicle_variants( localClientNum ) +{ + if( isdefined( level.vehicleGearModels ) ) + { + if( isdefined( level.vehicleGearModels[self.vehicletype] ) ) + { + numGear = level.vehicleGearModels[self.vehicletype].size; + maxGear = 2; + if( numGear < maxGear ) + { + maxGear = numGear; + } + randomConstantNumber = self getentitynumber(); + for( i = 0 ; i < maxGear ; i++ ) + { + alreadyChosen = true; + gearChoices[i] = -1; + while( alreadyChosen ) + { + alreadyChosen = false; + gearChoices[i] = randomConstantNumber % numGear; + for( j = 0 ; j < i ; j++ ) + { + if( level.vehicleGearTags[self.vehicletype][gearChoices[j]] == level.vehicleGearTags[self.vehicletype][gearChoices[i]] ) + { + alreadyChosen = true; + break; + } + } + } + self attach( level.vehicleGearModels[self.vehicletype][gearChoices[i]], level.vehicleGearTags[self.vehicletype][gearChoices[i]] ); + randomConstantNumber++; + } + } + } +} +aircraft_dustkick() +{ + waittillframeend; + self endon( "kill_treads_forever" ); + self endon( "entityshutdown" ); + level endon( "save_restore" ); + if( IsDefined(self.csf_no_tread) && self.csf_no_tread ) + { + return; + } + maxHeight = 1200; + minHeight = 350; + slowestRepeatWait = 0.15; + fastestRepeatWait = 0.05; + if( self is_mig() ) + { + numFramesPerTrace = 1; + } + else + { + numFramesPerTrace = 3; + } + doTraceThisFrame = numFramesPerTrace; + defaultRepeatRate = 1.0; + repeatRate = defaultRepeatRate; + trace = undefined; + d = undefined; + trace_ent = self; + while( isdefined( self ) ) + { + if( repeatRate <= 0 ) + { + repeatRate = defaultRepeatRate; + } + if( self is_mig() ) + { + repeatRate = 0.02; + } + realwait( repeatRate ); + if( !isdefined( self ) ) + { + return; + } + doTraceThisFrame-- ; + if( doTraceThisFrame <= 0 ) + { + doTraceThisFrame = numFramesPerTrace; + trace = tracepoint( trace_ent.origin, trace_ent.origin -( 0, 0, 100000 ) ); + d = distance( trace_ent.origin, trace["position"] ); + repeatRate = ( ( d - minHeight ) / ( maxHeight - minHeight ) ) * ( slowestRepeatWait - fastestRepeatWait ) + fastestRepeatWait; + } + if( isdefined( trace ) ) + { + if( d > maxHeight ) + { + repeatRate = defaultRepeatRate; + continue; + } + if( !isdefined( trace["surfacetype"] ) ) + { + trace["surfacetype"] = "dirt"; + } + if( IsDefined( self.treadfx[trace["surfacetype"]] ) ) + { + playfx( 0, self.treadfx[trace["surfacetype"]], trace["position"] ); + } + else + { + println("SCRIPT PRINT: Unknown surface type " + trace["surfacetype"] + " for vehicle type " + self.vehicletype); + return; + } + } + } +} +vehicle_weapon_fired() +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + shock_distance = 400 * 400; + rumble_distance = 500 * 500; + while( true ) + { + self waittill( "weapon_fired" ); + players = getlocalplayers(); + for( i = 0; i < players.size; i++ ) + { + player_distance = DistanceSquared( self.origin, players[i].origin ); + if( player_distance < rumble_distance ) + { + if( IsDefined(self.shootrumble) && self.shootrumble != "" ) + { + PlayRumbleOnPosition( i, self.shootrumble, self.origin + ( 0, 0, 32 ) ); + } + } + if( player_distance < shock_distance ) + { + fraction = player_distance / shock_distance; + time = 4 - ( 3 * fraction ); + if( IsDefined( players[i] ) ) + { + if( IsDefined(self.shootshock) && self.shootshock != "" ) + { + players[i] ShellShock( i, self.shootshock, time ); + } + } + } + } + } +} +delete_rotor_fx_on_save_restore(localClientNum) +{ + self endon("entityshutdown"); + level waittill("save_restore"); + if(IsDefined(self.rotorMainfxHandle_saved)) + { + DeleteFX(localClientNum, self.rotorMainfxHandle_saved); + } + if(IsDefined(self.rotorTailfxHandle_saved)) + { + DeleteFX(localClientNum, self.rotorTailfxHandle_saved); + } +} +play_rotor_fx(localClientNum) +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + PrintLn("prfx"); + if(IsDefined(self.csf_stationary_rotor) && self.csf_stationary_rotor) + { + PrintLn("prfx falls into prffxstat"); + self play_rotor_fx_stationary(localClientNum); + return; + } + if( IsDefined(self.csf_stationary_rotor) && !self.csf_stationary_rotor) + { + PrintLn("prfx plays start up seq."); + if(IsDefined(self.rotorMainStartFxName) && self.rotorMainStartFxName != "" ) + { + self.rotorMainStartFx = LoadFX( self.rotorMainStartFxName ); + if( IsDefined(self.rotorMainStartFx) ) + { + self.rotorMainFxHandle = PlayFXOnTag(localClientNum, self.rotorMainStartFx, self, "main_rotor_jnt"); + self.rotorMainfxHandle_saved = self.rotorMainfxHandle; + } + else + { + println("Client: _vehicles.csc - play_rotor_fx() - main rotor fx for starting is not loaded"); + } + } + if( isdefined( self.rotorTailStartFxName ) && self.rotorTailStartFxName != "" ) + { + self.rotorTailStartFx = LoadFX( self.rotorTailStartFxName ); + if( IsDefined(self.rotorTailStartFx) ) + { + self.rotorTailfxHandle = PlayFXOnTag(localClientNum, self.rotorTailStartFx, self, "tail_rotor_jnt"); + self.rotorTailfxHandle_saved = self.rotorTailfxHandle; + } + else + { + println("Client: _vehicles.csc - play_rotor_fx_stationary() - tail rotor fx aren't loaded for starting the rotor"); + } + } + self notify("stop_exhaust_fx"); + self thread play_exhaust( localClientNum ); + if(IsDefined(self.rotorMainStartFxName) && self.rotorMainStartFxName != "" ) + { + realwait(4.0); + } + self vehicle_kill_treads_forever(); + self thread aircraft_dustkick(); + if(IsDefined(self.rotorMainStartFxName) && self.rotorMainStartFxName != "" ) + { + realwait(4.0); + } + if (IsDefined(self.rotorMainFxHandle)) + { + DeleteFX(localClientNum, self.rotorMainFxHandle); + } + if (IsDefined(self.rotorTailFxHandle)) + { + DeleteFX(localClientNum, self.rotorTailFxHandle); + } + } + println("rotorMainRunningFxName: " + self.rotorMainRunningFxName); + println("rotormainrunningfxname: " + self.rotormainrunningfxname); + if( isdefined( self.rotorMainRunningFxName ) && self.rotorMainRunningFxName != "" ) + { + self.rotorMainRunningFx = LoadFX( self.rotorMainRunningFxName ); + if(IsDefined(self.useAlternateRotor) && self.useAlternateRotor) + { + while(!IsDefined(level.rotorAlternateRunningFX)) + { + wait(0.05); + } + self.rotorMainRunningFX = level.rotorAlternateRunningFX; + self.useAlternateRotor = false; + } + if( IsDefined(self.rotorMainRunningFx) ) + { + self.rotorMainfxHandle = PlayFXOnTag(localClientNum, self.rotorMainRunningFx, self, "main_rotor_jnt"); + self.rotorMainfxHandle_saved = self.rotorMainfxHandle; + } + else + { + println("Client: _vehicles.csc - play_rotor_fx() - main rotor fx aren't loaded"); + } + } + if( isdefined( self.rotorTailRunningFxName ) && self.rotorTailRunningFxName != "" ) + { + self.rotorTailRunningFx = LoadFX( self.rotorTailRunningFxName ); + if( IsDefined(self.rotorTailRunningFx) ) + { + self.rotorTailfxHandle = PlayFXOnTag(localClientNum, self.rotorTailRunningFx, self, "tail_rotor_jnt"); + self.rotorTailfxHandle_saved = self.rotorTailfxHandle; + } + else + { + println("Client: _vehicles.csc - play_rotor_fx() - tail rotor fx aren't loaded"); + } + } + PrintLn("script sets csf_stationary to false."); + self thread csf_stat_rotor_mon(); + self.csf_stationary_rotor = false; +} +csf_stat_rotor_mon() +{ + self endon("entityshutdown"); + self waittill("save_restore"); + self.csf_stationary_rotor = undefined; +} +play_rotor_fx_stationary(localClientNum) +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + println("rotorMainIdleFxName: " + self.rotorMainIdleFxName); + println("rotormainIdlefxname: " + self.rotormainidlefxname); + if( !IsDefined(self.csf_stationary_rotor) || !self.csf_stationary_rotor ) + { + if(IsDefined(self.rotorMainStopFxName) && self.rotorMainStopFxName != "" ) + { + self.rotorMainStopFx = LoadFX( self.rotorMainStopFxName ); + if( IsDefined(self.rotorMainStopFx) ) + { + self.rotorMainFxHandle = PlayFXOnTag(localClientNum, self.rotorMainStopFx, self, "main_rotor_jnt"); + self.rotorMainfxHandle_saved = self.rotorMainfxHandle; + } + else + { + println("Client: _vehicles.csc - play_rotor_fx_stationary() - main rotor fx for stopping is not loaded"); + } + } + if( isdefined( self.rotorTailStopFxName ) && self.rotorTailStopFxName != "" ) + { + self.rotorTailStopFx = LoadFX( self.rotorTailStopFxName ); + if( IsDefined(self.rotorTailStopFx) ) + { + self.rotorTailfxHandle = PlayFXOnTag(localClientNum, self.rotorTailStopFx, self, "tail_rotor_jnt"); + self.rotorTailfxHandle_saved = self.rotorTailfxHandle; + } + else + { + println("Client: _vehicles.csc - play_rotor_fx_stationary() - tail rotor fx aren't loaded for stopping the rotor"); + } + } + realwait(4); + self notify("stop_exhaust_fx"); + self vehicle_kill_treads_forever(); + realwait(3.9); + if (IsDefined(self.rotorMainFxHandle)) + { + DeleteFX(localClientNum, self.rotorMainFxHandle); + } + if (IsDefined(self.rotorTailFxHandle)) + { + DeleteFX(localClientNum, self.rotorTailFxHandle); + } + } + if( isdefined( self.rotorMainIdleFxName ) && self.rotorMainIdleFxName != "" ) + { + self.rotorMainIdleFx = LoadFX( self.rotorMainIdleFxName ); + if( IsDefined(self.rotorMainIdleFx) ) + { + self.rotorMainfxHandle = PlayFXOnTag(localClientNum, self.rotorMainIdleFx, self, "main_rotor_jnt"); + self.rotorMainfxHandle_saved = self.rotorMainfxHandle; + } + else + { + println("Client: _vehicles.csc - play_rotor_fx_stationary() - main rotor fx aren't loaded"); + } + } + if( isdefined( self.rotorTailIdleFxName ) && self.rotorTailIdleFxName != "" ) + { + self.rotorTailIdleFx = LoadFX( self.rotorTailIdleFxName ); + if( IsDefined(self.rotorTailIdleFx) ) + { + self.rotorTailfxHandle = PlayFXOnTag(localClientNum, self.rotorTailIdleFx, self, "tail_rotor_jnt"); + self.rotorTailfxHandle_saved = self.rotorTailfxHandle; + } + else + { + println("Client: _vehicles.csc - play_rotor_fx_stationary() - tail rotor fx aren't loaded"); + } + } + PrintLn("Script sets csf_stationary to true."); + self.csf_stationary_rotor = true; +} +loop_rotor_fx(localClientNum, effect, attachTag) +{ + self endon( "entityshutdown" ); + level endon( "save_restore" ); + assert( IsDefined(effect) ); + if(IsDefined(level._customRotorFx)) + { + self thread [[level._customRotorFx]](localClientNum); + return; + } + while(true) + { + if(!IsDefined(self)) + { + break; + } + fxHandle = PlayFXOnTag(localClientNum, effect, self, attachTag); + realwait(0.01); + while( IsFXPlaying(localClientNum, fxHandle) ) + { + realwait(0.01); + } + } +} +vehicle_clientmain(localClientNum) +{ + switch( self.vehicletype ) + { + case "uaz": + case "cobra": + case "jeep": + case "willys": + break; + default: + break; + } +} +headlights_on(localClientNum) +{ + if (self.vehicletype == "police") + { + self.headlightFX = LoadFX("vehicle/light/fx_cuba_police_headlight"); + self.frontDLightFX = LoadFX("maps/cuba/fx_cuba_veh_front_end_lights"); + if (!IsDefined(self.frontDLightFXHandle)) + { + self.frontDLightFXHandle = PlayFXOnTag(localClientNum, self.frontDLightFX, self, "tag_origin_animate_jnt"); + } + } + else if (self.vehicletype == "cuba_player") + { + return; + } + else + { + self.headlightFX = LoadFX("vehicle/light/fx_jeep_uaz_headlight"); + } + if (!IsDefined(self.headlightLeftFXHandle)) + { + self.headlightLeftFXHandle = PlayFXOnTag(localClientNum, self.headlightFX, self, "tag_headlight_left"); + } + if (!IsDefined(self.headlightRightFXHandle)) + { + self.headlightRightFXHandle = PlayFXOnTag(localClientNum, self.headlightFX, self, "tag_headlight_right"); + } +} +headlights_off(localClientNum) +{ + if (IsDefined(self.headlightLeftFXHandle)) + { + DeleteFX(localClientNum, self.headlightLeftFXHandle); + self.headlightLeftFXHandle = undefined; + } + if (IsDefined(self.headlightRightFXHandle)) + { + DeleteFX(localClientNum, self.headlightRightFXHandle); + self.headlightRightFXHandle = undefined; + } + if (IsDefined(self.frontDLightFXHandle)) + { + DeleteFX(localClientNum, self.frontDLightFXHandle); + self.frontDLightFXHandle = undefined; + } +} +taillights_on(localClientNum) +{ + if (self.vehicletype == "police") + { + self.taillightLeftFX = LoadFX("vehicle/light/fx_cuba_police_taillight_left"); + self.taillightRightFX = LoadFX("vehicle/light/fx_cuba_police_taillight_right"); + self.taillightLeftTag = "tag_brakelight_left"; + self.taillightRightTag = "tag_brakelight_right"; + } + else if (self.vehicletype == "cuba_player") + { + self.taillightLeftFX = LoadFX("vehicle/light/fx_cuba_car_brakelight"); + self.taillightLeftTag = "body_animate_jnt"; + } + else + { + self.taillightLeftFX = LoadFX("vehicle/light/fx_jeep_uaz_taillight"); + self.taillightRightFX = LoadFX("vehicle/light/fx_jeep_uaz_taillight"); + self.taillightLeftTag = "tag_tail_light_left"; + self.taillightRightTag = "tag_tail_light_right"; + } + if (!IsDefined(self.taillightLeftFXHandle)) + { + self.taillightLeftFXHandle = PlayFXOnTag(localClientNum, self.taillightLeftFX, self, self.taillightLeftTag); + } + if (!IsDefined(self.taillightRightFXHandle) && IsDefined(self.taillightRightFX)) + { + self.taillightRightFXHandle = PlayFXOnTag(localClientNum, self.taillightRightFX, self, self.taillightRightTag); + } +} +taillights_off(localClientNum) +{ + if (IsDefined(self.taillightLeftFXHandle)) + { + DeleteFX(localClientNum, self.taillightLeftFXHandle); + self.taillightLeftFXHandle = undefined; + } + if (IsDefined(self.taillightRightFXHandle)) + { + DeleteFX(localClientNum, self.taillightRightFXHandle); + self.taillightRightFXHandle = undefined; + } +} +interior_lights_on(localClientNum) +{ + if (self.vehicletype == "police") + { + self.interiorLightFX = LoadFX("maps/cuba/fx_cuba_veh_interior_lights"); + self.interiorLightTag = "tag_origin_animate_jnt"; + if (!IsDefined(self.interiorLightFXHandle)) + { + self.interiorLightFXHandle = PlayFXOnTag(localClientNum, self.interiorLightFX, self, self.interiorLightTag); + } + } +} +interior_lights_off(localClientNum) +{ + if (IsDefined(self.interiorLightFXHandle)) + { + DeleteFX(localClientNum, self.interiorLightFXHandle); + self.interiorLightFXHandle = undefined; + } +} +sirenlights_on(localClientNum) +{ + if (!IsDefined(self.sirenlightFXHandle)) + { + self.sirenlightFX = LoadFX( "maps/cuba/fx_cuba_siren_light" ); + self.sirenlightFXHandle = PlayFXOnTag(localClientNum, self.sirenlightFX, self, "tag_origin_animate_jnt"); + } +} +sirenlights_off(localClientNum) +{ + if (IsDefined(self.sirenlightFXHandle)) + { + DeleteFX(localClientNum, self.sirenlightFXHandle); + self.sirenlightFXHandle = undefined; + } +} +vehicle_flag_toggle_sounds(localClientNum, set, newEnt) +{ + if(self is_helicopter()) + { + if(set) + { + self notify( "stop_heli_sounds" ); + self.should_not_play_sounds = true; + } + else + { + self notify( "play_heli_sounds" ); + self.should_not_play_sounds = false; + } + } + else + { + } +} +vehicle_flag_turn_off_treadfx(localClientNum, set, newEnt) +{ + if(self is_helicopter() || self is_plane()) + { + PrintLn("****CLIENT:: Vehicle Flag Plane"); + if(set) + { + if(IsDefined(newEnt) && newEnt) + { + self.csf_no_tread = true; + } + else + { + self vehicle_kill_treads_forever(); + } + } + else + { + if(IsDefined(self.csf_no_tread)) + { + self.csf_no_tread = false; + } + self vehicle_kill_treads_forever(); + self thread aircraft_dustkick(); + } + } + else + { + if(set) + { + PrintLn("****CLIENT:: Vehicle Flag Tread FX Set"); + if(IsDefined(newEnt) && newEnt) + { + PrintLn("****CLIENT:: TreadFX NewEnt: " + self GetEntityNumber()); + self.csf_no_tread = true; + } + else + { + PrintLn("****CLIENT:: TreadFX OldEnt" + self GetEntityNumber()); + self vehicle_kill_treads_forever(); + } + } + else + { + PrintLn("****CLIENT:: Vehicle Flag Tread FX Clear"); + if(IsDefined(self.csf_no_tread)) + { + self.csf_no_tread = false; + } + self vehicle_kill_treads_forever(); + self thread vehicle_treads( localClientNum ); + } + } +} +vehicle_flag_switch_rotor_fx(localClientNum, set, newEnt) +{ + if(set) + { + if(IsDefined(newEnt) && newEnt) + { + self.useAlternateRotor = true; + } + else if(!IsDefined(level.rotorAlternateRunningFX)) + { + assertmsg("helicopter tried to switch to alternate rotor without defining level.rotorAlternateRunningFX"); + } + else + { + self.rotorOldRunningFx = self.rotorMainRunningFX; + self.rotorMainRunningFx = level.rotorAlternateRunningFX; + DeleteFX(localClientNum, self.rotorMainfxHandle); + self.rotorMainfxHandle = PlayFXOnTag(localClientNum, self.rotorMainRunningFx, self, "main_rotor_jnt"); + } + } + else + { + if(IsDefined(self.rotorOldRunningFX)) + { + self.rotorMainRunningFx = self.rotorOldRunningFX; + DeleteFX(localClientNum, self.rotorMainfxHandle); + self.rotorMainfxHandle = PlayFXOnTag(localClientNum, self.rotorMainRunningFx, self, "main_rotor_jnt"); + } + } +} +vehicle_flag_0_handler(localClientNum, set, newEnt) +{ + if(self is_helicopter()) + { + vehicle_flag_switch_rotor_fx(localClientNum, set, newEnt); + } + else + { + } +} +vehicle_flag_start_stop_rotor_fx(localClientNum, set, newEnt) +{ + if(set) + { + if(IsDefined(newEnt) && newEnt) + { + PrintLn("Flag sets csf_stationary to true."); + self.csf_stationary_rotor = true; + } + else + { + DeleteFx(localClientNum, self.rotorMainfxHandle); + DeleteFx(localClientNum, self.rotorTailfxHandle); + self play_rotor_fx_stationary(localClientNum); + } + } + else + { + if(IsDefined(newEnt) && newEnt) + { + PrintLn("*** You should bypass spin up."); + } + if(IsDefined(self.csf_stationary_rotor)) + { + self.csf_stationary_rotor = false; + PrintLn("Flag sets csf stationary to false."); + } + DeleteFx(localClientNum, self.rotorMainfxHandle); + DeleteFx(localClientNum, self.rotorTailfxHandle); + self play_rotor_fx(localClientNum); + } +} +vehicle_flag_1_handler(localClientNum, set, newEnt) +{ + if(self is_helicopter()) + { + vehicle_flag_start_stop_rotor_fx(localClientNum, set, newEnt); + } + else + { + } +} +vehicle_flag_start_use_engine_damage_low_sounds(localClientNum, set, newEnt) +{ + if(set) + { + self.engine_damage_low = true; + self clientscripts\_helicopter_sounds::update_helicopter_sounds(); + } + else + { + self.engine_damage_low = false; + self clientscripts\_helicopter_sounds::update_helicopter_sounds(); + } +} +vehicle_flag_3_handler(localClientNum, set, newEnt) +{ + if(self is_helicopter()) + { + vehicle_flag_start_use_engine_damage_low_sounds(localClientNum, set, newEnt); + } + else + { + } +} +vehicle_flag_start_use_engine_damage_high_sounds(localClientNum, set, newEnt) +{ + if(set) + { + self.engine_damage_high = true; + self clientscripts\_helicopter_sounds::update_helicopter_sounds(); + } + else + { + self.engine_damage_high = false; + self clientscripts\_helicopter_sounds::update_helicopter_sounds(); + } +} +vehicle_flag_4_handler(localClientNum, set, newEnt) +{ + if(self is_helicopter()) + { + vehicle_flag_start_use_engine_damage_high_sounds(localClientNum, set, newEnt); + } + else + { + } +} +vehicle_flag_change_treadfx_handler(localClientNum, set, newEnt) +{ + if(set) + { + } + else + { + } +} +vehicle_flag_toggle_exhaustfx_handler(localClientNum, set, newEnt) +{ + if(set) + { + if(IsDefined(newEnt) && newEnt) + { + self.csf_no_exhaust = true; + } + else + { + self notify( "stop_exhaust_fx" ); + } + } + else + { + if(IsDefined(self.csf_no_exhaust)) + { + self.csf_no_exhaust = false; + } + self notify("stop_exhaust_fx"); + if( !self is_plane() && !self is_helicopter() && level.usetreadfx == 1) + { + self thread playTankExhaust(localClientNum); + } + else if(!self is_plane()) + { + self thread play_exhaust( localClientNum ); + } + } +} +vehicle_flag_change_exhaustfx_handler(localClientNum, set, newEnt) +{ + if(set) + { + } + else + { + } +} +vehicle_flag_toggle_lights_handler(localClientNum, set, newent) +{ + if(set) + { + self headlights_on(localClientNum); + self taillights_on(localClientNum); + } + else + { + self headlights_off(localClientNum); + self taillights_off(localClientNum); + } +} +vehicle_flag_toggle_siren_lights_handler(localClientNum, set, newent) +{ + if(set) + { + self sirenlights_on(localClientNum); + } + else + { + self sirenlights_off(localClientNum); + } +} +vehicle_flag_toggle_interior_lights_handler(localClientNum, set, newent) +{ + if(set) + { + self interior_lights_on(localClientNum); + } + else + { + self interior_lights_off(localClientNum); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_waw_zombie_mode.csc b/BO1/PC/ZM/clientscripts/_waw_zombie_mode.csc new file mode 100644 index 0000000..9bb8269 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_waw_zombie_mode.csc differ diff --git a/BO1/PC/ZM/clientscripts/_waw_zombiemode_radio.csc b/BO1/PC/ZM/clientscripts/_waw_zombiemode_radio.csc new file mode 100644 index 0000000..78e9b3f Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_waw_zombiemode_radio.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode.csc b/BO1/PC/ZM/clientscripts/_zombiemode.csc new file mode 100644 index 0000000..856612c --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_zombiemode.csc @@ -0,0 +1,988 @@ +#include clientscripts\_music; +#include clientscripts\_utility; +#include clientscripts\_zombiemode_dissolve; +main() +{ + level thread clientscripts\_zombiemode_ffotd::main_start(); + level.zombiemode = true; + level.swimmingFeature = false; + clientscripts\_load::main(); + clientscripts\_footsteps::SetAIFootstepPrepend( "fly_step_zombie_"); + thread clientscripts\_audio::audio_init(0); + init_client_flags(); + init_client_flag_callback_funcs(); + init_blocker_fx(); + init_riser_fx(); + level._zombieCBFunc = clientscripts\_zombiemode::on_zombie_spawn; + level._playerCBFunc = clientscripts\_zombiemode::on_player_spawn; + level._gibEventCBFunc = clientscripts\_zombiemode::on_gib_event; + level thread ZPO_listener(); + level._BOX_INDICATOR_NO_LIGHTS = -1; + level._BOX_INDICATOR_FLASH_LIGHTS_MOVING = 99; + level._BOX_INDICATOR_FLASH_LIGHTS_FIRE_SALE = 98; + level._box_indicator = level._BOX_INDICATOR_NO_LIGHTS; + registerSystem("box_indicator", ::box_monitor); + level._ZOMBIE_GIB_PIECE_INDEX_ALL = 0; + level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM = 1; + level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM = 2; + level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG = 3; + level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG = 4; + level._ZOMBIE_GIB_PIECE_INDEX_HEAD = 5; + level._ZOMBIE_GIB_PIECE_INDEX_GUTS = 6; + OnPlayerConnect_Callback( ::on_player_connect ); + clientscripts\_zombiemode_weap_freezegun::init(); + clientscripts\_zombiemode_weap_tesla::init(); + clientscripts\_zombiemode_weap_thundergun::init(); + level thread init_local_player_count(); + level thread clientscripts\_zombiemode_ffotd::main_end(); +} +init_local_player_count() +{ + waitforallclients(); + level._num_local_players = getlocalplayers().size; +} +init_blocker_fx() +{ + level._effect["wood_chunk_destory"] = LoadFX( "impacts/fx_large_woodhit" ); +} +init_riser_fx() +{ + if(isDefined(level.riser_fx_on_client) && level.riser_fx_on_client ) + { + if(isDefined(level.use_new_riser_water) && level.use_new_riser_water) + { + level._effect["rise_burst_water"] = LoadFX("maps/zombie/fx_mp_zombie_hand_water_burst"); + level._effect["rise_billow_water"] = LoadFX("maps/zombie/fx_mp_zombie_body_water_billowing"); + } + level._effect["rise_dust_water"] = LoadFX("maps/zombie/fx_zombie_body_wtr_falling"); + level._effect["rise_burst"] = LoadFX("maps/zombie/fx_mp_zombie_hand_dirt_burst"); + level._effect["rise_billow"] = LoadFX("maps/zombie/fx_mp_zombie_body_dirt_billowing"); + level._effect["rise_dust"] = LoadFX("maps/zombie/fx_mp_zombie_body_dust_falling"); + if(isDefined(level.riser_type) && level.riser_type == "snow") + { + level._effect["rise_burst_snow"] = loadfx("maps/zombie/fx_mp_zombie_hand_snow_burst"); + level._effect["rise_billow_snow"] = loadfx("maps/zombie/fx_mp_zombie_body_snow_billowing"); + level._effect["rise_dust_snow"] = LoadFX("maps/zombie/fx_mp_zombie_body_snow_falling"); + } + } +} +init_client_flags() +{ + level._ZOMBIE_SCRIPTMOVER_FLAG_BOX_RANDOM = 15; + if(isDefined(level.use_clientside_board_fx) && level.use_clientside_board_fx) + { + level._ZOMBIE_SCRIPTMOVER_FLAG_BOARD_HORIZONTAL_FX = 14; + level._ZOMBIE_SCRIPTMOVER_FLAG_BOARD_VERTICAL_FX = 13; + } + if(isDefined(level.use_clientside_rock_tearin_fx) && level.use_clientside_rock_tearin_fx) + { + level._ZOMBIE_SCRIPTMOVER_FLAG_ROCK_FX = 12; + } + level._ZOMBIE_PLAYER_FLAG_CLOAK_WEAPON = 14; + level._ZOMBIE_PLAYER_FLAG_DIVE2NUKE_VISION = 13; + level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK = 12; + if(isDefined(level.riser_fx_on_client) && level.riser_fx_on_client) + { + level._ZOMBIE_ACTOR_ZOMBIE_RISER_FX = 8; + if(!isDefined(level._no_water_risers)) + { + level._ZOMBIE_ACTOR_ZOMBIE_RISER_FX_WATER = 9; + } + if(isDefined(level.risers_use_low_gravity_fx)) + { + level._ZOMBIE_ACTOR_ZOMBIE_RISER_LOWG_FX = 7; + } + } +} +init_client_flag_callback_funcs() +{ + if(isDefined(level.use_clientside_board_fx) && level.use_clientside_board_fx) + { + register_clientflag_callback("scriptmover", level._ZOMBIE_SCRIPTMOVER_FLAG_BOARD_VERTICAL_FX, ::handle_vertical_board_clientside_fx); + register_clientflag_callback("scriptmover", level._ZOMBIE_SCRIPTMOVER_FLAG_BOARD_HORIZONTAL_FX, ::handle_horizontal_board_clientside_fx); + } + if(isDefined(level.use_clientside_rock_tearin_fx) && level.use_clientside_rock_tearin_fx) + { + register_clientflag_callback("scriptmover", level._ZOMBIE_SCRIPTMOVER_FLAG_ROCK_FX, ::handle_rock_clientside_fx); + } + register_clientflag_callback("scriptmover", level._ZOMBIE_SCRIPTMOVER_FLAG_BOX_RANDOM, clientscripts\_zombiemode_weapons::weapon_box_callback); + register_clientflag_callback( "player", level._ZOMBIE_PLAYER_FLAG_DIVE2NUKE_VISION, ::zombie_dive2nuke_visionset ); + register_clientflag_callback("player", level._ZOMBIE_PLAYER_FLAG_CLOAK_WEAPON, ::player_toggle_cloak_handler); + register_clientflag_callback("player", level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK, ::player_deadshot_perk_handler); + if(isDefined(level.riser_fx_on_client) && level.riser_fx_on_client) + { + register_clientflag_callback( "actor", level._ZOMBIE_ACTOR_ZOMBIE_RISER_FX, ::handle_zombie_risers ); + if(!isDefined(level._no_water_risers)) + { + register_clientflag_callback( "actor", level._ZOMBIE_ACTOR_ZOMBIE_RISER_FX_WATER, ::handle_zombie_risers_water ); + } + if(isDefined(level.risers_use_low_gravity_fx)) + { + register_clientflag_callback( "actor", level._ZOMBIE_ACTOR_ZOMBIE_RISER_LOWG_FX, ::handle_zombie_lowg_risers ); + } + } +} +handle_horizontal_board_clientside_fx(localClientNum, set, newEnt) +{ + if ( localClientNum != 0 ) + { + return; + } + if(set) + { + localPlayers = getlocalplayers(); + snd_played = 0; + for(i = 0; i < localPlayers.size; i ++) + { + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (0, 0, 30)); + wait( randomfloat( 0.3, 0.6 )); + if(!snd_played) + { + self thread do_teardown_sound("plank"); + snd_played = true; + } + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (0, 0, -30)); + } + } + else + { + playsound(0,"zmb_repair_boards",self.origin); + localPlayers = getlocalplayers(); + snd_played = 0; + if(isDefined(level.override_board_repair_sound )) + { + sound = level.override_board_repair_sound; + } + else + { + sound = "zmb_repair_boards"; + } + playsound(0,sound,self.origin); + wait(.3); + PlaySound(0, "zmb_board_slam",self.origin ); + for(i = 0; i < localPlayers.size; i ++) + { + localPlayers[i] EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), self.origin, 150 ); + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (0, 0, 30)); + wait( randomfloat( 0.3, 0.6 )); + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (0, 0, -30)); + } + } +} +handle_vertical_board_clientside_fx(localClientNum, set, newEnt) +{ + if ( localClientNum != 0 ) + { + return; + } + if(set) + { + localPlayers = getlocalplayers(); + snd_played = 0; + for(i = 0; i < localPlayers.size; i ++) + { + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (30, 0, 0)); + wait( randomfloat( 0.3, 0.6 )); + if(!snd_played) + { + self thread do_teardown_sound("plank"); + snd_played = true; + } + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (-30, 0, 0)); + } + } + else + { + localPlayers = getlocalplayers(); + snd_played = 0; + if(isDefined(level.override_board_repair_sound )) + { + sound = level.override_board_repair_sound; + } + else + { + sound = "zmb_repair_boards"; + } + playsound(0,sound,self.origin); + wait(.3); + PlaySound(0, "zmb_board_slam",self.origin ); + for(i = 0; i < localPlayers.size; i ++) + { + localPlayers[i] EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), self.origin, 150 ); + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (30, 0, 0)); + wait( randomfloat( 0.3, 0.6 )); + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (-30, 0, 0)); + } + } +} +handle_rock_clientside_fx(localClientNum, set, newEnt) +{ + if ( localClientNum != 0 ) + { + return; + } + if(set) + { + localPlayers = getlocalplayers(); + snd_played = 0; + for(i = 0; i < localPlayers.size; i ++) + { + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (30, 0, 0)); + wait( randomfloat( 0.3, 0.6 )); + if(!snd_played) + { + self thread do_teardown_sound("rock"); + snd_played = true; + } + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (-30, 0, 0)); + } + } + else + { + localPlayers = getlocalplayers(); + snd_played = 0; + playsound(0,"zmb_repair_boards",self.origin); + for(i = 0; i < localPlayers.size; i ++) + { + localPlayers[i] EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), self.origin, 150 ); + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (30, 0, 0)); + wait( randomfloat( 0.3, 0.6 )); + if(!snd_played) + { + PlaySound(0, "zmb_break_rock_barrier_fix",self.origin ); + snd_played = true; + } + PlayFx( i,level._effect["wood_chunk_destory"], self.origin + (-30, 0, 0)); + } + } +} +do_teardown_sound(type) +{ + switch(type) + { + case "rock": + PlaySound(0,"zmb_break_rock_barrier",self.origin ); + wait( randomfloat( 0.3, 0.6 )); + PlaySound( 0,"zmb_break_rock_barrier",self.origin ); + break; + case "plank": + if( isDefined(level.override_board_teardown_sound)) + { + sound = level.override_board_teardown_sound; + } + else + { + sound = "zmb_break_boards"; + } + PlaySound(0,sound,self.origin ); + wait( randomfloat( 0.3, 0.6 )); + PlaySound( 0,sound,self.origin ); + break; + } +} +box_monitor(clientNum, state, oldState) +{ + if(IsDefined(level._custom_box_monitor)) + { + [[level._custom_box_monitor]](clientNum, state, oldState); + } +} +ZPO_listener() +{ + while(1) + { + level waittill("ZPO"); + level notify("power_on" ); + level notify("revive_on"); + level notify("middle_door_open"); + level notify("fast_reload_on"); + level notify("doubletap_on"); + level notify("divetonuke_on"); + level notify("marathon_on"); + level notify("jugger_on"); + level notify("additionalprimaryweapon_on"); + } +} +player_deadshot_perk_handler(localClientNum, set, newEnt) +{ + if ( !self IsLocalPlayer() || self IsSpectating() || self GetEntityNumber() != GetLocalPlayers()[localClientNum] GetEntityNumber() ) + return; + if(set) + { + self UseAlternateAimParams(); + } + else + { + self ClearAlternateAimParams(); + } +} +player_toggle_cloak_handler(localClientNum, set, newEnt) +{ + if ( set ) + { + self thread cloak( localClientNum ); + } + else + { + self thread uncloak( localClientNum ); + } +} +createZombieEyes(localClientNum) +{ + if(isdefined(self._eyeArray)) + { + if(!isdefined(self._eyeArray[localClientNum])) + { + linkTag = "J_Eyeball_LE"; + fx_name = "eye_glow"; + if(IsDefined(level._override_eye_fx)) + { + fx_name = level._override_eye_fx; + } + self._eyeArray[localClientNum] = PlayFxOnTag( localClientNum, level._effect[fx_name], self, linkTag ); + } + } +} +deleteZombieEyes(localClientNum) +{ + if(isdefined(self._eyeArray)) + { + if(isdefined(self._eyeArray[localClientNum])) + { + DeleteFx( localClientNum, self._eyeArray[localClientNum] , true ); + self._eyeArray[localClientNum] = undefined; + } + } +} +on_player_connect(localClientNum) +{ + ForceGameModeMappings( localClientNum, "default" ); +} +on_player_spawn(localClientNum) +{ + ForceGameModeMappings( localClientNum, "default" ); +} +on_zombie_spawn(localClientNum) +{ + self endon("entityshutdown"); + if(!isdefined(self._eyeArray)) + { + self._eyeArray = []; + } + wait( 0.05 ); + if(self haseyes()) + { + self createZombieEyes(localClientNum); + } + self mapshaderconstant( localClientNum, 0, "scriptVector0", -4.0, -1.0, 0.0, -1.0 ); +} +zombie_eye_callback(localClientNum, hasEyes) +{ + players = GetLocalPlayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( hasEyes ) + { + self createZombieEyes( i ); + } + else + { + self deleteZombieEyes( i ); + } + } +} +init_perk_machines_fx() +{ + if ( GetDvar( #"createfx" ) == "on" || GetDvar( #"mutator_noPerks" ) == "1" ) + { + return; + } + level._effect["sleight_light"] = loadfx( "misc/fx_zombie_cola_on" ); + level._effect["doubletap_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" ); + level._effect["divetonuke_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" ); + level._effect["marathon_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" ); + level._effect["jugger_light"] = loadfx( "misc/fx_zombie_cola_jugg_on" ); + level._effect["revive_light"] = loadfx( "misc/fx_zombie_cola_revive_on" ); + level._effect["additionalprimaryweapon_light"] = loadfx( "misc/fx_zombie_cola_dtap_on" ); + level thread perk_start_up(); +} +perk_start_up() +{ + level waittill( "power_on" ); + timer = 0; + duration = 0.1; + machines = GetStructArray( "perksacola", "targetname" ); + while( true ) + { + for( i = 0; i < machines.size; i++ ) + { + switch( machines[i].script_sound ) + { + case "mx_jugger_jingle": + machines[i] thread vending_machine_flicker_light( "jugger_light", duration ); + break; + case "mx_speed_jingle": + machines[i] thread vending_machine_flicker_light( "sleight_light", duration ); + break; + case "mx_doubletap_jingle": + machines[i] thread vending_machine_flicker_light( "doubletap_light", duration ); + break; + case "mx_divetonuke_jingle": + machines[i] thread vending_machine_flicker_light( "divetonuke_light", duration ); + break; + case "mx_marathon_jingle": + machines[i] thread vending_machine_flicker_light( "marathon_light", duration ); + break; + case "mx_revive_jingle": + machines[i] thread vending_machine_flicker_light( "revive_light", duration ); + break; + case "mx_additionalprimaryweapon_jingle": + machines[i] thread vending_machine_flicker_light( "additionalprimaryweapon_light", duration ); + break; + default: + machines[i] thread vending_machine_flicker_light( "jugger_light", duration ); + break; + } + } + timer += duration; + duration += 0.2; + if( timer >= 3 ) + { + break; + } + realwait( duration ); + } +} +vending_machine_flicker_light( fx_light, duration ) +{ + players = getlocalplayers(); + for( i = 0; i < players.size; i++ ) + { + self thread play_perk_fx_on_client( i, fx_light, duration ); + } +} +play_perk_fx_on_client( client_num, fx_light, duration ) +{ + fxObj = spawn( client_num, self.origin +( 0, 0, -50 ), "script_model" ); + fxobj setmodel( "tag_origin" ); + playfxontag( client_num, level._effect[fx_light], fxObj, "tag_origin" ); + realwait( duration ); + fxobj delete(); +} +cloak( localClientNum ) +{ + self thread run_cloak_effect( localClientNum, true, 1500 ); +} +uncloak( localClientNum ) +{ + self thread run_cloak_effect( localClientNum, false, 1000 ); +} +run_cloak_effect( localClientNum, cloak, durationMsec ) +{ + self endon( "entityshutdown" ); + begin_time = GetRealTime(); + while( 1 ) + { + age = GetRealTime() - begin_time; + original_t = age / durationMsec; + original_t = clamp( original_t, 0.0, 1.0 ); + adjusted_t = original_t; + if ( !cloak ) + { + adjusted_t = 1.0 - adjusted_t ; + } + cloakMaskCompression = 1.0; + cloakAmount = (adjusted_t - 0.5) * 2.0; + cloakAmount = clamp( cloakAmount, -1.0, 1.0 ); + cloakAmount = cloakAmount * cloakMaskCompression; + self setshaderconstant( localClientNum, 0, cloakMaskCompression, cloakAmount, 0, 0 ); + if ( original_t == 1.0 ) + { + break; + } + realwait(0.05); + } +} +mark_piece_gibbed( piece_index ) +{ + if ( !isdefined( self.gibbed_pieces ) ) + { + self.gibbed_pieces = []; + } + self.gibbed_pieces[self.gibbed_pieces.size] = piece_index; +} +has_gibbed_piece( piece_index ) +{ + if ( !isdefined( self.gibbed_pieces ) ) + { + return false; + } + for ( i = 0; i < self.gibbed_pieces.size; i++ ) + { + if ( self.gibbed_pieces[i] == piece_index ) + { + return true; + } + } + return false; +} +do_headshot_gib_fx() +{ + fxTag = "j_neck"; + fxOrigin = self GetTagOrigin( fxTag ); + upVec = AnglesToUp( self GetTagAngles( fxTag ) ); + forwardVec = AnglesToForward( self GetTagAngles( fxTag ) ); + players = getlocalplayers(); + for ( i = 0; i < players.size; i++ ) + { + PlayFX( i, level._effect["headshot"], fxOrigin, forwardVec, upVec ); + PlayFX( i, level._effect["headshot_nochunks"], fxOrigin, forwardVec, upVec ); + } + wait( 0.3 ); + if ( IsDefined( self ) ) + { + players = getlocalplayers(); + for ( i = 0; i < players.size; i++ ) + { + PlayFxOnTag( i, level._effect["bloodspurt"], self, fxTag ); + } + } +} +do_gib_fx( tag ) +{ + players = getlocalplayers(); + for ( i = 0; i < players.size; i++ ) + { + PlayFxOnTag( i, level._effect["animscript_gib_fx"], self, tag ); + } + PlaySound( 0, "zmb_death_gibs", self gettagorigin( tag ) ); +} +do_gib( model, tag ) +{ + start_pos = self gettagorigin( tag ); + start_angles = self gettagangles(tag); + wait( 0.016 ); + end_pos = undefined; + angles = undefined; + if(!IsDefined(self)) + { + end_pos = start_pos + (AnglesToForward(start_angles) * 10); + angles = start_angles; + } + else + { + end_pos = self gettagorigin( tag ); + angles = self gettagangles(tag); + } + if ( IsDefined( self._gib_vel ) ) + { + forward = self._gib_vel; + self._gib_vel = undefined; + } + else + { + forward = VectorNormalize( end_pos - start_pos ); + forward *= RandomIntRange( 600, 1000 ); + forward += (0, 0, RandomIntRange( 400, 700 )); + } + CreateDynEntAndLaunch( 0, model, end_pos, angles, start_pos, forward, level._effect["animscript_gibtrail_fx"], 1 ); + if(IsDefined(self)) + { + self do_gib_fx( tag ); + } + else + { + PlaySound( 0, "zmb_death_gibs", end_pos); + } +} +on_gib_event( localClientNum, type, locations ) +{ + if ( localClientNum != 0 ) + { + return; + } + if( !is_mature() ) + { + return; + } + if ( !isDefined( self._gib_def ) ) + { + return; + } + if ( self._gib_def == -1 ) + { + return; + } + if ( IsDefined( level._gib_overload_func ) ) + { + PrintLn( "type " + type ); + PrintLn( "loc size " + locations.size ); + if ( self [[level._gib_overload_func]]( type, locations ) ) + { + return; + } + } + for ( i = 0; i < locations.size; i++ ) + { + if ( IsDefined( self.gibbed ) && level._ZOMBIE_GIB_PIECE_INDEX_HEAD != locations[i] ) + { + continue; + } + switch( locations[i] ) + { + case 0: + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn1 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag1 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn1, level._gibbing_actor_models[self._gib_def].gibSpawnTag1 ); + } + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn2 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag2 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn2, level._gibbing_actor_models[self._gib_def].gibSpawnTag2 ); + } + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn3 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag3 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn3, level._gibbing_actor_models[self._gib_def].gibSpawnTag3 ); + } + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn4 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag4 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn4, level._gibbing_actor_models[self._gib_def].gibSpawnTag4 ); + } + self thread do_headshot_gib_fx(); + self thread do_gib_fx( "J_SpineLower" ); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM ); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM ); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG ); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG ); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_HEAD ); + break; + case 1: + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn1 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag1 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn1, level._gibbing_actor_models[self._gib_def].gibSpawnTag1 ); + } + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM ); + break; + case 2: + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn2 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag2 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn2, level._gibbing_actor_models[self._gib_def].gibSpawnTag2 ); + } + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM ); + break; + case 3: + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn3 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag3 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn3, level._gibbing_actor_models[self._gib_def].gibSpawnTag3 ); + } + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG ); + break; + case 4: + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn4 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag4 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn4, level._gibbing_actor_models[self._gib_def].gibSpawnTag4 ); + } + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG ); + break; + case 5: + self thread do_headshot_gib_fx(); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_HEAD ); + break; + case 6: + self thread do_gib_fx( "J_SpineLower" ); + break; + } + } + self.gibbed = true; +} +zombie_vision_set_apply( str_visionset, int_priority, flt_transition_time, int_clientnum ) +{ + self endon( "death" ); + self endon( "disconnect" ); + if( !IsDefined( self._zombie_visionset_list ) ) + { + self._zombie_visionset_list = []; + } + if( !IsDefined( str_visionset ) || !IsDefined( int_priority ) ) + { + return; + } + if( !IsDefined( flt_transition_time ) ) + { + flt_transition_time = 1; + } + if( !IsDefined( int_clientnum ) ) + { + if(self IsLocalPlayer()) + { + int_clientnum = self GetLocalClientNumber(); + } + if(!IsDefined(int_clientnum)) + { + return; + } + } + already_in_array = false; + if( self._zombie_visionset_list.size != 0 ) + { + for( i = 0; i < self._zombie_visionset_list.size; i++ ) + { + if( IsDefined( self._zombie_visionset_list[i].vision_set ) && self._zombie_visionset_list[i].vision_set == str_visionset ) + { + already_in_array = true; + if( self._zombie_visionset_list[i].priority != int_priority ) + { + self._zombie_visionset_list[i].priority = int_priority; + } + break; + } + } + } + if( !already_in_array ) + { + temp_struct = spawnStruct(); + temp_struct.vision_set = str_visionset; + temp_struct.priority = int_priority; + self._zombie_visionset_list = add_to_array( self._zombie_visionset_list, temp_struct, false ); + } + vision_to_set = self zombie_highest_vision_set_apply(); + if( IsDefined( vision_to_set ) ) + { + VisionSetNaked( int_clientnum, vision_to_set, flt_transition_time ); + } + else + { + VisionSetNaked( int_clientnum, "undefined", flt_transition_time ); + } +} +zombie_vision_set_remove( str_visionset, flt_transition_time, int_clientnum ) +{ + self endon( "death" ); + self endon( "disconnect" ); + if( !IsDefined( str_visionset ) ) + { + return; + } + if( !IsDefined( flt_transition_time ) ) + { + flt_transition_time = 1; + } + if( !IsDefined( self._zombie_visionset_list ) ) + { + self._zombie_visionset_list = []; + } + if( !IsDefined( int_clientnum ) ) + { + if(self IsLocalPlayer()) + { + int_clientnum = self GetLocalClientNumber(); + } + if(!IsDefined(int_clientnum)) + { + return; + } + } + temp_struct = undefined; + for( i = 0; i < self._zombie_visionset_list.size; i++ ) + { + if( IsDefined( self._zombie_visionset_list[i].vision_set ) && self._zombie_visionset_list[i].vision_set == str_visionset ) + { + temp_struct = self._zombie_visionset_list[i]; + } + } + if( IsDefined( temp_struct ) ) + { + self._zombie_visionset_list = array_remove( self._zombie_visionset_list, temp_struct ); + } + vision_to_set = self zombie_highest_vision_set_apply(); + if( IsDefined( vision_to_set ) ) + { + VisionSetNaked( int_clientnum, vision_to_set, flt_transition_time ); + } + else + { + VisionSetNaked( int_clientnum, "undefined", flt_transition_time ); + } +} +zombie_highest_vision_set_apply() +{ + if( !IsDefined( self._zombie_visionset_list ) ) + { + return; + } + highest_score = 0; + highest_score_vision = undefined; + for( i = 0; i < self._zombie_visionset_list.size; i++ ) + { + if( IsDefined( self._zombie_visionset_list[i].priority ) && self._zombie_visionset_list[i].priority > highest_score ) + { + highest_score = self._zombie_visionset_list[i].priority; + highest_score_vision = self._zombie_visionset_list[i].vision_set; + } + } + return highest_score_vision; +} +zombie_dive2nuke_visionset( local_client_num, set, newEnt ) +{ + self endon( "disconnect" ); + if( local_client_num != 0 ) + { + return; + } + if( set ) + { + if( !IsDefined( self._zombie_visionset_list ) ) + { + PrintLn( "********************* zombie visionset array is not defined *******************************" ); + } + player = GetLocalPlayers()[ local_client_num ]; + if ( player GetEntityNumber() != self GetEntityNumber() ) + { + return; + } + time_to_apply_vision = 0; + time_to_remove_vision = 0.5; + self thread zombie_vision_set_apply( "zombie_cosmodrome_diveToNuke", 11, time_to_apply_vision, local_client_num ); + wait( 0.5 ); + self thread zombie_vision_set_remove( "zombie_cosmodrome_diveToNuke", time_to_remove_vision, local_client_num ); + } +} +sidequest_solo_completed_watcher() +{ + level endon( "SQC" ); + level waittill( "SQS" ); + SetCollectible( level.zombie_sidequest_solo_collectible ); +} +sidequest_coop_completed_watcher() +{ + level endon( "SQS" ); + level waittill( "SQC" ); + SetCollectible( level.zombie_sidequest_solo_collectible ); + SetCollectible( level.zombie_sidequest_coop_collectible ); +} +register_sidequest( solo_collectible, coop_collectible ) +{ + level.zombie_sidequest_solo_collectible = solo_collectible; + level.zombie_sidequest_coop_collectible = coop_collectible; + level thread sidequest_solo_completed_watcher(); + level thread sidequest_coop_completed_watcher(); +} +handle_zombie_risers_water(localClientNum, set, newEnt) +{ + self endon("entityshutdown"); + if ( localClientNum != 0 ) + { + return; + } + if(set) + { + localPlayers = getlocalplayers(); + snd_played = 0; + for(i = 0; i < localPlayers.size; i ++) + { + if(!snd_played) + { + playsound(0,"zmb_zombie_spawn_water", self.origin); + snd_played = 1; + } + playfx(i,level._effect["rise_burst_water"],self.origin + ( 0,0,randomintrange(5,10) ) ); + wait(.25); + playfx(i,level._effect["rise_billow_water"],self.origin + ( randomintrange(-10,10),randomintrange(-10,10),randomintrange(5,10) ) ); + self thread rise_dust_fx(i,"water"); + } + } +} +handle_zombie_lowg_risers(localClientNum, set, newEnt) +{ + self endon("entityshutdown"); + if ( localClientNum != 0 ) + { + return; + } + if(set) + { + localPlayers = getlocalplayers(); + snd_played = 0; + for(i = 0; i < localPlayers.size; i ++) + { + if(!snd_played) + { + playsound(0,"zmb_zombie_spawn", self.origin); + snd_played = 1; + } + playfx(i,level._effect["rise_burst_lg"],self.origin + ( 0,0,randomintrange(5,10) ) ); + wait(.25); + playfx(i,level._effect["rise_billow_lg"],self.origin + ( randomintrange(-10,10),randomintrange(-10,10),randomintrange(5,10) ) ); + self thread rise_dust_fx(i,"lowg"); + } + } +} +handle_zombie_risers(localClientNum, set, newEnt) +{ + self endon("entityshutdown"); + if ( localClientNum != 0 ) + { + return; + } + if(set) + { + localPlayers = getlocalplayers(); + snd_played = 0; + sound = "zmb_zombie_spawn"; + burst_fx = level._effect["rise_burst"]; + billow_fx = level._effect["rise_billow"]; + type = "dirt"; + if(isdefined(level.riser_type) && level.riser_type == "snow" ) + { + sound = "zmb_zombie_spawn_snow"; + burst_fx = level._effect["rise_burst_snow"]; + billow_fx = level._effect["rise_billow_snow"]; + type = "snow"; + } + for(i = 0; i < localPlayers.size; i ++) + { + if(!snd_played) + { + playsound (0,sound, self.origin); + snd_played = 1; + } + playfx(i,burst_fx,self.origin + ( 0,0,randomintrange(5,10) ) ); + wait(.25); + playfx(i,billow_fx,self.origin + ( randomintrange(-10,10),randomintrange(-10,10),randomintrange(5,10) ) ); + self thread rise_dust_fx(i,type); + } + } +} +rise_dust_fx(clientnum,type) +{ + dust_tag = "J_SpineUpper"; + self endon("entityshutdown"); + if(!isDefined(self)) + { + return; + } + dust_time = 7.5; + dust_interval = .1; + player = getlocalplayers()[clientnum]; + effect = level._effect["rise_dust"]; + switch(type) + { + case "water": + effect = level._effect["rise_dust_water"]; + break; + case "snow": + effect = level._effect["rise_dust_snow"]; + break; + case "lowg": + effect = level._effect["rise_dust_lg"]; + } + for (t = 0; t < dust_time; t += dust_interval) + { + if(!isDefined(self)) + { + return; + } + PlayfxOnTag(clientnum,effect, self, dust_tag); + wait dust_interval; + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_ai_director.csc b/BO1/PC/ZM/clientscripts/_zombiemode_ai_director.csc new file mode 100644 index 0000000..794aa58 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_ai_director.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_ai_napalm.csc b/BO1/PC/ZM/clientscripts/_zombiemode_ai_napalm.csc new file mode 100644 index 0000000..037ffdc --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_zombiemode_ai_napalm.csc @@ -0,0 +1,313 @@ +#include clientscripts\_utility; +init_napalm_zombie() +{ + register_clientflag_callback( "actor", level._CF_ACTOR_IS_NAPALM_ZOMBIE, ::napalm_zombie_spawn); + register_clientflag_callback( "actor", level._CF_ACTOR_NAPALM_ZOMBIE_EXPLODE, ::napalm_zombie_explode_callback); + register_clientflag_callback( "actor", level._CF_ACTOR_NAPALM_ZOMBIE_WET, ::napalm_zombie_wet_callback); + level.napalmPlayerWarningRadiusSqr = 400.0; + level.napalmPlayerWarningRadiusSqr *= level.napalmPlayerWarningRadiusSqr; + napalm_fx(); +} +napalm_fx() +{ + level._effect["napalm_fire_forearm"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_forearm" ); + level._effect["napalm_fire_torso"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_torso" ); + level._effect["napalm_distortion"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_heat" ); + level._effect["napalm_fire_forearm_end"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_torso_end" ); + level._effect["napalm_fire_torso_end"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_forearm_end" ); + level._effect["napalm_steam"] = LoadFX( "maps/zombie_temple/fx_ztem_zombie_torso_steam_runner" ); + level._effect["napalm_feet_steam"] = LoadFX( "maps/zombie_temple/fx_ztem_zombie_torso_steam_runner" ); +} +napalm_zombie_spawn( client_num, set, newEnt ) +{ + if(set) + { + level.napalm_zombie = self; + self thread napalm_glow_normal(client_num); + self thread _napalm_zombie_RunEffects(client_num); + self thread _napalm_zombie_RunSteamEffects(client_num); + } + else + { + self notify("stop_fx"); + self notify("napalm_killed"); + if(isDefined(self.steam_fx)) + { + self.steam_fx delete(); + } + level.napalm_zombie = undefined; + } +} +_napalm_zombie_RunSteamEffects(client_num) +{ + self endon("napalm_killed"); + self endon("death"); + self endon("entityshutdown"); + while(1) + { + waterheight = getwaterHeight(self.origin); + underWater = waterHeight>self.origin[2]; + if((isdefined(self.wet) && self.wet) || underWater) + { + self thread set_footstep_override_for_napalm_zombie(false); + } + else + { + self thread set_footstep_override_for_napalm_zombie(true); + } + if(underWater) + { + if(!isDefined(self.steam_fx)) + { + effectEnt = Spawn(client_num, self.origin, "script_model"); + effectEnt SetModel("tag_origin"); + PlayFXOnTag(client_num, level._effect["napalm_feet_steam"], effectEnt, "tag_origin" ); + self.steam_fx = effectEnt; + } + origin = (self.origin[0], self.origin[1], waterHeight); + self.steam_fx.origin = origin; + } + else + { + if(isDefined(self.steam_fx)) + { + self.steam_fx Delete(); + self.steam_fx = undefined; + } + } + wait .1; + } +} +_napalm_zombie_RunEffects(client_num) +{ + fx = []; + fx["J_Wrist_RI"] = "napalm_fire_forearm"; + fx["J_Wrist_LE"] = "napalm_fire_forearm"; + fx["J_SpineLower"] = "napalm_fire_torso"; + fx["J_Head"] = "napalm_fire_forearm"; + fx["tag_origin"] = "napalm_distortion"; + offsets["J_SpineLower"] = (0.0, 10.0, 0.0); + watch = []; + keys = GetArrayKeys(fx); + for ( i = 0; i < keys.size; i++ ) + { + jointName = keys[i]; + fxName = fx[jointName]; + offset = offsets[jointName]; + effectEnt = self _zombie_SetupFXOnJoint(client_num, jointName, fxName, offset); + watch[i] = effectEnt; + } + if( isdefined( watch[0] ) ) + { + watch[0] playloopsound( "evt_napalm_zombie_loop", 2 ); + } + self waittill( "stop_fx" ); + if( isdefined( watch[0] ) ) + { + watch[0] stoploopsound( .25 ); + } + for ( i = 0; i < watch.size; i++ ) + { + if(isDefined(watch[i])) + { + watch[i] Delete(); + } + } +} +napalm_zombie_explode_callback( client_num, set, newEnt ) +{ + self thread napalm_glow_explode(client_num); + self thread _zombie_RunExplosionWindupEffects(client_num); +} +_zombie_RunExplosionWindupEffects(client_num) +{ + fx = []; + fx["J_Elbow_LE"] = "napalm_fire_forearm_end"; + fx["J_Elbow_RI"] = "napalm_fire_forearm_end"; + fx["J_Clavicle_RI"] = "napalm_fire_forearm_end"; + fx["J_Clavicle_LE"] = "napalm_fire_forearm_end"; + fx["J_SpineLower"] = "napalm_fire_torso_end"; + offsets["J_SpineLower"] = (0.0, 10.0, 0.0); + watch = []; + keys = GetArrayKeys(fx); + for ( i = 0; i < keys.size; i++ ) + { + jointName = keys[i]; + fxName = fx[jointName]; + offset = offsets[jointName]; + effectEnt = self _zombie_SetupFXOnJoint(client_num, jointName, fxName, offset); + watch[i] = effectEnt; + } + self waittill( "stop_fx" ); + for ( i = 0; i < watch.size; i++ ) + { + if(isDefined(watch[i])) + { + watch[i] Delete(); + } + } +} +_napalm_zombie_RunWetEffects(client_num) +{ + fx = []; + fx["J_SpineLower"] = "napalm_steam"; + offsets["J_SpineLower"] = (0.0, 10.0, 0.0); + watch = []; + keys = GetArrayKeys(fx); + for ( i = 0; i < keys.size; i++ ) + { + jointName = keys[i]; + fxName = fx[jointName]; + offset = offsets[jointName]; + effectEnt = self _zombie_SetupFXOnJoint(client_num, jointName, fxName, offset); + watch[i] = effectEnt; + } + self waittill( "stop_fx" ); + for ( i = 0; i < watch.size; i++ ) + { + if(isDefined(watch[i])) + { + watch[i] Delete(); + } + } +} +_zombie_SetupFXOnJoint(client_num, jointName, fxName, offset) +{ + origin = self GetTagOrigin(jointName); + effectEnt = Spawn(client_num, origin, "script_model"); + effectEnt SetModel("tag_origin"); + effectEnt.angles = self GetTagAngles(jointName); + if ( !IsDefined(offset) ) + { + offset = (0,0,0); + } + effectEnt LinkTo(self, jointName, offset); + PlayFXOnTag(client_num, level._effect[fxName], effectEnt, "tag_origin" ); + return effectEnt; +} +set_footstep_override_for_napalm_zombie(set) +{ + if ( set ) + { + self._footstepOverrideEffect = "napalm_zombie_footstep"; + self.step_sound = "zmb_napalm_step"; + } + else + { + self._footstepOverrideEffect = undefined; + self.step_sound = "zmb_napalm_step"; + } +} +player_napalm_radius_overlay_fade() +{ + self endon("death"); + self endon("disconnect"); + self endon("entityshutdown"); + prevFrac = 0.0; + while ( 1 ) + { + frac = 0.0; + if( !isdefined( level.napalm_zombie ) || isDefined(level.napalm_zombie.wet) && level.napalm_zombie.wet + || player_can_see_napalm( level.napalm_zombie ) ) + { + frac = 0.0; + } + else + { + dist_to_napalm = distancesquared( self.origin, level.napalm_zombie.origin ); + if ( dist_to_napalm < level.napalmPlayerWarningRadiusSqr ) + { + frac = (level.napalmPlayerWarningRadiusSqr-dist_to_napalm)/level.napalmPlayerWarningRadiusSqr; + frac *= 1.1; + if ( frac > 1.0 ) + { + frac = 1.0; + } + } + } + delta = Clamp(frac - prevFrac, -.1,.1); + frac = prevFrac + delta; + prevFrac = frac; + SetSavedDvar("r_flameScaler",frac); + wait(0.1); + } +} +player_can_see_napalm( ent_napalm ) +{ + trace = undefined; + if( IsDefined( level.napalm_zombie ) ) + { + trace = bullettrace( self GetEye(), level.napalm_zombie.origin, false, self ); + if( IsDefined( trace ) && trace["fraction"] < 0.85 ) + { + return true; + } + } + return false; +} +napalm_zombie_wet_callback( client_num, set, newEnt ) +{ + if(set) + { + self napalm_start_wet_fx(client_num); + } + else + { + self napalm_end_wet_fx(client_num); + } +} +napalm_start_wet_fx(client_num) +{ + self notify( "stop_fx" ); + self thread _napalm_zombie_RunWetEffects(client_num); + self.wet = true; + self thread napalm_glow_wet(client_num); +} +napalm_end_wet_fx(client_num) +{ + self notify( "stop_fx" ); + self thread _napalm_zombie_RunEffects(client_num); + self.wet = false; + self thread napalm_glow_normal(client_num); +} +napalm_set_glow(client_num, glowVal) +{ + self.glow_val = glowVal; + self setshaderconstant( client_num, 0, 0, 0, 0, glowVal ); +} +napalm_glow_normal(client_num) +{ + self thread napalm_glow_lerp(client_num, 2.5); +} +napalm_glow_explode(client_num) +{ + self thread napalm_glow_lerp(client_num, 10.0); +} +napalm_glow_wet(client_num) +{ + self thread napalm_glow_lerp(client_num, 0.5); +} +napalm_glow_lerp(client_num, glowVal) +{ + self notify("glow_lerp"); + self endon("glow_lerp"); + self endon("death"); + self endon("entityshutdown"); + startVal = self.glow_val; + endVal = glowVal; + if(isDefined(startVal)) + { + delta = glowVal - self.glow_val; + lerpTime = 1000; + startTime = GetRealTime(); + while(startTime + lerpTime > GetRealTime()) + { + s = (GetRealTime() - startTime) / lerpTime; + newVal = startVal + ((endVal - startVal) * s); + self napalm_set_glow(client_num, newVal); + realwait(.05); + } + } + self napalm_set_glow(client_num, endVal); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_ai_sonic.csc b/BO1/PC/ZM/clientscripts/_zombiemode_ai_sonic.csc new file mode 100644 index 0000000..3b6c126 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_ai_sonic.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_deathcard.csc b/BO1/PC/ZM/clientscripts/_zombiemode_deathcard.csc new file mode 100644 index 0000000..8118533 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_deathcard.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_dissolve.csc b/BO1/PC/ZM/clientscripts/_zombiemode_dissolve.csc new file mode 100644 index 0000000..d025622 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_dissolve.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_equip_gasmask.csc b/BO1/PC/ZM/clientscripts/_zombiemode_equip_gasmask.csc new file mode 100644 index 0000000..7e2b7d5 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_equip_gasmask.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_equip_hacker.csc b/BO1/PC/ZM/clientscripts/_zombiemode_equip_hacker.csc new file mode 100644 index 0000000..a857b74 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_equip_hacker.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_equipment.csc b/BO1/PC/ZM/clientscripts/_zombiemode_equipment.csc new file mode 100644 index 0000000..f4e3ded Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_equipment.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_ffotd.csc b/BO1/PC/ZM/clientscripts/_zombiemode_ffotd.csc new file mode 100644 index 0000000..9070753 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_ffotd.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_spikemore.csc b/BO1/PC/ZM/clientscripts/_zombiemode_spikemore.csc new file mode 100644 index 0000000..6350a42 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_spikemore.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_weap_black_hole_bomb.csc b/BO1/PC/ZM/clientscripts/_zombiemode_weap_black_hole_bomb.csc new file mode 100644 index 0000000..43a06aa --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_zombiemode_weap_black_hole_bomb.csc @@ -0,0 +1,262 @@ + +#include clientscripts\_utility; +#include clientscripts\_music; +#include clientscripts\_zombiemode_weapons; +#include clientscripts\_zombiemode; +init() +{ + if ( GetDvar( #"createfx" ) == "on" ) + { + return; + } + if ( !clientscripts\_zombiemode_weapons::is_weapon_included( "zombie_black_hole_bomb" ) ) + { + return; + } + level._effect[ "black_hole_bomb_portal" ] = LoadFX( "maps/zombie/fx_zmb_blackhole_looping" ); + level._effect[ "black_hole_bomb_event_horizon" ] = LoadFX( "maps/zombie/fx_zmb_blackhole_implode" ); + level._effect[ "black_hole_bomb_marker_flare" ] = LoadFX( "maps/zombie/fx_zmb_blackhole_flare_marker" ); + level._effect[ "black_hole_bomb_zombie_pull" ] = LoadFX( "maps/zombie/fx_blackhole_zombie_breakup" ); + level._current_black_hole_bombs = []; + level._visionset_black_hole_bomb = "zombie_black_hole"; + level._visionset_black_hole_bomb_transition_time_in = 2.0; + level._visionset_black_hole_bomb_transition_time_out = 1.0; + level._visionset_black_hole_bomb_priority = 10; + level._SCRIPTMOVER_CLIENT_FLAG_BLACKHOLE = 10; + register_clientflag_callback( "scriptmover", level._SCRIPTMOVER_CLIENT_FLAG_BLACKHOLE, ::black_hole_deployed ); + level._ACTOR_CLIENT_FLAG_BLACKHOLE = 10; + register_clientflag_callback( "actor", level._ACTOR_CLIENT_FLAG_BLACKHOLE, ::black_hole_zombie_being_pulled ); + OnPlayerConnect_Callback( ::black_hole_on_player_connect ); + OnPlayerSpawned_Callback( ::black_hole_on_player_spawned ); + level thread black_hole_visionset_think(); +} +black_hole_on_player_connect( int_local_client_num ) +{ + self endon( "disconnect" ); + while ( !ClientHasSnapshot( int_local_client_num ) ) + { + wait 0.05; + } + if( int_local_client_num != 0 ) + { + return; + } + players = GetLocalPlayers(); + for( i = 0 ; i < players.size; i++ ) + { + players[i]._curr_black_hole_dist = 100000*100000; + players[i]._last_black_hole_dist = 100000*100000; + } +} +black_hole_on_player_spawned( int_local_client_num ) +{ + self endon( "disconnect" ); + while ( !self hasdobj( int_local_client_num ) ) + { + wait( 0.05 ); + } + if( int_local_client_num != 0 ) + { + return; + } + players = GetLocalPlayers(); + for( i = 0 ; i < players.size; i++ ) + { + if( !IsDefined( players[i]._curr_black_hole_dist ) ) + { + players[i]._curr_black_hole_dist = 100000*100000; + } + else if( !IsDefined( players[i]._last_black_hole_dist ) ) + { + players[i]._last_black_hole_dist = 100000*100000; + } + } +} +black_hole_deployed( local_client_num, int_set, ent_new ) +{ + if( local_client_num != 0 ) + { + return; + } + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + level thread black_hole_fx_start( i, self ); + level thread black_hole_activated( self, i ); + } +} +black_hole_fx_start( local_client_num, ent_bomb ) +{ + bomb_fx_spot = Spawn( local_client_num, ent_bomb.origin, "script_model" ); + bomb_fx_spot SetModel( "tag_origin" ); + PlayFXOnTag( local_client_num, level._effect[ "black_hole_bomb_portal" ], bomb_fx_spot, "tag_origin" ); + PlayFXOnTag( local_client_num, level._effect[ "black_hole_bomb_marker_flare" ], bomb_fx_spot, "tag_origin" ); + ent_bomb waittill( "entityshutdown" ); + event_horizon_spot = Spawn( local_client_num, bomb_fx_spot.origin, "script_model" ); + event_horizon_spot SetModel( "tag_origin" ); + bomb_fx_spot Delete(); + PlayFXOnTag( local_client_num, level._effect[ "black_hole_bomb_event_horizon" ], event_horizon_spot, "tag_origin" ); + wait( 0.2 ); + event_horizon_spot Delete(); +} +black_hole_visionset_switch( str_switch, flt_transition_time, int_local_client_num ) +{ + self endon( "disconnect" ); + self endon( "death" ); + if( !IsDefined( flt_transition_time ) ) + { + flt_transition_time = 2.0; + } + if( self IsSpectating() ) + { + return; + } + switch( str_switch ) + { + case "inside_bh": + self zombie_vision_set_apply( level._visionset_black_hole_bomb, level._visionset_black_hole_bomb_priority, level._visionset_black_hole_bomb_transition_time_in, int_local_client_num ); + break; + case "outside_bh": + self zombie_vision_set_remove( level._visionset_black_hole_bomb, level._visionset_black_hole_bomb_transition_time_in, int_local_client_num ); + break; + default: + self zombie_vision_set_remove( undefined, level._visionset_black_hole_bomb_transition_time_out, int_local_client_num ); + break; + } +} +black_hole_visionset_think() +{ + flt_black_hole_vision_transition_time = 0; + min_black_hole_dist = 512*512; + self._visionset_think_running = 1; + temp_array = []; + while( IsDefined( level._current_black_hole_bombs ) ) + { + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i]._curr_black_hole_dist = 100000*100000; + } + self._curr_black_hole_dist = 100000*100000; + if( level._current_black_hole_bombs.size == 0 ) + { + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] black_hole_visionset_switch( "default", 2.0, i ); + } + } + else + { + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + struct_closest_black_hole = players[i] get_closest_black_hole(); + players[i] black_hole_vision_set( min_black_hole_dist, flt_black_hole_vision_transition_time, struct_closest_black_hole, i ); + players[i]._last_black_hole_dist = players[i]._curr_black_hole_dist; + } + } + temp_array = level._current_black_hole_bombs; + for( i = 0; i < temp_array.size; i++ ) + { + if( IsDefined( temp_array[i]._black_hole_active ) && temp_array[i]._black_hole_active == 0 ) + { + level._current_black_hole_bombs = array_remove( level._current_black_hole_bombs, temp_array[i] ); + } + } + wait( 0.1 ); + temp_array = []; + } +} +get_closest_black_hole() +{ + self endon( "disconnect" ); + self endon( "death" ); + struct_closest_black_hole = undefined; + for( i = 0; i < level._current_black_hole_bombs.size; i++ ) + { + curr_dist = DistanceSquared( level._current_black_hole_bombs[i].origin, self.origin ); + if( curr_dist < self._curr_black_hole_dist ) + { + self._curr_black_hole_dist = curr_dist; + struct_closest_black_hole = level._current_black_hole_bombs[i]; + } + } + return struct_closest_black_hole; +} +black_hole_vision_set( min_black_hole_dist, flt_transition_time, struct_closest_black_hole, int_local_client_num ) +{ + self endon( "disconnect" ); + self endon( "death" ); + set_dist = self._curr_black_hole_dist; + if( set_dist < min_black_hole_dist ) + { + trace = bullettrace( self GetEye(), struct_closest_black_hole.origin, false, self ); + if( trace["fraction"] > 0.85 && struct_closest_black_hole._black_hole_active == 1 ) + { + self black_hole_visionset_switch( "inside_bh", flt_transition_time, int_local_client_num ); + } + else + { + self black_hole_visionset_switch( "outside_bh", flt_transition_time, int_local_client_num ); + } + } + else if( set_dist > min_black_hole_dist ) + { + self black_hole_visionset_switch( "outside_bh", flt_transition_time, int_local_client_num ); + } +} +black_hole_activated( ent_model, int_local_client_num ) +{ + new_black_hole_struct = SpawnStruct(); + new_black_hole_struct.origin = ent_model.origin; + new_black_hole_struct._black_hole_active = 1; + level._current_black_hole_bombs = add_to_array( level._cosmodrome_black_hole_bombs, new_black_hole_struct ); + ent_model waittill( "entityshutdown" ); + new_black_hole_struct._black_hole_active = 0; + wait( 0.2 ); +} +black_hole_zombie_being_pulled( local_client_num, int_set, actor_new ) +{ + self endon( "death" ); + self endon( "entityshutdown" ); + if( local_client_num != 0 ) + { + return; + } + if( int_set ) + { + self._bhb_pulled_in_fx = Spawn( local_client_num, self.origin, "script_model" ); + self._bhb_pulled_in_fx.angles = self.angles; + self._bhb_pulled_in_fx LinkTo( self, "tag_origin" ); + self._bhb_pulled_in_fx SetModel( "tag_origin" ); + level thread black_hole_bomb_pulled_in_fx_clean( self, self._bhb_pulled_in_fx ); + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + PlayFXOnTag( i, level._effect[ "black_hole_bomb_zombie_pull" ], self._bhb_pulled_in_fx, "tag_origin" ); + } + } + else + { + if( IsDefined( self._bhb_pulled_in_fx ) ) + { + self._bhb_pulled_in_fx notify( "no_clean_up_needed" ); + self._bhb_pulled_in_fx Unlink(); + self._bhb_pulled_in_fx Delete(); + } + } +} +black_hole_bomb_pulled_in_fx_clean( ent_zombie, ent_fx_origin ) +{ + ent_fx_origin endon( "no_clean_up_needed" ); + if( !IsDefined( ent_zombie ) ) + { + return; + } + ent_zombie waittill( "entityshutdown" ); + if( IsDefined( ent_fx_origin ) ) + { + ent_fx_origin Delete(); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_weap_freezegun.csc b/BO1/PC/ZM/clientscripts/_zombiemode_weap_freezegun.csc new file mode 100644 index 0000000..0c121f0 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_zombiemode_weap_freezegun.csc @@ -0,0 +1,336 @@ +#include clientscripts\_utility; +#include clientscripts\_fx; +init() +{ + if ( GetDvar( #"createfx" ) == "on" ) + { + return; + } + if ( !clientscripts\_zombiemode_weapons::is_weapon_included( "freezegun_zm" ) ) + { + return; + } + level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_EXTREMITY_DAMAGE_FX = 15; + register_clientflag_callback( "actor", level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_EXTREMITY_DAMAGE_FX, ::freezegun_extremity_damage_fx ); + level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_TORSO_DAMAGE_FX = 14; + register_clientflag_callback( "actor", level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_TORSO_DAMAGE_FX, ::freezegun_torso_damage_fx ); + level._gib_overload_func = clientscripts\_zombiemode_weap_freezegun::freezegun_gib_override; + level._effect[ "freezegun_shatter" ] = LoadFX( "weapon/freeze_gun/fx_freezegun_shatter" ); + level._effect[ "freezegun_crumple" ] = LoadFX( "weapon/freeze_gun/fx_freezegun_crumple" ); + level._effect[ "freezegun_damage_torso" ] = LoadFX( "maps/zombie/fx_zombie_freeze_torso" ); + level._effect[ "freezegun_damage_sm" ] = LoadFX( "maps/zombie/fx_zombie_freeze_md" ); + level._effect[ "freezegun_shatter_upgraded" ] = LoadFX( "weapon/freeze_gun/fx_exp_freezegun_impact" ); + level._effect[ "freezegun_crumple_upgraded" ] = LoadFX( "weapon/freeze_gun/fx_exp_freezegun_impact" ); + level._effect[ "freezegun_shatter_gib_fx" ] = LoadFX( "weapon/bullet/fx_flesh_gib_fatal_01" ); + level._effect[ "freezegun_shatter_gibtrail_fx" ] = LoadFX( "weapon/freeze_gun/fx_trail_freezegun_blood_streak" ); + level._effect[ "freezegun_crumple_gib_fx" ] = LoadFX( "system_elements/fx_null" ); + level._effect[ "freezegun_crumple_gibtrail_fx" ] = LoadFX( "system_elements/fx_null" ); + level thread player_init(); +} +player_init() +{ + waitforclient( 0 ); + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + player = players[i]; + } +} +freezegun_get_gibfx( shatter ) +{ + if ( shatter ) + { + return level._effect[ "freezegun_shatter_gib_fx" ]; + } + else + { + return level._effect[ "freezegun_crumple_gib_fx" ]; + } +} +freezegun_get_gibtrailfx( shatter ) +{ + if ( shatter ) + { + return level._effect[ "freezegun_shatter_gibtrail_fx" ]; + } + else + { + return level._effect[ "freezegun_crumple_gibtrail_fx" ]; + } +} +freezegun_get_gibsound( shatter ) +{ + if ( shatter ) + { + return "zmb_death_gibs"; + } + else + { + return "zmb_death_gibs"; + } +} +freezegun_get_gibforce( tag, force_from_torso, shatter ) +{ + if ( shatter ) + { + start_pos = self.origin; + if ( force_from_torso ) + { + start_pos = self gettagorigin( "J_SpineLower" ); + } + forward = VectorNormalize( self gettagorigin( tag ) - start_pos ); + forward *= RandomIntRange( 600, 1000 ); + forward += (0, 0, RandomIntRange( 400, 700 )); + return forward; + } + else + { + return (0, 0, 0); + } +} +freezegun_get_shatter_effect( upgraded ) +{ + if ( upgraded ) + { + return level._effect[ "freezegun_shatter_upgraded" ]; + } + else + { + return level._effect[ "freezegun_shatter" ]; + } +} +freezegun_get_crumple_effect( upgraded ) +{ + if ( upgraded ) + { + return level._effect[ "freezegun_crumple_upgraded" ]; + } + else + { + return level._effect[ "freezegun_crumple" ]; + } +} +freezegun_end_extremity_damage_fx( localclientnum, key ) +{ + deletefx( localclientnum, self.freezegun_extremity_damage_fx_handles[localclientnum][key], false ); +} +freezegun_end_all_extremity_damage_fx( localclientnum ) +{ + keys = getArrayKeys( self.freezegun_extremity_damage_fx_handles[localclientnum] ); + for ( i = 0; i < keys.size; i++ ) + { + freezegun_end_extremity_damage_fx( localclientnum, keys[i] ); + } +} +freezegun_end_extremity_damage_fx_for_all_localclients( key ) +{ + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + freezegun_end_extremity_damage_fx( i, key ); + } +} +freezegun_play_extremity_damage_fx( localclientnum, fx, key, tag ) +{ + self.freezegun_extremity_damage_fx_handles[localclientnum][key] = PlayFxOnTag( localclientnum, fx, self, tag ); +} +freezegun_play_all_extremity_damage_fx( localclientnum ) +{ + if ( !IsDefined( self.freezegun_extremity_damage_fx_handles ) ) + { + self.freezegun_extremity_damage_fx_handles = []; + } + if ( IsDefined( self.freezegun_extremity_damage_fx_handles[localclientnum] ) ) + { + return; + } + self.freezegun_extremity_damage_fx_handles[localclientnum] = []; + if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM ) ) + { + freezegun_play_extremity_damage_fx( localclientnum, level._effect[ "freezegun_damage_sm" ], "right_arm", "J_Elbow_RI" ); + } + if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM ) ) + { + freezegun_play_extremity_damage_fx( localclientnum, level._effect[ "freezegun_damage_sm" ], "left_arm", "J_Elbow_LE" ); + } + if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG ) ) + { + freezegun_play_extremity_damage_fx( localclientnum, level._effect[ "freezegun_damage_sm" ], "right_leg", "J_Knee_RI" ); + } + if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG ) ) + { + freezegun_play_extremity_damage_fx( localclientnum, level._effect[ "freezegun_damage_sm" ], "left_leg", "J_Knee_LE" ); + } +} +freezegun_extremity_damage_fx( localClientNum, set, newEnt ) +{ + players = getlocalplayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( set ) + { + self thread freezegun_play_all_extremity_damage_fx( i ); + } + else + { + self thread freezegun_end_all_extremity_damage_fx( i ); + } + } +} +freezegun_end_all_torso_damage_fx( localclientnum ) +{ + deletefx( localclientnum, self.freezegun_damage_torso_fx[localclientnum], true ); +} +freezegun_play_all_torso_damage_fx( localclientnum ) +{ + if ( !IsDefined( self.freezegun_damage_torso_fx ) ) + { + self.freezegun_damage_torso_fx = []; + } + if ( IsDefined( self.freezegun_damage_torso_fx[localclientnum] ) ) + { + return; + } + self.freezegun_damage_torso_fx[localclientnum] = PlayFxOnTag( localclientnum, level._effect[ "freezegun_damage_torso" ], self, "J_SpineLower" ); +} +freezegun_torso_damage_fx( localClientNum, set, newEnt ) +{ + players = getlocalplayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( set ) + { + self thread freezegun_play_all_torso_damage_fx( i ); + } + else + { + self thread freezegun_end_all_torso_damage_fx( i ); + } + } +} +freezegun_do_gib_fx( tag, shatter ) +{ + players = getlocalplayers(); + for ( i = 0; i < players.size; i++ ) + { + PlayFxOnTag( i, freezegun_get_gibtrailfx( shatter ), self, tag ); + } +} +freezegun_do_gib( model, tag, force_from_torso, shatter ) +{ + if ( shatter && !force_from_torso ) + { + tag_pos = self.origin; + tag_angles = (0, 0, 1); + } + else + { + tag_pos = self gettagorigin( tag ); + tag_angles = self gettagangles( tag ); + } + CreateDynEntAndLaunch( 0, model, tag_pos, tag_angles, tag_pos, self freezegun_get_gibforce( tag, force_from_torso, shatter ), freezegun_get_gibtrailfx( shatter ), 1 ); + self freezegun_do_gib_fx( tag, shatter ); +} +freezegun_gib_override( type, locations ) +{ + if ( "freeze" != type && "up" != type ) + { + if ( IsDefined( self.freezegun_damage_fx_handles ) ) + { + for ( i = 0; i < locations.size; i++ ) + { + switch( locations[i] ) + { + case 0: + players = getlocalplayers(); + for ( i = 0; i < players.size; i++ ) + { + self freezegun_end_all_extremity_damage_fx( i ); + } + break; + case 1: + freezegun_end_extremity_damage_fx_for_all_localclients( "right_arm" ); + break; + case 2: + freezegun_end_extremity_damage_fx_for_all_localclients( "left_arm" ); + break; + case 3: + freezegun_end_extremity_damage_fx_for_all_localclients( "right_leg" ); + break; + case 4: + freezegun_end_extremity_damage_fx_for_all_localclients( "left_leg" ); + break; + case 6: + freezegun_end_extremity_damage_fx_for_all_localclients( "left_arm" ); + break; + } + } + } + return false; + } + upgraded = false; + for ( i = 0; i < locations.size; i++ ) + { + switch( locations[i] ) + { + case 7: + upgraded = true; + break; + } + } + shatter = false; + explosion_effect = freezegun_get_crumple_effect( upgraded ); + alias = "wpn_freezegun_collapse_zombie"; + if ( "up" == type ) + { + shatter = true; + explosion_effect = freezegun_get_shatter_effect( upgraded ); + alias = "wpn_freezegun_shatter_zombie"; + } + players = getlocalplayers(); + for ( i = 0; i < players.size; i++ ) + { + self clientscripts\_zombiemode::deleteZombieEyes( i ); + self freezegun_end_all_extremity_damage_fx( i ); + self freezegun_end_all_torso_damage_fx( i ); + PlayFX( i, explosion_effect, self.origin ); + PlaySound( 0, alias, self.origin ); + } + for ( i = 0; i < locations.size; i++ ) + { + switch( locations[i] ) + { + case 0: + if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM ) && + IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn1 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag1 ) ) + { + self thread freezegun_do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn1, level._gibbing_actor_models[self._gib_def].gibSpawnTag1, true, shatter ); + } + if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM ) && + IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn2 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag2 ) ) + { + self thread freezegun_do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn2, level._gibbing_actor_models[self._gib_def].gibSpawnTag2, true, shatter ); + } + if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG ) && + IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn3 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag3 ) ) + { + self thread freezegun_do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn3, level._gibbing_actor_models[self._gib_def].gibSpawnTag3, false, shatter ); + } + if ( !self clientscripts\_zombiemode::has_gibbed_piece( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG ) && + IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn4 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag4 ) ) + { + self thread freezegun_do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn4, level._gibbing_actor_models[self._gib_def].gibSpawnTag4, false, shatter ); + } + self thread freezegun_do_gib_fx( "J_SpineLower", shatter ); + self clientscripts\_zombiemode::mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM ); + self clientscripts\_zombiemode::mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM ); + self clientscripts\_zombiemode::mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG ); + self clientscripts\_zombiemode::mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG ); + self clientscripts\_zombiemode::mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_HEAD ); + break; + } + } + self.gibbed = true; + return true; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_weap_humangun.csc b/BO1/PC/ZM/clientscripts/_zombiemode_weap_humangun.csc new file mode 100644 index 0000000..e068ab3 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_zombiemode_weap_humangun.csc @@ -0,0 +1,285 @@ +#include clientscripts\_utility; +#include clientscripts\_fx; +#include clientscripts\_zombiemode; +init() +{ + if ( GetDvar( #"createfx" ) == "on" ) + { + return; + } + if ( !clientscripts\_zombiemode_weapons::is_weapon_included( "humangun_zm" ) ) + { + return; + } + level._ZOMBIE_PLAYER_FLAG_HUMANGUN_HIT_RESPONSE = 11; + register_clientflag_callback( "player", level._ZOMBIE_PLAYER_FLAG_HUMANGUN_HIT_RESPONSE, ::humangun_player_hit_response ); + level._ZOMBIE_PLAYER_FLAG_HUMANGUN_UPGRADED_HIT_RESPONSE = 10; + register_clientflag_callback( "player", level._ZOMBIE_PLAYER_FLAG_HUMANGUN_UPGRADED_HIT_RESPONSE, ::humangun_upgraded_player_hit_response ); + level._ZOMBIE_ACTOR_FLAG_HUMANGUN_HIT_RESPONSE = 12; + register_clientflag_callback( "actor", level._ZOMBIE_ACTOR_FLAG_HUMANGUN_HIT_RESPONSE, ::humangun_zombie_hit_response ); + level._ZOMBIE_ACTOR_FLAG_HUMANGUN_UPGRADED_HIT_RESPONSE = 11; + register_clientflag_callback( "actor", level._ZOMBIE_ACTOR_FLAG_HUMANGUN_UPGRADED_HIT_RESPONSE, ::humangun_upgraded_zombie_hit_response ); + level._humangun_player_hit_visionset = "zombie_humangun_player_hit"; + level._humangun_player_hit_visionset_priority = 8; + level._humangun_upgraded_player_hit_visionset = "zombie_humangun_upgraded_player_hit"; + level._humangun_upgraded_player_hit_visionset_priority = 9; + level._humangun_visionset_transition_time = 0.3; + level._effect["humangun_viewmodel_reload"] = LoadFX( "weapon/human_gun/fx_hgun_reload" ); + level._effect["humangun_viewmodel_reload_upgraded"] = LoadFX( "weapon/human_gun/fx_hgun_reload_ug" ); + level._effect["humangun_glow_neck"] = LoadFX( "weapon/human_gun/fx_hgun_1st_hit_glow_zombie" ); + level._effect["humangun_glow_neck_upgraded"] = LoadFX( "weapon/human_gun/fx_hgun_1st_hit_glow_zombie_ug" ); + level._effect["humangun_glow_neck_critical"] = LoadFX( "weapon/human_gun/fx_hgun_timer_glow_zombie_ug" ); + level._effect["humangun_glow_spine_upgraded"] = LoadFX( "weapon/human_gun/fx_hgun_2nd_hit_glow_zombie_ug" ); + level._effect["humangun_explosion"] = LoadFX( "weapon/human_gun/fx_hgun_explosion_ug" ); + level._effect["humangun_explosion_death_mist"] = loadfx( "maps/zombie/fx_zmb_coast_jackal_death" ); + level thread player_init(); + level thread humangun_notetrack_think(); +} +player_init() +{ + waitforclient( 0 ); + level.humangun_play_sfx = []; + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + player = players[i]; + level.humangun_play_sfx[i] = false; + level.humangun_sfx_is_playing[i] = false; + player thread humangun_sfx( i ); + } +} +humangun_sfx( localclientnum ) +{ + self endon( "disconnect" ); + for( ;; ) + { + realwait( 0.1 ); + currentweapon = GetCurrentWeapon( localclientnum ); + if ( !level.humangun_play_sfx[localclientnum] || IsThrowingGrenade( localclientnum ) || IsMeleeing( localclientnum ) || IsOnTurret( localclientnum ) || (currentweapon != "humangun_zm" && currentweapon != "humangun_upgraded_zm") ) + { + humangun_sfx_off( localclientnum ); + continue; + } + humangun_sfx_on( localclientnum ); + } +} +humangun_sfx_off( localclientnum ) +{ + if ( level.humangun_sfx_is_playing[localclientnum] ) + { + level thread deactivate_humangun_loop(); + level.humangun_sfx_is_playing[localclientnum] = false; + } +} +humangun_sfx_on( localclientnum ) +{ + if ( !level.humangun_sfx_is_playing[localclientnum] ) + { + level thread activate_humangun_loop(); + level.humangun_sfx_is_playing[localclientnum] = true; + } +} +humangun_get_eject_viewmodel_effect( upgraded ) +{ + if ( upgraded ) + { + return level._effect["humangun_viewmodel_reload_upgraded"]; + } + else + { + return level._effect["humangun_viewmodel_reload"]; + } +} +humangun_notetrack_think() +{ + level.humangun_sound_ent = spawn( 0, (0,0,0), "script_origin" ); + for ( ;; ) + { + level waittill( "notetrack", localclientnum, note ); + currentweapon = GetCurrentWeapon( localclientnum ); + switch( note ) + { + case "audio_deactivate_humangun_loop": + level.humangun_play_sfx[localclientnum] = false; + break; + case "audio_activate_humangun_loop": + level.humangun_play_sfx[localclientnum] = true; + break; + case "eject_fx": + PlayViewmodelFx( localclientnum, humangun_get_eject_viewmodel_effect( currentweapon == "humangun_upgraded_zm" ), "tag_eject_fx" ); + break; + } + } +} +humangun_create_hit_response_fx( localClientNum, tag, effect ) +{ + if ( !isdefined( self._humangun_hit_response_fx[localClientNum][tag] ) ) + { + self._humangun_hit_response_fx[localClientNum][tag] = PlayFxOnTag( localClientNum, effect, self, tag ); + } +} +humangun_delete_hit_response_fx( localClientNum, tag ) +{ + if ( isdefined( self._humangun_hit_response_fx[localClientNum][tag] ) ) + { + DeleteFx( localClientNum, self._humangun_hit_response_fx[localClientNum][tag], false ); + self._humangun_hit_response_fx[localClientNum][tag] = undefined; + } +} +humangun_zombie_hit_response_internal( localClientNum, set, newEnt, upgraded, zombie ) +{ + if ( localClientNum != 0 ) + { + return; + } + if ( !isdefined( self._humangun_hit_response_fx ) ) + { + self._humangun_hit_response_fx = []; + } + players = GetLocalPlayers(); + for ( i = 0; i < players.size; i++ ) + { + if(!zombie && players[i] IsSpectating()) + { + continue; + } + if ( !isdefined( self._humangun_hit_response_fx[i] ) ) + { + self._humangun_hit_response_fx[i] = []; + } + self humangun_delete_hit_response_fx( i, "j_neck" ); + self humangun_delete_hit_response_fx( i, "J_SpineLower" ); + if ( set ) + { + if ( zombie ) + { + self clientscripts\_zombiemode::deleteZombieEyes( i ); + } + if ( !upgraded ) + { + self humangun_create_hit_response_fx( i, "j_neck", level._effect["humangun_glow_neck"] ); + } + else + { + self humangun_create_hit_response_fx( i, "j_neck", level._effect["humangun_glow_neck_upgraded"] ); + self humangun_create_hit_response_fx( i, "J_SpineLower", level._effect["humangun_glow_spine_upgraded"] ); + } + } + } +} +humangun_player_hit_response( localClientNum, set, newEnt ) +{ + self thread humangun_player_visionset( localClientNum, set, newEnt, false ); + self humangun_zombie_hit_response_internal( localClientNum, set, newEnt, false, false ); +} +humangun_upgraded_player_hit_response( localClientNum, set, newEnt ) +{ + self thread humangun_player_visionset( localClientNum, set, newEnt, true ); + self humangun_zombie_hit_response_internal( localClientNum, set, newEnt, true, false ); +} +humangun_zombie_hit_response( localClientNum, set, newEnt ) +{ + if ( isdefined( self.humangun_zombie_hit_response ) ) + { + self [[ self.humangun_zombie_hit_response ]]( localClientNum, set, newEnt, false ); + return; + } + if ( isdefined( self.humangun_zombie_1st_hit_was_upgraded ) && self.humangun_zombie_1st_hit_was_upgraded ) + { + if ( localClientNum != 0 ) + { + return; + } + if ( set ) + { + players = GetLocalPlayers(); + for ( i = 0; i < players.size; i++ ) + { + self humangun_delete_hit_response_fx( i, "j_neck" ); + self humangun_create_hit_response_fx( i, "j_neck", level._effect["humangun_glow_neck_critical"] ); + } + } + else + { + self humangun_zombie_hit_response_internal( localClientNum, set, newEnt, false, true ); + tag_pos = self gettagorigin( "J_SpineLower" ); + players = GetLocalPlayers(); + for ( i = 0; i < players.size; i++ ) + { + playfx( i, level._effect["humangun_explosion"], tag_pos ); + playfx( i, level._effect["humangun_explosion_death_mist"], tag_pos ); + } + } + } + else + { + self humangun_zombie_hit_response_internal( localClientNum, set, newEnt, false, true ); + } +} +humangun_upgraded_zombie_hit_response( localClientNum, set, newEnt ) +{ + if ( isdefined( self.humangun_zombie_hit_response ) ) + { + self [[ self.humangun_zombie_hit_response ]]( localClientNum, set, newEnt, true ); + return; + } + if ( set ) + { + self.humangun_zombie_1st_hit_was_upgraded = true; + } + self humangun_zombie_hit_response_internal( localClientNum, set, newEnt, true, true ); +} +humangun_player_visionset( int_local_client, set, ent_new, bool_upgraded ) +{ + self endon( "disconnect" ); + if(self IsSpectating()) + { + return; + } + if(IsDefined(ent_new) && ent_new) + { + return; + } + player = GetLocalPlayers()[ int_local_client ]; + if( player GetEntityNumber() != self GetEntityNumber() ) + { + return; + } + if( set ) + { + if( bool_upgraded ) + { + self thread zombie_vision_set_apply( level._humangun_upgraded_player_hit_visionset, level._humangun_upgraded_player_hit_visionset_priority, level._humangun_visionset_transition_time, int_local_client ); + } + else + { + self thread zombie_vision_set_apply( level._humangun_player_hit_visionset, level._humangun_player_hit_visionset_priority, level._humangun_visionset_transition_time, int_local_client ); + } + } + else + { + if( bool_upgraded ) + { + zombie_vision_set_remove( level._humangun_upgraded_player_hit_visionset, level._humangun_visionset_transition_time, int_local_client ); + } + else + { + zombie_vision_set_remove( level._humangun_player_hit_visionset, level._humangun_visionset_transition_time, int_local_client ); + } + } +} +activate_humangun_loop() +{ + level endon( "audio_deact_hg_loop" ); + level notify( "audio_act_hg_loop" ); + PlaySound( 0, "wpn_humangun_loop_start", (0,0,0) ); + level.humangun_sound_ent PlayLoopSound( "wpn_humangun_loop", 1 ); +} +deactivate_humangun_loop() +{ + level endon( "audio_act_hg_loop" ); + level notify( "audio_deact_hg_loop" ); + PlaySound( 0, "wpn_humangun_loop_end", (0,0,0) ); + level.humangun_sound_ent stoploopsound( .5 ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_weap_microwavegun.csc b/BO1/PC/ZM/clientscripts/_zombiemode_weap_microwavegun.csc new file mode 100644 index 0000000..0fe2549 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_weap_microwavegun.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_weap_quantum_bomb.csc b/BO1/PC/ZM/clientscripts/_zombiemode_weap_quantum_bomb.csc new file mode 100644 index 0000000..c39472d Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_weap_quantum_bomb.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_weap_sniper_explosive.csc b/BO1/PC/ZM/clientscripts/_zombiemode_weap_sniper_explosive.csc new file mode 100644 index 0000000..10140fe Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_weap_sniper_explosive.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_weap_tesla.csc b/BO1/PC/ZM/clientscripts/_zombiemode_weap_tesla.csc new file mode 100644 index 0000000..c429d03 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_weap_tesla.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_weap_thundergun.csc b/BO1/PC/ZM/clientscripts/_zombiemode_weap_thundergun.csc new file mode 100644 index 0000000..8d5f5d2 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_weap_thundergun.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombiemode_weapons.csc b/BO1/PC/ZM/clientscripts/_zombiemode_weapons.csc new file mode 100644 index 0000000..823c721 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/_zombiemode_weapons.csc differ diff --git a/BO1/PC/ZM/clientscripts/_zombietron.csc b/BO1/PC/ZM/clientscripts/_zombietron.csc new file mode 100644 index 0000000..c2aa362 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/_zombietron.csc @@ -0,0 +1,923 @@ +#include clientscripts\_music; +#include clientscripts\_utility; +main() +{ + level.zombiemode = true; + level.swimmingFeature = false; + clientscripts\_load::main(); + clientscripts\_footsteps::SetAIFootstepPrepend( "fly_step_zombie_"); + thread clientscripts\_audio::audio_init(0); + level._zombieCBFunc = clientscripts\_zombietron::on_zombie_spawn; + level._playerCBFunc = clientscripts\_zombietron::on_player_spawn; + init_client_flags(); + init_client_flag_callbacks(); + OnPlayerConnect_Callback( ::on_player_connect ); + level._customVehicleCBFunc = ::vehicle_spawned_callback; + level.bomb_model = "zombie_bomb"; + level.head_model = "char_ger_ansel_head"; + level._ZOMBIE_GIB_PIECE_INDEX_ALL = 0; + level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM = 1; + level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM = 2; + level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG = 3; + level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG = 4; + level._ZOMBIE_GIB_PIECE_INDEX_HEAD = 5; + level._ZOMBIE_GIB_PIECE_INDEX_GUTS = 6; + level._gib_overload_func = ::gib_handler; + level._gibEventCBFunc = ::on_gib_event; +} +vehicle_spawned_callback( localClientNum ) +{ + if( self.vehicletype == "tank_t55_mini" ) + { + self thread collisionHandler( localClientNum ); + self thread jump_landing_thread( localClientNum ); + } +} +collisionHandler( localClientNum ) +{ + self endon( "entityshutdown" ); + while( 1 ) + { + self waittill( "veh_collision", hip, hitn, hit_intensity ); + driver_local_client = self GetLocalClientDriver(); + if( IsDefined( driver_local_client ) ) + { + player = getlocalplayer( driver_local_client ); + if( IsDefined( player ) ) + { + if( hit_intensity > 15 ) + { + player PlayRumbleOnEntity( driver_local_client, "damage_heavy" ); + } + else + { + player PlayRumbleOnEntity( driver_local_client, "damage_light" ); + } + } + } + } +} +jump_landing_thread( localClientNum ) +{ + self endon( "entityshutdown" ); + while( 1 ) + { + self waittill( "veh_landed" ); + driver_local_client = self GetLocalClientDriver(); + if( IsDefined( driver_local_client ) ) + { + player = getlocalplayer( driver_local_client ); + if( IsDefined( player ) ) + { + player PlayRumbleOnEntity( driver_local_client, "damage_heavy" ); + } + } + } +} +lightning_flash( intensity_low, intensity_high, lightningdir ) +{ + lightningintensity = RandomFloatRange( intensity_low, intensity_high ); + lightningexposure = 2; + SetSavedDvar( "r_lightTweakSunLight", lightningintensity ); + SetSavedDvar( "r_lightTweakSunDirection", lightningdir ); + SetDvar( "r_exposureValue", lightningexposure ); +} +lighting_flash_cycle( intensity_low, intensity_high, min_flash_time, max_flash_time, flash_wait_time_min, flash_wait_time_max ) +{ + flash_time = RandomFloatRange(min_flash_time, max_flash_time); + oldlight = GetDvarFloat( "r_lightTweakSunLight" ); + oldsundir = GetDvarVector( "r_lightTweakSunDirection" ); + oldexposure = GetDvarFloat( "r_exposureValue" ); + lightningdir = ( RandomFloatRange(-60, -20), RandomFloatRange(0, 360) , 0 ); + while( flash_time > 0.0 ) + { + lightning_flash(intensity_low, intensity_high, lightningdir); + PlaySound( 0, "amb_thunder_clap", (0,0,0) ); + flash_wait_time = RandomFloatRange(flash_wait_time_min, flash_wait_time_max); + wait( flash_wait_time ); + SetSavedDvar( "r_lightTweakSunLight", oldlight ); + SetSavedDvar( "r_lightTweakSunDirection", oldsundir ); + SetDvar( "r_exposureValue", oldexposure ); + flash_time = flash_time - flash_wait_time; + } +} +lightning(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if( set ) + { + intensity_low = 10; + intensity_high = 30; + min_flash_time = 0.3; + max_flash_time = 0.7; + flash_wait_time_min = 0.05; + flash_wait_time_max = 0.1; + level thread lighting_flash_cycle( intensity_low, + intensity_high, + min_flash_time, + max_flash_time, + flash_wait_time_min, + flash_wait_time_max ); + } +} +show_scores(localClientNum, set, newEnt) +{ + if( localClientNum != 0 ) + { + return; + } + if (isPC()) + { + return; + } + if( set ) + { + ShowScores(localClientNum); + } + else + { + HideScores(localClientNum); + } +} +zombie_helicopter_kill(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if(set) + { + temp = (0,0,270); + if(IsDefined(level._heli_pilot_ent)) + { + temp = self.origin - level._heli_pilot_ent.origin; + } + temp = VectorNormalize( temp ); + launch_dir = VectorCross( temp, (0,0,1) ); + launch_dir = VectorNormalize( launch_dir ); + launch_dir *= 100; + self LaunchRagdoll( launch_dir ); + PlaySound( 0, "zmb_ragdoll_launched", self.origin ); + origin = self GetTagOrigin( "j_head" ); + angles = self GetTagAngles( "j_head" ); + forcex = RandomFloatRange( -200, 200 ); + forcey = RandomFloatRange( -200, 200 ); + forcez = RandomFloatRange( 1300, 3100 ); + camera_angles = GetDvarVector( "player_TopDownCamAngles" ); + launchDir = AnglesToForward( camera_angles ); + launchDir = launchDir * forcez * -1; + launchDir += ( forcex, forcey, 0 ); + contactPoint = origin + ( RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ) ) * 5; + CreateDynEntAndLaunch( 0, level.head_model, origin, angles, contactPoint, launchDir, level._effect["animscript_gibtrail_fx"] ); + } +} +heli_pilot(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if(set) + { + level._heli_pilot_ent = self; + } + else + { + level._heli_pilot_ent = undefined; + } +} +init_client_flag_callbacks() +{ + register_clientflag_callback("actor", level._ZT_ACTOR_CF_GIB_DEATH_P1, ::gib_death_1); + register_clientflag_callback("actor", level._ZT_ACTOR_CF_GIB_DEATH_P2, ::gib_death_2); + register_clientflag_callback("actor", level._ZT_ACTOR_CF_GIB_DEATH_P3, ::gib_death_3); + register_clientflag_callback("actor", level._ZT_ACTOR_CF_GIB_DEATH_P4, ::gib_death_4); + register_clientflag_callback("actor", level._ZT_ACTOR_CF_BLOOD, ::zombie_blood); + register_clientflag_callback("actor", level._ZT_ACTOR_CF_LAUNCH_AND_BURN, ::zombie_launch_and_burn); + register_clientflag_callback("actor", level._ZT_ACTOR_CF_KILLED_BY_HELI, ::zombie_helicopter_kill); + register_clientflag_callback("scriptmover", level._ZT_SCRIPTMOVER_CF_SACRED_COW, ::sacred_cow); + register_clientflag_callback("scriptmover", level._ZT_SCRIPTMOVER_CF_POWERUP, ::powerup); + register_clientflag_callback("scriptmover", level._ZT_SCRIPTMOVER_CF_ELEC_TRAP, ::electrap_handler); + register_clientflag_callback("player", level._ZT_PLAYER_CF_UPDATEPROFILE, ::update_player_profile); + register_clientflag_callback("player", level._ZT_PLAYER_CF_HELI_PILOT, ::heli_pilot); + register_clientflag_callback("player", level._ZT_PLAYER_CF_START_SMART_BOMB, ::smartbomb_handler); + register_clientflag_callback("player", level._ZT_PLAYER_CF_LIGHTNING, ::lightning); + register_clientflag_callback("player", level._ZT_PLAYER_CF_SHOW_SCORES, ::show_scores); +} +update_player_profile(localClientNum, set, newEnt) +{ + PrintLn("*** Update player profile. ***"); + UpdateGamerProfile(localClientNum); +} +randomize_array( array ) +{ + for( i = 0; i < array.size; i++ ) + { + j = RandomInt( array.size ); + temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + return array; +} +flame_death_fx() +{ + self endon( "entityshutdown" ); + if (IsDefined(self.is_on_fire) && self.is_on_fire ) + { + return; + } + self.is_on_fire = true; + if( IsDefined( level._effect ) && IsDefined( level._effect["character_fire_death_torso"] ) ) + { + PlayFxOnTag(0, level._effect["character_fire_death_torso"], self, "J_SpineLower" ); + } + if( IsDefined( level._effect ) && IsDefined( level._effect["character_fire_death_sm"] ) ) + { + wait 1; + tagArray = []; + tagArray[0] = "J_Elbow_LE"; + tagArray[1] = "J_Elbow_RI"; + tagArray[2] = "J_Knee_RI"; + tagArray[3] = "J_Knee_LE"; + tagArray = randomize_array( tagArray ); + PlayFxOnTag( 0, level._effect["character_fire_death_sm"], self, tagArray[0] ); + wait 1; + tagArray[0] = "J_Wrist_RI"; + tagArray[1] = "J_Wrist_LE"; + tagArray[2] = "J_Ankle_RI"; + tagArray[3] = "J_Ankle_LE"; + tagArray = randomize_array( tagArray ); + PlayFxOnTag( 0, level._effect["character_fire_death_sm"], self, tagArray[0] ); + PlayFxOnTag( 0, level._effect["character_fire_death_sm"], self, tagArray[1] ); + } +} +zombie_launch_and_burn(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if(!set) + { + return; + } + if(!IsDefined(level._nukepoint)) + { + return; + } + dist_squared = DistanceSquared( self.origin, level._nukepoint ); + if( dist_squared < 130 * 130 ) + { + self LaunchRagdoll( (0,0,270) ); + } + else if( dist_squared < 360 * 360 ) + { + dir = VectorNormalize( self.origin - level._nukepoint ); + dir = dir * 100; + dir = dir + (0,0,120); + self LaunchRagdoll( dir ); + } + self thread flame_death_fx(); +} +smartbomb_handler(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if(!set) + { + return; + } + if (IsDefined( self.tank )) + { + level._nukepoint = self.tank.origin; + } + else + { + level._nukepoint = self.origin; + } + origin = self.origin + (20,0,800); + bomb = Spawn( 0, origin, "script_model" ); + bomb SetModel( level.bomb_model ); + bomb.angles = (90, 0, 0); + bomb MoveTo( self.origin, 0.3, 0, 0 ); + PlaySound( 0, "zmb_nuke_incoming", self.origin ); + bomb waittill("movedone"); + PlaySound( 0, "zmb_nuke_impact", self.origin ); + PlayFX( 0, level._effect["bomb"], self.origin ); + bomb Delete(); + players = getlocalplayers(); + for(i = 0; i < players.size; i ++) + { + players[i] EarthQuake( 1.0, 0.8, self.origin, 1000 ); + } +} +trap_tear_down_monitor(parent) +{ + self endon("done"); + parent waittill("entityshutdown"); + self notify("torn_down"); + self Delete(); +} +fx_tear_down_monitor() +{ + self waittill("entityshutdown"); + if(IsDefined(self.fx)) + { + self.fx Delete(); + self.fx = undefined; + } + if(IsDefined(self.fx2)) + { + self.fx2 Delete(); + self.fx2 = undefined; + } +} +electrap_loop_sound(parent) +{ + self endon("torn_down"); + self PlayLoopSound( "zmb_hazard_loop", .5 ); + self waittill("deactivate"); + self notify("done"); + self stoploopsound(0.5); + if(IsDefined(self.fx)) + { + self.fx Delete(); + self.fx = undefined; + } + if(IsDefined(self.fx2)) + { + self.fx2 Delete(); + self.fx2 = undefined; + } + self Delete(); +} +get_camera_launch_direction() +{ + pos = GetDvarVector( "player_topDownCamCenterPos" ) + GetDvarVector( "player_topDownCamOffset" ); + return VectorNormalize( pos - self.origin ); +} +gib_handler(type, locations) +{ + if(type == "up") + { + up = get_camera_launch_direction(); + self._gib_vel = up * RandomIntRange( 1400, 3500 ); + } + return false; +} +electrap_handler(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + self endon("entityshutdown"); + if ( !isDefined(self.first_tickle) ) + { + self.first_tickle = 1; + self thread fx_tear_down_monitor(); + return; + } + if(set) + { + if ( isDefined(self.fx2) ) + { + self.fx2 Delete(); + self.fx2 = SpawnFx( 0, level._effect["trap_red"], self.origin, 0,(1,0,0),(0,0,1) ); + if ( isDefined(self.fx2) ) + { + triggerFx( self.fx2 ); + } + } + wait 1; + self.fx = SpawnFx( 0, level._effect["electric_trap"], self.origin + (0,0,100), 0 ); + if ( isDefined(self.fx) ) + { + triggerFx( self.fx ); + self.soundent = spawn(0, self.origin, "script_origin"); + self.soundent thread electrap_loop_sound(self); + } + } + else + { + if ( isDefined(self.fx) ) + { + self.fx Delete(); + self.soundent notify("deactivate"); + } + if ( isDefined(self.fx2) ) + { + self.fx2 Delete(); + } + self.fx2 = SpawnFx( 0, level._effect["trap_green"], self.origin, 0,(1,0,0),(0,0,1) ); + if ( isDefined(self.fx2) ) + { + triggerFx( self.fx2 ); + } + } +} +get_pickup_type_from_model(model) +{ + ret = "NA"; + switch(model) + { + case "zombietron_gold_brick": + case "zombietron_gold_bricks": + case "zombietron_gold_coin": + case "zombietron_silver_brick": + case "zombietron_silver_bricks": + case "zombietron_silver_coin": + case "zombie_z_money_icon": + case "zombietron_ruby": + case "zombietron_sapphire": + case "zombietron_diamond": + ret = "money"; + break; + case "c_usa_blackops_body1_fb": + ret = "extra_life"; + break; + case "t5_veh_tank_t55_mini_static": + ret = "tank"; + break; + case "t5_veh_helo_hind_mini": + ret = "heli"; + break; + case "p_glo_barrel_metal_blue": + ret = "spinning_blockers"; + break; + case "zombietron_electric_ball": + ret = "tesla_blockers"; + break; + case "zombie_teddybear": + ret = "stun_blockers"; + break; + case "anim_chicken": + ret = "double_shot"; + break; + case "zombie_bomb": + ret = "bomb"; + break; + case "zombietron_lightning_bolt": + ret = "booster"; + break; + case "p_rus_boots": + ret = "speed"; + break; + case "m2_flamethrower_zt": + case "ray_gun_zt": + case "weapon_usa_ray_gun": + case "weapon_usa_flamethrower": + case "m60_zt": + case "minigun_zt": + case "t5_weapon_carry_minigun_world": + case "spas_zt": + case "t5_weapon_spas_world": + case "china_lake_zt": + case "t5_weapon_ex41_world": + case "rpg_zt": + case "weapon_rpg7": + ret = "weapon"; + break; + case "zombie_auto_turret": + ret = "mini_turret"; + break; + case "weapon_zombie_monkey_bomb": + case "weapon_zombie_monkey_bomb_zt": + ret = "monkey"; + break; + } + return(ret); +} +pickup_tear_down_monitor(parent) +{ + self endon("done"); + parent waittill("entityshutdown"); + self notify("torn_down"); + self stoploopsound(0.5); + self Delete(); +} +pickup_loop_sound(parent, sound) +{ + self endon("torn_down"); + self thread pickup_tear_down_monitor(parent); + self PlayLoopSound( sound, .5 ); + self waittill("picked_up"); + self notify("done"); + self stoploopsound(0.5); + self Delete(); +} +powerup(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if(set) + { + play_sound = true; + loop_sound = ""; + switch(get_pickup_type_from_model(self.model)) + { + case "extra_life": + case "extra_life_directed": + loop_sound = "zmb_pickup_life_shimmer"; + playfxontag (localClientNum, level._effect["powerup_on"], self, "tag_origin"); + break; + case "money": + loop_sound = "zmb_pickup_money_shimmer"; + model = self.model; + if ( model == "zombietron_ruby" ) + { + PlayFxOnTag(localClientNum, level._effect["red_gem"], self, "tag_origin" ); + } + else if ( model == "zombietron_sapphire" ) + { + PlayFxOnTag(localClientNum, level._effect["blue_gem"], self, "tag_origin" ); + } + else if ( model == "zombietron_diamond" ) + { + PlayFxOnTag(localClientNum, level._effect["white_gem"], self, "tag_origin" ); + } + else if ( issubstr(self.model,"silver" ) ) + { + playfxontag (localClientNum, level._effect["powerup_on_silver"], self, "tag_origin"); + } + else + { + playfxontag (localClientNum, level._effect["powerup_on"], self, "tag_origin"); + } + break; + case "speed": + case "spinning_blockers": + case "tesla_blockers": + case "stun_blockers": + case "bomb": + case "booster": + case "mini_turret": + case "monkey": + loop_sound = "zmb_pickup_powerup_shimmer"; + break; + case "double_shot": + PlaySound(localClientNum, "zmb_dblshot_spawn", self.origin); + loop_sound = "zmb_pickup_powerup_shimmer"; + break; + case "weapon": + loop_sound = "zmb_pickup_weapon_shimmer"; + break; + case "tank": + case "heli": + loop_sound = "zmb_pickup_vehicle_shimmer"; + break; + default: + PrintLn("Spawned " + self.model); + play_sound = false; + break; + } + if(play_sound) + { + PlaySound( localClientNum, "zmb_pickup_spawn", self.origin ); + } + if(loop_sound != "") + { + self.loopsound = spawn(0, self.origin, "script_origin"); + self.loopsound thread pickup_loop_sound(self, loop_sound); + } + } + else + { + if(IsDefined(self.loopsound)) + { + self.loopsound notify("picked_up"); + } + PlayFx( 0, level._effect["powerup_grabbed"], self.origin, AnglesToForward(self.angles) ); + switch(get_pickup_type_from_model(self.model)) + { + case "extra_life": + case "extra_life_directed": + PlaySound( localClientNum, "zmb_pickup_life", self.origin ); + break; + case "money": + PlaySound( localClientNum, "zmb_pickup_money", self.origin ); + break; + case "tank": + case "heli": + PlaySound( localClientNum, "zmb_pickup_vehicle", self.origin ); + break; + case "spinning_blockers": + case "tesla_blockers": + case "stun_blockers": + case "double_shot": + case "bomb": + case "booster": + case "speed": + PlaySound( localClientNum, "zmb_pickup_powerup", self.origin ); + break; + case "weapon": + case "mini_turret": + case "monkey": + PlaySound( localClientNum, "zmb_pickup_weapon", self.origin ); + break; + default: + PrintLn("Grabbed " + self.model); + break; + } + } +} +sacred_cow(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + self PlayLoopSound( "zmb_pickup_money_shimmer" ); + playfxontag (localClientNum,level._effect["powerup_on"], self, "J_Ankle_LE"); + playfxontag (localClientNum,level._effect["powerup_on"], self, "J_Ankle_RI"); + playfxontag (localClientNum,level._effect["powerup_on"], self, "J_Wrist_LE"); + playfxontag (localClientNum,level._effect["powerup_on"], self, "J_Wrist_RI"); + playfxontag (localClientNum,level._effect["torch_light"], self, "J_Tail2"); +} +zombie_blood(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if(set) + { + if(is_mature()) + { + PlayFX(localClientNum, level._effect["big_blood"], self.origin, AnglesToForward(self.angles) * -1); + } + } +} +gib_death(localClientNum, set, newEnt, player) +{ + if(set) + { + if(is_mature()) + { + PlayFX( localClientNum, level._effect["gib_death"], self.origin, AnglesToForward(self.angles) ); + } + } +} +gib_death_1(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + gib_death(localClientNum, set, newEnt, 1); +} +gib_death_2(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + gib_death(localClientNum, set, newEnt, 2); +} +gib_death_3(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + gib_death(localClientNum, set, newEnt, 3); +} +gib_death_4(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + gib_death(localClientNum, set, newEnt, 4); +} +init_client_flags() +{ + level._ZT_ACTOR_CF_GIB_DEATH_P1 = 2; + level._ZT_ACTOR_CF_GIB_DEATH_P2 = 3; + level._ZT_ACTOR_CF_GIB_DEATH_P3 = 4; + level._ZT_ACTOR_CF_GIB_DEATH_P4 = 5; + level._ZT_ACTOR_CF_BLOOD = 6; + level._ZT_ACTOR_CF_LAUNCH_AND_BURN = 7; + level._ZT_ACTOR_CF_KILLED_BY_HELI = 8; + level._ZT_SCRIPTMOVER_CF_SACRED_COW = 0; + level._ZT_SCRIPTMOVER_CF_POWERUP = 1; + level._ZT_SCRIPTMOVER_CF_ELEC_TRAP = 2; + level._ZT_PLAYER_CF_UPDATEPROFILE = 10; + level._ZT_PLAYER_CF_HELI_PILOT = 11; + level._ZT_PLAYER_CF_LIGHTNING = 12; + level._ZT_PLAYER_CF_SHOW_SCORES = 13; + level._ZT_PLAYER_CF_START_SMART_BOMB = 14; +} +createZombieEyes(localClientNum) +{ + if(isdefined(self._eyeArray)) + { + if(!isdefined(self._eyeArray[localClientNum])) + { + linkTag = "J_Eyeball_LE"; + self._eyeArray[localClientNum] = PlayFxOnTag( localClientNum, level._effect["eye_glow"], self, linkTag ); + } + } +} +deleteZombieEyes(localClientNum) +{ + if(isdefined(self._eyeArray)) + { + if(isdefined(self._eyeArray[localClientNum])) + { + DeleteFx( localClientNum, self._eyeArray[localClientNum] , true ); + self._eyeArray[localClientNum] = undefined; + } + } +} +on_player_connect(localClientNum) +{ + ForceGameModeMappings( localClientNum, "zombietron" ); +} +on_player_spawn(localClientNum) +{ + ForceGameModeMappings( localClientNum, "zombietron" ); + self mapshaderconstant( localClientNum, 0, "scriptVector0", 1.0, -1.0, 0.0, 0.0 ); +} +on_zombie_spawn(localClientNum) +{ + if(!isdefined(self._eyeArray)) + { + self._eyeArray = []; + } + wait( 0.05 ); + if( isDefined(self) && self haseyes()) + { + self createZombieEyes(localClientNum); + } + if ( isDefined(self) ) + self mapshaderconstant( localClientNum, 0, "scriptVector0", -4.0, -1.0, 0.0, -1.0 ); +} +zombie_eye_callback(localClientNum, hasEyes) +{ + players = GetLocalPlayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( hasEyes ) + { + self createZombieEyes( i ); + } + else + { + self deleteZombieEyes( i ); + } + } +} +mark_piece_gibbed( piece_index ) +{ + if ( !isdefined( self.gibbed_pieces ) ) + { + self.gibbed_pieces = []; + } + self.gibbed_pieces[self.gibbed_pieces.size] = piece_index; +} +has_gibbed_piece( piece_index ) +{ + if ( !isdefined( self.gibbed_pieces ) ) + { + return false; + } + for ( i = 0; i < self.gibbed_pieces.size; i++ ) + { + if ( self.gibbed_pieces[i] == piece_index ) + { + return true; + } + } + return false; +} +do_gib_fx( tag ) +{ + players = getlocalplayers(); + for ( i = 0; i < players.size; i++ ) + { + PlayFxOnTag( i, level._effect["animscript_gib_fx"], self, tag ); + } + PlaySound( 0, "zmb_death_gibs", self gettagorigin( tag ) ); +} +do_gib( model, tag ) +{ + start_pos = self gettagorigin( tag ); + wait( 0.03 ); + end_pos = self gettagorigin( tag ); + if ( IsDefined( self._gib_vel ) ) + { + forward = self._gib_vel; + self._gib_vel = undefined; + } + else + { + forward = VectorNormalize( end_pos - start_pos ); + forward *= RandomIntRange( 600, 1000 ); + forward += (0, 0, RandomIntRange( 400, 700 )); + } + CreateDynEntAndLaunch( 0, model, end_pos, self gettagangles(tag), start_pos, forward, level._effect["animscript_gibtrail_fx"], 1 ); + self do_gib_fx( tag ); +} +on_gib_event( localClientNum, type, locations ) +{ + if ( localClientNum != 0 ) + { + return; + } + if( !is_mature() ) + { + return; + } + if ( self._gib_def == -1 ) + { + return; + } + if ( IsDefined( level._gib_overload_func ) ) + { + PrintLn( "type " + type ); + PrintLn( "loc size " + locations.size ); + if ( self [[level._gib_overload_func]]( type, locations ) ) + { + return; + } + } + for ( i = 0; i < locations.size; i++ ) + { + if ( IsDefined( self.gibbed ) && level._ZOMBIE_GIB_PIECE_INDEX_HEAD != locations[i] ) + { + continue; + } + switch( locations[i] ) + { + case 0: + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn1 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag1 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn1, level._gibbing_actor_models[self._gib_def].gibSpawnTag1 ); + } + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn2 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag2 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn2, level._gibbing_actor_models[self._gib_def].gibSpawnTag2 ); + } + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn3 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag3 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn3, level._gibbing_actor_models[self._gib_def].gibSpawnTag3 ); + } + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn4 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag4 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn4, level._gibbing_actor_models[self._gib_def].gibSpawnTag4 ); + } + self thread do_gib_fx( "J_SpineLower" ); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM ); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM ); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG ); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG ); + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_HEAD ); + break; + case 1: + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn1 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag1 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn1, level._gibbing_actor_models[self._gib_def].gibSpawnTag1 ); + } + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM ); + break; + case 2: + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn2 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag2 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn2, level._gibbing_actor_models[self._gib_def].gibSpawnTag2 ); + } + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM ); + break; + case 3: + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn3 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag3 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn3, level._gibbing_actor_models[self._gib_def].gibSpawnTag3 ); + } + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG ); + break; + case 4: + if ( IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawn4 ) && IsDefined( level._gibbing_actor_models[self._gib_def].gibSpawnTag4 ) ) + { + self thread do_gib( level._gibbing_actor_models[self._gib_def].gibSpawn4, level._gibbing_actor_models[self._gib_def].gibSpawnTag4 ); + } + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG ); + break; + case 5: + mark_piece_gibbed( level._ZOMBIE_GIB_PIECE_INDEX_HEAD ); + break; + case 6: + self thread do_gib_fx( "J_SpineLower" ); + break; + } + } + self.gibbed = true; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/createfx/zombie_coast_fx.csc b/BO1/PC/ZM/clientscripts/createfx/zombie_coast_fx.csc new file mode 100644 index 0000000..65bd17d --- /dev/null +++ b/BO1/PC/ZM/clientscripts/createfx/zombie_coast_fx.csc @@ -0,0 +1,1979 @@ + +main() +{ + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( -723.953, 704.846, 126.574 ); + ent.v[ "angles" ] = ( 270, 356.634, -100.633 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( -202.613, 1436.33, 1041.67 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( -1530.55, 1676.78, 252.125 ); + ent.v[ "angles" ] = ( 270, 356.82, -96.8201 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( -2318.28, 567.269, 19.6092 ); + ent.v[ "angles" ] = ( 270, 0, -98 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( -2438.09, -675.587, 146.911 ); + ent.v[ "angles" ] = ( 270, 0, -74 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( -2242.36, -1636.49, 383.258 ); + ent.v[ "angles" ] = ( 270, 2.86241, -102.862 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( -968.432, -1462.24, 447.741 ); + ent.v[ "angles" ] = ( 270, 2.2026, -106.203 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( 447.612, -1281.02, 239.318 ); + ent.v[ "angles" ] = ( 270, 357.397, -103.397 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( 1396.71, -2035.95, 341.561 ); + ent.v[ "angles" ] = ( 270, 2.86241, -124.862 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( 2355.43, -2789.1, 370.325 ); + ent.v[ "angles" ] = ( 270, 0, -106 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( 151.546, -374.941, 79.3456 ); + ent.v[ "angles" ] = ( 270, 0, -100 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_coast_snow_med" ); + ent.v[ "origin" ] = ( -270.03, 3847.11, 84.7671 ); + ent.v[ "angles" ] = ( 270, 356.82, -96.8201 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_coast_snow_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( -542.935, 792.353, 292.872 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( -370.228, 637.364, 297.125 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( -385.963, 640.045, 417.125 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( -512.427, 789.951, 412.125 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( -327.488, 791.428, 410.451 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( -324.04, 791.226, 297.125 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( -766.243, 872.979, 287.125 ); + ent.v[ "angles" ] = ( 0, 358, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( -334.906, 1513.44, 689 ); + ent.v[ "angles" ] = ( 0, 338, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( 204.414, 1523.78, 687.821 ); + ent.v[ "angles" ] = ( 0, 208, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( -71.1011, 1630.81, 908.715 ); + ent.v[ "angles" ] = ( 0, 268, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( -99.9678, 1089.76, 906 ); + ent.v[ "angles" ] = ( 0, 84, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( 161.463, 1199.86, 902 ); + ent.v[ "angles" ] = ( 0, 148, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( 210.016, 1127.85, 453.899 ); + ent.v[ "angles" ] = ( 0, 144, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 1425.64, 1334.61, 193.321 ); + ent.v[ "angles" ] = ( 0, 300, 14 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 1498.24, 1375, 191.958 ); + ent.v[ "angles" ] = ( 0, 300, -20 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 40.4197, 2131.49, 395.351 ); + ent.v[ "angles" ] = ( 5.69045, 180.43, 12.43 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( -1729.12, 1708.7, 317.114 ); + ent.v[ "angles" ] = ( 1.85431, 275.251, -4.01211 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( -1801.41, 1712.26, 332.678 ); + ent.v[ "angles" ] = ( 1.38481, 283.88, -9.90461 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( -2125.84, 1679.25, 238.844 ); + ent.v[ "angles" ] = ( 0, 262, 10 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( -2045.13, 1659.25, 272.093 ); + ent.v[ "angles" ] = ( 357.951, 267.641, 19.8991 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( 444.448, -2982.3, 802.96 ); + ent.v[ "angles" ] = ( 274, 168, 102 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( 3263.81, -1968.03, 800.492 ); + ent.v[ "angles" ] = ( 274, 168, 100 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -2138.02, -3128.25, 800.636 ); + ent.v[ "angles" ] = ( 274, 168, 104 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -5089.86, -233.69, 801.186 ); + ent.v[ "angles" ] = ( 274, 168, 88 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( -2465.18, 711.02, 31.6055 ); + ent.v[ "angles" ] = ( 2.74794, 16.2222, -0.287851 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( -3309.94, 741.117, 55.708 ); + ent.v[ "angles" ] = ( 3.08205, 352.743, 11.9879 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( 1130.82, 285.126, 97.2519 ); + ent.v[ "angles" ] = ( 10.5937, 357.414, -5.12359 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( 362.595, 1724.57, 643.141 ); + ent.v[ "angles" ] = ( 358, 16, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( 389.383, 2107.42, 650.103 ); + ent.v[ "angles" ] = ( 358.078, 359.991, 0.551503 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( -1301.1, 2026.09, 676.054 ); + ent.v[ "angles" ] = ( 6.559, 332.177, 1.39831 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( -2013.6, 1815.24, 704.794 ); + ent.v[ "angles" ] = ( 13.4542, 343.194, 21.86 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_interior_fog" ); + ent.v[ "origin" ] = ( -82.7478, 1330.09, 256.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_interior_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_interior_fog" ); + ent.v[ "origin" ] = ( -563.717, 1041.49, 259.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_interior_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_interior_fog" ); + ent.v[ "origin" ] = ( -518.74, 975.691, 375.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_interior_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_interior_fog" ); + ent.v[ "origin" ] = ( -1932.89, 2028.06, 165.901 ); + ent.v[ "angles" ] = ( 354, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_interior_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( -1736.03, 1531.46, 209.721 ); + ent.v[ "angles" ] = ( 350.269, 349.184, 1.43858 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( -909.916, 1830.7, 654.647 ); + ent.v[ "angles" ] = ( 0.391658, 338.293, -2.13047 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( 38.0013, 429.235, 64.925 ); + ent.v[ "angles" ] = ( 1.65813, 350.173, 5.88656 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( -89.0406, 743.913, 168.586 ); + ent.v[ "angles" ] = ( 8.60465, 327.186, 13.7975 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( 1345.84, 800.815, 24.2037 ); + ent.v[ "angles" ] = ( 0, 12, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( 710.002, 992.833, 400.692 ); + ent.v[ "angles" ] = ( 15.2664, 352.653, 7.96515 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_med" ); + ent.v[ "origin" ] = ( 338.788, 1070.99, 394.937 ); + ent.v[ "angles" ] = ( 4, 336, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -2930.24, 1253.41, 298.267 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -1799.64, 1975.07, 735.704 ); + ent.v[ "angles" ] = ( 0, 332, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -2362.17, 1755.31, 764.031 ); + ent.v[ "angles" ] = ( 0, 340, 30 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( 2050.53, 1549.83, 96.105 ); + ent.v[ "angles" ] = ( 0, 352, 24 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( 2153.88, 1453.55, 236.889 ); + ent.v[ "angles" ] = ( 0, 352, 28 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( 632.029, 1300.76, 547.848 ); + ent.v[ "angles" ] = ( 3.39142, 36.1222, 32.0628 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( 340.598, 852.958, 337.2 ); + ent.v[ "angles" ] = ( 7.41406, 348.986, -22.1953 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -491.804, 1950.46, 526.382 ); + ent.v[ "angles" ] = ( 0, 30, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( -2496.37, -1101.24, 342.275 ); + ent.v[ "angles" ] = ( 360, 14, -4 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( -2223.62, -1662.48, 382.395 ); + ent.v[ "angles" ] = ( 360, 14, -4 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( -1784.94, -1599.81, 343.146 ); + ent.v[ "angles" ] = ( 360, 14, -4 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( 287.693, -851.496, 271.669 ); + ent.v[ "angles" ] = ( 356.765, 320.066, -2.35368 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( -58.5893, -1373.92, 292.515 ); + ent.v[ "angles" ] = ( 356.849, 322.068, -2.46516 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( 1554.36, -1847.67, 306.015 ); + ent.v[ "angles" ] = ( 358.827, 321.987, -2.18431 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( 1489.95, -2586.75, 321.515 ); + ent.v[ "angles" ] = ( 359.998, 343.94, -3.46339 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( -595.436, 2407.6, 214.134 ); + ent.v[ "angles" ] = ( 7.35422, 23.5086, -37.3875 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( -1294.15, -1519.54, 504.512 ); + ent.v[ "angles" ] = ( 360, 14, -4 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( -2464.93, -1315.93, 506.352 ); + ent.v[ "angles" ] = ( 360, 14, -4 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_snow_gust_sml" ); + ent.v[ "origin" ] = ( -873.307, -923.32, 767.807 ); + ent.v[ "angles" ] = ( 360, 14, -4 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_sml"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( 914.322, -1393.08, 491.366 ); + ent.v[ "angles" ] = ( 358.682, 317.988, -2.16638 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( 125.431, -1466.08, 411.89 ); + ent.v[ "angles" ] = ( 359.057, 322.445, 21.6758 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( 1096.44, -862.731, 183 ); + ent.v[ "angles" ] = ( 0, 14, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -524.874, -240.655, 73.125 ); + ent.v[ "angles" ] = ( 0, 18, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -3702.71, -500.207, 234 ); + ent.v[ "angles" ] = ( 0, 14, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -1010.76, 1247.75, 241.6 ); + ent.v[ "angles" ] = ( 0, 300.003, 0.346539 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -1062.74, 691.277, 71.6103 ); + ent.v[ "angles" ] = ( 349.328, 333.905, 35.108 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -1672.41, -297.127, 127.125 ); + ent.v[ "angles" ] = ( 4.5736, 342.244, 22.1974 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -5204.37, 1695.18, 800.783 ); + ent.v[ "angles" ] = ( 274, 168, 70 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -3115.7, 3314.93, 1253.37 ); + ent.v[ "angles" ] = ( 274, 168, 86 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -650.288, 4318.61, 1188.99 ); + ent.v[ "angles" ] = ( 274, 168, 100 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( 2434.48, 3334.14, 798.308 ); + ent.v[ "angles" ] = ( 274, 168, 86 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_cloud_1" ); + ent.v[ "origin" ] = ( -4678.48, -4310.35, 1501.96 ); + ent.v[ "angles" ] = ( 270, 0, -110 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_cloud_1"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 110; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_cloud_2" ); + ent.v[ "origin" ] = ( 5632.04, 10309.2, 1500.21 ); + ent.v[ "angles" ] = ( 270, 0, 70 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_cloud_2"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 110; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -1412.63, -767.31, 453.777 ); + ent.v[ "angles" ] = ( 0.894943, 9.94451, -4.37254 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -869.385, -850.332, 762.226 ); + ent.v[ "angles" ] = ( 0.894943, 9.94451, -2.37254 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -817.081, -1108.54, 799.94 ); + ent.v[ "angles" ] = ( 1.05822, 13.9418, -2.30438 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -2463.47, -1268.28, 496.615 ); + ent.v[ "angles" ] = ( 0.977175, 11.9431, -4.33989 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -2489.88, -1433.44, 509.013 ); + ent.v[ "angles" ] = ( 0.894942, 9.94451, -4.37254 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -1489, -782.8, 311.321 ); + ent.v[ "angles" ] = ( 0.894943, 9.94451, -4.37254 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( 322.688, -841.692, 271.554 ); + ent.v[ "angles" ] = ( 358.836, 321.986, -2.25298 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -147.113, -1329.67, 292.225 ); + ent.v[ "angles" ] = ( 0, 312, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -319.117, 1044.15, 864.668 ); + ent.v[ "angles" ] = ( 359.078, 327.982, -2.36221 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -100.688, 1713.88, 865.139 ); + ent.v[ "angles" ] = ( 0.894943, 9.94451, -2.37254 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -734.249, 916.118, 494.125 ); + ent.v[ "angles" ] = ( 0, 354, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -541.917, 3829.69, 12.507 ); + ent.v[ "angles" ] = ( 1.13799, 15.9401, 57.734 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( 1501.09, 804.109, 10.2957 ); + ent.v[ "angles" ] = ( 0.894943, 9.94451, -2.37254 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -312.789, 719.238, 497.286 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( 340.347, 1388.3, 863 ); + ent.v[ "angles" ] = ( 0, 4, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( 294.529, 1126.94, 861.245 ); + ent.v[ "angles" ] = ( 0, 332, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( 137.726, 983.243, 862.051 ); + ent.v[ "angles" ] = ( 0, 294, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -513.018, -836.528, 732.871 ); + ent.v[ "angles" ] = ( 0, 12, -4 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -470.717, -1015.39, 745.557 ); + ent.v[ "angles" ] = ( 0, 12, -4 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -2100.88, -1288.07, 494.677 ); + ent.v[ "angles" ] = ( 0, 12, -4 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -1653.29, -1274.96, 432.732 ); + ent.v[ "angles" ] = ( 0, 12, -4 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -525.193, -694.903, 260.526 ); + ent.v[ "angles" ] = ( 0, 12, -4 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -482.865, -956.753, 266.836 ); + ent.v[ "angles" ] = ( 0, 12, -4 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -485.882, -835.714, 265.736 ); + ent.v[ "angles" ] = ( 0, 12, -4 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( 216.758, -1101.17, 294.69 ); + ent.v[ "angles" ] = ( 356.937, 322.069, -2.57367 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( 128.669, -1210.6, 299.794 ); + ent.v[ "angles" ] = ( 356.937, 322.069, -2.57367 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( 1710.8, -2252.2, 458.745 ); + ent.v[ "angles" ] = ( 357.43, 332.069, -1.06627 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( 2029.87, -2687.97, 425.735 ); + ent.v[ "angles" ] = ( 357.029, 324.07, -2.67898 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -437.938, 628.717, 494.667 ); + ent.v[ "angles" ] = ( 356.088, 269.972, 0.832816 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( 1.14178, 1769.16, 861.695 ); + ent.v[ "angles" ] = ( 3.8039, 83.9589, -1.23777 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -211.781, 1757.62, 860.692 ); + ent.v[ "angles" ] = ( 3.99756, 104.005, 0.139824 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -1242.42, 1903.74, 635.517 ); + ent.v[ "angles" ] = ( 358.556, 1.96757, -0.474048 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -2040.5, 1839.93, 628.768 ); + ent.v[ "angles" ] = ( 354.854, 351.771, 30.0404 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -1461.12, 2187.18, 660.92 ); + ent.v[ "angles" ] = ( 0.556147, 1.95103, -2.47392 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -2520.2, 740.686, 35.8808 ); + ent.v[ "angles" ] = ( 4.49483, 16.7135, 1.37766 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -3051.42, 684.291, 55.2923 ); + ent.v[ "angles" ] = ( 8.31729, 318.24, 3.29739 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -2973.35, -436.35, 16.426 ); + ent.v[ "angles" ] = ( 0, 26, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -1728.11, 2467.16, 591.981 ); + ent.v[ "angles" ] = ( 0.206564, 353.959, 3.4728 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( 1256.82, 317.022, 68.6769 ); + ent.v[ "angles" ] = ( 10.2794, 357.4, -3.3919 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -2579.66, -1127.28, 343.67 ); + ent.v[ "angles" ] = ( 0.977175, 11.9431, -4.33989 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( 1659.68, -1915.02, 305.324 ); + ent.v[ "angles" ] = ( 358.759, 319.987, -2.21102 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( 1289.2, 1630.12, 13.0114 ); + ent.v[ "angles" ] = ( 0, 300, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( 285.993, 2129.04, 178.198 ); + ent.v[ "angles" ] = ( 13.8014, 358.314, 2.26944 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( 803.648, 2072.58, 89.891 ); + ent.v[ "angles" ] = ( 9.17255, 331.747, -1.67476 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( -757.385, -806.377, 459.358 ); + ent.v[ "angles" ] = ( 0, 192, 4 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( -770.357, -1242.97, 488.885 ); + ent.v[ "angles" ] = ( 360, 192, 6 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( -649.108, -985.416, 474.194 ); + ent.v[ "angles" ] = ( 3.99756, 99.9951, 1.86017 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( -632.024, -996.316, 619.526 ); + ent.v[ "angles" ] = ( 4, 102, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_interior_fog" ); + ent.v[ "origin" ] = ( 1419.24, -2124.45, 0.281219 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_interior_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_packapunch" ); + ent.v[ "origin" ] = ( -1024.5, 59.9, 29 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_packapunch"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 201; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_packapunch" ); + ent.v[ "origin" ] = ( 1602.5, -1722.2, 34 ); + ent.v[ "angles" ] = ( 0, 140, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_packapunch"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 202; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_packapunch" ); + ent.v[ "origin" ] = ( -331.5, 3217.5, 30 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_packapunch"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 203; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( -1734.97, 1854.45, 194.893 ); + ent.v[ "angles" ] = ( 5.36796, 101.564, -4.81611 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( -2102.12, 1881.49, 140.247 ); + ent.v[ "angles" ] = ( 3.99024, 257.99, -0.279477 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -3873.65, -1696.56, 800.884 ); + ent.v[ "angles" ] = ( 274, 168, 70 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( 2963.14, 615.53, 800.089 ); + ent.v[ "angles" ] = ( 274, 168, 128 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -2121.14, 752.906, 800.105 ); + ent.v[ "angles" ] = ( 274, 168, 88 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( 453.691, 496.423, 800.246 ); + ent.v[ "angles" ] = ( 274, 168, 88 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_offshore_fog_1" ); + ent.v[ "origin" ] = ( -6976.05, 287.424, 0 ); + ent.v[ "angles" ] = ( 270, 357.614, -147.614 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_offshore_fog_1"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_offshore_fog_1" ); + ent.v[ "origin" ] = ( -2793.21, -4944.89, 35.125 ); + ent.v[ "angles" ] = ( 270, 337.979, -93.9792 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_offshore_fog_1"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_offshore_fog_1" ); + ent.v[ "origin" ] = ( 1065.35, -5397.07, 0.15451 ); + ent.v[ "angles" ] = ( 270, 337.979, -93.9792 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_offshore_fog_1"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_offshore_fog_1" ); + ent.v[ "origin" ] = ( 5493.69, -210.731, 0.192444 ); + ent.v[ "angles" ] = ( 270, 0, -42 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_offshore_fog_1"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_offshore_fog_1" ); + ent.v[ "origin" ] = ( 1184.37, 5589.14, 0.95459 ); + ent.v[ "angles" ] = ( 270, 0, -128 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_offshore_fog_1"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_offshore_fog_1" ); + ent.v[ "origin" ] = ( -5609.64, -2774.07, 0 ); + ent.v[ "angles" ] = ( 270, 357.614, -147.614 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_offshore_fog_1"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_offshore_fog_1" ); + ent.v[ "origin" ] = ( 5407.49, -4071.26, 0 ); + ent.v[ "angles" ] = ( 270, 0, -58 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_offshore_fog_1"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -3116.59, 3315.72, 1303.47 ); + ent.v[ "angles" ] = ( 274, 168, 86 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -5205.25, 1695.97, 850.88 ); + ent.v[ "angles" ] = ( 274, 168, 70 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -5090.75, -232.899, 851.29 ); + ent.v[ "angles" ] = ( 274, 168, 88 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -3874.54, -1695.77, 850.98 ); + ent.v[ "angles" ] = ( 274, 168, 70 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -2122.03, 753.692, 850.21 ); + ent.v[ "angles" ] = ( 274, 168, 88 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -651.184, 4319.4, 1239.09 ); + ent.v[ "angles" ] = ( 274, 168, 100 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( -2138.91, -3127.46, 850.74 ); + ent.v[ "angles" ] = ( 274, 168, 104 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( 443.555, -2981.51, 853.06 ); + ent.v[ "angles" ] = ( 274, 168, 102 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( 3262.92, -1967.24, 850.59 ); + ent.v[ "angles" ] = ( 274, 168, 100 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( 2962.25, 616.321, 850.19 ); + ent.v[ "angles" ] = ( 274, 168, 128 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( 2433.59, 3334.93, 848.41 ); + ent.v[ "angles" ] = ( 274, 168, 86 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_blizzard_med" ); + ent.v[ "origin" ] = ( 452.795, 497.212, 850.35 ); + ent.v[ "angles" ] = ( 274, 168, 88 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_blizzard_med"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -747.586, 1516.1, 628.871 ); + ent.v[ "angles" ] = ( 0, 316, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_spotlight_packapunch" ); + ent.v[ "origin" ] = ( -1024.5, 59.9, 29 ); + ent.v[ "angles" ] = ( 306, 56, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_spotlight_packapunch"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 201; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_spotlight_packapunch" ); + ent.v[ "origin" ] = ( -331.5, 3217.5, 30 ); + ent.v[ "angles" ] = ( 310.036, 277.08, -2.08057 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_spotlight_packapunch"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 203; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_spotlight_pap_202" ); + ent.v[ "origin" ] = ( 1602.5, -1722.2, 34 ); + ent.v[ "angles" ] = ( 328.072, 118.5, -4.95857 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_spotlight_pap_202"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 202; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_spotlight_burst" ); + ent.v[ "origin" ] = ( -72.8621, 1360.31, 2217.21 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_spotlight_burst"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 301; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -114.135, 969.592, 394.487 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -2078.97, -1274.45, 486.069 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -894.507, -1167.7, 592.974 ); + ent.v[ "angles" ] = ( 16, 336, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( -1339.78, -742.883, 414.793 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( -1079.32, -1463.57, 473.693 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( -899.283, -1416.61, 608.988 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( -626.625, -1356.51, 599.293 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( -805.771, -1403.98, 461.695 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_ray_moon_lg" ); + ent.v[ "origin" ] = ( 209.098, 2121.5, 184.225 ); + ent.v[ "angles" ] = ( 296, 56, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_ray_moon_lg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_ray_moon_lg" ); + ent.v[ "origin" ] = ( 277.609, 2039.86, 201.189 ); + ent.v[ "angles" ] = ( 310, 56, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_ray_moon_lg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_packapunch_rising" ); + ent.v[ "origin" ] = ( -331.5, 3217.5, 0 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_packapunch_rising"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 213; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_packapunch_rising" ); + ent.v[ "origin" ] = ( -1024.5, 59.9, -2 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_packapunch_rising"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 211; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_packapunch_rising" ); + ent.v[ "origin" ] = ( 1602.5, -1722.2, -3 ); + ent.v[ "angles" ] = ( 0, 230, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_packapunch_rising"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 212; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 258.139, 2295.46, 418.835 ); + ent.v[ "angles" ] = ( 0, 278, -8 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 333.189, 2160.38, 457.38 ); + ent.v[ "angles" ] = ( 15.3867, 60.8069, 21.2012 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_lightning_burst" ); + ent.v[ "origin" ] = ( -77.1881, 1361.67, 4000.95 ); + ent.v[ "angles" ] = ( 270, 180, 180 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_lightning_burst"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 310; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( -653.781, -970.167, 321.821 ); + ent.v[ "angles" ] = ( 3.99756, 99.9951, 1.86017 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_corridor_fog" ); + ent.v[ "origin" ] = ( -971.56, -1298.39, 346.816 ); + ent.v[ "angles" ] = ( 357.87, 193.858, 3.86109 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_corridor_fog"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_lightning_flash_single_md" ); + ent.v[ "origin" ] = ( -3111.43, 7897.57, 1277.9 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_lightning_flash_single_md"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 500; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_lightning_d_light" ); + ent.v[ "origin" ] = ( -745.685, 1272.67, 675.917 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_lightning_d_light"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 500; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_lightning_d_light" ); + ent.v[ "origin" ] = ( -594.74, 1294.77, 626.953 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_lightning_d_light"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 510; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_lightning_d_light" ); + ent.v[ "origin" ] = ( -596.962, 1131.76, 671.928 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_lightning_d_light"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 520; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_lightning_flash_single_md" ); + ent.v[ "origin" ] = ( 5337.43, 368.42, 145.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_lightning_flash_single_md"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 520; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_lightning_flash_single_md" ); + ent.v[ "origin" ] = ( 1970.25, 5086.08, 924.876 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_lightning_flash_single_md"; + ent.v[ "delay" ] = 0.25; + ent.v[ "exploder" ] = 520; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_lightning_d_light" ); + ent.v[ "origin" ] = ( -330.153, 1008.7, 744.869 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_lightning_d_light"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 530; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_beam_vert_shaft" ); + ent.v[ "origin" ] = ( -66.6304, 1357.88, 1611.83 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_beam_vert_shaft"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 755; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_beam_submarine" ); + ent.v[ "origin" ] = ( 3409.89, -848.479, 169 ); + ent.v[ "angles" ] = ( 333.4, 147.4, -3.06119 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_beam_submarine"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 750; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_sacrifice_flash" ); + ent.v[ "origin" ] = ( -66.6304, 1357.88, 1600 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_sacrifice_flash"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 760; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -593.007, -1184.98, 765.301 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( -965.143, -666.793, 399.312 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -803.913, 1055.49, 489 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( 1040.05, 651.951, 172.347 ); + ent.v[ "angles" ] = ( 10, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -2470.44, -166.168, 43.7954 ); + ent.v[ "angles" ] = ( 3.94085, 32.7477, 2.56468 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -1151.47, -786.047, 598.477 ); + ent.v[ "angles" ] = ( 1.19749, 13.9337, -4.29967 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -982.812, -1421.11, 646.964 ); + ent.v[ "angles" ] = ( 1.19749, 13.9337, -4.29967 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( 150.744, 457.422, 68.8116 ); + ent.v[ "angles" ] = ( 3.75841, 349.37, 20.0449 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( -219.619, 516.006, 74.9098 ); + ent.v[ "angles" ] = ( 359.536, 350.268, 30.0197 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 135.819, 3501.03, 141.436 ); + ent.v[ "angles" ] = ( 0, 202, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_lightning_intro_xlg" ); + ent.v[ "origin" ] = ( 6167.62, -69.5641, 916.125 ); + ent.v[ "angles" ] = ( 0, 208, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_lightning_intro_xlg"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 550; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zombie_boss_water_intro" ); + ent.v[ "origin" ] = ( -1407.96, 499.445, 0.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zombie_boss_water_intro"; + ent.v[ "delay" ] = 8.5; + ent.v[ "exploder" ] = 900; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zombie_boss_water_intro" ); + ent.v[ "origin" ] = ( -1520.08, 586.618, 0.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zombie_boss_water_intro"; + ent.v[ "delay" ] = 11; + ent.v[ "exploder" ] = 900; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zombie_boss_water_boil" ); + ent.v[ "origin" ] = ( -1402.66, 495.615, 0.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zombie_boss_water_boil"; + ent.v[ "delay" ] = 1; + ent.v[ "exploder" ] = 900; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zombie_boss_water_boil_sm" ); + ent.v[ "origin" ] = ( -1573.53, 690.727, 0.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zombie_boss_water_boil_sm"; + ent.v[ "delay" ] = 1; + ent.v[ "exploder" ] = 900; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zombie_boss_water_boil_sm" ); + ent.v[ "origin" ] = ( -1396.99, 633.495, 0.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zombie_boss_water_boil_sm"; + ent.v[ "delay" ] = 2; + ent.v[ "exploder" ] = 900; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zombie_boss_water_boil_sm" ); + ent.v[ "origin" ] = ( -1404.16, 194.192, 0.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zombie_boss_water_boil_sm"; + ent.v[ "delay" ] = 1; + ent.v[ "exploder" ] = 900; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_vault_door_glow" ); + ent.v[ "origin" ] = ( -541.328, 1200.74, 323.945 ); + ent.v[ "angles" ] = ( 0, 248, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_vault_door_glow"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 770; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_vault_door_glow" ); + ent.v[ "origin" ] = ( -541.328, 1200.74, 285 ); + ent.v[ "angles" ] = ( 0, 244, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_vault_door_glow"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 770; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_vault_door_glow" ); + ent.v[ "origin" ] = ( -473.61, 1200.74, 305.315 ); + ent.v[ "angles" ] = ( 0, 312, 180 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_vault_door_glow"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 770; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_dest_fuse_box" ); + ent.v[ "origin" ] = ( -450.291, 1206.87, 292 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_dest_fuse_box"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 780; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -796.848, -1499.67, 491.652 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -880.797, -1519.24, 490.323 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( 17.1201, 685.846, 156.363 ); + ent.v[ "angles" ] = ( 9.30112, 333.288, 24.3245 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( 323.105, 3099.73, 35.125 ); + ent.v[ "angles" ] = ( 1.13799, 15.9401, 57.734 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_xsm" ); + ent.v[ "origin" ] = ( 494.28, 3997.26, 72.125 ); + ent.v[ "angles" ] = ( 0, 358, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -457.705, -1038.99, 595.128 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -488.491, -953.603, 447.961 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -513.39, -781.318, 435.002 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zombie_boss_water_boil_sm" ); + ent.v[ "origin" ] = ( -1348.61, 804.813, 0.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zombie_boss_water_boil_sm"; + ent.v[ "delay" ] = 3; + ent.v[ "exploder" ] = 900; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_offshore_fog_1" ); + ent.v[ "origin" ] = ( 5508.44, 4359.67, 11.0001 ); + ent.v[ "angles" ] = ( 270, 0, -128 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_offshore_fog_1"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_line_xsm" ); + ent.v[ "origin" ] = ( -1055.37, -847.568, 330.214 ); + ent.v[ "angles" ] = ( 327.86, 103.064, 92.0359 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_line_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_line_xsm" ); + ent.v[ "origin" ] = ( -1050.59, -848.398, 315.303 ); + ent.v[ "angles" ] = ( 350.137, 92.2149, 3.09614 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_line_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_sparks_int_runner" ); + ent.v[ "origin" ] = ( -910.108, -1306.29, 454.284 ); + ent.v[ "angles" ] = ( 79.2372, 248.416, -111.934 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_sparks_int_runner"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_line_xsm" ); + ent.v[ "origin" ] = ( 908.458, -1415.09, 91.2393 ); + ent.v[ "angles" ] = ( 270, 0, -30 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_line_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_sparks_int_runner" ); + ent.v[ "origin" ] = ( 1711.55, -2344.81, 214.122 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_sparks_int_runner"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_line_xsm" ); + ent.v[ "origin" ] = ( -439.2, 1596.14, 264.125 ); + ent.v[ "angles" ] = ( 8, 138, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_line_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_sparks_int_runner" ); + ent.v[ "origin" ] = ( -821.228, -819.404, 544.423 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_sparks_int_runner"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_sparks_int_runner" ); + ent.v[ "origin" ] = ( 616.741, -1833.76, 200.211 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_sparks_int_runner"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_sparks_int_runner" ); + ent.v[ "origin" ] = ( -1729.26, -1265.4, 419.479 ); + ent.v[ "angles" ] = ( 72, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_sparks_int_runner"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_ray_moon_lg" ); + ent.v[ "origin" ] = ( 422.718, 3370.14, -32.875 ); + ent.v[ "angles" ] = ( 302.78, 166.197, -161.747 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_ray_moon_lg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_ray_moon_md" ); + ent.v[ "origin" ] = ( 333.994, 3453.13, -50.875 ); + ent.v[ "angles" ] = ( 302.78, 166.197, -161.747 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_ray_moon_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_ray_moon_md" ); + ent.v[ "origin" ] = ( 424.41, 3316.61, -41.875 ); + ent.v[ "angles" ] = ( 304.685, 167.298, -162.662 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_ray_moon_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_sparks_int_runner" ); + ent.v[ "origin" ] = ( -920.616, -1253.7, 426.206 ); + ent.v[ "angles" ] = ( 83.3694, 145.935, 124.065 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_sparks_int_runner"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( -751.728, -1013.97, 565.508 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 933.151, -1899.82, 176.718 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 928.997, -1896.36, 176.914 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent_red" ); + ent.v[ "origin" ] = ( 1503.73, -2518.91, 192.159 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent_red"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent_red" ); + ent.v[ "origin" ] = ( 1507.62, -2514.1, 192.467 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent_red"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_line_xsm" ); + ent.v[ "origin" ] = ( -493.952, 863.439, 261.748 ); + ent.v[ "angles" ] = ( 316, 268, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_line_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -1053.88, 1344.49, 363.491 ); + ent.v[ "angles" ] = ( 88, 270, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -85.2916, 1114.13, 797 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -316.064, 1359.27, 760.316 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( -77.9148, 1604.64, 794.802 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( 213.338, 1362.4, 540.296 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_floodlight" ); + ent.v[ "origin" ] = ( 146.139, 1419.41, 991 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_floodlight"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( 458.277, 3879.87, 87.7288 ); + ent.v[ "angles" ] = ( 0, 200, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_window" ); + ent.v[ "origin" ] = ( 386.882, 3262.6, 82.868 ); + ent.v[ "angles" ] = ( 0, 92, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 257.302, 3370.47, 235.117 ); + ent.v[ "angles" ] = ( 0, 20, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 394.12, 3832.18, 240.791 ); + ent.v[ "angles" ] = ( 0, 20, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 495.948, 3501.44, 254.854 ); + ent.v[ "angles" ] = ( 0, 20, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 407.61, 3366.11, 195.721 ); + ent.v[ "angles" ] = ( 0, 112, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( -236.394, 2318.14, 393.805 ); + ent.v[ "angles" ] = ( 0, 94, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( -114.432, 2312.2, 390.566 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 465.741, 2262.76, 433.04 ); + ent.v[ "angles" ] = ( 0, 240, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 776.806, 2166.04, 380.815 ); + ent.v[ "angles" ] = ( 0, 258, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 246.479, -861.014, 253.527 ); + ent.v[ "angles" ] = ( 0, 134, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 192.777, -1726.41, 168.358 ); + ent.v[ "angles" ] = ( 0, 234, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_entrance_lrg" ); + ent.v[ "origin" ] = ( 55.0912, -1624.94, 204.257 ); + ent.v[ "angles" ] = ( 0, 232, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_entrance_lrg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snowfall_ledge" ); + ent.v[ "origin" ] = ( -754.699, -1249.01, 624.107 ); + ent.v[ "angles" ] = ( 360, 192, 6 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snowfall_ledge"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_zmb_coast_perk_dlight" ); + ent.v[ "origin" ] = ( 315.516, 3531.61, 65.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_zmb_coast_perk_dlight"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 301; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( -377.698, 1870.64, 347.707 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 254.213, 1219.14, 369.897 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( -46.3521, 1702.54, 368.933 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( -173.235, 1696.48, 369.853 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( -340.079, 1142.82, 357.925 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 744.886, -1364.24, 388.151 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 750.22, -1367.1, 388.583 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 250.324, -1728.39, 193.608 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 998.447, -2038.25, 56.1684 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 1003.01, -2032.09, 55.8279 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 1197.96, -2370.73, 224.849 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 1200.65, -2366.37, 224.642 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( -525.854, -1137.36, 441.399 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( -592.642, -804.624, 420.03 ); + ent.v[ "angles" ] = ( 84, 278, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( 1728.63, -2058.24, 210.283 ); + ent.v[ "angles" ] = ( 90, 359.237, -0.763332 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( 1513.86, -2332.14, 217.776 ); + ent.v[ "angles" ] = ( 90, 359.237, -0.763332 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent" ); + ent.v[ "origin" ] = ( 624.879, -1003.11, 200.687 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent_red" ); + ent.v[ "origin" ] = ( -1085.68, -754.909, 547.269 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent_red"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent_red" ); + ent.v[ "origin" ] = ( -1081.75, -754.61, 547.048 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent_red"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent_red" ); + ent.v[ "origin" ] = ( -2380.31, -1290.94, 411.411 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent_red"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent_red" ); + ent.v[ "origin" ] = ( -2384.24, -1291.24, 411.632 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent_red"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_tinhat_cage" ); + ent.v[ "origin" ] = ( 1319.62, 1604.46, 190.477 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_tinhat_cage"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_lantern" ); + ent.v[ "origin" ] = ( -344.917, 976.14, 415.883 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_lantern" ); + ent.v[ "origin" ] = ( -623.269, 1071.37, 381.645 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -3883.01, 1442.37, 390.508 ); + ent.v[ "angles" ] = ( 0, 332, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -1544.38, 3816.34, 977.205 ); + ent.v[ "angles" ] = ( 356, 346, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_snow_gust_vertical" ); + ent.v[ "origin" ] = ( -993.487, 4712.13, 257.673 ); + ent.v[ "angles" ] = ( 356.002, 348.005, -0.139826 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_snow_gust_vertical"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_lantern" ); + ent.v[ "origin" ] = ( 191.603, -7.13183, 101.22 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_light_lantern" ); + ent.v[ "origin" ] = ( -2513.57, 472.109, 62.4874 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_light_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_bulb_incandescent_red" ); + ent.v[ "origin" ] = ( 873.498, -1638.96, 358.386 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_bulb_incandescent_red"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_line_xsm" ); + ent.v[ "origin" ] = ( -683.751, 1978.4, 196 ); + ent.v[ "angles" ] = ( 7.12092, 87.5085, -6.16786 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_line_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_line_xsm" ); + ent.v[ "origin" ] = ( 424.462, 1758.95, 260.486 ); + ent.v[ "angles" ] = ( 0.482487, 209.899, 7.60634 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_line_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_line_xsm" ); + ent.v[ "origin" ] = ( 738.026, 1225.11, 208.35 ); + ent.v[ "angles" ] = ( 358.071, 34.1307, -7.76523 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_line_xsm"; + ent.v[ "delay" ] = -15; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/createfx/zombie_cod5_asylum_fx.csc b/BO1/PC/ZM/clientscripts/createfx/zombie_cod5_asylum_fx.csc new file mode 100644 index 0000000..a8920fa --- /dev/null +++ b/BO1/PC/ZM/clientscripts/createfx/zombie_cod5_asylum_fx.csc @@ -0,0 +1,1373 @@ + +main() +{ + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 656.996, -992.097, 18.8115 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( -897.201, -1515.67, 4.99323 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( -969.6, -2408.22, -19.021 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_impact_smolder_w" ); + ent.v[ "origin" ] = ( 369.232, 425.165, 451.303 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_impact_smolder_w"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_window_out_small" ); + ent.v[ "origin" ] = ( -113.034, 472.552, 538.219 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_window_out_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "wire_sparks_blue" ); + ent.v[ "origin" ] = ( -663.161, -1875.5, 338.839 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "wire_sparks_blue"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "dlight_fire_glow" ); + ent.v[ "origin" ] = ( 1014.55, -309.904, 85.6682 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "dlight_fire_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( -90.1707, 478.883, 491.192 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1076.85, -319.14, 82.8202 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "dlight_fire_glow" ); + ent.v[ "origin" ] = ( 15.8025, -554.792, 291.485 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "dlight_fire_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( -6.12339, -598.539, 263.96 ); + ent.v[ "angles" ] = ( 303.15, 344.319, 61.821 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 8.64568, -647.735, 243.848 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( -0.444464, -571.026, 232.184 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_window" ); + ent.v[ "origin" ] = ( 460.528, 514.49, 512.335 ); + ent.v[ "angles" ] = ( 320, 180, -176 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "dlight_fire_glow" ); + ent.v[ "origin" ] = ( 564.356, 529.283, 481.553 ); + ent.v[ "angles" ] = ( 300, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "dlight_fire_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 948.713, 895.833, 175.405 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_plume_xlg_slow_blk" ); + ent.v[ "origin" ] = ( -4616.21, 3143.62, -330.321 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_plume_xlg_slow_blk"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_plume_xlg_slow_blk" ); + ent.v[ "origin" ] = ( -5698.72, -6957.99, 312.173 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_plume_xlg_slow_blk"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 88.7637, 473.172, 492.016 ); + ent.v[ "angles" ] = ( 270, 0, -2 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 403.939, 434.473, 455.747 ); + ent.v[ "angles" ] = ( 270, 0, -2 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_window" ); + ent.v[ "origin" ] = ( -1852.65, -4140.27, 498.027 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_window" ); + ent.v[ "origin" ] = ( -315.81, -5235.29, 541.827 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_window_out_small" ); + ent.v[ "origin" ] = ( 455.323, 613.659, 536.978 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_window_out_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_window_out_small" ); + ent.v[ "origin" ] = ( 50.3262, 473.498, 500.956 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_window_out_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_heavy_leak" ); + ent.v[ "origin" ] = ( -567.249, -872.152, 270.125 ); + ent.v[ "angles" ] = ( 0, 0, -86 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_heavy_leak"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 1037.85, -339.292, 62.6751 ); + ent.v[ "angles" ] = ( 282, 270, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "ash_and_embers" ); + ent.v[ "origin" ] = ( 3101.58, 210.424, 441.143 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "ash_and_embers"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_leak_runner" ); + ent.v[ "origin" ] = ( -744.171, 282.528, 374.391 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_leak_runner"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_hallway_faint_dark" ); + ent.v[ "origin" ] = ( -740.086, 165.626, 258.827 ); + ent.v[ "angles" ] = ( 270, 359.684, 12.3156 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_hallway_faint_dark"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_room_fill" ); + ent.v[ "origin" ] = ( 60.0355, -686.614, 231.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_room_fill"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_plume_xlg_slow_blk" ); + ent.v[ "origin" ] = ( 3143.74, 371.946, 4.4681 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_plume_xlg_slow_blk"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 114.489, -2901.66, 270.428 ); + ent.v[ "angles" ] = ( 351.399, 8.39927, 45.3672 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_plume_xlg_slow_blk" ); + ent.v[ "origin" ] = ( -1944.39, -4609.95, 53.3848 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_plume_xlg_slow_blk"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( -3237.6, -1354.04, 351.787 ); + ent.v[ "angles" ] = ( 341.288, 3, -81.4453 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( 216.947, -2739.81, 67.6726 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( 1521.93, -1373.44, 60.9145 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( -59.4618, 1126.53, 249.823 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( -83.0423, 1233.98, 268.921 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( -4.35254, 1159.58, 274.169 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( -48.3367, 1225.87, 306.654 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 85.5117, 1231.4, 298.495 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 560.8, -467.325, 451.797 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 632.737, -466.967, 440.585 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 483.874, -429.251, 401.912 ); + ent.v[ "angles" ] = ( 270, 0, -2 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_window_out_small" ); + ent.v[ "origin" ] = ( 459.045, -441.723, 462.733 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_window_out_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_room_fill" ); + ent.v[ "origin" ] = ( -600.963, 687.641, 230.125 ); + ent.v[ "angles" ] = ( 270, 84.5926, -84.5926 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_room_fill"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_room_fill" ); + ent.v[ "origin" ] = ( 1204.29, 340.25, 228.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_room_fill"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_plume_xlg_slow_blk" ); + ent.v[ "origin" ] = ( -1452.59, 399.168, 427.43 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_plume_xlg_slow_blk"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "ash_and_embers" ); + ent.v[ "origin" ] = ( 225.031, 16.8626, 461.493 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "ash_and_embers"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 1280.3, 650.342, 193.807 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 1009.07, 33.414, 194.865 ); + ent.v[ "angles" ] = ( 90, 359.237, -0.763332 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 533.63, 919.907, 234.303 ); + ent.v[ "angles" ] = ( 314.102, 324.26, 28.2182 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( -689.822, 118.117, 345.702 ); + ent.v[ "angles" ] = ( 90, 346.813, -13.1869 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 452.955, 443.119, 200.798 ); + ent.v[ "angles" ] = ( 33.1595, 345.62, -7.98296 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "blood_drips" ); + ent.v[ "origin" ] = ( -814.135, 186.873, 260.528 ); + ent.v[ "angles" ] = ( 272, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "blood_drips"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "blood_drips" ); + ent.v[ "origin" ] = ( -775.709, 162.497, 262.125 ); + ent.v[ "angles" ] = ( 272, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "blood_drips"; + ent.v[ "delay" ] = -18; + ent = clientscripts\_fx::createOneshotEffect( "blood_drips" ); + ent.v[ "origin" ] = ( -780.245, 185.826, 259.125 ); + ent.v[ "angles" ] = ( 272.828, 134.982, -135.017 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "blood_drips"; + ent.v[ "delay" ] = -17; + ent = clientscripts\_fx::createOneshotEffect( "blood_drips" ); + ent.v[ "origin" ] = ( 1306.44, -155.095, 98.6068 ); + ent.v[ "angles" ] = ( 272, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "blood_drips"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_low_thick" ); + ent.v[ "origin" ] = ( -840.165, -477.607, 57.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_low_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_low_floor" ); + ent.v[ "origin" ] = ( -140.778, 187.113, 65 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_low_floor"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_low_floor" ); + ent.v[ "origin" ] = ( 527.93, -751.427, 47.1707 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_low_floor"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_low_floor" ); + ent.v[ "origin" ] = ( 321.293, 677.722, 35.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_low_floor"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_low_floor" ); + ent.v[ "origin" ] = ( 1290.62, 194.647, 46.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_low_floor"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_low_floor" ); + ent.v[ "origin" ] = ( 1184.72, -545.619, 50.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_low_floor"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "blood_drips" ); + ent.v[ "origin" ] = ( 1304.66, -146.454, 98.0726 ); + ent.v[ "angles" ] = ( 272, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "blood_drips"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_leak_runner" ); + ent.v[ "origin" ] = ( -657.689, 336.655, 356.343 ); + ent.v[ "angles" ] = ( 1.99512, 272.002, 0.139571 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_leak_runner"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_plume_xlg_slow_blk" ); + ent.v[ "origin" ] = ( -2334.3, -702.342, 28.3509 ); + ent.v[ "angles" ] = ( 310, 270, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_plume_xlg_slow_blk"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "blood_drips" ); + ent.v[ "origin" ] = ( -786.027, 186.407, 261.125 ); + ent.v[ "angles" ] = ( 272, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "blood_drips"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_window_out_small" ); + ent.v[ "origin" ] = ( 1126.4, -1624.99, 565.807 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_window_out_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 666.635, 569.569, 396.125 ); + ent.v[ "angles" ] = ( 274, 90, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_fall" ); + ent.v[ "origin" ] = ( -568.086, -875.768, 320.875 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_fall"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 1051.93, -310.498, 79.6822 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_blk_smk" ); + ent.v[ "origin" ] = ( 739.948, 522.544, 396.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_blk_smk"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 22.9505, 538.842, 345.125 ); + ent.v[ "angles" ] = ( 270, 357.797, 110.203 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 902.095, 403.503, 186.193 ); + ent.v[ "angles" ] = ( 283.991, 264.845, -56.8674 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 1465.61, 304.641, 191.125 ); + ent.v[ "angles" ] = ( 270, 359.403, -171.403 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 1166.24, -755.114, 148.125 ); + ent.v[ "angles" ] = ( 272, 88, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 751.757, -569.967, 177.125 ); + ent.v[ "angles" ] = ( 270, 354.92, -60.9202 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 1494.05, -35.812, 174.125 ); + ent.v[ "angles" ] = ( 278, 150, -104 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 241.089, 542.159, 199.125 ); + ent.v[ "angles" ] = ( 270, 3.17983, 112.82 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 326.776, 564.028, 354.125 ); + ent.v[ "angles" ] = ( 270, 0, 78 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( -573.97, -771.338, 359.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 190.564, -738.614, 359.41 ); + ent.v[ "angles" ] = ( 270, 0, 164 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( -49.4439, -843.865, 357.329 ); + ent.v[ "angles" ] = ( 270, 0, 72 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( -201.177, -458.523, 370.125 ); + ent.v[ "angles" ] = ( 278, 186, 80 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 974.064, 857.979, 194.125 ); + ent.v[ "angles" ] = ( 270, 0, 72 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_low_floor" ); + ent.v[ "origin" ] = ( -673.003, -223.196, 70.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_low_floor"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 687.328, -255.934, 205.322 ); + ent.v[ "angles" ] = ( 33.1595, 345.62, -7.98296 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fog_low_floor" ); + ent.v[ "origin" ] = ( 896.366, 726.151, 38.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_low_floor"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( -914.24, 45.6055, 347.105 ); + ent.v[ "angles" ] = ( 90, 47.578, 47.578 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_splash" ); + ent.v[ "origin" ] = ( -565.211, -875.667, 229.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_splash"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 153.436, -880.147, 358.027 ); + ent.v[ "angles" ] = ( 272, 74, 50 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 525.731, -526.802, 337.398 ); + ent.v[ "angles" ] = ( 270, 1.97493, -55.975 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 968.285, -732.924, 303.844 ); + ent.v[ "angles" ] = ( 270, 354.92, -60.9202 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( 680.767, 394.297, 374.125 ); + ent.v[ "angles" ] = ( 270, 0, 78 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_dust_motes" ); + ent.v[ "origin" ] = ( -392.533, 567.782, 343.125 ); + ent.v[ "angles" ] = ( 270, 357.797, 110.203 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_dust_motes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "insect_flies_carcass" ); + ent.v[ "origin" ] = ( 1330.55, -119.076, 125.622 ); + ent.v[ "angles" ] = ( 272.002, 1.99754, -3.9951 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "insect_flies_carcass"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "blood_drips" ); + ent.v[ "origin" ] = ( 1306.08, -149.893, 96.9145 ); + ent.v[ "angles" ] = ( 272, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "blood_drips"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "insect_flies_carcass" ); + ent.v[ "origin" ] = ( -812.545, 176.062, 294.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "insect_flies_carcass"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "insect_lantern" ); + ent.v[ "origin" ] = ( 455.101, 437.692, 198.359 ); + ent.v[ "angles" ] = ( 25.231, 346.844, -7.38433 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "insect_lantern"; + ent.v[ "delay" ] = 10; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "insect_lantern" ); + ent.v[ "origin" ] = ( 1009.9, 854.172, 187.292 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "insect_lantern"; + ent.v[ "delay" ] = 10; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "insect_lantern" ); + ent.v[ "origin" ] = ( 263.584, 834.507, 330.751 ); + ent.v[ "angles" ] = ( 90, 337.333, -20.6672 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "insect_lantern"; + ent.v[ "delay" ] = 15; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "insect_lantern" ); + ent.v[ "origin" ] = ( -690.03, 118.579, 341.615 ); + ent.v[ "angles" ] = ( 90, 337.333, -20.6672 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "insect_lantern"; + ent.v[ "delay" ] = 15; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "insect_swarm" ); + ent.v[ "origin" ] = ( -132.495, -755.599, 235.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "insect_swarm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "insect_swarm" ); + ent.v[ "origin" ] = ( 302.149, 36.4133, 99.8468 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "insect_swarm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "insect_swarm" ); + ent.v[ "origin" ] = ( 1400.49, 314.494, 90.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "insect_swarm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "insect_flies_carcass" ); + ent.v[ "origin" ] = ( 1408.41, 319.266, 91.1053 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "insect_flies_carcass"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_splash" ); + ent.v[ "origin" ] = ( -566.489, -868.08, 95.1655 ); + ent.v[ "angles" ] = ( 285.011, 107.013, -113.756 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_splash"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_tree_trunk" ); + ent.v[ "origin" ] = ( 2572.61, -22.8354, 417.194 ); + ent.v[ "angles" ] = ( 272.828, 225.018, 135.017 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_tree_trunk"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_large_mp" ); + ent.v[ "origin" ] = ( 2373.03, -258.042, 136.392 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_large_mp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( 1973.95, 415.959, 78.6889 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( 2259.12, -118.795, 60.1294 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( 2014.65, 162.862, 64 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( 2252.11, -209.262, 62.0977 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( 1816.59, 741.2, 70.9183 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( 1187.62, -1550.3, 74.6868 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column" ); + ent.v[ "origin" ] = ( 1506.76, -1395.62, 82.5683 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column" ); + ent.v[ "origin" ] = ( 1451.32, -1069.58, 195.426 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column" ); + ent.v[ "origin" ] = ( 1591.02, -1971.14, 456.675 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column" ); + ent.v[ "origin" ] = ( 1127.12, -1623.49, 457.273 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_window_out_small" ); + ent.v[ "origin" ] = ( 2055.88, 150.799, 146 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_window_out_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_column_tall" ); + ent.v[ "origin" ] = ( -35.1629, -2965.77, -85.5113 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_column_tall"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column" ); + ent.v[ "origin" ] = ( 2267.72, -118.442, 71.5821 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( 2033.91, -666.733, 60.5355 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_large_mp" ); + ent.v[ "origin" ] = ( 244.763, -2855.33, 61.9033 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_large_mp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column" ); + ent.v[ "origin" ] = ( 1713.32, -2615.82, 171.278 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( 1429.97, -1081.32, 57.2663 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1791.57, 418.651, 53.5812 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1723.55, 273.281, 65.4775 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 2040.23, 355.421, 237.203 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1913.58, -280.642, 111.731 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column_smldr" ); + ent.v[ "origin" ] = ( 2438.3, -75.8994, 81.2696 ); + ent.v[ "angles" ] = ( 358.121, 110.011, -0.684291 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column_smldr"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column_smldr" ); + ent.v[ "origin" ] = ( 2010.45, 309.543, 66.0738 ); + ent.v[ "angles" ] = ( 356.121, 110.035, -0.685488 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column_smldr"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_large_mp" ); + ent.v[ "origin" ] = ( 2281.89, 1120.58, 100.696 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_large_mp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_med_mp" ); + ent.v[ "origin" ] = ( 2068.5, -588.165, 64.9997 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_med_mp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 280.855, 843.063, 340.815 ); + ent.v[ "angles" ] = ( 27.8332, 208.788, 5.18117 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "blood_drips" ); + ent.v[ "origin" ] = ( 1328.29, -120.744, 118.452 ); + ent.v[ "angles" ] = ( 274, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "blood_drips"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "blood_drips" ); + ent.v[ "origin" ] = ( 1327.88, -119.868, 118.228 ); + ent.v[ "angles" ] = ( 274, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "blood_drips"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_window_out_small" ); + ent.v[ "origin" ] = ( 1819.17, -459.988, 352.945 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_window_out_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_large_mp" ); + ent.v[ "origin" ] = ( 1472.94, -1434.85, 64.1665 ); + ent.v[ "angles" ] = ( 282, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_large_mp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column" ); + ent.v[ "origin" ] = ( 1142.84, -2528.31, 68.0699 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column" ); + ent.v[ "origin" ] = ( 3230.94, 208.337, 190.118 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( 1613.44, -991.687, 71.2038 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 1998.77, 58.5706, 429.309 ); + ent.v[ "angles" ] = ( 293.818, 349.714, -42.8105 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 1218.15, -1087.65, 236.264 ); + ent.v[ "angles" ] = ( 351.734, 97.0723, 17.5234 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 2007.25, 362.412, 325.991 ); + ent.v[ "angles" ] = ( 8.17457, 129.942, 12.2453 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 247.152, 94.7337, -4 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 2177.89, -148.263, 51.3108 ); + ent.v[ "angles" ] = ( 272, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_low_floor" ); + ent.v[ "origin" ] = ( 773.501, 27.1957, 44.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_low_floor"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_low_floor" ); + ent.v[ "origin" ] = ( 797.404, -566.51, 217.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_low_floor"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 828.475, 371.579, 63.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 618.253, 1137.58, 133.977 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 842.103, 351.856, 100.517 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( -71.0289, -599.823, 241.606 ); + ent.v[ "angles" ] = ( 288.209, 205.13, 64.4659 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "dlight_fire_glow" ); + ent.v[ "origin" ] = ( -144.507, -553.114, 252.464 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "dlight_fire_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_long" ); + ent.v[ "origin" ] = ( -568.429, -876.429, 322.36 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_long"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 241.175, -348.249, 365.132 ); + ent.v[ "angles" ] = ( 90, 359.237, -0.763332 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "smoke_plume_xlg_slow_blk" ); + ent.v[ "origin" ] = ( -2356.24, 4109.95, 314.625 ); + ent.v[ "angles" ] = ( 310, 270, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_plume_xlg_slow_blk"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_large_mp" ); + ent.v[ "origin" ] = ( -2769.82, 4376.31, 310.515 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_large_mp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_rubble_sm_column" ); + ent.v[ "origin" ] = ( -2001.26, 3727.18, 563.571 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_rubble_sm_column"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_large_mp" ); + ent.v[ "origin" ] = ( -1420.84, 4327.38, 325.617 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_large_mp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( -1139.73, 2487.69, 230.985 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "brush_smoke_smolder_sm" ); + ent.v[ "origin" ] = ( -940.68, 3357.83, 274.075 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "brush_smoke_smolder_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( -1131.1, 2549.57, 417.661 ); + ent.v[ "angles" ] = ( 329.143, 89.5603, -16.9623 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 195.139, 604.091, 396.875 ); + ent.v[ "angles" ] = ( 274, 90, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_fall" ); + ent.v[ "origin" ] = ( 1033.26, 665.219, 190.875 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_fall"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_heavy_leak" ); + ent.v[ "origin" ] = ( 1032.83, 664.133, 135.125 ); + ent.v[ "angles" ] = ( 4, 352, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_heavy_leak"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_splash" ); + ent.v[ "origin" ] = ( 1031.04, 663.897, 65.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_splash"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_fall" ); + ent.v[ "origin" ] = ( 277.835, 527.442, 190.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_fall"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_splash" ); + ent.v[ "origin" ] = ( 277.074, 528.751, 65.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_splash"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_drip_sm_area" ); + ent.v[ "origin" ] = ( 732.391, 798.119, 219.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_drip_sm_area"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_heavy_leak" ); + ent.v[ "origin" ] = ( 278.529, 527.808, 100.125 ); + ent.v[ "angles" ] = ( 4, 352, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_heavy_leak"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_drip_sm_area" ); + ent.v[ "origin" ] = ( 408.052, 829.757, 219.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_drip_sm_area"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_leak_runner" ); + ent.v[ "origin" ] = ( 692.102, 529.453, 196.125 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_leak_runner"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_splatter" ); + ent.v[ "origin" ] = ( 285.753, 531.411, 66.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_splatter"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_splatter" ); + ent.v[ "origin" ] = ( 1030.22, 661.652, 68.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_splatter"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_fall" ); + ent.v[ "origin" ] = ( 1033.9, 663.743, 188.875 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_fall"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_splash_small" ); + ent.v[ "origin" ] = ( 1026.6, 660.952, 67.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_splash_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_splash_small" ); + ent.v[ "origin" ] = ( 281.8, 529.727, 64.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_splash_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_splash_small" ); + ent.v[ "origin" ] = ( -564.633, -872.756, 231.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_splash_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_heavy_leak" ); + ent.v[ "origin" ] = ( 752.36, 811.597, 130.792 ); + ent.v[ "angles" ] = ( 4, 352, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_heavy_leak"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_splash_small" ); + ent.v[ "origin" ] = ( 741.318, 810.26, 67.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_splash_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_splatter" ); + ent.v[ "origin" ] = ( 746.078, 806.092, 70.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_splatter"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_splash" ); + ent.v[ "origin" ] = ( 751.502, 811.916, 66.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_splash"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_spill_fall" ); + ent.v[ "origin" ] = ( 751.062, 810.76, 186.542 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_spill_fall"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 596.026, 1079.05, 223.579 ); + ent.v[ "angles" ] = ( 0, 0, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 639.165, 1044.03, 75.333 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 661.114, 1054.43, 225.834 ); + ent.v[ "angles" ] = ( 0, 0, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 694.168, 1133.22, 92.6813 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 825.047, 356.161, 83.6702 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 831.657, 358.814, 84.5592 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 881.11, 45.7118, 251.42 ); + ent.v[ "angles" ] = ( 354, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 886.351, 42.9501, 235.883 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 514.258, 79.6057, 94.9546 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 518.295, 72.3982, 97.9601 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 482.158, 54.1211, 59 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "water_drip_sm_area" ); + ent.v[ "origin" ] = ( 657.594, 567.345, 219.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "water_drip_sm_area"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( 219.453, 650.193, 405.275 ); + ent.v[ "angles" ] = ( 32.23, 114.789, 32.8511 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_ray_fire_thin" ); + ent.v[ "origin" ] = ( 211.658, 679.109, 410.716 ); + ent.v[ "angles" ] = ( 34.3132, 118.088, -167.102 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_ray_fire_thin"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( 596.335, 578.235, 379.905 ); + ent.v[ "angles" ] = ( 40, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 1333.64, -123.67, 180.401 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( 755.669, -639.87, 316.773 ); + ent.v[ "angles" ] = ( 30, 90, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( 605.275, -612.719, 311.015 ); + ent.v[ "angles" ] = ( 30, 90, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( 524.674, -628.681, 311.181 ); + ent.v[ "angles" ] = ( 30, 90, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( 376.14, -612.719, 312.133 ); + ent.v[ "angles" ] = ( 30, 90, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( 760.999, -609.94, 174.883 ); + ent.v[ "angles" ] = ( 30, 90, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( 14.4927, 473.397, 295.952 ); + ent.v[ "angles" ] = ( 28, 90, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( 215.228, 473.397, 311.62 ); + ent.v[ "angles" ] = ( 25.5762, 101.099, -85.159 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( 87.6636, 451.42, 310.977 ); + ent.v[ "angles" ] = ( 28, 90, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( 360.745, 451.87, 307.476 ); + ent.v[ "angles" ] = ( 23.0155, 107.426, -83.0035 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( -81.3543, 459.911, 330.118 ); + ent.v[ "angles" ] = ( 24, 90, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( -220.488, 460.324, 310.875 ); + ent.v[ "angles" ] = ( 23.752, 98.7459, -86.4543 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 1181.19, -714.45, 178.79 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( -573.767, -167.759, 348.835 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( -379.463, 456.007, 315.745 ); + ent.v[ "angles" ] = ( 25.3909, 103.305, -84.2097 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( -98.8298, -927.246, 305.125 ); + ent.v[ "angles" ] = ( 10.633, 107.493, -81.486 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( 3.01085, -936.568, 292.889 ); + ent.v[ "angles" ] = ( 10.633, 107.493, -81.486 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( -226.204, -921.934, 334.725 ); + ent.v[ "angles" ] = ( 10.633, 107.493, -81.486 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( -354.277, -927.276, 332.323 ); + ent.v[ "angles" ] = ( 10.633, 107.493, -81.486 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_godray_md_asylum" ); + ent.v[ "origin" ] = ( -459.847, -947.58, 334.347 ); + ent.v[ "angles" ] = ( 10.633, 107.493, -81.486 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_godray_md_asylum"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( -987.695, 336.064, 236.419 ); + ent.v[ "angles" ] = ( 318.535, 50.5755, -31.6582 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 1010.04, 854.42, 194.055 ); + ent.v[ "angles" ] = ( 90, 47.578, 47.578 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/createfx/zombie_cod5_factory_fx.csc b/BO1/PC/ZM/clientscripts/createfx/zombie_cod5_factory_fx.csc new file mode 100644 index 0000000..fa382a4 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/createfx/zombie_cod5_factory_fx.csc @@ -0,0 +1,1667 @@ + +main() +{ + ent = clientscripts\_fx::createOneshotEffect( "mp_ash_and_embers" ); + ent.v[ "origin" ] = ( -1065.55, -1814.49, 283 ); + ent.v[ "angles" ] = ( 272, 90, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ash_and_embers"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ash_and_embers" ); + ent.v[ "origin" ] = ( 407.35, -1737.09, 243.43 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ash_and_embers"; + ent.v[ "delay" ] = 0.05; + ent = clientscripts\_fx::createOneshotEffect( "mp_ash_and_embers" ); + ent.v[ "origin" ] = ( 3.07, -267.327, 192.19 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ash_and_embers"; + ent.v[ "delay" ] = 0.08; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window_smk_lf" ); + ent.v[ "origin" ] = ( -2222.33, -67.104, 559.65 ); + ent.v[ "angles" ] = ( 0, 30, 6 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window_smk_lf"; + ent.v[ "delay" ] = 0.03; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window" ); + ent.v[ "origin" ] = ( -2220.1, -66.5909, 566.31 ); + ent.v[ "angles" ] = ( 358.551, 43.9262, 5.82301 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window"; + ent.v[ "delay" ] = 1.03; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window_smk_lf" ); + ent.v[ "origin" ] = ( -2231.01, -73.479, 773.88 ); + ent.v[ "angles" ] = ( 357.894, 23.9271, -1.55009 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window_smk_lf"; + ent.v[ "delay" ] = 1.1; + ent = clientscripts\_fx::createOneshotEffect( "a_embers_falling_sm" ); + ent.v[ "origin" ] = ( 794.97, -728.087, 238.88 ); + ent.v[ "angles" ] = ( 270, 2.38594, -98.3859 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "a_embers_falling_sm"; + ent.v[ "delay" ] = 1.4; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 995.573, -925.896, 189.8 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 1.9; + ent = clientscripts\_fx::createOneshotEffect( "a_embers_falling_sm" ); + ent.v[ "origin" ] = ( 978.35, -1158.12, 511.88 ); + ent.v[ "angles" ] = ( 270, 0, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "a_embers_falling_sm"; + ent.v[ "delay" ] = 1.54; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window_smk_rt" ); + ent.v[ "origin" ] = ( -87.812, -2060.58, 462.88 ); + ent.v[ "angles" ] = ( 356.728, 32.4952, -0.179514 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window_smk_rt"; + ent.v[ "delay" ] = 0.26; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_distant_150_150" ); + ent.v[ "origin" ] = ( -155.067, -2073.87, 463.13 ); + ent.v[ "angles" ] = ( 0, 44, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_distant_150_150"; + ent.v[ "delay" ] = 0.33; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window_smk_lf" ); + ent.v[ "origin" ] = ( -2182.61, -1185.79, 764.37 ); + ent.v[ "angles" ] = ( 3.64829, 2.12002, 5.33045 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window_smk_lf"; + ent.v[ "delay" ] = 1.8; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window_smk_lf" ); + ent.v[ "origin" ] = ( -2184.66, -487.682, 767.99 ); + ent.v[ "angles" ] = ( 3.17533, 358.141, -0.90649 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window_smk_lf"; + ent.v[ "delay" ] = -2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window_smk_lf" ); + ent.v[ "origin" ] = ( -2184.66, -291.623, 365.76 ); + ent.v[ "angles" ] = ( 3.17533, 358.141, -0.90649 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window_smk_lf"; + ent.v[ "delay" ] = 2.1; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_distant_150_150" ); + ent.v[ "origin" ] = ( -2237.38, -1641.67, 766.48 ); + ent.v[ "angles" ] = ( 0, 314, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_distant_150_150"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window" ); + ent.v[ "origin" ] = ( -2225.48, -1602.39, 560.05 ); + ent.v[ "angles" ] = ( 1.94407, 320.121, -6.6696 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window"; + ent.v[ "delay" ] = -2.05; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window_smk_lf" ); + ent.v[ "origin" ] = ( -2276.48, -1656.73, 560.72 ); + ent.v[ "angles" ] = ( 359.321, 306.367, -2.82219 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window_smk_lf"; + ent.v[ "delay" ] = 0.87; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window_smk_lf" ); + ent.v[ "origin" ] = ( -2246.19, -1579.09, 362.41 ); + ent.v[ "angles" ] = ( 359.211, 308.364, 3.15222 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window_smk_lf"; + ent.v[ "delay" ] = -2.5; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window" ); + ent.v[ "origin" ] = ( -2287.88, -1630.71, 366.95 ); + ent.v[ "angles" ] = ( 4.72259, 319.296, 5.6364 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window"; + ent.v[ "delay" ] = 2.1; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_small" ); + ent.v[ "origin" ] = ( -1361.89, -1976.03, 97.83 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 634.086, 324.068, 107.9 ); + ent.v[ "angles" ] = ( 270, 3.57633, 78.4236 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_md_lowsmk" ); + ent.v[ "origin" ] = ( 1335.5, -637.52, 175.13 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_md_lowsmk"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_fire_thin" ); + ent.v[ "origin" ] = ( 849.42, -714.046, 255.38 ); + ent.v[ "angles" ] = ( 65.2603, 14.0908, 10.6324 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_fire_thin"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_fire_thin" ); + ent.v[ "origin" ] = ( 750.42, -756.721, 259.88 ); + ent.v[ "angles" ] = ( 85.0764, 219.314, -153.154 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_fire_thin"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( 785.06, -716.702, 266.38 ); + ent.v[ "angles" ] = ( 80.9385, 76.7436, -3.66978 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_fire_ribbon"; + ent.v[ "delay" ] = 1; + ent = clientscripts\_fx::createOneshotEffect( "a_embers_falling_sm" ); + ent.v[ "origin" ] = ( 1264.05, -638.862, 209.88 ); + ent.v[ "angles" ] = ( 316.089, 350.274, 8.24038 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "a_embers_falling_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_sm" ); + ent.v[ "origin" ] = ( -803.075, -1223.35, 236.6 ); + ent.v[ "angles" ] = ( 317.72, 100.568, -95.0678 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_lg" ); + ent.v[ "origin" ] = ( -829.313, -1204.36, 237.4 ); + ent.v[ "angles" ] = ( 328.207, 101.838, -95.5685 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_lg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_lg" ); + ent.v[ "origin" ] = ( -744.676, -1377.93, 210.27 ); + ent.v[ "angles" ] = ( 325.313, 99.0585, -89.8414 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_lg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_md" ); + ent.v[ "origin" ] = ( -786.848, -1030.09, 326.88 ); + ent.v[ "angles" ] = ( 330.224, 69.1517, 5.69685 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_md" ); + ent.v[ "origin" ] = ( -1033.72, -1195.45, 410.88 ); + ent.v[ "angles" ] = ( 330.224, 69.1517, 5.69685 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_lg" ); + ent.v[ "origin" ] = ( -1046.04, -1445.95, 207.07 ); + ent.v[ "angles" ] = ( 330.224, 69.1517, 5.69685 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_lg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_md" ); + ent.v[ "origin" ] = ( -1032.01, -1539.9, 155.25 ); + ent.v[ "angles" ] = ( 330.224, 69.1517, 5.69685 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_distant_150_150" ); + ent.v[ "origin" ] = ( 724.55, 173.409, 511.4 ); + ent.v[ "angles" ] = ( 0, 86, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_distant_150_150"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_distant_150_600" ); + ent.v[ "origin" ] = ( 647.45, -651.346, 695.5 ); + ent.v[ "angles" ] = ( 0, 92, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_distant_150_600"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( 1289.3, -622.154, 193.58 ); + ent.v[ "angles" ] = ( 6.64789, 179.167, -139.085 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_fire_column" ); + ent.v[ "origin" ] = ( 972.735, -2934.71, 557.35 ); + ent.v[ "angles" ] = ( 276, 248, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_fire_column"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_plume_lg" ); + ent.v[ "origin" ] = ( -3557.29, -1721.29, 1039.2 ); + ent.v[ "angles" ] = ( 270, 2.86241, -118.862 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_plume_lg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_plume_lg" ); + ent.v[ "origin" ] = ( -1040.14, 3662.48, 564.62 ); + ent.v[ "angles" ] = ( 270, 0.358094, -168.358 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_plume_lg"; + ent.v[ "delay" ] = -20; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_md" ); + ent.v[ "origin" ] = ( 1118.8, 751.2, 130.13 ); + ent.v[ "angles" ] = ( 6.02922, 264.144, -1.22172 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( 789.25, -736.417, 262.38 ); + ent.v[ "angles" ] = ( 74.8619, 337.324, 22.7442 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -11; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_hall" ); + ent.v[ "origin" ] = ( -910.714, -1137.79, 474 ); + ent.v[ "angles" ] = ( 0, 68, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_hall"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window_smk_lf" ); + ent.v[ "origin" ] = ( -2259.23, -1642.83, 762 ); + ent.v[ "angles" ] = ( 5.31373, 306.071, 9.16582 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window_smk_lf"; + ent.v[ "delay" ] = -4.45; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_lg_1sd" ); + ent.v[ "origin" ] = ( 386.924, 207.018, 84.5 ); + ent.v[ "angles" ] = ( 0.440043, 163.557, 55.1079 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_lg_1sd"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_lg_1sd" ); + ent.v[ "origin" ] = ( -1444.97, -138.662, -5 ); + ent.v[ "angles" ] = ( 347.511, 176.649, 63.1238 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_lg_1sd"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_lg_1sd" ); + ent.v[ "origin" ] = ( -968.751, -1231.81, 238.36 ); + ent.v[ "angles" ] = ( 29.1238, 4.79563, -57.5673 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_lg_1sd"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_lg_1sd" ); + ent.v[ "origin" ] = ( -802.613, -1606.96, 244.6 ); + ent.v[ "angles" ] = ( 48.5727, 35.3278, -38.7585 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_lg_1sd"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( -86.6902, -525.392, 44.05 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "a_embers_falling_sm" ); + ent.v[ "origin" ] = ( 801.86, -758.107, 234.38 ); + ent.v[ "angles" ] = ( 270, 2.38594, -100.386 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "a_embers_falling_sm"; + ent.v[ "delay" ] = 1.4; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_sm" ); + ent.v[ "origin" ] = ( -371.006, -2203.85, 181.13 ); + ent.v[ "angles" ] = ( 331.783, 102.642, -1.4592 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_link_all" ); + ent.v[ "origin" ] = ( -58.0874, 546.086, 580.894 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_link_all"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_link_single" ); + ent.v[ "origin" ] = ( -60.9811, 392.923, 608.323 ); + ent.v[ "angles" ] = ( 334, 270, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_link_single"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 103; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_link_single" ); + ent.v[ "origin" ] = ( 78.1293, 618.932, 610.173 ); + ent.v[ "angles" ] = ( 340, 30, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_link_single"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_link_single" ); + ent.v[ "origin" ] = ( -188.726, 619.169, 611.63 ); + ent.v[ "angles" ] = ( 340, 150, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_link_single"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 104; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_beam" ); + ent.v[ "origin" ] = ( 1261.84, 1275.33, 199 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_beam"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 201; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_pad_start" ); + ent.v[ "origin" ] = ( 1261.96, 1275.22, 199 ); + ent.v[ "angles" ] = ( 270, 180, 180 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_pad_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 202; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_linked" ); + ent.v[ "origin" ] = ( -57.0743, 548.227, 675.402 ); + ent.v[ "angles" ] = ( 272, 90, -90 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_linked"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_pad_start" ); + ent.v[ "origin" ] = ( 301.049, -3195, 188.777 ); + ent.v[ "angles" ] = ( 270, 84.7976, -84.7976 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_pad_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 302; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_beam" ); + ent.v[ "origin" ] = ( 301.042, -3194.96, 188.777 ); + ent.v[ "angles" ] = ( 270, 84.7976, -84.7976 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_beam"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 301; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_beam" ); + ent.v[ "origin" ] = ( -1780.58, -1115.1, 230.734 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_beam"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 401; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_pad_start" ); + ent.v[ "origin" ] = ( -1782.5, -1114.83, 229.734 ); + ent.v[ "angles" ] = ( 270, 180, 180 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_pad_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 402; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_beam" ); + ent.v[ "origin" ] = ( -59.2913, 295.86, 105 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_beam"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 106; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_beam_start" ); + ent.v[ "origin" ] = ( -56.7883, 296.402, 104 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_beam_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 105; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_flashback_american" ); + ent.v[ "origin" ] = ( 2047.92, -279.977, 115.73 ); + ent.v[ "angles" ] = ( 0, 270, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_flashback_american"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 901; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_flashback_american" ); + ent.v[ "origin" ] = ( 2367.92, -279.977, 115.73 ); + ent.v[ "angles" ] = ( 0, 270, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_flashback_american"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 902; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_flashback_american" ); + ent.v[ "origin" ] = ( 2687.92, -279.977, 115.73 ); + ent.v[ "angles" ] = ( 0, 270, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_flashback_american"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 903; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_flashback_american" ); + ent.v[ "origin" ] = ( 3007.92, -279.977, 115.73 ); + ent.v[ "angles" ] = ( 0, 270, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_flashback_american"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 904; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 1316.86, 1140.98, 410.125 ); + ent.v[ "angles" ] = ( 330, 292, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 202; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_flat" ); + ent.v[ "origin" ] = ( -57.8089, 297.147, 104 ); + ent.v[ "angles" ] = ( 270, 180, 180 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_flat"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 106; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_flat_start" ); + ent.v[ "origin" ] = ( -56.8396, 296.767, 104 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_flat_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 105; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 1210.07, 1141.36, 411.49 ); + ent.v[ "angles" ] = ( 334.017, 250.225, -0.975173 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 202; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 1135.1, 1216.45, 410.802 ); + ent.v[ "angles" ] = ( 332, 204, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 202; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 1135.33, 1323.12, 411.347 ); + ent.v[ "angles" ] = ( 332, 158, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 202; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 1392.36, 1215.54, 410.804 ); + ent.v[ "angles" ] = ( 338, 336, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 202; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 1393.56, 1321.76, 410.526 ); + ent.v[ "angles" ] = ( 336, 20, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 202; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 168.208, -3243.43, 396.253 ); + ent.v[ "angles" ] = ( 332, 204, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 302; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 168.414, -3134.5, 396.798 ); + ent.v[ "angles" ] = ( 332, 158, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 302; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 246.136, -3057.42, 396.836 ); + ent.v[ "angles" ] = ( 336, 114, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 302; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 355.679, -3056.93, 396.678 ); + ent.v[ "angles" ] = ( 334, 68, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 302; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 434.371, -3134.25, 396.977 ); + ent.v[ "angles" ] = ( 336, 20, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 302; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( 430.107, -3242.56, 397.255 ); + ent.v[ "angles" ] = ( 338, 336, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 302; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( -1725.46, -1238.68, 442.886 ); + ent.v[ "angles" ] = ( 330, 292, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 402; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( -1832.39, -1236.9, 442.251 ); + ent.v[ "angles" ] = ( 334, 248, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 402; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( -1831.05, -979.918, 442.146 ); + ent.v[ "angles" ] = ( 336, 114, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 402; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( -1724.55, -981.168, 441.988 ); + ent.v[ "angles" ] = ( 334, 68, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 402; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( -1649.21, -1055.98, 442.287 ); + ent.v[ "angles" ] = ( 336, 20, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 402; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_start" ); + ent.v[ "origin" ] = ( -1650.8, -1161.65, 441.565 ); + ent.v[ "angles" ] = ( 338, 336, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 402; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_plume_lg" ); + ent.v[ "origin" ] = ( 97.2262, -3367.22, 612.125 ); + ent.v[ "angles" ] = ( 270, 3.75173, -41.7517 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_plume_lg"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 992.028, -924.723, 184.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 1022.29, -926.72, 206.663 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 999.704, -920.12, 197.42 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_md" ); + ent.v[ "origin" ] = ( -1654.65, -1085.69, 277.125 ); + ent.v[ "angles" ] = ( 330.224, 69.1517, 5.69685 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_md" ); + ent.v[ "origin" ] = ( -1573.42, -1310.9, 335.125 ); + ent.v[ "angles" ] = ( 330.224, 69.1517, 5.69685 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_md" ); + ent.v[ "origin" ] = ( -1361.89, -1114.36, 259.644 ); + ent.v[ "angles" ] = ( 330.224, 69.1517, 5.69685 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_distant_150_150" ); + ent.v[ "origin" ] = ( 816.622, -692.001, 275.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_distant_150_150"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_distant_150_150" ); + ent.v[ "origin" ] = ( 794.075, -769.991, 275.125 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_distant_150_150"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "zombie_difference" ); + ent.v[ "origin" ] = ( 1499.96, 1141.3, 268.41 ); + ent.v[ "angles" ] = ( 0, 244, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_difference"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_difference" ); + ent.v[ "origin" ] = ( 1042.73, 1146.5, 272.971 ); + ent.v[ "angles" ] = ( 0, 288, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_difference"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_difference" ); + ent.v[ "origin" ] = ( 500.757, -3128.68, 258.287 ); + ent.v[ "angles" ] = ( 0, 92, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_difference"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 103; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_difference" ); + ent.v[ "origin" ] = ( 80.5138, -3126.37, 258.767 ); + ent.v[ "angles" ] = ( 0, 88, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_difference"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 103; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_difference" ); + ent.v[ "origin" ] = ( -1655.34, -1323.81, 303.465 ); + ent.v[ "angles" ] = ( 0, 38, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_difference"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 104; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_difference" ); + ent.v[ "origin" ] = ( -1646.82, -901.83, 300.38 ); + ent.v[ "angles" ] = ( 0, 322, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_difference"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 104; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_steam" ); + ent.v[ "origin" ] = ( 0.308329, 523.282, 314.562 ); + ent.v[ "angles" ] = ( 282.64, 341.411, 6.16853 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_steam"; + ent.v[ "delay" ] = 1.5; + ent.v[ "exploder" ] = 106; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( 21.1592, 540.42, 162.688 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 2.5; + ent.v[ "exploder" ] = 106; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( -139.955, 547.623, 162.567 ); + ent.v[ "angles" ] = ( 0, 182, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 2.5; + ent.v[ "exploder" ] = 106; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( 1339.91, 1270.03, 237.368 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 2.5; + ent.v[ "exploder" ] = 201; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( 1185.24, 1273.5, 237.48 ); + ent.v[ "angles" ] = ( 359.999, 174.015, -2.0145 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 2.5; + ent.v[ "exploder" ] = 201; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( 380.683, -3209.81, 225.959 ); + ent.v[ "angles" ] = ( 359.583, 6.00742, 1.97082 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 2.5; + ent.v[ "exploder" ] = 301; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( 219.515, -3216.04, 228.043 ); + ent.v[ "angles" ] = ( 0.621098, 192.004, -1.9164 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 2.5; + ent.v[ "exploder" ] = 301; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( -1780.11, -1025.11, 275.545 ); + ent.v[ "angles" ] = ( 358.029, 96.0215, -0.417649 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 2.5; + ent.v[ "exploder" ] = 401; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( -1786.26, -1201.6, 274.702 ); + ent.v[ "angles" ] = ( 2.01335, 266.015, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 2.5; + ent.v[ "exploder" ] = 401; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_stack" ); + ent.v[ "origin" ] = ( -1632.29, 435.684, 1585 ); + ent.v[ "angles" ] = ( 0, 66, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_stack"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_stack" ); + ent.v[ "origin" ] = ( -2463.47, -375.837, 1714.52 ); + ent.v[ "angles" ] = ( 0, 168, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_stack"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_stack" ); + ent.v[ "origin" ] = ( -2459.71, -982.756, 1718.38 ); + ent.v[ "angles" ] = ( 0, 66, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_stack"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_stack" ); + ent.v[ "origin" ] = ( -2462.31, -1259.03, 1715.1 ); + ent.v[ "angles" ] = ( 0, 114, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_stack"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_stack" ); + ent.v[ "origin" ] = ( 1919.5, -2485.32, 1589.69 ); + ent.v[ "angles" ] = ( 0, 256, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_stack"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_smoke_stack" ); + ent.v[ "origin" ] = ( 1453.95, -1600.57, 1603.43 ); + ent.v[ "angles" ] = ( 0, 226, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_smoke_stack"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_steam" ); + ent.v[ "origin" ] = ( 458.257, -1183.51, 221.009 ); + ent.v[ "angles" ] = ( 360, 130, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_steam"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 500; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_steam" ); + ent.v[ "origin" ] = ( 152.499, -1184.86, 183.69 ); + ent.v[ "angles" ] = ( 356, 46, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_steam"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 500; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_steam" ); + ent.v[ "origin" ] = ( 152.272, -1322.3, 183.965 ); + ent.v[ "angles" ] = ( 348, 316, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_steam"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 500; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_steam" ); + ent.v[ "origin" ] = ( 458.461, -1319.7, 222.285 ); + ent.v[ "angles" ] = ( 0, 224, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_steam"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 500; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createLoopEffect( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( -1381.39, -1281.25, 181.989 ); + ent.v[ "angles" ] = ( 0, 0, 180 ); + ent.v[ "type" ] = "loopfx"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 10.4; + ent = clientscripts\_fx::createLoopEffect( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( -1384.76, -955.486, 177.583 ); + ent.v[ "angles" ] = ( 360, 4, -180 ); + ent.v[ "type" ] = "loopfx"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 10.4; + ent = clientscripts\_fx::createLoopEffect( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( 1263.32, 636.002, 145.276 ); + ent.v[ "angles" ] = ( 360, 270, 180 ); + ent.v[ "type" ] = "loopfx"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 10.4; + ent = clientscripts\_fx::createLoopEffect( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( 1261.68, 749.085, 148.093 ); + ent.v[ "angles" ] = ( 360, 90, -180 ); + ent.v[ "type" ] = "loopfx"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 10.4; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_steam" ); + ent.v[ "origin" ] = ( -54.7512, 481.627, 310.079 ); + ent.v[ "angles" ] = ( 282, 270, 90 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_steam"; + ent.v[ "delay" ] = 1.5; + ent.v[ "exploder" ] = 106; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_steam" ); + ent.v[ "origin" ] = ( -112.923, 522.773, 317.338 ); + ent.v[ "angles" ] = ( 279.995, 207.512, 158.442 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_steam"; + ent.v[ "delay" ] = 1.5; + ent.v[ "exploder" ] = 106; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_steam" ); + ent.v[ "origin" ] = ( -89.1748, 588.628, 315.139 ); + ent.v[ "angles" ] = ( 275.192, 124.271, -89.7115 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_steam"; + ent.v[ "delay" ] = 1.5; + ent.v[ "exploder" ] = 106; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_mainframe_steam" ); + ent.v[ "origin" ] = ( -20.997, 590.789, 313.061 ); + ent.v[ "angles" ] = ( 278.067, 28.8485, 5.7661 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_mainframe_steam"; + ent.v[ "delay" ] = 1.5; + ent.v[ "exploder" ] = 106; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( -806.607, 200.096, 9.0655 ); + ent.v[ "angles" ] = ( 270, 358.755, 63.245 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( 117.052, 793.766, -5.10309 ); + ent.v[ "angles" ] = ( 270, 356.248, 31.7517 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( -291.298, 723.86, -0.86267 ); + ent.v[ "angles" ] = ( 270, 359.035, 14.9648 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( 712.722, 817.539, 54 ); + ent.v[ "angles" ] = ( 270, 0, 150 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( 589.962, -1243.79, 388.234 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( 18.5443, -1039.41, 234.531 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( -294.031, -989.836, 294.84 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( -789.576, -1344.32, 221.788 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( 416.576, -912.749, 232.962 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "transporter_ambient" ); + ent.v[ "origin" ] = ( 1257.84, 1275.66, 416.591 ); + ent.v[ "angles" ] = ( 270, 359.484, 0.516024 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_ambient"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 102; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_ambient" ); + ent.v[ "origin" ] = ( 305.166, -3190.55, 405.3 ); + ent.v[ "angles" ] = ( 270, 359.484, 0.516024 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_ambient"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 103; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "transporter_ambient" ); + ent.v[ "origin" ] = ( -1782.32, -1111.53, 447.898 ); + ent.v[ "angles" ] = ( 270, 359.484, 0.516024 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "transporter_ambient"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 104; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "zombie_elec_gen_idle" ); + ent.v[ "origin" ] = ( 545.598, -1610.42, 173.742 ); + ent.v[ "angles" ] = ( 0, 270, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_elec_gen_idle"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_elec_gen_idle" ); + ent.v[ "origin" ] = ( 590.044, -1612.84, 174.544 ); + ent.v[ "angles" ] = ( 0, 270, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_elec_gen_idle"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_elec_gen_idle" ); + ent.v[ "origin" ] = ( 584.654, -1663.88, 173.683 ); + ent.v[ "angles" ] = ( 0, 270, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_elec_gen_idle"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_elec_gen_idle" ); + ent.v[ "origin" ] = ( 540.231, -1662.46, 173.881 ); + ent.v[ "angles" ] = ( 0, 270, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_elec_gen_idle"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "zombie_elec_gen_idle" ); + ent.v[ "origin" ] = ( -530.013, 284.509, 124.551 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_elec_gen_idle"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_elec_gen_idle" ); + ent.v[ "origin" ] = ( -529.023, 340.4, 125.583 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_elec_gen_idle"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_elec_gen_idle" ); + ent.v[ "origin" ] = ( -484.93, 283.404, 125.273 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_elec_gen_idle"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "zombie_elec_gen_idle" ); + ent.v[ "origin" ] = ( -484.489, 335.333, 126.305 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "zombie_elec_gen_idle"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( -571.391, -1249, 117.127 ); + ent.v[ "angles" ] = ( 8.27711, 354.369, -34.4078 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createLoopEffect( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( -1276.89, -913.517, 89.6153 ); + ent.v[ "angles" ] = ( 0, 18, -180 ); + ent.v[ "type" ] = "loopfx"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 10.4; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( -1672.74, -1896.62, 102.506 ); + ent.v[ "angles" ] = ( 270, 358.755, 63.245 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( -1672.81, -1876.96, 104.858 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( -1969.07, -1867.32, 73.325 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( 377.491, -984.308, 221.944 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( 809.985, -1293.12, 163.482 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_furnace" ); + ent.v[ "origin" ] = ( -612.389, -1259.48, 62.8707 ); + ent.v[ "angles" ] = ( 270, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_furnace"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_furnace" ); + ent.v[ "origin" ] = ( -629.483, -1252.87, 54 ); + ent.v[ "angles" ] = ( 270, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_furnace"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 378.572, -1949.28, 204.071 ); + ent.v[ "angles" ] = ( 30.1721, 214.469, -163.528 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -297.301, -982.825, 296.666 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( -813.352, 200.78, 20.9607 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( 1025.05, -1376.3, 184.836 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 285.523, -992.761, 422.681 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -664.058, -1517.01, 342.882 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -1503.49, -1517.29, 346.273 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( -1192.84, -918.132, 74.125 ); + ent.v[ "angles" ] = ( 270, 358.755, 63.245 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( 179.189, -1459.02, 116.684 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( -313.49, -2449, 21.4299 ); + ent.v[ "angles" ] = ( 303.047, 177.827, -172.489 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( -682.204, -390.105, 94.7197 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( 445.861, 505.635, 103.9 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( 437.524, -557.117, 114 ); + ent.v[ "angles" ] = ( 330.899, 1.58167, 57.9371 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( 898.228, 1283.58, 217.902 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "zombie_moon_eclipse" ); + ent.v[ "origin" ] = ( -5352.81, 19553.4, 20641 ); + ent.v[ "angles" ] = ( 25.037, 286.651, 22.1557 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_moon_eclipse"; + ent.v[ "delay" ] = -90000; + ent = clientscripts\_fx::createOneshotEffect( "zombie_clock_hand" ); + ent.v[ "origin" ] = ( 64.8159, -871.89, 327.397 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "zombie_clock_hand"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 877.288, -928.169, 200.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 876.789, -931.65, 203.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 857.174, -929.23, 206.069 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( -440.125, -1002.32, 111.998 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( 625.663, -1944.14, 116.088 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( -771.336, 64.8269, 52.1961 ); + ent.v[ "angles" ] = ( 294, 86, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( -776.596, 68.4981, 63.3494 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( -160.064, -780.971, -139.875 ); + ent.v[ "angles" ] = ( 270, 0, 112 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( -158.616, -777.068, -135.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( -806.665, -19.6791, 118.583 ); + ent.v[ "angles" ] = ( 358, 268, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( -812.469, -24.125, 150.416 ); + ent.v[ "angles" ] = ( 342, 268, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( 407.337, -295.733, 115.252 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( 659.333, -33.8779, 107.222 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( 665.871, -39.9994, 108.513 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 424.695, -574.798, 122.813 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 510.044, -729.111, 140.963 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 509.592, -724.711, 112.553 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( 493.161, -733.944, 144.404 ); + ent.v[ "angles" ] = ( 270, 352.875, -102.875 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 513.14, -722.104, 133.968 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 121.888, -1167.6, 159.52 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 121.401, -1163.78, 153.487 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 124.257, -1158.85, 143.952 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( -434.958, -1011.61, 113.21 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( -164.658, -2277.83, 105.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( -102.873, -2278.98, 142.125 ); + ent.v[ "angles" ] = ( 297.47, 286.455, -53.6609 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( -162.884, -2288.83, 98.9123 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( -167.242, -2272.03, 95.8626 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( -164.284, -2246.37, 98.2495 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( -164.151, -2287.87, 120.548 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( -85.5237, -500.594, 42.9266 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( -417.575, -27.5568, 144.137 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( 394.56, 280.351, 171.894 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_md" ); + ent.v[ "origin" ] = ( 465.537, -2695.26, 197.064 ); + ent.v[ "angles" ] = ( 336.711, 102.95, -96.183 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_ray_light_md" ); + ent.v[ "origin" ] = ( 327.069, -2694.76, 188.658 ); + ent.v[ "angles" ] = ( 336.711, 102.95, -96.183 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_ray_light_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( -108.589, -2225.06, 142.883 ); + ent.v[ "angles" ] = ( 278, 122, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( 1165.55, -376.973, 109.416 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( -353.328, -589.686, 179.189 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -350.884, -586.497, 184.015 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -427.428, -398.73, 402.644 ); + ent.v[ "angles" ] = ( 90, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -414.26, -1.90615, 159.233 ); + ent.v[ "angles" ] = ( 29.2538, 256.219, -96.9773 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 381.144, 238.077, 166.705 ); + ent.v[ "angles" ] = ( 40, 120, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -47.0881, -1503.24, 313.919 ); + ent.v[ "angles" ] = ( 8.95247, 155.111, -175.3 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 1634.8, 802.66, 277.623 ); + ent.v[ "angles" ] = ( 13.9218, 6.18228, 1.4929 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window" ); + ent.v[ "origin" ] = ( 603.932, -853.245, 380.022 ); + ent.v[ "angles" ] = ( 0, 176, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window"; + ent.v[ "delay" ] = 2.1; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window" ); + ent.v[ "origin" ] = ( 636.495, -793.204, 401.021 ); + ent.v[ "angles" ] = ( 0, 176, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_window" ); + ent.v[ "origin" ] = ( 634.208, -717.994, 393.735 ); + ent.v[ "angles" ] = ( 0, 176, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_window"; + ent.v[ "delay" ] = 1; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -1002.06, -1429.97, 346.427 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -1009.32, -396.515, 299.383 ); + ent.v[ "angles" ] = ( 88, 270, -90 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( -521.572, -382.19, 110.959 ); + ent.v[ "angles" ] = ( 270, 3.57633, 78.4236 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 951.048, 1008.51, 471.875 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -1155.44, -1078.51, 370.444 ); + ent.v[ "angles" ] = ( 90, 47.578, 47.578 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 569.677, -2617.9, 442.261 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 11.1349, -2617.95, 441.815 ); + ent.v[ "angles" ] = ( 90, 341.078, -18.9216 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 647.858, -2239.82, 413.975 ); + ent.v[ "angles" ] = ( 17.9318, 6.2729, 1.30888 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 539.23, -1571.83, 177.543 ); + ent.v[ "angles" ] = ( 13.944, 89.8322, -1.07163 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( 1125.41, -740.013, 150.622 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 1132.99, -735.099, 115.7 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 1126.61, -736.998, 85.9637 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_fire_torch_noglow" ); + ent.v[ "origin" ] = ( 1141.75, -741.196, 90.7162 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_fire_torch_noglow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( -1342.19, -1054.1, 154.608 ); + ent.v[ "angles" ] = ( 284.426, 345.006, -74.9648 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( -1369.09, -1371.8, 139.948 ); + ent.v[ "angles" ] = ( 272, 272, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createLoopEffect( "zombie_heat_sink" ); + ent.v[ "origin" ] = ( -1343.55, -1290.49, 171 ); + ent.v[ "angles" ] = ( 0, 0, 180 ); + ent.v[ "type" ] = "loopfx"; + ent.v[ "fxid" ] = "zombie_heat_sink"; + ent.v[ "delay" ] = 10.4; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon_med" ); + ent.v[ "origin" ] = ( -1356.24, -1203.62, 81.1535 ); + ent.v[ "angles" ] = ( 274, 82, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon_med" ); + ent.v[ "origin" ] = ( -1363.14, -880.212, 55.7988 ); + ent.v[ "angles" ] = ( 274, 82, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon_med"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_rubble_detail_grp" ); + ent.v[ "origin" ] = ( -1146.55, -401.147, 207.125 ); + ent.v[ "angles" ] = ( 270, 358.755, 63.245 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_rubble_detail_grp"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( 574.027, -809.608, 433.258 ); + ent.v[ "angles" ] = ( 27.3653, 209.005, -58.1418 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_mp_ray_fire_ribbon" ); + ent.v[ "origin" ] = ( 565.826, -726.818, 436.875 ); + ent.v[ "angles" ] = ( 347.032, 214.713, -36.243 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_mp_ray_fire_ribbon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( -1011.36, -402.027, 285.544 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_insects_lantern" ); + ent.v[ "origin" ] = ( 1223.56, 563.88, 335.875 ); + ent.v[ "angles" ] = ( 88, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_insects_lantern"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 403.063, -287.884, 114.197 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 1165.6, -384.777, 107.055 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createOneshotEffect( "mp_fire_static_small_detail" ); + ent.v[ "origin" ] = ( 1022.65, -1380.44, 181.072 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_fire_static_small_detail"; + ent.v[ "delay" ] = 2.2; + ent = clientscripts\_fx::createExploder( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( -1203.9, -680.057, 312.875 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 600; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 1165.25, 146.528, 225.875 ); + ent.v[ "angles" ] = ( 90, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "mp_light_lamp_no_eo" ); + ent.v[ "origin" ] = ( 1220.03, 563.584, 355.003 ); + ent.v[ "angles" ] = ( 90, 180, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "mp_light_lamp_no_eo"; + ent.v[ "delay" ] = -15; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/createfx/zombie_cod5_prototype_fx.csc b/BO1/PC/ZM/clientscripts/createfx/zombie_cod5_prototype_fx.csc new file mode 100644 index 0000000..3133de0 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/createfx/zombie_cod5_prototype_fx.csc @@ -0,0 +1,677 @@ + +main() +{ + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( -673.074, -766.968, -26.5289 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( -571.381, -1636.91, 80.8831 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 440.201, -1321.61, 26.6093 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 755.909, 220.307, 7.31731 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 1063.98, -871.593, 5.95168 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 1396.97, 688.073, 5.34588 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 317.986, 1688.19, 149.969 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( -649.748, 101.867, -29.5503 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( -764.255, 1136.32, 22.8691 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( -727.275, 546.164, -19.4539 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "battlefield_smokebank_sm_tan" ); + ent.v[ "origin" ] = ( 1084.51, -131.344, 34.4557 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "battlefield_smokebank_sm_tan"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 2609.53, 748.956, 236.421 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 1695.81, 1489.26, 195.006 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1132.59, 876.375, -1.77614 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1178.44, 925.081, -1.14948 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1105.55, 830.055, -1.03921 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "battlefield_smokebank_sm_tan" ); + ent.v[ "origin" ] = ( -767.711, 266.941, 13.8245 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "battlefield_smokebank_sm_tan"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "battlefield_smokebank_sm_tan" ); + ent.v[ "origin" ] = ( 1390.83, 1892.45, 150.931 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "battlefield_smokebank_sm_tan"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( 616.654, -474.242, -7.7898 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "wire_sparks" ); + ent.v[ "origin" ] = ( 1213.24, 272.034, 228.049 ); + ent.v[ "angles" ] = ( 358, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "wire_sparks"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "wire_sparks_blue" ); + ent.v[ "origin" ] = ( 1693.84, 833.98, 293.807 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "wire_sparks_blue"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "wire_sparks" ); + ent.v[ "origin" ] = ( 1240.67, 626.144, 167.241 ); + ent.v[ "angles" ] = ( 358, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "wire_sparks"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -223.015, 382.993, 80.125 ); + ent.v[ "angles" ] = ( 328.986, 200.478, 173.603 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = 1; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -214.088, 478.767, 85.017 ); + ent.v[ "angles" ] = ( 328.986, 200.478, 173.603 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = 1; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -218.12, -194.662, 79.9335 ); + ent.v[ "angles" ] = ( 328.986, 200.478, 173.603 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = 1; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -75.2952, 397.105, 306.125 ); + ent.v[ "angles" ] = ( 332.494, 179.712, -176.791 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -112.262, 109.56, 305.125 ); + ent.v[ "angles" ] = ( 334.743, 175.524, -173.608 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -91.8475, -57.8259, 297.125 ); + ent.v[ "angles" ] = ( 332.494, 179.712, -176.791 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( 63.7406, 511.513, 305.125 ); + ent.v[ "angles" ] = ( 320.515, 178.848, -176.312 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( 136.001, 937.865, 302.125 ); + ent.v[ "angles" ] = ( 332.39, 190.995, 177.976 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 1238.68, 925.793, -0.367569 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 196.436, -100.571, 72.2384 ); + ent.v[ "angles" ] = ( 274, 270, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 123.133, -957.101, 45.687 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 113.333, -946.185, 45.9968 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 114.712, -963.247, 44.0852 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( -541.668, 411.021, 27.8858 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( -553.995, 392.761, 26.0101 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 195.468, -103.679, 77.6072 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( -552.565, 404.588, 21.5665 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 109.682, -957.513, 45.1729 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 1185.91, 939.156, 25.8573 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_xsm" ); + ent.v[ "origin" ] = ( 1227.52, 926.134, 6.50701 ); + ent.v[ "angles" ] = ( 270, 359.484, 0.516024 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1270.73, 935.509, 54.712 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1215.44, 846.265, -5.43003 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1253.25, 845.307, -6.45285 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 1171.86, 934.887, 0.800284 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( -247.291, -118.17, 2.46084 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( -242.899, -137.244, 2.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 188.991, -91.1148, 69.1965 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 731.812, 997.333, 172.404 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_room_fill" ); + ent.v[ "origin" ] = ( 624.812, 851.8, 192.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_room_fill"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 759.595, 995.422, 163.336 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_room_fill" ); + ent.v[ "origin" ] = ( 39.2104, 308.372, 183.312 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_room_fill"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_room_fill" ); + ent.v[ "origin" ] = ( -12.6183, 61.0479, 13 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_room_fill"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 331.642, 1368.99, 150 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_window" ); + ent.v[ "origin" ] = ( 396.393, 1426.42, 159 ); + ent.v[ "angles" ] = ( 350.098, 188.122, -1.40582 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_window"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_sm" ); + ent.v[ "origin" ] = ( 451.185, 1350.84, 148.857 ); + ent.v[ "angles" ] = ( 276, 360, -30 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_impact_smolder_w" ); + ent.v[ "origin" ] = ( 263.046, 1483.61, 149 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_impact_smolder_w"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "ash_and_embers_hall" ); + ent.v[ "origin" ] = ( 406.49, 1427.08, 303.732 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "ash_and_embers_hall"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 765.818, 1200.04, 157.092 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 779.809, 1467.59, 249.11 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 750.794, 1361.53, 191.019 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_column_creep_sm" ); + ent.v[ "origin" ] = ( 789.211, 1263.44, 164.607 ); + ent.v[ "angles" ] = ( 276, 0, -30 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_column_creep_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "dlight_fire_glow" ); + ent.v[ "origin" ] = ( 794.627, 1242.43, 229.58 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "dlight_fire_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_static_small" ); + ent.v[ "origin" ] = ( 778.149, 991.334, 158.245 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_static_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "wire_sparks_blue" ); + ent.v[ "origin" ] = ( -711.989, -659.275, 166.679 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "wire_sparks_blue"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( -698.403, -50.8306, 169.117 ); + ent.v[ "angles" ] = ( 84, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_window_out_small" ); + ent.v[ "origin" ] = ( 787.976, 1284.28, 195.561 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_window_out_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_window_out_small" ); + ent.v[ "origin" ] = ( 396.751, 1498.32, 175.461 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_window_out_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_window_out_small" ); + ent.v[ "origin" ] = ( 1209.56, 938.742, 34.7518 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_window_out_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 39.4743, 738.771, 245.475 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 415.027, 738.228, 240.27 ); + ent.v[ "angles" ] = ( 90, 325.915, -34.086 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( -1.25879, 1056.03, 244.722 ); + ent.v[ "angles" ] = ( 90, 231.116, -148.884 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 284.943, 179.486, 241.701 ); + ent.v[ "angles" ] = ( 36.2014, 146.157, 172.598 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 340.258, 921.943, 104.219 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 176.59, 716.579, 98.898 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( -140.158, 679.738, 99.312 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 770.58, 868.499, 10.8021 ); + ent.v[ "angles" ] = ( 318, 132, -8 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( -105.469, 847.873, 155.457 ); + ent.v[ "angles" ] = ( 317.139, 130.431, -141.616 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -212.425, 230.206, 236 ); + ent.v[ "angles" ] = ( 334.459, 184.343, -177.968 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -215.96, 697.257, 316.283 ); + ent.v[ "angles" ] = ( 296.696, 194.71, 179.73 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -115.003, 16.9401, 309.795 ); + ent.v[ "angles" ] = ( 327.896, 175.836, -177.016 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( -270.61, -98.519, -5.09015 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( -291.366, -221.531, -8.65272 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( -364.303, -71.5915, -9.93956 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 121.346, -979.991, 5.94707 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 208.852, -35.6098, 94.9997 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "fire_detail" ); + ent.v[ "origin" ] = ( 166.312, -109.213, 63.4913 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fire_detail"; + ent.v[ "delay" ] = 0.5; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small_short" ); + ent.v[ "origin" ] = ( -226.854, 428.31, 237.955 ); + ent.v[ "angles" ] = ( 332, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small_short"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "wire_sparks" ); + ent.v[ "origin" ] = ( -649.279, -676.415, 162.774 ); + ent.v[ "angles" ] = ( 358, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "wire_sparks"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "wire_sparks" ); + ent.v[ "origin" ] = ( 185.052, -541.766, 14.6714 ); + ent.v[ "angles" ] = ( 358, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "wire_sparks"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -201.126, -619.109, 316.453 ); + ent.v[ "angles" ] = ( 332.322, 186.48, -179.929 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -204.341, -785.792, 324.193 ); + ent.v[ "angles" ] = ( 332.494, 179.712, -176.791 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( 33.0982, 933.13, 302.875 ); + ent.v[ "angles" ] = ( 304.322, 186.421, -179.888 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small_short" ); + ent.v[ "origin" ] = ( -64.7752, 403.158, 285.819 ); + ent.v[ "angles" ] = ( 328, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small_short"; + ent.v[ "delay" ] = 0.1; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small_short" ); + ent.v[ "origin" ] = ( -209.538, 388.18, 40.6552 ); + ent.v[ "angles" ] = ( 342.283, 190.503, 176.771 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small_short"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small_short" ); + ent.v[ "origin" ] = ( -65.1621, 322.689, 279.139 ); + ent.v[ "angles" ] = ( 328, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small_short"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( -813.243, 188.308, 85.114 ); + ent.v[ "angles" ] = ( 346.13, 178.007, -178.697 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_room_fill" ); + ent.v[ "origin" ] = ( 567.681, 767.122, 5.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_room_fill"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( 55.1426, -331.655, 149.747 ); + ent.v[ "angles" ] = ( 322.322, 186.464, -179.921 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "god_rays_small" ); + ent.v[ "origin" ] = ( 82.4609, -207.678, 157.05 ); + ent.v[ "angles" ] = ( 318.322, 186.457, -179.915 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "god_rays_small"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fog_thick" ); + ent.v[ "origin" ] = ( -782.453, -42.4873, -1.64706 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fog_thick"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "smoke_room_fill" ); + ent.v[ "origin" ] = ( -735.247, 26.4439, 18.4918 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "smoke_room_fill"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_prototype" ); + ent.v[ "origin" ] = ( -64347.8, 7452.44, 4675.17 ); + ent.v[ "angles" ] = ( 0, 0, -178 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_prototype"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zombie_lamp_glow_amber" ); + ent.v[ "origin" ] = ( -193.061, -74.501, 189.565 ); + ent.v[ "angles" ] = ( 280, 360, 2 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zombie_lamp_glow_amber"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zombie_lamp_glow_amber" ); + ent.v[ "origin" ] = ( -200.287, -670.795, 9.787 ); + ent.v[ "angles" ] = ( 300.295, 194.555, 179.19 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zombie_lamp_glow_amber"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zombie_lamp_glow_amber" ); + ent.v[ "origin" ] = ( 220.791, 417.625, 16.1917 ); + ent.v[ "angles" ] = ( 280, 0, 14 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zombie_lamp_glow_amber"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zombie_lamp_glow_amber" ); + ent.v[ "origin" ] = ( 1002.02, 651.422, 40.3735 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zombie_lamp_glow_amber"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zombie_lamp_glow_amber" ); + ent.v[ "origin" ] = ( -190.951, 949.658, 35.6854 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zombie_lamp_glow_amber"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zombie_lamp_glow_amber" ); + ent.v[ "origin" ] = ( -100.703, 159.574, 67.0611 ); + ent.v[ "angles" ] = ( 276, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zombie_lamp_glow_amber"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 681.676, 469.066, 138.047 ); + ent.v[ "angles" ] = ( 16.3433, 128.747, 172.22 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "light_ceiling_dspot" ); + ent.v[ "origin" ] = ( 313.619, 544.581, 237.275 ); + ent.v[ "angles" ] = ( 44.4603, 125.778, 124.278 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "light_ceiling_dspot"; + ent.v[ "delay" ] = -15; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/createfx/zombie_moon_fx.csc b/BO1/PC/ZM/clientscripts/createfx/zombie_moon_fx.csc new file mode 100644 index 0000000..1f810d4 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/createfx/zombie_moon_fx.csc @@ -0,0 +1,1501 @@ + +main() +{ + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( -1552.59, 956.012, -159.045 ); + ent.v[ "angles" ] = ( 272, 210, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( -486.53, 1073.98, -200.875 ); + ent.v[ "angles" ] = ( 270, 360, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( -1671.57, 1791.33, -331.86 ); + ent.v[ "angles" ] = ( 272, 270, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( -638.273, 1587.6, -424.875 ); + ent.v[ "angles" ] = ( 270, 0.516025, -0.516014 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( -1681.77, 2423.77, -372.808 ); + ent.v[ "angles" ] = ( 270, 13.2506, -13.2506 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( 160.157, 1857.76, -634.612 ); + ent.v[ "angles" ] = ( 270, 4.578, 81.422 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( 1613.37, 2832.53, -339.471 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( 1358.14, 2015.33, -274.875 ); + ent.v[ "angles" ] = ( 270, 359.484, 0.516024 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( 1773.52, 1302.51, -175.875 ); + ent.v[ "angles" ] = ( 270, 0.561108, -6.56111 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( 733.279, 942.762, -172.875 ); + ent.v[ "angles" ] = ( 270, 325.694, -57.6945 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( -1830.63, 2174.6, -369.56 ); + ent.v[ "angles" ] = ( 0, 356, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_moon_teleporter_pad_start" ); + ent.v[ "origin" ] = ( 14061.2, -15355.6, -617.281 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_teleporter_pad_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 121; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_teleporter_start" ); + ent.v[ "origin" ] = ( 14060.2, -15322.5, -417.916 ); + ent.v[ "angles" ] = ( 19.9873, 91.8718, -0.727756 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_teleporter_start"; + ent.v[ "delay" ] = 1; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_teleporter_start" ); + ent.v[ "origin" ] = ( 14090.8, -15373.4, -415.885 ); + ent.v[ "angles" ] = ( 20, 332, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_teleporter_start"; + ent.v[ "delay" ] = 1; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_teleporter_start" ); + ent.v[ "origin" ] = ( 14030.7, -15374.9, -415.875 ); + ent.v[ "angles" ] = ( 20, 210, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_teleporter_start"; + ent.v[ "delay" ] = 1; + ent = clientscripts\_fx::createExploder( "fx_moon_teleporter_beam" ); + ent.v[ "origin" ] = ( 14061.2, -15355.6, -616 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_teleporter_beam"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 122; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_teleporter2_pad_start" ); + ent.v[ "origin" ] = ( 40.7068, 3927.46, -156.539 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_teleporter2_pad_start"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 131; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_teleporter2_beam" ); + ent.v[ "origin" ] = ( 40.7068, 3927.46, -155 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_teleporter2_beam"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 132; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -28.9008, 640.159, -81.3551 ); + ent.v[ "angles" ] = ( 36, 268, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -11.2862, 640.519, -81.2041 ); + ent.v[ "angles" ] = ( 36, 268, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 4.09783, 639.489, -81.3014 ); + ent.v[ "angles" ] = ( 36, 268, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 20.6878, 637.705, -81.406 ); + ent.v[ "angles" ] = ( 36, 268, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1029.33, 1487.93, -137.68 ); + ent.v[ "angles" ] = ( 35.8986, 89.06, -2.90134 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1418.51, 1149.4, -128.257 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 781.085, 2178.16, -227.407 ); + ent.v[ "angles" ] = ( 24, 144, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 595.644, 3458.51, -315.843 ); + ent.v[ "angles" ] = ( 32, 136, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1001.67, 3675.36, -225.907 ); + ent.v[ "angles" ] = ( 20, 176, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 1650.13, 4319.96, -67.7219 ); + ent.v[ "angles" ] = ( 27.9814, 2.26488, 1.06308 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 2431.32, 4952.21, -126.093 ); + ent.v[ "angles" ] = ( 29.3403, 230.139, -5.44651 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_collapse" ); + ent.v[ "origin" ] = ( -1330.08, 2482.96, -271.222 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_collapse"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 111; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_collapse" ); + ent.v[ "origin" ] = ( -729.746, 2478.89, -242.181 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_collapse"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 111; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_collapse" ); + ent.v[ "origin" ] = ( -662.187, 2477.13, -242.215 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_collapse"; + ent.v[ "delay" ] = 1; + ent.v[ "exploder" ] = 111; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_collapse" ); + ent.v[ "origin" ] = ( -687.939, 2601.94, -242.4 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_collapse"; + ent.v[ "delay" ] = 1; + ent.v[ "exploder" ] = 111; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_collapse" ); + ent.v[ "origin" ] = ( 975.544, 1337.73, -96.875 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_collapse"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_collapse" ); + ent.v[ "origin" ] = ( 1204.84, 1364, -115.875 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_collapse"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_collapse" ); + ent.v[ "origin" ] = ( 1065.11, 1460.88, -111.533 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_collapse"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_dust" ); + ent.v[ "origin" ] = ( -1273.63, 2146.02, -264.092 ); + ent.v[ "angles" ] = ( 0, 354, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_dust"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 112; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_dust" ); + ent.v[ "origin" ] = ( -652.808, 2186.88, -231.334 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_dust"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 112; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_dust" ); + ent.v[ "origin" ] = ( 978.957, 1102.45, -63.875 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_dust"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 111; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_dust" ); + ent.v[ "origin" ] = ( 1243.26, 1076.24, -82.2435 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_dust"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 111; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_dust" ); + ent.v[ "origin" ] = ( 1541.74, 1087.69, -57.3993 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_dust"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 111; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_ceiling_cave_dust" ); + ent.v[ "origin" ] = ( 988.051, 1684.28, -130.908 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_ceiling_cave_dust"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 111; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( -1010.37, 1119.58, -235.544 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( -911.536, 1752.47, -352.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( -1285.1, 2077.15, -390 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( -694.674, 2225.33, -375.21 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 69.9906, 2382.06, -566 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 105.13, 2862.99, -562 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 1401.45, 3851.33, -317.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 2016.34, 4458.45, -240.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 2294.68, 4773.76, -245.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 2063.39, 5708.9, 17.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 1708.13, 5398.31, 18.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 1217.79, 1061.4, -235.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 1168.58, 1395.27, -251.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 934.307, 1749.37, -353.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 1012.11, 2217.16, -346.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 1030.51, 2946.6, -416.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 262.311, 3545.76, -544.19 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_coast_sparks_int_runner" ); + ent.v[ "origin" ] = ( 1064.73, 1995.69, -263.942 ); + ent.v[ "angles" ] = ( 46, 90, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_coast_sparks_int_runner"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_moon_airlock_hatch_forcefield" ); + ent.v[ "origin" ] = ( -178.731, 186.539, -12.875 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_airlock_hatch_forcefield"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 140; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_airlock_hatch_forcefield" ); + ent.v[ "origin" ] = ( -178.401, 187.321, -66.875 ); + ent.v[ "angles" ] = ( 90, 359.237, -0.763332 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_airlock_hatch_forcefield"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 140; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( -1915.46, -661.659, -1005.88 ); + ent.v[ "angles" ] = ( 270, 0, 94 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( -2764.79, -770.722, -1005.62 ); + ent.v[ "angles" ] = ( 270, 3.01279, 86.9871 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( -4378.29, -771.086, -923.549 ); + ent.v[ "angles" ] = ( 270, 0, 92 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( -3539.2, -781.26, -1005.25 ); + ent.v[ "angles" ] = ( 270, 2.38594, 85.6139 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( -847.862, -743.196, -955.88 ); + ent.v[ "angles" ] = ( 270, 357.797, 70.2025 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( 128.769, -1341.19, -996.88 ); + ent.v[ "angles" ] = ( 270, 0, 94 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( 932.703, -1000.02, -960.88 ); + ent.v[ "angles" ] = ( 270, 0, 120 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( 1698.98, -685.683, -1041.88 ); + ent.v[ "angles" ] = ( 270, 352.875, 109.125 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_moon_digger_dig_dust" ); + ent.v[ "origin" ] = ( 1015.82, 1111.3, 20 ); + ent.v[ "angles" ] = ( 0, 2, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_digger_dig_dust"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_digger_dig_dust" ); + ent.v[ "origin" ] = ( -728.2, 2621.05, 45 ); + ent.v[ "angles" ] = ( 344.487, 14.5407, 2.03176 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_digger_dig_dust"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 111; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( -282.99, -1044.87, -948.222 ); + ent.v[ "angles" ] = ( 270, 0, 88 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( 274.103, -657.36, -892.875 ); + ent.v[ "angles" ] = ( 270, 3.01279, 80.9872 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_canyon" ); + ent.v[ "origin" ] = ( -5692.64, -839.746, -1071.39 ); + ent.v[ "angles" ] = ( 270, 3.17983, 92.8202 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_canyon"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_moon_biodome_ceiling_breach" ); + ent.v[ "origin" ] = ( -1660.65, 8242.91, 994.44 ); + ent.v[ "angles" ] = ( 0, 328, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_biodome_ceiling_breach"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 200; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_biodome_breach_dirt" ); + ent.v[ "origin" ] = ( -1132.16, 7817.1, 24.6453 ); + ent.v[ "angles" ] = ( 0, 320, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_biodome_breach_dirt"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 200; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_earth_destroyed" ); + ent.v[ "origin" ] = ( -22060.8, -121800, 34462.4 ); + ent.v[ "angles" ] = ( 18, 78, 22 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_earth_destroyed"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 2012; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_breach_debris_room_os" ); + ent.v[ "origin" ] = ( 76.1282, 84.919, -1.875 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_breach_debris_room_os"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 300; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_breach_debris_room_os" ); + ent.v[ "origin" ] = ( 65.9724, 573.037, 9.125 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_breach_debris_room_os"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 300; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_breach_debris_room_os" ); + ent.v[ "origin" ] = ( 1397.71, 3954.89, -332.875 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_breach_debris_room_os"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 320; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_breach_debris_room_os" ); + ent.v[ "origin" ] = ( 2137.93, 4606.92, -241.875 ); + ent.v[ "angles" ] = ( 0, 90, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_breach_debris_room_os"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 320; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_breach_debris_room_os" ); + ent.v[ "origin" ] = ( 1838.51, 5590.28, 19 ); + ent.v[ "angles" ] = ( 0, 44, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_breach_debris_room_os"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 340; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 42.9787, 4925.66, 166.473 ); + ent.v[ "angles" ] = ( 0, 270, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1581.01, 5283.24, 122.924 ); + ent.v[ "angles" ] = ( 0, 90, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1608.03, 5867.47, 123.956 ); + ent.v[ "angles" ] = ( 360, 314, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1139.65, 5791.92, 229.616 ); + ent.v[ "angles" ] = ( 360, 138, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1452.5, 6011.94, 122.507 ); + ent.v[ "angles" ] = ( 360, 136, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -719.593, 5310.08, 145.283 ); + ent.v[ "angles" ] = ( 0, 74, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 32.291, 5137.79, 164.792 ); + ent.v[ "angles" ] = ( 360, 90, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -1582.12, 5807.48, 228.078 ); + ent.v[ "angles" ] = ( 0, 38, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -2079.62, 6691.58, 227.122 ); + ent.v[ "angles" ] = ( 0, 10, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -1574.51, 8538.95, 227.12 ); + ent.v[ "angles" ] = ( 0, 312, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -688.753, 9033.95, 226.938 ); + ent.v[ "angles" ] = ( 0, 282, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 280.887, 9026.74, 227.204 ); + ent.v[ "angles" ] = ( 0, 256, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1165.53, 8518.99, 227.317 ); + ent.v[ "angles" ] = ( 360, 234, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1651.34, 7641.22, 226.536 ); + ent.v[ "angles" ] = ( 0, 194, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1650.23, 6667.42, 227.181 ); + ent.v[ "angles" ] = ( 360, 176, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -711.058, 5306.62, 144.703 ); + ent.v[ "angles" ] = ( 0, 74, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -1576.46, 5799.35, 227.874 ); + ent.v[ "angles" ] = ( 0, 38, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -2078.4, 6680.97, 226.598 ); + ent.v[ "angles" ] = ( 0, 10, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -1583.62, 8531.43, 227.751 ); + ent.v[ "angles" ] = ( 0, 312, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -701.329, 9032.22, 226.596 ); + ent.v[ "angles" ] = ( 0, 282, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 271.025, 9029.63, 227.187 ); + ent.v[ "angles" ] = ( 0, 256, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1157.8, 8524, 226.71 ); + ent.v[ "angles" ] = ( 360, 234, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1649.22, 7650.39, 226.392 ); + ent.v[ "angles" ] = ( 0, 194, -180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1651.57, 6677.07, 226.685 ); + ent.v[ "angles" ] = ( 360, 176, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1146.72, 5798.97, 229.457 ); + ent.v[ "angles" ] = ( 360, 138, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( -189.695, 3115.29, -490 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( -172.389, 3098.63, -490.473 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( -156.376, 3083.29, -491.111 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( -204.342, 4185.56, -422.818 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( -189.715, 4198.28, -423.128 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( -171.431, 4215.55, -423.01 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( 286.182, 4218.72, -428.809 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( 304.936, 4203.09, -427.951 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( 324.37, 4186.97, -428.171 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_moon_pyramid_drop" ); + ent.v[ "origin" ] = ( 43.728, 3943.06, -533.676 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_pyramid_drop"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 410; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_pyramid_opening" ); + ent.v[ "origin" ] = ( 43.3597, 3942.96, -530.495 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_pyramid_opening"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 420; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_dust_motes_blowing" ); + ent.v[ "origin" ] = ( 13617.3, -14452.9, -677.612 ); + ent.v[ "angles" ] = ( 0, 74, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_dust_motes_blowing"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_dust_motes_blowing" ); + ent.v[ "origin" ] = ( 13213.3, -14295.7, -621.875 ); + ent.v[ "angles" ] = ( 0, 42, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_dust_motes_blowing"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_dust_motes_blowing" ); + ent.v[ "origin" ] = ( 14835.9, -14511.1, -518 ); + ent.v[ "angles" ] = ( 0, 84, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_dust_motes_blowing"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_dust_motes_blowing" ); + ent.v[ "origin" ] = ( 14880.4, -14269.1, -621.671 ); + ent.v[ "angles" ] = ( 0, 68, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_dust_motes_blowing"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_dust_motes_blowing" ); + ent.v[ "origin" ] = ( 13665.3, -12982.7, -679.875 ); + ent.v[ "angles" ] = ( 0, 26, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_dust_motes_blowing"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_dust_motes_blowing" ); + ent.v[ "origin" ] = ( 13969.8, -13220.8, -643.875 ); + ent.v[ "angles" ] = ( 0, 28, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_dust_motes_blowing"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_dust_motes_blowing" ); + ent.v[ "origin" ] = ( 14077, -13155.1, -671.875 ); + ent.v[ "angles" ] = ( 0, 28, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_dust_motes_blowing"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 11.5023, 1143.12, 154.534 ); + ent.v[ "angles" ] = ( 36.1836, 281.526, 0.535366 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -6.40358, 1142.42, 154.411 ); + ent.v[ "angles" ] = ( 36.1768, 279.048, -0.927538 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -21.4199, -15.8103, 231.991 ); + ent.v[ "angles" ] = ( 22, 246, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -35.1451, -10.2326, 232.244 ); + ent.v[ "angles" ] = ( 22, 246, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -123.954, 521.315, 236.57 ); + ent.v[ "angles" ] = ( 28, 304, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -205.841, 624.616, 230.724 ); + ent.v[ "angles" ] = ( 38, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -206.772, 607.688, 231.532 ); + ent.v[ "angles" ] = ( 38, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( -426.69, 232.87, -91.2615 ); + ent.v[ "angles" ] = ( 39.9708, 182.607, 1.53578 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( -427.701, -153.809, -89.9519 ); + ent.v[ "angles" ] = ( 39.9708, 182.607, 1.53578 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( -428.894, -340.384, -88.9251 ); + ent.v[ "angles" ] = ( 39.9708, 182.607, 1.53578 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 425.031, 224.214, -88.9969 ); + ent.v[ "angles" ] = ( 40, 4, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 599.254, 634.321, -67.7013 ); + ent.v[ "angles" ] = ( 41.9686, 282.69, 1.79987 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -1315.83, 445.432, 1.41904 ); + ent.v[ "angles" ] = ( 56, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 206.88, 605.902, 229.032 ); + ent.v[ "angles" ] = ( 36, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 207.122, 625.421, 229.364 ); + ent.v[ "angles" ] = ( 36, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1413.45, 442.343, 2.39126 ); + ent.v[ "angles" ] = ( 50, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -758.635, 598.446, 133.808 ); + ent.v[ "angles" ] = ( 44, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -757.867, 614.719, 133.987 ); + ent.v[ "angles" ] = ( 44, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -756.446, 632.181, 135.7 ); + ent.v[ "angles" ] = ( 44, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -755.904, 648.313, 134.811 ); + ent.v[ "angles" ] = ( 44, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 763.166, 599.148, 126.987 ); + ent.v[ "angles" ] = ( 40, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 762.396, 614.817, 127.131 ); + ent.v[ "angles" ] = ( 40, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 762.338, 632.311, 127.479 ); + ent.v[ "angles" ] = ( 40, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 761.597, 649.802, 127.051 ); + ent.v[ "angles" ] = ( 40, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 49.0194, 62.1527, -79.5698 ); + ent.v[ "angles" ] = ( 39.3369, 104.942, 7.58327 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 26.1988, 63.766, -79.9378 ); + ent.v[ "angles" ] = ( 35.0955, 106.721, 8.58995 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_moon_pyramid_egg" ); + ent.v[ "origin" ] = ( 43.8242, 3737.09, -551.618 ); + ent.v[ "angles" ] = ( 306, 270, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_pyramid_egg"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 405; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 468.135, 372.736, 180.385 ); + ent.v[ "angles" ] = ( 0, 180, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 431.133, -150.669, -87.2849 ); + ent.v[ "angles" ] = ( 38, 4, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 441.863, -345.448, -92.0897 ); + ent.v[ "angles" ] = ( 36, 4, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 441.774, -631.122, -92.9022 ); + ent.v[ "angles" ] = ( 36, 4, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1073.86, 1153.19, -128.125 ); + ent.v[ "angles" ] = ( 90, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 890.755, 1033.82, -86.5466 ); + ent.v[ "angles" ] = ( 34, 62, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1045.02, 1486.61, -136.487 ); + ent.v[ "angles" ] = ( 42, 94, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1145.82, 2522.76, -274.34 ); + ent.v[ "angles" ] = ( 27.9814, 143.735, -1.06309 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1398.13, 2534.96, -325.9 ); + ent.v[ "angles" ] = ( 27.9814, 143.735, -1.06309 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1014.58, 2858.52, -303.347 ); + ent.v[ "angles" ] = ( 27.9814, 143.735, -1.06309 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 610.5, 3049.47, -271.175 ); + ent.v[ "angles" ] = ( 25.983, 286.225, 0.975178 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 22.9726, 2515.58, -392.395 ); + ent.v[ "angles" ] = ( 35.7723, 182.598, -4.34295 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 131.453, 2510.78, -394.124 ); + ent.v[ "angles" ] = ( 35.8814, 4.89078, 3.42868 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -810.975, 1270.67, -129.297 ); + ent.v[ "angles" ] = ( 19.9936, 213.904, -0.369485 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -1418.04, 1063.6, -74.5988 ); + ent.v[ "angles" ] = ( 18, 76, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -1170.09, 963.59, -75.0712 ); + ent.v[ "angles" ] = ( 24, 264, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -1162.01, 963.07, -75.3032 ); + ent.v[ "angles" ] = ( 24, 264, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -843.841, 1626.91, -134.075 ); + ent.v[ "angles" ] = ( 22.1554, 240.142, -9.46895 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1875.08, 4531.2, -127.643 ); + ent.v[ "angles" ] = ( 18, 114, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1710.12, 4325.55, -178.761 ); + ent.v[ "angles" ] = ( 15.2946, 2.02998, 18.5129 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1709.43, 4312.18, -177.84 ); + ent.v[ "angles" ] = ( 14, 8, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1707.91, 4300.59, -178.988 ); + ent.v[ "angles" ] = ( 13.861, 359.758, -1.98736 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 1434.19, 3616.31, -214.113 ); + ent.v[ "angles" ] = ( 20, 28, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 2045.5, 5279.87, 123.397 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 1838.72, 4845.34, 226.583 ); + ent.v[ "angles" ] = ( 34, 316, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 1809.26, 4881.2, 229.801 ); + ent.v[ "angles" ] = ( 42, 132, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 728.163, 4143.94, 119.962 ); + ent.v[ "angles" ] = ( 21.979, 27.5014, 0.686688 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 225.37, 4413.4, 218.572 ); + ent.v[ "angles" ] = ( 40, 164, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 224.347, 4412.37, 231.861 ); + ent.v[ "angles" ] = ( 39.9707, 161.39, -1.67738 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 1434.08, 5251.07, 203.743 ); + ent.v[ "angles" ] = ( 41.718, 235.95, -5.37672 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 1388.71, 5609.89, 222.771 ); + ent.v[ "angles" ] = ( 28.2459, 249.196, -10.225 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 480.791, 3800.85, 23.3325 ); + ent.v[ "angles" ] = ( 0, 168, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 1661.47, 5613.29, 136.506 ); + ent.v[ "angles" ] = ( 24, 4, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1664.47, 5600.61, 136.245 ); + ent.v[ "angles" ] = ( 32, 4, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1372.26, 6345.59, 182.2 ); + ent.v[ "angles" ] = ( 18, 204, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1365.7, 6356.12, 181.439 ); + ent.v[ "angles" ] = ( 12.9324, 209.032, -8.05505 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1176.69, 7201.15, 171.709 ); + ent.v[ "angles" ] = ( 35.8987, 141.06, -2.90134 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( 1190.1, 7215.6, 178.17 ); + ent.v[ "angles" ] = ( 35.8987, 141.06, -2.90134 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( -830.076, 7697.32, 208.478 ); + ent.v[ "angles" ] = ( 21.2797, 316.712, -0.90409 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( -1582.44, 6697.51, 206.738 ); + ent.v[ "angles" ] = ( 22, 350, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( -12.8169, 6534.97, 209.239 ); + ent.v[ "angles" ] = ( 24, 250, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -1575.65, 6710.24, 206.605 ); + ent.v[ "angles" ] = ( 22, 350, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 0.804212, 6527.7, 207.17 ); + ent.v[ "angles" ] = ( 23.9909, 248.156, 0.529484 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -818.6, 7707.49, 204.695 ); + ent.v[ "angles" ] = ( 22.6053, 319.277, -4.1899 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -2078.02, 7647.71, 226.581 ); + ent.v[ "angles" ] = ( 0, 340, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( -2074.58, 7656.3, 226.352 ); + ent.v[ "angles" ] = ( 0, 312, 180 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1661.11, 1022.9, -138.371 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 663.961, 1740.58, -253.395 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( -1333.6, 246.513, -148.443 ); + ent.v[ "angles" ] = ( 0, 34, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( -1322.65, 226.206, -147.972 ); + ent.v[ "angles" ] = ( 0, 34, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_lamp_glow" ); + ent.v[ "origin" ] = ( -1311.82, 204.974, -147.71 ); + ent.v[ "angles" ] = ( 0, 34, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_lamp_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 496.131, 6641.79, 6.06094 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( 923.554, 7162.51, 2.40257 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( -418.738, 5786.94, -11.1743 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( -1354.8, 6603.32, 2.67774 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zmb_fog_thick_300x300" ); + ent.v[ "origin" ] = ( -121.392, 7956.95, 15.8972 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zmb_fog_thick_300x300"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_vent_wall_mist" ); + ent.v[ "origin" ] = ( 891.578, 937.277, -171.875 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_vent_wall_mist"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_vent_wall_mist" ); + ent.v[ "origin" ] = ( 887.831, 1261.07, -171.029 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_vent_wall_mist"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_vent_wall_mist" ); + ent.v[ "origin" ] = ( 861.44, 2618.26, -327.999 ); + ent.v[ "angles" ] = ( 0, 12, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_vent_wall_mist"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_vent_wall_mist" ); + ent.v[ "origin" ] = ( -173.195, 2589.21, -498.484 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_vent_wall_mist"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_vent_wall_mist" ); + ent.v[ "origin" ] = ( 325.18, 2590.05, -496.335 ); + ent.v[ "angles" ] = ( 0, 180, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_vent_wall_mist"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_vent_wall_mist" ); + ent.v[ "origin" ] = ( -705.539, 1802.22, -238 ); + ent.v[ "angles" ] = ( 30, 86, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_vent_wall_mist"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_vent_wall_mist" ); + ent.v[ "origin" ] = ( -630.113, 1769.75, -245 ); + ent.v[ "angles" ] = ( 30, 86, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_vent_wall_mist"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_vent_wall_mist" ); + ent.v[ "origin" ] = ( 815.901, 3574.78, -336.054 ); + ent.v[ "angles" ] = ( 0, 164, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_vent_wall_mist"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_vent_wall_mist" ); + ent.v[ "origin" ] = ( 819.443, 3779.23, -332.461 ); + ent.v[ "angles" ] = ( 0, 194, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_vent_wall_mist"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_trap_switch_light_glow" ); + ent.v[ "origin" ] = ( 1252.73, 984.069, -225.428 ); + ent.v[ "angles" ] = ( 0, 90, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_trap_switch_light_glow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_vent_wall_mist" ); + ent.v[ "origin" ] = ( 1203.35, 2426.26, -254.106 ); + ent.v[ "angles" ] = ( 0, 208, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_vent_wall_mist"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( 1162, 4525.49, -279.875 ); + ent.v[ "angles" ] = ( 270, 4.578, 81.422 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( 1759.88, 4832.13, -202.875 ); + ent.v[ "angles" ] = ( 270, 4.578, 81.422 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( 2357.43, 4050.59, -206.875 ); + ent.v[ "angles" ] = ( 270, 4.578, 81.422 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( 2038.2, 6245.4, 63.125 ); + ent.v[ "angles" ] = ( 270, 4.578, 81.422 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_fog_spawn_closet" ); + ent.v[ "origin" ] = ( 1985.76, 5001.12, 60.125 ); + ent.v[ "angles" ] = ( 270, 4.578, 81.422 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_fog_spawn_closet"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createExploder( "fx_moon_digger_dig_dust" ); + ent.v[ "origin" ] = ( 587.554, 1511.55, 1.70914 ); + ent.v[ "angles" ] = ( 0, 176, 0 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_digger_dig_dust"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 101; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createExploder( "fx_moon_digger_dig_dust" ); + ent.v[ "origin" ] = ( -868.42, 2307.42, 4.00446 ); + ent.v[ "angles" ] = ( 344.09, 353.76, 1.71681 ); + ent.v[ "type" ] = "exploder"; + ent.v[ "fxid" ] = "fx_moon_digger_dig_dust"; + ent.v[ "delay" ] = 0; + ent.v[ "exploder" ] = 111; + ent.v[ "soundalias" ] = "nil"; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( -432.911, -625.305, -92.2782 ); + ent.v[ "angles" ] = ( 33.9728, 182.413, 1.41924 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 299.235, 213.275, 251.058 ); + ent.v[ "angles" ] = ( 43.5505, 349.038, -6.4807 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1365.66, 804.551, -79.4961 ); + ent.v[ "angles" ] = ( 24, 234, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( 1365.52, 817.057, -78.7214 ); + ent.v[ "angles" ] = ( 24, 234, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -675.552, 2862.22, -296.176 ); + ent.v[ "angles" ] = ( 22, 24, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -3.4191, 16.0045, 232.623 ); + ent.v[ "angles" ] = ( 25.983, 95.775, -0.975179 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1184.27, 2465.71, -259.107 ); + ent.v[ "angles" ] = ( 0, 0, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 383.007, 2880.73, -437.107 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_tube_light" ); + ent.v[ "origin" ] = ( 1139.5, 3942.27, -232.181 ); + ent.v[ "angles" ] = ( 0, 2, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_tube_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_narrow" ); + ent.v[ "origin" ] = ( -159.525, 8490.48, 241.069 ); + ent.v[ "angles" ] = ( 21.8769, 265.507, -1.78684 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_narrow"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_moon_floodlight_wide" ); + ent.v[ "origin" ] = ( -142.701, 8492.53, 244.684 ); + ent.v[ "angles" ] = ( 24, 272, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_moon_floodlight_wide"; + ent.v[ "delay" ] = -15; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/createfx/zombietron_fx.csc b/BO1/PC/ZM/clientscripts/createfx/zombietron_fx.csc new file mode 100644 index 0000000..a5fc8b2 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/createfx/zombietron_fx.csc @@ -0,0 +1,257 @@ + +main() +{ + ent = clientscripts\_fx::createOneshotEffect( "fx_water_wake_creek_mouth_froth" ); + ent.v[ "origin" ] = ( -330.813, 1596.81, -70 ); + ent.v[ "angles" ] = ( 0, 228, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_wake_creek_mouth_froth"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_splash_creek_rocks_sm" ); + ent.v[ "origin" ] = ( -292.497, 1630.76, -70 ); + ent.v[ "angles" ] = ( 0, 252, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_splash_creek_rocks_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_splash_creek_rocks_sm" ); + ent.v[ "origin" ] = ( -254.492, 1597.14, -70 ); + ent.v[ "angles" ] = ( 0, 252, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_splash_creek_rocks_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_splash_creek_rocks_sm" ); + ent.v[ "origin" ] = ( -377.161, 1591.18, -70 ); + ent.v[ "angles" ] = ( 0, 252, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_splash_creek_rocks_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_splash_creek_rocks_sm" ); + ent.v[ "origin" ] = ( -327.084, 1477.49, -71.0546 ); + ent.v[ "angles" ] = ( 0, 252, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_splash_creek_rocks_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_splash_creek_rocks_sm" ); + ent.v[ "origin" ] = ( -410.078, 1570.12, -70 ); + ent.v[ "angles" ] = ( 0, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_splash_creek_rocks_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_fall_sm" ); + ent.v[ "origin" ] = ( -218.161, 1647.28, 189.358 ); + ent.v[ "angles" ] = ( 16, 30, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_fall_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_fall_sm" ); + ent.v[ "origin" ] = ( -428.771, 1657.8, 164.684 ); + ent.v[ "angles" ] = ( 351.26, 342.514, -10.8069 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_fall_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_fall_xsm" ); + ent.v[ "origin" ] = ( -234.155, 1612.77, 128.281 ); + ent.v[ "angles" ] = ( 2.09763, 342.033, 0.618335 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_fall_xsm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zombie_light_glow_green" ); + ent.v[ "origin" ] = ( -2656.76, -355.61, 17.6156 ); + ent.v[ "angles" ] = ( 272, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zombie_light_glow_green"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_zombie_light_glow_green" ); + ent.v[ "origin" ] = ( -2657.36, -491.985, 21.5298 ); + ent.v[ "angles" ] = ( 272, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_zombie_light_glow_green"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_search_light_tower" ); + ent.v[ "origin" ] = ( -2918.15, -4991.38, 306.658 ); + ent.v[ "angles" ] = ( 23.6543, 262.702, -177.788 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_search_light_tower"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_splash_creek_rocks" ); + ent.v[ "origin" ] = ( -226.844, -970.443, 42.0333 ); + ent.v[ "angles" ] = ( 4, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_splash_creek_rocks"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_fluorescent_tubes" ); + ent.v[ "origin" ] = ( 197.754, -3560.1, 297.182 ); + ent.v[ "angles" ] = ( 62, 182, -90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_fluorescent_tubes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_fluorescent_tubes" ); + ent.v[ "origin" ] = ( -696.924, -4087.43, 302.161 ); + ent.v[ "angles" ] = ( 61.2309, 13.2821, -81.3789 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_fluorescent_tubes"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_elec_short_random" ); + ent.v[ "origin" ] = ( -435.855, -3484.98, 265.287 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_elec_short_random"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_elec_short_random" ); + ent.v[ "origin" ] = ( -2744.71, -2113.04, 203.932 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_elec_short_random"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_elec_short_random" ); + ent.v[ "origin" ] = ( -8227.02, 1951.3, 359.978 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_elec_short_random"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_elec_short_random" ); + ent.v[ "origin" ] = ( -7755.19, 1666.7, 195.786 ); + ent.v[ "angles" ] = ( 292.879, 194.071, 172.25 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_elec_short_random"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_elec_short_random" ); + ent.v[ "origin" ] = ( -8284.97, 1680.92, 261.125 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_elec_short_random"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_kow_ray_street" ); + ent.v[ "origin" ] = ( 4239.56, 1183.06, 236.905 ); + ent.v[ "angles" ] = ( 88, 270, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_kow_ray_street"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_kow_ray_street" ); + ent.v[ "origin" ] = ( 4236.61, 963.73, 239.836 ); + ent.v[ "angles" ] = ( 88, 270, 90 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_kow_ray_street"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_snow_wall_avalanche" ); + ent.v[ "origin" ] = ( -2636.69, 2132.59, 173.662 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_snow_wall_avalanche"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_snow_wall_avalanche" ); + ent.v[ "origin" ] = ( -2051.24, 1714.1, 207.444 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_snow_wall_avalanche"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_pow_cave_water_fall" ); + ent.v[ "origin" ] = ( -300.783, 1681.27, 202.285 ); + ent.v[ "angles" ] = ( 347.876, 273.067, 1.71468 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_pow_cave_water_fall"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_pow_cave_water_fall" ); + ent.v[ "origin" ] = ( -361.465, 1646.88, 188.778 ); + ent.v[ "angles" ] = ( 352.62, 253.138, -0.331623 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_pow_cave_water_fall"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_kow_ray_street" ); + ent.v[ "origin" ] = ( -2556.09, -2135.06, 171.471 ); + ent.v[ "angles" ] = ( 63.7108, 261.728, -9.05611 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_kow_ray_street"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_kow_ray_street" ); + ent.v[ "origin" ] = ( 3514.17, 1610.4, 239.721 ); + ent.v[ "angles" ] = ( 88, 270, -52 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_kow_ray_street"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_kow_ray_street" ); + ent.v[ "origin" ] = ( 3559.33, 594.379, 241.505 ); + ent.v[ "angles" ] = ( 88, 270, -142 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_kow_ray_street"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_column_xsm_thin" ); + ent.v[ "origin" ] = ( -2949.75, -882.637, 9.53891 ); + ent.v[ "angles" ] = ( 3.88683, 87.5677, -0.738694 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_column_xsm_thin"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_column_xsm_thin" ); + ent.v[ "origin" ] = ( -3089.41, -877.806, 4.72826 ); + ent.v[ "angles" ] = ( 3.88683, 87.5677, -0.738694 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_column_xsm_thin"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_column_xsm_thin" ); + ent.v[ "origin" ] = ( -698.079, 976.305, -50.4247 ); + ent.v[ "angles" ] = ( 3.88683, 87.5677, -0.738694 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_column_xsm_thin"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_column_xsm_thin" ); + ent.v[ "origin" ] = ( -695.002, 1219.16, -52.0319 ); + ent.v[ "angles" ] = ( 3.88683, 87.5677, -0.738694 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_column_xsm_thin"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_ash_embers_light" ); + ent.v[ "origin" ] = ( -3061.74, -2258.66, 144.712 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_ash_embers_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_ash_embers_light" ); + ent.v[ "origin" ] = ( -2298, -3017.66, 85.7147 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_ash_embers_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_ash_embers_light" ); + ent.v[ "origin" ] = ( -2388.7, -2131.84, 83.8043 ); + ent.v[ "angles" ] = ( 270, 0, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_ash_embers_light"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_splash_creek_rocks_sm" ); + ent.v[ "origin" ] = ( -329.376, 1623.75, -34.5418 ); + ent.v[ "angles" ] = ( 0, 252, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_splash_creek_rocks_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_water_splash_creek_rocks_sm" ); + ent.v[ "origin" ] = ( -342.49, 1585.82, -53.875 ); + ent.v[ "angles" ] = ( 0, 252, 0 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_water_splash_creek_rocks_sm"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_md" ); + ent.v[ "origin" ] = ( -2390.24, -2086.6, -39.2392 ); + ent.v[ "angles" ] = ( 274.694, 94.9798, 179.249 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_md" ); + ent.v[ "origin" ] = ( -2263.93, -3018.37, -41 ); + ent.v[ "angles" ] = ( 272.137, 341.109, 13.0109 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_fire_md" ); + ent.v[ "origin" ] = ( -3095.27, -2256, -38 ); + ent.v[ "angles" ] = ( 359.855, 182.136, 1.99578 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_fire_md"; + ent.v[ "delay" ] = -15; + ent = clientscripts\_fx::createOneshotEffect( "fx_light_kow_ray_street" ); + ent.v[ "origin" ] = ( -2791.47, -3133.8, 173.961 ); + ent.v[ "angles" ] = ( 67.9601, 88.1653, -1.18928 ); + ent.v[ "type" ] = "oneshotfx"; + ent.v[ "fxid" ] = "fx_light_kow_ray_street"; + ent.v[ "delay" ] = -15; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/zombie_coast_ffotd.csc b/BO1/PC/ZM/clientscripts/zombie_coast_ffotd.csc new file mode 100644 index 0000000..9070753 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_coast_ffotd.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_coast_fx.csc b/BO1/PC/ZM/clientscripts/zombie_coast_fx.csc new file mode 100644 index 0000000..69f5d6a --- /dev/null +++ b/BO1/PC/ZM/clientscripts/zombie_coast_fx.csc @@ -0,0 +1,367 @@ + +#include clientscripts\_utility; +#include clientscripts\_fx; +#include clientscripts\_music; +main() +{ + clientscripts\createfx\zombie_coast_fx::main(); + clientscripts\_fx::reportNumEffects(); + footsteps(); + precache_scripted_fx(); + precache_util_fx(); + precache_createfx_fx(); + disableFX = GetDvarInt( #"disable_fx" ); + if( !IsDefined( disableFX ) || disableFX <= 0 ) + { + precache_scripted_fx(); + } + level thread manage_player_rain(); + level thread clientscripts\_zombiemode::init_perk_machines_fx(); + level.blizzard = false; +} +footsteps() +{ +} +precache_util_fx() +{ +} +precache_scripted_fx() +{ + level._effect["eye_glow"] = LoadFx( "misc/fx_zombie_eye_single" ); + level._effect["player_rain"] = loadfx( "maps/zombie/fx_zombie_coast_snow_oneshot" ); + level._effect["headshot"] = LoadFX( "impacts/fx_flesh_hit" ); + level._effect["headshot_nochunks"] = LoadFX( "misc/fx_zombie_bloodsplat" ); + level._effect["bloodspurt"] = LoadFX( "misc/fx_zombie_bloodspurt" ); + level._effect["animscript_gib_fx"] = LoadFx( "weapon/bullet/fx_flesh_gib_fatal_01" ); + level._effect["animscript_gibtrail_fx"] = LoadFx( "trail/fx_trail_blood_streak" ); + level._effect["buff_electrified"] = LoadFX( "maps/zombie/fx_zmb_coast_electrified_torso" ); + level._effect[ "lighthouse_morse_code" ] = LoadFX( "maps/zombie/fx_zmb_coast_morse_code" ); + level._effect["waterfreeze"] = LoadFX( "maps/zombie/fx_zmb_coast_waterfreeze_lower_body" ); + level._effect[ "flare" ] = LoadFX( "maps/zombie/fx_zmb_coast_flare" ); + level._effect[ "flare_no_dlight" ] = LoadFX( "maps/zombie/fx_zmb_coast_flare_no_dlight" ); +} +precache_createfx_fx() +{ + level._effect["fx_zombie_boss_water_intro"] = loadfx("maps/zombie/fx_zombie_boss_water_intro"); + level._effect["fx_zombie_boss_water_boil"] = loadfx("maps/zombie/fx_zombie_boss_water_boil"); + level._effect["fx_zombie_boss_water_boil_sm"] = loadfx("maps/zombie/fx_zombie_boss_water_boil_sm"); + level._effect["fx_zmb_coast_spotlight_main"] = loadfx("maps/zombie/fx_zmb_coast_spotlight_main"); + level._effect["fx_zmb_coast_spotlight_burst"] = loadfx("maps/zombie/fx_zmb_coast_spotlight_burst"); + level._effect["fx_fire_line_xsm"] = loadfx("env/fire/fx_fire_line_xsm"); + level._effect["fx_zmb_coast_sparks_int_runner"] = loadfx("maps/zombie/fx_zmb_coast_sparks_int_runner"); + level._effect["fx_zmb_coast_packapunch"] = loadfx("maps/zombie/fx_zmb_coast_packapunch"); + level._effect["fx_zmb_coast_packapunch_rising"] = loadfx("maps/zombie/fx_zmb_coast_packapunch_rising"); + level._effect["fx_zmb_coast_spotlight_packapunch"] = loadfx("maps/zombie/fx_zmb_coast_spotlight_packapunch"); + level._effect["fx_zmb_coast_spotlight_pap_202"] = loadfx("maps/zombie/fx_zmb_coast_spotlight_pap_202"); + level._effect["fx_zmb_coast_ray_moon_md"] = loadfx("maps/zombie/fx_zmb_coast_ray_moon_md"); + level._effect["fx_zmb_coast_ray_moon_lg"] = loadfx("maps/zombie/fx_zmb_coast_ray_moon_lg"); + level._effect["fx_zmb_coast_light_floodlight"] = loadfx("maps/zombie/fx_zmb_coast_light_floodlight"); + level._effect["fx_zmb_coast_light_tinhat_cage"] = loadfx("maps/zombie/fx_zmb_coast_light_tinhat_cage"); + level._effect["fx_zmb_coast_perk_dlight"] = loadfx("maps/zombie/fx_zmb_coast_perk_dlight"); + level._effect["fx_light_bulb_incandescent_red"] = loadfx("env/light/fx_light_bulb_incandescent_red"); + level._effect["fx_light_bulb_incandescent"] = loadfx("env/light/fx_light_bulb_incandescent"); + level._effect["fx_zmb_coast_light_lantern"] = loadfx("maps/zombie/fx_zmb_coast_light_lantern"); + level._effect["zombie_coast_snow_med"] = loadfx("maps/zombie/fx_zombie_coast_snow_med"); + level._effect["fx_zmb_coast_blizzard_med"] = loadfx("maps/zombie/fx_zmb_coast_blizzard_med"); + level._effect["fx_zmb_coast_snow_gust_xsm"] = loadfx("maps/zombie/fx_zmb_coast_snow_gust_xsm"); + level._effect["fx_zmb_coast_snow_gust_sml"] = loadfx("maps/zombie/fx_zmb_coast_snow_gust_sml"); + level._effect["fx_zmb_coast_snow_gust_med"] = loadfx("maps/zombie/fx_zmb_coast_snow_gust_med"); + level._effect["fx_zmb_coast_snow_gust_vertical"] = loadfx("maps/zombie/fx_zmb_coast_snow_gust_vertical"); + level._effect["fx_zmb_coast_snow_window"] = loadfx("maps/zombie/fx_zmb_coast_snow_window"); + level._effect["fx_zmb_coast_snowfall_entrance_lrg"] = loadfx("maps/zombie/fx_zmb_coast_snowfall_entrance_lrg"); + level._effect["fx_zmb_coast_snowfall_ledge"] = loadfx("maps/zombie/fx_zmb_coast_snowfall_ledge"); + level._effect["fx_zmb_coast_cloud_1"] = loadfx("maps/zombie/fx_zmb_coast_cloud_1"); + level._effect["fx_zmb_coast_cloud_2"] = loadfx("maps/zombie/fx_zmb_coast_cloud_2"); + level._effect["fx_zmb_coast_lightning_burst"] = loadfx("maps/zombie/fx_zmb_coast_lightning_burst"); + level._effect["fx_zmb_coast_lightning_d_light"] = loadfx("maps/zombie/fx_zmb_coast_lightning_d_light"); + level._effect["fx_lightning_flash_single_md"] = loadfx("env/weather/fx_lightning_flash_single_md"); + level._effect["fx_zmb_coast_lightning_intro_xlg"] = loadfx("maps/zombie/fx_zmb_coast_lightning_intro_xlg"); + level._effect["fx_zmb_coast_interior_fog"] = loadfx("maps/zombie/fx_zmb_coast_interior_fog"); + level._effect["fx_zmb_coast_corridor_fog"] = loadfx("maps/zombie/fx_zmb_coast_corridor_fog"); + level._effect["fx_zmb_coast_offshore_fog_1"] = loadfx("maps/zombie/fx_zmb_coast_offshore_fog_1"); + level._effect["fx_zmb_coast_beam_submarine"] = loadfx("maps/zombie/fx_zmb_coast_beam_submarine"); + level._effect["fx_zmb_coast_beam_vert_shaft"] = loadfx("maps/zombie/fx_zmb_coast_beam_vert_shaft"); + level._effect["fx_zmb_coast_sacrifice_flash"] = loadfx("maps/zombie/fx_zmb_coast_sacrifice_flash"); + level._effect["fx_zmb_coast_vault_door_glow"] = loadfx("maps/zombie/fx_zmb_coast_vault_door_glow"); + level._effect["fx_zmb_coast_dest_fuse_box"] = loadfx("maps/zombie/fx_zmb_coast_dest_fuse_box"); +} +manage_player_rain() +{ + while ( 1 ) + { + time = RandomFloat( 10, 30 ); + thread start_player_rain(); + realwait( time ); + level notify( "stop_player_rain" ); + time = RandomFloat( 10, 30 ); + realwait( time ); + } +} +start_player_rain() +{ + level endon( "stop_player_rain" ); + players = getlocalplayers(); + while( 1 ) + { + if ( isdefined( players[0] ) ) + { + PlayFxOnTag( 0, level._effect["player_rain"], players[0], "tag_origin" ); + } + realwait(0.3); + } + realwait(0.05); +} +coast_fog_triggers_init(localClientNum) +{ + lighthouse_array = GetEntArray(localClientNum, "lighthouseFog_interior", "targetname"); + array_thread( lighthouse_array, ::fog_trigger, ::lighthouse_fog_change, 1); + shipfront_array = GetEntArray(localClientNum, "shipFrontDeck_interior", "targetname"); + array_thread( shipfront_array, ::fog_trigger, ::shipfront_fog_change, 2 ); + shipback_array = GetEntArray(localClientNum, "shipMedium_interior", "targetname"); + array_thread( shipback_array, ::fog_trigger, ::shipback_fog_change, 3 ); + shipback_array = GetEntArray(localClientNum, "shipIce_interior", "targetname"); + array_thread( shipback_array, ::fog_trigger, ::shipIce_fog_change, 4); + exterior_array = GetEntArray(localClientNum, "exteriorfog_trigger", "targetname"); + array_thread( exterior_array, ::fog_trigger, ::exterior_fog_change, 0); +} +fog_trigger(change_func, inside_val) +{ + while(1) + { + self waittill("trigger", who); + who.inside = inside_val; + if(who IsLocalPlayer()) + { + self thread trigger_thread( who, change_func); + } + } +} +exterior_fog_change(ent_player) +{ + if(!isDefined(ent_player)) + { + return; + } + ent_player endon("entityshutdown"); + if(level.blizzard == true) + { + start_dist = 120; + half_dist = 250; + half_height = 700.242; + base_height = 976.119; + fog_r = 0.137255; + fog_g = 0.192157; + fog_b = 0.239216; + fog_scale = 7; + sun_col_r = 0.760784; + sun_col_g = 0.796079; + sun_col_b = 0.807843; + sun_dir_x = -0.862899; + sun_dir_y = 0.264579; + sun_dir_z = 0.430586; + sun_start_ang = 0; + sun_stop_ang = 0; + time = 10; + max_fog_opacity = 1; + setVolFogForClient(ent_player GetLocalClientNumber(),start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + } +} +lighthouse_fog_change(ent_player) +{ + if(!isDefined(ent_player)) + { + return; + } + ent_player endon("entityshutdown"); + if(level.blizzard == true) + { + start_dist = 251.982; + half_dist = 700; + half_height = 697.379; + base_height = 1000.6; + fog_r = 0.235294; + fog_g = 0.290196; + fog_b = 0.337255; + fog_scale = 10; + sun_col_r = 0.760784; + sun_col_g = 0.796079; + sun_col_b = 0.807843; + sun_dir_x = -0.862899; + sun_dir_y = 0.264579; + sun_dir_z = 0.430586; + sun_start_ang = 0; + sun_stop_ang = 0; + time = 10; + max_fog_opacity = 0.97; + setVolFogForClient(ent_player GetLocalClientNumber(),start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + } +} +shipfront_fog_change(ent_player) +{ + if(!isDefined(ent_player)) + { + return; + } + ent_player endon("entityshutdown"); + if(level.blizzard == true) + { + start_dist = 80; + half_dist = 1700; + half_height = 697.379; + base_height = 1000.6; + fog_r = 0.235294; + fog_g = 0.290196; + fog_b = 0.337255; + fog_scale = 10; + sun_col_r = 0.760784; + sun_col_g = 0.796079; + sun_col_b = 0.807843; + sun_dir_x = -0.862899; + sun_dir_y = 0.264579; + sun_dir_z = 0.430586; + sun_start_ang = 0; + sun_stop_ang = 0; + time = 10; + max_fog_opacity = 0.97; + setVolFogForClient(ent_player GetLocalClientNumber(),start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + } +} +shipback_fog_change(ent_player) +{ + if(!isDefined(ent_player)) + { + return; + } + ent_player endon("entityshutdown"); + if(level.blizzard == true) + { + start_dist = 251.982; + half_dist = 700; + half_height = 697.379; + base_height = 1000.6; + fog_r = 0.235294; + fog_g = 0.290196; + fog_b = 0.337255; + fog_scale = 10; + sun_col_r = 0.760784; + sun_col_g = 0.796079; + sun_col_b = 0.807843; + sun_dir_x = -0.862899; + sun_dir_y = 0.264579; + sun_dir_z = 0.430586; + sun_start_ang = 0; + sun_stop_ang = 0; + time = 10; + max_fog_opacity = 0.97; + setVolFogForClient(ent_player GetLocalClientNumber(),start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + } +} +shipIce_fog_change(ent_player) +{ + if(!isDefined(ent_player)) + { + return; + } + ent_player endon("entityshutdown"); + if(level.blizzard == true) + { + start_dist = 220; + half_dist = 2300; + half_height = 697.379; + base_height = 1000.6; + fog_r = 0.235294; + fog_g = 0.290196; + fog_b = 0.337255; + fog_scale = 10; + sun_col_r = 0.760784; + sun_col_g = 0.796079; + sun_col_b = 0.807843; + sun_dir_x = -0.862899; + sun_dir_y = 0.264579; + sun_dir_z = 0.430586; + sun_start_ang = 0; + sun_stop_ang = 0; + time = 10; + max_fog_opacity = 0.97; + setVolFogForClient(ent_player GetLocalClientNumber(), start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + } +} +coast_fog_blizzard(localClientNum, set,newEnt) +{ + if(!self isLocalPlayer() ) + { + return; + } + if(!isDefined(self GetLocalClientNumber() )) + { + return; + } + if(localClientNum != 0) + { + return; + } + if(set) + { + level.blizzard = true; + if(IsDefined(self.inside) && self.inside == 1) + { + println("*** Client :(fog) blizzard started while inside lighthouse"); + lighthouse_fog_change( self ); + } + else if(IsDefined(self.inside) && self.inside == 2) + { + println("*** Client :(fog) blizzard started while inside shipfront"); + shipfront_fog_change( self ); + } + else if(IsDefined(self.inside) && self.inside == 3) + { + println("*** Client :(fog) blizzard started while inside shipback"); + shipback_fog_change( self ); + } + else if(IsDefined(self.inside) && self.inside == 4) + { + println("*** Client :(fog) blizzard started while inside shipback"); + shipIce_fog_change( self ); + } + else + { + println("*** Client :(fog) blizzard started while outside"); + exterior_fog_change( self ); + } + } + else + { + level.blizzard = false; + start_dist = 500; + half_dist = 1700; + half_height = 697.379; + base_height = 1000.6; + fog_r = 0.235294; + fog_g = 0.290196; + fog_b = 0.337255; + fog_scale = 10; + sun_col_r = 0.760784; + sun_col_g = 0.796079; + sun_col_b = 0.807843; + sun_dir_x = -0.862899; + sun_dir_y = 0.264579; + sun_dir_z = 0.430586; + sun_start_ang = 0; + sun_stop_ang = 0; + time = 10; + max_fog_opacity = 1; + setVolFogForClient(self GetLocalClientNumber(), start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/zombie_coast_lighthouse.csc b/BO1/PC/ZM/clientscripts/zombie_coast_lighthouse.csc new file mode 100644 index 0000000..67f786d Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_coast_lighthouse.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_cod5_asylum.csc b/BO1/PC/ZM/clientscripts/zombie_cod5_asylum.csc new file mode 100644 index 0000000..4e8a176 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_cod5_asylum.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_cod5_factory.csc b/BO1/PC/ZM/clientscripts/zombie_cod5_factory.csc new file mode 100644 index 0000000..ec5a106 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_cod5_factory.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_cod5_factory_amb.csc b/BO1/PC/ZM/clientscripts/zombie_cod5_factory_amb.csc new file mode 100644 index 0000000..b91ca7b --- /dev/null +++ b/BO1/PC/ZM/clientscripts/zombie_cod5_factory_amb.csc @@ -0,0 +1,299 @@ + +#include clientscripts\_utility; +#include clientscripts\_ambientpackage; +#include clientscripts\_music; +#include clientscripts\_audio; +main() +{ + declareAmbientRoom( "outside" ); + declareAmbientPackage( "outside" ); + setAmbientRoomReverb( "outside", "RV_ZOMBIES_OUTDOOR", 1, 1 ); + setAmbientRoomContext( "outside", "ringoff_plr", "outdoor" ); + setAmbientRoomTone( "outside", "ghost_wind", 1.5, 2 ); + addAmbientElement( "outside", "ember", .1, .6, 50, 150 ); + declareAmbientRoom( "int_small_room" ); + declareAmbientPackage( "int_small_pkg" ); + setAmbientRoomReverb ("int_small_room","RV_ZOMBIES_MEDIUM_ROOM", 1, 1 ); + setAmbientRoomContext( "int_small_room", "ringoff_plr", "indoor" ); + declareAmbientRoom( "int_large_room" ); + declareAmbientPackage( "int_large_pkg" ); + setAmbientRoomReverb ("int_large_room","RV_ZOMBIES_LARGE_ROOM", 1, 1 ); + setAmbientRoomContext( "int_large_room", "ringoff_plr", "indoor" ); + declareAmbientRoom( "darkroom" ); + declareAmbientPackage( "darkroom" ); + setAmbientRoomReverb ("darkroom","RV_ZOMBIES_MEDIUM_ROOM", 1, 1 ); + setAmbientRoomContext( "darkroom", "ringoff_plr", "indoor" ); + activateAmbientPackage( 0, "outside", 0 ); + activateAmbientRoom( 0, "outside", 0 ); + declareMusicState("SPLASH_SCREEN"); + musicAlias("mx_splash_screen", 12); + musicwaittilldone(); + declareMusicState("WAVE"); + musicAliasloop("mus_zombie_wave_loop", 0, 4); + declareMusicState("EGG"); + musicAlias("mus_factory_egg", 1 ); + declareMusicState( "SILENCE" ); + musicAlias("null", 1 ); + thread clientscripts\_waw_zombiemode_radio::init(); + thread start_lights(); + thread teleport_pad_init(0); + thread teleport_pad_init(1); + thread teleport_pad_init(2); + thread teleport_2d(); + thread pa_init(0); + thread pa_init(1); + thread pa_init(2); + thread pa_single_init(); + thread pole_fx_audio_init(0); + thread pole_fx_audio_init(1); + thread pole_fx_audio_init(2); + thread homepad_loop(); + thread power_audio_2d(); + thread linkall_2d(); +} +start_lights() +{ + level waittill ("pl1"); + array_thread(getstructarray( "dyn_light", "targetname" ), ::light_sound); + array_thread(getstructarray( "switch_progress", "targetname" ), ::switch_progress_sound); + array_thread(getstructarray( "dyn_generator", "targetname" ), ::generator_sound); + array_thread(getstructarray( "dyn_breakers", "targetname" ), ::breakers_sound); +} +light_sound() +{ + if(isdefined( self ) ) + { + playsound(0,"light_start", self.origin); + e1 = clientscripts\_audio::playloopat(0,"light",self.origin); + } +} +generator_sound() +{ + if(isdefined( self ) ) + { + wait(3); + playsound(0, "switch_progress", self.origin); + playsound(0, "gen_start", self.origin); + g1 = clientscripts\_audio::playloopat(0,"gen_loop",self.origin, 1); + } +} +breakers_sound() +{ + if(isdefined( self ) ) + { + playsound(0, "break_start", self.origin); + b1 = clientscripts\_audio::playloopat(0,"break_loop",self.origin, 2); + } +} +switch_progress_sound() +{ + if(isdefined( self.script_noteworthy ) ) + { + if( self.script_noteworthy == "1" ) + time = .5; + else if( self.script_noteworthy == "2" ) + time = 1; + else if( self.script_noteworthy == "3" ) + time = 1.5; + else if( self.script_noteworthy == "4" ) + time = 2; + else if( self.script_noteworthy == "5" ) + time = 2.5; + else + time = 0; + wait(time); + playsound(0, "switch_progress", self.origin); + } +} +homepad_loop() +{ + level waittill( "pap1" ); + homepad = getstruct( "homepad_power_looper", "targetname" ); + home_breaker = getstruct( "homepad_breaker", "targetname" ); + if(isdefined( homepad )) + { + clientscripts\_audio::playloopat( 0, "homepad_power_loop", homepad.origin, 1 ); + } + if(isdefined( home_breaker ) ) + { + clientscripts\_audio::playloopat( 0, "break_arc", home_breaker.origin, 1 ); + } +} +teleport_pad_init( pad ) +{ + telepad = getstructarray( "telepad_" + pad, "targetname" ); + telepad_loop = getstructarray( "telepad_" + pad + "_looper", "targetname" ); + homepad = getstructarray( "homepad", "targetname" ); + level waittill( "tp" + pad); + array_thread( telepad_loop, ::telepad_loop ); + array_thread( telepad, ::teleportation_audio, pad ); + array_thread( homepad, ::teleportation_audio, pad ); +} +telepad_loop() +{ + clientscripts\_audio::playloopat( 0, "power_loop", self.origin, 1 ); +} +teleportation_audio( pad ) +{ + teleport_delay = 2; + while(1) + { + level waittill( "tpw" + pad ); + if(IsDefined( self.script_sound )) + { + if(self.targetname == "telepad_" + pad) + { + playsound( 0, self.script_sound + "_warmup", self.origin ); + realwait(teleport_delay); + playsound( 0, self.script_sound + "_cooldown", self.origin ); + } + if(self.targetname == "homepad") + { + realwait(teleport_delay); + playsound( 0, self.script_sound + "_warmup", self.origin ); + playsound( 0, self.script_sound + "_cooldown", self.origin ); + } + } + } +} +pa_init( pad ) +{ + pa_sys = getstructarray( "pa_system", "targetname" ); + array_thread( pa_sys, ::pa_teleport, pad ); + array_thread( pa_sys, ::pa_countdown, pad ); + array_thread( pa_sys, ::pa_countdown_success, pad ); +} +pa_single_init() +{ + pa_sys = getstructarray( "pa_system", "targetname" ); + array_thread( pa_sys, ::pa_electric_trap, "bridge" ); + array_thread( pa_sys, ::pa_electric_trap, "wuen" ); + array_thread( pa_sys, ::pa_electric_trap, "warehouse" ); + array_thread( pa_sys, ::pa_level_start ); + array_thread( pa_sys, ::pa_power_on ); +} +pa_countdown( pad ) +{ + level endon( "scd" + pad ); + while(1) + { + level waittill( "pac" + pad ); + playsound( 0, "pa_buzz", self.origin ); + self thread pa_play_dialog( "pa_audio_link_start" ); + count = 30; + while ( count > 0 ) + { + play = count == 20 || count == 15 || count <= 10; + if ( play ) + { + playsound( 0, "pa_audio_link_" + count, self.origin ); + } + playsound( 0, "clock_tick_1sec", (0,0,0) ); + realwait( 1 ); + count--; + } + playsound( 0, "pa_buzz", self.origin ); + wait(1.2); + self thread pa_play_dialog( "pa_audio_link_fail" ); + } + wait(1); +} +pa_countdown_success( pad ) +{ + level waittill( "scd" + pad ); + playsound( 0, "pa_buzz", self.origin ); + wait(1.2); + self pa_play_dialog( "pa_audio_act_pad_" + pad ); +} +pa_teleport( pad ) +{ + while(1) + { + level waittill( "tpc" + pad ); + wait(1); + playsound( 0, "pa_buzz", self.origin ); + wait(1.2); + self pa_play_dialog( "pa_teleport_finish" ); + } +} +pa_electric_trap( location ) +{ + while(1) + { + level waittill( location ); + playsound( 0, "pa_buzz", self.origin ); + wait(1.2); + self thread pa_play_dialog( "pa_trap_inuse_" + location ); + realwait(48.5); + playsound( 0, "pa_buzz", self.origin ); + wait(1.2); + self thread pa_play_dialog( "pa_trap_active_" + location ); + } +} +pa_play_dialog( alias ) +{ + if( !IsDefined( self.pa_is_speaking ) ) + { + self.pa_is_speaking = 0; + } + if( self.pa_is_speaking != 1 ) + { + self.pa_is_speaking = 1; + self.pa_id = playsound( 0, alias, self.origin ); + while( SoundPlaying( self.pa_id ) ) + { + wait( 0.01 ); + } + self.pa_is_speaking = 0; + } +} +teleport_2d() +{ + while(1) + { + level waittill( "t2d" ); + playsound( 0, "teleport_2d_fnt", (0,0,0) ); + playsound( 0, "teleport_2d_rear", (0,0,0) ); + } +} +power_audio_2d() +{ + wait(2); + playsound( 0, "power_down_2d", (0,0,0) ); + level waittill ("pl1"); + playsound( 0, "power_up_2d", (0,0,0) ); +} +linkall_2d() +{ + level waittill( "pap1" ); + playsound( 0, "linkall_2d", (0,0,0) ); +} +pole_fx_audio_init( pad ) +{ + pole = getstructarray( "pole_fx_" + pad, "targetname" ); + array_thread( pole, ::pole_fx_audio, pad ); +} +pole_fx_audio( pad ) +{ + level waittill( "scd" + pad ); + while(1) + { + playfx(0, level._effect["zombie_elec_pole_terminal"], self.origin, anglestoforward( self.angles ) ); + playsound(0,"pole_spark", self.origin ); + realwait(randomintrange(2,7)); + } +} +pa_level_start() +{ + wait(2); + playsound( 0, "pa_buzz", self.origin ); + wait(1.2); + self pa_play_dialog( "pa_level_start" ); +} +pa_power_on() +{ + level waittill ("pl1"); + playsound( 0, "pa_buzz", self.origin ); + wait(1.2); + self pa_play_dialog( "pa_power_on" ); +} \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/zombie_cod5_factory_fx.csc b/BO1/PC/ZM/clientscripts/zombie_cod5_factory_fx.csc new file mode 100644 index 0000000..f2c302f --- /dev/null +++ b/BO1/PC/ZM/clientscripts/zombie_cod5_factory_fx.csc @@ -0,0 +1,561 @@ + +#include clientscripts\_utility; +#include clientscripts\_fx; +#include clientscripts\_music; +main() +{ + clientscripts\createfx\zombie_cod5_factory_fx::main(); + clientscripts\_fx::reportNumEffects(); + footsteps(); + precache_scripted_fx(); + precache_createfx_fx(); + level thread trap_fx_monitor("warehouse_trap","warehouse"); + level thread trap_fx_monitor("wuen_trap", "wuen"); + level thread trap_fx_monitor("bridge_trap", "bridge"); + disableFX = GetDvarInt( "disable_fx" ); + if( !IsDefined( disableFX ) || disableFX <= 0 ) + { + precache_scripted_fx(); + } + level thread perk_wire_fx( "pw0", "pad_0_wire", "t01" ); + level thread perk_wire_fx( "pw1", "pad_1_wire", "t11" ); + level thread perk_wire_fx( "pw2", "pad_2_wire", "t21" ); + level thread teleporter_map_light( "sm_light_tp_0", "t01" ); + level thread teleporter_map_light( "sm_light_tp_1", "t11" ); + level thread teleporter_map_light( "sm_light_tp_2", "t21" ); + level.map_light_receiver_on = false; + level thread teleporter_map_light_receiver(); + level thread dog_start_monitor(); + level thread dog_stop_monitor(); + level thread level_fog_init(); + level thread light_model_swap( "smodel_light_electric", "lights_indlight_on" ); + level thread light_model_swap( "smodel_light_electric_milit", "lights_milit_lamp_single_int_on" ); + level thread light_model_swap( "smodel_light_electric_tinhatlamp", "lights_tinhatlamp_on" ); + level thread flytrap_lev_objects(); +} +trap_fx_monitor(name,side) +{ + while(1) + { + level waittill(name); + fire_points = getstructarray(name,"targetname"); + for(i=0;i 0 ) + { + guide = guide_structs[0]; + dist = DistanceSquared(ent.origin, guide.origin); + for ( i=1; i= spots.size ) + { + index = 0; + } + if ( index == start_index ) + { + interval = interval - 0.1; + z_increment = 15; + } + if ( interval <= 0.1 && index == 0 ) + { + stop_spinning = true; + } + offset = offset + z_increment; + self MoveTo( spots[index].origin+(0,0,offset), interval ); + wait( interval ); + } + end_spot = GetStruct( "trap_flyaway_spot", "targetname" ); + self MoveTo( end_spot.origin+(RandomFloatRange(-100,100),0,0), 5 ); + playsound( 0, "shoot_off", self.origin ); + wait( 4.7 ); + level notify( "delete_sound_ent" ); + deletefakeent(0,sound_ent); + self delete(); +} +flytrap_audio_mover( sound_ent ) +{ + level endon( "delete_sound_ent" ); + while (1) + { + realwait(0.05); + setfakeentorg( 0, sound_ent, self.origin); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/zombie_cod5_factory_teleporter.csc b/BO1/PC/ZM/clientscripts/zombie_cod5_factory_teleporter.csc new file mode 100644 index 0000000..20ebc3a Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_cod5_factory_teleporter.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_cod5_prototype_amb.csc b/BO1/PC/ZM/clientscripts/zombie_cod5_prototype_amb.csc new file mode 100644 index 0000000..2b0190c Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_cod5_prototype_amb.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_cod5_prototype_fx.csc b/BO1/PC/ZM/clientscripts/zombie_cod5_prototype_fx.csc new file mode 100644 index 0000000..ef72c6d Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_cod5_prototype_fx.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_cod5_sumpf.csc b/BO1/PC/ZM/clientscripts/zombie_cod5_sumpf.csc new file mode 100644 index 0000000..98b4ed5 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_cod5_sumpf.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_cosmodrome.csc b/BO1/PC/ZM/clientscripts/zombie_cosmodrome.csc new file mode 100644 index 0000000..8f6f29c --- /dev/null +++ b/BO1/PC/ZM/clientscripts/zombie_cosmodrome.csc @@ -0,0 +1,1854 @@ +#include clientscripts\_utility; +#include clientscripts\_music; +#include clientscripts\_zombiemode_weapons; +main() +{ + level thread clientscripts\zombie_cosmodrome_ffotd::main_start(); + level._uses_crossbow = true; + level._power_on = false; + level.rocket_num = 0; + level._visionset_map_nopower = "zombie_cosmodrome_nopower"; + level._visionset_priority_map_nopower = 1; + level._visionset_map_sudden_power = "zombie_cosmodrome_powerUP"; + level._visionset_priority_map_sudden_power = 2; + level._visionset_map_poweron = "zombie_cosmodrome_powerON"; + level._visionset_priority_map_poweron = 3; + level._visionset_map_monkey = "zombie_cosmodrome_monkey"; + level._visionset_priority_map_monkey = 4; + level._visionset_map_begin = "zombie_cosmodrome_begin"; + level._visionset_priority_map_begin = 5; + level._visionset_map_monkeylandon = "flare"; + level._visionset_priority_map_monkeylandon = 6; + level._visionset_monkey_transition_time_on = 0.5; + level._visionset_monkey_transition_time_off = 3.0; + level._visionset_zombie_sudden_power_transition_time = 0.1; + level._visionset_zombie_transition_time = 2.5; + level._fog_settings_monkey = "monkey"; + level._fog_settings_monkey_priority = 3; + level._fog_settings_lander = "lander"; + level._fog_settings_lander_priority = 2; + level._fog_settings_default = "normal"; + level._fog_settings_default_priority = 1; + include_weapons(); + PreCacheRumble( "damage_heavy" ); + PrecacheRumble( "explosion_generic" ); + clientscripts\_zombiemode::main(); + register_clientflag_callback("actor", 0, ::actor_flag_soulpull_handler); + register_clientflag_callback("scriptmover", 0, ::rocket_fx); + register_clientflag_callback("scriptmover", 1, ::lander_engine_fx); + register_clientflag_callback("scriptmover", 2, ::lander_status_light); + register_clientflag_callback("scriptmover", 3, ::launch_panel_centrifuge_status); + register_clientflag_callback("scriptmover", 4, ::launch_panel_baseentry_status); + register_clientflag_callback("scriptmover", 5, ::launch_panel_storage_status); + register_clientflag_callback("scriptmover", 6, ::launch_panel_catwalk_status); + register_clientflag_callback("scriptmover", 7, ::lander_rumble_and_quake); + level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_RUMBLE = 8; + register_clientflag_callback( "scriptmover", level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_RUMBLE, ::centrifuge_rumble_control ); + register_clientflag_callback("scriptmover", 9, ::lander_move_fx); + register_clientflag_callback("player", 0 , ::player_lander_fog); + level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_LIGHTS = 11; + register_clientflag_callback( "scriptmover", level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_LIGHTS, ::centrifuge_warning_lights_init ); + level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_MONKEY_LANDER_FX = 12; + register_clientflag_callback( "scriptmover", level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_MONKEY_LANDER_FX, ::monkey_lander_fx ); + level thread catwalk_lander_doors(); + level thread base_entry_lander_doors(); + level thread storage_lander_doors(); + level thread centrifuge_lander_doors(); + level thread lander_station_think(); + level thread setup_fog(); + level thread init_rocket_debris(); + clientscripts\_zombiemode_weap_black_hole_bomb::init(); + clientscripts\zombie_cosmodrome_fx::main(); + thread clientscripts\zombie_cosmodrome_amb::main(); + clientscripts\_zombiemode_deathcard::init(); + level init_cosmodrome_box_screens(); + OnPlayerConnect_Callback( ::cosmo_on_player_connect ); + OnPlayerSpawned_Callback( ::cosmo_on_player_spawned ); + waitforclient(0); + level thread cosmodrome_ZPO_listener(); + level thread cosmodrome_monkey_round_start_listener(); + register_zombie_types(); + level thread radar_dish_init(); + players = GetLocalPlayers(); + for ( i=0; i 1.0 ) + { + return LineEnd; + } + else + { + start_x = LineStart[0] + t * ( LineEnd[0] - LineStart[0] ); + start_y = LineStart[1] + t * ( LineEnd[1] - LineStart[1] ); + start_z = LineStart[2] + t * ( LineEnd[2] - LineStart[2] ); + return (start_x,start_y,start_z); + } +} +plane_position_updater (fake_ent, plane) +{ + apex = 5000; + soundid = -1; + dx = undefined; + last_time = undefined; + last_pos = undefined; + start_time = 0; + while(IsDefined(plane)) + { + setfakeentorg(0, fake_ent, plane.origin); + if((soundid < 0) && isdefined(last_pos)) + { + dx = plane.origin - last_pos; + if(length(dx) > .01) + { + velocity = dx / (getrealtime()-last_time); + assert(isdefined(velocity)); + players = getlocalplayers(); + assert(isdefined(players)); + other_point = plane.origin + (velocity * 100000); + player_origin = players[0] GetOrigin(); + if( !isDefined( player_origin ) ) + { + continue; + } + point = closest_point_on_line_to_point(player_origin, plane.origin, other_point ); + assert(isdefined(point)); + dist = Distance( point, plane.origin ); + assert(isdefined(dist)); + time = dist / length(velocity); + assert(isdefined(time)); + if(time < apex) + { + soundid = playloopsound(0, fake_ent, "veh_mig_flyby", 0 ); + playsound (0, "veh_mig_flyby_lfe", (0,0,0)); + start_time = getRealTime(); + } + } + } + last_pos = plane.origin; + last_time = GetRealTime(); + if(start_time != 0) + { + } + wait(0.1); + } + deletefakeent(0, fake_ent); +} +migs_fly_by() +{ + points = getstructarray("spawn_flyby","targetname"); + while(1) + { + point = random(points); + planes = []; + fake_ent_planes = []; + planes[0] = spawn(0,point.origin,"script_origin"); + planes[0] setmodel("t5_veh_jet_mig17"); + planes[0].angles = point.angles; + fake_ent_planes[0] = spawnfakeent( 0 ); + wait(.1); + if(randomint(100) > 50 ) + { + planes[1] = spawn(0,point.origin + ( -1100,0,0),"script_origin"); + planes[1].angles = point.angles; + planes[1] setmodel("t5_veh_jet_mig17"); + fake_ent_planes[1] = spawnfakeent( 0 ); + wait(.1); + if(randomint(100) > 50 ) + { + planes[2] = spawn(0,point.origin + ( 1100,0,0),"script_origin"); + planes[2].angles = point.angles; + planes[2] setmodel("t5_veh_jet_mig17"); + fake_ent_planes[2] = spawnfakeent( 0 ); + wait(.1); + } + } + for(i=0;i 2 && i == 0) + { + wait(.35); + } + } + playsound (0, "veh_mig_flyby_2d", (0,0,0)); + for(i=0;i RandomInt( 100 ) && IsDefined( level.magic_box_tv_random ) ) + { + self SetModel( level.magic_box_tv_random[ RandomInt( level.magic_box_tv_random.size ) ] ); + wait( 2.0 ); + } + wait( 1.0 ); + } +} +play_magic_box_tv_audio( state ) +{ + alias = "amb_tv_static"; + if( state == "n" ) + { + if( level._power_on == false ) + { + alias = undefined; + } + else + { + alias = "amb_tv_static"; + } + } + else if( state == "f" ) + { + alias = "mus_fire_sale"; + } + else + { + alias = "amb_tv_static"; + } + if( !IsDefined(alias) ) + { + self stoploopsound( .5 ); + } + else + { + self PlayLoopSound( alias, .5 ); + } +} +monkey_start_monitor() +{ + while( 1 ) + { + level waittill( "monkey_start" ); + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_monkey, level._visionset_priority_map_monkey ); + players[i] fog_apply( "monkey",level._fog_settings_monkey_priority ); + } + level._effect["eye_glow"] = level._effect["monkey_eye_glow"]; + } +} +monkey_stop_monitor() +{ + while( 1 ) + { + level waittill( "monkey_stop" ); + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] clientscripts\_zombiemode::zombie_vision_set_remove( level._visionset_map_monkey ); + players[i] fog_remove( "monkey" ); + } + level._effect["eye_glow"] = level._effect["zombie_eye_glow"]; + } +} +monkey_land_on() +{ + while ( 1 ) + { + level waittill( "MLO" ); + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_monkeylandon, level._visionset_priority_map_monkeylandon, level._visionset_monkey_transition_time_on ); + } + wait( 0.05 ); + } +} +monkey_land_off() +{ + while ( 1 ) + { + level waittill( "MLF" ); + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] clientscripts\_zombiemode::zombie_vision_set_remove( level._visionset_map_monkeylandon, level._visionset_monkey_transition_time_off ); + } + wait( 0.05 ); + } +} +cosmo_on_player_connect( int_local_client_num ) +{ + self endon( "disconnect" ); + while( !ClientHasSnapshot( int_local_client_num ) ) + { + wait( 0.05 ); + } + if( int_local_client_num != 0 ) + { + return; + } + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] thread cosmodrome_first_vision_set( i ); + } +} +cosmo_on_player_spawned( int_local_client_num ) +{ + self endon( "disconnect" ); + while ( !self hasdobj( int_local_client_num ) ) + { + wait( 0.05 ); + } + if( int_local_client_num != 0 ) + { + return; + } + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] cosmodrome_vision_set( i ); + players[i] fog_apply( "normal", level._fog_settings_default_priority ); + } +} +cosmodrome_first_vision_set( int_client_num ) +{ + self endon( "disconnect" ); + self clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_begin, level._visionset_priority_map_begin, 0.1, int_client_num ); + self clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_nopower, level._visionset_priority_map_nopower, 0.1, int_client_num ); + level waittill( "ZID" ); + self clientscripts\_zombiemode::zombie_vision_set_remove( level._visionset_map_begin, 8.5, int_client_num ); +} +cosmodrome_vision_set( int_client_num ) +{ + self endon( "disconnect" ); + if( level._power_on == true ) + { + self thread clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_poweron, level._visionset_priority_map_poweron, level._visionset_zombie_transition_time, int_client_num ); + } + else + { + self thread clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_nopower, level._visionset_priority_map_nopower, 0, int_client_num ); + } +} +cosmodrome_power_vision_set_swap() +{ + level waittill( "ZPO" ); + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_sudden_power, level._visionset_priority_map_sudden_power, level._visionset_zombie_sudden_power_transition_time, i ); + } + wait( 1.0 ); + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] clientscripts\_zombiemode::zombie_vision_set_apply( level._visionset_map_poweron, level._visionset_priority_map_poweron, level._visionset_zombie_transition_time, i ); + } +} +catwalk_lander_doors() +{ + level thread catwalk_lander_doors_only(); + while(1) + { + level waittill("CW_O"); + level thread open_lander_bay_doors("catwalk_zip_door"); + level waittill("CW_C"); + level thread close_lander_bay_doors("catwalk_zip_door"); + } +} +catwalk_lander_doors_only() +{ + while(1) + { + level waittill("CWD"); + level thread open_lander_bay_doors_only("catwalk_zip_door"); + } +} +base_entry_lander_doors() +{ + level thread base_entry_lander_doors_only(); + while(1) + { + level waittill("BE_O"); + level thread open_lander_bay_doors("base_entry_zip_door"); + level waittill("BE_C"); + level thread close_lander_bay_doors("base_entry_zip_door"); + } +} +base_entry_lander_doors_only() +{ + while(1) + { + level waittill("BED"); + level thread open_lander_bay_doors_only("base_entry_zip_door"); + } +} +storage_lander_doors() +{ + level thread storage_lander_doors_only(); + while(1) + { + level waittill("S_O"); + level thread open_lander_bay_doors("storage_zip_door"); + level waittill("S_C"); + level thread close_lander_bay_doors("storage_zip_door"); + } +} +storage_lander_doors_only() +{ + while(1) + { + level waittill("SOD"); + level thread open_lander_bay_doors_only("storage_zip_door"); + } +} +centrifuge_lander_doors() +{ + level thread centrifuge_lander_doors_only(); + while(1) + { + level waittill("CF_O"); + level thread open_lander_bay_doors("centrifuge_zip_door"); + level waittill("CF_C"); + level thread close_lander_bay_doors("centrifuge_zip_door"); + } +} +centrifuge_lander_doors_only() +{ + while(1) + { + level waittill("CFD"); + level thread open_lander_bay_doors_only("centrifuge_zip_door"); + } +} +open_lander_bay_doors(door_name) +{ + println("***** -- Opening door"); + players = GetLocalPlayers(); + sound_count = 0; + for(x=0;x 50 ) + { + side = AnglesToRight(self.angles); + } + else + { + side = AnglesToRight(self.angles) * - 1; + } + side = vector_scale( side, RandomIntRange( side_min, side_max ) ); + point = self.origin + fwd + side; + trace = bullettrace(point,point + (0,0,-10000),false,undefined); + return trace["position"]; +} +rain_debris(clientnum) +{ + rocket_debris = getentarray(clientnum,"rocket_explode_debris","targetname"); + for(i=0;i<10;i++) + { + spot = self get_random_spot_in_player_view(1000,3500,50,1000); + debris = spawn(clientnum,spot + (0,0,10000),"script_model"); + debris.angles = (randomint(360),randomint(360),randomint(360));; + debris setmodel(random(rocket_debris).model); + debris thread debris_crash_and_burn(spot,clientnum,self); + wait(randomfloatrange(.5,1.5)); + } +} +debris_crash_and_burn(spot,client,player) +{ + playfxontag(client,level._effect["debris_trail"] ,self,"tag_origin"); + self moveto(spot,3.1); + for(i=0;i<10;i++) + { + self rotateto( (randomint(360),randomint(360),randomint(360)),.3); + wait(.3); + } + wait(3.1); + player earthquake(0.4,0.5,self.origin,1200); + playfx( client, level._effect["debris_hit"], self.origin ); + wait(1); + self delete(); +} +setup_lander_screens(clientnum) +{ + screens = GetEntArray( clientnum,"lander_screens","targetname"); + for(i=0;i (1500 * 1500)) + { + wait(.1); + continue; + } + dist = distancesquared ( player.origin,self.origin); + if(dist > 750*750 ) + { + player Earthquake( RandomFloatRange( 0.1, 0.15 ), RandomFloatRange(0.15, 0.16), self.origin, 1000 ); + rumble = "slide_rumble"; + } + else + { + player Earthquake( RandomFloatRange( 0.15, 0.2 ), RandomFloatRange(0.15, 0.16), self.origin, 750 ); + rumble = "damage_light"; + } + player PlayRumbleOnEntity(localClientNum,rumble); + wait(.1); + } +} +centrifuge_rumble_control( local_client_num, set, newEnt ) +{ + if( local_client_num != 0 ) + { + return; + } + if( set ) + { + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] thread centrifuge_rumble_when_close( self, i ); + } + } + else + { + level notify( "centrifuge_rumble_done" ); + } +} +centrifuge_rumble_when_close( ent_centrifuge, int_client_num ) +{ + self endon( "death" ); + self endon( "disconnect" ); + level endon( "centrifuge_rumble_done" ); + rumble_range = 600*600; + centrifuge_rumble = "damage_heavy"; + client_num = undefined; + while( IsDefined(self) ) + { + distance_to_centrifuge = DistanceSquared( self.origin, ent_centrifuge.origin ); + if( ( distance_to_centrifuge < rumble_range ) && IsDefined(self)) + { + if( IsDefined( int_client_num ) ) + { + self PlayRumbleOnEntity( int_client_num, centrifuge_rumble ); + } + } + if( ( distance_to_centrifuge > rumble_range ) ) + { + if( IsDefined( int_client_num ) && IsDefined(self)) + { + self StopRumble( int_client_num, centrifuge_rumble ); + } + } + wait( 0.1 ); + } +} +centrifuge_clean_rumble( int_client_num ) +{ + self endon( "death" ); + self endon( "disconnect" ); + self StopRumble( int_client_num, "damage_heavy" ); +} +centrifuge_warning_lights_init( local_client_num, set, newEnt ) +{ + while( !self hasdobj( local_client_num ) ) + { + wait(0.1); + } + if( local_client_num != 0 ) + { + return; + } + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + self centrifuge_warning_lights_off( i ); + } + if( set ) + { + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + self centrifuge_fx_spot_init( i ); + self centrifuge_warning_lights_on( i ); + } + } +} +monkey_lander_fx_on() +{ + self endon("switch_off_monkey_lander_fx"); + PlaySound(0, "zmb_ape_intro_whoosh", self.origin); + realWait( 2.5 ); + self.fx = []; + players = getlocalplayers(); + ent_num = self GetEntityNumber(); + for(i = 0; i < players.size; i ++) + { + player = players[i]; + if(!IsDefined(player._monkey_lander_fx)) + { + player._monkey_lander_fx = []; + } + if(IsDefined(player._monkey_lander_fx[ent_num])) + { + DeleteFX(i, player._monkey_lander_fx[ent_num]); + player._monkey_lander_fx[ent_num] = undefined; + } + player._monkey_lander_fx[ent_num] = PlayFXOnTag(i, level._effect["monkey_trail"],self,"tag_origin"); + } +} +monkey_lander_delay_fx_off() +{ + realWait( 5 ); + self notify("switch_off_monkey_lander_fx"); + players = getlocalplayers(); + ent_num = self GetEntityNumber(); + for(i = 0; i < players.size; i ++) + { + player = players[i]; + if(IsDefined(player._monkey_lander_fx[ent_num])) + { + DeleteFX(i, player._monkey_lander_fx[ent_num]); + player._monkey_lander_fx[ent_num] = undefined; + } + } +} +monkey_lander_fx_off() +{ + self thread monkey_lander_delay_fx_off(); + players = getlocalplayers(); + ent_num = self GetEntityNumber(); + for(i = 0; i < players.size; i ++) + { + player = players[i]; + PlayFX(i, level._effect["monkey_spawn"], self.origin ); + PlayRumbleOnPosition( i, "explosion_generic", self.origin ); + player Earthquake( 0.5, 0.5, player.origin, 1000 ); + } + PlaySound( 0, "zmb_ape_intro_land", self.origin ); + level notify( "MLO" ); + wait( 0.5 ); + level notify ( "MLF" ); +} +monkey_lander_fx(local_client_num, set, newEnt) +{ + if( local_client_num != 0 ) + { + return; + } + while( !self hasdobj( local_client_num ) ) + { + wait(0.1); + } + if(set) + { + self thread monkey_lander_fx_on(); + } + else + { + self thread monkey_lander_fx_off(); + } +} +centrifuge_fx_spot_init( int_client_num ) +{ + self._centrifuge_lights_[int_client_num] = []; + self._centrifuge_lights_[int_client_num] = add_to_array( self._centrifuge_lights_[int_client_num], "tag_light_bk_top", false ); + self._centrifuge_lights_[int_client_num] = add_to_array( self._centrifuge_lights_[int_client_num], "tag_light_fnt_top", false ); + self._centrifuge_sparks_[int_client_num] = []; + self._centrifuge_sparks_[int_client_num] = add_to_array( self._centrifuge_sparks_[int_client_num], "tag_light_bk_bttm", false ); + self._centrifuge_sparks_[int_client_num] = add_to_array( self._centrifuge_sparks_[int_client_num], "tag_light_fnt_bttm", false ); + self._centrifuge_steams_[int_client_num] = []; + self._centrifuge_steams_[int_client_num] = add_to_array( self._centrifuge_steams_[int_client_num], "tag_vent_bk_btm", false ); + self._centrifuge_steams_[int_client_num] = add_to_array( self._centrifuge_steams_[int_client_num], "tag_vent_top_btm", false ); + self._centrifuge_light_mdls_[int_client_num] = []; + self._centrifuge_fx_setup = true; +} +centrifuge_warning_lights_on( client_num ) +{ + for( i = 0; i < self._centrifuge_lights_[client_num].size; i++ ) + { + temp_mdl = Spawn( client_num, self GetTagOrigin( self._centrifuge_lights_[client_num][i] ), "script_model" ); + temp_mdl.angles = self GetTagAngles( self._centrifuge_lights_[client_num][i] ); + temp_mdl SetModel( "tag_origin" ); + temp_mdl LinkTo( self, self._centrifuge_lights_[client_num][i] ); + PlayFXOnTag( client_num, level._effect[ "centrifuge_warning_light" ], temp_mdl, "tag_origin" ); + self._centrifuge_light_mdls_[client_num] = add_to_array( self._centrifuge_light_mdls_[client_num], temp_mdl, false ); + } + for( i = 0; i < self._centrifuge_sparks_[client_num].size; i++ ) + { + temp_mdl = Spawn( client_num, self GetTagOrigin( self._centrifuge_sparks_[client_num][i] ), "script_model" ); + temp_mdl.angles = self GetTagAngles( self._centrifuge_sparks_[client_num][i] ); + temp_mdl SetModel( "tag_origin" ); + temp_mdl LinkTo( self, self._centrifuge_sparks_[client_num][i] ); + PlayFXOnTag( client_num, level._effect[ "centrifuge_light_spark" ], temp_mdl, "tag_origin" ); + self._centrifuge_light_mdls_[client_num] = add_to_array( self._centrifuge_light_mdls_[client_num], temp_mdl, false ); + } + self thread centrifuge_steam_warning( client_num ); +} +centrifuge_steam_warning( client_num ) +{ + wait( 1.0 ); + for( i = 0; i < self._centrifuge_steams_[client_num].size; i++ ) + { + PlayFXOnTag( client_num, level._effect[ "centrifuge_start_steam" ], self, self._centrifuge_steams_[client_num][i] ); + } +} +centrifuge_warning_lights_off( client_num ) +{ + if( !IsDefined( self._centrifuge_fx_setup ) ) + { + return; + } + wait( 0.2 ); + for( i = 0; i < self._centrifuge_light_mdls_[client_num].size; i++ ) + { + if( IsDefined( self._centrifuge_light_mdls_[client_num][i] ) ) + { + self._centrifuge_light_mdls_[client_num][i] Unlink(); + } + } + array_delete( self._centrifuge_light_mdls_[client_num] ); + self._centrifuge_light_mdls_[client_num] = []; +} +fog_apply( str_fog, int_priority ) +{ + self endon( "death" ); + self endon( "disconnect" ); + if( !IsDefined( self._zombie_fog_list ) ) + { + self._zombie_fog_list = []; + } + if( !IsDefined( str_fog ) || !IsDefined( int_priority ) ) + { + return; + } + already_in_array = false; + if( self._zombie_fog_list.size != 0 ) + { + for( i = 0; i < self._zombie_fog_list.size; i++ ) + { + if( IsDefined( self._zombie_fog_list[i].fog_setting ) && self._zombie_fog_list[i].fog_setting == str_fog ) + { + already_in_array = true; + if( self._zombie_fog_list[i].priority != int_priority ) + { + self._zombie_fog_list[i].priority = int_priority; + } + break; + } + } + } + if( !already_in_array ) + { + temp_struct = spawnStruct(); + temp_struct.fog_setting = str_fog; + temp_struct.priority = int_priority; + self._zombie_fog_list = add_to_array( self._zombie_fog_list, temp_struct, false ); + } + fog_to_set = get_fog_by_priority(); + set_fog(fog_to_set); +} +fog_remove( str_fog ) +{ + self endon( "death" ); + self endon( "disconnect" ); + if( !IsDefined( str_fog ) ) + { + return; + } + if( !IsDefined( self._zombie_fog_list ) ) + { + self._zombie_fog_list = []; + } + temp_struct = undefined; + for( i = 0; i < self._zombie_fog_list.size; i++ ) + { + if( IsDefined( self._zombie_fog_list[i].fog_setting ) && self._zombie_fog_list[i].fog_setting == str_fog ) + { + temp_struct = self._zombie_fog_list[i]; + } + } + if( IsDefined( temp_struct ) ) + { + self._zombie_fog_list = array_remove( self._zombie_fog_list, temp_struct ); + } + fog_to_set = get_fog_by_priority(); + set_fog(fog_to_set); +} +get_fog_by_priority() +{ + if( !IsDefined( self._zombie_fog_list ) ) + { + return; + } + highest_score = 0; + highest_score_fog = undefined; + for( i = 0; i < self._zombie_fog_list.size; i++ ) + { + if( IsDefined( self._zombie_fog_list[i].priority ) && self._zombie_fog_list[i].priority > highest_score ) + { + highest_score = self._zombie_fog_list[i].priority; + highest_score_fog = self._zombie_fog_list[i].fog_setting; + } + } + return highest_score_fog; +} +setup_fog() +{ + waitforclient(0); + wait(1); + players = getlocalplayers(); + for(i=0;i 0 ) + { + array_thread( nml_array, ::fog_trigger, ::moon_nml_fog_change ); + } +} +fog_trigger(change_func) +{ + while(1) + { + self waittill("trigger", who); + if(who IsLocalPlayer()) + { + self thread trigger_thread( who, change_func); + } + } +} +Moon_Exterior_Fog_Change(Ent_Player) +{ + if(!isDefined(ent_player)) + { + return; + } + local_clientnum = ent_player GetLocalClientNumber(); + ent_player endon("entityshutdown"); + start_dist = 2098.71; + half_dist = 1740.12; + half_height = 1332.23; + base_height = 576.887; + fog_r = 0.0196078; + fog_g = 0.0235294; + fog_b = 0.0352941; + fog_scale = 4.1367; + sun_col_r = 0.247; + sun_col_g = 0.235; + sun_col_b = 0.160; + sun_dir_x = 0.796421; + sun_dir_y = 0.425854; + sun_dir_z = 0.429374; + sun_start_ang = 0; + sun_stop_ang = 55; + time = 0; + max_fog_opacity = 0.95; + setVolFogForClient(ent_player GetLocalClientNumber(),start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + sunlight = 8; + sundirection = (-16.28, 56.06, 0); + suncolor = (0.655, 0.768, 0.817); + SetSavedDvar( "r_lightTweakSunLight", sunlight ); + SetSavedDvar( "r_lightTweakSunDirection", sundirection ); + SetSavedDvar("sm_sunSampleSizeNear", "1.8"); + SetSavedDvar( "r_skyColorTemp", (6400)); + if( !IsDefined( ent_player._previous_vision ) ) + { + ent_player._previous_vision = "zme"; + } + new_vision = "zme"; + ent_player clientscripts\zombie_moon_fx::moon_vision_set( ent_player._previous_vision, new_vision, local_clientnum, self.script_int ); + ent_player._previous_vision = "zme"; +} +moon_interior_fog_change(ent_player) +{ + if(!isDefined(ent_player)) + { + return; + } + local_clientnum = ent_player GetLocalClientNumber(); + ent_player endon("entityshutdown"); + start_dist = 2098.71; + half_dist = 1740.12; + half_height = 1332.23; + base_height = 576.887; + fog_r = 0.0196078; + fog_g = 0.0235294; + fog_b = 0.0352941; + fog_scale = 4.1367; + sun_col_r = 0.247; + sun_col_g = 0.235; + sun_col_b = 0.160; + sun_dir_x = 0.796421; + sun_dir_y = 0.425854; + sun_dir_z = 0.429374; + sun_start_ang = 0; + sun_stop_ang = 55; + time = 0; + max_fog_opacity = 0.95; + setVolFogForClient(ent_player GetLocalClientNumber(),start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + sunlight = 8; + sundirection = (-16.28, 56.06, 0); + suncolor = (0.655, 0.768, 0.817); + SetSavedDvar( "r_lightTweakSunLight", sunlight ); + SetSavedDvar( "r_lightTweakSunDirection", sundirection ); + SetSavedDvar("sm_sunSampleSizeNear", ".8"); + SetSavedDvar( "r_skyColorTemp", (6400)); + if( !IsDefined( ent_player._previous_vision ) ) + { + ent_player._previous_vision = "zmi"; + } + new_vision = "zmi"; + ent_player clientscripts\zombie_moon_fx::moon_vision_set( ent_player._previous_vision, new_vision, local_clientnum, self.script_int ); + ent_player._previous_vision = "zmi"; +} +moon_biodome_fog_change(ent_player) +{ + if(!isDefined(ent_player)) + { + return; + } + local_clientnum = ent_player GetLocalClientNumber(); + ent_player endon("entityshutdown"); + start_dist = 65.3744; + half_dist = 860.241; + half_height = 35.1158; + base_height = 116.637; + fog_r = 0.117647; + fog_g = 0.137255; + fog_b = 0.101961; + fog_scale = 2.96282; + sun_col_r = 0.341176; + sun_col_g = 0.231373; + sun_col_b = 0.141176; + sun_dir_x = 0.315232; + sun_dir_y = 0.132689; + sun_dir_z = -0.939693; + sun_start_ang = 0; + sun_stop_ang = 44.4323; + time = 0; + max_fog_opacity = 0.836437; + setVolFogForClient(ent_player GetLocalClientNumber(),start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + sunlight = 1.13; + sundirection = (-33.34, -38.56, 0); + SetSavedDvar( "r_lightTweakSunLight", sunlight ); + SetSavedDvar( "r_lightTweakSunDirection", sundirection ); + SetSavedDvar("sm_sunSampleSizeNear", "2"); + SetSavedDvar( "r_sky_intensity_factor0", 2 ); + SetSavedDvar( "r_sky_intensity_useDebugValues", true ); + SetSavedDvar( "r_skyColorTemp", (3600)); + SetSavedDvar( "r_lightGridEnableTweaks", 1 ); + SetSavedDvar( "r_lightGridIntensity", 1.25 ); + SetSavedDvar( "r_lightGridContrast", .45 ); + if( !IsDefined( ent_player._previous_vision ) ) + { + ent_player._previous_vision = "zmb"; + } + new_vision = "zmb"; + ent_player clientscripts\zombie_moon_fx::moon_vision_set( ent_player._previous_vision, new_vision, local_clientnum, self.script_int ); + ent_player._previous_vision = "zmb"; +} +moon_tunnels_fog_change(ent_player) +{ + if(!isDefined(ent_player)) + { + return; + } + local_clientnum = ent_player GetLocalClientNumber(); + ent_player endon("entityshutdown"); + start_dist = 1413.46; + half_dist = 4300.81; + half_height = 32.2476; + base_height = -238.873; + fog_r = 0.192157; + fog_g = 0.137255; + fog_b = 0.180392; + fog_scale = 3.2984; + sun_col_r = 0.34902; + sun_col_g = 0.129412; + sun_col_b = 0.219608; + sun_dir_x = 0.954905; + sun_dir_y = 0.280395; + sun_dir_z = 0.0976461; + sun_start_ang = 0; + sun_stop_ang = 0; + time = 0; + max_fog_opacity = 0.22; + setVolFogForClient(ent_player GetLocalClientNumber(),start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + if( !IsDefined( ent_player._previous_vision ) ) + { + ent_player._previous_vision = "zmt"; + } + new_vision = "zmt"; + ent_player clientscripts\zombie_moon_fx::moon_vision_set( ent_player._previous_vision, new_vision, local_clientnum, self.script_int ); + ent_player._previous_vision = "zmt"; + SetSavedDvar( "r_skyColorTemp", (6400)); +} +moon_nml_fog_change( ent_player ) +{ + if( !IsDefined( ent_player ) || (IsDefined( level._dte_done ) && level._dte_done) ) + { + return; + } + local_clientnum = ent_player GetLocalClientNumber(); + ent_player endon( "entityshutdown" ); + start_dist = 1662.13; + half_dist = 18604.1; + half_height = 2618.86; + base_height = -5373.56; + fog_r = 0.764706; + fog_g = 0.505882; + fog_b = 0.231373; + fog_scale = 5; + sun_col_r = 0.8; + sun_col_g = 0.435294; + sun_col_b = 0.101961; + sun_dir_x = 0.796421; + sun_dir_y = 0.425854; + sun_dir_z = 0.429374; + sun_start_ang = 0; + sun_stop_ang = 45.87; + time = 0; + max_fog_opacity = 0.72; + sunlight = 5; + sundirection = (-16, 56.06, 0); + suncolor = (.924, .775, .651); + SetSavedDvar("sm_sunSampleSizeNear", "1.18"); + if( !IsDefined( ent_player._previous_vision ) ) + { + ent_player._previous_vision = "zmh"; + } + new_vision = "zmh"; + ent_player clientscripts\zombie_moon_fx::moon_vision_set( ent_player._previous_vision, new_vision, local_clientnum, self.script_int ); + ent_player._previous_vision = "zmh"; + setVolFogForClient(local_clientnum,start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); + setClientDvar( "r_lightTweakSunLight", sunlight); + setClientDvar( "r_lightTweakSunColor", suncolor); + setClientDvar( "r_lightTweakSunDirection", sundirection); + SetSavedDvar( "r_skyColorTemp", (6400)); +} +moon_vision_set( str_vision_old, str_vision_new, int_clientnum, int_trans ) +{ + if( str_vision_old == str_vision_new ) + { + return; + } + if( IsDefined( str_vision_old ) ) + { + remove_vision = clientscripts\zombie_moon::moon_vision_set_choice( str_vision_old ); + clientscripts\_zombiemode::zombie_vision_set_remove( remove_vision[0], 0, int_clientnum ); + } + if( IsDefined( int_trans ) ) + { + trans_time = int_trans; + } + else + { + trans_time = 0; + } + start_vision = clientscripts\zombie_moon::moon_vision_set_choice( str_vision_new ); + clientscripts\_zombiemode::zombie_vision_set_apply( start_vision[0], start_vision[1], trans_time, int_clientnum ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/zombie_moon_gravity.csc b/BO1/PC/ZM/clientscripts/zombie_moon_gravity.csc new file mode 100644 index 0000000..b401270 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_moon_gravity.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_pentagon_amb.csc b/BO1/PC/ZM/clientscripts/zombie_pentagon_amb.csc new file mode 100644 index 0000000..fa731da Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_pentagon_amb.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_pentagon_ffotd.csc b/BO1/PC/ZM/clientscripts/zombie_pentagon_ffotd.csc new file mode 100644 index 0000000..9070753 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_pentagon_ffotd.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_pentagon_teleporter.csc b/BO1/PC/ZM/clientscripts/zombie_pentagon_teleporter.csc new file mode 100644 index 0000000..437d4ce Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_pentagon_teleporter.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_temple.csc b/BO1/PC/ZM/clientscripts/zombie_temple.csc new file mode 100644 index 0000000..37cb1ca --- /dev/null +++ b/BO1/PC/ZM/clientscripts/zombie_temple.csc @@ -0,0 +1,1287 @@ + +#include clientscripts\_utility; +#include clientscripts\_music; +#include clientscripts\_zombiemode_weapons; +main() +{ + level thread clientscripts\zombie_temple_ffotd::main_start(); + level._uses_crossbow = true; + level._temple_vision_set = "zombie_temple"; + level._temple_vision_set_priority = 1; + level._temple_caves_vision_set = "zombie_temple_caves"; + level._temple_caves_vision_set_priority = 2; + level._temple_water_vision_set = "zombie_temple"; + level._temple_eclipse_vision_set = "zombie_temple_eclipse"; + level._temple_eclipse_vision_set_priority = 3; + level._temple_caves_eclipse_vision_set = "zombie_temple_eclipseCave"; + level._temple_caves_eclipse_vision_set_priority = 3; + init_client_flags(); + level.riser_fx_on_client = 1; + level.use_new_riser_water = 1; + level.use_clientside_rock_tearin_fx = 1; + level.use_clientside_board_fx = 1; + include_weapons(); + clientscripts\_zombiemode::main(); + clientscripts\_zombiemode_spikemore::init(); + thread clientscripts\zombie_temple_fx::main(); + thread clientscripts\zombie_temple_amb::main(); + clientscripts\_zombiemode_ai_napalm::init_napalm_zombie(); + clientscripts\_zombiemode_ai_sonic::init_sonic_zombie(); + clientscripts\zombie_temple_geyser::main(); + clientscripts\_sticky_grenade::main(); + level thread power_watch(); + level thread waterfall_triggers_init(); + watch_power_water(); + register_zombie_types(); + OnPlayerConnect_Callback( ::temple_player_connect ); + OnPlayerSpawned_Callback( ::temple_player_spawned ); + _init_pap_indicators(); + register_flag_handlers(); + registerSystem("pap_indicator_spinners", ::temple_pap_monitor_spinners); + level thread cave_vision_trigger_init(); + level thread temple_light_model_swap_init(); + level thread clientscripts\zombie_temple_ffotd::main_end(); + level thread sq_std_watcher(); + level thread waterfall_watcher(); + level thread timetravel_watcher(); + level thread crystal_sauce_monitor(); + level thread time_travel_vision(); + thread waitforclient(0); + println("*** Client : zombie_temple running..."); +} +init_client_flags() +{ + level._CF_ACTOR_IS_NAPALM_ZOMBIE = 0; + level._CF_ACTOR_DO_NOT_USE = 1; + level._CF_ACTOR_NAPALM_ZOMBIE_EXPLODE = 2; + level._CF_ACTOR_IS_SONIC_ZOMBIE = 3; + level._CF_ACTOR_NAPALM_ZOMBIE_WET = 4; + level._CF_ACTOR_CLIENT_FLAG_SPIKEMORE = 5; + level._CF_ACTOR_RAGDOLL_IMPACT_GIB = 6; + level._CF_PLAYER_GEYSER_FAKE_PLAYER_SETUP_PRONE = 0; + level._CF_PLAYER_GEYSER_FAKE_PLAYER_SETUP_STAND = 1; + level._CF_PLAYER_MAZE_FLOOR_RUMBLE = 3; + level._CF_SCRIPTMOVER_CLIENT_FLAG_SPIKES = 3; + level._CF_SCRIPTMOVER_CLIENT_FLAG_MAZE_WALL = 4; + level._CF_SCRIPTMOVER_CLIENT_FLAG_SPIKEMORE = 5; + level._CF_SCRIPTMOVER_CLIENT_FLAG_WEAKSAUCE_START = 6; + level._CF_SCRIPTMOVER_CLIENT_FLAG_HOTSAUCE_START = 7; + level._CF_SCRIPTMOVER_CLIENT_FLAG_SAUCE_END = 8; + level._CF_SCRIPTMOVER_CLIENT_FLAG_WATER_TRAIL = 9; +} +register_flag_handlers() +{ + register_clientflag_callback("actor", level._CF_ACTOR_RAGDOLL_IMPACT_GIB, ::ragdoll_impact_watch_start ); + register_clientflag_callback("scriptmover", level._CF_SCRIPTMOVER_CLIENT_FLAG_SPIKES, ::spike_trap_move); + register_clientflag_callback("scriptmover", level._CF_SCRIPTMOVER_CLIENT_FLAG_MAZE_WALL, ::maze_wall_move); + register_clientflag_callback("scriptmover", level._CF_SCRIPTMOVER_CLIENT_FLAG_WEAKSAUCE_START, ::crystal_weaksauce_start); + register_clientflag_callback("scriptmover", level._CF_SCRIPTMOVER_CLIENT_FLAG_HOTSAUCE_START, ::crystal_hotsauce_start); + register_clientflag_callback("scriptmover", level._CF_SCRIPTMOVER_CLIENT_FLAG_SAUCE_END, ::crystal_sauce_end); + register_clientflag_callback("scriptmover", level._CF_SCRIPTMOVER_CLIENT_FLAG_WATER_TRAIL, ::water_trail_monitor); + register_clientflag_callback( "player", level._CF_PLAYER_MAZE_FLOOR_RUMBLE, ::maze_floor_controller_rumble ); +} +spike_trap_move(localClientNum, set, newEnt) +{ + spike_trap_move_spikes(localClientNum, set); +} +maze_wall_move(localClientNum, set, newEnt) +{ + clientscripts\zombie_temple_maze::maze_trap_move_wall(localClientNum, set); +} +delete_water_trail() +{ + realWait(1.2); + for(i = 0; i < self.fx_ents.size; i ++) + { + self.fx_ents[i] Delete(); + } + self.fx_ents = undefined; +} +water_trail_monitor(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if(set) + { + players = getlocalplayers(); + self.fx_ents = []; + for(i = 0; i < players.size; i ++) + { + self.fx_ents[i] = spawn(i, (0,0,0), "script_model"); + self.fx_ents[i] SetModel("tag_origin"); + self.fx_ents[i] LinkTo(self, "tag_origin"); + PlayFXOnTag(i, level._effect["fx_crystal_water_trail"], self.fx_ents[i], "tag_origin"); + } + } + else + { + if(IsDefined(self.fx_ents)) + { + self thread delete_water_trail(); + } + } +} +crystal_weaksauce_start(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if(!set) + { + return; + } + s = spawnstruct(); + s.fx = "fx_weak_sauce_trail"; + s.origin = self.origin + (0,0,134); + level._crystal_sauce_start = s; +} +crystal_hotsauce_start(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if(!set) + { + return; + } + s = spawnstruct(); + s.fx = "fx_hot_sauce_trail"; + s.origin = self.origin + (0,0,134); + level._crystal_sauce_start = s; +} +crystal_sauce_end(localClientNum, set, newEnt) +{ + if(localClientNum != 0) + { + return; + } + if(!set) + { + return; + } + level._crystal_sauce_end = self.origin; + if(self.model == "p_ztem_crystal_and_holder") + { + level._crystal_sauce_end += ( 0, 0, 134 ); + } +} +crystal_trail_runner(localClientNum, fx_name, dest) +{ + PrintLn("Running " + fx_name + " from " + self.origin + " to " + dest); + PlayFXOnTag( localClientNum, level._effect[ fx_name ], self, "tag_origin" ); + self playloopsound( "evt_sq_bag_crystal_bounce_loop", .05 ); + self MoveTo(dest, 0.5); + self waittill("movedone"); + self Delete(); +} +crystal_sauce_monitor() +{ + waitforallclients(); + num_players = getlocalplayers().size; + while(1) + { + realWait(0.016); + if(!IsDefined(level._crystal_sauce_start) || !IsDefined(level._crystal_sauce_end)) + { + continue; + } + for(i = 0; i < num_players; i ++) + { + e = spawn(i, level._crystal_sauce_start.origin, "script_model"); + e SetModel("tag_origin"); + e thread crystal_trail_runner(i, level._crystal_sauce_start.fx, level._crystal_sauce_end); + } + level._crystal_sauce_start = undefined; + level._crystal_sauce_end = undefined; + } +} +power_watch() +{ + level.power = false; + level waittill("ZPO"); + level.power = true; + level thread start_generator_movement(); +} +timetravel_watcher() +{ + level._in_eclipse = false; + level thread eclipse_watcher(); + level thread daybreak_watcher(); +} +time_travel_vision() +{ + level waittill("time_travel"); + while(1) + { + level waittill("time_travel"); + setdvarfloat("r_poisonFX_debug_amount", 0); + setdvar("r_poisonFX_debug_enable", 1); + setdvarfloat("r_poisonFX_pulse", 2); + setdvarfloat("r_poisonFX_warpX", -.3); + setdvarfloat("r_poisonFX_warpY", .15); + setdvarfloat("r_poisonFX_dvisionA", 0); + setdvarfloat("r_poisonFX_dvisionX", 0); + setdvarfloat("r_poisonFX_dvisionY", 0); + setdvarfloat("r_poisonFX_blurMin", 0); + setdvarfloat("r_poisonFX_blurMax", 3); + delta = 0.064; + amount = 1; + setdvarfloat("r_poisonFX_debug_amount", amount); + realWait(1.75); + while(amount > 0) + { + amount = Max(amount - delta, 0); + setdvarfloat("r_poisonFX_debug_amount", amount); + wait(0.016); + } + setdvarfloat("r_poisonFX_debug_amount", 0); + setdvar("r_poisonFX_debug_enable", 0); + } +} +eclipse_watcher() +{ + while(1) + { + level waittill("ec", lcn); + if( IsDefined( lcn ) && lcn != 0 ) + { + continue; + } + level._in_eclipse = true; + level notify("time_travel", level._in_eclipse); + clientscripts\_fx::activate_exploder(402); + clientscripts\_fx::deactivate_exploder(401); + players = getlocalplayers(); + clientscripts\zombie_temple_fx::eclipse_fog_on(); + for( i = 0; i < players.size; i ++) + { + players[i] thread temple_set_eclipse_visionset( i ); + if(IsDefined(players[i]._in_cave) && players[i]._in_cave) + { + players[i] thread temple_set_visionset_caves( i ); + } + } + SetSunlight( 0.5426, 0.6538, 0.7657); + setsaveddvar("r_lightTweakSunLight", 11); + level thread strobe_sky_and_transition(1.0); + clientscripts\zombie_temple_fx::eclipse_fog_on(); + } +} +strobe_sky_and_transition(end_val) +{ + val = end_val; + delay = 0.016; + for(i = 0; i < 10; i ++) + { + SetSavedDvar( "r_skyTransition", val); + val = 1.0 - val; + realWait(delay); + delay = delay * 1.1; + } + step = 1 / 120; + val = 1 - end_val; + if(val == 0) + { + step *= -1; + } + for(i = 0; i < 120; i ++) + { + SetSavedDvar( "r_skyTransition", val ); + val -= step; + wait(0.016); + } + SetSavedDvar( "r_skyTransition", end_val ); +} +daybreak_watcher() +{ + while(1) + { + level waittill("db", lcn); + if( IsDefined( lcn ) && lcn != 0 ) + { + continue; + } + level._in_eclipse = false; + level notify("time_travel", level._in_eclipse); + clientscripts\_fx::activate_exploder(401); + clientscripts\_fx::deactivate_exploder(402); + players = getlocalplayers(); + for( i = 0; i < players.size; i ++) + { + players[i] thread clientscripts\_zombiemode::zombie_vision_set_remove( level._temple_eclipse_vision_set, 2.0, i ); + players[i] thread clientscripts\_zombiemode::zombie_vision_set_remove( level._temple_caves_eclipse_vision_set, 2.0, i ); + } + if(IsDefined(players[0]._in_cave) && players[0]._in_cave) + { + clientscripts\zombie_temple_fx::cave_fog_on(); + } + else + { + clientscripts\zombie_temple_fx::cave_fog_off(); + } + setsaveddvar("r_lightTweakSunLight", 13); + if(!IsDefined(level.first_sky_trans)) + { + level.first_sky_trans = false; + SetSavedDvar( "r_skyTransition", 0.0 ); + } + else + { + level thread strobe_sky_and_transition(0.0); + } + ResetSunlight(); + } +} +start_generator_movement() +{ + players = GetLocalPlayers(); + for ( i = 0; i < players.size; i++ ) + { + ent = GetEnt(i, "power_generator", "targetname"); + ent thread generator_move(); + } +} +generator_move() +{ + offsetAngle = 0.25; + rotTime = 0.1; + total = 0; + self RotateRoll(0 - offsetAngle, rotTime); + while ( true ) + { + self waittill("rotatedone"); + self RotateRoll(offsetAngle * 2, rotTime); + self waittill("rotatedone"); + self RotateRoll(0 - offsetAngle * 2, rotTime); + } +} +watch_power_water() +{ + level thread water_wheel_watch("wwr", "water_wheel_right", 120, 2.2); + level thread water_wheel_watch("wwl", "water_wheel_left", 120, 1.8); +} +water_wheel_watch(waitFor, entName, rotate, time) +{ + level waittill(waitFor); + players = GetLocalPlayers(); + for ( i = 0; i < players.size; i++ ) + { + wheel = GetEnt(i, entName, "targetname"); + wheel thread rotateWheel(rotate,time); + } +} +rotateWheel(rotate, time) +{ + spinUpTime = time - 0.5; + self RotatePitch(rotate, time, spinUpTime, 0.1); + self waittill("rotatedone"); + while( true ) + { + self RotatePitch(rotate, time, 0, 0); + self waittill("rotatedone"); + } +} +disable_deadshot( i_local_client_num ) +{ + while ( !self hasdobj( i_local_client_num ) ) + { + wait( 0.05 ); + } + players = GetLocalPlayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( self == players[i] ) + { + self clearalternateaimparams(); + } + } +} +water_gush_debug() +{ + scale = 0.1; + offset = (0,0,0); + dir = AnglesToForward(self.angles); + for(i = 0; i < 5; i ++) + { + Print3d(self.origin + offset, "+", (60,60,255), 1, scale, 10); + scale *= 1.7; + offset += dir * 6; + } +} +waterfall_watcher() +{ + targets = getstructarray("sq_sad", "targetname"); + while(1) + { + level waittill("WF"); + for(i = 0; i < 4; i ++) + { + if(!isDefined(level._sq_std_status) || !isDefined(level._sq_std_status[i]) ) + { + continue; + } + if(level._sq_std_status[i] == 0) + { + clientscripts\_fx::activate_exploder(120 + i); + } + wait(0.25); + } + } +} +sq_std_watcher() +{ + PrintLn("watcher : start"); + waitforallclients(); + PrintLn("watcher : post wfac"); + players = getlocalplayers(); + level waittill("SR"); + PrintLn("watcher : post SR"); + targets = getstructarray("sq_sad", "targetname"); + PrintLn("Client : Threading sq_std_struct_watcher on " + targets.size + " structs."); + for(i = 0; i < targets.size; i ++) + { + targets[i] thread sq_std_struct_watcher(players.size); + } +} +sq_std_watch_for_restart(num_local_players) +{ + level waittill("SR"); + if(IsDefined(level._sq_std_array[self.script_int - 1])) + { + for(i = 0; i < level._sq_std_array[self.script_int - 1].size; i ++) + { + if(IsDefined(level._sq_std_array[self.script_int - 1][i])) + { + level._sq_std_array[self.script_int - 1][i] Delete(); + } + } + level._sq_std_array[self.script_int - 1] = undefined; + } + level._sq_std_status[self.script_int - 1] = 0; + self thread sq_std_struct_watcher(num_local_players); +} +sq_struct_debug() +{ + level endon("SR"); + level endon("ksd"); + while(1) + { + Print3D(self.origin, "+", (255,0,0),1); + wait(0.1); + } +} +sq_std_struct_watcher(num_local_players) +{ + if(!IsDefined(level._sq_std_array)) + { + level._sq_std_array = []; + level._sq_std_status = []; + for(i = 0; i < 4; i ++) + { + level._sq_std_status[i] = 0; + } + } + level endon("SR"); + self thread sq_std_watch_for_restart(num_local_players); + while(1) + { + level waittill("S"+self.script_int); + PrintLn("*** Client : Got S " +self.script_int); + self thread sq_struct_debug(); + level._sq_std_status[self.script_int - 1] = 1; + level._sq_std_array[self.script_int - 1] = []; + for(i = 0; i < num_local_players; i ++) + { + e = spawn(i, self.origin, "script_model"); + e.angles = self.angles; + e SetModel("p_ztem_spikemore_spike"); + level._sq_std_array[self.script_int - 1][level._sq_std_array[self.script_int - 1].size] = e; + } + } +} +temple_player_connect( i_local_client_num ) +{ + self endon( "disconnect" ); + while( !ClientHasSnapshot( i_local_client_num ) ) + { + wait( 0.05 ); + } + while ( !self hasdobj( i_local_client_num ) ) + { + wait( 0.05 ); + } + self thread clientscripts\_swimming::set_swimming_vision_set( level._temple_water_vision_set ); + if ( GetLocalPlayers().size == 1 ) + { + self thread clientscripts\_zombiemode_ai_napalm::player_napalm_radius_overlay_fade(); + } + self thread init_arms(); + if( i_local_client_num != 0 ) + { + return; + } + thread floating_boards_init(); + self thread disable_deadshot(i_local_client_num); + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] thread temple_set_visionset( i ); + } +} +temple_player_spawned( i_local_client_num ) +{ + self endon( "disconnect" ); + while ( !self hasdobj( i_local_client_num ) ) + { + wait( 0.05 ); + } + if( i_local_client_num != 0 ) + { + return; + } + players = GetLocalPlayers(); + for( i = 0; i < players.size; i++ ) + { + players[i] thread temple_set_visionset( i ); + players[i] thread temple_remove_visionset_caves(i); + } +} +init_arms() +{ + wait 5; + switch( self.model ) + { + case "c_usa_dempsey_body": + self.viewmodel = "viewmodel_usa_pow_arms"; + break; + case "c_rus_nikolai_body": + self.viewmodel = "viewmodel_rus_prisoner_arms"; + break; + case "c_jap_takeo_body": + self.viewmodel = "viewmodel_vtn_nva_standard_arms"; + break; + case "c_ger_richtofen_body": + self.viewmodel = "viewmodel_usa_hazmat_arms"; + break; + default: + println("Model " + self.model + "does not have matching view model"); + break; + } +} +cave_vision_trigger_init() +{ + caveTrigger = getent(0, "cave_vision_trig","targetname"); + if(isDefined(caveTrigger)) + { + caveTrigger thread cave_vision_trigger_watch(); + } +} +cave_vision_trigger_watch() +{ + while(1) + { + self waittill("trigger", who); + if(who IsLocalPlayer()) + { + who = GetLocalPlayers()[who GetLocalClientNumber()]; + self thread trigger_thread(who, ::cave_vision_on, ::cave_vision_off); + } + } +} +cave_vision_on(player) +{ + if(!player IsPlayer()) + { + return; + } + i_local_client_num = player GetLocalClientNumber(); + player._in_cave = true; + player temple_set_visionset_caves( i_local_client_num ); + if(level._in_eclipse) + { + clientscripts\zombie_temple_fx::eclipse_fog_on(); + } + else + { + clientscripts\zombie_temple_fx::cave_fog_on(); + } +} +cave_vision_off(player) +{ + if( !IsDefined( player ) ) + { + return; + } + player._in_cave = false; + if(!player IsPlayer()) + { + return; + } + i_local_client_num = player GetLocalClientNumber(); + player temple_remove_visionset_caves(i_local_client_num); + if(level._in_eclipse) + { + clientscripts\zombie_temple_fx::eclipse_fog_on(); + } + else + { + clientscripts\zombie_temple_fx::cave_fog_off(); + } +} +temple_set_visionset( i_local_client_num ) +{ + self thread clientscripts\_zombiemode::zombie_vision_set_apply( level._temple_vision_set, level._temple_vision_set_priority, 0.1, i_local_client_num ); +} +temple_set_eclipse_visionset( i_local_client_num ) +{ + self thread clientscripts\_zombiemode::zombie_vision_set_apply( level._temple_eclipse_vision_set, level._temple_eclipse_vision_set_priority, 0.1, i_local_client_num ); +} +temple_set_visionset_caves( i_local_client_num ) +{ + println("***** Vision: Set Caves *****"); + self thread clientscripts\_zombiemode::zombie_vision_set_apply( level._temple_caves_vision_set, level._temple_caves_vision_set_priority, 2.0, i_local_client_num ); + if(level._in_eclipse) + { + self thread clientscripts\_zombiemode::zombie_vision_set_apply( level._temple_caves_eclipse_vision_set, level._temple_caves_eclipse_vision_set_priority, 2.0, i_local_client_num ); + } +} +temple_remove_visionset_caves(i_local_client_num) +{ + println("***** Vision: Remove Caves *****"); + self thread clientscripts\_zombiemode::zombie_vision_set_remove( level._temple_caves_vision_set, 2.0, i_local_client_num ); + if(level._in_eclipse) + { + self thread clientscripts\_zombiemode::zombie_vision_set_remove( level._temple_caves_eclipse_vision_set, 2.0, i_local_client_num ); + } +} +include_weapons() +{ + include_weapon( "frag_grenade_zm", false ); + include_weapon( "claymore_zm", false ); + include_weapon( "m1911_zm", false ); + include_weapon( "m1911_upgraded_zm", false ); + include_weapon( "python_zm" ); + include_weapon( "python_upgraded_zm", false ); + include_weapon( "cz75_zm" ); + include_weapon( "cz75_upgraded_zm", false ); + include_weapon( "m14_zm", false ); + include_weapon( "m14_upgraded_zm", false ); + include_weapon( "m16_zm", false ); + include_weapon( "m16_gl_upgraded_zm", false ); + include_weapon( "g11_lps_zm" ); + include_weapon( "g11_lps_upgraded_zm", false ); + include_weapon( "famas_zm" ); + include_weapon( "famas_upgraded_zm", false ); + include_weapon( "ak74u_zm", false ); + include_weapon( "ak74u_upgraded_zm", false ); + include_weapon( "mp5k_zm", false ); + include_weapon( "mp5k_upgraded_zm", false ); + include_weapon( "mpl_zm", false ); + include_weapon( "mpl_upgraded_zm", false ); + include_weapon( "pm63_zm", false ); + include_weapon( "pm63_upgraded_zm", false ); + include_weapon( "spectre_zm" ); + include_weapon( "spectre_upgraded_zm", false ); + include_weapon( "cz75dw_zm" ); + include_weapon( "cz75dw_upgraded_zm", false ); + include_weapon( "ithaca_zm", false ); + include_weapon( "ithaca_upgraded_zm", false ); + include_weapon( "rottweil72_zm", false ); + include_weapon( "rottweil72_upgraded_zm", false ); + include_weapon( "spas_zm" ); + include_weapon( "spas_upgraded_zm", false ); + include_weapon( "hs10_zm" ); + include_weapon( "hs10_upgraded_zm", false ); + include_weapon( "aug_acog_zm", true ); + include_weapon( "aug_acog_mk_upgraded_zm", false ); + include_weapon( "galil_zm" ); + include_weapon( "galil_upgraded_zm", false ); + include_weapon( "commando_zm" ); + include_weapon( "commando_upgraded_zm", false ); + include_weapon( "fnfal_zm" ); + include_weapon( "fnfal_upgraded_zm", false ); + include_weapon( "dragunov_zm" ); + include_weapon( "dragunov_upgraded_zm", false ); + include_weapon( "l96a1_zm" ); + include_weapon( "l96a1_upgraded_zm", false ); + include_weapon( "rpk_zm" ); + include_weapon( "rpk_upgraded_zm", false ); + include_weapon( "hk21_zm" ); + include_weapon( "hk21_upgraded_zm", false ); + include_weapon( "m72_law_zm" ); + include_weapon( "m72_law_upgraded_zm", false ); + include_weapon( "china_lake_zm" ); + include_weapon( "china_lake_upgraded_zm", false ); + include_weapon( "zombie_cymbal_monkey" ); + include_weapon( "ray_gun_zm" ); + include_weapon( "ray_gun_upgraded_zm", false ); + include_weapon( "crossbow_explosive_zm" ); + include_weapon( "crossbow_explosive_upgraded_zm", false ); + include_weapon( "knife_ballistic_zm", true ); + include_weapon( "knife_ballistic_upgraded_zm", false ); + include_weapon( "knife_ballistic_bowie_zm", false ); + include_weapon( "knife_ballistic_bowie_upgraded_zm", false ); +} +register_zombie_types() +{ + character\clientscripts\c_viet_zombie_female_body::register_gibs(); + character\clientscripts\c_viet_zombie_female_body_alt::register_gibs(); + character\clientscripts\c_viet_zombie_nva1::register_gibs(); + character\clientscripts\c_viet_zombie_nva1_alt::register_gibs(); + character\clientscripts\c_viet_zombie_sonic::register_gibs(); + character\clientscripts\c_viet_zombie_vc::register_gibs(); +} +_init_magic_box() +{ + level._custom_box_monitor = ::temple_box_monitor; + level._box_locations = array( "waterfall_upper_chest", + "blender_chest", + "pressure_chest", + "bridge_chest", + "caves_water_chest", + "power_chest", + "caves1_chest", + "caves2_chest", + "caves3_chest" + ); + OnPlayerConnect_Callback( ::_init_indicators ); + level.cachedInfo = []; + level.initialized = []; +} +_init_indicators( clientNum ) +{ + structs = GetStructArray("magic_box_indicator", "targetname"); + for ( i = 0; i < structs.size; i++ ) + { + s = structs[i]; + if ( !IsDefined( s.viewModels ) ) + { + s.viewModels = []; + } + s.viewModels[clientNum] = undefined; + } + level.initialized[clientNum] = true; + keys = GetArrayKeys(level.cachedInfo); + for ( i = 0; i < keys.size; i++ ) + { + key = keys[i]; + state = level.cachedInfo[key]; + temple_box_monitor(i, state, ""); + } +} +temple_box_monitor(clientNum, state, oldState) +{ + if ( !IsDefined(level.initialized[clientNum]) ) + { + level.cachedInfo[clientNum] = state; + return; + } + switch ( state ) + { + case "fire_sale": + _all_locations(clientNum); + break; + case "moving": + level thread _random_location(clientNum); + break; + default: + level notify("location_set"+clientNum); + _setup_location(clientNum, state); + break; + } +} +_delete_location( clientNum, location ) +{ + structs = GetStructArray(location, "script_noteworthy"); + array_thread( structs, ::_setup_view_model, clientNum, undefined ); +} +_delete_all_locations(clientNum) +{ + for ( i = 0; i < level._box_locations.size; i++ ) + { + location = level._box_locations[i]; + _delete_location(clientNum, location); + } +} +_show_location( clientNum, location ) +{ + structs = GetStructArray(location, "script_noteworthy" ); + array_thread( structs, ::_setup_view_model, clientNum, "zt_map_knife" ); +} +_setup_location( clientNum, location ) +{ + _delete_all_locations(clientNum); + _show_location(clientNum, location); +} +_setup_view_model( clientNum, viewModel ) +{ + if ( IsDefined( self.viewModels[clientNum] ) ) + { + self.viewModels[clientNum] Delete(); + self.viewModels[clientNum] = undefined; + } + if ( IsDefined( viewModel ) ) + { + self.viewModels[clientNum] = spawn( clientNum, self.origin, "script_model"); + self.viewModels[clientNum].angles = self.angles; + self.viewModels[clientNum] SetModel(viewModel); + } +} +_random_location(clientNum) +{ + level endon("location_set"+clientNum); + index = 0; + while ( true ) + { + location = level._box_locations[index]; + _setup_location( clientNum, location ); + index++; + if ( index >= level._box_locations.size ) + { + index = 0; + } + wait(0.25); + } +} +_all_locations(clientNum) +{ + for ( i = 0; i < level._box_locations.size; i++ ) + { + location = level._box_locations[i]; + _show_location( clientNum, location ); + } +} +_init_pap_indicators() +{ + waitforallclients(); + local_players = getlocalplayers(); + for(index=0;index= 0 ); + if ( exp == 0 ) + { + return 1; + } + return base * power( base, exp - 1 ); +} +_set_num_visible_spinners(clientNum, num) +{ + for(i=3;i>=0;i--) + { + pow = power(2,i); + if(num>=pow) + { + num -= pow; + array_thread(level.spinners[clientNum][i], ::spin_to_start); + } + else + { + array_thread(level.spinners[clientNum][i], ::spin_forever); + } + } +} +spike_trap_move_spikes(localClientNum, active) +{ + if(!isDefined(self.spears)) + { + self set_trap_spears(localClientNum); + } + spears = self.spears; + if(isDefined(spears)) + { + for(i=0;i 0) + { + self rotateYaw(deltaYaw, spinTime, 0.0); + self waittill("rotatedone"); + } + self stop_spinner_sound(); + self.angles = self.startAngles; +} +start_spinner_sound() +{ + self playloopsound( self.spin_sound ); +} +stop_spinner_sound() +{ + self stoploopsound(); + self playsound( 0, self.spin_stop_sound ); +} +temple_light_model_swap_init() +{ + level waittill("ZPO"); + realwait(4.5); + level notify( "pl1" ); + players = getlocalplayers(); + for( i = 0; i < players.size; i++ ) + { + light_models = GetEntArray( i, "model_lights_on", "targetname" ); + for ( x = 0; x < light_models.size; x++ ) + { + light = light_models[x]; + if ( IsDefined(light.script_string) ) + { + light SetModel(light.script_string); + } + else if ( light.model == "p_ztem_power_hanging_light_off" ) + { + light SetModel("p_ztem_power_hanging_light"); + } + else if ( light.model == "p_lights_cagelight02_off" ) + { + light SetModel("p_lights_cagelight02_on"); + } + } + } +} +ragdoll_impact_watch_start(localClientNum, set, newEnt) +{ + if(set) + { + self thread ragdoll_impact_watch(localClientNum); + } +} +ragdoll_impact_watch(localClientNum) +{ + self endon("entityshutdown"); + waitTime = .016; + gibSpeed = 500; + prevOrigin = self.origin; + realwait(waitTime); + prevVel = self.origin - prevOrigin; + prevSpeed = length(prevVel); + prevOrigin = self.origin; + realwait(waitTime); + firstloop = true; + while(1) + { + vel = self.origin - prevOrigin; + speed = length(vel); + if(speedgibSpeed*waitTime) + { + dir = VectorNormalize(prevVel); + self gib_ragdoll(localClientNum, dir); + break; + } + if(prevSpeed level._box_locations.size) + { + return; + } + level notify("kill_box_light_threads_"+clientNum); + turn_off_all_box_lights(clientNum); + level._box_indicator = s; + if(level._power_on) + { + turn_light_green(clientNum,level._box_indicator, true); + } + } +} +theatre_ZPO_listener() +{ + while(1) + { + level waittill("ZPO"); + level._power_on = true; + if(level._box_indicator != level._BOX_INDICATOR_NO_LIGHTS) + { + for(i = 0; i < getlocalplayers().size; i ++) + { + theater_box_monitor(i, level._box_indicator); + } + } + level notify("threeprimaries_on"); + level notify( "pl1" ); + } +} +eeroom_visionset_init() +{ + eeroom_visionset_triggers = GetEntArray( 0, "trigger_eeroom_visionset", "targetname" ); + if( !IsDefined( eeroom_visionset_triggers ) ) + { + return; + } + array_thread( eeroom_visionset_triggers, ::theater_player_in_eeroom ); +} +theater_player_in_eeroom() +{ + while( 1 ) + { + self waittill( "trigger", ent_player ); + if(ent_player IsLocalPlayer()) + { + self thread trigger_thread( ent_player, ::eeroom_visionset_on, ::eeroom_visionset_off ); + } + } +} +eeroom_visionset_on( ent_player ) +{ + if( !IsDefined( self.script_string ) ) + { + return; + } + wait( 1.0 ); + switch( self.script_string ) + { + case "asylum_room": + VisionSetNaked( ent_player GetLocalClientNumber(), "zombie_theater_eroom_asylum", 0 ); + break; + case "pentagon_room": + VisionSetNaked( ent_player GetLocalClientNumber(), "zombie_theater_erooms_pentagon", 0 ); + break; + case "girls_new_room": + VisionSetNaked( ent_player GetLocalClientNumber(), "zombie_theater_eroom_girlnew", 0 ); + break; + case "girls_old_room": + VisionSetNaked( ent_player GetLocalClientNumber(), "zombie_theater_eroom_girlold", 0 ); + break; + default: + VisionSetNaked( ent_player GetLocalClientNumber(), "zombie_theater", 0 ); + break; + } +} +eeroom_visionset_off( ent_player ) +{ + VisionSetNaked( ent_player GetLocalClientNumber(), "zombie_theater", 0 ); +} +theater_light_model_swap_init() +{ + players = getlocalplayers(); + for( i = 0; i < players.size; i++ ) + { + theater_light_models = GetEntArray( i, "model_lights_on", "targetname" ); + if( IsDefined( theater_light_models ) && theater_light_models.size > 0 ) + { + array_thread( theater_light_models, ::theater_light_model_swap ); + } + } +} +theater_light_model_swap() +{ + level waittill( "ZPO" ); + if( self.model == "lights_hang_single" ) + { + self SetModel( "lights_hang_single_on_nonflkr" ); + } + else if( self.model == "zombie_zapper_cagelight" ) + { + self SetModel( "zombie_zapper_cagelight_on" ); + } +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/clientscripts/zombie_theater_ffotd.csc b/BO1/PC/ZM/clientscripts/zombie_theater_ffotd.csc new file mode 100644 index 0000000..9070753 Binary files /dev/null and b/BO1/PC/ZM/clientscripts/zombie_theater_ffotd.csc differ diff --git a/BO1/PC/ZM/clientscripts/zombie_theater_fx.csc b/BO1/PC/ZM/clientscripts/zombie_theater_fx.csc new file mode 100644 index 0000000..cd8fb32 --- /dev/null +++ b/BO1/PC/ZM/clientscripts/zombie_theater_fx.csc @@ -0,0 +1,322 @@ +#include clientscripts\_utility; +#include clientscripts\_fx; +#include clientscripts\_music; +main() +{ + clientscripts\createfx\zombie_theater_fx::main(); + clientscripts\_fx::reportNumEffects(); + precache_util_fx(); + precache_createfx_fx(); + disableFX = GetDvarInt( #"disable_fx" ); + if( !IsDefined( disableFX ) || disableFX <= 0 ) + { + precache_scripted_fx(); + } + level thread clientscripts\_zombiemode::init_perk_machines_fx(); + level thread trap_fx_monitor( "dressing_room_trap", "e4", "electric" ); + level thread trap_fx_monitor( "vip_room_trap", "e2", "electric" ); + level thread trap_fx_monitor( "foyer_room_trap", "e1", "electric" ); + level thread trap_fx_monitor( "control_room_trap", "e3", "electric" ); + level thread trap_fx_monitor( "crematorium_room_trap", "f1", "fire" ); + level thread light_model_swap( "smodel_light_electric", "lights_indlight_on" ); + level thread dog_start_monitor(); + level thread dog_stop_monitor(); + level thread level_fog_init(); + level thread projector_screen_fx(); +} +precache_util_fx() +{ +} +precache_scripted_fx() +{ + level._effect["eye_glow"] = LoadFx( "misc/fx_zombie_eye_single" ); + level._effect["boxlight_light_ready"] = loadfx("maps/zombie/fx_zombie_theater_lightboard_green"); + level._effect["boxlight_light_notready"] = loadfx("maps/zombie/fx_zombie_theater_lightboard_red"); + level._effect["theater_projector_beam"] = loadfx("maps/zombie/fx_zombie_theater_projector_beam"); + level._effect[ "projector_screen_0" ] = LoadFX( "maps/zombie/fx_zombie_theater_screen_0" ); + level._effect[ "ps1" ] = LoadFX( "maps/zombie/fx_zombie_theater_screen_1" ); + level._effect[ "ps2" ] = LoadFX( "maps/zombie/fx_zombie_theater_screen_2" ); + level._effect[ "ps3" ] = LoadFX( "maps/zombie/fx_zombie_theater_screen_3" ); + level._effect["headshot"] = LoadFX( "impacts/fx_flesh_hit" ); + level._effect["headshot_nochunks"] = LoadFX( "misc/fx_zombie_bloodsplat" ); + level._effect["bloodspurt"] = LoadFX( "misc/fx_zombie_bloodspurt" ); + level._effect["animscript_gib_fx"] = LoadFx( "weapon/bullet/fx_flesh_gib_fatal_01" ); + level._effect["animscript_gibtrail_fx"] = LoadFx( "trail/fx_trail_blood_streak" ); +} +precache_createfx_fx() +{ + level._effect["fx_mp_smoke_thick_indoor"] = loadfx("maps/zombie/fx_mp_smoke_thick_indoor"); + level._effect["fx_mp_smoke_amb_indoor_misty"] = loadfx("maps/zombie/fx_zombie_theater_smoke_amb_indoor"); + level._effect["fx_smoke_smolder_md_gry"] = loadfx("maps/zombie/fx_smoke_smolder_md_gry"); + level._effect["fx_smk_smolder_sm"] = loadfx("env/smoke/fx_smk_smolder_sm"); + level._effect["fx_mp_smoke_crater"] = loadfx("maps/zombie/fx_mp_smoke_crater"); + level._effect["fx_mp_smoke_sm_slow"] = loadfx("maps/zombie/fx_mp_smoke_sm_slow"); + level._effect["fx_mp_fog_low"] = loadfx("maps/zombie/fx_mp_fog_low"); + level._effect["fx_zombie_theater_fog_lg"] = loadfx("maps/zombie/fx_zombie_theater_fog_lg"); + level._effect["fx_zombie_theater_fog_xlg"] = loadfx("maps/zombie/fx_zombie_theater_fog_xlg"); + level._effect["fx_mp_fog_ground_md"] = loadfx("maps/mp_maps/fx_mp_fog_ground_md"); + level._effect["fx_water_drip_light_long"] = loadfx("env/water/fx_water_drip_light_long"); + level._effect["fx_water_drip_light_short"] = loadfx("env/water/fx_water_drip_light_short"); + level._effect["fx_mp_ray_light_sm"] = loadfx("env/light/fx_light_godray_overcast_sm"); + level._effect["fx_mp_ray_light_md"] = loadfx("maps/zombie/fx_mp_ray_overcast_md"); + level._effect["fx_mp_ray_light_lg"] = loadfx("maps/zombie/fx_light_godray_overcast_lg"); + level._effect["fx_mp_dust_motes"] = loadfx("maps/zombie/fx_mp_ray_motes_lg"); + level._effect["fx_mp_dust_mote_pcloud_sm"] = loadfx("maps/zombie/fx_mp_dust_mote_pcloud_sm"); + level._effect["fx_mp_dust_mote_pcloud_md"] = loadfx("maps/zombie/fx_mp_dust_mote_pcloud_md"); + level._effect["fx_mp_pipe_steam"] = loadfx("env/smoke/fx_pipe_steam_md"); + level._effect["fx_mp_pipe_steam_random"] = loadfx("maps/zombie/fx_mp_pipe_steam_random"); + level._effect["fx_mp_fumes_vent_sm_int"] = loadfx("maps/mp_maps/fx_mp_fumes_vent_sm_int"); + level._effect["fx_mp_fumes_vent_xsm_int"] = loadfx("maps/mp_maps/fx_mp_fumes_vent_xsm_int"); + level._effect["fx_mp_elec_spark_burst_xsm_thin_runner"] = loadfx("maps/mp_maps/fx_mp_elec_spark_burst_xsm_thin_runner"); + level._effect["fx_mp_elec_spark_burst_sm_runner"] = loadfx("maps/mp_maps/fx_mp_elec_spark_burst_sm_runner"); + level._effect["fx_mp_light_lamp"] = loadfx("maps/zombie/fx_mp_light_lamp"); + level._effect["fx_mp_light_corona_cool"] = loadfx("maps/zombie/fx_mp_light_corona_cool"); + level._effect["fx_mp_light_corona_bulb_ceiling"] = loadfx("maps/zombie/fx_mp_light_corona_bulb_ceiling"); + level._effect["fx_pent_tinhat_light"] = LoadFX("maps/pentagon/fx_pent_tinhat_light"); + level._effect["fx_light_floodlight_bright"] = loadfx("maps/zombie/fx_zombie_light_floodlight_bright"); + level._effect["fx_light_overhead_sm_amber"] = loadfx("maps/zombie/fx_zombie_overhead_sm_amber"); + level._effect["fx_light_overhead_sm_amber_flkr"] = loadfx("maps/zombie/fx_zombie_overhead_sm_amber_flkr"); + level._effect["fx_light_overhead_sm_blue"] = loadfx("maps/zombie/fx_zombie_overhead_sm_blu"); + level._effect["fx_light_overhead_sm_blue_flkr"] = loadfx("maps/zombie/fx_zombie_overhead_sm_blu_flkr"); + level._effect["fx_mp_birds_circling"] = loadfx("maps/zombie/fx_mp_birds_circling"); + level._effect["fx_mp_insects_lantern"] = loadfx("maps/zombie/fx_mp_insects_lantern"); + level._effect["fx_insects_swarm_md_light"] = loadfx("bio/insects/fx_insects_swarm_md_light"); + level._effect["fx_insects_maggots"] = loadfx("bio/insects/fx_insects_maggots_sm"); + level._effect["fx_insects_moths_light_source"] = loadfx("bio/insects/fx_insects_moths_light_source"); + level._effect["fx_insects_moths_light_source_md"] = loadfx("bio/insects/fx_insects_moths_light_source_md"); + level._effect["fx_pent_movie_projector"] = LoadFX("maps/pentagon/fx_pent_movie_projector"); + level._effect["fx_zombie_light_theater_blue"] = LoadFX("maps/zombie/fx_zombie_light_theater_blue"); + level._effect["fx_zombie_light_theater_green"] = LoadFX("maps/zombie/fx_zombie_light_theater_green"); + level._effect["fx_zombie_theater_projector_beam"] = loadfx("maps/zombie/fx_zombie_theater_projector_beam"); + level._effect["fx_zombie_theater_projector_screen"] = loadfx("maps/zombie/fx_zombie_theater_projection_screen"); + level._effect["fx_transporter_beam"] = loadfx("maps/zombie/fx_transporter_beam"); + level._effect["fx_transporter_pad_start"] = loadfx("maps/zombie/fx_transporter_pad_start"); + level._effect["fx_transporter_start"] = loadfx("maps/zombie/fx_transporter_start"); + level._effect["fx_transporter_ambient"] = loadfx("maps/zombie/fx_transporter_ambient"); + level._effect["fx_zombie_mainframe_beam"] = loadfx("maps/zombie/fx_zombie_mainframe_beam"); + level._effect["fx_zombie_mainframe_flat"] = loadfx("maps/zombie/fx_zombie_mainframe_flat"); + level._effect["fx_zombie_mainframe_flat_start"] = loadfx("maps/zombie/fx_zombie_mainframe_flat_start"); + level._effect["fx_zombie_mainframe_beam_start"] = loadfx("maps/zombie/fx_zombie_mainframe_beam_start"); + level._effect["fx_zombie_flashback_theater"] = loadfx("maps/zombie/fx_zombie_flashback_theater"); + level._effect["fx_zombie_difference"] = loadfx("maps/zombie/fx_zombie_difference"); + level._effect["fx_zombie_heat_sink"] = loadfx("maps/zombie/fx_zombie_heat_sink"); + level._effect["zapper"] = loadfx("misc/fx_zombie_electric_trap"); + level._effect["switch_sparks"] = loadfx("env/electrical/fx_elec_wire_spark_burst"); + level._effect["fire_trap_med"] = loadfx("maps/zombie/fx_zombie_fire_trap_med"); + level._effect["fx_quad_roof_break"] = loadfx("maps/zombie/fx_zombie_crawler_roof_break"); + level._effect["fx_quad_roof_break_theater"] = loadfx("maps/zombie/fx_zombie_crawler_roof_theater"); + level._effect["fx_quad_dust_roof"] = loadfx("maps/zombie/fx_zombie_crawler_dust_roof"); +} +trap_fx_monitor( name, loc, trap_type ) +{ + structs = getstructarray( name, "targetname" ); + points = []; + for ( i=0; i= 0; i-- ) + { + array2[ array2.size ] = array[ i ]; + } + return array2; +} +array_removeUndefined( array ) +{ + newArray = []; + for( i = 0; i < array.size; i++ ) + { + if( !IsDefined( array[ i ] ) ) + { + continue; + } + newArray[ newArray.size ] = array[ i ]; + } + return newArray; +} +array_insert( array, object, index ) +{ + if( index == array.size ) + { + temp = array; + temp[ temp.size ] = object; + return temp; + } + temp = []; + offset = 0; + for( i = 0; i < array.size; i++ ) + { + if( i == index ) + { + temp[ i ] = object; + offset = 1; + } + temp[ i + offset ] = array[ i ]; + } + return temp; +} +array_remove( ents, remover, keepArrayKeys ) +{ + newents = []; + keys = getArrayKeys( ents ); + if(IsDefined(keepArrayKeys)) + { + for( i = keys.size - 1; i >= 0; i-- ) + { + if( ents[ keys[ i ] ] != remover ) + { + newents[ keys[i] ] = ents[ keys[ i ] ]; + } + } + return newents; + } + for( i = keys.size - 1; i >= 0; i-- ) + { + if( ents[ keys[ i ] ] != remover ) + { + newents[ newents.size ] = ents[ keys[ i ] ]; + } + } + return newents; +} +array_remove_nokeys( ents, remover ) +{ + newents = []; + for ( i = 0; i < ents.size; i++ ) + { + if( ents[ i ] != remover ) + { + newents[ newents.size ] = ents[ i ]; + } + } + return newents; +} +array_remove_index( array, index ) +{ + newArray = []; + keys = getArrayKeys( array ); + for( i = ( keys.size - 1 );i >= 0 ; i-- ) + { + if( keys[ i ] != index ) + { + newArray[ newArray.size ] = array[ keys[ i ] ]; + } + } + return newArray; +} +array_combine( array1, array2 ) +{ + if( !array1.size ) + { + return array2; + } + array3 = []; + keys = GetArrayKeys( array1 ); + for( i = 0;i < keys.size;i++ ) + { + key = keys[ i ]; + array3[ array3.size ] = array1[ key ]; + } + keys = GetArrayKeys( array2 ); + for( i = 0;i < keys.size;i++ ) + { + key = keys[ i ]; + array3[ array3.size ] = array2[ key ]; + } + return array3; +} +array_merge( array1, array2 ) +{ + if( array1.size == 0 ) + { + return array2; + } + if( array2.size == 0 ) + { + return array1; + } + newarray = array1; + for( i = 0;i < array2.size;i++ ) + { + foundmatch = false; + for( j = 0;j < array1.size;j++ ) + { + if( array2[ i ] == array1[ j ] ) + { + foundmatch = true; + break; + } + } + if( foundmatch ) + { + continue; + } + else + { + newarray[ newarray.size ] = array2[ i ]; + } + } + return newarray; +} +array_exclude( array, arrayExclude ) +{ + newarray = array; + if( IsArray( arrayExclude ) ) + { + for( i = 0;i < arrayExclude.size;i++ ) + { + if( is_in_array( array, arrayExclude[ i ] ) ) + { + newarray = array_remove( newarray, arrayExclude[ i ] ); + } + } + } + else + { + if( is_in_array( array, arrayExclude ) ) + { + newarray = array_remove( newarray, arrayExclude ); + } + } + return newarray; +} +array_notify( ents, notifier ) +{ + for( i = 0;i < ents.size;i++ ) + { + ents[ i ] notify( notifier ); + } +} +array_wait(array, msg, timeout) +{ + keys = getarraykeys(array); + structs = []; + for (i = 0; i < keys.size; i++) + { + key = keys[i]; + structs[ key ] = spawnstruct(); + structs[ key ]._array_wait = true; + structs[ key ] thread array_waitlogic1( array[ key ], msg, timeout ); + } + for (i = 0; i < keys.size; i++) + { + key = keys[i]; + if( IsDefined( array[ key ] ) && structs[ key ]._array_wait) + { + structs[ key ] waittill( "_array_wait" ); + } + } +} +array_wait_any(array, msg, timeout) +{ + if (array.size == 0) + { + return undefined; + } + keys = getarraykeys(array); + structs = []; + internal_msg = msg + "array_wait"; + for (i = 0; i < keys.size; i++) + { + key = keys[i]; + structs[ key ] = spawnstruct(); + structs[ key ]._array_wait = true; + structs[ key ] thread array_waitlogic3( array[ key ], msg, internal_msg, timeout ); + } + level waittill(internal_msg, ent); + return ent; +} +array_waitlogic1( ent, msg, timeout ) +{ + self array_waitlogic2( ent, msg, timeout ); + self._array_wait = false; + self notify( "_array_wait" ); +} +array_waitlogic2( ent, msg, timeout ) +{ + ent endon( msg ); + ent endon( "death" ); + if( isdefined( timeout ) ) + { + wait timeout; + } + else + { + ent waittill( msg ); + } +} +array_waitlogic3(ent, msg, internal_msg, timeout) +{ + if(msg !="death") + { + ent endon("death"); + } + level endon(internal_msg); + self array_waitlogic2(ent, msg, timeout); + level notify(internal_msg, ent); +} +array_check_for_dupes( array, single ) +{ + for( i = 0; i < array.size; i++ ) + { + if( array[i] == single ) + { + return false; + } + } + return true; +} +array_swap( array, index1, index2 ) +{ + assertEx( index1 < array.size, "index1 to swap out of range" ); + assertEx( index2 < array.size, "index2 to swap out of range" ); + temp = array[index1]; + array[index1] = array[index2]; + array[index2] = temp; + return array; +} +array_average( array ) +{ + assert( IsArray( array ) ); + assert( array.size > 0 ); + total = 0; + for ( i = 0; i < array.size; i++ ) + { + total += array[i]; + } + return ( total / array.size ); +} +array_std_deviation( array, mean ) +{ + assert( IsArray( array ) ); + assert( array.size > 0 ); + tmp = []; + for ( i = 0; i < array.size; i++ ) + { + tmp[i] = ( array[i] - mean ) * ( array[i] - mean ); + } + total = 0; + for ( i = 0; i < tmp.size; i++ ) + { + total = total + tmp[i]; + } + return Sqrt( total / array.size ); +} +random_normal_distribution( mean, std_deviation, lower_bound, upper_bound ) +{ + x1 = 0; + x2 = 0; + w = 1; + y1 = 0; + while ( w >= 1 ) + { + x1 = 2 * RandomFloatRange( 0, 1 ) - 1; + x2 = 2 * RandomFloatRange( 0, 1 ) - 1; + w = x1 * x1 + x2 * x2; + } + w = Sqrt( ( -2.0 * Log( w ) ) / w ); + y1 = x1 * w; + number = mean + y1 * std_deviation; + if ( IsDefined( lower_bound ) && number < lower_bound ) + { + number = lower_bound; + } + if ( IsDefined( upper_bound ) && number > upper_bound ) + { + number = upper_bound; + } + return( number ); +} +random( array ) +{ + keys = GetArrayKeys(array); + return array[ keys[RandomInt( keys.size )] ]; +} +is_in_array( aeCollection, eFindee ) +{ + for( i = 0; i < aeCollection.size; i++ ) + { + if( aeCollection[ i ] == eFindee ) + { + return( true ); + } + } + return( false ); +} +vector_compare(vec1, vec2) +{ + return (abs(vec1[0] - vec2[0]) < .001) && (abs(vec1[1] - vec2[1]) < .001) && (abs(vec1[2] - vec2[2]) < .001); +} +vector_scale(vec, scale) +{ + vec = (vec * scale); + return vec; +} +vector_multiply( vec, vec2 ) +{ + vec = (vec * vec2); + return vec; +} +draw_debug_line(start, end, timer) +{ + for (i=0;i 360) + newangle -=360; + while (newangle < 0) + newangle +=360; + while (oldangle > 360) + oldangle -=360; + while (oldangle < 0) + oldangle +=360; + olddif = undefined; + newdif = undefined; + if (newangle > 180) + newdif = 360 - newangle; + else + newdif = newangle; + if (oldangle > 180) + olddif = 360 - oldangle; + else + olddif = oldangle; + outerdif = newdif + olddif; + innerdif = 0; + if (newangle > oldangle) + innerdif = newangle - oldangle; + else + innerdif = oldangle - newangle; + if (innerdif < outerdif) + return innerdif; + else + return outerdif; +} +sign( x ) +{ + if ( x >= 0 ) + return 1; + return -1; +} +track(spot_to_track) +{ + if(IsDefined(self.current_target)) + { + if(spot_to_track == self.current_target) + return; + } + self.current_target = spot_to_track; +} +clear_exception( type ) +{ + assert( IsDefined( self.exception[ type ] ) ); + self.exception[ type ] = anim.defaultException; +} +set_exception( type, func ) +{ + assert( IsDefined( self.exception[ type ] ) ); + self.exception[ type ] = func; +} +set_all_exceptions( exceptionFunc ) +{ + keys = getArrayKeys( self.exception ); + for ( i=0; i < keys.size; i++ ) + { + self.exception[ keys[ i ] ] = exceptionFunc; + } +} +cointoss() +{ + return RandomInt( 100 ) >= 50 ; +} +waittill_string( msg, ent ) +{ + if ( msg != "death" ) + self endon ("death"); + ent endon ( "die" ); + self waittill ( msg ); + ent notify ( "returned", msg ); +} +waittill_multiple( string1, string2, string3, string4, string5 ) +{ + self endon ("death"); + ent = SpawnStruct(); + ent.threads = 0; + if (IsDefined (string1)) + { + self thread waittill_string (string1, ent); + ent.threads++; + } + if (IsDefined (string2)) + { + self thread waittill_string (string2, ent); + ent.threads++; + } + if (IsDefined (string3)) + { + self thread waittill_string (string3, ent); + ent.threads++; + } + if (IsDefined (string4)) + { + self thread waittill_string (string4, ent); + ent.threads++; + } + if (IsDefined (string5)) + { + self thread waittill_string (string5, ent); + ent.threads++; + } + while (ent.threads) + { + ent waittill ("returned"); + ent.threads--; + } + ent notify ("die"); +} +waittill_multiple_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4 ) +{ + self endon ("death"); + ent = SpawnStruct(); + ent.threads = 0; + if ( IsDefined( ent1 ) ) + { + assert( IsDefined( string1 ) ); + ent1 thread waittill_string( string1, ent ); + ent.threads++; + } + if ( IsDefined( ent2 ) ) + { + assert( IsDefined( string2 ) ); + ent2 thread waittill_string ( string2, ent ); + ent.threads++; + } + if ( IsDefined( ent3 ) ) + { + assert( IsDefined( string3 ) ); + ent3 thread waittill_string ( string3, ent ); + ent.threads++; + } + if ( IsDefined( ent4 ) ) + { + assert( IsDefined( string4 ) ); + ent4 thread waittill_string ( string4, ent ); + ent.threads++; + } + while (ent.threads) + { + ent waittill ("returned"); + ent.threads--; + } + ent notify ("die"); +} +waittill_any_return( string1, string2, string3, string4, string5, string6 ) +{ + if ((!IsDefined (string1) || string1 != "death") && + (!IsDefined (string2) || string2 != "death") && + (!IsDefined (string3) || string3 != "death") && + (!IsDefined (string4) || string4 != "death") && + (!IsDefined (string5) || string5 != "death") && + (!IsDefined (string6) || string6 != "death")) + self endon ("death"); + ent = SpawnStruct(); + if (IsDefined (string1)) + self thread waittill_string (string1, ent); + if (IsDefined (string2)) + self thread waittill_string (string2, ent); + if (IsDefined (string3)) + self thread waittill_string (string3, ent); + if (IsDefined (string4)) + self thread waittill_string (string4, ent); + if (IsDefined (string5)) + self thread waittill_string (string5, ent); + if (IsDefined (string6)) + self thread waittill_string (string6, ent); + ent waittill ("returned", msg); + ent notify ("die"); + return msg; +} +waittill_any( string1, string2, string3, string4, string5 ) +{ + assert( IsDefined( string1 ) ); + if ( IsDefined( string2 ) ) + self endon( string2 ); + if ( IsDefined( string3 ) ) + self endon( string3 ); + if ( IsDefined( string4 ) ) + self endon( string4 ); + if ( IsDefined( string5 ) ) + self endon( string5 ); + self waittill( string1 ); +} +waittill_any_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4, ent5, string5, ent6, string6, ent7, string7 ) +{ + assert( IsDefined( ent1 ) ); + assert( IsDefined( string1 ) ); + if ( ( IsDefined( ent2 ) ) && ( IsDefined( string2 ) ) ) + ent2 endon( string2 ); + if ( ( IsDefined( ent3 ) ) && ( IsDefined( string3 ) ) ) + ent3 endon( string3 ); + if ( ( IsDefined( ent4 ) ) && ( IsDefined( string4 ) ) ) + ent4 endon( string4 ); + if ( ( IsDefined( ent5 ) ) && ( IsDefined( string5 ) ) ) + ent5 endon( string5 ); + if ( ( IsDefined( ent6 ) ) && ( IsDefined( string6 ) ) ) + ent6 endon( string6 ); + if ( ( IsDefined( ent7 ) ) && ( IsDefined( string7 ) ) ) + ent7 endon( string7 ); + ent1 waittill( string1 ); +} +isFlashed() +{ + if ( !IsDefined( self.flashEndTime ) ) + return false; + return GetTime() < self.flashEndTime; +} +flag( message ) +{ + assertEx( IsDefined( message ), "Tried to check flag but the flag was not defined." ); + assertEx( IsDefined( level.flag[ message ] ), "Tried to check flag " + message + " but the flag was not initialized." ); + if ( !level.flag[ message ] ) + return false; + return true; +} +flag_init( message, val ) +{ + if ( !IsDefined( level.flag ) ) + { + level.flag = []; + level.flags_lock = []; + } + if ( !IsDefined( level.sp_stat_tracking_func ) ) + { + level.sp_stat_tracking_func = ::empty_init_func; + } + if ( !IsDefined( level.first_frame ) ) + { + assertEx( !IsDefined( level.flag[ message ] ), "Attempt to reinitialize existing flag: " + message ); + } + if (is_true(val)) + { + level.flag[ message ] = true; + } + else + { + level.flag[ message ] = false; + } + if ( !IsDefined( level.trigger_flags ) ) + { + init_trigger_flags(); + level.trigger_flags[ message ] = []; + } + else if ( !IsDefined( level.trigger_flags[ message ] ) ) + { + level.trigger_flags[ message ] = []; + } + if ( issuffix( message, "aa_" ) ) + { + thread [[ level.sp_stat_tracking_func ]]( message ); + } +} +empty_init_func( empty ) +{ +} +issuffix( msg, suffix ) +{ + if ( suffix.size > msg.size ) + return false; + for ( i = 0; i < suffix.size; i++ ) + { + if ( msg[ i ] != suffix[ i ] ) + return false; + } + return true; +} +flag_set( message ) +{ + level.flag[ message ] = true; + level notify( message ); + set_trigger_flag_permissions( message ); +} +flag_toggle( message ) +{ + if (flag(message)) + { + flag_clear(message); + } + else + { + flag_set(message); + } +} +flag_wait( msg ) +{ + while( !level.flag[ msg ] ) + level waittill( msg ); +} +flag_clear( message ) +{ + if ( level.flag[ message ] ) + { + level.flag[ message ] = false; + level notify( message ); + set_trigger_flag_permissions( message ); + } +} +flag_waitopen( msg ) +{ + while( level.flag[ msg ] ) + level waittill( msg ); +} +flag_exists( msg ) +{ + if( self == level ) + { + if( !IsDefined( level.flag ) ) + return false; + if( IsDefined( level.flag[ msg ] ) ) + return true; + } + else + { + if( !IsDefined( self.ent_flag ) ) + return false; + if( IsDefined( self.ent_flag[ msg ] ) ) + return true; + } + return false; +} +script_gen_dump_addline( string, signature ) +{ + if ( !IsDefined( string ) ) + string = "nowrite"; + if ( !IsDefined( level._loadstarted ) ) + { + if ( !IsDefined( level.script_gen_dump_preload ) ) + level.script_gen_dump_preload = []; + struct = SpawnStruct(); + struct.string = string; + struct.signature = signature; + level.script_gen_dump_preload[ level.script_gen_dump_preload.size ] = struct; + return; + } + if ( !IsDefined( level.script_gen_dump[ signature ] ) ) + level.script_gen_dump_reasons[ level.script_gen_dump_reasons.size ] = "Added: " + string; + level.script_gen_dump[ signature ] = string; + level.script_gen_dump2[ signature ] = string; +} +array_func(entities, func, arg1, arg2, arg3, arg4, arg5) +{ + if (!IsDefined( entities )) + { + return; + } + if (IsArray(entities)) + { + if (entities.size) + { + keys = GetArrayKeys( entities ); + for (i = 0; i < keys.size; i++) + { + single_func(entities[keys[i]], func, arg1, arg2, arg3, arg4, arg5); + } + } + } + else + { + single_func(entities, func, arg1, arg2, arg3, arg4, arg5); + } +} +single_func(entity, func, arg1, arg2, arg3, arg4, arg5) +{ + if(!IsDefined(entity)) + { + entity = level; + } + if (IsDefined(arg5)) + { + entity [[ func ]](arg1, arg2, arg3, arg4, arg5); + } + else if (IsDefined(arg4)) + { + entity [[ func ]](arg1, arg2, arg3, arg4); + } + else if (IsDefined(arg3)) + { + entity [[ func ]](arg1, arg2, arg3); + } + else if (IsDefined(arg2)) + { + entity [[ func ]](arg1, arg2); + } + else if (IsDefined(arg1)) + { + entity [[ func ]](arg1); + } + else + { + entity [[ func ]](); + } +} +array_thread( entities, func, arg1, arg2, arg3, arg4, arg5 ) +{ + AssertEX(IsDefined(entities), "Undefined array passed to common_scripts\utility::array_thread()"); + if (IsArray(entities)) + { + if (entities.size) + { + keys = GetArrayKeys( entities ); + for (i = 0; i < keys.size; i++) + { + single_thread(entities[keys[i]], func, arg1, arg2, arg3, arg4, arg5); + } + } + } + else + { + single_thread(entities, func, arg1, arg2, arg3, arg4, arg5); + } +} +single_thread(entity, func, arg1, arg2, arg3, arg4, arg5) +{ + AssertEX(IsDefined(entity), "Undefined entity passed to common_scripts\utility::single_thread()"); + if (IsDefined(arg5)) + { + entity thread [[ func ]](arg1, arg2, arg3, arg4, arg5); + } + else if (IsDefined(arg4)) + { + entity thread [[ func ]](arg1, arg2, arg3, arg4); + } + else if (IsDefined(arg3)) + { + entity thread [[ func ]](arg1, arg2, arg3); + } + else if (IsDefined(arg2)) + { + entity thread [[ func ]](arg1, arg2); + } + else if (IsDefined(arg1)) + { + entity thread [[ func ]](arg1); + } + else + { + entity thread [[ func ]](); + } +} +remove_undefined_from_array( array ) +{ + newarray = []; + for( i = 0; i < array.size; i ++ ) + { + if ( !IsDefined( array[ i ] ) ) + continue; + newarray[ newarray.size ] = array[ i ]; + } + return newarray; +} +realWait(seconds) +{ + start = GetTime(); + while(GetTime() - start < seconds * 1000) + { + wait(.05); + } +} +trigger_on( name, type ) +{ + if ( IsDefined ( name ) && IsDefined( type ) ) + { + ents = getentarray( name, type ); + array_thread( ents, ::trigger_on_proc ); + } + else + self trigger_on_proc(); +} +trigger_on_proc() +{ + if ( IsDefined( self.realOrigin ) ) + self.origin = self.realOrigin; + self.trigger_off = undefined; +} +trigger_off( name, type ) +{ + if ( IsDefined ( name ) && IsDefined( type ) ) + { + ents = getentarray( name, type ); + array_thread( ents, ::trigger_off_proc ); + } + else + self trigger_off_proc(); +} +trigger_off_proc() +{ + if ( !IsDefined( self.realOrigin ) ) + self.realOrigin = self.origin; + if ( self.origin == self.realorigin ) + self.origin += ( 0, 0, -10000 ); + self.trigger_off = true; +} +trigger_wait( strName, strKey ) +{ + if( !IsDefined( strKey ) ) + { + strKey = "targetname"; + } + triggers = GetEntArray( strName, strKey ); + AssertEX( IsDefined(triggers) && triggers.size > 0, "trigger not found: " + strName + " key: " + strKey ); + ent = spawnstruct(); + array_thread( triggers, ::trigger_wait_think, ent ); + ent waittill( "trigger", eOther, trigger_hit ); + level notify( strName, eOther ); + if(IsDefined(trigger_hit)) + { + trigger_hit.who = eother; + return trigger_hit; + } + else + { + return eOther; + } +} +trigger_wait_think( ent ) +{ + self endon( "death" ); + ent endon( "trigger" ); + self waittill( "trigger", eother ); + ent notify( "trigger", eother, self ); +} +set_trigger_flag_permissions( msg ) +{ + if ( !IsDefined( level.trigger_flags ) ) + return; + level.trigger_flags[ msg ] = remove_undefined_from_array( level.trigger_flags[ msg ] ); + array_thread( level.trigger_flags[ msg ], ::update_trigger_based_on_flags ); +} +update_trigger_based_on_flags() +{ + true_on = true; + if ( IsDefined( self.script_flag_true ) ) + { + true_on = false; + tokens = create_flags_and_return_tokens( self.script_flag_true ); + for( i=0; i < tokens.size; i++ ) + { + if ( flag( tokens[ i ] ) ) + { + true_on = true; + break; + } + } + } + false_on = true; + if ( IsDefined( self.script_flag_false ) ) + { + tokens = create_flags_and_return_tokens( self.script_flag_false ); + for( i=0; i < tokens.size; i++ ) + { + if ( flag( tokens[ i ] ) ) + { + false_on = false; + break; + } + } + } + [ [ level.trigger_func[ true_on && false_on ] ] ](); +} +create_flags_and_return_tokens( flags ) +{ + tokens = strtok( flags, " " ); + for( i=0; i < tokens.size; i++ ) + { + if ( !IsDefined( level.flag[ tokens[ i ] ] ) ) + { + flag_init( tokens[ i ] ); + } + } + return tokens; +} +init_trigger_flags() +{ + level.trigger_flags = []; + level.trigger_func[ true ] = ::trigger_on; + level.trigger_func[ false ] = ::trigger_off; +} +getstruct( name, type ) +{ + assertEx( IsDefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); + if (!IsDefined(type)) + { + type = "targetname"; + } + array = level.struct_class_names[ type ][ name ]; + if( !IsDefined( array ) ) + { + return undefined; + } + if( array.size > 1 ) + { + assertMsg( "getstruct used for more than one struct of type " + type + " called " + name + "." ); + return undefined; + } + return array[ 0 ]; +} +getstructarray( name, type ) +{ + assertEx( IsDefined( level.struct_class_names ), "Tried to getstruct before the structs were init" ); + if (!IsDefined(type)) + { + type = "targetname"; + } + array = level.struct_class_names[ type ][ name ]; + if ( !IsDefined( array ) ) + return []; + return array; +} +struct_class_init() +{ + assertEx( !IsDefined( level.struct_class_names ), "level.struct_class_names is being initialized in the wrong place! It shouldn't be initialized yet." ); + level.struct_class_names = []; + level.struct_class_names[ "target" ] = []; + level.struct_class_names[ "targetname" ] = []; + level.struct_class_names[ "script_noteworthy" ] = []; + level.struct_class_names[ "script_linkname" ] = []; + for ( i=0; i < level.struct.size; i++ ) + { + if ( IsDefined( level.struct[ i ].targetname ) ) + { + if ( !IsDefined( level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ] ) ) + level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ] = []; + size = level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ].size; + level.struct_class_names[ "targetname" ][ level.struct[ i ].targetname ][ size ] = level.struct[ i ]; + } + if ( IsDefined( level.struct[ i ].target ) ) + { + if ( !IsDefined( level.struct_class_names[ "target" ][ level.struct[ i ].target ] ) ) + level.struct_class_names[ "target" ][ level.struct[ i ].target ] = []; + size = level.struct_class_names[ "target" ][ level.struct[ i ].target ].size; + level.struct_class_names[ "target" ][ level.struct[ i ].target ][ size ] = level.struct[ i ]; + } + if ( IsDefined( level.struct[ i ].script_noteworthy ) ) + { + if ( !IsDefined( level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ] ) ) + level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ] = []; + size = level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ].size; + level.struct_class_names[ "script_noteworthy" ][ level.struct[ i ].script_noteworthy ][ size ] = level.struct[ i ]; + } + if ( IsDefined( level.struct[ i ].script_linkname ) ) + { + assertex( !IsDefined( level.struct_class_names[ "script_linkname" ][ level.struct[ i ].script_linkname ] ), "Two structs have the same linkname" ); + level.struct_class_names[ "script_linkname" ][ level.struct[ i ].script_linkname ][ 0 ] = level.struct[ i ]; + } + } + for( i = 0; i < level.struct.size; i++ ) + { + if( !IsDefined( level.struct[i].target ) ) + { + continue; + } + level.struct[i].targeted = level.struct_class_names["targetname"][level.struct[i].target]; + } +} +fileprint_start( file ) +{ +} +fileprint_map_start( file ) +{ +} +fileprint_chk( file , str ) +{ +} +fileprint_map_header( bInclude_blank_worldspawn ) +{ + if ( !IsDefined( bInclude_blank_worldspawn ) ) + bInclude_blank_worldspawn = false; + assert( IsDefined( level.fileprint ) ); +} +fileprint_map_keypairprint( key1, key2 ) +{ +} +fileprint_map_entity_start() +{ +} +fileprint_map_entity_end() +{ +} +fileprint_end() +{ +} +fileprint_radiant_vec( vector ) +{ +} +is_mature() +{ + if ( level.onlineGame ) + return true; + return GetDvarInt( #"cg_mature" ); +} +is_german_build() +{ + if( GetDvar( #"language" ) == "german" ) + { + return true; + } + return false; +} +is_gib_restricted_build() +{ + if( GetDvar( #"language" ) == "german" ) + { + return true; + } + if( GetDvar( #"language" ) == "japanese" ) + { + return true; + } + return false; +} +is_true(check) +{ + return(IsDefined(check) && check); +} +is_false(check) +{ + return(IsDefined(check) && !check); +} +has_spawnflag(spawnflags) +{ + if (IsDefined(self.spawnflags)) + { + return ((self.spawnflags & spawnflags) == spawnflags); + } + return false; +} +clamp(val, val_min, val_max) +{ + if (val < val_min) + { + val = val_min; + } + else if (val > val_max) + { + val = val_max; + } + return val; +} +linear_map(num, min_a, max_a, min_b, max_b) +{ + return clamp(( (num - min_a) / (max_a - min_a) * (max_b - min_b) + min_b ), min_b, max_b); +} +death_notify_wrapper( attacker, damageType ) +{ + level notify( "face", "death", self ); + self notify( "death", attacker, damageType ); +} +damage_notify_wrapper( damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags ) +{ + level notify( "face", "damage", self ); + self notify( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags ); +} +explode_notify_wrapper() +{ + level notify( "face", "explode", self ); + self notify( "explode" ); +} +alert_notify_wrapper() +{ + level notify( "face", "alert", self ); + self notify( "alert" ); +} +shoot_notify_wrapper() +{ + level notify( "face", "shoot", self ); + self notify( "shoot" ); +} +melee_notify_wrapper() +{ + level notify( "face", "melee", self ); + self notify( "melee" ); +} +isUsabilityEnabled() +{ + return ( !self.disabledUsability ); +} +_disableUsability() +{ + self.disabledUsability++; + self DisableUsability(); +} +_enableUsability() +{ + self.disabledUsability--; + assert( self.disabledUsability >= 0 ); + if ( !self.disabledUsability ) + self EnableUsability(); +} +resetUsability() +{ + self.disabledUsability = 0; + self EnableUsability(); +} +_disableWeapon() +{ + self.disabledWeapon++; + self disableWeapons(); +} +_enableWeapon() +{ + self.disabledWeapon--; + assert( self.disabledWeapon >= 0 ); + if ( !self.disabledWeapon ) + self enableWeapons(); +} +isWeaponEnabled() +{ + return ( !self.disabledWeapon ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/common_zombie b/BO1/PC/ZM/common_zombie new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/common_zombie_patch b/BO1/PC/ZM/common_zombie_patch new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/coop_arcademode.cfg b/BO1/PC/ZM/coop_arcademode.cfg new file mode 100644 index 0000000..45e2f08 --- /dev/null +++ b/BO1/PC/ZM/coop_arcademode.cfg @@ -0,0 +1,76 @@ +set zombiemode 0 +set arcademode 0 +set cg_ScoresColor_Zombie 0.424 0.004 0 +set cg_ScoresColor_TransparencyZombie 0.8 +set cg_ScoresColor_Gamertag_0 1.0 1.0 1.0 +set cg_ScoresColor_Gamertag_1 0.486 0.812 0.933 +set cg_ScoresColor_Gamertag_2 0.965 0.792 0.314 +set cg_ScoresColor_Gamertag_3 0.514 0.925 0.533 +set cg_thirdPersonRange 75 +set cg_ScoresColor_Player_0 0.024 0.169 0.204 +set cg_ScoresColor_Player_1 0.447 0.38 0.2 +set cg_ScoresColor_Player_2 0.024 0.173 0.114 +set cg_ScoresColor_Player_3 0.196 0.059 0.047 +set cg_ScoresColor_Transparency 0.35 +set arcademode_score_suicide -500 +set arcademode_score_laststand -110 +set arcademode_score_revive 100 +set arcademode_minimumAllowedSuicides 5 +set arcademode_minimumAllowedPoints -2000 +set arcademode_minimumAllowedWarning -1000 +set arcademode_score_kill 50 +set arcademode_score_melee 70 +set arcademode_score_headshot 60 +set arcademode_score_upperbody 20 +set arcademode_score_lowerbody 0 +set arcademode_score_assist 20 +set arcademode_score_explosion 10 +set arcademode_score_explodableitem 30 +set arcademode_score_enemyexitingcar 80 +set arcademode_score_banzai 150 +set arcademode_score_vehicle 30 +set arcademode_score_dog 90 +set arcademode_score_tankassist 100 +set arcademode_score_tank 500 +set arcademode_score_tank_friendly -50 +set arcademode_score_watertower 150 +set arcademode_score_treehugger 100 +set arcademode_score_bombplant 200 +set arcademode_score_berserker 20 +set arcademode_score_hardcore 10 +set arcademode_score_body_armor 20 +set arcademode_score_thunder 10 +set arcademode_score_zombie 10 +set arcademode_score_vampire 10 +set arcademode_score_dirtyharry 10 +set arcademode_score_hard_headed 20 +set arcademode_score_dead_hands 20 +set arcademode_score_sticksstones 20 +set arcademode_score_flak_jacket 10 +set arcademode_score_morphine 10 +set arcademode_bonus_hardest2kill 1200 +set arcademode_bonus_mostrevives 1000 +set arcademode_bonus_mostheadshots 800 +set arcademode_ks_2 3 +set arcademode_ks_3 3 +set arcademode_ks_4 3 +set arcademode_ks_5 3 +set arcademode_ks_6 4 +set arcademode_ks_7 4 +set arcademode_ks_8 4 +set arcademode_ks_9 3 +set arcademode_ks_10 3 +set arcademode_ks_time_2 15 +set arcademode_ks_time_3 15 +set arcademode_ks_time_4 15 +set arcademode_ks_time_5 20 +set arcademode_ks_time_6 20 +set arcademode_ks_time_7 20 +set arcademode_ks_time_8 20 +set arcademode_ks_time_9 20 +set arcademode_ks_time_10 20 +set arcademode_ks_maxtime 25 + + + + diff --git a/BO1/PC/ZM/default.cfg b/BO1/PC/ZM/default.cfg new file mode 100644 index 0000000..0d7fa1d --- /dev/null +++ b/BO1/PC/ZM/default.cfg @@ -0,0 +1,16 @@ + +unbindall +exec thumbstick_default.cfg +exec buttons_default.cfg +bind BUTTON_START "pause" +bind BUTTON_BACK "devgui" +bind ~ "toggleconsole" +bind ` "toggleconsole" +set ui_smallfont 0.35 +set ui_mapname zombie_theater +set ui_gametype cmp +set scr_game_difficulty 1 +set scr_game_arcadescoring 0 +set scr_game_pinups 0 +exec default_statversion_sp.cfg +exec coop_arcademode.cfg diff --git a/BO1/PC/ZM/default_480p.cfg b/BO1/PC/ZM/default_480p.cfg new file mode 100644 index 0000000..4e586b2 --- /dev/null +++ b/BO1/PC/ZM/default_480p.cfg @@ -0,0 +1,12 @@ +set r_textureMode anisotropic +set ui_smallFont 0.375 +set ui_bigFont 0.5832 +set ui_extraBigFont 1.0 +set cg_overheadiconsize 1.1 +set cg_overheadnamessize 0.5 +set cg_overheadranksize 0.5 +set compassObjectiveWidth 20 +set compassObjectiveHeight 20 +set welcome_shown 0 +set cg_subtitlewidthstandard 265 +set friendlyNameFontSize 0.37 diff --git a/BO1/PC/ZM/default_720p.cfg b/BO1/PC/ZM/default_720p.cfg new file mode 100644 index 0000000..b9e34b7 --- /dev/null +++ b/BO1/PC/ZM/default_720p.cfg @@ -0,0 +1,12 @@ +set r_textureMode bilinear +set ui_smallFont 0.563 +set ui_bigFont 0.688 +set ui_extraBigFont 1.0 +set cg_overheadiconsize 1.1 +set cg_overheadnamessize 0.65 +set cg_overheadranksize 0.5 +set compassObjectiveWidth 17.5 +set compassObjectiveHeight 17.5 +set welcome_shown 0 +set cg_subtitlewidthwidescreen 450 +set cl_deathMessageWidth 480 diff --git a/BO1/PC/ZM/default_platform.cfg b/BO1/PC/ZM/default_platform.cfg new file mode 100644 index 0000000..b28fcef --- /dev/null +++ b/BO1/PC/ZM/default_platform.cfg @@ -0,0 +1,2 @@ + +discCacheOn 0 diff --git a/BO1/PC/ZM/default_splitscreen.cfg b/BO1/PC/ZM/default_splitscreen.cfg new file mode 100644 index 0000000..10ac390 --- /dev/null +++ b/BO1/PC/ZM/default_splitscreen.cfg @@ -0,0 +1,67 @@ +set ui_allow_teamchange 1 +set ui_options_open 0 +set party_maxlocalplayers 4 +reset party_allowguests +set waypointOffscreenScaleSmallest 0.65 +set compassObjectiveHeight 14 +set compassObjectiveWidth 14 +set cg_hudObjectiveTextScale 0.37 +set cg_headIconMinScreenRadius 0.03 +set cg_hudMapFriendlyHeight 15 +set cg_hudMapFriendlyWidth 15 +set cg_hudMapPlayerHeight 20 +set cg_hudMapPlayerWidth 20 +set cg_hudGrenadeIconMaxRangeFrag 250 +set cg_weaponHintsCoD1Style 0 +set com_gameMsgWindow1LineCount 5 +set scr_game_graceperiod 0 +set scr_game_allowkillcam 1 +set scr_game_onlyheadshots 0 +set scr_game_deathpointloss 0 +set scr_game_suicidepointloss 0 +set scr_team_teamkillpointloss 1 +set scr_game_spectatetype 1 +set scr_sd_game_spectatetype 1 +set scr_game_perks 1 +set scr_game_forceradar 1 +set scr_game_hardpoints 1 +set scr_allowbattlechatter 1 +set scr_allowannouncer 1 +set scr_game_forceradar 1 +set scr_vehicles_enabled 1 +set scr_disable_tacinsert 0 +set scr_disable_equipment 0 +set scr_disable_attachments 0 +set scr_disable_contracts 0 +set scr_disable_cac 0 +set scr_disable_weapondrop 0 +set scr_hardpoint_allowartillery 1 +set scr_hardpoint_allowradar 1 +set scr_hardpoint_allowdogs 1 +set scr_team_fftype 0 +set scr_team_respawntime 0 +set scr_team_teamkillspawndelay 20 +set scr_team_kickteamkillers 0 +set scr_team_teamkillerplaylistbanquantum 0 +set scr_team_teamkillerplaylistbanpenalty 0 +set scr_player_numlives 0 +set scr_player_respawndelay 0 +set scr_player_maxhealth 100 +set scr_player_suicidespawndelay 0 +set scr_player_healthregentime 5 +set scr_player_forcerespawn 1 +set scr_player_sprinttime 4 +set scr_dog_time 60 +set scr_dog_health 100 +set scr_dog_count 8 +set scr_dog_max_at_once 4 +set scr_attack_dog_time_zm 45 +set scr_attack_dog_kills_zm 25 +set scr_attack_dog_health_zm 100 +set scr_attack_dog_count_zm 3 +set scr_attack_dog_max_at_once_zm 3 +set scr_hardcore 0 +set ui_hud_hardcore 0 +set ui_hud_obituaries 1 +set ui_hud_showobjicons 1 +exec default_mp_gametypes.cfg diff --git a/BO1/PC/ZM/default_statversion_sp.cfg b/BO1/PC/ZM/default_statversion_sp.cfg new file mode 100644 index 0000000..5e26e71 --- /dev/null +++ b/BO1/PC/ZM/default_statversion_sp.cfg @@ -0,0 +1 @@ +set stat_version 1095 \ No newline at end of file diff --git a/BO1/PC/ZM/default_systemlink.cfg b/BO1/PC/ZM/default_systemlink.cfg new file mode 100644 index 0000000..ffdc082 --- /dev/null +++ b/BO1/PC/ZM/default_systemlink.cfg @@ -0,0 +1,76 @@ +reset waypointOffscreenScaleSmallest +reset compassObjectiveHeight +reset compassObjectiveWidth +reset cg_drawCrosshair +reset cg_drawCrosshairNames +reset ragdoll_explode_force +reset ragdoll_explode_upbias +reset jump_height +reset jump_slowdownEnable +reset bg_fallDamageMinHeight +reset bg_fallDamageMaxHeight +reset com_gameMsgWindow1LineCount +reset party_maxlocalplayers +reset party_allowguests +set ui_allow_teamchange 1 +set ui_options_open 0 +set cg_hudObjectiveTextScale 0.3 +set cg_headIconMinScreenRadius 0.025 +set cg_hudMapFriendlyHeight 15 +set cg_hudMapFriendlyWidth 15 +set cg_hudMapPlayerHeight 20 +set cg_hudMapPlayerWidth 20 +set cg_hudGrenadeIconMaxRangeFrag 250 +set cg_weaponHintsCoD1Style 1 +set scr_game_graceperiod 15 +set scr_game_allowkillcam 1 +set scr_game_onlyheadshots 0 +set scr_game_deathpointloss 0 +set scr_game_suicidepointloss 0 +set scr_team_teamkillpointloss 1 +set scr_game_spectatetype 1 +set scr_sd_game_spectatetype 3 +set scr_game_perks 1 +set scr_game_forceradar 0 +set scr_game_hardpoints 1 +set scr_allowbattlechatter 1 +set scr_allowannouncer 1 +set scr_game_forceradar 0 +set scr_vehicles_enabled 1 +set scr_disable_tacinsert 0 +set scr_disable_equipment 0 +set scr_disable_attachments 0 +set scr_disable_contracts 0 +set scr_disable_cac 0 +set scr_disable_weapondrop 0 +set scr_hardpoint_allowartillery 1 +set scr_hardpoint_allowradar 1 +set scr_hardpoint_allowdogs 1 +set scr_team_fftype 0 +set scr_team_respawntime 0 +set scr_team_teamkillspawndelay 20 +set scr_team_kickteamkillers 0 +set scr_team_teamkillerplaylistbanquantum 0 +set scr_team_teamkillerplaylistbanpenalty 0 +set scr_player_numlives 0 +set scr_player_respawndelay 0 +set scr_player_maxhealth 100 +set scr_player_suicidespawndelay 0 +set scr_player_healthregentime 5 +set scr_player_forcerespawn 1 +set scr_player_sprinttime 4 +set scr_dog_time 60 +set scr_dog_health 100 +set scr_dog_count 8 +set scr_dog_max_at_once 4 +set scr_attack_dog_time_zm 45 +set scr_attack_dog_kills_zm 25 +set scr_attack_dog_health_zm 100000 +set scr_attack_dog_count_zm 3 +set scr_attack_dog_max_at_once_zm 3 +set scr_hardcore 0 +set scr_oldschool 0 +set ui_hud_hardcore 0 +set ui_hud_obituaries 1 +set ui_hud_showobjicons 1 +exec default_mp_gametypes.cfg \ No newline at end of file diff --git a/BO1/PC/ZM/default_xboxlive_sp.cfg b/BO1/PC/ZM/default_xboxlive_sp.cfg new file mode 100644 index 0000000..bcefcb7 --- /dev/null +++ b/BO1/PC/ZM/default_xboxlive_sp.cfg @@ -0,0 +1,44 @@ +restoreDvars +reset waypointOffscreenScaleSmallest +reset compassObjectiveHeight +reset compassObjectiveWidth +reset cg_drawCrosshair +reset cg_drawCrosshairNames +reset ragdoll_explode_force +reset ragdoll_explode_upbias +reset jump_height +reset jump_slowdownEnable +reset bg_fallDamageMinHeight +reset bg_fallDamageMaxHeight +reset cg_hudGrenadeIconHeight +reset cg_hudGrenadeIconWidth +reset cg_hudGrenadeIconOffset +reset cg_hudGrenadePointerHeight +reset cg_hudGrenadePointerWidth +reset cg_hudGrenadePointerPivot +reset com_gameMsgWindow1LineCount +reset cg_fovscale +reset cg_drawTalk +set party_maxplayers 4 +set party_maxlocalplayers 2 +set party_headtohead 0 +set ui_allow_teamchange 0 +set cg_hudObjectiveTextScale 0.3 +set cg_headIconMinScreenRadius 0.025 +set cg_hudMapFriendlyHeight 15 +set cg_hudMapFriendlyWidth 15 +set cg_hudMapPlayerHeight 20 +set cg_hudMapPlayerWidth 20 +set cg_hudGrenadeIconMaxRangeFrag 250 +set cg_weaponHintsCoD1Style 1 +set actionslotshide 0 +set ammoCounterHide 0 +set scr_attack_dog_time_zm 45 +set scr_attack_dog_kills_zm 25 +set scr_attack_dog_health_zm 100000 +set scr_attack_dog_count_zm 3 +set scr_attack_dog_max_at_once_zm 3 +set ui_hud_hardcore 0 +set ui_hud_obituaries 1 +set ui_hud_showobjicons 1 + diff --git a/BO1/PC/ZM/exposure/zombie_cosmodrome.xpo b/BO1/PC/ZM/exposure/zombie_cosmodrome.xpo new file mode 100644 index 0000000..20d1248 Binary files /dev/null and b/BO1/PC/ZM/exposure/zombie_cosmodrome.xpo differ diff --git a/BO1/PC/ZM/exposure/zombie_temple.xpo b/BO1/PC/ZM/exposure/zombie_temple.xpo new file mode 100644 index 0000000..5265ecb Binary files /dev/null and b/BO1/PC/ZM/exposure/zombie_temple.xpo differ diff --git a/BO1/PC/ZM/expressions/functions.txt b/BO1/PC/ZM/expressions/functions.txt new file mode 100644 index 0000000..db77853 --- /dev/null +++ b/BO1/PC/ZM/expressions/functions.txt @@ -0,0 +1,456 @@ +// When adding or removing entries from this file you must modify the +// g_expFunctionNames[] array and expFunctionEnum enum to match +// in universal/com_expressions_eval.cpp + +// order does not matter +// case does not matter + +sin +cos +min +max +milliseconds +dvar +dvarint +dvarbool +dvarfloat +dvarstring +ui_active +flashbanged +scoped +scoreboard_visible +inkillcam +isdualwield +isfuelweapon +player +selecting_location +team +otherteam +marinesfield +opforfield +menuisopen +writingdata +inlobby +inprivateparty +privatepartyhost +privatepartyhostinlobby +aloneinparty +sameclanmembersinparty +aloneinlobby +adsjavelin +weaplockblink +weapattacktop +weapattackdirect +secondsastime +tablelookup +statstablelookup +getclassbonus +locstring +localvarint +localvarbool +localvarfloat +localvarstring +timeleft +secondsascountdown +gamemsgwndactive +int +string +float +gametypename +gametype +gametypedescription +scoreatrank +friendsonline +spectatingclient +keybinding +actionslotusable +hudfade +maxrecommendedplayers +acceptinginvite +gamehost +isvisibilitybitset +issplitscreen +issplitscreenhost +splitscreennum +iscinematicfinished +isselectinglocationalkillstreak +isselectingairstrike +isselectingartillery +isselectingnapalm +isselectingmortar +isselectingcomlink +hasfriends +haspendingfriends +hasinvites +partyismissingmappack +partymissingmappackerror +anynewmappacks +isintermission +issuperuser +isautojoindevuser +isitemlocked +isitemdualwieldlocked +isitemdualwieldpurchased +isitemnew +getitemref +getitemname +getitemimage +getitemunlocklevel +getitemunlockplevel +getitemdesc +getitemindex +getitemdualwieldindex +getitemdualwieldbaseindex +getitemcost +getitemdualwieldcost +getitemsellprice +getitemcount +getitemgroup +getstatbyname +isclanowner +isclanadmin +isclanmember +getclanrank +getxuid +getselfgamertag +getrankbyxuid +getprestigebyxuid +getcodpointsbyxuid +getdisplaylevelbyxuid +getclanshortdescription +getclanlongdescription +getclanDateFounded +getclanmembercount +getclanonlinemembercount +getclanname +getclanmotd +getclantagandname +getrecommendedplayercount +getMutedStatus +getUIRect +getFeederData +hasFocus +isVisible +getRank +getPrestige +getPlayerCardTitle +getdefaultclassslot +getcacFactionNameWithButtons +getitemattachment +getstatforfriendorself +getsortedstatsforfriendorself +getfloatasformattedstring +changeSortedStatsPivot +canScrollUpOrDown +getCurrentScrollBarPosition +getCombatRecordInfoBarWidth +getCombatRecordInfoBarText +getCombatRecordInfoBarTagText +getCombatRecordHistogramHeight +getCombatRecordPieChartText +getCombatRecordMinMaxScore +getCombatRecordFailedContracts +getCombatRecordLockedString +getNumWagerMatchesPlayed +getNumWagerMatchesWon +getAfterActionReportAwardsInfo +getNumPersonalBests +getPersonalBestName +getPersonalBestValue +getPersonalBestDelta +getPersonalBestPrefix +getNumWeaponUnlocks +getNumFeatureUnlocks +getUnlockedWeaponItemIndex +getUnlockedFeatureItemIndex +getNumStatsMilestones +getStatsMilestoneValue +getStatsMilestoneName +getNumChallenges +getCurrentChallengeXpReward +getCurrentChallengeCpReward +getCurrentChallengeProgress +isCurrentChallengeItemClassified +getTotalMatchesPlayed +getCopyClassConfirmationText +getCopyClassDialogTitle +isFileshareDataSummaryValid +getFileshareRecentGamesCount +getFileshareGameMap +getFileshareGameMapName +getFileshareGameType +getFileshareGameTypeName +getFileshareGameDate +getFileshareFileName +getFileshareFileId +getFileshareFileSize +getImageWidth +getTextWidth +getcomposite +iscompositevalid +isSignedIn +isProfileSignedIn +gettoastpopupwidth +gettoastpopupicon +gettoastpopuptitle +gettoastpopupdescription +getNumLives +playersAlive +getPlaylistMaxPartySize +getTime +getBombTime +canSpecCycle +canSpecFree +getDStat +getDStatForPreviousMatch +isStableStatsBufferInitialized +getClientInPlace +getClientName +toOrdinal +getScoreForClient +isDemoPlaying +isDemoClipRecording +isDemoClipPlaying +isDemoMovieRendering +isDemoThirdPersonCamera +isDemoMovieCamera +isDisplayingPartyScoreboard +getDemoTitleName +getDemoTitleDescription +getDemoAuthor +getDemoTimeInfo +getDemoDuration +getDemoSegmentCount +getDemoSegmentInformation +isClipModified +canStartDemoPlayback +getDemoSaveScreenName +getDemoSaveScreenDescription +getTheaterFilmNotSelectedMessage +isItemPurchased +isCurrentItemPurchased +isCurrentItemAttachmentPurchased +isCurrentItemOptionPurchased +isItemAttachmentPointPurchased +getCurrentItemCost +getCurrentItemSellPrice +getCurrentItemAttachmentCost +getCurrentItemName +getCurrentItemIndex +getCurrentItemAttachmentName +getCurrentItemAttachmentDesc +getCurrentItemNumAttachments +getItemNumAttachmentsEquipped +getItemEquippedAttachment +getCurrentItemAttachmentNum +getCurrentItemAttachmentPoint +PlaylistPlayerCount +CategoryPlayerCountForPlaylist +TotalPlayersInPlaylists +GetPlayersRegisteredOnline +getLeaderboardMinReqText +getBaseLbMenuName +getCurrentMapName +getCurrentGameType +getPreviousMapName +getPreviousGameType +isPartyReady +isExtraCamActive +getCurrentWeapon +ShowZombieMap +getattachmentname +getattachmentimage +getattachmentdesc +GetWeaponOptionImage +GetWeaponOptionName +isplayerjoinable +isplayerinvitable +isrecommendedplayerinvitable +isextracamstatic +getnumitemattachmentswithattachpointINT +getcurrentitemoption +getweaponoptioncost +isitemgroupnew +select +choose +hastacticalmaskoverlay +invehicle +getnumactivecontracts +getcurrentcontractindex +getcontractname +getcontractdesc +getcontractprogress +getcontractrequiredcount +getcontractcost +iscontractactive +getindexforactivecontract +getindexfornthactivecontract +iscontractinprogress +iscontractexpired +iscontractcomplete +getcontractcombattimeleft +menuhasfocus +getcustomclassloadoutitem +getcustomclassmodifier +getcustomclassname +getcacitemindex +getMachineID +approxequals +lbval +statval +areStatsFetched +isSignedInToLive +isprimarylocalclient +getlocalclientnum +getselltext +getitemprice +isguest +isfriendfromxuid +randomintrange +getselectedemblemlayer +getgroupscount +isgroup +GetWeaponOptionGroupIndex +getDownloadProgress +getUploadProgress +getUploadTimeRemaining +IsCurrentSortedItemEquipped +IsCurrentItemEquippedInAnyCustomClass +IsItemEquipped +getfeedercount +IsCurrentItemClassified +GetCurrentItemClassifiedHintText +arecontractsfetched +istimesynced +iscontractlocked +gettimescontractpurchased +gettimescontractpurchasable +getcontractcooldowntime +getremainingcontractcooldowntime +getcontractunlocklevel +getcontractrewardtext +getcontractexpirationtype +getcontractexpirationdata +isTaskInProgress +getplacewithtiesforscore +getattachmentsformatted +isinguidedmissile +isingame +emblemLayerState +emblemLayerName +emblemLayerUnlocklevel +emblemSelectedLayer +emblemLayerCost +emblemSelectedIcon +emblemIconName +emblemIconUnlockDesc +emblemIconCost +emblemIconUnlockLevel +emblemIconState +emblemPurchasedLayerCount +emblemIsModified +itemhasdualwield +itemisdualwield +getDemoFileID +getFileShareRating +getautojoinlobbystatus +getcountertotal +canRateFilmInTheater +IsClanTagFeatureLocked +IsClanTagFeaturePurchased +GetCurrentClanTagFeature +GetClanTagFeatureCost +GetClanTagFeatureName +IsItemOptionPurchasedByName +GetItemOptionByName +GetFaceCamoIndex +showbusydotsindicator +howManyReadiesNeeded +GetLiveGroupCount +getUserTagFromIndex +getFileShareFilterList +canRenderClip +canShowContentFromUser +isContentRatingAllowed +isDemonwareFetchingDone +emblemBackgroundUnlockDesc +emblemBackgroundCount +emblemBackgroundIsLocked +emblemBackgroundIsClassified +emblemBackgroundIsPurchased +emblemBackgroundMaterial +emblemBackgroundCost +emblemBackgroundName +emblemPlayerBackgroundMaterial +emblemSelectedBackground +emblemStateDisplay +emblemCategoryDisplay +emblemFilterCount +GetIndexIntoMatchScoreboard +GetWagerPlaceForMatchScoreboard +GetWagerGametypeNameFromEnum +GetCollectiblesCount +anySignedIn +anySignedInToLive +anySignedInToLiveAndStatsFetched +isProItemVersionUnlocked +IsProItemVersion +getFlagCarrierForTeam +getFlagStatusForTeam +getChallengeProgressString +getChallengeName +getName +getProgressString +getXpReward +getCpReward +getDescription +getChallengeDescription +toUpper +getPlaylistName +getTimeUntilNewContracts +needToPerformCommunitySearch +getLbTypeWithButtons +getLBFilter +getLBTypeByDuration +getScoreboardColumnHeader +getProItemVersionCost +getNumSortedItemsEquipped +getGameInvitesCount +getMySlotInfo +IsAttachmentAllowedOnItemIndex +isCurrentOrPreviousMapEntryAvailable +getFileShareTotalVotes +emblemFilterIconID +GridMove +emblemLayerCanOutline +emblemLayerCanDuplicate +getPooledFileDetails +GetClanTagFeaturePlevel +GetWeaponOptionUnlockLvl +GetWeaponOptionUnlockPLevel +Add64 +Sub64 +Div64 +Mul64 +IsPremiumSubscriber +GetUserFileRating +HostMigrationWaitingForPlayers +IsItemUnlocked +IsWeaponItemUnlocked +IsWeaponItemPurchased +IsWeaponItemClassified +GetWeaponName +IsGuestByXUID +CanSwitchToLobby +GetMapIndexByName +GetGamemodeIndexByName +serverSort +serverSortDirection +AloneInPartyIgnoreSplitscreen +AloneInLobbyIgnoreSplitscreen +IsViewportLarge +IsChallengeItemPurchased +GetChallengeAttachmentName +IsItemLockedForAll +getServerCounts +GetLowestLocalCP \ No newline at end of file diff --git a/BO1/PC/ZM/info/ai_lochit_dmgtable b/BO1/PC/ZM/info/ai_lochit_dmgtable new file mode 100644 index 0000000..f503c13 --- /dev/null +++ b/BO1/PC/ZM/info/ai_lochit_dmgtable @@ -0,0 +1 @@ +LOCDMGTABLE\none\1\helmet\4\head\4\neck\4\torso_upper\0.9\torso_lower\0.8\right_arm_upper\0.7\right_arm_lower\0.7\right_hand\0.5\left_arm_upper\0.7\left_arm_lower\0.7\left_hand\0.5\right_leg_upper\0.4\right_leg_lower\0.4\right_foot\0.2\left_leg_upper\0.4\left_leg_lower\0.4\left_foot\0.2\gun\0 \ No newline at end of file diff --git a/BO1/PC/ZM/info/bullet_penetration_sp b/BO1/PC/ZM/info/bullet_penetration_sp new file mode 100644 index 0000000..ad601fc --- /dev/null +++ b/BO1/PC/ZM/info/bullet_penetration_sp @@ -0,0 +1 @@ +BULLET_PEN_TABLE\small_bark\0\small_brick\0\small_carpet\20\small_cloth\20\small_concrete\0\small_dirt\0\small_flesh\32\small_foliage\192\small_glass\192\small_grass\0\small_gravel\32\small_ice\0\small_metal\4\small_mud\0\small_paper\192\small_plaster\16\small_rock\0\small_sand\0\small_snow\0\small_water\0\small_wood\72\small_asphalt\0\small_ceramic\0\small_plastic\192\small_rubber\8\small_cushion\8\small_fruit\192\small_paintedmetal\4\medium_bark\36\medium_brick\24\medium_carpet\20\medium_cloth\20\medium_concrete\8\medium_dirt\0\medium_flesh\96\medium_foliage\192\medium_glass\192\medium_grass\0\medium_gravel\32\medium_ice\96\medium_metal\8\medium_mud\0\medium_paper\192\medium_plaster\48\medium_rock\36\medium_sand\32\medium_snow\128\medium_water\0\medium_wood\128\medium_asphalt\24\medium_ceramic\192\medium_plastic\192\medium_rubber\24\medium_cushion\24\medium_fruit\192\medium_paintedmetal\8\large_bark\48\large_brick\64\large_carpet\20\large_cloth\20\large_concrete\24\large_dirt\0\large_flesh\128\large_foliage\192\large_glass\192\large_grass\0\large_gravel\32\large_ice\128\large_metal\16\large_mud\0\large_paper\192\large_plaster\128\large_rock\48\large_sand\32\large_snow\128\large_water\0\large_wood\192\large_asphalt\32\large_ceramic\192\large_plastic\192\large_rubber\32\large_cushion\32\large_fruit\192\large_paintedmetal\16 \ No newline at end of file diff --git a/BO1/PC/ZM/language.cfg b/BO1/PC/ZM/language.cfg new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/level_dependencies.csv b/BO1/PC/ZM/level_dependencies.csv new file mode 100644 index 0000000..851a672 --- /dev/null +++ b/BO1/PC/ZM/level_dependencies.csv @@ -0,0 +1,5 @@ + +// This file is manually edited and lists the specific common fast file dependecies for each level if one exists + +//creek_1,creek_shared + diff --git a/BO1/PC/ZM/maps/_ambientpackage.gsc b/BO1/PC/ZM/maps/_ambientpackage.gsc new file mode 100644 index 0000000..f76dd23 Binary files /dev/null and b/BO1/PC/ZM/maps/_ambientpackage.gsc differ diff --git a/BO1/PC/ZM/maps/_anim.gsc b/BO1/PC/ZM/maps/_anim.gsc new file mode 100644 index 0000000..9165ff2 --- /dev/null +++ b/BO1/PC/ZM/maps/_anim.gsc @@ -0,0 +1,1990 @@ +#include maps\_utility; +#include common_scripts\utility; +#include animscripts\shared; +#include animscripts\utility; +#include animscripts\face; +anim_reach( ents, scene, animname_override ) +{ + ents = build_ent_array(ents); + do_anim_reach( ents, scene, undefined, animname_override, false ); +} +anim_reach_aligned( ents, scene, tag, animname_override ) +{ + ents = build_ent_array(ents); + do_anim_reach( ents, scene, tag, animname_override, true ); +} +anim_generic_reach( ents, scene ) +{ + anim_reach( ents, scene, "generic" ); +} +anim_generic_reach_aligned( ents, scene, tag ) +{ + anim_reach_aligned( ents, scene, tag, "generic" ); +} +anim_reach_idle( guys, scene, idle ) +{ + guys = build_ent_array(guys); + ent = SpawnStruct(); + ent.count = guys.size; + for (i = 0; i < guys.size; i++) + { + thread reach_idle(guys[i], scene, idle, ent); + } + while (ent.count) + { + ent waittill("reach_idle_goal"); + } +} +anim_teleport( ents, scene, tag, animname_override ) +{ + ents = build_ent_array(ents); + pos = get_anim_position(tag); + org = pos["origin"]; + angles = pos["angles"]; + for (i = 0; i < ents.size; i++) + { + ent = ents[i]; + startorg = GetStartOrigin(org, angles, ent get_anim(scene, animname_override)); + if (IsSentient(ent)) + { + ent Teleport(startorg); + } + else + { + ent.origin = startorg; + } + } +} +anim_single( ents, scene, animname_override ) +{ + ents = build_ent_array(ents); + do_anim_single( ents, scene, undefined, animname_override, false ); +} +anim_single_aligned( ents, scene, tag, animname_override ) +{ + ents = build_ent_array(ents); + do_anim_single( ents, scene, tag, animname_override, true ); +} +anim_first_frame( ents, scene, tag, animname_override ) +{ + pos_array = get_anim_position( tag ); + org = pos_array[ "origin" ]; + angles = pos_array[ "angles" ]; + ents = build_ent_array(ents); + array_levelthread( ents, ::anim_first_frame_on_guy, scene, org, angles, animname_override ); +} +anim_generic( ents, scene ) +{ + anim_single( ents, scene, "generic" ); +} +anim_generic_aligned( ents, scene, tag ) +{ + anim_single_aligned( ents, scene, tag, "generic" ); +} +anim_loop( ents, scene, ender, animname_override ) +{ + ents = build_ent_array(ents); + guyPackets = []; + for( i=0; i < ents.size; i++ ) + { + packet = []; + packet[ "guy" ] = ents[ i ]; + packet[ "entity" ] = packet[ "guy" ]; + guyPackets[ guyPackets.size ] = packet; + } + anim_loop_packet( guyPackets, scene, ender, animname_override ); +} +anim_generic_loop( ents, scene, ender ) +{ + anim_loop( ents, scene, ender, "generic" ); +} +anim_loop_aligned( ents, scene, tag, ender, animname_override ) +{ + ents = build_ent_array(ents); + guyPackets = []; + for( i=0; i < ents.size; i++ ) + { + packet = []; + packet[ "guy" ] = ents[ i ]; + packet[ "entity" ] = self; + packet[ "tag" ] = tag; + guyPackets[ guyPackets.size ] = packet; + } + Assert( IsDefined( self.angles ), "Alignment node does not have angles specified." ); + anim_loop_packet( guyPackets, scene, ender, animname_override ); +} +anim_generic_loop_aligned( ents, scene, tag, ender ) +{ + anim_loop_aligned( ents, scene, tag, ender, "generic" ); +} +anim_custom_animmode( ents, custom_animmode, scene, tag, animname_override ) +{ + ents = build_ent_array(ents); + array = get_anim_position( tag ); + org = array[ "origin" ]; + angles = array[ "angles" ]; + for ( i = 0; i < ents.size; i++ ) + { + thread anim_custom_animmode_on_guy( ents[ i ], custom_animmode, scene, org, angles, animname_override ); + } + assertex( IsDefined( ents[ 0 ] ), "anim_custom_animmode called without a guy in the array" ); + ents[ 0 ] wait_until_anim_finishes( scene ); + self notify( scene ); +} +anim_generic_custom_animmode( ents, custom_animmode, scene, tag ) +{ + anim_custom_animmode( ents, custom_animmode, scene, tag, "generic" ); +} +anim_set_time( guys, scene, time ) +{ + array_thread( guys, ::anim_self_set_time, scene, time ); +} +addNotetrack_dialogue( animname, notetrack, scene, soundalias, pg_soundalias ) +{ + num = 0; + if( IsDefined( level.scr_notetrack[ animname ] ) ) + { + num = level.scr_notetrack[ animname ].size; + } + level.scr_notetrack[ animname ][ num ][ "notetrack" ] = notetrack; + level.scr_notetrack[ animname ][ num ][ "dialog" ] = soundalias; + level.scr_notetrack[ animname ][ num ][ "pg_dialog" ] = pg_soundalias; + level.scr_notetrack[ animname ][ num ][ "scene" ] = scene; +} +removeNotetrack_dialogue( animname, notetrack, scene, soundalias ) +{ + assertex( IsDefined( level.scr_notetrack[ animname ] ), "Animname not found in scr_notetrack." ); + tmp_array = []; + for( i=0; i < level.scr_notetrack[ animname ].size; i++ ) + { + if( level.scr_notetrack[ animname ][ i ][ "notetrack" ] == notetrack ) + { + dialog = level.scr_notetrack[ animname ][ i ][ "dialog" ]; + if( !IsDefined( dialog ) ) + { + dialog = level.scr_notetrack[ animname ][ i ][ "dialogue" ]; + } + if( IsDefined( dialog ) && dialog == soundalias ) + { + if( IsDefined( scene ) && IsDefined( level.scr_notetrack[ animname ][ i ][ "scene" ] ) ) + { + if( level.scr_notetrack[ animname ][ i ][ "scene" ] == scene ) + { + continue; + } + } + else + { + continue; + } + } + } + num = tmp_array.size; + tmp_array[ num ] = level.scr_notetrack[ animname ][ i ]; + } + assertex( tmp_array.size < level.scr_notetrack[ animname ].size, "Notetrack not found." ); + level.scr_notetrack[ animname ] = tmp_array; +} +addNotetrack_sound( animname, notetrack, scene, soundalias ) +{ + array = []; + array[ "notetrack" ] = notetrack; + array[ "sound" ] = soundalias; + if( !IsDefined( scene ) ) + { + scene = "any"; + } + array[ "scene" ] = scene; + if ( !IsDefined( level.scr_notetrack ) ) + { + level.scr_notetrack = []; + level.scr_notetrack[ animname ] = []; + } + else + { + if ( !IsDefined( level.scr_notetrack[ animname ] ) ) + { + level.scr_notetrack[ animname ] = []; + } + } + level.scr_notetrack[ animname ][ level.scr_notetrack[ animname ].size ] = array; +} +addOnStart_animSound( animname, scene, soundalias ) +{ + if( !IsDefined( level.scr_animSound[ animname ] ) ) + { + level.scr_animSound[ animname ] = []; + } + level.scr_animSound[ animname ][ scene ] = soundalias; +} +addNotetrack_animSound( animname, scene, notetrack, soundalias ) +{ + if( !IsDefined( level.scr_notetrack[ animname ] ) ) + { + level.scr_notetrack[ animname ] = []; + } + array = []; + array[ "notetrack" ] = notetrack; + array[ "sound" ] = soundalias; + array[ "created_by_animSound" ] = true; + array[ "scene" ] = scene; + level.scr_notetrack[ animname ][ level.scr_notetrack[ animname ].size ] = array; +} +addNotetrack_attach( animname, notetrack, model, tag, scene ) +{ + num = 0; + if( IsDefined( level.scr_notetrack[ animname ] ) ) + { + num = level.scr_notetrack[ animname ].size; + } + level.scr_notetrack[ animname ][ num ][ "notetrack" ] = notetrack; + level.scr_notetrack[ animname ][ num ][ "attach model" ] = model; + level.scr_notetrack[ animname ][ num ][ "selftag" ] = tag; + if( !IsDefined( scene ) ) + { + scene = "any"; + } + level.scr_notetrack[ animname ][ num ][ "scene" ] = scene; +} +addNotetrack_detach( animname, notetrack, model, tag, scene ) +{ + num = 0; + if( IsDefined( level.scr_notetrack[ animname ] ) ) + { + num = level.scr_notetrack[ animname ].size; + } + level.scr_notetrack[ animname ][ num ][ "notetrack" ] = notetrack; + level.scr_notetrack[ animname ][ num ][ "detach model" ] = model; + level.scr_notetrack[ animname ][ num ][ "selftag" ] = tag; + if( !IsDefined( scene ) ) + { + scene = "any"; + } + level.scr_notetrack[ animname ][ num ][ "scene" ] = scene; +} +addNotetrack_fov( animname, notetrack, scene ) +{ + num = 0; + if( IsDefined( level.scr_notetrack[ animname ] ) ) + { + num = level.scr_notetrack[ animname ].size; + } + level.scr_notetrack[ animname ][ num ][ "notetrack" ] = notetrack; + level.scr_notetrack[ animname ][ num ][ "change fov" ] = notetrack; + if( !IsDefined( scene ) ) + { + scene = "any"; + } + level.scr_notetrack[ animname ][ num ][ "scene" ] = scene; +} +addNotetrack_customFunction( animname, notetrack, function, scene ) +{ + if (!IsDefined(level.scr_notetrack)) + { + level.scr_notetrack[animname] = []; + } + num = 0; + if( IsDefined( level.scr_notetrack[ animname ] ) ) + { + num = level.scr_notetrack[ animname ].size; + } + level.scr_notetrack[ animname ][ num ][ "notetrack" ] = notetrack; + level.scr_notetrack[ animname ][ num ][ "function" ] = function; + if( !IsDefined( scene ) ) + { + scene = "any"; + } + level.scr_notetrack[ animname ][ num ][ "scene" ] = scene; +} +notetrack_customfunction_exists( animname, notetrack, function, scene ) +{ + if( IsDefined( level.scr_notetrack ) && IsDefined( level.scr_notetrack[animname] ) ) + { + keys = GetArrayKeys( level.scr_notetrack[animname] ); + for( i = 0; i < keys.size; i++ ) + { + if( IsDefined( level.scr_notetrack[animname][keys[i]] ) + && IsDefined( level.scr_notetrack[animname][keys[i]]["notetrack"] ) + && IsDefined( level.scr_notetrack[animname][keys[i]]["scene"] ) + && IsDefined( level.scr_notetrack[animname][keys[i]]["function"] ) + && level.scr_notetrack[animname][keys[i]]["notetrack"] == notetrack + && level.scr_notetrack[animname][keys[i]]["scene"] == scene + && level.scr_notetrack[animname][keys[i]]["function"] == function ) + { + return true; + } + } + } + return false; +} +addNotetrack_flag( animname, notetrack, flag, scene ) +{ + if( !IsDefined( level.scr_notetrack[ animname ] ) ) + { + level.scr_notetrack[ animname ] = []; + } + addNote = []; + addNote[ "notetrack" ] = notetrack; + addNote[ "flag" ] = flag; + if( !IsDefined( scene ) ) + { + scene = "any"; + } + addNote[ "scene" ] = scene; + level.scr_notetrack[ animname ][ level.scr_notetrack[ animname ].size ] = addNote; + if( !IsDefined( level.flag[ flag ] ) ) + { + flag_init( flag ); + } +} +addNotetrack_FXOnTag( animname, scene, notetrack, effect, tag, on_threader ) +{ + if( !IsDefined(level.scr_notetrack) || !IsDefined( level.scr_notetrack[ animname ] ) ) + { + level.scr_notetrack[animname] = []; + } + add_note = []; + add_note["notetrack"] = notetrack; + add_note["scene"] = scene; + add_note["effect"] = effect; + if( IsDefined( on_threader ) && on_threader ) + { + add_note["tag"] = tag; + } + else + { + add_note["selftag"] = tag; + } + level.scr_notetrack[animname][level.scr_notetrack[animname].size] = add_note; +} +addNotetrack_exploder( animname, notetrack, exploder, scene ) +{ + if( !IsDefined( level.scr_notetrack[ animname ] ) ) + { + level.scr_notetrack[ animname ] = []; + } + addNote = []; + addNote[ "notetrack" ] = notetrack; + addNote[ "exploder" ] = exploder; + if( !IsDefined( scene ) ) + { + scene = "any"; + } + addNote[ "scene" ] = scene; + level.scr_notetrack[ animname ][ level.scr_notetrack[ animname ].size ] = addNote; +} +addNotetrack_stop_exploder( animname, notetrack, exploder, scene ) +{ + if( !IsDefined( level.scr_notetrack[ animname ] ) ) + { + level.scr_notetrack[ animname ] = []; + } + addNote = []; + addNote[ "notetrack" ] = notetrack; + addNote[ "stop_exploder" ] = exploder; + if( !IsDefined( scene ) ) + { + scene = "any"; + } + addNote[ "scene" ] = scene; + level.scr_notetrack[ animname ][ level.scr_notetrack[ animname ].size ] = addNote; +} +set_animname( ents, animname ) +{ + for( i = 0; i < ents.size; i++ ) + { + ents[i].animname = animname; + } +} +anim_set_blend_in_time(time) +{ + self._anim_blend_in_time = time; +} +anim_set_blend_out_time(time) +{ + self._anim_blend_out_time = time; +} +get_anim(scene, animname) +{ + if (!IsDefined(animname)) + { + animname = self.animname; + } + if (IsDefined(level.scr_anim[animname])) + { + if( IsArray(level.scr_anim[animname][scene]) ) + { + total_anims = level.scr_anim[animname][scene].size; + anim_index = RandomInt( total_anims ); + return level.scr_anim[animname][scene][anim_index]; + } + return level.scr_anim[animname][scene]; + } +} +init() +{ + if( !isDefined( level.scr_special_notetrack ) ) + { + level.scr_special_notetrack = []; + } + if( !isDefined( level.scr_notetrack ) ) + { + level.scr_notetrack = []; + } + if( !isDefined( level.scr_face ) ) + { + level.scr_face = []; + } + if( !isDefined( level.scr_look ) ) + { + level.scr_look = []; + } + if( !isDefined( level.scr_animSound ) ) + { + level.scr_animSound = []; + } + if( !isDefined( level.scr_sound ) ) + { + level.scr_sound = []; + } + if( !isDefined( level.scr_radio ) ) + { + level.scr_radio = []; + } + if( !isDefined( level.scr_text ) ) + { + level.scr_text = []; + } + if( !isDefined( level.scr_anim ) ) + { + level.scr_anim[ 0 ][ 0 ] = 0; + } + if( !isDefined( level.scr_radio ) ) + { + level.scr_radio = []; + } +} +build_ent_array(ents) +{ + ent_array = []; + if (IsArray(ents)) + { + ent_array = ents; + } + else + { + ent_array[0] = ents; + } + return ent_array; +} +wait_until_anim_finishes( scene ) +{ + self endon( "finished_custom_animmode" + scene ); + self waittill( "death" ); +} +endonRemoveAnimActive( endonString, guyPackets ) +{ + self endon( "newAnimActive" ); + self waittill( endonString ); + for( i = 0; i < guyPackets.size; i++ ) + { + guy = guyPackets[ i ][ "guy" ]; + if( !IsDefined( guy ) ) + { + continue; + } + guy = guy get_anim_ent(); + guy._animActive--; + guy._lastAnimTime = GetTime(); + assert( guy._animactive >= 0 ); + } +} +debug_check(ents, scene, animname_override) +{ +} +is_a_sound_only_scene(scene, animname) +{ + if( !IsDefined( animname ) ) + { + animname = self.animname; + } + if( !IsDefined( animname )) + { + assertmsg("Animating character of type " + self.classname + " has no animname." ); + return false; + } + has_anim = false; + has_sound = true; + if(IsDefined( level.scr_anim[ animname ] )) + { + if( IsDefined( level.scr_anim[ animname ][ scene ] ) ) + { + has_anim = true; + } + } + if(IsDefined( level.scr_sound[ animname ] )) + { + if( IsDefined( level.scr_sound[ animname ][ scene ] ) ) + { + has_sound = true; + } + } + if(has_anim) + { + return(false); + } + return(has_sound); +} +assert_existance_of_anim( scene, animname ) +{ +} +anim_first_frame_on_guy( guy, scene, org, angles, animname_override ) +{ + guy.first_frame_time = GetTime(); + if ( IsDefined( animname_override ) ) + { + animname = animname_override; + } + else + { + animname = guy.animname; + } + guy set_start_pos( scene, org, angles, animname ); + animation = guy get_anim(scene, animname); + if (IsAI(guy)) + { + guy AnimScripted("anim_first_frame", org, angles, animation, "normal", guy.root_anim, 0, 0); + } + else + { + guy SetAnimKnob(animation, 1, 0, 0); + } +} +anim_custom_animmode_on_guy( guy, custom_animmode, scene, org, angles, animname_override ) +{ + animname = undefined; + if ( IsDefined( animname_override ) ) + { + animname = animname_override; + } + else + { + animname = guy.animname; + } + assertex( IsAI( guy ), "Tried to do custom_animmode on a non ai" ); + guy set_start_pos( scene, org, angles, animname_override ); + guy._animmode = custom_animmode; + guy._custom_anim = scene; + guy._tag_entity = self; + guy._scene = scene; + guy._animname = animname; + guy AnimCustom( get_overloaded_func( "animscripts\animmode", "main" ) ); +} +anim_loop_packet( guyPackets, scene, ender, animname_override ) +{ + if ( !IsDefined( ender ) ) + { + ender = "stop_loop"; + } + baseGuy = undefined; + for( i = 0; i < guyPackets.size; i++ ) + { + guy = guyPackets[ i ][ "guy" ]; + if( !IsDefined( guy ) ) + { + continue; + } + guy = guy get_anim_ent(); + if (i == 0) + { + baseGuy = guy; + } + if( !IsDefined( guy._animActive ) ) + { + guy._animActive = 0; + } + if( IsDefined( guy.anim_loop_ender ) ) + { + guy notify( guy.anim_loop_ender ); + } + guy.anim_loop_ender = ender; + guy endon( ender ); + guy endon( "death" ); + guy._animActive++; + } + self endon( ender ); + thread endonRemoveAnimActive( ender, guyPackets ); + anim_string = "looping anim"; + base_animname = undefined; + if ( IsDefined( animname_override ) ) + { + base_animname = animname_override; + } + else + { + base_animname = baseGuy.animname; + } + assertex( isarray(level.scr_anim[base_animname][scene]), "Looping anims must have an array entry in level.scr_anim! i.e. [animname][scene][0]" ); + idleanim = 0; + lastIdleanim = 0; + while( 1 ) + { + idleanim = anim_weight( base_animname, scene ); + while(( idleanim == lastIdleanim ) &&( idleanim != 0 ) ) + { + idleanim = anim_weight( base_animname, scene ); + } + lastIdleanim = idleanim; + scriptedAnimationIndex = -1; + scriptedAnimationTime = 999999; + scriptedSoundIndex = -1; + for( i = 0; i < guyPackets.size; i++ ) + { + guy = guyPackets[ i ][ "guy" ]; + if (!IsDefined(guy)) + { + return; + } + guy = guy get_anim_ent(); + pos = get_anim_position( guyPackets[ i ][ "tag" ] ); + org = pos[ "origin" ]; + angles = pos[ "angles" ]; + entity = guyPackets[ i ][ "entity" ]; + if (!IsDefined(org)) + { + org = guy.origin; + } + if (!IsDefined(angles)) + { + angles = guy.angles; + } + doFacialanim = false; + doDialogue = false; + doAnimation = false; + doText = false; + facialAnim = undefined; + dialogue = undefined; + animname = undefined; + if ( IsDefined( animname_override ) ) + { + animname = animname_override; + } + else + { + animname = guy.animname; + } + if(( IsDefined( level.scr_face[ animname ] ) ) && + ( IsDefined( level.scr_face[ animname ][ scene ] ) ) && + ( IsDefined( level.scr_face[ animname ][ scene ][ idleanim ] ) ) ) + { + doFacialanim = true; + facialAnim = level.scr_face[ animname ][ scene ][ idleanim ]; + } + if( is_mature() || !pg_loopanim_sound_exists( animname, scene, idleanim ) ) + { + if( loopanim_sound_exists( animname, scene, idleanim ) ) + { + doDialogue = true; + dialogue = level.scr_sound[ animname ][ scene ][ idleanim ]; + } + } + else if( pg_loopanim_sound_exists( animname, scene, idleanim ) ) + { + doDialogue = true; + dialogue = level.scr_sound[ animname ][ scene + "_pg" ][ idleanim ]; + } + if( IsDefined( level.scr_animSound[ animname ] ) && + IsDefined( level.scr_animSound[ animname ][ idleanim + scene ] ) ) + { + guy PlaySound( level.scr_animSound[ animname ][ idleanim + scene ] ); + } + if(( IsDefined( level.scr_anim[ animname ] ) ) && + ( IsDefined( level.scr_anim[ animname ][ scene ] ) ) ) + { + doAnimation = true; + } + if( doAnimation ) + { + if ( guy.classname == "script_vehicle" && + (!IsDefined(guy.supportsAnimScripted) || !guy.supportsAnimScripted) ) + { + guy.origin = org; + guy.angles = angles; + guy SetFlaggedAnimKnobRestart( anim_string, level.scr_anim[ animname ][ scene ][ idleanim ], 1, 0.2, 1 ); + } + else + { + guy last_anim_time_check(); + guy AnimScripted( anim_string, org, angles, level.scr_anim[ animname ][ scene ][ idleanim ] ); + } + guy notify("_anim_playing"); + animtime = GetAnimLength( level.scr_anim[ animname ][ scene ][ idleanim ] ); + if ( animtime < scriptedAnimationTime ) + { + scriptedAnimationTime = animtime; + scriptedAnimationIndex = i; + } + thread start_notetrack_wait( guy, anim_string, scene, animname ); + thread animscriptDoNoteTracksThread( guy, anim_string, scene ); + } + if(( doFacialanim ) ||( doDialogue ) ) + { + if( doAnimation ) + { + guy SaySpecificDialogue( facialAnim, dialogue, 1.0 ); + } + else + { + guy SaySpecificDialogue( facialAnim, dialogue, 1.0, anim_string ); + } + scriptedSoundIndex = i; + } + } + if( scriptedAnimationIndex != -1 ) + { + guyPackets[ scriptedAnimationIndex ][ "guy" ] get_anim_ent() waittillmatch( anim_string, "end" ); + } + else if( scriptedSoundIndex != -1 ) + { + guyPackets[ scriptedSoundIndex ][ "guy" ] get_anim_ent() waittill( anim_string ); + } + } +} +start_notetrack_wait( guy, anim_string, scene, animname ) +{ + guy notify( "stop_sequencing_notetracks" ); + thread notetrack_wait( guy, anim_string, scene, animname ); +} +anim_single_failsafeOnGuy( owner, scene ) +{ +} +anim_single_failsafe( guy, scene ) +{ + for( i=0;i= 0 ); + } + self notify( scene ); +} +anim_single_thread(guys, index, scene, org, angles, animname_override, aligned, tracker) +{ + guy = guys[index]; + guy endon("death"); + if(guy is_a_sound_only_scene(scene, animname_override)) + { + } + else + { + guy notify("stop_loop"); + guy notify("stop_single"); + } + blend_in = guy._anim_blend_in_time; + blend_out = guy._anim_blend_out_time; + guy = guy get_anim_ent(); + if (!IsDefined(guy._animActive)) + { + guy._animActive = 0; + } + guy._animActive++; + doFacialanim = false; + doDialogue = false; + doAnimation = false; + doText = false; + doLook = false; + dialogue = undefined; + facialAnim = undefined; + anim_string = "single anim"; + animname = undefined; + if ( IsDefined( animname_override ) ) + { + animname = animname_override; + } + else + { + animname = guy.animname; + } + if(( IsDefined( level.scr_face[ animname ] ) ) && + ( IsDefined( level.scr_face[ animname ][ scene ] ) ) ) + { + doFacialanim = true; + facialAnim = level.scr_face[ animname ][ scene ]; + } + if( is_mature() || !pg_sound_exists( animname, scene ) ) + { + if( sound_exists( animname, scene ) ) + { + doDialogue = true; + dialogue = level.scr_sound[ animname ][ scene ]; + } + } + else if( pg_sound_exists( animname, scene ) ) + { + doDialogue = true; + dialogue = level.scr_sound[ animname ][ scene + "_pg" ]; + } + if(( IsDefined( level.scr_look[ animname ] ) ) && + ( IsDefined( level.scr_look[ animname ][ scene ] ) ) ) + { + doLook = true; + } + if( IsDefined( level.scr_animSound[ animname ] ) && + IsDefined( level.scr_animSound[ animname ][ scene ] ) ) + { + guy playsound( level.scr_animSound[ animname ][ scene ] ); + } + animation = guy get_anim(scene, animname_override); + if (IsDefined(animation)) + { + if (IsDefined(guy.a)) + { + guy.a.coverIdleOnly = false; + } + animtime = GetAnimLength( animation ); + if ( animtime < tracker.scriptedAnimationTime ) + { + tracker.scriptedAnimationTime = animtime; + tracker.scriptedAnimationIndex = index; + } + if ( guy.classname == "script_vehicle" && + (!IsDefined(guy.supportsAnimScripted) || !guy.supportsAnimScripted) ) + { + veh_org = GetStartOrigin( org, angles, animation ); + veh_ang = GetStartAngles( org, angles, animation ); + guy.origin = veh_org; + guy.angles = veh_ang; + guy SetFlaggedAnimKnobRestart( anim_string, animation, 1, 0.2, 1 ); + } + else + { + if (!IsDefined(aligned) || !aligned) + { + if (IsDefined(guy.a) && (guy.a.state == "move")) + { + guy wait_for_foot_sync(); + } + guy AnimScripted(anim_string, guy.origin, guy.angles, animation, "normal", undefined, 1, blend_in); + } + else + { + Assert( IsDefined( angles ), "Alignment node does not have angles specified." ); + guy AnimScripted(anim_string, org, angles, animation, "normal", undefined, 1, blend_in); + } + guy last_anim_time_check(); + cut_time = 0.0; + if (IsDefined(blend_out)) + { + cut_time = blend_out; + } + guy thread earlyout_animscripted( animation, cut_time ); + } + guy notify("_anim_playing"); + thread start_notetrack_wait( guy, anim_string, scene, animname ); + thread animscriptDoNoteTracksThread( guy, anim_string, scene ); + } + if( doLook ) + { + assertex( IsDefined(animation), "Look animation \"" + scene + "\" for animname \"" + animname + "\" does not have a base animation" ); + thread anim_look( guy, scene, level.scr_look[ animname ][ scene ] ); + } + if(( doFacialanim ) ||( doDialogue ) ) + { + if( doFacialAnim ) + { + if( doDialogue ) + { + guy thread delayedDialogue( scene, doFacialanim, dialogue, level.scr_face[ animname ][ scene ] ); + } + assertex( !doanimation, "Can't play a facial anim and fullbody anim at the same time. The facial anim should be in the full body anim. Occurred on animation \"" + scene + "\"" ); + thread anim_facialAnim( guy, scene, level.scr_face[ animname ][ scene ] ); + tracker.scriptedFaceIndex = index; + } + else + { + if( IsDefined(animation) ) + { + guy SaySpecificDialogue( facialAnim, dialogue, 1.0 ); + } + else + { + if (IsAI(guy)) + { + guy thread anim_facialFiller( "single dialogue" ); + } + guy SaySpecificDialogue( facialAnim, dialogue, 1.0, "single dialogue" ); + } + } + tracker.scriptedSoundIndex = index; + } + assertex( IsDefined(animation) || doLook || doFacialanim || doDialogue || doText, "Tried to do anim scene " + scene + " on guy with animname " + animname + ", but he didn't have that anim scene." ); +} +wait_for_foot_sync() +{ + self endon("death"); + self endon("foot_sync_timeout"); + self thread wait_for_foot_sync_timeout(); + self waittillmatch("runanim", "footstep_left_large"); + self notify("foot_sync"); +} +wait_for_foot_sync_timeout() +{ + self endon("foot_sync"); + self endon("death"); + while (self.a.state == "move") + { + wait .05; + } + self notify("foot_sync_timeout"); +} +anim_deathNotify( guy, scene ) +{ + self endon( scene ); + guy waittill( "death" ); + self notify( scene ); +} +anim_facialEndNotify( guy, scene ) +{ + self endon( scene ); + guy waittillmatch( "face_done_" + scene, "end" ); + self notify( scene ); +} +anim_dialogueEndNotify( guy, scene ) +{ + self endon( scene ); + guy waittill( "single dialogue" ); + self notify( scene ); +} +anim_animationEndNotify( guy, scene ) +{ + self endon( scene ); + guy waittillmatch( "single anim", "end" ); + self notify( scene ); +} +animscriptDoNoteTracksThread( guy, animstring, scene ) +{ + guy endon( "stop_sequencing_notetracks" ); + guy endon( "death" ); + guy DoNoteTracks( animstring ); +} +add_animsound( newSound ) +{ + for( i=0; i < level.animsound_hudlimit; i++ ) + { + if( IsDefined( self.animsounds[ i ] ) ) + { + continue; + } + self.animSounds[ i ] = newSound; + return; + } + keys = GetArrayKeys( self.animsounds ); + index = keys[ 0 ]; + timer = self.animsounds[ index ].end_time; + for( i=1; i < keys.size; i++ ) + { + key = keys[ i ]; + if( self.animsounds[ key ].end_time < timer ) + { + timer = self.animsounds[ key ].end_time; + index = key; + } + } + self.animSounds[ index ] = newSound; +} +animSound_exists( scene, notetrack ) +{ + keys = GetArrayKeys( self.animSounds ); + for( i=0; i < keys.size; i++ ) + { + key = keys[ i ]; + if( self.animSounds[ key ].scene != scene ) + { + continue; + } + if( self.animSounds[ key ].notetrack != notetrack ) + { + continue; + } + self.animSounds[ key ].end_time = GetTime() + 60000; + return true; + } + return false; +} +animsound_tracker( scene, notetrack, animname ) +{ + add_to_animsound(); + if( notetrack == "end" ) + { + return; + } + if( animSound_exists( scene, notetrack ) ) + { + return; + } + newTrack = SpawnStruct(); + newTrack.scene = scene; + newTrack.notetrack = notetrack; + newTrack.animname = animname; + newTrack.end_time = GetTime() + 60000; + add_animsound( newTrack ); +} +animsound_start_tracker( scene, animname ) +{ + add_to_animsound(); + newSound = SpawnStruct(); + newSound.scene = scene; + newSound.notetrack = "#" + scene; + newSound.animname = animname; + newSound.end_time = GetTime() + 60000; + if( animSound_exists( scene, newSound.notetrack ) ) + { + return; + } + add_animsound( newSound ); +} +animsound_start_tracker_loop( scene, loop, animname ) +{ + add_to_animsound(); + scene = loop + scene; + newSound = spawnStruct(); + newSound.scene = scene; + newSound.notetrack = "#" + scene; + newSound.animname = animname; + newSound.end_time = GetTime() + 60000; + if( animSound_exists( scene, newSound.notetrack ) ) + { + return; + } + add_animsound( newSound ); +} +notetrack_wait( guy, msg, scene, animname_override ) +{ + guy endon( "stop_sequencing_notetracks" ); + guy endon( "death" ); + tag_owner = self; + animname = undefined; + if ( IsDefined( animname_override ) ) + { + animname = animname_override; + } + else + { + animname = guy.animname; + } + dialogue_array = []; + has_scripted_notetracks = IsDefined( level.scr_notetrack[ animname ] ); + if ( has_scripted_notetracks ) + { + for( i=0; i 2 ) + { + lerp_time = Int( tokens[2] ); + get_players()[0] thread lerp_fov_overtime( lerp_time, new_fov, 1 ); + } + else + { + get_players()[0] SetClientDvar( "cg_fov", new_fov ); + } + } + else + { + Assert( ToLower( tokens[1] ) == "reset" ); + level notify("stop_lerping_thread"); + if( tokens.size > 2 ) + { + lerp_time = Int( tokens[2] ); + get_players()[0] thread lerp_fov_overtime( lerp_time, 65, 1 ); + } + else + { + get_players()[0] SetClientDvar( "cg_fov", 65 ); + } + } + } + if( IsDefined( scr_notetrack[ "sound" ] ) ) + { + guy thread play_sound_on_tag( scr_notetrack[ "sound" ], undefined, true ); + } + if( !dialogueNotetrack ) + { + if( IsDefined( scr_notetrack[ "dialog" ] ) && IsDefined( dialogue_array[ scr_notetrack[ "dialog" ] ] ) ) + { + anim_facial( guy, i, "dialog", animname ); + dialogue_array[ scr_notetrack[ "dialog" ] ] = undefined; + dialogueNotetrack = true; + } + } + if( IsDefined( scr_notetrack[ "create model" ] ) ) + { + anim_addModel( guy, scr_notetrack ); + } + else if( IsDefined( scr_notetrack[ "delete model" ] ) ) + { + anim_removeModel( guy, scr_notetrack ); + } + if(( IsDefined( scr_notetrack[ "selftag" ] ) ) && + ( IsDefined( scr_notetrack[ "effect" ] ) ) ) + { + playfxOnTag( + level._effect[ scr_notetrack[ "effect" ] ], guy, + scr_notetrack[ "selftag" ] ); + } + if( IsDefined( scr_notetrack[ "tag" ] ) && IsDefined( scr_notetrack[ "effect" ] ) ) + { + playfxOnTag( level._effect[ scr_notetrack[ "effect" ] ], tag_owner, scr_notetrack[ "tag" ] ); + } + if( IsDefined( level.scr_special_notetrack[ animname ] ) ) + { + tag = random( level.scr_special_notetrack[ animname ] ); + if( IsDefined( tag[ "tag" ] ) ) + { + playfxOnTag( level._effect[ tag[ "effect" ] ], tag_owner, tag[ "tag" ] ); + } + else if( IsDefined( tag[ "selftag" ] ) ) + { + playfxOnTag( level._effect[ tag[ "effect" ] ], self, tag[ "tag" ] ); + } + } + } + } + } + prefix = GetSubStr( notetrack, 0, 3 ); + if ( prefix == "ps_" ) + { + alias = GetSubStr( notetrack, 3 ); + guy thread play_sound_on_tag( alias, undefined, true ); + } + } +} +anim_addModel( guy, array ) +{ + if( !IsDefined( guy.ScriptModel ) ) + { + guy.ScriptModel = []; + } + index = guy.ScriptModel.size; + guy.ScriptModel[ index ] = Spawn( "script_model", ( 0, 0, 0 ) ); + guy.ScriptModel[ index ] SetModel( array[ "create model" ] ); + guy.ScriptModel[ index ].origin = guy GetTagOrigin( array[ "selftag" ] ); + guy.ScriptModel[ index ].angles = guy GetTagAngles( array[ "selftag" ] ); +} +anim_removeModel( guy, array ) +{ + for( i=0;i 1 ) + { + weights = 0; + anim_weight = 0; + for( i = 0; i < total_anims; i++ ) + { + if( IsDefined( level.scr_anim[ animname ][ scene + "weight" ] ) ) + { + if( IsDefined( level.scr_anim[ animname ][ scene + "weight" ][ i ] ) ) + { + weights++; + anim_weight += level.scr_anim[ animname ][ scene + "weight" ][ i ]; + } + } + } + if( weights == total_anims ) + { + anim_play = randomfloat( anim_weight ); + anim_weight = 0; + for( i=0;i 1-closeToZero ) + { + middleFraction = 1-closeToZero; + } + animWeights[ "left" ] = middleFraction; + animWeights[ "right" ] =( 1 - middleFraction ); + } + else + { + animWeights[ "left" ] = closeToZero; + animWeights[ "right" ] = 1; + } + wait( changeTime ); + } +} +anim_facialAnim( guy, scene, faceanim ) +{ + guy endon( "death" ); + self endon( scene ); + changeTime = 0.05; + guy notify( "newLookTarget" ); + waittillframeend; + closeToZero = 0.3; + guy SetAnim( %scripted_look_straight, 0, 0 ); + guy SetAnim( %scripted_look_straight, 1, 0.5 ); + guy setflaggedanimknobrestart( "face_done_" + scene, faceanim, 1, 0, 1 ); + thread clearFaceAnimOnAnimdone( guy, "face_done_" + scene, scene ); +} +anim_facialFiller( msg, lookTarget ) +{ + self endon( "death" ); + changeTime = 0.05; + self notify( "newLookTarget" ); + self endon( "newLookTarget" ); + waittillframeend; + closeToZero = 0.3; + if( !IsDefined( looktarget ) && IsDefined( self.looktarget ) ) + { + looktarget = self.looktarget; + } + if( IsDefined( looktarget ) ) + { + thread chatAtTarget( msg, lookTarget ); + return; + } + self set_talker_until_msg( msg ); + changeTime = 0.3; + self ClearAnim( %scripted_look_straight, changeTime ); +} +set_talker_until_msg( msg, talkanim ) +{ + self endon( msg ); + for ( ;; ) + { + self SendFaceEvent( "face_talk" ); + wait( 0.05 ); + } +} +talk_for_time( timer ) +{ + self endon( "death" ); + talkAnim = %generic_talker_allies; + if ( self.team == "axis" ) + { + talkAnim = %generic_talker_axis; + } + self SetAnimKnobRestart( talkAnim, 1, 0, 1 ); + self SetAnim( %scripted_talking, 1, 0.1 ); + wait( timer ); + changeTime = 0.3; + self ClearAnim( %scripted_talking, 0.1 ); + self ClearAnim( %scripted_look_straight, changeTime ); +} +GetYawAngles( angles1, angles2 ) +{ + yaw = angles1[ 1 ] - angles2[ 1 ]; + yaw = AngleClamp180( yaw ); + return yaw; +} +chatAtTarget( msg, lookTarget ) +{ + self endon( msg ); + self endon( "death" ); + self thread lookRecenter( msg ); + array[ "right" ] = %generic_lookupright; + array[ "left" ] = %generic_lookupleft; + array[ "left_angle" ] = -65; + array[ "right_angle" ] = 65; + closeToZero = 0.01; + org = looktarget.origin; + moveRange = 2.0; + changeTime = 0.3; + for( ;; ) + { + if( isalive( looktarget ) ) + { + org = looktarget.origin; + } + angles = AnglesToRight( self GetTagAngles( "J_Spine4" ) ); + angles = vector_scale( angles, 10 ); + angles = VectorToAngles(( 0, 0, 0 ) - angles ); + yaw = angles[ 1 ] - GetYaw( org ); + destyaw = AngleClamp180( yaw ); + moveRange = abs( destYaw - self.a.lookAngle ) * 1; + if( destYaw > self.a.lookangle + moveRange ) + { + self.a.lookangle += moveRange; + } + else if( destYaw < self.a.lookangle - moveRange ) + { + self.a.lookangle -= moveRange; + } + else + { + self.a.lookangle = destYaw; + } + destYaw = self.a.lookangle; + if( destYaw <= array[ "left_angle" ] ) + { + animWeights[ "left" ] = 1; + animWeights[ "right" ] = closeToZero; + } + else if( destYaw < array[ "right_angle" ] ) + { + middleFraction =( array[ "right_angle" ] - destYaw ) /( array[ "right_angle" ] - array[ "left_angle" ] ); + if( middleFraction < closeToZero ) + { + middleFraction = closeToZero; + } + if( middleFraction > 1-closeToZero ) + { + middleFraction = 1-closeToZero; + } + animWeights[ "left" ] = middleFraction; + animWeights[ "right" ] = ( 1 - middleFraction ); + } + else + { + animWeights[ "left" ] = closeToZero; + animWeights[ "right" ] = 1; + } + self SetAnim( array[ "left" ], animWeights[ "left" ], changeTime ); + self SetAnim( array[ "right" ], animWeights[ "right" ], changeTime ); + wait( changeTime ); + } +} +lookRecenter( msg ) +{ + self endon( "newLookTarget" ); + self endon( "death" ); + self waittill( msg ); + self ClearAnim( %scripted_talking, 0.1 ); + self SetAnim( %generic_lookupright, 1, 0.3 ); + self SetAnim( %generic_lookupleft, 1, 0.3 ); + self SetAnim( %scripted_look_straight, 0.2, 0.1 ); + wait( 0.2 ); + self ClearAnim( %scripted_look_straight, 0.2 ); +} +lookLine( org, msg ) +{ + self notify( "lookline" ); + self endon( "lookline" ); + self endon( msg ); + self endon( "death" ); + for( ;; ) + { + line( self GetEye(), org +( 0, 0, 60 ), ( 1, 1, 0 ), 1 ); + wait( 0.05 ); + } +} +reach_idle( guy, scene, idle, ent ) +{ + anim_reach_aligned( guy, scene ); + ent.count--; + ent notify( "reach_idle_goal" ); + anim_loop( guy, idle ); +} +delayedDialogue( scene, doAnimation, dialogue, animationName ) +{ + assertex( animhasnotetrack( animationName, "dialog" ), "Animation " + scene + " does not have a dialog notetrack." ); + self waittillmatch( "face_done_" + scene, "dialog" ); + if( doAnimation ) + { + self SaySpecificDialogue( undefined, dialogue, 1.0 ); + } + else + { + self SaySpecificDialogue( undefined, dialogue, 1.0, "single dialogue" ); + } +} +clearFaceAnimOnAnimdone( guy, msg, scene ) +{ + guy endon( "death" ); + guy waittillmatch( msg, "end" ); + changeTime = 0.3; + guy ClearAnim( %scripted_look_straight, changeTime ); +} +anim_start_pos( ents, scene, tag ) +{ + ents = build_ent_array(ents); + pos = get_anim_position( tag ); + org = pos[ "origin" ]; + angles = pos[ "angles" ]; + array_thread( ents, ::set_start_pos, scene, org, angles ); +} +set_start_pos( scene, org, angles, animname_override ) +{ + if (IsSentient(self)) + { + origin = GetStartOrigin( org, angles, get_anim(scene, animname_override) ); + angles = GetStartAngles( org, angles, get_anim(scene, animname_override) ); + self ForceTeleport(origin, angles); + } + else + { + self.origin = GetStartOrigin( org, angles, get_anim(scene, animname_override) ); + self.angles = GetStartAngles( org, angles, get_anim(scene, animname_override) ); + } +} +add_to_animsound() +{ + if( !IsDefined( self.animSounds ) ) + { + self.animSounds = []; + } + isInArray = false; + for( i=0; i < level.animSounds.size; i++ ) + { + if( self == level.animSounds[ i ] ) + { + isInArray = true; + break; + } + } + if( !isInArray ) + { + level.animSounds[ level.animSounds.size ] = self; + } +} +anim_self_set_time( scene, time ) +{ + self SetAnimTime( self getanim( scene ), time ); +} +last_anim_time_check() +{ + if ( !IsDefined( self.last_anim_time ) ) + { + self.last_anim_time = GetTime(); + return; + } + time = GetTime(); + if ( self.last_anim_time == time ) + { + wait( 0.05 ); + } + self.last_anim_time = time; +} +loopanim_sound_exists( animname, scene, idleanim ) +{ + if( IsDefined( level.scr_sound[ animname ] ) && IsDefined( level.scr_sound[ animname ][ scene ] ) && IsDefined( level.scr_sound[ animname ][ scene ][ idleanim ] ) ) + { + return true; + } + return false; +} +pg_loopanim_sound_exists( animname, scene, idleanim ) +{ + if( IsDefined( level.scr_sound[ animname ] ) && IsDefined( level.scr_sound[ animname ][ scene + "_pg" ] ) && IsDefined( level.scr_sound[ animname ][ scene + "_pg" ][ idleanim ] ) ) + { + return true; + } + return false; +} +sound_exists( animname, scene ) +{ + if( IsDefined( level.scr_sound[ animname ] ) && IsDefined( level.scr_sound[ animname ][ scene ] ) ) + { + return true; + } + return false; +} +animation_exists( animname, scene ) +{ + if( IsDefined( level.scr_anim[ animname ] ) && IsDefined( level.scr_anim[ animname ][ scene ] ) ) + { + return true; + } + return false; +} +pg_sound_exists( animname, scene ) +{ + if( IsDefined( level.scr_sound[ animname ] ) && IsDefined( level.scr_sound[ animname ][ scene + "_pg" ] ) ) + { + return true; + } + return false; +} +earlyout_animscripted(animation, cut_time, blend_time) +{ + DEFAULT_CUT_TIME = 0.3; + self endon("death"); + self endon("stop_single"); + if (!IsDefined(cut_time)) + { + cut_time = DEFAULT_CUT_TIME; + } + if (!IsDefined(blend_time)) + { + blend_time = cut_time; + } + if (cut_time <= 0) + { + return; + } + anim_time = GetAnimLength(animation); + wait (anim_time - cut_time); + self anim_stopanimscripted(blend_time); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_animatedmodels.gsc b/BO1/PC/ZM/maps/_animatedmodels.gsc new file mode 100644 index 0000000..1751a4f Binary files /dev/null and b/BO1/PC/ZM/maps/_animatedmodels.gsc differ diff --git a/BO1/PC/ZM/maps/_apc.gsc b/BO1/PC/ZM/maps/_apc.gsc new file mode 100644 index 0000000..869c41d Binary files /dev/null and b/BO1/PC/ZM/maps/_apc.gsc differ diff --git a/BO1/PC/ZM/maps/_art.gsc b/BO1/PC/ZM/maps/_art.gsc new file mode 100644 index 0000000..7a9fab5 Binary files /dev/null and b/BO1/PC/ZM/maps/_art.gsc differ diff --git a/BO1/PC/ZM/maps/_audio.gsc b/BO1/PC/ZM/maps/_audio.gsc new file mode 100644 index 0000000..906e31f Binary files /dev/null and b/BO1/PC/ZM/maps/_audio.gsc differ diff --git a/BO1/PC/ZM/maps/_autosave.gsc b/BO1/PC/ZM/maps/_autosave.gsc new file mode 100644 index 0000000..2d7cfd1 --- /dev/null +++ b/BO1/PC/ZM/maps/_autosave.gsc @@ -0,0 +1,462 @@ +#include maps\_utility; +#include common_scripts\utility; +main() +{ + level.lastAutoSaveTime = 0; + flag_init( "game_saving" ); + flag_init( "can_save" ); + flag_set( "can_save" ); +} +autosave_description() +{ + return( &"AUTOSAVE_AUTOSAVE" ); +} +autosave_names( num ) +{ + if( num == 0 ) + { + savedescription = &"AUTOSAVE_GAME"; + } + else + { + savedescription = &"AUTOSAVE_NOGAME"; + } + return savedescription; +} +start_level_save() +{ + flag_wait( "all_players_connected" ); + flag_wait( "starting final intro screen fadeout" ); + wait( 0.5 ); + players = get_players(); + players[0] player_flag_wait( "loadout_given" ); + if( level.createFX_enabled ) + { + return; + } + if( level.missionfailed ) + { + return; + } + if( flag( "game_saving" ) ) + { + return; + } + flag_set( "game_saving" ); + imagename = "levelshots/autosave/autosave_" + level.script + "start"; + for( i = 0; i < players.size; i++ ) + { + players[i].savedVisionSet = players[i] GetVisionSetNaked(); + } + SaveGame( "levelstart", &"AUTOSAVE_LEVELSTART", imagename, true ); + setDvar( "ui_grenade_death", "0" ); + println( "Saving level start saved game" ); + flag_clear( "game_saving" ); +} +trigger_autosave( trigger ) +{ + if( !IsDefined( trigger.script_autosave ) ) + { + trigger.script_autosave = 0; + } + autosave_think( trigger ); +} +autosave_think( trigger ) +{ + savedescription = autosave_names( trigger.script_autosave ); + if( !( IsDefined( savedescription ) ) ) + { + println( "autosave", self.script_autosave, " with no save description in _autosave.gsc!" ); + return; + } + trigger waittill( "trigger", ent ); + num = trigger.script_autosave; + imagename = "levelshots/autosave/autosave_" + level.script + num; + try_auto_save( num, savedescription, imagename, undefined, ent ); + if( IsDefined( trigger ) ) + { + wait 2; + trigger delete(); + } +} +autosave_name_think( trigger ) +{ + trigger waittill( "trigger", ent ); + if( IsDefined( level.customautosavecheck ) ) + { + if( ![[level.customautosavecheck]]() ) + { + return; + } + } + name = trigger.script_autosavename; + level._save_pos = trigger.origin; + level._save_trig_ent = ent getentitynumber(); + maps\_utility::set_breadcrumbs_player_positions(); + maps\_utility::autosave_by_name( name ); + wait 2; + if( IsDefined( trigger ) ) + { + trigger delete(); + } +} +trigger_autosave_immediate( trigger ) +{ + trigger waittill( "trigger" ); +} +auto_save_print( msg, msg2 ) +{ + msg = " AUTOSAVE: " + msg; + if( IsDefined( msg2 ) ) + { + println( msg, msg2 ); + } + else + { + println( msg ); + } +} +autosave_game_now( suppress_print ) +{ + if( flag( "game_saving" ) ) + { + return false; + } + if( !IsAlive( get_host() ) ) + { + return false; + } + filename = "save_now"; + descriptionString = autosave_description(); + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + players[i].savedVisionSet = players[i] GetVisionSetNaked(); + } + if( IsDefined( suppress_print ) ) + { + saveId = saveGameNoCommit( filename, descriptionString, "$default", true ); + } + else + { + saveId = saveGameNoCommit( filename, descriptionString ); + } + wait( 0.05 ); + if( isSaveRecentlyLoaded() ) + { + level.lastAutoSaveTime = GetTime(); + return false; + } + if( saveId < 0 ) + { + return false; + } + if( !try_to_autosave_now() ) + { + return false; + } + flag_set( "game_saving" ); + wait 2; + if( try_to_autosave_now() ) + { + level notify( "save_success" ); + commitSave( saveId ); + setDvar( "ui_grenade_death", "0" ); + } + flag_clear( "game_saving" ); + return true; +} +autosave_now_trigger( trigger ) +{ + trigger waittill( "trigger" ); + autosave_now(); +} +try_to_autosave_now() +{ + if( !issavesuccessful() ) + { + return false; + } + if( !autosave_health_check() ) + { + return false; + } + if( !flag( "can_save" ) ) + { + return false; + } + return true; +} +autosave_check_simple() +{ + if( IsDefined( level.special_autosavecondition ) && ![[level.special_autosavecondition]]() ) + { + return false; + } + if( level.missionfailed ) + { + return false; + } + if( maps\_laststand::player_any_player_in_laststand() ) + { + return false; + } + if( IsDefined( level.savehere ) && !level.savehere ) + { + return false; + } + if( IsDefined( level.canSave ) && !level.canSave ) + { + return false; + } + if( !flag( "can_save" ) ) + { + return false; + } + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( players[i] call_overloaded_func( "animscripts\banzai", "in_banzai_attack" ) ) + { + return false; + } + axis = GetAiArray( "axis" ); + for ( j = 0; j < axis.size; j++ ) + { + if ( isdefined(axis[j].banzai) && axis[j].banzai ) + { + if ( isdefined(axis[j].enemy) && axis[j].enemy == players[i] ) + { + return false; + } + if ( isdefined(axis[j].favoriteEnemy) && axis[j].favoriteEnemy == players[i] ) + { + return false; + } + } + } + } + return true; +} +try_auto_save( filename, description, image, timeout, ent ) +{ + if( !flag( "all_players_connected" ) ) + { + flag_wait( "all_players_connected" ); + wait( 3 ); + } + level endon( "save_success" ); + flag_waitopen( "game_saving" ); + flag_set( "game_saving" ); + descriptionString = autosave_description(); + start_save_time = GetTime(); + if(!isdefined(ent)) + { + ent = get_players()[0]; + } + level._save_pos = ent.origin; + level._save_trig_ent = ent getentitynumber(); + maps\_utility::set_breadcrumbs_player_positions(); + wait (0.05); + while(1) + { + if( isSaveRecentlyLoaded() ) + { + level.lastAutoSaveTime = GetTime(); + break; + } + if( autosave_check() && !isSaveRecentlyLoaded() ) + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + players[i].savedVisionSet = players[i] GetVisionSetNaked(); + } + saveId = saveGameNoCommit( filename, descriptionString, image, coopGame() ); + if( !IsDefined( saveId ) || saveId < 0 ) + { + flag_clear( "game_saving" ); + return false; + } + wait(6); + retries = 0; + while (retries < 8) + { + if ( autosave_check_simple() ) + { + commitSave( saveId ); + level.lastSaveTime = GetTime(); + setDvar( "ui_grenade_death", "0" ); + flag_clear( "game_saving" ); + return true; + } + retries++; + wait(2); + } + flag_clear( "game_saving" ); + return false; + } + wait(1); + } + flag_clear( "game_saving" ); + return false; +} +autosave_check( doPickyChecks ) +{ + if( IsDefined( level.special_autosavecondition ) && ![[level.special_autosavecondition]]() ) + { + return false; + } + if( level.missionfailed ) + { + return false; + } + if( maps\_laststand::player_any_player_in_laststand() ) + { + return false; + } + if( !IsDefined( doPickyChecks ) ) + { + doPickyChecks = true; + } + if( !autosave_health_check() ) + { + return false; + } + if( !autosave_threat_check( doPickyChecks ) ) + { + return false; + } + if( !autosave_player_check() ) + { + return false; + } + if( IsDefined( level.dont_save_now ) && level.dont_save_now ) + { + return false; + } + if( !IsSaveSuccessful() ) + { + return false; + } + return true; +} +autosave_player_check() +{ + host = get_host(); + if( host IsMeleeing() ) + { + return false; + } + if( host IsThrowingGrenade() && host GetCurrentOffHand() != "molotov" ) + { + return false; + } + if( host IsFiring() ) + { + return false; + } + if( IsDefined( host.shellshocked ) && host.shellshocked ) + { + return false; + } + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( players[i] call_overloaded_func( "animscripts\banzai", "in_banzai_attack" ) ) + { + return false; + } + axis = GetAiArray( "axis" ); + for ( j = 0; j < axis.size; j++ ) + { + if ( isdefined(axis[j].banzai) && axis[j].banzai ) + { + if ( isdefined(axis[j].enemy) && axis[j].enemy == players[i] ) + { + return false; + } + if ( isdefined(axis[j].favoriteEnemy) && axis[j].favoriteEnemy == players[i] ) + { + return false; + } + } + } + } + return true; +} +autosave_health_check() +{ + players = get_players(); + if( players.size > 1 ) + { + for( i = 1; i < players.size; i ++ ) + { + if( players[i] player_flag( "player_has_red_flashing_overlay" ) ) + { + return false; + } + } + } + host = get_host(); + healthFraction = host.health / host.maxhealth; + if( healthFraction < 0.5 ) + { + return false; + } + if( host player_flag( "player_has_red_flashing_overlay" ) ) + { + return false; + } + return true; +} +autosave_threat_check( doPickyChecks ) +{ + if( level.script == "see2" ) + { + return true; + } + host = get_host(); + enemies = GetAISpeciesArray( "axis", "all" ); + for( i = 0; i < enemies.size; i++ ) + { + if( !IsDefined( enemies[i].enemy ) ) + { + continue; + } + if( enemies[i].enemy != host ) + { + continue; + } + if( enemies[i].isdog ) + { + if( DistanceSquared( enemies[i].origin, host.origin ) < ( 384 * 384 ) ) + { + return( false ); + } + continue; + } + if( enemies[i].a.lastShootTime > GetTime() - 500 ) + { + if( doPickyChecks || enemies[i] animscripts\utility::canShootEnemy() ) + { + return( false ); + } + } + if( enemies[i].a.alertness == "aiming" && enemies[i] animscripts\utility::canShootEnemy() ) + { + return( false ); + } + if( IsDefined( enemies[i].a.personImMeleeing ) && enemies[i].a.personImMeleeing == host ) + { + return( false ); + } + } + if( player_is_near_live_grenade() ) + { + return false; + } + return( true ); +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_ballistic_knife.gsc b/BO1/PC/ZM/maps/_ballistic_knife.gsc new file mode 100644 index 0000000..fd34b20 Binary files /dev/null and b/BO1/PC/ZM/maps/_ballistic_knife.gsc differ diff --git a/BO1/PC/ZM/maps/_banzai.gsc b/BO1/PC/ZM/maps/_banzai.gsc new file mode 100644 index 0000000..9bbf734 --- /dev/null +++ b/BO1/PC/ZM/maps/_banzai.gsc @@ -0,0 +1,452 @@ +#include maps\_utility; +#include common_scripts\utility; +init() +{ + self call_overloaded_func( "animscripts\banzai", "banzai_init_anims" ); + PrecacheShellshock( "banzai_impact" ); + PrecacheString( &"SCRIPT_PLATFORM_BANZAI_HINT" ); + PrecacheString( &"SCRIPT_PLATFORM_BANZAI_DEATH_DO_NOTHING" ); + PrecacheString( &"SCRIPT_PLATFORM_BANZAI_DEATH_TOO_SOON" ); + PrecacheString( &"SCRIPT_PLATFORM_BANZAI_DEATH_TOO_LATE" ); + level._effects[ "stab_wound" ] = loadfx( "impacts/fx_flesh_bayonet_neck" ); + level thread check_interactive_hands(); +} +check_interactive_hands() +{ +} +spawned_banzai_immediate() +{ + if ( spawn_failed( self ) ) + return; + banzai_force(); +} +spawned_banzai_dynamic() +{ + banzai(); +} +banzai() +{ + self call_overloaded_func( "animscripts\banzai", "init" ); + self endon( "death" ); + self endon( "stop_banzai_thread" ); + if( IsDefined( self.target ) && ( !IsDefined( self.banzai_no_wait ) || ( Isdefined( self.banzai_no_wait ) && !self.banzai_no_wait ) ) ) + { + self waittill( "reached_path_end" ); + } + wait_time = 3 + RandomFloat( 2 ); + self thread banzai_print( "Banzai wait: " + wait_time ); + wait( wait_time ); + self thread banzai_print( "Getting nearby Banzai-ers" ); + others = self get_nearby_banzai_guys(); + self banzai_pump_up(); + self thread staggered_banzai_charge(); + for( i = 0; i < others.size; i++ ) + { + if ( isalive(others[i]) && isdefined(others[i]) ) + { + others[i] thread staggered_banzai_charge(); + } + } +} +banzai_force() +{ + self call_overloaded_func( "animscripts\banzai", "init" ); + self endon( "death" ); + self.banzai = true; + self.inmeleecharge = true; + if( IsDefined( self.target ) && ( !IsDefined( self.banzai_no_wait ) || ( Isdefined( self.banzai_no_wait ) && !self.banzai_no_wait ) ) ) + { + self waittill( "reached_path_end" ); + } + self banzai_charge( true ); +} +may_banzai_attack( enemy, maxAttackers ) +{ + assert ( IsDefined( enemy ) ); + if ( enemy call_overloaded_func( "animscripts\banzai", "in_banzai_melee" ) && DistanceSquared( self.origin, enemy.origin ) < 96 * 96 ) + return false; + if ( IsDefined( enemy.num_banzai_chargers ) && enemy.num_banzai_chargers >= maxAttackers ) + return false; + if ( IsDefined( enemy.no_banzai_attack ) && enemy.no_banzai_attack ) + return false; + if ( IsDefined( enemy.magic_bullet_shield ) && enemy.magic_bullet_shield ) + { + if ( enemy.a.pose != "stand" ) + return false; + } + if ( IsPlayer( enemy ) ) + { + if ( IsDefined( enemy.usingturret ) && enemy.usingturret ) + return false; + if ( IsDefined( enemy.usingvehicle ) && enemy.usingvehicle ) + return false; + if ( !check_player_can_see_me( enemy ) ) + return false; + if ( enemy maps\_laststand::player_is_in_laststand() ) + return false; + if( IsDefined(self.primaryweapon) && self.primaryweapon == "type100_smg") + return false; + } + return true; +} +should_switch_immediately( enemy ) +{ + if ( !IsDefined( enemy ) ) + return true; + if ( !IsAlive( enemy ) ) + return true; + if ( IsDefined( enemy.no_banzai_attack ) && enemy.no_banzai_attack ) + return true; + if ( IsDefined( enemy.magic_bullet_shield ) && enemy.magic_bullet_shield ) + { + if ( enemy.a.pose != "stand" ) + return true; + } + if ( IsPlayer( enemy ) ) + { + if ( IsDefined( enemy.usingTurret ) && enemy.usingTurret ) + return true; + if ( IsDefined( enemy.usingVehicle ) && enemy.usingvehicle ) + return true; + if ( enemy maps\_laststand::player_is_in_laststand() ) + return true; + if ( distanceSquared(self.origin, enemy.origin) < 20736 ) + { + if ( self.a.movement == "stop" && (self.origin[2] < (enemy.origin[2]-24)) ) + return true; + } + } + return false; +} +find_enemy() +{ + self endon("death"); + if(!isDefined(self.team)) + { + return undefined; + } + if( self.team == "axis" ) + { + opposite_team = "allies"; + } + else + { + opposite_team = "axis"; + } + maxDistance = 4000; + if ( IsDefined( self.script_max_banzai_distance ) ) + { + maxDistance = self.script_max_banzai_distance; + } + clear_blocked_enemy_cache(); + if ( !IsDefined( self.script_player_chance ) ) + { + ais = GetAiArray( opposite_team ); + players = get_players(); + enemies = array_combine( players, ais ); + enemies = get_array_of_closest( self.origin, enemies, undefined, undefined, maxDistance ); + for ( numAttackers = 1; numAttackers <= 2; numAttackers++) + { + for ( i = 0; i < enemies.size; i++ ) + { + if ( may_banzai_attack( enemies[i], numAttackers ) ) + return enemies[i]; + } + } + players = get_array_of_closest( self.origin, players, undefined, undefined, maxDistance ); + for ( i = 0; i < players.size; i++ ) + { + if ( may_banzai_attack( players[i], numAttackers ) ) + return players[i]; + } + return undefined; + } + if ( self.script_player_chance > 0 ) + { + enemies = get_players(); + enemies = get_array_of_closest( self.origin, enemies, undefined, undefined, maxDistance ); + for ( i = 0; i < enemies.size; i++ ) + { + if ( may_banzai_attack( enemies[i], 3 ) ) + { + dieRoll = RandomInt( 100 ); + if ( dieRoll < self.script_player_chance ) + { + return enemies[i]; + } + } + } + } + enemies = GetAiArray( opposite_team ); + enemies = get_array_of_closest( self.origin, enemies, undefined, undefined, maxDistance ); + for ( i = 0; i < enemies.size; i++ ) + { + if ( may_banzai_attack( enemies[i], 2 ) ) + return enemies[i]; + } + return undefined; +} +check_player_can_see_me( player ) +{ + if ( !IsDefined( self.script_banzai_within_fov ) || !self.script_banzai_within_fov ) + return true; + return player_can_see_me( player ); +} +player_can_see_me( player ) +{ + playerAngles = player getplayerangles(); + playerForwardVec = AnglesToForward( playerAngles ); + playerUnitForwardVec = VectorNormalize( playerForwardVec ); + banzaiPos = self GetOrigin(); + playerPos = player GetOrigin(); + playerToBanzaiVec = banzaiPos - playerPos; + playerToBanzaiUnitVec = VectorNormalize( playerToBanzaiVec ); + forwardDotBanzai = VectorDot( playerUnitForwardVec, playerToBanzaiUnitVec ); + angleFromCenter = ACos( forwardDotBanzai ); + playerFOV = GetDvarFloat( #"cg_fov" ); + banzaiVsPlayerFOVBuffer = GetDvarFloat( #"g_banzai_player_fov_buffer" ); + if ( banzaiVsPlayerFOVBuffer <= 0 ) + { + banzaiVsPlayerFOVBuffer = 0.2; + } + playerCanSeeMe = ( angleFromCenter <= ( playerFOV * 0.5 * ( 1 - banzaiVsPlayerFOVBuffer ) ) ); + return playerCanSeeMe; +} +get_nearby_banzai_guys() +{ + guys = GetAiArray( self.team ); + banzai_guys = []; + for( i = 0; i < guys.size; i++ ) + { + if( guys[i] == self ) + { + continue; + } + if( IsAlive( guys[i] ) && IsDefined( guys[i].script_banzai ) && guys[i].script_banzai ) + { + if( DistanceSquared( self.origin, guys[i].origin ) < 512 * 512 ) + { + guys[i] notify( "stop_banzai_thread" ); + guys[i].script_banzai = 0; + banzai_guys[banzai_guys.size] = guys[i]; + } + } + } + return banzai_guys; +} +staggered_banzai_charge() +{ + wait( RandomFloat( 1.0 ) ); + banzai_charge(); +} +banzai_charge( spawned_charge ) +{ + self endon( "death" ); + if( !IsDefined( spawned_charge ) ) + { + spawned_charge = false; + } + if( !spawned_charge ) + { + self.banzai = true; + self.inmeleecharge = true; + } + self.goalradius = 64; + self thread start_banzai_announce(); + self.favoriteenemy = undefined; + thread find_new_enemy_immediately(); + thread find_closer_enemy(); + thread find_new_enemy_if_blocked(); + wait ( 0.05 ); + while ( 1 ) + { + if ( IsDefined( self.favoriteenemy ) ) + { + self SetGoalPos( self.favoriteenemy.origin ); + } + wait( 0.1 ); + } +} +distance_to_enemy_less_than( lessThanThis ) +{ + assert( IsDefined( self.favoriteenemy ) ); + return DistanceSquared( self.origin, self.favoriteenemy.origin ) < lessThanThis * lessThanThis; +} +find_new_enemy_immediately() +{ + self endon( "death" ); + while ( 1 ) + { + if ( !self call_overloaded_func( "animscripts\banzai", "in_banzai_attack" ) ) + { + enemy = self.favoriteenemy; + if ( should_switch_immediately( enemy ) ) + { + switch_enemies(); + } + } + wait( 0.1 ); + } +} +find_closer_enemy() +{ + self endon( "death" ); + lastPos = undefined; + while ( 1 ) + { + if ( !self call_overloaded_func( "animscripts\banzai", "in_banzai_attack" ) ) + { + enemy = self.favoriteenemy; + if ( IsDefined( enemy ) ) + { + if ( !IsPlayer( enemy ) && !distance_to_enemy_less_than( 192 ) ) + { + newEnemy = self find_enemy(); + if ( IsDefined( newEnemy ) && newEnemy != enemy ) + { + if ( self CanSee( newEnemy ) ) + { + self notify( "banzai_new_enemy" ); + self.favoriteenemy.num_banzai_chargers--; + banzai_set_enemy( newEnemy ); + } + } + } + } + } + wait( 0.05 ); + } +} +find_new_enemy_if_blocked() +{ + self endon( "death" ); + lastPos = undefined; + while ( 1 ) + { + if ( !self call_overloaded_func( "animscripts\banzai", "in_banzai_attack" ) ) + { + enemy = self.favoriteenemy; + if ( IsDefined( enemy ) ) + { + currPos = self.origin; + if ( IsDefined( lastPos ) && DistanceSquared( currPos, lastPos ) < 64 ) + { + if ( !findpath( currPos, enemy.origin ) ) + { + switch_enemies(); + } + else + { + lastPos = currPos; + } + } + else + { + lastPos = currPos; + } + } + } + wait( RandomFloatRange( 0.25, 0.35 ) ); + } +} +switch_enemies() +{ + if ( IsDefined( self.favoriteenemy ) ) + { + self notify( "banzai_new_enemy" ); + self.favoriteenemy.num_banzai_chargers--; + } + enemy = keep_trying_find_enemy(); + banzai_set_enemy( enemy ); +} +keep_trying_find_enemy() +{ + while ( 1 ) + { + enemy = self find_enemy(); + if ( IsDefined( enemy ) && ( !IsDefined( self.favoriteenemy ) || enemy != self.favoriteenemy ) ) + { + return enemy; + } + wait( 0.05 ); + } +} +clear_blocked_enemy_cache() +{ + self.blocked_enemies = []; + self.blocked_enemy_flags = []; +} +banzai_set_enemy( enemy ) +{ + level thread banzai_death_thread( self, enemy ); + self.favoriteEnemy = enemy; + self SetGoalPos( enemy.origin ); + if( !IsDefined( enemy.num_banzai_chargers ) ) + { + enemy.num_banzai_chargers = 0; + } + enemy.num_banzai_chargers++; +} +draw_forward_line_until_notify( ent, r, g, b, notifyEnt, notifyString ) +{ + assert( isdefined( notifyEnt ) ); + assert( isdefined( notifyString ) ); + ent endon( "death" ); + notifyEnt endon( "death" ); + notifyEnt endon( notifyString ); + while( 1 ) + { + forwardVec = VectorNormalize( AnglesToForward( ent.angles ) ); + pointForward = ent.origin + forwardVec * 64; + line( ent.origin, pointForward, ( r, g, b ), 0.05 ); + wait .05; + } +} +banzai_death_thread( attacker, enemy ) +{ + attacker endon( "banzai_new_enemy" ); + attacker waittill( "death" ); + if( IsDefined( enemy ) ) + { + enemy.num_banzai_chargers--; + } +} +start_banzai_announce() +{ + self endon( "death" ); + self.battlechatter = false; + if ( !IsDefined( self.banzai_announcing ) ) + { + self.banzai_announcing = true; + self thread listen_for_end_of_banzai_announce(); + self banzai_dialogue( "banzai_charge_announce", undefined, "banzai_announce_ended" ); + } +} +listen_for_end_of_banzai_announce() +{ + self endon( "death" ); + self waittill( "banzai_announce_ended" ); + self.banzai_announcing = false; +} +end_banzai_charge_yell() +{ + self endon( "banzai_new_enemy" ); + self waittill( "pain" ); + self stopSounds(); +} +banzai_pump_up() +{ + facial_anim = undefined; + soundalias = "banzai_pump"; + self banzai_dialogue( soundalias, facial_anim, "banzai_pump" ); + self waittill( "banzai_pump" ); +} +banzai_print( msg ) +{ +} +#using_animtree( "generic_human" ); +banzai_dialogue( soundalias, facial_anim, notify_string ) +{ + self animscripts\face::SaySpecificDialogue( facial_anim, soundalias, 0.9, notify_string ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_bayonet.gsc b/BO1/PC/ZM/maps/_bayonet.gsc new file mode 100644 index 0000000..767edc5 Binary files /dev/null and b/BO1/PC/ZM/maps/_bayonet.gsc differ diff --git a/BO1/PC/ZM/maps/_boat_nvapbr.gsc b/BO1/PC/ZM/maps/_boat_nvapbr.gsc new file mode 100644 index 0000000..0f6b41d Binary files /dev/null and b/BO1/PC/ZM/maps/_boat_nvapbr.gsc differ diff --git a/BO1/PC/ZM/maps/_boat_patrol_nva.gsc b/BO1/PC/ZM/maps/_boat_patrol_nva.gsc new file mode 100644 index 0000000..d109537 Binary files /dev/null and b/BO1/PC/ZM/maps/_boat_patrol_nva.gsc differ diff --git a/BO1/PC/ZM/maps/_boat_pbr.gsc b/BO1/PC/ZM/maps/_boat_pbr.gsc new file mode 100644 index 0000000..e143bba Binary files /dev/null and b/BO1/PC/ZM/maps/_boat_pbr.gsc differ diff --git a/BO1/PC/ZM/maps/_bouncing_betties.gsc b/BO1/PC/ZM/maps/_bouncing_betties.gsc new file mode 100644 index 0000000..8f0866b Binary files /dev/null and b/BO1/PC/ZM/maps/_bouncing_betties.gsc differ diff --git a/BO1/PC/ZM/maps/_btr.gsc b/BO1/PC/ZM/maps/_btr.gsc new file mode 100644 index 0000000..6e3f611 Binary files /dev/null and b/BO1/PC/ZM/maps/_btr.gsc differ diff --git a/BO1/PC/ZM/maps/_bulletcam.gsc b/BO1/PC/ZM/maps/_bulletcam.gsc new file mode 100644 index 0000000..23b890e Binary files /dev/null and b/BO1/PC/ZM/maps/_bulletcam.gsc differ diff --git a/BO1/PC/ZM/maps/_busing.gsc b/BO1/PC/ZM/maps/_busing.gsc new file mode 100644 index 0000000..b42fc4a Binary files /dev/null and b/BO1/PC/ZM/maps/_busing.gsc differ diff --git a/BO1/PC/ZM/maps/_callbackglobal.gsc b/BO1/PC/ZM/maps/_callbackglobal.gsc new file mode 100644 index 0000000..f048118 --- /dev/null +++ b/BO1/PC/ZM/maps/_callbackglobal.gsc @@ -0,0 +1,877 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_music; +init() +{ + level.splitscreen = isSplitScreen(); + level.xenon = ( GetDvar( #"xenonGame" ) == "true" ); + level.ps3 = ( GetDvar( #"ps3Game" ) == "true" ); + level.wii = ( GetDvar( #"wiiGame" ) == "true" ); + level.onlineGame = GetDvarInt( #"onlinegame" ); + level.systemLink = GetDvarInt( #"systemlink" ); + level.console = ( level.xenon || level.ps3 || level.wii ); + PrecacheMenu( "briefing" ); + level.rankedMatch = ( level.onlineGame + ); + level.profileLoggedIn = ( GetDvar( #"xblive_loggedin" ) == "1" ); +} +SetupCallbacks() +{ + level.otherPlayersSpectate = false; + level.spawnPlayer = ::spawnPlayer; + level.spawnClient = ::spawnClient; + level.spawnSpectator = ::spawnSpectator; + level.spawnIntermission = ::spawnIntermission; + level.onSpawnPlayer = ::default_onSpawnPlayer; + level.onPostSpawnPlayer = ::default_onPostSpawnPlayer; + level.onSpawnSpectator = ::default_onSpawnSpectator; + level.onSpawnIntermission = ::default_onSpawnIntermission; + level.onStartGameType = ::blank; + level.onPlayerConnect = ::blank; + level.onPlayerDisconnect = ::blank; + level.onPlayerDamage = ::blank; + level.onPlayerKilled = ::blank; + level.onPlayerWeaponSwap = ::blank; + level._callbacks["on_first_player_connect"] = []; + level._callbacks["on_player_connect"] = []; + level._callbacks["on_player_disconnect"] = []; + level._callbacks["on_player_damage"] = []; + level._callbacks["on_player_last_stand"] = []; + level._callbacks["on_player_killed"] = []; + level._callbacks["on_actor_damage"] = []; + level._callbacks["on_actor_killed"] = []; + level._callbacks["on_vehicle_damage"] = []; + level._callbacks["on_save_restored"] = []; + if (!IsDefined(level.onMenuMessage)) + level.onMenuMessage = ::blank; + if (!IsDefined(level.onDec20Message)) + level.onDec20Message = ::blank; +} +AddCallback(event, func) +{ + AssertEx(IsDefined(event), "Trying to set a callback on an undefined event."); + AssertEx(IsDefined(level._callbacks[event]), "Trying to set callback for unknown event '" + event + "'."); + level._callbacks[event] = add_to_array(level._callbacks[event], func, false); +} +RemoveCallback(event, func) +{ + AssertEx(IsDefined(event), "Trying to remove a callback on an undefined event."); + AssertEx(IsDefined(level._callbacks[event]), "Trying to remove callback for unknown event '" + event + "'."); + level._callbacks[event] = array_remove( level._callbacks[event], func, true ); +} +Callback(event) +{ + AssertEx(IsDefined(level._callbacks[event]), "Must init callback array before trying to call it."); + for (i = 0; i < level._callbacks[event].size; i++) + { + callback = level._callbacks[event][i]; + if (IsDefined(callback)) + { + self thread [[callback]](); + } + } +} +blank( arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 ) +{ +} +Callback_CurveNotify( string, curveId, nodeIndex ) +{ + level notify( string, curveId, nodeIndex ); +} +Callback_StartGameType() +{ +} +BriefInvulnerability() +{ + self endon( "disconnect" ); + self EnableInvulnerability(); + wait (3); + if(IsDefined(self)) + { + if(IsDefined(self.invulnerable) && (self.invulnerable == true)) + { + } + else + { + self DisableInvulnerability(); + } + } +} +Callback_SaveRestored() +{ + players = get_players(); + level.debug_player = players[0]; + num = 0; + if( isdefined( level._save_pos ) ) + { + num = level._save_trig_ent; + } + for( i = 0; i < 4; i++ ) + { + player = players[i]; + if( isDefined( player ) ) + { + player thread BriefInvulnerability(); + if( isdefined( player.savedVisionSet ) ) + { + player VisionSetNaked( player.savedVisionSet, 0.1 ); + } + if( GetDvar( #"zombiemode") != "1" ) + { + dvarName = "player" + player GetEntityNumber() + "downs"; + player.downs = getdvarint( dvarName ); + } + } + } + level Callback("on_save_restored"); +} +Player_BreadCrumb_Reset( position, angles ) +{ + if( !isdefined( angles ) ) + { + angles = ( 0, 0, 0 ); + } + level.playerPrevOrigin0 = position; + level.playerPrevOrigin1 = position; + if( !isdefined( level._player_breadcrumbs ) ) + { + level._player_breadcrumbs = []; + for( i = 0; i < 4; i ++ ) + { + level._player_breadcrumbs[i] = []; + for( j = 0; j < 4; j ++ ) + { + level._player_breadcrumbs[i][j] = spawnstruct(); + } + } + } + for( i = 0; i < 4; i ++ ) + { + for( j = 0; j < 4; j ++ ) + { + level._player_breadcrumbs[i][j].pos = position; + level._player_breadcrumbs[i][j].ang = angles; + } + } +} +Player_BreadCrumb_Update() +{ + self endon( "disconnect" ); + drop_distance = 70; + right = anglestoright( self.angles ) * drop_distance; + level.playerPrevOrigin0 = self.origin + right; + level.playerPrevOrigin1 = self.origin - right; + if( !isdefined( level._player_breadcrumbs ) ) + { + Player_BreadCrumb_Reset( self.origin, self.angles ); + } + num = self GetEntityNumber(); + while( 1 ) + { + wait 1; + dist_squared = distancesquared( self.origin, level.playerPrevOrigin0 ); + if( dist_squared > 500*500 ) + { + right = anglestoright( self.angles ) * drop_distance; + level.playerPrevOrigin0 = self.origin + right; + level.playerPrevOrigin1 = self.origin - right; + } + else if( dist_squared > drop_distance*drop_distance ) + { + level.playerPrevOrigin1 = level.playerPrevOrigin0; + level.playerPrevOrigin0 = self.origin; + } + dist_squared = distancesquared( self.origin, level._player_breadcrumbs[num][0].pos ); + dropBreadcrumbs = true; + if(IsDefined( level.flag ) && IsDefined( level.flag["drop_breadcrumbs"])) + { + if(!flag("drop_breadcrumbs")) + { + dropBreadcrumbs = false; + } + } + if( dropBreadcrumbs && (dist_squared > drop_distance * drop_distance) ) + { + for( i = 2; i >= 0; i -- ) + { + level._player_breadcrumbs[num][i + 1].pos = level._player_breadcrumbs[num][i].pos; + level._player_breadcrumbs[num][i + 1].ang = level._player_breadcrumbs[num][i].ang; + } + level._player_breadcrumbs[num][0].pos = PlayerPhysicsTrace(self.origin, self.origin + ( 0, 0, -1000 )); + level._player_breadcrumbs[num][0].ang = self.angles; + } + } +} +SetPlayerSpawnPos() +{ + players = get_players(); + player = players[0]; + if( !isdefined( level._player_breadcrumbs ) ) + { + spawnpoints = getentarray( "info_player_deathmatch", "classname" ); + if( player.origin == ( 0, 0, 0 ) && isdefined( spawnpoints ) && spawnpoints.size > 0 ) + { + Player_BreadCrumb_Reset( spawnpoints[0].origin, spawnpoints[0].angles ); + } + else + { + Player_BreadCrumb_Reset( player.origin, player.angles ); + } + } + too_close = 30; + spawn_pos = level._player_breadcrumbs[0][0].pos; + dist_squared = distancesquared( player.origin, spawn_pos ); + if( dist_squared > 500*500 ) + { + if( player.origin != ( 0, 0, 0 ) ) + { + spawn_pos = player.origin +( 0, 30, 0 ); + } + } + else if( dist_squared < too_close*too_close ) + { + spawn_pos = level._player_breadcrumbs[0][1].pos; + } + spawn_angles = vectornormalize( player.origin - spawn_pos ); + spawn_angles = vectorToAngles( spawn_angles ); + if( !playerpositionvalid( spawn_pos ) ) + { + spawn_pos = player.origin; + spawn_angles = player.angles; + } +} +Callback_PlayerConnect() +{ + thread first_player_connect(); + self waittill( "begin" ); + self reset_clientdvars(); + waittillframeend; + wait(0.1); + level notify( "connected", self ); + self Callback("on_player_connect"); + self thread maps\_load_common::player_special_death_hint(); + self thread maps\_flashgrenades::monitorFlash(); + if( GetDvar( #"zombiemode" ) == "0" ) + { + info_player_spawn = getentarray( "info_player_deathmatch", "classname" ); + if( isdefined( info_player_spawn ) && info_player_spawn.size > 0 ) + { + players = get_players("all"); + if( Isdefined( players ) &&( players.size != 0 ) ) + { + if( players[0] == self ) + { + println( "2: Setting player origin to info_player_start " + info_player_spawn[0].origin ); + self setOrigin( info_player_spawn[0].origin ); + self setPlayerAngles( info_player_spawn[0].angles ); + self thread Player_BreadCrumb_Update(); + } + else + { + println( "Callback_PlayerConnect: Setting player origin near host position " + players[0].origin ); + self SetPlayerSpawnPos(); + self thread Player_BreadCrumb_Update(); + } + } + else + { + println( "Callback_PlayerConnect: Setting player origin to info_player_start " + info_player_spawn[0].origin ); + self setOrigin( info_player_spawn[0].origin ); + self setPlayerAngles( info_player_spawn[0].angles ); + self thread Player_BreadCrumb_Update(); + } + } + } + if( !IsDefined( self.flag ) ) + { + self.flag = []; + self.flags_lock = []; + } + if( !IsDefined( self.flag["player_has_red_flashing_overlay"] ) ) + { + self player_flag_init( "player_has_red_flashing_overlay" ); + self player_flag_init( "player_is_invulnerable" ); + } + if( !IsDefined( self.flag["loadout_given"] ) ) + { + self player_flag_init( "loadout_given" ); + } + self player_flag_clear( "loadout_given" ); + if( GetDvar( #"r_reflectionProbeGenerate" ) == "1" ) + { + waittillframeend; + self thread spawnPlayer(); + return; + } + self setClientDvar( "ui_allow_loadoutchange", "1" ); + self thread[[level.spawnClient]](); + dvarName = "player" + self GetEntityNumber() + "downs"; + setdvar( dvarName, self.downs ); +} +reset_clientdvars() +{ + if( IsDefined( level.reset_clientdvars ) ) + { + self [[level.reset_clientdvars]](); + return; + } + self SetClientDvars( "compass", "1", + "hud_showStance", "1", + "cg_thirdPerson", "0", + "cg_fov", "65", + "cg_cursorHints","4", + "cg_thirdPersonAngle", "0", + "hud_showobjectives","1", + "ammoCounterHide", "0", + "miniscoreboardhide", "0", + "ui_hud_hardcore", "0", + "credits_active", "0", + "hud_missionFailed", "0", + "cg_cameraUseTagCamera", "1", + "cg_drawCrosshair", "1", + "r_heroLightScale", "1 1 1", + "r_fog_disable", "0", + "r_dof_tweak", "0", + "player_sprintUnlimited", "0", + "r_bloomTweaks", "0", + "r_exposureTweak", "0", + "cg_aggressiveCullRadius", "0", + "sm_sunSampleSizeNear", "0.25" + ); + self AllowSpectateTeam( "allies", false ); + self AllowSpectateTeam( "axis", false ); + self AllowSpectateTeam( "freelook", false ); + self AllowSpectateTeam( "none", false ); +} +Callback_PlayerDisconnect() +{ + self Callback("on_player_disconnect"); +} +Callback_PlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + if( IsDefined( self.overridePlayerDamage ) ) + { + iDamage = self [[self.overridePlayerDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); + } + else if( IsDefined( level.overridePlayerDamage ) ) + { + iDamage = self [[level.overridePlayerDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); + } + AssertEx(IsDefined(iDamage), "You must return a value from a damage override function."); + self Callback("on_player_damage"); + if (is_true(self.magic_bullet_shield)) + { + maxHealth = self.maxHealth; + self.health += iDamage; + self.maxHealth = maxHealth; + } + if( isdefined( self.divetoprone ) && self.divetoprone == 1 ) + { + if( sMeansOfDeath == "MOD_GRENADE_SPLASH" ) + { + dist = Distance2d(vPoint, self.origin); + if( dist > 32 ) + { + dot_product = vectordot( AnglesToForward( self.angles ), vDir ); + if( dot_product > 0 ) + { + iDamage = int( iDamage * 0.5 ); + } + } + } + } + println("CB PD"); + if( isdefined( eAttacker ) && ((isPlayer( eAttacker )) && (eAttacker.team == self.team))&& ( !isDefined( level.friendlyexplosivedamage ) || !level.friendlyexplosivedamage )) + { + if( !isDefined(level.is_friendly_fire_on) || ![[level.is_friendly_fire_on]]() ) + { + if( self != eAttacker) + { + println("Exiting - players can't hut each other."); + return; + } + else if( sMeansOfDeath != "MOD_GRENADE_SPLASH" + && sMeansOfDeath != "MOD_GRENADE" + && sMeansOfDeath != "MOD_EXPLOSIVE" + && sMeansOfDeath != "MOD_PROJECTILE" + && sMeansOfDeath != "MOD_PROJECTILE_SPLASH" + && sMeansOfDeath != "MOD_BURNED" + && sMeansOfDeath != "MOD_SUICIDE" ) + { + println("Exiting - damage type verbotten."); + return; + } + } + } + if ( isdefined( level.prevent_player_damage ) ) + { + if ( self [[ level.prevent_player_damage ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) ) + { + return; + } + } + if ( isdefined(eAttacker) && eAttacker != self ) + { + if ( maps\_damagefeedback::doDamageFeedback( sWeapon, eInflictor ) ) + { + if ( iDamage > 0 ) + { + eAttacker thread maps\_damagefeedback::updateDamageFeedback(); + } + } + } + self maps\_dds::update_player_damage( eAttacker ); + if (iDamage >= self.health) + { + if ((sMeansOfDeath == "MOD_CRUSH") + && IsDefined(eAttacker) && IsDefined(eAttacker.classname) + && (eAttacker.classname == "script_vehicle")) + { + SetDvar( "ui_deadquote", "@SCRIPT_MOVING_VEHICLE_DEATH" ); + } + } + if ( is_true( level.disable_player_damage_knockback ) ) + { + iDFlags = iDFlags | level.iDFLAGS_NO_KNOCKBACK; + } + PrintLn("Finishplayerdamagage wrapper."); + self finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); +} +finishPlayerDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + self finishPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); +} +incrGrenadeKillCount() +{ + if (!isPlayer(self) ) + { + return; + } + if (!isDefined(self.grenadeKillCounter) ) + { + self.grenadeKillCounter = 0; + } + self.grenadeKillCounter++; + if( self.grenadeKillCounter >= 5 ) + { + self giveachievement_wrapper( "SP_GEN_FRAGMASTER" ); + } + wait( 0.25 ); + self.grenadeKillCounter--; +} +Callback_ActorDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + self endon("death"); + if( IsDefined( self.overrideActorDamage ) ) + { + iDamage = self [[self.overrideActorDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); + } + else if( IsDefined( level.overrideActorDamage ) ) + { + iDamage = self [[level.overrideActorDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); + } + AssertEx(IsDefined(iDamage), "You must return a value from a damage override function."); + self Callback("on_actor_damage"); + if ( is_true(self.magic_bullet_shield ) && !is_true( self.bulletcam_death ) ) + { + MIN_PAIN_INTERVAL = 500; + t = GetTime(); + if ((t - self._mbs.last_pain_time > MIN_PAIN_INTERVAL) + || (sMeansOfDeath == "MOD_EXPLOSIVE")) + { + if (self.allowPain || is_true(self._mbs.allow_pain_old)) + { + enable_pain(); + } + self._mbs.last_pain_time = t; + self thread ignore_me_timer( self._mbs.ignore_time, "stop_magic_bullet_shield" ); + self thread turret_ignore_me_timer( self._mbs.turret_ignore_time ); + } + else + { + self._mbs.allow_pain_old = self.allowPain; + disable_pain(); + } + self.delayedDeath = false; + maxHealth = self.maxHealth; + self.health += iDamage; + self.maxHealth = maxHealth; + } + else if (!is_true(self.a.doingRagdollDeath)) + { + iDamage = maps\_bulletcam::try_bulletcam( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); + if( GetDvar( #"zombiemode") != "1" ) + { + if (!self call_overloaded_func( "animscripts\balcony", "balconyDamage", iDamage, sHitLoc, sMeansOfDeath )) + { + self animscripts\revive::tryGoingDown( iDamage, sHitLoc ); + } + } + } + if ( IsDefined(eAttacker) && eAttacker != self ) + { + if ( maps\_damagefeedback::doDamageFeedback( sWeapon, eInflictor ) ) + { + if ( iDamage > 0 ) + { + eAttacker thread maps\_damagefeedback::updateDamageFeedback(); + } + } + } + self maps\_dds::update_actor_damage( eAttacker, sMeansOfDeath ); + if( self.health - iDamage <= 0 && sWeapon == "crossbow_sp" ) + { + self.dofiringdeath = false; + } + if( isPlayer( eAttacker ) && ( self.health - iDamage <= 0 ) ) + { + println( "player killed enemy with "+sWeapon+" via "+sMeansOfDeath ); + if ( self.team == "axis" && GetDvar( #"zombiemode" ) != "1" ) + { + if ( sWeapon == "explosive_bolt_sp" || sWeapon == "crossbow_explosive_alt_sp" ) + { + killedSoFar = 1 + GetPersistentProfileVar( 0, 0 ); + if( killedSoFar >= 30 ) + { + eAttacker giveachievement_wrapper( "SP_GEN_CROSSBOW" ); + } + SetPersistentProfileVar( 0, killedSoFar ); + } + if( ( sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" ) && sWeapon == "frag_grenade_sp" ) + { + eAttacker thread incrGrenadeKillCount(); + } + } + } + self finishActorDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); +} +finishActorDamageWrapper( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + self finishActorDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); +} +Callback_RevivePlayer() +{ + self endon( "disconnect" ); + self RevivePlayer(); +} +Callback_PlayerLastStand( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) +{ + self endon( "disconnect" ); + self Callback("on_player_last_stand"); + [[maps\_laststand::PlayerLastStand]]( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ); +} +Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) +{ + self thread[[level.onPlayerKilled]]( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ); + self.downs++; + dvarName = "player" + self GetEntityNumber() + "downs"; + setdvar( dvarName, self.downs ); + if( IsDefined( level.player_killed_shellshock ) ) + { + self ShellShock( level.player_killed_shellshock, 3 ); + } + else + { + self ShellShock( "death", 3 ); + } + self PlayLocalSound( "evt_player_death" ); + self setmovespeedscale( 1.0 ); + self.ignoreme = false; + self notify( "killed_player" ); + self Callback("on_player_killed"); + wait( 1 ); + if( IsDefined( level.overridePlayerKilled ) ) + { + self [[level.overridePlayerKilled]](); + } + if( get_players().size > 1 ) + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( isDefined( players[i] ) ) + { + if( !isAlive( players[i] ) ) + { + println( "Player #"+i+" is dead" ); + } + else + { + println( "Player #"+i+" is alive" ); + } + } + } + missionfailed(); + return; + } +} +Callback_ActorKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime ) +{ + if( IsDefined( self.overrideActorKilled ) ) + { + self [[self.overrideActorKilled]]( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime ); + } + else if( IsDefined( level.overrideActorKilled ) ) + { + self [[level.overrideActorKilled]]( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime ); + } + self Callback("on_actor_killed"); +} +Callback_VehicleDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName ) +{ + self endon("death"); + if( IsDefined( self.overrideVehicleDamage ) ) + { + iDamage = self [[self.overrideVehicleDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName ); + } + else if( IsDefined( level.overrideVehicleDamage ) ) + { + iDamage = self [[level.overrideVehicleDamage]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName ); + } + AssertEx(IsDefined(iDamage), "You must return a value from a damage override function."); + self Callback("on_vehicle_damage"); + if( self IsVehicleImmuneToDamage( iDFlags, sMeansOfDeath, sWeapon ) ) + { + return; + } + if( self maps\_vehicle::friendlyfire_shield_callback( eAttacker, iDamage, sMeansOfDeath ) ) + { + return; + } + self finishVehicleDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, damageFromUnderneath, modelIndex, partName, false); +} +spawnClient() +{ + self endon( "disconnect" ); + self endon( "end_respawn" ); + println( "*************************spawnClient****" ); + self unlink(); + if( isdefined( self.spectate_cam ) ) + { + self.spectate_cam delete(); + } + if( level.otherPlayersSpectate ) + { + self thread [[level.spawnSpectator]](); + } + else + { + self thread [[level.spawnPlayer]](); + } +} +spawnPlayer( spawnOnHost ) +{ + self endon( "disconnect" ); + self endon( "spawned_spectator" ); + self notify( "spawned" ); + self notify( "end_respawn" ); + synchronize_players(); + setSpawnVariables(); + self.sessionstate = "playing"; + self.spectatorclient = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.statusicon = ""; + self.maxhealth = self.health; + self.shellshocked = false; + self.inWater = false; + self.friendlydamage = undefined; + self.hasSpawned = true; + self.spawnTime = getTime(); + self.afk = false; + println( "*************************spawnPlayer****" ); + self detachAll(); + if( IsDefined( level.custom_spawnPlayer ) ) + { + self [[level.custom_spawnPlayer]](); + return; + } + if( isdefined( level.onSpawnPlayer ) ) + { + self [[level.onSpawnPlayer]](); + } + wait_for_first_player(); + if( isdefined( spawnOnHost ) ) + { + self Spawn( get_players()[0].origin, get_players()[0].angles ); + self SetPlayerSpawnPos(); + } + else + { + self Spawn( self.origin, self.angles ); + } + if( isdefined( level.onPostSpawnPlayer ) ) + { + self[[level.onPostSpawnPlayer]](); + } + if( isdefined( level.onPlayerWeaponSwap ) ) + { + self thread[[level.onPlayerWeaponSwap]](); + } + self maps\_introscreen::introscreen_player_connect(); + waittillframeend; + if( self != get_players("all")[0] ) + { + wait( 0.5 ); + } + self notify( "spawned_player" ); +} +synchronize_players() +{ + if( !IsDefined( level.flag ) || !IsDefined( level.flag["all_players_connected"] ) ) + { + println( "^1**** ERROR: You must call _load::main() if you don't want bad coop things to happen! ****" ); + println( "^1**** ERROR: You must call _load::main() if you don't want bad coop things to happen! ****" ); + println( "^1**** ERROR: You must call _load::main() if you don't want bad coop things to happen! ****" ); + return; + } + if( GetNumConnectedPlayers() == GetNumExpectedPlayers() ) + { + return; + } + if( flag( "all_players_connected" ) ) + { + return; + } + background = undefined; + if ( level.onlineGame || level.systemLink ) + { + self OpenMenu( "briefing" ); + } + else + { + background = NewHudElem(); + background.x = 0; + background.y = 0; + background.horzAlign = "fullscreen"; + background.vertAlign = "fullscreen"; + background.foreground = true; + background SetShader( "black", 640, 480 ); + } + flag_wait( "all_players_connected" ); + if ( level.onlineGame || level.systemLink ) + { + players = get_players("all"); + for ( i = 0; i < players.size; i++ ) + { + players[i] CloseMenu(); + } + } + else + { + assert( IsDefined( background ) ); + background Destroy(); + } +} +spawnSpectator() +{ + self endon( "disconnect" ); + self endon( "spawned_spectator" ); + self notify( "spawned" ); + self notify( "end_respawn" ); + setSpawnVariables(); + self.sessionstate = "spectator"; + self.spectatorclient = -1; + if( isdefined( level.otherPlayersSpectateClient ) ) + { + self.spectatorclient = level.otherPlayersSpectateClient getEntityNumber(); + } + self setClientDvars( "cg_thirdPerson", 0 ); + self setSpectatePermissions(); + self.archivetime = 0; + self.psoffsettime = 0; + self.statusicon = ""; + self.maxhealth = self.health; + self.shellshocked = false; + self.inWater = false; + self.friendlydamage = undefined; + self.hasSpawned = true; + self.spawnTime = getTime(); + self.afk = false; + println( "*************************spawnSpectator***" ); + self detachAll(); + if( isdefined( level.onSpawnSpectator ) ) + { + self[[level.onSpawnSpectator]](); + } + self Spawn( self.origin, self.angles ); + waittillframeend; + flag_wait( "all_players_connected" ); + self notify( "spawned_spectator" ); +} +setSpectatePermissions() +{ + self AllowSpectateTeam( "allies", true ); + self AllowSpectateTeam( "axis", false ); + self AllowSpectateTeam( "freelook", false ); + self AllowSpectateTeam( "none", false ); +} +spawnIntermission() +{ + self notify( "spawned" ); + self notify( "end_respawn" ); + self setSpawnVariables(); + self freezeControls( false ); + self setClientDvar( "cg_everyoneHearsEveryone", "1" ); + self.sessionstate = "intermission"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.friendlydamage = undefined; + [[level.onSpawnIntermission]](); + self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 ); +} +default_onSpawnPlayer() +{ +} +default_onPostSpawnPlayer() +{ +} +default_onSpawnSpectator() +{ +} +default_onSpawnIntermission() +{ + spawnpointname = "info_intermission"; + spawnpoints = getentarray( spawnpointname, "classname" ); + if(spawnpoints.size < 1) + { + println( "NO " + spawnpointname + " SPAWNPOINTS IN MAP" ); + return; + } + spawnpoint = spawnpoints[RandomInt(spawnpoints.size)]; + if( isDefined( spawnpoint ) ) + { + self spawn( spawnpoint.origin, spawnpoint.angles ); + } +} +first_player_connect() +{ + waittillframeend; + if( isDefined( self ) ) + { + level notify( "connecting", self ); + players = get_players(); + if( isdefined( players ) &&( players.size == 0 || players[0] == self ) ) + { + level notify( "connecting_first_player", self ); + self waittill( "spawned_player" ); + waittillframeend; + level notify( "first_player_ready", self ); + if( GetDvar( #"zombiemode") != "1" ) + { + prefetchnext(); + } + self Callback("on_first_player_connect"); + } + } +} +setSpawnVariables() +{ + resetTimeout(); + self StopShellshock(); + self StopRumble( "damage_heavy" ); +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_callbacksetup.gsc b/BO1/PC/ZM/maps/_callbacksetup.gsc new file mode 100644 index 0000000..fa4c87c Binary files /dev/null and b/BO1/PC/ZM/maps/_callbacksetup.gsc differ diff --git a/BO1/PC/ZM/maps/_camera.gsc b/BO1/PC/ZM/maps/_camera.gsc new file mode 100644 index 0000000..06c4d1f Binary files /dev/null and b/BO1/PC/ZM/maps/_camera.gsc differ diff --git a/BO1/PC/ZM/maps/_camsys.gsc b/BO1/PC/ZM/maps/_camsys.gsc new file mode 100644 index 0000000..f346940 Binary files /dev/null and b/BO1/PC/ZM/maps/_camsys.gsc differ diff --git a/BO1/PC/ZM/maps/_cheat.gsc b/BO1/PC/ZM/maps/_cheat.gsc new file mode 100644 index 0000000..d42107f --- /dev/null +++ b/BO1/PC/ZM/maps/_cheat.gsc @@ -0,0 +1,363 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_hud_util; +init() +{ + precachestring( &"SCRIPT_PLATFORM_CHEAT_USETOSLOWMO" ); + precacheShellshock( "chaplincheat" ); + level.vision_cheat_enabled = false; + level.tire_explosion = false; + level.cheatStates= []; + level.cheatFuncs = []; + level.cheatDvars = []; + level.cheatBobAmpOriginal = GetDvar( #"bg_bobAmplitudeStanding" ); + level.cheatShowSlowMoHint = 0; + if ( !isdefined( level._effect ) ) + level._effect = []; + level._effect["grain_test"] = loadfx ("misc/fx_grain_test"); + flag_init("has_cheated"); + level.visionSets["bw"] = false; + level.visionSets["invert"] = false; + level.visionSets["contrast"] = false; + level.visionSets["chaplin"] = false; + level thread death_monitor(); + flag_init( "disable_slowmo_cheat" ); +} +player_init() +{ + self thread specialFeaturesMenu(); + players = get_players(); + if( self == players[0] ) + { + self slowmo_system_init(); + } +} +death_monitor() +{ + setDvars_based_on_varibles(); + while ( 1 ) + { + if ( issaverecentlyloaded() ) + setDvars_based_on_varibles(); + wait .1; + } +} +setDvars_based_on_varibles() +{ + for ( index = 0; index < level.cheatDvars.size; index++ ) + setDvar( level.cheatDvars[ index ], level.cheatStates[ level.cheatDvars[ index ] ] ); + if( !isdefined( level.credits_active ) || !level.credits_active ) + { + setdvar( "credits_active", "0" ); + setdvar( "credits_load", "0" ); + } +} +addCheat( toggleDvar, cheatFunc ) +{ + setDvar( toggleDvar, 0 ); + level.cheatStates[toggleDvar] = getDvarInt( toggleDvar ); + level.cheatFuncs[toggleDvar] = cheatFunc; + if ( level.cheatStates[toggleDvar] ) + [[cheatFunc]]( level.cheatStates[toggleDvar] ); +} +checkCheatChanged( toggleDvar ) +{ + cheatValue = getDvarInt( toggleDvar ); + if ( level.cheatStates[toggleDvar] == cheatValue ) + return; + if( cheatValue ) + flag_set("has_cheated"); + level.cheatStates[toggleDvar] = cheatValue; + [[level.cheatFuncs[toggleDvar]]]( cheatValue ); +} +specialFeaturesMenu() +{ + addCheat( "sf_use_contrast", ::contrastMode ); + addCheat( "sf_use_bw", ::bwMode ); + addCheat( "sf_use_invert", ::invertMode ); + addCheat( "sf_use_slowmo", ::slowmoMode ); + addCheat( "sf_use_ignoreammo", ::ignore_ammoMode ); + addCheat( "sf_use_clustergrenade", ::clustergrenadeMode ); + addCheat( "sf_use_tire_explosion", ::tire_explosionMode ); + level.cheatDvars = getArrayKeys( level.cheatStates ); + for ( ;; ) + { + for ( index = 0; index < level.cheatDvars.size; index++ ) + checkCheatChanged( level.cheatDvars[index] ); + wait 0.5; + } +} +tire_explosionMode( cheatValue ) +{ + if ( cheatValue ) + level.tire_explosion = true; + else + level.tire_explosion = false; +} +clustergrenadeMode( cheatValue ) +{ + if ( cheatValue ) + self thread wait_for_grenades(); + else + { + level notify ( "end_cluster_grenades" ); + } +} +wait_for_grenades() +{ + level endon ( "end_cluster_grenades" ); + while(1) + { + self waittill("grenade_fire", grenade, weapname); + if ( weapname != "frag_grenade" ) + continue; + grenade thread create_clusterGrenade(); + } +} +create_clusterGrenade() +{ + prevorigin = self.origin; + while(1) + { + if ( !isdefined( self ) ) + break; + prevorigin = self.origin; + wait .1; + } + prevorigin += (0,0,5); + numSecondaries = 8; + aiarray = getaiarray(); + if ( aiarray.size == 0 ) + return; + ai = undefined; + for ( i = 0; i < aiarray.size; i++ ) + { + if ( aiarray[i].team == "allies" ) + { + ai = aiarray[i]; + break; + } + } + if ( !isdefined( ai ) ) + ai = aiarray[0]; + oldweapon = ai.grenadeweapon; + ai.grenadeweapon = "frag_grenade"; + for ( i = 0; i < numSecondaries; i++ ) + { + velocity = getClusterGrenadeVelocity(); + timer = 1.5 + i / 6 + randomfloat(0.1); + ai magicGrenadeManual( prevorigin, velocity, timer ); + } + ai.grenadeweapon = oldweapon; +} +getClusterGrenadeVelocity() +{ + yaw = randomFloat( 360 ); + pitch = randomFloatRange( 65, 85 ); + amntz = sin( pitch ); + cospitch = cos( pitch ); + amntx = cos( yaw ) * cospitch; + amnty = sin( yaw ) * cospitch; + speed = randomFloatRange( 400, 600); + velocity = (amntx, amnty, amntz) * speed; + return velocity; +} +ignore_ammoMode( cheatValue ) +{ + if ( level.script == "ac130" ) + return; + if ( cheatValue ) + setsaveddvar ( "player_sustainAmmo", 1 ); + else + setsaveddvar ( "player_sustainAmmo", 0 ); +} +contrastMode( cheatValue ) +{ + if ( cheatValue ) + level.visionSets["contrast"] = true; + else + level.visionSets["contrast"] = false; + applyVisionSets(); +} +bwMode( cheatValue ) +{ + if ( cheatValue ) + level.visionSets["bw"] = true; + else + level.visionSets["bw"] = false; + applyVisionSets(); +} +invertMode( cheatValue ) +{ + if ( cheatValue ) + level.visionSets["invert"] = true; + else + level.visionSets["invert"] = false; + applyVisionSets(); +} +applyVisionSets() +{ + if ( level.script == "ac130" ) + return; + visionSet = ""; + if ( level.visionSets["bw"] ) + visionSet = visionSet + "_bw"; + if ( level.visionSets["invert"] ) + visionSet = visionSet + "_invert"; + if ( level.visionSets["contrast"] ) + visionSet = visionSet + "_contrast"; + if ( level.visionSets["chaplin"] ) + { + level.vision_cheat_enabled = true; + visionSetNaked( "sepia", 0.5 ); + } + else if ( visionSet != "" ) + { + level.vision_cheat_enabled = true; + visionSetNaked( "cheat" + visionSet, 1.0 ); + } + else + { + level.vision_cheat_enabled = false; + visionSetNaked( level.lvl_visionset, 3.0 ); + } +} +slowmo_system_init() +{ + if( !IsDefined( level.slowmo ) ) + { + level.slowmo = spawnstruct(); + slowmo_system_defaults(); + level.slowmo.speed_current = level.slowmo.speed_norm; + level.slowmo.lerp_interval = .05; + level.slowmo.lerping = 0; + } +} +slowmo_system_defaults() +{ + level.slowmo.lerp_time_in = 0.0; + level.slowmo.lerp_time_out = .25; + level.slowmo.speed_slow = 0.4; + level.slowmo.speed_norm = 1.0; +} +slowmo_check_system() +{ + return true; +} +slowmo_hintprint() +{ + if ( level.cheatShowSlowMoHint != 0 ) + { + level.cheatShowSlowMoHint = 0; + return; + } + if ( !level.console ) + return; + level.cheatShowSlowMoHint = 1; + myTextSize = 1.6; + myHintBack = createIcon( "black", 650, 30 ); + myHintBack.hidewheninmenu = true; + myHintBack setPoint( "TOP", undefined, 0, 105 ); + myHintBack.alpha = .2; + myHintBack.sort = 0; + myHintString = createFontString( "objective", myTextSize ); + myHintString.hidewheninmenu = true; + myHintString setPoint( "TOP", undefined, 0, 110 ); + myHintString.sort = 0.5; + myHintString setText( &"SCRIPT_PLATFORM_CHEAT_USETOSLOWMO" ); + for ( cycles = 0; cycles < 100; cycles++ ) + { + if ( level.cheatShowSlowMoHint != 1 ) + break; + if ( isDefined( level.hintElem ) ) + break; + wait 0.1; + } + level.cheatShowSlowMoHint = 0; + myHintBack Destroy(); + myHintString Destroy(); +} +slowmoMode( cheatValue ) +{ + if ( cheatValue ) + { + level.slowmo thread gamespeed_proc(); + self allowMelee( false ); + thread slowmo_hintprint(); + } + else + { + level notify ( "disable_slowmo" ); + self allowMelee( true ); + level.slowmo thread gamespeed_reset(); + level.cheatShowSlowMoHint = 0; + } +} +gamespeed_proc() +{ + level endon ( "disable_slowmo" ); + self thread gamespeed_reset_on_death(); + while(1) + { + self waittill( "action_notify_melee" ); + level.cheatShowSlowMoHint = 0; + if( !flag( "disable_slowmo_cheat" ) ) + { + if( self.speed_current < level.slowmo.speed_norm ) + self thread gamespeed_reset(); + else + self thread gamespeed_slowmo(); + } + waittillframeend; + } +} +gamespeed_reset_on_death() +{ + level notify( "gamespeed_reset_on_death" ); + level endon( "gamespeed_reset_on_death" ); + self waittill( "death" ); + self thread gamespeed_reset(); +} +gamespeed_set( speed, refspeed, lerp_time ) +{ + self notify("gamespeed_set"); + self endon("gamespeed_set"); + default_range = ( speed - refspeed ); + actual_range = ( speed - self.speed_current ); + actual_rangebytime = actual_range * lerp_time; + if( !default_range ) + return; + time = ( actual_rangebytime / default_range ); + interval = self.lerp_interval; + cycles = int( time / interval ); + if(!cycles) + cycles = 1; + increment = ( actual_range / cycles ); + self.lerping = time; + while(cycles) + { + self.speed_current += increment; + settimescale( self.speed_current ); + cycles--; + self.lerping -= interval; + wait interval; + } + self.speed_current = speed; + settimescale( self.speed_current ); + self.lerping = 0; +} +gamespeed_slowmo() +{ + gamespeed_set( self.speed_slow, self.speed_norm, self.lerp_time_in ); +} +gamespeed_reset() +{ + gamespeed_set( self.speed_norm, self.speed_slow, self.lerp_time_out ); +} +is_cheating() +{ + for ( i = 0; i < level.cheatDvars.size; i++ ) + if(level.cheatStates[ level.cheatDvars[i] ] ) + return true; + return false; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_chinook.gsc b/BO1/PC/ZM/maps/_chinook.gsc new file mode 100644 index 0000000..6c17b58 Binary files /dev/null and b/BO1/PC/ZM/maps/_chinook.gsc differ diff --git a/BO1/PC/ZM/maps/_civ_vehicle.gsc b/BO1/PC/ZM/maps/_civ_vehicle.gsc new file mode 100644 index 0000000..6506545 Binary files /dev/null and b/BO1/PC/ZM/maps/_civ_vehicle.gsc differ diff --git a/BO1/PC/ZM/maps/_cobra.gsc b/BO1/PC/ZM/maps/_cobra.gsc new file mode 100644 index 0000000..4504b8d Binary files /dev/null and b/BO1/PC/ZM/maps/_cobra.gsc differ diff --git a/BO1/PC/ZM/maps/_collectibles.gsc b/BO1/PC/ZM/maps/_collectibles.gsc new file mode 100644 index 0000000..46d7d1c Binary files /dev/null and b/BO1/PC/ZM/maps/_collectibles.gsc differ diff --git a/BO1/PC/ZM/maps/_colors.gsc b/BO1/PC/ZM/maps/_colors.gsc new file mode 100644 index 0000000..d68e227 --- /dev/null +++ b/BO1/PC/ZM/maps/_colors.gsc @@ -0,0 +1,1196 @@ +#include maps\_utility; +#include maps\_spawner; +#include common_scripts\utility; +init_color_grouping( nodes ) +{ + flag_init( "player_looks_away_from_spawner" ); + flag_init( "friendly_spawner_locked" ); + level.arrays_of_colorCoded_nodes = []; + level.arrays_of_colorCoded_nodes[ "axis" ] = []; + level.arrays_of_colorCoded_nodes[ "allies" ] = []; + level.colorCoded_volumes = []; + level.colorCoded_volumes[ "axis" ] = []; + level.colorCoded_volumes[ "allies" ] = []; + triggers = []; + triggers = array_combine( triggers, GetEntArray( "trigger_multiple" , "classname" ) ); + triggers = array_combine( triggers, GetEntArray( "trigger_radius" , "classname" ) ); + triggers = array_combine( triggers, GetEntArray( "trigger_once" , "classname" ) ); + volumes = GetEntArray( "info_volume", "classname" ); + for( i=0;i 0, "Tried to make guy with export " + self.export + " go to forcecolor " + self.script_forceColor + " but there are no nodes of that color enabled" ); + for( i=0; i < nodes.size; i++ ) + { + if( !isalive( nodes[ i ].color_user ) ) + { + return nodes[ i ]; + } + } +} +get_best_available_new_colored_node() +{ + assertEx( self.team != "neutral" ); + assertEx( IsDefined( self.script_forceColor ), "AI with export " + self.export + " lost his script_forcecolor.. somehow." ); + colorCode = level.currentColorForced[ self.team ][ self.script_forceColor ]; + nodes = get_prioritized_colorCoded_nodes( self.team, colorCode, self.script_forcecolor ); + assertEx( nodes.size > 0, "Tried to make guy with export " + self.export + " go to forcecolor " + self.script_forceColor + " but there are no nodes of that color enabled" ); + nodes = get_array_of_closest(self.origin, nodes); + for( i=0; i < nodes.size; i++ ) + { + if( !isalive( nodes[ i ].color_user ) ) + { + return nodes[ i ]; + } + } +} +process_stop_short_of_node( node ) +{ + self endon( "stopScript" ); + self endon( "death" ); + if( IsDefined( self.node ) ) + { + return; + } + if( distance( node.origin, self.origin ) < 32 ) + { + reached_node_but_could_not_claim_it( node ); + return; + } + currentTime = gettime(); + wait_for_killanimscript_or_time( 1 ); + newTime = gettime(); + if( newTime - currentTime >= 1000 ) + { + reached_node_but_could_not_claim_it( node ); + } +} +wait_for_killanimscript_or_time( timer ) +{ + self endon( "killanimscript" ); + wait( timer ); +} +reached_node_but_could_not_claim_it( node ) +{ + ai = getaiarray(); + guy = undefined; + for( i=0;i 0.4); + return looking_at && facing_same_way; + } + } + return false; +} +get_potential_melee_info(guy) +{ + info = []; + set = []; + if (IsArray(guy._melee.set)) + { + set = guy._melee.set; + } + else + { + set[0] = guy._melee.set; + } + for (i = 0; i < set.size; i++) + { + if (IsDefined(guy._melee.type)) + { + info = get_info_by_type(guy._melee.type, guy get_context(), self get_context(), set[i]); + } + else + { + info = get_info(self get_context(), guy get_context(), set[i]); + } + if (IsDefined(info) && info.size > 0) + { + return info; + } + } +} +player_interaction(guy) +{ + self AllowMelee(false); + if( level._contextual_melee_print_hintstring ) + { + self SetScriptHintString(&"SCRIPT_HINT_MELEE"); + } + self thread cancel_waittill_melee(guy); + cancled = false; + if( level._contextual_melee_allow_fire_button ) + { + while (!guy is_auto_melee() && !self MeleeButtonPressed() && !cancled && !self MeleeButtonPressed()) + { + if (!self player_can_melee(guy) || !IsAlive(guy)) + { + self enable_weapon(); + cancled = true; + } + else + { + self notify("melee_in_position"); + } + wait(0.05); + } + } + else + { + while (!guy is_auto_melee() && !self MeleeButtonPressed() && !cancled ) + { + if (!self player_can_melee(guy) || !IsAlive(guy)) + { + self enable_weapon(); + cancled = true; + } + else + { + self notify("melee_in_position"); + } + wait(0.05); + } + } + self SetScriptHintString(""); + if (!cancled) + { + self disable_weapon(); + } + return !cancled; +} +is_auto_melee() +{ + return (is_true(self.automatic_contextual_melee)); +} +disable_weapon() +{ + self HideViewModel(); + self DisableWeapons(); +} +enable_weapon() +{ + self ShowViewModel(); + self EnableWeapons(); + self AllowMelee(true); +} +get_alignment_object() +{ + if(IsDefined(level._contextual_melee_align_obj)) + { + return level._contextual_melee_align_obj; + } + else if (IsDefined(self.target)) + { + obj = GetEnt(self.target, "targetname"); + if( !IsDefined( obj ) ) + { + obj = getstruct( self.target, "targetname" ); + } + if (IsDefined(obj)) + { + return obj; + } + } + return self; +} +contextual_melee_thread() +{ + self notify("_contextual_melee_thread"); + self endon("_contextual_melee_thread"); + self endon("stop_contextual_melee"); + if (self is_scripted_melee()) + { + self waittill("start_scripted_melee", player); + self._melee.info = get_info_by_type(self._melee.type, "scripted", "scripted", "scripted"); + player disable_weapon(); + } + else + { + player = waittill_melee(); + } + if (IsAlive(self) && IsDefined(player)) + { + self thread do_contextual_melee(player); + } +} +is_scripted_melee() +{ + return (IsDefined(self._melee.set) && IsString(self._melee.set) && (self._melee.set == "scripted")); +} +do_idle(type, ai_context) +{ + self endon("stop_contextual_melee_idle"); + if (is_valid_stance(ai_context)) + { + self AllowedStances(ai_context); + } + else + { + set = self._melee.set; + if (IsArray(set)) + { + set = set[0]; + } + ai_idle = get_idle_anim(type, ai_context, set); + if (IsDefined(ai_idle)) + { + self._melee.set = set; + self._contextual_melee_align_obj = get_alignment_object(); + origin = self._contextual_melee_align_obj.origin; + angles = self._contextual_melee_align_obj.angles; + while (true) + { + self AnimScripted("contextual_melee_idle_anim", origin, angles, ai_idle); + self animscripts\shared::DoNoteTracks("contextual_melee_idle_anim"); + } + } + } +} +get_idle_anim(type, ai_context, which_set) +{ + info = get_info_set(which_set, true); + if (IsDefined(info[type])) + { + if (IsDefined(info[type][ai_context])) + { + info = random(info[type][ai_context]); + if (IsDefined(info["ai_idle"])) + { + return info["ai_idle"]; + } + } + } +} +is_valid_stance(stance) +{ + return (stance == "stand" || stance == "crouch" || stance == "prone"); +} +do_contextual_melee(player) +{ + info = self._melee.info; + player FreezeControls(true); + player notify( "do_contextual_melee" ); + self notify( "do_contextual_melee" ); + self stop_everything(); + assertex(IsDefined(info) && (info.size > 0), "Invalid info array for melee."); + self._contextual_melee_align_obj = get_alignment_object(); + if (does_melee_type_need_legs(info["type"])) + { + player spawn_player_model(self._contextual_melee_align_obj, info); + } + else + { + player spawn_player_hands(self._contextual_melee_align_obj, info); + } + player thread animate_player_hands(self, info); + self waittill("contextual_melee_start_anim"); + self notify("stop_contextual_melee_idle"); + self AnimScripted("contextual_melee_anim", self._contextual_melee_align_obj.origin, self._contextual_melee_align_obj.angles, info["ai"]); + self thread do_fx(); + self animate_prop(); + self thread contextual_melee_watch_for_anim_end(); + self waittill_either("finish_contextual_melee", "death"); + finish = true; + if (IsDefined(info["callback"])) + { + finish = player [[info["callback"]]](self); + } + else + { + player thread end_contextual_melee(self); + } + self notify("melee_done"); + player notify("melee_done"); + if (!is_false(finish)) + { + player.player_hands Delete(); + if (!IsAlive(self)) + { + return; + } + if (IsDefined(info["ai_deathpose"])) + { + self.takedamage = false; + self death_notify_wrapper(); + while (true) + { + self AnimScripted("contextual_melee_deathpose", self._contextual_melee_align_obj.origin, self._contextual_melee_align_obj.angles, info["ai_deathpose"]); + self animscripts\shared::DoNoteTracks("contextual_melee_deathpose"); + } + } + } +} +stop_everything() +{ + self notify("end_patrol"); + self notify("_stealth_stop_stealth_logic"); + self notify("_stealth_stop_corpse_logic"); + self.ignoreall = true; + self.goalradius = 0; + self SetGoalPos(self.origin); + self Unlink(); + self anim_stopAnimScripted(); +} +contextual_melee_watch_for_anim_end() +{ + self animscripts\shared::DoNoteTracks("contextual_melee_anim"); + self notify("finish_contextual_melee"); +} +contextual_melee_watch_for_victim_died() +{ + self waittill("death"); + self notify("finish_contextual_melee"); +} +end_contextual_melee(victim) +{ + level waittill_any_ents(victim, "death", self, "melee_done"); + self Unlink(); + self notify( "contextual_melee_complete" ); + if (!is_false(level._contextual_melee_hack)) + { + trace_start = self.origin + (0,0,100); + trace_end = self.origin + (0,0,-100); + player_trace = BulletTrace(trace_start, trace_end, false, victim); + self SetOrigin(player_trace["position"]); + } + self FreezeControls(false); + self enable_weapon(); +} +setup_fx() +{ + level._effect["neckstab_stand_blood"] = LoadFX("impacts/fx_melee_neck_stab"); + level._effect["neckstab_crouch_blood"] = LoadFX("impacts/fx_melee_neck_stab_crouching"); + level._effect["neckstab_stand_blood_left"] = LoadFX( "impacts/fx_melee_neck_stab_left" ); + level._effect["hatchet_arm_blood"] = LoadFX( "maps/rebirth/fx_axe_to_the_arm" ); +} +get_info_by_type(type, ai_context, player_context, which_set) +{ + info = get_info_set(which_set, true); + if (IsDefined(info[type])) + { + if (IsDefined(info[type][ai_context])) + { + if (IsDefined(info[type][ai_context][player_context])) + { + return info[type][ai_context][player_context]; + } + } + } +} +get_info(player_context, ai_context, which_set) +{ + info = get_info_set(which_set); + if (IsDefined(info[player_context])) + { + if (IsDefined(info[player_context][ai_context])) + { + info = info[player_context][ai_context]; + keys = GetArrayKeys(info); + type = keys[RandomInt(keys.size)]; + info = info[type]; + return info; + } + } +} +get_info_set(which_set, by_type) +{ + if (!IsDefined(which_set)) + { + which_set = "default"; + } + if (is_true(by_type)) + { + return level._melee.info_by_type[which_set]; + } + else + { + return level._melee.info[which_set]; + } +} +setup_info() +{ + add_melee_sequence("default", "garrote", "stand", "stand", %int_contextual_melee_garrote, + %ai_contextual_melee_garrote); + add_melee_sequence("default", "garrote", "stand", "sit", %int_contextual_melee_garrotesit, + %ai_contextual_melee_garrotesit_death, + %ai_contextual_melee_garrotesit_idle, + %ai_contextual_melee_garrotesit_deathpose); + add_melee_sequence("default", "necksnap", "stand", "stand", %int_contextual_melee_necksnap, + %ai_contextual_melee_necksnap); + add_melee_sequence("default", "neckstab", "stand", "stand", %int_contextual_melee_neckstab, + %ai_contextual_melee_neckstab); + add_melee_sequence("default", "neckstab", "stand", "crouch",%int_contextual_melee_neckstabcrouch, + %ai_contextual_melee_neckstabcrouch_death, + %ai_contextual_melee_neckstabcrouch_idle); + add_melee_sequence("quick", "garrote", "stand", "stand", %int_contextual_melee_garrote_quick, + %ai_contextual_melee_garrote_quick); + add_melee_sequence("quick", "garrote", "stand", "sit", %int_contextual_melee_garrotesit_quick, + %ai_contextual_melee_garrotesit_death_quick, + %ai_contextual_melee_garrotesit_idle, + %ai_contextual_melee_garrotesit_deathpose); + add_melee_sequence("quick", "necksnap", "stand", "stand", %int_contextual_melee_necksnap_quick, + %ai_contextual_melee_necksnap_quick); + add_melee_sequence("quick", "neckstab", "stand", "stand", %int_contextual_melee_neckstab_quick, + %ai_contextual_melee_neckstab_quick); + add_melee_sequence("quick", "neckstab", "stand", "crouch", %int_contextual_melee_neckstabcrouch_quick, + %ai_contextual_melee_neckstabcrouch_death_quick, + %ai_contextual_melee_neckstabcrouch_idle); + add_melee_sequence("quick", "neckstab", "crouch", "stand", %int_contextual_melee_crouch_neckstab_quick, + %ai_contextual_melee_crouch_neckstab_quick); + add_melee_sequence("quick", "kneekick", "stand", "stand", %int_contextual_melee_kneekick_quick, + %ai_contextual_melee_kneekick_quick); + add_melee_sequence("quick", "elbowhit", "stand", "stand", %int_contextual_melee_elbow_hit_quick, + %ai_contextual_melee_elbow_hit_quick); + add_melee_sequence("quick", "judochop", "stand", "stand", %int_contextual_melee_judochop_quick, + %ai_contextual_melee_judochop_quick); + add_melee_sequence("quick", "headpunch", "stand", "stand", %int_contextual_melee_headpunch_quick, + %ai_contextual_melee_headpunch_quick); + level.scr_animtree[ "player_hands_contextual_melee" ] = #animtree; + level.scr_model[ "player_hands_contextual_melee" ] = level.player_interactive_hands; + level.scr_animtree[ "player_model_contextual_melee" ] = #animtree; + level.scr_model[ "player_model_contextual_melee" ] = level.player_interactive_model; + setup_props(); +} +add_melee_sequence(set, type, player_context, ai_context, player_anim, ai_anim, ai_idle, ai_deathpose) +{ + if (!IsDefined(level._melee.info)) + { + level._melee.info = []; + } + level._melee.info[set][player_context][ai_context][type]["player"] = player_anim; + level._melee.info[set][player_context][ai_context][type]["ai"] = ai_anim; + level._melee.info[set][player_context][ai_context][type]["type"] = type; + if (IsDefined(ai_idle)) + { + level._melee.info[set][player_context][ai_context][type]["ai_idle"] = ai_idle; + } + if (IsDefined(ai_deathpose)) + { + level._melee.info[set][player_context][ai_context][type]["ai_deathpose"] = ai_deathpose; + } + if (!IsDefined(level._melee.info_by_type)) + { + level._melee.info_by_type = []; + } + level._melee.info_by_type[set][type][ai_context][player_context]["player"] = player_anim; + level._melee.info_by_type[set][type][ai_context][player_context]["ai"] = ai_anim; + level._melee.info_by_type[set][type][ai_context][player_context]["type"] = type; + if (IsDefined(ai_idle)) + { + level._melee.info_by_type[set][type][ai_context][player_context]["ai_idle"] = ai_idle; + } + if (IsDefined(ai_deathpose)) + { + level._melee.info_by_type[set][type][ai_context][player_context]["ai_deathpose"] = ai_deathpose; + } +} +add_scripted_melee(name, player_anim, ai_anim, ai_idle, ai_deathpose) +{ + add_melee_sequence("scripted", name, "scripted", "scripted", player_anim, ai_anim, ai_idle, ai_deathpose); +} +add_melee_callback(set, type, player_context, ai_context, callback) +{ + level._melee.info[set][player_context][ai_context][type]["callback"] = callback; + level._melee.info_by_type[set][type][ai_context][player_context]["callback"] = callback; +} +do_fx() +{ + while (true) + { + self waittill("contextual_melee_anim", note); + switch (note) + { + case "fx_blood": + PlayFXOnTag(level._effect["neckstab_stand_blood"], self, "J_Neck"); + break; + case "fx_blood_karambit": + AssertEx( IsDefined(level._effect["karambit_stand_blood"]), "No blood effect setup for the karambit contextual melee"); + if( is_mature() ) + { + PlayFXOnTag(level._effect["karambit_stand_blood"], self, "J_Neck"); + } + level notify( "karambit_stand_blood_now" ); + break; + case "fx_blood_arm_hatchet": + PlayFXOnTag( level._effect["hatchet_arm_blood"], self, "J_Wrist_LE" ); + break; + case "fx_blood_neck_hatchet": + PlayFXOnTag( level._effect["neckstab_stand_blood_left"], self, "J_Neck" ); + break; + case "end": + break; + } + } +} +get_weapon(type) +{ + if (IsDefined(level._melee.weapon_info[type])) + { + return level._melee.weapon_info[type]; + } +} +does_melee_type_need_legs(type) +{ + switch (type) + { + case "shovelslam": + case "kneekick": + case "karambit": + return true; + default: + return false; + } +} +spawn_player_hands(align_ent, info) +{ + if(IsDefined(self.early_contextual_player_hands)) + { + self.player_hands = self.early_contextual_player_hands; + } + else + { + start_org = GetStartOrigin(align_ent.origin, align_ent.angles, info["player"] ); + start_ang = GetStartAngles(align_ent.origin, align_ent.angles, info["player"] ); + self.player_hands = spawn_anim_model( "player_hands_contextual_melee", start_org, start_ang ); + } + if(!IsDefined(level._contextual_melee_hide)) + { + self.player_hands Hide(); + } +} +spawn_player_model(align_ent, info) +{ + start_org = GetStartOrigin(align_ent.origin, align_ent.angles, info["player"] ); + start_ang = GetStartAngles(align_ent.origin, align_ent.angles, info["player"] ); + self.player_hands = spawn_anim_model( "player_model_contextual_melee", start_org, start_ang ); + self.player_hands Hide(); +} +animate_player_hands(victim, info) +{ + self.player_hands SetAnim( info["player"], 1, 0, 0 ); + self StartCameraTween(level._CONTEXTUAL_MELEE_LERP_TIME); + self PlayerLinkToAbsolute(self.player_hands, "tag_player"); + wait (level._CONTEXTUAL_MELEE_LERP_TIME / 2); + victim notify("contextual_melee_start_anim"); + self.player_hands AnimScripted("contextual_melee_anim", victim._contextual_melee_align_obj.origin, victim._contextual_melee_align_obj.angles, info["player"]); + if (IsDefined(info["weapon_name"])) + { + weapon = info["weapon_name"]; + if (IsDefined(info["weapon_anim"])) + { + self thread animate_weapon(weapon, info["weapon_anim"]); + } + else + { + self.player_hands Attach(weapon, "tag_weapon", true); + } + } + wait (.05); + self.player_hands Show(); + self.player_hands animscripts\shared::DoNoteTracks("contextual_melee_anim"); +} +#using_animtree( "animated_props" ); +setup_props() +{ + add_melee_weapon("default", "neckstab", "stand", "stand", "weapon_parabolic_knife"); + add_melee_weapon("default", "neckstab", "stand", "crouch", "weapon_parabolic_knife"); + add_melee_weapon("quick", "neckstab", "stand", "stand", "weapon_parabolic_knife"); + add_melee_weapon("quick", "neckstab", "stand", "crouch", "weapon_parabolic_knife"); + add_melee_weapon("default", "garrote", "stand", "stand", "t5_weapon_garrot_wire", %prop_contextual_melee_garrote_garrotewire); + add_melee_weapon("default", "garrote", "stand", "sit", "t5_weapon_garrot_wire", %prop_contextual_melee_garrotesit_garrotewire); + add_melee_weapon("quick", "garrote", "stand", "stand", "t5_weapon_garrot_wire", %prop_contextual_melee_garrote_garrotewire_quick); + add_melee_weapon("quick", "garrote", "stand", "sit", "t5_weapon_garrot_wire", %prop_contextual_melee_garrotesit_garrotewire_quick); + add_melee_prop_anim("default", "garrote", "stand", "sit", %prop_contextual_melee_garrotesit_chair); + add_melee_prop_anim("quick", "garrote", "stand", "sit", %prop_contextual_melee_garrotesit_chair_quick); +} +add_melee_weapon(set, type, player_context, ai_context, weapon_name, weapon_anim) +{ + level._melee.info[set][player_context][ai_context][type]["weapon_name"] = weapon_name; + level._melee.info[set][player_context][ai_context][type]["weapon_anim"] = weapon_anim; + level._melee.info_by_type[set][type][ai_context][player_context]["weapon_name"] = weapon_name; + level._melee.info_by_type[set][type][ai_context][player_context]["weapon_anim"] = weapon_anim; +} +add_melee_prop_anim(set, type, player_context, ai_context, animation) +{ + level._melee.info[set][player_context][ai_context][type]["prop_anim"] = animation; + level._melee.info_by_type[set][type][ai_context][player_context]["prop_anim"] = animation; +} +animate_weapon(weapon_name, animation) +{ + weapon_org = self.player_hands GetTagOrigin("tag_weapon"); + weapon_ang = self.player_hands GetTagAngles("tag_weapon"); + weapon = Spawn("script_model", weapon_org); + weapon SetModel(weapon_name); + weapon UseAnimTree(#animtree); + weapon LinkTo(self.player_hands, "tag_weapon"); + weapon AnimScripted("contextual_melee_weapon_anim", weapon_org, weapon_ang, animation); + weapon animscripts\shared::DoNoteTracks("contextual_melee_weapon_anim"); + weapon Delete(); +} +animate_prop() +{ + if (IsDefined(self._melee.info["prop_anim"])) + { + self._contextual_melee_align_obj UseAnimTree(#animtree); + self._contextual_melee_align_obj AnimScripted("contextual_melee_prop_anim", self._contextual_melee_align_obj.origin, self._contextual_melee_align_obj.angles, self._melee.info["prop_anim"]); + } +} +contextual_melee_show_hintstring( string_on ) +{ + level._contextual_melee_print_hintstring = string_on; +} +contextual_melee_allow_fire_button( string_on ) +{ + level._contextual_melee_allow_fire_button = string_on; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_coop_weaponswap.gsc b/BO1/PC/ZM/maps/_coop_weaponswap.gsc new file mode 100644 index 0000000..ba99ded Binary files /dev/null and b/BO1/PC/ZM/maps/_coop_weaponswap.gsc differ diff --git a/BO1/PC/ZM/maps/_cooplogic.gsc b/BO1/PC/ZM/maps/_cooplogic.gsc new file mode 100644 index 0000000..d547172 Binary files /dev/null and b/BO1/PC/ZM/maps/_cooplogic.gsc differ diff --git a/BO1/PC/ZM/maps/_createcam.gsc b/BO1/PC/ZM/maps/_createcam.gsc new file mode 100644 index 0000000..41efcaa Binary files /dev/null and b/BO1/PC/ZM/maps/_createcam.gsc differ diff --git a/BO1/PC/ZM/maps/_createdynents.gsc b/BO1/PC/ZM/maps/_createdynents.gsc new file mode 100644 index 0000000..212bb0e --- /dev/null +++ b/BO1/PC/ZM/maps/_createdynents.gsc @@ -0,0 +1,1866 @@ +#include common_scripts\utility; +#include maps\_utility; +init_once() +{ + PrecacheShader( "white" ); + dyn_models = GetDynModels(); + dyn_models = []; + for( i = 0; i < dyn_models.size; i++ ) + { + if( isdefined( dyn_models[i] ) ) + { + PrecacheModel( dyn_models[i] ); + } + } + misc_models = GetMiscModels(); + misc_models = []; + for( i = 0; i < misc_models.size; i++ ) + { + if( isdefined( misc_models[i] ) ) + { + PrecacheModel( misc_models[i] ); + } + } + level.model_names["dynent"] = []; + level.model_names["destructible"] = []; + level.model_names["miscmodel"] = []; + level.models["dynent"] = []; + level.models["destructible"] = []; + level.models["miscmodel"] = []; + level.dynent_groups = []; + level.all_objects = []; + setup_groups(); + dyn_models = GetDynModels(); + dyn_models = []; + for( i = 0; i < dyn_models.size; i++ ) + { + if( isdefined( dyn_models[i] ) ) + { + add_model_to_group( dyn_models[i] ); + add_name( dyn_models[i], "dynent" ); + } + } + misc_models = GetMiscModels(); + misc_models = []; + for( i = 0; i < misc_models.size; i++ ) + { + add_name( misc_models[i], "miscmodel" ); + } + destructible_defs = GetDestructibleDefs(); + for( i = 0; i < destructible_defs.size; i++ ) + { + add_name( destructible_defs[i], "destructible" ); + } +} +main() +{ + while( GetDvar( #"propman" ) != "1" ) + { + wait 1; + } + if( !isdefined( level.script ) ) + { + level.script = ToLower( GetDvar( #"mapname" ) ); + } + waittillframeend; + wait 1; + wait_for_first_player(); + players = get_players(); + level.debug_player = players[0]; + level set_default_path(); + level set_crosshair(); + level init(); + level setup_menus(); + level setup_menu_buttons(); + level thread menu_input(); + level setup_xform_menu(); +} +set_crosshair() +{ + crossHair = NewDebugHudElem(); + crossHair.location = 0; + crossHair.alignX = "center"; + crossHair.alignY = "middle"; + crossHair.foreground = 1; + crossHair.fontScale = 2; + crossHair.sort = 20; + crossHair.alpha = 1; + crossHair.x = 320; + crossHair.y = 233; + crossHair setText("."); +} +setup_groups() +{ + level.model_group_map = []; + level.dynent_groups = []; + level.groups = []; + level.model_group_map["p_glo_gascan"] = "p_glo"; + level.model_group_map["p_glo_cinder_block"] = "p_glo"; + level.model_group_map["p_jun_fruit_apple"] = "fruits"; + level.model_group_map["p_jun_fruit_pineapple"] = "fruits"; +} +add_to_group( group, model ) +{ + if( isdefined( level.groups[group] ) ) + { + if( check_for_dupes( level.groups[group], model ) ) + { + level.groups[group][level.groups[group].size] = model; + } + } + else + { + level.dynent_groups[level.dynent_groups.size] = group; + level.groups[group][0] = model; + } +} +add_model_to_group( model ) +{ + if( isdefined( level.model_group_map[model] ) ) + { + add_to_group( level.model_group_map[model], model ); + } + else + { + add_to_group( "miscmodel", model ); + } +} +init() +{ + level.highlighted = []; + level.rotate_highlighted = []; +} +add_to_dynent_group( dynent_name ) +{ + if( check_for_dupes( level.dynent_groups, dynent_name ) ) + { + level.dynent_groups[level.dynent_groups.size] = dynent_name; + } +} +add_to_all_objects() +{ + if( check_for_dupes( level.all_objects, self ) ) + { + level.all_objects[level.all_objects.size] = self; + } +} +remove_from_all_objects() +{ + if( level.all_objects.size > 0 ) + { + level.all_objects = array_remove( level.all_objects, self ); + } +} +add_name( name, type ) +{ + if( check_for_dupes( level.model_names[type], name ) ) + { + level.model_names[type][level.model_names[type].size] = name; + } +} +add_model( type ) +{ + if( check_for_dupes( level.models[type], self ) ) + { + level.models[type][level.models[type].size] = self; + } +} +check_for_dupes( array, single ) +{ + for( i = 0; i < array.size; i++ ) + { + if( array[i] == single ) + { + return false; + } + } + return true; +} +setup_menus() +{ + level.menu_sys = []; + level.menu_sys["current_menu"] = SpawnStruct(); + add_menu( "choose_mode", "Choose Mode:" ); + add_menuoptions( "choose_mode", "Dyn Ents Mode" ); + add_menuoptions( "choose_mode", "Destructibles Mode" ); + add_menuoptions( "choose_mode", "Misc Models Mode" ); + add_menuoptions( "choose_mode", "Toggle Help Hud", ::toggle_xform_hud ); + add_menuoptions( "choose_mode", "Quit", ::quit ); + add_menu_child( "choose_mode", "dynent_mode", "Dyn Ents Mode" ); + set_no_back_menu( "dynent_mode" ); + add_menuoptions( "dynent_mode", "Select Model", ::select_dynent_from_list ); + add_menuoptions( "dynent_mode", "Select Group", ::select_dynent_group ); + add_menuoptions( "dynent_mode", "Place Model", ::place_dynent ); + add_menuoptions( "dynent_mode", "Place Copy", ::place_dynent_copy ); + add_menuoptions( "dynent_mode", "Spray Selected", ::spray_model ); + add_menuoptions( "dynent_mode", "Select Mode" ); + add_menuoptions( "dynent_mode", "Save", ::save_dynents ); + add_menuoptions( "dynent_mode", "Back", ::selected_back ); + add_menu_child( "dynent_mode", "dynent_select_menu", "Dyn Ents->Select Mode:", 5, ::select_dynents ); + add_menuoptions( "dynent_select_menu", "Move" ); + add_menuoptions( "dynent_select_menu", "Copy" ); + add_menuoptions( "dynent_select_menu", "Delete", ::delete_model ); + add_menuoptions( "dynent_select_menu", "Save" ); + add_menu_child( "dynent_select_menu", "dynent_move_menu", "Dyn Ents->Move Selected:", 0, ::move_model ); + set_no_back_menu( "dynent_move_menu" ); + add_menuoptions( "dynent_move_menu", "Place Model", ::place_dynent ); + add_menuoptions( "dynent_move_menu", "Copy Model", ::place_dynent_copy ); + add_menuoptions( "dynent_move_menu", "Back", ::selected_back ); + add_menu_child( "dynent_select_menu", "dynent_copy_menu", "Dyn Ents->Copy Selected:", 1, ::copy_dynent ); + set_no_back_menu( "dynent_copy_menu" ); + add_menuoptions( "dynent_copy_menu", "Place Model", ::place_dynent ); + add_menuoptions( "dynent_copy_menu", "Place Copy", ::place_dynent_copy ); + add_menuoptions( "dynent_copy_menu", "Back", ::selected_back ); + add_menu_child( "dynent_select_menu", "selected_dynent_save_menu", "Dyn Ents->Save Selected:", 3, ::selected_dynent_save ); + add_menuoptions( "selected_dynent_save_menu", "Highlight", ::selected_save_highlight ); + add_menuoptions( "selected_dynent_save_menu", "Save Selected", ::save_dynent_highlighted ); + add_menu_child( "choose_mode", "destructible_mode", "Destructibles Mode" ); + add_menuoptions( "destructible_mode", "Select Model", ::select_destructible_from_list ); + add_menuoptions( "destructible_mode", "Place Model", ::place_destructible ); + add_menuoptions( "destructible_mode", "Place Copy", ::place_destructible_copy ); + add_menuoptions( "destructible_mode", "Select Mode" ); + add_menuoptions( "destructible_mode", "Save", ::save_destructibles ); + add_menu_child( "destructible_mode", "destructible_select_menu", "Destructibles->Select Mode:", 3, ::select_destructibles ); + add_menuoptions( "destructible_select_menu", "Move" ); + add_menuoptions( "destructible_select_menu", "Copy" ); + add_menuoptions( "destructible_select_menu", "Delete", ::delete_model ); + add_menuoptions( "destructible_select_menu", "Save" ); + add_menu_child( "destructible_select_menu", "destructible_move_menu", "Destructibles->Move Selected:", 0, ::move_model ); + set_no_back_menu( "destructible_move_menu" ); + add_menuoptions( "destructible_move_menu", "Place Model", ::place_destructible ); + add_menuoptions( "destructible_move_menu", "Copy Model", ::place_destructible_copy ); + add_menuoptions( "destructible_move_menu", "Back", ::selected_back ); + add_menu_child( "destructible_select_menu", "destructible_copy_menu", "Destructibles->Copy Selected:", 1, ::copy_destructible ); + set_no_back_menu( "destructible_copy_menu" ); + add_menuoptions( "destructible_copy_menu", "Place Model", ::place_destructible ); + add_menuoptions( "destructible_copy_menu", "Place Copy", ::place_destructible_copy ); + add_menuoptions( "destructible_copy_menu", "Back", ::selected_back ); + add_menu_child( "destructible_select_menu", "selected_destructible_save_menu", "Destructibles->Save Selected:", 3, ::selected_destructible_save ); + add_menuoptions( "selected_destructible_save_menu", "Highlight", ::selected_save_highlight ); + add_menuoptions( "selected_destructible_save_menu", "Save Selected", ::save_destructible_highlighted ); + add_menu_child( "choose_mode", "miscmodel_menu", "Misc Models Mode" ); + add_menuoptions( "miscmodel_menu", "Select Model", ::select_miscmodel_from_list ); + add_menuoptions( "miscmodel_menu", "Place Model", ::place_miscmodel ); + add_menuoptions( "miscmodel_menu", "Place Copy", ::place_miscmodel_copy ); + add_menuoptions( "miscmodel_menu", "Select Mode" ); + add_menuoptions( "miscmodel_menu", "Save", ::save_miscmodels ); + add_menu_child( "miscmodel_menu", "miscmodel_select_menu", "Misc Model->Select Mode:", 3, ::select_miscmodels ); + add_menuoptions( "miscmodel_select_menu", "Move" ); + add_menuoptions( "miscmodel_select_menu", "Copy" ); + add_menuoptions( "miscmodel_select_menu", "Delete", ::delete_model ); + add_menuoptions( "miscmodel_select_menu", "Save" ); + add_menu_child( "miscmodel_select_menu", "miscmodel_move_menu", "Misc Model->Move Selected:", 0, ::move_model ); + set_no_back_menu( "miscmodel_move_menu" ); + add_menuoptions( "miscmodel_move_menu", "Place Model", ::place_miscmodel ); + add_menuoptions( "miscmodel_move_menu", "Copy Model", ::place_miscmodel_copy ); + add_menuoptions( "miscmodel_move_menu", "Back", ::selected_back ); + add_menu_child( "miscmodel_select_menu", "miscmodel_copy_menu", "Misc Model->Copy Selected:", 1, ::copy_miscmodel ); + set_no_back_menu( "miscmodel_copy_menu" ); + add_menuoptions( "miscmodel_copy_menu", "Place Model", ::place_miscmodel); + add_menuoptions( "miscmodel_copy_menu", "Place Copy", ::place_miscmodel_copy ); + add_menuoptions( "miscmodel_copy_menu", "Back", ::selected_back ); + add_menu_child( "miscmodel_select_menu", "selected_miscmodel_save_menu", "Misc Model->Save Selected:", 3, ::selected_miscmodel_save ); + add_menuoptions( "selected_miscmodel_save_menu", "Highlight", ::selected_save_highlight ); + add_menuoptions( "selected_miscmodel_save_menu", "Save Selected", ::save_miscmodel_highlighted ); + enable_menu( "choose_mode" ); +} +add_menu( menu_name, title ) +{ + if( isdefined( level.menu_sys[menu_name] ) ) + { + println( "^1level.menu_sys[" + menu_name + "] already exists, change the menu_name" ); + return; + } + level.menu_sys[menu_name] = SpawnStruct(); + level.menu_sys[menu_name].title = "none"; + level.menu_sys[menu_name].title = title; +} +add_menuoptions( menu_name, option_text, func ) +{ + if( !isdefined( level.menu_sys[menu_name].options ) ) + { + level.menu_sys[menu_name].options = []; + } + num = level.menu_sys[menu_name].options.size; + level.menu_sys[menu_name].options[num] = option_text; + level.menu_sys[menu_name].function[num] = func; +} +add_menu_child( parent_menu, child_menu, child_title, child_number_override, func ) +{ + if( !isdefined( level.menu_sys[child_menu] ) ) + { + add_menu( child_menu, child_title ); + } + level.menu_sys[child_menu].parent_menu = parent_menu; + if( !isdefined( level.menu_sys[parent_menu].children_menu ) ) + { + level.menu_sys[parent_menu].children_menu = []; + } + if( !isdefined( child_number_override ) ) + { + size = level.menu_sys[parent_menu].children_menu.size; + } + else + { + size = child_number_override; + } + level.menu_sys[parent_menu].children_menu[size] = child_menu; + if( isdefined( func ) ) + { + if( !isdefined( level.menu_sys[parent_menu].children_func ) ) + { + level.menu_sys[parent_menu].children_func = []; + } + level.menu_sys[parent_menu].children_func[size] = func; + } +} +set_no_back_menu( menu_name ) +{ + level.menu_sys[menu_name].no_back = true; +} +enable_menu( menu_name ) +{ + disable_menu( "current_menu" ); + if( isdefined( level.menu_cursor ) ) + { + level.menu_cursor.y = 130; + level.menu_cursor.current_pos = 0; + } + level.menu_sys["current_menu"].title = set_menu_hudelem( level.menu_sys[menu_name].title, "title" ); + level.menu_sys["current_menu"].menu_name = menu_name; + back_option_num = 0; + if( isdefined( level.menu_sys[menu_name].options ) ) + { + options = level.menu_sys[menu_name].options; + for( i = 0; i < options.size; i++ ) + { + text = ( i + 1 ) + ". " + options[i]; + level.menu_sys["current_menu"].options[i] = set_menu_hudelem( text, "options", 20 * i ); + back_option_num = i; + } + } + if( isdefined( level.menu_sys[menu_name].parent_menu ) && !isdefined( level.menu_sys[menu_name].no_back ) ) + { + back_option_num++; + text = ( back_option_num + 1 ) + ". " + "Back"; + level.menu_sys["current_menu"].options[back_option_num] = set_menu_hudelem( text, "options", 20 * back_option_num ); + } +} +disable_menu( menu_name ) +{ + if( isdefined( level.menu_sys[menu_name] ) ) + { + if( isdefined( level.menu_sys[menu_name].title ) ) + { + level.menu_sys[menu_name].title Destroy(); + } + if( isdefined( level.menu_sys[menu_name].options ) ) + { + options = level.menu_sys[menu_name].options; + for( i = 0; i < options.size; i++ ) + { + options[i] Destroy(); + } + } + } + level.menu_sys[menu_name].title = undefined; + level.menu_sys[menu_name].options = []; +} +set_menu_hudelem( text, type, y_offset ) +{ + x = 10; + y = 100; + if( isdefined( type ) && type == "title" ) + { + scale = 2; + } + else + { + scale = 1.3; + y = y + 30; + } + if( !isdefined( y_offset ) ) + { + y_offset = 0; + } + y = y + y_offset; + return set_hudelem( text, x, y, scale ); +} +set_hudelem( text, x, y, scale, alpha ) +{ + if( !isdefined( alpha ) ) + { + alpha = 1; + } + if( !isdefined( scale ) ) + { + scale = 1; + } + hud = NewDebugHudElem(); + hud.location = 0; + hud.alignX = "left"; + hud.alignY = "middle"; + hud.foreground = 1; + hud.fontScale = scale; + hud.sort = 20; + hud.alpha = alpha; + hud.x = x; + hud.y = y; + hud.og_scale = scale; + if( isdefined( text ) ) + { + hud SetText( text ); + } + return hud; +} +menu_input() +{ + level endon( "stop_createdynents" ); + while( 1 ) + { + level waittill( "menu_button_pressed", keystring ); + menu_name = level.menu_sys["current_menu"].menu_name; + if( keystring == "dpad_up" || keystring == "uparrow" ) + { + if( level.menu_cursor.current_pos > 0 ) + { + level.menu_cursor.y = level.menu_cursor.y - 20; + level.menu_cursor.current_pos--; + } + else + { + level.menu_cursor.y = 130 + 20 * ( level.menu_sys["current_menu"].options.size - 1 ); + level.menu_cursor.current_pos = level.menu_sys["current_menu"].options.size - 1; + } + continue; + } + else if( keystring == "dpad_down" || keystring == "downarrow" ) + { + if( level.menu_cursor.current_pos < level.menu_sys["current_menu"].options.size - 1 ) + { + level.menu_cursor.y = level.menu_cursor.y + 20; + level.menu_cursor.current_pos++; + } + else + { + level.menu_cursor.y = 130; + level.menu_cursor.current_pos = 0; + } + continue; + } + else if( keystring == "button_a" || keystring == "enter" ) + { + key = level.menu_cursor.current_pos; + } + else + { + key = int( keystring ) - 1; + } + if( key > level.menu_sys[menu_name].options.size ) + { + continue; + } + else if( isdefined( level.menu_sys[menu_name].parent_menu ) && key == level.menu_sys[menu_name].options.size ) + { + level notify( "disable " + menu_name ); + level enable_menu( level.menu_sys[menu_name].parent_menu ); + } + else if( isdefined( level.menu_sys[menu_name].function ) && isdefined( level.menu_sys[menu_name].function[key] ) ) + { + level.menu_sys["current_menu"].options[key] thread hud_selector( level.menu_sys["current_menu"].options[key].x, level.menu_sys["current_menu"].options[key].y ); + if( isdefined( level.menu_sys[menu_name].func_key ) && isdefined( level.menu_sys[menu_name].func_key[key] ) && level.menu_sys[menu_name].func_key[key] == keystring ) + { + error_msg = level [[level.menu_sys[menu_name].function[key]]](); + } + else + { + error_msg = level [[level.menu_sys[menu_name].function[key]]](); + } + level thread hud_selector_fade_out(); + if( isdefined( error_msg ) ) + { + level thread selection_error( error_msg, level.menu_sys["current_menu"].options[key].x, level.menu_sys["current_menu"].options[key].y ); + } + } + if( !isdefined( level.menu_sys[menu_name].children_menu ) ) + { + continue; + } + else if( !isdefined( level.menu_sys[menu_name].children_menu[key] ) ) + { + continue; + } + else if( !isdefined( level.menu_sys[level.menu_sys[menu_name].children_menu[key]] ) ) + { + continue; + } + if( isdefined( level.menu_sys[menu_name].children_func ) && isdefined( level.menu_sys[menu_name].children_func[key] ) ) + { + func = level.menu_sys[menu_name].children_func[key]; + error_msg = [[func]](); + if( isdefined( error_msg ) ) + { + level thread selection_error( error_msg, level.menu_sys["current_menu"].options[key].x, level.menu_sys["current_menu"].options[key].y ); + continue; + } + } + level enable_menu( level.menu_sys[menu_name].children_menu[key] ); + } +} +force_menu_back() +{ + level endon( "stop_createdynents" ); + wait( 0.1 ); + menu_name = level.menu_sys["current_menu"].menu_name; + key = level.menu_sys[menu_name].options.size; + key++; + keys[1] = "1"; + keys[2] = "2"; + keys[3] = "3"; + keys[4] = "4"; + keys[5] = "5"; + keys[6] = "6"; + keys[7] = "7"; + keys[8] = "8"; + keys[9] = "9"; + if( key > 0 && key < 10 ) + key = keys[key]; + level notify( "menu_button_pressed", key ); +} +list_menu( list, x, y, scale, func ) +{ + hud_array = []; + space_apart = 15; + for( i = 0; i < list.size; i++ ) + { + alpha = 1 / ( i + 1 ); + if( alpha < 0.2 ) + { + alpha = 0.1; + } + hud = set_hudelem( list[i], x, y + ( i * space_apart ), scale, alpha ); + hud_array = array_add( hud_array, hud ); + } + current_num = 0; + old_num = 0; + selected = false; + [[func]]( list[current_num] ); + while( true ) + { + level waittill( "menu_button_pressed", key ); + if( any_button_hit( key, "numbers" ) ) + { + break; + } + else if( key == "downarrow" || key == "dpad_down" ) + { + if( current_num >= hud_array.size - 1 ) + { + continue; + } + current_num++; + move_list_menu( hud_array, "down", space_apart, current_num ); + } + else if( key == "uparrow" || key == "dpad_up" ) + { + if( current_num <= 0 ) + { + continue; + } + current_num--; + move_list_menu( hud_array, "up", space_apart, current_num ); + } + else if( key == "enter" || key == "button_a" ) + { + selected = true; + break; + } + level notify( "scroll_list" ); + if( current_num != old_num ) + { + old_num = current_num; + [[func]]( list[current_num] ); + } + } + for( i = 0; i < hud_array.size; i++ ) + { + hud_array[i] Destroy(); + } + if( selected ) + { + return current_num; + } +} +move_list_menu( hud_array, dir, space, num ) +{ + time = 0.1; + if( dir == "up" ) + { + movement = space; + } + else + { + movement = space * -1; + } + for( i = 0; i < hud_array.size; i++ ) + { + hud_array[i] MoveOverTime( time ); + hud_array[i].y = hud_array[i].y + movement; + temp = i - num; + if( temp < 0 ) + { + temp = temp * -1; + } + alpha = 1 / ( temp + 1 ); + if( alpha < 0.2 ) + { + alpha = 0.1; + } + hud_array[i] FadeOverTime( time ); + hud_array[i].alpha = alpha; + } +} +hud_selector( x, y ) +{ + level endon( "stop_createdynents" ); + if( isdefined( level.hud_selector ) ) + { + level thread hud_selector_fade_out(); + } + level.menu_cursor.alpha = 0; + level.hud_selector = set_hudelem( undefined, x - 10, y, 1 ); + level.hud_selector SetShader( "white", 125, 20 ); + level.hud_selector.color = ( 1, 1, 0.5 ); + level.hud_selector.alpha = 0.5; + level.hud_selector.sort = 10; +} +hud_selector_fade_out( time ) +{ + level endon( "stop_createdynents" ); + if( !isdefined( time ) ) + { + time = 0.25; + } + level.menu_cursor.alpha = 0.5; + hud = level.hud_selector; + level.hud_selector = undefined; + hud FadeOverTime( time ); + hud.alpha = 0; + wait( time + 0.1 ); + hud Destroy(); +} +selection_error( msg, x, y ) +{ + level endon( "stop_createdynents" ); + hud = set_hudelem( undefined, x - 10, y, 1 ); + hud SetShader( "white", 110, 20 ); + hud.color = ( 0.5, 0, 0 ); + hud.alpha = 0.7; + error_hud = set_hudelem( msg, x + 110, y, 1 ); + error_hud.color = ( 1, 0, 0 ); + hud FadeOverTime( 3 ); + hud.alpha = 0; + error_hud FadeOverTime( 3 ); + error_hud.alpha = 0; + wait( 3.1 ); + hud Destroy(); + error_hud Destroy(); +} +hud_font_scaler( mult ) +{ + level endon( "stop_createdynents" ); + self notify( "stop_fontscaler" ); + self endon( "death" ); + self endon( "stop_fontscaler" ); + og_scale = self.og_scale; + if( !isdefined( mult ) ) + { + mult = 1.5; + } + self.fontscale = og_scale * mult; + dif = og_scale - self.fontscale; + time = 1; + dif /= time * 20; + for( i = 0; i < time * 20; i++ ) + { + self.fontscale += dif; + wait( 0.05 ); + } +} +update_selected_object_position() +{ + object = level.selected_object; + if( isdefined( object ) ) + { + forward = AnglesToforward( level.debug_player GetPlayerAngles() ); + vector = level.debug_player GetEye() + vector_scale( forward, 5000 ); + trace = BulletTrace( level.debug_player GetEye(), vector, false, self ); + if( trace["fraction"] != 1 ) + { + vector = trace["position"] + ( 0, 0, level.selected_object_z_offset ); + if( vector != object.origin ) + { + object MoveTo( vector, 0.1 ); + object waittill( "movedone" ); + } + } + wait( 0.1 ); + } +} +move_selected_object( with_trace ) +{ + level endon( "stop_createdynents" ); + self notify( "stop_move_selected_object" ); + self endon( "stop_move_selected_object" ); + self endon( "unlink_selected_object" ); + self endon( "death" ); + if( !isdefined( with_trace ) ) + { + with_trace = false; + } + while( true ) + { + forward = AnglesToforward( level.debug_player GetPlayerAngles() ); + if( with_trace ) + { + vector = level.debug_player GetEye() + vector_scale( forward, 5000 ); + trace = BulletTrace( level.debug_player GetEye(), vector, false, self ); + if( trace["fraction"] == 1 ) + { + wait( 0.1 ); + continue; + } + else + { + vector = trace["position"]; + } + vector = vector + ( 0, 0, level.selected_object_z_offset ); + } + else + { + vector = level.debug_player GetEye() + vector_scale( forward, level.selected_object_dist ); + } + if( vector != self.origin ) + { + self MoveTo( vector, 0.1 ); + self waittill( "movedone" ); + } + else + { + wait( 0.1 ); + } + } +} +get_random_model() +{ + count = level.groups[level.selected_group].size; + return level.groups[level.selected_group][randomintrange( 0, count )]; +} +spray_model() +{ + level.spray = []; + if( isdefined( level.selected_object ) && !isdefined( level.selected_group ) ) + { + level.spray = []; + level.spray["model"] = level.selected_object.model; + level.selected_object Delete(); + } + else + { + if( isdefined( level.selected_group ) ) + { + level.spray = []; + level.spray["model"] = get_random_model(); + if( isdefined( level.selected_object ) ) + { + level.selected_object Delete(); + level.selected_object = undefined; + } + } + else + { + return "ERROR: Select Model or Group first!"; + } + } + level.spray["rate"] = 0.25; + level.spray["power"] = 1000; + spray_buttons(); + spray_hud(); + level thread spray_trajectory(); + while( 1 ) + { + level waittill( "spray_button_pressed", key ); + if( key == "fire" ) + { + do_spray_model(); + if( isdefined( level.selected_group ) ) + { + level.spray["model"] = get_random_model(); + level.spray_hud["model"] SetText( level.spray["model"] ); + level.spray_hud["model"] thread hud_font_scaler(); + } + wait( level.spray["rate"] - 0.1 ); + } + else if( key == "uparrow" || key == "dpad_up" ) + { + level.spray["power"] += 50; + if( level.spray["power"] > 5000 ) + { + level.spray["power"] = 5000; + } + level.spray_hud["power"] SetText( level.spray["power"] ); + level.spray_hud["power"] thread hud_font_scaler(); + wait( 0.05 ); + } + else if( key == "downarrow" || key == "dpad_down" ) + { + level.spray["power"] -= 50; + if( level.spray["power"] < 50 ) + { + level.spray["power"] = 50; + } + level.spray_hud["power"] SetText( level.spray["power"] ); + level.spray_hud["power"] thread hud_font_scaler(); + wait( 0.05 ); + } + else if( key == "leftarrow" || key == "dpad_left" ) + { + level.spray["rate"] -= 0.05; + if( level.spray["rate"] < 0.25 ) + { + level.spray["rate"] = 0.25; + } + level.spray_hud["rate"] SetText( level.spray["rate"] ); + level.spray_hud["rate"] thread hud_font_scaler(); + wait( 0.05 ); + } + else if( key == "rightarrow" || key == "dpad_right" ) + { + level.spray["rate"] += 0.05; + if( level.spray["rate"] > 1 ) + { + level.spray["rate"] = 1; + } + level.spray_hud["rate"] SetText( level.spray["rate"] ); + level.spray_hud["rate"] thread hud_font_scaler(); + wait( 0.05 ); + } + else if( key == "button_lshldr" || key == "button_rshldr" ) + { + if( isdefined( level.selected_group ) ) + { + level.spray["model"] = get_random_model(); + level.spray_hud["model"] SetText( level.spray["model"] ); + level.spray_hud["model"] thread hud_font_scaler(); + wait( 0.05 ); + } + } + else if( key == "end" || key == "button_b" ) + { + break; + } + } + level notify( "stop_spray" ); + remove_hud( "spray_hud" ); +} +do_spray_model() +{ + forward = AnglesToForward( level.debug_player GetPlayerAngles() ); + vector = level.debug_player GetEye() + vector_scale( forward, 48 ); + object = Spawn( "script_model", vector ); + object SetModel( level.spray["model"] ); + velocity = vector_scale( forward, level.spray["power"] ); + object PhysicsLaunch( object.origin, velocity ); + object store_model( "dynent" ); +} +spray_trajectory() +{ + level endon( "stop_createdynents" ); + level endon( "stop_spray" ); + segments = 10; + time = 1.0; + time_inc = time / segments; + og_time_inc = time_inc; + while( 1 ) + { + time_inc = og_time_inc; + forward = AnglesToForward( level.debug_player GetPlayerAngles() ); + velocity = vector_scale( forward, level.spray["power"] ); + sub_vel = vector_scale( velocity, time_inc ); + start_pos = level.debug_player GetEye() + vector_scale( forward, 48 );; + gravity = GetDvarInt( #"bg_gravity" ); + for( i = 1; i < segments + 1; i++ ) + { + pos = start_pos + vector_scale( sub_vel, i ); + pos = pos - ( 0, 0, ( 0.5 * gravity * ( time_inc * time_inc ) ) ); + print3d( pos, ".", ( 1, 1, 0 ) ); + time_inc += og_time_inc; + } + wait( 0.05 ); + } +} +spray_hud() +{ + level.spray_hud = []; + x = 0; + y = 400; + hud = new_hud( "spray_hud", undefined, x, y, 1 ); + hud SetShader( "white", 145, 58 ); + hud.alignX = "left"; + hud.alignY = "top"; + hud.sort = 10; + hud.alpha = 0.6; + hud.color = ( 0.0, 0.0, 0.5 ); + hud = new_hud( "spray_hud", "Model:", 319, 385, 1.2 ); + hud.alignX = "right"; + level.spray_hud["model"] = new_hud( "spray_hud", level.spray["model"], 321, 385, 1.2 ); + level.spray_hud["model"].alignX = "left"; + hud = new_hud( "spray_hud", "Rate:", 319, 400, 1.2 ); + hud.alignX = "right"; + level.spray_hud["rate"] = new_hud( "spray_hud", level.spray["rate"], 321, 400, 1.2 ); + level.spray_hud["rate"].alignX = "left"; + hud = new_hud( "spray_hud", "Power:", 319, 415, 1.2 ); + hud.alignX = "right"; + level.spray_hud["power"] = new_hud( "spray_hud", level.spray["power"], 321, 415, 1.2 ); + level.spray_hud["power"].alignX = "left"; + new_hud( "spray_hud", "FIRE", x + 5, y + 10, 1 ); + new_hud( "spray_hud", "LEFT/RIGHT", x + 5, y + 20, 1 ); + new_hud( "spray_hud", "UP/DOWN", x + 5, y + 30, 1 ); + if( isdefined( level.selected_group ) ) + { + new_hud( "spray_hud", "Bumpers", x + 5, y + 40, 1 ); + new_hud( "spray_hud", "B", x + 5, y + 50, 1 ); + } + else + { + new_hud( "spray_hud", "B", x + 5, y + 40, 1 ); + } + new_hud( "spray_hud", "- Spray Object", x + 60, y + 10, 1 ); + new_hud( "spray_hud", "- Inc/Dec Rate", x + 60, y + 20, 1 ); + new_hud( "spray_hud", "- Inc/Dec Power", x + 60, y + 30, 1 ); + if( isdefined( level.selected_group ) ) + { + new_hud( "spray_hud", "- Change model", x + 60, y + 40, 1 ); + new_hud( "spray_hud", "- Quit", x + 60, y + 50, 1 ); + } + else + { + new_hud( "spray_hud", "- Quit", x + 60, y + 40, 1 ); + } +} +spray_buttons() +{ + clear_universal_buttons( "spray" ); + add_universal_button( "spray", "dpad_up" ); + add_universal_button( "spray", "dpad_down" ); + add_universal_button( "spray", "dpad_left" ); + add_universal_button( "spray", "dpad_right" ); + add_universal_button( "spray", "button_b" ); + add_universal_button( "spray", "button_lshldr" ); + add_universal_button( "spray", "button_rshldr" ); + level thread universal_input_loop( "spray", "stop_spray", true ); +} +add_universal_button( button_group, name ) +{ + if( !isdefined( level.u_buttons[button_group] ) ) + { + level.u_buttons[button_group] = []; + } + if( check_for_dupes( level.u_buttons[button_group], name ) ) + { + level.u_buttons[button_group][level.u_buttons[button_group].size] = name; + } +} +clear_universal_buttons( button_group ) +{ + level.u_buttons[button_group] = []; +} +universal_input_loop( button_group, end_on, use_attackbutton, mod_button, no_mod_button ) +{ + level endon( "stop_createdynents" ); + level endon( end_on ); + if( !isdefined( use_attackbutton ) ) + { + use_attackbutton = false; + } + notify_name = button_group + "_button_pressed"; + buttons = level.u_buttons[button_group]; + level.u_buttons_disable[button_group] = false; + while( 1 ) + { + if( level.u_buttons_disable[button_group] ) + { + wait( 0.05 ); + continue; + } + if( isdefined( mod_button ) && !level.debug_player ButtonPressed( mod_button ) ) + { + wait( 0.05 ); + continue; + } + else if( isdefined( no_mod_button ) && level.debug_player ButtonPressed( no_mod_button ) ) + { + wait( 0.05 ); + continue; + } + if( use_attackbutton && level.debug_player AttackButtonPressed() ) + { + level notify( notify_name, "fire" ); + wait( 0.15 ); + continue; + } + for( i = 0; i < buttons.size; i++ ) + { + if( level.debug_player ButtonPressed( buttons[i] ) ) + { + level notify( notify_name, buttons[i] ); + wait( 0.15 ); + break; + } + } + wait( 0.05 ); + } +} +disable_buttons( button_group ) +{ + level.u_buttons_disable[button_group] = true; +} +enable_buttons( button_group ) +{ + wait( 1 ); + level.u_buttons_disable[button_group] = false; +} +select_dynent_group() +{ + level.dyn_ent_selected_group = undefined; + y = level.menu_sys["current_menu"].options[0].y; + if( !isdefined( level.dynent_groups ) ) + { + return; + } + arrow_hud = set_hudelem( "-------->", 120, y, 1.3 ); + selected = list_menu( level.dynent_groups, 180, y, 1.3, ::group_selected ); + if( !isdefined( selected ) ) + { + level notify( "stop_select_group" ); + } + else + { + level.dyn_ent_selected_group = level.dynent_groups[selected]; + } + arrow_hud Destroy(); +} +group_selected( group_name ) +{ + level.selected_group = group_name; +} +remove_hud( hud_name ) +{ + if( !isdefined( level.hud_array[hud_name] ) ) + { + return; + } + huds = level.hud_array[hud_name]; + for( i = 0; i < huds.size; i++ ) + { + destroy_hud( huds[i] ); + } + level.hud_array[hud_name] = undefined; +} +new_hud( hud_name, msg, x, y, scale ) +{ + if( !isdefined( level.hud_array ) ) + { + level.hud_array = []; + } + if( !isdefined( level.hud_array[hud_name] ) ) + { + level.hud_array[hud_name] = []; + } + hud = set_hudelem( msg, x, y, scale ); + level.hud_array[hud_name][level.hud_array[hud_name].size] = hud; + return hud; +} +object_highlight( objects ) +{ + level endon( "stop_createdynents" ); + level endon( "stop_select_model" ); + dot = 0.85; + highlighted_object = undefined; + forward = AnglesToForward( level.debug_player GetPlayerAngles() ); + for( i = 0; i < objects.size; i++ ) + { + if( !isdefined( objects[i].select_scale ) ) + { + objects[i] select_icon_think(); + } + ent = objects[i]; + difference = VectorNormalize( ent.origin - ( level.debug_player.origin + ( 0, 0, 55 ) ) ); + newdot = VectorDot( forward, difference ); + if( newdot < dot ) + { + continue; + } + dot = newdot; + highlighted_object = ent; + } + if( isdefined( highlighted_object ) ) + { + highlighted_object.select_scale = 3; + highlighted_object.select_color = level.selected_color; + level.highlighted_object = highlighted_object; + for( i = 0; i < objects.size; i++ ) + { + if( objects[i] == highlighted_object ) + { + continue; + } + objects[i].select_scale = 1; + objects[i].select_color = level.unselected_color; + } + } +} +selected_delete( no_force_back ) +{ + if( isdefined( level.selected_object ) ) + { + level.selected_object remove_from_all_objects(); + level.selected_object remove_model( "dynent" ); + level.selected_object remove_model( "destructible" ); + level.selected_object remove_model( "miscmodel" ); + level.selected_object notify( "unlink_selected_object" ); + level.selected_object notify( "stop_move" ); + level.selected_object notify( "stop_move_selected_object" ); + level.selected_object Delete(); + level.selected_object = undefined; + if( !isdefined( no_force_back ) || !no_force_back ) + { + level thread force_menu_back(); + } + } +} +selected_back() +{ + if( isdefined( level.selected_object ) ) + { + if( isdefined( level.selected_object.old_origin ) ) + { + level.selected_object notify( "unlink_selected_object" ); + level.selected_object.origin = level.selected_object.old_origin; + level thread force_menu_back(); + level.selected_object = undefined; + } + else + { + selected_delete(); + } + } + else + { + level thread force_menu_back(); + } +} +selected_save_highlight( key ) +{ + if( isdefined( level.highlighted_object ) ) + { + object = level.highlighted_object; + if( isdefined( object.save_selected ) ) + { + object remove_highlighted(); + object.save_selected = false; + object notify( "stop_save_highlight" ); + } + else + { + object add_highlighted(); + object.save_selected = true; + object thread save_highlight_loop(); + } + wait( 0.1 ); + } +} +save_highlight_loop() +{ + level endon( "stop_createdynents" ); + self endon( "stop_save_highlight" ); + while( 1 ) + { + print3d( self.origin, "S", ( 0, 1, 0 ), 1 ); + wait( 0.05 ); + } +} +add_highlighted() +{ + level.highlighted[level.highlighted.size] = self; +} +remove_highlighted() +{ + level.highlighted = array_remove( level.highlighted, self ); +} +selected_models_save_thread( type ) +{ + level endon( "stop_createdynents" ); + level waittill( "disable selected_" + type + "_save_menu" ); + for( i = 0; i < level.models[type].size; i++ ) + { + level.models[type][i] remove_save_stat(); + } +} +selected_dynent_save() +{ + level.highlighted = []; + level thread selected_models_save_thread( "dynent" ); +} +selected_destructible_save() +{ + level.highlighted = []; + level thread selected_models_save_thread( "destructible" ); +} +selected_miscmodel_save() +{ + level.highlighted = []; + level thread selected_models_save_thread( "miscmodel" ); +} +remove_save_stat() +{ + self notify( "stop_save_highlight" ); + self.save_selected = false; +} +save_dynent_highlighted() +{ + if( level.highlighted.size > 0 ) + { + return save_master( "Save Selected DynEnts?", "dynents_selected", level.highlighted, "dynent" ); + } +} +save_destructible_highlighted() +{ + if( level.highlighted.size > 0 ) + { + return save_master( "Save Selected Destructibles?", "detructibles_selected", level.highlighted, "destructible" ); + } +} +save_miscmodel_highlighted() +{ + if( level.highlighted.size > 0 ) + { + return save_master( "Save Selected Misc_Models?", "miscmodels_selected", level.highlighted, "miscmodel" ); + } +} +setup_menu_buttons() +{ + clear_universal_buttons( "menu" ); + menu_cursor(); + add_universal_button( "menu", "dpad_up" ); + add_universal_button( "menu", "dpad_down" ); + add_universal_button( "menu", "dpad_left" ); + add_universal_button( "menu", "dpad_right" ); + add_universal_button( "menu", "button_a" ); + add_universal_button( "menu", "button_b" ); + add_universal_button( "menu", "1" ); + add_universal_button( "menu", "2" ); + add_universal_button( "menu", "3" ); + add_universal_button( "menu", "4" ); + add_universal_button( "menu", "5" ); + add_universal_button( "menu", "6" ); + add_universal_button( "menu", "7" ); + add_universal_button( "menu", "8" ); + add_universal_button( "menu", "9" ); + add_universal_button( "menu", "0" ); + add_universal_button( "menu", "downarrow" ); + add_universal_button( "menu", "uparrow" ); + add_universal_button( "menu", "leftarrow" ); + add_universal_button( "menu", "rightarrow" ); + add_universal_button( "menu", "enter" ); + add_universal_button( "menu", "end" ); + add_universal_button( "menu", "backspace" ); + level thread universal_input_loop( "menu", "never", undefined, undefined, "button_ltrig" ); +} +menu_cursor() +{ + level.menu_cursor = set_hudelem( undefined, 0, 130, 1.3 ); + level.menu_cursor SetShader( "white", 125, 20 ); + level.menu_cursor.color = ( 1, 0.5, 0 ); + level.menu_cursor.alpha = 0.5; + level.menu_cursor.sort = 1; + level.menu_cursor.current_pos = 0; +} +any_button_hit( button_hit, type ) +{ + buttons = []; + if( type == "numbers" ) + { + buttons[0] = "0"; + buttons[1] = "1"; + buttons[2] = "2"; + buttons[3] = "3"; + buttons[4] = "4"; + buttons[5] = "5"; + buttons[6] = "6"; + buttons[7] = "7"; + buttons[8] = "8"; + buttons[9] = "9"; + } + else + { + buttons = level.buttons; + } + for( i = 0; i < buttons.size; i++ ) + { + if( button_hit == buttons[i] ) + { + return true; + } + } + return false; +} +setup_xform_menu() +{ + level.selected_object_z_offset = 0; + level.selected_object_dist = 48; + setup_xform_buttons(); + level thread xform_input_handler(); + level.xform_hud_active = 0; + toggle_xform_hud(); +} +toggle_xform_hud() +{ + level.xform_hud_active = !level.xform_hud_active; + if( level.xform_hud_active ) + { + shader_width = 120; + shader_height = 90; + x = 640 - shader_width; + y = 480 - shader_height - 25; + hud = new_hud( "xform_hud", undefined, x, y, 1 ); + hud SetShader( "white", shader_width, shader_height ); + hud.alignX = "left"; + hud.alignY = "top"; + hud.sort = 10; + hud.alpha = 0.6; + hud.color = ( 0.0, 0.0, 0.5 ); + new_hud( "xform_hud", "BUMPERS", x + 5, y + 10, 1 ); + new_hud( "xform_hud", "Up / Down", x + 60, y + 10, 1 ); + y += 3; + new_hud( "xform_hud", "(HOLD LTrigger) +", x + 5, y + 20, 1 ); + y += 3; + new_hud( "xform_hud", "Y/A", x + 5, y + 30, 1 ); + new_hud( "xform_hud", "X/B", x + 5, y + 40, 1 ); + new_hud( "xform_hud", "BUMPERS", x + 5, y + 50, 1 ); + new_hud( "xform_hud", "L3", x + 5, y + 60, 1 ); + new_hud( "xform_hud", "- Pitch", x + 60, y + 30, 1 ); + new_hud( "xform_hud", "- Yaw", x + 60, y + 40, 1 ); + new_hud( "xform_hud", "- Roll", x + 60, y + 50, 1 ); + new_hud( "xform_hud", "- Zero Out", x + 60, y + 60, 1 ); + } + else + { + remove_hud( "xform_hud" ); + } +} +setup_xform_buttons() +{ + clear_universal_buttons( "xform" ); + add_universal_button( "xform", "button_a" ); + add_universal_button( "xform", "button_b" ); + add_universal_button( "xform", "button_x" ); + add_universal_button( "xform", "button_y" ); + add_universal_button( "xform", "button_lshldr" ); + add_universal_button( "xform", "button_rshldr" ); + add_universal_button( "xform", "button_lstick" ); + level thread universal_input_loop( "xform", "never", true ); +} +xform_input_handler() +{ + level endon( "stop_createdynents" ); + rate = 2; + while( 1 ) + { + level waittill( "xform_button_pressed", key ); + object = level.selected_object; + if( !isdefined( object ) ) + object = level.highlighted_object; + if( !level.debug_player ButtonPressed( "button_ltrig" ) ) + { + if( key == "button_rshldr" ) + { + level.selected_object_z_offset += 4; + update_selected_object_position(); + } + else if( key == "button_lshldr" ) + { + level.selected_object_z_offset -= 4; + update_selected_object_position(); + } + } + else if( isdefined( object ) ) + { + if( key == "button_b" ) + { + object DevAddYaw( rate ); + } + else if( key == "button_x" ) + { + object DevAddYaw( rate * -1 ); + } + else if( key == "button_y" ) + { + object DevAddPitch( rate * -1 ); + } + else if( key == "button_a" ) + { + object DevAddPitch( rate ); + } + else if( key == "button_lshldr" ) + { + object DevAddRoll( rate * -1 ); + } + else if( key == "button_rshldr" ) + { + object DevAddRoll( rate ); + } + else if( key == "button_lstick" ) + { + object.angles = ( 0, 0, 0 ); + } + } + wait( 0.1 ); + } +} +place( type ) +{ + if( isdefined( level.selected_object ) ) + { + level.selected_object notify( "unlink_selected_object" ); + level notify( "stop_move" ); + level.selected_object add_model( type ); + level.selected_object = undefined; + } +} +place_copy( type ) +{ + if( isdefined( level.selected_object ) ) + { + level.selected_object notify( "unlink_selected_object" ); + if( type == "destructible" ) + { + model_name = level.selected_object getdestructiblename(); + } + else + { + model_name = level.selected_object.model; + } + level.selected_object add_model( type ); + angles = level.selected_object.angles; + level.selected_object = undefined; + with_trace = true; + spawn_selected_object( model_name, true, type ); + level.selected_object.angles = angles; + } +} +place_dynent() +{ + place( "dynent" ); +} +place_destructible() +{ + place( "destructible" ); +} +place_miscmodel() +{ + place( "miscmodel" ); +} +place_dynent_copy() +{ + place_copy( "dynent" ); +} +place_destructible_copy() +{ + place_copy( "destructible" ); +} +place_miscmodel_copy() +{ + place_copy( "miscmodel" ); +} +select_dynent_from_list() +{ + y = level.menu_sys["current_menu"].options[0].y; + arrow_hud = set_hudelem( "-------->", 120, y, 1.3 ); + list_menu( level.model_names["dynent"], 180, y, 1.3, ::spawn_dynent ); + level.selected_group = undefined; + arrow_hud Destroy(); +} +select_destructible_from_list() +{ + y = level.menu_sys["current_menu"].options[0].y; + arrow_hud = set_hudelem( "-------->", 120, y, 1.3 ); + list_menu( level.model_names["destructible"], 180, y, 1.3, ::spawn_destructible ); + level.selected_group = undefined; + arrow_hud Destroy(); +} +select_miscmodel_from_list() +{ + y = level.menu_sys["current_menu"].options[0].y; + arrow_hud = set_hudelem( "-------->", 120, y, 1.3 ); + list_menu( level.model_names["miscmodel"], 180, y, 1.3, ::spawn_miscmodel ); + arrow_hud Destroy(); +} +spawn_selected_object( model_name, with_trace, type ) +{ + if( isdefined( level.selected_object ) ) + { + level.selected_object Delete(); + } + forward = AnglesToforward( level.debug_player GetPlayerAngles() ); + vector = level.debug_player GetEye() + vector_scale( forward, level.selected_object_dist ); + if( isdefined( type ) && type == "destructible" ) + { + level.selected_object = CodeSpawn( "script_model", vector, 0, 0, 0, model_name ); + } + else + { + level.selected_object = Spawn( "script_model", vector ); + level.selected_object SetModel( model_name ); + } + level.select_group = undefined; + level.selected_object thread move_selected_object( with_trace ); +} +spawn_dynent( model_name ) +{ + spawn_selected_object( model_name, true, "dynent" ); +} +spawn_miscmodel( model_name ) +{ + spawn_selected_object( model_name, true, "miscmodel" ); +} +spawn_destructible( model_name ) +{ + spawn_selected_object( model_name, true, "destructible" ); +} +move_model() +{ + if( isdefined( level.highlighted_object ) ) + { + level.selected_object = level.highlighted_object; + level.selected_object.old_origin = level.selected_object.origin; + level.selected_object thread move_selected_object( true ); + level thread move_model_thread(); + } +} +move_model_thread() +{ + level endon( "stop_createdynents" ); + level waittill( "stop_move" ); + level thread force_menu_back(); +} +copy_model( type ) +{ + if( isdefined( level.highlighted_object ) ) + { + model_origin = level.highlighted_object.origin; + if( type == "destructible" ) + { + model_name = level.highlighted_object getdestructiblename(); + level.selected_object = CodeSpawn( "script_model", model_origin, 0, 0, 0, model_name ); + } + else + { + model_name = level.highlighted_object.model; + level.selected_object = Spawn( "script_model", model_origin ); + level.selected_object SetModel( model_name ); + } + level.selected_object.old_origin = level.selected_object.origin; + level.selected_object thread move_selected_object( true ); + level thread copy_thread(); + } +} +copy_dynent() +{ + copy_model( "dynent" ); +} +copy_destructible() +{ + copy_model( "destructible" ); +} +copy_miscmodel() +{ + copy_model( "miscmodel" ); +} +copy_thread() +{ + level endon( "stop_createdynents" ); + level waittill( "stop_move" ); + level thread force_menu_back(); +} +select_dynents() +{ + select( "dynent" ); +} +select_destructibles() +{ + select( "destructible" ); +} +select_miscmodels() +{ + select( "miscmodel" ); +} +select( type ) +{ + if( level.models[type].size > 0 ) + { + level thread select_model_thread( type ); + } +} +draw_selectables( objects ) +{ + for( i = 0; i < objects.size; i++ ) + { + objects[i] thread select_icon_think(); + } +} +select_icon_think() +{ + level endon( "stop_createdynents" ); + self endon( "death" ); + self notify( "only_one_icon_think_thread" ); + self endon( "only_one_icon_think_thread" ); + level endon( "stop_select_model" ); + if( !isdefined( self.select_scale ) ) + { + self.select_scale = 1; + } + self.select_color = level.unselected_color; + while( 1 ) + { + print3d( self.origin, ".", self.select_color, 1, self.select_scale ); + wait( 0.05 ); + } +} +delete_model() +{ + if( isdefined( level.highlighted_object ) ) + { + level.highlighted_object remove_from_all_objects(); + level.highlighted_object remove_model( "dynent" ); + level.highlighted_object remove_model( "destructible" ); + level.highlighted_object remove_model( "miscmodel" ); + level.highlighted_object Delete(); + level.selected_object = undefined; + } +} +select_model_thread( type ) +{ + level endon( "stop_createdynents" ); + selected_delete( true ); + level.unselected_color = ( 1, 1, 1 ); + level.selected_color = ( 1, 1, 0 ); + draw_selectables( level.models[type] ); + level thread select_main_thread( type ); + level waittill( "disable " + type + "_select_menu" ); + level notify( "stop_select_model" ); +} +select_main_thread( type ) +{ + level endon( "stop_createdynents" ); + level endon( "stop_select_model" ); + level.highlighted_object = undefined; + level.selected_object = undefined; + while( 1 ) + { + if( !isdefined( level.selected_object ) ) + { + level thread object_highlight( level.models[type] ); + } + wait( 0.05 ); + } +} +set_default_path() +{ + if( !isdefined( level.path ) ) + { + level.path = "prop_man/" + level.script + "/"; + } +} +store_model( type ) +{ + self add_to_all_objects(); + level.models[type] = array_add( level.models[type], self ); +} +remove_model( type ) +{ + level.models[type] = array_remove( level.models[type], self ); +} +save_dynents() +{ + if( level.models["dynent"].size > 0 ) + { + return save_master( "Save All DynEnts?", "dynents_all", level.models["dynent"], "dynent" ); + } +} +save_destructibles() +{ + if( level.models["destructible"].size > 0 ) + { + return save_master( "Save All Destructibles?", "destructibles_all", level.models["destructible"], "destructible" ); + } +} +save_miscmodels() +{ + selected_delete( true ); + if( level.models["miscmodel"].size > 0 ) + { + return save_master( "Save All misc models?", "miscmodels_all", level.models["miscmodel"], "miscmodel" ); + } +} +save_master( save_msg, filename, save_array, type ) +{ + disable_buttons( "menu" ); + disable_buttons( "rotate" ); + disable_buttons( "prop" ); + level.debug_player FreezeControls( true ); + save_buttons(); + filename = filename + ".map"; + save_dialog( save_msg, filename ); + yes_key = "button_x"; + no_key = "button_b"; + while( true ) + { + level waittill( "save_button_pressed", key ); + if( key == yes_key ) + { + level thread save_selector( level.save_yes_hud.x, level.save_yes_hud.y, 40 ); + check = save( save_array, filename, type ); + if( isdefined( check ) && check != "failed" ) + { + level thread save_complete( check ); + } + else + { + level thread save_failed(); + } + break; + } + else if( key == no_key ) + { + save_selector( level.save_no_hud.x, level.save_no_hud.y, 40 ); + break; + } + } + level notify( "stop_savebutton_loop" ); + remove_hud( "save" ); + level.debug_player FreezeControls( false ); + level thread enable_buttons( "menu" ); + level thread enable_buttons( "rotate" ); + level thread enable_buttons( "prop" ); +} +save_dialog( msg, filename ) +{ + if( !isdefined( level.save_hud_x ) ) + { + level.save_hud_x = 0; + } + if( !isdefined( level.save_hud_y ) ) + { + level.save_hud_y = 300; + } + x = level.save_hud_x; + y = level.save_hud_y; + bg1_shader_width = 640; + bg1_shader_height = 100; + hud = new_hud( "save", undefined, ( x + ( bg1_shader_width * 0.5 ) ), y, 1 ); + hud SetShader( "white", bg1_shader_width, bg1_shader_height ); + hud.alignX = "center"; + hud.alignY = "top"; + hud.color = ( 0.55, 0.29, 0 ); + hud.alpha = 0.85; + hud.sort = 30; + bg2_shader_width = 280; + bg2_shader_height = 20; + hud = new_hud( "save", msg, ( x + 10 ), ( y + 10 ), 1.3 ); + hud.sort = 35; + prefix = "Path: xenonOutput/scriptdata/"; + hud = new_hud( "save", prefix + level.path + filename, ( x + 10 ), ( y + 30 ), 1.1 ); + hud.sort = 35; + yes_hud = "Yes [X]"; + no_hud = "No [B]"; + level.save_yes_hud = new_hud( "save", yes_hud, ( x + ( bg1_shader_width * 0.5 ) ) - 50, ( y + 90 ), 1.3 ); + level.save_yes_hud.alignX = "center"; + level.save_yes_hud.sort = 35; + level.save_no_hud = new_hud( "save", no_hud, ( x + ( bg1_shader_width * 0.5 ) ) + 50, ( y + 90 ), 1.3 ); + level.save_no_hud.alignX = "center"; + level.save_no_hud.sort = 35; +} +destroy_hud( hud ) +{ + if( isdefined( hud ) ) + { + hud Destroy(); + } +} +save_complete( msg ) +{ + hud = set_hudelem( "Save Successful", 320, 100, 1.5 ); + hud.alignX = "center"; + hud.color = ( 0, 1, 0 ); + hud_msg = set_hudelem( msg, 320, 120, 1.3 ); + hud_msg.alignX = "center"; + hud_msg.color = ( 1, 1, 1 ); + wait( 2 ); + hud FadeOverTime( 3 ); + hud.alpha = 0; + hud_msg FadeOverTime( 3 ); + hud_msg.alpha = 0; + wait( 3 ); + hud Destroy(); + hud_msg Destroy(); +} +save_failed() +{ + hud = set_hudelem( "Save Failed!", 320, 100, 1.5 ); + hud.AlignX = "center"; + hud.color = ( 1, 0, 0 ); + wait( 1 ); + hud FadeOverTime( 3 ); + hud.alpha = 0; + wait( 3 ); + hud Destroy(); +} +save_selector( x, y, width ) +{ + hud = set_hudelem( undefined, x, y, 1 ); + hud.alignX = "center"; + hud SetShader( "white", width, 20 ); + hud.color = ( 1, 1, 0.5 ); + hud.alpha = 0.5; + hud.sort = 10; + hud FadeOverTime( 0.25 ); + hud.alpha = 0; + wait( 0.35 ); + hud Destroy(); +} +save( model_array, filename, type ) +{ +} +save_buttons() +{ + clear_universal_buttons( "save" ); + add_universal_button( "save", "button_x" ); + add_universal_button( "save", "button_b" ); + level thread universal_input_loop( "save", "stop_savebutton_loop" ); +} +quit() +{ + if( level.xform_hud_active ) + toggle_xform_hud(); + level.hud_selector Destroy(); + disable_menu( "current_menu" ); + level.menu_sys = []; + AddDebugCommand( "set propman 0" ); + wait 1; + AddDebugCommand( "noclip" ); + wait 1; + thread main(); + level notify( "stop_createdynents" ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_createfx.gsc b/BO1/PC/ZM/maps/_createfx.gsc new file mode 100644 index 0000000..db050e9 --- /dev/null +++ b/BO1/PC/ZM/maps/_createfx.gsc @@ -0,0 +1,1702 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_createFxMenu; +createfx() +{ + precacheModel( "fx_axis_createfx" ); + PrecacheShader( "black" ); + if( GetDvar( #"createfx_scaleid" ) == "" ) + { + SetDvar( "createfx_scaleid", "1" ); + } + if( GetDvar( #"createfx_drawaxis" ) == "" ) + { + SetDvar( "createfx_drawaxis", "1" ); + } + if( GetDvar( #"createfx_drawaxis_range" ) == "" ) + { + SetDvar( "createfx_drawaxis_range", "2000" ); + } + if( GetDvar( #"createfx_autosave_time" ) == "" ) + { + SetDvar( "createfx_autosave_time", "600" ); + } + flag_init( "createfx_saving" ); + if ( !isdefined( level.createFX ) ) + { + level.createFX = []; + } + if ( isdefined( level.delete_when_in_createfx ) ) + { + level [[ level.delete_when_in_createfx ]](); + } + triggers = getentarray( "trigger_multiple", "classname" ); + for (i=0;i 0) + { + newStr.color = (0,0,0); + } + newStrArray[newStrArray.size] = newStr; + } + level.createFxHudElements[i] = newStrArray; + } + newStrArray = []; + for (p=0;p<2;p++) + { + newStr = newHudElem(); + newStr.alignX = "center"; + newStr.location = 0; + newStr.foreground = 1; + newStr.fontScale = 1.30; + newStr.sort = 20 - p; + newStr.alpha = 1; + newStr.x = 320 + strOffsetX[p]; + newStr.y = 80 + strOffsetY[p]; + if (p > 0) + { + newStr.color = (0,0,0); + } + newStrArray[newStrArray.size] = newStr; + } + level.createFX_centerPrint = newStrArray; + level.selectedMove_up = 0; + level.selectedMove_forward = 0; + level.selectedMove_right = 0; + level.selectedRotate_pitch = 0; + level.selectedRotate_roll = 0; + level.selectedRotate_yaw = 0; + level.selected_fx = []; + level.selected_fx_ents = []; + level.createfx_lockedList = []; + level.createfx_lockedList["escape"] = true; + level.createfx_lockedList["BUTTON_LSHLDR"] = true; + level.createfx_lockedList["BUTTON_RSHLDR"] = true; + level.createfx_lockedList["mouse1"] = true; + level.createfx_lockedList["ctrl"] = true; + level.createfx_draw_enabled = true; + level.buttonIsHeld = []; + axisMode = false; + players = get_players(); + lastPlayerOrigin = players[0].origin; + colors = []; + colors["loopfx"]["selected"] = (1.0, 1.0, 0.2); + colors["loopfx"]["highlighted"] = (0.4, 0.95, 1.0); + colors["loopfx"]["default"] = (0.3, 0.8, 1.0); + colors["oneshotfx"]["selected"] = (1.0, 1.0, 0.2); + colors["oneshotfx"]["highlighted"] = (0.4, 0.95, 1.0); + colors["oneshotfx"]["default"] = (0.3, 0.8, 1.0); + colors["exploder"]["selected"] = (1.0, 1.0, 0.2); + colors["exploder"]["highlighted"] = (1.0, 0.2, 0.2); + colors["exploder"]["default"] = (1.0, 0.1, 0.1); + colors["rainfx"]["selected"] = (1.0, 1.0, 0.2); + colors["rainfx"]["highlighted"] = (.95, 0.4, 0.95); + colors["rainfx"]["default"] = (.78, 0.0, 0.73); + colors["soundfx"]["selected"] = (1.0, 1.0, 0.2); + colors["soundfx"]["highlighted"] = (.5, 1.0, 0.75); + colors["soundfx"]["default"] = (.2, 0.9, 0.2); + lastHighlightedEnt = undefined; + level.fx_rotating = false; + setMenu("none"); + level.createfx_selecting = false; + black = newHudElem(); + black.x = -120; + black.y = 200; + black.foreground = 0; + black setShader("black", 250, 160); + black.alpha = 0; + level.createfx_inputlocked = false; + help_on_last_frame = 0; + for ( i = 0; i < level.createFXent.size; i++ ) + { + ent = level.createFXent[i]; + ent post_entity_creation_function(); + } + thread draw_distance(); + lastSelectEntity = undefined; + thread createfx_autosave(); + for (;;) + { + players = get_players(); + changedSelectedEnts = false; + right = anglestoright (players[0] getplayerangles()); + forward = anglestoforward (players[0] getplayerangles()); + up = anglestoup (players[0] getplayerangles()); + dot = 0.85; + placeEnt_vector = vector_scale(forward, 750); + level.createfxCursor = bullettrace(players[0] geteye(), players[0] geteye() + placeEnt_vector, false, undefined); + highlightedEnt = undefined; + level.buttonClick = []; + level.button_is_kb = []; + process_button_held_and_clicked(); + ctrlHeld = button_is_held("ctrl", "BUTTON_LSHLDR" ); + shiftHeld = button_is_held("shift"); + functionHeld = button_is_held("f"); + leftClick = button_is_clicked("mouse1", "BUTTON_A" ); + leftHeld = button_is_held("mouse1", "BUTTON_A" ); + consoleOn = false; + create_fx_menu(); + if ( button_is_clicked("BUTTON_X") || (shiftHeld && button_is_clicked("x")) ) + { + axisMode = !axisMode; + } + if ( button_is_clicked( "F2" ) || ( functionHeld && button_is_clicked("2") ) ) + { + toggle_createfx_drawing(); + } + if ( button_is_clicked( "F3" ) || ( functionHeld && button_is_clicked("3") ) ) + { + print_ambient_fx_inventory(); + } + if ( button_is_clicked( "F5" ) || ( functionHeld && button_is_clicked("5") ) ) + { + createfx_save(); + } + if (button_is_clicked("ins","i")) + { + insert_effect(); + } + if (button_is_clicked("del", "d")) + { + delete_pressed(); + } + if (button_is_clicked("end", "l")) + { + drop_selection_to_ground(); + changedSelectedEnts = true; + } + if (button_is_clicked("escape")) + { + clear_settable_fx(); + } + if ( button_is_clicked("space") ) + { + set_off_exploders(); + } + if (button_is_clicked("tab", "BUTTON_RSHLDR")) + { + move_selection_to_cursor(); + changedSelectedEnts = true; + } + if ( button_is_held( "q", "F1" ) ) + { + help_on_last_frame = 1; + show_help(); + wait (0.05); + continue; + } + else if (help_on_last_frame == 1) + { + clear_fx_hudElements(); + help_on_last_frame = 0; + } + if ( button_is_clicked( "BUTTON_LSTICK" ) ) + { + copy_ents(); + } + if ( button_is_clicked( "BUTTON_RSTICK" ) ) + { + paste_ents(); + } + if (ctrlHeld) + { + if (button_is_clicked("c")) + { + copy_ents(); + } + if (button_is_clicked("v")) + { + paste_ents(); + } + } + if (isdefined(level.selected_fx_option_index)) + menu_fx_option_set(); + if ( button_is_held( "BUTTON_RTRIG" ) && button_is_held( "BUTTON_LTRIG" )) + { + move_player_around_map_fast(); + wait (0.25); + continue; + } + for ( i = 0; i < level.createFXent.size; i++ ) + { + ent = level.createFXent[i]; + difference = vectornormalize(ent.v["origin"] - (players[0].origin + (0,0,55))); + newdot = vectordot(forward, difference); + if (newdot < dot) + { + continue; + } + dot = newdot; + highlightedEnt = ent; + } + level.fx_highLightedEnt = highLightedEnt; + if (isdefined(highLightedEnt)) + { + if (isdefined(lastHighlightedEnt)) + { + if (lastHighlightedEnt != highlightedEnt) + { + if (!ent_is_selected(lastHighlightedEnt)) + { + lastHighlightedEnt thread entity_highlight_disable(); + } + if (!ent_is_selected(highlightedEnt)) + { + highlightedEnt thread entity_highlight_enable(); + } + } + } + else + { + if (!ent_is_selected(highlightedEnt)) + { + highlightedEnt thread entity_highlight_enable(); + } + } + } + manipulate_createfx_ents( highlightedEnt, leftClick, leftHeld, ctrlHeld, colors, right ); + if (axisMode && level.selected_fx_ents.size > 0) + { + thread process_fx_rotater(); + if ( button_is_clicked( "enter", "r" ) ) + { + reset_axis_of_selected_ents(); + } + if ( button_is_clicked( "v" ) ) + { + copy_angles_of_selected_ents(); + } + for ( i=0; i < level.selected_fx_ents.size; i++) + { + level.selected_fx_ents[i] draw_axis(); + } + if ( level.selectedRotate_pitch != 0 || level.selectedRotate_yaw != 0 || level.selectedRotate_roll != 0 ) + { + changedSelectedEnts = true; + } + wait (0.05); + } + else + { + stop_drawing_axis_models(); + selectedMove_vector = get_selected_move_vector(); + for ( i=0; i < level.selected_fx_ents.size; i++) + { + ent = level.selected_fx_ents[i]; + if (isdefined(ent.model)) + { + continue; + } + ent.v["origin"] = ent.v["origin"] + selectedMove_vector; + } + if ( distance( (0,0,0), selectedMove_vector) > 0 ) + { + changedSelectedEnts = true; + } + wait(0.05); + } + if ( changedSelectedEnts ) + { + update_selected_entities(); + } + if (distance(lastPlayerOrigin, players[0].origin) > 64) + { + setdvar("createfx_playerpos_x", players[0].origin[0]); + setdvar("createfx_playerpos_y", players[0].origin[1]); + setdvar("createfx_playerpos_z", players[0].origin[2]); + lastPlayerOrigin = players[0].origin; + } + lastHighlightedEnt = highlightedEnt; + if ( last_selected_entity_has_changed ( lastSelectEntity )) + { + level.effect_list_offset = 0; + clear_settable_fx(); + setmenu("none"); + } + if (level.selected_fx_ents.size) + { + lastSelectEntity = level.selected_fx_ents[level.selected_fx_ents.size-1]; + } + else + { + lastSelectEntity = undefined; + } + } +} +toggle_createfx_drawing() +{ + level.createfx_draw_enabled = !level.createfx_draw_enabled; +} +manipulate_createfx_ents( highlightedEnt, leftClick, leftHeld, ctrlHeld, colors, right ) +{ + if ( !level.createfx_draw_enabled ) + { + return; + } + for ( i = 0; i < level.createFXent.size; i++ ) + { + ent = level.createFXent[i]; + if ( !ent.drawn ) + { + continue; + } + scale = GetDvarFloat( #"createfx_scaleid" ); + if ( isdefined( highlightedEnt ) && (ent == highlightedEnt) ) + { + if ( !entities_are_selected() ) + { + display_fx_info( ent ); + } + if ( leftClick ) + { + entWasSelected = index_is_selected( i ); + level.createfx_selecting = !entWasSelected; + if ( !ctrlHeld ) + { + selectedSize = level.selected_fx_ents.size; + clear_entity_selection(); + if ( entWasSelected && selectedSize == 1 ) + { + select_entity( i, ent ); + } + } + toggle_entity_selection( i, ent ); + } + else if ( leftHeld ) + { + if ( ctrlHeld ) + { + if ( level.createfx_selecting ) + { + select_entity( i, ent); + } + if ( !level.createfx_selecting ) + { + deselect_entity( i, ent); + } + } + } + colorIndex = "highlighted"; + if ( index_is_selected( i ) ) + { + colorIndex = "selected"; + } + print3d( ent.v["origin"], ".", colors[ ent.v[ "type" ] ][ colorIndex ], 1, scale ); + if ( ent.textalpha > 0 ) + { + printRight = vector_scale( right, ent.v[ "fxid" ].size * -2.93 * scale ); + print3d( ent.v[ "origin" ] + printRight + (0,0,15), ent.v[ "fxid" ], colors[ ent.v[ "type" ] ][ colorIndex ], ent.textalpha, scale ); + } + } + else + { + colorIndex = "default"; + if ( index_is_selected( i ) ) + { + colorIndex = "selected"; + } + print3d( ent.v[ "origin" ], ".", colors[ ent.v[ "type" ] ][ colorIndex ], 1, scale ); + if ( ent.textalpha > 0 ) + { + printRight = vector_scale(right, ent.v["fxid"].size * -2.93 ); + print3d( ent.v[ "origin" ] + printRight + (0,0,15), ent.v[ "fxid" ], colors[ ent.v[ "type" ] ][ colorIndex ], ent.textalpha, scale ); + } + } + } +} +clear_settable_fx() +{ + level.createfx_inputlocked = false; + setdvar("fx", "nil"); + level.selected_fx_option_index = undefined; + reset_fx_hud_colors(); +} +reset_fx_hud_colors() +{ + for ( i=0;i range * range ) + { + if( IsDefined( axis_model ) ) + { + axis_model Delete(); + level.draw_axis_models = array_removeUndefined( level.draw_axis_models ); + } + } + else + { + if( !IsDefined( axis_model ) ) + { + axis_model = spawn_axis_model( axis_parent.v["origin"], axis_parent.v["angles"] ); + axis_parent.draw_axis_model = axis_model; + level.draw_axis_models[level.draw_axis_models.size] = axis_model; + } + } + axis_model.origin = axis_parent.v["origin"]; + axis_model.angles = axis_parent.v["angles"]; + wait( 0.05 ); + } + if( IsDefined( axis_model ) ) + { + axis_model Delete(); + } +} +stop_drawing_axis_models() +{ + if( IsDefined( level.draw_axis_models ) ) + { + for( i = 0; i < level.draw_axis_models.size; i++ ) + { + if( IsDefined( level.draw_axis_models[i] ) ) + { + level.draw_axis_models[i] Delete(); + } + } + level.draw_axis_models = array_removeUndefined( level.draw_axis_models ); + } +} +clear_fx_hudElements() +{ + level.clearTextMarker clearAllTextAfterHudElem(); + for (i=0;i 0) + { + level.selectedMove_forward = 0; + } + level.selectedMove_forward = level.selectedMove_forward - rate; + } + else + { + level.selectedMove_forward = 0; + } + if (buttonDown("kp_rightarrow", "DPAD_RIGHT")) + { + if (level.selectedMove_right < 0) + { + level.selectedMove_right = 0; + } + level.selectedMove_right = level.selectedMove_right + rate; + } + else if (buttonDown("kp_leftarrow", "DPAD_LEFT")) + { + if (level.selectedMove_right > 0) + { + level.selectedMove_right = 0; + } + level.selectedMove_right = level.selectedMove_right - rate; + } + else + { + level.selectedMove_right = 0; + } + if (buttonDown("BUTTON_Y")) + { + if (level.selectedMove_up < 0) + { + level.selectedMove_up = 0; + } + level.selectedMove_up = level.selectedMove_up + rate; + } + else if (buttonDown("BUTTON_B")) + { + if (level.selectedMove_up > 0) + { + level.selectedMove_up = 0; + } + level.selectedMove_up = level.selectedMove_up - rate; + } + else + { + level.selectedMove_up = 0; + } + vector = (0,0,0); + vector += vector_scale(forward, level.selectedMove_forward); + vector += vector_scale(right, level.selectedMove_right); + vector += vector_scale(up, level.selectedMove_up); + return vector; +} +process_button_held_and_clicked() +{ + add_button("mouse1"); + add_kb_button("shift"); + add_kb_button("ctrl"); + add_button("BUTTON_RSHLDR"); + add_button("BUTTON_LSHLDR"); + add_button("BUTTON_RSTICK"); + add_button("BUTTON_LSTICK"); + add_button("BUTTON_A"); + add_button("BUTTON_B"); + add_button("BUTTON_X"); + add_button("BUTTON_Y"); + add_button("DPAD_UP"); + add_button("DPAD_LEFT"); + add_button("DPAD_RIGHT"); + add_button("DPAD_DOWN"); + add_kb_button("escape"); + add_button("BUTTON_RTRIG"); + add_button("BUTTON_LTRIG"); + add_kb_button("a"); + add_button("F1"); + add_button("F5"); + add_button("F2"); + add_kb_button("c"); + add_kb_button("d"); + add_kb_button("f"); + add_kb_button("h"); + add_kb_button("i"); + add_kb_button("k"); + add_kb_button("l"); + add_kb_button("m"); + add_kb_button("p"); + add_kb_button("q"); + add_kb_button("r"); + add_kb_button("x"); + add_button("del"); + add_kb_button("end"); + add_kb_button("tab"); + add_kb_button("ins"); + add_kb_button("add"); + add_kb_button("space"); + add_kb_button("enter"); + add_kb_button("leftarrow"); + add_kb_button("rightarrow"); + add_kb_button("v"); + add_kb_button("1"); + add_kb_button("2"); + add_kb_button("3"); + add_kb_button("4"); + add_kb_button("5"); + add_kb_button("6"); + add_kb_button("7"); + add_kb_button("8"); + add_kb_button("9"); + add_kb_button("0"); + add_kb_button("~"); +} +locked( name ) +{ + if ( isdefined(level.createfx_lockedList[name]) ) + { + return false; + } + return kb_locked( name ); +} +kb_locked( name ) +{ + return level.createfx_inputlocked && isdefined( level.button_is_kb[ name ] ); +} +add_button( name ) +{ + players = get_players(); + if ( locked( name ) ) + { + return; + } + if (!isdefined(level.buttonIsHeld[name])) + { + if (players[0] buttonPressed(name)) + { + level.buttonIsHeld[ name ] = true; + level.buttonClick[ name ] = true; + } + } + else + { + if (!players[0] buttonPressed(name)) + { + level.buttonIsHeld[name] = undefined; + } + } +} +add_kb_button( name ) +{ + level.button_is_kb[ name ] = true; + add_button( name ); +} +set_anglemod_move_vector() +{ + rate = 2; + if (buttonDown("kp_uparrow", "DPAD_UP")) + { + if (level.selectedRotate_pitch < 0) + { + level.selectedRotate_pitch = 0; + } + level.selectedRotate_pitch = level.selectedRotate_pitch + rate; + } + else if (buttonDown("kp_downarrow", "DPAD_DOWN")) + { + if (level.selectedRotate_pitch > 0) + { + level.selectedRotate_pitch = 0; + } + level.selectedRotate_pitch = level.selectedRotate_pitch - rate; + } + else + { + level.selectedRotate_pitch = 0; + } + if (buttonDown("kp_leftarrow", "DPAD_LEFT")) + { + if (level.selectedRotate_yaw < 0) + { + level.selectedRotate_yaw = 0; + } + level.selectedRotate_yaw = level.selectedRotate_yaw + rate; + } + else if (buttonDown("kp_rightarrow", "DPAD_RIGHT")) + { + if (level.selectedRotate_yaw > 0) + { + level.selectedRotate_yaw = 0; + } + level.selectedRotate_yaw = level.selectedRotate_yaw - rate; + } + else + { + level.selectedRotate_yaw = 0; + } + if (buttonDown("BUTTON_Y")) + { + if (level.selectedRotate_roll < 0) + { + level.selectedRotate_roll = 0; + } + level.selectedRotate_roll = level.selectedRotate_roll + rate; + } + else if (buttonDown("BUTTON_B")) + { + if (level.selectedRotate_roll > 0) + { + level.selectedRotate_roll = 0; + } + level.selectedRotate_roll = level.selectedRotate_roll - rate; + } + else + { + level.selectedRotate_roll = 0; + } +} +cfxprintln(file,string) +{ + if(file == -1) + { + return; + } + fprintln(file,string); +} +generate_client_fx_log( autosave ) +{ +} +generate_fx_log( autosave ) +{ +} +print_fx_options( ent, tab, file, autosave ) +{ + for ( i=0; i 1) + { + break; + } + wait (0.05); + } + self.textalpha = 1; +} +get_center_of_array( array ) +{ + center = (0,0,0); + for ( i=0; i < array.size; i++) + { + center = (center[0] + array[i].v["origin"][0], center[1] + array[i].v["origin"][1], center[2] + array[i].v["origin"][2]); + } + return (center[0] / array.size, center[1] / array.size, center[2] / array.size); +} +rotation_is_occuring() +{ + if ( level.selectedRotate_roll != 0 ) + { + return true; + } + if ( level.selectedRotate_pitch != 0 ) + { + return true; + } + return level.selectedRotate_yaw != 0; +} +process_fx_rotater() +{ + if ( level.fx_rotating ) + { + return; + } + set_anglemod_move_vector(); + if ( !rotation_is_occuring() ) + { + return; + } + level.fx_rotating = true; + if ( level.selected_fx_ents.size > 1 ) + { + center = get_center_of_array(level.selected_fx_ents); + org = spawn("script_origin", center); + org.v["angles"] = level.selected_fx_ents[0].v["angles"]; + org.v["origin"] = center; + rotater = []; + for ( i=0; i < level.selected_fx_ents.size; i++) + { + rotater[i] = spawn("script_origin", level.selected_fx_ents[i].v["origin"]); + rotater[i].angles = level.selected_fx_ents[i].v["angles"]; + rotater[i] linkto (org); + } + rotate_over_time(org, rotater); + org delete(); + for ( i=0; i < rotater.size; i++) + { + rotater[i] delete(); + } + } + else if ( level.selected_fx_ents.size == 1 ) + { + ent = level.selected_fx_ents[ 0 ]; + rotater = spawn( "script_origin", (0,0,0) ); + rotater.angles = ent.v[ "angles" ]; + if (level.selectedRotate_pitch != 0) + { + rotater devAddPitch(level.selectedRotate_pitch); + } + else if (level.selectedRotate_yaw != 0) + { + rotater devAddYaw(level.selectedRotate_yaw); + } + else + { + rotater devAddRoll(level.selectedRotate_roll); + } + ent.v[ "angles" ] = rotater.angles; + rotater delete(); + wait( 0.05 ); + } + level.fx_rotating = false; +} +rotate_over_time ( org, rotater ) +{ + level endon ("new_ent_selection"); + timer = 0.1; + for (p=0;p 100 ) + { + count = 0; + wait (0.05); + } + } + if ( level.createFXent.size == 0 ) + { + wait (0.05); + } + } +} +createfx_save(autosave) +{ + old_time = GetTime(); + if ( isdefined( autosave ) ) + { + savemode = "AUTOSAVE"; + } else + { + savemode = "USER SAVE"; + } + println( "\n^3#### CREATEFX " + savemode + " BEGIN ####" ); + file_error = generate_fx_log(autosave); + if ( file_error ) + { + println( "^3#### CREATEFX " + savemode + " CANCELLED - Initiating autosave ####" ); + println( "^5#### CREATEFX AUTOSAVE BEGIN ####" ); + file_error = generate_fx_log(true); + if ( file_error ) + { + } else + { + println( "^5#### CREATEFX AUTOSAVE END ####" ); + } + } else + { + if (level.clientscripts && !isdefined( autosave )) + { + file_error = generate_client_fx_log(); + if ( file_error ) + { + println( "^3#### CREATEFX " + savemode + " CANCELLED ####" ); + return; + } + } + println( "^3#### CREATEFX " + savemode + " END (Time: " + ( GetTime() - old_time ) * 0.001 + " seconds)####" ); + } +} +createfx_autosave() +{ + for ( ;; ) + { + flag_waitopen( "createfx_saving" ); + wait_time = GetDvarInt( #"createfx_autosave_time" ); + if( wait_time < 10 || IsString( wait_time ) ) + { + wait_time = 120; + } + wait( wait_time ); + if( !flag( "createfx_saving" ) ) + { + createfx_save(true); + } + } +} +move_player_around_map_fast() +{ + player = get_players()[0]; + direction = player getPlayerAngles(); + direction_vec = anglesToForward( direction ); + eye = player getEye(); + trace = bullettrace( eye, eye + vector_scale( direction_vec , 8000 ), 0, undefined ); + dist = distance (eye, trace["position"]); + position = eye + vector_scale( direction_vec , (dist - 64) ); + player setorigin(position); +} +print_ambient_fx_inventory() +{ + fx_list = get_level_ambient_fx(); + ent_list = []; + fx_list_count = []; + println("\n\n^2INVENTORY OF AMBIENT EFFECTS: "); + for (i=0; i < level.createFXent.size; i++) + { + ent_list[i] = level.createFXent[i].v["fxid"]; + } + for (i=0; i < fx_list.size; i++) + { + count = 0; + for (j=0; j < ent_list.size; j++) + { + if ( fx_list[i] == ent_list[j] ) + { + count++; + ent_list[j] = ""; + } + } + fx_list_count[i] = count; + } + for ( i = 0; i < fx_list_count.size-1; i++ ) + { + for ( j = i+1; j < fx_list_count.size; j++ ) + { + if ( fx_list_count[j] < fx_list_count[i] ) + { + temp_count = fx_list_count[i]; + temp_id = fx_list[i]; + fx_list_count[i] = fx_list_count[j]; + fx_list[i] = fx_list[j]; + fx_list_count[j] = temp_count; + fx_list[j] = temp_id; + } + } + } + for ( i = 0; i < fx_list_count.size; i++ ) + { + switch (fx_list_count[i]) + { + case 0: print("^1"); break; + case 1: print("^3"); break; + default: break; + } + print(fx_list_count[i] + "\t" + fx_list[i] + "\n"); + } + print("\n"); +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_createfxmenu.gsc b/BO1/PC/ZM/maps/_createfxmenu.gsc new file mode 100644 index 0000000..b804abb --- /dev/null +++ b/BO1/PC/ZM/maps/_createfxmenu.gsc @@ -0,0 +1,642 @@ +#include maps\_utility; +#include maps\_createfx; +#include common_scripts\utility; +menu ( name ) +{ + return level.create_fx_menu == name; +} +setmenu ( name ) +{ + level.create_fx_menu = name; +} +create_fx_menu() +{ + if ( button_is_clicked( "escape", "x" ) ) + { + exit_menu(); + return; + } + if (menu("creation")) + { + if (button_is_clicked("1")) + { + setmenu("create_oneshot"); + draw_effects_list(); + return; + } + if (button_is_clicked("2")) + { + setmenu("create_loopfx"); + draw_effects_list(); + return; + } + if (button_is_clicked("3")) + { + setmenu("create_loopsound"); + ent = createLoopSound(); + finish_creating_entity( ent ); + return; + } + if (button_is_clicked("4")) + { + setmenu("create_exploder"); + ent = createNewExploder(); + finish_creating_entity( ent ); + return; + } + } + else if (menu("create_oneshot") || menu("create_loopfx") || menu("change_fxid")) + { + if (button_is_clicked("rightarrow")) + { + increment_list_offset(); + draw_effects_list(); + } + menu_fx_creation(); + } + else if (menu("none")) + { + if (button_is_clicked("rightarrow")) + { + increment_list_offset(); + } + menu_change_selected_fx(); + if ( entities_are_selected() ) + { + display_fx_info( get_last_selected_entity() ); + if ( button_is_clicked( "a" ) ) + { + clear_settable_fx(); + setMenu( "add_options" ); + } + } + } + else if ( menu( "add_options" ) ) + { + if ( !entities_are_selected() ) + { + clear_fx_hudElements(); + setMenu("none"); + return; + } + display_fx_add_options( get_last_selected_entity() ); + if (button_is_clicked("rightarrow")) + { + increment_list_offset(); + } + } + else if ( menu( "change_type" ) ) + { + if ( !entities_are_selected() ) + { + clear_fx_hudElements(); + setMenu("none"); + return; + } + else + { + menu_fx_type(); + } + } +} +exit_menu() +{ + clear_fx_hudElements(); + clear_entity_selection(); + update_selected_entities(); + setmenu("none"); +} +get_last_selected_entity() +{ + return level.selected_fx_ents[level.selected_fx_ents.size-1]; +} +menu_fx_creation() +{ + count = 0; + picked_fx = undefined; + keys = get_level_ambient_fx(); + for ( i=level.effect_list_offset; i level.effect_list_offset_max ) + { + break; + } + } + if ( !isdefined( picked_fx ) ) + { + return; + } + if ( menu("change_fxid") ) + { + apply_option_to_selected_fx( get_option( "fxid" ), picked_fx ); + level.effect_list_offset = 0; + clear_fx_hudElements(); + setMenu("none"); + return; + } + ent = undefined; + if (menu("create_loopfx")) + { + ent = createLoopEffect( picked_fx ); + } + if (menu("create_oneshot")) + { + ent = createOneshotEffect( picked_fx ); + } + finish_creating_entity( ent ); +} +finish_creating_entity( ent ) +{ + ent.v["angles"] = vectortoangles( ( ent.v["origin"] + (0,0,100) ) - ent.v["origin"] ); + assert( isdefined( ent ) ); + ent post_entity_creation_function(); + clear_entity_selection(); + select_last_entity(); + move_selection_to_cursor( ); + update_selected_entities(); + setMenu("none"); +} +change_effect_to_oneshot( ent ) +{ + if ( ent.v["type"] == "exploder" ) + { + ent.v[ "exploder" ] = undefined; + ent.v[ "exploder_type" ] = undefined; + ent.v[ "soundalias" ] = undefined; + } + if ( ent.v["delay"] == 0 ) + { + ent.v["delay"] = -15; + } + ent.v[ "type" ] = "oneshotfx"; +} +change_effect_to_loop( ent ) +{ + if ( ent.v["type"] == "exploder" ) + { + ent.v[ "exploder" ] = undefined; + ent.v[ "exploder_type" ] = undefined; + ent.v[ "soundalias" ] = undefined; + } + if ( ent.v["delay"] <= 0 ) + { + ent.v["delay"] = 1; + } + ent.v[ "type" ] = "loopfx"; +} +change_effect_to_exploder( ent ) +{ + ent.v[ "type" ] = "exploder"; + ent.v[ "soundalias" ] = "nil"; + if ( ent.v["delay"] < 0 ) + { + ent.v["delay"] = 0; + } + ent.v[ "exploder" ] = 1; + ent.v[ "exploder_type" ] = "normal"; +} +change_ent_type( newtype ) +{ + if ( newtype == "oneshotfx" ) + { + for (i=0; i < level.selected_fx_ents.size; i++) + { + change_effect_to_oneshot( level.selected_fx_ents[i] ); + } + } + else if ( newtype == "loopfx" ) + { + for (i=0; i < level.selected_fx_ents.size; i++) + { + change_effect_to_loop( level.selected_fx_ents[i] ); + } + } + else if ( newtype == "exploder" ) + { + for (i=0; i < level.selected_fx_ents.size; i++) + { + change_effect_to_exploder( level.selected_fx_ents[i] ); + } + } +} +menu_init() +{ + level.createFX_options = []; + addOption("string", "type", "Type", "oneshotfx", "fx"); + addOption("string", "fxid", "Name", "nil", "fx"); + addOption("float", "delay", "Repeat rate/start delay", 0.5, "fx"); + addOption("int", "repeat", "Number of times to repeat", 5, "exploder"); + addOption("float", "delay_min", "Minimum time between repeats", 1, "exploder"); + addOption("float", "delay_max", "Maximum time between repeats", 2, "exploder"); + addOption("float", "fire_range", "Fire damage range", 0, "fx"); + addOption( "string", "firefx", "2nd FX id", "nil", "exploder" ); + addOption("float", "firefxdelay", "2nd FX id repeat rate", 0.5, "exploder"); + addOption("float", "firefxtimeout", "2nd FX timeout", 5, "exploder"); + addOption("string", "firefxsound", "2nd FX soundalias", "nil", "exploder"); + addOption("string", "ender", "Level notify for ending 2nd FX", "nil", "exploder"); + addOption("string", "rumble", "Rumble", "nil", "exploder"); + addOption("float", "damage", "Radius damage", 150, "exploder"); + addOption("float", "damage_radius", "Radius of radius damage", 250, "exploder"); + addOption("int", "exploder", "Exploder", 1, "exploder"); + addOption("string", "earthquake", "Earthquake", "nil", "exploder"); + addOption("string", "soundalias", "Soundalias", "nil", "all"); + addOption( "int", "stoppable", "Can be stopped from script", "1", "all" ); + level.effect_list_offset = 0; + level.effect_list_offset_max = 9; + level.createfxMasks = []; + level.createfxMasks["all"] = []; + level.createfxMasks["all"]["exploder"] = true; + level.createfxMasks["all"]["oneshotfx"] = true; + level.createfxMasks["all"]["loopfx"] = true; + level.createfxMasks["all"]["soundfx"] = true; + level.createfxMasks["fx"] = []; + level.createfxMasks["fx"]["exploder"] = true; + level.createfxMasks["fx"]["oneshotfx"] = true; + level.createfxMasks["fx"]["loopfx"] = true; + level.createfxMasks["exploder"] = []; + level.createfxMasks["exploder"]["exploder"] = true; + level.createfxMasks["loopfx"] = []; + level.createfxMasks["loopfx"]["loopfx"] = true; + level.createfxMasks["oneshotfx"] = []; + level.createfxMasks["oneshotfx"]["oneshotfx"] = true; + level.createfxMasks["soundfx"] = []; + level.createfxMasks["soundfx"]["soundalias"] = true; +} +get_last_selected_ent() +{ + return level.selected_fx_ents[level.selected_fx_ents.size-1]; +} +entities_are_selected() +{ + return level.selected_fx_ents.size > 0; +} +menu_change_selected_fx() +{ + if (!level.selected_fx_ents.size) + { + return; + } + count = 0; + drawnCount = 0; + ent = get_last_selected_ent(); + for ( i=0; i level.effect_list_offset_max) + { + more = true; + break; + } + } +} +prepare_option_for_change( option, drawnCount ) +{ + if ( option["name"] == "fxid" ) + { + setMenu( "change_fxid" ); + draw_effects_list(); + return; + } + if ( option["name"] == "type" ) + { + setMenu( "change_type" ); + return; + } + createfx_centerprint( "To change " + option["description"] + " on selected entities, type /fx newvalue"); + level.createfx_inputlocked = true; + set_option_index(option["name"]); + setdvar("fx", "nil"); + level.createFxHudElements[ drawnCount+3 ][0].color = (1,1,0); +} +menu_fx_option_set() +{ + if (GetDvar( #"fx") == "nil") + { + return; + } + option = get_selected_option(); + setting = undefined; + if (option["type"] == "string") + { + setting = GetDvar( #"fx"); + } + if (option["type"] == "int") + { + setting = GetDvarInt( #"fx"); + } + if (option["type"] == "float") + { + setting = GetDvarFloat( #"fx"); + } + apply_option_to_selected_fx( option, setting ); +} +menu_fx_type() +{ + clear_fx_hudElements(); + set_fx_hudElement("Change effect type to:"); + set_fx_hudElement(" (1) Oneshot"); + set_fx_hudElement(" (2) Looped"); + set_fx_hudElement(" (3) Exploder"); + set_fx_hudElement("(x) Exit >"); + if (button_is_clicked("1") && (!button_is_held("f")) ) + { + change_ent_type( "oneshotfx" ); + setmenu( "none" ); + } + else if (button_is_clicked("2") && (!button_is_held("f")) ) + { + change_ent_type( "loopfx" ); + setmenu( "none" ); + } + else if (button_is_clicked("3") && (!button_is_held("f")) ) + { + change_ent_type( "exploder" ); + setmenu( "none" ); + } + if ( menu( "none" ) ) + { + update_selected_entities(); + } +} +apply_option_to_selected_fx( option, setting ) +{ + for ( i=0; i level.effect_list_offset_max) + { + more = true; + break; + } + } + if ( count > level.effect_list_offset_max ) + { + set_fx_hudElement( "(->) Next Page >"); + } + set_fx_hudElement( "(a) Add >"); + set_fx_hudElement( "(x) Exit >"); + } + else + { + count = 0; + more = false; + for ( i=0; i level.createFx_hudElements ) + { + break; + } + } + } +} +display_fx_add_options( ent ) +{ + assert(menu("add_options")); + assert(entities_are_selected()); + clear_fx_hudElements(); + set_fx_hudElement("Name: " + ent.v["fxid"]); + set_fx_hudElement("Origin: " + ent.v["origin"]); + set_fx_hudElement("Distance: " + get_distance_from_ent( ent )); + set_fx_hudElement("Angles: " + ent.v["angles"]); + count = 0; + drawnCount = 0; + more = false; + if ( level.effect_list_offset >= level.createFX_options.size ) + { + level.effect_list_offset = 0; + } + for ( i=0; i < level.createFX_options.size; i++ ) + { + option = level.createFX_options[ i ]; + if ( isdefined( ent.v[ option["name"] ] ) ) + { + continue; + } + if ( !mask ( option["mask"], ent.v["type"] ) ) + { + continue; + } + count++; + if ( count < level.effect_list_offset ) + { + continue; + } + if (drawnCount >= level.effect_list_offset_max) + { + continue; + } + drawnCount++; + button_to_check = drawnCount; + if ( button_to_check == 10 ) + { + button_to_check = 0; + } + if ( button_is_clicked( button_to_check + "" ) && (!button_is_held("f")) ) + { + add_option_to_selected_entities( option ); + menuNone(); + return; + } + set_fx_hudElement( button_to_check + ". " + option["description"] ); + } + if ( count > level.effect_list_offset_max ) + { + set_fx_hudElement( "(->) Next Page >"); + } + set_fx_hudElement( "(x) Exit >"); +} +add_option_to_selected_entities( option ) +{ + setting = undefined; + for ( i=0; i= keys.size) + { + level.effect_list_offset = 0; + } + for ( i=level.effect_list_offset; i= level.effect_list_offset_max) + { + more = true; + break; + } + } + if (keys.size > level.effect_list_offset_max) + { + set_fx_hudElement( "(->) Next Page >"); + } +} +increment_list_offset() +{ + level.effect_list_offset += level.effect_list_offset_max; +} +decrement_list_offset() +{ + level.effect_list_offset += level.effect_list_offset_max; +} +get_level_ambient_fx() +{ + if ( !isdefined( level._effect_keys ) ) + { + keys = getarraykeys(level._effect); + level._effect_keys = []; + k = 0; + for (i=0; i < keys.size; i++) + { + if ( isSubStr(keys[i],"fx_") ) + { + level._effect_keys[k] = keys[i]; + k++; + } + } + if ( level._effect_keys.size == 0 ) + { + level._effect_keys = keys; + } + } + return level._effect_keys; +} +get_distance_from_ent( ent ) +{ + players = get_players(); + return distance(players[0].origin, ent.v["origin"]); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_createmenu.gsc b/BO1/PC/ZM/maps/_createmenu.gsc new file mode 100644 index 0000000..c78268c Binary files /dev/null and b/BO1/PC/ZM/maps/_createmenu.gsc differ diff --git a/BO1/PC/ZM/maps/_createpath.gsc b/BO1/PC/ZM/maps/_createpath.gsc new file mode 100644 index 0000000..8929102 --- /dev/null +++ b/BO1/PC/ZM/maps/_createpath.gsc @@ -0,0 +1,532 @@ +#include maps\_utility; +init() +{ + flag_init("path_Notviewing"); + flag_init("path_refresh"); +} +main() +{ +} +path_enable() +{ + if(GetDvar( #"path_enable") != "1") + { + flag_set("path_refresh"); + level.pathmod.alpha = 0; + } + path_waittill_enable(); + level.pathmod.alpha = 1; +} +path_waittill_enable() +{ + while(GetDvar( #"path_enable") != "1") + { + wait .1; + } +} +path_viewmode() +{ + wait .1; + while(1) + { + path_waittill_enable(); + flag_set("path_Notviewing"); + flag_clear("path_refresh"); + thread path_connectlines(); + for(i=0;i viewradexpandmax) + { + viewraddir = -1; + } + else if(viewradexpandcount < 0) + { + viewraddir = 1; + } + viewradexpandcount+=viewraddir; + viewrad = level.path_selectrad+3+viewradexpandcount; + viewcolor = (0,1,1); + } + else + { + viewrad = level.path_selectrad+3; + viewcolor = (0,1,0); + } + thread plot_circle_fortime(viewrad,frametime,viewcolor); + wait .05; + } +} +plot_circle_star_fortime (radius,time,color) +{ + if(!isdefined(color)) + { + color = (0,1,0); + } + hangtime = .05; + circleres = 16; + hemires = circleres/2; + circleinc = 360/circleres; + circleres++; + plotpoints = []; + rad = 0; + plotpoints = []; + rad = 0.000; + timer = gettime()+(time*1000); + while(gettime()"); + println(" "); + println("Once you have all your views press the dump button, open your console.log and paste the script to your level script"); + setdvar("path_help",""); +} +path_delete() +{ + if(GetDvar( #"path_delete") == "") + { + return; + } + newarray = []; + for(i=0;i insidedot) + { + return true; + } + else + { + return false; + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_credits.gsc b/BO1/PC/ZM/maps/_credits.gsc new file mode 100644 index 0000000..b6d68ee --- /dev/null +++ b/BO1/PC/ZM/maps/_credits.gsc @@ -0,0 +1,1640 @@ +#include common_scripts\utility; +#include maps\_utility; +initCredits() +{ + level.linesize = 1.35; + level.headingsize = 1.75; + level.linelist = []; + set_console_status(); + initIWCredits(); + initActivisionCredits(); +} +initIWCredits() +{ + if( GetDvar( #"mapname" ) == "ac130" ) + { + addLeftImage( "logo_infinityward", 256, 128, 4.375 ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_PROJECT_LEAD" ); + addSpaceSmall(); + addLeftName( &"CREDIT_JASON_WEST_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_ENGINEERING_LEADS" ); + addSpaceSmall(); + addLeftName( &"CREDIT_RICHARD_BAKER_CAPS" ); + addLeftName( &"CREDIT_ROBERT_FIELD_CAPS" ); + addLeftName( &"CREDIT_FRANCESCO_GIGLIOTTI_CAPS" ); + addLeftName( &"CREDIT_EARL_HAMMON_JR_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_ENGINEERING" ); + addSpaceSmall(); + addLeftName( &"CREDIT_CHAD_BARB_CAPS" ); + addLeftName( &"CREDIT_ALESSANDRO_BARTOLUCCI_CAPS" ); + addLeftName( &"CREDIT_JON_DAVIS_CAPS" ); + addLeftName( &"CREDIT_JOEL_GOMPERT_CAPS" ); + addLeftName( &"CREDIT_JOHN_HAGGERTY_CAPS" ); + addLeftName( &"CREDIT_JON_SHIRING_CAPS" ); + addLeftName( &"CREDIT_JIESANG_SONG_CAPS" ); + addLeftName( &"CREDIT_RAYME_VINSON_CAPS" ); + addLeftName( &"CREDIT_ANDREW_WANG_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_DESIGN_LEADS" ); + addSpaceSmall(); + addLeftName( &"CREDIT_TODD_ALDERMAN_CAPS" ); + addLeftName( &"CREDIT_STEVE_FUKUDA_CAPS" ); + addLeftName( &"CREDIT_MACKEY_MCCANDLISH_CAPS" ); + addLeftName( &"CREDIT_ZIED_RIEKE_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_DESIGN_AND_SCRIPTING" ); + addSpaceSmall(); + addLeftName( &"CREDIT_ROGER_ABRAHAMSSON_CAPS" ); + addLeftName( &"CREDIT_MOHAMMAD_ALAVI_CAPS" ); + addLeftName( &"CREDIT_KEITH_BELL_CAPS" ); + addLeftName( &"CREDIT_PRESTON_GLENN_CAPS" ); + addLeftName( &"CREDIT_CHAD_GRENIER_CAPS" ); + addLeftName( &"CREDIT_JAKE_KEATING_CAPS" ); + addLeftName( &"CREDIT_JULIAN_LUO_CAPS" ); + addLeftName( &"CREDIT_STEVE_MASSEY_CAPS" ); + addLeftName( &"CREDIT_BRENT_MCLEOD_CAPS" ); + addLeftName( &"CREDIT_JON_PORTER_CAPS" ); + addLeftName( &"CREDIT_ALEXANDER_ROYCEWICZ_CAPS" ); + addLeftName( &"CREDIT_NATHAN_SILVERS_CAPS" ); + addLeftName( &"CREDIT_GEOFFREY_SMITH_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_ART_DIRECTOR" ); + addSpaceSmall(); + addLeftName( &"CREDIT_RICHARD_KRIEGLER_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_TECHNICAL_ART_DIRECTOR" ); + addSpaceSmall(); + addLeftName( &"CREDIT_MICHAEL_BOON_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_ART_LEADS" ); + addSpaceSmall(); + addLeftName( &"CREDIT_CHRIS_CHERUBINI_CAPS" ); + addLeftName( &"CREDIT_JOEL_EMSLIE_CAPS" ); + addLeftName( &"CREDIT_ROBERT_GAINES_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_ART" ); + addSpaceSmall(); + addLeftName( &"CREDIT_BRAD_ALLEN_CAPS" ); + addLeftName( &"CREDIT_PETER_CHEN_CAPS" ); + addLeftName( &"CREDIT_JEFF_HEATH_CAPS" ); + addLeftName( &"CREDIT_RYAN_LASTIMOSA_CAPS" ); + addLeftName( &"CREDIT_OSCAR_LOPEZ_CAPS" ); + addLeftName( &"CREDIT_HERBERT_LOWIS_CAPS" ); + addLeftName( &"CREDIT_TAEHOON_OH_CAPS" ); + addLeftName( &"CREDIT_SAMI_ONUR_CAPS" ); + addLeftName( &"CREDIT_VELINDA_PELAYO_CAPS" ); + addLeftName( &"CREDIT_RICHARD_SMITH_CAPS" ); + addLeftName( &"CREDIT_THEERAPOL_SRISUPHAN_CAPS" ); + addLeftName( &"CREDIT_TODD_SUE_CAPS" ); + addLeftName( &"CREDIT_SOMPOOM_TANGCHUPONG_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_ANIMATION_LEADS" ); + addSpaceSmall(); + addLeftName( &"CREDIT_MARK_GRIGSBY_CAPS" ); + addLeftName( &"CREDIT_PAUL_MESSERLY_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_ANIMATION" ); + addSpaceSmall(); + addLeftName( &"CREDIT_CHANCE_GLASCO_CAPS" ); + addLeftName( &"CREDIT_EMILY_RULE_CAPS" ); + addLeftName( &"CREDIT_ZACH_VOLKER_CAPS" ); + addLeftName( &"CREDIT_LEI_YANG_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_TECHNICAL_ANIMATION_LEAD" ); + addSpaceSmall(); + addLeftName( &"CREDIT_ERIC_PIERCE_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_TECHNICAL_ANIMATION" ); + addSpaceSmall(); + addLeftName( &"CREDIT_NEEL_KAR_CAPS" ); + addLeftName( &"CREDIT_CHENG_LOR_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_AUDIO_LEAD" ); + addSpaceSmall(); + addLeftName( &"CREDIT_MARK_GANUS_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_AUDIO" ); + addSpaceSmall(); + addLeftName( &"CREDIT_CHRISSY_ARYA_CAPS" ); + addLeftName( &"CREDIT_STEPHEN_MILLER_CAPS" ); + addLeftName( &"CREDIT_LINDA_ROSEMEIER_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_WRITTEN_BY" ); + addSpaceSmall(); + addLeftName( &"CREDIT_JESSE_STERN_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_ADDITIONAL_WRITING" ); + addSpaceSmall(); + addLeftName( &"CREDIT_STEVE_FUKUDA_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_STORY_BY" ); + addSpaceSmall(); + addLeftName( &"CREDIT_TODD_ALDERMAN_CAPS" ); + addLeftName( &"CREDIT_STEVE_FUKUDA_CAPS" ); + addLeftName( &"CREDIT_MACKEY_MCCANDLISH_CAPS" ); + addLeftName( &"CREDIT_ZIED_RIEKE_CAPS" ); + addLeftName( &"CREDIT_JESSE_STERN_CAPS" ); + addLeftName( &"CREDIT_JASON_WEST_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_STUDIO_HEADS" ); + addSpaceSmall(); + addLeftName( &"CREDIT_GRANT_COLLIER_CAPS" ); + addLeftName( &"CREDIT_JASON_WEST_CAPS" ); + addLeftName( &"CREDIT_VINCE_ZAMPELLA_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_PRODUCER" ); + addSpaceSmall(); + addLeftName( &"CREDIT_MARK_RUBIN_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_ASSOCIATE_PRODUCER" ); + addSpaceSmall(); + addLeftName( &"CREDIT_PETE_BLUMEL_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_OFFICE_MANAGER" ); + addSpaceSmall(); + addLeftName( &"CREDIT_JANICE_TURNER_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_HUMAN_RESOURCES_GENERALIST" ); + addSpaceSmall(); + addLeftName( &"CREDIT_KRISTIN_COTTERELL_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_EXECUTIVE_ASSISTANT" ); + addSpaceSmall(); + addLeftName( &"CREDIT_NICOLE_SCATES_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_ADMINISTRATIVE_ASSISTANT" ); + addSpaceSmall(); + addLeftName( &"CREDIT_CARLY_GILLIS_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_COMMUNITY_RELATIONS_MANAGER" ); + addSpaceSmall(); + addLeftName( &"CREDIT_ROBERT_BOWLING_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_INFORMATION_TECHNOLOGY_LEAD" ); + addSpaceSmall(); + addLeftName( &"CREDIT_BRYAN_KUHN_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_INFORMATION_TECHNOLOGY" ); + addSpaceSmall(); + addLeftName( &"CREDIT_DREW_MCCOY_CAPS" ); + addLeftName( &"CREDIT_ALEXANDER_SHARRIGAN_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_QUALITY_ASSURANCE_LEADS" ); + addSpaceSmall(); + addLeftName( &"CREDIT_JEMUEL_GARNETT_CAPS" ); + addLeftName( &"CREDIT_ED_HARMER_CAPS" ); + addLeftName( &"CREDIT_JUSTIN_HARRIS_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_QUALITY_ASSURANCE" ); + addSpaceSmall(); + addLeftName( &"CREDIT_BRYAN_ANKER_CAPS" ); + addLeftName( &"CREDIT_ADRIENNE_ARRASMITH_CAPS" ); + addLeftName( &"CREDIT_ESTEVAN_BECERRA_CAPS" ); + addLeftName( &"CREDIT_REILLY_CAMPBELL_CAPS" ); + addLeftName( &"CREDIT_DIMITRI_DEL_CASTILLO_CAPS" ); + addLeftName( &"CREDIT_SHAMENE_CHILDRESS_CAPS" ); + addLeftName( &"CREDIT_WILLIAM_CHO_CAPS" ); + addLeftName( &"CREDIT_RICHARD_GARCIA_CAPS" ); + addLeftName( &"CREDIT_DANIEL_GERMANN_CAPS" ); + addLeftName( &"CREDIT_EVAN_HATCH_CAPS" ); + addLeftName( &"CREDIT_TAN_LA_CAPS" ); + addLeftName( &"CREDIT_RENE_LARA_CAPS" ); + addLeftName( &"CREDIT_STEVE_LOUIS_CAPS" ); + addLeftName( &"CREDIT_ALEX_MEJIA_CAPS" ); + addLeftName( &"CREDIT_MATT_MILLER_CAPS" ); + addLeftName( &"CREDIT_CHRISTIAN_MURILLO_CAPS" ); + addLeftName( &"CREDIT_GAVIN_NIEBEL_CAPS" ); + addLeftName( &"CREDIT_NORMAN_OVANDO_CAPS" ); + addLeftName( &"CREDIT_JUAN_RAMIREZ_CAPS" ); + addLeftName( &"CREDIT_ROBERT_RITER_CAPS" ); + addLeftName( &"CREDIT_BRIAN_ROYCEWICZ_CAPS" ); + addLeftName( &"CREDIT_TRISTEN_SAKURADA_CAPS" ); + addLeftName( &"CREDIT_KEANE_TANOUYE_CAPS" ); + addLeftName( &"CREDIT_JASON_TOM_CAPS" ); + addLeftName( &"CREDIT_MAX_VO_CAPS" ); + addLeftName( &"CREDIT_BRANDON_WILLIS_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_INTERNS" ); + addSpaceSmall(); + addLeftName( &"CREDIT_MICHAEL_ANDERSON_CAPS" ); + addLeftName( &"CREDIT_JASON_BOESCH_CAPS" ); + addLeftName( &"CREDIT_ARTURO_CABALLERO_CAPS" ); + addLeftName( &"CREDIT_DERRIC_EADY_CAPS" ); + addLeftName( &"CREDIT_DANIEL_EDWARDS_CAPS" ); + addLeftName( &"CREDIT_ALDRIC_SAUCIER_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_VOICE_TALENT" ); + addSpaceSmall(); + addLeftName( &"CREDIT_BILLY_MURRAY_CAPS" ); + addLeftName( &"CREDIT_CRAIG_FAIRBRASS_CAPS" ); + addLeftName( &"CREDIT_DAVID_SOBOLOV_CAPS" ); + addLeftName( &"CREDIT_MARK_GRIGSBY_CAPS" ); + addLeftName( &"CREDIT_ZACH_HANKS_CAPS" ); + addLeftName( &"CREDIT_FRED_TOMA_CAPS" ); + addLeftName( &"CREDIT_EUGENE_LAZAREB_CAPS" ); + addSpace(); + addLeftTitle( &"CREDIT_ADDITIONAL_VOICE_TALENT" ); + addSpaceSmall(); + addLeftName( &"CREDIT_GABRIEL_ALRAJHI_CAPS" ); + addLeftName( &"CREDIT_SARKIS_ALBERT_CAPS" ); + addLeftName( &"CREDIT_DESMOND_ASKEW_CAPS" ); + addLeftName( &"CREDIT_DAVID_NEIL_BLACK_CAPS" ); + addLeftName( &"CREDIT_MARCUS_COLOMA_CAPS" ); + addLeftName( &"CREDIT_MICHAEL_CUDLITZ_CAPS" ); + addLeftName( &"CREDIT_GREG_ELLIS_CAPS" ); + addLeftName( &"CREDIT_GIDEON_EMERY_CAPS" ); + addLeftName( &"CREDIT_JOSH_GILMAN_CAPS" ); + addLeftName( &"CREDIT_MICHAEL_GOUGH_CAPS" ); + addLeftName( &"CREDIT_ANNA_GRAVES_CAPS" ); + addLeftName( &"CREDIT_SVEN_HOLMBERG_CAPS" ); + addLeftName( &"CREDIT_MARK_IVANIR_CAPS" ); + addLeftName( &"CREDIT_QUENTIN_JONES_CAPS" ); + addLeftName( &"CREDIT_ARMANDO_VALDESKENNEDY_CAPS" ); + addLeftName( &"CREDIT_BORIS_KIEVSKY_CAPS" ); + addLeftName( &"CREDIT_RJ_KNOLL_CAPS" ); + addLeftName( &"CREDIT_KRISTOF_KONRAD_CAPS" ); + addLeftName( &"CREDIT_DAVE_MALLOW_CAPS" ); + addLeftName( &"CREDIT_JORDAN_MARDER_CAPS" ); + addLeftName( &"CREDIT_SAM_SAKO_CAPS" ); + addLeftName( &"CREDIT_HARRY_VAN_GORKUM_CAPS" ); + addSpace(); + addSpace(); + addLeftTitle( &"CREDIT_MODELS" ); + addSpaceSmall(); + addLeftName( &"CREDIT_MUNEER_ABDELHADI_CAPS" ); + addLeftName( &"CREDIT_MOHAMMAD_ALAVI_CAPS" ); + addLeftName( &"CREDIT_JESUS_ANGUIANO_CAPS" ); + addLeftName( &"CREDIT_CHAD_BAKKE_CAPS" ); + addLeftName( &"CREDIT_PETER_CHEN_CAPS" ); + addLeftName( &"CREDIT_KEVIN_COLLINS_CAPS" ); + addLeftName( &"CREDIT_HUGH_DALY_CAPS" ); + addLeftName( &"CREDIT_DERRIC_EADY_CAPS" ); + addLeftName( &"CREDIT_SUREN_GAZARYAN_CAPS" ); + addLeftName( &"CREDIT_CHAD_GRENIER_CAPS" ); + addLeftName( &"CREDIT_MARK_GRIGSBY_CAPS" ); + addLeftName( &"CREDIT_JUSTIN_HARRIS_CAPS" ); + addLeftName( &"CREDIT_CLIVE_HAWKINS_CAPS" ); + addLeftName( &"CREDIT_STEVEN_JONES_CAPS" ); + addLeftName( &"CREDIT_DAVID_KLEC_CAPS" ); + addLeftName( &"CREDIT_JOSHUA_LACROSSE_CAPS" ); + addLeftName( &"CREDIT_RYAN_LASTIMOSA_CAPS" ); + addLeftName( &"CREDIT_JAMES_LITTLEJOHN_CAPS" ); + addLeftName( &"CREDIT_MACKEY_MCCANDLISH_CAPS" ); + addLeftName( &"CREDIT_TOM_MINDER_CAPS" ); + addLeftName( &"CREDIT_SAMI_ONUR_CAPS" ); + addLeftName( &"CREDIT_VELINDA_PELAYO_CAPS" ); + addLeftName( &"CREDIT_MARTIN_RESOAGLI_CAPS" ); + addLeftName( &"CREDIT_ZIED_RIEKE_CAPS" ); + addLeftName( &"CREDIT_ALEXANDER_ROYCEWICZ_CAPS" ); + addLeftName( &"CREDIT_JOSE_RUBEN_AGUILAR_JR_CAPS" ); + addLeftName( &"CREDIT_GEOFFREY_SMITH_CAPS" ); + addLeftName( &"CREDIT_TODD_SUE_CAPS" ); + addLeftName( &"CREDIT_EID_TOLBA_CAPS" ); + addLeftName( &"CREDIT_ZACH_VOLKER_CAPS" ); + addLeftName( &"CREDIT_JASON_WEST_CAPS" ); + addLeftName( &"CREDIT_HENRY_YORK_CAPS" ); + addSpace(); + addSpace(); + } + else + { + addCenterImage( "logo_infinityward", 256, 128, 4.375 ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_PROJECT_LEAD", &"CREDIT_JASON_WEST_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_ENGINEERING_LEADS", &"CREDIT_RICHARD_BAKER_CAPS" ); + addCenterName( &"CREDIT_ROBERT_FIELD_CAPS" ); + addCenterName( &"CREDIT_FRANCESCO_GIGLIOTTI_CAPS" ); + addCenterName( &"CREDIT_EARL_HAMMON_JR_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ENGINEERING", &"CREDIT_CHAD_BARB_CAPS" ); + addCenterName( &"CREDIT_ALESSANDRO_BARTOLUCCI_CAPS" ); + addCenterName( &"CREDIT_JON_DAVIS_CAPS" ); + addCenterName( &"CREDIT_JOEL_GOMPERT_CAPS" ); + addCenterName( &"CREDIT_JOHN_HAGGERTY_CAPS" ); + addCenterName( &"CREDIT_JON_SHIRING_CAPS" ); + addCenterName( &"CREDIT_JIESANG_SONG_CAPS" ); + addCenterName( &"CREDIT_RAYME_VINSON_CAPS" ); + addCenterName( &"CREDIT_ANDREW_WANG_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_DESIGN_LEADS", &"CREDIT_TODD_ALDERMAN_CAPS" ); + addCenterName( &"CREDIT_STEVE_FUKUDA_CAPS" ); + addCenterName( &"CREDIT_MACKEY_MCCANDLISH_CAPS" ); + addCenterName( &"CREDIT_ZIED_RIEKE_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_DESIGN_AND_SCRIPTING", &"CREDIT_ROGER_ABRAHAMSSON_CAPS" ); + addCenterName( &"CREDIT_MOHAMMAD_ALAVI_CAPS" ); + addCenterName( &"CREDIT_KEITH_BELL_CAPS" ); + addCenterName( &"CREDIT_PRESTON_GLENN_CAPS" ); + addCenterName( &"CREDIT_CHAD_GRENIER_CAPS" ); + addCenterName( &"CREDIT_JAKE_KEATING_CAPS" ); + addCenterName( &"CREDIT_JULIAN_LUO_CAPS" ); + addCenterName( &"CREDIT_STEVE_MASSEY_CAPS" ); + addCenterName( &"CREDIT_BRENT_MCLEOD_CAPS" ); + addCenterName( &"CREDIT_JON_PORTER_CAPS" ); + addCenterName( &"CREDIT_ALEXANDER_ROYCEWICZ_CAPS" ); + addCenterName( &"CREDIT_NATHAN_SILVERS_CAPS" ); + addCenterName( &"CREDIT_GEOFFREY_SMITH_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_ART_DIRECTOR", &"CREDIT_RICHARD_KRIEGLER_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_TECHNICAL_ART_DIRECTOR", &"CREDIT_MICHAEL_BOON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ART_LEADS", &"CREDIT_CHRIS_CHERUBINI_CAPS" ); + addCenterName( &"CREDIT_JOEL_EMSLIE_CAPS" ); + addCenterName( &"CREDIT_ROBERT_GAINES_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ART", &"CREDIT_BRAD_ALLEN_CAPS" ); + addCenterName( &"CREDIT_PETER_CHEN_CAPS" ); + addCenterName( &"CREDIT_JEFF_HEATH_CAPS" ); + addCenterName( &"CREDIT_RYAN_LASTIMOSA_CAPS" ); + addCenterName( &"CREDIT_OSCAR_LOPEZ_CAPS" ); + addCenterName( &"CREDIT_HERBERT_LOWIS_CAPS" ); + addCenterName( &"CREDIT_TAEHOON_OH_CAPS" ); + addCenterName( &"CREDIT_SAMI_ONUR_CAPS" ); + addCenterName( &"CREDIT_VELINDA_PELAYO_CAPS" ); + addCenterName( &"CREDIT_RICHARD_SMITH_CAPS" ); + addCenterName( &"CREDIT_THEERAPOL_SRISUPHAN_CAPS" ); + addCenterName( &"CREDIT_TODD_SUE_CAPS" ); + addCenterName( &"CREDIT_SOMPOOM_TANGCHUPONG_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_ANIMATION_LEADS", &"CREDIT_MARK_GRIGSBY_CAPS" ); + addCenterName( &"CREDIT_PAUL_MESSERLY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ANIMATION", &"CREDIT_CHANCE_GLASCO_CAPS" ); + addCenterName( &"CREDIT_EMILY_RULE_CAPS" ); + addCenterName( &"CREDIT_ZACH_VOLKER_CAPS" ); + addCenterName( &"CREDIT_LEI_YANG_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_TECHNICAL_ANIMATION_LEAD", &"CREDIT_ERIC_PIERCE_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_TECHNICAL_ANIMATION", &"CREDIT_NEEL_KAR_CAPS" ); + addCenterName( &"CREDIT_CHENG_LOR_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_AUDIO_LEAD", &"CREDIT_MARK_GANUS_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_AUDIO", &"CREDIT_CHRISSY_ARYA_CAPS" ); + addCenterName( &"CREDIT_STEPHEN_MILLER_CAPS" ); + addCenterName( &"CREDIT_LINDA_ROSEMEIER_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_WRITTEN_BY", &"CREDIT_JESSE_STERN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ADDITIONAL_WRITING", &"CREDIT_STEVE_FUKUDA_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_STORY_BY", &"CREDIT_TODD_ALDERMAN_CAPS" ); + addCenterName( &"CREDIT_STEVE_FUKUDA_CAPS" ); + addCenterName( &"CREDIT_MACKEY_MCCANDLISH_CAPS" ); + addCenterName( &"CREDIT_ZIED_RIEKE_CAPS" ); + addCenterName( &"CREDIT_JESSE_STERN_CAPS" ); + addCenterName( &"CREDIT_JASON_WEST_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_STUDIO_HEADS", &"CREDIT_GRANT_COLLIER_CAPS" ); + addCenterName( &"CREDIT_JASON_WEST_CAPS" ); + addCenterName( &"CREDIT_VINCE_ZAMPELLA_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PRODUCER", &"CREDIT_MARK_RUBIN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ASSOCIATE_PRODUCER", &"CREDIT_PETE_BLUMEL_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_OFFICE_MANAGER", &"CREDIT_JANICE_TURNER_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_HUMAN_RESOURCES_GENERALIST", &"CREDIT_KRISTIN_COTTERELL_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_EXECUTIVE_ASSISTANT", &"CREDIT_NICOLE_SCATES_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ADMINISTRATIVE_ASSISTANT", &"CREDIT_CARLY_GILLIS_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_COMMUNITY_RELATIONS_MANAGER", &"CREDIT_ROBERT_BOWLING_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_INFORMATION_TECHNOLOGY_LEAD", &"CREDIT_BRYAN_KUHN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_INFORMATION_TECHNOLOGY", &"CREDIT_DREW_MCCOY_CAPS" ); + addCenterName( &"CREDIT_ALEXANDER_SHARRIGAN_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_QUALITY_ASSURANCE_LEADS", &"CREDIT_JEMUEL_GARNETT_CAPS" ); + addCenterName( &"CREDIT_ED_HARMER_CAPS" ); + addCenterName( &"CREDIT_JUSTIN_HARRIS_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_QUALITY_ASSURANCE", &"CREDIT_BRYAN_ANKER_CAPS" ); + addCenterName( &"CREDIT_ADRIENNE_ARRASMITH_CAPS" ); + addCenterName( &"CREDIT_ESTEVAN_BECERRA_CAPS" ); + addCenterName( &"CREDIT_REILLY_CAMPBELL_CAPS" ); + addCenterName( &"CREDIT_DIMITRI_DEL_CASTILLO_CAPS" ); + addCenterName( &"CREDIT_SHAMENE_CHILDRESS_CAPS" ); + addCenterName( &"CREDIT_WILLIAM_CHO_CAPS" ); + addCenterName( &"CREDIT_RICHARD_GARCIA_CAPS" ); + addCenterName( &"CREDIT_DANIEL_GERMANN_CAPS" ); + addCenterName( &"CREDIT_EVAN_HATCH_CAPS" ); + addCenterName( &"CREDIT_TAN_LA_CAPS" ); + addCenterName( &"CREDIT_RENE_LARA_CAPS" ); + addCenterName( &"CREDIT_STEVE_LOUIS_CAPS" ); + addCenterName( &"CREDIT_ALEX_MEJIA_CAPS" ); + addCenterName( &"CREDIT_MATT_MILLER_CAPS" ); + addCenterName( &"CREDIT_CHRISTIAN_MURILLO_CAPS" ); + addCenterName( &"CREDIT_GAVIN_NIEBEL_CAPS" ); + addCenterName( &"CREDIT_NORMAN_OVANDO_CAPS" ); + addCenterName( &"CREDIT_JUAN_RAMIREZ_CAPS" ); + addCenterName( &"CREDIT_ROBERT_RITER_CAPS" ); + addCenterName( &"CREDIT_BRIAN_ROYCEWICZ_CAPS" ); + addCenterName( &"CREDIT_TRISTEN_SAKURADA_CAPS" ); + addCenterName( &"CREDIT_KEANE_TANOUYE_CAPS" ); + addCenterName( &"CREDIT_JASON_TOM_CAPS" ); + addCenterName( &"CREDIT_MAX_VO_CAPS" ); + addCenterName( &"CREDIT_BRANDON_WILLIS_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_INTERNS", &"CREDIT_MICHAEL_ANDERSON_CAPS" ); + addCenterName( &"CREDIT_JASON_BOESCH_CAPS" ); + addCenterName( &"CREDIT_ARTURO_CABALLERO_CAPS" ); + addCenterName( &"CREDIT_DERRIC_EADY_CAPS" ); + addCenterName( &"CREDIT_DANIEL_EDWARDS_CAPS" ); + addCenterName( &"CREDIT_ALDRIC_SAUCIER_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_VOICE_TALENT", &"CREDIT_BILLY_MURRAY_CAPS" ); + addCenterName( &"CREDIT_CRAIG_FAIRBRASS_CAPS" ); + addCenterName( &"CREDIT_DAVID_SOBOLOV_CAPS" ); + addCenterName( &"CREDIT_MARK_GRIGSBY_CAPS" ); + addCenterName( &"CREDIT_ZACH_HANKS_CAPS" ); + addCenterName( &"CREDIT_FRED_TOMA_CAPS" ); + addCenterName( &"CREDIT_EUGENE_LAZAREB_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ADDITIONAL_VOICE_TALENT", &"CREDIT_GABRIEL_ALRAJHI_CAPS" ); + addCenterName( &"CREDIT_SARKIS_ALBERT_CAPS" ); + addCenterName( &"CREDIT_DESMOND_ASKEW_CAPS" ); + addCenterName( &"CREDIT_DAVID_NEIL_BLACK_CAPS" ); + addCenterName( &"CREDIT_MARCUS_COLOMA_CAPS" ); + addCenterName( &"CREDIT_MICHAEL_CUDLITZ_CAPS" ); + addCenterName( &"CREDIT_GREG_ELLIS_CAPS" ); + addCenterName( &"CREDIT_GIDEON_EMERY_CAPS" ); + addCenterName( &"CREDIT_JOSH_GILMAN_CAPS" ); + addCenterName( &"CREDIT_MICHAEL_GOUGH_CAPS" ); + addCenterName( &"CREDIT_ANNA_GRAVES_CAPS" ); + addCenterName( &"CREDIT_SVEN_HOLMBERG_CAPS" ); + addCenterName( &"CREDIT_MARK_IVANIR_CAPS" ); + addCenterName( &"CREDIT_QUENTIN_JONES_CAPS" ); + addCenterName( &"CREDIT_ARMANDO_VALDESKENNEDY_CAPS" ); + addCenterName( &"CREDIT_BORIS_KIEVSKY_CAPS" ); + addCenterName( &"CREDIT_RJ_KNOLL_CAPS" ); + addCenterName( &"CREDIT_KRISTOF_KONRAD_CAPS" ); + addCenterName( &"CREDIT_DAVE_MALLOW_CAPS" ); + addCenterName( &"CREDIT_JORDAN_MARDER_CAPS" ); + addCenterName( &"CREDIT_SAM_SAKO_CAPS" ); + addCenterName( &"CREDIT_HARRY_VAN_GORKUM_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_MODELS", &"CREDIT_MUNEER_ABDELHADI_CAPS" ); + addCenterName( &"CREDIT_MOHAMMAD_ALAVI_CAPS" ); + addCenterName( &"CREDIT_JESUS_ANGUIANO_CAPS" ); + addCenterName( &"CREDIT_CHAD_BAKKE_CAPS" ); + addCenterName( &"CREDIT_PETER_CHEN_CAPS" ); + addCenterName( &"CREDIT_KEVIN_COLLINS_CAPS" ); + addCenterName( &"CREDIT_HUGH_DALY_CAPS" ); + addCenterName( &"CREDIT_DERRIC_EADY_CAPS" ); + addCenterName( &"CREDIT_SUREN_GAZARYAN_CAPS" ); + addCenterName( &"CREDIT_CHAD_GRENIER_CAPS" ); + addCenterName( &"CREDIT_MARK_GRIGSBY_CAPS" ); + addCenterName( &"CREDIT_JUSTIN_HARRIS_CAPS" ); + addCenterName( &"CREDIT_CLIVE_HAWKINS_CAPS" ); + addCenterName( &"CREDIT_STEVEN_JONES_CAPS" ); + addCenterName( &"CREDIT_DAVID_KLEC_CAPS" ); + addCenterName( &"CREDIT_JOSHUA_LACROSSE_CAPS" ); + addCenterName( &"CREDIT_RYAN_LASTIMOSA_CAPS" ); + addCenterName( &"CREDIT_JAMES_LITTLEJOHN_CAPS" ); + addCenterName( &"CREDIT_MACKEY_MCCANDLISH_CAPS" ); + addCenterName( &"CREDIT_TOM_MINDER_CAPS" ); + addCenterName( &"CREDIT_SAMI_ONUR_CAPS" ); + addCenterName( &"CREDIT_VELINDA_PELAYO_CAPS" ); + addCenterName( &"CREDIT_MARTIN_RESOAGLI_CAPS" ); + addCenterName( &"CREDIT_ZIED_RIEKE_CAPS" ); + addCenterName( &"CREDIT_ALEXANDER_ROYCEWICZ_CAPS" ); + addCenterName( &"CREDIT_JOSE_RUBEN_AGUILAR_JR_CAPS" ); + addCenterName( &"CREDIT_GEOFFREY_SMITH_CAPS" ); + addCenterName( &"CREDIT_TODD_SUE_CAPS" ); + addCenterName( &"CREDIT_EID_TOLBA_CAPS" ); + addCenterName( &"CREDIT_ZACH_VOLKER_CAPS" ); + addCenterName( &"CREDIT_JASON_WEST_CAPS" ); + addCenterName( &"CREDIT_HENRY_YORK_CAPS" ); + addSpace(); + addSpace(); + } + addCenterHeading( &"CREDIT_ORIGINAL_SCORE" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_THEME_BY", &"CREDIT_HARRY_GREGSONWILLIAMS_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PRODUCED_BY", &"CREDIT_HARRY_GREGSONWILLIAMS_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MUSIC_BY", &"CREDIT_STEPHEN_BARTON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SCORE_SUPERVISOR", &"CREDIT_ALLISON_WRIGHT_CLARK_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_AMBIENT_MUSIC_DESIGN", &"CREDIT_MEL_WESSON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SCORE_PERFORMED_BY", &"CREDIT_THE_LONDON_SESSION_ORCHESTRA_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SCORING_ENGINEER", &"CREDIT_JONATHAN_ALLEN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SCORING_MIXER", &"CREDIT_MALCOLM_LUKER_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PROTOOLS_ENGINEERS", &"CREDIT_JAMIE_LUKER_CAPS" ); + addCenterName( &"CREDIT_SCRAP_MARSHALL_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ORCHESTRA_CONTRACTORS", &"CREDIT_ISOBEL_GRIFFITHS_CAPS" ); + addCenterName( &"CREDIT_CHARLOTTE_MATTHEWS_CAPS" ); + addCenterName( &"CREDIT_TODD_STANTON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ORCHESTRATIONS_BY", &"CREDIT_DAVID_BUCKLEY_CAPS" ); + addCenterName( &"CREDIT_STEPHEN_BARTON_CAPS" ); + addCenterName( &"CREDIT_LADD_MCINTOSH_CAPS" ); + addCenterName( &"CREDIT_HALLI_CAUTHERY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_COPYISTS", &"CREDIT_ANN_MILLER_CAPS" ); + addCenterName( &"CREDIT_TED_MILLER_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_STRING_OVERDUBS_BY", &"CREDIT_THE_CZECH_PHILHARMONIC_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ARTISTIC_DIRECTOR", &"CREDIT_PAVEL_PRANTL_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_GUITARS", &"CREDIT_COSTA_KOTSELAS_CAPS" ); + addCenterName( &"CREDIT_PETER_DISTEFANO_CAPS" ); + addCenterName( &"CREDIT_JOHN_PARRICELLI_CAPS" ); + addCenterName( &"CREDIT_TOBY_CHU_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ELECTRIC_VIOLIN", &"CREDIT_HUGH_MARSH_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_OUD_BOUZOUKI", &"CREDIT_STUART_HALL_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_HURDY_GURDY", &"CREDIT_NICHOLAS_PERRY" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_HORN_SOLOS", &"CREDIT_RICHARD_WATKINS_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PERCUSSION", &"CREDIT_FRANK_RICOTTI_CAPS" ); + addCenterName( &"CREDIT_GARY_KETTEL_CAPS" ); + addCenterName( &"CREDIT_PAUL_CLARVIS_CAPS" ); + addSpace(); + addCenterHeading( &"CREDIT_SCORE_RECORDED_AT_ABBEY" ); + addSpaceSmall(); + addCenterHeading( &"CREDIT_MUSIC_MIXED_AT_THE_BLUE" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_MILITARY_TECHNICAL_ADVISORS", &"CREDIT_LT_COL_HANK_KEIRSEY_US" ); + addCenterName( &"CREDIT_MAJ_KEVIN_COLLINS_USMC" ); + addCenterName( &"CREDIT_EMILIO_CUESTA_USMC_CAPS" ); + addCenterName( &"CREDIT_SGT_MAJ_JAMES_DEVER_1" ); + addCenterName( &"CREDIT_M_SGT_TOM_MINDER_1_FORCE" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_SOUND_EFFECTS_RECORDING", &"CREDIT_JOHN_FASAL_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_VIDEO_EDITING", &"CREDIT_PETE_BLUMEL_CAPS" ); + addCenterName( &"CREDIT_DREW_MCCOY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ADDITIONAL_DESIGN_AND", &"CREDIT_BRIAN_GILMAN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ADDITIONAL_ART", &"CREDIT_ANDREW_CLARK_CAPS" ); + addCenterName( &"CREDIT_JAVIER_OJEDA_CAPS" ); + addCenterName( &"CREDIT_JIWON_SON_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_TRANSLATIONS" ); + addSpaceSmall(); + addCenterHeading( &"CREDIT_APPLIED_LANGUAGES" ); + addCenterHeading( &"CREDIT_WORLD_LINGO" ); + addCenterHeading( &"CREDIT_UNIQUE_ARTISTS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_WEAPON_ARMORERS_AND_RANGE" ); + addSpaceSmall(); + addCenterHeading( &"CREDIT_GIBBONS_LTD" ); + addCenterHeading( &"CREDIT_LONG_MOUNTAIN_OUTFITTERS" ); + addCenterHeading( &"CREDIT_BOB_MAUPIN_RANCH" ); + addSpace(); + addSpace(); + if( level.console && !level.xenon ) + { + addCenterHeading( &"CREDIT_ADDITIONAL_PROGRAMMING_DEMONWARE" ); + addSpaceSmall(); + addCenterNameDouble( &"CREDIT_SEAN_BLANCHFIELD_CAPS", &"CREDIT_MORGAN_BRICKLEY_CAPS" ); + addCenterNameDouble( &"CREDIT_DYLAN_COLLINS_CAPS", &"CREDIT_MICHAEL_COLLINS_CAPS" ); + addCenterNameDouble( &"CREDIT_MALCOLM_DOWSE_CAPS", &"CREDIT_STEFFEN_HIGELS_CAPS" ); + addCenterNameDouble( &"CREDIT_TONY_KELLY_CAPS", &"CREDIT_JOHN_KIRK_CAPS" ); + addCenterNameDouble( &"CREDIT_CRAIG_MCINNES_CAPS", &"CREDIT_ALEX_MONTGOMERY_CAPS" ); + addCenterNameDouble( &"CREDIT_EOIN_OFEARGHAIL_CAPS", &"CREDIT_RUAIDHRI_POWER_CAPS" ); + addCenterNameDouble( &"CREDIT_TILMAN_SCHAFER_CAPS", &"CREDIT_AMY_SMITH_CAPS" ); + addCenterNameDouble( &"CREDIT_EMMANUEL_STONE_CAPS", &"CREDIT_ROB_SYNNOTT_CAPS" ); + addCenterNameDouble( &"CREDIT_VLAD_TITOV_CAPS", &"" ); + addSpace(); + addSpace(); + } + addCenterHeading( &"CREDIT_ADDITIONAL_ART_PROVIDED_ANT_FARM" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PRODUCER", &"CREDIT_SCOTT_CARSON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_EDITOR", &"CREDIT_SCOTT_COOKSON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ASSOCIATE_PRODUCER", &"CREDIT_SETH_HENDRIX_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_EXECUTIVE_CREATIVE_DIRECTORS", &"CREDIT_LISA_RIZNIKOVE_CAPS" ); + addCenterName( &"CREDIT_ROB_TROY_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_VOICE_RECORDING_FACILITIES" ); + addSpaceSmall(); + addCenterHeading( &"CREDIT_PCB_PRODUCTIONS" ); + addCenterHeading( &"CREDIT_SIDEUK" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_VOICE_DIRECTIONDIALOG", &"CREDIT_KEITH_AREM_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ADDITIONAL_DIALOG_ENGINEERING", &"CREDIT_ANT_HALES_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ADDITIONAL_VOICE_DIRECTION", &"CREDIT_STEVE_FUKUDA_CAPS" ); + addCenterName( &"CREDIT_MACKEY_MCCANDLISH_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_MOTION_CAPTURE_PROVIDED" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MOTION_CAPTURE_LEAD", &"CREDIT_KRISTINA_ADELMEYER_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MOTION_CAPTURE_TECHNICIANS", &"CREDIT_KRISTIN_GALLAGHER_CAPS" ); + addCenterName( &"CREDIT_JEFF_SWENTY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MOTION_CAPTURE_INTERN", &"CREDIT_JORGE_LOPEZ_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_STUNT_ACTION_DESIGNED" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_STUNT_COORDINATOR", &"CREDIT_DANNY_HERNANDEZ_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_STUNTSMOTION_CAPTURE", &"CREDIT_ROBERT_ALONSO_CAPS" ); + addCenterName( &"CREDIT_DANNY_HERNANDEZ_CAPS" ); + addCenterName( &"CREDIT_ALLEN_JO_CAPS" ); + addCenterName( &"CREDIT_DAVID_LEITCH_CAPS" ); + addCenterName( &"CREDIT_MIKE_MUKATIS_CAPS" ); + addCenterName( &"CREDIT_RYAN_WATSON_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_CINEMATIC_MOVIES_PROVIDED" ); + addSpace(); + addCenterHeading( &"CREDIT_VEHICLES_PROVIDED_BY" ); + addSpace(); + if( !level.console ) + { + addCenterHeading( &"CREDIT_ADDITIONAL_PROGRAMMING_EVEN_BALANCE" ); + addSpace(); + } + addCenterHeading( &"CREDIT_ADDITIONAL_ART_PROVIDED" ); + addSpace(); + addCenterHeading( &"CREDIT_ADDITIONAL_SOUND_DESIGN" ); + addSpace(); + addCenterHeading( &"CREDIT_ADDITIONAL_AUDIO_ENGINEERING_DIGITAL_SYNAPSE" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_PRODUCTION_BABIES" ); + addSpaceSmall(); + addCenterHeading( &"CREDIT_BABY_COLIN_ALDERMAN" ); + addCenterHeading( &"CREDIT_BABY_LUKE_SMITH" ); + addCenterHeading( &"CREDIT_BABY_JOHN_GALT_WEST_JACK" ); + addCenterHeading( &"CREDIT_BABY_COURTNEY_ZAMPELLA" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_INFINITY_WARD_SPECIAL" ); + addSpaceSmall(); + addCenterHeading( &"CREDIT_USMC_PUBLIC_AFFAIRS_OFFICE" ); + addCenterHeading( &"CREDIT_USMC_1ST_TANK_BATTALION" ); + addCenterHeading( &"CREDIT_MARINE_LIGHT_ATTACK_HELICOPTER" ); + addCenterHeading( &"CREDIT_USMC_5TH_BATTALION_14TH" ); + addCenterHeading( &"CREDIT_ARMY_1ST_CAVALRY_DIVISION" ); + addSpace(); + addCenterNameDouble( &"CREDIT_DAVE_DOUGLAS_CAPS", &"CREDIT_DAVID_FALICKI_CAPS" ); + addCenterNameDouble( &"CREDIT_ROCK_GALLOTTI_CAPS", &"CREDIT_MICHAEL_GIBBONS_CAPS" ); + addCenterNameDouble( &"CREDIT_LAWRENCE_GREEN_CAPS", &"CREDIT_ANDREW_HOFFACKER_CAPS" ); + addCenterNameDouble( &"CREDIT_JD_KEIRSEY_CAPS", &"CREDIT_ROBERT_MAUPIN_CAPS" ); + addCenterNameDouble( &"CREDIT_BRIAN_MAYNARD_CAPS", &"CREDIT_LARRY_ZANOFF_CAPS" ); + addCenterNameDouble( &"CREDIT_CALEB_BARNHART_CAPS", &"CREDIT_JOHN_BUDD_CAPS" ); + addCenterNameDouble( &"CREDIT_SCOTT_CARPENTER_CAPS", &"CREDIT_JOSHUA_CARRILLO_CAPS" ); + addCenterNameDouble( &"CREDIT_DAVID_COFFEY_CAPS", &"CREDIT_CHRISTOPHER_DARE_CAPS" ); + addCenterNameDouble( &"CREDIT_NICK_DUNCAN_CAPS", &"CREDIT_JOSE_GO_JR_CAPS" ); + addCenterNameDouble( &"CREDIT_JEREMY_HULL_CAPS", &"CREDIT_GORDON_JAMES_CAPS" ); + addCenterNameDouble( &"CREDIT_STEVEN_JONES_CAPS", &"CREDIT_MICHAEL_LISCOTTI_CAPS" ); + addCenterNameDouble( &"CREDIT_STEPHANIE_MARTINEZ_CAPS", &"CREDIT_C_ANTHONY_MARQUEZ_CAPS" ); + addCenterNameDouble( &"CREDIT_CODY_MAUTER_CAPS", &"CREDIT_JOSEPH_MCCREARY_CAPS" ); + addCenterNameDouble( &"CREDIT_GREG_MESSINGER_CAPS", &"CREDIT_MICHAEL_RETZLAFF_CAPS" ); + addCenterNameDouble( &"CREDIT_ANGEL_SANCHEZ_CAPS", &"CREDIT_KYLE_SMITH_CAPS" ); + addCenterNameDouble( &"CREDIT_ALAN_STERN_CAPS", &"CREDIT_ANGEL_TORRES_CAPS" ); + addCenterNameDouble( &"CREDIT_OSCAR_VILLAMOR", &"CREDIT_LARRY_ZENG_CAPS" ); + addSpace(); + addSpace(); + addSpace(); + addSpace(); +} +initActivisionCredits() +{ + addCenterImage( "logo_activision", 256, 128, 3.875 ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_PRODUCTION" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PRODUCER", &"CREDIT_SAM_NOURIANI_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ASSOCIATE_PRODUCERS", &"CREDIT_NEVEN_DRAVINSKI_CAPS" ); + addCenterName( &"CREDIT_DEREK_RACCA_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PRODUCTION_COORDINATORS", &"CREDIT_RHETT_CHASSEREAU_CAPS" ); + addCenterName( &"CREDIT_VINCENT_FENNEL_CAPS" ); + addCenterName( &"CREDIT_ANDREW_HOFFACKER_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PRODUCTION_TESTER", &"CREDIT_WINYAN_JAMES_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PRODUCTION_INTERN", &"CREDIT_JACOB_THOMPSON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_EXECUTIVE_PRODUCER", &"CREDIT_MARCUS_IREMONGER_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_VICE_PRESIDENT_PRODUCTION", &"CREDIT_STEVE_ACKRICH_CAPS" ); + addCenterName( &"CREDIT_THAINE_LYMAN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_HEAD_OF_PRODUCTION", &"CREDIT_LAIRD_MALAMED_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_GLOBAL_BRAND_MANAGEMENT" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_BRAND_MANAGER", &"CREDIT_TABITHA_HAYES_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ASSOCIATE_BRAND_MANAGER", &"CREDIT_JON_DELODDER_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MARKETING_ASSOCIATE", &"CREDIT_MIKE_RUDIN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_DIRECTOR_GLOBAL_BRAND_MANAGEMENT", &"CREDIT_TOM_SILK_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_PUBLIC_RELATIONS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_PR_MANAGER", &"CREDIT_MIKE_MANTARRO_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_PUBLICIST", &"CREDIT_KATHY_BRICAUD_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_JUNIOR_PUBLICIST", &"CREDIT_ROBERT_TAYLOR_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_PR_DIRECTOR", &"CREDIT_MICHELLE_SCHRODER_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_EUROPEAN_PR_DIRECTOR", &"CREDIT_TIM_PONTING_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_STEP_3", &"CREDIT_WIEBKE_HESS_CAPS" ); + addCenterName( &"CREDIT_JON_LENAWAY_CAPS" ); + addCenterName( &"CREDIT_NEIL_WOOD_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_CENTRAL_LOCALIZATIONS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_DIRECTOR_OF_PRODUCTION", &"CREDIT_BARRY_KEHOE_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_LOCALIZATION_PROJECT", &"CREDIT_FIONA_EBBS_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_LOCALIZATION_CONSULTANT", &"CREDIT_STEPHANIE_OMALLEY_DEMING_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_LOCALIZATION_COORDINATOR", &"CREDIT_CHRIS_OSBERG_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_LOCALIZATION_ENGINEER", &"CREDIT_PHIL_COUNIHAN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_BRAND_MANAGER_EUROPE", &"CREDIT_STEFAN_SEIDEL_CAPS" ); + addSpace(); + addCenterHeading( &"CREDIT_LOCALIZATION_TOOLS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_MARKETING_COMMUNICATIONS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_VICE_PRESIDENT_OF_MARKETING", &"CREDIT_DENISE_WALSH_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_DIRECTOR_OF_MARKETING", &"CREDIT_SUSAN_HALLOCK_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MARKETING_COMMUNICATIONS_MANAGER", &"CREDIT_KAREN_STARR_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MARKETING_COMMUNICATIONS_COORDINATOR", &"CREDIT_KRISTINA_JOLLY_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_BUSINESS_AND_LEGAL_AFFAIRS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_DIRECTOR_GOVERNMENT_AND", &"CREDIT_PHIL_TERZIAN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_TRANSACTIONAL_ATTORNEY", &"CREDIT_TRAVIS_STANSBURY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_PARALEGAL", &"CREDIT_KAP_KANG_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_OPERATIONS_AND_STUDIO" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_DIRECTOR_OF_PRODUCTION", &"CREDIT_SUZAN_RUDE_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_CENTRAL_TECHNOLOGY" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_MANGER_CENTRAL", &"CREDIT_ED_CLUNE_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_JUNIOR_SOFTWARE_ENGINEER", &"CREDIT_RYAN_FORD_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_TECHNICAL_DIRECTOR", &"CREDIT_PAT_GRIFFITH_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_DIRECTOR_TECHNOLOGY", &"CREDIT_JOHN_BOJORQUEZ_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_CENTRAL_AUDIO" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_DIRECTOR_CENTRAL_AUDIO", &"CREDIT_ADAM_LEVENSON_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_MUSIC_DEPARTMENT" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_WORLDWIDE_EXECUTIVE", &"CREDIT_TIM_RILEY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MUSIC_SUPERVISORS", &"CREDIT_SCOTT_MCDANIEL_CAPS" ); + addCenterName( &"CREDIT_BRANDON_YOUNG" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MUSIC_DEPARTMENT_COORDINATOR", &"CREDIT_JONATHAN_BODELL_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_MUSIC" ); + addSpace(); + addCenterHeading( &"CREDIT_CHURCH" ); + addCenterHeading( &"CREDIT_WRITTEN_BY_SEAN_PRICE" ); + addCenterHeading( &"CREDIT_PERFORMED_BY_SEAN_PRICE" ); + addCenterHeading( &"CREDIT_COURTESY_OF_DUCK_DOWN" ); + addSpace(); + addCenterHeading( &"CREDIT_NATIONAL_ANTHEM_OF_THE" ); + addCenterHeading( &"CREDIT_WRITTEN_BY_ANATOLIJ_N" ); + addCenterHeading( &"CREDIT_PERFORMED_BY_THE_RED" ); + addCenterHeading( &"CREDIT_PUBLISHED_BY_G_SCHIRMER" ); + addCenterHeading( &"CREDIT_COURTESY_OF_SILVA_SCREEN" ); + addSpace(); + addCenterHeading( &"CREDIT_RESCUED" ); + addCenterHeading( &"CREDIT_WRITTEN_BY_ABRAHAM_LASS" ); + addCenterHeading( &"CREDIT_PUBLISHED_BY_TRF_MUSIC" ); + addCenterHeading( &"CREDIT_USED_BY_PERMISSION" ); + addSpace(); + addCenterHeading( &"CREDIT_DEEP_AND_HARD" ); + addCenterHeading( &"CREDIT_WRITTEN_BY_MARK_GRIGSBY" ); + addCenterHeading( &"CREDIT_PERFORMED_BY_MARK_GRIGSBY" ); + addCenterHeading( &"CREDIT_MIXED_BY_STEPHEN_MILLER" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_FINANCE" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MANAGER_CONTROLLER", &"CREDIT_JASON_DALBOTTEN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_FINANCE_MANAGER", &"CREDIT_HARJINDER_SINGH_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_FINANCE_ANALYST", &"CREDIT_ADRIAN_GOMEZ_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_ACTIVISION_SPECIAL_THANKS" ); + addSpaceSmall(); + addCenterNameDouble( &"CREDIT_MIKE_GRIFFITH_CAPS", &"CREDIT_ROBIN_KAMINSKY_CAPS" ); + addCenterNameDouble( &"CREDIT_BRIAN_WARD_CAPS", &"CREDIT_DAVE_STOHL_CAPS" ); + addCenterNameDouble( &"CREDIT_STEVE_PEARCE_CAPS", &"CREDIT_WILL_KASSOY_CAPS" ); + addCenterNameDouble( &"CREDIT_DUSTY_WELCH_CAPS", &"CREDIT_LAIRD_MALAMED_CAPS" ); + addCenterNameDouble( &"CREDIT_NOAH_HELLER_CAPS", &"CREDIT_GEOFF_CARROLL_CAPS" ); + addCenterNameDouble( &"CREDIT_SASHA_GROSS_CAPS", &"CREDIT_JEN_FOX_CAPS" ); + addCenterNameDouble( &"CREDIT_MARCHELE_HARDIN_CAPS", &"CREDIT_JB_SPISSO_CAPS" ); + addCenterNameDouble( &"CREDIT_RIC_ROMERO_CAPS", &"" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_QUALITY_ASSURANCE" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_LEAD_QA_FUNCTIONALITY", &"CREDIT_MARIO_HERNANDEZ_CAPS" ); + addCenterName( &"CREDIT_ERIK_MELEN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_LEAD_QA_FUNCTIONALITY", &"CREDIT_EVAN_BUTTON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MANAGER_QA_FUNCTIONALITY", &"CREDIT_GLENN_VISTANTE_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_FLOOR_LEADS_QA_FUNCTIONALITY", &"CREDIT_VICTOR_DURLING_CAPS" ); + addCenterName( &"CREDIT_CHAD_SCHMIDT_CAPS" ); + addCenterName( &"CREDIT_PETER_VON_OY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_QA_DATABASE_ADMINISTRATORS", &"CREDIT_RICH_PEARSON_CAPS" ); + addCenterName( &"CREDIT_CHRIS_SHANLEY_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_QA_TEST_TEAM" ); + addSpaceSmall(); + addCenterTriple( &"CREDIT_DANIEL_ALFARO_CAPS", &"CREDIT_STEVE_ARAUJO_CAPS", &"CREDIT_MIKE_AZAMI_CAPS" ); + addCenterTriple( &"CREDIT_STEFFEN_BOEHME_CAPS", &"CREDIT_JORDAN_BONDHUS_CAPS", &"CREDIT_BRYAN_CHAMCHOUM_CAPS" ); + addCenterTriple( &"CREDIT_DILLON_CHANCE_CAPS", &"CREDIT_RYAN_CHANN_CAPS", &"CREDIT_ERIC_CHEVEZ_CAPS" ); + addCenterTriple( &"CREDIT_CHRISTOPHER_CODDING_CAPS", &"CREDIT_RYAN_DEAL_CAPS", &"CREDIT_JON_EARNEST_CAPS" ); + addCenterTriple( &"CREDIT_ISAAC_FISCHER_CAPS", &"CREDIT_DEVIN_GEE_CAPS", &"CREDIT_GIOVANNI_FUNES_CAPS" ); + addCenterTriple( &"CREDIT_MIKE_GENADRY_CAPS", &"CREDIT_MARC_GOGOSHIAN_CAPS", &"CREDIT_ERIC_GOLDIN_CAPS" ); + addCenterTriple( &"CREDIT_SHON_GRAY_CAPS", &"CREDIT_JONATHON_HAMNER_CAPS", &"CREDIT_SHAWN_HESTLEY_CAPS" ); + addCenterTriple( &"CREDIT_DEMETRIUS_HOSTON_CAPS", &"CREDIT_CARSON_KEENE_CAPS", &"CREDIT_NATE_KINNEY_CAPS" ); + addCenterTriple( &"CREDIT_DEVIN_MCGOWAN_CAPS", &"CREDIT_MICHAEL_LOYD_CAPS", &"CREDIT_JULIO_MEDINA_CAPS" ); + addCenterTriple( &"CREDIT_JULIAN_NAYDICHEV_CAPS", &"CREDIT_KENNETH_OLIPHANT_CAPS", &"CREDIT_RODOLFO_ORTEGA_CAPS" ); + addCenterTriple( &"CREDIT_DAVID_PARKER_CAPS", &"CREDIT_ADRIAN_PEREZ_CAPS", &"CREDIT_BRIAN_PUSCHELL_CAPS" ); + addCenterTriple( &"CREDIT_CRYSTAL_PUSCHELL_CAPS", &"CREDIT_JASON_RALYA_CAPS", &"CREDIT_JUSTIN_REID_CAPS" ); + addCenterTriple( &"CREDIT_MATTHEW_RICHARDSON_CAPS", &"CREDIT_JOHN_RIGGS_CAPS", &"CREDIT_JESSE_RIOS_CAPS" ); + addCenterTriple( &"CREDIT_ERNIE_RITTACCO_CAPS", &"CREDIT_HEATHER_RIVERA_CAPS", &"CREDIT_MARVIN_RIVERA_CAPS" ); + addCenterTriple( &"CREDIT_HOWARD_RODELO_CAPS", &"CREDIT_PEDRO_RODRIGUEZ_CAPS", &"CREDIT_DAN_ROHAN_CAPS" ); + addCenterTriple( &"CREDIT_JEFF_ROPER_CAPS", &"CREDIT_JONATHAN_SANCHEZ_CAPS", &"CREDIT_MICHAEL_SANCHEZ_CAPS" ); + addCenterTriple( &"CREDIT_JUSTIN_SCHUBER_CAPS", &"CREDIT_ANTHONY_SEALES_CAPS", &"CREDIT_SPENCER_SHERMAN_CAPS" ); + addCenterTriple( &"CREDIT_CHRISTOPHER_SIAPERAS_CAPS", &"CREDIT_JEREMY_SMITH_CAPS", &"CREDIT_MICHAEL_STEFFAN_CAPS" ); + addCenterTriple( &"CREDIT_JASON_STRAUMAN_CAPS", &"CREDIT_BYRON_TAYLOR_CAPS", &"CREDIT_JASON_VEGA_CAPS" ); + addCenterTriple( &"CREDIT_JOHN_VINSON_CAPS", &"CREDIT_BYRON_WEDDERBURN_CAPS", &"CREDIT_BRIAN_WILLIAMS_CAPS" ); + addCenterTriple( &"CREDIT_CHRIS_WOLF_CAPS", &"CREDIT_ROSS_YANCEY_CAPS", &"CREDIT_ROBERT_YI_CAPS" ); + addCenterTriple( &"CREDIT_MOISES_ZET_CAPS", "", &"CREDIT_GREG_ZHENG_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_NIGHT_SHIFT_LEAD_QA_FUNCTIONALITY", &"CREDIT_BARO_JUNG_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_NIGHT_SHIFT_PROJECT_LEAD", &"CREDIT_TOM_CHUA_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_NIGHT_SHIFT_SENIOR_LEAD", &"CREDIT_PAUL_COLBERT_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_NIGHT_SHIFT_MANAGER_QA", &"CREDIT_ADAM_HARTSFIELD_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_NIGHT_SHIFT_FLOOR_LEADS", &"CREDIT_JULIUS_HIPOLITO_CAPS" ); + addCenterName( &"CREDIT_ELIAS_JIMENEZ_CAPS" ); + addCenterName( &"CREDIT_JAY_MENCONI_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_NIGHT_SHIFT_QA_TEST_TEAM" ); + addSpaceSmall(); + addCenterNameDouble( &"CREDIT_KEVIN_ARREAGA_CAPS", &"CREDIT_TIFFANY_BEHJOHN_ASGHARY" ); + addCenterNameDouble( &"CREDIT_BENJAMIN_BARBER_CAPS", &"CREDIT_GERALD_BECKER_CAPS" ); + addCenterNameDouble( &"CREDIT_NIYA_GREEN_CAPS", &"CREDIT_RANDALL_HERMAN_CAPS" ); + addCenterNameDouble( &"CREDIT_ANDREW_JONES_CAPS", &"CREDIT_JEFF_MITCHELL_CAPS" ); + addCenterNameDouble( &"CREDIT_JIMMIE_POTTS_CAPS", &"CREDIT_ARON_SCHOOLING_CAPS" ); + addCenterNameDouble( &"CREDIT_AARON_SMITH_CAPS", &"CREDIT_DENNIS_SOH_CAPS" ); + addCenterNameDouble( &"CREDIT_JORGE_VALLADARES_CAPS", &"CREDIT_JIMMY_YANG_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_TRG_SENIOR_MANAGER", &"CREDIT_CHRISTOPHER_WILSON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_TRG_SUBMISSIONS_LEAD", &"CREDIT_DAN_NICHOLS_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_TRG_PLATFORM_LEAD", &"CREDIT_MARC_VILLANUEVA_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_TRG_PROJECT_LEAD", &"CREDIT_JOAQUIN_MEZA_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_CRG_PROJECT_LEAD", &"CREDIT_JEF_SEDIVY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_TRG_FLOOR_LEADS", &"CREDIT_JARED_BACA_CAPS" ); + addCenterName( &"CREDIT_TEAK_HOLLEY_CAPS" ); + addCenterName( &"CREDIT_DAVID_WILKINSON_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_TRG_TESTERS" ); + addSpaceSmall(); + addCenterNameDouble( &"CREDIT_WILLIAM_CAMACHO_CAPS", &"CREDIT_PISOTH_CHHAM_CAPS" ); + addCenterNameDouble( &"CREDIT_JASON_GARZA_CAPS", &"CREDIT_CHRISTIAN_HAILE_CAPS" ); + addCenterNameDouble( &"CREDIT_ALEX_HIRSCH_CAPS", &"CREDIT_MARTIN_QUINN_CAPS" ); + addCenterNameDouble( &"CREDIT_RHONDA_RAMIREZ_CAPS", &"CREDIT_JAMES_ROSE_CAPS" ); + addCenterNameDouble( &"CREDIT_MARK_RUZICKA_CAPS", &"CREDIT_JACOB_ZWIRN_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_TRG_PLATFORM_LEAD", &"CREDIT_KYLE_CAREY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_TRG_PROJECT_LEAD", &"CREDIT_JASON_HARRIS_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_TRG_FLOOR_LEADS", &"CREDIT_KEITH_KODAMA_CAPS" ); + addCenterName( &"CREDIT_JON_SHELTMIRE_CAPS" ); + addCenterName( &"CREDIT_TOMO_SHIKAMI_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_TRG_TESTERS" ); + addSpaceSmall(); + addCenterNameDouble( &"CREDIT_BENJAMIN_ABEL_CAPS", &"CREDIT_MELVIN_ALLEN_CAPS" ); + addCenterNameDouble( &"CREDIT_ADAM_AZAMI_CAPS", &"CREDIT_BRIAN_BAKER_CAPS" ); + addCenterNameDouble( &"CREDIT_BRYAN_BERRI_CAPS", &"CREDIT_SCOTT_BORAKOVE_CAPS" ); + addCenterNameDouble( &"CREDIT_COLIN_KAWAKAMI_CAPS", &"CREDIT_RYAN_MCCULLOUGH_CAPS" ); + addCenterNameDouble( &"CREDIT_JOHN_MCCURRY_CAPS", &"CREDIT_KIRT_SANCHEZ_CAPS" ); + addCenterNameDouble( &"CREDIT_EDGAR_SUNGA_CAPS", &"" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_LEAD_MULTIPLAYER_LAB", &"CREDIT_GARRETT_OSHIRO_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_FLOOR_LEADS_MULTIPLAYER", &"CREDIT_DOV_CARSON_CAPS" ); + addCenterName( &"CREDIT_LEONARD_RODRIGUEZ_CAPS" ); + addCenterName( &"CREDIT_MICHAEL_THOMSEN_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_MULTIPLAYER_LAB_TESTERS" ); + addSpaceSmall(); + addCenterNameDouble( &"CREDIT_MIKE_ASHTON_CAPS", &"CREDIT_JAN_ERICKSON_CAPS" ); + addCenterNameDouble( &"CREDIT_MATTHEW_FAWBUSH_CAPS", &"CREDIT_FRANCO_FERNANDO_CAPS" ); + addCenterNameDouble( &"CREDIT_ARMOND_GOODIN_CAPS", &"CREDIT_MARIO_IBARRA_CAPS" ); + addCenterNameDouble( &"CREDIT_JESSIE_JONES_CAPS", &"CREDIT_JAEMIN_KANG_CAPS" ); + addCenterNameDouble( &"CREDIT_BRIAN_LAY_CAPS", &"CREDIT_LUKE_LOUDERBACK_CAPS" ); + addCenterNameDouble( &"CREDIT_KAGAN_MAEVERS_CAPS", &"CREDIT_MATT_RYAN_CAPS" ); + addCenterNameDouble( &"CREDIT_JONATHAN_SADKA_CAPS", &"" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_ASSISTED_NETWORK_LAB", &"CREDIT_SEAN_OLSON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_LEAD_NETWORK_LAB", &"CREDIT_FRANCIS_JIMENEZ_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_LEAD_NETWORK_LAB", &"CREDIT_CHRIS_KEIM_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_COMPATIBILITY_TESTERS", &"CREDIT_KEITH_WEBER_CAPS" ); + addCenterName( &"CREDIT_WILLIAM_WHALEY_CAPS" ); + addCenterName( &"CREDIT_BRANDON_GILBRECH_CAPS" ); + addCenterName( &"CREDIT_MIKE_SALWET_CAPS" ); + addCenterName( &"CREDIT_DAMON_COLLAZO_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_COMPATIBILITY_SPECIALIST", &"CREDIT_JON_AN_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_COMPATIBILITY", &"CREDIT_NEAL_BARIZO_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_LEAD_COMPATIBILITY", &"CREDIT_CHRIS_NEAL_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MANAGER_QA_LOCALIZATIONS", &"CREDIT_DAVID_HICKEY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_QA_LOCALIZATION_LEAD", &"CREDIT_CONOR_HARLOW_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_QA_LOCALIZATION_TESTERS" ); + addSpaceSmall(); + addCenterNameDouble( &"CREDIT_ANDREA_APRILE_CAPS", &"CREDIT_SANDRO_ARAFA_CAPS" ); + addCenterNameDouble( &"CREDIT_HUGO_BELLET_CAPS", &"CREDIT_DANIELE_CELEGHIN_CAPS" ); + addCenterNameDouble( &"CREDIT_CARLOS_MARTIN_CHIRINO_CAPS", &"CREDIT_ADRIAN_ECHEGOYEN_CAPS" ); + addCenterNameDouble( &"CREDIT_JORGE_FERNANDEZ_CAPS", &"CREDIT_DANIEL_GARCIA_CAPS" ); + addCenterNameDouble( &"CREDIT_CHRISTOPHE_GEVERT_CAPS", &"CREDIT_FRANZ_HEINRICH_CAPS" ); + addCenterNameDouble( &"CREDIT_CHRISTIAN_HELD_CAPS", &"CREDIT_JACK_OHARA_CAPS" ); + addCenterNameDouble( &"CREDIT_CLEMENT_PRIM_CAPS", &"CREDIT_DENNIS_STIFFEL_CAPS" ); + addCenterNameDouble( &"CREDIT_IGNAZIO_IVAN_VIRGILIO_CAPS", &"" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_BURN_ROOM_COORDINATOR", &"CREDIT_JOULE_MIDDLETON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_BURN_ROOM_STAFF", &"CREDIT_DANNY_FENG_CAPS" ); + addCenterName( &"CREDIT_KAI_HSU_CAPS" ); + addCenterName( &"CREDIT_SEAN_KIM_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MANAGER_CSQA_TECHNOLOGY", &"CREDIT_INDRA_YEE_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_SENIOR_LEAD_QA_MIS", &"CREDIT_DAVE_GARCIAGOMEZ_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_QA_MIS_TECHNICIANS", &"CREDIT_TEDDY_HWANG_CAPS" ); + addCenterName( &"CREDIT_BRIAN_MARTIN_CAPS" ); + addCenterName( &"CREDIT_JEREMY_TORRES_CAPS" ); + addCenterName( &"CREDIT_LAWRENCE_WEI_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_EQUIPMENT_COORDINATORS", &"CREDIT_KARLENE_BROWN_CAPS" ); + addCenterName( &"CREDIT_LONG_LE_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PROJECT_LEAD_DATABASE", &"CREDIT_JEREMY_RICHARD_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_FLOOR_LEAD_DATABASE_GROUP", &"CREDIT_KELLY_HUFFINE_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_DATABASE_GROUP_ADMINISTRATORS", &"CREDIT_JACOB_PORTER_CAPS" ); + addCenterName( &"CREDIT_TIMOTHY_TOLEDO_CAPS" ); + addCenterName( &"CREDIT_GEOFF_OLSEN_CAPS" ); + addCenterName( &"CREDIT_CHRISTOPHER_SHANLEY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_STAFFING_SUPERVISOR", &"CREDIT_JENNIFER_VITIELLO_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_QA_OPERATIONS_COORDINATOR", &"CREDIT_JEREMY_SHORTELL_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_MANAGER_RESOURCE_ADMINISTRATION", &"CREDIT_NADINE_THEUZILLOT_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_ADMINISTRATIVE_ASSISTANT", &"CREDIT_NIKKI_GUILLOTE_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_STAFFING_ASSISTANT", &"CREDIT_LORI_LORENZO_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_VOLT_ONSITE_PROGRAM_MANAGER", &"CREDIT_RACHEL_OVERTON_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_VOLT_ONSITE_PROGRAM_COORDINATOR", &"CREDIT_AILEEN_GALEAS_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_CUSTOMER_SUPPORT_MANAGERS", &"CREDIT_GARY_BOLDUC_CAPS" ); + addCenterName( &"CREDIT_MICHAEL_HILL_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_DIRECTOR_QA_FUNCTIONALITY", &"CREDIT_MARILENA_RIXFORD_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_DIRECTOR_TECHNICAL_REQUIREMENTS", &"CREDIT_JAMES_GALLOWAY_CAPS" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_VICE_PRESIDENT_QUALITY", &"CREDIT_RICH_ROBINSON_CAPS" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_ACTIVISION_QA_SPECIAL" ); + addSpaceSmall(); + addCenterNameDouble( &"CREDIT_MATT_MCCLURE_CAPS", &"CREDIT_JOHN_ROSSER_CAPS" ); + addCenterNameDouble( &"CREDIT_ANTHONY_KOROTKO_CAPS", &"CREDIT_BRAD_SAAVEDRA_CAPS" ); + addCenterNameDouble( &"CREDIT_JASON_POTTER_CAPS", &"CREDIT_HENRY_VILLANUEVA_CAPS" ); + addCenterNameDouble( &"CREDIT_PAUL_WILLIAMS_CAPS", &"CREDIT_THOM_DENICK_CAPS" ); + addCenterNameDouble( &"CREDIT_FRANK_SO_CAPS", &"CREDIT_WILLIE_BOLTON_CAPS" ); + addCenterNameDouble( &"CREDIT_ALEX_COLEMAN_CAPS", &"CREDIT_JEREMY_SHORTELL_CAPS" ); + addSpace(); + addSpace(); + addCenterDual( &"CREDIT_MANUAL_DESIGN", &"CREDIT_IGNITED_MINDS_LLC" ); + addSpaceSmall(); + addCenterDual( &"CREDIT_PACKAGING_DESIGN", &"CREDIT_PETROL" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_USES_BINK_VIDEO_COPYRIGHT" ); + addSpace(); + if( level.console && !level.xenon ) + addCenterHeading( &"CREDIT_THIS_PRODUCT_USES_FMOD" ); + else + addCenterHeading( &"CREDIT_USES_MILES_SOUND_SYSTEM" ); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_FONTS_LICENSED_FROM" ); + addSpaceSmall(); + addCenterHeading( &"CREDIT_T26_DIGITAL_TYPE_FOUNDRY" ); + addCenterHeading( &"CREDIT_INTERNATIONAL_TYPEFACE" ); + addCenterHeading( &"CREDIT_MONOTYPE_IMAGING" ); + addSpace(); + addSpace(); + addSpace(); + addSpace(); + addSpace(); + addSpace(); + addCenterHeading( &"CREDIT_THE_CHARACTERS_AND_EVENTS1" ); + addCenterHeading( &"CREDIT_THE_CHARACTERS_AND_EVENTS2" ); +} +addLeftTitle( title, textscale ) +{ + precacheString( title ); + if( !isdefined( textscale ) ) + textscale = level.linesize; + temp = spawnstruct(); + temp.type = "lefttitle"; + temp.title = title; + temp.textscale = textscale; + level.linelist[ level.linelist.size ] = temp; +} +addLeftName( name, textscale ) +{ + precacheString( name ); + if( !isdefined( textscale ) ) + textscale = level.linesize; + temp = spawnstruct(); + temp.type = "leftname"; + temp.name = name; + temp.textscale = textscale; + level.linelist[ level.linelist.size ] = temp; +} +addSubLeftTitle( title, textscale ) +{ + addLeftName( title, textscale ); +} +addSubLeftName( name, textscale ) +{ + precacheString( name ); + if( !isdefined( textscale ) ) + textscale = level.linesize; + temp = spawnstruct(); + temp.type = "subleftname"; + temp.name = name; + temp.textscale = textscale; + level.linelist[ level.linelist.size ] = temp; +} +addRightTitle( title, textscale ) +{ + precacheString( title ); + if( !isdefined( textscale ) ) + textscale = level.linesize; + temp = spawnstruct(); + temp.type = "righttitle"; + temp.title = title; + temp.textscale = textscale; + level.linelist[ level.linelist.size ] = temp; +} +addRightName( name, textscale ) +{ + precacheString( name ); + if( !isdefined( textscale ) ) + textscale = level.linesize; + temp = spawnstruct(); + temp.type = "rightname"; + temp.name = name; + temp.textscale = textscale; + level.linelist[ level.linelist.size ] = temp; +} +addCenterHeading( heading, textscale ) +{ + precacheString( heading ); + if( !isdefined( textscale ) ) + textscale = level.linesize; + temp = spawnstruct(); + temp.type = "centerheading"; + temp.heading = heading; + temp.textscale = textscale; + level.linelist[ level.linelist.size ] = temp; +} +addCenterName( name, textscale ) +{ + precacheString( name ); + if( !isdefined( textscale ) ) + textscale = level.linesize; + temp = spawnstruct(); + temp.type = "centername"; + temp.name = name; + temp.textscale = textscale; + level.linelist[ level.linelist.size ] = temp; +} +addCenterNameDouble( name1, name2, textscale ) +{ + precacheString( name1 ); + precacheString( name2 ); + if( !isdefined( textscale ) ) + textscale = level.linesize; + temp = spawnstruct(); + temp.type = "centernamedouble"; + temp.name1 = name1; + temp.name2 = name2; + temp.textscale = textscale; + level.linelist[ level.linelist.size ] = temp; +} +addCenterDual( title, name, textscale ) +{ + precacheString( title ); + precacheString( name ); + if( !isdefined( textscale ) ) + textscale = level.linesize; + temp = spawnstruct(); + temp.type = "centerdual"; + temp.title = title; + temp.name = name; + temp.textscale = textscale; + level.linelist[ level.linelist.size ] = temp; +} +addCenterTriple( name1, name2, name3, textscale ) +{ + precacheString( name1 ); + precacheString( name2 ); + precacheString( name3 ); + if( !isdefined( textscale ) ) + textscale = level.linesize; + temp = spawnstruct(); + temp.type = "centertriple"; + temp.name1 = name1; + temp.name2 = name2; + temp.name3 = name3; + temp.textscale = textscale; + level.linelist[ level.linelist.size ] = temp; +} +addSpace() +{ + temp = spawnstruct(); + temp.type = "space"; + level.linelist[ level.linelist.size ] = temp; +} +addSpaceSmall() +{ + temp = spawnstruct(); + temp.type = "spacesmall"; + level.linelist[ level.linelist.size ] = temp; +} +addCenterImage( image, width, height, delay ) +{ + precacheShader( image ); + temp = spawnstruct(); + temp.type = "centerimage"; + temp.image = image; + temp.width = width; + temp.height = height; + if ( isdefined( delay ) ) + temp.delay = delay; + level.linelist[ level.linelist.size ] = temp; +} +addLeftImage( image, width, height, delay ) +{ + precacheShader( image ); + temp = spawnstruct(); + temp.type = "leftimage"; + temp.image = image; + temp.width = width; + temp.height = height; + if ( isdefined( delay ) ) + temp.delay = delay; + level.linelist[ level.linelist.size ] = temp; +} +playCredits() +{ + for ( i = 0; i < level.linelist.size; i++ ) + { + delay = 0.5; + type = level.linelist[ i ].type; + if ( type == "centerimage" ) + { + image = level.linelist[ i ].image; + width = level.linelist[ i ].width; + height = level.linelist[ i ].height; + temp = newHudElem(); + temp SetShader( image, width, height ); + temp.alignX = "center"; + temp.horzAlign = "center"; + temp.x = 0; + temp.y = 480; + temp.sort = 2; + temp thread delayDestroy( 22.5 ); + temp moveOverTime( 22.5 ); + temp.y = -120; + if ( isdefined( level.linelist[ i ].delay) ) + delay = level.linelist[ i ].delay; + else + delay = ( ( 0.037 * height ) ); + } + else if ( type == "leftimage" ) + { + image = level.linelist[ i ].image; + width = level.linelist[ i ].width; + height = level.linelist[ i ].height; + temp = newHudElem(); + temp SetShader( image, width, height ); + temp.alignX = "center"; + temp.horzAlign = "left"; + temp.x = 128; + temp.y = 480; + temp.sort = 2; + temp thread delayDestroy( 22.5 ); + temp moveOverTime( 22.5 ); + temp.y = -120; + delay = ( ( 0.037 * height ) ); + } + else if ( type == "lefttitle" ) + { + title = level.linelist[ i ].title; + textscale = level.linelist[ i ].textscale; + temp = newHudElem(); + temp setText( title ); + temp.alignX = "left"; + temp.horzAlign = "left"; + temp.x = 28; + temp.y = 480; + temp.font = "small"; + temp.fontScale = textscale; + temp.sort = 2; + temp.glowColor = ( 0.3, 0.6, 0.3 ); + temp.glowAlpha = 1; + temp thread delayDestroy( 22.5 ); + temp moveOverTime( 22.5 ); + temp.y = -120; + } + else if ( type == "leftname" ) + { + name = level.linelist[ i ].name; + textscale = level.linelist[ i ].textscale; + temp = newHudElem(); + temp setText( name ); + temp.alignX = "left"; + temp.horzAlign = "left"; + temp.x = 60; + temp.y = 480; + temp.font = "small"; + temp.fontScale = textscale; + temp.sort = 2; + temp.glowColor = ( 0.3, 0.6, 0.3 ); + temp.glowAlpha = 1; + temp thread delayDestroy( 22.5 ); + temp moveOverTime( 22.5 ); + temp.y = -120; + } + else if ( type == "subleftname" ) + { + name = level.linelist[ i ].name; + textscale = level.linelist[ i ].textscale; + temp = newHudElem(); + temp setText( name ); + temp.alignX = "left"; + temp.horzAlign = "left"; + temp.x = 92; + temp.y = 480; + temp.font = "small"; + temp.fontScale = textscale; + temp.sort = 2; + temp.glowColor = ( 0.3, 0.6, 0.3 ); + temp.glowAlpha = 1; + temp thread delayDestroy( 22.5 ); + temp moveOverTime( 22.5 ); + temp.y = -120; + } + else if ( type == "righttitle" ) + { + title = level.linelist[ i ].title; + textscale = level.linelist[ i ].textscale; + temp = newHudElem(); + temp setText( title ); + temp.alignX = "left"; + temp.horzAlign = "right"; + temp.x = -132; + temp.y = 480; + temp.font = "small"; + temp.fontScale = textscale; + temp.sort = 2; + temp.glowColor = ( 0.3, 0.6, 0.3 ); + temp.glowAlpha = 1; + temp thread delayDestroy( 22.5 ); + temp moveOverTime( 22.5 ); + temp.y = -120; + } + else if ( type == "rightname" ) + { + name = level.linelist[ i ].name; + textscale = level.linelist[ i ].textscale; + temp = newHudElem(); + temp setText( name ); + temp.alignX = "left"; + temp.horzAlign = "right"; + temp.x = -100; + temp.y = 480; + temp.font = "small"; + temp.fontScale = textscale; + temp.sort = 2; + temp.glowColor = ( 0.3, 0.6, 0.3 ); + temp.glowAlpha = 1; + temp thread delayDestroy( 22.5 ); + temp moveOverTime( 22.5 ); + temp.y = -120; + } + else if ( type == "centerheading" ) + { + heading = level.linelist[ i ].heading; + textscale = level.linelist[ i ].textscale; + temp = newHudElem(); + temp setText( heading ); + temp.alignX = "center"; + temp.horzAlign = "center"; + temp.x = 0; + temp.y = 480; + temp.font = "small"; + temp.fontScale = textscale; + temp.sort = 2; + temp.glowColor = ( 0.3, 0.6, 0.3 ); + temp.glowAlpha = 1; + temp thread delayDestroy( 22.5 ); + temp moveOverTime( 22.5 ); + temp.y = -120; + } + else if ( type == "centerdual" ) + { + title = level.linelist[ i ].title; + name = level.linelist[ i ].name; + textscale = level.linelist[ i ].textscale; + temp1 = newHudElem(); + temp1 setText( title ); + temp1.alignX = "right"; + temp1.horzAlign = "center"; + temp1.x = -8; + temp1.y = 480; + temp1.font = "small"; + temp1.fontScale = textscale; + temp1.sort = 2; + temp1.glowColor = ( 0.3, 0.6, 0.3 ); + temp1.glowAlpha = 1; + temp2 = newHudElem(); + temp2 setText( name ); + temp2.alignX = "left"; + temp2.horzAlign = "center"; + temp2.x = 8; + temp2.y = 480; + temp2.font = "small"; + temp2.fontScale = textscale; + temp2.sort = 2; + temp2.glowColor = ( 0.3, 0.6, 0.3 ); + temp2.glowAlpha = 1; + temp1 thread delayDestroy( 22.5 ); + temp1 moveOverTime( 22.5 ); + temp1.y = -120; + temp2 thread delayDestroy( 22.5 ); + temp2 moveOverTime( 22.5 ); + temp2.y = -120; + } + else if ( type == "centertriple" ) + { + name1 = level.linelist[ i ].name1; + name2 = level.linelist[ i ].name2; + name3 = level.linelist[ i ].name3; + textscale = level.linelist[ i ].textscale; + temp1 = newHudElem(); + temp1 setText( name1 ); + temp1.alignX = "center"; + temp1.horzAlign = "center"; + temp1.x = -160; + temp1.y = 480; + temp1.font = "small"; + temp1.fontScale = textscale; + temp1.sort = 2; + temp1.glowColor = ( 0.3, 0.6, 0.3 ); + temp1.glowAlpha = 1; + temp2 = newHudElem(); + temp2 setText( name2 ); + temp2.alignX = "center"; + temp2.horzAlign = "center"; + temp2.x = 0; + temp2.y = 480; + temp2.font = "small"; + temp2.fontScale = textscale; + temp2.sort = 2; + temp2.glowColor = ( 0.3, 0.6, 0.3 ); + temp2.glowAlpha = 1; + temp3 = newHudElem(); + temp3 setText( name3 ); + temp3.alignX = "center"; + temp3.horzAlign = "center"; + temp3.x = 160; + temp3.y = 480; + temp3.font = "small"; + temp3.fontScale = textscale; + temp3.sort = 2; + temp3.glowColor = ( 0.3, 0.6, 0.3 ); + temp3.glowAlpha = 1; + temp1 thread delayDestroy( 22.5 ); + temp1 moveOverTime( 22.5 ); + temp1.y = -120; + temp2 thread delayDestroy( 22.5 ); + temp2 moveOverTime( 22.5 ); + temp2.y = -120; + temp3 thread delayDestroy( 22.5 ); + temp3 moveOverTime( 22.5 ); + temp3.y = -120; + } + else if ( type == "centername" ) + { + name = level.linelist[ i ].name; + textscale = level.linelist[ i ].textscale; + temp = newHudElem(); + temp setText( name ); + temp.alignX = "left"; + temp.horzAlign = "center"; + temp.x = 8; + temp.y = 480; + temp.font = "small"; + temp.fontScale = textscale; + temp.sort = 2; + temp.glowColor = ( 0.3, 0.6, 0.3 ); + temp.glowAlpha = 1; + temp thread delayDestroy( 22.5 ); + temp moveOverTime( 22.5 ); + temp.y = -120; + } + else if ( type == "centernamedouble" ) + { + name1 = level.linelist[ i ].name1; + name2 = level.linelist[ i ].name2; + textscale = level.linelist[ i ].textscale; + temp1 = newHudElem(); + temp1 setText( name1 ); + temp1.alignX = "center"; + temp1.horzAlign = "center"; + temp1.x = -80; + temp1.y = 480; + temp1.font = "small"; + temp1.fontScale = textscale; + temp1.sort = 2; + temp1.glowColor = ( 0.3, 0.6, 0.3 ); + temp1.glowAlpha = 1; + temp2 = newHudElem(); + temp2 setText( name2 ); + temp2.alignX = "center"; + temp2.horzAlign = "center"; + temp2.x = 80; + temp2.y = 480; + temp2.font = "small"; + temp2.fontScale = textscale; + temp2.sort = 2; + temp2.glowColor = ( 0.3, 0.6, 0.3 ); + temp2.glowAlpha = 1; + temp1 thread delayDestroy( 22.5 ); + temp1 moveOverTime( 22.5 ); + temp1.y = -120; + temp2 thread delayDestroy( 22.5 ); + temp2 moveOverTime( 22.5 ); + temp2.y = -120; + } + else if ( type == "spacesmall" ) + delay = 0.1875; + else + assert( type == "space" ); + wait delay; + } + flag_set( "credits_ended" ); +} +delayDestroy( duration ) +{ + wait duration; + self destroy(); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_damagefeedback.gsc b/BO1/PC/ZM/maps/_damagefeedback.gsc new file mode 100644 index 0000000..fe942cf Binary files /dev/null and b/BO1/PC/ZM/maps/_damagefeedback.gsc differ diff --git a/BO1/PC/ZM/maps/_dds.gsc b/BO1/PC/ZM/maps/_dds.gsc new file mode 100644 index 0000000..91c06ca --- /dev/null +++ b/BO1/PC/ZM/maps/_dds.gsc @@ -0,0 +1,1265 @@ + +#include common_scripts\utility; +#include animscripts\utility; +#include maps\_utility; +dds_init() +{ + level.dds = spawnstruct(); + level.dds.heartbeat = 0.25; + level.dds.variant_limit = 18; + level.dds.category_backoff_limit = 6; + level.dds.scripted_line_delay = 2; + level.dds.response_distance_min = 500; + level.dds.history = []; + level.dds.history_count = 15; + level.dds.history_index = 0; + level.dds.player_character_name = "mas"; + level.dds.event_override_name = undefined; + level.dds.event_override_probability = .5; + level.dds.response_wait = 0.25; + level.dds.response_wait_axis = 0.25; + init_dds_countryIDs(); + init_dds_flags(); + init_dds_categories(); + init_dds_categories_axis(); + init_dds_active_events(); +} +init_dds_countryIDs( voice, dds_label ) +{ + level.dds.characterID_count = 0; + level.dds.character_names = []; + level.dds.character_names["allies"] = array( "american", "russian", "russian_english" ); + level.dds.character_names["axis"] = array( "russian", "vietnamese", "cuban", "british", "german" ); + level.dds.character_names["default"] = array_combine( level.dds.character_names["allies"], level.dds.character_names["axis"] ); + level.dds.countryIDs = []; + add_dds_countryID( "american", "us", 5 ); + add_dds_countryID( "russian", "ru", 4 ); + add_dds_countryID( "vietnamese", "vc", 4 ); + add_dds_countryID( "cuban", "cb", 4 ); + add_dds_countryID( "german", "ge", 3 ); + add_dds_countryID( "british", "br", 2 ); + add_dds_countryID( "russian_english", "rn", 3 ); +} +add_dds_countryID( voice, dds_label, max_voices ) +{ + level.dds.countryIDs[voice] = SpawnStruct(); + level.dds.countryIDs[voice].label = dds_label; + level.dds.countryIDs[voice].count = 0; + level.dds.countryIDs[voice].max_voices = max_voices; +} +init_dds_flags() +{ + flag_init( "dds_running_allies" ); + level thread dds_send_team_notify_on_disable( "allies" ); + flag_init( "dds_running_axis" ); + level thread dds_send_team_notify_on_disable( "axis" ); +} +init_dds_categories() +{ + level.dds.categories = []; + add_dds_category( "low_health", "health_low", 1.0, "", true, ::dds_sort_ent_dist, ::get_nearest_not_plr, 5000, 8, 1, true ); + add_dds_category( "react_grenade", "react_grenade", 1.25, "grenade_rspns",true, ::dds_sort_ent_dist, ::get_nearest, 5000, .8, 0.5, false ); + add_dds_category( "thrt", "thrt", 3, "thrt_rspns", true, ::dds_sort_ent_dist, ::get_nearest_not_plr, 5000, .75, 2, true ); + add_dds_category( "thrt_rspns", "rspns_lm", 3, "", true, ::dds_sort_ent_dist, ::get_nearest, 5000, .7, 0.5, true ); + add_dds_category( "multikill", "multkill", 1.5, "kill_rspns", true, ::dds_sort_ent_dist, ::get_nearest_not_plr, 5000, 1, 0.5, true ); + add_dds_category( "fragout", "act_fragout", 0.5, "action_rspns", true, ::dds_sort_ent_dist, ::get_self_ent, 5000, .8, 0.5, true ); + add_dds_category( "kill_confirm", "killfirm", 2, "kill_rspns", true, ::dds_sort_ent_dist, ::get_nearest, 5000, .3, 0.5, true ); + add_dds_category( "kill_rspns", "rspns_killfirm", 2, "", true, ::dds_sort_ent_dist, ::get_nearest, 5000, .7, 0, true ); + add_dds_category( "action_rspns", "rspns_act", 3, "", true, ::dds_sort_ent_dist, ::get_nearest, 5000, .6, 0.5, true ); + add_dds_category( "casualty", "casualty", .75, "", true, ::dds_sort_ent_dist, ::get_nearest_not_plr, 800, .9, 1, true ); + add_dds_category( "reload", "act_reload", 2, "action_rspns", true, ::dds_sort_ent_dist, ::get_self_ent, 5000, .2, 0.5, false ); + add_dds_category( "smokeout", "act_smokeout", 1.25, "action_rspns", true, ::dds_sort_ent_dist, ::get_self_ent, 5000, 1, 1, true ); + add_dds_category( "headshot", "hs", .75, "kill_rspns", true, ::dds_sort_ent_dist, ::get_attacker, 1000, 1, 1, true ); + add_dds_category( "friendly_fire", "frndly_fire", 1.25, "", true, ::dds_sort_ent_dist, ::get_self_ent, 5000, .9, 1, true ); + add_dds_category( "civ_fire", "frndly_fire", 1, "", true, ::dds_sort_ent_dist, ::get_nearest_not_plr, 5000, .9, 1, true ); + add_dds_category( "kill_melee", "kill_melee", .75, "", true, ::dds_sort_ent_dist, ::get_attacker, 400, 1, 0.5, false ); +} +init_dds_categories_axis() +{ + level.dds.categories_axis = []; + add_dds_category_axis( "react_grenade", "react_grenade", 1, "grenade_rspns",true, ::dds_sort_ent_dist, ::get_nearest, 5000, 1, 0.5 ); + add_dds_category_axis( "fragout", "act_fragout", .5, "action_rspns", true, ::dds_sort_ent_dist, ::get_self_ent, 5000, .7, 2 ); + add_dds_category_axis( "kill_confirm", "killfirm", 1, "kill_rspns", true, ::dds_sort_ent_dist, ::get_nearest, 5000, .9, 0.5 ); + add_dds_category_axis( "kill_rspns", "rspns_killfirm", 1, "", true, ::dds_sort_ent_dist, ::get_nearest, 5000, .7, 0.5 ); + add_dds_category_axis( "thrt", "rspns_lm", 2, "thrt_rspns", true, ::dds_sort_ent_dist, ::get_nearest, 5000, 1, 0.5 ); + add_dds_category_axis( "thrt_rspns", "rspns_lm", 2, "", true, ::dds_sort_ent_dist, ::get_nearest, 5000, .9, 0.75 ); + add_dds_category_axis( "action_rspns", "rspns_act", .75, "", true, ::dds_sort_ent_dist, ::get_nearest, 5000, .8, 1 ); + add_dds_category_axis( "casualty", "casualty", 1, "", true, ::dds_sort_ent_dist, ::get_nearest_not_plr, 1500, 1, 3 ); + add_dds_category_axis( "low_health", "health_low", 1, "", true, ::dds_sort_ent_dist, ::get_nearest_not_plr, 3500, 1, 1 ); + add_dds_category_axis( "reload", "act_reload", .50, "action_rspns", true, ::dds_sort_ent_dist, ::get_self_ent, 2400, .3, 3 ); + add_dds_category_axis( "smokeout", "act_smokeout", .5, "action_rspns", true, ::dds_sort_ent_dist, ::get_self_ent, 2600, 1, 1 ); + add_dds_category_axis( "headshot", "hs", .75, "kill_rspns", true, ::dds_sort_ent_dist, ::get_attacker, 2000, .8, 1 ); + add_dds_category_axis( "kill_melee", "kill_melee", .25, "", true, ::dds_sort_ent_dist, ::get_attacker, 400, 1, 3 ); +} +add_dds_category( name, alias_name, duration, rspns_cat_name, clear_category_on_action_success, priority_sort, get_talker_func, distance, probability, timeout_reset, should_squelch ) +{ + new_category = spawnStruct(); + new_category.name = name; + new_category.alias_name = alias_name; + new_category.duration = duration; + new_category.priority_sort = priority_sort; + new_category.probability = probability; + new_category.get_talker_func = get_talker_func; + new_category.speaker_distance = distance; + new_category.last_time = GetTime(); + new_category.backoff_count = 0; + new_category.timeout = randomInt( 10 ); + new_category.last_timeout = new_category.timeout; + new_category.timeout_reset = timeout_reset; + new_category.rspns_cat_name = rspns_cat_name; + new_category.clear_on_action_success = clear_category_on_action_success; + new_category.should_squelch = should_squelch; + level.dds.categories[level.dds.categories.size] = new_category; +} +add_dds_category_axis( name, alias_name, duration, rspns_cat_name, clear_category_on_action_success, priority_sort, get_talker_func, distance, probability, timeout_reset ) +{ + new_category_axis = spawnStruct(); + new_category_axis.name = name; + new_category_axis.alias_name = alias_name; + new_category_axis.duration = duration; + new_category_axis.priority_sort = priority_sort; + new_category_axis.probability = probability; + new_category_axis.get_talker_func = get_talker_func; + new_category_axis.speaker_distance = distance; + new_category_axis.last_time = GetTime(); + new_category_axis.backoff_count = 0; + new_category_axis.timeout = randomInt( 10 ); + new_category_axis.last_timeout = new_category_axis.timeout; + new_category_axis.timeout_reset = timeout_reset; + new_category_axis.rspns_cat_name = rspns_cat_name; + new_category_axis.clear_on_action_success = clear_category_on_action_success; + level.dds.categories_axis[level.dds.categories_axis.size] = new_category_axis; +} +init_dds_active_events() +{ + level.dds.active_events = []; + level.dds.active_events_axis = []; + for( i = 0; i < level.dds.categories.size; i++ ) + { + level.dds.active_events[level.dds.categories[i].name] = []; + } + for( i = 0; i < level.dds.categories_axis.size; i++ ) + { + level.dds.active_events_axis[level.dds.categories_axis[i].name] = []; + } +} +dds_clear_old_expired_events() +{ + for( i = 0; i < level.dds.categories.size; i ++) + { + category = level.dds.categories[i]; + for( j = 0; j < level.dds.active_events[category.name].size; j++ ) + { + level.dds.active_events[category.name][j].duration -= level.dds.heartbeat; + if( level.dds.active_events[category.name][j].duration <= 0 || + level.dds.active_events[category.name][j].clear_event_on_prob ) + { + level.dds.active_events[category.name] = array_remove( level.dds.active_events[category.name], level.dds.active_events[category.name][j] ); + } + } + } +} +dds_clear_old_expired_events_axis() +{ + for( i = 0; i < level.dds.categories_axis.size; i ++) + { + category = level.dds.categories_axis[i]; + for( j = 0; j < level.dds.active_events_axis[category.name].size; j++ ) + { + level.dds.active_events_axis[category.name][j].duration -= level.dds.heartbeat; + if( level.dds.active_events_axis[category.name][j].duration <= 0 || + level.dds.active_events_axis[category.name][j].clear_event_on_prob ) + { + level.dds.active_events_axis[category.name] = array_remove( level.dds.active_events_axis[category.name], level.dds.active_events_axis[category.name][j] ); + } + } + } +} +dds_clear_all_queued_events() +{ + for( i = 0; i < level.dds.categories.size; i ++) + { + for( j = 0; j < level.dds.active_events[level.dds.categories[i].name].size; j++ ) + { + level.dds.active_events[level.dds.categories[i].name] = []; + } + } +} +dds_clear_all_queued_events_axis() +{ + for( i = 0; i < level.dds.categories_axis.size; i ++) + { + for( j = 0; j < level.dds.active_events_axis[level.dds.categories_axis[i].name].size; j++ ) + { + level.dds.active_events_axis[level.dds.categories_axis[i].name] = []; + } + } +} +dds_main_process() +{ + if( flag( "dds_running_allies" ) ) + return; + flag_set( "dds_running_allies" ); + dds_find_threats( "allies", "axis" ); + should_delay_dds = false; + while( flag( "dds_running_allies" ) ) + { + dds_clear_old_expired_events(); + if( IsDefined( level.NumberOfImportantPeopleTalking ) && level.NumberOfImportantPeopleTalking > 0 ) + { + should_delay_dds = true; + wait( level.dds.heartbeat ); + continue; + } + if( should_delay_dds ) + { + wait( level.dds.scripted_line_delay ); + dds_clear_all_queued_events(); + should_delay_dds = false; + } + if( !dds_process_active_events() ) + { + wait( level.dds.heartbeat ); + } + else + { + wait( 0.1 ); + } + } +} +dds_main_process_axis() +{ + if( flag( "dds_running_axis" ) ) + return; + flag_set( "dds_running_axis" ); + dds_find_threats( "axis", "allies" ); + should_delay_dds = false; + while( flag( "dds_running_axis" ) ) + { + dds_clear_old_expired_events_axis(); + if( IsDefined( level.NumberOfImportantPeopleTalking ) && level.NumberOfImportantPeopleTalking > 0 ) + { + should_delay_dds = true; + wait( level.dds.heartbeat ); + continue; + } + if( should_delay_dds ) + { + wait( level.dds.scripted_line_delay ); + dds_clear_all_queued_events_axis(); + should_delay_dds = false; + } + if( dds_process_active_events_axis() ) + { + wait( level.dds.heartbeat ); + } + else + { + wait( 0.1 ); + } + } +} +dds_find_threats( us, them ) +{ + level thread dds_find_infantry_threat( us, them ); +} +dds_enable( team ) +{ + if( !IsDefined( team ) ) + { + level thread dds_main_process(); + level thread dds_main_process_axis(); + } + else + { + if( team == "allies" ) + { + level thread dds_main_process(); + } + else if( team == "axis" ) + { + level thread dds_main_process_axis(); + } + } +} +dds_disable( team ) +{ + if( !IsDefined( team ) ) + { + dds_clear_all_queued_events(); + flag_clear( "dds_running_allies" ); + dds_clear_all_queued_events_axis(); + flag_clear( "dds_running_axis" ); + } + else + { + switch( team ) + { + case "axis": + dds_clear_all_queued_events_axis(); + flag_clear( "dds_running_axis" ); + break; + case "allies": + dds_clear_all_queued_events(); + flag_clear( "dds_running_allies" ); + break; + default: + break; + } + } +} +dds_send_team_notify_on_disable( team ) +{ + while( 1 ) + { + flag_waitopen( "dds_running_" + team ); + level notify( "dds_running_" + team ); + flag_wait( "dds_running_" + team ); + } +} +is_dds_enabled() +{ + if( level.createFX_enabled || (!flag( "dds_running_allies" ) && !flag( "dds_running_axis" )) ) + { + return false; + } + return true; +} +exponent( base, power ) +{ + assert( power >= 0 ); + if( power == 0 ) + return 1; + return base * exponent( base, ( power - 1 ) ); +} +dds_process_active_events() +{ + for( i = 0; i < level.dds.categories.size; i ++ ) + { + category = level.dds.categories[i]; + if( category.timeout > 0 ) + { + category.timeout -= level.dds.heartbeat; + continue; + } + if( level.dds.active_events[category.name].size != 0 ) + { + level.dds.active_events[category.name] = [[category.priority_sort]] ( level.dds.active_events[category.name] ); + for( j = 0; j < level.dds.active_events[category.name].size; j ++ ) + { + if( randomFloat( 1 ) >= category.probability ) + { + level.dds.active_events[category.name][j].clear_event_on_prob = true; + continue; + } + if( level.dds.active_events[category.name][j].processed ) + { + continue; + } + if( dds_event_activate( level.dds.active_events[category.name][j], category.get_talker_func, category.speaker_distance, + category.rspns_cat_name, category.should_squelch ) ) + { + if( !category.timeout_reset ) + { + category.timeout = category.timeout_reset; + } + else + { + if( ( GetTime() - category.last_time ) < ( category.last_timeout * 1.5 * 1000 ) ) + { + category.backoff_count++; + if( category.backoff_count > level.dds.category_backoff_limit ) + { + category.backoff_count = level.dds.category_backoff_limit; + } + } + else + { + category.backoff_count--; + if( category.backoff_count < 0 ) + { + category.backoff_count = 0; + } + } + category.timeout = category.timeout_reset * ( exponent( 2, category.backoff_count ) ) + randomInt( 2 ); + category.last_timeout = category.timeout; + category.last_time = GetTime(); + } + if( category.clear_on_action_success ) + { + level.dds.active_events[category.name] = []; + } + return true; + } + else + { + wait( level.dds.heartbeat ); + } + } + } + } + return false; +} +dds_process_active_events_axis() +{ + for( i = 0; i < level.dds.categories_axis.size; i ++ ) + { + category = level.dds.categories_axis[i]; + if( category.timeout > 0 ) + { + category.timeout -= level.dds.heartbeat; + continue; + } + if( level.dds.active_events_axis[category.name].size != 0 ) + { + level.dds.active_events_axis[category.name] = [[category.priority_sort]] ( level.dds.active_events_axis[category.name] ); + for( j = 0; j < level.dds.active_events_axis[category.name].size; j ++ ) + { + if( randomFloat( 1 ) >= category.probability ) + { + level.dds.active_events_axis[category.name][j].clear_event_on_prob = true; + continue; + } + if( level.dds.active_events_axis[category.name][j].processed ) + { + continue; + } + if( dds_event_activate( level.dds.active_events_axis[category.name][j], category.get_talker_func, category.speaker_distance, + category.rspns_cat_name, false ) ) + { + if( !category.timeout_reset ) + { + category.timeout = category.timeout_reset; + } + else + { + if( ( GetTime() - category.last_time ) < ( category.last_timeout * 1.5 * 1000 ) ) + { + category.backoff_count++; + if( category.backoff_count > level.dds.category_backoff_limit ) + { + category.backoff_count = level.dds.category_backoff_limit; + } + } + else + { + category.backoff_count--; + if( category.backoff_count < 0 ) + { + category.backoff_count = 0; + } + } + category.timeout = category.timeout_reset * ( exponent( 2, category.backoff_count ) ) + randomInt( 2 ); + category.last_timeout = category.timeout; + category.last_time = GetTime(); + } + if( category.clear_on_action_success ) + { + level.dds.active_events_axis[category.name] = []; + } + return true; + } + else + { + wait( level.dds.heartbeat ); + } + } + } + } + return false; +} +dds_event_activate( event, get_talker_func, distance, rspns_cat_name, should_squelch ) +{ + if( !IsDefined( event ) ) + { + return false; + } + category_name = event.category_name; + if( IsDefined( event.category_response_name ) ) + { + category_name = event.category_response_name; + } + talker = event [[get_talker_func]] ( IsDefined( event.category_response_name ), distance ); + if( !IsDefined( talker ) || !isAlive( talker ) ) + { + event.processed = true; + return false; + } + phrase = dds_get_alias_from_event( talker, event.category_alias_name, event.ent ); + if( !IsDefined( phrase ) ) + { + return false; + } + if( IsDefined( event.category_response_name ) ) + { + if( event.isAlliesLine ) + { + wait( level.dds.response_wait ); + } + else + { + wait( level.dds.response_wait_axis ); + } + } + if(!getdvarint("snd_dsp_futz")) + { + should_squelch = false; + } + if( IsAlive( talker ) ) + { + if( should_squelch && !IsPlayer( talker ) && ( talker.voice != "russian_english" ) ) + { + talker animscripts\face::PlayFaceThread( undefined, "dds_squelch_strt", .5, "dds_squelch_strt" ); + } + talker animscripts\face::PlayFaceThread( undefined, phrase, .5, phrase ); + } + if( should_squelch && !IsPlayer( talker ) && IsAlive( talker ) && ( talker.voice != "russian_english" ) ) + { + talker animscripts\face::PlayFaceThread( undefined, "dds_squelch_end", .5, "dds_squelch_end" ); + } + event.talker = talker; + event.talker_origin = talker.origin; + event.phrase = phrase; + event.processed = true; + add_phrase_to_history( phrase ); + if( rspns_cat_name != "" ) + { + dds_notify_response( event, talker, phrase, rspns_cat_name ); + } + return true; +} +add_phrase_to_history( phrase ) +{ + level.dds.history[level.dds.history_index] = phrase; + level.dds.history_index = ( level.dds.history_index + 1 ) % level.dds.history_count; +} +get_nearest_common( response, player_can_say_line, distance ) +{ + player = get_players()[0]; + if( self.isAlliesLine ) + { + ai_array = GetAIArray( "allies" ); + if( player_can_say_line ) + { + ai_array[ai_array.size] = player; + } + } + else + { + ai_array = GetAIArray( "axis" ); + } + if( ai_array.size <= 0 ) + return undefined; + if( response && IsDefined( self.talker ) ) + { + ai_array = remove_all_actors_with_same_characterID( ai_array, self.talker.dds_characterID ); + closest_ent = get_closest_living( self.talker.origin, ai_array ); + } + else + { + closest_ent = get_closest_living( self.ent_origin, ai_array ); + } + if( !IsDefined( closest_ent ) ) + return undefined; + dis_from_player = distance( player.origin, closest_ent.origin ); + if( dis_from_player > distance ) + { + return undefined; + } + if( response && ( dis_from_player < level.dds.response_distance_min ) ) + { + return undefined; + } + return closest_ent; +} +remove_all_actors_with_same_characterID( ai_array, talker_characterID ) +{ + for( i = 0; i < ai_array.size; ) + { + if( !IsDefined( ai_array[i].dds_characterID ) ) + { + ai_array = array_remove( ai_array, ai_array[i] ); + continue; + } + if( ai_array[i].dds_characterID == talker_characterID ) + { + ai_array = array_remove( ai_array, ai_array[i] ); + continue; + } + i++; + } + return ai_array; +} +get_nearest( response, distance ) +{ + return get_nearest_common( response, true, distance ); +} +get_nearest_not_plr( response, distance ) +{ + return get_nearest_common( response, false, distance ); +} +get_attacker( response, distance ) +{ + if( IsDefined( self.ent_attacker ) && IsAlive( self.ent_attacker ) ) + { + if( IsDefined( self.ent_team ) ) + { + if( IsDefined( self.ent_attacker.team ) && self.ent_team == self.ent_attacker.team ) + { + return undefined; + } + if( IsDefined( self.ent_attacker.vteam ) && self.ent_team == self.ent_attacker.vteam ) + { + return undefined; + } + } + return self.ent_attacker; + } + return undefined; +} +get_self_ent( response, distance ) +{ + if( IsDefined( self.ent ) && isAlive( self.ent ) ) + { + return self.ent; + } + return undefined; +} +dds_get_alias_from_event( talker, category_alias_name, event_ent ) +{ + if( !IsAlive( talker ) ) + { + return undefined; + } + if( !IsDefined( talker.dds_characterID ) ) + { + return undefined; + } + alias = "dds_" + talker.dds_characterID + "_" + category_alias_name + "_"; + if( IsDefined( event_ent ) && category_alias_name == "thrt" ) + { + qualifier = event_ent get_landmark_qualifier( alias ); + if( IsDefined( qualifier ) ) + { + alias += qualifier + "_"; + } + } + variant_num = 0; + variant_count_array = dds_variant_count_for_alias( alias ); + if( variant_count_array.size > 0 ) + { + for( i = 0; i < variant_count_array.size; i++ ) + { + variant_num = random( variant_count_array ); + temp_alias = alias; + if( variant_num < 10 ) + temp_alias += "0"; + temp_alias += variant_num; + if( !is_phrase_in_history( temp_alias ) ) + return temp_alias; + } + } + else + { + return undefined; + } + return undefined; +} +is_phrase_in_history( phrase ) +{ + for( i = 0; i < level.dds.history.size; i++ ) + { + if( level.dds.history[i] == phrase ) + { + return true; + } + } + return false; +} +dds_variant_count_for_alias( alias ) +{ + variant_count_array = []; + for( i = 0; i < level.dds.variant_limit; i++ ) + { + prefix = ""; + if( i < 10 ) + prefix = "0"; + if( SoundExists( alias + prefix + i ) ) + { + variant_count_array[variant_count_array.size] = i; + } + } + return variant_count_array; +} +get_landmark_qualifier( alias ) +{ + lm_script_area = undefined; + lm_script_area_origin = undefined; + if( !IsDefined( self.node ) ) + { + nodeArray = GetAnyNodeArray( self.origin, 100 ); + for( i = 0; (i < nodeArray.size && i < 3); i++ ) + { + if( IsDefined( nodeArray[i].script_area ) ) + { + lm_script_area = nodeArray[i].script_area; + lm_script_area_origin = nodeArray[i].origin; + break; + } + } + } + else if( IsDefined( self.node.script_area ) ) + { + lm_script_area = self.node.script_area; + lm_script_area_origin = self.node.origin; + } + if( !IsDefined( lm_script_area ) || !IsDefined( lm_script_area_origin ) ) + return undefined; + if( ( distance( self.origin, lm_script_area_origin ) < 400 ) && SoundExists( alias + lm_script_area + "_00" ) ) + { + return lm_script_area; + } + return undefined; +} +get_event_override( alias ) +{ + if( IsDefined( level.dds.event_override_name ) && ( randomFloat( 1 ) >= level.dds.event_override_probability ) && + SoundExists( alias + level.dds.event_override_name + "_00" ) ) + { + return level.dds.event_override_name; + } + return undefined; +} +dds_find_infantry_threat( us, them ) +{ + THRT_INF_NOTIFY_DISTANCE = 4000; + while( flag( "dds_running_" + us ) ) + { + player = get_players()[0]; + our_team = GetAIArray( us ); + other_team = GetAIArray( them ); + success = false; + for( i = 0; i < our_team.size; i++ ) + { + for( j = 0; j < other_team.size; j++ ) + { + if( ( other_team.size > 1 ) && ( randomFloat( 1 ) < .5 ) ) + { + if( other_team[j] canSee( our_team[i] ) && ( distance( other_team[j].origin, our_team[i].origin ) < THRT_INF_NOTIFY_DISTANCE ) && + ( distance( other_team[j].origin, player.origin ) < THRT_INF_NOTIFY_DISTANCE ) ) + { + other_team[j] dds_notify( "thrt", ( them != "allies" ) ); + success = true; + break; + } + } + } + if( success ) + break; + } + wait( 2 ); + } +} +player_init() +{ + if( !IsPlayer( self ) ) + { + PrintLn( "dds::player_init not called on a player; did not set up dds player flags and threads." ); + return; + } + self.isKillstreakTimerRunning = false; + self.killstreakcounter = 0; + self ent_flag_init( "dds_killstreak" ); + self ent_flag_init( "dds_low_health" ); + self thread dds_killstreak_timer(); + self thread dds_watch_player_health(); + self thread dds_multikill_tracker(); + self.dds_characterID = level.dds.player_character_name; +} +dds_multikill_tracker() +{ + self endon( "death" ); + self endon( "disconnect" ); + while( 1 ) + { + level flag_wait( "dds_running_" + self.team ); + self waittill( "multikill" ); + self dds_notify( "multikill", ( self.team == "allies" ) ); + } +} +dds_watch_player_health() +{ + self endon( "death" ); + self endon( "disconnect" ); + while( 1 ) + { + level flag_wait( "dds_running_" + self.team ); + wait( 0.5 ); + if( self.health < self.maxhealth * 0.4 ) + { + self dds_notify( "low_health", self.team == "allies" ); + self ent_flag_set( "dds_low_health" ); + self thread reset_player_health(); + } + self ent_flag_waitopen( "dds_low_health" ); + } +} +reset_player_health() +{ + self endon( "death" ); + self endon( "disconnect" ); + while( 1 ) + { + if( self.health > self.maxhealth * 0.75 ) + { + self ent_flag_clear( "dds_low_health" ); + return; + } + wait( 1 ); + } +} +dds_killstreak_timer() +{ + self endon( "death" ); + self endon( "disconnect" ); + kills = getDvarIntDefault( #"dds_killstreak_kills", 3 ); + time = getDvarIntDefault( #"dds_killstreak_timer", 10 ); + while( 1 ) + { + level flag_wait( "dds_running_" + self.team ); + self ent_flag_wait( "dds_killstreak" ); + self.killstreakcounter++; + if( !self.isKillstreakTimerRunning ) + { + self.isKillstreakTimerRunning = true; + self thread track_kills_over_time( kills, time ); + } + self ent_flag_clear( "dds_killstreak" ); + } +} +track_kills_over_time( kills, time ) +{ + timer = GetTime() + ( time * 1000 ); + while( GetTime() < timer ) + { + if( self.killstreakcounter >= kills ) + { + self dds_notify( "killstreak", self.team == "allies" ); + self.killstreakcounter = 0; + timer = -1; + } + wait( 0.1 ); + } + self.killstreakcounter = 0; + self.isKillstreakTimerRunning = false; +} +dds_ai_init() +{ + self dds_get_ai_id(); + self thread dds_watch_grenade_flee(); + self thread dds_watch_friendly_fire(); +} +dds_get_ai_id() +{ + classname = ToLower( self.classname ); + tokens = StrTok( classname, "_" ); + if( tokens.size >= 2 ) + { + switch( tokens[1] ) + { + case "clark": + case "mason": + case "carlos": + return; + case "barnes": + self.dds_characterID = "woo"; + return; + case "lewis": + self.dds_characterID = "bow"; + return; + case "reznov": + case "woods": + case "bowman": + case "weaver": + case "hudson": + self.dds_characterID = GetSubStr( tokens[1], 0, 3 ); + return; + } + } + if( self.team != "neutral" ) + { + for( i = 0; i < level.dds.character_names[self.team].size; i++ ) + { + if( self.voice == level.dds.character_names[self.team][i] ) + { + self.dds_characterID = level.dds.countryIDs[self.voice].label + ( level.dds.countryIDs[self.voice].count % level.dds.countryIDs[self.voice].max_voices ); + level.dds.countryIDs[self.voice].count++; + return; + } + } + } + else + { + return; + } + printLn( "dds: didn't set this AI with a dds_characterID" ); +} +dds_watch_grenade_flee() +{ + self endon( "death" ); + self endon( "disconnect" ); + while( 1 ) + { + self waittill( "grenade_flee", weaponName ); + if( weaponName == "frag_grenade_sp" ) + { + self dds_notify( "react_grenade", ( self.team == "allies" ) ); + } + } +} +dds_watch_friendly_fire() +{ + self endon( "death" ); + self endon( "disconnect" ); + while( 1 ) + { + self waittill( "dds_friendly_fire" ); + self dds_notify( "friendly_fire", ( self.team == "allies" ) ); + } +} +update_player_damage( eAttacker ) +{ + if( !is_dds_enabled() ) + { + return; + } + self.dds_dmg_attacker = eAttacker; +} +update_actor_damage( eAttacker, damage_mod ) +{ + if( !is_dds_enabled() ) + { + return; + } + self.dds_dmg_attacker = eAttacker; + if( IsPlayer( eAttacker ) ) + { + switch( damage_mod ) + { + case "MOD_GRENADE_SPLASH": + case "MOD_IMPACT": + return; + } + if( self.team == eAttacker.team ) + { + self notify( "dds_friendly_fire" ); + } + else if( self.team == "neutral" ) + { + self dds_notify( "civ_fire", ( eAttacker.team == "allies" ) ); + } + } +} +check_kill_damage( mod, dmg_mod ) +{ + if( IsDefined( self.dds_dmg_attacker ) && IsDefined( self.dds_dmg_attacker.dds_dmg_attacker ) ) + { + if( self == self.dds_dmg_attacker.dds_dmg_attacker ) + { + return ( "kill_dmg_" + dmg_mod ); + } + } + return mod; +} +dds_notify_mod( isAlliesLine, category_name ) +{ + if( !is_dds_enabled() ) + { + return; + } + if( !IsDefined( self.damagemod ) ) + return; + if( IsDefined( self.dds_dmg_attacker ) && IsDefined( self.team ) ) + { + if( IsDefined( self.dds_dmg_attacker.team ) && ( ( self.dds_dmg_attacker.team == self.team ) || ( self.team == "neutral" ) ) ) + { + return; + } + else if( IsDefined( self.dds_dmg_attacker.vteam ) && ( self.dds_dmg_attacker.vteam == self.team ) ) + { + return; + } + } + is_bullet_kill = false; + if( !IsDefined( category_name ) ) + { + switch( self.damagemod ) + { + case "MOD_CRUSH": + case "MOD_TELEFRAG": + case "MOD_FALLING": + case "MOD_SUICIDE": + case "MOD_TRIGGER_HURT": + case "MOD_BURNED": + case "MOD_HIT_BY_OBJECT": + case "MOD_DROWN": + break; + case "MOD_UNKNOWN": + case "MOD_PROJECTILE": + case "MOD_PROJECTILE_SPLASH": + case "MOD_BAYONET": + break; + case "MOD_MELEE": + self dds_notify( check_kill_damage( "kill_melee", "melee" ), isAlliesLine ); + break; + case "MOD_EXPLOSIVE": + case "MOD_GRENADE": + case "MOD_GRENADE_SPLASH": + self dds_notify( "kill_explo", isAlliesLine ); + break; + case "MOD_PISTOL_BULLET": + case "MOD_RIFLE_BULLET": + self dds_notify( check_kill_damage( "kill_confirm", "shot" ), isAlliesLine ); + is_bullet_kill = true; + break; + case "MOD_HEAD_SHOT": + is_bullet_kill = true; + break; + default: + printLn( "^5 MOD: " + self.damagemod + " \n" ); + break; + } + } + else + { + self dds_notify( category_name, isAlliesLine ); + is_bullet_kill = true; + } + if( IsPlayer( self.attacker ) && is_bullet_kill ) + { + self.attacker ent_flag_set( "dds_killstreak" ); + } +} +dds_notify_casualty() +{ + self dds_notify( "casualty", ( self.team == "allies" ) ); +} +dds_notify_grenade( grenade_name, isAlliesLine, isThrowBack ) +{ + if( !is_dds_enabled() ) + { + return; + } + if( !isThrowBack ) + { + switch( grenade_name ) + { + case "frag_grenade_sp": + self dds_notify( "fragout", isAlliesLine ); + break; + case "willy_pete_sp": + self dds_notify( "smokeout", isAlliesLine ); + break; + case "flash_grenade_sp": + case "m8_white_smoke_sp": + case "claymore_sp": + case "molotov_sp": + case "vc_grenade_sp": + break; + default: + break; + } + } + else + { + self dds_notify( "frag_throwback", isAlliesLine ); + } +} +dds_notify_reload( weaponName, isAlliesLine ) +{ + if( !IsDefined( weaponName ) ) + { + self dds_notify( "reload", isAlliesLine ); + return; + } + else if( ( self GetCurrentWeaponClipAmmo() > 0 ) ) + { + return; + } + switch( weaponName ) + { + case "crossbow_sp": + case "crossbow_vzoom_alt_sp": + case "crossbow_explosive_alt_sp": + break; + default: + self dds_notify( "reload", isAlliesLine ); + break; + } +} +dds_notify( category_name, isAlliesLine ) +{ + if( !flag( "dds_running_allies" ) && isAlliesLine ) + { + return; + } + if( !flag( "dds_running_axis" ) && !isAlliesLine ) + { + return; + } + if( isAlliesLine && !IsDefined( level.dds.active_events[category_name] ) ) + { + return; + } + if( !isAlliesLine && !IsDefined( level.dds.active_events_axis[category_name] ) ) + { + return; + } + assertEx( IsDefined( level.dds ), "dds not init." ); + assertEx( IsDefined( isAlliesLine ), "isAlliesLine is not defined." ); + event = spawnstruct(); + event.category_name = category_name; + event.ent = self; + event.ent_origin = self.origin; + event.ent_team = self.team; + event.clear_event_on_prob = false; + event.processed = false; + event.ent_attacker = self.dds_dmg_attacker; + event.isAlliesLine = isAlliesLine; + if( !isAlliesLine ) + { + dds_category = find_dds_category_by_name( level.dds.categories_axis, category_name ); + if( !IsDefined( dds_category ) ) + { + return; + } + event.duration = dds_category.duration; + event.category_alias_name = dds_category.alias_name; + level.dds.active_events_axis[category_name][level.dds.active_events_axis[category_name].size] = event; + } + else + { + dds_category = find_dds_category_by_name( level.dds.categories, category_name ); + if( !IsDefined( dds_category ) ) + { + return; + } + event.duration = dds_category.duration; + event.category_alias_name = dds_category.alias_name; + level.dds.active_events[category_name][level.dds.active_events[category_name].size] = event; + } +} +dds_notify_response( event, talker, phrase, rspns_cat_name ) +{ + event.category_response_name = rspns_cat_name; + event.processed = false; + if( ( rspns_cat_name == "grenade_rspns" ) && IsDefined( event.ent ) && IsDefined( event.ent.grenade ) && IsDefined( event.ent.grenade.originalowner ) && + ( IsDefined( event.ent.grenade.originalowner.team != event.ent_team ) ) ) + return; + if( !event.isAlliesLine ) + { + dds_category = find_dds_category_by_name( level.dds.categories_axis, event.category_response_name ); + if( !IsDefined( dds_category ) ) + { + return; + } + event.duration = dds_category.duration; + event.category_alias_name = dds_category.alias_name; + level.dds.active_events_axis[event.category_response_name][level.dds.active_events_axis[event.category_response_name].size] = event; + } + else + { + dds_category = find_dds_category_by_name( level.dds.categories, event.category_response_name ); + if( !IsDefined( dds_category ) ) + { + return; + } + event.duration = dds_category.duration; + event.category_alias_name = dds_category.alias_name; + level.dds.active_events[event.category_response_name][level.dds.active_events[event.category_response_name].size] = event; + } +} +find_dds_category_by_name( category_array, category_name ) +{ + for( i = 0; i < category_array.size; i++ ) + { + if( category_array[i].name == category_name ) + { + return category_array[i]; + } + } + return undefined; +} +dds_sort_ent_dist( eventArray ) +{ + player = get_players()[0]; + dist_array = []; + index_array = []; + for( i = 0; i < eventArray.size; i++ ) + { + length = distance( player.origin, eventArray[i].ent_origin ); + dist_array[dist_array.size] = length; + index_array[index_array.size] = i; + } + temp = undefined; + for( i = 0; i < dist_array.size - 1; i++ ) + { + if( dist_array[i] <= dist_array[i + 1] ) + continue; + temp = dist_array[i]; + dist_array[i] = dist_array[i + 1]; + dist_array[i + 1] = temp; + temp = index_array[i]; + index_array[i] = index_array[i + 1]; + index_array[i + 1] = temp; + } + new_array = []; + for( i = 0; i < index_array.size; i++ ) + { + new_array[i] = eventArray[index_array[i]]; + } + return new_array; +} +dds_sort_ent_duration( eventArray ) +{ + return eventArray; +} +dds_sort_ent_damage( eventArray ) +{ + return eventArray; +} +getDvarIntDefault( dvarName, defaultValue ) +{ + returnVal = defaultValue; + if( getDvar( dvarName ) != "" ) + { + return getDvarInt( dvarName ); + } + return returnVal; +} +dds_set_event_override( event_name ) +{ + level.dds.event_override_name = event_name; +} +dds_clear_event_override() +{ + level.dds.event_override_name = undefined; +} +dds_set_event_override_probability( probability_value ) +{ + if( probability_value < 0 || probability_value > 1 ) + { + PrintLn( probability_value + " is invalid event override probability. value must be between 0 and 1. resetting to default." ); + dds_reset_event_override_probability(); + } + else + { + level.dds.event_override_probability = probability_value; + } +} +dds_reset_event_override_probability() +{ + level.dds.event_override_probability = .5; +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_debug.gsc b/BO1/PC/ZM/maps/_debug.gsc new file mode 100644 index 0000000..d7c2218 --- /dev/null +++ b/BO1/PC/ZM/maps/_debug.gsc @@ -0,0 +1,2434 @@ +#include maps\_utility; +#include common_scripts\utility; +debugchains() +{ + nodes = getallnodes(); + fnodenum = 0; + fnodes = []; + for( i=0;i 0 ) ) || + (( isdefined( nodes[ i ].targetname ) ) &&(( getnodearray( nodes[ i ].targetname, "target" ) ).size > 0 ) ) + ) + ) + { + fnodes[ fnodenum ] = nodes[ i ]; + fnodenum++; + } + } + count = 0; + while( 1 ) + { + if( GetDvar( #"chain" ) == "1" ) + { + for( i=0;i= corners.size ) + { + break; + } + corners[ i ] thread coverTest(); + covered++; + } + if( corners.size <= 30 ) + { + return; + } + for( ;; ) + { + level waittill( "debug_next_corner" ); + if( covered >= corners.size ) + { + covered = 0; + } + corners[ covered ] thread coverTest(); + covered++; + } +} +coverTest() +{ + coverSetupAnim(); +} +#using_animtree( "generic_human" ); +coverSetupAnim() +{ + spawn = undefined; + spawner = undefined; + for( ;; ) + { + for( i=0;i 250 ) + { + continue; + } + nearActive = true; + break; + } + if( nearActive ) + { + continue; + } + completed = false; + for( p=0;p 256 ) + { + continue; + } + cameraWithEnemy[ cameraWithEnemy.size ] = cameras[ i ]; + break; + } + } + if( !cameraWithEnemy.size ) + { + freePlayer(); + wait( 0.5 ); + continue; + } + cameraWithPlayer = []; + for( i=0;i dist ) + { + continue; + } + newcam = cameraWithPlayer[ i ]; + dist = newdist; + } + setPlayerToCamera( newcam ); + wait( 3 ); + } +} +freePlayer() +{ + setdvar( "cl_freemove", "0" ); +} +setPlayerToCamera( camera ) +{ + setdvar( "cl_freemove", "2" ); + setdebugangles( camera.angles ); + setdebugorigin( camera.origin +( 0, 0, -60 ) ); +} +deathspawnerPreview() +{ + waittillframeend; + for( i=0;i<50;i++ ) + { + if( !isdefined( level.deathspawnerents[ i ] ) ) + { + continue; + } + array = level.deathspawnerents[ i ]; + for( p=0;p 0 ) + { + level.minimapheight = minimapheight; + players = get_players(); + player = players[0]; + corners = getentarray( "minimap_corner", "targetname" ); + if( corners.size == 2 ) + { + viewpos =( corners[ 0 ].origin + corners[ 1 ].origin ); + viewpos =( viewpos[ 0 ]*.5, viewpos[ 1 ]*.5, viewpos[ 2 ]*.5 ); + maxcorner =( corners[ 0 ].origin[ 0 ], corners[ 0 ].origin[ 1 ], viewpos[ 2 ] ); + mincorner =( corners[ 0 ].origin[ 0 ], corners[ 0 ].origin[ 1 ], viewpos[ 2 ] ); + if( corners[ 1 ].origin[ 0 ] > corners[ 0 ].origin[ 0 ] ) + { + maxcorner =( corners[ 1 ].origin[ 0 ], maxcorner[ 1 ], maxcorner[ 2 ] ); + } + else + { + mincorner =( corners[ 1 ].origin[ 0 ], mincorner[ 1 ], mincorner[ 2 ] ); + } + if( corners[ 1 ].origin[ 1 ] > corners[ 0 ].origin[ 1 ] ) + { + maxcorner =( maxcorner[ 0 ], corners[ 1 ].origin[ 1 ], maxcorner[ 2 ] ); + } + else + { + mincorner =( mincorner[ 0 ], corners[ 1 ].origin[ 1 ], mincorner[ 2 ] ); + } + viewpostocorner = maxcorner - viewpos; + viewpos =( viewpos[ 0 ], viewpos[ 1 ], viewpos[ 2 ] + minimapheight ); + origin = spawn( "script_origin", player.origin ); + northvector =( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 ); + eastvector =( northvector[ 1 ], 0 - northvector[ 0 ], 0 ); + disttotop = vectordot( northvector, viewpostocorner ); + if( disttotop < 0 ) + { + disttotop = 0 - disttotop; + } + disttoside = vectordot( eastvector, viewpostocorner ); + if( disttoside < 0 ) + { + disttoside = 0 - disttoside; + } + if( requiredMapAspectRatio > 0 ) + { + mapAspectRatio = disttoside / disttotop; + if( mapAspectRatio < requiredMapAspectRatio ) + { + incr = requiredMapAspectRatio / mapAspectRatio; + disttoside *= incr; + addvec = vecscale( eastvector, vectordot( eastvector, maxcorner - viewpos ) *( incr - 1 ) ); + mincorner -= addvec; + maxcorner += addvec; + } + else + { + incr = mapAspectRatio / requiredMapAspectRatio; + disttotop *= incr; + addvec = vecscale( northvector, vectordot( northvector, maxcorner - viewpos ) *( incr - 1 ) ); + mincorner -= addvec; + maxcorner += addvec; + } + } + if( level.console ) + { + aspectratioguess = 16.0/9.0; + angleside = 2 * atan( disttoside * .8 / minimapheight ); + angletop = 2 * atan( disttotop * aspectratioguess * .8 / minimapheight ); + } + else + { + aspectratioguess = 4.0/3.0; + angleside = 2 * atan( disttoside * 1.05 / minimapheight ); + angletop = 2 * atan( disttotop * aspectratioguess * 1.05 / minimapheight ); + } + if( angleside > angletop ) + { + angle = angleside; + } + else + { + angle = angletop; + } + znear = minimapheight - 1000; + if( znear < 16 ) + { + znear = 16; + } + if( znear > 10000 ) + { + znear = 10000; + } + player playerlinktoabsolute( origin ); + origin.origin = viewpos +( 0, 0, -62 ); + origin.angles =( 90, getnorthyaw(), 0 ); + player GiveWeapon( "defaultweapon" ); + player setClientDvar( "cg_fov", angle ); + level.minimapplayer = player; + level.minimaporigin = origin; + thread drawMiniMapBounds( viewpos, mincorner, maxcorner ); + } + else + { + println( "^1Error: There are not exactly 2 \"minimap_corner\" entities in the level." ); + } + } + } +} +getchains() +{ + chainarray = []; + chainarray = getentarray( "minimap_line", "script_noteworthy" ); + array = []; + for( i=0;i insidedot ) + { + return true; + } + else + { + return false; + } +} +debug_colornodes() +{ + wait( 0.05 ); + ai = getaiarray(); + array = []; + array[ "axis" ] = []; + array[ "allies" ] = []; + array[ "neutral" ] = []; + for( i=0; i highest ) + { + highest = keys[ i ]; + } + } + if( highest == -1 ) + { + return; + } + if( level.animsound_selected > highest ) + { + level.animsound_selected = highest; + } + if( level.animsound_selected < 0 ) + { + level.animsound_selected = 0; + } + for( ;; ) + { + if( isdefined( animsounds[ level.animsound_selected ] ) ) + { + break; + } + level.animsound_selected--; + if( level.animsound_selected < 0 ) + { + level.animsound_selected = highest; + } + } + level.animsound_hud_anime.label = "Anim: " + animsounds[ level.animsound_selected ].anime; + level.animsound_hud[ level.animsound_selected ].color =( 1, 1, 0 ); + level.animsound_hud_timer[ level.animsound_selected ].color =( 1, 1, 0 ); + level.animsound_hud_alias[ level.animsound_selected ].color =( 1, 1, 0 ); + time = gettime(); + for( i=0; i < keys.size; i++ ) + { + key = keys[ i ]; + animsound = animsounds[ key ]; + hudelm = level.animsound_hud[ key ]; + soundalias = get_alias_from_stored( animSound ); + hudelm.label =( key + 1 ) + ". " + animsound.notetrack; + hudelm = level.animsound_hud_timer[ key ]; + hudelm.label = int(( time -( animsound.end_time - 60000 ) ) * 0.001 ); + if( isdefined( soundalias ) ) + { + hudelm = level.animsound_hud_alias[ key ]; + hudelm.label = soundalias; + if( !is_from_animsound( animSound.animname, animSound.anime, animSound.notetrack ) ) + { + hudelm.color =( 0.7, 0.7, 0.7 ); + } + } + } + players = get_players(); + if( players[0] buttonPressed( "del" ) ) + { + animsound = animsounds[ level.animsound_selected ]; + soundalias = get_alias_from_stored( animsound ); + if( !isdefined( soundalias ) ) + { + return; + } + if( !is_from_animsound( animSound.animname, animSound.anime, animSound.notetrack ) ) + { + return; + } + level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ] = undefined; + debug_animSoundSave(); + } +} +get_alias_from_stored( animSound ) +{ + if( !isdefined( level.animSound_aliases[ animSound.animname ] ) ) + { + return; + } + if( !isdefined( level.animSound_aliases[ animSound.animname ][ animSound.anime ] ) ) + { + return; + } + if( !isdefined( level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ] ) ) + { + return; + } + return level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ][ "soundalias" ]; +} +is_from_animsound( animname, anime, notetrack ) +{ + return isdefined( level.animSound_aliases[ animname ][ anime ][ notetrack ][ "created_by_animSound" ] ); +} +display_animSound() +{ + players = get_players(); + if( distance( players[0].origin, self.origin ) > 1500 ) + { + return; + } + level.animSounds_thisframe[ level.animSounds_thisframe.size ] = self; +} +debug_animSoundTag( tagnum ) +{ +} +debug_animSoundTagSelected() +{ +} +tag_sound( tag, tagnum ) +{ + if( !isdefined( level.animsound_tagged ) ) + { + return; + } + if( !isdefined( level.animsound_tagged.animsounds[ tagnum ] ) ) + { + return; + } + animSound = level.animsound_tagged.animsounds[ tagnum ]; + soundalias = get_alias_from_stored( animSound ); + if( !isdefined( soundalias ) || is_from_animsound( animSound.animname, animSound.anime, animSound.notetrack ) ) + { + level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ][ "soundalias" ] = tag; + level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ][ "created_by_animSound" ] = true; + debug_animSoundSave(); + } +} +debug_animSoundSave() +{ +} +print_aliases_to_file( file ) +{ + tab = " "; + fprintln( file, "#include maps\\_anim;" ); + fprintln( file, "main()" ); + fprintln( file, "{" ); + fprintln( file, tab + "// Autogenerated by AnimSounds. Threaded off so that it can be placed before _load( has to create level.scr_notetrack first )." ); + fprintln( file, tab + "thread init_animsounds();" ); + fprintln( file, "}" ); + fprintln( file, "" ); + fprintln( file, "init_animsounds()" ); + fprintln( file, "{" ); + fprintln( file, tab + "waittillframeend;" ); + animnames = getarraykeys( level.animSound_aliases ); + for( i=0; i < animnames.size; i++ ) + { + animes = getarraykeys( level.animSound_aliases[ animnames[ i ] ] ); + for( p=0; p < animes.size; p++ ) + { + anime = animes[ p ]; + notetracks = getarraykeys( level.animSound_aliases[ animnames[ i ] ][ anime ] ); + for( z=0; z < notetracks.size; z++ ) + { + notetrack = notetracks[ z ]; + if( !is_from_animsound( animnames[ i ], anime, notetrack ) ) + { + continue; + } + alias = level.animSound_aliases[ animnames[ i ] ][ anime ][ notetrack ][ "soundalias" ]; + if( notetrack == "#" + anime ) + { + fprintln( file, tab + "addOnStart_animSound( " + tostr( animnames[ i ] ) + ", " + tostr( anime ) + ", " + tostr( alias ) + " ); " ); + } + else + { + fprintln( file, tab + "addNotetrack_animSound( " + tostr( animnames[ i ] ) + ", " + tostr( anime ) + ", " + tostr( notetrack ) + ", " + tostr( alias ) + " ); " ); + } + println( "^1Saved alias ^4" + alias + "^1 to notetrack ^4" + notetrack ); + } + } + } + fprintln( file, "}" ); +} +tostr( str ) +{ + newstr = "\""; + for( i=0; i < str.size; i++ ) + { + if( str[ i ] == "\"" ) + { + newstr += "\\"; + newstr += "\""; + continue; + } + newstr += str[ i ]; + } + newstr += "\""; + return newstr; +} +drawDebugLineInternal(fromPoint, toPoint, color, durationFrames) +{ + for (i=0;i 0 ) + { + hud_title.alpha = 1; + hud_x.alpha = 1; + hud_y.alpha = 1; + hud_z.alpha = 1; + x = players[0].origin[0]; + y = players[0].origin[1]; + z = players[0].origin[2]; + spacing1 = ( ( 2 + number_before_decimal( x ) ) * 8 ) + 10; + spacing2 = ( ( 2 + number_before_decimal( y ) ) * 8 ) + 10; + hud_y.x = x_pos + spacing1; + hud_z.x = x_pos + spacing1 + spacing2; + hud_x SetValue( round_to( x, 100 ) ); + hud_y SetValue( round_to( y, 100 ) ); + hud_z SetValue( round_to( z, 100 ) ); + } + else + { + hud_title.alpha = 0; + hud_x.alpha = 0; + hud_y.alpha = 0; + hud_z.alpha = 0; + } + wait( 0.5 ); + } +} +number_before_decimal( num ) +{ + abs_num = abs( num ); + count = 0; + while( 1 ) + { + abs_num *= 0.1; + count += 1; + if( abs_num < 1 ) + { + return count; + } + } +} +round_to( val, num ) +{ + return Int( val * num ) / num; +} +set_event_printname_thread( text, focus ) +{ +} +get_playerone() +{ + return get_players()[0]; +} +engagement_distance_debug_toggle() +{ +} +dvar_turned_on( val ) +{ + if( val <= 0 ) + { + return false; + } + else + { + return true; + } +} +engagement_distance_debug_init() +{ + level.debug_xPos = -50; + level.debug_yPos = 250; + level.debug_yInc = 18; + level.debug_fontScale = 1.5; + level.white = ( 1, 1, 1 ); + level.green = ( 0, 1, 0 ); + level.yellow = ( 1, 1, 0 ); + level.red = ( 1, 0, 0 ); + level.realtimeEngageDist = NewHudElem(); + level.realtimeEngageDist.alignX = "left"; + level.realtimeEngageDist.fontScale = level.debug_fontScale; + level.realtimeEngageDist.x = level.debug_xPos; + level.realtimeEngageDist.y = level.debug_yPos; + level.realtimeEngageDist.color = level.white; + level.realtimeEngageDist SetText( "Current Engagement Distance: " ); + xPos = level.debug_xPos + 207; + level.realtimeEngageDist_value = NewHudElem(); + level.realtimeEngageDist_value.alignX = "left"; + level.realtimeEngageDist_value.fontScale = level.debug_fontScale; + level.realtimeEngageDist_value.x = xPos; + level.realtimeEngageDist_value.y = level.debug_yPos; + level.realtimeEngageDist_value.color = level.white; + level.realtimeEngageDist_value SetValue( 0 ); + xPos += 37; + level.realtimeEngageDist_middle = NewHudElem(); + level.realtimeEngageDist_middle.alignX = "left"; + level.realtimeEngageDist_middle.fontScale = level.debug_fontScale; + level.realtimeEngageDist_middle.x = xPos; + level.realtimeEngageDist_middle.y = level.debug_yPos; + level.realtimeEngageDist_middle.color = level.white; + level.realtimeEngageDist_middle SetText( " units, SHORT/LONG by " ); + xPos += 105; + level.realtimeEngageDist_offvalue = NewHudElem(); + level.realtimeEngageDist_offvalue.alignX = "left"; + level.realtimeEngageDist_offvalue.fontScale = level.debug_fontScale; + level.realtimeEngageDist_offvalue.x = xPos; + level.realtimeEngageDist_offvalue.y = level.debug_yPos; + level.realtimeEngageDist_offvalue.color = level.white; + level.realtimeEngageDist_offvalue SetValue( 0 ); + hudObjArray = []; + hudObjArray[0] = level.realtimeEngageDist; + hudObjArray[1] = level.realtimeEngageDist_value; + hudObjArray[2] = level.realtimeEngageDist_middle; + hudObjArray[3] = level.realtimeEngageDist_offvalue; + return hudObjArray; +} +engage_dist_debug_hud_destroy( hudArray, killNotify ) +{ + level waittill( killNotify ); + for( i = 0; i < hudArray.size; i++ ) + { + hudArray[i] Destroy(); + } +} +weapon_engage_dists_init() +{ + level.engageDists = []; + genericPistol = spawnstruct(); + genericPistol.engageDistMin = 125; + genericPistol.engageDistOptimal = 225; + genericPistol.engageDistMulligan = 50; + genericPistol.engageDistMax = 400; + shotty = spawnstruct(); + shotty.engageDistMin = 50; + shotty.engageDistOptimal = 200; + shotty.engageDistMulligan = 75; + shotty.engageDistMax = 350; + genericSMG = spawnstruct(); + genericSMG.engageDistMin = 100; + genericSMG.engageDistOptimal = 275; + genericSMG.engageDistMulligan = 100; + genericSMG.engageDistMax = 500; + genericLMG = spawnstruct(); + genericLMG.engageDistMin = 325; + genericLMG.engageDistOptimal = 550; + genericLMG.engageDistMulligan = 150; + genericLMG.engageDistMax = 850; + genericRifleSA = spawnstruct(); + genericRifleSA.engageDistMin = 325; + genericRifleSA.engageDistOptimal = 550; + genericRifleSA.engageDistMulligan = 150; + genericRifleSA.engageDistMax = 850; + genericRifleBolt = spawnstruct(); + genericRifleBolt.engageDistMin = 350; + genericRifleBolt.engageDistOptimal = 600; + genericRifleBolt.engageDistMulligan = 150; + genericRifleBolt.engageDistMax = 900; + genericHMG = spawnstruct(); + genericHMG.engageDistMin = 390; + genericHMG.engageDistOptimal = 600; + genericHMG.engageDistMulligan = 100; + genericHMG.engageDistMax = 900; + genericSniper = spawnstruct(); + genericSniper.engageDistMin = 950; + genericSniper.engageDistOptimal = 1700; + genericSniper.engageDistMulligan = 300; + genericSniper.engageDistMax = 3000; + engage_dists_add( "pistol", genericPistol ); + engage_dists_add( "smg", genericSMG ); + engage_dists_add( "spread", shotty ); + engage_dists_add( "mg", genericHMG ); + engage_dists_add( "rifle", genericRifleSA ); + engage_dists_add( "springfield_scoped", genericSniper ); + engage_dists_add( "type99_rifle_scoped", genericSniper ); + engage_dists_add( "mosin_rifle_scoped", genericSniper ); + engage_dists_add( "kar98k_scoped", genericSniper ); + engage_dists_add( "fg42_scoped", genericSniper ); + engage_dists_add( "lee_enfield_scoped", genericSniper ); + level thread engage_dists_watcher(); +} +engage_dists_add( weapontypeStr, values ) +{ + level.engageDists[weapontypeStr] = values; +} +get_engage_dists( weapontypeStr ) +{ + if( IsDefined( level.engageDists[weapontypeStr] ) ) + { + return level.engageDists[weapontypeStr]; + } + else + { + return undefined; + } +} +engage_dists_watcher() +{ + level endon( "kill_all_engage_dist_debug" ); + level endon( "kill_engage_dists_watcher" ); + while( 1 ) + { + player = get_playerone(); + playerWeapon = player GetCurrentWeapon(); + if( !IsDefined( player.lastweapon ) ) + { + player.lastweapon = playerWeapon; + } + else + { + if( player.lastweapon == playerWeapon ) + { + wait( 0.05 ); + continue; + } + } + values = get_engage_dists( WeaponClass(playerWeapon) ); + if( IsDefined( values ) ) + { + level.weaponEngageDistValues = values; + } + else + { + level.weaponEngageDistValues = undefined; + } + player.lastweapon = playerWeapon; + wait( 0.05 ); + } +} +debug_realtime_engage_dist() +{ + level endon( "kill_all_engage_dist_debug" ); + level endon( "kill_realtime_engagement_distance_debug" ); + hudObjArray = engagement_distance_debug_init(); + level thread engage_dist_debug_hud_destroy( hudObjArray, "kill_all_engage_dist_debug" ); + level.debugRTEngageDistColor = level.green; + player = get_playerone(); + while( 1 ) + { + lastTracePos = ( 0, 0, 0 ); + direction = player GetPlayerAngles(); + direction_vec = AnglesToForward( direction ); + eye = player GetEye(); + trace = BulletTrace( eye, eye + vector_scale( direction_vec, 10000 ), true, player ); + tracePoint = trace["position"]; + traceNormal = trace["normal"]; + traceDist = int( Distance( eye, tracePoint ) ); + if( tracePoint != lastTracePos ) + { + lastTracePos = tracePoint; + if( !IsDefined( level.weaponEngageDistValues ) ) + { + hudobj_changecolor( hudObjArray, level.white ); + hudObjArray engagedist_hud_changetext( "nodata", tracedist ); + } + else + { + engageDistMin = level.weaponEngageDistValues.engageDistMin; + engageDistOptimal = level.weaponEngageDistValues.engageDistOptimal; + engageDistMulligan = level.weaponEngageDistValues.engageDistMulligan; + engageDistMax = level.weaponEngageDistValues.engageDistMax; + if( ( traceDist >= engageDistMin ) && ( traceDist <= engageDistMax ) ) + { + if( ( traceDist >= ( engageDistOptimal - engageDistMulligan ) ) + && ( traceDist <= ( engageDistOptimal + engageDistMulligan ) ) ) + { + hudObjArray engagedist_hud_changetext( "optimal", tracedist ); + hudobj_changecolor( hudObjArray, level.green ); + } + else + { + hudObjArray engagedist_hud_changetext( "ok", tracedist ); + hudobj_changecolor( hudObjArray, level.yellow ); + } + } + else if( traceDist < engageDistMin ) + { + hudobj_changecolor( hudObjArray, level.red ); + hudObjArray engagedist_hud_changetext( "short", tracedist ); + } + else if( traceDist > engageDistMax ) + { + hudobj_changecolor( hudObjArray, level.red ); + hudObjArray engagedist_hud_changetext( "long", tracedist ); + } + } + } + thread plot_circle_fortime( 1, 5, 0.05, level.debugRTEngageDistColor, tracePoint, traceNormal ); + thread plot_circle_fortime( 1, 1, 0.05, level.debugRTEngageDistColor, tracePoint, traceNormal ); + wait( 0.05 ); + } +} +hudobj_changecolor( hudObjArray, newcolor ) +{ + for( i = 0; i < hudObjArray.size; i++ ) + { + hudObj = hudObjArray[i]; + if( hudObj.color != newcolor ) + { + hudObj.color = newcolor; + level.debugRTEngageDistColor = newcolor; + } + } +} +engagedist_hud_changetext( engageDistType, units ) +{ + if( !IsDefined( level.lastDistType ) ) + { + level.lastDistType = "none"; + } + if( engageDistType == "optimal" ) + { + self[1] SetValue( units ); + self[2] SetText( "units: OPTIMAL!" ); + self[3].alpha = 0; + } + else if( engageDistType == "ok" ) + { + self[1] SetValue( units ); + self[2] SetText( "units: OK!" ); + self[3].alpha = 0; + } + else if( engageDistType == "short" ) + { + amountUnder = level.weaponEngageDistValues.engageDistMin - units; + self[1] SetValue( units ); + self[3] SetValue( amountUnder ); + self[3].alpha = 1; + if( level.lastDistType != engageDistType ) + { + self[2] SetText( "units: SHORT by " ); + } + } + else if( engageDistType == "long" ) + { + amountOver = units - level.weaponEngageDistValues.engageDistMax; + self[1] SetValue( units ); + self[3] SetValue( amountOver ); + self[3].alpha = 1; + if( level.lastDistType != engageDistType ) + { + self[2] SetText( "units: LONG by " ); + } + } + else if( engageDistType == "nodata" ) + { + self[1] SetValue( units ); + self[2] SetText( " units: (NO CURRENT WEAPON VALUES)" ); + self[3].alpha = 0; + } + level.lastDistType = engageDistType; +} +debug_ai_engage_dist() +{ + level endon( "kill_all_engage_dist_debug" ); + level endon( "kill_ai_engagement_distance_debug" ); + player = get_playerone(); + while( 1 ) + { + axis = GetAIArray( "axis" ); + if( IsDefined( axis ) && axis.size > 0 ) + { + playerEye = player GetEye(); + for( i = 0; i < axis.size; i++ ) + { + ai = axis[i]; + aiEye = ai GetEye(); + if( SightTracePassed( playerEye, aiEye, false, player ) ) + { + dist = Distance( playerEye, aiEye ); + drawColor = level.white; + drawString = "-"; + if( !IsDefined( level.weaponEngageDistValues ) ) + { + drawColor = level.white; + } + else + { + engageDistMin = level.weaponEngageDistValues.engageDistMin; + engageDistOptimal = level.weaponEngageDistValues.engageDistOptimal; + engageDistMulligan = level.weaponEngageDistValues.engageDistMulligan; + engageDistMax = level.weaponEngageDistValues.engageDistMax; + if( ( dist >= engageDistMin ) && ( dist <= engageDistMax ) ) + { + if( ( dist >= ( engageDistOptimal - engageDistMulligan ) ) + && ( dist <= ( engageDistOptimal + engageDistMulligan ) ) ) + { + drawColor = level.green; + drawString = "RAD"; + } + else + { + drawColor = level.yellow; + drawString = "MEH"; + } + } + else if( dist < engageDistMin ) + { + drawColor = level.red; + drawString = "BAD"; + } + else if( dist > engageDistMax ) + { + drawColor = level.red; + drawString = "BAD"; + } + } + scale = dist / 525; + Print3d( ai.origin + ( 0, 0, 67 ), drawString, drawColor, 1, scale ); + } + } + } + wait( 0.05 ); + } +} +plot_circle_fortime(radius1,radius2,time,color,origin,normal) +{ + if(!isdefined(color)) + { + color = (0,1,0); + } + hangtime = .05; + circleres = 6; + hemires = circleres/2; + circleinc = 360/circleres; + circleres++; + plotpoints = []; + rad = 0.00; + timer = gettime()+(time*1000); + radius = radius1; + while(gettime() 0 ) + { + node = nodes[0]; + if( node.type != "Path" && DistanceSquared(node.origin, level.playerCursor["position"]) < 24*24 ) + { + if( !level.ai_puppet_highlighting ) + { + ai_puppeteer_render_node( node, (0,1,1) ); + } + level.playerCursorNode = node; + } + } + } + if( !level.ai_puppet_highlighting ) + { + ai_puppeteer_render_point( level.playerCursor["position"], level.playerCursor["normal"], forward, cursorColor ); + } + wait(0.05); + } +} +ai_puppeteer_create_hud() +{ + level.puppeteer_hud_select = NewDebugHudElem(); + level.puppeteer_hud_select.x = 0; + level.puppeteer_hud_select.y = 180; + level.puppeteer_hud_select.fontscale = 1.5; + level.puppeteer_hud_select.alignX = "left"; + level.puppeteer_hud_select.horzAlign = "left"; + level.puppeteer_hud_select.color = (0,0,1); + level.puppeteer_hud_goto = NewDebugHudElem(); + level.puppeteer_hud_goto.x = 0; + level.puppeteer_hud_goto.y = 200; + level.puppeteer_hud_goto.fontscale = 1.5; + level.puppeteer_hud_goto.alignX = "left"; + level.puppeteer_hud_goto.horzAlign = "left"; + level.puppeteer_hud_goto.color = (0,1,0); + level.puppeteer_hud_shoot = NewDebugHudElem(); + level.puppeteer_hud_shoot.x = 0; + level.puppeteer_hud_shoot.y = 220; + level.puppeteer_hud_shoot.fontscale = 1.5; + level.puppeteer_hud_shoot.alignX = "left"; + level.puppeteer_hud_shoot.horzAlign = "left"; + level.puppeteer_hud_shoot.color = (1,1,1); + level.puppeteer_hud_select SetText("X for select"); + level.puppeteer_hud_goto SetText("A for goto"); + level.puppeteer_hud_shoot SetText("R_TRIG for shoot"); +} +ai_puppeteer_destroy_hud() +{ + if( IsDefined(level.puppeteer_hud_select) ) + { + level.puppeteer_hud_select Destroy(); + } + if( IsDefined(level.puppeteer_hud_goto) ) + { + level.puppeteer_hud_goto Destroy(); + } + if( IsDefined(level.puppeteer_hud_shoot) ) + { + level.puppeteer_hud_shoot Destroy(); + } +} +ai_puppeteer_render_point(point, normal, forward, color) +{ + surface_vector = VectorCross( forward, normal ); + surface_vector = VectorNormalize(surface_vector); + line( point, point + vector_scale(surface_vector, 5), color, 1, true ); + line( point, point + vector_scale(surface_vector, -5), color, 1, true ); + surface_vector = VectorCross( normal, surface_vector ); + surface_vector = VectorNormalize(surface_vector); + line( point, point + vector_scale(surface_vector, 5), color, 1, true ); + line( point, point + vector_scale(surface_vector, -5), color, 1, true ); +} +ai_puppeteer_render_node(node, color) +{ + print3d( node.origin, node.type, color, 1, 0.35 ); + box( node.origin, (-16,-16,0), (16,16,16), node.angles[1], color, 1, 1 ); + nodeForward = anglesToForward( node.angles ); + nodeForward = vector_scale( nodeForward, 8 ); + line( node.origin, node.origin + nodeForward, color, 1, 1 ); +} +ai_puppeteer_render_ai(ai, color) +{ + circle( ai.origin + (0,0,1), 15, color, false, true ); +} +ai_puppeteer_highlight_point(point, normal, forward, color) +{ + level endon("kill ai puppeteer"); + self endon("death"); + level.ai_puppet_highlighting = true; + maxTime = 0.7; + timer = 0; + waitTime = 0.15; + while( timer < maxTime ) + { + ai_puppeteer_render_point( point, normal, forward, color ); + timer += waitTime; + wait( waitTime ); + } + level.ai_puppet_highlighting = false; +} +ai_puppeteer_highlight_node(node) +{ + level endon("kill ai puppeteer"); + self endon("death"); + level.ai_puppet_highlighting = true; + maxTime = 0.7; + timer = 0; + waitTime = 0.15; + while( timer < maxTime ) + { + ai_puppeteer_render_node( node, (0,1,0) ); + timer += waitTime; + wait( waitTime ); + } + level.ai_puppet_highlighting = false; +} +ai_puppeteer_highlight_ai(ai, color) +{ + level endon("kill ai puppeteer"); + self endon("death"); + level.ai_puppet_highlighting = true; + maxTime = 0.7; + timer = 0; + waitTime = 0.15; + while( timer < maxTime && IsDefined(ai) ) + { + ai_puppeteer_render_ai( ai, color ); + timer += waitTime; + wait( waitTime ); + } + level.ai_puppet_highlighting = false; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_destructible.gsc b/BO1/PC/ZM/maps/_destructible.gsc new file mode 100644 index 0000000..363c5bd Binary files /dev/null and b/BO1/PC/ZM/maps/_destructible.gsc differ diff --git a/BO1/PC/ZM/maps/_detonategrenades.gsc b/BO1/PC/ZM/maps/_detonategrenades.gsc new file mode 100644 index 0000000..e509a25 --- /dev/null +++ b/BO1/PC/ZM/maps/_detonategrenades.gsc @@ -0,0 +1,370 @@ +#include common_scripts\utility; +#include maps\_utility; +init() +{ + level._effect[ "claymore_laser" ] = loadfx( "weapon/claymore/fx_claymore_laser" ); +} +watchGrenadeUsage() +{ + level.satchelexplodethisframe = false; + self endon( "death" ); + self.satchelarray = []; + self.claymore_array = []; + self.throwingGrenade = false; + self.gotPullbackNotify = false; + thread watch_satchel(); + thread watch_satchel_detonation(); + thread watch_claymores(); + self thread watch_for_throwbacks(); + for ( ;; ) + { + self waittill ( "grenade_pullback", weaponName ); + self.throwingGrenade = true; + self.gotPullbackNotify = true; + switch( weaponName ) + { + case "willy_pete_sp": + break; + default: + self begin_grenade_tracking(); + break; + } + } +} +begin_smoke_grenade_tracking() +{ + self waittill ( "grenade_fire", grenade, weaponName ); + if(!isdefined( level.smokegrenades ) ) + level.smokegrenades = 0; + if( level.smokegrenades > 2 && GetDvar( #"player_sustainAmmo") != "0" ) + grenade delete(); + else + grenade thread smoke_grenade_death(); +} +begin_mortar_tracking() +{ + self endon("death"); + self endon("disconnect"); + self waittill ( "grenade_fire", mortar, weaponName ); + if(weaponName == "mortar_round") + { + mortar thread mortar_death(); + } +} +mortar_death() +{ + self waittill_not_moving(); + earthquake(.55 ,3,self.origin,1500); + PlayRumbleOnPosition( "explosion_generic",self.origin ); +} +smoke_grenade_death() +{ + level.smokegrenades ++; + wait 50; + level.smokegrenades --; +} +begin_grenade_tracking() +{ + self endon ( "death" ); + self waittill ( "grenade_fire", grenade, weaponName ); + self maps\_dds::dds_notify_grenade( weaponName, ( self.team == "allies" ), false ); + self.throwingGrenade = false; +} +watch_for_throwbacks() +{ + 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; + self maps\_dds::dds_notify_grenade( weapname, ( self.team == "allies" ), true ); + } +} +begin_satchel_tracking() +{ + self endon ( "death" ); + self waittill_any ( "grenade_fire", "weapon_change" ); + self.throwingGrenade = false; +} +watch_satchel() +{ + while(1) + { + self waittill( "grenade_fire", satchel, weapname ); + if ( weapname == "satchel_charge_mp" || weapname == "satchel_charge_new" || weapname == "satchel_charge_sp") + { + self.satchelarray[self.satchelarray.size] = satchel; + satchel.owner = self; + satchel thread satchel_damage(); + } + } +} +watch_claymores() +{ + self endon( "spawned_player" ); + self endon( "disconnect" ); + while(1) + { + self waittill( "grenade_fire", claymore, weapname ); + if ( weapname == "claymore_sp" ) + { + claymore.owner = self; + claymore thread satchel_damage(); + claymore thread claymore_detonation(); + claymore thread play_claymore_effects(); + } + } +} +claymore_detonation() +{ + self endon("death"); + self waittill_not_moving(); + detonateRadius = 192; + spawnFlag = 1; + playerTeamToAllow = "axis"; + if( isDefined( self.owner ) && isDefined( self.owner.pers["team"] ) && self.owner.pers["team"] == "axis" ) + { + spawnFlag = 2; + playerTeamToAllow = "allies"; + } + damagearea = spawn("trigger_radius", self.origin + (0,0,0-detonateRadius), spawnFlag, detonateRadius, detonateRadius*2); + self thread delete_claymores_on_death( damagearea ); + if(!isdefined(level.claymores)) + level.claymores = []; + level.claymores = array_add( level.claymores, self ); + if( level.claymores.size > 15 && GetDvar( #"player_sustainAmmo") != "0" ) + level.claymores[0] delete(); + while(1) + { + damagearea waittill( "trigger", ent ); + if ( isdefined( self.owner ) && ent == self.owner ) + continue; + if( isDefined( ent.pers ) && isDefined( ent.pers["team"] ) && ent.pers["team"] != playerTeamToAllow ) + continue; + if ( ent damageConeTrace(self.origin, self) > 0 ) + { + self playsound ("claymore_activated_SP"); + wait 0.4; + if ( isdefined( self.owner ) ) + self detonate( self.owner ); + else + self detonate( undefined ); + return; + } + } +} +delete_claymores_on_death(ent) +{ + self waittill("death"); + level.claymores = array_remove_nokeys( level.claymores, self ); + wait .05; + if ( isdefined( ent ) ) + ent delete(); +} +watch_satchel_detonation() +{ + self endon("death"); + while(1) + { + self waittill( "detonate" ); + weap = self GetCurrentWeapon(); + if ( weap == "satchel_charge_sp" || weap == "ied_sp" ) + { + note = weap + "_detonated"; + self notify(note); + for ( i = 0; i < self.satchelarray.size; i++ ) + { + if ( isdefined(self.satchelarray[i]) ) + self.satchelarray[i] thread wait_and_detonate( 0.1 ); + } + self.satchelarray = []; + } + } +} +wait_and_detonate( delay ) +{ + self endon("death"); + wait delay; + earthquake(.35 ,3,self.origin,1500); + self detonate(); + self delete(); +} +satchel_damage() +{ + self.health = 100; + self setcandamage(true); + self.maxhealth = 100000; + self.health = self.maxhealth; + attacker = undefined; + while(1) + { + self waittill("damage", amount, attacker); + if ( !isplayer(attacker) ) + continue; + break; + } + if ( level.satchelexplodethisframe ) + wait .1 + randomfloat(.4); + else + wait .05; + if (!isdefined(self)) + return; + level.satchelexplodethisframe = true; + thread reset_satchel_explode_this_frame(); + self detonate( attacker ); +} +reset_satchel_explode_this_frame() +{ + wait .05; + level.satchelexplodethisframe = false; +} +saydamaged(orig, amount) +{ + for (i = 0; i < 60; i++) + { + print3d(orig, "damaged! " + amount); + wait .05; + } +} +play_claymore_effects() +{ + self endon("death"); + self waittill_not_moving(); + PlayFXOnTag( level._effect[ "claymore_laser" ], self, "tag_fx" ); +} +getDamageableEnts(pos, radius, doLOS, startRadius) +{ + ents = []; + if (!isdefined(doLOS)) + doLOS = false; + if ( !isdefined( startRadius ) ) + startRadius = 0; + players = get_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; + } + } + 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,.8)); + 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 damage_notify_wrapper( iDamage, eAttacker ); + } +} +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" ); + switch( sWeapon ) + { + case "concussion_grenade_mp": + radius = 512; + scale = 1 - (distance( self.origin, eInflictor.origin ) / radius); + time = 1 + (4 * scale); + wait ( 0.05 ); + self shellShock( "concussion_grenade_mp", time ); + break; + default: + break; + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_dev.gsc b/BO1/PC/ZM/maps/_dev.gsc new file mode 100644 index 0000000..fd0a587 Binary files /dev/null and b/BO1/PC/ZM/maps/_dev.gsc differ diff --git a/BO1/PC/ZM/maps/_drone.gsc b/BO1/PC/ZM/maps/_drone.gsc new file mode 100644 index 0000000..8adfe17 --- /dev/null +++ b/BO1/PC/ZM/maps/_drone.gsc @@ -0,0 +1,767 @@ +#include maps\_utility; +#include common_scripts\utility; +#include animscripts\utility; +#include animscripts\combat_utility; +#using_animtree( "generic_human" ); +init() +{ + if ( GetDvar( #"debug_drones" ) == "" ) + { + setdvar( "debug_drones", "0" ); + } + if (!isdefined(level.traceHeight)) + { + level.traceHeight = 400; + } + if (!isdefined(level.droneStepHeight)) + { + level.droneStepHeight = 100; + } + if( !isdefined( level.lookAhead_value ) ) + { + level.drone_lookAhead_value = 200; + } + if( !isdefined( level.drone_run_speed ) ) + { + level.drone_run_speed = 170; + } + if(!isdefined(level.max_drones)) + { + level.max_drones = []; + } + if(!isdefined(level.max_drones["allies"])) + { + level.max_drones["allies"] = 32; + } + if(!isdefined(level.max_drones["axis"])) + { + level.max_drones["axis"] = 32; + } + if(!isdefined(level.max_drones["neutral"])) + { + level.max_drones["neutral"] = 32; + } + if ( level.max_drones["axis"] > 32 ) + { + level.max_drones["axis"] = 32; + } + if ( level.max_drones["allies"] > 32 ) + { + level.max_drones["allies"] = 32; + } + if ( level.max_drones["neutral"] > 32 ) + { + level.max_drones["neutral"] = 32; + } + if(!isdefined(level.drones)) + { + level.drones = []; + } + if(!isdefined(level.drones["allies"])) + { + level.drones["allies"] = struct_arrayspawn(); + } + if(!isdefined(level.drones["axis"])) + { + level.drones["axis"] = struct_arrayspawn(); + } + if(!isdefined(level.drones["neutral"])) + { + level.drones["neutral"] = struct_arrayspawn(); + } + level.drone_anims[ "stand" ][ "idle" ] = %exposed_aim_5; + level.drone_anims[ "stand" ][ "run" ] = %drone_stand_run; + level.drone_anims[ "stand" ][ "death" ] = %drone_stand_death; + level.drone_anims[ "stand" ][ "aim_straight" ] = %stand_aim_straight; + level.drone_anims[ "stand" ][ "aim_up" ] = %stand_aim_up; + level.drone_anims[ "stand" ][ "aim_down" ] = %stand_aim_down; + level.drone_anims[ "stand" ][ "reload" ] = %exposed_crouch_reload; + level.drone_muzzleflash = loadfx ("weapon/muzzleflashes/fx_standard_flash"); + if ( isdefined ( level.droneExtraAnims ) ) + { + self thread [[ level.droneExtraAnims ]](); + } + level.drone_spawn_func = ::drone_init; +} +drone_init() +{ + assertEx( isdefined( level.max_drones ), "You need to put maps\_drone::init(); in your level script!" ); + if ( level.drones[ self.team ].array.size >= level.max_drones[ self.team ] ) + { + self delete(); + return; + } + structarray_add( level.drones[ self.team ], self ); + self.health = 150; + self setCanDamage( true ); + self.targetname = "drone"; + self useAnimTree( #animtree ); + if ( self.team == "allies" ) + { + self.voice = "american"; + self maps\_names::get_name(); + self setlookattext( self.name, &"" ); + } + if ( isdefined ( level.droneCallbackThread ) ) + { + self thread [[ level.droneCallbackThread ]](); + } + level thread maps\_friendlyfire::friendly_fire_think( self ); + if ( isdefined ( level.droneCustomDeath ) ) + { + self thread [[ level.droneCustomDeath ]](); + } + else + { + level thread drone_death_thread( self ); + } + if ( isdefined( self.target ) && !isdefined( self.script_moveoverride ) ) + { + self drone_move(); + } + self drone_idle(); +} +drone_death_thread( drone ) +{ + while( isdefined( drone ) ) + { + drone waittill( "damage" ); + if ( drone.health <= 0 ) + { + break; + } + } + drone death_notify_wrapper(); + drone stopAnimScripted(); + if ( isdefined( drone.skipDeathAnim ) ) + { + drone startragdoll(); + drone drone_play_anim( level.drone_anims[ "stand" ][ "death"] ); + } + else + { + drone drone_play_anim( level.drone_anims[ "stand" ][ "death"] ); + drone startragdoll(); + } + wait 10; + if ( isdefined( drone ) ) + { + drone delete(); + } +} +drone_play_anim( droneAnim ) +{ + if(IsDefined(self.need_notetrack)) + { + self thread drone_notetrack("drone_anim"); + } + self animscripted( "drone_anim", self.origin, self.angles, droneAnim ); + self waittillmatch( "drone_anim", "end" ); + self notify("stop_droneNoteTrack"); +} +drone_notetrack(msg) +{ + self endon("stop_droneNoteTrack"); + while( 1 ) + { + self waittill( msg, notetrack ); + if( notetrack == "start_ragdoll" ) + { + self StartRagdoll(); + wait(1); + break; + } + } +} +drone_idle() +{ + self stopAnimScripted(); + self thread drone_play_anim( level.drone_anims[ "stand" ][ "idle" ] ); +} +drone_move_to_ent( target_ent ) +{ + if(IsDefined(self)) + { + self.target = target_ent.targetname; + self.angles = VectorToAngles(target_ent.origin - self.origin); + self thread drone_move(); + } +} +drone_move_to_ent_and_fire( target_ent, other_target ) +{ + self endon("death"); + self notify("stop_firing"); + self thread drone_move_to_ent( target_ent ); + self waittill("goal"); + self drone_fire_at_target( other_target, true ); +} +drone_move_to_ent_and_delete( target_ent ) +{ + self thread delete_at_goal(); + self thread drone_move_to_ent( target_ent ); +} +delete_at_goal() +{ + self endon("death"); + self waittill("goal"); + self Delete(); +} +drone_move() +{ + self endon ("death"); + wait randomfloat( 0.5 ); + self thread drone_play_anim( level.drone_anims[ "stand" ][ "run" ] ); + nodes = self getPathArray( self.target, self.origin ); + assert( isdefined( nodes ) ); + assert( isdefined( nodes[0] ) ); + prof_begin( "drone_math" ); + currentNode_LookAhead = 0; + loopTime = 0.5; + for (;;) + { + if ( !isdefined( nodes[currentNode_LookAhead] ) ) + { + break; + } + vec1 = nodes[ currentNode_LookAhead ][ "vec" ]; + vec2 = ( self.origin - nodes[ currentNode_LookAhead ][ "origin" ] ); + distanceFromPoint1 = vectorDot( vectorNormalize( vec1 ), vec2 ); + if ( !isdefined( nodes[ currentNode_LookAhead ][ "dist" ] ) ) + { + break; + } + lookaheadDistanceFromNode = ( distanceFromPoint1 + level.drone_lookAhead_value ); + assert( isdefined( lookaheadDistanceFromNode ) ); + assert( isdefined( currentNode_LookAhead ) ); + assert( isdefined( nodes[ currentNode_LookAhead ] ) ); + assert( isdefined( nodes[ currentNode_LookAhead ][ "dist" ] ) ); + while ( lookaheadDistanceFromNode > nodes[ currentNode_LookAhead ][ "dist" ] ) + { + lookaheadDistanceFromNode = lookaheadDistanceFromNode - nodes[ currentNode_LookAhead ][ "dist" ]; + currentNode_LookAhead++; + if( !isdefined( nodes[ currentNode_LookAhead ][ "dist" ] ) ) + { + self rotateTo( vectorToAngles( nodes[ nodes.size -1 ][ "vec" ] ), loopTime ); + d = distance( self.origin, nodes[ nodes.size - 1 ][ "origin" ] ); + timeOfMove = ( d / level.drone_run_speed ); + moveToDest = physicstrace( nodes[ nodes.size -1 ][ "origin" ] + ( 0, 0, level.traceHeight ), nodes[ nodes.size - 1 ][ "origin" ] - ( 0, 0, level.traceHeight ) ); + self moveTo( moveToDest, timeOfMove ); + wait timeOfMove; + prof_end( "drone_math" ); + self notify ( "goal" ); + return; + } + if ( !isdefined( nodes[ currentNode_LookAhead ] ) ) + { + prof_end( "drone_math" ); + self notify ( "goal" ); + return; + } + assert( isdefined( nodes[ currentNode_LookAhead ] ) ); + } + assert( isdefined( nodes[ currentNode_LookAhead ][ "vec" ] ) ); + assert( isdefined( nodes[ currentNode_LookAhead ][ "vec" ][ 0 ] ) ); + assert( isdefined( nodes[ currentNode_LookAhead ][ "vec" ][ 1 ] ) ); + assert( isdefined( nodes[ currentNode_LookAhead ][ "vec" ][ 2 ] ) ); + desiredPosition = vector_scale ( nodes[ currentNode_LookAhead ][ "vec" ], lookaheadDistanceFromNode ); + desiredPosition = desiredPosition + nodes[ currentNode_LookAhead ][ "origin" ]; + lookaheadPoint = desiredPosition; + lookaheadPoint = physicstrace( lookaheadPoint + ( 0, 0, level.traceHeight ), lookaheadPoint - ( 0, 0, level.traceHeight ) ); + if ( GetDvar( #"debug_drones" ) == "1" ) + { + thread draw_line_for_time( self.origin + ( 0, 0, 16 ), lookaheadPoint, 1, 0, 0, loopTime ); + println ( lookaheadDistanceFromNode + "/" + nodes[ currentNode_LookAhead ]["dist"] + " units forward from node[" + currentNode_LookAhead + "]" ); + } + assert( isdefined ( lookaheadPoint ) ); + characterFaceDirection = VectorToAngles( lookaheadPoint - self.origin ); + assert( isdefined( characterFaceDirection ) ); + assert( isdefined( characterFaceDirection[ 0 ] ) ); + assert( isdefined( characterFaceDirection[ 1 ] ) ); + assert( isdefined( characterFaceDirection[ 2 ] ) ); + self rotateTo( ( 0, characterFaceDirection[ 1 ], 0 ), loopTime ); + characterDistanceToMove = ( level.drone_run_speed * loopTime ); + moveVec = vectorNormalize( lookaheadPoint - self.origin ); + desiredPosition = vector_scale ( moveVec, characterDistanceToMove ); + desiredPosition = desiredPosition + self.origin; + if ( GetDvar( #"debug_drones" ) == "1" ) + { + thread draw_line_for_time( self.origin, desiredPosition, 0, 0, 1, loopTime ); + } + self moveTo( desiredPosition, loopTime ); + wait loopTime; + } + prof_end( "drone_math" ); + self notify ( "goal" ); +} +getPathArray( firstTargetName, initialPoint ) +{ + usingNodes = true; + assert( isdefined( firstTargetName ) ); + prof_begin( "drone_math" ); + assert( isdefined( initialPoint ) ); + nodes = []; + nodes[ 0 ][ "origin" ] = initialPoint; + nodes[ 0 ][ "dist" ] = 0; + nextNodeName = undefined; + nextNodeName = firstTargetName; + for (;;) + { + index = nodes.size; + node = getstruct( nextNodeName, "targetname" ); + if ( !isdefined( node ) ) + { + if ( index == 0 ) + { + assertMsg( "Drone was told to walk to a node with a targetname that doesnt match a script_struct targetname" ); + } + break; + } + org = node.origin; + if ( isdefined( node.radius ) ) + { + assert( node.radius > 0 ); + if ( !isdefined( self.droneRunOffset ) ) + { + self.droneRunOffset = ( 0 - 1 + ( randomfloat( 2 ) ) ); + } + if ( !isdefined( node.angles ) ) + { + node.angles = ( 0, 0, 0 ); + } + prof_begin( "drone_math" ); + forwardVec = anglestoforward( node.angles ); + rightVec = anglestoright( node.angles ); + upVec = anglestoup( node.angles ); + relativeOffset = ( 0, ( self.droneRunOffset * node.radius ), 0 ); + org += vector_scale( forwardVec, relativeOffset[ 0 ] ); + org += vector_scale( rightVec, relativeOffset[ 1 ] ); + org += vector_scale( upVec, relativeOffset[ 2 ] ); + prof_end("drone_math"); + } + nodes[ index ][ "origin" ] = org; + nodes[ index - 1 ][ "dist" ] = distance( nodes[ index ][ "origin" ], nodes[ index - 1 ][ "origin" ] ); + nodes[ index - 1 ][ "vec" ] = vectorNormalize( nodes[ index ][ "origin" ] - nodes[ index - 1 ][ "origin" ] ); + if ( !isdefined( node.target ) ) + { + break; + } + nextNodeName = node.target; + } + nodes[ index ][ "vec" ] = nodes[ index - 1 ][ "vec" ]; + node = undefined; + prof_end( "drone_math" ); + return nodes; +} +drone_scripted_spawn( classname , spawn_script_origin ) +{ + assert( isdefined( level.dronestruct[ classname ] ) ); + struct = level.dronestruct[ classname ]; + drone = spawn( "script_model", spawn_script_origin.origin ); + drone.angles = spawn_script_origin.angles; + drone setmodel( struct.model ); + drone UseAnimTree( #animtree ); + drone makefakeai(); + attachedmodels = struct.attachedmodels; + attachedtags = struct.attachedtags; + for ( i = 0;i < attachedmodels.size;i++ ) + { + drone attach( attachedmodels[ i ], attachedtags[ i ] ); + } + if ( isdefined( spawn_script_origin.script_startingposition ) ) + { + drone.script_startingposition = spawn_script_origin.script_startingposition; + } + if ( isdefined( spawn_script_origin.script_noteworthy ) ) + { + drone.script_noteworthy = spawn_script_origin.script_noteworthy; + } + if ( isdefined( spawn_script_origin.script_deleteai ) ) + { + drone.script_deleteai = spawn_script_origin.script_deleteai; + } + if ( isdefined( spawn_script_origin.script_linkto ) ) + { + drone.script_linkto = spawn_script_origin.script_linkto; + } + if ( isdefined( spawn_script_origin.script_moveoverride ) ) + { + drone.script_moveoverride = spawn_script_origin.script_moveoverride; + } + if ( isdefined( spawn_script_origin.script_string ) ) + { + drone.script_string = spawn_script_origin.script_string; + } + if ( issubstr( classname, "ally" ) ) + { + drone.team = "allies"; + } + else if ( issubstr( classname, "enemy" ) || issubstr( classname, "axis" ) ) + { + drone.team = "axis"; + } + else + { + drone.team = "neutral"; + } + if ( isdefined( spawn_script_origin.target ) ) + { + drone.target = spawn_script_origin.target; + } + assert( isdefined( drone ) ); + if ( isdefined( spawn_script_origin.script_noteworthy ) && spawn_script_origin.script_noteworthy == "drone_delete_on_unload" ) + { + drone.drone_delete_on_unload = true; + } + else + { + drone.drone_delete_on_unload = false; + } + if( isdefined( spawn_script_origin.script_friendname ) ) + { + drone.script_friendname = spawn_script_origin.script_friendname; + } + drone drone_init(); + spawn_script_origin notify( "drone_spawned", drone ); + return drone; +} +drone_hide_weapon() +{ + tagname = "j_helmet"; + size = self getattachsize(); + for ( i = 0;i < size;i++ ) + { + model = self getattachmodelname( i ); + if (issubstr(model, "weapon")) + { + self.hidden_weapon = model; + self detach( model, "tag_weapon_right" ); + break; + } + } +} +drone_show_weapon() +{ + if( isDefined( self.hidden_weapon ) ) + { + weapon = getWeaponModel( self.hidden_weapon ); + self attach( self.hidden_weapon, "tag_weapon_right" ); + } +} +drone_fire_at_target( target, was_moving ) +{ + if(IsDefined(was_moving)) + { + self drone_idle(); + } + drone = self; + drone thread drone_track_ent( target ); + drone endon("death"); + drone endon("stop_firing"); + target endon("death"); + fire_count = RandomIntRange(6, 24); + temp_count = 0; + while(true) + { + if(Distance2d(drone.origin, target.origin) < 5000) + { + playfxontag(level.drone_muzzleflash, self, "tag_flash"); + MagicBullet("type99_rifle", drone GetTagOrigin("tag_flash"), target.origin); + wait(RandomFloatRange(1.0, 2.0)); + temp_count++; + } + else + { + wait(0.1); + } + if(temp_count > fire_count) + { + drone notify("stop_to_reload"); + fire_count = RandomIntRange(6, 24); + temp_count = 0; + drone stopAnimScripted(); + drone drone_play_anim( level.drone_anims[ "stand" ][ "reload" ]); + drone thread drone_track_ent( target ); + } + } +} +drone_fire_at_vehicle_type( _vehicletype, _range) +{ + self endon("death"); + self endon("stop vehicle target"); + if(!IsDefined(_range)) + { + _range = 5000; + } + my_target = -1; + while(1) + { + target_list = GetEntArray("script_vehicle", "classname"); + for(i = 0; i < target_list.size; i++) + { + if(target_list[i].vehicletype == _vehicletype) + { + if(distance(self.origin, target_list[i].origin) < _range) + { + my_target = i; + break; + } + } + } + if(my_target != -1) + { + self thread drone_fire_at_target(target_list[my_target]); + target_list[my_target] waittill("death"); + wait(1); + } + else + { + wait(0.5); + } + my_target = -1; + } +} +drone_track_ent( target ) +{ + drone = self; + drone endon("death"); + drone endon("stop_firing"); + drone endon("stop_to_reload"); + target endon("death"); + drone thread drone_track_ent_height( target); + drone stopAnimScripted(); + drone drone_play_anim( level.drone_anims[ "stand" ][ "aim_straight" ]); + drone.current_aim = "straight"; + while(1) + { + target_org = (target.origin[0], target.origin[1], 0); + drone_org = (drone.origin[0], drone.origin[1], 0); + drone.angles = VectorToAngles(target_org - drone_org); + wait(0.05); + } +} +drone_track_ent_height( target ) +{ + drone = self; + drone endon("death"); + drone endon("stop_firing"); + drone endon("stop_to_reload"); + target endon("death"); + drone stopAnimScripted(); + drone drone_play_anim( level.drone_anims[ "stand" ][ "aim_straight" ]); + drone.current_aim = "straight"; + while(1) + { + if(target.origin[2] - drone.origin[2] > 500) + { + if(drone.current_aim != "up") + { + drone stopAnimScripted(); + drone drone_play_anim( level.drone_anims[ "stand" ][ "aim_up" ]); + drone.current_aim = "up"; + } + } + else if(drone.origin[2] - target.origin[2] > 500) + { + if(drone.current_aim != "down") + { + drone stopAnimScripted(); + drone maps\_drone::drone_play_anim( level.drone_anims[ "stand" ][ "aim_down" ]); + drone.current_aim = "down"; + } + } + else + { + if(drone.current_aim != "straight") + { + drone drone_play_anim( level.drone_anims[ "stand" ][ "aim_straight" ]); + drone.current_aim = "straight"; + } + } + wait(0.05); + } +} +trackShootEntOrPos(target) +{ + if(IsDefined(self) && IsDefined(target)) + { + drone = self; + drone endon("death"); + drone endon("stop_firing"); + drone endon("stop_to_reload"); + target endon("death"); + drone.shootEnt = target; + drone.a = drone; + drone.a.aimweight = 0; + drone.a.aimweight_start = 0; + drone.a.aimweight_end = 0; + drone.a.aimweight_transframes = 0; + drone.rightAimLimit = 60; + drone.leftAimLimit = -60; + drone.upAimLimit = 75; + drone.downAimLimit = -75; + drone trackLoop( %exposed_aim_2, %exposed_aim_4, %exposed_aim_6, %exposed_aim_8 ); + } +} +trackLoop( aim2, aim4, aim6, aim8 ) +{ + self animscripts\shared::setAnimAimWeight( 1, .2 ); + players = get_players(); + deltaChangePerFrame = 5; + aimBlendTime = .05; + prevYawDelta = 0; + prevPitchDelta = 0; + maxYawDeltaChange = 5; + maxPitchDeltaChange = 5; + pitchAdd = 0; + yawAdd = 0; + doMaxAngleCheck = true; + yawDelta = 0; + pitchDelta = 0; + firstFrame = true; + for(;;) + { + animscripts\shared::incrAnimAimWeight(); + selfShootAtPos = (self.origin[0], self.origin[1], self.origin[2] + 60); + shootPos = self.shootPos; + if ( isdefined( self.shootEnt ) ) + { + shootPos = self.shootEnt getShootAtPos(); + } + if ( !isdefined( shootPos ) && self call_overloaded_func( "animscripts\cqb", "shouldCQB" ) ) + { + selfForward = anglesToForward( self.angles ); + if ( isdefined( self.cqb_target ) ) + { + shootPos = self.cqb_target getShootAtPos(); + dir = shootPos - selfShootAtPos; + vdot = vectorDot( dir, selfForward ); + if ( ( vdot < 0.0 ) || ( vdot * vdot < 0.413449 * lengthsquared( dir ) ) ) + { + shootPos = undefined; + } + } + if ( !isdefined( shootPos ) && isdefined( self.cqb_point_of_interest ) ) + { + shootPos = self.cqb_point_of_interest; + dir = shootPos - selfShootAtPos; + vdot = vectorDot( dir, selfForward ); + if ( ( vdot < 0.0 ) || ( vdot * vdot < 0.413449 * lengthsquared( dir ) ) ) + { + shootPos = undefined; + } + } + } + if ( !isdefined( shootPos ) ) + { + assert( !isdefined( self.shootEnt ) ); + if ( isdefined( self.node ) && self.node.type == "Guard" && distanceSquared(self.origin, self.node.origin) < 16 ) + { + yawDelta = AngleClamp180( self.angles[1] - self.node.angles[1] ); + pitchDelta = 0; + } + else + { + likelyEnemyDir = self getAnglesToLikelyEnemyPath(); + if ( isdefined( likelyEnemyDir ) ) + { + yawDelta = AngleClamp180( self.angles[1] - likelyEnemyDir[1] ); + pitchDelta = AngleClamp180( 360 - likelyEnemyDir[0] ); + } + else + { + yawDelta = 0; + pitchDelta = 0; + } + } + } + else + { + vectorToShootPos = shootPos - selfShootAtPos; + anglesToShootPos = vectorToAngles( vectorToShootPos ); + pitchDelta = 360 - anglesToShootPos[0]; + pitchDelta = AngleClamp180( pitchDelta + pitchAdd ); + yawDelta = self.angles[1] - anglesToShootPos[1]; + yawDelta = AngleClamp180( yawDelta + yawAdd ); + } + if ( doMaxAngleCheck && ( abs( yawDelta ) > 60 || abs( pitchDelta ) > 60 ) ) + { + yawDelta = 0; + pitchDelta = 0; + } + else + { + if ( yawDelta > self.rightAimLimit ) + { + yawDelta = self.rightAimLimit; + } + else if ( yawDelta < self.leftAimLimit ) + { + yawDelta = self.leftAimLimit; + } + if ( pitchDelta > self.upAimLimit ) + { + pitchDelta = self.upAimLimit; + } + else if ( pitchDelta < self.downAimLimit ) + { + pitchDelta = self.downAimLimit; + } + } + if ( firstFrame ) + { + firstFrame = false; + } + else + { + yawDeltaChange = yawDelta - prevYawDelta; + if ( abs( yawDeltaChange ) > maxYawDeltaChange ) + { + yawDelta = prevYawDelta + maxYawDeltaChange * sign( yawDeltaChange ); + } + pitchDeltaChange = pitchDelta - prevPitchDelta; + if ( abs( pitchDeltaChange ) > maxPitchDeltaChange ) + { + pitchDelta = prevPitchDelta + maxPitchDeltaChange * sign( pitchDeltaChange ); + } + } + prevYawDelta = yawDelta; + prevPitchDelta = pitchDelta; + if ( yawDelta > 0 ) + { + assert( yawDelta <= self.rightAimLimit ); + weight = yawDelta / self.rightAimLimit * self.a.aimweight; + self setAnimLimited( aim4, 0, aimBlendTime ); + self setAnimLimited( aim6, weight, aimBlendTime ); + } + else if ( yawDelta < 0 ) + { + assert( yawDelta >= self.leftAimLimit ); + weight = yawDelta / self.leftAimLimit * self.a.aimweight; + self setAnimLimited( aim6, 0, aimBlendTime ); + self setAnimLimited( aim4, weight, aimBlendTime ); + } + if ( pitchDelta > 0 ) + { + assert( pitchDelta <= self.upAimLimit ); + weight = pitchDelta / self.upAimLimit * self.a.aimweight; + self setAnimLimited( aim2, 0, aimBlendTime ); + self setAnimLimited( aim8, weight, aimBlendTime ); + } + else if ( pitchDelta < 0 ) + { + assert( pitchDelta >= self.downAimLimit ); + weight = pitchDelta / self.downAimLimit * self.a.aimweight; + self setAnimLimited( aim8, 0, aimBlendTime ); + self setAnimLimited( aim2, weight, aimBlendTime ); + } + if ( players.size == 1 ) + { + wait( 0.05 ); + } + else + { + wait( 1 ); + } + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_drones.gsc b/BO1/PC/ZM/maps/_drones.gsc new file mode 100644 index 0000000..90e2b63 --- /dev/null +++ b/BO1/PC/ZM/maps/_drones.gsc @@ -0,0 +1,1745 @@ +#include maps\_utility; +#include animscripts\Utility; +#include animscripts\SetPoseMovement; +#include animscripts\Combat_utility; +#include animscripts\shared; +#include common_scripts\Utility; +#include maps\_spawner; +#using_animtree( "fakeshooters" ); +init() +{ + setAnimArray(); + level.drone_impact = loadfx( "impacts/fx_flesh_hit" ); + level.drone_muzzleflash = loadfx( "weapon/muzzleflashes/fx_standard_flash" ); + if( !IsDefined( level.traceHeight ) ) + { + level.traceHeight = 400; + } + if( !IsDefined( level.droneStepHeight ) ) + { + level.droneStepHeight = 100; + } + if( !IsDefined( level.max_drones ) ) + { + level.max_drones = []; + } + if( !IsDefined( level.max_drones["axis"] ) ) + { + level.max_drones["axis"] = 32; + } + if( !IsDefined( level.max_drones["allies"] ) ) + { + level.max_drones["allies"] = 32; + } + if ( isSplitScreen() ) + { + level.max_drones["axis"] = 8; + level.max_drones["allies"] = 8; + } + if( !IsDefined( level.drones ) ) + { + level.drones = []; + } + if( !IsDefined( level.drones["axis"] ) ) + { + level.drones["axis"] = struct_arrayspawn(); + } + if( !IsDefined( level.drones["allies"] ) ) + { + level.drones["allies"] = struct_arrayspawn(); + } + array_thread( getentarray( "drone_axis", "targetname" ), ::drone_triggers_think ); + array_thread( getentarray( "drone_allies", "targetname" ), ::drone_triggers_think ); + flag_init("reached_drone_spawn_cap"); + level.MAX_DRONES_PER_FRAME = 10; + level.drone_spawned_this_frame = 0; + level thread reset_drone_throttle(); +} +build_struct_targeted_origins() +{ + if( !IsDefined( self.target ) ) + { + return; + } + self.targeted = getstructarray(self.target,"targetname"); +} +drone_triggers_think() +{ + self endon( "death" ); + if( self.targetname == "drone_allies" ) + { + team = "allies"; + } + else + { + team = "axis"; + } + self build_struct_targeted_origins(); + qFakeDeath = true; + if( ( IsDefined( self.script_allowdeath ) ) &&( self.script_allowdeath == 0 ) ) + { + qFakeDeath = false; + } + qSightTrace = false; + if( ( IsDefined( self.script_trace ) ) &&( self.script_trace > 0 ) ) + { + qSightTrace = true; + } + assert( IsDefined( self.targeted ) ); + assert( IsDefined( self.targeted[0] ) ); + if( IsDefined( self.script_ender ) ) + { + level endon( self.script_ender ); + } + self waittill( "trigger" ); + if( !IsDefined( self.script_repeat ) ) + { + repeat_times = 999999; + } + else + { + repeat_times = self.script_repeat; + } + if( ( ( IsDefined( self.script_noteworthy ) ) && ( self.script_noteworthy == "looping" ) ) || + ( isdefined( self.script_noteworthy ) && ( IsSubStr(self.script_noteworthy, "group") ) ) || + ( ( IsDefined( self.script_looping ) ) &&( self.script_looping > 0 ) ) + ) + { + assert( IsDefined( self.script_delay ) ||( IsDefined( self.script_delay_min ) && IsDefined( self.script_delay_max ) ) ); + self endon( "stop_drone_loop" ); + for( i = 0; i < repeat_times; i++ ) + { + level notify( "new drone Spawn wave" ); + spawnSize = undefined; + if( IsDefined( self.script_drones_min ) ) + { + max = self.targeted.size; + if( IsDefined( self.script_drones_max ) ) + { + max = self.script_drones_max; + } + if( self.script_drones_min == max ) + { + spawnSize = max; + } + else + { + spawnSize = ( self.script_drones_min + RandomInt( max - self.script_drones_min ) ); + } + } + self thread drone_spawngroup( self.targeted, qFakeDeath, spawnSize, qSightTrace, team ); + self drone_triggers_delay_first_spawn(); + if( ( IsDefined( self.script_requires_player ) ) &&( self.script_requires_player > 0 ) ) + { + self waittill( "trigger" ); + } + if( !IsDefined( self.script_repeat ) ) + { + repeat_times = 999999; + } + } + } + else + { + spawnSize = undefined; + if( IsDefined( self.script_drones_min ) ) + { + max = self.targeted.size; + if( IsDefined( self.script_drones_max ) ) + { + max = self.script_drones_max; + } + if( self.script_drones_min == max ) + { + spawnSize = max; + } + else + { + spawnSize = ( self.script_drones_min + RandomInt( max - self.script_drones_min ) ); + } + } + self drone_triggers_delay_first_spawn(); + self thread drone_spawngroup( self.targeted, qFakeDeath, spawnSize, qSightTrace, team ); + if( IsDefined( self.count ) && self.count > 1 ) + { + wait( 0.05 ); + self.count--; + self thread drone_triggers_think(); + } + } +} +drone_triggers_delay_first_spawn() +{ + if( IsDefined( self.script_delay ) ) + { + if( self.script_delay > 0 ) + { + wait( self.script_delay ); + } + } + else if( IsDefined( self.script_delay_min ) && IsDefined( self.script_delay_max ) ) + { + if( self.script_delay_max > self.script_delay_min ) + { + wait( RandomFloatRange( self.script_delay_min, self.script_delay_max ) ); + } + } +} +generate_offsets( spawncount ) +{ + offsets = []; + delta = 0.5 / spawncount; + for( i = 0; i < spawncount; i++ ) + { + id = randomint( spawncount * 2 ); + offsets[i] = id * delta; + } + return offsets; +} +drone_spawngroup( spawnpoint, qFakeDeath, spawnSize, qSightTrace, team ) +{ + spawncount = spawnpoint.size; + if( IsDefined( spawnSize ) ) + { + spawncount = spawnSize; + spawnpoint = array_randomize( spawnpoint ); + } + if( ( spawncount > spawnpoint.size ) && ( spawnpoint.size > 1 ) ) + { + spawncount = spawnpoint.size; + } + offsets = []; + if( isdefined( self.script_noteworthy ) && ( IsSubStr(self.script_noteworthy, "group") ) ) + offsets = generate_offsets( spawncount ); + for( i = 0; i < spawncount; i++ ) + { + if (IsDefined(self.script_int)) + { + wait RandomFloat(0.1, 1.0); + } + while(!self ok_to_trigger_spawn()) + wait_network_frame(); + if( i < spawnpoint.size ) + { + spawnpoint[i] thread drone_spawn( qFakeDeath, qSightTrace, team, offsets[i] ); + } + else + { + if( i > 0 && offsets[i-1] == offsets[i] ) + wait( randomfloat( .8, 1.1 ) ); + else + wait( randomfloat( .5, .9 ) ); + spawnpoint[spawnpoint.size - 1] thread drone_spawn( qFakeDeath, qSightTrace, team, offsets[i] ); + } + level._numTriggerSpawned ++; + } +} +#using_animtree( "fakeshooters" ); +drone_spawn( qFakeDeath, qSightTrace, team, offset,respawner ) +{ + if(!isDefined(respawner)) + { + level endon( "new drone Spawn wave" ); + } + if(isDefined(self.script_ender)) + { + level endon(self.script_ender); + } + if( !IsDefined( qFakeDeath ) ) + { + qFakeDeath = false; + } + if( !IsDefined( qSightTrace ) ) + { + qSightTrace = false; + } + check_drone_throttle(); + while( ( qSightTrace ) &&( self spawnpoint_playersView() ) ) + { + wait 0.2; + } + if( level.drones[team].lastindex > level.max_drones[team] ) + { + return; + } + if( isdefined( offset ) ) + spawnoffset = offset * 2 - 1; + else + spawnoffset = 0; + spawnpos = self.origin; + if( isdefined( self.radius ) ) + { + angles = ( 0, 0, 0 ); + if( isdefined( self.angles ) ) + angles = self.angles; + right = AnglesToRight( angles ); + spawnpos += vector_scale( right, ( spawnoffset * self.radius ) ); + } + level.drone_spawned_this_frame++; + guy = Spawn( "script_model", groundpos( spawnpos ) ); + guy.droneRunOffset = spawnoffset; + if( IsDefined( self.angles ) ) + { + guy.angles = self.angles; + } + else if( IsDefined( self.targeted ) ) + { + guy.angles = VectorToAngles( self.targeted[0].origin - guy.origin ); + } + assert( IsDefined( level.drone_spawnFunction[team] ) ); + if(IsDefined(level.drone_spawnFunction_passNode)) + { + guy [[level.drone_spawnFunction[team]]]( self ); + } + else + { + guy [[level.drone_spawnFunction[team]]](); + } + if(isDefined(self.weaponinfo)) + { + guy.weapon = self.weaponinfo; + weaponModel = GetWeaponModel( guy.weapon ); + guy Attach( weaponModel, "tag_weapon_right" ); + guy UseWeaponHideTags(guy.weapon); + guy.bulletsInClip = WeaponClipSize( guy.weapon ); + } + else + { + guy drone_assign_weapon( team ); + } + guy.targetname = "drone"; + guy.script_noteworthy = self.script_noteworthy; + guy MakeFakeAI(); + guy.team = team; + guy.fakeDeath = qFakeDeath; + guy drone_set_run_cycle(); + if( IsDefined(level.drone_run_rate) ) + { + guy.droneRunRate = level.drone_run_rate; + } + else if( IsDefined(level.drone_run_rate_multiplier) ) + { + guy.droneRunRate = guy.droneRunRate * level.drone_run_rate_multiplier; + } + guy thread drone_think( self ); + if(isDefined(self.script_string) && self.script_string == "respawn" ) + { + if(isDefined(self.script_ender) ) + { + level thread drone_respawn_after_death(guy,self,qFakeDeath, qSightTrace, team, offset,self.script_ender); + } + else + { + level thread drone_respawn_after_death(guy,self,qFakeDeath, qSightTrace, team, offset,undefined); + } + } +} +check_drone_throttle() +{ + can_spawn = false; + while(!can_spawn) + { + if(level.drone_spawned_this_frame > level.MAX_DRONES_PER_FRAME) + { + flag_set("reached_drone_spawn_cap"); + } + flag_waitopen("reached_drone_spawn_cap"); + wait(0.05); + if(level.drone_spawned_this_frame < level.MAX_DRONES_PER_FRAME) + { + can_spawn = true; + } + } +} +reset_drone_throttle() +{ + while(true) + { + waittillframeend; + flag_clear("reached_drone_spawn_cap"); + level.drone_spawned_this_frame = 0; + wait(0.05); + } +} +drone_respawn_after_death(guy,start_struct,qFakeDeath, qSightTrace, team, offset,ender) +{ + if(isDefined(ender)) + { + level endon(ender); + } + guy waittill("death"); + wait(randomintrange(3,5)); + if(isDefined(start_struct.script_string) && start_struct.script_string == "respawn") + { + start_struct thread drone_spawn(qFakeDeath, false, team, offset,1); + } +} +spawnpoint_playersView() +{ + if( !IsDefined( level.cos80 ) ) + { + level.cos80 = cos( 80 ); + } + players = get_players(); + player_view_count = 0; + success = false; + for( i = 0; i < players.size; i++ ) + { + prof_begin( "drone_math" ); + forwardvec = AnglesToForward( players[i].angles ); + normalvec = VectorNormalize( self.origin - players[i] GetOrigin() ); + vecdot = vectordot( forwardvec, normalvec ); + prof_end( "drone_math" ); + if( vecdot > level.cos80 ) + { + prof_begin( "drone_math" ); + success = BulletTracePassed( players[i] GetEye(), self.origin +( 0, 0, 48 ), false, self ); + prof_end( "drone_math" ); + if( success ) + { + player_view_count++; + } + } + } + if( player_view_count != 0 ) + { + return true; + } + return false; +} +drone_assign_weapon( team ) +{ + if( team == "allies" ) + { + if( IsDefined( level.drone_weaponlist_allies ) && level.drone_weaponlist_allies.size > 0 ) + { + if( level.drone_weaponlist_allies[0] == "unarmed" ) + { + self.weapon = undefined; + return; + } + randWeapon = RandomInt( level.drone_weaponlist_allies.size ); + self.weapon = level.drone_weaponlist_allies[randWeapon]; + ASSERTEX( IsDefined( self.weapon ), "_drones::couldn't assign weapon from level.drone_weaponlist because the array value is undefined." ); + } + else + { + switch( level.campaign ) + { + case "american": + self.weapon = drone_allies_assignWeapon_american(); + break; + case "british": + self.weapon = drone_allies_assignWeapon_british(); + break; + case "russian": + self.weapon = drone_allies_assignWeapon_russian(); + break; + } + } + } + else + { + if( IsDefined( level.drone_weaponlist_axis ) && level.drone_weaponlist_axis.size > 0 ) + { + randWeapon = RandomInt( level.drone_weaponlist_axis.size ); + self.weapon = level.drone_weaponlist_axis[randWeapon]; + ASSERTEX( IsDefined( self.weapon ), "_drones::couldn't assign weapon from level.drone_weaponlist because the array value is undefined." ); + } + else + { + switch( level.campaign ) + { + case "american": + self.weapon = drone_axis_assignWeapon_japanese(); + break; + case "british": + self.weapon = drone_axis_assignWeapon_german(); + break; + case "russian": + self.weapon = drone_axis_assignWeapon_german(); + break; + } + } + } + weaponModel = GetWeaponModel( self.weapon ); + self Attach( weaponModel, "tag_weapon_right" ); + self UseWeaponHideTags(self.weapon); + self.bulletsInClip = WeaponClipSize( self.weapon ); +} +drone_allies_assignWeapon_american() +{ + array = []; + array[array.size] = "m16_sp"; + return array[RandomInt( array.size )]; +} +drone_allies_assignWeapon_british() +{ + array = []; + array[array.size] = "m16_sp"; + return array[RandomInt( array.size )]; +} +drone_allies_assignWeapon_russian() +{ + array = []; + array[array.size] = "ak47_sp"; + return array[RandomInt( array.size )]; +} +drone_axis_assignWeapon_german() +{ + array = []; + array[array.size] = "ak47_sp"; + return array[RandomInt( array.size )]; +} +drone_axis_assignWeapon_japanese() +{ + array = []; + array[array.size] = "ak47_sp"; + return array[RandomInt( array.size )]; +} +drone_setName() +{ + wait( 0.25 ); + if( !IsDefined( self ) ) + { + return; + } + if( self.team != "allies" ) + { + return; + } + if( !IsDefined( level.names ) ) + { + maps\_names::setup_names(); + } + if( IsDefined( self.script_friendname ) ) + { + self.name = self.script_friendname; + } + else + { + switch( level.campaign ) + { + case "american": + self maps\_names::get_name_for_nationality( "american" ); + break; + case "russian": + self maps\_names::get_name_for_nationality( "russian" ); + break; + case "british": + self maps\_names::get_name_for_nationality( "british" ); + break; + } + } + assert( IsDefined( self.name ) ); + subText = undefined; + if( !IsDefined( self.weapon ) ) + { + subText = &""; + } + else + { + switch( self.weapon ) + { + case "commando_sp": + subText = &""; + break; + case "m1garand": + case "m1garand_wet": + case "lee_enfield": + case "m1carbine": + case "SVT40": + case "mosin_rifle": + subText = ( &"WEAPON_RIFLEMAN" ); + break; + case "thompson": + case "thompson_wet": + subText = ( &"WEAPON_SUBMACHINEGUNNER" ); + break; + case "BAR": + case "ppsh": + default: + subText = ( &"WEAPON_SUPPORTGUNNER" ); + break; + } + } + if( ( IsDefined( self.model ) ) &&( issubstr( self.model, "medic" ) ) ) + { + subText = ( &"WEAPON_MEDICPLACEHOLDER" ); + } + assert( IsDefined( subText ) ); + self setlookattext( self.name, &""); +} +drone_think( firstNode ) +{ + self endon( "death" ); + self.health = 1000000; + self thread drone_setName(); + if(self.team == "allies") + { + level thread maps\_friendlyfire::friendly_fire_think( self ); + } + self thread drones_clear_variables(); + structarray_add( level.drones[self.team], self ); + level notify( "new_drone" ); + if(IsDefined(level._drones_mg_target)) + { + self.turrettarget = Spawn( "script_origin", self.origin+( 0, 0, 50 ) ); + self.turrettarget LinkTo( self ); + } + self endon( "drone_death" ); + assert( IsDefined( firstNode ) ); + if( IsDefined( level.drone_think_func ) ) + { + self thread [[level.drone_think_func]](); + } + if( ( IsDefined( self.fakeDeath ) ) &&( self.fakeDeath == true ) ) + { + self thread drone_fakeDeath(); + } + self endon( "drone_shooting" ); + self.no_death_sink = false; + if( IsDefined( firstNode.script_drone_no_sink ) && firstNode.script_drone_no_sink ) + { + self.no_death_sink = true; + } + self drone_runChain( firstNode ); + wait( 0.05 ); + level notify("drone_at_last_node", self); + self.running = undefined; + idle_org = self.origin; + idle_ang = self.angles; + self useAnimTree( #animtree ); + idleAnim[0] = %stand_alert_1; + idleAnim[1] = %stand_alert_2; + idleAnim[2] = %stand_alert_3; + while( IsDefined( self ) ) + { + self AnimScripted( "drone_idle_anim", idle_org, idle_ang, idleAnim[RandomInt( idleAnim.size )] ); + self waittillmatch( "drone_idle_anim", "end" ); + } +} +#using_animtree( "fakeshooters" ); +drone_mortarDeath( direction ) +{ + self useAnimTree( #animtree ); + switch( direction ) + { + case "up": + self thread drone_doDeath( %death_explosion_up10 ); + break; + case "forward": + self thread drone_doDeath( %death_explosion_forward13 ); + break; + case "back": + self thread drone_doDeath( %death_explosion_back13 ); + break; + case "left": + self thread drone_doDeath( %death_explosion_left11 ); + break; + case "right": + self thread drone_doDeath( %death_explosion_right13 ); + break; + } +} +#using_animtree( "fakeshooters" ); +drone_flameDeath() +{ + self useAnimTree( #animtree ); + self thread drone_fakeDeath( true, true ); +} +#using_animtree( "fakeshooters" ); +drone_fakeDeath( instant, flamedeath ) +{ + if( !IsDefined( instant ) ) + { + instant = false; + } + self endon( "delete" ); + self endon( "drone_death" ); + explosivedeath = false; + explosion_ori = ( 0, 0, 0 ); + if(!IsDefined(flamedeath)) + { + flamedeath = false; + } + while( IsDefined( self ) ) + { + if( !instant ) + { + self SetCanDamage( true ); + self waittill( "damage", amount, attacker, direction_vec, damage_ori, type ); + if( type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" || type == "MOD_EXPLOSIVE" || + type == "MOD_EXPLOSIVE_SPLASH" || type == "MOD_PROJECTILE" || type == "MOD_PROJECTILE_SPLASH" ) + { + self.damageweapon = "none"; + explosivedeath = true; + explosion_ori = damage_ori; + } + else if( type == "MOD_BURNED" ) + { + flamedeath = true; + } + self death_notify_wrapper( attacker, type ); + if( self.team == "axis" && ( IsPlayer( attacker ) || attacker == level.playervehicle ) ) + { + level notify( "player killed drone" ); + } + } + if( ( IsDefined( self.customFirstAnim ) ) &&( self.customFirstAnim == true ) ) + { + self waittill( "customFirstAnim done" ); + } + if( !IsDefined( self ) ) + { + return; + } + self notify( "Stop shooting" ); + self.dontDelete = true; + deathAnim = undefined; + self useAnimTree( #animtree ); + if( explosivedeath ) + { + direction = drone_get_explosion_death_dir( self.origin, self.angles, explosion_ori, 50 ); + self thread drone_mortarDeath( direction ); + return; + } + else if( flamedeath ) + { + deaths[0] = %ai_flame_death_a; + deaths[1] = %ai_flame_death_b; + deaths[2] = %ai_flame_death_c; + deaths[3] = %ai_flame_death_d; + } + else if( IsDefined( self.running ) ) + { + deaths[0] = %death_run_stumble; + deaths[1] = %death_run_onfront; + deaths[2] = %death_run_onleft; + deaths[3] = %death_run_forward_crumple; + } + else + { + deaths[0] = %death_stand_dropinplace; + } + self thread drone_doDeath( deaths[RandomInt( deaths.size )] ); + return; + } +} +#using_animtree( "fakeshooters" ); +drone_delayed_bulletdeath( waitTime, deathRemoveNotify ) +{ + self endon( "delete" ); + self endon( "drone_death" ); + self.dontDelete = true; + if( !IsDefined( waitTime ) ) + { + waitTime = 0; + } + if( waitTime > 0 ) + { + wait( waitTime ); + } + self thread drone_fakeDeath( true ); +} +do_death_sound() +{ + camp = level.campaign; + team = self.team; + alias = undefined; + if(camp == "american" && team == "allies") + alias = "dds_generic_death_american"; + if(camp == "american" && team == "axis") + alias = "dds_generic_death_japanese"; + if(camp == "russian" && team == "allies") + alias = "dds_generic_death_russian"; + if(camp == "russian" && team == "axis") + alias = "dds_generic_death_german"; + if(camp == "vietnamese" && team == "axis") + alias = "dds_generic_death_vietnamese "; + if(IsDefined(alias) && SoundExists(alias) && !IsDefined(level._drones_sounds_disable)) + { + self thread play_sound_in_space( alias ); + } +} +#using_animtree( "fakeshooters" ); +drone_doDeath( deathAnim, deathRemoveNotify ) +{ + self moveTo( self.origin, 0.05, 0, 0 ); + traceDeath = false; + if( ( IsDefined( self.running ) ) && self.running ) + { + traceDeath = true; + } + self.running = undefined; + self notify( "drone_death" ); + self notify( "Stop shooting" ); + self Unlink(); + self useAnimTree( #animtree ); + self thread drone_doDeath_impacts(); + do_death_sound(); + prof_begin( "drone_math" ); + cancelRunningDeath = false; + if( traceDeath ) + { + offset = getcycleoriginoffset( self.angles, deathAnim ); + endAnimationLocation = ( self.origin + offset ); + endAnimationLocation = PhysicsTrace( ( endAnimationLocation +( 0, 0, 128 ) ), ( endAnimationLocation -( 0, 0, 128 ) ) ); + d1 = abs( endAnimationLocation[2] - self.origin[2] ); + if( d1 > 20 ) + { + cancelRunningDeath = true; + } + else + { + forwardVec = AnglesToForward( self.angles ); + rightVec = AnglesToRight( self.angles ); + upVec = anglestoup( self.angles ); + relativeOffset = ( 50, 0, 0 ); + secondPos = endAnimationLocation; + secondPos += vector_scale( forwardVec, relativeOffset[0] ); + secondPos += vector_scale( rightVec, relativeOffset[1] ); + secondPos += vector_scale( upVec, relativeOffset[2] ); + secondPos = PhysicsTrace( ( secondPos +( 0, 0, 128 ) ), ( secondPos -( 0, 0, 128 ) ) ); + d2 = abs( secondPos[2] - self.origin[2] ); + if( d2 > 20 ) + { + cancelRunningDeath = true; + } + } + } + prof_end( "drone_math" ); + if( cancelRunningDeath ) + { + deathAnim = %death_stand_dropinplace; + } + self animscripted( "drone_death_anim", self.origin, self.angles, deathAnim, "deathplant" ); + self thread drone_ragdoll( deathAnim ); + self waittillmatch( "drone_death_anim", "end" ); + if( !IsDefined( self ) ) + { + return; + } + self setcontents( 0 ); + if( IsDefined( deathRemoveNotify ) ) + { + level waittill( deathRemoveNotify ); + } + else + { + wait 3; + } + if( !IsDefined( self ) ) + { + return; + } + if( !IsDefined(self.no_death_sink) || (IsDefined(self.no_death_sink) && !self.no_death_sink )) + { + self MoveTo( self.origin - ( 0, 0, 100 ), 7 ); + wait( 3 ); + } + if( !IsDefined( self ) ) + { + return; + } + self.dontDelete = undefined; + self thread drone_delete(); +} +drone_ragdoll( deathAnim ) +{ + time = self GetAnimTime( deathAnim ); + wait( time * 0.55 ); + if( IsDefined( self.weapon ) ) + { + weaponModel = GetWeaponModel( self.weapon ); + if( IsDefined( weaponModel ) ) + { + self detach( weaponModel, "tag_weapon_right" ); + } + } + if( isdefined( level.no_drone_ragdoll ) && level.no_drone_ragdoll == true ) + { + } + else + { + self StartRagDoll(); + } +} +drone_doDeath_impacts() +{ + bone[0] = "J_Knee_LE"; + bone[1] = "J_Ankle_LE"; + bone[2] = "J_Clavicle_LE"; + bone[3] = "J_Shoulder_LE"; + bone[4] = "J_Elbow_LE"; + impacts = ( 1 + RandomInt( 2 ) ); + for( i = 0; i < impacts; i++ ) + { + playfxontag( level.drone_impact, self, bone[RandomInt( bone.size )] ); + if( !IsDefined(level._drones_sounds_disable)) + { + self PlaySound( "prj_bullet_impact_small_flesh" ); + } + wait( 0.05 ); + } +} +drone_runChain( point_start ) +{ + self endon( "drone_death" ); + self endon( "drone_shooting" ); + runPos = undefined; + while( IsDefined( self ) ) + { + if( IsDefined( point_start.script_death ) ) + { + self.dontDelete = true; + self thread drone_delayed_bulletdeath( 0 ); + } + else + if( ( IsDefined( point_start.script_death_min ) ) &&( IsDefined( point_start.script_death_max ) ) ) + { + self.dontDelete = true; + self thread drone_delayed_bulletdeath( point_start.script_death_min + RandomFloat( point_start.script_death_max - point_start.script_death_min ) ); + } + if( ( IsDefined( point_start.script_delete ) ) &&( point_start.script_delete >= 0 ) ) + { + self.dontDelete = undefined; + self thread drone_delete( point_start.script_delete ); + } + if( !IsDefined( point_start.targeted ) ) + { + break; + } + point_end = point_start.targeted; + if( ( !IsDefined( point_end ) ) ||( !IsDefined( point_end[0] ) ) ) + { + break; + } + index = RandomInt( point_end.size ); + runPos = groundpos( point_end[index].origin ); + if( IsDefined( point_end[index].radius ) ) + { + assert( point_end[index].radius > 0 ); + if( !IsDefined( self.droneRunOffset ) ) + { + self.droneRunOffset = ( 0 - 1 +( RandomFloat( 2 ) ) ); + } + if( !IsDefined( point_end[index].angles ) ) + { + point_end[index].angles = ( 0, 0, 0 ); + } + prof_begin( "drone_math" ); + forwardVec = AnglesToForward( point_end[index].angles ); + rightVec = AnglesToRight( point_end[index].angles ); + upVec = anglestoup( point_end[index].angles ); + relativeOffset = ( 0, ( self.droneRunOffset * point_end[index].radius ) , 0 ); + runPos += vector_scale( forwardVec, relativeOffset[0] ); + runPos += vector_scale( rightVec, relativeOffset[1] ); + runPos += vector_scale( upVec, relativeOffset[2] ); + prof_end( "drone_math" ); + } + script_noteworthy = point_start.script_noteworthy; + script_string = point_start.script_string; + script_int = point_start.script_int; + self ShooterRun( runPos, script_noteworthy, script_string, script_int ); + point_start = point_end[index]; + } + if( IsDefined( runPos ) ) + { + if( IsDefined( point_start.script_noteworthy ) ) + { + self ShooterRun( runPos, point_start.script_noteworthy ); + } + else + { + self ShooterRun( runPos ); + } + } + if( ( IsDefined( point_start.script_delete ) ) &&( point_start.script_delete >= 0 ) ) + { + self thread drone_delete( point_start.script_delete ); + } +} +drones_clear_variables() +{ + if( IsDefined( self.voice ) ) + { + self.voice = undefined; + } +} +drone_delete( delayTime ) +{ + if( ( IsDefined( delayTime ) ) &&( delayTime > 0 ) ) + { + wait( delayTime ); + } + if( !IsDefined( self ) ) + { + return; + } + self notify( "drone_death" ); + self notify( "drone_idle_anim" ); + if( !( is_in_array( level.drones[self.team].array, self ) ) ) + { + self Delete(); + return; + } + structarray_remove( level.drones[self.team], self ); + if( !IsDefined( self.dontDelete ) ) + { + if( IsDefined( self.turrettarget ) ) + { + self.turrettarget delete(); + } + if( IsDefined( self.shootTarget ) && !self.shootTarget is_vehicle()) + { + self.shootTarget delete(); + } + self detachall(); + self delete(); + } +} +#using_animtree( "fakeShooters" ); +ShooterRun( destinationPoint, event, target_targetname, script_int ) +{ + if( !IsDefined( self ) ) + { + return; + } + self endon("death"); + self notify( "Stop shooting" ); + self UseAnimTree( #animtree ); + prof_begin( "drone_math" ); + d = distance( self.origin, destinationPoint ); + if( !IsDefined( self.droneRunRate ) ) + { + self.droneRunRate = 200; + } + speed = ( d / self.droneRunRate ); + self.lowheight = false; + self turnToFacePoint( destinationPoint, speed ); + customFirstAnim = undefined; + if( IsDefined( event ) ) + { + switch( event ) + { + case "idle_then_alert": + AssertEX( IsDefined(level.droneidleanims) && level.droneidleanims.size > 0, "No drone idle anims setup for the level" ); + random_index = RandomInt(level.droneidleanims.size); + self ClearAnim( self.drone_run_cycle, 0 ); + self SetAnim(level.droneidleanims[random_index], 1, 0.05); + level waittill("alert_all_drones"); + self ClearAnim( level.droneidleanims[random_index], 0); + wait(RandomFloatRange(0.1, 0.5)); + self.idletextprint = "idle guy got to his next node"; + self.drone_run_cycle = drone_pick_run_anim(); + self.running = undefined; + break; + case "cheer_then_run": + AssertEx( IsDefined(level.droneidleanims) && level.droneidleanims.size > 0, "No drone idle anims setup for the level" ); + random_index = RandomInt(level.droneidleanims.size); + self ClearAnim( self.drone_run_cycle, 0); + self SetAnim(level.droneidleanims[random_index], 1, 0.05); + level waittill("alert_all_drones"); + wait(RandomFloatRange(0.1, 10.0)); + self ClearAnim( level.droneidleanims[random_index], 0); + break; + case "jump": + customFirstAnim = %jump_across_100; + break; + case "jumpdown": + customFirstAnim = %jump_down_56; + break; + case "wall_hop": + customFirstAnim = %traverse_wallhop; + break; + case "step_up": + customFirstAnim = %step_up_low_wall; + break; + case "trench_jump_out": + customFirstAnim = %ai_mantle_on_48; + break; + case "low_height": + self.lowheight = true; + break; + case "mortardeath_up": + self thread drone_mortarDeath( "up" ); + return; + case "mortardeath_forward": + self thread drone_mortarDeath( "forward" ); + return; + case "mortardeath_back": + self thread drone_mortarDeath( "back" ); + return; + case "mortardeath_left": + self thread drone_mortarDeath( "left" ); + return; + case "mortardeath_right": + self thread drone_mortarDeath( "right" ); + return; + case "shoot": + forwardVec = AnglesToForward( self.angles ); + rightVec = AnglesToRight( self.angles ); + upVec = anglestoup( self.angles ); + relativeOffset = ( 300, 0, 64 ); + shootPos = self.origin; + shootPos += vector_scale( forwardVec, relativeOffset[0] ); + shootPos += vector_scale( rightVec, relativeOffset[1] ); + shootPos += vector_scale( upVec, relativeOffset[2] ); + self.shootTarget = Spawn( "script_origin", shootPos ); + self thread ShooterShoot( self.shootTarget ); + return; + case "shoot_then_run_after_notify": + forwardVec = AnglesToForward( self.angles ); + rightVec = AnglesToRight( self.angles ); + upVec = anglestoup( self.angles ); + relativeOffset = ( 300, 0, 64 ); + shootPos = self.origin; + shootPos += vector_scale( forwardVec, relativeOffset[0] ); + shootPos += vector_scale( rightVec, relativeOffset[1] ); + shootPos += vector_scale( upVec, relativeOffset[2] ); + self.shootTarget = Spawn( "script_origin", shootPos ); + self thread ShooterShoot( self.shootTarget ); + self waittill ("Stop shooting"); + self ClearAnim(%combat_directions, 0); + self ClearAnim(%exposed_reload, 0); + break; + case "shoot_at_vehicle_then_move": + AssertEx(IsDefined(target_targetname), "Drone shooting at vehicle, but doesn't know which one, set .script_string on node"); + vehicleTarget = GetEnt(target_targetname, "targetname"); + self.shootTarget = vehicleTarget; + self.num_shots = script_int; + self thread ShooterShoot( self.shootTarget, true ); + self waittill("Stop shooting"); + self ClearAnim(%combat_directions, 0); + self ClearAnim(%exposed_reload, 0); + break; + case "cover_stand": + self thread drone_cover( event ); + self waittill( "drone out of cover" ); + self SetFlaggedAnimKnob( "cover_exit", %coverstand_trans_OUT_M, 1, .1, 1 ); + self waittillmatch( "cover_exit", "end" ); + break; + case "cover_crouch": + self thread drone_cover( event ); + self waittill( "drone out of cover" ); + self SetFlaggedAnimKnob( "cover_exit", %covercrouch_run_out_M, 1, .1, 1 ); + self waittillmatch( "cover_exit", "end" ); + break; + case "cover_crouch_fire": + self thread drone_cover_fire( event ); + self waittill( "drone out of cover" ); + self SetFlaggedAnimKnob( "cover_exit", %covercrouch_run_out_M, 1, 0.5, 1 ); + self waittillmatch( "cover_exit", "end" ); + break; + case "flamedeath": + self thread drone_flameDeath(); + break; + case "run_flame": + self SetCanDamage(false); + self drone_set_run_cycle( %ai_flame_death_run ); + self.droneRunRate = 100; + self.running = false; + self thread ShooterRun_doRunAnim(); + randomAnimRate = undefined; + d = distance( self.origin, destinationPoint ); + speed = ( d / self.droneRunRate ); + break; + case "run_fast": + self drone_set_run_cycle(); + self.running = false; + self thread ShooterRun_doRunAnim(); + randomAnimRate = undefined; + d = distance( self.origin, destinationPoint ); + speed = ( d / self.droneRunRate ); + break; + } + } + minRate = 0.5; + maxRate = 1.5; + randomAnimRate = minRate + RandomFloat( maxRate - minRate ); + if( IsDefined( customFirstAnim ) ) + { + self.customFirstAnim = true; + self.running = undefined; + randomAnimRate = undefined; + angles = VectorToAngles( destinationPoint - self.origin ); + offset = getcycleoriginoffset( angles, customFirstAnim ); + endPos = self.origin + offset; + endPos = PhysicsTrace( ( endPos +( 0, 0, 64 ) ), ( endPos -( 0, 0, level.traceHeight ) ) ); + t = getanimlength( customFirstAnim ); + assert( t > 0 ); + self ClearAnim( self.drone_run_cycle, 0 ); + self notify( "stop_run_anim" ); + self moveto( endPos, t, 0, 0 ); + self SetFlaggedAnimKnobRestart( "drone_custom_anim" , customFirstAnim ); + self waittillmatch( "drone_custom_anim", "end" ); + self.origin = endPos; + self notify( "customFirstAnim done" ); + d = distance( self.origin, destinationPoint ); + speed = ( d / self.droneRunRate ); + } + self.customFirstAnim = undefined; + self thread ShooterRun_doRunAnim( randomAnimRate ); + self drone_runto( destinationPoint, speed ); + prof_end( "drone_math" ); +} +drone_runto( destinationPoint, totalMoveTime ) +{ + if( totalMoveTime < 0.1 ) + { + return; + } + percentIncrement = 0.1; + percentage = 0.0; + incements = ( 1 / percentIncrement ); + dividedMoveTime = ( totalMoveTime * percentIncrement ); + startingPos = self.origin; + oldZ = startingPos[2]; + for( i = 0; i < incements; i++ ) + { + prof_begin( "drone_math" ); + percentage += percentIncrement; + x = ( destinationPoint[0] - startingPos[0] ) * percentage + startingPos[0]; + y = ( destinationPoint[1] - startingPos[1] ) * percentage + startingPos[1]; + if( self.lowheight == true ) + { + percentageMark = PhysicsTrace( ( x, y, destinationPoint[2] + 64 ), ( x, y, destinationPoint[2] - level.traceHeight ) ); + } + else + { + percentageMark = PhysicsTrace( ( x, y, destinationPoint[2] + level.traceHeight ), ( x, y, destinationPoint[2] - level.traceHeight ) ); + } + if( ( percentageMark[2] - oldZ ) > level.droneStepHeight ) + { + percentageMark = ( percentageMark[0], percentageMark[1], oldZ ); + } + oldZ = percentageMark[2]; + prof_end( "drone_math" ); + self moveTo( percentageMark, dividedMoveTime, 0, 0 ); + wait( dividedMoveTime ); + } +} +ShooterShoot( target, rpg, one_clip ) +{ + if( isDefined(rpg) && rpg == true ) + { + self thread ShooterShootThreadRPG( target ); + } + else + { + self thread ShooterShootThread( target, one_clip ); + } +} +#using_animtree( "fakeShooters" ); +ShooterShootThreadRPG( target ) +{ + self endon( "death" ); + self UseAnimTree( #animtree ); + self.running = undefined; + self thread aimAtTargetThread( target, "Stop shooting" ); + shootAnimLength = 0; + tag_flash = self.origin + (0,0,50); + if(!IsDefined(self.num_shots)) + { + self.num_shots = 1; + } + for( i = 0; i < self.num_shots; i++ ) + { + if( i > 0 ) + { + self SetFlaggedAnimKnobAllRestart( "reloadanim", %exposed_reload, %root, 1, 0.4 ); + wait( 1 + RandomFloat( 2 ) ); + } + self Set3FlaggedAnimKnobs( "no flag", "aim", "stand", 1, 0.3, 1 ); + wait( 1 + RandomFloat( 2) ); + AssertEX(IsDefined(level.drone_rpg), "No level.drone_rpg specified for drones to shoot with" ); + MagicBullet( level.drone_rpg, tag_flash, target.origin, self ); + wait( 1 + RandomFloat( 2) ); + } + self notify("Stop shooting"); +} +ShooterShootThread( target, one_clip ) +{ + self notify( "Stop shooting" ); + if( !isdefined(one_clip) ) + { + one_clip = false; + } + if (!IsDefined(self.script_noteworthy)) + { + self notify( "drone_shooting" ); + } + else if (IsDefined(self.script_noteworthy) && self.script_noteworthy != "run_n_gun_drones") + { + self notify( "drone_shooting" ); + } + self endon( "Stop shooting" ); + self UseAnimTree( #animtree ); + self.running = undefined; + self thread aimAtTargetThread( target, "Stop shooting" ); + shootAnimLength = 0; + while( IsDefined( self ) ) + { + if( self.bulletsInClip <= 0 ) + { + weaponModel = getWeaponModel( self.weapon ); + if( IsDefined( self.weaponModel ) ) + { + weaponModel = self.weaponModel; + } + numAttached = self getattachsize(); + attachName = []; + for( i = 0; i < numAttached; i++ ) + { + attachName[i] = self getattachmodelname( i ); + } + self SetFlaggedAnimKnobAllRestart( "reloadanim", %exposed_reload, %root, 1, 0.4 ); + self.bulletsInClip = randomintrange (4, 8); + self waittillmatch( "reloadanim", "end" ); + if( one_clip ) + { + self notify( "Stop shooting" ); + } + } + self Set3FlaggedAnimKnobs( "no flag", "aim", "stand", 1, 0.3, 1 ); + wait( 1 + RandomFloat( 2 ) ); + if( !IsDefined( self ) ) + { + return; + } + numShots = RandomInt( 4 )+1; + if( numShots > self.bulletsInClip ) + { + numShots = self.bulletsInClip; + } + for( i = 0; i < numShots; i++ ) + { + if( !IsDefined( self ) ) + { + return; + } + self Set3FlaggedAnimKnobsRestart( "shootinganim", "shoot", "stand", 1, 0.05, 1 ); + playfxontag( level.drone_muzzleflash, self, "tag_flash" ); + if(!IsDefined(level._drones_sounds_disable)) + { + if( self.team == "axis" ) + { + switch( level.campaign ) + { + case "american": + break; + case "russian": + self PlaySound( "wpn_mosin_fire" ); + break; + case "british": + self PlaySound( "wpn_mosin_fire" ); + break; + } + } + else + { + switch( level.campaign ) + { + case "american": + self PlaySound( "wpn_mosin_fire" ); + break; + case "russian": + self PlaySound( "wpn_mosin_fire" ); + break; + case "british": + self PlaySound( "wpn_mosin_fire" ); + break; + } + } + } + self.bulletsInClip--; + if( shootAnimLength == 0 ) + { + shootAnimLength = GetTime(); + self waittillmatch( "shootinganim", "end" ); + shootAnimLength = ( GetTime() - shootAnimLength ) / 1000; + } + else + { + wait( shootAnimLength - 0.1 + RandomFloat( 0.3 ) ); + if( !IsDefined( self ) ) + { + return; + } + } + } + } +} +ShooterRun_doRunAnim( animRateMod ) +{ + if( IsDefined( self.running ) && self.running ) + { + return; + } + self notify( "stop_shooterrun" ); + self endon( "stop_shooterrun" ); + self.running = true; + if( !IsDefined( animRateMod ) ) + { + animRateMod = 1.0; + } + self endon( "stop_run_anim" ); + adjustAnimRate = false; + while( ( IsDefined( self.running ) ) &&( self.running == true ) ) + { + animRate = ( self.droneRunRate / self.drone_run_cycle_speed ); + if( adjustAnimRate ) + { + animRate = ( animRate * animRateMod ); + adjustAnimRate = false; + } + self SetFlaggedAnimKnobRestart( "drone_run_anim" , self.drone_run_cycle, 1, .2, animRate ); + self waittillmatch( "drone_run_anim", "end" ); + if( !IsDefined( self ) ) + { + return; + } + } +} +drone_debugLine( fromPoint, toPoint, color, durationFrames ) +{ +} +turnToFacePoint( point, speed ) +{ + desiredAngles = VectorToAngles( point - self.origin ); + if( !IsDefined( speed ) ) + { + speed = 0.5; + } + else if( speed > 0.5 ) + { + speed = 0.5; + } + if( speed < 0.1 ) + { + return; + } + self rotateTo( ( 0, desiredAngles[1], 0 ), speed, 0, 0 ); +} +Set3FlaggedAnimKnobs( animFlag, animArray, pose, weight, blendTime, rate ) +{ + if( !IsDefined( self ) ) + { + return; + } + self setAnimKnob( %combat_directions, weight, blendTime, rate ); + self SetFlaggedAnimKnob( animFlag, level.drone_animArray[animArray][pose]["up"], 1, blendTime, 1 ); + self SetAnimKnob( level.drone_animArray[animArray][pose]["straight"], 1, blendTime, 1 ); + self SetAnimKnob( level.drone_animArray[animArray][pose]["down"], 1, blendTime, 1 ); +} +Set3FlaggedAnimKnobsRestart( animFlag, animArray, pose, weight, blendTime, rate ) +{ + if( !IsDefined( self ) ) + { + return; + } + self setAnimKnobRestart( %combat_directions, weight, blendTime, rate ); + self SetFlaggedAnimKnobRestart( animFlag, level.drone_animArray[animArray][pose]["up"], 1, blendTime, 1 ); + self SetAnimKnobRestart( level.drone_animArray[animArray][pose]["straight"], 1, blendTime, 1 ); + self SetAnimKnobRestart( level.drone_animArray[animArray][pose]["down"], 1, blendTime, 1 ); +} +applyBlend( offset ) +{ + if( offset < 0 ) + { + unstraightAnim = %combat_down; + self SetAnim( %combat_up, 0.01, 0, 1 ); + offset *= -1; + } + else + { + unstraightAnim = %combat_up; + self SetAnim( %combat_down, 0.01, 0, 1 ); + } + if( offset > 1 ) + { + offset = 1; + } + unstraight = offset; + if( unstraight >= 1.0 ) + { + unstraight = 0.99; + } + if( unstraight <= 0 ) + { + unstraight = 0.01; + } + straight = 1 - unstraight; + self SetAnim( unstraightAnim, unstraight, 0, 1 ); + self SetAnim( %combat_straight, straight, 0, 1 ); +} +aimAtTargetThread( target, stopString ) +{ + self endon( stopString ); + while( IsDefined( self ) ) + { + targetPos = target.origin; + turnToFacePoint( targetPos ); + offset = getTargetUpDownOffset( targetPos ); + applyBlend( offset ); + wait( 0.05 ); + } +} +getTargetUpDownOffset( target ) +{ + pos = self.origin; + dir = ( target[0] - pos[0], target[1] - pos[1], target[2] - pos[2] ); + dir = VectorNormalize( dir ); + return dir[2]; +} +setAnimArray() +{ + level.drone_animArray["aim"] ["stand"]["down"] = %stand_aim_down; + level.drone_animArray["aim"] ["stand"]["straight"] = %stand_aim_straight; + level.drone_animArray["aim"] ["stand"]["up"] = %stand_aim_up; + level.drone_animArray["aim"] ["crouch"]["down"] = %crouch_aim_down; + level.drone_animArray["aim"] ["crouch"]["straight"] = %crouch_aim_straight; + level.drone_animArray["aim"] ["crouch"]["up"] = %crouch_aim_up; + level.drone_animArray["auto"] ["stand"]["down"] = %stand_shoot_auto_down; + level.drone_animArray["auto"] ["stand"]["straight"] = %stand_shoot_auto_straight; + level.drone_animArray["auto"] ["stand"]["up"] = %stand_shoot_auto_up; + level.drone_animArray["auto"] ["crouch"]["down"] = %crouch_shoot_auto_down; + level.drone_animArray["auto"] ["crouch"]["straight"] = %crouch_shoot_auto_straight; + level.drone_animArray["auto"] ["crouch"]["up"] = %crouch_shoot_auto_up; + level.drone_animArray["shoot"] ["stand"]["down"] = %stand_shoot_down; + level.drone_animArray["shoot"] ["stand"]["straight"] = %stand_shoot_straight; + level.drone_animArray["shoot"] ["stand"]["up"] = %stand_shoot_up; + level.drone_animArray["shoot"] ["crouch"]["down"] = %crouch_shoot_down; + level.drone_animArray["shoot"] ["crouch"]["straight"] = %crouch_shoot_straight; + level.drone_animArray["shoot"] ["crouch"]["up"] = %crouch_shoot_up; +} +drone_cover_fire( type ) +{ + self endon( "drone_stop_cover" ); + self endon( "death" ); + while( true ) + { + drone_cover( type ); + self SetAnimKnob( %stand_aim_straight, 1, 0.3, 1 ); + wait(0.3); + forwardVec = AnglesToForward( self.angles ); + rightVec = AnglesToRight( self.angles ); + upVec = anglestoup( self.angles ); + relativeOffset = ( 300, 0, 0 ); + shootPos = self.origin; + shootPos += vector_scale( forwardVec, relativeOffset[0] ); + shootPos += vector_scale( rightVec, relativeOffset[1] ); + shootPos += vector_scale( upVec, relativeOffset[2] ); + if(isDefined(self.shootTarget)) + { + self.shootTarget Delete(); + } + self.shootTarget = Spawn( "script_origin", shootPos ); + self.bulletsInClip = randomint(4) + 3; + self thread ShooterShoot( self.shootTarget, false, true ); + self waittill( "Stop shooting" ); + } +} +drone_cover( type ) +{ + self endon( "drone_stop_cover" ); + if( !IsDefined( self.a ) ) + { + self.a = SpawnStruct(); + } + self.running = undefined; + self.a.array = []; + if( type == "cover_stand" ) + { + self.a.array["hide_idle"] = %coverstand_hide_idle; + self.a.array["hide_idle_twitch"] = array( + %coverstand_hide_idle_twitch01, + %coverstand_hide_idle_twitch02, + %coverstand_hide_idle_twitch03, + %coverstand_hide_idle_twitch04, + %coverstand_hide_idle_twitch05 + ); + self.a.array["hide_idle_flinch"] = array( + %coverstand_react01, + %coverstand_react02, + %coverstand_react03, + %coverstand_react04 + ); + self SetFlaggedAnimKnobRestart( "cover_approach", %coverstand_trans_IN_M, 1, .3, 1 ); + self waittillmatch( "cover_approach", "end" ); + self thread drone_cover_think(); + } + else if( type == "cover_crouch" ) + { + self.a.array["hide_idle"] = %covercrouch_hide_idle; + self.a.array["hide_idle_twitch"] = array( + %covercrouch_twitch_1, + %covercrouch_twitch_2, + %covercrouch_twitch_3, + %covercrouch_twitch_4 + ); + self SetFlaggedAnimKnobRestart( "cover_approach", %covercrouch_run_in_M, 1, .3, 1 ); + self waittillmatch( "cover_approach", "end" ); + self thread drone_cover_think(); + } + else if( type == "cover_crouch_fire" ) + { + self.a.array["hide_idle"] = %covercrouch_hide_idle; + self.a.array["hide_idle_twitch"] = array( + %covercrouch_twitch_1, + %covercrouch_twitch_2, + %covercrouch_twitch_3, + %covercrouch_twitch_4 + ); + self SetAnimKnob( %covercrouch_hide_idle, 1, 0.4, 1 ); + wait(0.4); + self drone_cover_think( 1 + randomint(3) ); + } +} +drone_cover_think( max_loops ) +{ + self endon( "drone_stop_cover" ); + if( !isdefined(max_loops) ) + { + max_loops = -1; + } + loops = 0; + while( loops < max_loops || max_loops == -1 ) + { + useTwitch = ( RandomInt( 2 ) == 0 ); + if( useTwitch ) + { + idleanim = animArrayPickRandom( "hide_idle_twitch" ); + } + else + { + idleanim = animarray( "hide_idle" ); + } + self drone_playIdleAnimation( idleAnim, useTwitch ); + loops++; + } +} +drone_playIdleAnimation( idleAnim, needsRestart ) +{ + self endon( "drone_stop_cover" ); + if( needsRestart ) + { + self SetFlaggedAnimKnobRestart( "idle", idleAnim, 1, .1, 1 ); + } + else + { + self SetFlaggedAnimKnob ( "idle", idleAnim, 1, .1, 1 ); + } + self.a.coverMode = "Hide"; + self waittillmatch( "idle", "end" ); +} +drone_get_explosion_death_dir( self_pos, self_angle, explosion_pos, up_distance ) +{ + if( Distance2D( self_pos, explosion_pos ) < up_distance ) + { + return "up"; + } + p1 = self_pos - VectorNormalize( AnglesToForward( self_angle ) ) * 10000; + p2 = self_pos + VectorNormalize( AnglesToForward( self_angle ) ) * 10000; + p_intersect = PointOnSegmentNearestToPoint( p1, p2, explosion_pos ); + side_away_dist = Distance2D( p_intersect, explosion_pos ); + side_close_dist = Distance2D( p_intersect, self_pos ); + if( side_close_dist != 0 ) + { + angle = ATan( side_away_dist / side_close_dist ); + dot_product = vectordot( AnglesToForward( self_angle ), VectorNormalize( explosion_pos - self_pos ) ); + if( dot_product < 0 ) + { + angle = 180 - angle; + } + if( angle < 45 ) + { + return "back"; + } + else if( angle > 135 ) + { + return "forward"; + } + } + self_right_angle = VectorNormalize( AnglesToRight( self_angle ) ); + right_point = self_pos + self_right_angle *( up_distance * 0.5 ); + if( Distance2D( right_point, explosion_pos ) < Distance2D( self_pos, explosion_pos ) ) + { + return "left"; + } + else + { + return "right"; + } +} +animArray( animname ) +{ + assert( IsDefined(self.a.array) ); + return self.a.array[animname]; +} +animArrayAnyExist( animname ) +{ + assert( IsDefined( self.a.array ) ); + return self.a.array[animname].size > 0; +} +animArrayPickRandom( animname ) +{ + assert( IsDefined( self.a.array ) ); + assert( self.a.array[animname].size > 0 ); + if ( self.a.array[animname].size > 1 ) + { + index = RandomInt( self.a.array[animname].size ); + } + else + { + index = 0; + } + return self.a.array[animname][index]; +} +#using_animtree( "fakeshooters" ); +drone_pick_run_anim() +{ + if(IsDefined(level.drone_run_cycle_override)) + { + if(IsArray(level.drone_run_cycle_override)) + { + return level.drone_run_cycle_override[RandomInt(level.drone_run_cycle_override.size)]; + } + else + { + return level.drone_run_cycle_override; + } + } + droneRunAnims = array( %combat_run_fast_3, + %run_n_gun_F, + %ai_viet_run_n_gun_F, + %ai_viet_run_lowready_f, + %ch_khe_E1B_troopssprint_1, + %ch_khe_E1B_troopssprint_2, + %ch_khe_E1B_troopssprint_3, + %ch_khe_E1B_troopssprint_4, + %ch_khe_E1B_troopssprint_5, + %ch_khe_E1B_troopssprint_6, + %ch_khe_E1B_troopssprint_7 ); + index = RandomInt( droneRunAnims.size ); + return droneRunAnims[index]; +} +drone_set_run_cycle( runAnim ) +{ + if( !IsDefined(runAnim) ) + { + runAnim = drone_pick_run_anim(); + } + self.drone_run_cycle = runAnim; + self.drone_run_cycle_speed = drone_run_anim_speed( runAnim ); + self.droneRunRate = self.drone_run_cycle_speed; +} +drone_run_anim_speed( runAnim ) +{ + run_cycle_delta = GetMoveDelta( runAnim, 0, 1 ); + run_cycle_dist = Length( run_cycle_delta ); + run_cycle_length = GetAnimLength( runAnim ); + run_cycle_speed = run_cycle_dist / run_cycle_length; + return run_cycle_speed; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_endmission.gsc b/BO1/PC/ZM/maps/_endmission.gsc new file mode 100644 index 0000000..9bd3862 --- /dev/null +++ b/BO1/PC/ZM/maps/_endmission.gsc @@ -0,0 +1,457 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_laststand; +main() +{ + missionSettings = []; + missionIndex = 0; + missionSettings = create_mission( ); + missionSettings add_level( "cuba", false, "", true, "SP_VWIN_FLASHPOINT", "SP_WIN_CUBA", false ); + missionSettings add_level( "so_narrative1_frontend",false, "", true, undefined, undefined, false ); + missionSettings add_level( "vorkuta", false, "", true, "SP_VWIN_FLASHPOINT", "SP_WIN_VORKUTA", false ); + missionSettings add_level( "pentagon", false, "", true, undefined, "SP_WIN_PENTAGON", false ); + missionSettings add_level( "flashpoint", false, "", true, "SP_VWIN_FLASHPOINT", "SP_WIN_FLASHPOINT", false ); + missionSettings add_level( "so_narrative2_frontend",false, "", true, undefined, undefined, false ); + missionSettings add_level( "khe_sanh", false, "", true, "SP_VWIN_HUE_CITY", "SP_WIN_KHE_SANH", false ); + missionSettings add_level( "hue_city", false, "", true, "SP_VWIN_HUE_CITY", "SP_WIN_HUE_CITY", false ); + missionSettings add_level( "kowloon", false, "", true, "SP_VWIN_FULLAHEAD", "SP_WIN_KOWLOON", false ); + missionSettings add_level( "so_narrative3_frontend",false, "", true, undefined, undefined, false ); + missionSettings add_level( "fullahead", false, "", true, "SP_VWIN_FULLAHEAD", "SP_WIN_FULLAHEAD", false ); + missionSettings add_level( "creek_1", false, "", true, "SP_VWIN_FULLAHEAD", undefined, false ); + missionSettings add_level( "so_narrative4_frontend",false, "", true, undefined, undefined, false ); + missionSettings add_level( "river", false, "", true, "SP_VWIN_RIVER", "SP_WIN_RIVER", false ); + missionSettings add_level( "wmd_sr71", false, "", true, "SP_VWIN_RIVER", undefined, false ); + missionSettings add_level( "wmd", false, "", true, "SP_VWIN_RIVER", undefined, false ); + missionSettings add_level( "pow", false, "", true, "SP_VWIN_RIVER", undefined, false ); + missionSettings add_level( "so_narrative5_frontend",false, "", true, undefined, undefined, false ); + missionSettings add_level( "rebirth", false, "", true, "SP_VWIN_UNDERWATERBASE", undefined, false ); + missionSettings add_level( "int_escape", false, "", true, undefined, "SP_WIN_INTERROGATION_ESCAPE", false ); + missionSettings add_level( "underwaterbase", false, "", true, "SP_VWIN_UNDERWATERBASE", undefined, false ); + missionSettings add_level( "outro", false, "", true, undefined, undefined, false ); + level.missionSettings = missionSettings; +} +_nextmission() +{ + level.nextmission = true; + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if(players[i] player_is_in_laststand()) + { + players[i] notify("player_revived"); + setClientSysState("lsm", "0", players[i]); + } + players[i] EnableInvulnerability(); + } + level_index = level.missionSettings get_level_index( level.script ); + if( arcadeMode() ) + { + level.arcadeMode_success = true; + flag_wait( "arcademode_ending_complete" ); + } + else + { + maps\_hud_message::waitTillNotifiesDone(); + } + SetSavedDvar( "ui_nextMission", "1" ); + SetDvar( "ui_showPopup", "0" ); + SetDvar( "ui_popupString", "" ); + if( !IsDefined( level_index ) ) + { + return; + } + if ( !coopGame() ) + { + level.missionSettings set_level_completed( level_index ); + if( GetDvarInt( #"mis_01" ) < level_index + 1 ) + { + set_mission_dvar( "mis_01", level_index + 1 ); + } + if( GetDvarInt( #"mis_01" ) == GetDvarInt( #"mis_01_unlock" ) && ( GetDvar( #"language" ) != "german" || GetDvar( #"allow_zombies_german" ) == "1" ) ) + { + set_mission_dvar( "mis_01", (GetDvarInt( #"mis_01_unlock" ) + 1) ); + } + UpdateGamerProfile(); + if( level.missionSettings has_achievement( level_index ) ) + { + players[0] giveachievement_wrapper( level.missionSettings get_achievement( level_index )); + } + if( level.missionSettings has_level_veteran_award( level_index ) && get_level_completed( level_index ) == 4 && level.missionSettings check_other_hasLevelVeteranAchievement( level_index ) ) + { + players[0] giveachievement_wrapper( level.missionSettings get_level_veteran_award( level_index ) ); + } + if( level.missionSettings has_campaign( level_index ) && level.missionSettings is_campaign_complete( level_index ) ) + { + players[0] giveachievement_wrapper( level.missionSettings get_campaign( level_index ) ); + } + } + nextlevel_index = level.missionSettings.levels.size; + nextlevel_index = level_index + 1; + if ( coopGame() ) + { + found = false; + for ( ; nextlevel_index < level.missionSettings.levels.size; nextlevel_index++ ) + { + if ( level.missionSettings get_coop( nextlevel_index ) ) + { + found = true; + break; + } + } + if ( !found ) + { + nextlevel_index = level.missionSettings get_first_coop_index(); + assert( nextlevel_index >= 0 ); + assert( nextlevel_index < level.missionSettings.levels.size ); + if ( IsSplitScreen() ) + { + if( !arcadeMode() ) + { + maps\_cooplogic::endGame(); + } + else + { + exitLevel( false ); + } + SetUINextLevel( level.missionSettings get_level_name( nextlevel_index ) ); + wait 1; + return; + } + } + } + if ( coopGame() && !IsSplitScreen() ) + { + if( !arcadeMode() ) + { + maps\_cooplogic::endGame(); + } + else + { + exitLevel( false ); + } + assert( nextlevel_index >= 0 ); + assert( nextlevel_index < level.missionSettings.levels.size ); + SetUINextLevel( level.missionSettings get_level_name( nextlevel_index ) ); + return; + } + if ( !coopGame() || IsSplitScreen() ) + { + if( level.missionSettings skip_success( level_index ) ) + { + ChangeLevel( level.missionSettings get_level_name( nextlevel_index ), level.missionSettings get_keep_weapons( level_index ) ); + } + else + { + if( level.script == "credits" ) + { + MissionSuccess( "credits", false ); + } + else if ( level.script == "outro" ) + { + MissionSuccess( "outro", false ); + } + else + { + MissionSuccess( level.missionSettings get_level_name( nextlevel_index ), level.missionSettings get_keep_weapons( level_index ) ); + } + } + } + if ( !coopGame() && !IsSplitScreen() ) + { + award = true; + hardcore_award = true; + for (i=0;i level.gameskill ) + { + return; + } + gameskill = level.gameskill; + newString = ""; + for( index = 0; index < missionString.size; index++ ) + { + if( index != levelOffset ) + { + newString += missionString[index]; + } + else + { + newString += gameskill + 1; + } + } + set_mission_dvar( "mis_difficulty", newString ); +} +set_mission_dvar( dvar, string ) +{ + if( maps\_cheat::is_cheating() || flag( "has_cheated" ) ) + { + return; + } + if( GetDvar( #"mis_cheat" ) == "1" ) + { + return; + } + SetMissionDvar( dvar, string ); +} +get_lowest_skill() +{ + missionString = GetDvar( #"mis_difficulty" ); + lowestSkill = 4; + for( index = 0; index < self.levels.size; index++ ) + { + if( Int( missionString[index] ) < lowestSkill ) + { + lowestSkill = Int( missionString[index] ); + } + } + return( lowestSkill ); +} +create_mission( ) +{ + mission = SpawnStruct(); + mission.levels = []; + return( mission ); +} +add_level( levelName, keepWeapons, achievement, skip_success, veteran_achievement, campaign, coop ) +{ + assert( IsDefined( keepweapons ) ); + level_index = self.levels.size; + self.levels[level_index] = SpawnStruct(); + self.levels[level_index].name = levelName; + self.levels[level_index].keepWeapons = keepWeapons; + self.levels[level_index].achievement = achievement; + self.levels[level_index].skip_success = skip_success; + self.levels[level_index].veteran_achievement = veteran_achievement; + self.levels[level_index].campaign = campaign; + self.levels[level_index].coop = coop; +} +get_level_index( levelName ) +{ + for( i = 0; i < self.levels.size; i++ ) + { + if( self.levels[i].name != levelName ) + { + continue; + } + return( i ); + } + return( undefined ); +} +get_level_name( level_index ) +{ + return( self.levels[level_index].name ); +} +get_keep_weapons( level_index ) +{ + return( self.levels[level_index].keepWeapons ); +} +get_achievement( level_index ) +{ + return( self.levels[level_index].achievement ); +} +get_level_veteran_award( level_index ) +{ + return( self.levels[level_index].veteran_achievement ); +} +has_level_veteran_award( level_index ) +{ + if( IsDefined( self.levels[level_index].veteran_achievement ) ) + { + return( true ); + } + else + { + return( false ); + } +} +has_achievement( level_index ) +{ + if( IsDefined( self.levels[level_index].achievement ) ) + { + return( true ); + } + else + { + return( false ); + } +} +is_campaign_complete( level_index ) +{ + campaign = self.levels[level_index].campaign; + count = 0; + complete_count = 0; + for( i = 0; i < self.levels.size; i++ ) + { + if( i == level_index ) + { + continue; + } + if( IsDefined( self.levels[i].campaign ) && IsDefined( campaign ) && self.levels[i].campaign == campaign ) + { + count++; + if( self get_level_completed( i ) > 0 ) + { + complete_count++; + } + } + } + if( count == complete_count ) + { + return true; + } + else + { + return false; + } +} +get_campaign( level_index ) +{ + return( self.levels[level_index].campaign ); +} +get_coop( level_index ) +{ + if ( self get_level_name( level_index ) == "credits" ) + { + return false; + } + if ( self get_level_name( level_index ) == "outro" ) + { + return false; + } + return self.levels[level_index].coop; +} +get_first_coop_index() +{ + for( i = 0; i < level.missionSettings.levels.size; i++ ) + { + if ( self get_coop( i ) ) + { + return i; + } + } + return -1; +} +has_campaign( level_index ) +{ + if( IsDefined( self.levels[level_index].campaign ) ) + { + return( true ); + } + else + { + return( false ); + } +} +check_other_hasLevelVeteranAchievement( level_index ) +{ + for( i = 0; i < self.levels.size; i++ ) + { + if( i == level_index ) + { + continue; + } + if( ! has_level_veteran_award( i ) ) + { + continue; + } + if( self.levels[i].veteran_achievement == self.levels[level_index].veteran_achievement ) + { + if( get_level_completed( i ) < 4 ) + { + return false; + } + } + } + return true; +} +skip_success( level_index ) +{ + if( !IsDefined( self.levels[level_index].skip_success ) ) + { + return false; + } + return true; +} +force_all_complete() +{ + println( "tada!" ); + missionString = GetDvar( #"mis_difficulty" ); + for( index = 0; index < missionString.size; index++ ) + { + set_level_completed( index ); + } +} +clearall() +{ + SetMissionDvar( "mis_difficulty", "00000000000000000000000000000000000000000000000000" ); + SetMissionDvar( "mis_01", 1 ); +} +credits_end() +{ + ChangeLevel( "" ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_explosive_bolt.gsc b/BO1/PC/ZM/maps/_explosive_bolt.gsc new file mode 100644 index 0000000..a52b5d4 Binary files /dev/null and b/BO1/PC/ZM/maps/_explosive_bolt.gsc differ diff --git a/BO1/PC/ZM/maps/_flamethrower_plight.gsc b/BO1/PC/ZM/maps/_flamethrower_plight.gsc new file mode 100644 index 0000000..043ef6e Binary files /dev/null and b/BO1/PC/ZM/maps/_flamethrower_plight.gsc differ diff --git a/BO1/PC/ZM/maps/_flareweapon.gsc b/BO1/PC/ZM/maps/_flareweapon.gsc new file mode 100644 index 0000000..a588616 Binary files /dev/null and b/BO1/PC/ZM/maps/_flareweapon.gsc differ diff --git a/BO1/PC/ZM/maps/_flashgrenades.gsc b/BO1/PC/ZM/maps/_flashgrenades.gsc new file mode 100644 index 0000000..20f83e4 Binary files /dev/null and b/BO1/PC/ZM/maps/_flashgrenades.gsc differ diff --git a/BO1/PC/ZM/maps/_friendlyfire.gsc b/BO1/PC/ZM/maps/_friendlyfire.gsc new file mode 100644 index 0000000..2ef1b55 Binary files /dev/null and b/BO1/PC/ZM/maps/_friendlyfire.gsc differ diff --git a/BO1/PC/ZM/maps/_fx.gsc b/BO1/PC/ZM/maps/_fx.gsc new file mode 100644 index 0000000..dda87ad Binary files /dev/null and b/BO1/PC/ZM/maps/_fx.gsc differ diff --git a/BO1/PC/ZM/maps/_gamemode.gsc b/BO1/PC/ZM/maps/_gamemode.gsc new file mode 100644 index 0000000..b5fbeb2 Binary files /dev/null and b/BO1/PC/ZM/maps/_gamemode.gsc differ diff --git a/BO1/PC/ZM/maps/_gameskill.gsc b/BO1/PC/ZM/maps/_gameskill.gsc new file mode 100644 index 0000000..63fce54 --- /dev/null +++ b/BO1/PC/ZM/maps/_gameskill.gsc @@ -0,0 +1,1931 @@ +#include maps\_utility; +#include animscripts\utility; +#include common_scripts\utility; +setSkill( reset, skill_override ) +{ + if ( !isdefined( level.script ) ) + { + level.script = tolower( GetDvar( #"mapname" ) ); + } + if ( !isdefined( reset ) || reset == false ) + { + if ( isdefined( level.gameSkill ) ) + { + return; + } + if ( !isdefined( level.custom_player_attacker ) ) + { + level.custom_player_attacker = ::return_false; + } + level.global_damage_func_ads = ::empty_kill_func; + level.global_damage_func = ::empty_kill_func; + level.global_kill_func = ::empty_kill_func; + set_console_status(); + flag_init( "player_has_red_flashing_overlay" ); + flag_init( "player_is_invulnerable" ); + flag_clear( "player_has_red_flashing_overlay" ); + flag_clear( "player_is_invulnerable" ); + level.difficultyType[ 0 ] = "easy"; + level.difficultyType[ 1 ] = "normal"; + level.difficultyType[ 2 ] = "hardened"; + level.difficultyType[ 3 ] = "veteran"; + level.difficultyString[ "easy" ] = &"GAMESKILL_EASY"; + level.difficultyString[ "normal" ] = &"GAMESKILL_NORMAL"; + level.difficultyString[ "hardened" ] = &"GAMESKILL_HARDENED"; + level.difficultyString[ "veteran" ] = &"GAMESKILL_VETERAN"; + level thread update_skill_on_change(); + } + if(!IsDefined(level.invulTime_onShield_multiplier)) + { + level.invulTime_onShield_multiplier = 1; + } + if(!IsDefined(level.player_attacker_accuracy_multiplier)) + { + level.player_attacker_accuracy_multiplier = 1; + } + level.gameSkill = GetDvarInt( #"g_gameskill" ); + if ( isdefined( skill_override ) ) + { + level.gameSkill = skill_override; + } + setdvar( "saved_gameskill", level.gameSkill ); + switch (level.gameSkill) + { + case 0: + setdvar ("currentDifficulty", "easy"); + break; + case 1: + setdvar ("currentDifficulty", "normal"); + break; + case 2: + setdvar ("currentDifficulty", "hardened"); + break; + case 3: + setdvar ("currentDifficulty", "veteran"); + break; + } + if ( GetDvar( #"autodifficulty_playerDeathTimer" ) == "" ) + { + setdvar( "autodifficulty_playerDeathTimer", 0 ); + } + anim.run_accuracy = 0.5; + logString( "difficulty: " + level.gameSkill ); + setdvar( "autodifficulty_frac", 0 ); + setdvar( "coop_difficulty_scaling", 1 ); + level.difficultySettings_stepFunc_percent = []; + level.difficultySettings_frac_data_points = []; + level.auto_adjust_threatbias = true; + setTakeCoverWarnings(); + thread increment_take_cover_warnings_on_death(); + level.mg42badplace_mintime = 8; + level.mg42badplace_maxtime = 16; + add_fractional_data_point( "playerGrenadeBaseTime", 0.0, 50000 ); + add_fractional_data_point( "playerGrenadeBaseTime", 0.25, 40000 ); + add_fractional_data_point( "playerGrenadeBaseTime", 0.75, 25000 ); + add_fractional_data_point( "playerGrenadeBaseTime", 1.0, 13500 ); + level.difficultySettings[ "playerGrenadeBaseTime" ][ "hardened" ] = 10000; + level.difficultySettings[ "playerGrenadeBaseTime" ][ "veteran" ] = 0; + add_fractional_data_point( "playerGrenadeRangeTime", 0.0, 22000 ); + add_fractional_data_point( "playerGrenadeRangeTime", 0.25, 20000 ); + add_fractional_data_point( "playerGrenadeRangeTime", 0.75, 15000 ); + add_fractional_data_point( "playerGrenadeRangeTime", 1.0, 7500 ); + level.difficultySettings[ "playerGrenadeRangeTime" ][ "hardened" ] = 5000; + level.difficultySettings[ "playerGrenadeRangeTime" ][ "veteran" ] = 1; + add_fractional_data_point( "playerDoubleGrenadeTime", 0.25, 60 * 60 * 1000 ); + add_fractional_data_point( "playerDoubleGrenadeTime", 0.75, 120 * 1000 ); + add_fractional_data_point( "playerDoubleGrenadeTime", 1.0, 20 * 1000 ); + level.difficultySettings[ "playerDoubleGrenadeTime" ][ "hardened" ] = 15 * 1000; + level.difficultySettings[ "playerDoubleGrenadeTime" ][ "veteran" ] = 0; + level.difficultySettings[ "double_grenades_allowed" ][ "easy" ] = false; + level.difficultySettings[ "double_grenades_allowed" ][ "normal" ] = true; + level.difficultySettings[ "double_grenades_allowed" ][ "hardened" ] = true; + level.difficultySettings[ "double_grenades_allowed" ][ "veteran" ] = true; + level.difficultySettings_stepFunc_percent[ "double_grenades_allowed" ] = 0.75; + add_fractional_data_point( "player_deathInvulnerableTime", 0.25, 4000 ); + add_fractional_data_point( "player_deathInvulnerableTime", 0.75, 1700 ); + add_fractional_data_point( "player_deathInvulnerableTime", 1.0, 850 ); + level.difficultySettings[ "player_deathInvulnerableTime" ][ "hardened" ] = 600; + level.difficultySettings[ "player_deathInvulnerableTime" ][ "veteran" ] = 100; + add_fractional_data_point( "threatbias", 0.0, 80 ); + add_fractional_data_point( "threatbias", 0.25, 100 ); + add_fractional_data_point( "threatbias", 0.75, 150 ); + add_fractional_data_point( "threatbias", 1.0, 165 ); + level.difficultySettings[ "threatbias" ][ "hardened" ] = 200; + level.difficultySettings[ "threatbias" ][ "veteran" ] = 400; + add_fractional_data_point( "longRegenTime", 1.0, 5000 ); + level.difficultySettings[ "longRegenTime" ][ "hardened" ] = 5000; + level.difficultySettings[ "longRegenTime" ][ "veteran" ] = 5000; + add_fractional_data_point( "healthOverlayCutoff", 0.25, 0.01 ); + add_fractional_data_point( "healthOverlayCutoff", 0.75, 0.2 ); + add_fractional_data_point( "healthOverlayCutoff", 1.0, 0.25 ); + level.difficultySettings[ "healthOverlayCutoff" ][ "hardened" ] = 0.3; + level.difficultySettings[ "healthOverlayCutoff" ][ "veteran" ] = 0.5; + add_fractional_data_point( "base_enemy_accuracy", 0.25, 1 ); + add_fractional_data_point( "base_enemy_accuracy", 0.75, 1 ); + level.difficultySettings[ "base_enemy_accuracy" ][ "hardened" ] = 1.3; + level.difficultySettings[ "base_enemy_accuracy" ][ "veteran" ] = 1.3; + add_fractional_data_point( "accuracyDistScale", 0.25, 1.0 ); + add_fractional_data_point( "accuracyDistScale", 0.75, 1.0 ); + level.difficultySettings[ "accuracyDistScale" ][ "hardened" ] = 1.0; + level.difficultySettings[ "accuracyDistScale" ][ "veteran" ] = 0.5; + add_fractional_data_point( "playerDifficultyHealth", 0.0, 550 ); + add_fractional_data_point( "playerDifficultyHealth", 0.25, 475 ); + add_fractional_data_point( "playerDifficultyHealth", 0.75, 310 ); + add_fractional_data_point( "playerDifficultyHealth", 1.0, 210 ); + level.difficultySettings[ "playerDifficultyHealth" ][ "hardened" ] = 165; + level.difficultySettings[ "playerDifficultyHealth" ][ "veteran" ] = 115; + add_fractional_data_point( "min_sniper_burst_delay_time", 0.0, 3.5 ); + add_fractional_data_point( "min_sniper_burst_delay_time", 0.25, 3.0 ); + add_fractional_data_point( "min_sniper_burst_delay_time", 0.75, 2.0 ); + add_fractional_data_point( "min_sniper_burst_delay_time", 1.0, 1.80 ); + level.difficultySettings[ "min_sniper_burst_delay_time" ][ "hardened" ] = 1.5; + level.difficultySettings[ "min_sniper_burst_delay_time" ][ "veteran" ] = 1.1; + add_fractional_data_point( "max_sniper_burst_delay_time", 0.0, 4.5 ); + add_fractional_data_point( "max_sniper_burst_delay_time", 0.25, 4.0 ); + add_fractional_data_point( "max_sniper_burst_delay_time", 0.75, 3.0 ); + add_fractional_data_point( "max_sniper_burst_delay_time", 1.0, 2.5 ); + level.difficultySettings[ "max_sniper_burst_delay_time" ][ "hardened" ] = 2.0; + level.difficultySettings[ "max_sniper_burst_delay_time" ][ "veteran" ] = 1.5; + add_fractional_data_point( "dog_health", 0.0, 0.2 ); + add_fractional_data_point( "dog_health", 0.25, 0.25 ); + add_fractional_data_point( "dog_health", 0.75, 0.75 ); + add_fractional_data_point( "dog_health", 1.0, 0.8 ); + level.difficultySettings[ "dog_health" ][ "hardened" ] = 1.0; + level.difficultySettings[ "dog_health" ][ "veteran" ] = 1.0; + add_fractional_data_point( "dog_presstime", 0.25, 415 ); + add_fractional_data_point( "dog_presstime", 0.75, 375 ); + level.difficultySettings[ "dog_presstime" ][ "hardened" ] = 250; + level.difficultySettings[ "dog_presstime" ][ "veteran" ] = 225; + level.difficultySettings[ "dog_hits_before_kill" ][ "easy" ] = 2; + level.difficultySettings[ "dog_hits_before_kill" ][ "normal" ] = 1; + level.difficultySettings[ "dog_hits_before_kill" ][ "hardened" ] = 0; + level.difficultySettings[ "dog_hits_before_kill" ][ "veteran" ] = 0; + level.difficultySettings_stepFunc_percent[ "dog_hits_before_kill" ] = 0.5; + level.difficultySettings[ "pain_test" ][ "easy" ] = ::always_pain; + level.difficultySettings[ "pain_test" ][ "normal" ] = ::always_pain; + level.difficultySettings[ "pain_test" ][ "hardened" ] = ::pain_protection; + level.difficultySettings[ "pain_test" ][ "veteran" ] = ::pain_protection; + anim.pain_test = level.difficultySettings[ "pain_test" ][ get_skill_from_index( level.gameskill ) ]; + level.difficultySettings[ "missTimeConstant" ][ "easy" ] = 1.0; + level.difficultySettings[ "missTimeConstant" ][ "normal" ] = 0.05; + level.difficultySettings[ "missTimeConstant" ][ "hardened" ] = 0; + level.difficultySettings[ "missTimeConstant" ][ "veteran" ] = 0; + level.difficultySettings_stepFunc_percent[ "missTimeConstant" ] = 0.5; + level.difficultySettings[ "missTimeDistanceFactor" ][ "easy" ] = 0.8 / 1000; + level.difficultySettings[ "missTimeDistanceFactor" ][ "normal" ] = 0.1 / 1000; + level.difficultySettings[ "missTimeDistanceFactor" ][ "hardened" ] = 0.05 / 1000; + level.difficultySettings[ "missTimeDistanceFactor" ][ "veteran" ] = 0; + level.difficultySettings_stepFunc_percent[ "missTimeDistanceFactor" ] = 0.5; + add_fractional_data_point( "flashbangedInvulFactor", 0.25, 0.25 ); + add_fractional_data_point( "flashbangedInvulFactor", 0.75, 0.0 ); + level.difficultySettings[ "flashbangedInvulFactor" ][ "easy" ] = 0.25; + level.difficultySettings[ "flashbangedInvulFactor" ][ "normal" ] = 0; + level.difficultySettings[ "flashbangedInvulFactor" ][ "hardened" ] = 0; + level.difficultySettings[ "flashbangedInvulFactor" ][ "veteran" ] = 0; + add_fractional_data_point( "invulTime_preShield", 0.0, 0.7 ); + add_fractional_data_point( "invulTime_preShield", 0.25, 0.6 ); + add_fractional_data_point( "invulTime_preShield", 0.75, 0.35 ); + add_fractional_data_point( "invulTime_preShield", 1.0, 0.3 ); + level.difficultySettings[ "invulTime_preShield" ][ "hardened" ] = 0.1; + level.difficultySettings[ "invulTime_preShield" ][ "veteran" ] = 0.0; + add_fractional_data_point( "invulTime_onShield", 0.0, 1.0 ); + add_fractional_data_point( "invulTime_onShield", 0.25, 0.8 ); + add_fractional_data_point( "invulTime_onShield", 0.75, 0.5 ); + add_fractional_data_point( "invulTime_onShield", 1.0, 0.3 ); + level.difficultySettings[ "invulTime_onShield" ][ "hardened" ] = 0.1; + level.difficultySettings[ "invulTime_onShield" ][ "veteran" ] = 0.05; + add_fractional_data_point( "invulTime_postShield", 0.0, 0.6 ); + add_fractional_data_point( "invulTime_postShield", 0.25, 0.5 ); + add_fractional_data_point( "invulTime_postShield", 0.75, 0.3 ); + add_fractional_data_point( "invulTime_postShield", 1.0, 0.2 ); + level.difficultySettings[ "invulTime_postShield" ][ "hardened" ] = 0.1; + level.difficultySettings[ "invulTime_postShield" ][ "veteran" ] = 0.0; + add_fractional_data_point( "playerHealth_RegularRegenDelay", 0.0, 3500 ); + add_fractional_data_point( "playerHealth_RegularRegenDelay", 0.25, 3000 ); + add_fractional_data_point( "playerHealth_RegularRegenDelay", 0.75, 2400 ); + add_fractional_data_point( "playerHealth_RegularRegenDelay", 1.0, 1500 ); + level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "hardened" ] = 1200; + level.difficultySettings[ "playerHealth_RegularRegenDelay" ][ "veteran" ] = 1200; + add_fractional_data_point( "worthyDamageRatio", 0.25, 0.0 ); + add_fractional_data_point( "worthyDamageRatio", 0.75, 0.1 ); + level.difficultySettings[ "worthyDamageRatio" ][ "hardened" ] = 0.1; + level.difficultySettings[ "worthyDamageRatio" ][ "veteran" ] = 0.1; + level.difficultySettings[ "explosivePlantTime" ][ "easy" ] = 10; + level.difficultySettings[ "explosivePlantTime" ][ "normal" ] = 10; + level.difficultySettings[ "explosivePlantTime" ][ "hardened" ] = 5; + level.difficultySettings[ "explosivePlantTime" ][ "veteran" ] = 5; + level.explosiveplanttime = level.difficultySettings[ "explosivePlantTime" ][ get_skill_from_index( level.gameskill ) ]; + level.difficultySettings[ "difficultyBasedAccuracy" ][ "easy" ] = 1; + level.difficultySettings[ "difficultyBasedAccuracy" ][ "normal" ] = 1; + level.difficultySettings[ "difficultyBasedAccuracy" ][ "hardened" ] = 1; + level.difficultySettings[ "difficultyBasedAccuracy" ][ "veteran" ] = 1.25; + anim.difficultyBasedAccuracy = getRatio( "difficultyBasedAccuracy", level.gameskill, level.gameskill ); + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "easy" ][0] = 1.0; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "easy" ][1] = 0.9; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "easy" ][2] = 0.8; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "easy" ][3] = 0.7; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "normal" ][0] = 1.0; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "normal" ][1] = 0.9; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "normal" ][2] = 0.8; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "normal" ][3] = 0.7; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "hardened" ][0] = 1.00; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "hardened" ][1] = 0.9; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "hardened" ][2] = 0.8; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "hardened" ][3] = 0.7; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "veteran" ][0] = 1.0; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "veteran" ][1] = 0.9; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "veteran" ][2] = 0.8; + level.difficultySettings[ "coopPlayer_deathInvulnerableTime" ][ "veteran" ][3] = 0.7; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "easy" ][0] = 1.00; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "easy" ][1] = 0.95; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "easy" ][2] = 0.8; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "easy" ][3] = 0.75; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "normal" ][0] = 1.00; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "normal" ][1] = 0.9; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "normal" ][2] = 0.8; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "normal" ][3] = 0.7; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "hardened" ][0] = 1.00; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "hardened" ][1] = 0.85; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "hardened" ][2] = 0.7; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "hardened" ][3] = 0.65; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "veteran" ][0] = 1.00; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "veteran" ][1] = 0.8; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "veteran" ][2] = 0.6; + level.difficultySettings[ "coopPlayerDifficultyHealth" ][ "veteran" ][3] = 0.5; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "easy" ][0] = 1; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "easy" ][1] = 1.1; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "easy" ][2] = 1.2; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "easy" ][3] = 1.3; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "normal" ][0] = 1; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "normal" ][1] = 1.1; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "normal" ][2] = 1.3; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "normal" ][3] = 1.5; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "hardened" ][0] = 1.0; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "hardened" ][1] = 1.2; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "hardened" ][2] = 1.4; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "hardened" ][3] = 1.6; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "veteran" ][0] = 1; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "veteran" ][1] = 1.3; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "veteran" ][2] = 1.6; + level.difficultySettings[ "coopEnemyAccuracyScalar" ][ "veteran" ][3] = 2; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "easy" ][0] = 1; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "easy" ][1] = 0.9; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "easy" ][2] = 0.8; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "easy" ][3] = 0.7; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "normal" ][0] = 1; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "normal" ][1] = 0.8; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "normal" ][2] = 0.7; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "normal" ][3] = 0.6; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "hardened" ][0] = 1; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "hardened" ][1] = 0.7; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "hardened" ][2] = 0.5; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "hardened" ][3] = 0.5; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "veteran" ][0] = 1; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "veteran" ][1] = 0.7; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "veteran" ][2] = 0.5; + level.difficultySettings[ "coopFriendlyAccuracyScalar" ][ "veteran" ][3] = 0.4; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "easy" ][0] = 1; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "easy" ][1] = 1.1; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "easy" ][2] = 1.2; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "easy" ][3] = 1.3; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "normal" ][0] = 1; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "normal" ][1] = 2; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "normal" ][2] = 3; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "normal" ][3] = 4; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "hardened" ][0] = 1.0; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "hardened" ][1] = 3; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "hardened" ][2] = 6; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "hardened" ][3] = 9; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "veteran" ][0] = 1; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "veteran" ][1] = 10; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "veteran" ][2] = 20; + level.difficultySettings[ "coopFriendlyThreatBiasScalar" ][ "veteran" ][3] = 30; + level.difficultySettings[ "lateralAccuracyModifier" ][ "easy" ] = 300; + level.difficultySettings[ "lateralAccuracyModifier" ][ "normal" ] = 700; + level.difficultySettings[ "lateralAccuracyModifier" ][ "hardened" ] = 1000; + level.difficultySettings[ "lateralAccuracyModifier" ][ "veteran" ] = 2500; + level.lastPlayerSighted = 0; + difficulty_starting_frac[ "easy" ] = 0.25; + difficulty_starting_frac[ "normal" ] = 0.75; + if ( level.gameskill <= 1 ) + { + { + dif_frac = difficulty_starting_frac[ get_skill_from_index( level.gameskill ) ]; + dif_frac = int( dif_frac * 100 ); + setdvar( "autodifficulty_frac", dif_frac ); + } + set_difficulty_from_current_aa_frac(); + } + else + { + set_difficulty_from_locked_settings(); + } + setdvar( "autodifficulty_original_setting", level.gameskill ); + if( GetDvar( #"g_gametype" ) != "vs" ) + { + setsaveddvar( "player_meleeDamageMultiplier", 100 / 250 ); + } + thread coop_enemy_accuracy_scalar_watcher(); + thread coop_friendly_accuracy_scalar_watcher(); + thread coop_player_threat_bias_adjuster(); + thread coop_spawner_count_adjuster(); +} +get_skill_from_index( index ) +{ + return level.difficultyType[ index ]; +} +apply_difficulty_frac_with_func( difficulty_func, current_frac ) +{ + level.invulTime_preShield = [[ difficulty_func ]]( "invulTime_preShield", current_frac ); + level.invulTime_onShield = [[ difficulty_func ]]( "invulTime_onShield", current_frac ) * level.invulTime_onShield_multiplier; + level.invulTime_postShield = [[ difficulty_func ]]( "invulTime_postShield", current_frac ); + level.playerHealth_RegularRegenDelay = [[ difficulty_func ]]( "playerHealth_RegularRegenDelay", current_frac ); + level.worthyDamageRatio = [[ difficulty_func ]]( "worthyDamageRatio", current_frac ); + if ( level.auto_adjust_threatbias ) + { + thread apply_threat_bias_to_all_players(difficulty_func, current_frac); + } + level.longRegenTime = [[ difficulty_func ]]( "longRegenTime", current_frac ); + level.healthOverlayCutoff = [[ difficulty_func ]]( "healthOverlayCutoff", current_frac ); + anim.player_attacker_accuracy = [[ difficulty_func ]]( "base_enemy_accuracy", current_frac ) * level.player_attacker_accuracy_multiplier; + level.attackeraccuracy = anim.player_attacker_accuracy; + anim.playerGrenadeBaseTime = int( [[ difficulty_func ]]( "playerGrenadeBaseTime", current_frac ) ); + anim.playerGrenadeRangeTime = int( [[ difficulty_func ]]( "playerGrenadeRangeTime", current_frac ) ); + anim.playerDoubleGrenadeTime = int( [[ difficulty_func ]]( "playerDoubleGrenadeTime", current_frac ) ); + anim.min_sniper_burst_delay_time = [[ difficulty_func ]]( "min_sniper_burst_delay_time", current_frac ); + anim.max_sniper_burst_delay_time = [[ difficulty_func ]]( "max_sniper_burst_delay_time", current_frac ); + anim.dog_health = [[ difficulty_func ]]( "dog_health", current_frac ); + anim.dog_presstime = [[ difficulty_func ]]( "dog_presstime", current_frac ); + setsaveddvar( "ai_accuracyDistScale", [[ difficulty_func ]]( "accuracyDistScale", current_frac ) ); + thread coop_damage_and_accuracy_scaling(difficulty_func, current_frac); +} +apply_threat_bias_to_all_players(difficulty_func, current_frac) +{ + while (!isdefined (level.flag) || !isdefined(level.flag[ "all_players_connected" ])) + { + wait 0.05; + continue; + } + flag_wait( "all_players_connected" ); + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + players[i].threatbias = int( [[ difficulty_func ]]( "threatbias", current_frac ) ); + } +} +coop_damage_and_accuracy_scaling( difficulty_func, current_frac ) +{ + while (!isdefined (level.flag)) + { + wait 0.05; + } + while (!isdefined (level.flag["all_players_spawned"])) + { + wait 0.05; + } + flag_wait( "all_players_spawned" ); + players = get_players(); + coop_healthscalar = getCoopValue( "coopPlayerDifficultyHealth", players.size ); + if( GetDvar( #"g_gametype" ) != "vs" ) + { + setsaveddvar( "player_damageMultiplier", 100 / ([[ difficulty_func ]]( "playerDifficultyHealth", current_frac ) * coop_healthscalar) ); + coop_invuln_remover = getCoopValue( "coopPlayer_deathInvulnerableTime", players.size ); + setsaveddvar( "player_deathInvulnerableTime", int( [[ difficulty_func ]]( "player_deathInvulnerableTime", current_frac ) * coop_invuln_remover) ); + } +} +apply_difficulty_step_with_func( difficulty_func, current_frac ) +{ + anim.missTimeConstant = [[ difficulty_func ]]( "missTimeConstant", current_frac ); + anim.missTimeDistanceFactor = [[ difficulty_func ]]( "missTimeDistanceFactor", current_frac ); + anim.dog_hits_before_kill = [[ difficulty_func ]]( "dog_hits_before_kill", current_frac ); + anim.double_grenades_allowed = [[ difficulty_func ]]( "double_grenades_allowed", current_frac ); +} +set_difficulty_from_locked_settings() +{ + apply_difficulty_frac_with_func( ::get_locked_difficulty_val, 1 ); + apply_difficulty_step_with_func( ::get_locked_difficulty_step_val, 1 ); +} +set_difficulty_from_current_aa_frac() +{ + level.auto_adjust_difficulty_frac = GetDvarInt( #"autodifficulty_frac" ); + current_frac = level.auto_adjust_difficulty_frac * 0.01; + assert( level.auto_adjust_difficulty_frac >= 0 ); + assert( level.auto_adjust_difficulty_frac <= 100 ); + apply_difficulty_frac_with_func( ::get_blended_difficulty, current_frac ); + apply_difficulty_step_with_func( ::get_stepped_difficulty, current_frac ); +} +get_stepped_difficulty( system, current_frac ) +{ + if ( current_frac >= level.difficultySettings_stepFunc_percent[ system ] ) + { + return level.difficultySettings[ system ][ "normal" ]; + } + return level.difficultySettings[ system ][ "easy" ]; +} +get_locked_difficulty_step_val( system, ignored ) +{ + return level.difficultySettings[ system ][ get_skill_from_index( level.gameskill ) ]; +} +get_blended_difficulty( system, current_frac ) +{ + difficulty_array = level.difficultySettings_frac_data_points[ system ]; + for ( i = 1; i < difficulty_array.size; i++ ) + { + high_frac = difficulty_array[ i ][ "frac" ]; + high_val = difficulty_array[ i ][ "val" ]; + if ( current_frac <= high_frac ) + { + low_frac = difficulty_array[ i - 1 ][ "frac" ]; + low_val = difficulty_array[ i - 1 ][ "val" ]; + frac_range = high_frac - low_frac; + val_range = high_val - low_val; + base_frac = current_frac - low_frac; + result_frac = base_frac / frac_range; + return low_val + result_frac * val_range; + } + } + assertex( difficulty_array.size == 1, "Shouldnt be multiple data points if we're here." ); + return difficulty_array[ 0 ][ "val" ]; +} +getCurrentDifficultySetting( msg ) +{ + return level.difficultySettings[ msg ][ get_skill_from_index( level.gameskill ) ]; +} +getRatio( msg, min, max ) +{ + return( level.difficultySettings[ msg ][ level.difficultyType[ min ] ] * ( 100 - GetDvarInt( #"autodifficulty_frac" ) ) + level.difficultySettings[ msg ][ level.difficultyType[ max ] ] * GetDvarInt( #"autodifficulty_frac" ) ) * 0.01; +} +getCoopValue( msg, numplayers ) +{ + if (numplayers <= 0) + { + numplayers = 1; + } + return( level.difficultySettings[ msg ][ GetDvar( #"currentDifficulty" ) ][numplayers - 1]); +} +get_locked_difficulty_val( msg, ignored ) +{ + return level.difficultySettings[ msg ][ level.difficultyType[ level.gameskill ] ]; +} +always_pain() +{ + return false; +} +pain_protection() +{ + if ( !pain_protection_check() ) + { + return false; + } + return( randomint( 100 ) > 25 ); +} +pain_protection_check() +{ + if ( !isalive( self.enemy ) ) + { + return false; + } + if ( !IsPlayer(self.enemy) ) + { + return false; + } + if ( !isalive( level.painAI ) || level.painAI.a.script != "pain" ) + { + level.painAI = self; + } + if ( self == level.painAI ) + { + return false; + } + if ( self.damageWeapon != "none" && weaponIsBoltAction( self.damageWeapon ) ) + { + return false; + } + return true; +} +axisAccuracyControl() +{ + self endon( "long_death" ); + self endon( "death" ); + self coop_axis_accuracy_scaler(); +} +alliesAccuracyControl() +{ + self endon( "long_death" ); + self endon( "death" ); + self coop_allies_accuracy_scaler(); +} +set_accuracy_based_on_situation() +{ + if ( self animscripts\combat_utility::isSniper() && isAlive( self.enemy ) ) + { + self setSniperAccuracy(); + return; + } + if ( isPlayer( self.enemy ) ) + { + resetMissDebounceTime(); + if ( self.a.missTime > gettime() ) + { + self.accuracy = 0; + return; + } + if ( self.a.script == "move" ) + { + self.accuracy = anim.run_accuracy * self.baseAccuracy; + return; + } + } + else + { + if ( self.a.script == "move" ) + { + self.accuracy = anim.run_accuracy * self.baseAccuracy; + return; + } + } + self.accuracy = self.baseAccuracy; +} +setSniperAccuracy() +{ + if ( !isdefined( self.sniperShotCount ) ) + { + self.sniperShotCount = 0; + self.sniperHitCount = 0; + } + self.sniperShotCount++ ; + if ( ( !isDefined( self.lastMissedEnemy ) || self.enemy != self.lastMissedEnemy ) && distanceSquared( self.origin, self.enemy.origin ) > 500 * 500 ) + { + self.accuracy = 0; + if ( level.gameSkill > 0 || self.sniperShotCount > 1 ) + { + self.lastMissedEnemy = self.enemy; + } + return; + } + self.accuracy = ( 1 + 1 * self.sniperHitCount ) * self.baseAccuracy; + self.sniperHitCount++ ; + if ( level.gameSkill < 1 && self.sniperHitCount == 1 ) + { + self.lastMissedEnemy = undefined; + } +} +didSomethingOtherThanShooting() +{ + self.a.missTimeDebounce = 0; +} +resetMissTime() +{ + if ( self.team != "axis" ) + { + return; + } + if ( self.weapon == "none" ) + { + return; + } + if ( self usingBoltActionWeapon() ) + { + self.missTime = 0; + return; + } + if ( !self animscripts\weaponList::usingAutomaticWeapon() && !self animscripts\weaponList::usingSemiAutoWeapon() ) + { + self.missTime = 0; + return; + } + self.a.nonstopFire = false; + if ( !isalive( self.enemy ) ) + { + return; + } + if ( !IsPlayer(self.enemy) ) + { + self.accuracy = self.baseAccuracy; + return; + } + dist = distance( self.enemy.origin, self.origin ); + self setMissTime( anim.missTimeConstant + dist * anim.missTimeDistanceFactor ); +} +resetMissDebounceTime() +{ + self.a.missTimeDebounce = gettime() + 3000; +} +setMissTime( howLong ) +{ + assertex( self.team == "axis", "Non axis tried to set misstime" ); + if ( self.a.missTimeDebounce > gettime() ) + { + return; + } + if ( howLong > 0 ) + { + self.accuracy = 0; + } + howLong *= 1000; + self.a.missTime = gettime() + howLong; + self.a.accuracyGrowthMultiplier = 1; +} +playerHurtcheck() +{ + self.hurtAgain = false; + for ( ;; ) + { + self waittill( "damage", amount, attacker, dir, point, mod ); + if(isdefined(attacker) && isplayer(attacker) && attacker.team == self.team) + { + continue; + } + self.hurtAgain = true; + self.damagePoint = point; + self.damageAttacker = attacker; + if( IsDefined (mod) && mod == "MOD_BURNED" ) + { + self setburn( 0.5 ); + self PlaySound( "chr_burn" ); + } + } +} +playerHealthRegen() +{ + self endon ("death"); + self endon ("disconnect"); + if( !IsDefined( self.flag ) ) + { + self.flag = []; + self.flags_lock = []; + } + if( !IsDefined(self.flag["player_has_red_flashing_overlay"]) ) + { + self player_flag_init("player_has_red_flashing_overlay"); + self player_flag_init("player_is_invulnerable"); + } + self player_flag_clear("player_has_red_flashing_overlay"); + self player_flag_clear("player_is_invulnerable"); + self thread increment_take_cover_warnings_on_death(); + self setTakeCoverWarnings(); + self thread healthOverlay(); + oldratio = 1; + health_add = 0; + regenRate = 0.1; + veryHurt = false; + playerJustGotRedFlashing = false; + if( !IsDefined( level.zombiemode ) || !level.zombiemode ) + { + self thread playerBreathingSound(self.maxhealth * 0.35); + self thread playerHeartbeatSound(self.maxhealth * 0.75); + self thread endPlayerBreathingSoundOnDeath(); + } + invulTime = 0; + hurtTime = 0; + newHealth = 0; + lastinvulratio = 1; + self thread playerHurtcheck(); + if(!IsDefined (self.veryhurt)) + { + self.veryhurt = 0; + } + self.boltHit = false; + if( GetDvar( #"scr_playerInvulTimeScale" ) == "" ) + { + setdvar( "scr_playerInvulTimeScale", 1.0 ); + } + playerInvulTimeScale = GetDvarFloat( #"scr_playerInvulTimeScale" ); + for( ;; ) + { + wait( 0.05 ); + waittillframeend; + if( self.health == self.maxHealth ) + { + if( self player_flag( "player_has_red_flashing_overlay" ) ) + { + player_flag_clear( "player_has_red_flashing_overlay" ); + level notify( "take_cover_done" ); + } + lastinvulratio = 1; + playerJustGotRedFlashing = false; + veryHurt = false; + continue; + } + if( self.health <= 0 ) + { + return; + } + wasVeryHurt = veryHurt; + health_ratio = self.health / self.maxHealth; + if( health_ratio <= level.healthOverlayCutoff ) + { + veryHurt = true; + if( !wasVeryHurt ) + { + hurtTime = gettime(); + self startfadingblur( 3.6, 2 ); + self player_flag_set( "player_has_red_flashing_overlay" ); + playerJustGotRedFlashing = true; + } + } + if( self.hurtAgain ) + { + hurtTime = gettime(); + self.hurtAgain = false; + } + if( health_ratio >= oldratio ) + { + if( gettime() - hurttime < level.playerHealth_RegularRegenDelay ) + { + continue; + } + if( veryHurt ) + { + self.veryhurt = 1; + newHealth = health_ratio; + if( gettime() > hurtTime + level.longRegenTime ) + { + newHealth += regenRate; + } + if ( newHealth >= 1 ) + { + reduceTakeCoverWarnings(); + } + } + else + { + newHealth = 1; + self.veryhurt = 0; + } + if( newHealth > 1.0 ) + { + newHealth = 1.0; + } + if( newHealth <= 0 ) + { + return; + } + self setnormalhealth( newHealth ); + oldratio = self.health / self.maxHealth; + continue; + } + invulWorthyHealthDrop = lastinvulRatio - health_ratio > level.worthyDamageRatio; + if( self.health <= 1 ) + { + self setnormalhealth( 2 / self.maxHealth ); + invulWorthyHealthDrop = true; + } + oldratio = self.health / self.maxHealth; + level notify( "hit_again" ); + health_add = 0; + hurtTime = gettime(); + self startfadingblur( 3, 0.8 ); + if( !invulWorthyHealthDrop || playerInvulTimeScale <= 0.0 ) + { + continue; + } + if( self player_flag( "player_is_invulnerable" ) ) + continue; + self player_flag_set( "player_is_invulnerable" ); + level notify( "player_becoming_invulnerable" ); + if( playerJustGotRedFlashing ) + { + invulTime = level.invulTime_onShield; + playerJustGotRedFlashing = false; + } + else if( veryHurt ) + { + invulTime = level.invulTime_postShield; + } + else + { + invulTime = level.invulTime_preShield; + } + invulTime *= playerInvulTimeScale; + lastinvulratio = self.health / self.maxHealth; + self thread playerInvul( invulTime ); + } +} +reduceTakeCoverWarnings() +{ + players = get_players(); + if ( isdefined( players[0] ) && isAlive( players[0] ) ) + { + takeCoverWarnings = GetDvarInt( #"takeCoverWarnings" ); + if ( takeCoverWarnings > 0 ) + { + takeCoverWarnings -- ; + setdvar( "takeCoverWarnings", takeCoverWarnings ); + } + } +} +playerInvul( timer ) +{ + if ( isdefined( self.flashendtime ) && self.flashendtime > gettime() ) + { + timer = timer * getCurrentDifficultySetting( "flashbangedInvulFactor" ); + } + if ( timer > 0 ) + { + self.attackerAccuracy = 0; + self.ignoreRandomBulletDamage = true; + wait( timer ); + } + self.attackerAccuracy = anim.player_attacker_accuracy; + self.ignoreRandomBulletDamage = false; + self player_flag_clear( "player_is_invulnerable" ); +} +grenadeAwareness() +{ + if ( self.team == "allies" ) + { + self.grenadeawareness = 0.9; + return; + } + if ( self.team == "axis" ) + { + if ( level.gameSkill >= 2 ) + { + if ( randomint( 100 ) < 33 ) + { + self.grenadeawareness = 0.2; + } + else + { + self.grenadeawareness = 0.5; + } + } + else + { + if ( randomint( 100 ) < 33 ) + { + self.grenadeawareness = 0; + } + else + { + self.grenadeawareness = 0.2; + } + } + } +} +playerBreathingSound(healthcap) +{ + self endon("end_healthregen"); + self endon( "disconnect" ); + self endon( "killed_player" ); + if(!IsDefined (level.player_pain_vox)) + { + level.player_pain_vox = 0; + } + wait (2); + player = self; + for (;;) + { + wait (0.2); + if (player.health <= 0) + { + level.player_pain_vox = 0; + return; + } + if (player.health >= healthcap) + { + player notify ("end_heartbeat_loop"); + continue; + } + if (level.player_pain_vox == 0) + { + playsoundatposition ("chr_breathing_hurt_start", (0,0,0)); + level.player_pain_vox = 1; + } + else + { + player playLocalSound("chr_breathing_hurt"); + } + wait .545; + wait (0.1 + randomfloat (0.8)); + } +} +playerHeartbeatSound(healthcap) +{ + self endon( "disconnect" ); + self endon( "killed_player" ); + level thread heartbeat_init(); + self.breathingStopTime = -10000; + self.hearbeatwait = .46; + wait (2); + player = self; + for (;;) + { + wait .2; + if (player.health >= healthcap) + { + continue; + } + level thread event_heart_beat( "stressed" , 1 ); + level notify ("player_pain"); + player waittill( "end_heartbeat_loop" ); + wait (1.5); + level thread event_heart_beat( "none" , 0 ); + level.player_pain_vox = 0; + } +} +heartbeat_init() +{ + level.current_heart_waittime = 2; + level.heart_waittime = 2; + level.current_breathing_waittime = 4; + level.breathing_waittime = 4; + level.emotional_state_system = 0; +} +event_heart_beat( emotion, loudness ) +{ + level.current_emotion = emotion; + if(!IsDefined (level.last_emotion)) + { + level.last_emotion = "undefined"; + } + if( level.current_emotion != level.last_emotion) + { + if(level.emotional_state_system == 0) + { + level.emotional_state_system = 1; + level thread play_heart_beat(); + level thread play_breathing(); + } + if(!IsDefined (loudness) || (loudness == 0)) + { + level.loudness = 0; + } + else + { + level.loudness = loudness; + } + switch (emotion) + { + case "sedated": + level.heart_waittime = 3; + level.breathing_waittime = 4; + level.last_emotion = "sedated"; + break; + case "relaxed": + level.heart_waittime = 2; + level.breathing_waittime = 4; + level.last_emotion = "relaxed"; + break; + case "stressed": + level.heart_waittime = 0.5; + level.breathing_waittime = 2; + level.last_emotion = "stressed"; + break; + case "panicked": + level.heart_waittime = 0.3; + level.breathing_waittime = 1.5; + level.last_emotion = "panicked"; + break; + case "none": + level.last_emotion = "none"; + level notify ("no_more_heartbeat"); + playsoundatposition ("vox_breath_scared_stop", (0,0,0)); + level.emotional_state_system = 0; + break; + default: AssertMsg("Not a Valid Emotional State. Please switch with sedated, relaxed, happy, stressed, or none"); + } + thread heartbeat_state_transitions(); + } +} +heartbeat_state_transitions() +{ + while (level.current_heart_waittime > level.heart_waittime) + { + level.current_heart_waittime = level.current_heart_waittime - .10; + wait(.30); + } + while (level.current_heart_waittime < level.heart_waittime) + { + level.current_heart_waittime = level.current_heart_waittime + .05; + wait(.40); + } + level.current_heart_waittime = level.heart_waittime; +} +play_heart_beat () +{ + player = getplayers()[0]; + level endon ("no_more_heartbeat"); + if(!IsDefined ( level.heart_wait_counter) ) + { + level.heart_wait_counter = 0; + } + while( 1 ) + { + while( level.heart_wait_counter < level.current_heart_waittime) + { + wait(0.1); + level.heart_wait_counter = level.heart_wait_counter +0.1; + } + if (level.loudness == 0) + { + playsoundatposition ("chr_heart_beat_ingame", (0,0,0)); + } + else + { + playsoundatposition ("chr_heart_beat_ingame", (0,0,0)); + } + level.heart_wait_counter = 0; + } +} +play_breathing() +{ + level endon ("no_more_heartbeat"); + if(!IsDefined ( level.breathing_wait_counter) ) + { + level.breathing_wait_counter = 0; + } + for(;;) + { + while( level.breathing_wait_counter < level.current_breathing_waittime ) + { + wait(0.1); + level.breathing_wait_counter = level.breathing_wait_counter +0.1; + } + playsoundatposition ("amb_player_breath_cold", (0,0,0)); + level.breathing_wait_counter = 0; + } +} +base_jump_heartbeat_stop() +{ + flag_wait( "players_jumped" ); + level thread event_heart_beat( "none" , 0 ); +} +endPlayerBreathingSoundOnDeath() +{ + self endon( "disconnect" ); + self waittill_either( "killed_player", "death" ); + setclientsysstate( "levelNotify", "rfo2", self ); +} +old_style_health_overlay() +{ + overlay = newClientHudElem( self ); + overlay.x = 0; + overlay.y = 0; + overlay setshader( "overlay_low_health", 640, 480 ); + overlay.alignX = "left"; + overlay.alignY = "top"; + overlay.horzAlign = "fullscreen"; + overlay.vertAlign = "fullscreen"; + overlay.alpha = 0; + wait( 0.05 ); + level.strings[ "take_cover" ] = spawnstruct(); + level.strings[ "take_cover" ].text = &"GAME_GET_TO_COVER"; + self thread healthOverlay_remove( overlay ); + pulseTime = 0.8; + for( ;; ) + { + overlay fadeOverTime( 0.5 ); + overlay.alpha = 0; + self player_flag_wait( "player_has_red_flashing_overlay" ); + self redFlashingOverlay( overlay ); + } +} +new_style_health_overlay() +{ + overlay = NewClientHudElem( self ); + overlay.x = 0; + overlay.y = 0; + if ( issplitscreen() ) + { + overlay SetShader( "overlay_low_health_splat", 640, 480 * 2 ); + if ( self == level.players[ 0 ] ) + { + overlay.y -= 120; + } + } + else + { + overlay SetShader( "overlay_low_health_splat", 640, 480 ); + } + overlay.splatter = true; + overlay.alignX = "left"; + overlay.alignY = "top"; + overlay.sort = 1; + overlay.foreground = 0; + overlay.horzAlign = "fullscreen"; + overlay.vertAlign = "fullscreen"; + overlay.alpha = 0; + thread healthOverlay_remove( overlay ); + updateTime = 0.05; + timeToFadeOut = 0.75; + while (1) + { + wait updateTime; + if(IsDefined(level.disable_damage_overlay_in_vehicle) && level.disable_damage_overlay_in_vehicle) + { + targetDamageAlpha = 0; + } + else + { + targetDamageAlpha = 1.0 - self.health / self.maxHealth; + } + if ( overlay.alpha < targetDamageAlpha ) + { + overlay.alpha = targetDamageAlpha; + } + else if ( ( targetDamageAlpha == 0 ) && ( overlay.alpha != 0 ) ) + { + overlay FadeOverTime( timeToFadeOut ); + overlay.alpha = 0; + self playsound ("chr_breathing_better"); + } + } +} +healthOverlay() +{ + self endon( "disconnect" ); + self endon( "noHealthOverlay" ); + if ( GetDvar( #"zombiemode" ) == "1" ) + { + old_style_health_overlay(); + } + else + { + new_style_health_overlay(); + } +} +add_hudelm_position_internal( alignY ) +{ + if ( level.console ) + { + self.fontScale = 2; + } + else + { + self.fontScale = 1.6; + } + self.x = 0; + self.y = -36; + self.alignX = "center"; + self.alignY = "bottom"; + self.horzAlign = "center"; + self.vertAlign = "middle"; + if ( !isdefined( self.background ) ) + { + return; + } + self.background.x = 0; + self.background.y = -40; + self.background.alignX = "center"; + self.background.alignY = "middle"; + self.background.horzAlign = "center"; + self.background.vertAlign = "middle"; + if ( level.console ) + { + self.background setshader( "popmenu_bg", 650, 52 ); + } + else + { + self.background setshader( "popmenu_bg", 650, 42 ); + } + self.background.alpha = .5; +} +create_warning_elem( ender, player ) +{ + level.hudelm_unpause_ender = ender; + level notify( "hud_elem_interupt" ); + hudelem = newHudElem(); + hudelem add_hudelm_position_internal(); + hudelem thread destroy_warning_elem_when_hit_again( player ); + hudelem thread destroy_warning_elem_when_mission_failed( player ); + hudelem setText( &"GAME_GET_TO_COVER" ); + hudelem.fontscale = 2; + hudelem.alpha = 1; + hudelem.color = ( 1, 0.9, 0.9 ); + player thread play_hurt_vox(); + return hudelem; +} +play_hurt_vox() +{ + if(IsDefined (self.veryhurt)) + { + if(self.veryhurt == 0) + { + if(randomintrange(0,1) == 1) + { + playsoundatposition ("chr_breathing_hurt_start", self.origin); + } + } + } +} +waitTillPlayerIsHitAgain() +{ + level endon( "hit_again" ); + self waittill( "damage" ); +} +destroy_warning_elem_when_hit_again( player ) +{ + self endon( "being_destroyed" ); + player waitTillPlayerIsHitAgain(); + fadeout = ( !isalive( player ) ); + self thread destroy_warning_elem( fadeout ); +} +destroy_warning_elem_when_mission_failed( player ) +{ + self endon( "being_destroyed" ); + flag_wait( "missionfailed" ); + player thread destroy_warning_elem( true ); +} +destroy_warning_elem( fadeout ) +{ + self notify( "being_destroyed" ); + self.beingDestroyed = true; + if ( fadeout ) + { + self fadeOverTime( 0.5 ); + self.alpha = 0; + wait 0.5; + } + self death_notify_wrapper(); + self destroy(); +} +mayChangeCoverWarningAlpha( coverWarning ) +{ + if ( !isdefined( coverWarning ) ) + { + return false; + } + if ( isdefined( coverWarning.beingDestroyed ) ) + { + return false; + } + return true; +} +fontScaler( scale, timer ) +{ + self endon( "death" ); + scale *= 2; + dif = scale - self.fontscale; + self changeFontScaleOverTime( timer ); + self.fontscale += dif; +} +fadeFunc( overlay, coverWarning, severity, mult, hud_scaleOnly ) +{ + pulseTime = 0.8; + scaleMin = 0.5; + fadeInTime = pulseTime * 0.1; + stayFullTime = pulseTime * ( .1 + severity * .2 ); + fadeOutHalfTime = pulseTime * ( 0.1 + severity * .1 ); + fadeOutFullTime = pulseTime * 0.3; + remainingTime = pulseTime - fadeInTime - stayFullTime - fadeOutHalfTime - fadeOutFullTime; + assert( remainingTime >= -.001 ); + if ( remainingTime < 0 ) + { + remainingTime = 0; + } + halfAlpha = 0.8 + severity * 0.1; + leastAlpha = 0.5 + severity * 0.3; + overlay fadeOverTime( fadeInTime ); + overlay.alpha = mult * 1.0; + if ( mayChangeCoverWarningAlpha( coverWarning ) ) + { + if ( !hud_scaleOnly ) + { + coverWarning fadeOverTime( fadeInTime ); + coverWarning.alpha = mult * 1.0; + } + } + if ( isDefined( coverWarning ) ) + { + coverWarning thread fontScaler( 1.0, fadeInTime ); + } + wait fadeInTime + stayFullTime; + overlay fadeOverTime( fadeOutHalfTime ); + overlay.alpha = mult * halfAlpha; + if ( mayChangeCoverWarningAlpha( coverWarning ) ) + { + if ( !hud_scaleOnly ) + { + coverWarning fadeOverTime( fadeOutHalfTime ); + coverWarning.alpha = mult * halfAlpha; + } + } + wait fadeOutHalfTime; + overlay fadeOverTime( fadeOutFullTime ); + overlay.alpha = mult * leastAlpha; + if ( mayChangeCoverWarningAlpha( coverWarning ) ) + { + if ( !hud_scaleOnly ) + { + coverWarning fadeOverTime( fadeOutFullTime ); + coverWarning.alpha = mult * leastAlpha; + } + } + if ( isDefined( coverWarning ) ) + { + coverWarning thread fontScaler( 0.9, fadeOutFullTime ); + } + wait fadeOutFullTime; + wait remainingTime; +} +shouldShowCoverWarning() +{ + if( IsDefined(level.enable_cover_warning) ) + { + return level.enable_cover_warning; + } + if ( !isAlive( self ) ) + { + return false; + } + if ( level.gameskill > 1 ) + { + return false; + } + if ( level.missionfailed ) + { + return false; + } + if ( !maps\_load_common::map_is_early_in_the_game() ) + { + return false; + } + if ( isSplitScreen() || coopGame() ) + { + return false; + } + takeCoverWarnings = GetDvarInt( #"takeCoverWarnings" ); + if ( takeCoverWarnings <= 3 ) + { + return false; + } + return true; +} +redFlashingOverlay( overlay ) +{ + self endon( "hit_again" ); + self endon( "damage" ); + self endon ("death"); + self endon ("disconnect"); + coverWarning = undefined; + if ( self shouldShowCoverWarning() ) + { + coverWarning = create_warning_elem( "take_cover_done", self ); + } + stopFlashingBadlyTime = gettime() + level.longRegenTime; + fadeFunc( overlay, coverWarning, 1, 1, false ); + while ( gettime() < stopFlashingBadlyTime && isalive( self ) ) + { + fadeFunc( overlay, coverWarning, .9, 1, false ); + } + if ( isalive( self ) ) + { + fadeFunc( overlay, coverWarning, .65, 0.8, false ); + } + if ( mayChangeCoverWarningAlpha( coverWarning ) ) + { + coverWarning fadeOverTime( 1.0 ); + coverWarning.alpha = 0; + } + fadeFunc( overlay, coverWarning, 0, 0.6, true ); + overlay fadeOverTime( 0.5 ); + overlay.alpha = 0; + self player_flag_clear( "player_has_red_flashing_overlay" ); + setclientsysstate( "levelNotify", "rfo3", self ); + wait( 0.5 ); + self notify( "take_cover_done" ); + self notify( "hit_again" ); +} +healthOverlay_remove( overlay ) +{ + self endon ("disconnect"); + self waittill_any ("noHealthOverlay", "death"); + if ( GetDvar( #"zombiemode" ) == "1" ) + { + overlay fadeOverTime( 3.5 ); + overlay.alpha = 0; + } + else + { + overlay fadeOverTime( 3.5 ); + overlay.alpha = 0; + } +} +setTakeCoverWarnings() +{ + isPreGameplayLevel = ( level.script == "training" || level.script == "cargoship" || level.script == "coup" ); + if ( GetDvarInt( #"takeCoverWarnings" ) == -1 || isPreGameplayLevel ) + { + setdvar( "takeCoverWarnings", 3 + 6 ); + } +} +increment_take_cover_warnings_on_death() +{ + if( !IsPlayer( self ) ) + { + return; + } + level notify( "new_cover_on_death_thread" ); + level endon( "new_cover_on_death_thread" ); + self waittill( "death" ); + if( !(self player_flag( "player_has_red_flashing_overlay" ) ) ) + { + return; + } + if ( level.gameSkill > 1 ) + { + return; + } + warnings = GetDvarInt( #"takeCoverWarnings" ); + if ( warnings < 10 ) + { + setdvar( "takeCoverWarnings", warnings + 1 ); + } +} +hud_debug_add_message( msg ) +{ + if ( !isdefined( level.hudMsgShare ) ) + { + level.hudMsgShare = []; + } + if ( !isdefined( level.hudMsgShare[ msg ] ) ) + { + hud = newHudElem(); + hud.x = level.debugLeft; + hud.y = level.debugHeight + level.hudNum * 15; + hud.foreground = 1; + hud.sort = 100; + hud.alpha = 1.0; + hud.alignX = "left"; + hud.horzAlign = "left"; + hud.fontScale = 1.0; + hud setText( msg ); + level.hudMsgShare[ msg ] = true; + } +} +hud_debug_add_display( msg, num, isfloat ) +{ + hud_debug_add_message( msg ); + num = int( num ); + negative = false; + if ( num < 0 ) + { + negative = true; + num *= -1; + } + thousands = 0; + hundreds = 0; + tens = 0; + ones = 0; + while ( num >= 10000 ) + { + num -= 10000; + } + while ( num >= 1000 ) + { + num -= 1000; + thousands++ ; + } + while ( num >= 100 ) + { + num -= 100; + hundreds++ ; + } + while ( num >= 10 ) + { + num -= 10; + tens++ ; + } + while ( num >= 1 ) + { + num -= 1; + ones++ ; + } + offset = 0; + offsetSize = 10; + if ( thousands > 0 ) + { + hud_debug_add_num( thousands, offset ); + offset += offsetSize; + hud_debug_add_num( hundreds, offset ); + offset += offsetSize; + hud_debug_add_num( tens, offset ); + offset += offsetSize; + hud_debug_add_num( ones, offset ); + offset += offsetSize; + } + else if ( hundreds > 0 || isFloat ) + { + hud_debug_add_num( hundreds, offset ); + offset += offsetSize; + hud_debug_add_num( tens, offset ); + offset += offsetSize; + hud_debug_add_num( ones, offset ); + offset += offsetSize; + } + else if ( tens > 0 ) + { + hud_debug_add_num( tens, offset ); + offset += offsetSize; + hud_debug_add_num( ones, offset ); + offset += offsetSize; + } + else + { + hud_debug_add_num( ones, offset ); + offset += offsetSize; + } + if ( isFloat ) + { + decimalHud = newHudElem(); + decimalHud.x = 204.5; + decimalHud.y = level.debugHeight + level.hudNum * 15; + decimalHud.foreground = 1; + decimalHud.sort = 100; + decimalHud.alpha = 1.0; + decimalHud.alignX = "left"; + decimalHud.horzAlign = "left"; + decimalHud.fontScale = 1.0; + decimalHud setText( "." ); + level.hudDebugNum[ level.hudDebugNum.size ] = decimalHud; + } + if ( negative ) + { + negativeHud = newHudElem(); + negativeHud.x = 195.5; + negativeHud.y = level.debugHeight + level.hudNum * 15; + negativeHud.foreground = 1; + negativeHud.sort = 100; + negativeHud.alpha = 1.0; + negativeHud.alignX = "left"; + negativeHud.horzAlign = "left"; + negativeHud.fontScale = 1.0; + negativeHud setText( " - " ); + level.hudDebugNum[ level.hudNum ] = negativeHud; + } + level.hudNum++ ; +} +hud_debug_add_num( num, offset ) +{ + hud = newHudElem(); + hud.x = 200 + offset * 0.65; + hud.y = level.debugHeight + level.hudNum * 15; + hud.foreground = 1; + hud.sort = 100; + hud.alpha = 1.0; + hud.alignX = "left"; + hud.horzAlign = "left"; + hud.fontScale = 1.0; + hud setText( num + "" ); + level.hudDebugNum[ level.hudDebugNum.size ] = hud; +} +hud_debug_add_second_string( num, offset ) +{ + hud = newHudElem(); + hud.x = 200 + offset * 0.65; + hud.y = level.debugHeight + level.hudNum * 15; + hud.foreground = 1; + hud.sort = 100; + hud.alpha = 1.0; + hud.alignX = "left"; + hud.horzAlign = "left"; + hud.fontScale = 1.0; + hud setText( num ); + level.hudDebugNum[ level.hudDebugNum.size ] = hud; +} +aa_init_stats() +{ +} +aa_add_event( event, amount ) +{ + old_amount = getdvarint( event ); + setdvar( event, old_amount + amount ); +} +return_false( attacker ) +{ + return false; +} +player_attacker( attacker ) +{ + if ( [[ level.custom_player_attacker ]]( attacker ) ) + { + return true; + } + if ( IsPlayer(attacker) ) + { + return true; + } + if ( !isdefined( attacker.car_damage_owner_recorder ) ) + { + return false; + } + return attacker player_did_most_damage(); +} +player_did_most_damage() +{ + return self.player_damage * 1.75 > self.non_player_damage; +} +empty_kill_func( type, loc, point, attacker, amount ) +{ +} +auto_adjust_enemy_died( ai, amount, attacker, type, point ) +{ + aa_add_event( "aa_enemy_deaths", 1 ); + if ( !isdefined( attacker ) ) + { + return; + } + if ( isDefined( ai ) && isDefined( ai.attackers ) ) + { + for ( j = 0; j < ai.attackers.size; j++ ) + { + player = ai.attackers[j]; + if ( !isDefined( player ) ) + { + continue; + } + if ( player == attacker ) + { + continue; + } + if( "0" == GetDvar( #"zombiemode" ) ) + { + player.assists++; + } + arcademode_assignpoints( "arcademode_score_assist", player ); + } + ai.attackers = []; + ai.attackerData = []; + } + if ( !player_attacker( attacker ) ) + { + return; + } + if( arcadeMode() ) + { + if( IsDefined( ai ) ) + { + ai.anglesOnDeath = ai.angles; + if ( isdefined( attacker ) ) + { + attacker.anglesOnKill = attacker getPlayerAngles(); + } + } + if ( attacker.arcademode_bonus["lastKillTime"] == gettime() ) + { + attacker.arcademode_bonus["uberKillingMachineStreak"]++; + } + else + { + attacker.arcademode_bonus["uberKillingMachineStreak"] = 1; + } + attacker.arcademode_bonus["lastKillTime"] = gettime(); + } + attacker.kills++; + damage_location = undefined; + if( IsDefined( ai ) ) + { + damage_location = ai.damagelocation; + if( damage_location == "head" || damage_location == "helmet" ) + { + if( !IsDefined( level.zombietron_mode ) ) + { + attacker.headshots++; + } + } + } + if( arcadeMode() ) + { + [[ level.global_kill_func ]]( type, damage_location, point, attacker, ai, attacker.arcademode_bonus["uberKillingMachineStreak"] ); + } + else + { + [[ level.global_kill_func ]]( type, damage_location, point, attacker ); + } + aa_add_event( "aa_player_kills", 1 ); +} +auto_adjust_enemy_death_detection() +{ + for ( ;; ) + { + self waittill( "damage", amount, attacker, direction_vec, point, type ); + if ( !isDefined(amount) ) + { + continue; + } + aa_add_event( "aa_enemy_damage_taken", amount ); + if ( !isalive( self ) || self.delayeddeath ) + { + level auto_adjust_enemy_died( self, amount, attacker, type, point ); + return; + } + if ( !player_attacker( attacker ) ) + { + continue; + } + self aa_player_attacks_enemy_with_ads( attacker, amount, type, point ); + if( !isDefined( self ) || !isalive( self ) ) + { + attacker.kills++; + return; + } + } +} +aa_player_attacks_enemy_with_ads( player, amount, type, point ) +{ + aa_add_event( "aa_player_damage_dealt", amount ); + assertex( GetDvarInt( #"aa_player_damage_dealt" ) > 0 ); + if ( self.health == self.maxhealth || !isDefined( self.attackers ) ) + { + self.attackers = []; + self.attackerData = []; + } + if ( !isdefined( self.attackerData[player getEntityNumber()] ) ) + { + self.attackers[ self.attackers.size ] = player; + self.attackerData[player getEntityNumber()] = false; + } + if ( !isADS(player) ) + { + [[ level.global_damage_func ]]( type, self.damagelocation, point, player, amount ); + return false; + } + if ( !bullet_attack( type ) ) + { + [[ level.global_damage_func ]]( type, self.damagelocation, point, player, amount ); + return false; + } + [[ level.global_damage_func_ads ]]( type, self.damagelocation, point, player, amount ); + aa_add_event( "aa_ads_damage_dealt", amount ); + return true; +} +bullet_attack( type ) +{ + if ( type == "MOD_PISTOL_BULLET" ) + { + return true; + } + return type == "MOD_RIFLE_BULLET"; +} +add_fractional_data_point( name, frac, val ) +{ + if ( !isdefined( level.difficultySettings_frac_data_points[ name ] ) ) + { + level.difficultySettings_frac_data_points[ name ] = []; + } + array = []; + array[ "frac" ] = frac; + array[ "val" ] = val; + assertex( frac >= 0, "Tried to set a difficulty data point less than 0." ); + assertex( frac <= 1, "Tried to set a difficulty data point greater than 1." ); + level.difficultySettings_frac_data_points[ name ][ level.difficultySettings_frac_data_points[ name ].size ] = array; +} +update_skill_on_change() +{ + waittillframeend; + for(;;) + { + lowest_current_skill = GetDvarInt( #"saved_gameskill" ); + gameskill = GetDvarInt( #"g_gameskill" ); + if ( gameskill < lowest_current_skill ) + lowest_current_skill = gameskill; + if( lowest_current_skill < level.gameskill ) + { + setSkill( true, lowest_current_skill ); + } + wait( 0.1 ); + } +} +coop_enemy_accuracy_scalar_watcher() +{ + level waittill ("load main complete"); + if( GetDvarInt( #"coop_difficulty_scaling" ) == 0 ) + { + return; + } + while (1) + { + players = get_players("allies"); + level.coop_enemy_accuracy_scalar = getCoopValue( "coopEnemyAccuracyScalar", players.size ); + wait (0.5); + } +} +coop_friendly_accuracy_scalar_watcher() +{ + level waittill ("load main complete"); + if( GetDvarInt( #"coop_difficulty_scaling" ) == 0 ) + { + return; + } + while (1) + { + players = get_players("allies"); + level.coop_friendly_accuracy_scalar = getCoopValue( "coopFriendlyAccuracyScalar", players.size ); + wait (0.5); + } +} +coop_axis_accuracy_scaler() +{ + self endon ("death"); + if( GetDvarInt( #"coop_difficulty_scaling" ) == 0 ) + { + return; + } + initialValue = self.baseAccuracy; + while (1) + { + if( !IsDefined( level.coop_enemy_accuracy_scalar ) ) + { + wait 0.5; + continue; + } + self.baseAccuracy = initialValue * level.coop_enemy_accuracy_scalar; + wait randomfloatrange(3,5); + } +} +coop_allies_accuracy_scaler() +{ + self endon ("death"); + if( GetDvarInt( #"coop_difficulty_scaling" ) == 0 ) + { + return; + } + initialValue = self.baseAccuracy; + while (1) + { + if( !IsDefined( level.coop_friendly_accuracy_scalar ) ) + { + wait 0.5; + continue; + } + self.baseAccuracy = initialValue * level.coop_friendly_accuracy_scalar; + wait randomfloatrange(3,5); + } +} +coop_player_threat_bias_adjuster() +{ + while (1) + { + wait 5; + if ( level.auto_adjust_threatbias ) + { + players = get_players("allies"); + for( i = 0; i < players.size; i++ ) + { + enable_auto_adjust_threatbias(players[i]); + } + } + } +} +coop_spawner_count_adjuster() +{ + while (!isdefined (level.flag) || !isdefined(level.flag[ "all_players_connected" ])) + { + wait 0.05; + continue; + } + flag_wait( "all_players_connected" ); + spawners = GetSpawnerArray(); + players = get_players("allies"); + for (i = 0; i < spawners.size; i++) + { + if (isdefined(spawners[i].targetname)) + { + possible_trig = getentarray(spawners[i].targetname, "target"); + if (isdefined(possible_trig[0])) + { + if (isdefined(possible_trig[0].targetname)) + { + if (possible_trig[0].targetname == "flood_spawner") + { + spawners[i] coop_set_spawner_adjustment_values(players.size); + } + } + } + } + } +} +coop_set_spawner_adjustment_values( player_count ) +{ + if (!isdefined(self.count)) + { + return; + } + if (isdefined(self.script_count_lock) && self.script_count_lock) + { + return; + } + if (player_count <= 1) + { + return; + } + else if (player_count == 2) + { + self.count = self.count + int(self.count * 0.75); + } + else if (player_count == 3) + { + self.count = self.count + int(self.count * 1.5); + } + else if (player_count == 4) + { + self.count = self.count + int(self.count * 2.5); + } + else + { + println("You've performed magic, sir."); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_gib.gsc b/BO1/PC/ZM/maps/_gib.gsc new file mode 100644 index 0000000..5327034 --- /dev/null +++ b/BO1/PC/ZM/maps/_gib.gsc @@ -0,0 +1,465 @@ +#include common_scripts\utility; +precache_gib_fx() +{ + level.lastGibTime = 0; + level.gibDelay = 3 * 1000; + level.minGibs = 2; + level.maxGibs = 4; + level.totalGibs = RandomIntRange( level.minGibs, level.maxGibs ); + level._effect["animscript_gib_fx"] = LoadFx( "weapon/bullet/fx_flesh_gib_fatal_01_mp" ); + level._effect["animscript_gibtrail_fx"] = LoadFx( "trail/fx_trail_blood_streak_mp" ); +} +do_gib( iDamage, sMeansOfDeath, weapon ) +{ + if ( do_explosive_gib( iDamage, sMeansOfDeath, weapon ) || do_bullet_gib( iDamage, sMeansOfDeath, weapon )) + return true; + return false; +} +do_explosive_gib( iDamage, sMeansOfDeath, weapon, sHitLoc, vAttackerOrigin ) +{ + if ( weapon == "m8_white_smoke_mp" ) + return false; + if ( weapon == "tabun_gas_mp" ) + return false; + if ( weapon == "signal_flare_mp" ) + return false; + if ( weapon == "molotov_mp" ) + return false; + if ( sMeansOfDeath == "MOD_EXPLOSIVE" || + sMeansOfDeath == "MOD_GRENADE" || + sMeansOfDeath == "MOD_GRENADE_SPLASH" || + sMeansOfDeath == "MOD_PROJECTILE" || + sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || + sMeansOfDeath == "MOD_SUICIDE") + { + if ( iDamage >= self.maxhealth ) + { + return true; + } + } + return false; +} +is_weapon_shotgun( sWeapon ) +{ + if (WeaponClass( sWeapon ) == "spread") + return true; + return false; +} +do_bullet_gib( iDamage, sMeansOfDeath, sWeapon, sHitLoc, vAttackerOrigin ) +{ + if ( !isdefined( vAttackerOrigin ) ) + return false; + if( !isdefined( sHitLoc ) ) + return false; + if( sMeansOfDeath == "MOD_MELEE" ) + return false; + shotty_gib = is_weapon_shotgun( sWeapon ); + if( iDamage < 35 && !shotty_gib ) + { + return false; + } + distSquared = DistanceSquared( self.origin, vAttackerOrigin ); + maxDist = 300; + gib_chance = 50; + if( shotty_gib ) + { + if( distSquared < 110*110 ) + { + gib_chance = 100; + } + else if( distSquared < 200*200 ) + { + gib_chance = 75; + } + else if( distSquared < 270*270 ) + { + gib_chance = 50; + } + else if( distSquared < 330*330 ) + { + if( RandomInt( 100 ) < 50 ) + { + gib_chance = 50; + } + else + { + return false; + } + } + else + { + return false; + } + } + else if( isSubStr( sWeapon, "gunner" ) ) + { + maxDist = 3000; + } + else if( issubstr(sWeapon,"mg42") || issubstr(sWeapon,"30cal") ) + { + gib_chance = 30; + maxDist = 2000; + } + else if( issubstr( sWeapon, "ptrs41_" ) ) + { + maxDist = 3500; + } + else + { + return false; + } + if( distSquared < maxDist*maxDist && RandomInt( 100 ) < gib_chance && GetTime() > level.lastGibTime + level.gibDelay ) + { + return true; + } + return false; +} +get_explosion_gib_ref( direction ) +{ + if( GetTime() > level.lastGibTime + level.gibDelay && level.totalGibs > 0 ) + { + level.totalGibs--; + level thread set_last_gib_time(); + refs = []; + switch( direction ) + { + case "left": + refs[refs.size] = "left_arm"; + refs[refs.size] = "left_leg"; + gib_ref = get_random( refs ); + break; + case "right": + refs[refs.size] = "right_arm"; + refs[refs.size] = "right_leg"; + gib_ref = get_random( refs ); + break; + case "forward": + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "guts"; + refs[refs.size] = "no_legs"; + gib_ref = get_random( refs ); + break; + case "back": + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + gib_ref = get_random( refs ); + break; + default: + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + refs[refs.size] = "guts"; + gib_ref = get_random( refs ); + break; + } + self.gib_ref = gib_ref; + } + else + { + self.gib_ref = undefined; + } +} +get_gib_ref_by_direction( damageyaw ) +{ + gib_debug_print( "gibs: damageyaw " + damageyaw ); + if( randomint(5) == 0 || damageyaw == 0) + { + gib_debug_print("gibs: gib_ref UP" ); + get_explosion_gib_ref( "up" ); + } + else + if( ( damageyaw > 135 ) ||( damageyaw <= -135 ) ) + { + gib_debug_print("gibs: gib_ref FORWARD" ); + get_explosion_gib_ref( "forward" ); + } + else if( ( damageyaw > 45 ) &&( damageyaw <= 135 ) ) + { + gib_debug_print("gibs: gib_ref RIGHT" ); + get_explosion_gib_ref( "right" ); + } + else if( ( damageyaw > -45 ) &&( damageyaw <= 45 ) ) + { + gib_debug_print("gibs: gib_ref BACK" ); + get_explosion_gib_ref( "back" ); + } + else + { + gib_debug_print("gibs: gib_ref LEFT" ); + get_explosion_gib_ref( "left" ); + } +} +gib_debug_print( text ) +{ +} +gib_player( iDamage, sMeansOfDeath, sWeapon, sHitLoc, vDamageDir, vAttackerOrigin ) +{ + if ( do_explosive_gib( iDamage, sMeansOfDeath, sWeapon, sHitLoc, vAttackerOrigin ) ) + { + if (isdefined(vDamageDir)) + { + gib_debug_print( "gibs: angles " + self.angles[1] ); + gib_debug_print( "gibs: vDamageDir " + vectortoangles(vDamageDir)[1] ); + damageyaw = AngleClamp180( vectortoangles(vDamageDir)[1] - self.angles[1] ); + } + else + { + damageyaw = 0; + } + get_gib_ref_by_direction(damageyaw); + } + else if ( do_bullet_gib( iDamage, sMeansOfDeath, sWeapon, sHitLoc, vAttackerOrigin ) ) + { + get_bullet_gib_ref( iDamage, sMeansOfDeath, sWeapon, sHitLoc, vDamageDir); + } + else + { + return false; + } + if( !IsDefined( self.gib_ref ) ) + { + return false; + } + self maps\_weapons::detach_all_weapons(); + gib_ref = self.gib_ref; + limb_data = get_limb_data( gib_ref ); + if( !IsDefined( limb_data ) ) + { + return false; + } + forward = undefined; + velocity = undefined; + pos1 = []; + pos2 = []; + velocities = []; + if( limb_data["spawn_tags"][0] != "" ) + { + if( isdefined(self.gib_vel) ) + { + for( i = 0; i < limb_data["spawn_tags"].size; i++ ) + { + velocities[i] = self.gib_vel; + } + } + else + { + for( i = 0; i < limb_data["spawn_tags"].size; i++ ) + { + pos1[pos1.size] = self GetTagOrigin( limb_data["spawn_tags"][i] ); + } + wait( 0.05 ); + for( i = 0; i < limb_data["spawn_tags"].size; i++ ) + { + pos2[pos2.size] = self GetTagOrigin( limb_data["spawn_tags"][i] ); + } + for( i = 0; i < pos1.size; i++ ) + { + forward = VectorNormalize( pos2[i] - pos1[i] ); + velocities[i] = forward * RandomIntRange( 600, 1000 ); + velocities[i] = velocities[i] + ( 0, 0, RandomIntRange( 400, 700 ) ); + } + } + } + if( IsDefined( limb_data["fx"] ) ) + { + for( i = 0; i < limb_data["spawn_tags"].size; i++ ) + { + if( limb_data["spawn_tags"][i] == "" ) + { + continue; + } + PlayFxOnTag( level._effect[limb_data["fx"]], self, limb_data["spawn_tags"][i] ); + } + } + self PlaySound( "chr_death_gibs" ); + self thread throw_gib( limb_data["spawn_models"], limb_data["spawn_tags"], velocities ); + self SetModel( limb_data["body_model"] ); + self Attach( limb_data["legs_model"] ); + if ( gib_ref == "no_legs" ) + return true; + return false; +} +get_limb_data( gib_ref ) +{ + temp_array = []; + torsoDmg1_defined = IsDefined( self.torsoDmg1 ); + torsoDmg2_defined = IsDefined( self.torsoDmg2 ); + torsoDmg3_defined = IsDefined( self.torsoDmg3 ); + torsoDmg4_defined = IsDefined( self.torsoDmg4 ); + torsoDmg5_defined = IsDefined( self.torsoDmg5 ); + legDmg1_defined = IsDefined( self.legDmg1 ); + legDmg2_defined = IsDefined( self.legDmg2 ); + legDmg3_defined = IsDefined( self.legDmg3 ); + legDmg4_defined = IsDefined( self.legDmg4 ); + gibSpawn1_defined = IsDefined( self.gibSpawn1 ); + gibSpawn2_defined = IsDefined( self.gibSpawn2 ); + gibSpawn3_defined = IsDefined( self.gibSpawn3 ); + gibSpawn4_defined = IsDefined( self.gibSpawn4 ); + gibSpawn5_defined = IsDefined( self.gibSpawn5 ); + gibSpawnTag1_defined = IsDefined( self.gibSpawnTag1 ); + gibSpawnTag2_defined = IsDefined( self.gibSpawnTag2 ); + gibSpawnTag3_defined = IsDefined( self.gibSpawnTag3 ); + gibSpawnTag4_defined = IsDefined( self.gibSpawnTag4 ); + gibSpawnTag5_defined = IsDefined( self.gibSpawnTag5 ); + if( torsoDmg2_defined && legDmg1_defined && gibSpawn1_defined && gibSpawnTag1_defined ) + { + temp_array["right_arm"]["body_model"] = self.torsoDmg2; + temp_array["right_arm"]["legs_model"] = self.legDmg1; + temp_array["right_arm"]["spawn_models"][0] = self.gibSpawn1; + temp_array["right_arm"]["spawn_tags"][0] = self.gibSpawnTag1; + temp_array["right_arm"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg3_defined && legDmg1_defined && gibSpawn2_defined && gibSpawnTag2_defined ) + { + temp_array["left_arm"]["body_model"] = self.torsoDmg3; + temp_array["left_arm"]["legs_model"] = self.legDmg1; + temp_array["left_arm"]["spawn_models"][0] = self.gibSpawn2; + temp_array["left_arm"]["spawn_tags"][0] = self.gibSpawnTag2; + temp_array["left_arm"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg1_defined && legDmg2_defined && gibSpawn3_defined && gibSpawnTag3_defined ) + { + temp_array["right_leg"]["body_model"] = self.torsoDmg1; + temp_array["right_leg"]["legs_model"] = self.legDmg2; + temp_array["right_leg"]["spawn_models"][0] = self.gibSpawn3; + temp_array["right_leg"]["spawn_tags"][0] = self.gibSpawnTag3; + temp_array["right_leg"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg1_defined && legDmg3_defined && gibSpawn4_defined && gibSpawnTag4_defined ) + { + temp_array["left_leg"]["body_model"] = self.torsoDmg1; + temp_array["left_leg"]["legs_model"] = self.legDmg3; + temp_array["left_leg"]["spawn_models"][0] = self.gibSpawn4; + temp_array["left_leg"]["spawn_tags"][0] = self.gibSpawnTag4; + temp_array["left_leg"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg1_defined && legDmg4_defined && gibSpawn4_defined && gibSpawn3_defined && gibSpawnTag3_defined && gibSpawnTag4_defined ) + { + temp_array["no_legs"]["body_model"] = self.torsoDmg1; + temp_array["no_legs"]["legs_model"] = self.legDmg4; + temp_array["no_legs"]["spawn_models"][0] = self.gibSpawn4; + temp_array["no_legs"]["spawn_models"][1] = self.gibSpawn3; + temp_array["no_legs"]["spawn_tags"][0] = self.gibSpawnTag4; + temp_array["no_legs"]["spawn_tags"][1] = self.gibSpawnTag3; + temp_array["no_legs"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg4_defined && legDmg1_defined ) + { + temp_array["guts"]["body_model"] = self.torsoDmg4; + temp_array["guts"]["legs_model"] = self.legDmg1; + temp_array["guts"]["spawn_models"][0] = ""; + temp_array["guts"]["spawn_tags"][0] = ""; + temp_array["guts"]["fx"] = "animscript_gib_fx"; + } + if( torsoDmg5_defined && legDmg1_defined ) + { + temp_array["head"]["body_model"] = self.torsoDmg5; + temp_array["head"]["legs_model"] = self.legDmg1; + if( gibSpawn5_defined && gibSpawnTag5_defined ) + { + temp_array["head"]["spawn_models"][0] = self.gibSpawn5; + temp_array["head"]["spawn_tags"][0] = self.gibSpawnTag5; + } + else + { + temp_array["head"]["spawn_models"][0] = ""; + temp_array["head"]["spawn_tags"][0] = ""; + } + temp_array["head"]["fx"] = "animscript_gib_fx"; + } + if( IsDefined( temp_array[gib_ref] ) ) + { + return temp_array[gib_ref]; + } + else + { + return undefined; + } +} +throw_gib( spawn_models, spawn_tags, velocities ) +{ + if( velocities.size < 1 ) + { + return; + } + for( i = 0; i < spawn_models.size; i++ ) + { + origin = self GetTagOrigin( spawn_tags[i] ); + angles = self GetTagAngles( spawn_tags[i] ); + CreateDynEntAndLaunch( spawn_models[i], origin, angles, origin, velocities[i], level._effect["animscript_gibtrail_fx"] ); + } +} +gib_delete() +{ + wait( 10 + RandomFloat( 5 ) ); + self Delete(); +} +get_random( array ) +{ + return array[RandomInt( array.size )]; +} +set_last_gib_time() +{ + level notify( "stop_last_gib_time" ); + level endon( "stop_last_gib_time" ); + wait( 0.05 ); + level.lastGibTime = GetTime(); + level.totalGibs = RandomIntRange( level.minGibs, level.maxGibs ); +} +get_bullet_gib_ref(iDamage, sMeansOfDeath, sWeapon, sHitLoc, vDir) +{ + self.gib_ref = undefined; + level.lastGibTime = GetTime(); + refs = []; + switch( sHitLoc ) + { + case "torso_upper": + case "torso_lower": + refs[refs.size] = "guts"; + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + break; + case "right_arm_upper": + case "right_arm_lower": + case "right_hand": + refs[refs.size] = "right_arm"; + break; + case "left_arm_upper": + case "left_arm_lower": + case "left_hand": + refs[refs.size] = "left_arm"; + break; + case "right_leg_upper": + case "right_leg_lower": + case "right_foot": + refs[refs.size] = "right_leg"; + refs[refs.size] = "no_legs"; + break; + case "left_leg_upper": + case "left_leg_lower": + case "left_foot": + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + break; + case "helmet": + case "head": + refs[refs.size] = "head"; + break; + } + if( refs.size ) + { + self.gib_ref = get_random( refs ); + } + range = 600; + nrange = -600; + self.gib_vel = vDir * RandomIntRange( 500, 900 ); + self.gib_vel += ( RandomIntRange( nrange, range ), RandomIntRange( nrange, range ), RandomIntRange( 400, 1000 ) ); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_global_fx.gsc b/BO1/PC/ZM/maps/_global_fx.gsc new file mode 100644 index 0000000..fa831f9 Binary files /dev/null and b/BO1/PC/ZM/maps/_global_fx.gsc differ diff --git a/BO1/PC/ZM/maps/_grenade_toss.gsc b/BO1/PC/ZM/maps/_grenade_toss.gsc new file mode 100644 index 0000000..3aa6c19 Binary files /dev/null and b/BO1/PC/ZM/maps/_grenade_toss.gsc differ diff --git a/BO1/PC/ZM/maps/_hind.gsc b/BO1/PC/ZM/maps/_hind.gsc new file mode 100644 index 0000000..eb96a55 Binary files /dev/null and b/BO1/PC/ZM/maps/_hind.gsc differ diff --git a/BO1/PC/ZM/maps/_hind_player.gsc b/BO1/PC/ZM/maps/_hind_player.gsc new file mode 100644 index 0000000..1f244ab --- /dev/null +++ b/BO1/PC/ZM/maps/_hind_player.gsc @@ -0,0 +1,1140 @@ + +#include maps\_vehicle; +#include maps\_utility; +#include common_scripts\utility; +#using_animtree("vehicles"); +main() +{ + self UseAnimTree( #animtree ); + init_vehicle_anims(); + self.tut_hud = []; + self.tut_hud["fly_controls"] = false; + self.tut_hud["gun_controls"] = false; + self.tut_hud["rocket_controls"] = false; + self ent_flag_init("arming_rockets"); + self ent_flag_init("reloading_rockets"); + self.console_models = array("t5_veh_helo_hind_ckpitdmg0", "t5_veh_helo_hind_ckpitdmg1", "t5_veh_helo_hind_ckpitdmg2"); + self thread landed_animation(); + self thread watch_for_cockpit_switch(); + self thread create_tutorial_hud(); +} +precache_models() +{ + PreCacheModel("t5_veh_helo_hind_cockpitview"); + PreCacheModel("t5_veh_helo_hind_ckpitdmg0"); + PreCacheModel("t5_veh_helo_hind_ckpitdmg1"); + PreCacheModel("t5_veh_helo_hind_ckpitdmg2"); +} +precache_weapons() +{ + PreCacheItem( "hind_minigun_pilot" ); + PreCacheItem( "hind_rockets" ); + PreCacheRumble( "minigun_rumble" ); + PreCacheRumble( "damage_light" ); +} +precache_hud() +{ + PreCacheShader( "hud_hind_cannon01" ); + PreCacheShader( "hud_hind_cannon02" ); + PreCacheShader( "hud_hind_cannon03" ); + PreCacheShader( "hud_hind_cannon04" ); + PreCacheShader( "hud_hind_cannon05" ); + PreCacheShader( "hud_hind_rocket" ); + PreCacheShader( "hud_hind_rocket_border_left" ); + PreCacheShader( "hud_hind_rocket_border_right" ); +} +watch_for_cockpit_switch() +{ + self endon("death"); + self endon("animated_switch"); + self.cockpit_models = array("t5_veh_helo_hind_cockpitview", "t5_veh_helo_hind_cockpit_damg_low", "t5_veh_helo_hind_cockpit_damg_med", "t5_veh_helo_hind_cockpit_damg_high" ); + self.current_cockpit_state = 0; + while(true) + { + while(true) + { + self waittill("enter_vehicle", player); + self HidePart( "tag_instrument_warning", "t5_veh_helo_hind_cockpitview" ); + if(IsDefined(player) && IsPlayer(player)) + { + self SetModel(self.cockpit_models[self.current_cockpit_state]); + self.console_model = maps\_utility::spawn("script_model", self.origin); + self.console_model setmodel("t5_veh_helo_hind_ckpitdmg0"); + self.console_model linkto(self, "origin_animate_jnt", (0,0,0), (0,0,0) ); + self HidePart( "tag_window_l_dmg_0a", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_l_dmg_0b", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_c_dmg_0", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_r_dmg_0", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_l_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_c_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_r_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_l_dmg_2", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_c_dmg_2", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_r_dmg_2", "t5_veh_helo_hind_cockpitview" ); + self thread hind_weapons_think(); + break; + } + } + while(true) + { + self waittill("exit_vehicle", player); + if(IsDefined(player) && IsPlayer(player)) + { + self notify("hind weapons disabled"); + self setModel("t5_veh_helo_hind_blockout"); + break; + } + } + } +} +flash_warning_indicator() +{ + self endon("stop_warning_indicator"); + self thread stop_warning_indicator(); + for(;;) + { + self ShowPart( "tag_instrument_warning", "t5_veh_helo_hind_cockpitview" ); + wait(0.2); + self HidePart( "tag_instrument_warning", "t5_veh_helo_hind_cockpitview" ); + wait(0.2); + } +} +stop_warning_indicator() +{ + self waittill("stop_warning_indicator"); + waittillframeend; + self HidePart( "tag_instrument_warning", "t5_veh_helo_hind_cockpitview"); +} +next_cockpit_damage_state() +{ + self.current_cockpit_state++; + AssertEx(self.current_cockpit_state <= self.console_models.size, "Tried to switch the hind to a cockpit damage state that does not exist"); + if(self.current_cockpit_state > 2) + { + return false; + } + if( self.current_cockpit_state - 1 < 0 ) + { + self Detach( self.console_models[self.console_models.size - 1], "origin_animate_jnt" ); + } + else + { + self Detach( self.console_models[self.current_cockpit_state - 1], "origin_animate_jnt" ); + } + self Attach( self.console_models[self.current_cockpit_state], "origin_animate_jnt"); + if(self.current_cockpit_state == 0) + { + self ShowPart( "tag_window_l_dmg_0a", "t5_veh_helo_hind_cockpitview" ); + self ShowPart( "tag_window_l_dmg_0b", "t5_veh_helo_hind_cockpitview" ); + self ShowPart( "tag_window_c_dmg_0", "t5_veh_helo_hind_cockpitview" ); + self ShowPart( "tag_window_r_dmg_0", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_l_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_c_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_r_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_l_dmg_2", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_c_dmg_2", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_r_dmg_2", "t5_veh_helo_hind_cockpitview" ); + return true; + } + else if(self.current_cockpit_state == 1) + { + self HidePart( "tag_window_l_dmg_0a", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_l_dmg_0b", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_c_dmg_0", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_r_dmg_0", "t5_veh_helo_hind_cockpitview" ); + self ShowPart( "tag_window_l_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self ShowPart( "tag_window_c_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self ShowPart( "tag_window_r_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_l_dmg_2", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_c_dmg_2", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_r_dmg_2", "t5_veh_helo_hind_cockpitview" ); + return true; + } + else if(self.current_cockpit_state == 2) + { + self HidePart( "tag_window_l_dmg_0a", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_l_dmg_0b", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_c_dmg_0", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_r_dmg_0", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_l_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_c_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self HidePart( "tag_window_r_dmg_1", "t5_veh_helo_hind_cockpitview" ); + self ShowPart( "tag_window_l_dmg_2", "t5_veh_helo_hind_cockpitview" ); + self ShowPart( "tag_window_c_dmg_2", "t5_veh_helo_hind_cockpitview" ); + self ShowPart( "tag_window_r_dmg_2", "t5_veh_helo_hind_cockpitview" ); + return false; + } +} +debug_cycle_damage_states() +{ + self endon("death"); + while(1) + { + self next_cockpit_damage_state(); + wait(5); + if(self.current_cockpit_state + 1 >= self.cockpit_models.size) + { + self.current_cockpit_state = -1; + } + } +} +hind_weapons_think() +{ + self thread watch_weapon_systems(); +} +disable_driver_weapons() +{ + self notify("hind weapons disabled"); + self disable_driver_turret(); + self DisableGunnerFiring(0, true); + player = get_players()[0]; + player stoploopsound(); +} +enable_driver_weapons() +{ + self enable_driver_turret(); + self thread watch_for_rocket_firing(); +} +watch_weapon_systems() +{ + self thread watch_for_rockets(); + self thread watch_for_minigun(); +} +watch_for_rockets() +{ + self endon("death"); + while(true) + { + self waittill("switch_to_rockets"); + self switchto_rockets(); + } +} +watch_for_minigun() +{ + self endon("death"); + while(true) + { + self waittill("switch_to_minigun"); + self switchto_minigun(); + } +} +switchto_rockets() +{ + self SetVehWeapon( "hind_rockets" ); + players = get_players(); + players[0] SetClientDvar( "vehHelicopterHeadSwayDontSwayTheTurret", 0); +} +switchto_minigun() +{ + self SetVehWeapon( "hind_minigun_pilot" ); + players = get_players(); + players[0] SetClientDvar( "vehHelicopterHeadSwayDontSwayTheTurret", 0); +} +create_tutorial_hud( no_wait ) +{ + if(!IsDefined(no_wait)) + { + self waittill("enter_vehicle"); + } + self thread destroy_tutorial_hud(); + level.fly_up_hud = newHudElem(); + level.fly_up_hud.fontScale = 1.25; + level.fly_up_hud.x = 25; + level.fly_up_hud.y = 53; + level.fly_up_hud.alignX = "left"; + level.fly_up_hud.alignY = "top"; + level.fly_up_hud.horzAlign = "left"; + level.fly_up_hud.vertAlign = "top"; + level.fly_up_hud.foreground = true; + if(self.tut_hud["fly_controls"]) + { + level.fly_up_hud SetText( "Press [{+smoke}] to fly up" ); + } + level.fly_down_hud = newHudElem(); + level.fly_down_hud.fontScale = 1.25; + level.fly_down_hud.x = 25; + level.fly_down_hud.y = 68; + level.fly_down_hud.alignX = "left"; + level.fly_down_hud.alignY = "top"; + level.fly_down_hud.horzAlign = "left"; + level.fly_down_hud.vertAlign = "top"; + level.fly_down_hud.foreground = true; + if(self.tut_hud["fly_controls"]) + { + level.fly_down_hud SetText( "Press [{+speed_throw}] to fly down" ); + } + level.fire_hud = newHudElem(); + level.fire_hud.fontScale = 1.25; + level.fire_hud.x = 25; + level.fire_hud.y = 93; + level.fire_hud.alignX = "left"; + level.fire_hud.alignY = "top"; + level.fire_hud.horzAlign = "left"; + level.fire_hud.vertAlign = "top"; + level.fire_hud.foreground = true; + if(self.tut_hud["gun_controls"]) + { + level.fire_hud SetText( "[{+attack}] mini-gun" ); + } + level.rocket_hud = newHudElem(); + level.rocket_hud.fontScale = 1; + level.rocket_hud.x = 25; + level.rocket_hud.y = 107; + level.rocket_hud.alignX = "left"; + level.rocket_hud.alignY = "top"; + level.rocket_hud.horzAlign = "left"; + level.rocket_hud.vertAlign = "top"; + level.rocket_hud.foreground = true; + if(self.tut_hud["rocket_controls"]) + { + level.rocket_hud SetText( "[{+speed_throw}] rocket pods - [{+usereload}] reload" ); + } +} +update_tutorial_hud() +{ + if(self.tut_hud["fly_controls"]) + { + level.fly_up_hud SetText( "Press [{+smoke}] to fly up" ); + } + else + { + level.fly_up_hud SetText( "" ); + } + if(self.tut_hud["fly_controls"]) + { + level.fly_down_hud SetText( "Press [{+speed_throw}] to fly down." ); + } + else + { + level.fly_down_hud SetText( "" ); + } + if(self.tut_hud["gun_controls"]) + { + level.fire_hud SetText( "[{+attack}] mini-gun" ); + } + else + { + level.fire_hud SetText( "" ); + } + if(self.tut_hud["rocket_controls"]) + { + level.rocket_hud SetText( "[{+speed_throw}] rocket pods - [{+usereload}] reload" ); + } + else + { + level.rocket_hud SetText( "" ); + } +} +destroy_tutorial_hud() +{ + self waittill("exit_vehicle"); + self thread create_tutorial_hud(); + level.fly_up_hud Destroy(); + level.fly_down_hud Destroy(); + level.fire_hud Destroy(); + level.rocket_hud Destroy(); +} +watch_for_rocket_firing() +{ + self endon("death"); + self endon("hind weapons disabled"); + self setup_rockets(); + self DisableGunnerFiring(0, true); + self thread fire_rockets(); + while (true) + { + player = get_players()[0]; + while(!player ThrowButtonPressed() || self._rocket_pods.free_rockets <= 0) + { + wait .05; + } + self ent_flag_clear("reloading_rockets"); + self ent_flag_set("arming_rockets"); + player = get_players()[0]; + while (player ThrowButtonPressed()) + { + wait (.05); + } + self ent_flag_clear("arming_rockets"); + self notify("fire_rockets"); + } +} +fire_rockets() +{ + self endon("death"); + self endon("hind weapons disabled"); + while(true) + { + rockets = self arm_rockets(); + for (i = 0; i < rockets.size; i++) + { + self fire_rocket(rockets[i]); + } + if(IsDefined(level.pow_demo) && level.pow_demo) + { + if(self._rocket_pods.free_rockets < 3) + { + self._rocket_pods.free_rockets = self._rocket_pods.total_rockets; + } + } + self.armed_rockets = 0; + wait(.05); + } +} +arm_rockets() +{ + self ent_flag_wait("arming_rockets"); + armed_rockets = []; + while(armed_rockets.size < self._rocket_pods.total_rockets && self._rocket_pods.free_rockets > 0) + { + for(pod_index = self._rocket_pods.pod_index; pod_index < self._rocket_pods.pods.size; pod_index++) + { + pod = self._rocket_pods.pods[pod_index]; + for(rocket_index = 0; rocket_index < pod.rockets.size; rocket_index++) + { + rocket = pod.rockets[rocket_index]; + if (!rocket.is_armed) + { + arm_time = 0; + if (armed_rockets.size) + { + arm_time = self._rocket_pods.arm_time; + } + rocket = arm_single_rocket(rocket, arm_time); + if(self ent_flag("arming_rockets")) + { + armed_rockets = add_to_array(armed_rockets, rocket); + self._rocket_pods.free_rockets--; + self.armed_rockets = armed_rockets.size; + self notify( "charged_rocket"); + advance_pod_index(); + playsoundatposition("wpn_rocket_prime_chopper_trigger", (0,0,0)); + if (armed_rockets.size > 1) + { + playsoundatposition ("wpn_rocket_prime_chopper", (0,0,0)); + } + break; + } + else + { + level thread reload_chopper_sounds(); + return armed_rockets; + } + } + } + } + } + self waittill( "fire_rockets"); + return armed_rockets; +} +reload_chopper_sounds() +{ + if(!IsDefined ( level.reload_string)) + { + level.reload_string = "left"; + } + if ( level.reload_string == "left") + { + playsoundatposition ("wpn_rocket_reload_chopper_left_battery", (0,0,0)); + level.reload_string = "right"; + } + else + { + playsoundatposition ("wpn_rocket_reload_chopper_right_battery", (0,0,0)); + level.reload_string = "left"; + } +} +advance_pod_index() +{ + if (self._rocket_pods.pod_index == self._rocket_pods.pods.size - 1) + { + self._rocket_pods.pod_index = 0; + } + else + { + self._rocket_pods.pod_index++; + } +} +arm_single_rocket(rocket, time) +{ + self endon("fire_rockets"); + wait(time); + rocket.is_armed = true; + return rocket; +} +setup_rockets() +{ + self.armed_rockets = 0; + self add_rocket_pod(self, "tag_flash_gunner1", 4); + self add_rocket_pod(create_right_rocket_pod(), undefined, 4); + self track_available_rockets(); +} +add_rocket_pod(entity, tag, num_rockets) +{ + if (!IsDefined(self._rocket_pods)) + { + self._rocket_pods = SpawnStruct(); + self._rocket_pods.arm_time = .6; + self._rocket_pods.fire_wait = .15; + self._rocket_pods.total_rockets = 0; + self._rocket_pods.free_rockets = 0; + self._rocket_pods.pod_index = 0; + self thread cleanup_rocket_pods(); + } + self._rocket_pods.total_rockets += num_rockets; + self._rocket_pods.free_rockets += num_rockets; + if (!IsDefined(self._rocket_pods.pods)) + { + self._rocket_pods.pods = []; + } + pod_index = self._rocket_pods.pods.size; + self._rocket_pods.pods[pod_index] = SpawnStruct(); + self._rocket_pods.pods[pod_index].ent = entity; + self._rocket_pods.pods[pod_index].tag = tag; + rockets = []; + for (i = 0; i < num_rockets; i++) + { + rockets[i] = SpawnStruct(); + rockets[i].pod_index = pod_index; + rockets[i].is_armed = false; + } + self._rocket_pods.pods[pod_index].rockets = rockets; +} +track_available_rockets() +{ + AssertEx( IsDefined(self._rocket_pods.free_rockets), "Hind rockets don't have a defined ammo amount" ); + self thread rocket_reload(); + self thread rocket_reload_button(); +} +rocket_regen() +{ + self endon("death"); + self endon("hind weapons disabled"); + while(1) + { + if( !self ent_flag("arming_rockets") && self._rocket_pods.free_rockets < self._rocket_pods.total_rockets ) + { + wait(3); + if(!self ent_flag("arming_rockets")) + { + self._rocket_pods.free_rockets++; + } + } + else + { + wait(0.05); + } + } +} +rocket_reload() +{ + self endon("death"); + self endon("hind weapons disabled"); + while(1) + { + while( self._rocket_pods.free_rockets > 0 || self ent_flag("arming_rockets")) + { + wait(0.1); + } + if(!self ent_flag("reloading_rockets")) + { + self notify("rocket_reload", self._rocket_pods.free_rockets ); + self ent_flag_set("reloading_rockets"); + wait(1.5); + while ( self._rocket_pods.free_rockets < self._rocket_pods.total_rockets && ent_flag("reloading_rockets") ) + { + self._rocket_pods.free_rockets++; + level thread reload_chopper_sounds(); + self notify("reloaded_rocket"); + wait(0.5); + } + self ent_flag_clear("reloading_rockets"); + playsoundatposition ("wpn_rocket_reload_chopper_reloaded_buzzer", (0,0,0)); + } + } +} +rocket_reload_button() +{ + self endon("death"); + self endon("hind weapons disabled"); + player = get_players()[0]; + while(1) + { + while(self._rocket_pods.free_rockets >= self._rocket_pods.total_rockets || self ent_flag("arming_rockets") || self ent_flag("reloading_rockets")) + { + wait(0.1); + } + while(!player UseButtonPressed()) + { + wait(0.05); + } + if(!self ent_flag("reloading_rockets")) + { + self notify("rocket_reload", self._rocket_pods.free_rockets ); + self ent_flag_set("reloading_rockets"); + while ( self._rocket_pods.free_rockets < self._rocket_pods.total_rockets && ent_flag("reloading_rockets") ) + { + self._rocket_pods.free_rockets++; + level thread reload_chopper_sounds(); + self notify("reloaded_rocket"); + wait(0.5); + } + self ent_flag_clear("reloading_rockets"); + playsoundatposition ("wpn_rocket_reload_chopper_reloaded_buzzer", (0,0,0)); + } + } +} +cleanup_rocket_pods() +{ + self waittill("death"); + for (pod_index = 0; pod_index < self._rocket_pods.pods.size; pod_index++) + { + pod = self._rocket_pods.pods[pod_index]; + array_delete(pod.rockets); + pod Delete(); + } + self._rocket_pods Delete(); +} +create_right_rocket_pod() +{ + rocket_pod_origin = self GetTagOrigin("tag_flash_gunner1"); + rocket_pod_offset = self.origin - rocket_pod_origin; + rocket_pod = Spawn("script_origin", rocket_pod_origin); + rocket_pod.origin = (self.origin[0] + rocket_pod_offset[0], self.origin[1] + rocket_pod_offset[1], rocket_pod_origin[2]); + rocket_pod LinkTo(self); + return rocket_pod; +} +get_rocket_pod_fire_pos(pod_index) +{ + pod = self._rocket_pods.pods[pod_index]; + pos = pod.ent.origin; + if (IsDefined(pod.tag)) + { + pos = pod.ent GetTagOrigin(pod.tag); + } + return pos; +} +fire_rocket(rocket) +{ + trace_origin = self GetTagOrigin("tag_flash"); + trace_angles = self GetTagAngles("tag_flash"); + forward = AnglesToForward(trace_angles); + start_origin = get_rocket_pod_fire_pos(rocket.pod_index); + trace_origin = self GetTagOrigin("tag_flash"); + trace_direction = self GetTagAngles("tag_barrel"); + trace_direction = AnglesToForward(trace_direction) * 5000; + trace = BulletTrace( trace_origin, trace_origin + trace_direction, false, self ); + trace_dist_sq = DistanceSquared( trace_origin, trace["position"] ); + if( trace_dist_sq < 5000*5000 && trace_dist_sq > 500*500 ) + { + end_origin = trace["position"]; + } + else + { + end_origin = start_origin + (forward * 1000); + } + get_players()[0] PlayRumbleOnEntity( "damage_light" ); + MagicBullet( "hind_rockets", start_origin, end_origin, self ); + rocket.is_armed = false; + self notify("fired_rocket"); + wait(self._rocket_pods.fire_wait); +} +update_rocket_hud(rocket_count, ammo_left, reloading) +{ + if(IsDefined(self.rocket_reloading) && self.rocket_reloading && !IsDefined(reloading)) + { + return; + } + if(!IsDefined(level._rocket_hud)) + { + level._rocket_hud = NewClientHudElem(get_players()[0]); + level._rocket_hud.horzAlign = "center"; + level._rocket_hud.vertAlign = "middle"; + level._rocket_hud.alignX = "center"; + level._rocket_hud.alignY = "bottom"; + level._rocket_hud.y = 5; + } + if(!IsDefined(level._rocket_hud_ammo)) + { + level._rocket_hud_ammo = NewClientHudElem(get_players()[0]); + level._rocket_hud_ammo.horzAlign = "center"; + level._rocket_hud_ammo.vertAlign = "middle"; + level._rocket_hud_ammo.alignX = "center"; + level._rocket_hud_ammo.alignY = "bottom"; + level._rocket_hud_ammo.y = 30; + } + if(IsDefined(rocket_count)) + { + level._rocket_hud SetText(rocket_count); + } + else + { + level._rocket_hud SetText(""); + } + if(IsDefined(reloading) && reloading) + { + self.rocket_reloading = true; + level._rocket_hud_ammo SetText( "*Reloading*" ); + } + else if(IsDefined(reloading) && !reloading) + { + self.rocket_reloading = false; + level._rocket_hud_ammo SetText( "Rocket Ammo: " + ammo_left ); + } + else + { + level._rocket_hud_ammo SetText( "Rocket Ammo: " + ammo_left ); + } +} +hud_rocket_create() +{ + if(!IsDefined(self.rocket_hud)) + { + self.rocket_hud = []; + } + self.rocket_hud["border_left"] = newHudElem(); + self.rocket_hud["border_left"].alignX = "left"; + self.rocket_hud["border_left"].alignY = "bottom"; + self.rocket_hud["border_left"].horzAlign = "user_left"; + self.rocket_hud["border_left"].vertAlign = "user_bottom"; + self.rocket_hud["border_left"].y = 0; + self.rocket_hud["border_left"].x = 2; + self.rocket_hud["border_left"].alpha = 1.0; + self.rocket_hud["border_left"] fadeOverTime( 0.05 ); + self.rocket_hud["border_left"] SetShader( "hud_hind_rocket_border_left", 72, 20 ); + self.rocket_hud["border_left"].hidewheninmenu = true; + self.rocket_hud["ammo7"] = newHudElem(); + self.rocket_hud["ammo7"].alignX = "left"; + self.rocket_hud["ammo7"].alignY = "bottom"; + self.rocket_hud["ammo7"].horzAlign = "user_left"; + self.rocket_hud["ammo7"].vertAlign = "user_bottom"; + self.rocket_hud["ammo7"].y = -8; + self.rocket_hud["ammo7"].x = -2; + self.rocket_hud["ammo7"].alpha = 0.55; + self.rocket_hud["ammo7"] fadeOverTime( 0.05 ); + self.rocket_hud["ammo7"] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo7"].hidewheninmenu = true; + self.rocket_hud["ammo5"] = newHudElem(); + self.rocket_hud["ammo5"].alignX = "left"; + self.rocket_hud["ammo5"].alignY = "bottom"; + self.rocket_hud["ammo5"].horzAlign = "user_left"; + self.rocket_hud["ammo5"].vertAlign = "user_bottom"; + self.rocket_hud["ammo5"].alpha = 0.55; + self.rocket_hud["ammo5"] fadeOverTime( 0.05 ); + self.rocket_hud["ammo5"].y = -8; + self.rocket_hud["ammo5"].x = 8; + self.rocket_hud["ammo5"] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo5"].hidewheninmenu = true; + self.rocket_hud["ammo3"] = newHudElem(); + self.rocket_hud["ammo3"].alignX = "left"; + self.rocket_hud["ammo3"].alignY = "bottom"; + self.rocket_hud["ammo3"].horzAlign = "user_left"; + self.rocket_hud["ammo3"].vertAlign = "user_bottom"; + self.rocket_hud["ammo3"].alpha = 0.55; + self.rocket_hud["ammo3"] fadeOverTime( 0.05 ); + self.rocket_hud["ammo3"].y = -8; + self.rocket_hud["ammo3"].x = 18; + self.rocket_hud["ammo3"] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo3"].hidewheninmenu = true; + self.rocket_hud["ammo1"] = newHudElem(); + self.rocket_hud["ammo1"].alignX = "left"; + self.rocket_hud["ammo1"].alignY = "bottom"; + self.rocket_hud["ammo1"].horzAlign = "user_left"; + self.rocket_hud["ammo1"].vertAlign = "user_bottom"; + self.rocket_hud["ammo1"].alpha = 0.55; + self.rocket_hud["ammo1"] fadeOverTime( 0.05 ); + self.rocket_hud["ammo1"].y = -8; + self.rocket_hud["ammo1"].x = 28; + self.rocket_hud["ammo1"] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo1"].hidewheninmenu = true; + self.rocket_hud["button"] = newHudElem(); + self.rocket_hud["button"].alignX = "left"; + self.rocket_hud["button"].alignY = "bottom"; + self.rocket_hud["button"].horzAlign = "user_left"; + self.rocket_hud["button"].vertAlign = "user_bottom"; + self.rocket_hud["button"].y = -8; + self.rocket_hud["button"].foreground = true; + self.rocket_hud["button"] SetText("[{+speed_throw}]"); + self.rocket_hud["button"].hidewheninmenu = true; + if (level.ps3) + { + self.rocket_hud["button"].x = 56; + self.rocket_hud["button"].fontscale = 2.5; + } + else + { + self.rocket_hud["button"].x = 60; + self.rocket_hud["button"].fontscale = 1; + } + self.rocket_hud["border_right"] = newHudElem(); + self.rocket_hud["border_right"].alignX = "left"; + self.rocket_hud["border_right"].alignY = "bottom"; + self.rocket_hud["border_right"].horzAlign = "user_left"; + self.rocket_hud["border_right"].vertAlign = "user_bottom"; + self.rocket_hud["border_right"].y = 0; + self.rocket_hud["border_right"].x = 61; + self.rocket_hud["border_right"].alpha = 1.0; + self.rocket_hud["border_right"] fadeOverTime( 0.05 ); + self.rocket_hud["border_right"] SetShader( "hud_hind_rocket_border_right", 72, 20 ); + self.rocket_hud["border_right"].hidewheninmenu = true; + self.rocket_hud["ammo2"] = newHudElem(); + self.rocket_hud["ammo2"].alignX = "left"; + self.rocket_hud["ammo2"].alignY = "bottom"; + self.rocket_hud["ammo2"].horzAlign = "user_left"; + self.rocket_hud["ammo2"].vertAlign = "user_bottom"; + self.rocket_hud["ammo2"].alpha = 0.55; + self.rocket_hud["ammo2"] fadeOverTime( 0.05 ); + self.rocket_hud["ammo2"].y = -8; + self.rocket_hud["ammo2"].x = 58; + self.rocket_hud["ammo2"] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo2"].hidewheninmenu = true; + self.rocket_hud["ammo4"] = newHudElem(); + self.rocket_hud["ammo4"].alignX = "left"; + self.rocket_hud["ammo4"].alignY = "bottom"; + self.rocket_hud["ammo4"].horzAlign = "user_left"; + self.rocket_hud["ammo4"].vertAlign = "user_bottom"; + self.rocket_hud["ammo4"].alpha = 0.55; + self.rocket_hud["ammo4"] fadeOverTime( 0.05 ); + self.rocket_hud["ammo4"].y = -8; + self.rocket_hud["ammo4"].x = 68; + self.rocket_hud["ammo4"] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo4"].hidewheninmenu = true; + self.rocket_hud["ammo6"] = newHudElem(); + self.rocket_hud["ammo6"].alignX = "left"; + self.rocket_hud["ammo6"].alignY = "bottom"; + self.rocket_hud["ammo6"].horzAlign = "user_left"; + self.rocket_hud["ammo6"].vertAlign = "user_bottom"; + self.rocket_hud["ammo6"].alpha = 0.55; + self.rocket_hud["ammo6"] fadeOverTime( 0.05 ); + self.rocket_hud["ammo6"].y = -8; + self.rocket_hud["ammo6"].x = 78; + self.rocket_hud["ammo6"] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo6"].hidewheninmenu = true; + self.rocket_hud["ammo8"] = newHudElem(); + self.rocket_hud["ammo8"].alignX = "left"; + self.rocket_hud["ammo8"].alignY = "bottom"; + self.rocket_hud["ammo8"].horzAlign = "user_left"; + self.rocket_hud["ammo8"].vertAlign = "user_bottom"; + self.rocket_hud["ammo8"].alpha = 0.55; + self.rocket_hud["ammo8"] fadeOverTime( 0.05 ); + self.rocket_hud["ammo8"].y = -8; + self.rocket_hud["ammo8"].x = 88; + self.rocket_hud["ammo8"] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo8"].hidewheninmenu = true; + self thread hud_rocket_think(); + self thread hud_rocket_destroy(); +} +hud_rocket_destroy() +{ + self waittill("hind weapons disabled"); + self.rocket_hud["border_left"] Destroy(); + self.rocket_hud["ammo7"] Destroy(); + self.rocket_hud["ammo5"] Destroy(); + self.rocket_hud["ammo3"] Destroy(); + self.rocket_hud["ammo1"] Destroy(); + self.rocket_hud["button"] Destroy(); + self.rocket_hud["border_right"] Destroy(); + self.rocket_hud["ammo2"] Destroy(); + self.rocket_hud["ammo4"] Destroy(); + self.rocket_hud["ammo6"] Destroy(); + self.rocket_hud["ammo8"] Destroy(); +} +hud_rocket_think() +{ + self waittill("activate_hud"); + self endon("hind weapons disabled"); + while(1) + { + for(i = 1; i < 9; i++ ) + { + if( i - 1 < self._rocket_pods.free_rockets ) + { + self.rocket_hud["ammo" + i] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo" + i].alpha = 0.45; + self.rocket_hud["ammo" + i] fadeOverTime( 0.05 ); + } + else if( i <= self._rocket_pods.free_rockets + self.armed_rockets ) + { + self.rocket_hud["ammo" + i] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo" + i].alpha = 0.9; + self.rocket_hud["ammo" + i] fadeOverTime( 0.05 ); + } + else + { + self.rocket_hud["ammo" + i] SetShader( "hud_hind_rocket", 48, 48 ); + self.rocket_hud["ammo" + i].alpha = 0; + self.rocket_hud["ammo" + i] fadeOverTime( 0.05 ); + } + } + wait(0.05); + } +} +hud_minigun_create() +{ + if(!IsDefined(self.minigun_hud)) + { + self.minigun_hud = []; + } + self.minigun_hud["gun"] = newHudElem(); + self.minigun_hud["gun"].alignX = "right"; + self.minigun_hud["gun"].alignY = "bottom"; + self.minigun_hud["gun"].horzAlign = "user_right"; + self.minigun_hud["gun"].vertAlign = "user_bottom"; + self.minigun_hud["gun"].alpha = 0.55; + self.minigun_hud["gun"] fadeOverTime( 0.05 ); + self.minigun_hud["gun"] SetShader( "hud_hind_cannon01", 64, 64 ); + self.minigun_hud["gun"].hidewheninmenu = true; + self.minigun_hud["button"] = newHudElem(); + self.minigun_hud["button"].alignX = "right"; + self.minigun_hud["button"].alignY = "bottom"; + self.minigun_hud["button"].horzAlign = "user_right"; + self.minigun_hud["button"].vertAlign = "user_bottom"; + self.minigun_hud["button"].x = -52; + self.minigun_hud["button"].y = -6; + self.minigun_hud["button"].foreground = true; + self.minigun_hud["button"] SetText("[{+attack}]"); + self.minigun_hud["button"].hidewheninmenu = true; + if (level.ps3) + { + self.minigun_hud["button"].x = -55; + self.minigun_hud["button"].fontscale = 2.5; + } + else + { + self.minigun_hud["button"].x = -52; + self.minigun_hud["button"].fontscale = 1.0; + } + self thread hud_minigun_think(); + self thread hud_minigun_destroy(); +} +hud_minigun_destroy() +{ + self waittill("hind weapons disabled"); + self.minigun_hud["gun"] Destroy(); + self.minigun_hud["button"] Destroy(); +} +minigun_sound() +{ + self waittill("activate_hud"); + self endon("hind weapons disabled"); + player = get_players()[0]; + while(1) + { + while(!player AttackButtonPressed()) + { + wait(0.05); + } + while(player AttackButtonPressed()) + { + wait(0.05); + player playloopsound( "wpn_hind_pilot_fire_loop_plr" ); + } + player stoploopsound(); + player playsound( "wpn_hind_pilot_stop_plr" ); + } +} +hud_minigun_think() +{ + self waittill("activate_hud"); + self endon("hind weapons disabled"); + player = get_players()[0]; + while(1) + { + while(!player AttackButtonPressed()) + { + wait(0.05); + } + swap_counter = 1; + self.minigun_hud["gun"] fadeOverTime( 0.05 ); + self.minigun_hud["gun"].alpha = 0.65; + while(player AttackButtonPressed()) + { + wait(0.05); + player playloopsound( "wpn_hind_pilot_fire_loop_plr" ); + self.minigun_hud["gun"] SetShader( "hud_hind_cannon0" + swap_counter, 64, 64 ); + if(swap_counter == 5) + { + swap_counter = 1; + } + else + { + swap_counter++; + } + } + self.minigun_hud["gun"] SetShader( "hud_hind_cannon01", 64, 64 ); + self.minigun_hud["gun"] fadeOverTime( 0.05 ); + self.minigun_hud["gun"].alpha = 0.55; + player stoploopsound(); + player playsound( "wpn_hind_pilot_stop_plr" ); + } +} +make_player_usable() +{ + self endon("disable player entry"); + init_player_anims(); + if(!IsDefined(self.enter_trig)) + { + trig_origin = self GetTagOrigin("tag_driver"); + self.enter_trig = Spawn("trigger_radius", trig_origin - (0,0,500), 0, 52, 1000); + } + while(1) + { + self.enter_trig waittill("trigger", who); + if( IsPlayer(who) ) + { + if(who GetStance() != "stand") + { + while(who.divetoprone) + { + wait(0.2); + } + who FreezeControls(true); + who SetStance( "stand" ); + wait(0.5); + who FreezeControls(false); + } + self notify("animated_switch"); + playsoundatposition("evt_hind_climb_1",(0,0,0)); + level.animating_helicopter = self; + self player_enter_animation(who); + self notify("player_entered"); + return; + } + else + { + wait(0.05); + } + } +} +make_player_unusable() +{ + self notify("disable player entry"); +} +swap_for_interior( guy, no_attach ) +{ + level.animating_helicopter SetModel("t5_veh_helo_hind_cockpitview"); + if( !IsDefined(no_attach) || !no_attach ) + { + level.animating_helicopter Attach("t5_veh_helo_hind_ckpitdmg0", "origin_animate_jnt"); + } + level.animating_helicopter HidePart( "tag_window_l_dmg_1", "t5_veh_helo_hind_cockpitview" ); + level.animating_helicopter HidePart( "tag_window_c_dmg_1", "t5_veh_helo_hind_cockpitview" ); + level.animating_helicopter HidePart( "tag_window_r_dmg_1", "t5_veh_helo_hind_cockpitview" ); + level.animating_helicopter HidePart( "tag_window_l_dmg_2", "t5_veh_helo_hind_cockpitview" ); + level.animating_helicopter HidePart( "tag_window_c_dmg_2", "t5_veh_helo_hind_cockpitview" ); + level.animating_helicopter HidePart( "tag_window_r_dmg_2", "t5_veh_helo_hind_cockpitview" ); + level.animating_helicopter notify("switch_climbin_anim"); + level.animating_helicopter = undefined; +} +swap_for_exterior( guy ) +{ + level.animating_helicopter SetModel("t5_veh_helo_hind_blockout"); + level.animating_helicopter notify("switch_climbout_anim"); + level.animating_helicopter = undefined; +} +#using_animtree("player"); +player_enter_animation(player) +{ + player AllowPickupWeapons( false ); + player_body = spawn_anim_model( "hind_body", player.origin, player.angles ); + self.player_body = player_body; + player_body Hide(); + player_body LinkTo(self, "origin_animate_jnt" ); + self notify("playing takeoff animation"); + self thread maps\_anim::anim_single_aligned(player_body, "playable_hind_climbin", "origin_animate_jnt"); + self thread exterior_window_anim(); + wait( 0.10 ); + player thread take_and_giveback_weapons("playable_hind_climbin"); + player PlayerLinkToAbsolute(player_body, "tag_player"); + player_body Attach( "t5_veh_helo_hind_cockpit_control", "tag_weapon" ); + player_body Show(); + while(self GetSpeed() > 0.1) + { + wait(0.05); + } + self waittill( "playable_hind_climbin" ); + player notify("playable_hind_climbin"); + player AllowPickupWeapons( true ); +} +player_exit_animation(player) +{ + self notify("animated_switch"); + level.animating_helicopter = self; + if(!IsDefined(self.player_body)) + { + player_body = spawn_anim_model( "hind_body", player.origin, player.angles ); + self.player_body = player_body; + player_body Hide(); + player_body LinkTo(self, "origin_animate_jnt" ); + } + else + { + player_body = self.player_body; + self.player_body.animname = "hind_body"; + } + self notify("playing landing animation"); + self thread maps\_anim::anim_single_aligned(player_body, "playable_hind_climbout", "origin_animate_jnt"); + self thread interior_window_anim_exit(); + wait( 0.10 ); + self Useby(player); + self notify("hind weapons disabled"); + player thread take_and_giveback_weapons("playable_hind_climbout"); + player PlayerLinkToAbsolute(player_body, "tag_player"); + player_body Show(); + self waittill( "playable_hind_climbout" ); + player notify( "playable_hind_climbout" ); + player Unlink(); + player_body Delete(); + trace_start = player.origin + (0,0,200); + trace_end = player.origin + (0,0,-100); + player_trace = BulletTrace(trace_start, trace_end, false, self); + player SetOrigin(player_trace["position"]); +} +init_player_anims() +{ + AssertEX( IsDefined(level.player_interactive_model), "The playable hind requires that you set a player_interactive_model in _loadout.gsc"); + level.scr_animtree["hind_body"] = #animtree; + level.scr_model["hind_body"] = level.player_interactive_model; + level.scr_anim["hind_body"]["playable_hind_climbin"] = %int_pow_b03_cockpit_inandup; + maps\_anim::addNotetrack_customFunction( "hind_body", "swap", ::swap_for_interior, "playable_hind_climbin" ); + level.scr_anim["hind_body"]["playable_hind_climbout"] = %int_pow_b03_cockpit_exit; + maps\_anim::addNotetrack_customFunction( "hind_body", "swap", ::swap_for_exterior, "playable_hind_climbout" ); +} +#using_animtree("vehicles"); +init_vehicle_anims() +{ + level.scr_anim["hind"]["climbout_exterior"] = %v_pow_b03_hind_exit_exterior; + level.scr_anim["hind"]["climbout_interior"] = %v_pow_b03_hind_exit_interior; + level.scr_anim["hind"]["climbin_exterior"] = %v_pow_b03_hind_climbin_exterior; + level.scr_anim["hind"]["climbin_interior"] = %v_pow_b03_hind_climbin_interior; + level.scr_anim["hind"]["landed"] = %v_pow_b03_hind_landed; +} +exterior_window_anim() +{ + self ClearAnim(level.scr_anim["hind"]["landed"], 0); + self SetAnim(level.scr_anim["hind"]["climbin_exterior"], 1); + self waittill("switch_climbin_anim"); + self interior_window_anim(); +} +interior_window_anim() +{ + self ClearAnim(level.scr_anim["hind"]["climbin_exterior"], .15); + self SetAnim(level.scr_anim["hind"]["climbin_interior"], 1); + self waittill("player_entered"); +} +interior_window_anim_exit() +{ + self ClearAnim(level.scr_anim["hind"]["landed"], 0); + self AnimScripted("hind_exit_anim", self.origin, self.angles, level.scr_anim["hind"]["climbout_interior"]); + self waittill("playable_hind_climbout"); + self exterior_window_anim_exit(); +} +exterior_window_anim_exit() +{ + self AnimScripted("hind_exit_anim", self.origin, self.angles, level.scr_anim["hind"]["climbout_exterior"]); +} +landed_animation() +{ + self SetAnim(level.scr_anim["hind"]["landed"], 1); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_hip.gsc b/BO1/PC/ZM/maps/_hip.gsc new file mode 100644 index 0000000..4cb2513 Binary files /dev/null and b/BO1/PC/ZM/maps/_hip.gsc differ diff --git a/BO1/PC/ZM/maps/_hud.gsc b/BO1/PC/ZM/maps/_hud.gsc new file mode 100644 index 0000000..48f4cfc Binary files /dev/null and b/BO1/PC/ZM/maps/_hud.gsc differ diff --git a/BO1/PC/ZM/maps/_hud_message.gsc b/BO1/PC/ZM/maps/_hud_message.gsc new file mode 100644 index 0000000..e619a57 --- /dev/null +++ b/BO1/PC/ZM/maps/_hud_message.gsc @@ -0,0 +1,553 @@ +#include maps\_hud_util; +#include maps\_utility; +init() +{ + level thread onPlayerConnect(); +} +onPlayerConnect() +{ + for(;;) + { + level waittill( "connecting", player ); + player thread initNotifyMessage(); + } +} +hintMessagePlayers( players, hintText ) +{ + notifyData = spawnstruct(); + notifyData.notifyText = hintText; + for ( i = 0; i < players.size; i++ ) + { + players[ i ] notifyMessage( notifyData ); + } +} +hintMessage( hintText ) +{ + notifyData = spawnstruct(); + notifyData.notifyText = hintText; + notifyMessage( notifyData ); +} +initNotifyMessage() +{ + if ( IsDefined( self.notifyTitle ) ) + return; + zombieMode = GetDvar( #"zombiemode" ); + if ( IsDefined( zombieMode ) && "1" == zombieMode ) + self thread initNotifyMessageZombie(); + else + self thread initNotifyMessageInternal(); +} +initNotifyMessageInternal() +{ + if ( level.splitscreen ) + { + titleSize = 2.0; + textSize = 1.5; + iconSize = 24; + font = "default"; + point = "TOP"; + relativePoint = "BOTTOM"; + yOffset = 30; + xOffset = 0; + } + else + { + titleSize = 2.5; + textSize = 1.75; + iconSize = 30; + font = "objective"; + point = "TOP"; + relativePoint = "BOTTOM"; + yOffset = 30; + xOffset = 0; + } + self.notifyTitle = createFontString( font, titleSize, self ); + self.notifyTitle setPoint( point, undefined, xOffset, yOffset ); + self.notifyTitle.glowAlpha = 1; + self.notifyTitle.hideWhenInMenu = true; + self.notifyTitle.archived = false; + self.notifyTitle.alpha = 0; + self.notifyText = createFontString( font, textSize, self ); + self.notifyText setParent( self.notifyTitle ); + self.notifyText setPoint( point, relativePoint, 0, 0 ); + self.notifyText.glowAlpha = 1; + self.notifyText.hideWhenInMenu = true; + self.notifyText.archived = false; + self.notifyText.alpha = 0; + self.notifyText2 = createFontString( font, textSize, self ); + self.notifyText2 setParent( self.notifyTitle ); + self.notifyText2 setPoint( point, relativePoint, 0, 0 ); + self.notifyText2.glowAlpha = 1; + self.notifyText2.hideWhenInMenu = true; + self.notifyText2.archived = false; + self.notifyText2.alpha = 0; + self.notifyIcon = createIcon( "white", iconSize, iconSize, self ); + self.notifyIcon setParent( self.notifyText2 ); + self.notifyIcon setPoint( point, relativePoint, 0, 0 ); + self.notifyIcon.hideWhenInMenu = true; + self.notifyIcon.archived = false; + self.notifyIcon.alpha = 0; + self.notifyText3 = createFontString( font, textSize, self ); + self.notifyText3 setParent( self.notifyTitle ); + self.notifyText3 setPoint( point, relativePoint, 0, 0 ); + self.notifyText3.glowAlpha = 1; + self.notifyText3.hideWhenInMenu = true; + self.notifyText3.archived = false; + self.notifyText3.alpha = 0; + self.doingNotify = false; + self.notifyQueue = []; +} +initNotifyMessageZombie() +{ + if ( level.splitscreen ) + { + titleSize = 2.0; + textSize = 1.5; + iconSize = 24; + font = "default"; + point = "TOP"; + relativePoint = "BOTTOM"; + yOffset = 30; + xOffset = 0; + } + else + { + titleSize = 2.5; + textSize = 1.75; + iconSize = 30; + font = "objective"; + point = "TOP"; + relativePoint = "BOTTOM"; + yOffset = 30; + xOffset = 0; + } + self.notifyTitle = createZombieNotifyString( titleSize, self ); + self.notifyTitle setPoint( point, undefined, xOffset, yOffset ); + self.proTip1 = createZombieNotifyString( titleSize, self ); + self.proTip1 setPoint( point, undefined, xOffset, yOffset ); + self.proTip2 = createZombieNotifyString( titleSize, self ); + self.proTip2 setPoint( point, undefined, 0, yOffset*2 ); + self.notifyTitleGhost = createZombieNotifyString( titleSize, self ); + self.notifyTitleGhost setPoint( point, undefined, xOffset, yOffset ); + self.notifyText = createZombieNotifyString( textSize, self ); + self.notifyText setParent( self.notifyTitle ); + self.notifyText setPoint( point, relativePoint, 0, 0 ); + self.notifyIcon = createIcon( "white", iconSize, iconSize, self ); + self.notifyIcon setParent( self.notifyText ); + self.notifyIcon setPoint( point, relativePoint, 0, 0 ); + self.notifyIcon.hideWhenInMenu = true; + self.notifyIcon.archived = false; + self.notifyIcon.alpha = 0; + self.doingNotify = false; + self.notifyQueue = []; +} +createZombieNotifyString( fontScale, player ) +{ + if(isdefined(player)) + { + fontElem = newClientHudElem(player); + } + else + { + fontElem = newHudElem( self ); + } + fontElem.elemType = "font"; + fontElem.fontscale = fontScale; + fontElem.x = 0; + fontElem.y = 0; + fontElem.sort = 100; + fontElem.width = 0; + fontElem.height = int(level.fontHeight * fontScale); + fontElem.xOffset = 0; + fontElem.yOffset = 0; + fontElem.children = []; + fontElem setParent( level.uiParent ); + fontElem.hidden = false; + fontElem.glowAlpha = 1; + fontElem.hideWhenInMenu = true; + fontElem.archived = false; + fontElem.alpha = 0; + return fontElem; +} +notifyMessage( notifyData ) +{ + self endon ( "death" ); + self endon ( "disconnect" ); + if ( !self.doingNotify ) + { + self thread showNotifyMessage( notifyData ); + return; + } + self.notifyQueue[ self.notifyQueue.size ] = notifyData; +} +showNotifyMessage( notifyData ) +{ + zombieMode = GetDvar( #"zombiemode" ); + if ( IsDefined( zombieMode ) && "1" == zombieMode ) + self thread showNotifyMessageZombie( notifyData ); + else + self thread showNotifyMessageInternal( notifyData ); +} +showNotifyMessageInternal( notifyData ) +{ + self endon("disconnect"); + self.doingNotify = true; + waitRequireVisibility( 0 ); + if ( isDefined( notifyData.duration ) ) + duration = notifyData.duration; + else if ( level.gameEnded ) + duration = 2.0; + else + duration = 4.0; + self thread resetOnCancel(); + if ( isDefined( notifyData.sound ) ) + self playLocalSound( notifyData.sound ); + if ( isDefined( notifyData.glowColor ) ) + glowColor = notifyData.glowColor; + else + glowColor = (0.0, 0.0, 0.0); + anchorElem = self.notifyTitle; + if ( isDefined( notifyData.titleText ) ) + { + if ( level.splitScreen ) + { + if ( isDefined( notifyData.titleLabel ) ) + self iPrintLnBold( notifyData.titleLabel, notifyData.titleText ); + else + self iPrintLnBold( notifyData.titleText ); + } + else + { + if ( isDefined( notifyData.titleLabel ) ) + self.notifyTitle.label = notifyData.titleLabel; + else + self.notifyTitle.label = &""; + if ( isDefined( notifyData.titleLabel ) && !isDefined( notifyData.titleIsString ) ) + self.notifyTitle setValue( notifyData.titleText ); + else + self.notifyTitle setText( notifyData.titleText ); + self.notifyTitle setPulseFX( 100, int(duration*1000), 1000 ); + self.notifyTitle.glowColor = glowColor; + self.notifyTitle.alpha = 1; + } + } + if ( isDefined( notifyData.notifyText ) ) + { + if ( level.splitScreen ) + { + if ( isDefined( notifyData.textLabel ) ) + self iPrintLnBold( notifyData.textLabel, notifyData.notifyText ); + else + self iPrintLnBold( notifyData.notifyText ); + } + else + { + if ( isDefined( notifyData.textLabel ) ) + self.notifyText.label = notifyData.textLabel; + else + self.notifyText.label = &""; + if ( isDefined( notifyData.textLabel ) && !isDefined( notifyData.textIsString ) ) + self.notifyText setValue( notifyData.notifyText ); + else + self.notifyText setText( notifyData.notifyText ); + self.notifyText setPulseFX( 100, int(duration*1000), 1000 ); + self.notifyText.glowColor = glowColor; + self.notifyText.alpha = 1; + anchorElem = self.notifyText; + } + } + if ( isDefined( notifyData.notifyText2 ) ) + { + if ( level.splitScreen ) + { + if ( isDefined( notifyData.text2Label ) ) + self iPrintLnBold( notifyData.text2Label, notifyData.notifyText2 ); + else + self iPrintLnBold( notifyData.notifyText2 ); + } + else + { + self.notifyText2 setParent( anchorElem ); + if ( isDefined( notifyData.text2Label ) ) + self.notifyText2.label = notifyData.text2Label; + else + self.notifyText2.label = &""; + if ( isDefined( notifyData.text2Label ) && !isDefined( notifyData.textIsString ) ) + self.notifyText2 setValue( notifyData.notifyText2 ); + else + self.notifyText2 setText( notifyData.notifyText2 ); + self.notifyText2 setText( notifyData.notifyText2 ); + self.notifyText2 setPulseFX( 100, int(duration*1000), 1000 ); + self.notifyText2.glowColor = glowColor; + self.notifyText2.alpha = 1; + anchorElem = self.notifyText2; + } + } + if ( isDefined( notifyData.notifyText3 ) ) + { + if ( level.splitScreen ) + { + if ( isDefined( notifyData.text3Label ) ) + self iPrintLnBold( notifyData.text3Label, notifyData.notifyText3 ); + else + self iPrintLnBold( notifyData.notifyText3 ); + } + else + { + self.notifyText3 setParent( anchorElem ); + if ( isDefined( notifyData.text3Label ) ) + self.notifyText3.label = notifyData.text3Label; + else + self.notifyText3.label = &""; + if ( isDefined( notifyData.text3Label ) && !isDefined( notifyData.textIsString ) ) + self.notifyText3 setValue( notifyData.notifyText3 ); + else + self.notifyText3 setText( notifyData.notifyText3 ); + self.notifyText3 setText( notifyData.notifyText3 ); + self.notifyText3 setPulseFX( 100, int(duration*1000), 1000 ); + self.notifyText3.glowColor = glowColor; + self.notifyText3.alpha = 1; + anchorElem = self.notifyText3; + } + } + if ( isDefined( notifyData.iconName ) && !level.splitScreen ) + { + self.notifyIcon setParent( anchorElem ); + self.notifyIcon setShader( notifyData.iconName, 60, 60 ); + self.notifyIcon.alpha = 0; + self.notifyIcon fadeOverTime( 1.0 ); + self.notifyIcon.alpha = 1; + waitRequireVisibility( duration ); + self.notifyIcon fadeOverTime( 0.75 ); + self.notifyIcon.alpha = 0; + } + else + { + waitRequireVisibility( duration ); + } + self notify ( "notifyMessageDone" ); + self.doingNotify = false; + if ( self.notifyQueue.size > 0 ) + { + nextNotifyData = self.notifyQueue[0]; + newQueue = []; + for ( i = 1; i < self.notifyQueue.size; i++ ) + self.notifyQueue[i-1] = self.notifyQueue[i]; + self.notifyQueue[i-1] = undefined; + self thread showNotifyMessageInternal( nextNotifyData ); + } +} +showNotifyMessageZombie( notifyData ) +{ + self endon("disconnect"); + self.doingNotify = true; + waitRequireVisibility( 0 ); + if ( isDefined( notifyData.duration ) ) + duration = notifyData.duration; + else if ( level.gameEnded ) + duration = 2.0; + else + duration = 4.0; + self thread resetOnCancel(); + if ( isDefined( notifyData.sound ) ) + self playLocalSound( notifyData.sound ); + if ( isDefined( notifyData.glowColor ) ) + glowColor = notifyData.glowColor; + else + glowColor = (0.0, 0.0, 0.0); + anchorElem = self.notifyTitle; + if ( isDefined( notifyData.titleText ) ) + { + if ( level.splitScreen ) + { + if ( isDefined( notifyData.titleLabel ) ) + self iPrintLnBold( notifyData.titleLabel, notifyData.titleText ); + else + self iPrintLnBold( notifyData.titleText ); + } + else + { + if ( isDefined( notifyData.titleLabel ) ) + { + self.notifyTitle.label = notifyData.titleLabel; + self.notifyTitleGhost.label = notifyData.titleLabel; + } + else + { + self.notifyTitle.label = &""; + self.notifyTitleGhost.label = &""; + } + if ( isDefined( notifyData.titleLabel ) && !isDefined( notifyData.titleIsString ) ) + { + self.notifyTitle setValue( notifyData.titleText ); + self.notifyTitleGhost setValue( notifyData.titleText ); + } + else + { + self.notifyTitle setText( notifyData.titleText ); + self.notifyTitleGhost setText( notifyData.titleText ); + } + self.notifyTitle setPulseFX( 100, int(duration*1000), 1400 ); + self.notifyTitle.glowColor = glowColor; + self.notifyTitle.alpha = 1; + self.notifyTitle.x = -600; + self.notifyTitleGhost setPulseFX( 100, int(duration*1000), 1400 ); + self.notifyTitleGhost.glowColor = glowColor; + self.notifyTitleGhost.alpha = 0; + self.notifyTitleGhost.x = 0; + self.notifyTitleGhost.fontScale = 2.5; + } + self.notifyTitle moveovertime( 0.4 ); + self.notifyTitle.x = 0; + wait( 0.4 ); + self.notifyTitleGhost.alpha = 0.6; + self.notifyTitleGhost moveovertime( 1.0 ); + self.notifyTitleGhost.x = 600; + } + if ( isDefined( notifyData.proTip1 ) ) + { + if ( level.splitScreen ) + { + self iPrintLnBold( notifyData.proTip1 ); + } + else + { + self.proTip1 setText( notifyData.proTip1 ); + self.proTip1 fadeOverTime( 1.0 ); + self.proTip1.glowColor = glowColor; + self.proTip1.alpha = 1; + } + } + if ( isDefined( notifyData.proTip2 ) ) + { + if ( level.splitScreen ) + { + self iPrintLnBold( notifyData.proTip2 ); + } + else + { + self.proTip2 setText( notifyData.proTip2 ); + self.proTip2 fadeOverTime( 1.0 ); + self.proTip2.glowColor = glowColor; + self.proTip2.alpha = 1; + } + } + if( IsDefined( notifyData.proTipWait ) ) + wait( notifyData.proTipWait ); + if ( !level.splitScreen ) + { + if ( isDefined( notifyData.proTip1 ) ) + { + self.proTip1 fadeOverTime( 1.0 ); + self.proTip1.alpha = 0; + } + if ( isDefined( notifyData.proTip2 ) ) + { + self.proTip2 fadeOverTime( 1.0 ); + self.proTip2.alpha = 0; + } + } + if ( isDefined( notifyData.notifyText ) ) + { + if ( level.splitScreen ) + { + if ( isDefined( notifyData.textLabel ) ) + self iPrintLnBold( notifyData.textLabel, notifyData.notifyText ); + else + self iPrintLnBold( notifyData.notifyText ); + } + else + { + if ( isDefined( notifyData.textLabel ) ) + self.notifyText.label = notifyData.textLabel; + else + self.notifyText.label = &""; + if ( isDefined( notifyData.textLabel ) && !isDefined( notifyData.textIsString ) ) + self.notifyText setValue( notifyData.notifyText ); + else + self.notifyText setText( notifyData.notifyText ); + self.notifyText setPulseFX( 70, int(duration*1000), 1000 ); + self.notifyText.glowColor = glowColor; + self.notifyText.alpha = 1; + anchorElem = self.notifyText; + } + } + if ( isDefined( notifyData.iconName ) && !level.splitScreen ) + { + self.notifyIcon setParent( anchorElem ); + self.notifyIcon setShader( notifyData.iconName, 60, 60 ); + self.notifyIcon.alpha = 0; + self.notifyIcon fadeOverTime( 1.0 ); + self.notifyIcon.alpha = 1; + waitRequireVisibility( duration ); + self.notifyIcon fadeOverTime( 0.75 ); + self.notifyIcon.alpha = 0; + } + else + { + waitRequireVisibility( duration ); + } + self notify ( "notifyMessageDone" ); + self.doingNotify = false; + if ( self.notifyQueue.size > 0 ) + { + nextNotifyData = self.notifyQueue[0]; + newQueue = []; + for ( i = 1; i < self.notifyQueue.size; i++ ) + self.notifyQueue[i-1] = self.notifyQueue[i]; + self.notifyQueue[i-1] = undefined; + self thread showNotifyMessageZombie( nextNotifyData ); + } +} +waitRequireVisibility( waitTime ) +{ + interval = .05; + while ( !self canReadText() ) + wait interval; + while ( waitTime > 0 ) + { + wait interval; + if ( self canReadText() ) + waitTime -= interval; + } +} +canReadText() +{ + return true; +} +resetOnCancel() +{ + self notify ( "resetOnCancel" ); + self endon ( "resetOnCancel" ); + self endon ( "notifyMessageDone" ); + self endon ( "disconnect" ); + level waittill ( "cancel_notify" ); + resetNotify(); +} +resetNotify() +{ + self.notifyTitle.alpha = 0; + self.notifyText.alpha = 0; + self.notifyIcon.alpha = 0; + self.doingNotify = false; +} +waitTillNotifiesDone() +{ + pendingNotifies = true; + timeWaited = 0; + while( pendingNotifies && timeWaited < 12 ) + { + pendingNotifies = false; + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( IsDefined( players[i].notifyQueue ) && players[i].notifyQueue.size > 0 ) + { + pendingNotifies = true; + } + } + if( pendingNotifies ) + wait .2; + timeWaited += .2; + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_hud_util.gsc b/BO1/PC/ZM/maps/_hud_util.gsc new file mode 100644 index 0000000..5fb3fe3 --- /dev/null +++ b/BO1/PC/ZM/maps/_hud_util.gsc @@ -0,0 +1,460 @@ +#include maps\_utility; +#include animscripts\utility; +#include common_scripts\utility; +setParent( element ) +{ + if ( isDefined( self.parent ) && self.parent == element ) + return; + if ( isDefined( self.parent ) ) + self.parent removeChild( self ); + self.parent = element; + self.parent addChild( self ); + if ( isDefined( self.point ) ) + self setPoint( self.point, self.relativePoint, self.xOffset, self.yOffset ); + else + self setPoint( "TOPLEFT" ); +} +getParent() +{ + return self.parent; +} +addChild( element ) +{ + element.index = self.children.size; + self.children[self.children.size] = element; +} +removeChild( element ) +{ + element.parent = undefined; + if ( self.children[self.children.size-1] != element ) + { + self.children[element.index] = self.children[self.children.size-1]; + self.children[element.index].index = element.index; + } + self.children[self.children.size-1] = undefined; + element.index = undefined; +} +setPoint( point, relativePoint, xOffset, yOffset, moveTime ) +{ + if ( !isDefined( moveTime ) ) + moveTime = 0; + element = self getParent(); + if ( moveTime ) + self moveOverTime( moveTime ); + if ( !isDefined( xOffset ) ) + xOffset = 0; + self.xOffset = xOffset; + if ( !isDefined( yOffset ) ) + yOffset = 0; + self.yOffset = yOffset; + self.point = point; + self.alignX = "center"; + self.alignY = "middle"; + if ( isSubStr( point, "TOP" ) ) + self.alignY = "top"; + if ( isSubStr( point, "BOTTOM" ) ) + self.alignY = "bottom"; + if ( isSubStr( point, "LEFT" ) ) + self.alignX = "left"; + if ( isSubStr( point, "RIGHT" ) ) + self.alignX = "right"; + if ( !isDefined( relativePoint ) ) + relativePoint = point; + self.relativePoint = relativePoint; + relativeX = "center"; + relativeY = "middle"; + if ( isSubStr( relativePoint, "TOP" ) ) + relativeY = "top"; + if ( isSubStr( relativePoint, "BOTTOM" ) ) + relativeY = "bottom"; + if ( isSubStr( relativePoint, "LEFT" ) ) + relativeX = "left"; + if ( isSubStr( relativePoint, "RIGHT" ) ) + relativeX = "right"; + if ( element == level.uiParent ) + { + self.horzAlign = relativeX; + self.vertAlign = relativeY; + } + else + { + self.horzAlign = element.horzAlign; + self.vertAlign = element.vertAlign; + } + if ( relativeX == element.alignX ) + { + offsetX = 0; + xFactor = 0; + } + else if ( relativeX == "center" || element.alignX == "center" ) + { + offsetX = int(element.width / 2); + if ( relativeX == "left" || element.alignX == "right" ) + xFactor = -1; + else + xFactor = 1; + } + else + { + offsetX = element.width; + if ( relativeX == "left" ) + xFactor = -1; + else + xFactor = 1; + } + self.x = element.x + (offsetX * xFactor); + if ( relativeY == element.alignY ) + { + offsetY = 0; + yFactor = 0; + } + else if ( relativeY == "middle" || element.alignY == "middle" ) + { + offsetY = int(element.height / 2); + if ( relativeY == "top" || element.alignY == "bottom" ) + yFactor = -1; + else + yFactor = 1; + } + else + { + offsetY = element.height; + if ( relativeY == "top" ) + yFactor = -1; + else + yFactor = 1; + } + self.y = element.y + (offsetY * yFactor); + self.x += self.xOffset; + self.y += self.yOffset; + switch ( self.elemType ) + { + case "bar": + setPointBar( point, relativePoint, xOffset, yOffset ); + break; + } + self updateChildren(); +} +setPointBar( point, relativePoint, xOffset, yOffset ) +{ + self.bar.horzAlign = self.horzAlign; + self.bar.vertAlign = self.vertAlign; + self.bar.alignX = "left"; + self.bar.alignY = self.alignY; + self.bar.y = self.y; + if ( self.alignX == "left" ) + self.bar.x = self.x; + else if ( self.alignX == "right" ) + self.bar.x = self.x - self.width; + else + self.bar.x = self.x - int(self.width / 2); + if ( self.alignY == "top" ) + self.bar.y = self.y; + else if ( self.alignY == "bottom" ) + self.bar.y = self.y; + self updateBar( self.bar.frac ); +} +updateBar( barFrac, rateOfChange ) +{ + if ( self.elemType == "bar" ) + updateBarScale( barFrac, rateOfChange ); +} +updateBarScale( barFrac, rateOfChange ) +{ + barWidth = int(self.width * barFrac + 0.5); + if ( !barWidth ) + barWidth = 1; + self.bar.frac = barFrac; + self.bar setShader( self.bar.shader, barWidth, self.height ); + assertEx( barWidth <= self.width, "barWidth <= self.width: " + barWidth + " <= " + self.width + " - barFrac was " + barFrac ); + if ( isDefined( rateOfChange ) && barWidth < self.width ) + { + if ( rateOfChange > 0 ) + { + assertex( ((1 - barFrac) / rateOfChange) > 0, "barFrac: " + barFrac + "rateOfChange: " + rateOfChange ); + self.bar scaleOverTime( (1 - barFrac) / rateOfChange, self.width, self.height ); + } + else if ( rateOfChange < 0 ) + { + assertex( (barFrac / (-1 * rateOfChange)) > 0, "barFrac: " + barFrac + "rateOfChange: " + rateOfChange ); + self.bar scaleOverTime( barFrac / (-1 * rateOfChange), 1, self.height ); + } + } + self.bar.rateOfChange = rateOfChange; + self.bar.lastUpdateTime = getTime(); +} +createFontString( font, fontScale, player ) +{ + if(isdefined(player)) + { + fontElem = newClientHudElem(player); + } + else + { + fontElem = newHudElem( self ); + } + fontElem.elemType = "font"; + fontElem.font = font; + fontElem.fontscale = fontScale; + fontElem.x = 0; + fontElem.y = 0; + fontElem.sort = 100; + fontElem.width = 0; + fontElem.height = int(level.fontHeight * fontScale); + fontElem.xOffset = 0; + fontElem.yOffset = 0; + fontElem.children = []; + fontElem setParent( level.uiParent ); + fontElem.hidden = false; + return fontElem; +} +createServerFontString( font, fontScale ) +{ + fontElem = newHudElem( self ); + fontElem.elemType = "font"; + fontElem.font = font; + fontElem.fontscale = fontScale; + fontElem.x = 0; + fontElem.y = 0; + fontElem.width = 0; + fontElem.height = int(level.fontHeight * fontScale); + fontElem.xOffset = 0; + fontElem.yOffset = 0; + fontElem.children = []; + fontElem setParent( level.uiParent ); + return fontElem; +} +createServerTimer( font, fontScale ) +{ + timerElem = newHudElem(); + timerElem.elemType = "timer"; + timerElem.font = font; + timerElem.fontscale = fontScale; + timerElem.x = 0; + timerElem.y = 0; + timerElem.width = 0; + timerElem.height = int(level.fontHeight * fontScale); + timerElem.xOffset = 0; + timerElem.yOffset = 0; + timerElem.children = []; + timerElem setParent( level.uiParent ); + return timerElem; +} +createIcon( shader, width, height, player ) +{ + if(isdefined(player)) + { + iconElem = newClientHudElem( player ); + } + else + { + iconElem = newHudElem( self ); + } + iconElem.elemType = "icon"; + iconElem.x = 0; + iconElem.y = 0; + iconElem.width = width; + iconElem.height = height; + iconElem.xOffset = 0; + iconElem.yOffset = 0; + iconElem.children = []; + iconElem setParent( level.uiParent ); + if ( isDefined( shader ) ) + iconElem setShader( shader, width, height ); + return iconElem; +} +createBar( color, width, height, flashFrac ) +{ + barElem = newClientHudElem( self ); + barElem.x = 0 ; + barElem.y = 0; + barElem.frac = 0; + barElem.color = color; + barElem.sort = -2; + barElem.shader = "white"; + barElem setShader( "white", width, height ); + barElem.hidden = false; + if ( isDefined( flashFrac ) ) + { + barElem.flashFrac = flashFrac; + } + barElemFrame = newClientHudElem( self ); + barElemFrame.elemType = "icon"; + barElemFrame.x = 0; + barElemFrame.y = 0; + barElemFrame.width = width; + barElemFrame.height = height; + barElemFrame.xOffset = 0; + barElemFrame.yOffset = 0; + barElemFrame.bar = barElem; + barElemFrame.barFrame = barElemFrame; + barElemFrame.children = []; + barElemFrame.sort = -1; + barElemFrame.color = (1,1,1); + barElemFrame setParent( level.uiParent ); + barElemFrame.hidden = false; + barElemBG = newClientHudElem( self ); + barElemBG.elemType = "bar"; + if ( !level.splitScreen ) + { + barElemBG.x = -2; + barElemBG.y = -2; + } + barElemBG.width = width; + barElemBG.height = height; + barElemBG.xOffset = 0; + barElemBG.yOffset = 0; + barElemBG.bar = barElem; + barElemBG.barFrame = barElemFrame; + barElemBG.children = []; + barElemBG.sort = -3; + barElemBG.color = (0,0,0); + barElemBG.alpha = 0.5; + barElemBG setParent( level.uiParent ); + if ( !level.splitScreen ) + barElemBG setShader( "black", width + 4, height + 4 ); + else + barElemBG setShader( "black", width + 0, height + 0 ); + barElemBG.hidden = false; + return barElemBG; +} +createPrimaryProgressBar() +{ + bar = createBar( (1, 1, 1), level.primaryProgressBarWidth, level.primaryProgressBarHeight ); + if ( level.splitScreen ) + bar setPoint("TOP", undefined, level.primaryProgressBarX, level.primaryProgressBarY); + else + bar setPoint("CENTER", undefined, level.primaryProgressBarX, level.primaryProgressBarY); + return bar; +} +createPrimaryProgressBarText() +{ + text = createFontString( "objective", level.primaryProgressBarFontSize, self ); + if ( level.splitScreen ) + text setPoint("TOP", undefined, level.primaryProgressBarTextX, level.primaryProgressBarTextY); + else + text setPoint("CENTER", undefined, level.primaryProgressBarTextX, level.primaryProgressBarTextY); + text.sort = -1; + return text; +} +hideElem() +{ + if ( self.hidden ) + return; + self.hidden = true; + if ( self.alpha != 0 ) + self.alpha = 0; + if ( self.elemType == "bar" || self.elemType == "bar_shader" ) + { + self.bar.hidden = true; + if ( self.bar.alpha != 0 ) + self.bar.alpha = 0; + self.barFrame.hidden = true; + if ( self.barFrame.alpha != 0 ) + self.barFrame.alpha = 0; + } +} +showElem() +{ + if ( !self.hidden ) + return; + self.hidden = false; + if ( self.elemType == "bar" || self.elemType == "bar_shader" ) + { + if ( self.alpha != .5 ) + self.alpha = .5; + self.bar.hidden = false; + if ( self.bar.alpha != 1 ) + self.bar.alpha = 1; + self.barFrame.hidden = false; + if ( self.barFrame.alpha != 1 ) + self.barFrame.alpha = 1; + } + else + { + if ( self.alpha != 1 ) + self.alpha = 1; + } +} +flashThread() +{ + self endon ( "death" ); + self.alpha = 1; + while(1) + { + if ( self.frac >= self.flashFrac ) + { + self fadeOverTime(0.3); + self.alpha = .2; + wait(0.35); + self fadeOverTime(0.3); + self.alpha = 1; + wait(0.7); + } + else + { + self.alpha = 1; + wait ( 0.05 ); + } + } +} +destroyElem() +{ + tempChildren = []; + for ( index = 0; index < self.children.size; index++ ) + tempChildren[index] = self.children[index]; + for ( index = 0; index < tempChildren.size; index++ ) + tempChildren[index] setParent( self getParent() ); + if ( self.elemType == "bar" ) + { + self.bar destroy(); + self.barFrame destroy(); + } + self destroy(); +} +setIconShader( shader ) +{ + self setShader( shader, self.width, self.height ); +} +updateChildren() +{ + for ( index = 0; index < self.children.size; index++ ) + { + child = self.children[index]; + child setPoint( child.point, child.relativePoint, child.xOffset, child.yOffset ); + } +} +get_countdown_hud( x ) +{ + xPos = undefined; + if ( !isdefined( x ) ) + xPos = -225; + else + xPos = x; + hudelem = newHudElem(); + hudelem.alignX = "left"; + hudelem.alignY = "middle"; + hudelem.horzAlign = "right"; + hudelem.vertAlign = "top"; + hudelem.x = xPos; + hudelem.y = 100; + if ( arcadeMode() ) + { + hudelem.alignX = "left"; + hudelem.alignY = "top"; + hudelem.horzAlign = "right"; + hudelem.vertAlign = "top"; + hudelem.y = 0; + } + hudelem.fontScale = 1.6; + hudelem.color = (0.8, 1.0, 0.8); + hudelem.font = "objective"; + hudelem.glowColor = (0.3, 0.6, 0.3); + hudelem.glowAlpha = 1; + hudelem.foreground = 1; + hudelem.hidewheninmenu = true; + return hudelem; +} + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_hud_weapons.gsc b/BO1/PC/ZM/maps/_hud_weapons.gsc new file mode 100644 index 0000000..04e4e8f --- /dev/null +++ b/BO1/PC/ZM/maps/_hud_weapons.gsc @@ -0,0 +1,269 @@ +#include maps\_hud_util; +registerWeaponInfo( name, string, type, clip ) +{ + level.weaponInfo[name]["type"] = type; + level.weaponInfo[name]["clip"] = clip; + level.weaponInfo[name]["string"] = string; + precacheString( string ); +} +isWeaponRegistered( name ) +{ + if ( !isDefined( level.weaponInfo[name] ) ) + return false; + return true; +} +getWeaponInfoType( name ) +{ + return level.weaponInfo[name]["type"]; +} +getWeaponInfoClip( name ) +{ + return level.weaponInfo[name]["clip"]; +} +getWeaponInfoString( name ) +{ + return level.weaponInfo[name]["string"]; +} +init() +{ + precacheShader( "hud_bullets_rifle" ); + precacheShader( "hud_bullets_pistol" ); + precacheShader( "hud_bullets_sniper" ); + precacheShader( "hud_bullets_spread" ); + precacheShader( "hud_bullets_support_front" ); + precacheShader( "hud_bullets_support_back" ); + level.bulletAlphas = []; + level.bulletAlphas[level.bulletAlphas.size] = 1.000; + level.bulletAlphas[level.bulletAlphas.size] = 0.996; + level.bulletAlphas[level.bulletAlphas.size] = 0.949; + level.bulletAlphas[level.bulletAlphas.size] = 0.909; + level.bulletAlphas[level.bulletAlphas.size] = 0.870; + level.bulletAlphas[level.bulletAlphas.size] = 0.835; + level.bulletAlphas[level.bulletAlphas.size] = 0.803; + level.bulletAlphas[level.bulletAlphas.size] = 0.776; + level.bulletAlphas[level.bulletAlphas.size] = 0.749; + level.bulletAlphas[level.bulletAlphas.size] = 0.721; + level.bulletAlphas[level.bulletAlphas.size] = 0.698; + level.bulletAlphas[level.bulletAlphas.size] = 0.674; + level.bulletAlphas[level.bulletAlphas.size] = 0.654; + level.bulletAlphas[level.bulletAlphas.size] = 0.635; + level.bulletAlphas[level.bulletAlphas.size] = 0.615; + level.bulletAlphas[level.bulletAlphas.size] = 0.596; + level.bulletAlphas[level.bulletAlphas.size] = 0.580; + level.bulletAlphas[level.bulletAlphas.size] = 0.564; + level.bulletAlphas[level.bulletAlphas.size] = 0.549; + level.bulletAlphas[level.bulletAlphas.size] = 0.537; + level.bulletAlphas[level.bulletAlphas.size] = 0.521; + level.bulletAlphas[level.bulletAlphas.size] = 0.509; + level.bulletAlphas[level.bulletAlphas.size] = 0.498; + level.weaponInfo = []; + registerWeaponInfo( "ak47", &"WEAPON_AK47_FULLAUTO", "rifle", 30 ); + registerWeaponInfo( "ak47_semi", &"WEAPON_AK47_SEMIAUTO", "rifle", 30 ); + registerWeaponInfo( "ak47_grenadier", &"WEAPON_AK47", "rifle", 30 ); + registerWeaponInfo( "ak74u", &"WEAPON_AK74U_FULLAUTO", "rifle", 30 ); + registerWeaponInfo( "ak74u_semi", &"WEAPON_AK74U_SEMIAUTO", "rifle", 30 ); + registerWeaponInfo( "beretta", &"WEAPON_BERETTA", "pistol", 15 ); + registerWeaponInfo( "g36c", &"WEAPON_G36C", "rifle", 30 ); + registerWeaponInfo( "m14_scoped", &"WEAPON_M14", "sniper", 10 ); + registerWeaponInfo( "m16_basic", &"WEAPON_M16A4_FULLAUTO", "rifle", 30 ); + registerWeaponInfo( "m16_basic_semi", &"WEAPON_M16A4_SEMIAUTO", "rifle", 30 ); + registerWeaponInfo( "m16_grenadier", &"WEAPON_M16", "rifle", 30 ); + registerWeaponInfo( "m203", &"WEAPON_M203", "grenade", 1 ); + registerWeaponInfo( "rpg", &"WEAPON_RPG", "grenade", 5 ); + registerWeaponInfo( "saw", &"WEAPON_SAW", "support", 100 ); + registerWeaponInfo( "m4_grunt", &"WEAPON_M4_FULLAUTO", "rifle", 30 ); + registerWeaponInfo( "m4_grunt_semi", &"WEAPON_M4_SEMIAUTO", "rifle", 30 ); + registerWeaponInfo( "m4_grenadier", &"WEAPON_M4", "rifle", 30 ); + registerWeaponInfo( "m40a3", &"WEAPON_M40A3", "sniper", 10 ); + registerWeaponInfo( "mp5", &"WEAPON_MP5", "smg", 30 ); + registerWeaponInfo( "mp5_silencer", &"WEAPON_MP5SD", "smg", 30 ); + registerWeaponInfo( "usp", &"WEAPON_USP", "pistol", 10 ); + registerWeaponInfo( "at4", &"WEAPON_AT4", "rocketlauncher", 1 ); + registerWeaponInfo( "dragunov", &"WEAPON_DRAGUNOV", "sniper", 10 ); + registerWeaponInfo( "g3", &"WEAPON_G3", "rifle", 30 ); + registerWeaponInfo( "winchester1200", &"WEAPON_WINCHESTER1200", "shotgun", 4 ); + registerWeaponInfo( "uzi", &"WEAPON_UZI", "smg", 32 ); + self initWeaponHUD(); +} +initWeaponHUD() +{ + if ( !isDefined( self.hud_bullets ) ) + self.hud_bullets = []; + if ( !isDefined( self.hud_bullets[0] ) ) + { + self.hud_bullets[0] = createIcon( undefined, 24, 96 ); + self.hud_bullets[0] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6, -47 ); + self.hud_bullets[0].sort = 10; + } + if ( !isDefined( self.hud_bullets[1] ) ) + { + self.hud_bullets[1] = createIcon( undefined, 24, 96 ); + self.hud_bullets[1] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6, -47 ); + self.hud_bullets[1].color = (0.7,0.7,0.7); + self.hud_bullets[1].sort = 9; + } + if ( !isDefined( self.hud_bullets[2] ) ) + { + self.hud_bullets[2] = createIcon( undefined, 24, 96 ); + self.hud_bullets[2] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6, -47 ); + self.hud_bullets[2].sort = 10; + } + if ( !isDefined( self.hud_bullets[3] ) ) + { + self.hud_bullets[3] = createIcon( undefined, 24, 96 ); + self.hud_bullets[3] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6, -47 ); + self.hud_bullets[3].color = (0.7,0.7,0.7); + self.hud_bullets[3].sort = 9; + } + if ( !isDefined( self.hud_bullets[4] ) ) + { + self.hud_bullets[4] = createIcon( undefined, 24, 96 ); + self.hud_bullets[4] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6, -47 ); + self.hud_bullets[4].sort = 10; + } + self thread updateBulletHudThink(); +} +updateBulletHudThink() +{ + self endon ( "death" ); + lastAmmoCount = -1; + lastWeapon = ""; + lastWeaponType = ""; + while ( true ) + { + weapon = self getCurrentWeapon(); + if ( isWeaponRegistered( weapon ) ) + { + weaponType = self getWeaponInfoType( weapon ); + ammoCount = self GetWeaponAmmoClip( self GetCurrentWeapon() ); + if ( (weapon != lastWeapon) && (weaponType != lastWeaponType ) ) + { + self setHudWeaponType( weaponType ); + lastWeapon = weapon; + lastWeaponType = weaponType; + lastAmmoCount = -1; + } + if ( ammoCount != lastAmmoCount ) + { + self updateHudWeaponAmmo( weapon, ammoCount ); + lastAmmoCount = ammoCount; + } + } + wait ( 0.05 ); + } +} +setHudWeaponType( type ) +{ + self.pers["weaponType"] = type; + if ( !isDefined( self.hud_bullets ) ) + return; + for ( index = 0; index < self.hud_bullets.size; index++ ) + self.hud_bullets[index].alpha = 0; + switch( type ) + { + case "pistol": + self.hud_bullets[0] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6, -47 ); + self.hud_bullets[0] setIconShader( "hud_bullets_pistol" ); + self.hud_bullets[0].alpha = 1; + break; + case "smg": + self.hud_bullets[0] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6, -47 ); + self.hud_bullets[0] setIconShader( "hud_bullets_rifle" ); + self.hud_bullets[1] setIconShader( "hud_bullets_rifle" ); + self.hud_bullets[1] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -4, -50 ); + self.hud_bullets[0].alpha = 1; + self.hud_bullets[1].alpha = 1; + break; + case "rifle": + self.hud_bullets[0] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6, -47 ); + self.hud_bullets[0] setIconShader( "hud_bullets_rifle" ); + self.hud_bullets[1] setIconShader( "hud_bullets_rifle" ); + self.hud_bullets[1] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -4, -50 ); + self.hud_bullets[0].alpha = 1; + self.hud_bullets[1].alpha = 1; + break; + case "sniper": + self.hud_bullets[0] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6, -47 ); + self.hud_bullets[0] setIconShader( "hud_bullets_sniper" ); + self.hud_bullets[0].alpha = 1; + break; + case "spread": + self.hud_bullets[0] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6, -47 ); + self.hud_bullets[0] setIconShader( "hud_bullets_spread" ); + self.hud_bullets[0].alpha = 1; + break; + case "support": + xOffset = 0; + for ( index = 0; index < 5; index++ ) + { + self.hud_bullets[index] setPoint( "BOTTOMRIGHT", "BOTTOMRIGHT", -6 + xOffset, -70 ); + self.hud_bullets[index].alpha = 1; + if ( index % 2 ) + self.hud_bullets[index] setIconShader( "hud_bullets_support_back" ); + else + self.hud_bullets[index] setIconShader( "hud_bullets_support_front" ); + xOffset -= 14; + } + break; + } +} +getHudWeaponType() +{ + return ( self.pers["weaponType"] ); +} +updateHudWeaponAmmo( weapon, ammoCount ) +{ + if ( !isDefined( self.hud_bullets ) ) + return; + switch( self getHudWeaponType() ) + { + case "pistol": + baseDiff = 15 - getWeaponInfoClip( weapon ); + diff = getWeaponInfoClip( weapon ) - ammoCount; + self.hud_bullets[0].alpha = level.bulletAlphas[baseDiff + diff]; + break; + case "rifle": + diff = getWeaponInfoClip( weapon ) - ammoCount; + col1Diff = int( diff / 2 ); + col1Diff += (diff %2); + col2Diff = int( diff / 2 ); + self.hud_bullets[0].alpha = level.bulletAlphas[col1Diff]; + self.hud_bullets[1].alpha = level.bulletAlphas[col2Diff]; + break; + case "smg": + diff = getWeaponInfoClip( weapon ) - ammoCount; + col1Diff = int( diff / 2 ); + col1Diff += (diff %2); + col2Diff = int( diff / 2 ); + self.hud_bullets[0].alpha = level.bulletAlphas[col1Diff]; + self.hud_bullets[1].alpha = level.bulletAlphas[col2Diff]; + break; + case "sniper": + baseDiff = 15 - getWeaponInfoClip( weapon ); + diff = getWeaponInfoClip( weapon ) - ammoCount; + self.hud_bullets[0].alpha = level.bulletAlphas[baseDiff + diff]; + break; + case "spread": + baseDiff = 15 - getWeaponInfoClip( weapon ); + diff = getWeaponInfoClip( weapon ) - ammoCount; + self.hud_bullets[0].alpha = level.bulletAlphas[baseDiff + diff]; + break; + case "support": + baseDiff = 100 - getWeaponInfoClip( weapon ); + diff = getWeaponInfoClip( weapon ) - ammoCount; + diff = baseDiff + diff; + bulletOffset = 20; + for ( index = 4; index >= 0; index-- ) + { + if ( diff > bulletOffset ) + self.hud_bullets[index].alpha = 0; + else if ( (bulletOffset - diff) <= 20 ) + self.hud_bullets[index].alpha = level.bulletAlphas[diff - (bulletOffset - 20)]; + else + self.hud_bullets[index].alpha = 1; + bulletOffset += 20; + } + break; + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_huey.gsc b/BO1/PC/ZM/maps/_huey.gsc new file mode 100644 index 0000000..f622f4a Binary files /dev/null and b/BO1/PC/ZM/maps/_huey.gsc differ diff --git a/BO1/PC/ZM/maps/_ingamemenus.gsc b/BO1/PC/ZM/maps/_ingamemenus.gsc new file mode 100644 index 0000000..7478ba4 Binary files /dev/null and b/BO1/PC/ZM/maps/_ingamemenus.gsc differ diff --git a/BO1/PC/ZM/maps/_interactive_objects.gsc b/BO1/PC/ZM/maps/_interactive_objects.gsc new file mode 100644 index 0000000..7e087ad --- /dev/null +++ b/BO1/PC/ZM/maps/_interactive_objects.gsc @@ -0,0 +1,2452 @@ +#include maps\_utility; +#include common_scripts\utility; +main() +{ + flag_init( "no_ai_tv_damage" ); + qBarrels = false; + barrels = getentarray ("explodable_barrel","targetname"); + if ( (isdefined(barrels)) && (barrels.size > 0) ) + { + qBarrels = true; + } + barrels = getentarray ("explodable_barrel","script_noteworthy"); + if ( (isdefined(barrels)) && (barrels.size > 0) ) + { + qBarrels = true; + } + if (qBarrels) + { + PrecacheRumble( "barrel_explosion" ); + level.breakables_fx["barrel"]["explode"] = loadfx ("destructibles/fx_barrelExp"); + level.breakables_fx["barrel"]["burn_start"] = loadfx ("destructibles/fx_barrel_ignite"); + level.breakables_fx["barrel"]["burn"] = loadfx ("destructibles/fx_barrel_fire_top"); + } + qCrates = false; + crates = getentarray ("flammable_crate","targetname"); + if ( (isdefined(crates)) && (crates.size > 0) ) + { + qCrates = true; + } + crates = getentarray ("flammable_crate","script_noteworthy"); + if ( (isdefined(crates)) && (crates.size > 0) ) + { + qCrates = true; + } + if (qCrates) + { + level.breakables_fx["ammo_crate"]["explode"] = loadfx ("destructibles/fx_ammoboxExp"); + } + qBagofbarrels = false; + bagofbarrels = getentarray ("explodable_bagofbarrels","targetname"); + if ( (isdefined(bagofbarrels)) && (bagofbarrels.size > 0) ) + { + qBagofbarrels = true; + } + bagofbarrels = getentarray ("explodable_bagofbarrels","script_noteworthy"); + if ( (isdefined(bagofbarrels)) && (bagofbarrels.size > 0) ) + { + qBagofbarrels = true; + } + if (qBagofbarrels) + { + level.breakables_fx["bagofbarrels"]["explode"] = loadfx ("destructibles/fx_exp_bagobarrels"); + level.breakables_fx["bagofbarrels"]["burn_start"] = loadfx ("destructibles/fx_barrel_ignite"); + level.breakables_fx["bagofbarrels"]["burn"] = loadfx ("destructibles/fx_barrel_fire_top"); + } + qBagofcrates = false; + bagofcrates = getentarray ("explodable_bagofcrates","targetname"); + if ( (isdefined(bagofcrates)) && (bagofcrates.size > 0) ) + { + qBagofcrates = true; + } + bagofcrates = getentarray ("explodable_bagofcrates","script_noteworthy"); + if ( (isdefined(bagofcrates)) && (bagofcrates.size > 0) ) + { + qBagofcrates = true; + } + if (qBagofcrates) + { + level.breakables_fx["bagofcrates"]["explode"] = loadfx ("destructibles/fx_exp_bagocrates"); + level.breakables_fx["bagofcrates"]["burn_start"] = loadfx ("destructibles/fx_barrel_ignite"); + level.breakables_fx["bagofcrates"]["burn"] = loadfx ("destructibles/fx_barrel_fire_top"); + } + qOiltank = false; + oiltanks = getentarray ("explodable_oiltank","targetname"); + if ( (isdefined(oiltanks)) && (oiltanks.size > 0) ) + { + qOiltank = true; + } + oiltanks = getentarray ("explodable_oiltank","script_noteworthy"); + if ( (isdefined(oiltanks)) && (oiltanks.size > 0) ) + { + qOiltank = true; + } + if (qOiltank) + { + level.breakables_fx["oiltank"]["explode"] = loadfx ("destructibles/fx_exp_oil_tank_lg"); + level.breakables_fx["oiltank"]["burn_start"] = loadfx ("destructibles/fx_barrel_ignite"); + level.breakables_fx["oiltank"]["burn"] = loadfx ("destructibles/fx_barrel_fire_top"); + } + qOiltanksmall = false; + oiltank_small = getentarray ("explodable_oiltank_small","targetname"); + if ( (isdefined(oiltank_small)) && (oiltank_small.size > 0) ) + { + qOiltanksmall = true; + } + oiltank_small = getentarray ("explodable_oiltank_small","script_noteworthy"); + if ( (isdefined(oiltank_small)) && (oiltank_small.size > 0) ) + { + qOiltanksmall = true; + } + if (qOiltank) + { + level.breakables_fx["oiltanksmall"]["explode"] = loadfx ("destructibles/fx_exp_oil_tank_sm"); + level.breakables_fx["oiltanksmall"]["burn_start"] = loadfx ("destructibles/fx_barrel_ignite"); + level.breakables_fx["oiltanksmall"]["burn"] = loadfx ("destructibles/fx_barrel_fire_top"); + } + qLiferaft = false; + liferafts = getentarray ("explodable_liferaft","targetname"); + if ( (isdefined(liferafts)) && (liferafts.size > 0) ) + { + qLiferaft = true; + } + liferafts = getentarray ("explodable_liferaft","script_noteworthy"); + if ( (isdefined(liferafts)) && (liferafts.size > 0) ) + { + qLiferaft = true; + } + if (qLiferaft) + { + level.breakables_fx["liferaft"]["explode"] = loadfx ("destrictibles/fx_dest_life_raft"); + level.breakables_fx["liferaft"]["burn_start"] = loadfx ("destructibles/fx_barrel_ignite"); + level.breakables_fx["liferaft"]["burn"] = loadfx ("destructibles/fx_barrel_fire_top"); + } + qTarpcrate = false; + tarpcrates = getentarray ("explodable_tarpcrate","targetname"); + if ( (isdefined(tarpcrates)) && (tarpcrates.size > 0) ) + { + qTarpcrate = true; + } + tarpcrates = getentarray ("explodable_tarpcrate","script_noteworthy"); + if ( (isdefined(tarpcrates)) && (tarpcrates.size > 0) ) + { + qTarpcrate = true; + } + if (qTarpcrate) + { + level.breakables_fx["tarpcrate"]["explode"] = loadfx ("destructibles/fx_dest_life_raft"); + level.breakables_fx["tarpcrate"]["burn_start"] = loadfx ("destructibles/fx_barrel_ignite"); + level.breakables_fx["tarpcrate"]["burn"] = loadfx ("destructibles/fx_barrel_fire_top"); + } + oilspill = getentarray ("oil_spill","targetname"); + if(isdefined(oilspill) && oilspill.size > 0) + { + level.breakables_fx["oilspill"]["burn"] = loadfx ("destructibles/fx_barrel_fire"); + level.breakables_fx["oilspill"]["spark"] = loadfx("impacts/fx_small_metalhit"); + } + tincans = getentarray ("tincan","targetname"); + if ( (isdefined(tincans)) && (tincans.size > 0) ) + { + level.breakables_fx["tincan"] = loadfx ("destructibles/fx_tincan_bounce"); + } + qBreakables = false; + breakables = getentarray ("breakable","targetname"); + if ( (isdefined(breakables)) && (breakables.size > 0) ) + { + qBreakables = true; + } + breakables = getentarray ("breakable_vase","targetname"); + if ( (isdefined(breakables)) && (breakables.size > 0) ) + { + qBreakables = true; + } + breakables = getentarray ("breakable box","targetname"); + if ( (isdefined(barrels)) && (barrels.size > 0) ) + { + qBreakables = true; + } + breakables = getentarray ("breakable box","script_noteworthy"); + if ( (isdefined(barrels)) && (barrels.size > 0) ) + { + qBreakables = true; + } + if (qBreakables) + { + level.breakables_fx["vase"] = loadfx ("destructibles/fx_vase_water"); + level.breakables_fx["bottle"] = loadfx ("destructibles/fx_wine_bottle"); + level.breakables_fx["box"][0] = loadfx ("destructibles/fx_exp_crate_dust"); + level.breakables_fx["box"][1] = loadfx ("destructibles/fx_exp_crate_dust"); + level.breakables_fx["box"][2] = loadfx ("destructibles/fx_exp_crate_dust"); + level.breakables_fx["box"][3] = loadfx ("destructibles/fx_exp_crate_ammo"); + } + glassarray = getentarray("glass","targetname"); + glassarray = array_combine( glassarray, getentarray( "glass", "script_noteworthy" ) ); + if ( isdefined( glassarray ) && glassarray.size > 0 ) + { + level._glass_info = []; + level._glass_info["glass_large"]["breakfx"] = loadfx( "destructibles/fx_break_glass_car_large" ); + level._glass_info["glass_large"]["breaksnd"] = "veh_glass_break_large"; + level._glass_info["glass_med"]["breakfx"] = loadfx( "destructibles/fx_break_glass_car_med" ); + level._glass_info["glass_med"]["breaksnd"] = "veh_glass_break_small"; + level._glass_info[ "glass_small" ][ "breakfx" ] = loadfx( "destructibles/fx_break_glass_car_headlight" ); + level._glass_info[ "glass_small" ][ "breaksnd" ] = "veh_glass_break_small"; + } + tv_array = getentarray( "interactive_tv", "targetname" ); + if ( isdefined( tv_array ) && ( tv_array.size > 0 ) ) + { + precachemodel( "com_tv2_d" ); + precachemodel( "com_tv1" ); + precachemodel( "com_tv2" ); + precachemodel( "com_tv1_testpattern" ); + precachemodel( "com_tv2_testpattern" ); + level.breakables_fx[ "tv_explode" ] = loadfx( "explosions/tv_explosion" ); + level.tv_lite_array = getentarray( "interactive_tv_light", "targetname" ); + } + security_camera_array = getentarray( "destroyable_security_camera", "script_noteworthy" ); + if ( isdefined( security_camera_array ) && ( security_camera_array.size > 0 ) ) + { + precachemodel( "com_security_camera" ); + precachemodel( "com_security_camera_destroyed" ); + level.breakables_fx[ "security_camera_explode" ] = loadfx( "props/securitycamera_explosion" ); + } + level.barrelExpSound = "exp_redbarrel"; + level.crateExpSound = "exp_ammocrate"; + level.barrelIngSound = "exp_redbarrel_ignition"; + level.crateIgnSound = "exp_ammocrate_ignition"; + level.oiltankExpSound = "exp_redbarrel"; + level.oiltanksmallExpSound = "exp_redbarrel"; + level.bagofbarrelsExpSound = "exp_redbarrel"; + level.bagofcratesExpSound = "exp_redbarrel"; + level.liferaftExpSound = "exp_redbarrel"; + level.tarpcrateExpSound = "exp_redbarrel"; + maxBrokenPieces = 25; + level.breakables_peicesCollide["orange vase"] = true; + level.breakables_peicesCollide["green vase"] = true; + level.breakables_peicesCollide["bottle"] = true; + level.barrelHealth = 350; + level.tankHealth = 900; + level.precachemodeltype = []; + level.barrelExplodingThisFrame = false; + level.breakables_clip = []; + level.breakables_clip = getentarray ("vase_break_remove","targetname"); + level.console_auto_aim = []; + level.console_auto_aim = getentarray( "xenon_auto_aim", "targetname" ); + level.console_auto_aim_2nd = getentarray( "xenon_auto_aim_secondary", "targetname" ); + for ( i = 0;i < level.console_auto_aim.size;i++ ) + { + level.console_auto_aim[ i ] notsolid(); + } + for ( i = 0;i < level.console_auto_aim_2nd.size;i++ ) + { + level.console_auto_aim_2nd[ i ] notsolid(); + } + maps\_utility::set_console_status(); + if ( level.console ) + { + level.console_auto_aim = undefined; + level.console_auto_aim_2nd = undefined; + } + temp = getentarray ("breakable clip","targetname"); + for (i=0;i 0 ) + { + self waittill( "damage", damage, attacker, direction_vec, point, damageType ); + if ( !isdefined( direction_vec ) ) + { + direction_vec = ( 0, 0, 1 ); + } + if ( !isdefined( damageType ) ) + { + damage = 100000; + } + else if ( damageType == "MOD_GRENADE_SPLASH" ) + { + damage = damage * 1.75; + } + else if ( damageType == "MOD_IMPACT" ) + { + damage = 100000; + } + glasshealth -= damage; + } + prevdamage = glasshealth * - 1; + self hide(); + self notsolid(); + if ( isdefined( cracked ) ) + { + cracked show(); + cracked setcandamage(true); + glasshealth = ( 200 ) - prevdamage; + cracked setContents( crackedContents ); + while ( glasshealth > 0 ) + { + cracked waittill( "damage", damage, other, direction_vec, point, damageType ); + if ( !isdefined( direction_vec ) ) + { + direction_vec = ( 0, 0, 1 ); + } + if ( !isdefined( damageType ) ) + { + damage = 100000; + } + else if ( damageType == "MOD_GRENADE_SPLASH" ) + { + damage = damage * 1.75; + } + else if ( damageType == "MOD_IMPACT" ) + { + break; + } + glasshealth -= damage; + } + cracked delete(); + } + glass_play_break_fx( self getorigin(), self.destructible_type, direction_vec ); + self delete(); +} +glass_play_break_fx( origin, info, direction_vec ) +{ + thread play_sound_in_space(level._glass_info[ info ][ "breaksnd" ], origin); + playfx(level._glass_info[ info ][ "breakfx" ], origin, direction_vec); + level notify( "glass_shatter" ); +} +oil_spill_think() +{ + self.end = getstruct(self.target, "targetname"); + self.start = getstruct(self.end.target, "targetname"); + self.barrel = getClosestEnt(self.start.origin, getentarray ("explodable_barrel","targetname")); + if(isdefined(self.barrel)) + { + self.barrel.oilspill = true; + self thread oil_spill_burn_after(); + } + self.extra = getent(self.target, "targetname"); + self setcandamage(true); + while(1) + { + self waittill("damage", amount, attacker, direction_vec, P, type ); + if(type == "MOD_MELEE" || type == "MOD_IMPACT") + { + continue; + } + if( IsDefined( self.script_requires_player ) && self.script_requires_player && !IsPlayer( attacker ) ) + { + continue; + } + if( IsDefined( self.script_selfisattacker ) && self.script_selfisattacker ) + { + self.damageOwner = self; + } + else + { + self.damageOwner = attacker; + } + playfx (level.breakables_fx["oilspill"]["spark"], P, direction_vec); + P = pointOnSegmentNearestToPoint(self.start.origin, self.end.origin, P); + thread oil_spill_burn_section(P); + self thread oil_spill_burn(P, self.start.origin); + self thread oil_spill_burn(P, self.end.origin); + break; + } + if(isdefined(self.barrel)) + { + self.barrel waittill("exploding"); + } + self.extra delete(); + self hide(); + wait 10; + self delete(); +} +oil_spill_burn_after() +{ + while(1) + { + self.barrel waittill("damage", amount ,attacker, direction_vec, P, type); + if(type == "MOD_MELEE" || type == "MOD_IMPACT") + { + continue; + } + if( IsDefined( self.script_requires_player ) && self.script_requires_player && !IsPlayer( attacker ) ) + { + continue; + } + if( IsDefined( self.barrel.script_selfisattacker ) && self.barrel.script_selfisattacker ) + { + self.damageOwner = self.barrel; + } + else + { + self.damageOwner = attacker; + } + break; + } + self radiusdamage (self.start.origin, 4, 10, 10, self.damageOwner); +} +oil_spill_burn(P, dest) +{ + forward = vectornormalize(dest - P); + dist = distance(p, dest); + range = 8; + interval = vector_scale(forward, range); + angle = vectortoangles(forward); + right = anglestoright(angle); + barrels = getentarray ("explodable_barrel","targetname"); + distsqr = 22 * 22; + test = spawn("script_origin", P); + num = 0; + while(1) + { + dist -= range; + if(dist < range *.1) + { + break; + } + p += (interval + vector_scale(right, randomfloatrange(-6, 6))); + thread oil_spill_burn_section(P); + num++; + if(num == 4) + { + badplace_cylinder("", 5, P, 64, 64); + num = 0; + } + test.origin = P; + remove = []; + barrels = array_removeUndefined(barrels); + for(i=0; i 20) + { + count = 0; + } + if (count == 0) + { + self.damageTaken += (10 + randomfloat(10)); + badplace_cylinder("",1, self.origin, 128, 250); + self playsound("exp_barrel_fuse"); + playfx (level.breakables_fx["barrel"]["burn"], self.origin + offset2); + } + count++; + wait 0.05; + } + self thread explodable_barrel_explode(); +} +explodable_barrel_explode() +{ + self notify ("exploding"); + self notify ("death"); + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset = (0,0,0); + if(dot < .5) + { + start = (self.origin + vector_scale(up, 22)); + end = physicstrace(start, (start + (0,0,-64))); + offset = end - self.origin; + } + offset += (0,0,4); + level thread play_sound_in_space(level.barrelExpSound, self.origin); + playfx (level.breakables_fx["barrel"]["explode"], self.origin + offset, (270, 0, 0)); + physicsexplosionsphere( self.origin + offset, 100, 80, 1 ); + PlayRumbleOnPosition( "barrel_explosion", self.origin + ( 0, 0, 32 ) ); + level.barrelExplodingThisFrame = true; + if (isdefined (self.remove)) + { + self.remove connectpaths(); + self.remove delete(); + } + minDamage = 1; + maxDamage = 250; + if( IsDefined( self.script_damage ) ) + { + maxDamage = self.script_damage; + } + blastRadius = 250; + if( IsDefined( self.radius ) ) + { + blastRadius = self.radius; + } + attacker = undefined; + if(isdefined(self.damageOwner)) + { + attacker = self.damageOwner; + if( isplayer( attacker ) ) + { + arcademode_assignpoints( "arcademode_score_explodableitem", attacker ); + } + } + level.lastExplodingBarrel[ "time" ] = getTime(); + level.lastExplodingBarrel[ "origin" ] = self.origin + ( 0, 0, 30 ); + self radiusDamage(self.origin + (0,0,30), blastRadius, maxDamage, minDamage, attacker); + if (randomint(2) == 0) + { + self setModel("global_explosive_barrel_d"); + } + else + { + self setModel("global_explosive_barrel_d"); + } + if(dot < .5) + { + start = (self.origin + vector_scale(up, 22)); + pos = physicstrace(start, (start + (0,0,-64))); + self.origin = pos; + self.angles += (0,0,90); + } + waittillframeend; + level.barrelExplodingThisFrame = false; +} +explodable_oiltank_think() +{ + if (self.classname != "script_model") + { + return; + } + if(!isdefined(level.precachemodeltype["static_peleliu_oiltanker"])) + { + level.precachemodeltype["static_peleliu_oiltanker"] = true; + precacheModel("static_peleliu_oiltanker_d"); + } + self endon ("exploding"); + self breakable_clip(); + self xenon_auto_aim(); + self.damageTaken = 0; + self setcandamage(true); + for (;;) + { + self waittill("damage", amount ,attacker, direction_vec, P, type); + println("OILTANKDAMAGE: "+type); + if(type == "MOD_MELEE" || type == "MOD_IMPACT") + { + continue; + } + if( IsDefined( self.script_requires_player ) && self.script_requires_player && !IsPlayer( attacker ) ) + { + continue; + } + if( IsDefined( self.script_selfisattacker ) && self.script_selfisattacker ) + { + self.damageOwner = self; + } + else + { + self.damageOwner = attacker; + } + if (level.barrelExplodingThisFrame) + { + wait randomfloat(1); + } + self.damageTaken += amount; + if (self.damageTaken == amount) + { + self thread explodable_oiltank_burn(); + } + } +} +explodable_oiltank_burn() +{ + count = 0; + startedfx = false; + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset1 = (0,0,0); + offset2 = vector_scale(up, 44); + if(dot < .5) + { + offset1 = vector_scale(up, 22) - (0,0,30); + offset2 = vector_scale(up, 22) + (0,0,14); + } + while (self.damageTaken < level.tankHealth) + { + if (!startedfx) + { + playfx (level.breakables_fx["oiltank"]["burn_start"], self.origin + offset1); + level thread play_sound_in_space(level.barrelIngSound, self.origin); + startedfx = true; + } + if (count > 20) + { + count = 0; + } + playfx (level.breakables_fx["oiltank"]["burn"], self.origin + offset2); + if (count == 0) + { + self.damageTaken += (10 + randomfloat(10)); + badplace_cylinder("",1, self.origin, 128, 250); + } + count++; + wait 0.05; + } + self thread explodable_oiltank_explode(); +} +explodable_oiltank_explode() +{ + self notify ("exploding"); + self notify ("death"); + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset = (0,0,0); + if(dot < .5) + { + start = (self.origin + vector_scale(up, 0)); + end = physicstrace(start, (start + (0,0,-64))); + offset = end - self.origin; + } + offset += (0,0,4); + level thread play_sound_in_space(level.oiltankExpSound, self.origin); + if(IsDefined(self.script_vector)) + { + playfx (level.breakables_fx["oiltank"]["explode"], self.origin + offset, (0,0,1)); + } + else + { + playfx (level.breakables_fx["oiltank"]["explode"], self.origin + offset); + } + physicsexplosionsphere( self.origin + offset, 100, 80, 1 ); + level.barrelExplodingThisFrame = true; + if (isdefined (self.remove)) + { + self.remove connectpaths(); + self.remove delete(); + } + minDamage = 2000; + maxDamage = 4000; + blastRadius = 400; + if (isdefined(self.radius)) + { + blastRadius = self.radius; + } + attacker = undefined; + if(isdefined(self.damageOwner)) + { + attacker = self.damageOwner; + if( isplayer( attacker ) ) + { + arcademode_assignpoints( "arcademode_score_explodableitem", attacker ); + } + } + level.lastExplodingBarrel[ "time" ] = getTime(); + level.lastExplodingBarrel[ "origin" ] = self.origin + ( 0, 0, 30 ); + self radiusDamage(self.origin + (0,0,30), blastRadius, maxDamage, minDamage, attacker); + if (randomint(2) == 0) + { + self setModel("static_peleliu_oiltanker_d"); + } + else + { + self setModel("static_peleliu_oiltanker_d"); + } + if(dot < .5) + { + start = (self.origin + vector_scale(up, 22)); + pos = physicstrace(start, (start + (0,0,-64))); + self.origin = pos; + self.angles += (0,0,90); + } + wait 0.05; + level.barrelExplodingThisFrame = false; +} +explodable_oiltank_small_think() +{ + if (self.classname != "script_model") + { + return; + } + if(!isdefined(level.precachemodeltype["static_peleliu_propane"])) + { + level.precachemodeltype["static_peleliu_propane"] = true; + precacheModel("static_peleliu_propane_d"); + } + self endon ("exploding"); + self breakable_clip(); + self xenon_auto_aim(); + self.damageTaken = 0; + self setcandamage(true); + for (;;) + { + self waittill("damage", amount ,attacker, direction_vec, P, type); + println("OILTANKDAMAGE: "+type); + if(type == "MOD_MELEE" || type == "MOD_IMPACT") + { + continue; + } + if( IsDefined( self.script_requires_player ) && self.script_requires_player && !IsPlayer( attacker ) ) + { + continue; + } + if( IsDefined( self.script_selfisattacker ) && self.script_selfisattacker ) + { + self.damageOwner = self; + } + else + { + self.damageOwner = attacker; + } + if (level.barrelExplodingThisFrame) + { + wait randomfloat(1); + } + self.damageTaken += amount; + if (self.damageTaken == amount) + { + self thread explodable_oiltank_small_burn(); + } + } +} +explodable_oiltank_small_burn() +{ + count = 0; + startedfx = false; + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset1 = (0,0,0); + offset2 = vector_scale(up, 44); + if(dot < .5) + { + offset1 = vector_scale(up, 22) - (0,0,30); + offset2 = vector_scale(up, 22) + (0,0,14); + } + while (self.damageTaken < level.tankHealth) + { + if (!startedfx) + { + level thread play_sound_in_space(level.barrelIngSound, self.origin); + startedfx = true; + } + if (count > 20) + { + count = 0; + } + if (count == 0) + { + self.damageTaken += (10 + randomfloat(10)); + badplace_cylinder("",1, self.origin, 128, 250); + } + count++; + wait 0.05; + } + self thread explodable_oiltank_small_explode(); +} +explodable_oiltank_small_explode() +{ + self notify ("exploding"); + self notify ("death"); + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset = (0,0,0); + if(dot < .5) + { + start = (self.origin + vector_scale(up, 0)); + end = physicstrace(start, (start + (0,0,-64))); + offset = end - self.origin; + } + offset += (0,0,4); + level thread play_sound_in_space(level.oiltanksmallExpSound, self.origin); + if(IsDefined(self.parent)) + { + playfx (level.breakables_fx["oiltanksmall"]["explode"], self.origin + offset, AnglesToForward(self.parent.angles) * -1, AnglesToUp(self.parent.angles)); + } + else + { + playfx (level.breakables_fx["oiltanksmall"]["explode"], self.origin + offset); + } + physicsexplosionsphere( self.origin + offset, 100, 80, 1 ); + level.barrelExplodingThisFrame = true; + if (isdefined (self.remove)) + { + self.remove connectpaths(); + self.remove delete(); + } + minDamage = 2000; + maxDamage = 4000; + blastRadius = 400; + if (isdefined(self.radius)) + { + blastRadius = self.radius; + } + attacker = undefined; + if(isdefined(self.damageOwner)) + { + attacker = self.damageOwner; + if( isplayer( attacker ) ) + { + arcademode_assignpoints( "arcademode_score_explodableitem", attacker ); + } + } + level.lastExplodingBarrel[ "time" ] = getTime(); + level.lastExplodingBarrel[ "origin" ] = self.origin + ( 0, 0, 30 ); + self radiusDamage(self.origin + (0,0,30), blastRadius, maxDamage, minDamage, attacker); + if (randomint(2) == 0) + { + self setModel("static_peleliu_propane_d"); + } + else + { + self setModel("static_peleliu_propane_d"); + } + if(dot < .5) + { + start = (self.origin + vector_scale(up, 22)); + pos = physicstrace(start, (start + (0,0,-64))); + self.origin = pos; + self.angles += (0,0,90); + } + wait 0.05; + level.barrelExplodingThisFrame = false; +} +explodable_bagofbarrels_think() +{ + if (self.classname != "script_model") + { + return; + } + if(!isdefined(level.precachemodeltype["dest_merchantship_net_barrels_dmg0"])) + { + level.precachemodeltype["dest_merchantship_net_barrels_dmg0"] = true; + precacheModel("dest_merchantship_net_barrels_dmg1"); + } + self endon ("exploding"); + self breakable_clip(); + self xenon_auto_aim(); + self.damageTaken = 0; + self setcandamage(true); + for (;;) + { + self waittill("damage", amount ,attacker, direction_vec, P, type); + println("OILTANKDAMAGE: "+type); + if(type == "MOD_MELEE" || type == "MOD_IMPACT") + { + continue; + } + if( IsDefined( self.script_requires_player ) && self.script_requires_player && !IsPlayer( attacker ) ) + { + continue; + } + if( IsDefined( self.script_selfisattacker ) && self.script_selfisattacker ) + { + self.damageOwner = self; + } + else + { + self.damageOwner = attacker; + } + if (level.barrelExplodingThisFrame) + { + wait randomfloat(1); + } + self.damageTaken += amount; + if (self.damageTaken == amount) + { + self thread explodable_bagofbarrels_burn(); + } + } +} +explodable_bagofbarrels_burn() +{ + self endon("death"); + count = 0; + startedfx = false; + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset1 = (0,0,-116); + offset2 = vector_scale(up, -116); + if(dot < .5) + { + offset1 = vector_scale(up, -116) - (0,0,30); + offset2 = vector_scale(up, -116) + (0,0,14); + } + while (self.damageTaken < level.tankHealth) + { + if (!startedfx) + { + level thread play_sound_in_space(level.barrelIngSound, self.origin); + startedfx = true; + } + if (count > 20) + { + count = 0; + } + if (count == 0) + { + self.damageTaken += (10 + randomfloat(10)); + badplace_cylinder("",1, self.origin, 128, 250); + } + count++; + wait 0.05; + } + self thread explodable_bagofbarrels_explode(); +} +explodable_bagofbarrels_explode() +{ + self notify ("exploding"); + self notify ("death"); + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset = (0,0,0); + if(dot < .5) + { + start = (self.origin + vector_scale(up, -116)); + end = physicstrace(start, (start + (0,0,-64))); + offset = end - self.origin; + } + offset += (0,0,4); + level thread play_sound_in_space(level.bagofbarrelsExpSound, self.origin); + playfx (level.breakables_fx["bagofbarrels"]["explode"], self.origin + offset); + physicsexplosionsphere( self.origin + offset, 100, 80, 1 ); + level.barrelExplodingThisFrame = true; + if (isdefined (self.remove)) + { + self.remove connectpaths(); + self.remove delete(); + } + minDamage = 500; + maxDamage = 1000; + blastRadius = 200; + if (isdefined(self.radius)) + { + blastRadius = self.radius; + } + attacker = undefined; + if(isdefined(self.damageOwner)) + { + attacker = self.damageOwner; + if( isplayer( attacker ) ) + { + arcademode_assignpoints( "arcademode_score_explodableitem", attacker ); + } + } + level.lastExplodingBarrel[ "time" ] = getTime(); + level.lastExplodingBarrel[ "origin" ] = self.origin + ( 0, 0, 30 ); + self radiusDamage(self.origin + (0,0,30), blastRadius, maxDamage, minDamage, attacker); + if (randomint(2) == 0) + { + self setModel("dest_merchantship_net_barrels_dmg1"); + } + else + { + self setModel("dest_merchantship_net_barrels_dmg1"); + } + if(dot < .5) + { + start = (self.origin + vector_scale(up, 22)); + pos = physicstrace(start, (start + (0,0,-64))); + self.origin = pos; + self.angles += (0,0,90); + } + wait 0.05; + level.barrelExplodingThisFrame = false; +} +explodable_bagofcrates_think() +{ + if (self.classname != "script_model") + { + return; + } + if(!isdefined(level.precachemodeltype["dest_merchantship_net_crates_dmg0"])) + { + level.precachemodeltype["dest_merchantship_net_crates_dmg0"] = true; + precacheModel("dest_merchantship_net_crates_dmg1"); + } + self endon ("exploding"); + self breakable_clip(); + self xenon_auto_aim(); + self.damageTaken = 0; + self setcandamage(true); + for (;;) + { + self waittill("damage", amount ,attacker, direction_vec, P, type); + println("BAGOFCRATESDAMAGE: "+type); + if(type == "MOD_MELEE" || type == "MOD_IMPACT") + { + continue; + } + if( IsDefined( self.script_requires_player ) && self.script_requires_player && !IsPlayer( attacker ) ) + { + continue; + } + if( IsDefined( self.script_selfisattacker ) && self.script_selfisattacker ) + { + self.damageOwner = self; + } + else + { + self.damageOwner = attacker; + } + if (level.barrelExplodingThisFrame) + { + wait randomfloat(1); + } + self.damageTaken += amount; + if (self.damageTaken == amount) + { + self thread explodable_bagofcrates_burn(); + } + } +} +explodable_bagofcrates_burn() +{ + count = 0; + startedfx = false; + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset1 = (0,0,-116); + offset2 = vector_scale(up, -116); + if(dot < .5) + { + offset1 = vector_scale(up, -116) - (0,0,30); + offset2 = vector_scale(up, -116) + (0,0,14); + } + while (self.damageTaken < level.tankHealth) + { + if (!startedfx) + { + level thread play_sound_in_space(level.barrelIngSound, self.origin); + startedfx = true; + } + if (count > 20) + { + count = 0; + } + if (count == 0) + { + self.damageTaken += (10 + randomfloat(10)); + badplace_cylinder("",1, self.origin, 128, 250); + } + count++; + wait 0.05; + } + self thread explodable_bagofcrates_explode(); +} +explodable_bagofcrates_explode() +{ + self notify ("exploding"); + self notify ("death"); + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset = (0,0,0); + if(dot < .5) + { + start = (self.origin + vector_scale(up, -116)); + end = physicstrace(start, (start + (0,0,-64))); + offset = end - self.origin; + } + offset += (0,0,4); + level thread play_sound_in_space(level.bagofcratesExpSound, self.origin); + playfx (level.breakables_fx["bagofcrates"]["explode"], self.origin + offset); + physicsexplosionsphere( self.origin + offset, 100, 80, 1 ); + level.barrelExplodingThisFrame = true; + if (isdefined (self.remove)) + { + self.remove connectpaths(); + self.remove delete(); + } + minDamage = 500; + maxDamage = 1000; + blastRadius = 200; + if (isdefined(self.radius)) + { + blastRadius = self.radius; + } + attacker = undefined; + if(isdefined(self.damageOwner)) + { + attacker = self.damageOwner; + if( isplayer( attacker ) ) + { + arcademode_assignpoints( "arcademode_score_explodableitem", attacker ); + } + } + level.lastExplodingBarrel[ "time" ] = getTime(); + level.lastExplodingBarrel[ "origin" ] = self.origin + ( 0, 0, 30 ); + self radiusDamage(self.origin + (0,0,30), blastRadius, maxDamage, minDamage, attacker); + if (randomint(2) == 0) + { + self setModel("dest_merchantship_net_crates_dmg1"); + } + else + { + self setModel("dest_merchantship_net_crates_dmg1"); + } + if(dot < .5) + { + start = (self.origin + vector_scale(up, 22)); + pos = physicstrace(start, (start + (0,0,-64))); + self.origin = pos; + self.angles += (0,0,90); + } + wait 0.05; + level.barrelExplodingThisFrame = false; +} +explodable_liferaft_think() +{ + if (self.classname != "script_model") + { + return; + } + if(!isdefined(level.precachemodeltype["dest_merchantship_lifeboat_dmg0"])) + { + level.precachemodeltype["dest_merchantship_lifeboat_dmg0"] = true; + precacheModel("dest_merchantship_lifeboat_dmg1"); + } + self endon ("exploding"); + self breakable_clip(); + self xenon_auto_aim(); + self.damageTaken = 0; + self setcandamage(true); + for (;;) + { + self waittill("damage", amount ,attacker, direction_vec, P, type); + println("LIFEBOATDAMAGE: "+type); + if(type == "MOD_MELEE" || type == "MOD_IMPACT") + { + continue; + } + if( IsDefined( self.script_requires_player ) && self.script_requires_player && !IsPlayer( attacker ) ) + { + continue; + } + if( IsDefined( self.script_selfisattacker ) && self.script_selfisattacker ) + { + self.damageOwner = self; + } + else + { + self.damageOwner = attacker; + } + if (level.barrelExplodingThisFrame) + { + wait randomfloat(1); + } + self.damageTaken += amount; + if (self.damageTaken == amount) + { + self thread explodable_liferaft_burn(); + } + } +} +explodable_liferaft_burn() +{ + count = 0; + startedfx = false; + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset1 = (0,0,0); + offset2 = vector_scale(up, 44); + if(dot < .5) + { + offset1 = vector_scale(up, 22) - (0,0,30); + offset2 = vector_scale(up, 22) + (0,0,14); + } + while (self.damageTaken < level.tankHealth) + { + if (!startedfx) + { + level thread play_sound_in_space(level.barrelIngSound, self.origin); + startedfx = true; + } + if (count > 20) + count = 0; + if (count == 0) + { + self.damageTaken += (10 + randomfloat(10)); + badplace_cylinder("",1, self.origin, 128, 250); + } + count++; + wait 0.05; + } + self thread explodable_liferaft_explode(); +} +explodable_liferaft_explode() +{ + self notify ("exploding"); + self notify ("death"); + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset = (0,0,0); + if(dot < .5) + { + start = (self.origin + vector_scale(up, 32)); + end = physicstrace(start, (start + (0,0,-64))); + offset = end - self.origin; + } + offset += (0,0,4); + level thread play_sound_in_space(level.liferaftExpSound, self.origin); + playfx (level.breakables_fx["liferaft"]["explode"], self.origin + offset); + physicsexplosionsphere( self.origin + offset, 100, 80, 1 ); + level.barrelExplodingThisFrame = true; + if (isdefined (self.remove)) + { + self.remove connectpaths(); + self.remove delete(); + } + minDamage = 50; + maxDamage = 100; + blastRadius = 1; + if (isdefined(self.radius)) + { + blastRadius = self.radius; + } + attacker = undefined; + if(isdefined(self.damageOwner)) + { + attacker = self.damageOwner; + if( isplayer( attacker ) ) + { + arcademode_assignpoints( "arcademode_score_explodableitem", attacker ); + } + } + level.lastExplodingBarrel[ "time" ] = getTime(); + level.lastExplodingBarrel[ "origin" ] = self.origin + ( 0, 0, 30 ); + self radiusDamage(self.origin + (0,0,30), blastRadius, maxDamage, minDamage, attacker); + if (randomint(2) == 0) + { + self setModel("dest_merchantship_lifeboat_dmg1"); + } + else + { + self setModel("dest_merchantship_lifeboat_dmg1"); + } + if(dot < .5) + { + start = (self.origin + vector_scale(up, 22)); + pos = physicstrace(start, (start + (0,0,-64))); + self.origin = pos; + self.angles += (0,0,90); + } + wait 0.05; + level.barrelExplodingThisFrame = false; +} +explodable_tarpcrate_think() +{ + if (self.classname != "script_model") + { + return; + } + if(!isdefined(level.precachemodeltype["static_peleliu_crate_tarp"])) + { + level.precachemodeltype["static_peleliu_crate_tarp"] = true; + precacheModel("static_peleliu_crate_tarp_d"); + } + self endon ("exploding"); + self breakable_clip(); + self xenon_auto_aim(); + self.damageTaken = 0; + self setcandamage(true); + for (;;) + { + self waittill("damage", amount ,attacker, direction_vec, P, type); + println("TARPCRATEDAMAGE: "+type); + if(type == "MOD_MELEE" || type == "MOD_IMPACT") + { + continue; + } + if( IsDefined( self.script_requires_player ) && self.script_requires_player && !IsPlayer( attacker ) ) + { + continue; + } + if( IsDefined( self.script_selfisattacker ) && self.script_selfisattacker ) + { + self.damageOwner = self; + } + else + { + self.damageOwner = attacker; + } + if (level.barrelExplodingThisFrame) + { + wait randomfloat(1); + } + self.damageTaken += amount; + if (self.damageTaken == amount) + { + self thread explodable_tarpcrate_burn(); + } + } +} +explodable_tarpcrate_burn() +{ + count = 0; + startedfx = false; + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset1 = (0,0,0); + offset2 = vector_scale(up, 44); + if(dot < .5) + { + offset1 = vector_scale(up, 22) - (0,0,30); + offset2 = vector_scale(up, 22) + (0,0,14); + } + while (self.damageTaken < level.tankHealth) + { + if (!startedfx) + { + level thread play_sound_in_space(level.barrelIngSound, self.origin); + startedfx = true; + } + if (count > 20) + { + count = 0; + } + if (count == 0) + { + self.damageTaken += (10 + randomfloat(10)); + badplace_cylinder("",1, self.origin, 128, 250); + } + count++; + wait 0.05; + } + self thread explodable_tarpcrate_explode(); +} +explodable_tarpcrate_explode() +{ + self notify ("exploding"); + self notify ("death"); + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset = (0,0,0); + if(dot < .5) + { + start = (self.origin + vector_scale(up, 32)); + end = physicstrace(start, (start + (0,0,-64))); + offset = end - self.origin; + } + offset += (0,0,4); + level thread play_sound_in_space(level.tarpcrateExpSound, self.origin); + playfx (level.breakables_fx["tarpcrate"]["explode"], self.origin + offset); + physicsexplosionsphere( self.origin + offset, 100, 80, 1 ); + level.barrelExplodingThisFrame = true; + if (isdefined (self.remove)) + { + self.remove connectpaths(); + self.remove delete(); + } + minDamage = 50; + maxDamage = 100; + blastRadius = 1; + if (isdefined(self.radius)) + { + blastRadius = self.radius; + } + attacker = undefined; + if(isdefined(self.damageOwner)) + { + attacker = self.damageOwner; + if( isplayer( attacker ) ) + { + arcademode_assignpoints( "arcademode_score_explodableitem", attacker ); + } + } + level.lastExplodingBarrel[ "time" ] = getTime(); + level.lastExplodingBarrel[ "origin" ] = self.origin + ( 0, 0, 30 ); + self radiusDamage(self.origin + (0,0,30), blastRadius, maxDamage, minDamage, attacker); + if (randomint(2) == 0) + { + self setModel("static_peleliu_crate_tarp_d"); + } + else + { + self setModel("static_peleliu_crate_tarp_d"); + } + if(dot < .5) + { + start = (self.origin + vector_scale(up, 22)); + pos = physicstrace(start, (start + (0,0,-64))); + self.origin = pos; + self.angles += (0,0,90); + } + wait 0.05; + level.barrelExplodingThisFrame = false; +} +flammable_crate_think() +{ + if (self.classname != "script_model") + { + return; + } + if(!isdefined(level.precachemodeltype["global_flammable_crate_jap_single"])) + { + level.precachemodeltype["global_flammable_crate_jap_single"] = true; + precacheModel("global_flammable_crate_jap_piece01_d"); + precacheModel("global_flammable_crate_jap_piece02_d"); + precacheModel("global_flammable_crate_jap_piece03_d"); + precacheModel("global_flammable_crate_jap_piece04_d"); + precacheModel("global_flammable_crate_jap_piece05_d"); + precacheModel("global_flammable_crate_jap_piece06_d"); + } + self endon ("exploding"); + self breakable_clip(); + self xenon_auto_aim(); + self.damageTaken = 0; + self setcandamage(true); + for (;;) + { + self waittill("damage", amount ,attacker, direction_vec, P, type); + if(type != "MOD_BURNED" && type != "MOD_EXPLOSIVE" && type != "MOD_PROJECTILE_SPLASH" && type != "MOD_PROJECTILE" && type != "MOD_GRENADE_SPLASH" && type != "MOD_GRENADE") + { + continue; + } + if( IsDefined( self.script_requires_player ) && self.script_requires_player && !IsPlayer( attacker ) ) + { + continue; + } + if( IsDefined( self.script_selfisattacker ) && self.script_selfisattacker ) + { + self.damageOwner = self; + } + else + { + self.damageOwner = attacker; + } + if (level.barrelExplodingThisFrame) + { + wait randomfloat(1); + } + self.damageTaken += amount; + if (self.damageTaken == amount) + { + self thread flammable_crate_burn(); + } + } +} +flammable_crate_burn() +{ + count = 0; + startedfx = false; + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset1 = (0,0,0); + offset2 = vector_scale(up, 44); + if(dot < .5) + { + offset1 = vector_scale(up, 22) - (0,0,30); + offset2 = vector_scale(up, 22) + (0,0,14); + } + while (self.damageTaken < level.barrelHealth) + { + if (!startedfx) + { + level thread play_sound_in_space(level.crateIgnSound, self.origin); + startedfx = true; + } + if (count > 20) + { + count = 0; + } + if (count == 0) + { + self.damageTaken += (10 + randomfloat(10)); + badplace_cylinder("",1, self.origin, 128, 250); + } + count++; + wait 0.05; + } + self thread flammable_crate_explode(); +} +flammable_crate_explode() +{ + self notify ("exploding"); + self notify ("death"); + up = anglestoup(self.angles); + worldup = anglestoup((0,90,0)); + dot = vectordot(up, worldup); + offset = (0,0,0); + if(dot < .5) + { + start = (self.origin + vector_scale(up, 22)); + end = physicstrace(start, (start + (0,0,-64))); + offset = end - self.origin; + } + offset += (0,0,4); + level thread play_sound_in_space(level.crateExpSound, self.origin); + playfx (level.breakables_fx["ammo_crate"]["explode"], self.origin); + physicsexplosionsphere( self.origin + offset, 100, 80, 1 ); + level.barrelExplodingThisFrame = true; + if (isdefined (self.remove)) + { + self.remove connectpaths(); + self.remove delete(); + } + minDamage = 1; + maxDamage = 250; + blastRadius = 250; + if (isdefined(self.radius)) + { + blastRadius = self.radius; + } + attacker = undefined; + if(isdefined(self.damageOwner)) + { + attacker = self.damageOwner; + } + self radiusDamage(self.origin + (0,0,30), blastRadius, maxDamage, minDamage, attacker); + if( isplayer( attacker ) ) + { + arcademode_assignpoints( "arcademode_score_explodableitem", attacker ); + } + if (randomint(2) == 0) + { + self setModel("global_flammable_crate_jap_piece01_d"); + } + else + { + self setModel("global_flammable_crate_jap_piece01_d"); + } + if(dot < .5) + { + start = (self.origin + vector_scale(up, 22)); + pos = physicstrace(start, (start + (0,0,-64))); + self.origin = pos; + self.angles += (0,0,90); + } + wait 0.05; + level.barrelExplodingThisFrame = false; +} +shuddering_entity_think() +{ + assert (self.classname == "script_model"); + helmet = false; + if(self.model == "prop_helmet_german_normandy") + { + helmet = true; + } + self setcandamage(true); + for(;;) + { + self waittill("damage", other, damage, direction_vec, point ); + if(helmet) + { + self vibrate(direction_vec, 20, 0.6, 0.75 ); + } + else + { + self vibrate(direction_vec, 0.4, 0.4, 0.4 ); + } + self waittill("rotatedone"); + } +} +tincan_think() +{ + if (self.classname != "script_model") + { + return; + } + self setcandamage(true); + self waittill ("damage", damage, ent); + if (isSentient(ent)) + { + direction_org = ((ent getEye()) - (0,0,(randomint(50) + 50))); + } + else + { + direction_org = ent.origin; + } + direction_vec = vectornormalize (self.origin - direction_org); + direction_vec = vector_scale(direction_vec, .5 + randomfloat(1)); + self notify ("death"); + playfx (level.breakables_fx["tincan"], self.origin, direction_vec); + self delete(); +} +helmet_pop() +{ + if (self.classname != "script_model") + { + return; + } + self xenon_auto_aim(); + self setcandamage(true); + self thread helmet_logic(); +} +helmet_logic() +{ + self waittill ("damage", damage, ent); + if (isSentient(ent)) + { + direction_org = ent getEye(); + } + else + { + direction_org = ent.origin; + } + direction_vec = vectornormalize (self.origin - direction_org); + if ( !isdefined( self.dontremove ) && ent == level.player ) + { + self thread call_overloaded_func( "animscripts\death", "helmetLaunch", direction_vec ); + return; + } + self notsolid(); + self hide(); + model = spawn("script_model", self.origin + (0,0,5)); + model.angles = self.angles; + model setmodel(self.model); + model thread call_overloaded_func( "animscripts\death", "helmetLaunch", direction_vec ); + self.dontremove = false; + self notify("ok_remove"); +} +allowBreak(ent) +{ + if (!isdefined (level.breakingEnts)) + { + return true; + } + if (level.breakingEnts.size == 0) + { + return false; + } + else + { + for (i=0;i 0 ) ) + { + self.autoaim = getClosestAccurantEnt( self.origin, level.console_auto_aim ); + } + if (isdefined (self.autoaim)) + { + level.console_auto_aim = array_remove( level.console_auto_aim, self.autoaim ); + self thread xenon_remove_auto_aim(); + } +} +xenon_auto_aim_stop_logic() +{ + self notify("entered_xenon_auto_aim_stop_logic"); + self endon("entered_xenon_auto_aim_stop_logic"); + self.autoaim waittill("xenon_auto_aim_stop_logic"); + self.dontremove = undefined; +} +xenon_remove_auto_aim(wait_message) +{ + self thread xenon_auto_aim_stop_logic(); + self endon("xenon_auto_aim_stop_logic"); + self.autoaim endon("xenon_auto_aim_stop_logic"); + self notify("xenon_remove_auto_aim"); + self.autoaim thread xenon_enable_auto_aim(wait_message); + self.dontremove = true; + self waittill("damage", amount, ent); + self.autoaim disableAimAssist(); + self.autoaim delete(); + if(self.dontremove) + { + self waittill("ok_remove"); + } + self delete(); +} +xenon_enable_auto_aim(wait_message) +{ + self endon("xenon_auto_aim_stop_logic"); + self endon("death"); + if(!isdefined(wait_message)) + { + wait_message = true; + } + if(isdefined(self.script_noteworthy) && wait_message) + { + string = "enable_xenon_autoaim_" + self.script_noteworthy; + level waittill(string); + } + self.wait_message = false; + if(isdefined(self.recreate) && self.recreate == true) + { + self waittill("recreate"); + } + self enableAimAssist(); +} +breakable_clip() +{ + if (isdefined(self.target)) + { + targ = getent(self.target,"targetname"); + if(targ.classname == "script_brushmodel") + { + self.remove = targ; + return; + } + } + if ((isdefined (level.breakables_clip)) && (level.breakables_clip.size > 0)) + { + self.remove = getClosestEnt( self.origin , level.breakables_clip ); + } + if (isdefined (self.remove)) + { + level.breakables_clip = array_remove ( level.breakables_clip , self.remove ); + } +} +getFurthestEnt(org, array) +{ + if (array.size < 1) + { + return; + } + dist = distance(array[0] getorigin(), org); + ent = array[0]; + for (i=0;i= dist) + { + continue; + } + dist = newdist; + ent = array[i]; + } + return ent; +} +make_broken_peices(wholepiece, type) +{ + rt = anglesToRight (wholepiece.angles); + fw = anglesToForward (wholepiece.angles); + up = anglesToUp (wholepiece.angles); + piece = []; + switch(type) + { + case "orange vase": + piece[piece.size] = addpiece(rt, fw, up, -7, 0, 22, wholepiece, (0,0,0), "egypt_prop_vase_br2"); + piece[piece.size] = addpiece(rt, fw, up, 13, -6, 28, wholepiece, (0, 245.1, 0), "egypt_prop_vase_br7"); + piece[piece.size] = addpiece(rt, fw, up, 12, 10, 27, wholepiece, (0, 180, 0), "egypt_prop_vase_br7"); + piece[piece.size] = addpiece(rt, fw, up, 3, 2, 0, wholepiece, (0, 0, 0), "egypt_prop_vase_br5"); + break; + case "green vase": + piece[piece.size] = addpiece(rt, fw, up, -6, -1, 26, wholepiece, (0,0,0), "egypt_prop_vase_br1"); + piece[piece.size] = addpiece(rt, fw, up, 12, 1, 31, wholepiece, (0, 348.5, 0), "egypt_prop_vase_br3"); + piece[piece.size] = addpiece(rt, fw, up, 6, 13, 29, wholepiece, (0, 153.5, 0), "egypt_prop_vase_br6"); + piece[piece.size] = addpiece(rt, fw, up, 3, 1, 0, wholepiece, (0, 0, 0), "egypt_prop_vase_br4"); + break; + case "wood box": + piece[piece.size] = addpiece(rt, fw, up, -10, 10, 25, wholepiece, (0, 0,0), "prop_crate_dak_shard"); + piece[piece.size] = addpiece(rt, fw, up, 10, 10, 25, wholepiece, (0, 90,0), "prop_crate_dak_shard"); + piece[piece.size] = addpiece(rt, fw, up, 10, -10, 25, wholepiece, (0,180,0), "prop_crate_dak_shard"); + piece[piece.size] = addpiece(rt, fw, up, -10, -10, 25, wholepiece, (0,270,0), "prop_crate_dak_shard"); + piece[piece.size] = addpiece(rt, fw, up, 10, 10, 5, wholepiece, (180, 0,0), "prop_crate_dak_shard"); + piece[piece.size] = addpiece(rt, fw, up, 10, -10, 5, wholepiece, (180, 90,0), "prop_crate_dak_shard"); + piece[piece.size] = addpiece(rt, fw, up, -10, -10, 5, wholepiece, (180,180,0), "prop_crate_dak_shard"); + piece[piece.size] = addpiece(rt, fw, up, -10, 10, 5, wholepiece, (180,270,0), "prop_crate_dak_shard"); + break; + case "bottle": + piece[piece.size] = addpiece(rt, fw, up, 0, 0, 10, wholepiece, (0, 0,0), "prop_winebottle_broken_top"); piece[piece.size-1].type = "bottle_top"; + piece[piece.size] = addpiece(rt, fw, up, 0, 0, 0, wholepiece, (0, 0,0), "prop_winebottle_broken_bot"); piece[piece.size-1].type = "bottle_bot"; + break; + case "plate": + { + switch(wholepiece.plate) + { + case "round_floral": + piece[piece.size] = addpiece(rt, fw, up, -3, -4, .5, wholepiece, (0, 150, 0), "prop_diningplate_brokenfloral1"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 3, -2, .5, wholepiece, (0, 149.8,0), "prop_diningplate_brokenfloral2"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 1, 2, .5, wholepiece, (0, 150.2,0), "prop_diningplate_brokenfloral3"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -4, 2, .5, wholepiece, (0, 146.8,0), "prop_diningplate_brokenfloral4"); piece[piece.size-1].type = "plate"; + break; + case "round_plain": + piece[piece.size] = addpiece(rt, fw, up, -3, -4, .5, wholepiece, (0, 150, 0), "prop_diningplate_brokenplain1"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 3, -2, .5, wholepiece, (0, 149.8,0), "prop_diningplate_brokenplain2"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 1, 2, .5, wholepiece, (0, 150.2,0), "prop_diningplate_brokenplain3"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -4, 2, .5, wholepiece, (0, 146.8,0), "prop_diningplate_brokenplain4"); piece[piece.size-1].type = "plate"; + break; + case "round_stack": + piece[piece.size] = addpiece(rt, fw, up, -3, -4, .5, wholepiece, (0, 150, 0), "prop_diningplate_brokenfloral1"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 3, -2, .5, wholepiece, (0, 149.8,0), "prop_diningplate_brokenfloral2"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 1, 2, .5, wholepiece, (0, 150.2,0), "prop_diningplate_brokenfloral3"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -4, 2, .5, wholepiece, (0, 146.8,0), "prop_diningplate_brokenfloral4"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -4, 3, 2.5, wholepiece, (0, 60, 0), "prop_diningplate_brokenplain1"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -1, -3, 2.5, wholepiece, (0, 59.8,0), "prop_diningplate_brokenplain2"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 2, -1, 2.5, wholepiece, (0, 60.2,0), "prop_diningplate_brokenplain3"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 2, 4, 2.5, wholepiece, (0, 56.8,0), "prop_diningplate_brokenplain4"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -3, -4, 4.5, wholepiece, (0, 150, 0), "prop_diningplate_brokenfloral1"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 3, -2, 4.5, wholepiece, (0, 149.8,0), "prop_diningplate_brokenfloral2"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 1, 2, 4.5, wholepiece, (0, 150.2,0), "prop_diningplate_brokenfloral3"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -4, 2, 4.5, wholepiece, (0, 146.8,0), "prop_diningplate_brokenfloral4"); piece[piece.size-1].type = "plate"; + break; + case "oval_floral": + piece[piece.size] = addpiece(rt, fw, up, 4, -4, .5, wholepiece, (0, 205.9, 0), "prop_diningplate_brokenfloral1"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -6, 1, .5, wholepiece, (0, 352.2,0), "prop_diningplate_brokenfloral2"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 4, 2, .5, wholepiece, (0, 150.2,0), "prop_diningplate_brokenfloral3"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -2, 5, .5, wholepiece, (0, 102.3,0), "prop_diningplate_brokenfloral4"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -3, -3, .5, wholepiece, (0, 246.7,0), "prop_diningplate_brokenfloral4"); piece[piece.size-1].type = "plate"; + break; + case "oval_plain": + piece[piece.size] = addpiece(rt, fw, up, 4, -4, .5, wholepiece, (0, 205.9, 0), "prop_diningplate_brokenplain1"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -6, 1, .5, wholepiece, (0, 352.2,0), "prop_diningplate_brokenplain2"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 4, 2, .5, wholepiece, (0, 150.2,0), "prop_diningplate_brokenplain3"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -2, 5, .5, wholepiece, (0, 102.3,0), "prop_diningplate_brokenplain4"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -3, -3, .5, wholepiece, (0, 246.7,0), "prop_diningplate_brokenplain4"); piece[piece.size-1].type = "plate"; + break; + case "oval_stack": + piece[piece.size] = addpiece(rt, fw, up, 4, -4, .5, wholepiece, (0, 205.9, 0), "prop_diningplate_brokenfloral1"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -6, 1, .5, wholepiece, (0, 352.2,0), "prop_diningplate_brokenfloral2"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 4, 2, .5, wholepiece, (0, 150.2,0), "prop_diningplate_brokenfloral3"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -2, 5, .5, wholepiece, (0, 102.3,0), "prop_diningplate_brokenfloral4"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -3, -3, .5, wholepiece, (0, 246.7,0), "prop_diningplate_brokenfloral4"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -4, 5, 2.5, wholepiece, (0, 25.9, 0), "prop_diningplate_brokenplain1"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 6, 0, 2.5, wholepiece, (0, 172.2,0), "prop_diningplate_brokenplain2"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, -4, -1, 2.5, wholepiece, (0, 330.2,0), "prop_diningplate_brokenplain3"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 2, -4, 2.5, wholepiece, (0, 282.3,0), "prop_diningplate_brokenplain4"); piece[piece.size-1].type = "plate"; + piece[piece.size] = addpiece(rt, fw, up, 3, 4, 2.5, wholepiece, (0, 66.7,0), "prop_diningplate_brokenplain4"); piece[piece.size-1].type = "plate"; + break; + } + }break; + default: + return; + } + array_thread(piece, ::pieces_move, wholepiece.origin); + if ( (isdefined (level.breakables_peicesCollide[type])) && (level.breakables_peicesCollide[type] == true) ) + { + height = piece[0].origin[2]; + for(i = 0; i piece[i].origin[2]) + { + height = piece[i].origin[2]; + } + } + array_thread(piece, ::pieces_collision, height); + } + else + { + wait 2; + for (i=0;i 50) + { + x = -1; + } + if (randomint(100) > 50) + { + y = -1; + } + if (randomint(100) > 50) + { + z = -1; + } + org rotatevelocity((250*x,250*y, randomfloat(100)*z), 2, 0, .5); + } + else if(isdefined(self.type) && self.type == "plate") + { + vec = vectornormalize (end - origin); + vec = vector_scale(vec, 125 + randomfloat(25)); + if (randomint(100) > 50) + { + org rotateroll((800 + randomfloat (4000)) * -1, 5,0,0); + } + else + { + org rotateroll(800 + randomfloat (4000), 5,0,0); + } + } + else + { + vec = vectornormalize (end - origin); + vec = vector_scale(vec, 60 + randomfloat(50)); + if (randomint(100) > 50) + { + org rotateroll((800 + randomfloat (1000)) * -1, 5,0,0); + } + else + { + org rotateroll(800 + randomfloat (1000), 5,0,0); + } + } + org moveGravity(vec, 5); + wait 5; + if(isdefined(self)) + { + self unlink(); + } + org delete(); +} +pieces_collision(height) +{ + self endon ("death"); + wait .1; + trace = bullettrace(self.origin, self.origin - (0,0,50000), false, undefined); + vec = trace["position"]; + while( self.origin[2] > vec[2] ) + { + wait .05; + } + self unlink(); + self.origin = (self.origin[0], self.origin[1], vec[2]); + self notify("do not kill"); + self unlink(); +} +addpiece(rt, fw, up, xs, ys, zs, wholepiece, angles, model) +{ + scale = 1; + x = rt; + y = fw; + z = up; + x = vector_scale(x, ys * scale); + y = vector_scale(y, xs * scale); + z = vector_scale(z, zs * scale); + origin = wholepiece.origin + x + y + z; + part = spawn("script_model", origin); + part setmodel(model); + part.modelscale = scale; + part.angles = wholepiece.angles + angles; + list_add(part); + return part; +} +getClosestAccurantEnt(org, array) +{ + if (array.size < 1) + { + return; + } + dist = 8; + ent = undefined; + for (i=0;i= dist) + { + continue; + } + dist = newdist; + ent = array[i]; + } + return ent; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_introscreen.gsc b/BO1/PC/ZM/maps/_introscreen.gsc new file mode 100644 index 0000000..ce1ddbe --- /dev/null +++ b/BO1/PC/ZM/maps/_introscreen.gsc @@ -0,0 +1,492 @@ +#include common_scripts\utility; +#include maps\_utility; +main() +{ + flag_init( "pullup_weapon" ); + flag_init( "starting final intro screen fadeout" ); + flag_init( "introscreen_complete" ); + PrecacheShader( "black" ); + if( GetDvar( #"introscreen" ) == "" ) + { + SetDvar( "introscreen", "1" ); + } + level.splitscreen = GetDvarInt( #"splitscreen" ); + level.hidef = GetDvarInt( #"hidef" ); + level thread introscreen_report_disconnected_clients(); + switch( level.script ) + { + case "example": + break; + case "so_narrative1_frontend": + case "so_narrative2_frontend": + case "so_narrative3_frontend": + case "so_narrative4_frontend": + case "so_narrative5_frontend": + case "so_narrative6_frontend": + case "int_escape": + introscreen_delay( undefined, undefined, undefined, undefined, undefined, 1, 0, 0, true ); + break; + case "cuba": + break; + case "vorkuta": + introscreen_delay( &"VORKUTA_INTROSCREEN_EXTRA", &"VORKUTA_INTROSCREEN_TITLE", &"VORKUTA_INTROSCREEN_PLACE", &"VORKUTA_INTROSCREEN_DATE"); + break; + case "quagmire": + case "creek_1": + introscreen_delay( "", "", "", "", undefined, undefined, undefined, 4+7 ); + break; + case "kowloon": + introscreen_redact_delay( &"KOWLOON_INTROSCREEN_TITLE", &"KOWLOON_INTROSCREEN_PLACE", &"KOWLOON_INTROSCREEN_NAME", &"KOWLOON_INTROSCREEN_DATE", undefined, 1.0, undefined, undefined, undefined, 0.8 ); + break; + case "hue_city": + break; + case "khe_sanh": + introscreen_redact_delay( &"KHE_SANH_INTRO_LINE_ONE", &"KHE_SANH_INTRO_LINE_TWO", &"KHE_SANH_INTRO_LINE_THREE", &"KHE_SANH_INTRO_LINE_FOUR", &"KHE_SANH_INTRO_LINE_FIVE", 1, undefined, undefined, undefined, 0.8 ); + break; + case "flashpoint": + introscreen_redact_delay( &"FLASHPOINT_INTROSCREEN_TITLE", &"FLASHPOINT_INTROSCREEN_PLACE", &"FLASHPOINT_INTROSCREEN_INFO", &"FLASHPOINT_INTROSCREEN_DATE", undefined ); + break; + case "pow": + level.introscreen_shader = "none"; + introscreen_redact_delay( &"POW_REDACTED_ONE", &"POW_REDACTED_TWO", &"POW_REDACTED_THREE", &"POW_REDACTED_FOUR", &"POW_REDACTED_FIVE", undefined, undefined, undefined, undefined, undefined, (1,1,1)); + break; + case "nazi_zombie_prototype": + introscreen_delay(); + break; + case "pentagon": + introscreen_redact_delay( &"PENTAGON_INTROSCREEN_0", &"PENTAGON_INTROSCREEN_1", &"PENTAGON_INTROSCREEN_2", &"PENTAGON_INTROSCREEN_3" ); + break; + case "fullahead": + introscreen_delay(); + break; + case "rebirth": + if(!IsDefined(level.start_point)) + introscreen_redact_delay( &"REBIRTH_MASON_INTROSCREEN_1", &"REBIRTH_MASON_INTROSCREEN_2", &"REBIRTH_MASON_INTROSCREEN_3", &"REBIRTH_MASON_INTROSCREEN_4", &"REBIRTH_MASON_INTROSCREEN_5" ); + else + { + if(level.start_point == "default" || level.start_point == "mason_stealth" || level.start_point == "mason_lab") + introscreen_redact_delay( &"REBIRTH_MASON_INTROSCREEN_1", &"REBIRTH_MASON_INTROSCREEN_2", &"REBIRTH_MASON_INTROSCREEN_3", &"REBIRTH_MASON_INTROSCREEN_4", &"REBIRTH_MASON_INTROSCREEN_5" ); + else + { + if(level.start_point != "btr_rail") + introscreen_redact_delay( &"REBIRTH_MASON_INTROSCREEN_1", &"REBIRTH_HUDSON_INTROSCREEN_2", &"REBIRTH_HUDSON_INTROSCREEN_3", &"REBIRTH_HUDSON_INTROSCREEN_4" ); + } + } + break; + case "river": + introscreen_redact_delay( &"RIVER_INTROSCREEN_1", &"RIVER_INTROSCREEN_3", &"RIVER_INTROSCREEN_4", &"RIVER_INTROSCREEN_5", undefined ); + break; + case "wmd_sr71": + introscreen_redact_delay( &"WMD_SR71_INTRO_LEVELNAME", &"WMD_SR71_INTRO_DATE", &"WMD_SR71_INTRO_EXTRA", &"WMD_SR71_INTRO_NAME", &"WMD_SR71_INTRO_LOCATION"); + break; + case "wmd": + introscreen_redact_delay( &"WMD_INTRO_LEVELNAME", &"WMD_INTRO_LOCATION", &"WMD_INTRO_EXTRA", &"WMD_INTRO_NAME", &"WMD_INTRO_DATE" ); + break; + case "underwaterbase": + introscreen_redact_delay( &"UNDERWATERBASE_INTROSCREEN_1", &"UNDERWATERBASE_INTROSCREEN_2", &"UNDERWATERBASE_INTROSCREEN_3", &"UNDERWATERBASE_INTROSCREEN_4", &"UNDERWATERBASE_INTROSCREEN_5" ); + break; + default: + wait( 0.05 ); + level notify( "finished final intro screen fadein" ); + wait( 0.05 ); + flag_set( "starting final intro screen fadeout" ); + wait( 0.05 ); + level notify( "controls_active" ); + wait( 0.05 ); + flag_set( "introscreen_complete" ); + break; + } +} +introscreen_create_redacted_line( string, redacted_line_time, start_rubout_time, rubout_time, color, type, scale, font ) +{ + index = level.introstring.size; + yPos = ( index * 30 ); + if (level.console) + { + yPos -= 90; + xPos = 0; + } + else + { + yPos -= 120; + xPos = 10; + } + align_x = "center"; + align_y = "middle"; + horz_align = "center"; + vert_align = "middle"; + if( !IsDefined( type ) ) + { + type = "lower_left"; + } + if( IsDefined( type ) ) + { + switch( type ) + { + case "lower_left": + yPos -= 30; + align_x = "left"; + align_y = "bottom"; + horz_align = "left"; + vert_align = "bottom"; + break; + } + } + if ( !isDefined( scale ) ) + { + if ( level.splitscreen && !level.hidef ) + fontScale = 2.5; + else + fontScale = 1.5; + } + else + fontScale = scale; + level.introstring[index] = NewHudElem(); + level.introstring[index].x = xPos; + level.introstring[index].y = yPos; + level.introstring[index].alignX = align_x; + level.introstring[index].alignY = align_y; + level.introstring[index].horzAlign = horz_align; + level.introstring[index].vertAlign = vert_align; + level.introstring[index].sort = 1; + level.introstring[index].foreground = true; + level.introstring[index].fontScale = fontScale; + level.introstring[index].color = (0,0,0); + level.introstring[index] SetText( string ); + level.introstring[index] SetRedactFX( redacted_line_time, 700, start_rubout_time, rubout_time ); + level.introstring[index].alpha = 0; + level.introstring[index] FadeOverTime( 1.2 ); + level.introstring[index].alpha = 1; + if( IsDefined( font ) ) + { + level.introstring[index].font = font; + } + if( IsDefined( color ) ) + { + level.introstring[index].color = color; + } + if( IsDefined( level.introstring_text_color ) ) + { + level.introstring[index].color = level.introstring_text_color; + } +} +introscreen_create_line( string, type, scale, font, color ) +{ + index = level.introstring.size; + yPos = ( index * 30 ); + if (level.console) + { + yPos -= 90; + xPos = 0; + } + else + { + yPos -= 120; + xPos = 10; + } + align_x = "center"; + align_y = "middle"; + horz_align = "center"; + vert_align = "middle"; + if( !IsDefined( type ) ) + { + type = "lower_left"; + } + if( IsDefined( type ) ) + { + switch( type ) + { + case "lower_left": + yPos -= 30; + align_x = "left"; + align_y = "bottom"; + horz_align = "left"; + vert_align = "bottom"; + break; + } + } + if ( !isDefined( scale ) ) + { + if ( level.splitscreen && !level.hidef ) + fontScale = 2.75; + else + fontScale = 1.75; + } + else + fontScale = scale; + level.introstring[index] = NewHudElem(); + level.introstring[index].x = xPos; + level.introstring[index].y = yPos; + level.introstring[index].alignX = align_x; + level.introstring[index].alignY = align_y; + level.introstring[index].horzAlign = horz_align; + level.introstring[index].vertAlign = vert_align; + level.introstring[index].sort = 1; + level.introstring[index].foreground = true; + level.introstring[index].fontScale = fontScale; + level.introstring[index] SetText( string ); + level.introstring[index].alpha = 0; + level.introstring[index] FadeOverTime( 1.2 ); + level.introstring[index].alpha = 1; + if( IsDefined( font ) ) + { + level.introstring[index].font = font; + } + if( IsDefined( color ) ) + { + level.introstring[index].color = color; + } +} +introscreen_fadeOutText() +{ + for( i = 0; i < level.introstring.size; i++ ) + { + level.introstring[i] FadeOverTime( 1.5 ); + level.introstring[i].alpha = 0; + } + wait( 1.5 ); + for( i = 0; i < level.introstring.size; i++ ) + { + level.introstring[i] Destroy(); + } + wait(0.25); +} +introscreen_redact_delay( string1, string2, string3, string4, string5, pausetime, totaltime, time_to_redact, delay_after_text, rubout_time, color ) +{ + if( IsDefined( level.custom_introscreen ) ) + { + [[level.custom_introscreen]]( string1, string2, string3, string4, string5 ); + return; + } + level.introblack = NewHudElem(); + level.introblack.x = 0; + level.introblack.y = 0; + level.introblack.horzAlign = "fullscreen"; + level.introblack.vertAlign = "fullscreen"; + level.introblack.foreground = true; + if( !isdefined( level.introscreen_shader ) ) + { + level.introblack SetShader( "white", 640, 480 ); + } + else if (level.introscreen_shader != "none") + { + level.introblack SetShader( level.introscreen_shader, 640, 480 ); + } + flag_wait( "all_players_connected" ); + if( !IsDefined( level.introscreen_dontfreezcontrols ) ) + freezecontrols_all( true ); + level._introscreen = true; + wait( 0.5 ); + level.introstring = []; + if( !IsDefined( pausetime ) ) + { + pausetime = 0.75; + } + if (!IsDefined(totaltime)) + { + totaltime = 14.25; + } + if (!IsDefined(time_to_redact)) + { + time_to_redact = ( 0.525 * totaltime); + } + if (!IsDefined(rubout_time)) + { + rubout_time = 1; + } + delay_between_redacts_min = 350; + delay_between_redacts_max = 500; + start_rubout_time = Int( time_to_redact*1000 ); + totalpausetime = 0; + rubout_time = Int(rubout_time*1000); + redacted_line_time = Int( 1000* (totaltime - totalpausetime) ); + if( IsDefined( string1 ) ) + { + level thread introscreen_create_redacted_line( string1, redacted_line_time, start_rubout_time, rubout_time, color ); + wait( pausetime ); + totalpausetime += pausetime; + } + if( IsDefined( string2 ) ) + { + start_rubout_time = Int ( (start_rubout_time + rubout_time) - (pausetime*1000) ) + RandomInt(delay_between_redacts_min,delay_between_redacts_max); + redacted_line_time = int( 1000* (totaltime - totalpausetime) ); + level thread introscreen_create_redacted_line( string2, redacted_line_time, start_rubout_time, rubout_time, color); + wait( pausetime ); + totalpausetime += pausetime; + } + if( IsDefined( string3 ) ) + { + start_rubout_time = Int ( (start_rubout_time + rubout_time) - (pausetime*1000) ) + RandomInt(delay_between_redacts_min,delay_between_redacts_max); + redacted_line_time = int( 1000* (totaltime - totalpausetime) ); + level thread introscreen_create_redacted_line( string3, redacted_line_time, start_rubout_time, rubout_time, color); + wait( pausetime ); + totalpausetime += pausetime; + } + if( IsDefined( string4 ) ) + { + start_rubout_time = Int ( (start_rubout_time + rubout_time) - (pausetime*1000) ) + RandomInt(delay_between_redacts_min,delay_between_redacts_max); + redacted_line_time = int( 1000* (totaltime - totalpausetime) ); + level thread introscreen_create_redacted_line( string4, redacted_line_time, start_rubout_time, rubout_time, color); + wait( pausetime ); + totalpausetime += pausetime; + } + if( IsDefined( string5 ) ) + { + start_rubout_time = Int ( (start_rubout_time + rubout_time) - (pausetime*1000) ) + RandomInt(delay_between_redacts_min,delay_between_redacts_max); + redacted_line_time = int( 1000* (totaltime - totalpausetime) ); + level thread introscreen_create_redacted_line( string5, redacted_line_time, start_rubout_time, rubout_time, color); + wait( pausetime ); + totalpausetime += pausetime; + } + level notify( "finished final intro screen fadein" ); + if( IsDefined( level.introscreen_waitontext_flag ) ) + { + level notify( "introscreen_blackscreen_waiting_on_flag" ); + flag_wait( level.introscreen_waitontext_flag ); + } + wait (totaltime - totalpausetime); + if (IsDefined(delay_after_text)) + { + wait delay_after_text; + } + else + { + wait 2.5; + } + if( IsDefined( level.introscreen_shader_fadeout_time ) ) + level.introblack FadeOverTime( level.introscreen_shader_fadeout_time ); + else + level.introblack FadeOverTime( 1.5 ); + level.introblack.alpha = 0; + flag_set( "starting final intro screen fadeout" ); + level thread freezecontrols_all( false, 0.75 ); + level._introscreen = false; + level notify( "controls_active" ); + introscreen_fadeOutText(); + flag_set( "introscreen_complete" ); +} +introscreen_delay( string1, string2, string3, string4, string5, pausetime1, pausetime2, timebeforefade, skipwait ) +{ + if( IsDefined( level.custom_introscreen ) ) + { + [[level.custom_introscreen]]( string1, string2, string3, string4, string5 ); + return; + } + level.introblack = NewHudElem(); + level.introblack.x = 0; + level.introblack.y = 0; + level.introblack.horzAlign = "fullscreen"; + level.introblack.vertAlign = "fullscreen"; + level.introblack.foreground = true; + if( !isdefined( level.introscreen_shader ) ) + { + level.introblack SetShader( "black", 640, 480 ); + } + else + { + level.introblack SetShader( level.introscreen_shader, 640, 480 ); + } + if(!IsDefined(skipwait)) + { + flag_wait( "all_players_connected" ); + } + if( !IsDefined( level.introscreen_dontfreezcontrols ) ) + freezecontrols_all( true ); + level._introscreen = true; + if(IsDefined(skipwait)) + { + flag_wait( "all_players_connected" ); + } + wait( 0.5 ); + level.introstring = []; + if( IsDefined( string1 ) ) + { + introscreen_create_line( string1 ); + } + if( IsDefined( pausetime1 ) ) + { + wait( pausetime1 ); + } + else + { + wait( 2 ); + } + if( IsDefined( string2 ) ) + { + introscreen_create_line( string2 ); + } + if( IsDefined( string3 ) ) + { + introscreen_create_line( string3 ); + } + if( IsDefined( string4 ) ) + { + if( IsDefined( pausetime2 ) ) + { + wait( pausetime2 ); + } + else + { + wait( 2 ); + } + introscreen_create_line( string4 ); + } + if( IsDefined( string5 ) ) + { + if( IsDefined( pausetime2 ) ) + { + wait( pausetime2 ); + } + else + { + wait( 2 ); + } + introscreen_create_line( string5 ); + } + level notify( "finished final intro screen fadein" ); + if( IsDefined( level.introscreen_waitontext_flag ) ) + { + level notify( "introscreen_blackscreen_waiting_on_flag" ); + flag_wait( level.introscreen_waitontext_flag ); + } + if( IsDefined( timebeforefade ) ) + { + wait( timebeforefade ); + } + else + { + wait( 3 ); + } + level.introblack FadeOverTime( 1.5 ); + level.introblack.alpha = 0; + flag_set( "starting final intro screen fadeout" ); + level thread freezecontrols_all( false, 0.75 ); + level._introscreen = false; + level notify( "controls_active" ); + introscreen_fadeOutText(); + flag_set( "introscreen_complete" ); +} +introscreen_player_connect() +{ + if( IsDefined(level._introscreen) && level._introscreen ) + { + self FreezeControls( true ); + } +} +introscreen_report_disconnected_clients() +{ + flag_wait("introscreen_complete"); + if(isdefined(level._disconnected_clients)) + { + for(i = 0; i < level._disconnected_clients.size; i ++) + { + ReportClientDisconnected(level._disconnected_clients[i]); + } + } +} +introscreen_clear_redacted_flags() +{ + flag_clear("introscreen_complete"); + flag_clear( "starting final intro screen fadeout" ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_jeep.gsc b/BO1/PC/ZM/maps/_jeep.gsc new file mode 100644 index 0000000..b9a8201 Binary files /dev/null and b/BO1/PC/ZM/maps/_jeep.gsc differ diff --git a/BO1/PC/ZM/maps/_laststand.gsc b/BO1/PC/ZM/maps/_laststand.gsc new file mode 100644 index 0000000..7f8e20c --- /dev/null +++ b/BO1/PC/ZM/maps/_laststand.gsc @@ -0,0 +1,693 @@ +#include maps\_utility; +#include maps\_hud_util; +init() +{ + if (level.script=="frontend") + return ; + PrecacheItem( "syrette_sp" ); + precachestring( &"GAME_BUTTON_TO_REVIVE_PLAYER" ); + precachestring( &"GAME_PLAYER_NEEDS_TO_BE_REVIVED" ); + precachestring( &"GAME_PLAYER_IS_REVIVING_YOU" ); + precachestring( &"GAME_REVIVING" ); + if( !IsDefined( level.laststandpistol ) ) + { + level.laststandpistol = "m1911"; + PrecacheItem( level.laststandpistol ); + } + if( !arcadeMode() ) + { + level thread revive_hud_think(); + } + level.primaryProgressBarX = 0; + level.primaryProgressBarY = 110; + level.primaryProgressBarHeight = 4; + level.primaryProgressBarWidth = 120; + if ( IsSplitScreen() ) + { + level.primaryProgressBarY = 280; + } + if( GetDvar( #"revive_trigger_radius" ) == "" ) + { + SetDvar( "revive_trigger_radius", "40" ); + } +} +player_is_in_laststand() +{ + return ( IsDefined( self.revivetrigger ) ); +} +player_num_in_laststand() +{ + num = 0; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] player_is_in_laststand() ) + { + num++; + } + } + return num; +} +player_all_players_in_laststand() +{ + return ( player_num_in_laststand() == get_players().size ); +} +player_any_player_in_laststand() +{ + return ( player_num_in_laststand() > 0 ); +} +PlayerLastStand( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) +{ + if( GetDvar( #"zombiemode" ) != "1" && sMeansOfDeath == "MOD_CRUSH" ) + { + if( self player_is_in_laststand() ) + { + self mission_failed_during_laststand( self ); + } + return; + } + if( self player_is_in_laststand() ) + { + return; + } + self.downs++; + self.stats["downs"] = self.downs; + dvarName = "player" + self GetEntityNumber() + "downs"; + setdvar( dvarName, self.downs ); + self AllowJump(false); + if( IsDefined( level.playerlaststand_func ) ) + { + [[level.playerlaststand_func]]( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ); + } + if ( !laststand_allowed( sWeapon, sMeansOfDeath, sHitLoc ) ) + { + self mission_failed_during_laststand( self ); + return; + } + if ( player_all_players_in_laststand() ) + { + self mission_failed_during_laststand( self ); + return; + } + if ( GetDvar( #"zombiemode" ) == "1" ) + { + self VisionSetLastStand( "zombie_last_stand", 1 ); + } + else + { + self VisionSetLastStand( "laststand", 1 ); + } + self.health = 1; + self revive_trigger_spawn(); + self laststand_disable_player_weapons(); + self laststand_give_pistol(); + self.ignoreme = true; + self thread laststand_bleedout( GetDvarFloat( #"player_lastStandBleedoutTime" ) ); + self notify( "player_downed" ); +} +laststand_allowed( sWeapon, sMeansOfDeath, sHitLoc ) +{ + if ( GetDvar( #"zombiemode" ) != "1" + && sMeansOfDeath != "MOD_PISTOL_BULLET" + && sMeansOfDeath != "MOD_RIFLE_BULLET" + && sMeansOfDeath != "MOD_HEAD_SHOT" + && sMeansOfDeath != "MOD_MELEE" + && sMeansOfDeath != "MOD_BAYONET" + && sMeansOfDeath != "MOD_GRENADE" + && sMeansOfDeath != "MOD_GRENADE_SPLASH" + && sMeansOfDeath != "MOD_PROJECTILE" + && sMeansOfDeath != "MOD_PROJECTILE_SPLASH" + && sMeansOfDeath != "MOD_EXPLOSIVE" + && sMeansOfDeath != "MOD_BURNED") + { + return false; + } + if( level.laststandpistol == "none" ) + { + return false; + } + return true; +} +laststand_disable_player_weapons() +{ + weaponInventory = self GetWeaponsList(); + self.lastActiveWeapon = self GetCurrentWeapon(); + self SetLastStandPrevWeap( self.lastActiveWeapon ); + self.laststandpistol = undefined; + self.hadpistol = false; + for( i = 0; i < weaponInventory.size; i++ ) + { + weapon = weaponInventory[i]; + if ( WeaponClass( weapon ) == "pistol" && !IsDefined( self.laststandpistol ) ) + { + self.laststandpistol = weapon; + self.hadpistol = true; + } + switch( weapon ) + { + case "syrette_sp": + case "zombie_perk_bottle_doubletap": + case "zombie_perk_bottle_revive": + case "zombie_perk_bottle_jugg": + case "zombie_perk_bottle_sleight": + self TakeWeapon( weapon ); + self.lastActiveWeapon = "none"; + continue; + } + } + if( IsDefined( self.hadpistol ) && self.hadpistol == true && IsDefined( level.zombie_last_stand_pistol_memory ) ) + { + self [ [ level.zombie_last_stand_pistol_memory ] ](); + } + if ( !IsDefined( self.laststandpistol ) ) + { + self.laststandpistol = level.laststandpistol; + } + self DisableWeaponCycling(); + if( GetDvar( #"zombiemode" ) != "1" ) + { + self DisableOffhandWeapons(); + } +} +laststand_enable_player_weapons() +{ + if ( !self.hadpistol ) + { + self TakeWeapon( self.laststandpistol ); + } + if( IsDefined( self.hadpistol ) && self.hadpistol == true && IsDefined( level.zombie_last_stand_ammo_return ) ) + { + [ [ level.zombie_last_stand_ammo_return ] ](); + } + self EnableWeaponCycling(); + self EnableOffhandWeapons(); + if( self.lastActiveWeapon != "none" && self.lastActiveWeapon != "mortar_round" && self.lastActiveWeapon != "mine_bouncing_betty" && self.lastActiveWeapon != "claymore_zm" ) + { + self SwitchToWeapon( self.lastActiveWeapon ); + } + else + { + primaryWeapons = self GetWeaponsListPrimaries(); + if( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 ) + { + self SwitchToWeapon( primaryWeapons[0] ); + } + } +} +laststand_clean_up_on_disconnect( playerBeingRevived, reviverGun ) +{ + reviveTrigger = playerBeingRevived.revivetrigger; + playerBeingRevived waittill("disconnect"); + if( isdefined( reviveTrigger ) ) + { + reviveTrigger delete(); + } + if( isdefined( self.reviveProgressBar ) ) + { + self.reviveProgressBar destroyElem(); + } + if( isdefined( self.reviveTextHud ) ) + { + self.reviveTextHud destroy(); + } + self revive_give_back_weapons( reviverGun ); +} +laststand_give_pistol() +{ + assert( IsDefined( self.laststandpistol ) ); + assert( self.laststandpistol != "none" ); + if( IsDefined( level.zombie_last_stand ) ) + { + [ [ level.zombie_last_stand ] ](); + } + else + { + self GiveWeapon( self.laststandpistol ); + self GiveMaxAmmo( self.laststandpistol ); + self SwitchToWeapon( self.laststandpistol ); + } +} +Laststand_Bleedout( delay ) +{ + self endon ("player_revived"); + self endon ("disconnect"); + setClientSysState("lsm", "1", self); + self.bleedout_time = delay; + while ( self.bleedout_time > Int( delay * 0.5 ) ) + { + self.bleedout_time -= 1; + wait( 1 ); + } + if ( GetDvar( #"zombiemode" ) == "1" ) + { + self VisionSetLastStand( "zombie_death", delay * 0.5 ); + } + else + { + self VisionSetLastStand( "death", delay * 0.5 ); + } + while ( self.bleedout_time > 0 ) + { + self.bleedout_time -= 1; + wait( 1 ); + } + while( self.revivetrigger.beingRevived == 1 ) + { + wait( 0.1 ); + } + setClientSysState("lsm", "0", self); + if (isdefined(level.is_zombie_level ) && level.is_zombie_level) + { + self [[level.player_becomes_zombie]](); + } + else if (isdefined(level.is_specops_level ) && level.is_specops_level) + { + self thread [[level.spawnSpectator]](); + } + else + { + self.ignoreme = false; + self mission_failed_during_laststand( self ); + } +} +revive_trigger_spawn() +{ + radius = GetDvarInt( #"revive_trigger_radius" ); + self.revivetrigger = spawn( "trigger_radius", self.origin, 0, radius, radius ); + self.revivetrigger setHintString( "" ); + self.revivetrigger setCursorHint( "HINT_NOICON" ); + self.revivetrigger EnableLinkTo(); + self.revivetrigger LinkTo( self ); + self.revivetrigger.beingRevived = 0; + self.revivetrigger.createtime = gettime(); + self thread revive_trigger_think(); +} +revive_trigger_think() +{ + self endon ( "disconnect" ); + self endon ( "zombified" ); + self endon ( "stop_revive_trigger" ); + while ( 1 ) + { + wait ( 0.1 ); + players = get_players(); + self.revivetrigger setHintString( "" ); + for ( i = 0; i < players.size; i++ ) + { + d = 0; + d = self depthinwater(); + if ( players[i] can_revive( self ) || d > 20) + { + self.revivetrigger setHintString( &"GAME_BUTTON_TO_REVIVE_PLAYER" ); + break; + } + } + for ( i = 0; i < players.size; i++ ) + { + reviver = players[i]; + if ( !reviver is_reviving( self ) ) + { + continue; + } + gun = reviver GetCurrentWeapon(); + assert( IsDefined( gun ) ); + assert( gun != "syrette_sp" ); + reviver GiveWeapon( "syrette_sp" ); + reviver SwitchToWeapon( "syrette_sp" ); + reviver SetWeaponAmmoStock( "syrette_sp", 1 ); + revive_success = reviver revive_do_revive( self, gun ); + reviver revive_give_back_weapons( gun ); + self AllowJump(true); + if ( revive_success ) + { + self thread revive_success( reviver ); + return; + } + } + } +} +revive_give_back_weapons( gun ) +{ + self TakeWeapon( "syrette_sp" ); + if ( self player_is_in_laststand() ) + { + return; + } + if ( gun != "none" && gun != "mine_bouncing_betty" && gun != "claymore_zm" ) + { + self SwitchToWeapon( gun ); + } + else + { + primaryWeapons = self GetWeaponsListPrimaries(); + if( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 ) + { + self SwitchToWeapon( primaryWeapons[0] ); + } + } +} +can_revive( revivee ) +{ + if ( !isAlive( self ) ) + { + return false; + } + if ( self player_is_in_laststand() ) + { + return false; + } + if( !isDefined( revivee.revivetrigger ) ) + { + return false; + } + if ( !self IsTouching( revivee.revivetrigger ) ) + { + return false; + } + if (revivee depthinwater() > 10) + { + return true; + } + if ( !self is_facing( revivee ) ) + { + return false; + } + if( !SightTracePassed( self.origin + ( 0, 0, 50 ), revivee.origin + ( 0, 0, 30 ), false, undefined ) ) + { + return false; + } + if(!bullettracepassed(self.origin + (0,0,50), revivee.origin + ( 0, 0, 30 ), false, undefined) ) + { + return false; + } + if( IsDefined( level.is_zombie_level ) && level.is_zombie_level ) + { + if( IsDefined( self.is_zombie ) && self.is_zombie ) + { + return false; + } + if( isDefined( level.can_revive ) ) + { + return [[level.can_revive]]( revivee ); + } + } + return true; +} +is_reviving( revivee ) +{ + return ( can_revive( revivee ) && self UseButtonPressed() ); +} +is_facing( facee ) +{ + orientation = self getPlayerAngles(); + forwardVec = anglesToForward( orientation ); + forwardVec2D = ( forwardVec[0], forwardVec[1], 0 ); + unitForwardVec2D = VectorNormalize( forwardVec2D ); + toFaceeVec = facee.origin - self.origin; + toFaceeVec2D = ( toFaceeVec[0], toFaceeVec[1], 0 ); + unitToFaceeVec2D = VectorNormalize( toFaceeVec2D ); + dotProduct = VectorDot( unitForwardVec2D, unitToFaceeVec2D ); + return ( dotProduct > 0.9 ); +} +revive_do_revive( playerBeingRevived, reviverGun ) +{ + assert( self is_reviving( playerBeingRevived ) ); + reviveTime = 3; + if ( self HasPerk( "specialty_quickrevive" ) ) + { + reviveTime = reviveTime / 2; + } + timer = 0; + revived = false; + playerBeingRevived.revivetrigger.beingRevived = 1; + playerBeingRevived.revive_hud setText( &"GAME_PLAYER_IS_REVIVING_YOU", self ); + playerBeingRevived revive_hud_show_n_fade( 3.0 ); + playerBeingRevived.revivetrigger setHintString( "" ); + playerBeingRevived startrevive( self ); + if( !isdefined(self.reviveProgressBar) ) + { + self.reviveProgressBar = self createPrimaryProgressBar(); + } + if( !isdefined(self.reviveTextHud) ) + { + self.reviveTextHud = newclientHudElem( self ); + } + self thread laststand_clean_up_on_disconnect( playerBeingRevived, reviverGun ); + self.reviveProgressBar updateBar( 0.01, 1 / reviveTime ); + self.reviveTextHud.alignX = "center"; + self.reviveTextHud.alignY = "middle"; + self.reviveTextHud.horzAlign = "center"; + self.reviveTextHud.vertAlign = "bottom"; + self.reviveTextHud.y = -113; + if ( IsSplitScreen() ) + { + self.reviveTextHud.y = -107; + } + self.reviveTextHud.foreground = true; + self.reviveTextHud.font = "default"; + self.reviveTextHud.fontScale = 1.8; + self.reviveTextHud.alpha = 1; + self.reviveTextHud.color = ( 1.0, 1.0, 1.0 ); + self.reviveTextHud setText( &"GAME_REVIVING" ); + while( self is_reviving( playerBeingRevived ) ) + { + wait( 0.05 ); + timer += 0.05; + if ( self player_is_in_laststand() ) + { + break; + } + if( IsDefined( playerBeingRevived.revivetrigger.auto_revive ) && playerBeingRevived.revivetrigger.auto_revive == true ) + { + break; + } + if( timer >= reviveTime) + { + revived = true; + break; + } + } + if( isdefined( self.reviveProgressBar ) ) + { + self.reviveProgressBar destroyElem(); + } + if( isdefined( self.reviveTextHud ) ) + { + self.reviveTextHud destroy(); + } + if( IsDefined( playerBeingRevived.revivetrigger.auto_revive ) && playerBeingRevived.revivetrigger.auto_revive == true ) + { + } + else if( !revived ) + { + playerBeingRevived stoprevive( self ); + } + playerBeingRevived.revivetrigger setHintString( &"GAME_BUTTON_TO_REVIVE_PLAYER" ); + playerBeingRevived.revivetrigger.beingRevived = 0; + return revived; +} +say_revived_vo() +{ + if( GetDvar( #"zombiemode" ) == "1" || IsSubStr( level.script, "nazi_zombie_" ) ) + { + players = get_players(); + for(i=0; i players[i].revivetrigger.createtime ) + { + playerToRevive = players[i]; + } + } + if( isDefined( playerToRevive ) ) + { + for( i = 0; i < players.size; i++ ) + { + if( players[i] player_is_in_laststand() ) + { + continue; + } + if( GetDvar( #"g_gametype" ) == "vs" ) + { + if( players[i].team != playerToRevive.team ) + { + continue; + } + } + players[i] thread fadeReviveMessageOver( playerToRevive, 3.0 ); + } + playerToRevive.revivetrigger.createtime = undefined; + wait( 3.5 ); + } + } +} +fadeReviveMessageOver( playerToRevive, time ) +{ + revive_hud_show(); + self.revive_hud setText( &"GAME_PLAYER_NEEDS_TO_BE_REVIVED", playerToRevive ); + self.revive_hud fadeOverTime( time ); + self.revive_hud.alpha = 0; +} +revive_hud_show() +{ + assert( IsDefined( self ) ); + assert( IsDefined( self.revive_hud ) ); + self.revive_hud.alpha = 1; +} +revive_hud_show_n_fade(time) +{ + revive_hud_show(); + self.revive_hud fadeOverTime( time ); + self.revive_hud.alpha = 0; +} +drawcylinder(pos, rad, height) +{ + currad = rad; + curheight = height; + for (r = 0; r < 20; r++) + { + theta = r / 20 * 360; + theta2 = (r + 1) / 20 * 360; + line(pos + (cos(theta) * currad, sin(theta) * currad, 0), pos + (cos(theta2) * currad, sin(theta2) * currad, 0)); + line(pos + (cos(theta) * currad, sin(theta) * currad, curheight), pos + (cos(theta2) * currad, sin(theta2) * currad, curheight)); + line(pos + (cos(theta) * currad, sin(theta) * currad, 0), pos + (cos(theta) * currad, sin(theta) * currad, curheight)); + } +} +mission_failed_during_laststand( dead_player ) +{ + if( IsDefined( level.no_laststandmissionfail ) && level.no_laststandmissionfail ) + { + return; + } + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( isDefined( players[i] ) ) + { + if( players[i] == self ) + { + println( "Player #"+i+" is dead" ); + } + else + { + println( "Player #"+i+" is alive" ); + } + } + } + missionfailed(); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_lights.gsc b/BO1/PC/ZM/maps/_lights.gsc new file mode 100644 index 0000000..9976b9c Binary files /dev/null and b/BO1/PC/ZM/maps/_lights.gsc differ diff --git a/BO1/PC/ZM/maps/_load_common.gsc b/BO1/PC/ZM/maps/_load_common.gsc new file mode 100644 index 0000000..e1bab7f --- /dev/null +++ b/BO1/PC/ZM/maps/_load_common.gsc @@ -0,0 +1,1897 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_hud_util; +#using_animtree("generic_human"); +level_notify_listener() +{ + while(1) + { + val = GetDvar( #"level_notify"); + if(val != "") + { + level notify(val); + SetDvar("level_notify", ""); + } + wait(0.2); + } +} +client_notify_listener() +{ + while(1) + { + val = GetDvar( #"client_notify"); + if(val != "") + { + ClientNotify(val); + SetDvar("client_notify", ""); + } + wait(0.2); + } +} +save_game_on_notify() +{ + while (1) + { + level waittill("save"); + SaveGame("debug_save"); + } +} +onFirstPlayerReady() +{ + level waittill( "first_player_ready", player ); + println( "*********************First player connected to game." ); +} +set_early_level() +{ + level.early_level = []; + level.early_level["cuba"] = true; + level.early_level["vorkuta"] = true; +} +setup_simple_primary_lights() +{ + flickering_lights = GetEntArray( "generic_flickering", "targetname" ); + pulsing_lights = GetEntArray( "generic_pulsing", "targetname" ); + double_strobe = GetEntArray( "generic_double_strobe", "targetname" ); + fire_flickers = GetEntArray( "fire_flicker", "targetname" ); + array_thread( flickering_lights, maps\_lights::generic_flickering ); + array_thread( pulsing_lights, maps\_lights::generic_pulsing ); + array_thread( double_strobe, maps\_lights::generic_double_strobe ); + array_thread( fire_flickers, maps\_lights::fire_flicker ); +} +weapon_ammo() +{ + ents = GetEntArray(); + for( i = 0; i < ents.size; i ++ ) + { + if( ( IsDefined( ents[i].classname ) ) &&( GetSubStr( ents[i].classname, 0, 7 ) == "weapon_" ) ) + { + weap = ents[i]; + change_ammo = false; + clip = undefined; + extra = undefined; + if( IsDefined( weap.script_ammo_clip ) ) + { + clip = weap.script_ammo_clip; + change_ammo = true; + } + if( IsDefined( weap.script_ammo_extra ) ) + { + extra = weap.script_ammo_extra; + change_ammo = true; + } + if( change_ammo ) + { + if( !IsDefined( clip ) ) + { + assertmsg( "weapon: " + weap.classname + " " + weap.origin + " sets script_ammo_extra but not script_ammo_clip" ); + } + if( !IsDefined( extra ) ) + { + assertmsg( "weapon: " + weap.classname + " " + weap.origin + " sets script_ammo_clip but not script_ammo_extra" ); + } + weap ItemWeaponSetAmmo( clip, extra ); + weap ItemWeaponSetAmmo( clip, extra, 1 ); + } + } + } +} +trigger_group() +{ + self thread trigger_group_remove(); + level endon( "trigger_group_" + self.script_trigger_group ); + self waittill( "trigger" ); + level notify( "trigger_group_" + self.script_trigger_group, self ); +} +trigger_group_remove() +{ + level waittill( "trigger_group_" + self.script_trigger_group, trigger ); + if( self != trigger ) + { + self Delete(); + } +} +exploder_load( trigger ) +{ + level endon( "killexplodertridgers"+trigger.script_exploder ); + trigger waittill( "trigger" ); + if( IsDefined( trigger.script_chance ) && RandomFloat( 1 )>trigger.script_chance ) + { + if( IsDefined( trigger.script_delay ) ) + { + wait( trigger.script_delay ); + } + else + { + wait( 4 ); + } + level thread exploder_load( trigger ); + return; + } + exploder( trigger.script_exploder ); + level notify( "killexplodertridgers"+trigger.script_exploder ); +} +setup_traversals() +{ + potential_traverse_nodes = GetAllNodes(); + for (i = 0; i < potential_traverse_nodes.size; i++) + { + node = potential_traverse_nodes[i]; + if (node.type == "Begin") + { + node call_overloaded_func( "animscripts\traverse\shared", "init_traverse" ); + } + } +} +badplace_think( badplace ) +{ + if( !IsDefined( level.badPlaces ) ) + { + level.badPlaces = 0; + } + level.badPlaces++; + Badplace_Cylinder( "badplace" + level.badPlaces, -1, badplace.origin, badplace.radius, 1024 ); +} +setupExploders() +{ + level.exploders = []; + ents = GetEntArray( "script_brushmodel", "classname" ); + smodels = GetEntArray( "script_model", "classname" ); + for( i = 0; i < smodels.size; i++ ) + { + ents[ents.size] = smodels[i]; + } + for( i = 0; i < ents.size; i++ ) + { + if( IsDefined( ents[i].script_prefab_exploder ) ) + { + ents[i].script_exploder = ents[i].script_prefab_exploder; + } + if( IsDefined( ents[i].script_exploder ) ) + { + if( ents[i].script_exploder < 10000 ) + { + level.exploders[ents[i].script_exploder] = true; + } + if( ( ents[i].model == "fx" ) &&( ( !IsDefined( ents[i].targetname ) ) ||( ents[i].targetname != "exploderchunk" ) ) ) + { + ents[i] Hide(); + } + else if( ( IsDefined( ents[i].targetname ) ) &&( ents[i].targetname == "exploder" ) ) + { + ents[i] Hide(); + ents[i] NotSolid(); + if( IsDefined( ents[i].script_disconnectpaths ) ) + ents[i] ConnectPaths(); + } + else if( ( IsDefined( ents[i].targetname ) ) &&( ents[i].targetname == "exploderchunk" ) ) + { + ents[i] Hide(); + ents[i] NotSolid(); + if( ents[i] has_spawnflag(level.SPAWNFLAG_MODEL_DYNAMIC_PATH)) + { + ents[i] ConnectPaths(); + } + } + } + } + script_exploders = []; + potentialExploders = GetEntArray( "script_brushmodel", "classname" ); + for( i = 0; i < potentialExploders.size; i++ ) + { + if( IsDefined( potentialExploders[i].script_prefab_exploder ) ) + { + potentialExploders[i].script_exploder = potentialExploders[i].script_prefab_exploder; + } + if( IsDefined( potentialExploders[i].script_exploder ) ) + { + script_exploders[script_exploders.size] = potentialExploders[i]; + } + } + println("Server : Potential exploders from brushmodels " + potentialExploders.size); + potentialExploders = GetEntArray( "script_model", "classname" ); + for( i = 0; i < potentialExploders.size; i++ ) + { + if( IsDefined( potentialExploders[i].script_prefab_exploder ) ) + { + potentialExploders[i].script_exploder = potentialExploders[i].script_prefab_exploder; + } + if( IsDefined( potentialExploders[i].script_exploder ) ) + { + script_exploders[script_exploders.size] = potentialExploders[i]; + } + } + println("Server : Potential exploders from script_model " + potentialExploders.size); + potentialExploders = GetEntArray( "item_health", "classname" ); + for( i = 0; i < potentialExploders.size; i++ ) + { + if( IsDefined( potentialExploders[i].script_prefab_exploder ) ) + { + potentialExploders[i].script_exploder = potentialExploders[i].script_prefab_exploder; + } + if( IsDefined( potentialExploders[i].script_exploder ) ) + { + script_exploders[script_exploders.size] = potentialExploders[i]; + } + } + println("Server : Potential exploders from item_health " + potentialExploders.size); + if( !IsDefined( level.createFXent ) ) + { + level.createFXent = []; + } + acceptableTargetnames = []; + acceptableTargetnames["exploderchunk visible"] = true; + acceptableTargetnames["exploderchunk"] = true; + acceptableTargetnames["exploder"] = true; + exploderId = 1; + for( i = 0; i < script_exploders.size; i++ ) + { + exploder = script_exploders[i]; + ent = createExploder( exploder.script_fxid ); + ent.v = []; + ent.v["origin"] = exploder.origin; + ent.v["angles"] = exploder.angles; + ent.v["delay"] = exploder.script_delay; + ent.v["firefx"] = exploder.script_firefx; + ent.v["firefxdelay"] = exploder.script_firefxdelay; + ent.v["firefxsound"] = exploder.script_firefxsound; + ent.v["firefxtimeout"] = exploder.script_firefxtimeout; + ent.v["trailfx"] = exploder.script_trailfx; + ent.v["trailfxtag"] = exploder.script_trailfxtag; + ent.v["trailfxdelay"] = exploder.script_trailfxdelay; + ent.v["trailfxsound"] = exploder.script_trailfxsound; + ent.v["trailfxtimeout"] = exploder.script_firefxtimeout; + ent.v["earthquake"] = exploder.script_earthquake; + ent.v["rumble"] = exploder.script_rumble; + ent.v["damage"] = exploder.script_damage; + ent.v["damage_radius"] = exploder.script_radius; + ent.v["repeat"] = exploder.script_repeat; + ent.v["delay_min"] = exploder.script_delay_min; + ent.v["delay_max"] = exploder.script_delay_max; + ent.v["target"] = exploder.target; + ent.v["ender"] = exploder.script_ender; + ent.v["physics"] = exploder.script_physics; + ent.v["type"] = "exploder"; + ent.v["exploder_server"] = exploder.script_exploder_server; + if( !IsDefined( exploder.script_fxid ) ) + { + ent.v["fxid"] = "No FX"; + } + else + { + ent.v["fxid"] = exploder.script_fxid; + } + ent.v["exploder"] = exploder.script_exploder; + assertex( IsDefined( exploder.script_exploder ), "Exploder at origin " + exploder.origin + " has no script_exploder" ); + if( !IsDefined( ent.v["delay"] ) ) + { + ent.v["delay"] = 0; + } + if( IsDefined( exploder.script_sound ) ) + { + ent.v["soundalias"] = exploder.script_sound; + } + else if( ent.v["fxid"] != "No FX" ) + { + if( IsDefined( level.scr_sound ) && IsDefined( level.scr_sound[ent.v["fxid"]] ) ) + { + ent.v["soundalias"] = level.scr_sound[ent.v["fxid"]]; + } + } + exploder_id_set = false; + if( IsDefined( exploder.target ) ) + { + temp_ent = GetEnt( ent.v["target"], "targetname" ); + if( IsDefined( temp_ent ) ) + { + exploder_id_set = true; + temp_ent setexploderid(exploderId); + exploderId++; + org = temp_ent.origin; + temp_ent transmittargetname(); + } + else + { + temp_ent = GetStruct( ent.v["target"], "targetname" ); + org = temp_ent.origin; + exploderId++; + } + ent.v["angles"] = VectorToAngles( org - ent.v["origin"] ); + } + if( exploder.classname == "script_brushmodel" || IsDefined( exploder.model ) ) + { + if(exploder_id_set == false) + { + exploder setexploderid(exploderId); + exploderId++; + exploder_id_set = true; + } + ent.model = exploder; + ent.model.disconnect_paths = exploder.script_disconnectpaths; + } + if( IsDefined( exploder.targetname ) && IsDefined( acceptableTargetnames[exploder.targetname] ) ) + { + ent.v["exploder_type"] = exploder.targetname; + } + else + { + ent.v["exploder_type"] = "normal"; + } + ent maps\_createfx::post_entity_creation_function(); + } + for(i = 0; i < level.createFXent.size;i ++ ) + { + ent = level.createFXent[i]; + if(ent.v["type"] != "exploder") + continue; + ent.v["exploder_id"] = getExploderId( ent ); + } + reportExploderIds(); +} +playerDamageRumble() +{ + while( true ) + { + self waittill( "damage", amount ); + if( IsDefined( self.specialDamage ) ) + { + continue; + } + self PlayRumbleOnEntity( "damage_heavy" ); + } +} +map_is_early_in_the_game() +{ + return level.early_level[level.script]; +} +player_throwgrenade_timer() +{ + self endon( "death" ); + self endon( "disconnect" ); + self.lastgrenadetime = 0; + while( 1 ) + { + while( ! self IsThroWingGrenade() ) + { + wait( .05 ); + } + self.lastgrenadetime = GetTime(); + while( self IsThroWingGrenade() ) + { + wait( .05 ); + } + } +} +player_special_death_hint() +{ + self endon( "disconnect" ); + self thread player_throwgrenade_timer(); + if( isSplitScreen() || coopGame() ) + { + return; + } + self waittill( "death", attacker, cause, weaponName, inflicter ); + if( cause != "MOD_GRENADE" && cause != "MOD_GRENADE_SPLASH" && cause != "MOD_SUICIDE" && cause != "MOD_EXPLOSIVE" && cause != "MOD_PROJECTILE" && cause != "MOD_PROJECTILE_SPLASH" ) + { + return; + } + if ( level.gameskill >= 2 ) + { + if ( !map_is_early_in_the_game() ) + return; + } + if( cause == "MOD_SUICIDE" ) + { + TimeSinceThrown = GetTime() - self.lastgrenadetime; + if ( ( TimeSinceThrown ) < 3.5 * 1000 || ( TimeSinceThrown ) > 4.5 * 1000 ) + return; + level notify( "new_quote_string" ); + SetDvar( "ui_deadquote", ""); + self thread grenade_death_text_hudelement( &"SCRIPT_GRENADE_SUICIDE_LINE1", &"SCRIPT_GRENADE_SUICIDE_LINE2" ); + return; + } + if( cause == "MOD_EXPLOSIVE" ) + { + if( IsDefined( attacker ) && ( attacker.classname == "script_vehicle" || IsDefined( attacker.create_fake_vehicle_damage ) ) ) + { + level notify( "new_quote_string" ); + SetDvar( "ui_deadquote", "@SCRIPT_EXPLODING_VEHICLE_DEATH" ); + thread special_death_indicator_hudelement( "hud_burningcaricon", 96, 96 ); + return; + } + if( IsDefined( inflicter ) && IsDefined( inflicter.destructibledef ) ) + { + if( IsSubStr( inflicter.destructibledef, "barrel_explosive" ) ) + { + level notify( "new_quote_string" ); + SetDvar( "ui_deadquote", "@SCRIPT_EXPLODING_BARREL_DEATH" ); + thread special_death_indicator_hudelement( "hud_burningbarrelicon", 64, 64 ); + return; + } + if( IsDefined( inflicter.destructiblecar ) && inflicter.destructiblecar ) + { + level notify( "new_quote_string" ); + SetDvar( "ui_deadquote", "@SCRIPT_EXPLODING_VEHICLE_DEATH" ); + thread special_death_indicator_hudelement( "hud_burningcaricon", 96, 96 ); + return; + } + } + } + if( cause == "MOD_GRENADE" || cause == "MOD_GRENADE_SPLASH" ) + { + if( IsDefined( weaponName ) && (!IsWeaponDetonationTimed( weaponName ) || WeaponType( weaponName) != "grenade") ) + { + return; + } + level notify( "new_quote_string" ); + if (IsDefined( weaponName ) && (weaponName == "explosive_bolt_sp")) + { + SetDvar( "ui_deadquote", "@SCRIPT_EXPLOSIVE_BOLT_DEATH" ); + thread explosive_arrow_death_indicator_hudelement(); + } + else + { + SetDvar( "ui_deadquote", "@SCRIPT_GRENADE_DEATH" ); + thread grenade_death_indicator_hudelement(); + } + return; + } +} +grenade_death_text_hudelement( textLine1, textLine2 ) +{ + self.failingMission = true; + SetDvar( "ui_deadquote", "" ); + wait( .5 ); + fontElem = NewHudElem(); + fontElem.elemType = "font"; + fontElem.font = "default"; + fontElem.fontscale = 1.5; + fontElem.x = 0; + fontElem.y = -60; + if(IsDefined(level.zombiemode) && level.zombiemode) + { + fontElem.y = - 65; + } + fontElem.alignX = "center"; + fontElem.alignY = "middle"; + fontElem.horzAlign = "center"; + fontElem.vertAlign = "middle"; + fontElem SetText( textLine1 ); + fontElem.foreground = true; + fontElem.alpha = 0; + fontElem FadeOverTime( 1 ); + fontElem.alpha = 1; + fontElem.hidewheninmenu = true; + if( IsDefined( textLine2 ) ) + { + fontElem = NewHudElem(); + fontElem.elemType = "font"; + fontElem.font = "default"; + fontElem.fontscale = 1.5; + fontElem.x = 0; + fontElem.y = -60 + level.fontHeight * fontElem.fontscale; + if(IsDefined(level.zombiemode) && level.zombiemode) + { + fontElem.y = -60 + level.fontHeight * fontElem.fontscale; + } + fontElem.alignX = "center"; + fontElem.alignY = "middle"; + fontElem.horzAlign = "center"; + fontElem.vertAlign = "middle"; + fontElem SetText( textLine2 ); + fontElem.foreground = true; + fontElem.alpha = 0; + fontElem FadeOverTime( 1 ); + fontElem.alpha = 1; + fontElem.hidewheninmenu = true; + } +} +grenade_death_indicator_hudelement() +{ + self endon( "disconnect" ); + wait( .5 ); + overlayIcon = NewClientHudElem( self ); + overlayIcon.x = 0; + overlayIcon.y = 68; + overlayIcon SetShader( "hud_grenadeicon", 50, 50 ); + overlayIcon.alignX = "center"; + overlayIcon.alignY = "middle"; + overlayIcon.horzAlign = "center"; + overlayIcon.vertAlign = "middle"; + overlayIcon.foreground = true; + overlayIcon.alpha = 0; + overlayIcon FadeOverTime( 1 ); + overlayIcon.alpha = 1; + overlayIcon.hidewheninmenu = true; + overlayPointer = NewClientHudElem( self ); + overlayPointer.x = 0; + overlayPointer.y = 25; + overlayPointer SetShader( "hud_grenadepointer", 50, 25 ); + overlayPointer.alignX = "center"; + overlayPointer.alignY = "middle"; + overlayPointer.horzAlign = "center"; + overlayPointer.vertAlign = "middle"; + overlayPointer.foreground = true; + overlayPointer.alpha = 0; + overlayPointer FadeOverTime( 1 ); + overlayPointer.alpha = 1; + overlayPointer.hidewheninmenu = true; + self thread grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer ); +} +explosive_arrow_death_indicator_hudelement() +{ + self endon( "disconnect" ); + wait( .5 ); + overlayIcon = NewClientHudElem( self ); + overlayIcon.x = 0; + overlayIcon.y = 68; + overlayIcon SetShader( "hud_explosive_arrow_icon", 50, 50 ); + overlayIcon.alignX = "center"; + overlayIcon.alignY = "middle"; + overlayIcon.horzAlign = "center"; + overlayIcon.vertAlign = "middle"; + overlayIcon.foreground = true; + overlayIcon.alpha = 0; + overlayIcon FadeOverTime( 1 ); + overlayIcon.alpha = 1; + overlayIcon.hidewheninmenu = true; + overlayPointer = NewClientHudElem( self ); + overlayPointer.x = 0; + overlayPointer.y = 25; + overlayPointer SetShader( "hud_grenadepointer", 50, 25 ); + overlayPointer.alignX = "center"; + overlayPointer.alignY = "middle"; + overlayPointer.horzAlign = "center"; + overlayPointer.vertAlign = "middle"; + overlayPointer.foreground = true; + overlayPointer.alpha = 0; + overlayPointer FadeOverTime( 1 ); + overlayPointer.alpha = 1; + overlayPointer.hidewheninmenu = true; + self thread grenade_death_indicator_hudelement_cleanup( overlayIcon, overlayPointer ); +} +grenade_death_indicator_hudelement_cleanup( hudElemIcon, hudElemPointer ) +{ + self endon( "disconnect" ); + self waittill( "spawned" ); + hudElemIcon Destroy(); + hudElemPointer Destroy(); +} +special_death_indicator_hudelement( shader, iWidth, iHeight, fDelay, x, y ) +{ + if( !IsDefined( fDelay ) ) + { + fDelay = 0.5; + } + wait( fDelay ); + overlay = NewClientHudElem( self ); + if( IsDefined( x ) ) + overlay.x = x; + else + overlay.x = 0; + if( IsDefined( y ) ) + overlay.y = y; + else + overlay.y = 40; + overlay SetShader( shader, iWidth, iHeight ); + overlay.alignX = "center"; + overlay.alignY = "middle"; + overlay.horzAlign = "center"; + overlay.vertAlign = "middle"; + overlay.foreground = true; + overlay.alpha = 0; + overlay FadeOverTime( 1 ); + overlay.alpha = 1; + overlay.hidewheninmenu = true; + self thread special_death_death_indicator_hudelement_cleanup( overlay ); +} +special_death_death_indicator_hudelement_cleanup( overlay ) +{ + self endon( "disconnect" ); + self waittill( "spawned" ); + overlay Destroy(); +} +bcTrigger( trigger ) +{ + realTrigger = undefined; + if( IsDefined( trigger.target ) ) + { + targetEnts = GetEntArray( trigger.target, "targetname" ); + if( IsSubStr( targetEnts[0].classname, "trigger" ) ) + { + realTrigger = targetEnts[0]; + } + } + if( IsDefined( realTrigger ) ) + { + realTrigger waittill( "trigger", other ); + } + else + { + trigger waittill( "trigger", other ); + } + soldier = undefined; + if( IsDefined( realTrigger ) ) + { + player_touching = get_player_touching( trigger ); + if( other.team == "axis" && IsDefined( player_touching ) ) + { + soldier = get_closest_ai( player_touching GetOrigin(), "allies" ); + if( Distance( soldier.origin, player_touching GetOrigin() ) > 512 ) + { + return; + } + } + else if( other.team == "allies" ) + { + soldiers = GetAiArray( "axis" ); + for( index = 0; index < soldiers.size; index++ ) + { + if( soldiers[index] IsTouching( trigger ) ) + { + soldier = soldiers[index]; + } + } + } + } + else if( IsPlayer( other ) ) + { + soldier = get_closest_ai( other GetOrigin(), "allies" ); + if( Distance( soldier.origin, other GetOrigin() ) > 512 ) + { + return; + } + } + else + { + soldier = other; + } + if( !IsDefined( soldier ) ) + { + return; + } + soldier custom_battlechatter( trigger.script_bctrigger ); +} +waterThink() +{ + assert( IsDefined( self.target ) ); + targeted = GetEnt( self.target, "targetname" ); + assert( IsDefined( targeted ) ); + waterHeight = targeted.origin[2]; + targeted = undefined; + level.depth_allow_prone = 8; + level.depth_allow_crouch = 33; + level.depth_allow_stand = 50; + for( ;; ) + { + wait( 0.05 ); + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( players[i].inWater ) + { + players[i] AllowProne( true ); + players[i] AllowCrouch( true ); + players[i] AllowStand( true ); + thread waterThink_rampSpeed( level.default_run_speed ); + } + } + self waittill( "trigger", other ); + if( !IsPlayer( other ) ) + { + continue; + } + while( 1 ) + { + players = get_players(); + players_in_water_count = 0; + for( i = 0; i < players.size; i++ ) + { + if( players[i] IsTouching( self ) ) + { + players_in_water_count++; + players[i].inWater = true; + playerOrg = players[i] GetOrigin(); + d = ( playerOrg[2] - waterHeight ); + if( d > 0 ) + { + continue; + } + newSpeed = Int( level.default_run_speed - abs( d * 5 ) ); + if( newSpeed < 50 ) + { + newSpeed = 50; + } + assert( newSpeed <= 190 ); + thread waterThink_rampSpeed( newSpeed ); + if( abs( d ) > level.depth_allow_crouch ) + { + players[i] AllowCrouch( false ); + } + else + { + players[i] AllowCrouch( true ); + } + if( abs( d ) > level.depth_allow_prone ) + { + players[i] AllowProne( false ); + } + else + { + players[i] AllowProne( true ); + } + } + else + { + if( players[i].inWater ) + { + players[i].inWater = false; + } + } + } + if( players_in_water_count == 0 ) + { + break; + } + wait( 0.5 ); + } + wait( 0.05 ); + } + prof_end( "water_stance_controller" ); +} +waterThink_rampSpeed( newSpeed ) +{ + level notify( "ramping_water_movement_speed" ); + level endon( "ramping_water_movement_speed" ); +} +massNodeInitFunctions() +{ + nodes = GetAllNodes(); + thread maps\_mgturret::auto_mgTurretLink( nodes ); + thread maps\_mgturret::saw_mgTurretLink( nodes ); + thread maps\_colors::init_color_grouping( nodes ); +} +trigger_unlock( trigger ) +{ + noteworthy = "not_set"; + if( IsDefined( trigger.script_noteworthy ) ) + { + noteworthy = trigger.script_noteworthy; + } + target_triggers = GetEntArray( trigger.target, "targetname" ); + trigger thread trigger_unlock_death( trigger.target ); + for( ;; ) + { + array_thread( target_triggers, ::trigger_off ); + trigger waittill( "trigger" ); + array_thread( target_triggers, ::trigger_on ); + wait_for_an_unlocked_trigger( target_triggers, noteworthy ); + array_notify( target_triggers, "relock" ); + } +} +trigger_unlock_death( target ) +{ + self waittill( "death" ); + target_triggers = GetEntArray( target, "targetname" ); + array_thread( target_triggers, ::trigger_off ); +} +wait_for_an_unlocked_trigger( triggers, noteworthy ) +{ + level endon( "unlocked_trigger_hit" + noteworthy ); + ent = SpawnStruct(); + for( i = 0; i < triggers.size; i++ ) + { + triggers[i] thread report_trigger( ent, noteworthy ); + } + ent waittill( "trigger" ); + level notify( "unlocked_trigger_hit" + noteworthy ); +} +report_trigger( ent, noteworthy ) +{ + self endon( "relock" ); + level endon( "unlocked_trigger_hit" + noteworthy ); + self waittill( "trigger" ); + ent notify( "trigger" ); +} +get_trigger_targs() +{ + triggers = []; + target_origin = undefined; + if( IsDefined( self.target ) ) + { + targets = GetEntArray( self.target, "targetname" ); + orgs = []; + for( i = 0; i < targets.size; i ++ ) + { + if( targets[i].classname == "script_origin" ) + { + orgs[orgs.size] = targets[i]; + } + if( IsSubStr( targets[i].classname, "trigger" ) ) + { + triggers[triggers.size] = targets[i]; + } + } + assertex( orgs.size < 2, "Trigger at " + self.origin + " targets multiple script origins" ); + if( orgs.size == 1 ) + { + target_origin = orgs[0].origin; + orgs[0] Delete(); + } + } + assertex( IsDefined( target_origin ), self.targetname + " at " + self.origin + " has no target origin." ); + array = []; + array["triggers"] = triggers; + array["target_origin"] = target_origin; + return array; +} +trigger_lookat( trigger ) +{ + trigger_lookat_think( trigger, true ); +} +trigger_looking( trigger ) +{ + trigger_lookat_think( trigger, false ); +} +trigger_lookat_think( trigger, endOnFlag ) +{ + dot = 0.78; + if( IsDefined( trigger.script_dot ) ) + { + dot = trigger.script_dot; + } + array = trigger get_trigger_targs(); + triggers = array["triggers"]; + target_origin = array["target_origin"]; + has_flag = IsDefined( trigger.script_flag ) || IsDefined( trigger.script_noteworthy ); + flagName = undefined; + if( has_flag ) + { + flagName = trigger get_trigger_flag(); + if( !IsDefined( level.flag[flagName] ) ) + { + flag_init( flagName ); + } + } + else + { + if( !triggers.size ) + { + assertex( IsDefined( trigger.script_flag ) || IsDefined( trigger.script_noteworthy ), "Trigger_lookat at " + trigger.origin + " has no script_flag! The script_flag is used as a flag that gets set when the trigger is activated." ); + } + } + if( endOnFlag && has_flag ) + { + level endon( flagName ); + } + trigger endon( "death" ); + for( ;; ) + { + if( has_flag ) + { + flag_clear( flagName ); + } + trigger waittill( "trigger", other ); + assertex( IsPlayer( other ), "trigger_lookat currently only supports looking from the player" ); + if( !IsPlayer( other ) ) + { + continue; + } + while( other IsTouching( trigger ) ) + { + if( !SightTracePassed( other GetEye(), target_origin, false, undefined ) ) + { + if( has_flag ) + { + flag_clear( flagName ); + } + wait( 0.5 ); + continue; + } + normal = VectorNormalize( target_origin - other.origin ); + player_angles = other GetPlayerAngles(); + player_forward = AnglesToForward( player_angles ); + dot = VectorDot( player_forward, normal ); + if( dot >= 0.78 ) + { + if( has_flag ) + { + flag_set( flagName ); + } + array_thread( triggers, ::send_notify, "trigger" ); + if( endOnFlag ) + { + return; + } + wait( 2 ); + } + else + { + if( has_flag ) + { + flag_clear( flagName ); + } + } + wait( 0.5 ); + } + } +} +trigger_CanSee( trigger ) +{ + triggers = []; + target_origin = undefined; + array = trigger get_trigger_targs(); + triggers = array["triggers"]; + target_origin = array["target_origin"]; + has_flag = IsDefined( trigger.script_flag ) || IsDefined( trigger.script_noteworthy ); + flagName = undefined; + if( has_flag ) + { + flagName = trigger get_trigger_flag(); + if( !IsDefined( level.flag[flagName] ) ) + { + flag_init( flagName ); + } + } + else + { + if( !triggers.size ) + { + assertex( IsDefined( trigger.script_flag ) || IsDefined( trigger.script_noteworthy ), "Trigger_cansee at " + trigger.origin + " has no script_flag! The script_flag is used as a flag that gets set when the trigger is activated." ); + } + } + trigger endon( "death" ); + range = 12; + offsets = []; + offsets[offsets.size] = ( 0, 0, 0 ); + offsets[offsets.size] = ( range, 0, 0 ); + offsets[offsets.size] = ( range * -1, 0, 0 ); + offsets[offsets.size] = ( 0, range, 0 ); + offsets[offsets.size] = ( 0, range * -1, 0 ); + offsets[offsets.size] = ( 0, 0, range ); + for( ;; ) + { + if( has_flag ) + { + flag_clear( flagName ); + } + trigger waittill( "trigger", other ); + assertex( IsPlayer( other ), "trigger_cansee currently only supports looking from the player" ); + while( other IsTouching( trigger ) ) + { + if( !( other cantraceto( target_origin, offsets ) ) ) + { + if( has_flag ) + { + flag_clear( flagName ); + } + wait( 0.1 ); + continue; + } + if( has_flag ) + { + flag_set( flagName ); + } + array_thread( triggers, ::send_notify, "trigger" ); + wait( 0.5 ); + } + } +} +cantraceto( target_origin, offsets ) +{ + for( i = 0; i < offsets.size; i++ ) + { + if( SightTracePassed( self GetEye(), target_origin + offsets[i], true, self ) ) + { + return true; + } + } + return false; +} +indicate_start( start ) +{ + hudelem = NewHudElem(); + hudelem.alignX = "left"; + hudelem.alignY = "middle"; + hudelem.x = 70; + hudelem.y = 400; + hudelem.label = start; + hudelem.alpha = 0; + hudelem.fontScale = 3; + wait( 1 ); + hudelem FadeOverTime( 1 ); + hudelem.alpha = 1; + wait( 5 ); + hudelem FadeOverTime( 1 ); + hudelem.alpha = 0; + wait( 1 ); + hudelem Destroy(); +} +trigger_notify( trigger, msg ) +{ + trigger endon( "death" ); + trigger waittill( "trigger", other ); + if(IsDefined(trigger.target)) + { + notify_ent = GetEnt(trigger.target, "targetname"); + if(IsDefined(notify_ent)) + { + notify_ent notify( msg, other ); + } + } + level notify( msg, other ); +} +flag_set_player_trigger( trigger ) +{ + flag = trigger get_trigger_flag(); + if( !IsDefined( level.flag[flag] ) ) + { + flag_init( flag ); + } + for( ;; ) + { + trigger waittill( "trigger", other ); + if( !IsPlayer( other ) ) + { + continue; + } + self script_delay(); + flag_set( flag ); + } +} +flag_set_trigger( trigger, flag_name ) +{ + trigger endon( "death" ); + flag = trigger get_trigger_flag(flag_name); + if( !IsDefined( level.flag[flag] ) ) + { + flag_init( flag ); + } + for( ;; ) + { + trigger waittill( "trigger" ); + if (IsDefined(trigger.targetname) && (trigger.targetname == "flag_set")) + { + self script_delay(); + } + flag_set( flag ); + } +} +flag_clear_trigger( trigger, flag_name ) +{ + trigger endon( "death" ); + flag = trigger get_trigger_flag(flag_name); + if( !IsDefined( level.flag[flag] ) ) + { + flag_init( flag ); + } + for( ;; ) + { + trigger waittill( "trigger" ); + if (IsDefined(trigger.targetname) && (trigger.targetname == "flag_clear")) + { + self script_delay(); + } + flag_clear( flag ); + } +} +add_tokens_to_trigger_flags( tokens ) +{ + for( i = 0; i < tokens.size; i++ ) + { + flag = tokens[i]; + if( !IsDefined( level.trigger_flags[flag] ) ) + { + level.trigger_flags[flag] = []; + } + level.trigger_flags[flag][level.trigger_flags[flag].size] = self; + } +} +script_flag_false_trigger( trigger ) +{ + tokens = create_flags_and_return_tokens( trigger.script_flag_false ); + trigger add_tokens_to_trigger_flags( tokens ); + trigger update_trigger_based_on_flags(); +} +script_flag_true_trigger( trigger ) +{ + tokens = create_flags_and_return_tokens( trigger.script_flag_true ); + trigger add_tokens_to_trigger_flags( tokens ); + trigger update_trigger_based_on_flags(); +} +wait_for_flag( tokens ) +{ + for( i = 0; i < tokens.size; i++ ) + { + level endon( tokens[i] ); + } + level waittill( "foreverrr" ); +} +friendly_respawn_trigger( trigger ) +{ + spawners = GetEntArray( trigger.target, "targetname" ); + assertex( spawners.size == 1, "friendly_respawn_trigger targets multiple spawner with targetname " + trigger.target + ". Should target just 1 spawner." ); + spawner = spawners[0]; + assertex( !IsDefined( spawner.script_forcecolor ), "targeted spawner at " + spawner.origin + " should not have script_forcecolor set!" ); + spawners = undefined; + spawner endon( "death" ); + for( ;; ) + { + trigger waittill( "trigger" ); + if( IsDefined( trigger.script_forcecolor ) ) + { + level.respawn_spawners_specific[trigger.script_forcecolor] = spawner; + } + else + { + level.respawn_spawner = spawner; + } + flag_set( "respawn_friendlies" ); + wait( 0.5 ); + } +} +friendly_respawn_clear( trigger ) +{ + for( ;; ) + { + trigger waittill( "trigger" ); + flag_clear( "respawn_friendlies" ); + wait( 0.5 ); + } +} +trigger_ignore( trigger ) +{ + thread trigger_runs_function_on_touch( trigger, ::set_ignoreme, ::get_ignoreme ); +} +trigger_pacifist( trigger ) +{ + thread trigger_runs_function_on_touch( trigger, ::set_pacifist, ::get_pacifist ); +} +trigger_runs_function_on_touch( trigger, set_func, get_func ) +{ + for( ;; ) + { + trigger waittill( "trigger", other ); + if( !IsAlive( other ) ) + { + continue; + } + if( other[[get_func]]() ) + { + continue; + } + other thread touched_trigger_runs_func( trigger, set_func ); + } +} +touched_trigger_runs_func( trigger, set_func ) +{ + self endon( "death" ); + self.ignoreme = true; + [[set_func]]( true ); + self.ignoretriggers = true; + wait( 1 ); + self.ignoretriggers = false; + while( self IsTouching( trigger ) ) + { + wait( 1 ); + } + [[set_func]]( false ); +} +trigger_turns_off( trigger ) +{ + trigger waittill( "trigger" ); + trigger trigger_off(); + if( !IsDefined( trigger.script_linkTo ) ) + { + return; + } + tokens = Strtok( trigger.script_linkto, " " ); + for( i = 0; i < tokens.size; i++ ) + { + array_thread( GetEntArray( tokens[i], "script_linkname" ), ::trigger_off ); + } +} +script_gen_dump_checksaved() +{ + signatures = GetArrayKeys( level.script_gen_dump ); + for( i = 0; i < signatures.size; i++ ) + { + if( !IsDefined( level.script_gen_dump2[signatures[i]] ) ) + { + level.script_gen_dump[signatures[i]] = undefined; + level.script_gen_dump_reasons[level.script_gen_dump_reasons.size] = "Signature unmatched( removed feature ): "+signatures[i]; + } + } +} +script_gen_dump() +{ + assertex( !level.bScriptgened, "SCRIPTGEN generated: follow instructions listed above this error in the console" ); + if( level.bScriptgened ) + { + assertmsg( "SCRIPTGEN updated: Rebuild fast file and run map again" ); + } + flag_set( "scriptgen_done" ); +} +script_gen_csvdumpprintln( file, signature ) +{ + prefix = undefined; + writtenprefix = undefined; + path = ""; + extension = ""; + if( IsSubStr( signature, "ignore" ) ) + { + prefix = "ignore"; + } + else if( IsSubStr( signature, "col_map_sp" ) ) + { + prefix = "col_map_sp"; + } + else if( IsSubStr( signature, "gfx_map" ) ) + { + prefix = "gfx_map"; + } + else if( IsSubStr( signature, "rawfile" ) ) + { + prefix = "rawfile"; + } + else if( IsSubStr( signature, "sound" ) ) + { + prefix = "sound"; + } + else if( IsSubStr( signature, "xmodel" ) ) + { + prefix = "xmodel"; + } + else if( IsSubStr( signature, "xanim" ) ) + { + prefix = "xanim"; + } + else if( IsSubStr( signature, "item" ) ) + { + prefix = "item"; + writtenprefix = "weapon"; + path = "sp/"; + } + else if( IsSubStr( signature, "fx" ) ) + { + prefix = "fx"; + } + else if( IsSubStr( signature, "menu" ) ) + { + prefix = "menu"; + writtenprefix = "menufile"; + path = "ui/scriptmenus/"; + extension = ".menu"; + } + else if( IsSubStr( signature, "rumble" ) ) + { + prefix = "rumble"; + writtenprefix = "rawfile"; + path = "rumble/"; + } + else if( IsSubStr( signature, "shader" ) ) + { + prefix = "shader"; + writtenprefix = "material"; + } + else if( IsSubStr( signature, "shock" ) ) + { + prefix = "shock"; + writtenprefix = "rawfile"; + extension = ".shock"; + path = "shock/"; + } + else if( IsSubStr( signature, "string" ) ) + { + prefix = "string"; + assertmsg( "string not yet supported by scriptgen" ); + } + else if( IsSubStr( signature, "turret" ) ) + { + prefix = "turret"; + writtenprefix = "weapon"; + path = "sp/"; + } + else if( IsSubStr( signature, "vehicle" ) ) + { + prefix = "vehicle"; + writtenprefix = "rawfile"; + path = "vehicles/"; + } + if( !IsDefined( prefix ) ) + { + return; + } + if( !IsDefined( writtenprefix ) ) + { + string = prefix+", "+GetSubStr( signature, prefix.size+1, signature.size ); + } + else + { + string = writtenprefix+", "+path+GetSubStr( signature, prefix.size+1, signature.size )+extension; + } + if( file == -1 || !level.bCSVgened ) + { + println( string ); + } + else + { + FPrintLn( file, string ); + } +} +script_gen_dumpprintln( file, string ) +{ + if( file == -1 || !level.bScriptgened ) + { + println( string ); + } + else + { + FPrintLn( file, string ); + } +} +trigger_hInt( trigger ) +{ + assertex( IsDefined( trigger.script_hint ), "Trigger_hint at " + trigger.origin + " has no .script_hint" ); + trigger endon( "death" ); + if( !IsDefined( level.displayed_hints ) ) + { + level.displayed_hints = []; + } + waittillframeend; + hint = trigger.script_hint; + assertex( IsDefined( level.trigger_hint_string[hint] ), "Trigger_hint with hint " + hint + " had no hint string assigned to it. Define hint strings with add_hint_string()" ); + trigger waittill( "trigger", other ); + assertex( IsPlayer( other ), "Tried to do a trigger_hint on a non player entity" ); + if( IsDefined( level.displayed_hints[hint] ) ) + { + return; + } + level.displayed_hints[hint] = true; + display_hInt( hint ); +} +throw_grenade_at_player_trigger( trigger ) +{ + trigger endon( "death" ); + trigger waittill( "trigger" ); + ThrowGrenadeAtPlayerASAP(); +} +flag_on_cleared( trigger ) +{ + flag = trigger get_trigger_flag(); + if( !IsDefined( level.flag[flag] ) ) + { + flag_init( flag ); + } + for( ;; ) + { + trigger waittill( "trigger" ); + wait( 1 ); + if( trigger found_toucher() ) + { + continue; + } + break; + } + flag_set( flag ); +} +found_toucher() +{ + ai = GetAiArray( "axis" ); + for( i = 0; i < ai.size; i++ ) + { + guy = ai[i]; + if( !IsAlive( guy ) ) + { + continue; + } + if( guy IsTouching( self ) ) + { + return true; + } + wait( 0.1 ); + } + ai = GetAiArray( "axis" ); + for( i = 0; i < ai.size; i++ ) + { + guy = ai[i]; + if( guy IsTouching( self ) ) + { + return true; + } + } + return false; +} +trigger_delete_on_touch( trigger ) +{ + for( ;; ) + { + trigger waittill( "trigger", other ); + if( IsDefined( other ) ) + { + other Delete(); + } + } +} +flag_set_touching( trigger ) +{ + flag = trigger get_trigger_flag(); + if( !IsDefined( level.flag[flag] ) ) + { + flag_init( flag ); + } + for( ;; ) + { + trigger waittill( "trigger", other ); + flag_set( flag ); + while( IsAlive( other ) && other IsTouching( trigger ) && IsDefined( trigger ) ) + { + wait( 0.25 ); + } + flag_clear( flag ); + } +} +add_nodes_mins_maxs( nodes ) +{ + for( index = 0; index < nodes.size; index++ ) + { + origin = nodes[index].origin; + level.nodesMins = expandMins( level.nodesMins, origin ); + level.nodesMaxs = expandMaxs( level.nodesMaxs, origin ); + } +} +calculate_map_center() +{ + if( !IsDefined( level.mapCenter ) ) + { + level.nodesMins = ( 0, 0, 0 ); + level.nodesMaxs = ( 0, 0, 0 ); + nodes = GetAllNodes(); + if( IsDefined( nodes[0] ) ) + { + level.nodesMins = nodes[0].origin; + level.nodesMaxs = nodes[0].origin; + } + add_nodes_mins_maxs( nodes ); + level.mapCenter = findBoxCenter( level.nodesMins, level.nodesMaxs ); + SetMapCenter( level.mapCenter ); + } +} +SetObjectiveTextColors() +{ + MY_TEXTBRIGHTNESS_DEFAULT = "1.0 1.0 1.0"; + MY_TEXTBRIGHTNESS_90 = "0.9 0.9 0.9"; + MY_TEXTBRIGHTNESS_85 = "0.85 0.85 0.85"; + if( level.script == "armada" ) + { + SetSavedDvar( "con_typewriterColorBase", MY_TEXTBRIGHTNESS_90 ); + return; + } + SetSavedDvar( "con_typewriterColorBase", MY_TEXTBRIGHTNESS_DEFAULT ); +} +get_script_linkto_targets() +{ + targets = []; + if( !IsDefined( self.script_linkto ) ) + { + return targets; + } + tokens = Strtok( self.script_linkto, " " ); + for( i = 0; i < tokens.size; i++ ) + { + token = tokens[i]; + target = GetEnt( token, "script_linkname" ); + if( IsDefined( target ) ) + { + targets[targets.size] = target; + } + } + return targets; +} +delete_link_chain( trigger ) +{ + trigger waittill( "trigger" ); + targets = trigger get_script_linkto_targets(); + array_thread( targets, ::delete_links_then_self ); +} +delete_links_then_self() +{ + targets = get_script_linkto_targets(); + array_thread( targets, ::delete_links_then_self ); + self Delete(); +} +defer_vision_set_naked(vision, time) +{ + if(NumRemoteClients()) + { + wait_network_frame(); + } + self VisionSetNaked( vision, time ); +} +trigger_fog( trigger ) +{ + trigger endon( "death" ); + dofog = true; + if( !IsDefined( trigger.script_start_dist ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_halfway_dist ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_halfway_height ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_base_height ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_color ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_color_scale ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_transition_time ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_sun_color ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_sun_direction ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_sun_start_ang ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_sun_stop_ang ) ) + { + dofog = false; + } + if( !IsDefined( trigger.script_max_fog_opacity ) ) + { + dofog = false; + } + do_sunsamplesize = false; + sunsamplesize_time = undefined; + if( IsDefined( trigger.script_sunsample ) ) + { + do_sunsamplesize = false; + trigger.lerping_dvar["sm_sunSampleSizeNear"] = false; + sunsamplesize_time = 1; + if( IsDefined( trigger.script_transition_time ) ) + { + sunsamplesize_time = trigger.script_sunsample_time; + } + if( IsDefined( trigger.script_sunsample_time ) ) + { + sunsamplesize_time = trigger.script_sunsample_time; + } + } + for( ;; ) + { + trigger waittill( "trigger", other ); + assertex( IsPlayer( other ), "Non-player entity touched a trigger_fog." ); + wait( 0.05 ); + players = get_players(); + for(i = 0; i < players.size; i ++) + { + player = players[i]; + if(player istouching(trigger)) + { + if( !IsSplitscreen() ) + { + if( dofog && ( !isdefined(player.fog_trigger_current) || player.fog_trigger_current != trigger )) + { + player SetVolFog( trigger.script_start_dist, + trigger.script_halfway_dist, + trigger.script_halfway_height, + trigger.script_base_height, + trigger.script_color[0], + trigger.script_color[1], + trigger.script_color[2], + trigger.script_color_scale, + trigger.script_sun_color[0], + trigger.script_sun_color[1], + trigger.script_sun_color[2], + trigger.script_sun_direction[0], + trigger.script_sun_direction[1], + trigger.script_sun_direction[2], + trigger.script_sun_start_ang, + trigger.script_sun_stop_ang, + trigger.script_transition_time, + trigger.script_max_fog_opacity ); + } + } + if( (IsDefined( trigger.script_vision ) && IsDefined( trigger.script_vision_time )) && ( !isdefined(player.fog_trigger_current) || player.fog_trigger_current != trigger ) ) + { + player thread defer_vision_set_naked(trigger.script_vision, trigger.script_vision_time); + } + player.fog_trigger_current = trigger; + } + } + players = get_players(); + if( players.size > 1 ) + { + if( do_sunsamplesize ) + { + dvar = "sm_sunSampleSizeNear"; + if( !trigger.lerping_dvar[dvar] && GetDvar( dvar ) != trigger.script_sunsample ) + { + level thread lerp_trigger_dvar_value( trigger, dvar, trigger.script_sunsample, sunsamplesize_time ); + } + } + } + } +} +lerp_trigger_dvar_value( trigger, dvar, value, time ) +{ + trigger.lerping_dvar[dvar] = true; + steps = time * 20; + curr_value = GetDvarFloat( dvar ); + diff = ( curr_value - value ) / steps; + for( i = 0; i < steps; i++ ) + { + curr_value = curr_value - diff; + SetSavedDvar( dvar, curr_value ); + wait( 0.05 ); + } + SetSavedDvar( dvar, value ); + trigger.lerping_dvar[dvar] = false; +} +set_fog_progress( progress ) +{ + anti_progress = 1 - progress; + startdist = self.script_start_dist * anti_progress + self.script_start_dist * progress; + halfwayDist = self.script_halfway_dist * anti_progress + self.script_halfway_dist * progress; + color = self.script_color * anti_progress + self.script_color * progress; + SetVolFog( startdist, halfwaydist, self.script_halfway_height, self.script_base_height, color[0], color[1], color[2], 0.4 ); +} +remove_level_first_frame() +{ + wait( 0.05 ); + level.first_frame = undefined; +} +no_crouch_or_prone_think( trigger ) +{ + for( ;; ) + { + trigger waittill( "trigger", other ); + if( !IsPlayer( other ) ) + { + continue; + } + while( other IsTouching( trigger ) ) + { + other AllowProne( false ); + other AllowCrouch( false ); + wait( 0.05 ); + } + other AllowProne( true ); + other AllowCrouch( true ); + } +} +no_prone_think( trigger ) +{ + for( ;; ) + { + trigger waittill( "trigger", other ); + if( !IsPlayer( other ) ) + { + continue; + } + while( other IsTouching( trigger ) ) + { + other AllowProne( false ); + wait( 0.05 ); + } + other AllowProne( true ); + } +} +check_flag_for_stat_tracking( msg ) +{ + if( !issuffix( msg, "aa_" ) ) + { + return; + } + [[level.sp_stat_tracking_func]]( msg ); +} +precache_script_models() +{ + if( !IsDefined( level.scr_model ) ) + { + return; + } + models = GetArrayKeys( level.scr_model ); + for( i = 0; i < models.size; i++ ) + { + PrecacheModel( level.scr_model[models[i]] ); + } +} +arcademode_save() +{ +} +player_death_detection() +{ + SetDvar( "player_died_recently", "0" ); + thread player_died_recently_degrades(); + level add_wait( ::flag_wait, "missionfailed" ); + self add_wait( ::waittill_msg, "death" ); + do_wait_any(); + recently_skill = []; + recently_skill[0] = 70; + recently_skill[1] = 30; + recently_skill[2] = 0; + recently_skill[3] = 0; + SetDvar( "player_died_recently", recently_skill[level.gameskill] ); +} +player_died_recently_degrades() +{ + for( ;; ) + { + recent_death_time = GetDvarInt( #"player_died_recently" ); + if( recent_death_time > 0 ) + { + recent_death_time -= 5; + SetDvar( "player_died_recently", recent_death_time ); + } + wait( 5 ); + } +} +all_players_connected() +{ + while(1) + { + num_con = getnumconnectedplayers(); + num_exp = getnumexpectedplayers(); + println( "all_players_connected(): getnumconnectedplayers=", num_con, "getnumexpectedplayers=", num_exp ); + if(num_con == num_exp && (num_exp != 0)) + { + flag_set( "all_players_connected" ); + SetDvar( "all_players_are_connected", "1" ); + return; + } + wait( 0.05 ); + } +} +all_players_spawned() +{ + flag_wait( "all_players_connected" ); + waittillframeend; + while(1) + { + players = get_players(); + count = 0; + for( i = 0; i < players.size; i++ ) + { + if( players[i].sessionstate == "playing" ) + { + count++; + } + } + if( count == players.size ) + { + break; + } + wait( 0.05 ); + } + flag_set( "all_players_spawned" ); +} +adjust_placed_weapons() +{ + weapons = GetEntArray( "placed_weapon", "targetname" ); + flag_wait( "all_players_connected" ); + players = get_players(); + player_count = players.size; + for( i = 0; i < weapons.size; i++ ) + { + if( IsDefined( weapons[i].script_player_min ) && player_count < weapons[i].script_player_min ) + { + weapons[i] Delete(); + } + } +} +explodable_volume() +{ + self thread explodable_volume_think(); + exploder = GetEnt(self.target, "targetname"); + if (IsDefined(exploder) && IsDefined(exploder.script_exploder)) + { + level waittill("exploder" + exploder.script_exploder); + } + else + { + exploder waittill("exploding"); + } + self Delete(); +} +explodable_volume_think() +{ + assertex(IsDefined(self.target), "Explodable Volume must be targeting an exploder or an explodable object."); + target = GetEnt(self.target, "targetname"); + assertex(IsDefined(target), "Explodable Volume has an invalid target."); + if (IsDefined(target.remove)) + { + target = target.remove; + } + self._explodable_target = target; + while (true) + { + self waittill("trigger", ent); + ent thread explodable_volume_ent_think(self, target); + wait .5; + } +} +explodable_volume_ent_think(volume, target) +{ + if (!IsDefined(self._explodable_volumes)) + { + self._explodable_volumes = []; + } + if (is_in_array(self._explodable_volumes, volume)) + { + return; + } + if (!IsDefined(self._explodable_targets)) + { + self._explodable_targets = []; + } + self._explodable_volumes = array_add(self._explodable_volumes, volume); + self._explodable_targets = array_add(self._explodable_targets, target); + while (IsAlive(self) && IsDefined(volume) && self IsTouching(volume)) + { + wait .5; + } + if (IsDefined(self)) + { + self._explodable_volumes = array_remove(self._explodable_volumes, volume); + self._explodable_targets = array_remove(self._explodable_targets, target); + } +} +update_script_forcespawn_based_on_flags() +{ + spawners = GetSpawnerArray(); + for( i = 0; i < spawners.size; i++ ) + { + if( spawners[i] has_spawnflag( level.SPAWNFLAG_ACTOR_SCRIPTFORCESPAWN ) ) + { + spawners[i].script_forcespawn = 1; + } + } +} +trigger_once(trig) +{ + trig waittill("trigger"); + waittillframeend; + if (IsDefined(trig)) + { + trig Delete(); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_loadout.gsc b/BO1/PC/ZM/maps/_loadout.gsc new file mode 100644 index 0000000..4e759a5 --- /dev/null +++ b/BO1/PC/ZM/maps/_loadout.gsc @@ -0,0 +1,814 @@ +#include maps\_utility; +init_loadout() +{ + if( !IsDefined( level.player_loadout ) ) + { + level.player_loadout = []; + level.player_loadout_options = []; + } + init_models_and_variables_loadout(); + players = get_players("all"); + for ( i = 0; i < players.size; i++ ) + { + players[i] give_loadout(); + players[i].pers["class"] = "closequarters"; + } + level.loadoutComplete = true; + level notify("loadout complete"); + if( GetDvar( #"zombietron" ) == "1" ) + { + mptype\player_t5_zt::precache(); + } + else if( GetDvar( #"zombiemode" ) == "1" || IsSubStr( level.script, "nazi_zombie_" ) || IsSubStr( level.script, "zombie_" ) ) + { + if ( IsSubStr( level.script, "zombie_pentagon" ) ) + { + mptype\player_t5_zm_pentagon::precache(); + } + else if( IsSubStr( level.script, "zombie_theater" ) ) + { + mptype\player_t5_zm_theater::precache(); + } + else + { + mptype\player_t5_zm::precache(); + } + } +} +init_models_and_variables_loadout() +{ + if ( GetDvar( #"zombiemode" ) == "1" ) + { + if ( !isDefined(level.zombietron_mode) ) + { + add_weapon( "knife_zm" ); + } + } + else + { + if( level.script == "frontend" + || level.script == "so_narrative1_frontend" + || level.script == "so_narrative2_frontend" + || level.script == "so_narrative3_frontend" + || level.script == "so_narrative4_frontend" + || level.script == "so_narrative5_frontend" + || level.script == "so_narrative6_frontend" + || level.script == "so_narrative0_frontend" + || level.script == "outro" ) + { + } + else if( level.script == "flashpoint" ) + { + add_weapon( "knife_karambit_sp" ); + } + else + { + add_weapon( "knife_sp" ); + } + } + if( level.script == "coop_test1" ) + { + add_weapon( "m1garand" ); + add_weapon( "thompson" ); + add_weapon( "frag_grenade" ); + set_switch_weapon( "m1garand" ); + set_player_viewmodel( "viewmodel_usa_marine_arms"); + set_player_interactive_hands( "viewhands_player_usmc"); + level.campaign = "american"; + return; + } + if( level.script == "m202_sound_test" ) + { + add_weapon( "rpg_player_sp" ); + add_weapon( "m202_flash_sp" ); + add_weapon( "strela_sp" ); + add_weapon( "m220_tow_sp" ); + add_weapon( "china_lake_sp" ); + set_laststand_pistol( "m1911_sp" ); + set_switch_weapon( "rpg_player_sp" ); + set_player_viewmodel( "viewmodel_usa_marine_arms"); + set_player_interactive_hands( "viewhands_player_usmc"); + level.campaign = "american"; + return; + } + else if( GetSubStr( level.script, 0, 6 ) == "sp_t5_" ) + { + add_weapon( "m16_sp" ); + add_weapon( "m1911_sp" ); + set_switch_weapon( "m16_sp" ); + set_laststand_pistol( "m1911_sp" ); + set_switch_weapon( "m16_sp" ); + set_player_viewmodel( "viewmodel_usa_cia_camo_arms" ); + set_player_interactive_hands( "viewmodel_usa_cia_camo_arms"); + level.campaign = "american"; + return; + } + else if( level.script == "berlin" ) + { + add_weapon( "frag_grenade_sp" ); + add_weapon( "m1911_silencer_sp" ); + set_switch_weapon( "m1911_silencer_sp" ); + set_laststand_pistol( "m1911_silencer_sp" ); + set_player_viewmodel( "viewmodel_usa_jungmar_arms" ); + set_player_interactive_hands( "viewmodel_usa_jungmar_player"); + set_player_interactive_model( "viewmodel_usa_jungmar_player_fullbody" ); + level.campaign = "american"; + return; + } + else if( level.script == "cuba" ) + { + add_weapon( "frag_grenade_sp" ); + add_weapon( "asp_sp" ); + PreCacheItem("m16_sp"); + PreCacheItem("m16_acog_sp"); + PreCacheItem("m16_gl_sp"); + PreCacheItem("gl_m16_sp"); + add_weapon("m16_acog_gl_sp"); + set_switch_weapon( "m16_acog_gl_sp" ); + set_laststand_pistol( "asp_sp" ); + set_player_viewmodel( "viewmodel_usa_cuban_casual_arms" ); + set_player_interactive_hands( "viewmodel_usa_cuban_casual_player"); + set_player_interactive_model( "viewmodel_usa_cuban_casual_fullbody" ); + level.campaign = "american"; + return; + } + else if( level.script == "frontend" + || level.script == "so_narrative1_frontend" + || level.script == "so_narrative2_frontend" + || level.script == "so_narrative3_frontend" + || level.script == "so_narrative4_frontend" + || level.script == "so_narrative5_frontend" + || level.script == "so_narrative6_frontend" + || level.script == "so_narrative0_frontend") + { + set_laststand_pistol( "none" ); + set_player_viewmodel( "tag_origin"); + set_player_interactive_hands( "tag_origin"); + set_player_interactive_model("viewmodel_usa_mason_interrogation_fullbody"); + level.campaign = "none"; + return; + } + else if ( level.script == "outro" ) + { + set_laststand_pistol( "none" ); + level.campaign = "none"; + return; + } + else if( level.script == "int_escape" ) + { + add_weapon("interrogation_hands_sp"); + set_switch_weapon( "interrogation_hands_sp" ); + set_player_viewmodel( "viewmodel_usa_mason_interrogation_arms"); + set_player_interactive_hands( "viewmodel_usa_mason_interrogation_player"); + set_player_interactive_model("viewmodel_usa_mason_interrogation_fullbody"); + level.campaign = "american"; + return; + } + else if( level.script == "creek_1" ) + { + precacheitem( "creek_flashlight_pistol_sp" ); + add_weapon( "commando_gl_sp" ); + add_weapon( "wa2000_sp" ); + set_laststand_pistol( "m1911_sp" ); + set_switch_weapon( "commando_gl_sp" ); + set_player_viewmodel( "viewmodel_usa_jungmar_wet_arms" ); + set_player_interactive_hands( "viewmodel_usa_jungmar_wet_player"); + set_player_interactive_model( "viewmodel_usa_jungmar_wet_player_fullbody"); + level.campaign = "american"; + return; + } + else if( level.script == "river" ) + { + add_weapon( "commando_acog_sp", 13 ); + add_weapon( "ks23_sp", 13 ); + add_weapon( "frag_grenade_sp" ); + add_weapon( "flash_grenade_sp" ); + set_laststand_pistol( "m1911_sp" ); + set_switch_weapon( "commando_acog_sp" ); + set_player_viewmodel( "viewmodel_usa_jungmar_wet_arms" ); + set_player_interactive_hands( "viewmodel_usa_jungmar_wet_player"); + level.campaign = "american"; + return; + } + else if( level.script == "in_country" ) + { + add_weapon( "m16_acog_sp" ); + add_weapon( "m1911_sp" ); + set_switch_weapon( "m16_acog_sp" ); + add_weapon( "frag_grenade_sp" ); + set_laststand_pistol( "m1911_sp" ); + set_switch_weapon( "m16_acog_sp" ); + set_player_viewmodel( "viewmodel_usa_jungmar_arms" ); + set_player_interactive_model( "viewmodel_usa_jungmar_player_fullbody"); + level.campaign = "american"; + return; + } + else if( level.script == "flashpoint" ) + { + add_weapon( "mp5k_elbit_extclip_sp", 1 ); + add_weapon( "python_speed_sp" ); + set_laststand_pistol( "makarov_sp" ); + set_switch_weapon( "mp5k_elbit_extclip_sp" ); + add_weapon( "frag_grenade_sp" ); + add_weapon( "willy_pete_sp" ); + set_player_viewmodel( "viewmodel_usa_blackops_urban_arms" ); + set_player_interactive_hands( "viewmodel_usa_blackops_urban_player" ); + set_player_interactive_model( "viewmodel_usa_blackops_urban_player_fullbody" ); + level.campaign = "american"; + return; + } + else if (level.script == "hue_city") + { + precacheitem( "rpg_sp" ); + precacheitem( "rpk_sp" ); + precacheitem( "commando_sp" ); + precacheitem( "m1911_sp" ); + set_laststand_pistol( "m1911_sp" ); + add_weapon( "frag_grenade_sp" ); + set_player_viewmodel( "viewmodel_usa_jungmar_arms" ); + set_player_interactive_hands( "viewmodel_usa_jungmar_player"); + set_player_interactive_model( "viewmodel_usa_jungmar_player_fullbody"); + level.campaign = "american"; + return; + } + else if( level.script == "pow" ) + { + PrecacheItem("ak47_acog_sp"); + PrecacheItem("ak47_dualclip_sp"); + PrecacheItem("ak47_extclip_sp"); + PrecacheItem("ak47_gl_sp"); + PrecacheItem("gl_ak47_sp"); + PrecacheItem("ak47_ft_sp"); + PrecacheItem("ft_ak47_sp"); + PrecacheItem("rpk_sp"); + PrecacheItem("rpk_acog_sp"); + PrecacheItem("rpk_extclip_sp"); + PrecacheItem("galil_sp"); + PrecacheItem("cz75_sp"); + PrecacheItem("cz75_auto_sp"); + PrecacheItem("cz75lh_sp"); + PrecacheItem("cz75dw_sp"); + PrecacheItem("rpg_player_sp"); + PrecacheItem("uzi_sp"); + PrecacheItem("uzi_acog_sp"); + PrecacheItem("uzi_extclip_sp"); + PrecacheItem("uzi_grip_sp"); + add_weapon( "cz75_sp" ); + add_weapon( "ak47_sp" ); + add_weapon( "frag_grenade_sp" ); + add_weapon( "flash_grenade_sp" ); + set_switch_weapon( "ak47_sp" ); + set_laststand_pistol( "cz75_sp" ); + set_player_viewmodel( "viewmodel_usa_pow_arms" ); + set_player_interactive_hands( "viewmodel_usa_pow_player"); + set_player_interactive_model( "viewmodel_usa_prisoner_player_fullbody" ); + level.campaign = "american"; + return; + } + else if( level.script == "wmd_sr71" ) + { + add_weapon( "aug_arctic_acog_silencer_sp" ); + add_weapon( "m1911_silencer_sp" ); + add_weapon( "frag_grenade_sp" ); + add_weapon( "flash_grenade_sp" ); + set_secondary_offhand( "flash_grenade_sp" ); + set_switch_weapon( "aug_arctic_acog_silencer_sp" ); + set_laststand_pistol( "m1911_silencer_sp" ); + set_player_interactive_model( "viewmodel_usa_blackops_winter_player_fullbody" ); + set_player_interactive_hands( "viewhands_player_usmc"); + set_player_viewmodel( "viewmodel_usa_blackops_winter_arms" ); + level.campaign = "american"; + return; + } + else if( level.script == "wmd" ) + { + add_weapon( "aug_arctic_acog_silencer_sp" ); + add_weapon( "crossbow_vzoom_alt_sp", 11 ); + add_weapon( "frag_grenade_sp" ); + add_weapon( "flash_grenade_sp" ); + set_secondary_offhand( "flash_grenade_sp" ); + set_switch_weapon( "crossbow_vzoom_alt_sp" ); + set_laststand_pistol( "m1911_silencer_sp" ); + set_player_interactive_model( "viewmodel_usa_blackops_winter_player_fullbody" ); + set_player_interactive_hands( "viewmodel_usa_blackops_winter_player" ); + set_player_viewmodel( "viewmodel_usa_blackops_winter_arms" ); + level.campaign = "american"; + return; + } + else if (level.script == "khe_sanh") + { + PreCacheItem("m16_sp"); + PreCacheItem("m16_mk_sp"); + PreCacheItem("mk_m16_sp"); + add_weapon("m16_mk_sp", 1); + add_weapon( "m60_sp" ); + add_weapon( "frag_grenade_sp" ); + set_switch_weapon( "m16_mk_sp" ); + set_laststand_pistol( "none" ); + set_player_viewmodel( "viewmodel_usa_jungmar_arms" ); + set_player_interactive_hands( "viewmodel_usa_jungmar_player"); + set_player_interactive_model( "viewmodel_usa_jungmar_player_fullbody" ); + level.campaign = "american"; + return; + } + else if (level.script == "vorkuta") + { + PrecacheItem( "makarov_sp" ); + PrecacheItem( "vorkuta_knife_sp" ); + add_weapon( "ak47_sp" ); + add_weapon( "ak47_gl_sp" ); + set_switch_weapon( "ak47_sp" ); + set_laststand_pistol( "makarov_sp" ); + add_weapon( "frag_grenade_sp" ); + set_player_viewmodel( "viewmodel_rus_prisoner_arms" ); + set_player_interactive_hands( "viewmodel_rus_prisoner_player_fullbody"); + set_player_interactive_model( "viewmodel_rus_prisoner_player_fullbody" ); + level.campaign = "russian"; + return; + } + else if( level.script == "pentagon" ) + { + set_laststand_pistol( "m1911_sp" ); + set_player_interactive_model( "viewmodel_usa_pent_officeworker_fullbody" ); + level.campaign = "american"; + return; + } + else if( level.script == "collateral_damage" ) + { + precacheitem( "commando_acog_sp" ); + precacheitem( "m1911_sp" ); + precacheitem( "frag_grenade_sp" ); + add_weapon( "commando_acog_sp" ); + add_weapon( "m1911_sp" ); + add_weapon( "frag_grenade_sp" ); + set_laststand_pistol( "m1911_sp" ); + set_switch_weapon( "commando_acog_sp" ); + set_player_viewmodel( "viewmodel_usa_jungmar_arms" ); + set_player_interactive_hands( "viewmodel_usa_jungmar_player"); + set_player_interactive_model( "viewmodel_usa_jungmar_player_fullbody" ); + level.campaign = "american"; + return; + } + else if( level.script == "fullahead" ) + { + add_weapon( "ppsh_sp" ); + add_weapon( "mosin_sp" ); + add_weapon( "frag_grenade_russian_sp" ); + set_laststand_pistol( "tokarevtt30_sp" ); + set_switch_weapon( "ppsh_sp" ); + set_player_viewmodel( "viewmodel_rus_reznov_winter_arms" ); + set_player_interactive_hands( "viewmodel_rus_reznov_winter_player") ; + set_player_interactive_model( "viewmodel_rus_reznov_winter_fullbody" ); + level.campaign = "russian"; + return; + } + else if( level.script == "kowloon" ) + { + add_weapon( "cz75dw_sp" ); + add_weapon( "frag_grenade_sp" ); + add_weapon( "flash_grenade_sp" ); + set_secondary_offhand( "flash_grenade_sp" ); + set_laststand_pistol( "cz75_sp" ); + set_switch_weapon( "cz75dw_sp" ); + set_player_viewmodel( "viewmodel_usa_blackops_urban_arms_getwet" ); + set_player_interactive_hands( "viewmodel_usa_blackops_urban_player_gwet") ; + set_player_interactive_model( "viewmodel_usa_blackops_urban_player_fullbody_gwet" ); + level.campaign = "american"; + return; + } + else if( level.script == "interrogation_escape" ) + { + add_weapon( "m1911_sp" ); + add_weapon( "m16_sp" ); + add_weapon( "frag_grenade_sp" ); + set_laststand_pistol( "m1911_sp" ); + set_switch_weapon( "m16_sp" ); + set_player_viewmodel( "viewmodel_usa_pow_arms" ); + set_player_interactive_hands( "viewhands_player_usmc"); + set_player_interactive_model("viewmodel_usa_marine_player_legs"); + level.campaign = "american"; + return; + } + else if( level.script == "rebirth" ) + { + add_weapon("frag_grenade_sp"); + set_laststand_pistol( "m1911_sp" ); + set_player_viewmodel( "viewmodel_usa_blackops_urban_arms"); + set_player_interactive_hands( "viewmodel_usa_blackops_urban_player"); + set_player_interactive_model("viewmodel_usa_blackops_urban_player_fullbody"); + level.campaign = "american"; + return; + } + else if( level.script == "underwaterbase" ) + { + add_weapon( "mac11_elbit_extclip_sp" ); + add_weapon( "famas_reflex_dualclip_sp" ); + set_laststand_pistol( "cz75_sp" ); + set_switch_weapon( "famas_reflex_dualclip_sp" ); + add_weapon( "frag_grenade_sp" ); + add_weapon( "flash_grenade_sp" ); + set_secondary_offhand( "flash_grenade_sp" ); + set_player_viewmodel( "viewmodel_usa_ubase_arms" ); + set_player_interactive_hands( "viewmodel_usa_ubase_player" ); + set_player_interactive_model( "viewmodel_usa_ubase_fullbody" ); + level.campaign = "american"; + return; + } + else if( GetDvar( #"zombiemode" ) == "1" || IsSubStr( level.script, "zombie_" ) ) + { + if ( !isDefined(level.zombietron_mode) ) + { + add_weapon( "knife_zm" ); + add_weapon( "m1911_zm" ); + PrecacheItem( "bowie_knife_zm" ); + set_laststand_pistol( "m1911_zm" ); + set_player_viewmodel( "viewmodel_usa_pow_arms"); + set_player_interactive_hands( "viewhands_usmc"); + } + level.campaign = "american"; + return; + } + else if( IsSubStr( level.script, "intro_" ) ) + { + return; + } + else if( GetDvar( #"g_gametype" ) == "vs" ) + { + return; + } + println ("loadout.gsc: No level listing in _loadout.gsc, giving default guns!!!! ======================="); + add_weapon( "m1911_sp" ); + add_weapon( "m16_sp" ); + add_weapon( "frag_grenade_sp" ); + add_weapon( "flash_grenade_sp" ); + set_secondary_offhand( "flash_grenade_sp" ); + set_laststand_pistol( "m1911_sp" ); + set_switch_weapon( "m16_sp" ); + set_player_viewmodel( "viewmodel_usa_marine_arms"); + set_player_interactive_hands( "viewhands_player_usmc"); + set_player_interactive_model("viewmodel_usa_marine_player_legs"); + level.campaign = "american"; +} +add_weapon( weapon_name, options ) +{ + PrecacheItem( weapon_name ); + level.player_loadout[level.player_loadout.size] = weapon_name; + if( !isdefined( options ) ) + { + options = -1; + } + level.player_loadout_options[level.player_loadout_options.size] = options; +} +set_secondary_offhand( weapon_name ) +{ + level.player_secondaryoffhand = weapon_name; +} +set_switch_weapon( weapon_name ) +{ + level.player_switchweapon = weapon_name; +} +set_action_slot( num, option1, option2 ) +{ + if( num < 2 || num > 4) + { + if(level.script != "pby_fly") + { + assertmsg( "_loadout.gsc: set_action_slot must be set with a number greater than 1 and less than 5" ); + } + } + if(IsDefined(option1)) + { + if(option1 == "weapon") + { + PrecacheItem(option2); + level.player_loadout[level.player_loadout.size] = option2; + } + } + if( !IsDefined( level.player_actionslots ) ) + { + level.player_actionslots = []; + } + action_slot = SpawnStruct(); + action_slot.num = num; + action_slot.option1 = option1; + if( IsDefined( option2 ) ) + { + action_slot.option2 = option2; + } + level.player_actionslots[level.player_actionslots.size] = action_slot; +} +set_player_viewmodel( model ) +{ + PrecacheModel( model ); + level.player_viewmodel = model; +} +set_player_interactive_hands( model ) +{ + PrecacheModel( model ); + level.player_interactive_hands = model; +} +set_player_interactive_model( model ) +{ + PrecacheModel( model ); + level.player_interactive_model = model; +} +set_laststand_pistol( weapon ) +{ + level.laststandpistol = weapon; +} +give_loadout(wait_for_switch_weapon) +{ + if( !IsDefined( game["gaveweapons"] ) ) + { + game["gaveweapons"] = 0; + } + if( !IsDefined( game["expectedlevel"] ) ) + { + game["expectedlevel"] = ""; + } + if( game["expectedlevel"] != level.script ) + { + game["gaveweapons"] = 0; + } + if( game["gaveweapons"] == 0 ) + { + game["gaveweapons"] = 1; + } + gave_grenade = false; + for( i = 0; i < level.player_loadout.size; i++ ) + { + if( WeaponType( level.player_loadout[i] ) == "grenade" ) + { + gave_grenade = true; + break; + } + } + if( !gave_grenade ) + { + if( IsDefined( level.player_grenade ) ) + { + grenade = level.player_grenade; + self GiveWeapon( grenade ); + self SetWeaponAmmoStock( grenade, 0 ); + gave_grenade = true; + } + if( !gave_grenade ) + { + ai = GetAiArray( "allies" ); + if( IsDefined( ai ) ) + { + for( i = 0; i < ai.size; i++ ) + { + if( IsDefined( ai[i].grenadeWeapon ) ) + { + grenade = ai[i].grenadeWeapon; + self GiveWeapon( grenade ); + self SetWeaponAmmoStock( grenade, 0 ); + break; + } + } + } + println( "^3LOADOUT ISSUE: Unable to give a grenade, the player need to be given a grenade and then take it away in order for the player to throw back grenades, but not have any grenades in his inventory." ); + } + } + for( i = 0; i < level.player_loadout.size; i++ ) + { + if( isdefined(level.player_loadout_options[i]) && (level.player_loadout_options[i]!=-1) ) + { + weaponOptions = self calcweaponoptions( level.player_loadout_options[i] ); + self GiveWeapon( level.player_loadout[i], 0, weaponOptions ); + } + else + { + self GiveWeapon( level.player_loadout[i] ); + } + } + self SetActionSlot( 1, "" ); + self SetActionSlot( 2, "" ); + self SetActionSlot( 3, "altMode" ); + self SetActionSlot( 4, "" ); + if( level.script == "living_battlefield" ) + { + self SetActionSlot( 4, "nightvision" ); + } + if( IsDefined( level.player_actionslots ) ) + { + for( i = 0; i < level.player_actionslots.size; i++ ) + { + num = level.player_actionslots[i].num; + option1 = level.player_actionslots[i].option1; + if( IsDefined( level.player_actionslots[i].option2 ) ) + { + option2 = level.player_actionslots[i].option2; + self SetActionSlot( num, option1, option2 ); + } + else + { + self SetActionSlot( num, option1 ); + } + } + } + if( IsDefined( level.player_switchweapon ) ) + { + if ( isdefined(wait_for_switch_weapon) && wait_for_switch_weapon == true ) + { + wait(0.5); + } + self SwitchToWeapon( level.player_switchweapon ); + } + if( GetDvar( #"zombiemode" ) == "0" ) + { + wait(0.5); + } + self player_flag_set("loadout_given"); +} +give_model( class ) +{ + entity_num = self GetEntityNumber(); + if (level.campaign == "none") + { + } + else if( GetDvar( #"zombietron" ) == "1" ) + { + switch( entity_num ) + { + case 0: + character\c_usa_sog2_zt::main(); + break; + case 1: + character\c_zom_blue_guy_zt::main(); + break; + case 2: + character\c_zom_red_guy_zt::main(); + break; + case 3: + character\c_zom_yellow_guy_zt::main(); + break; + } + } + else if( GetDvar( #"zombiemode" ) == "1" || IsSubStr( level.script, "nazi_zombie_" ) || IsSubStr( level.script, "zombie_" ) ) + { + if ( IsSubStr( level.script, "zombie_pentagon" ) ) + { + if( IsDefined( self.zm_random_char ) ) + { + entity_num = self.zm_random_char; + } + switch( entity_num ) + { + case 0: + character\c_usa_jfk_zt::main(); + break; + case 1: + character\c_usa_mcnamara_zt::main(); + break; + case 2: + character\c_usa_nixon_zt::main(); + break; + case 3: + character\c_cub_castro_zt::main(); + break; + } + } + else if( IsSubStr( level.script, "zombie_theater" ) ) + { + if( IsDefined( self.zm_random_char ) ) + { + entity_num = self.zm_random_char; + } + switch( entity_num ) + { + case 0: + character\c_usa_dempsey_zt::main(); + break; + case 1: + character\c_rus_nikolai_zt::main(); + break; + case 2: + character\c_jap_takeo_zt::main(); + break; + case 3: + character\c_ger_richtofen_zt::main(); + break; + } + } + else + { + switch( entity_num ) + { + case 0: + character\c_usa_marine_michael_carter_player_zm::main(); + break; + case 1: + character\c_usa_marine_michael_carter_player_zm::main(); + break; + case 2: + character\c_usa_marine_michael_carter_player_zm::main(); + break; + case 3: + character\c_usa_marine_michael_carter_player_zm::main(); + break; + } + } + } + if( IsDefined( level.player_viewmodel ) ) + { + self SetViewModel( level.player_viewmodel ); + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_meatshield.gsc b/BO1/PC/ZM/maps/_meatshield.gsc new file mode 100644 index 0000000..9cb71b2 --- /dev/null +++ b/BO1/PC/ZM/maps/_meatshield.gsc @@ -0,0 +1,719 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_anim; +#include maps\_debug; +#include maps\_music; +#using_animtree("generic_human"); +main(weapon, viewmodel, anims_func, do_bulletcam) +{ + level._meatshield_weapon = weapon; + level._meatshield_viewmodel = viewmodel; + _precache(weapon, viewmodel); + _fx(); + _anims(anims_func); + _settings(); + _flags(); + if(!isDefined(do_bulletcam)) + { + level._meatshield_bulletcam = true; + maps\_bulletcam::main(); + } + else + { + level._meatshield_bulletcam = do_bulletcam; + } + OnPlayerConnect_Callback(::on_player_connect); + OnSaveRestored_Callback(::on_save_restored); + setup_contextual_melee(); +} +on_player_connect() +{ +} +on_save_restored() +{ + player = get_players()[0]; + player SetClientDvar("sv_clientSideBullets", 1); + player SetClientDvar("cg_forceSniperBobHack", 0); +} +_precache(weapon, viewmodel) +{ + PrecacheItem(weapon); + PrecacheModel(viewmodel); + PrecacheModel("fx_meatshield_preloader"); + PrecacheModel("p_glo_bullet_tip"); + PrecacheShader("overlay_blood_meat_shield"); +} +_fx() +{ + level._effect["meatshield_fake_hit"] = LoadFX("maps/creek/fx_impact_meat_shield_fxr"); +} +_settings() +{ + level._MEATSHIELD_CLAMP_L = 27; + level._MEATSHIELD_CLAMP_R = 27; + level._MEATSHIELD_CLAMP_U = 10; + level._MEATSHIELD_CLAMP_D = 10; + if (!IsDefined(level._meatshield_timer)) + { + level._meatshield_timer = 15; + } + if (!IsDefined(level._meatshield_kill_player)) + { + level._meatshield_kill_player = false; + } +} +_flags() +{ + flag_init("timer_on", true); + level.CLIENT_ENABLE_EAR_BLOOD = 0; +} +_anims(anims_func) +{ + level.scr_anim["_meatshield:ai"]["grab"] = %ai_meatshield_grab; + level.scr_anim["_meatshield:ai"]["idle"][0] = %ai_meatshield_victim_aim_idle; + level.scr_anim["_meatshield:ai"]["idle_steady"][0] = %ai_meatshield_victim_aim_idle_steady; + level.scr_anim["_meatshield:ai"]["trans_2_dead"][0] = %ai_meatshield_hostage_trans_2_dead; + level.scr_anim["_meatshield:ai"]["dead_idle"][0] = %ai_meatshield_hostage_dead_idle; + level.scr_anim["_meatshield:ai"]["dead_idle_steady"][0] = %ai_meatshield_hostage_dead_idle_steady; + level.scr_anim["_meatshield:ai"]["drop"] = %ai_meatshield_hostage_dead_drop; + level.scr_anim["_meatshield:player"]["grab"] = %int_meatshield_grab; + level.scr_anim["_meatshield:player"]["idle"][0] = %int_meatshield_player_aim_idle_leftarm; + level.scr_anim["_meatshield:player"]["idle_steady"][0] = %int_meatshield_player_aim_idle_leftarm_steady; + level.scr_anim["_meatshield:player"]["trans_2_dead"][0] = %int_meatshield_hostage_trans_2_dead; + level.scr_anim["_meatshield:player"]["dead_idle"][0] = %int_meatshield_hostage_dead_idle; + level.scr_anim["_meatshield:player"]["dead_idle_steady"][0] = %int_meatshield_hostage_dead_idle_steady; + level.scr_anim["_meatshield:player"]["drop"] = %int_meatshield_hostage_dead_drop; + if (IsDefined(anims_func)) + { + [[ anims_func ]](); + } +} +setup_contextual_melee() +{ + if (is_true(level.scripted_meatshield )) + { + maps\_contextual_melee::add_melee_sequence("scripted", "meatshield", "scripted", "scripted", level.scr_anim["_meatshield:player"]["grab"], level.scr_anim["_meatshield:ai"]["grab"]); + maps\_contextual_melee::add_melee_callback("scripted", "meatshield", "scripted", "scripted", ::do_meat_shield); + } + else + { + maps\_contextual_melee::add_melee_sequence("default", "meatshield", "stand", "stand", level.scr_anim["_meatshield:player"]["grab"], level.scr_anim["_meatshield:ai"]["grab"]); + maps\_contextual_melee::add_melee_callback("default", "meatshield", "stand", "stand", ::do_meat_shield); + } +} +start(ai) +{ + self SetClientDvar("sv_clientSideBullets", 0); + _meatshield = SpawnStruct(); + _meatshield ent_flag_init("meatshield_active", true); + _meatshield.anim_ents = array(self.player_hands, ai); + _meatshield.align = self get_align_pt( ai ); + _meatshield.player = self; + _meatshield.ai = ai; + _meatshield.blood_overlay_model = Spawn("script_model", ai.origin - (0, 50, 0)); + _meatshield.blood_overlay_model SetModel("fx_meatshield_preloader"); + self._meatshield = _meatshield; + ai._meatshield = _meatshield; + self.player_hands.animname = "_meatshield:player"; + self link_player(); + if(!IsDefined(level._meatshield_no_weapon_management)) + { + self take_weapons(); + } + self thread give_weapon(); + self FreezeControls(false); + self AllowCrouch(false); + self AllowProne(false); + self SetAutoPickup(false); + ai BloodImpact("none"); + if(!IsDefined(level.meatshield_damage_override)) + { + ai.overrideActorDamage = ::meatshield_damage; + } + else + { + ai.overrideActorDamage = level.meatshield_damage_override; + } + ai.animname = "_meatshield:ai"; + ai gun_remove(); + ai.team = "allies"; + ai LinkTo(_meatshield.align, "tag_origin"); + ai notify("_meatshield:start"); + if(!IsDefined(level.meatshield_custom_audio)) + { + ai thread meatshield_audio_init( _meatshield ); + } + else + { + ai thread [[level.meatshield_custom_audio]](); + } + _meatshield thread notify_when_done(ai); + _meatshield thread ads_loop(); + _meatshield.time_left = level._meatshield_timer; + return _meatshield; +} +give_weapon() +{ + self SetClientDvar("cg_forceSniperBobHack", 1); + self SetViewModel(level._meatshield_viewmodel); + self GiveWeapon(level._meatshield_weapon, 0); + self SwitchToWeapon(level._meatshield_weapon); + wait .1; + self ShowViewModel(); + self EnableWeapons(); +} +notify_when_done(ent) +{ + self ent_flag_waitopen("meatshield_active"); + ent notify("_meatshield:end"); + level notify("_meatshield:end"); +} +finish() +{ + self ent_flag_waitopen("meatshield_active"); + self.player SetClientDvar("cg_forceSniperBobHack", 0); + self.player TakeAllWeapons(); + self waittill("_meatshield:anims_done"); + self.player SetViewModel(level.player_viewmodel); + if(!IsDefined(level._meatshield_no_weapon_management)) + { + self.player give_weapons(); + } + self.ai.overrideActorDamage = undefined; + self.player.ignoreme = false; + self.player unlink_player(); + self.player AllowCrouch(true); + self.player AllowProne(true); + self.player SetAutoPickup(true); + self.player SetClientDvar("sv_clientSideBullets", 1); + self.blood_overlay_model Delete(); + self.ai notify("_meatshield:done"); + self.player notify("_meatshield:done"); + if(IsDefined(self.ai)) + { + self.ai.team = "axis"; + } + self.player._meatshield = undefined; +} +do_meat_shield(guy) +{ + _meatshield = start(guy); + _meatshield thread do_anims(); + _meatshield thread last_guy(); + _meatshield thread meatshield_ai_targets_vox(); + _meatshield thread turn_loop( guy.left_constraint, guy.right_constraint); + _meatshield thread ms_timer(); + _meatshield finish(); +} +meatshield_damage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime) +{ + MAX_DAMAGE = 7000; + if (!IsDefined(self._meatshield.damage_taken)) + { + self._meatshield.damage_taken = 0; + } + if (!IsPlayer(eAttacker)) + { + self._meatshield.damage_taken += iDamage; + } + if (!is_true(self._meatshield.dead)) + { + if ((self._meatshield.damage_taken > MAX_DAMAGE) || (self._meatshield.time_left < level._meatshield_timer / 1.3)) + { + self._meatshield notify("_meatshield:death"); + self._meatshield.dead = true; + clientnotify( "msd" ); + if( is_mature() ) + { + self SetClientFlag(level.CLIENT_ENABLE_EAR_BLOOD); + } + } + } + if(self._meatshield ent_flag("meatshield_active")) + { + fake_bullets(); + } + return 0; +} +fake_bullets() +{ + self._meatshield.player endon("meatshield_active"); + tags = []; + tags[tags.size] = "J_Spine4"; + wait_time = .5; + for (i = 0; i < 1; i++) + { + fx_id = level._effect["meatshield_fake_hit"]; + if( is_mature() ) + { + PlayFXOnTag(fx_id, self, random(tags)); + } + wait(wait_time); + } +} +get_struct() +{ + assertex(IsDefined(self._meatshield), "maps/_meatshield::get_struct - Entity is not part of meatshield or called before init()."); + return self._meatshield; +} +get_align_pt( ai ) +{ + if( IsDefined( ai.target ) ) + { + temp_struct = getstruct( ai.target, "targetname" ); + align_point = Spawn("script_model", temp_struct.origin); + align_point.angles = temp_struct.angles; + } + else + { + align_point = Spawn("script_model", ai.origin); + align_point.angles = self.angles; + } + align_point SetModel("tag_origin"); + return (align_point); +} +link_player(absolute) +{ + self set_near_plane(1); + if(IsDefined(level._meatshield_gun_offset)) + { + setdvar( "bg_gunXOffset", level._meatshield_gun_offset ); + } + else + { + setdvar( "bg_gunXOffset", 100 ); + } + self.player_hands LinkTo(self._meatshield.align); + if (is_true(absolute)) + { + self StartCameraTween(.3); + self PlayerLinkToAbsolute(self.player_hands, "tag_player"); + } + else + { + self PlayerLinkToDelta(self.player_hands, "tag_player", 0, level._MEATSHIELD_CLAMP_R, level._MEATSHIELD_CLAMP_L, level._MEATSHIELD_CLAMP_U, level._MEATSHIELD_CLAMP_D, true); + } +} +unlink_player() +{ + self reset_near_plane(); + setdvar( "bg_gunXOffset", 0 ); + self Unlink(); +} +turn_loop( left_constraint, right_constraint ) +{ + self endon("meatshield_active"); + original_angle = flat_angle(self.player GetPlayerAngles()); + if(IsDefined(left_constraint) && IsDefined(right_constraint)) + { + if(left_constraint == 0 && right_constraint == 0) + { + return; + } + left_constraint -= level._MEATSHIELD_CLAMP_L; + right_constraint += level._MEATSHIELD_CLAMP_R;; + } + while (true) + { + new_ang = self.player GetPlayerAngles(); + ang = flat_angle(new_ang); + if(IsDefined(left_constraint) && IsDefined(right_constraint)) + { + zeroed_ang = ang - original_angle; + clamped_ang = AngleClamp180( zeroed_ang[1] ); + if(clamped_ang < left_constraint && clamped_ang > right_constraint) + { + self.align RotateTo(ang, .06); + wait(0.05); + } + else + { + wait(0.05); + } + } + else + { + self.align RotateTo(ang, .06); + wait .05; + } + } +} +do_anims(ents) +{ + self idle_loop("idle"); + for (i = 0; i < self.anim_ents.size; i++) + { + self.anim_ents[i] anim_set_blend_in_time(.5); + self.anim_ents[i] anim_set_blend_out_time(.5); + } + self.align anim_single_aligned(self.anim_ents, "trans_2_dead"); + if (self ent_flag("meatshield_active")) + { + self idle_loop("dead_idle"); + } + self.ai.overrideActorDamage = undefined; + self.player link_player(true); + playsoundatposition( "evt_s01_ms_push_body", (0,0,0) ); + self.align anim_single_aligned(self.anim_ents, "drop"); + self notify("_meatshield:anims_done"); +} +idle_loop(which_idle) +{ + self endon("_meatshield:death"); + self endon("meatshield_active"); + while (true) + { + if (self.player AdsButtonPressed()) + { + self.align thread anim_loop_aligned(self.anim_ents, which_idle + "_steady"); + self.player waittill("!_ads_button_pressed"); + } + else + { + self.align thread anim_loop_aligned(self.anim_ents, which_idle); + self.player waittill("_ads_button_pressed"); + } + } +} +ms_timer() +{ + self endon("meatshield_active"); + fired_gun = false; + NON_FIRE_IDLE_PERCENT = 0.4; + while (true) + { + flag_wait("timer_on"); + self.time_left = level._meatshield_timer; + for (i = level._meatshield_timer; i >= -1; i--) + { + if(self.player AttackButtonPressed()) + { + fired_gun = true; + } + if( i < level._meatshield_timer * NON_FIRE_IDLE_PERCENT && !fired_gun && level._meatshield_kill_player == true) + { + self ms_idle_fail_player(); + break; + } + if (i == -1) + { + flag_clear("timer_on"); + if(level._meatshield_kill_player == true) + { + self ms_idle_fail_player(); + break; + } + self ent_flag_clear("meatshield_active"); + } + else if (flag("timer_on")) + { + timer_wait(1); + self.time_left--; + level notify("timer_update", i); + } + else + { + break; + } + } + } +} +timer_wait(t) +{ + level endon("timer_on"); + wait t; +} +ms_idle_fail_player() +{ + self.player FreezeControls(true); + for(i = 1; i < 11; i++) + { + x = i * 0.1; + self blood_hud(x); + self.player PlayRumbleOnEntity( "grenade_rumble" ); + wait 0.1; + } + MissionFailed(); +} +add_angle_limits( guy, left_angle, right_angle ) +{ + guy.left_constraint = left_angle; + guy.right_constraint = right_angle; +} +add_target(meatshield, scripted) +{ + if (!IsDefined(meatshield._meatshield_targets)) + { + meatshield._meatshield_targets = []; + } + meatshield thread add_target_and_remove_when_dead(self); + if (!is_true(scripted)) + { + self thread shoot_at_meatshield(meatshield); + } +} +add_target_and_remove_when_dead(target) +{ + self endon("death"); + self endon("_meatshield:end"); + self._meatshield_targets = add_to_array(self._meatshield_targets, target, false); + target thread target_wait_for_special_fake_death( self ); + target thread target_wait_for_real_death( self ); +} +target_wait_for_special_fake_death( meatshield_ai ) +{ + meatshield_ai endon("death"); + meatshield_ai endon("_meatshield:end"); + self endon( "death" ); + self waittill( "special_fake_death" ); + meatshield_ai._meatshield_targets = array_remove( meatshield_ai._meatshield_targets, self ); +} +target_wait_for_real_death( meatshield_ai ) +{ + meatshield_ai endon("death"); + meatshield_ai endon("_meatshield:end"); + self endon("special_fake_death"); + self waittill( "death" ); + meatshield_ai._meatshield_targets = array_removedead( meatshield_ai._meatshield_targets ); +} +shoot_at_meatshield(meatshield) +{ + self endon("death"); + meatshield waittill("_meatshield:start"); + self.perfectAim = 1; + self set_ignoreall(false); + self.a.allow_sidearm = false; + self thread shoot_at_target(meatshield, "J_MainRoot", 2, 999999); + meatshield._meatshield ent_flag_waitopen("meatshield_active"); + self stop_shoot_at_target(); +} +last_guy() +{ + self ent_flag_wait("meatshield_active"); + while (self.ai._meatshield_targets.size > 1) + { + if (self ent_flag("meatshield_active")) + { + wait .05; + } + else + { + return; + } + } + last_guy = self.ai._meatshield_targets[0]; + if(level._meatshield_bulletcam) + { + last_guy maps\_bulletcam::enable(true); + } + level notify("meat_shield_last_guy", last_guy); + last_guy notify("meat_shield_last_guy"); + self thread finish_on_last_guy_death(last_guy); + self ent_flag_waitopen("meatshield_active"); + if(level._meatshield_bulletcam && IsAlive(last_guy)) + { + last_guy maps\_bulletcam::enable(false); + } +} +finish_on_last_guy_death(last_guy) +{ + self endon("meatshield_active"); + if(level._meatshield_bulletcam) + { + self.player waittill("_bulletcam:end"); + } + else + { + last_guy waittill("death"); + } + self ent_flag_clear("meatshield_active"); +} +blood_hud(alpha_val) +{ + if (self ent_flag("meatshield_active")) + { + if (!IsDefined(self.blood_hud)) + { + self.blood_hud = NewClientHudElem(self.player); + self.blood_hud.horzAlign = "fullscreen"; + self.blood_hud.vertAlign = "fullscreen"; + self.blood_hud SetShader( "overlay_blood_meat_shield", 640, 480 ); + self.blood_hud.alpha = 0; + self thread blood_hud_destroy(); + } + self.blood_hud.alpha = alpha_val; + } +} +blood_hud_destroy() +{ + FADE_TIME = 2; + self ent_flag_waitopen("meatshield_active"); + self.blood_hud FadeOverTime(FADE_TIME); + self.blood_hud.alpha = 0; + wait(FADE_TIME); + self.blood_hud Destroy(); +} +find_closest_target_to_view() +{ + closest_ent = undefined; + smallest_ang = 360; + eye = self.player GetEye(); + view_ang = AbsAngleClamp180(self.player GetPlayerAngles()[1]); + for (i = 0; i < self.ai._meatshield_targets.size; i++) + { + if( IsDefined( self.ai._meatshield_targets[i] ) ) + { + ang_to_target = VectorToAngles(self.ai._meatshield_targets[i].origin - eye); + ang_to_target = AbsAngleClamp180(ang_to_target[1]); + angle_diff = abs(view_ang - ang_to_target); + if ( (angle_diff < level._MEATSHIELD_CLAMP_L) && (angle_diff < smallest_ang) ) + { + smallest_ang = angle_diff; + closest_ent = self.ai._meatshield_targets[i]; + } + } + } + return closest_ent; +} +ads_loop_reallow_aim_assist() +{ + self waittill("meatshield_active"); + self.player resetAdsWidthAndLerp(); +} +ads_loop() +{ + self endon("meatshield_active"); + self thread ads_loop_reallow_aim_assist(); + self.player setAdsWidthAndLerp( 400, 10 ); + while (true) + { + if (self.player AdsButtonPressed()) + { + self.player notify("_ads_button_pressed"); + } + while (self.player AdsButtonPressed()) + { + wait .05; + } + self.player notify("!_ads_button_pressed"); + wait .05; + } +} +test() +{ + self thread link_loop(); + self thread toggle_timer(); + self thread timer_hud(); +} +link_loop() +{ + while (true) + { + if (self ButtonPressed("DPAD_DOWN")) + { + self Unlink(); + } + else if (self ButtonPressed("DPAD_UP")) + { + if (IsDefined(self.player_hands)) + { + self link_player(); + } + } + wait .05; + } +} +toggle_timer() +{ + while (true) + { + while (!self ButtonPressed("DPAD_RIGHT")) + { + wait .05; + } + flag_toggle("timer_on"); + wait .2; + } +} +timer_hud() +{ + while (true) + { + level waittill("timer_update", val); + hud = get_timer_hud(); + if (IsDefined(hud)) + { + hud SetValue(val); + } + } +} +get_timer_hud() +{ + if (!flag("timer_on")) + { + return undefined; + } + if (!IsDefined(level.ms_timer_hud)) + { + level.ms_timer_hud = NewDebugHudElem(); + level.ms_timer_hud.alignX = "center"; + level.ms_timer_hud.x = 0; + level.ms_timer_hud.y = 20; + level.ms_timer_hud.label = "Timer: "; + level.ms_timer_hud thread destroy_timer_hud(); + } + return(level.ms_timer_hud); +} +destroy_timer_hud() +{ + flag_waitopen("timer_on"); + self Destroy(); +} +set_custom_audio_func( _audio_func_pointer ) +{ + level.meatshield_custom_audio = _audio_func_pointer; +} +meatshield_ai_targets_vox() +{ + self endon("meatshield_active"); + while( self.ai._meatshield_targets.size > 1 ) + { + random(self.ai._meatshield_targets) thread play_fake_battlechatter(); + wait(.5); + } + last_guy = self.ai._meatshield_targets[0]; + self.player waittill( "_bulletcam:start" ); + level notify( "bulletcam_start" ); +} +play_fake_battlechatter() +{ + self endon("death"); + if( !IsDefined( level.meatshield_ai_speaking ) ) + level.meatshield_ai_speaking = false; + fake_conversation = []; + fake_conversation[0] = "_act_fragout"; + fake_conversation[1] = "_rspns_killfirm"; + fake_conversation[2] = "_rspns_lm"; + fake_conversation[3] = "_rspns_fragout"; + prefix = "dds_vc"; + ai = RandomIntRange(0,2); + category = fake_conversation[RandomIntRange(0,3)]; + suffix = "_0" + RandomIntRange(0,4); + alias = prefix + ai + category + suffix; + if( level.meatshield_ai_speaking == false ) + { + level.meatshield_ai_speaking = true; + self PlaySound( alias, "sounddone" ); + self waittill( "sounddone" ); + wait(RandomFloatRange(1,3)); + level.meatshield_ai_speaking = false; + } +} +meatshield_audio_init( _meatshield ) +{ + SetTimeScale(.8); + _meatshield.ai waittill("_meatshield:done"); + clientnotify( "meatd" ); + SetTimeScale(1); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_menus.gsc b/BO1/PC/ZM/maps/_menus.gsc new file mode 100644 index 0000000..ee42815 --- /dev/null +++ b/BO1/PC/ZM/maps/_menus.gsc @@ -0,0 +1,768 @@ + +#include maps\_utility; +#include maps\_hud_util; +init() +{ + precacheMenu( "uiScript_startMultiplayer" ); + precacheShader( "black" ); + precacheShader( "white" ); + precacheShader( "menu_button" ); + precacheShader( "menu_button_selected" ); + precacheShader( "menu_button_fade" ); + precacheShader( "menu_button_fade_selected" ); + precacheShader( "menu_button_faderight" ); + precacheShader( "menu_button_faderight_selected" ); + precacheShader( "menu_caret_open" ); + precacheShader( "menu_caret_closed" ); + thread initThumbstickLayout(); + thread initButtonLayout(); + thread initSensitivity(); + thread initInversion(); + thread initAutoaim(); + thread initVibration(); + level.menuStack = []; + levelMenu = createMenu( "levels" ); + action = setupAction(::loadMap, "cqb_1"); + description = spawnStruct(); + description.display = &"MENU_1ST_PASS"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_CQB_TEST", action, "loadmap", description ); + action = setupAction(::loadMap, "descent"); + description = spawnStruct(); + description.display = &"MENU_1ST_PASS"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_BUNKER", action, "loadmap", description ); + action = setupAction(::loadMap, "aftermath"); + description = spawnStruct(); + description.display = &"MENU_100_INITIAL_GEO"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_AFTERMATH", action, "loadmap", description ); + action = setupAction(::loadMap, "chechnya_escape"); + description = spawnStruct(); + description.display = &"MENU_40_INITIAL_GEO"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_CHECHNYA_ESCAPE", action, "loadmap", description ); + action = setupAction(::loadMap, "marksman"); + description = spawnStruct(); + description.display = &"MENU_25_SCRIPTED"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_MARKSMAN", action, "loadmap", description ); + action = setupAction(::loadMap, "seaknight_defend"); + description = spawnStruct(); + description.display = &"MENU_PROTOTYPE_LEVEL_30_SCRIPTED"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_SEAKNIGHT_DEFEND", action, "loadmap", description ); + action = setupAction(::loadMap, "wetwork"); + description = spawnStruct(); + description.display = &"MENU_100_INITIAL_GEO"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_WETWORK", action, "loadmap", description ); + action = setupAction(::loadMap, "cargoship"); + description = spawnStruct(); + description.display = &"MENU_10_SCRIPTED"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_CARGOSHIP", action, "loadmap", description ); + action = setupAction(::loadMap, "bog"); + description = spawnStruct(); + description.display = &"MENU_35_INITIAL_GEO"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_BOG", action, "loadmap", description ); + action = setupAction(::loadMap, "training"); + description = spawnStruct(); + description.display = &"MENU_5_SCRIPTED"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_TRAINING1", action, "loadmap", description ); + action = setupAction(::loadMap, "ac130"); + description = spawnStruct(); + description.display = &"MENU_30"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_AC130", action, "loadmap", description ); + action = setupAction(::loadMap, "seaknight_assault"); + description = spawnStruct(); + description.display = &"MENU_INITIAL_GEO_IN_PROGRESS"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_SEAKNIGHT_ASSAULT", action, "loadmap", description ); + action = setupAction(::loadMap, "pilotcobra"); + description = spawnStruct(); + description.display = &"MENU_INITIAL_GEO_IN_PROGRESS"; + description.xPos = 240; + description.yPos = 100; + levelMenu addItem( &"MENU_PILOT_COBRA", action, "loadmap", description ); + controlsMenu = createMenu_Controls( "controls" ); + setting = spawnStruct(); + setting.index = 0; + setting.dvar = "controls_sticksConfig"; + setting.value[0] = "thumbstick_default"; + setting.value[1] = "thumbstick_southpaw"; + setting.value[2] = "thumbstick_legacy"; + setting.value[3] = "thumbstick_legacysouthpaw"; + setting.display[0] = "Default"; + setting.display[1] = "Southpaw"; + setting.display[2] = "Legacy"; + setting.display[3] = "Legacy Southpaw"; + controlsMenu addItemSetting( &"PLATFORM_THUMBSTICK_LAYOUT", undefined, undefined, undefined, setting ); + setting = spawnStruct(); + setting.index = 0; + setting.dvar = "controls_buttonConfig"; + setting.value[0] = "buttons_default"; + setting.value[1] = "buttons_experimental"; + setting.value[2] = "buttons_lefty"; + setting.value[3] = "buttons_finesthour"; + setting.display[0] = "Default"; + setting.display[1] = "Experimental"; + setting.display[2] = "Lefty"; + setting.display[3] = "Finest Hour"; + controlsMenu addItemSetting( &"MENU_BUTTON_LAYOUT", undefined, undefined, undefined, setting ); + setting = spawnStruct(); + setting.index = 1; + setting.dvar = "controls_sensitivityConfig"; + setting.value[0] = "sensitivity_low"; + setting.value[1] = "sensitivity_medium"; + setting.value[2] = "sensitivity_high"; + setting.value[3] = "sensitivity_veryhigh"; + setting.display[0] = "Low"; + setting.display[1] = "Medium"; + setting.display[2] = "High"; + setting.display[3] = "Very High"; + controlsMenu addItemSetting( &"MENU_LOOK_SENSITIVITY", undefined, undefined, undefined, setting ); + setting = spawnStruct(); + setting.index = 0; + setting.dvar = "controls_inversionConfig"; + setting.value[0] = "inversion_disabled"; + setting.value[1] = "inversion_enabled"; + setting.display[0] = "Disabled"; + setting.display[1] = "Enabled"; + controlsMenu addItemSetting( &"MENU_LOOK_INVERSION", undefined, undefined, undefined, setting ); + setting = spawnStruct(); + setting.index = 1; + setting.dvar = "controls_autoaimConfig"; + setting.value[0] = "autoaim_disabled"; + setting.value[1] = "autoaim_enabled"; + setting.display[0] = "Disabled"; + setting.display[1] = "Enabled"; + controlsMenu addItemSetting( &"MENU_AUTOAIM", undefined, undefined, undefined, setting ); + setting = spawnStruct(); + setting.index = 1; + setting.dvar = "controls_vibrationConfig"; + setting.value[0] = "vibration_disabled"; + setting.value[1] = "vibration_enabled"; + setting.display[0] = "Disabled"; + setting.display[1] = "Enabled"; + controlsMenu addItemSetting( &"MENU_CONTROLLER_VIBRATION", undefined, undefined, undefined, setting ); + mainMenu = createMenu( "main" ); + action = setupAction(::pushMenu, levelMenu); + mainMenu addItem( &"MENU_SELECT_LEVEL", action, "openmenu_levels" ); + subMenu = mainMenu addSubMenu( "options", &"MENU_OPTIONS" ); + action = setupAction(::pushMenu, controlsMenu); + subMenu addItem( &"MENU_CONTROLS", action ); + subMenu addItem( &"MENU_SUBTITLES" ); + subMenu addItem( &"MENU_SAVE_DEVICE" ); + mainMenu addItem( &"MENU_CREDITS" ); + action = setupAction(::loadMultiplayer); + mainMenu addItem( &"MENU_MULTIPLAYER", action ); + pushMenu( mainMenu ); + getEnt( "player", "classname" ) thread menuResponse(); +} +void() +{ +} +loadMap( map ) +{ + changelevel( map ); +} +loadMultiplayer() +{ + level.player openMenu( "uiScript_startMultiplayer" ); +} +pushMenu( menuDef ) +{ + level.menuStack[level.menuStack.size] = menuDef; + oldMenu = level.curMenu; + level.curMenu = menuDef; + if ( menuDef.menuType == "fullScreen" ) + { + if ( isDefined( oldMenu ) ) + oldMenu thread hideMenu( 0.2, true ); + menuDef thread showMenu( 0.2, true ); + level notify ( "open_menu", level.curMenu.name ); + } + else + { + menuDef thread expandMenu( 0.2 ); + } + level.player playsound("mouse_click"); +} +popMenu() +{ + if ( level.menuStack.size == 1 ) + return; + level.menuStack[level.menuStack.size - 1] = undefined; + oldMenu = level.curMenu; + level.curMenu = level.menuStack[level.menuStack.size - 1]; + if ( oldMenu.menuType == "subMenu" ) + { + oldMenu thread collapseMenu( 0.2 ); + level.curMenu updateMenu( 0.2, true ); + } + else + { + oldMenu thread hideMenu( 0.2, false ); + level.curMenu thread showMenu( 0.2, false ); + level notify ( "close_menu", level.menuStack.size ); + } + level.player playsound("mouse_click"); +} +createMenu( name ) +{ + menuDef = spawnStruct(); + menuDef.name = name; + menuDef.menuType = "fullScreen"; + menuDef.itemDefs = []; + menuDef.itemWidth = 120; + menuDef.itemHeight = 20; + menuDef.itemPadding = 0; + menuDef.selectedIndex = 0; + menuDef.xPos = 80; + menuDef.yPos = 100; + menuDef.xOffset = 0; + menuDef.yOffset = 0; + return menuDef; +} +createMenu_Controls( name ) +{ + menuDef = spawnStruct(); + menuDef.name = name; + menuDef.menuType = "fullScreen"; + menuDef.itemDefs = []; + menuDef.itemWidth = 420; + menuDef.itemHeight = 20; + menuDef.itemPadding = 0; + menuDef.selectedIndex = 0; + menuDef.xPos = 80; + menuDef.yPos = 100; + menuDef.xOffset = 0; + menuDef.yOffset = 0; + return menuDef; +} +createSubMenu( name ) +{ + subMenuDef = spawnStruct(); + subMenuDef.name = name; + subMenuDef.menuType = "subMenu"; + subMenuDef.itemDefs = []; + subMenuDef.itemWidth = 120; + subMenuDef.itemHeight = 20; + subMenuDef.itemPadding = 0; + subMenuDef.selectedIndex = 0; + subMenuDef.isExpanded = false; + return subMenuDef; +} +addItem( text, action, event, description ) +{ + precacheString(text); + itemDef = spawnStruct(); + itemDef.itemType = "item"; + itemDef.bgShader = "menu_button_selected"; + itemDef.fgText = text; + itemDef.xPos = 0; + itemDef.yPos = 0; + itemDef.xOffset = 0; + itemDef.yOffset = 0; + itemDef.action = action; + itemDef.event = event; + itemDef.description = description; + itemDef.parentDef = self; + itemDef.index = self.itemDefs.size; + self.itemDefs[self.itemDefs.size] = itemDef; +} +addItemSetting( text, action, event, description, setting ) +{ + precacheString(text); + itemDef = spawnStruct(); + itemDef.itemType = "settingMenu"; + itemDef.bgShader = "menu_button_selected"; + itemDef.fgText = text; + itemDef.xPos = 0; + itemDef.yPos = 0; + itemDef.xOffset = 0; + itemDef.yOffset = 0; + itemDef.action = action; + itemDef.event = event; + itemDef.description = description; + itemDef.setting = setting; + itemDef.parentDef = self; + itemDef.index = self.itemDefs.size; + self.itemDefs[self.itemDefs.size] = itemDef; +} +addSubMenu( name, text ) +{ + itemDef = createSubMenu(name); + itemDef.itemType = "subMenu"; + itemDef.bgShader = "menu_button_selected"; + itemDef.fgText = text; + itemDef.xPos = 0; + itemDef.yPos = 0; + itemDef.xOffset = 20; + itemDef.yOffset = (self.itemHeight + self.itemPadding) ; + itemDef.parentDef = self; + itemDef.index = self.itemDefs.size; + self.itemDefs[self.itemDefs.size] = itemDef; + return itemDef; +} +createItemElems() +{ + self.bgIcon = createIcon( self.bgShader, self.parentDef.itemWidth, self.parentDef.itemHeight ); + self.bgIcon.alpha = 0; + self.bgIcon.sort = 0; + self.fontString = createFontString( "default", 1.5 ); + self.fontString.alpha = 0; + self.fontString.sort = 100; + self.fontString setText( self.fgText ); + if ( self.itemType == "settingMenu" ) + { + self.settingValue = createFontString( "default", 1.5 ); + self.settingValue.alpha = 0; + self.settingValue.sort = 100; + self updateDisplayValue(); + } + if ( self.itemType == "subMenu" ) + { + self.caretIcon = createIcon( "menu_caret_closed", self.parentDef.itemHeight, self.parentDef.itemHeight ); + self.caretIcon.alpha = 0; + self.caretIcon.sort = 100; + } + if ( isdefined ( self.description ) ) + { + self.descriptionValue = createFontString( "default", 1.5 ); + self.descriptionValue.alpha = 0; + self.descriptionValue.sort = 100; + self.descriptionValue setText( self.description.display ); + } +} +destroyItemElems() +{ + if ( self.itemType == "subMenu" ) + self.caretIcon destroyElem(); + if ( self.itemType == "settingMenu" ) + self.settingValue destroyElem(); + if ( isdefined ( self.descriptionValue ) ) + self.descriptionValue destroyElem(); + self.bgIcon destroyElem(); + self.fontString destroyElem(); +} +setElemPoints( point, relativePoint, xPos, yPos, transTime ) +{ + xOffset = 3; + self.bgIcon setPoint( point, relativePoint, xPos, yPos, transTime ); + if ( self.itemType == "subMenu" ) + { + self.caretIcon setPoint( point, relativePoint, xPos, yPos, transTime ); + xOffset += 16; + } + if ( self.itemType == "settingMenu" ) + { + self.settingValue setPoint( "TOPRIGHT", relativePoint, xPos + xOffset + 400, yPos, transTime ); + } + if ( isdefined ( self.descriptionValue ) ) + { + self.descriptionValue setPoint( "TOPLEFT", relativePoint, self.description.xPos, self.description.yPos, transTime ); + } + self.fontString setPoint( point, relativePoint, xPos + xOffset, yPos, transTime ); +} +showMenu( transTime, isNew ) +{ + yOffset = 0; + for ( index = 0; index < self.itemDefs.size; index++ ) + { + itemDef = self.itemDefs[index]; + itemDef createItemElems(); + if ( isNew ) + { + itemDef setElemPoints( "TOPLEFT", "TOPRIGHT", self.xPos, self.yPos + yOffset ); + } + else + { + itemDef setElemPoints( "TOPRIGHT", "TOPLEFT", self.xPos, self.yPos + yOffset ); + } + itemDef.xPos = self.xPos; + itemDef.yPos = self.yPos + yOffset; + yOffset += (self.itemHeight + self.itemPadding); + if ( itemDef.itemType == "subMenu" && itemDef.isExpanded ) + { + yOffset += itemDef getMenuHeight(); + } + } + if ( self.menuType == "subMenu" ) + self.parentDef showMenu( transTime, isNew ); + self updateMenu( transTime, true ); +} +hideMenu( transTime, isNew ) +{ + yOffset = 0; + for ( index = 0; index < self.itemDefs.size; index++ ) + { + itemDef = self.itemDefs[index]; + xOffset = -1 * self.itemWidth; + if ( isNew ) + { + itemDef setElemPoints( "TOPRIGHT", "TOPLEFT", self.xPos, self.yPos + yOffset, transTime ); + itemDef.bgIcon fadeOverTime( transTime ); + itemDef.bgIcon.alpha = 0; + itemDef.fontString fadeOverTime( transTime ); + itemDef.fontString.alpha = 0; + if ( itemDef.itemType == "settingMenu" ) + { + itemDef.settingValue fadeOverTime( transTime ); + itemDef.settingValue.alpha = 0; + } + if ( itemDef.itemType == "subMenu" ) + { + itemDef.caretIcon fadeOverTime( transTime ); + itemDef.caretIcon.alpha = 0; + } + } + else + { + itemDef setElemPoints( "TOPLEFT", "TOPRIGHT", self.xPos, self.yPos + yOffset, transTime ); + itemDef.bgIcon fadeOverTime( transTime ); + itemDef.bgIcon.alpha = 0; + itemDef.fontString fadeOverTime( transTime ); + itemDef.fontString.alpha = 0; + if ( itemDef.itemType == "settingMenu" ) + { + itemDef.settingValue fadeOverTime( transTime ); + itemDef.settingValue.alpha = 0; + } + if ( itemDef.itemType == "subMenu" ) + { + itemDef.caretIcon fadeOverTime( transTime ); + itemDef.caretIcon.alpha = 0; + } + } + itemDef.xPos = self.xPos; + itemDef.yPos = self.yPos + yOffset; + yOffset += (self.itemHeight + self.itemPadding); + if ( itemDef.itemType == "subMenu" && itemDef.isExpanded ) + { + yOffset += itemDef getMenuHeight(); + } + } + if ( self.menuType == "subMenu" ) + self.parentDef thread hideMenu( transTime, isNew ); + wait transTime; + for ( index = 0; index < self.itemDefs.size; index++ ) + { + itemDef = self.itemDefs[index]; + itemDef destroyItemElems(); + } +} +collapseMenu( transTime ) +{ + self.isExpanded = false; + self.caretIcon setShader( "menu_caret_closed", self.parentDef.itemHeight, self.parentDef.itemHeight ); + yOffset = 0; + for ( index = 0; index < self.itemDefs.size; index++ ) + { + itemDef = self.itemDefs[index]; + itemDef setElemPoints( "TOPLEFT", "TOPLEFT", self.xPos, self.yPos, transTime ); + itemDef.bgIcon fadeOverTime( transTime ); + itemDef.bgIcon.alpha = 0; + itemDef.fontString fadeOverTime( transTime ); + itemDef.fontString.alpha = 0; + if ( itemDef.itemType == "subMenu" ) + { + itemDef.caretIcon fadeOverTime( transTime ); + itemDef.caretIcon.alpha = 0; + } + itemDef.xPos = self.xPos; + itemDef.yPos = self.yPos; + } + wait transTime; + for ( index = 0; index < self.itemDefs.size; index++ ) + { + itemDef = self.itemDefs[index]; + itemDef.bgIcon destroyElem(); + itemDef.fontString destroyElem(); + if ( itemDef.itemType == "subMenu" ) + itemDef.caretIcon destroyElem(); + } +} +expandMenu( transTime ) +{ + self.isExpanded = true; + self.caretIcon setShader( "menu_caret_open", self.parentDef.itemHeight, self.parentDef.itemHeight ); + for ( index = 0; index < self.itemDefs.size; index++ ) + { + itemDef = self.itemDefs[index]; + itemDef createItemElems(); + itemDef setElemPoints( "TOPLEFT", "TOPLEFT", self.xPos + self.xOffset, self.yPos + self.yOffset ); + itemDef.xPos = self.xPos + self.xOffset; + itemDef.yPos = self.yPos + self.yOffset; + } + self updateMenu( transTime, true ); +} +updateMenu( transTime, forceRedraw ) +{ + xOffset = self.xOffset; + yOffset = self.yOffset; + for ( index = 0; index < self.itemDefs.size; index++ ) + { + itemDef = self.itemDefs[index]; + itemDef setSelected( transTime, index == self.selectedIndex ); + lastXPos = itemDef.xPos; + lastYPos = itemDef.yPos; + if ( forceRedraw || (self.xPos + xOffset != lastXPos) || (self.yPos + yOffset != lastYPos) ) + { + itemDef setElemPoints( "TOPLEFT", "TOPLEFT", self.xPos + xOffset, self.yPos + yOffset, transTime ); + itemDef.xPos = self.xPos + xOffset; + itemDef.yPos = self.yPos + yOffset; + } + yOffset += (self.itemHeight + self.itemPadding); + if ( itemDef.itemType == "subMenu" && itemDef.isExpanded ) + { + assert( level.curMenu != self ); + yOffset += itemDef getMenuHeight(); + } + } + if ( isDefined( self.parentDef ) ) + self.parentDef thread updateMenu( transTime, forceRedraw ); +} +setSelected( transTime, isSelected ) +{ + self.bgIcon fadeOverTime( transTime ); + self.fontString fadeOverTime( transTime ); + if ( isdefined( self.settingValue ) ) + self.settingValue fadeOverTime( transTime ); + if ( isdefined( self.descriptionValue ) ) + self.descriptionValue fadeOverTime( transTime ); + if ( isSelected ) + { + if ( self.parentDef == level.curMenu ) + self setElemAlpha( 1 ); + else + self setElemAlpha( 0.5 ); + if ( isdefined ( self.descriptionValue ) ) + self.descriptionValue.alpha = 1; + } + else + { + if ( self.parentDef == level.curMenu ) + self setElemAlpha( 0.5 ); + else + self setElemAlpha( 0.25 ); + if ( isdefined ( self.descriptionValue ) ) + self.descriptionValue.alpha = 0; + } +} +setElemAlpha( alpha ) +{ + self.bgIcon.alpha = alpha; + self.fontString.alpha = alpha; + if ( self.itemType == "settingMenu" ) + self.settingValue.alpha = alpha; + if ( self.itemType == "subMenu" ) + self.caretIcon.alpha = alpha; +} +setElemColor( color ) +{ + self.fontString.color = color; +} +getMenuHeight() +{ + menuHeight = 0; + for ( index = 0; index < self.itemDefs.size; index++ ) + { + itemDef = self.itemDefs[index]; + menuHeight += (self.itemHeight + self.itemPadding); + if ( itemDef.itemType == "subMenu" && itemDef.isExpanded ) + menuHeight += itemDef getMenuHeight(); + } + return menuHeight; +} +onDPadUp() +{ + self.selectedIndex--; + if ( self.selectedIndex < 0 ) + self.selectedIndex = self.itemDefs.size - 1; + self updateMenu( 0.1, false ); + level.player playsound("mouse_over"); +} +onDPadDown() +{ + self.selectedIndex++; + if ( self.selectedIndex >= self.itemDefs.size ) + self.selectedIndex = 0; + self updateMenu( 0.1, false ); + level.player playsound("mouse_over"); +} +onButtonB() +{ + popMenu(); +} +onButtonA() +{ + focusedItem = self.itemDefs[self.selectedIndex]; + if ( focusedItem.itemType == "subMenu" ) + pushMenu( focusedItem ); + else if ( focusedItem.itemType == "item" ) + { + focusedItem thread runAction(); + } +} +onDPadLeft() +{ + focusedItem = self.itemDefs[self.selectedIndex]; + if ( focusedItem.itemType == "settingMenu" ) + { + dvarCurrent = getdvar( focusedItem.setting.dvar ); + dvarValues = focusedItem.setting.value; + indexNew = 0; + for ( i = 0; i < dvarValues.size; i++ ) + { + dvarValue = dvarValues[i]; + if(dvarValue != dvarCurrent) + continue; + indexNew = i - 1; + if(indexNew >= 0) + { + focusedItem.setting.index = indexNew; + setdvar( focusedItem.setting.dvar, dvarValues[indexNew] ); + focusedItem updateDisplayValue(); + println( "Setting: " + focusedItem.setting.dvar + " to " + dvarValues[indexNew] ); + level.player playsound("mouse_over"); + } + break; + } + } +} +onDPadRight() +{ + focusedItem = self.itemDefs[self.selectedIndex]; + if ( focusedItem.itemType == "settingMenu" ) + { + dvarCurrent = getdvar( focusedItem.setting.dvar ); + dvarValues = focusedItem.setting.value; + indexNew = 0; + for ( i = 0; i < dvarValues.size; i++ ) + { + dvarValue = dvarValues[i]; + if(dvarValue != dvarCurrent) + continue; + indexNew = i + 1; + if(indexNew <= focusedItem.setting.value.size - 1) + { + focusedItem.setting.index = indexNew; + setdvar( focusedItem.setting.dvar, dvarValues[indexNew] ); + focusedItem updateDisplayValue(); + level.player playsound("mouse_over"); + println( "Setting: " + focusedItem.setting.dvar + " to " + dvarValues[indexNew] ); + } + break; + } + } +} +initThumbstickLayout() +{ + setdvar( "controls_sticksConfig", "thumbstick_default" ); +} +initButtonLayout() +{ + setdvar( "controls_buttonConfig", "buttons_default" ); +} +initSensitivity() +{ + setdvar( "controls_sensitivityConfig", "sensitivity_medium" ); +} +initInversion() +{ + setdvar( "controls_inversionConfig", "inversion_disabled" ); +} +initAutoAim() +{ + setdvar( "controls_autoaimConfig", "autoaim_enabled" ); +} +initVibration() +{ + setdvar( "controls_vibrationConfig", "vibration_enabled" ); +} +updateDisplayValue() +{ + self.settingValue setText( self.setting.display[self.setting.index] ); +} +setupAction(name, arg1, arg2) +{ + action = spawnStruct(); + action.name = name; + if ( isdefined ( arg1 ) ) + action.arg1 = arg1; + if ( isdefined ( arg2 ) ) + action.arg2 = arg2; + return action; +} +runAction() +{ + if ( isdefined ( self.action ) ) + { + if ( isdefined ( self.action.arg1 ) ) + thread [[self.action.name]]( self.action.arg1 ); + else + thread [[self.action.name]](); + } + if ( isdefined ( self.event ) ) + level notify ( self.event ); +} +testAction() +{ + level.marine setgoalnode(getnode("node2", "targetname")); + level.camera attachpath(getvehiclenode( "path2", "targetname" )); + level.camera thread maps\_vehicle::gopath(); +} +menuResponse() +{ + for ( ;; ) + { + self waittill( "menuresponse", menu, response ); + println( response ); + switch ( response ) + { + case "DPAD_UP": + level.curMenu onDPadUp(); + break; + case "DPAD_DOWN": + level.curMenu onDPadDown(); + break; + case "DPAD_LEFT": + level.curMenu onDPadLeft(); + break; + case "DPAD_RIGHT": + level.curMenu onDPadRight(); + break; + case "BUTTON_A": + level.curMenu onButtonA(); + break; + case "BUTTON_B": + level.curMenu onButtonB(); + break; + } + if ( menu = game["menu_changeclass"] ) + { + self closeMenu(); + self closeInGameMenu(); + self.selectedClass = true; + self [[level.class]](response); + } + } + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_mg_penetration.gsc b/BO1/PC/ZM/maps/_mg_penetration.gsc new file mode 100644 index 0000000..a7d940f Binary files /dev/null and b/BO1/PC/ZM/maps/_mg_penetration.gsc differ diff --git a/BO1/PC/ZM/maps/_mgturret.gsc b/BO1/PC/ZM/maps/_mgturret.gsc new file mode 100644 index 0000000..b0ed673 --- /dev/null +++ b/BO1/PC/ZM/maps/_mgturret.gsc @@ -0,0 +1,1458 @@ +#include maps\_utility; +#include common_scripts\utility; +#using_animtree( "generic_human" ); +init_mgTurretsettings() +{ + level.mgTurretSettings["easy"]["convergenceTime"] = 2.5; + level.mgTurretSettings["easy"]["suppressionTime"] = 3.0; + level.mgTurretSettings["easy"]["accuracy"] = 0.38; + level.mgTurretSettings["easy"]["aiSpread"] = 2; + level.mgTurretSettings["easy"]["playerSpread"] = 0.5; + level.mgTurretSettings["medium"]["convergenceTime"] = 1.5; + level.mgTurretSettings["medium"]["suppressionTime"] = 3.0; + level.mgTurretSettings["medium"]["accuracy"] = 0.38; + level.mgTurretSettings["medium"]["aiSpread"] = 2; + level.mgTurretSettings["medium"]["playerSpread"] = 0.5; + level.mgTurretSettings["hard"]["convergenceTime"] = .8; + level.mgTurretSettings["hard"]["suppressionTime"] = 3.0; + level.mgTurretSettings["hard"]["accuracy"] = 0.38; + level.mgTurretSettings["hard"]["aiSpread"] = 2; + level.mgTurretSettings["hard"]["playerSpread"] = 0.5; + level.mgTurretSettings["fu"]["convergenceTime"] = .4; + level.mgTurretSettings["fu"]["suppressionTime"] = 3.0; + level.mgTurretSettings["fu"]["accuracy"] = 0.38; + level.mgTurretSettings["fu"]["aiSpread"] = 2; + level.mgTurretSettings["fu"]["playerSpread"] = 0.5; +} +main() +{ + if( GetDvar( #"mg42" ) == "" ) + { + SetDvar( "mgTurret", "off" ); + } + level.magic_distance = 24; + turretInfos = getEntArray( "turretInfo", "targetname" ); + for( index = 0; index < turretInfos.size; index++ ) + { + turretInfos[index] Delete(); + } +} +portable_mg_behavior() +{ + self.a.combatrunanim = %ai_mg_shoulder_run; + self.run_noncombatanim = %ai_mg_shoulder_run; + self.walk_combatanim = %ai_mg_shoulder_run; + self.walk_noncombatanim = %ai_mg_shoulder_run; + self.a.crouchRunAnim = %ai_mg_shoulder_run; + self.crouchrun_combatanim = %ai_mg_shoulder_run; + self.alwaysRunForward = true; + self.disableExits = true; +} +mg42_trigger() +{ + self waittill( "trigger" ); + level notify( self.targetname ); + level.mg42_trigger[self.targetname] = true; + self Delete(); +} +mgTurret_auto( trigger ) +{ + trigger waittill( "trigger" ); + ai = GetAiArray( "axis" ); + for( i = 0; i < ai.size; i++ ) + { + if( ( IsDefined( ai[i].script_mg42auto ) ) &&( trigger.script_mg42auto == ai[i].script_mg42auto ) ) + { + ai[i] notify( "auto_ai" ); + println( "^a ai auto on!" ); + } + } + spawners = GetSpawnerArray(); + for( i = 0; i < spawners.size; i++ ) + { + if( ( IsDefined( spawners[i].script_mg42auto ) ) &&( trigger.script_mg42auto == spawners[i].script_mg42auto ) ) + { + spawners[i].ai_mode = "auto_ai"; + println( "^aspawner ", i, " set to auto" ); + } + } + maps\_spawner::kill_trigger( trigger ); +} +mg42_suppressionFire( targets ) +{ + self endon( "death" ); + self endon( "stop_suppressionFire" ); + if( !IsDefined( self.suppresionFire ) ) + { + self.suppresionFire = true; + } + for( ;; ) + { + while( self.suppresionFire ) + { + self SetTargetEntity( targets[RandomInt( targets.size )] ); + wait( 2 + RandomFloat( 2 ) ); + } + self ClearTargetEntity(); + while( !self.suppresionFire ) + { + wait( 1 ); + } + } +} +manual_think( mg42 ) +{ + self waittill( "auto_ai" ); + mg42 notify( "stopfiring" ); + mg42 SetMode( "auto_ai" ); +} +burst_fire_settings( setting ) +{ + if( setting == "delay" ) + { + return 0.2; + } + else if( setting == "delay_range" ) + { + return 0.5; + } + else if( setting == "burst" ) + { + return 0.5; + } + else if( setting == "burst_range" ) + { + return 4; + } +} +burst_fire_unmanned() +{ + self notify( "stop_burst_fire_unmanned" ); + self endon( "stop_burst_fire_unmanned" ); + self endon( "death" ); + if( IsDefined( self.script_delay_min ) ) + { + mg42_delay = self.script_delay_min; + } + else + { + mg42_delay = burst_fire_settings( "delay" ); + } + if( IsDefined( self.script_delay_max ) ) + { + mg42_delay_range = self.script_delay_max - mg42_delay; + } + else + { + mg42_delay_range = burst_fire_settings( "delay_range" ); + } + if( IsDefined( self.script_burst_min ) ) + { + mg42_burst = self.script_burst_min; + } + else + { + mg42_burst = burst_fire_settings( "burst" ); + } + if( IsDefined( self.script_burst_max ) ) + { + mg42_burst_range = self.script_burst_max - mg42_burst; + } + else + { + mg42_burst_range = burst_fire_settings( "burst_range" ); + } + pauseUntilTime = GetTime(); + turretState = "start"; + self.script_shooting = false; + for( ;; ) + { + if( IsDefined( self.manual_targets ) ) + { + self ClearTargetEntity(); + self SetTargetEntity( self.manual_targets[RandomInt( self.manual_targets.size )] ); + } + duration = ( pauseUntilTime - GetTime() ) * 0.001; + if( self IsFiringTurret() &&( duration <= 0 ) ) + { + if( turretState != "fire" ) + { + turretState = "fire"; + self thread DoShoot(); + self.script_shooting = true; + } + duration = mg42_burst + RandomFloat( mg42_burst_range ); + self thread TurretTimer( duration ); + self waittill( "turretstatechange" ); + self.script_shooting = false; + duration = mg42_delay + RandomFloat( mg42_delay_range ); + pauseUntilTime = GetTime() + Int( duration * 1000 ); + } + else + { + if( turretState != "aim" ) + { + turretState = "aim"; + } + self thread TurretTimer( duration ); + self waittill( "turretstatechange" ); + } + } +} +DoShoot() +{ + self endon( "death" ); + self endon( "turretstatechange" ); + for( ;; ) + { + self ShootTurret(); + wait( 0.1 ); + } +} +TurretTimer( duration ) +{ + if( duration <= 0 ) + { + return; + } + self endon( "turretstatechange" ); + wait( duration ); + if( IsDefined( self ) ) + { + self notify( "turretstatechange" ); + } +} +random_spread( ent ) +{ + self endon( "death" ); + self notify( "stop random_spread" ); + self endon( "stop random_spread" ); + self endon( "stopfiring" ); + self SetTargetEntity( ent ); + while( 1 ) + { + if( IsPlayer( ent ) ) + { + ent.origin = self.manual_target GetOrigin(); + } + else + { + ent.origin = self.manual_target.origin; + } + ent.origin += ( 20 - RandomFloat( 40 ), 20 - RandomFloat( 40 ), 20 - RandomFloat( 60 ) ); + wait( 0.2 ); + } +} +mg42_firing( mg42 ) +{ + self notify( "stop_using_built_in_burst_fire" ); + self endon( "stop_using_built_in_burst_fire" ); + mg42 StopFiring(); + while( 1 ) + { + mg42 waittill( "startfiring" ); + self thread burst_fire( mg42 ); + mg42 StartFiring(); + mg42 waittill( "stopfiring" ); + mg42 StopFiring(); + } +} +burst_fire( mg42, manual_target ) +{ + mg42 endon( "death" ); + mg42 endon( "stopfiring" ); + self endon( "stop_using_built_in_burst_fire" ); + if( IsDefined( mg42.script_delay_min ) ) + { + mg42_delay = mg42.script_delay_min; + } + else + { + mg42_delay = maps\_mgturret::burst_fire_settings( "delay" ); + } + if( IsDefined( mg42.script_delay_max ) ) + { + mg42_delay_range = mg42.script_delay_max - mg42_delay; + } + else + { + mg42_delay_range = maps\_mgturret::burst_fire_settings( "delay_range" ); + } + if( IsDefined( mg42.script_burst_min ) ) + { + mg42_burst = mg42.script_burst_min; + } + else + { + mg42_burst = maps\_mgturret::burst_fire_settings( "burst" ); + } + if( IsDefined( mg42.script_burst_max ) ) + { + mg42_burst_range = mg42.script_burst_max - mg42_burst; + } + else + { + mg42_burst_range = maps\_mgturret::burst_fire_settings( "burst_range" ); + } + while( 1 ) + { + mg42 StartFiring(); + if( IsDefined( manual_target ) ) + { + mg42 thread random_spread( manual_target ); + } + wait( mg42_burst + RandomFloat( mg42_burst_range ) ); + mg42 StopFiring(); + wait( mg42_delay + RandomFloat( mg42_delay_range ) ); + } +} +_spawner_mg42_think() +{ + if( !IsDefined( self.flagged_for_use ) ) + { + self.flagged_for_use = false; + } + if( !IsDefined( self.targetname ) ) + { + return; + } + node = GetNode( self.targetname, "target" ); + if( !IsDefined( node ) ) + { + return; + } + if( !IsDefined( node.script_mg42 ) ) + { + return; + } + if( !IsDefined( node.mg42_enabled ) ) + { + node.mg42_enabled = true; + } + self.script_mg42 = node.script_mg42; + first_run = true; + while( 1 ) + { + if( first_run ) + { + first_run = false; + if( ( IsDefined( node.targetname ) ) ||( self.flagged_for_use ) ) + { + self waittill( "get new user" ); + } + } + if( !node.mg42_enabled ) + { + node waittill( "enable mg42" ); + node.mg42_enabled = true; + } + excluders = []; + ai = GetAiArray(); + for( i = 0; i < ai.size; i++ ) + { + excluded = true; + if( ( IsDefined( ai[i].script_mg42 ) ) &&( ai[i].script_mg42 == self.script_mg42 ) ) + excluded = false; + if( IsDefined( ai[i].used_an_mg42 ) ) + { + excluded = true; + } + if( excluded ) + { + excluders[excluders.size] = ai[i]; + } + } + if( excluders.size ) + { + ai = maps\_utility::get_closest_ai_exclude( node.origin, undefined, excluders ); + } + else + { + ai = maps\_utility::get_closest_ai( node.origin, undefined ); + } + excluders = undefined; + if( IsDefined( ai ) ) + { + ai notify( "stop_going_to_node" ); + ai thread maps\_spawner::go_to_node( node ); + ai waittill( "death" ); + } + else + { + self waittill( "get new user" ); + } + } +} +move_use_turret( mg42, aitype, target ) +{ + self SetGoalPos( mg42.org ); + self.goalradius = level.magic_distance; + self waittill( "goal" ); + if( IsDefined( aitype ) && aitype == "auto_ai" ) + { + mg42 SetMode( "auto_ai" ); + if( IsDefined( target ) ) + { + mg42 SetTargetEntity( target ); + } + else + { + mg42 ClearTargetEntity(); + } + } + self USeturret( mg42 ); +} +turret_think( node ) +{ + turret = GetEnt( node.auto_mg42_target, "targetname" ); + mintime = 0.5; + if( IsDefined( turret.script_turret_reuse_min ) ) + { + mintime = turret.script_turret_reuse_min; + } + maxtime = 2; + if( IsDefined( turret.script_turret_reuse_max ) ) + { + mintime = turret.script_turret_reuse_max; + } + assert( maxtime >= mintime ); + for( ;; ) + { + turret waittill( "turret_deactivate" ); + wait( mintime + RandomFloat( maxtime - mintime ) ); + while( !( IsTurretActive( turret ) ) ) + { + turret_find_user( node, turret ); + wait( 1.0 ); + } + } +} +turret_find_user( node, turret ) +{ + ai = GetAiArray(); + for( i = 0; i < ai.size; i++ ) + { + if( ai[i] IsInGoal( node.origin ) && ai[i] CanUSeturret( turret ) ) + { + savekeepclaimed = ai[i].keepClaimedNodeInGoal; + ai[i].keepClaimedNodeInGoal = false; + if( !( ai[i] UseCOverNode( node ) ) ) + { + ai[i].keepClaimedNodeInGoal = savekeepclaimed; + } + } + } +} +setDifficulty() +{ + init_mgTurretsettings(); + mg42s = GetEntArray( "misc_turret", "classname" ); + difficulty = GetDifficulty(); + for( index = 0; index < mg42s.size; index++ ) + { + if( IsDefined( mg42s[index].script_skilloverride ) ) + { + switch( mg42s[index].script_skilloverride ) + { + case "easy": + difficulty = "easy"; + break; + case "medium": + difficulty = "medium"; + break; + case "hard": + difficulty = "hard"; + break; + case "fu": + difficulty = "fu"; + break; + default: + continue; + } + } + mg42_setdifficulty( mg42s[index], difficulty ); + } +} +mg42_setdifficulty( mg42, difficulty ) +{ + mg42.convergenceTime = level.mgTurretSettings[difficulty]["convergenceTime"]; + mg42.suppressionTime = level.mgTurretSettings[difficulty]["suppressionTime"]; + mg42.accuracy = level.mgTurretSettings[difficulty]["accuracy"]; + mg42.aiSpread = level.mgTurretSettings[difficulty]["aiSpread"]; + mg42.playerSpread = level.mgTurretSettings[difficulty]["playerSpread"]; +} +mg42_target_drones( nonai, team, fakeowner ) +{ + if( !IsDefined( fakeowner ) ) + { + fakeowner = false; + } + self endon( "death" ); + self.dronefailed = false; + if( !IsDefined( self.script_fireondrones ) ) + { + self.script_fireondrones = false; + } + if( !IsDefined( nonai ) ) + { + nonai = false; + } + self SetMode( "manual_ai" ); + difficulty = GetDifficulty(); + if( !IsDefined( level.drones ) ) + { + waitfornewdrone = true; + } + else + { + waitfornewdrone = false; + } + while( 1 ) + { + if( fakeowner && !IsDefined( self.fakeowner ) ) + { + self SetMode( "manual" ); + while( !IsDefined( self.fakeowner ) ) + { + wait( .2 ); + } + } + else if( nonai ) + { + self SetMode( "auto_nonai" ); + } + else + { + self SetMode( "auto_ai" ); + } + if( waitfornewdrone ) + { + level waittill( "new_drone" ); + } + if( !IsDefined( self.oldconvergencetime ) ) + { + self.oldconvergencetime = self.convergencetime; + } + self.convergencetime = 2; + if( !nonai ) + { + turretowner = self GetTurretOwner(); + if( !IsAlive( turretowner ) || IsPlayer( turretowner ) ) + { + wait( .05 ); + continue; + } + else + { + team = turretowner.team; + } + } + else + { + if( fakeowner && !IsDefined( self.fakeowner ) ) + { + wait( .05 ); + continue; + } + assert( IsDefined( team ) ); + turretowner = undefined; + } + if( team == "allies" ) + { + targetteam = "axis"; + } + else + { + targetteam = "allies"; + } + while( level.drones[targetteam].lastindex ) + { + target = get_bestdrone( targetteam ); + if( !IsDefined( self.script_fireondrones ) || !self.script_fireondrones ) + { + wait( .2 ); + break; + } + if( !IsDefined( target ) ) + { + wait( .2 ); + break; + } + if( nonai ) + { + self SetMode( "manual" ); + } + else + { + self SetMode( "manual_ai" ); + } + thread drone_fail( target, 3 ); + if( !self.dronefailed ) + { + self SetTargetEntity( target.turrettarget ); + self ShootTurret(); + self StartFiring(); + } + else + { + self.dronefailed = false; + wait( .05 ); + continue; + } + target waittill_any ("death","drone_mg42_fail"); + waittillframeend; + if( !nonai && !( IsDefined( self GetTurretOwner() ) && self GetTurretOwner() == turretowner ) ) + { + break; + } + } + self.convergencetime = self.oldconvergencetime; + self.oldconvergencetime = undefined; + self ClearTargetEntity(); + self StopFiring(); + if( level.drones[targetteam].lastindex ) + { + waitfornewdrone = false; + } + else + { + waitfornewdrone = true; + } + } +} +drone_fail( drone, time ) +{ + self endon( "death" ); + drone endon( "death" ); + timer = GetTime()+( time*1000 ); + while( timer > GetTime() ) + { + turrettarget = self GetTurretTarget(); + if( !SightTracePassed( self GetTagOrigin( "tag_flash" ), drone.origin+( 0, 0, 40 ), 0, drone ) ) + { + self.dronefailed = true; + wait( .2 ); + break; + } + else if( IsDefined( turrettarget ) && Distance( turrettarget.origin, self.origin ) < Distance( self.origin, drone.origin ) ) + { + self.dronefailed = true; + wait( .1 ); + break; + } + wait( .1 ); + } + maps\_utility::structarray_shuffle( level.drones[drone.team], 1 ); + drone notify( "drone_mg42_fail" ); +} +get_bestdrone( team ) +{ + if( level.drones[team].lastindex < 1 ) + { + return; + } + ent = undefined; + dotforward = AnglesToForward( self.angles ); + for( i = 0; i < level.drones[team].lastindex; i++ ) + { + angles = VectorToAngles( level.drones[team].array[i].origin - self.origin ); + forward = AnglesToForward( angles ); + if( VectorDot( dotforward, forward ) < .88 ) + { + continue; + } + ent = level.drones[team].array[i]; + break; + } + aitarget = self GetTurretTarget(); + if( IsDefined( ent ) && IsDefined( aitarget ) && Distance( self.origin, aitarget.origin ) < Distance( self.origin, ent.origin ) ) + { + ent = undefined; + } + return ent; +} +saw_mgTurretLink( nodes ) +{ + possible_turrets = getEntArray( "misc_turret", "classname" ); + turrets = []; + for ( i=0; i < possible_turrets.size; i++ ) + { + if ( isDefined( possible_turrets[ i ].targetname ) ) + continue; + if ( isdefined( possible_turrets[ i ].isvehicleattached ) ) + { + assertEx( possible_turrets[ i ].isvehicleattached != 0, "Setting must be either true or undefined" ); + continue; + } + turrets[ possible_turrets[ i ].origin + "" ] = possible_turrets[ i ]; + } + if ( !turrets.size ) + return; + for ( nodeIndex = 0; nodeIndex < nodes.size; nodeIndex++) + { + node = nodes[ nodeIndex ]; + if ( node.type == "Path" ) + continue; + if ( node.type == "Begin" ) + continue; + if ( node.type == "End" ) + continue; + nodeForward = anglesToForward( ( 0, node.angles[ 1 ], 0 ) ); + keys = getArrayKeys( turrets ); + for ( i=0; i < keys.size; i++ ) + { + turret = turrets[ keys[ i ] ]; + if ( distance( node.origin, turret.origin ) > 75 ) + continue; + turretForward = anglesToForward( ( 0, turret.angles[ 1 ], 0 ) ); + dot = vectorDot( nodeForward, turretForward ); + if ( dot < 0.9 ) + continue; + node.turretInfo = spawnstruct(); + node.turretInfo.origin = turret.origin; + node.turretInfo.angles = turret.angles; + node.turretInfo.node = node; + node.turretInfo.leftArc = 45; + node.turretInfo.rightArc = 45; + node.turretInfo.topArc = 15; + node.turretInfo.bottomArc = 15; + turrets[ keys[ i ] ] = undefined; + turret delete(); + println("PortableMG: " + turret.weaponinfo + " was set up to be portable."); + } + } + keys = getArrayKeys( turrets ); + for ( i=0; i < keys.size; i++ ) + { + turret = turrets[ keys[ i ] ]; + println( "^1!!!ERROR: turret at " + turret.origin + " could not link to any node! You need to make sure that a node is directly behind the mg42 and less than 50 units behind it." ); + } +} +auto_mgTurretLink( nodes ) +{ + possible_turrets = GetEntArray( "misc_turret", "classname" ); + turrets = []; + for( i = 0; i < possible_turrets.size; i++ ) + { + if ( !isDefined( possible_turrets[ i ].targetname ) || tolower( possible_turrets[ i ].targetname ) != "auto_mgturret" ) + continue; + if( !IsDefined( possible_turrets[i].export ) ) + { + continue; + } + if( !IsDefined( possible_turrets[i].script_dont_link_turret ) ) + { + turrets[possible_turrets[i].origin + ""] = possible_turrets[i]; + } + } + if( !turrets.size ) + { + return; + } + for( nodeIndex = 0; nodeIndex < nodes.size; nodeIndex++ ) + { + node = nodes[nodeIndex]; + if( node.type == "Path" ) + { + continue; + } + if( node.type == "Begin" ) + { + continue; + } + if( node.type == "End" ) + { + continue; + } + nodeForward = AnglesToForward( ( 0, node.angles[1], 0 ) ); + keys = GetArrayKeys( turrets ); + for( i = 0; i < keys.size; i++ ) + { + turret = turrets[keys[i]]; + if( Distance( node.origin, turret.origin ) > 70 ) + { + continue; + } + turretForward = AnglesToForward( ( 0, turret.angles[1], 0 ) ); + dot = VectorDot( nodeForward, turretForward ); + if( dot < 0.9 ) + { + continue; + } + node.turret = turret; + turret.node = node; + turret.isSetup = true; + assertEx( isdefined( turret.export ), "Turret at " + turret.origin + " does not have a .export value but is near a cover node. If you do not want them to link, use .script_dont_link_turret." ); + turrets[keys[i]] = undefined; + } + } + nodes = undefined; +} +save_turret_sharing_info() +{ + self.shared_turrets = []; + self.shared_turrets["connected"] = []; + self.shared_turrets["ambush"] = []; + if( !IsDefined( self.export ) ) + { + assertex( !IsDefined( self.script_turret_share ), "Turret at " + self.origin + " has script_turret_share but has no .export value, so script_turret_share won't have any effect." ); + assertex( !IsDefined( self.script_turret_ambush ), "Turret at " + self.origin + " has script_turret_ambush but has no .export value, so script_turret_ambush won't have any effect." ); + return; + } + level.shared_portable_turrets[self.export] = self; + if( IsDefined( self.script_turret_share ) ) + { + strings = Strtok( self.script_turret_share, " " ); + for( i = 0; i < strings.size; i++ ) + { + self.shared_turrets["connected"][strings[i]] = true; + } + } + if( IsDefined( self.script_turret_ambush ) ) + { + strings = Strtok( self.script_turret_ambush, " " ); + for( i = 0; i < strings.size; i++ ) + { + self.shared_turrets["ambush"][strings[i]] = true; + } + } +} +restoreDefaultPitch() +{ + self notify( "gun_placed_again" ); + self endon( "gun_placed_again" ); + self waittill( "restore_default_drop_pitch" ); + wait( 1 ); + self RestoreDefaultDropPitch(); +} +dropTurret() +{ + thread dropTurretProc(); +} +dropTurretProc() +{ + turret = Spawn( "script_model", ( 0, 0, 0 ) ); + turret.origin = self GetTagOrigin( level.portable_mg_gun_tag ); + turret.angles = self GetTagAngles( level.portable_mg_gun_tag ); + turret SetModel( self.turretModel ); + forward = AnglesToForward( self.angles ); + forward = vector_scale( forward, 100 ); + turret MoveGravity( forward, 0.5 ); + self Detach( self.turretModel, level.portable_mg_gun_tag ); + self.turretmodel = undefined; + wait( 0.7 ); + turret Delete(); +} +turretDeathDetacher() +{ + self endon( "kill_turret_detach_thread" ); + self endon( "dropped_gun" ); + self waittill( "death" ); + if( !IsDefined( self ) ) + { + return; + } + dropTurret(); +} +turretDetacher() +{ + self endon( "death" ); + self endon( "kill_turret_detach_thread" ); + self waittill( "dropped_gun" ); + self Detach( self.turretModel, level.portable_mg_gun_tag ); +} +restoreDefaults() +{ + self.run_noncombatanim = undefined; + self.run_combatanim = undefined; + self set_all_exceptions( get_overloaded_func( "animscripts\init", "empty" ) ); +} +restorePitch() +{ + self waittill( "turret_deactivate" ); + self RestoreDefaultDropPitch(); +} +update_enemy_target_pos_while_running( ent ) +{ + self endon( "death" ); + self endon( "end_mg_behavior" ); + self endon( "stop_updating_enemy_target_pos" ); + for( ;; ) + { + self waittill( "saw_enemy" ); + ent.origin = self.last_enemy_sighting_position; + } +} +move_target_pos_to_new_turrets_visibility( ent, new_spot ) +{ + self endon( "death" ); + self endon( "end_mg_behavior" ); + self endon( "stop_updating_enemy_target_pos" ); + old_turret_pos = self.turret.origin +( 0, 0, 16 ); + dest_pos = new_spot.origin +( 0, 0, 16 ); + for( ;; ) + { + wait( 0.05 ); + if( SightTracePassed( ent.origin, dest_pos, 0, undefined ) ) + { + continue; + } + angles = VectorToAngles( old_turret_pos - ent.origin ); + forward = AnglesToForward( angles ); + forward = vector_scale( forward, 8 ); + ent.origin = ent.origin + forward; + } +} +record_bread_crumbs_for_ambush( ent ) +{ + self endon( "death" ); + self endon( "end_mg_behavior" ); + self endon( "stop_updating_enemy_target_pos" ); + ent.bread_crumbs = []; + for( ;; ) + { + ent.bread_crumbs[ent.bread_crumbs.size] = self.origin +( 0, 0, 50 ); + wait( 0.35 ); + } +} +aim_turret_at_ambush_point_or_visible_enemy( turret, ent ) +{ + if( !IsAlive( self.current_enemy ) && self CanSee( self.current_enemy ) ) + { + ent.origin = self.last_enemy_sighting_position; + return; + } + forward = AnglesToForward( turret.angles ); + for( i = ent.bread_crumbs.size - 3; i >= 0; i-- ) + { + crumb = ent.bread_crumbs[i]; + normal = VectorNormalize( crumb - turret.origin ); + dot = VectorDot( forward, normal ); + if( dot < 0.75 ) + { + continue; + } + ent.origin = crumb; + if( SightTracePassed( turret.origin, crumb, 0, undefined ) ) + { + continue; + } + break; + } +} +find_a_new_turret_spot( ent ) +{ + array = get_portable_mg_spot( ent ); + new_spot = array["spot"]; + connection_type = array["type"]; + if( !IsDefined( new_spot ) ) + { + return; + } + reserve_turret( new_spot ); + thread update_enemy_target_pos_while_running( ent ); + thread move_target_pos_to_new_turrets_visibility( ent, new_spot ); + if( connection_type == "ambush" ) + { + thread record_bread_crumbs_for_ambush( ent ); + } + if( new_spot.isSetup ) + { + leave_gun_and_run_to_new_spot( new_spot ); + } + else + { + pickup_gun( new_spot ); + run_to_new_spot_and_setup_gun( new_spot ); + } + self notify( "stop_updating_enemy_target_pos" ); + if( connection_type == "ambush" ) + { + aim_turret_at_ambush_point_or_visible_enemy( new_spot, ent ); + } + new_spot SetTargetEntity( ent ); +} +leave_gun_and_run_to_new_spot( spot ) +{ + assert( spot.reserved == self ); + self StopUSeturret(); + self animscripts\shared::placeWeaponOn( self.primaryweapon, "none" ); + setup_anim = get_turret_setup_anim( spot ); + org = GetStartOrigin( spot.origin, spot.angles, setup_anim ); + self SetruntoPos( org ); + assertex( Distance( org, self.goalpos ) < self.goalradius, "Tried to set the run pos outside the goalradius" ); + self waittill( "runto_arrived" ); + use_the_turret( spot ); +} +pickup_gun( spot ) +{ + self StopUSeturret(); + self.turret hide_turret(); +} +get_turret_setup_anim( turret ) +{ + spot_types = []; + spot_types[ "saw_bipod_stand" ] = level.mg_animmg[ "bipod_stand_setup" ]; + spot_types[ "saw_bipod_crouch" ] = level.mg_animmg[ "bipod_crouch_setup" ]; + spot_types[ "saw_bipod_prone" ] = level.mg_animmg[ "bipod_prone_setup" ]; + return spot_types[turret.weaponinfo]; +} +run_to_new_spot_and_setup_gun( spot ) +{ + assert( spot.reserved == self ); + oldhealth = self.health; + spot endon( "turret_deactivate" ); + self.mg42 = spot; + self endon( "death" ); + self endon( "dropped_gun" ); + setup_anim = get_turret_setup_anim( spot ); + self.turretModel = "weapon_mg42_carry"; + self notify( "kill_get_gun_back_on_killanimscript_thread" ); + self animscripts\shared::placeWeaponOn( self.weapon, "none" ); + if( self.team == "axis" ) + { + self.health = 1; + } + self.run_noncombatanim = %saw_gunner_run_slow; + self.run_combatanim = %saw_gunner_run_fast; + self.crouchrun_combatanim = %saw_gunner_run_fast; + self Attach( self.turretModel, level.portable_mg_gun_tag ); + thread turretDeathDetacher(); + org = GetStartOrigin( spot.origin, spot.angles, setup_anim ); + self SetruntoPos( org ); + assertex( Distance( org, self.goalpos ) < self.goalradius, "Tried to set the run pos outside the goalradius" ); + wait( 0.05 ); + self set_all_exceptions( maps\_mgturret::exception_exposed_mg42_portable ); + clear_exception( "move" ); + set_exception( "cover_crouch", ::hold_indefintely ); + while( Distance( self.origin, org ) > 16 ) + { + self SetruntoPos( org ); + wait( 0.05 ); + } + self notify( "kill_turret_detach_thread" ); + if( self.team == "axis" ) + { + self.health = oldhealth; + } + if( SoundExists( "weapon_setup" ) ) + { + thread play_sound_in_space( "weapon_setup" ); + } + self AnimScripted( "setup_done", spot.origin, spot.angles, setup_anim ); + restoreDefaults(); + self waittillmatch( "setup_done", "end" ); + spot notify( "restore_default_drop_pitch" ); + spot show_turret(); + self animscripts\shared::placeWeaponOn( self.primaryweapon, "right" ); + use_the_turret( spot ); + self Detach( self.turretModel, level.portable_mg_gun_tag ); + self set_all_exceptions( get_overloaded_func( "animscripts\init", "empty" ) ); + self notify( "bcs_portable_turret_setup" ); +} +move_to_run_pos() +{ + self SetruntoPos( self.runpos ); +} +hold_indefintely() +{ + self endon( "killanimscript" ); + self waittill( "death" ); +} +using_a_turret() +{ + if( !IsDefined( self.turret ) ) + { + return false; + } + return self.turret.owner == self; +} +turret_user_moves() +{ + if( !using_a_turret() ) + { + clear_exception( "move" ); + return; + } + array = find_connected_turrets( "connected" ); + new_spots = array["spots"]; + if( !new_spots.size ) + { + clear_exception( "move" ); + return; + } + turret_node = self.node; + if( !IsDefined( turret_node ) || !is_in_array( new_spots, turret_node ) ) + { + taken_nodes = getTakenNodes(); + for( i = 0; i < new_spots.size; i++ ) + { + turret_node = random( new_spots ); + if( IsDefined( taken_nodes[turret_node.origin + ""] ) ) + { + return; + } + } + } + turret = turret_node.turret; + if( IsDefined( turret.reserved ) ) + { + assert( turret.reserved != self ); + return; + } + reserve_turret( turret ); + if( turret.isSetup ) + { + leave_gun_and_run_to_new_spot( turret ); + } + else + { + run_to_new_spot_and_setup_gun( turret ); + } + maps\_mg_penetration::gunner_think( turret_node.turret ); +} +use_the_turret( spot ) +{ + turretWasUsed = self USeturret( spot ); + if( turretWasUsed ) + { + set_exception( "move", ::turret_user_moves ); + self.turret = spot; + self thread mg42_firing( spot ); + spot SetMode( "manual_ai" ); + spot thread restorePitch(); + self.turret = spot; + spot.owner = self; + return true; + } + else + { + spot RestoreDefaultDropPitch(); + return false; + } +} +get_portable_mg_spot( ent ) +{ + find_spot_funcs = []; + find_spot_funcs[find_spot_funcs.size] = ::find_different_way_to_attack_last_seen_position; + find_spot_funcs[find_spot_funcs.size] = ::find_good_ambush_spot; + find_spot_funcs = array_randomize( find_spot_funcs ); + for( i = 0; i < find_spot_funcs.size; i++ ) + { + array = [[find_spot_funcs[i]]]( ent ); + if( !IsDefined( array["spots"] ) ) + { + continue; + } + array["spot"] = random( array["spots"] ); + return array; + } +} +getTakenNodes() +{ + array = []; + ai = GetAiArray(); + for( i = 0; i < ai.size; i++ ) + { + if( !IsDefined( ai[i].node ) ) + { + continue; + } + array[ai[i].node.origin + ""] = true; + } + return array; +} +find_connected_turrets( connection_type ) +{ + spots = level.shared_portable_turrets; + usable_spots = []; + spot_exports = GetArrayKeys( spots ); + taken_nodes = getTakenNodes(); + taken_nodes[self.node.origin + ""] = undefined; + for( i = 0; i < spot_exports.size; i++ ) + { + export = spot_exports[i]; + if( spots[export] == self.turret ) + continue; + keys = GetArrayKeys( self.turret.shared_turrets[connection_type] ); + for( p = 0; p < keys.size; p++ ) + { + if( spots[export].export + "" != keys[p] ) + { + continue; + } + if( IsDefined( spots[export].reserved ) ) + { + continue; + } + if( IsDefined( taken_nodes[spots[export].node.origin + ""] ) ) + { + continue; + } + if( Distance( self.goalpos, spots[export].origin ) > self.goalradius ) + { + continue; + } + usable_spots[usable_spots.size] = spots[export]; + } + } + array = []; + array["type"] = connection_type; + array["spots"] = usable_spots; + return array; +} +find_good_ambush_spot( ent ) +{ + return find_connected_turrets( "ambush" ); +} +find_different_way_to_attack_last_seen_position( ent ) +{ + array = find_connected_turrets( "connected" ); + usable_spots = array["spots"]; + if( !usable_spots.size ) + { + return; + } + good_spot = []; + for( i = 0; i < usable_spots.size; i++ ) + { + if( !within_fov( usable_spots[i].origin, usable_spots[i].angles, ent.origin, 0.75 ) ) + { + continue; + } + if( !SightTracePassed( ent.origin, usable_spots[i].origin +( 0, 0, 16 ), 0, undefined ) ) + { + continue; + } + good_spot[good_spot.size] = usable_spots[i]; + } + array["spots"] = good_spot; + return array; +} +portable_mg_spot() +{ + save_turret_sharing_info(); + self.isSetup = true; + assert( !IsDefined( self.reserved ) ); + self.reserved = undefined; + if( IsDefined( self.isvehicleattached ) ) + { + return; + } + if( self has_spawnflag(level.SPAWNFLAG_TURRET_PREPLACED) ) + { + return; + } + hide_turret(); +} +hide_turret() +{ + assert( self.isSetup ); + self notify( "stop_checking_for_flanking" ); + self.isSetup = false; + self Hide(); + self.solid = false; + self MakeTurretUnusable(); + self SetDefaultDropPitch( 0 ); + self thread restoreDefaultPitch(); +} +show_turret() +{ + self Show(); + self.solid = true; + self MakeTurretUsable(); + assert( !self.isSetup ); + self.isSetup = true; + thread stop_mg_behavior_if_flanked(); +} +stop_mg_behavior_if_flanked() +{ + self endon( "stop_checking_for_flanking" ); + self waittill( "turret_deactivate" ); + if( IsAlive( self.owner ) ) + { + self.owner notify( "end_mg_behavior" ); + } +} +turret_is_mine( turret ) +{ + owner = turret GetTurretOwner(); + if( !IsDefined( owner ) ) + { + return false; + } + return owner == self; +} +end_turret_reservation( turret ) +{ + waittill_turret_is_released( turret ); + turret.reserved = undefined; +} +waittill_turret_is_released( turret ) +{ + turret endon( "turret_deactivate" ); + self endon( "death" ); + self waittill( "end_mg_behavior" ); +} +reserve_turret( turret ) +{ + turret.reserved = self; + thread end_turret_reservation( turret ); +} +link_turrets( turretArray ) +{ + self endon( "death" ); + level.print3d_ran_already = false; + if( !IsDefined( turretArray ) || turretArray.size <= 1 ) + { + return; + } + while( 1 ) + { + for( i = 0; i < turretArray.size; i++ ) + { + if( turretArray[i] IsFiringTurret() ) + { + self link_turrets_fireall( turretArray[i], turretArray ); + } + } + wait( 0.05 ); + } +} +link_turrets_fireall( leaderTurret, turretArray ) +{ + self endon( "death" ); + self.leadTurretState = 0; + for( i = 0; i < turretArray.size; i++ ) + { + if( turretArray[i] != leaderTurret && !turretArray[i] IsFiringTurret() ) + { + turretArray[i] SetMode( "manual" ); + } + } + while( leaderTurret IsFiringTurret() ) + { + if( leaderTurret.script_shooting ) + { + for( i = 0; i < turretArray.size; i++ ) + { + if( turretArray[i] != leaderTurret && !turretArray[i] IsFiringTurret() ) + { + turretArray[i] ShootTurret(); + } + } + } + wait( 0.1 ); + } + self notify( "lead_turret_stopped" ); + for( i = 0; i < turretArray.size; i++ ) + { + if( turretArray[i] != leaderTurret && !turretArray[i] IsFiringTurret() ) + { + turretArray[i] SetMode( "auto_nonai" ); + } + } +} +init_mg_animent() +{ + mg42s = GetEntArray( "misc_mg42", "classname" ); + turrets = GetEntArray( "misc_turret", "classname" ); + turrets = array_combine( mg42s, turrets ); + for( i = 0; i < turrets.size; i++ ) + { + if( IsDefined( turrets[i].script_animent ) ) + { + turrets[i] thread mg_anim_ent(); + } + } +} +mg_anim_ent() +{ + self endon( "stop_mg_anim_ent" ); + self endon( "death" ); + anim_ent = GetEnt( self.script_animent, "targetname" ); + if( IsDefined( anim_ent.script_animname ) ) + { + anim_ent.animname = anim_ent.script_animname; + } + else + { + anim_ent.animname = anim_ent.targetname; + } + delay = 0.2; + intro_time = GetAnimLength( level.scr_anim[anim_ent.animname]["intro"] ) - delay; + anim_ent maps\_anim::SetAnimTree(); + state = "outro"; + for( ;; ) + { + owner = self GetTurretOwner(); + if( !IsDefined( owner ) ) + { + if( state != "outro" ) + { + state = "outro"; + anim_ent SetFlaggedAnimKnobRestart( "mg_animent_anim", level.scr_anim[anim_ent.animname][state], 1.0, 0.2, 1.0 ); + } + self waittill( "turretownerchange" ); + owner = self GetTurretOwner(); + } + if( self mg_is_firing( owner ) ) + { + if( state == "outro" ) + { + state = "intro"; + anim_ent SetFlaggedAnimKnobRestart( "mg_animent_anim", level.scr_anim[anim_ent.animname][state], 1.0, 0.2, 1.0 ); + wait( intro_time ); + } + else if( state == "intro" || state == "loop" ) + { + state = "loop"; + anim_ent SetFlaggedAnimKnob( "mg_animent_anim", level.scr_anim[anim_ent.animname][state], 1.0, 0.2, 1.0 ); + } + } + else if( state != "outro" ) + { + state = "outro"; + anim_ent SetFlaggedAnimKnobRestart( "mg_animent_anim", level.scr_anim[anim_ent.animname][state], 1.0, 0.2, 1.0 ); + } + wait( delay ); + } +} +mg_is_firing( owner ) +{ + if( !IsDefined( owner ) ) + { + return false; + } + if( IsPlayer( owner ) ) + { + return IsTurretFiring( self ); + } + else + { + if( IsDefined( self.doFiring ) && self.doFiring ) + { + return true; + } + if( IsDefined( self.script_shooting ) && self.script_shooting ) + { + return true; + } + } + return false; +} +drop_turret() +{ + maps\_mgturret::dropTurret(); + self animscripts\weaponList::RefillClip(); + self.a.needsToRechamber = 0; + self notify ("dropped_gun"); + maps\_mgturret::restoreDefaults(); +} +exception_exposed_mg42_portable() +{ + drop_turret(); +} + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_mig17.gsc b/BO1/PC/ZM/maps/_mig17.gsc new file mode 100644 index 0000000..5a99388 Binary files /dev/null and b/BO1/PC/ZM/maps/_mig17.gsc differ diff --git a/BO1/PC/ZM/maps/_minefields.gsc b/BO1/PC/ZM/maps/_minefields.gsc new file mode 100644 index 0000000..a33f987 Binary files /dev/null and b/BO1/PC/ZM/maps/_minefields.gsc differ diff --git a/BO1/PC/ZM/maps/_mortar.gsc b/BO1/PC/ZM/maps/_mortar.gsc new file mode 100644 index 0000000..d285b0d --- /dev/null +++ b/BO1/PC/ZM/maps/_mortar.gsc @@ -0,0 +1,744 @@ +#include maps\_utility; +#include common_scripts\utility; +main() +{ +} +init_mortars() +{ + level._explosion_max_range = []; + level._explosion_min_range = []; + level._explosion_blast_radius = []; + level._explosion_max_damage = []; + level._explosion_min_damage = []; + level._explosion_quake_power = []; + level._explosion_quake_time = []; + level._explosion_quake_radius = []; + level._explosion_min_delay = []; + level._explosion_max_delay = []; + level._explosion_barrage_min_delay = []; + level._explosion_barrage_max_delay = []; + level._explosion_view_chance = []; + level._explosion_dust_range = []; + level._explosion_dust_name = []; +} +set_mortar_range( mortar_name, min_range, max_range, set_default ) +{ + if( !IsDefined( level._explosion_min_range ) ) + { + init_mortars(); + } + if( IsDefined( set_default ) && set_default ) + { + if( !IsDefined( level._explosion_min_range[mortar_name] ) ) + { + level._explosion_min_range[mortar_name] = min_range; + } + if( !IsDefined( level._explosion_max_range[mortar_name] ) ) + { + level._explosion_max_range[mortar_name] = max_range; + } + } + else + { + level._explosion_min_range[mortar_name] = min_range; + level._explosion_max_range[mortar_name] = max_range; + } +} +set_mortar_damage( mortar_name, blast_radius, min_damage, max_damage, set_default ) +{ + if( !IsDefined( level._explosion_blast_radius ) ) + { + init_mortars(); + } + if( IsDefined( set_default ) && set_default ) + { + if( !IsDefined( level._explosion_blast_radius[mortar_name] ) ) + { + level._explosion_blast_radius[mortar_name] = blast_radius; + } + if( !IsDefined( level._explosion_min_damage[mortar_name] ) ) + { + level._explosion_min_damage[mortar_name] = min_damage; + } + if( !IsDefined( level._explosion_max_damage[mortar_name] ) ) + { + level._explosion_max_damage[mortar_name] = max_damage; + } + } + else + { + level._explosion_blast_radius[mortar_name] = blast_radius; + level._explosion_min_damage[mortar_name] = min_damage; + level._explosion_max_damage[mortar_name] = max_damage; + } +} +set_mortar_quake( mortar_name, quake_power, quake_time, quake_radius, set_default ) +{ + if( !IsDefined( level._explosion_quake_power ) ) + { + init_mortars(); + } + if( IsDefined( set_default ) && set_default ) + { + if( !IsDefined( level._explosion_quake_power[mortar_name] ) ) + { + level._explosion_quake_power[mortar_name] = quake_power; + } + if( !IsDefined( level._explosion_quake_power[mortar_name] ) ) + { + level._explosion_quake_time[mortar_name] = quake_time; + } + if( !IsDefined( level._explosion_quake_radius[mortar_name] ) ) + { + level._explosion_quake_radius[mortar_name] = quake_radius; + } + } + else + { + level._explosion_quake_power[mortar_name] = quake_power; + level._explosion_quake_time[mortar_name] = quake_time; + level._explosion_quake_radius[mortar_name] = quake_radius; + } +} +set_mortar_delays( mortar_name, min_delay, max_delay, barrage_min_delay, barrage_max_delay, set_default ) +{ + if( !IsDefined( level._explosion_min_delay ) ) + { + init_mortars(); + } + if( IsDefined( set_default ) && set_default ) + { + if( !IsDefined( level._explosion_min_delay[mortar_name] ) && IsDefined( min_delay ) ) + { + level._explosion_min_delay[mortar_name] = min_delay; + } + if( !IsDefined( level._explosion_max_delay[mortar_name] ) && IsDefined( min_delay ) ) + { + level._explosion_max_delay[mortar_name] = max_delay; + } + if( !IsDefined( level._explosion_barrage_min_delay[mortar_name] ) && IsDefined( barrage_min_delay ) ) + { + level._explosion_barrage_min_delay[mortar_name] = barrage_min_delay; + } + if( !IsDefined( level._explosion_barrage_max_delay[mortar_name] ) && IsDefined( barrage_max_delay ) ) + { + level._explosion_barrage_max_delay[mortar_name] = barrage_max_delay; + } + } + else + { + if( IsDefined( min_delay ) ) + { + level._explosion_min_delay[mortar_name] = min_delay; + } + if( IsDefined( min_delay ) ) + { + level._explosion_max_delay[mortar_name] = max_delay; + } + if( IsDefined( barrage_min_delay ) ) + { + level._explosion_barrage_min_delay[mortar_name] = barrage_min_delay; + } + if( IsDefined( barrage_max_delay ) ) + { + level._explosion_barrage_max_delay[mortar_name] = barrage_max_delay; + } + } +} +set_mortar_chance( mortar_name, chance, set_default ) +{ + if( !IsDefined( level._explosion_view_chance ) ) + { + init_mortars(); + } + assertex( chance <= 1, "_mortar::set_mortar_chance(), the chance parameter needs to be between 0 and 1" ); + if( IsDefined( set_default ) && set_default ) + { + if( !IsDefined( level._explosion_view_chance[mortar_name] ) ) + { + level._explosion_view_chance[mortar_name] = chance; + } + } + else + { + level._explosion_view_chance[mortar_name] = chance; + } +} +set_mortar_dust( mortar_name, dust_name, range ) +{ + if( !IsDefined( level._explosion_dust_range ) ) + { + init_mortars(); + } + level._explosion_dust_name[mortar_name] = dust_name; + if( !IsDefined( range ) ) + { + range = 512; + } + level._explosion_dust_range[mortar_name] = range; +} +mortar_loop( mortar_name, barrage_amount, no_terrain ) +{ + level endon( "stop_all_mortar_loops" ); + assertex( ( IsDefined( mortar_name ) &&( mortar_name != "" ) ), "mortar_name not passed. pass in level script" ); + assertex( ( IsDefined( level._effect ) && IsDefined( level._effect[mortar_name] ) ), "level._effect[strMortars] not defined. define in level script" ); + last_explosion = -1; + set_mortar_range( mortar_name, 300, 2200, true ); + set_mortar_delays( mortar_name, 5, 7, 5, 7, true ); + set_mortar_chance( mortar_name, 0, true ); + if( !IsDefined( barrage_amount ) || barrage_amount < 1 ) + { + barrage_amount = 1; + } + if( !IsDefined( no_terrain ) ) + { + no_terrain = false; + } + if( IsDefined( level._explosion_stopNotify ) && IsDefined( level._explosion_stopNotify[mortar_name] ) ) + { + level endon( level._explosion_stopNotify[mortar_name] ); + } + if( !IsDefined( level._explosion_stop_barrage ) || !IsDefined( level._explosion_stop_barrage[mortar_name] ) ) + { + level._explosion_stop_barrage[mortar_name] = false; + } + explosion_points = []; + explosion_points = GetEntArray( mortar_name, "targetname" ); + explosion_points_structs = []; + explosion_points_structs = getstructarray( mortar_name, "targetname" ); + for( i = 0; i < explosion_points_structs.size; i++ ) + { + explosion_points_structs[i].is_struct = true; + explosion_points = add_to_array( explosion_points, explosion_points_structs[i] ); + } + explosion_points_structs = []; + dust_points = []; + if( IsDefined( level._explosion_dust_name[mortar_name] ) ) + { + dust_name = level._explosion_dust_name[mortar_name]; + dust_points = GetEntArray( dust_name, "targetname" ); + dust_points_structs = []; + dust_points_structs = getstructarray( dust_name, "targetname" ); + for( i = 0; i < dust_points_structs.size; i++ ) + { + dust_points_structs[i].is_struct = true; + dust_points = add_to_array( dust_points, dust_points_structs[i] ); + } + dust_points_structs = []; + } + for( i = 0; i < explosion_points.size; i++ ) + { + if( IsDefined( explosion_points[i].target ) &&( !no_terrain ) ) + { + explosion_points[i] setup_mortar_terrain(); + } + } + if( IsDefined( level._explosion_start_notify ) && IsDefined( level._explosion_start_notify[mortar_name] ) ) + { + level waittill( level._explosion_start_notify[mortar_name] ); + } + while( true ) + { + while( !level._explosion_stop_barrage[mortar_name] ) + { + do_mortar = false; + for( j = 0; j < barrage_amount; j++ ) + { + max_rangeSQ = level._explosion_max_range[mortar_name] * level._explosion_max_range[mortar_name]; + min_rangeSQ = level._explosion_min_range[mortar_name] * level._explosion_min_range[mortar_name]; + random_num = RandomInt( explosion_points.size ); + for( i = 0; i < explosion_points.size; i++ ) + { + num = ( i + random_num ) % explosion_points.size; + do_mortar = false; + players = get_players(); + for( q = 0; q < players.size; q++ ) + { + dist = DistanceSquared( players[q] GetOrigin(), explosion_points[num].origin ); + if( num != last_explosion && dist < max_rangeSQ && dist > min_rangeSQ ) + { + if( level._explosion_view_chance[mortar_name] > 0 ) + { + if( players[q] player_view_chance( level._explosion_view_chance[mortar_name], explosion_points[num].origin ) ) + { + do_mortar = true; + break; + } + else + { + do_mortar = false; + } + } + else + { + do_mortar = true; + break; + } + } + else + { + do_mortar = false; + } + } + if( do_mortar ) + { + explosion_points[num] thread explosion_activate( mortar_name, undefined, undefined, undefined, undefined, undefined, undefined, dust_points ); + last_explosion = num; + break; + } + } + last_explosion = -1; + if( do_mortar ) + { + if( IsDefined( level._explosion_delay ) && IsDefined( level._explosion_delay[mortar_name] ) ) + { + wait( level._explosion_delay[mortar_name] ); + } + else + { + wait( RandomFloatRange( level._explosion_min_delay[mortar_name], level._explosion_max_delay[mortar_name] ) ); + } + } + else + { + j--; + wait( 0.25 ); + } + } + if( barrage_amount > 1 ) + { + if( IsDefined( level._explosion_barrage_delay ) && IsDefined( level._explosion_barrage_delay[mortar_name] ) ) + { + wait( level._explosion_barrage_delay[mortar_name] ); + } + else + { + wait( RandomFloatRange( level._explosion_barrage_min_delay[mortar_name], level._explosion_barrage_max_delay[mortar_name] ) ); + } + } + } + wait( 0.05 ); + } +} +player_view_chance( view_chance, explosion_point ) +{ + chance = RandomFloat( 1 ); + if( chance <= view_chance ) + { + if( within_fov( self GetEye(), self GetPlayerAngles(), explosion_point, cos( 30 ) ) ) + { + return true; + } + } + return false; +} +explosion_activate( mortar_name, blast_radius, min_damage, max_damage, quake_power, quake_time, quake_radius, dust_points ) +{ + set_mortar_damage( mortar_name, 256, 25, 400, true ); + set_mortar_quake( mortar_name, 0.15, 2, 850, true ); + if( !IsDefined( blast_radius ) ) + { + blast_radius = level._explosion_blast_radius[mortar_name]; + } + if( !IsDefined( min_damage ) ) + { + min_damage = level._explosion_min_damage[mortar_name]; + } + if( !IsDefined( max_damage ) ) + { + max_damage = level._explosion_max_damage[mortar_name]; + } + if( !IsDefined( quake_power ) ) + { + quake_power = level._explosion_quake_power[mortar_name]; + } + if( !IsDefined( quake_time ) ) + { + quake_time = level._explosion_quake_time[mortar_name]; + } + if( !IsDefined( quake_radius ) ) + { + quake_radius = level._explosion_quake_radius[mortar_name]; + } + is_struct = IsDefined( self.is_struct ) && self.is_struct; + temp_ent = undefined; + if( is_struct ) + { + temp_ent = Spawn( "script_origin", self.origin ); + } + if( is_struct ) + { + temp_ent explosion_incoming( mortar_name ); + } + else + { + self explosion_incoming( mortar_name ); + } + level notify( "explosion", mortar_name ); + RadiusDamage( self.origin, blast_radius, max_damage, min_damage ); + if( ( IsDefined( self.has_terrain ) && self.has_terrain == true ) && ( IsDefined( self.terrain ) ) ) + { + for( i = 0; i < self.terrain.size; i++ ) + { + if( IsDefined( self.terrain[i] ) ) + { + self.terrain[i] Delete(); + } + } + } + if( IsDefined( self.hidden_terrain ) ) + { + self.hidden_terrain Show(); + } + self.has_terrain = false; + if( is_struct ) + { + temp_ent explosion_boom( mortar_name, quake_power, quake_time, quake_radius ); + } + else + { + self explosion_boom( mortar_name, quake_power, quake_time, quake_radius ); + } + if( IsDefined( dust_points ) && dust_points.size > 0 ) + { + max_range = 384; + if( IsDefined( level._explosion_dust_range ) && IsDefined( level._explosion_dust_range[mortar_name] ) ) + { + max_range = level._explosion_dust_range[mortar_name]; + } + for( i = 0; i < dust_points.size; i++ ) + { + if( DistanceSquared( dust_points[i].origin, self.origin ) < max_range * max_range ) + { + if( IsDefined( dust_points[i].script_fxid ) ) + { + PlayFx( level._effect[dust_points[i].script_fxid], dust_points[i].origin ); + } + else + { + PlayFx( level._effect[level._explosion_dust_name[mortar_name]], dust_points[i].origin ); + } + } + } + } + if( is_struct ) + { + temp_ent thread delete_temp_ent(); + } +} +delete_temp_ent() +{ + wait( 5 ); + self Delete(); +} +explosion_boom( mortar_name, power, time, radius, is_struct ) +{ + if( !IsDefined( power ) ) + { + power = 0.15; + } + if( !IsDefined( time ) ) + { + time = 2; + } + if( !IsDefined( radius ) ) + { + radius = 850; + } + if (!isdefined(is_struct)) + { + explosion_sound( mortar_name ); + } + else + { + temp_ent = Spawn( "script_origin", self.origin ); + temp_ent explosion_sound( mortar_name ); + temp_ent thread delete_temp_ent(); + } + explosion_origin = self.origin; + PlayFx( level._effect[mortar_name], explosion_origin ); + Earthquake( power, time, explosion_origin, radius ); + thread mortar_rumble_on_all_players("damage_light","damage_heavy", explosion_origin, radius * 0.75, radius * 1.25); + physRadius = radius; + if( physRadius > 500 ) + { + physRadius = 500; + } + if(!isDefined(level.no_explosion_physics) || isDefined(level.no_explosion_physics) && level.no_explosion_physics ) + { + PhysicsExplosionSphere( explosion_origin, physRadius, physRadius * 0.25, 0.75 ); + } + players = get_players(); + player_count = 0; + for( q = 0; q < players.size; q++ ) + { + if( Distancesquared( players[q].origin, explosion_origin ) > 300 * 300 ) + { + player_count++; + } + } + if( player_count == players.size ) + { + return; + } + level.playerMortar = true; + level notify( "shell shock player", time * 4 ); + max_damage = level._explosion_max_damage[mortar_name]; + min_damage = level._explosion_max_damage[mortar_name]; + maps\_shellshock::main( explosion_origin, time * 4, undefined, max_damage, 1, min_damage ); +} +explosion_sound( mortar_name ) +{ + if( level._effectType[mortar_name] == "mortar" ) + { + self PlaySound( "exp_mortar_dirt" ); + } + if( level._effectType[mortar_name] == "mortar_water" ) + { + self PlaySound( "exp_mortar_water" ); + } + else if( level._effectType[mortar_name] == "artillery" ) + { + self PlaySound( "exp_mortar_dirt" ); + } + else if( level._effectType[mortar_name] == "bomb" ) + { + self PlaySound( "exp_mortar_dirt" ); + } +} +explosion_incoming( mortar_name ) +{ + if( level._effectType[mortar_name] == "mortar" ) + { + self PlaySound( "prj_mortar_incoming", "sounddone" ); + } + if( level._effectType[mortar_name] == "mortar_water" ) + { + self PlaySound( "prj_mortar_incoming", "sounddone" ); + } + else if( level._effectType[mortar_name] == "artillery" ) + { + self PlaySound( "prj_mortar_incoming", "sounddone" ); + } + else if( level._effectType[mortar_name] == "bomb" ) + { + self PlaySound( "prj_mortar_incoming", "sounddone"); + } + self waittill ("sounddone"); +} +setup_mortar_terrain() +{ + self.has_terrain = false; + if( IsDefined( self.target ) ) + { + self.terrain = GetEntArray( self.target, "targetname" ); + self.has_terrain = true; + } + else + { + println( "z: mortar entity has no target: ", self.origin ); + } + if( !IsDefined( self.terrain ) ) + { + println( "z: mortar entity has target, but target doesnt exist: ", self.origin ); + } + if( IsDefined( self.script_hidden ) ) + { + if( IsDefined( self.script_hidden ) ) + { + self.hidden_terrain = GetEnt( self.script_hidden, "targetname" ); + } + else if( ( IsDefined( self.terrain ) ) &&( IsDefined( self.terrain[0].target ) ) ) + { + self.hidden_terrain = GetEnt( self.terrain[0].target, "targetname" ); + } + if( IsDefined( self.hidden_terrain ) ) + { + self.hidden_terrain Hide(); + } + } + else if( IsDefined( self.has_terrain ) ) + { + if( IsDefined( self.terrain ) && IsDefined( self.terrain[0].target ) ) + { + self.hidden_terrain = GetEnt( self.terrain[0].target, "targetname" ); + } + if( IsDefined( self.hidden_terrain ) ) + { + self.hidden_terrain Hide(); + } + } +} +activate_mortar( range, max_damage, min_damage, quake_power, quake_time, quake_radius, bIsstruct, effect, bShellShock ) +{ + incoming_sound( undefined, bIsstruct ); + level notify( "mortar" ); + self notify( "mortar" ); + if( !IsDefined( range ) ) + { + range = 256; + } + if( !IsDefined( max_damage ) ) + { + max_damage = 400; + } + if( !IsDefined( min_damage ) ) + { + min_damage = 25; + } + if ( !IsDefined( effect )) + { + effect = level.mortar; + } + if ( !IsDefined( bShellShock )) + { + bShellShock = true; + } + RadiusDamage( self.origin, range, max_damage, min_damage ); + if( ( IsDefined( self.has_terrain ) && self.has_terrain == true ) &&( IsDefined( self.terrain ) ) ) + { + for( i = 0; i < self.terrain.size; i++ ) + { + if( IsDefined( self.terrain[i] ) ) + { + self.terrain[i] Delete(); + } + } + } + if( IsDefined( self.hidden_terrain ) ) + { + self.hidden_terrain Show(); + } + self.has_terrain = false; + mortar_boom( self.origin, quake_power, quake_time, quake_radius, effect, bIsstruct, bShellShock ); +} +mortar_boom( origin, power, time, radius, effect, bIsstruct, bShellShock ) +{ + if( !IsDefined( power ) ) + { + power = 0.15; + } + if( !IsDefined( time ) ) + { + time = 2; + } + if( !IsDefined( radius ) ) + { + radius = 850; + } + if ( !IsDefined( bShellShock )) + { + bShellShock = true; + } + thread mortar_sound( bIsstruct ); + if( IsDefined( effect ) ) + { + PlayFx( effect, origin ); + } + else + { + PlayFx( level.mortar, origin ); + } + Earthquake( power, time, origin, radius ); + thread mortar_rumble_on_all_players("damage_light","damage_heavy", origin, radius * 0.75, radius * 1.25); + physRadius = radius; + if(!isDefined(level.no_mortar_physics)|| isDefined(level.no_mortar_physics) && level.no_mortar_physics ) + { + phys_origin = ( origin[0], origin[1], origin[2] - 0.5*physRadius ); + PhysicsExplosionSphere( phys_origin, physRadius, physRadius * 0.25, 3.0 ); + } + if( IsDefined( level.playerMortar ) ) + { + return; + } + players = get_players(); + players = get_players(); + player_count = 0; + for( q = 0; q < players.size; q++ ) + { + if( Distancesquared( players[q].origin, origin ) > 300 * 300 ) + { + player_count++; + } + } + if( player_count == players.size ) + { + return; + } + if( level.script == "carchase" || level.script == "breakout" ) + { + return; + } + if( bShellShock ) + { + level.playerMortar = true; + level notify( "shell shock player", time*4 ); + maps\_shellshock::main( origin, time * 4 ); + } +} +mortar_sound( bIsstruct ) +{ + if( isdefined(bIsstruct) && bIsstruct == true ) + { + temp_ent = Spawn( "script_origin", self.origin ); + temp_ent PlaySound( "exp_mortar_dirt" ); + temp_ent thread delete_temp_ent(); + } + else + { + self PlaySound( "exp_mortar_dirt" ); + } +} +incoming_sound( soundnum , bIsstruct ) +{ + currenttime = GetTime(); + if( !IsDefined( level.lastmortarincomingtime ) ) + { + level.lastmortarincomingtime = currenttime; + } + else if( ( currenttime-level.lastmortarincomingtime ) < 1000 ) + { + wait( 1 ); + return; + } + else + { + level.lastmortarincomingtime = currenttime; + } + if( IsDefined(bIsstruct) && bIsstruct == true ) + { + temp_ent = Spawn( "script_origin", self.origin ); + temp_ent PlaySound( "prj_mortar_incoming", "sounddone" ); + temp_ent waittill( "sounddone" ); + level notify("mortar_inc_done"); + temp_ent thread delete_temp_ent(); + } + else + { + self PlaySound( "prj_mortar_incoming", "sounddone" ); + self waittill( "sounddone" ); + level notify("mortar_inc_done"); + } +} +mortar_rumble_on_all_players(high_rumble_string, low_rumble_string, rumble_org, high_rumble_range, low_rumble_range) +{ + players = get_players(); + for (i = 0; i < players.size; i++) + { + if (isdefined (high_rumble_range) && isdefined (low_rumble_range) && isdefined(rumble_org)) + { + if (distance (players[i].origin, rumble_org) < high_rumble_range) + { + players[i] playrumbleonentity(high_rumble_string); + } + else if (distance (players[i].origin, rumble_org) < low_rumble_range) + { + players[i] playrumbleonentity(low_rumble_string); + } + } + else + { + players[i] playrumbleonentity(high_rumble_string); + } + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_motorcycle.gsc b/BO1/PC/ZM/maps/_motorcycle.gsc new file mode 100644 index 0000000..2903936 --- /dev/null +++ b/BO1/PC/ZM/maps/_motorcycle.gsc @@ -0,0 +1,474 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_vehicle; +#include maps\_vehicle_aianim; +#include animscripts\utility; +#using_animtree ("vehicles"); +main() +{ + build_aianims( ::setanims , ::set_vehicle_anims ); +} +#using_animtree ("generic_human"); +setanims() +{ + positions = []; + for(i = 0; i < 9; i++) + { + positions[i] = spawnstruct(); + } + positions[0].sittag = "tag_driver"; + positions[0].idle = %crew_bike_m72_drive_straight; + positions[0].getin = %crew_bike_m72_drive_straight; + positions[0].getout = %crew_bike_m72_drive_straight; + return positions; +} +set_vehicle_anims(positions) +{ + return positions; +} +ride_and_shoot( bike ) +{ + self.ridingvehicle = bike; + self AnimCustom( ::ai_ride_and_shoot ); +} +ai_ride_and_shoot() +{ + self endon("death"); + self endon("start_ragdoll"); + self endon("stop_riding"); + self.bikerIsArmed = false; + self.bikerIsAiming = false; + self.bikerShouldJump = false; + self.bikerShouldLand = false; + self.prevBikerYawAimWeight = 0; + self.prevBikerPitchAimWeight = 0; + self.prevSideAnimWeight = 99999; + self.max_bike_aim_yaw_angle = 70; + self.max_bike_aim_pitch_angle = 60; + self.max_bike_aim_angle_delta = 30; + self.max_bike_side_yaw_angle = 90; + if( !IsDefined(self.max_bike_total_yaw_angle) ) + { + self.max_bike_total_yaw_angle = self.max_bike_side_yaw_angle + self.max_bike_aim_yaw_angle; + } + self.max_bike_roll_angle = 30; + if( !IsDefined(self.min_blindspot_time) ) + { + self.min_blindspot_time = 0.5; + } + blindSpotTime = 0; + if( !IsDefined(level.ai_motorcycle_death_launch_vector) ) + { + level.ai_motorcycle_death_launch_vector = (200, 200, 40); + } + self maps\_utility::disable_pain(); + self maps\_utility::disable_react(); + self.overrideActorDamage = ::ai_ride_and_shoot_damage_override; + self animscripts\shared::placeWeaponOn( self.primaryweapon, "left" ); + self AnimMode( "point relative" ); + self.fixedLinkYawOnly = false; + self ai_ride_and_shoot_linkto_bike(); + self ai_ride_and_shoot_idle(); + self thread ai_ride_and_shoot_watch_jump(); + self thread call_overloaded_func( "animscripts\shoot_behavior", "decideWhatAndHowToShoot", "normal" ); + while(1) + { + if( IsDefined(self.shootEnt) ) + { + shootPos = self.shootEnt GetShootAtPos(self, self, self); + shootFromPos = self animscripts\shared::trackLoopGetShootFromPos(); + shootFromAngles = self animscripts\shared::trackLoopGetShootFromAngles(); + vectorToShootPos = shootPos - shootFromPos; + anglesToShootPos = VectorToAngles( vectorToShootPos ); + facingVector = anglesToForward( shootFromAngles ); + yawToEnemy = AngleClamp180( shootFromAngles[1] - anglesToShootPos[1] ); + pitchToEnemy = AngleClamp180( shootFromAngles[0] - anglesToShootPos[0] ); + realYawToEnemy = self GetYawToOrigin(shootPos); + if( abs(realYawToEnemy) < self.max_bike_total_yaw_angle ) + { + if( !self.bikerIsArmed ) + { + self ai_ride_and_shoot_gun_pullout(); + continue; + } + yawAimWeight = abs(yawToEnemy / self.max_bike_aim_yaw_angle); + aimDelta = yawAimWeight - self.prevBikerYawAimWeight; + maxWeightChange = self.max_bike_aim_angle_delta / self.max_bike_aim_yaw_angle; + if( abs(aimDelta) > maxWeightChange ) + { + yawAimWeight = self.prevBikerYawAimWeight + maxWeightChange * sign(aimDelta); + } + if( yawAimWeight > 1 ) + { + yawAimWeight = 1; + } + if( yawToEnemy < 0 ) + { + self SetAnimLimited( %moto_aim_4, yawAimWeight, 0.05 ); + self SetAnimLimited( %moto_aim_6, 0, 0.05 ); + } + else + { + self SetAnimLimited( %moto_aim_6, yawAimWeight, 0.05 ); + self SetAnimLimited( %moto_aim_4, 0, 0.05 ); + } + pitchAimWeight = abs(pitchToEnemy / self.max_bike_aim_pitch_angle); + if( abs(pitchAimWeight) > 1 ) + { + pitchAimWeight = sign(pitchAimWeight); + } + aimDelta = pitchAimWeight - self.prevBikerPitchAimWeight; + maxWeightChange = self.max_bike_aim_angle_delta / self.max_bike_aim_pitch_angle; + if( abs(aimDelta) > maxWeightChange ) + { + pitchAimWeight = self.prevBikerPitchAimWeight + maxWeightChange * sign(aimDelta); + } + if( pitchToEnemy < 0 ) + { + self SetAnimLimited( %moto_aim_2, pitchAimWeight, 0.05 ); + self SetAnimLimited( %moto_aim_8, 0, 0.05 ); + } + else + { + self SetAnimLimited( %moto_aim_8, pitchAimWeight, 0.05 ); + self SetAnimLimited( %moto_aim_2, 0, 0.05 ); + } + self.prevBikerYawAimWeight = yawAimWeight; + self.prevBikerPitchAimWeight = pitchAimWeight; + blindSpotTime = 0; + } + else + { + blindSpotTime += 0.05; + if( blindSpotTime > self.min_blindspot_time ) + { + self ai_ride_and_shoot_gun_blindfire(); + self ai_ride_and_shoot_gun_putaway(0); + blindSpotTime = 0; + continue; + } + else if( self.bikerIsArmed ) + { + self ai_ride_and_shoot_gun_putaway(); + } + } + } + else if( self.bikerIsArmed ) + { + self ai_ride_and_shoot_gun_putaway(); + } + if( self.bikerIsArmed ) + { + self ai_ride_and_shoot_aim_idle(); + } + else + { + self ai_ride_and_shoot_idle(); + } + wait(0.05); + } +} +ai_ride_stop_riding() +{ + self endon("death"); + self endon("start_ragdoll"); + self notify("stop_riding"); + self ClearAnim( %root, 0 ); + self Unlink(); +} +ai_ride_and_shoot_linkto_bike() +{ + assert( IsDefined(self.ridingvehicle) ); + tag_driver_origin = self.ridingvehicle GetTagOrigin("tag_driver"); + tag_driver_angles = self.ridingvehicle GetTagAngles("tag_driver"); + self ForceTeleport( tag_driver_origin, tag_driver_angles ); + self LinkTo( self.ridingvehicle, "tag_driver" ); + self ClearAnim( %root, 0 ); +} +ai_ride_and_shoot_aiming_on( sideAnimWeight ) +{ + if( !IsDefined(sideAnimWeight) ) + { + sideAnimWeight = 0; + } + if( sideAnimWeight < 0 ) + { + sideAnimWeight = abs(sideAnimWeight); + self SetAnimKnobLimited( %crew_bike_m72_aim_l_2, sideAnimWeight, 0 ); + self SetAnimKnobLimited( %crew_bike_m72_aim_l_4, sideAnimWeight, 0 ); + self SetAnimKnobLimited( %crew_bike_m72_aim_l_6, sideAnimWeight, 0 ); + self SetAnimKnobLimited( %crew_bike_m72_aim_l_8, sideAnimWeight, 0 ); + if( sideAnimWeight > 0.5 ) + { + self SetFlaggedAnimLimited( "fireAnim", %crew_bike_m72_l_fire, sideAnimWeight, 0 ); + } + else + { + self SetAnimLimited( %crew_bike_m72_l_fire, sideAnimWeight, 0 ); + } + } + else + { + self SetAnimKnobLimited( %crew_bike_m72_aim_r_2, sideAnimWeight, 0 ); + self SetAnimKnobLimited( %crew_bike_m72_aim_r_4, sideAnimWeight, 0 ); + self SetAnimKnobLimited( %crew_bike_m72_aim_r_6, sideAnimWeight, 0 ); + self SetAnimKnobLimited( %crew_bike_m72_aim_r_8, sideAnimWeight, 0 ); + if( sideAnimWeight > 0.5 ) + { + self SetFlaggedAnimLimited( "fireAnim", %crew_bike_m72_r_fire, sideAnimWeight, 0 ); + } + else + { + self SetAnimLimited( %crew_bike_m72_r_fire, sideAnimWeight, 0 ); + } + } + self SetAnimLimited( %crew_bike_m72_aim_f_2, 1 - sideAnimWeight, 0 ); + self SetAnimLimited( %crew_bike_m72_aim_f_4, 1 - sideAnimWeight, 0 ); + self SetAnimLimited( %crew_bike_m72_aim_f_6, 1 - sideAnimWeight, 0 ); + self SetAnimLimited( %crew_bike_m72_aim_f_8, 1 - sideAnimWeight, 0 ); + if( sideAnimWeight < 1 ) + { + if( sideAnimWeight < 0.5 ) + { + self SetFlaggedAnimLimited( "fireAnim", %crew_bike_m72_f_fire, 1 - sideAnimWeight, 0 ); + } + else + { + self SetAnimLimited( %crew_bike_m72_f_fire, 1 - sideAnimWeight, 0 ); + } + } + self animscripts\weaponList::RefillClip(); +} +ai_ride_and_shoot_idle() +{ + if( self.bikerShouldJump ) + { + self ai_ride_and_shoot_jump(); + return; + } + self.bikerIsAiming = false; + self.bikerIsArmed = false; + rollAnimWeight = 0; + self SetAnim( %crew_bike_m72_drive_straight, 1 - rollAnimWeight, 0.2, 1 ); +} +ai_ride_and_shoot_aim_idle( blendTime ) +{ + if( self.bikerShouldJump ) + { + self ai_ride_and_shoot_jump(); + return; + } + self.bikerIsAiming = true; + assert( IsDefined(self.shootEnt) ); + realYawToEnemy = self GetYawToOrigin(self.shootEnt.origin); + sideAnimWeight = realYawToEnemy / self.max_bike_side_yaw_angle; + if( abs(sideAnimWeight) > 1 ) + { + sideAnimWeight = sign(sideAnimWeight); + } + if( self.prevSideAnimWeight == sideAnimWeight ) + { + return; + } + self.prevSideAnimWeight = sideAnimWeight; + ai_ride_and_shoot_aiming_on( sideAnimWeight ); + if( !IsDefined(blendTime) ) + { + blendTime = 0.05; + } + if( sideAnimWeight < 0 ) + { + sideAnimWeight = abs(sideAnimWeight); + self SetAnim( %crew_bike_m72_aim_l_5, sideAnimWeight, blendTime, 1 ); + self SetAnim( %crew_bike_m72_aim_r_5, 0, blendTime, 1 ); + } + else + { + self SetAnim( %crew_bike_m72_aim_r_5, sideAnimWeight, blendTime, 1 ); + self SetAnim( %crew_bike_m72_aim_l_5, 0, blendTime, 1 ); + } + self SetAnim( %crew_bike_m72_aim_f_5, 1 - sideAnimWeight, blendTime, 1 ); +} +ai_ride_and_shoot_lean() +{ + rollAnimWeight = abs(self.ridingvehicle.angles[2]) / self.max_bike_roll_angle; + if( rollAnimWeight > 1 ) + { + rollAnimWeight = 1; + } + if( self.bikerIsAiming ) + { + if( self.ridingvehicle.angles[2] < 0 ) + { + self SetAnim( %crew_bike_m72_lean_left_armed, rollAnimWeight, 0.2, 1 ); + self SetAnim( %crew_bike_m72_lean_right_armed, 0, 0.2, 1 ); + } + else + { + self SetAnim( %crew_bike_m72_lean_left_armed, 0, 0.2, 1 ); + self SetAnim( %crew_bike_m72_lean_right_armed, rollAnimWeight, 0.2, 1 ); + } + } + else + { + if( self.ridingvehicle.angles[2] < 0 ) + { + self SetAnim( %crew_bike_m72_lean_left_unarmed, rollAnimWeight, 0.2, 1 ); + self SetAnim( %crew_bike_m72_lean_right_unarmed, 0, 0.2, 1 ); + } + else + { + self SetAnim( %crew_bike_m72_lean_left_unarmed, 0, 0.2, 1 ); + self SetAnim( %crew_bike_m72_lean_right_unarmed, rollAnimWeight, 0.2, 1 ); + } + } + return rollAnimWeight; +} +ai_ride_and_shoot_gun_pullout() +{ + self SetFlaggedAnimKnobAllRestart( "ride", %crew_bike_m72_aim_gun_pullot, %body, 1, 0.2, 1 ); + self waittillmatch("ride", "end"); + self.prevSideAnimWeight = 99999; + blendTime = 0.2; + if( IsDefined(self.shootEnt) ) + { + self ClearAnim( %crew_bike_m72_aim_gun_pullot, blendTime ); + self ClearAnim( %crew_bike_m72_lean_left_unarmed, blendTime ); + self ClearAnim( %crew_bike_m72_lean_right_unarmed, blendTime ); + self.bikerIsArmed = true; + self.prevBikerYawAimWeight = 0; + self.prevBikerPitchAimWeight = 0; + self ai_ride_and_shoot_aim_idle( blendTime ); + wait( blendTime ); + self thread ai_ride_and_shoot_gun_shoot(); + } + else + { + self ai_ride_and_shoot_gun_putaway(0); + } +} +ai_ride_and_shoot_gun_putaway( aimForwardTime ) +{ + self notify("stopShooting"); + self SetAnim( %moto_fire, 0, 0 ); + if( !IsDefined(aimForwardTime) ) + { + aimForwardTime = 0.3; + } + self SetAnimLimited( %moto_aim_4, 0, aimForwardTime ); + self SetAnimLimited( %moto_aim_6, 0, aimForwardTime ); + wait(aimForwardTime); + self SetFlaggedAnimKnobAllRestart( "ride", %crew_bike_m72_aim_gun_putaway, %body, 1, 0.2, 1 ); + self waittillmatch("ride", "end"); + self ClearAnim( %crew_bike_m72_aim_gun_putaway, 0.2 ); + self ClearAnim( %crew_bike_m72_lean_left_armed, 0.2 ); + self ClearAnim( %crew_bike_m72_lean_right_armed, 0.2 ); + self.bikerIsArmed = false; + self ai_ride_and_shoot_idle(); +} +ai_ride_and_shoot_gun_shoot() +{ + self endon("death"); + self endon("stopShooting"); + self endon("start_ragdoll"); + self SetAnim( %moto_fire, 1, 0 ); + while(1) + { + self waittillmatch("fireAnim", "fire"); + self shootEnemyWrapper(); + wait(0.05); + } +} +ai_ride_and_shoot_jump() +{ + self endon("death"); + self endon("start_ragdoll"); + if( self.bikerIsArmed ) + { + self notify("stopShooting"); + self SetFlaggedAnimKnobAllRestart( "jump", %crew_bike_m72_jump_start_armed, %body, 1, 0.2, 1 ); + while( !self.bikerShouldLand ) + { + wait(0.05); + } + self SetFlaggedAnimKnobAllRestart( "jump", %crew_bike_m72_jump_land_armed, %body, 1, 0.2, 1 ); + self waittillmatch("jump", "end"); + self ClearAnim( %crew_bike_m72_jump_land_armed, 0.2 ); + self.prevSideAnimWeight = 99999; + self thread ai_ride_and_shoot_gun_shoot(); + } + else + { + self SetFlaggedAnimKnobAllRestart( "jump", %crew_bike_m72_jump_start_unarmed, %body, 1, 0.2, 1 ); + while( !self.bikerShouldLand ) + { + wait(0.05); + } + self SetFlaggedAnimKnobAllRestart( "jump", %crew_bike_m72_jump_land_unarmed, %body, 1, 0.2, 1 ); + self waittillmatch("jump", "end"); + self ClearAnim( %crew_bike_m72_jump_land_unarmed, 0.2 ); + } + self.bikerShouldJump = false; + if( self.bikerIsArmed && IsDefined(self.shootEnt) ) + { + self ai_ride_and_shoot_aim_idle(); + } + else + { + self ai_ride_and_shoot_idle(); + } +} +ai_ride_and_shoot_watch_jump() +{ + self endon("death"); + self endon("start_ragdoll"); + while(1) + { + self.ridingvehicle waittill("veh_inair"); + self.bikerShouldLand = false; + self.bikerShouldJump = true; + self.ridingvehicle waittill("veh_landed"); + self.bikerShouldLand = true; + self.bikerShouldJump = false; + } +} +ai_ride_and_shoot_gun_blindfire() +{ + self notify("stopShooting"); + if( !self.bikerIsArmed ) + { + self SetFlaggedAnimKnobAllRestart( "ride", %crew_bike_m72_aim_gun_pullot, %body, 1, 0.2, 1 ); + self waittillmatch("ride", "end"); + self.prevSideAnimWeight = 99999; + blendTime = 0.2; + self ClearAnim( %crew_bike_m72_aim_gun_pullot, blendTime ); + self ClearAnim( %crew_bike_m72_lean_left_unarmed, blendTime ); + self ClearAnim( %crew_bike_m72_lean_right_unarmed, blendTime ); + self.bikerIsArmed = true; + } + self SetFlaggedAnimKnobAllRestart( "blindfire", %crew_bike_m72_blindfire, %body, 1, 0.2, 1 ); + self animscripts\shared::DoNotetracks("blindfire"); + self ClearAnim( %crew_bike_m72_blindfire, 0.2 ); + self thread ai_ride_and_shoot_gun_shoot(); + self.prevSideAnimWeight = 99999; +} +ai_ride_and_shoot_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + self.deathFunction = ::ai_ride_and_shoot_ragdoll_death; + return self.health + 10; +} +ai_ride_and_shoot_ragdoll_death() +{ + self.a.doingRagdollDeath = true; + self animscripts\shared::DropAllAIWeapons(); + velocity = AnglesToForward( self.angles ); + assert( IsDefined(level.ai_motorcycle_death_launch_vector) ); + velocity = ( velocity[0] * level.ai_motorcycle_death_launch_vector[0], + velocity[1] * level.ai_motorcycle_death_launch_vector[1], + level.ai_motorcycle_death_launch_vector[2] ); + self Unlink(); + self StartRagdoll(); + self LaunchRagdoll( velocity ); + recordLine( self.origin, self.origin + velocity, (1,0,0), "Script", self ); + return true; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_music.gsc b/BO1/PC/ZM/maps/_music.gsc new file mode 100644 index 0000000..01f4748 Binary files /dev/null and b/BO1/PC/ZM/maps/_music.gsc differ diff --git a/BO1/PC/ZM/maps/_names.gsc b/BO1/PC/ZM/maps/_names.gsc new file mode 100644 index 0000000..0aef53c Binary files /dev/null and b/BO1/PC/ZM/maps/_names.gsc differ diff --git a/BO1/PC/ZM/maps/_notetrack.gsc b/BO1/PC/ZM/maps/_notetrack.gsc new file mode 100644 index 0000000..6ae8898 Binary files /dev/null and b/BO1/PC/ZM/maps/_notetrack.gsc differ diff --git a/BO1/PC/ZM/maps/_patrol.gsc b/BO1/PC/ZM/maps/_patrol.gsc new file mode 100644 index 0000000..ea23b15 --- /dev/null +++ b/BO1/PC/ZM/maps/_patrol.gsc @@ -0,0 +1,336 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_anim; +#using_animtree("generic_human"); +patrol_init() +{ + level.scr_anim[ "generic" ][ "patrol_walk" ] = %patrol_bored_patrolwalk; + level.scr_anim[ "generic" ][ "patrol_walk_twitch" ] = %patrol_bored_patrolwalk_twitch; + level.scr_anim[ "generic" ][ "patrol_stop" ] = %patrol_bored_walk_2_bored; + level.scr_anim[ "generic" ][ "patrol_start" ] = %patrol_bored_2_walk; + level.scr_anim[ "generic" ][ "patrol_turn180" ] = %patrol_bored_2_walk_180turn; + level.scr_anim[ "generic" ][ "patrol_idle_1" ] = %patrol_bored_idle; + level.scr_anim[ "generic" ][ "patrol_idle_2" ] = %patrol_bored_idle_smoke; + level.scr_anim[ "generic" ][ "patrol_idle_3" ] = %patrol_bored_idle_cellphone; + level.scr_anim[ "generic" ][ "patrol_idle_4" ] = %patrol_bored_twitch_bug; + level.scr_anim[ "generic" ][ "patrol_idle_5" ] = %patrol_bored_twitch_checkphone; + level.scr_anim[ "generic" ][ "patrol_idle_6" ] = %patrol_bored_twitch_stretch; + level.scr_anim[ "generic" ][ "patrol_idle_smoke" ] = %patrol_bored_idle_smoke; + level.scr_anim[ "generic" ][ "patrol_idle_checkphone" ] = %patrol_bored_twitch_checkphone; + level.scr_anim[ "generic" ][ "patrol_idle_stretch" ] = %patrol_bored_twitch_stretch; + level.scr_anim[ "generic" ][ "patrol_idle_phone" ] = %patrol_bored_idle_cellphone; + level._patrol_init = true; +} +patrol( start_target ) +{ + if (!IsDefined(level._patrol_init)) + { + patrol_init(); + } + if (isdefined(self.enemy)) + { + return; + } + self endon( "death" ); + self endon( "end_patrol" ); + level endon( "_stealth_spotted" ); + level endon( "_stealth_found_corpse" ); + if( !isdefined( self.disable_melee ) || (self.disable_melee==0) ) + { + self contextual_melee(self.script_contextual_melee); + } + self thread waittill_combat(); + self thread waittill_death(); + assert(!isdefined(self.enemy)); + self endon("enemy"); + self.goalradius = 32; + self allowedStances("stand"); + self.disableArrivals = true; + self.disableExits = true; + self.disableTurns = true; + self.allowdeath = true; + self.script_patroller = 1; + waittillframeend; + walkanim = "patrol_walk"; + if( isdefined( self.unique_patrol_walk_anim ) ) + { + walkanim = self.unique_patrol_walk_anim; + self set_run_anim( walkanim, true ); + } + else + { + if( isdefined( self.patrol_walk_anim ) ) + { + walkanim = self.patrol_walk_anim; + } + if( IsDefined( self.script_patrol_walk_anim ) ) + { + walkanim = self.script_patrol_walk_anim; + } + self set_generic_run_anim( walkanim, true ); + } + self thread patrol_walk_twitch_loop(); + get_goal_func[ true ][ true ] = ::get_target_ents; + get_goal_func[ true ][ false ] = ::get_linked_ents; + get_goal_func[ false ][ true ] = ::get_target_nodes; + get_goal_func[ false ][ false ] = ::get_linked_nodes; + set_goal_func[ true ] = ::set_goal_ent; + set_goal_func[ false ] = ::set_goal_node; + if ( isdefined( start_target ) ) + { + self.target = start_target; + } + assertEx( isdefined( self.target ) || isdefined( self.script_linkto ), "Patroller with no target or script_linkto defined." ); + if ( isdefined( self.target ) ) + { + link_type = true; + ents = self get_target_ents(); + nodes = self get_target_nodes(); + if ( ents.size ) + { + currentgoal = random( ents ); + goal_type = true; + } + else + { + currentgoal = random( nodes ); + goal_type = false; + } + } + else + { + link_type = false; + ents = self get_linked_ents(); + nodes = self get_linked_nodes(); + if ( ents.size ) + { + currentgoal = random( ents ); + goal_type = true; + } + else + { + currentgoal = random( nodes ); + goal_type = false; + } + } + assertex( isdefined( currentgoal ), "Initial goal for patroller is undefined" ); + nextgoal = currentgoal; + for ( ;; ) + { + while ( isdefined( nextgoal.patrol_claimed ) ) + { + wait 0.05; + } + currentgoal.patrol_claimed = undefined; + currentgoal = nextgoal; + self notify( "release_node" ); + assertex( !isdefined( currentgoal.patrol_claimed ), "Goal was already claimed" ); + if (!is_true(self.patrol_dont_claim_node)) + { + currentgoal.patrol_claimed = true; + } + self.last_patrol_goal = currentgoal; + [[ set_goal_func[ goal_type ] ]]( currentgoal ); + if( isdefined( currentgoal.radius ) && currentgoal.radius > 0 ) + { + self.goalradius = currentgoal.radius; + } + else + { + self.goalradius = 32; + } + self waittill("goal"); + currentgoal notify( "trigger", self ); + if ( isdefined( currentgoal.script_animation ) ) + { + stop = "patrol_stop"; + self anim_generic_custom_animmode( self, "gravity", stop ); + switch( currentgoal.script_animation ) + { + case "pause": + idle = "patrol_idle_" + randomintrange(1,6); + self anim_generic( self, idle ); + start = "patrol_start"; + self anim_generic_custom_animmode( self, "gravity", start ); + break; + case "turn180": + turn = "patrol_turn180"; + self anim_generic_custom_animmode( self, "gravity", turn ); + break; + case "smoke": + anime = "patrol_idle_smoke"; + self anim_generic( self, anime ); + start = "patrol_start"; + self anim_generic_custom_animmode( self, "gravity", start ); + break; + case "stretch": + anime = "patrol_idle_stretch"; + self anim_generic( self, anime ); + start = "patrol_start"; + self anim_generic_custom_animmode( self, "gravity", start ); + break; + case "checkphone": + anime = "patrol_idle_checkphone"; + self anim_generic( self, anime ); + start = "patrol_start"; + self anim_generic_custom_animmode( self, "gravity", start ); + break; + case "phone": + anime = "patrol_idle_phone"; + self anim_generic( self, anime ); + start = "patrol_start"; + self anim_generic_custom_animmode( self, "gravity", start ); + break; + } + } + currentgoals = currentgoal [[ get_goal_func[ goal_type ][ link_type ] ]](); + if ( !currentgoals.size ) + { + self notify( "reached_path_end" ); + if( IsDefined( self ) && IsDefined( self.patroller_delete_on_path_end ) && self.patroller_delete_on_path_end ) + { + release_claimed_node(); + self notify( "patroller_deleted_on_path_end" ); + self Delete(); + } + break; + } + nextgoal = random( currentgoals ); + } +} +patrol_walk_twitch_loop() +{ + self endon( "death" ); + self endon( "enemy" ); + self endon( "end_patrol" ); + level endon( "_stealth_spotted" ); + level endon( "_stealth_found_corpse" ); + self notify( "patrol_walk_twitch_loop" ); + self endon( "patrol_walk_twitch_loop" ); + if( (isdefined( self.patrol_walk_anim )||isdefined(self.unique_patrol_walk_anim) ) && !isdefined( self.patrol_walk_twitch ) ) + { + return; + } + while(1) + { + wait randomfloatrange(8,20); + walkanim = "patrol_walk_twitch"; + if( isdefined( self.patrol_walk_twitch ) ) + { + walkanim = self.patrol_walk_twitch; + } + self set_generic_run_anim( walkanim, true ); + length = getanimlength( getanim_generic( walkanim ) ); + wait length; + walkanim = "patrol_walk"; + if( isdefined( self.unique_patrol_walk_anim ) ) + { + walkanim = self.unique_patrol_walk_anim; + self set_run_anim( walkanim, true ); + } + else + { + if( isdefined( self.patrol_walk_anim ) ) + { + walkanim = self.patrol_walk_anim; + } + if( IsDefined( self.script_patrol_walk_anim ) ) + { + walkanim = self.script_patrol_walk_anim; + } + self set_generic_run_anim( walkanim, true ); + } + } +} +waittill_combat_wait() +{ + self endon( "end_patrol" ); + level endon( "_stealth_spotted" ); + level endon( "_stealth_found_corpse" ); + self waittill( "enemy" ); +} +waittill_death() +{ + self waittill( "death" ); + if( !isdefined( self ) ) + { + return; + } + release_claimed_node(); +} +release_claimed_node() +{ + self notify( "release_node" ); + if( !isdefined( self.last_patrol_goal ) ) + { + return; + } + self.last_patrol_goal.patrol_claimed = undefined; +} +waittill_combat() +{ + self endon( "death" ); + assert(!isdefined(self.enemy)); + waittill_combat_wait(); + if( !isdefined( self._stealth ) ) + { + self clear_run_anim(); + self allowedStances( "stand", "crouch", "prone" ); + self.disableArrivals = false; + self.disableExits = false; + self.disableTurns = false; + self stopanimscripted(); + self notify( "stop_animmode" ); + } + self.allowdeath = false; + if( !isdefined( self ) ) + { + return; + } + self notify( "release_node" ); + if( !isdefined( self.last_patrol_goal ) ) + { + return; + } + self.last_patrol_goal.patrol_claimed = undefined; +} +get_target_ents() +{ + array = []; + if ( isdefined( self.target ) ) + { + array = getentarray( self.target, "targetname" ); + } + return array; +} +get_target_nodes() +{ + array = []; + if ( isdefined( self.target ) ) + { + array = getnodearray( self.target, "targetname" ); + } + return array; +} +get_linked_nodes() +{ + array = []; + if ( isdefined( self.script_linkto ) ) + { + linknames = strtok( self.script_linkto, " " ); + for ( i = 0; i < linknames.size; i ++ ) + { + ent = getnode( linknames[ i ], "script_linkname" ); + if ( isdefined( ent ) ) + { + array[ array.size ] = ent; + } + } + } + return array; +} +showclaimed( goal ) +{ + self endon( "release_node" ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_plane_weapons.gsc b/BO1/PC/ZM/maps/_plane_weapons.gsc new file mode 100644 index 0000000..156136a --- /dev/null +++ b/BO1/PC/ZM/maps/_plane_weapons.gsc @@ -0,0 +1,287 @@ + +#include maps\_utility; +#include common_scripts\utility; +main() +{ +} +build_bomb_explosions( type, quakepower, quaketime, quakeradius, range, min_damage, max_damage ) +{ + if( !IsDefined( level.plane_bomb_explosion ) ) + { + level.plane_bomb_explosion = []; + } + AssertEx( IsDefined( quakepower ), "_plane_weapons::build_bomb_explosions(): no quakepower specified!" ); + AssertEx( IsDefined( quaketime ), "_plane_weapons::build_bomb_explosions(): no quaketime specified!" ); + AssertEx( IsDefined( quakeradius ), "_plane_weapons::build_bomb_explosions(): no quakeradius specified!" ); + AssertEx( IsDefined( range ), "_plane_weapons::build_bomb_explosions(): no range specified!" ); + AssertEx( IsDefined( min_damage ), "_plane_weapons::build_bomb_explosions(): no min_damage specified!" ); + AssertEx( IsDefined( max_damage ), "_plane_weapons::build_bomb_explosions(): no max_damage specified!" ); + struct = spawnstruct(); + struct.quakepower = quakepower; + struct.quaketime = quaketime; + struct.quakeradius = quakeradius; + struct.range = range; + struct.mindamage = min_damage; + struct.maxdamage = max_damage; + level.plane_bomb_explosion[ type ] = struct; +} +build_bombs( type, bombmodel, bombfx, bomb_sound ) +{ + AssertEx( IsDefined( type ), "_plane_weapons::build_bombs(): no vehicletype specified!" ); + AssertEx( IsDefined( bombmodel ), "_plane_weapons::build_bombs(): no bomb model specified!" ); + AssertEx( IsDefined( bombfx ), "_plane_weapons::build_bombs(): no bomb explosion FX specified!" ); + AssertEx( IsDefined( bomb_sound ), "_plane_weapons::build_bombs(): no bomb explosion sound specified!" ); + if( !IsDefined( level.plane_bomb_model ) ) + { + level.plane_bomb_model = []; + } + if( !IsDefined( level.plane_bomb_model[ type ] ) ) + { + level.plane_bomb_model[ type ] = bombmodel; + } + if( !IsDefined( level.plane_bomb_fx ) ) + { + level.plane_bomb_fx = []; + } + if( !IsDefined( level.plane_bomb_fx[ type ] ) ) + { + fx = LoadFx( bombfx ); + level.plane_bomb_fx[ type ] = fx; + } + if( !IsDefined( level.plane_bomb_sound ) ) + { + level.plane_bomb_sound = []; + } + if( !IsDefined( level.plane_bomb_sound[ type ] ) ) + { + level.plane_bomb_sound[ type ] = bomb_sound; + } +} +bomb_init( bomb_count ) +{ + errormsg = "Can't find the bomb model for this vehicletype. Check your vehicle's script file; you may need to call its setup_bombs function."; + AssertEx( IsDefined( level.plane_bomb_model[ self.vehicletype ] ), errormsg ); + errormsg = "Can't find the bomb explosion fx for this vehicletype. Check your vehicle's script file; you may need to call its setup_bombs function."; + AssertEx( IsDefined( level.plane_bomb_fx[ self.vehicletype ] ), errormsg ); + errormsg = "Can't find the bomb explosion sound for this vehicletype. Check your vehicle's script file; you may need to call its setup_bombs function."; + AssertEx( IsDefined( level.plane_bomb_sound[ self.vehicletype ] ), errormsg ); + self.bomb_count = bomb_count; + if( bomb_count > 0 ) + { + self thread attach_bombs(); + self thread drop_bombs_waittill(); + self thread bomb_drop_end(); + } +} +drop_bombs_waittill() +{ + self endon( "death" ); + self endon( "reached_end_node" ); + while( 1 ) + { + self waittill( "drop_bombs", amount, delay, delay_trace ); + drop_bombs( amount, delay, delay_trace ); + } +} +bomb_drop_end() +{ + self waittill( "reached_end_node" ); + if( IsDefined( self.bomb ) ) + { + for( i = 0; i < self.bomb.size; i++ ) + { + if( IsDefined( self.bomb[i] ) && !self.bomb[i].dropped ) + { + self.bomb[i] Delete(); + } + } + } +} +attach_bombs() +{ + self.bomb = []; + bomb_tag = []; + switch(self.model) + { + case "t5_veh_jet_mig17": + case "t5_veh_jet_mig17_gear": + bomb_tag[0] = "tag_left_wingtip"; + bomb_tag[1] = "tag_right_wingtip"; + break; + default: + bomb_tag[0] = "tag_smallbomb01left"; + bomb_tag[1] = "tag_smallbomb02left"; + bomb_tag[2] = "tag_smallbomb01right"; + bomb_tag[3] = "tag_smallbomb02right"; + bomb_tag[4] = "tag_BIGbomb"; + break; + } + for( i = 0; i < self.bomb_count; i++ ) + { + self.bomb[i] = Spawn( "script_model", ( self.origin ) ); + self.bomb[i] SetModel( level.plane_bomb_model[ self.vehicletype ] ); + self.bomb[i].dropped = false; + if(IsDefined(bomb_tag[i])) + { + self.bomb[i] LinkTo( self, bomb_tag[i], ( 0, 0, -4 ), ( -10, 0, 0 ) ); + } + } +} +drop_bombs( amount, delay, delay_trace, trace_dist ) +{ + self endon( "reached_end_node" ); + self endon ("death"); + total_bomb_count = array_removeUndefined( self.bomb ).size; + user_delay = undefined; + new_bomb_index = undefined; + if( !IsDefined( self.bomb.size ) ) + { + return; + } + if( amount == 0 ) + { + return; + } + if( total_bomb_count <= 0 ) + { + println( "^3_plane_weapons::drop_bombs(): Plane at " + self.origin + " with targetname " + self.targetname + " has no bombs to drop!" ); + return; + } + if( IsDefined( delay ) ) + { + user_delay = delay; + } + if( !IsDefined( amount ) || ( amount > total_bomb_count ) ) + { + amount = total_bomb_count; + } + for( i = 0; i < amount; i++ ) + { + if( total_bomb_count <= 0 ) + { + println( "^3_plane_weapons::drop_bombs(): Plane at " + self.origin + " with targetname " + self.targetname + " has no more bombs to drop!" ); + return; + } + if( ( IsDefined( self.bomb[i] ) && self.bomb[i].dropped ) || !IsDefined( self.bomb[i] ) ) + { + for( q = 0; q < self.bomb.size; q++ ) + { + if( IsDefined( self.bomb[i+q] ) && !self.bomb[i+q].dropped ) + { + new_bomb_index = i+q; + break; + } + } + } + else + { + new_bomb_index = i; + } + total_bomb_count--; + self.bomb_count--; + self.bomb[new_bomb_index].dropped = true; + forward = AnglesToForward( self.angles ); + vec = vector_scale( forward, self GetSpeed() ); + vec_predict = self.bomb[new_bomb_index].origin + vector_scale( forward, ( self GetSpeed() * 0.06 ) ); + self.bomb[new_bomb_index] UnLink(); + self.bomb[new_bomb_index].origin = vec_predict; + self.bomb[new_bomb_index] MoveGravity( ( ( vec ) ), 10 ); + self.bomb[new_bomb_index] thread bomb_wiggle(); + self.bomb[new_bomb_index] thread bomb_trace( self.vehicletype, delay_trace, trace_dist ); + if( IsDefined( user_delay ) ) + { + delay = user_delay; + } + else + { + delay = 0.1 + RandomFloat( 0.5 ); + } + wait( delay ); + } +} +bomb_wiggle() +{ + self endon( "death" ); + original_angles = self.angles; + while( 1 ) + { + roll = 10 + RandomFloat( 20 ); + yaw = 4 + RandomFloat( 3 ); + time = 0.25 + RandomFloat( 0.25 ); + time_in_half = time/3; + self bomb_pitch( time ); + self RotateTo( ( self.pitch, ( original_angles[1] +( yaw * -2 ) ), ( roll * -2 ) ), ( time * 2 ), ( time_in_half * 2 ), ( time_in_half * 2 ) ); + self waittill( "rotatedone" ); + self bomb_pitch( time ); + self RotateTo( ( self.pitch, ( original_angles[1] +( yaw * 2 ) ), ( roll * 2 ) ), ( time * 2 ), ( time_in_half * 2 ), ( time_in_half * 2 ) ); + self waittill( "rotatedone" ); + } +} +bomb_pitch( time_of_rotation ) +{ + self endon( "death" ); + if( !IsDefined( self.pitch ) ) + { + original_pitch = self.angles; + self.pitch = original_pitch[0]; + time = 15 + RandomFloat( 5 ); + } + if( self.pitch < 80 ) + { + self.pitch = ( self.pitch +( 40 * time_of_rotation ) ); + if( self.pitch > 80 ) + { + self.pitch = 80; + } + } + return; +} +bomb_trace( type, delay_trace, trace_dist ) +{ + self endon( "death" ); + if( IsDefined( delay_trace ) ) + { + wait( delay_trace ); + } + if( !IsDefined( trace_dist ) ) + { + trace_dist = 64; + } + while( 1 ) + { + vec1 = self.origin; + direction = AnglesToForward( ( 90, 0, 0 ) ); + vec2 = vec1 + vector_scale( direction, 10000 ); + trace_result = BulletTrace( vec1, vec2, false, undefined ); + dist = Distance( self.origin, trace_result["position"] ); + if( dist < trace_dist || dist >= 10000 ) + { + self thread bomb_explosion( type ); + } + wait( 0.05 ); + } +} +bomb_explosion( type ) +{ + Assert( IsDefined( level.plane_bomb_explosion[ type ] ), "_plane_weapons::bomb_explosion(): No plane_bomb_explosion info set up for vehicletype " + type + ". Make sure to run _plane_weapons::build_bomb_explosions() first." ); + struct = level.plane_bomb_explosion[ type ]; + quake_power = struct.quakepower; + quake_time = struct.quaketime; + quake_radius = struct.quakeradius; + damage_range = struct.range; + max_damage = struct.mindamage; + min_damage = struct.maxdamage; + sound_org = Spawn( "script_origin", self.origin ); + sound_org PlaySound( level.plane_bomb_sound[ type ] ); + sound_org thread bomb_sound_delete(); + PlayFx( level.plane_bomb_fx[ type ], self.origin ); + Earthquake( quake_power, quake_time, self.origin, quake_radius ); + RadiusDamage( self.origin, damage_range, max_damage, min_damage ); + self Delete(); +} +bomb_sound_delete() +{ + wait( 5 ); + self Delete(); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_policecar.gsc b/BO1/PC/ZM/maps/_policecar.gsc new file mode 100644 index 0000000..ded28fe Binary files /dev/null and b/BO1/PC/ZM/maps/_policecar.gsc differ diff --git a/BO1/PC/ZM/maps/_radiant_live_update.gsc b/BO1/PC/ZM/maps/_radiant_live_update.gsc new file mode 100644 index 0000000..e3f198a Binary files /dev/null and b/BO1/PC/ZM/maps/_radiant_live_update.gsc differ diff --git a/BO1/PC/ZM/maps/_rcbomb.gsc b/BO1/PC/ZM/maps/_rcbomb.gsc new file mode 100644 index 0000000..8786976 Binary files /dev/null and b/BO1/PC/ZM/maps/_rcbomb.gsc differ diff --git a/BO1/PC/ZM/maps/_rusher.gsc b/BO1/PC/ZM/maps/_rusher.gsc new file mode 100644 index 0000000..c0c0f7e Binary files /dev/null and b/BO1/PC/ZM/maps/_rusher.gsc differ diff --git a/BO1/PC/ZM/maps/_sampan.gsc b/BO1/PC/ZM/maps/_sampan.gsc new file mode 100644 index 0000000..47f62fd Binary files /dev/null and b/BO1/PC/ZM/maps/_sampan.gsc differ diff --git a/BO1/PC/ZM/maps/_scripted.gsc b/BO1/PC/ZM/maps/_scripted.gsc new file mode 100644 index 0000000..bb3e756 Binary files /dev/null and b/BO1/PC/ZM/maps/_scripted.gsc differ diff --git a/BO1/PC/ZM/maps/_serverfaceanim.gsc b/BO1/PC/ZM/maps/_serverfaceanim.gsc new file mode 100644 index 0000000..72a9401 Binary files /dev/null and b/BO1/PC/ZM/maps/_serverfaceanim.gsc differ diff --git a/BO1/PC/ZM/maps/_shellshock.gsc b/BO1/PC/ZM/maps/_shellshock.gsc new file mode 100644 index 0000000..9325523 Binary files /dev/null and b/BO1/PC/ZM/maps/_shellshock.gsc differ diff --git a/BO1/PC/ZM/maps/_shutter.gsc b/BO1/PC/ZM/maps/_shutter.gsc new file mode 100644 index 0000000..2e5d87d Binary files /dev/null and b/BO1/PC/ZM/maps/_shutter.gsc differ diff --git a/BO1/PC/ZM/maps/_snowcat.gsc b/BO1/PC/ZM/maps/_snowcat.gsc new file mode 100644 index 0000000..ae892b8 Binary files /dev/null and b/BO1/PC/ZM/maps/_snowcat.gsc differ diff --git a/BO1/PC/ZM/maps/_spawn_manager.gsc b/BO1/PC/ZM/maps/_spawn_manager.gsc new file mode 100644 index 0000000..72d8903 --- /dev/null +++ b/BO1/PC/ZM/maps/_spawn_manager.gsc @@ -0,0 +1,766 @@ + +#include maps\_utility; +#include common_scripts\utility; +spawn_manager_main() +{ + level.spawn_manager_max_frame_spawn = 3; + level.spawn_manager_total_count = 0; + level.spawn_manager_max_ai = 24; + level.spawn_manager_active_ai = 0; + level.spawn_manager_auto_targetname_num = 0; + level thread spawn_manager_throttle_think(); + level.spawn_managers = []; + trigger_spawn_manager_setup(); + array_func( GetEntArray("spawn_manager", "classname"), ::spawn_manager_create_spawn_manager_struct ); + array_thread(level.spawn_managers, ::spawn_manager_think); + start_triggers("trigger_multiple"); + start_triggers("trigger_once"); + start_triggers("trigger_use"); + start_triggers("trigger_radius"); + start_triggers("trigger_lookat"); + start_triggers("trigger_damage"); +} +trigger_spawn_manager_setup() +{ + trigger_types = []; + trigger_types[trigger_types.size] = "trigger_multiple"; + trigger_types[trigger_types.size] = "trigger_once"; + trigger_types[trigger_types.size] = "trigger_radius"; + trigger_types[trigger_types.size] = "trigger_lookat"; + for( i=0; i= self.sm_group_size_min, "Max range should be greater or equal to the min value for sm_count on spawn manager " + self.sm_id ); + if( !IsDefined( self.sm_spawner_count ) ) + { + self.sm_spawner_count = self.allSpawners.size; + } + self.sm_spawner_count_min = get_min_value( self.sm_spawner_count ); + self.sm_spawner_count_max = get_max_value( self.sm_spawner_count ); + AssertEx( self.sm_spawner_count_max >= self.sm_spawner_count_min, "Max range should be greater or equal to the min value for sm_count on spawn manager " + self.sm_id ); + self.sm_spawner_count = spawn_manager_random_count( self.sm_spawner_count_min, self.sm_spawner_count_max + 1 ); + self calculate_count(); + if( !IsDefined( self.sm_active_count ) ) + { + self.sm_active_count = self.allSpawners.size; + if (self.sm_active_count < self.sm_group_size_max) + { + self.sm_active_count = self.sm_group_size_max; + } + } + self.sm_active_count_min = get_min_value( self.sm_active_count ); + self.sm_active_count_max = get_max_value( self.sm_active_count ); + if (self.sm_active_count_min < self.sm_group_size_max) + { + AssertEx( self.sm_active_count_max >= self.sm_group_size_max, "Max active count should be greater or equal to the max value for sm_group_size on spawn manager trigger with targetname " + self.targetname ); + self.sm_active_count_min = self.sm_group_size_max; + } + AssertEx( self.sm_active_count_max >= self.sm_active_count_min, "Max range should be greater or equal to the min value for sm_active_count on spawn manager trigger with targetname " + self.targetname ); + self.sm_active_count = spawn_manager_random_count(self.sm_active_count_min, self.sm_active_count_max+1); + if(!IsDefined(self.script_forcespawn)) + { + self.script_forcespawn = 0; + } + self.spawners = self spawn_manager_get_spawners(); + Assert(self.count >= self.count_min); + Assert(self.count <= self.count_max); + Assert(self.sm_active_count >= self.sm_active_count_min); + Assert(self.sm_active_count <= self.sm_active_count_max); + Assert(self.sm_group_size_max <= self.sm_active_count); + Assert(self.sm_group_size_min <= self.sm_active_count); +} +spawn_manager_can_spawn(spawnGroupSize) +{ + totalFree = self.count - self.spawnCount; + activeFree = self.sm_active_count - self.activeAI.size; + canSpawnGroup = (activeFree >= spawnGroupSize) + && (totalFree >= spawnGroupSize) + && (spawnGroupSize > 0); + globalFree = level.spawn_manager_max_ai - level.spawn_manager_active_ai; + AssertEx( self.enable == flag("sm_" + self.sm_id + "_enabled"), "Spawn manager flags should not be set by the level script." ); + if(self.script_forcespawn == 0) + { + return (totalFree > 0) + && (activeFree > 0) + && (globalFree > 0) + && canSpawnGroup + && self.enable + ; + } + else + { + return (totalFree > 0) + && (activeFree > 0) + && self.enable + ; + } +} +spawn_manager_spawn(maxDelay) +{ + self endon ("death"); + start = GetTime(); + for(;;) + { + while(level.spawn_manager_frame_spawns >= level.spawn_manager_max_frame_spawn + || level.spawn_manager_active_ai >= level.spawn_manager_max_ai) + { + level waittill("spawn_manager_throttle_reset"); + } + ai = self spawn_ai(); + if(!spawn_failed(ai)) + { + ai maps\_names::get_name(); + return ai; + } + else if((gettime() - start) > (1000*maxDelay)) + { + return ai; + } + wait(0.05); + } +} +spawn_manager_spawn_group(manager, spawner, spawnGroupSize) +{ + spawn_count = 0; + for( i = 0; i < spawnGroupSize; i++) + { + ai = undefined; + if (IsDefined(spawner) && IsDefined(spawner.targetname) ) + { + ai = spawner spawn_manager_spawn(2.0); + } + else + { + continue; + } + if (!spawn_failed(ai)) + { + spawn_count++; + level.spawn_manager_frame_spawns += 1; + if (IsDefined(self.script_radius)) + { + ai.script_radius = self.script_radius; + } + if (IsDefined(spawner.script_radius)) + { + ai.script_radius = spawner.script_radius; + } + ai thread spawn_accounting(spawner, self); + } + if( spawn_count == spawnGroupSize ) + wait(.05); + } +} +spawn_accounting(spawner, manager) +{ + targetname = manager.targetname; + classname = spawner.classname; + level.spawn_manager_total_count += 1; + manager.spawnCount += 1; + level.spawn_manager_active_ai += 1; + origin = spawner.origin; + manager.activeAI[manager.activeAI.size] = self; + spawner.activeAI[spawner.activeAI.size] = self; + self waittill("death"); + if(IsDefined(spawner)) + { + spawner.activeAI = array_remove_nokeys(spawner.activeAI, self); + } + if(IsDefined(manager)) + { + manager.activeAI = array_remove_nokeys(manager.activeAI, self); + } + level.spawn_manager_active_ai -= 1; +} +spawn_manager_think() +{ + if (!IsDefined(self.targetname)) + { + self.targetname = generate_targetname(); + } + if (!IsDefined(self.sm_id)) + { + self.sm_id = self.targetname; + } + self spawn_manager_flags_setup(); + self thread spawn_manager_enable_think(); + self thread spawn_manager_kill_think(); + self endon("kill"); + self.enable = false; + self.activeAI = []; + self.spawnCount = 0; + isFirstTime = true; + self.allSpawners = GetEntArray(self.target, "targetname"); + AssertEx(self.allSpawners.size, "Spawn manager '" + self.sm_id + "' doesn't target any spawners."); + self waittill("enable"); + script_delay(); + self spawn_manager_setup(); + while( self.spawnCount < self.count && self.spawners.size > 0 ) + { + self spawn_manager_get_spawn_group_size(); + if( self.sm_group_size + self.spawnCount > self.count ) + { + self.sm_group_size = self.count - self.spawnCount; + } + spawned = false; + while( !spawned ) + { + cleanup_spawners(); + if( self.spawners.size <= 0 ) + { + break; + } + if(self spawn_manager_can_spawn(self.sm_group_size)) + { + Assert( self.sm_group_size > 0 ); + potential_spawners = []; + priority_spawners = []; + for( i = 0; i< self.spawners.size; i++ ) + { + current_spawner = self.spawners[i]; + if( IsDefined(current_spawner) ) + { + spawnerFree = current_spawner.sm_active_count - current_spawner.activeAI.size; + if( spawnerFree >= self.sm_group_size ) + { + if (current_spawner has_spawnflag(level.SPAWNFLAG_ACTOR_SM_PRIORITY)) + { + priority_spawners[priority_spawners.size] = current_spawner; + } + else + { + potential_spawners[potential_spawners.size] = current_spawner; + } + } + } + } + if( potential_spawners.size > 0 || priority_spawners.size > 0) + { + if (priority_spawners.size > 0) + { + spawner = random( priority_spawners ); + } + else + { + spawner = random( potential_spawners ); + } + Assert( IsDefined( spawner.count ) ); + if( spawner.count < self.sm_group_size ) + { + self.sm_group_size = spawner.count; + } + if( !isFirstTime ) + { + spawn_manager_wait(); + } + else + { + isFirstTime = false; + } + if( !self.enable ) + { + continue; + } + self spawn_manager_spawn_group(self, spawner, self.sm_group_size); + spawned = true; + } + else + { + spawner_max_active_count = 0; + for( i = 0; i< self.spawners.size; i++ ) + { + current_spawner = self.spawners[i]; + if( IsDefined(current_spawner) ) + { + if( current_spawner.sm_active_count > spawner_max_active_count ) + { + spawner_max_active_count = current_spawner.sm_active_count; + } + } + } + if( spawner_max_active_count < self.sm_group_size_max ) + { + self.sm_group_size_max = spawner_max_active_count; + self spawn_manager_get_spawn_group_size(); + } + } + } + wait(0.05); + } + AssertEx( self.spawnCount <= self.count, "Spawn manager spawned more then the allowed AI's" ); + wait(0.05); + AssertEx( !flag( "sm_" + self.sm_id + "_killed" ), "Spawn manager flags should not be set by the level script." ); + AssertEx( !flag( "sm_" + self.sm_id + "_complete" ), "Spawn manager flags should not be set by the level script." ); + if(self.script_forcespawn == 0) + { + wait(maps\_laststand::player_num_in_laststand()/get_players().size * 8); + } + } + self spawn_manager_flag_complete(); + self notify("kill"); +} +spawn_manager_enable_think() +{ + self endon("kill"); + for(;;) + { + self waittill("enable"); + self.enable = true; + self spawn_manager_flag_enabled(); + self waittill("disable"); + self spawn_manager_flag_disabled(); + } +} +spawn_manager_enable_trigger_think(spawn_manager) +{ + spawn_manager endon("enable"); + self waittill("trigger"); + spawn_manager notify("enable"); +} +spawn_manager_kill_think() +{ + self waittill("kill"); + if( IsDefined( self.script_next_spawn_manager ) ) + { + spawn_manager_enable( self.script_next_spawn_manager ); + } + self spawn_manager_flag_disabled(); + self spawn_manager_flag_killed(); + for (i = 0; i < self.allSpawners.size; i++) + { + if (IsDefined(self.allSpawners[i])) + { + self.allSpawners[i] Delete(); + } + } + array_wait( self.activeAI, "death" ); + self spawn_manager_flag_cleared(); + level.spawn_managers = array_remove(level.spawn_managers, self); +} +spawn_manager_kill_trigger_think() +{ + assert( IsDefined(self.sm_kill) ); + sm_kill_ids = StrTok(self.sm_kill, ";"); + if (sm_kill_ids.size > 0) + { + self waittill( "trigger" ); + for (id_i = 0; id_i < sm_kill_ids.size; id_i++) + { + killspawner_num = Int(sm_kill_ids[id_i]); + for (sm_i = 0; sm_i < level.spawn_managers.size; sm_i++) + { + if (killspawner_num != 0) + { + if(IsDefined(level.spawn_managers[sm_i].sm_die) && (level.spawn_managers[sm_i].sm_die == killspawner_num)) + { + level.spawn_managers[sm_i] notify("kill"); + } + } + else if (level.spawn_managers[sm_i].sm_id == sm_kill_ids[id_i]) + { + level.spawn_managers[sm_i] notify("kill"); + } + } + } + } +} +start_triggers(trigger_type) +{ + triggers = GetEntArray(trigger_type, "classname"); + for(i=0; i 0 ) + { + for( j = 0; j < targets.size; j++ ) + { + AssertEx( is_in_array( level.spawn_managers, targets[j] ), "Spawn manager is found but doesnt exists in the level.spawn_managers" ); + sm_num++; + triggers[i] thread spawn_manager_enable_trigger_think(targets[j]); + AssertEx( !(sm_num > 1), "Only one spawn manager can be triggered by a single trigger." ); + } + } + } + } +} +spawn_manager_throttle_think() +{ + for(;;) + { + level.spawn_manager_frame_spawns = 0; + level notify("spawn_manager_throttle_reset"); + wait_network_frame(); + } +} +spawn_manager_random_count(min, max) +{ + return RandomIntRange(min, max); +} +get_spawn_manager_array( targetname ) +{ + if( IsDefined( targetname ) ) + { + spawn_manager_array = []; + for( i = 0; i< level.spawn_managers.size; i++ ) + { + if( level.spawn_managers[i].targetname == targetname ) + { + spawn_manager_array = array_add( spawn_manager_array, level.spawn_managers[i] ); + } + } + return spawn_manager_array; + } + else + { + return level.spawn_managers; + } +} +spawn_manager_get_spawners() +{ + self.allSpawners = array_removeUndefined(self.allSpawners); + exclude = []; + for ( i = 0; i < self.allSpawners.size; i++) + { + if((IsDefined(level._gamemode_norandomdogs)) && (self.allSpawners[i].classname == "actor_enemy_dog_sp")) + { + exclude = array_add(exclude, self.allSpawners[i]); + } + self.allSpawners[i] calculate_count(); + } + self.allSpawners = array_exclude(self.allSpawners, exclude); + spawner_count_with_min_active = 0; + for ( i = 0; i < self.allSpawners.size; i++) + { + self.allSpawners[i] spawner_calculate_active_count(self); + if ( self.allSpawners[i].sm_active_count_min >= self.sm_group_size_min ) + { + spawner_count_with_min_active++; + } + if( !IsDefined(self.allSpawners[i].activeAI) ) + { + self.allSpawners[i].activeAI = []; + } + } + AssertEx(spawner_count_with_min_active >= self.allSpawners.size, "On spawn manager '" + self.sm_id + "' with a min group size of " + self.sm_group_size_min + ", you must have all spawners with an active count of at least " + self.sm_group_size_min + "."); + groupSpawners = self.allSpawners; + spawner_count = self.sm_spawner_count; + if (spawner_count > self.allSpawners.size) + { + spawner_count = self.allSpawners.size; + } + spawners = []; + while(spawners.size < spawner_count) + { + spawner = random(groupSpawners); + spawners = array_add(spawners, spawner); + groupSpawners = array_remove_nokeys(groupSpawners, spawner); + } + return spawners; +} +spawner_calculate_active_count(spawn_manager) +{ + if( !IsDefined( self.sm_active_count ) ) + { + self.sm_active_count = level.spawn_manager_max_ai; + } + self.sm_active_count_min = get_min_value( self.sm_active_count ); + self.sm_active_count_max = get_max_value( self.sm_active_count ); + AssertEx( self.sm_active_count_max >= self.sm_active_count_min, "Max value should be greater or equal to the min value for the spawner's sm_active_count on spawn manager " + spawn_manager.sm_id ); + self.sm_active_count = RandomIntRange( self.sm_active_count_min, self.sm_active_count_max + 1 ); +} +spawn_manager_get_spawn_group_size() +{ + if( self.sm_group_size_min < self.sm_group_size_max ) + { + self.sm_group_size = RandomIntRange( self.sm_group_size_min, self.sm_group_size_max + 1 ); + } + else + { + self.sm_group_size = self.sm_group_size_min; + } + return self.sm_group_size; +} +cleanup_spawners() +{ + spawners = []; + for (i = 0; i < self.spawners.size; i++) + { + if (IsDefined(self.spawners[i])) + { + if(self.spawners[i].count != 0) + { + spawners[spawners.size] = self.spawners[i]; + } + else + { + self.spawners[i] delete(); + } + } + } + self.spawners = spawners; +} +get_min_value( value ) +{ + values = strtok( value, " " ); + num_players = get_players(); + for( i = num_players.size - 1; i>=0; i-- ) + { + if( IsDefined( values[i] ) ) + { + if( !IsDefined( values[i+1] ) && i > 0 ) + { + return Int(values[i-1]); + } + else + { + return Int(values[i]); + } + } + } + return undefined; +} +get_max_value( value ) +{ + values = strtok( value, " " ); + num_players = get_players(); + for( i = num_players.size; i>=0; i-- ) + { + if( IsDefined( values[i] ) ) + { + return Int(values[i]); + } + } + return undefined; +} +spawn_manager_sanity() +{ + assert(self.activeAI.size <= self.sm_active_count); + assert(self.spawnCount <= self.count); +} +spawn_manager_wait() +{ + if (IsDefined(self.script_wait)) + { + wait(self.script_wait); + if( IsDefined( self.script_wait_add ) ) + { + self.script_wait += self.script_wait_add; + } + } + else if( IsDefined( self.script_wait_min ) && IsDefined( self.script_wait_max ) ) + { + coop_scalar = 1; + players = get_players(); + if (players.size == 2) + { + coop_scalar = 0.7; + } + else if (players.size == 3) + { + coop_scalar = 0.5; + } + else if (players.size == 4) + { + coop_scalar = 0.3; + } + diff = self.script_wait_max - self.script_wait_min; + wait( RandomFloatrange( self.script_wait_min, self.script_wait_min + (diff * coop_scalar) ) ); + if( IsDefined( self.script_wait_add ) ) + { + self.script_wait_min += self.script_wait_add; + self.script_wait_max += self.script_wait_add; + } + } +} +spawn_manager_flags_setup() +{ + flag_init("sm_" + self.sm_id + "_enabled"); + flag_init("sm_" + self.sm_id + "_complete"); + flag_init("sm_" + self.sm_id + "_killed"); + flag_init("sm_" + self.sm_id + "_cleared"); +} +spawn_manager_flag_enabled() +{ + AssertEx( !flag( "sm_" + self.sm_id + "_enabled" ), "Spawn manager flags should not be set by the level script." ); + flag_set( "sm_" + self.sm_id + "_enabled" ); +} +spawn_manager_flag_disabled() +{ + self.enable = false; + flag_clear( "sm_" + self.sm_id + "_enabled" ); +} +spawn_manager_flag_killed() +{ + AssertEx( !flag( "sm_" + self.sm_id + "_killed" ), "Spawn manager flags should not be set by the level script." ); + flag_set("sm_" + self.sm_id + "_killed"); +} +spawn_manager_flag_complete() +{ + AssertEx( self.spawnCount <= self.count, "Spawn manager spawned more then the allowed AI's" ); + AssertEx( !flag( "sm_" + self.sm_id + "_complete" ), "Spawn manager flags should not be set by the level script." ); + flag_set("sm_" + self.sm_id + "_complete"); +} +spawn_manager_flag_cleared() +{ + AssertEx( !flag( "sm_" + self.sm_id + "_cleared" ), "Spawn manager flags should not be set by the level script." ); + flag_set("sm_" + self.sm_id + "_cleared"); +} +calculate_count() +{ + if( !IsDefined( self.sm_count ) ) + { + if (IsDefined(self.count) && (self.count != 0)) + { + self.sm_count = self.count; + } + else + { + self.sm_count = 9999; + } + } + self.count_min = get_min_value( self.sm_count ); + self.count_max = get_max_value( self.sm_count ); + if (IsDefined(self.sm_id)) + { + AssertEx(self.count_max >= self.count_min, "Max range should be greater or equal to the min value for sm_count on spawn manager " + self.sm_id); + } + else + { + AssertEx(self.count_max >= self.count_min, "Max range should be greater or equal to the min value for sm_count on spawner with targetname " + self.targetname); + } + self.count = spawn_manager_random_count( self.count_min, self.count_max + 1 ); +} + + + + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_spawner.gsc b/BO1/PC/ZM/maps/_spawner.gsc new file mode 100644 index 0000000..81cfa28 --- /dev/null +++ b/BO1/PC/ZM/maps/_spawner.gsc @@ -0,0 +1,2414 @@ +#include maps\_utility; +#include maps\_anim; +#include maps\_serverfaceanim; +#include common_scripts\utility; +main() +{ + CreateThreatBiasGroup( "allies" ); + CreateThreatBiasGroup( "axis" ); + if (level.script!="frontend" && !isDefined(level.zombietron_mode) ) + precachemodel("grenade_bag"); + level._nextcoverprint = 0; + level._ai_group = []; + level.killedaxis = 0; + level.ffpoints = 0; + level.missionfailed = false; + level.gather_delay = []; + level.smoke_thrown = []; + level.deathflags = []; + level.spawner_number = 0; + level.go_to_node_arrays = []; + level.next_health_drop_time = 0; + level.guys_to_die_before_next_health_drop = RandomIntRange( 1, 4 ); + level.default_goalradius = 2048; + level.default_goalheight = 80; + level.portable_mg_gun_tag = "J_Shoulder_RI"; + level.mg42_hide_distance = 1024; + if( !IsDefined( level.maxFriendlies ) ) + { + level.maxFriendlies = 11; + } + ai = GetAISpeciesArray("all"); + array_thread( ai, ::living_ai_prethink ); + level.ai_classname_in_level = []; + spawners = GetSpawnerArray(); + for( i = 0; i < spawners.size; i++ ) + { + spawners[i].is_spawner = true; + spawners[i] thread spawn_prethink(); + } + thread process_deathflags(); + array_thread( ai, ::spawn_think ); + precache_player_weapon_drops( array("rpg", "panzerschreck") ); + if( IsDefined( level.hiding_door_spawner ) ) + { + run_thread_on_noteworthy( "hiding_door_spawner", level.hiding_door_spawner ); + } + level thread trigger_spawner_monitor(); +} +precache_player_weapon_drops( weapon_names ) +{ + level.ai_classname_in_level_keys = getarraykeys( level.ai_classname_in_level ); + for ( i = 0 ; i < level.ai_classname_in_level_keys.size ; i++ ) + { + if( weapon_names.size <= 0 ) + { + break; + } + for( j = 0 ; j < weapon_names.size ; j++ ) + { + weaponName = weapon_names[j]; + if ( !issubstr( tolower( level.ai_classname_in_level_keys[ i ] ), weaponName ) ) + { + continue; + } + precacheItem( weaponName + "_player_sp" ); + weapon_names = array_remove( weapon_names, weaponName ); + break; + } + } + level.ai_classname_in_level_keys = undefined; +} +process_deathflags() +{ + keys = getarraykeys( level.deathflags ); + level.deathflags = []; + for ( i=0; i < keys.size; i++ ) + { + deathflag = keys[ i ]; + level.deathflags[ deathflag ] = []; + level.deathflags[ deathflag ][ "spawners" ] = []; + level.deathflags[ deathflag ][ "ai" ] = []; + if ( !IsDefined( level.flag[ deathflag ] ) ) + { + flag_init( deathflag ); + } + } +} +spawn_guys_until_death_or_no_count() +{ + self endon( "death" ); + self waittill( "count_gone" ); +} +deathflag_check_count() +{ + self endon( "death" ); + waittillframeend; + if ( self.count > 0 ) + { + return; + } + self notify( "count_gone" ); +} +ai_deathflag() +{ + level.deathflags[ self.script_deathflag ][ "ai" ][ self.ai_number ] = self; + ai_number = self.ai_number; + deathflag = self.script_deathflag; + if ( IsDefined( self.script_deathflag_longdeath ) ) + { + self waittillDeathOrPainDeath(); + } + else + { + self waittill( "death" ); + } + level.deathflags[ deathflag ][ "ai" ][ ai_number ] = undefined; + update_deathflag( deathflag ); +} +spawner_deathflag() +{ + level.deathflags[ self.script_deathflag ] = true; + waittillframeend; + if ( !IsDefined( self ) || self.count == 0 ) + { + return; + } + self.spawner_number = level.spawner_number; + level.spawner_number++; + level.deathflags[ self.script_deathflag ][ "spawners" ][ self.spawner_number ] = self; + deathflag = self.script_deathflag; + id = self.spawner_number; + spawn_guys_until_death_or_no_count(); + level.deathflags[ deathflag ][ "spawners" ][ id ] = undefined; + update_deathflag( deathflag ); +} +update_deathflag( deathflag ) +{ + level notify( "updating_deathflag_" + deathflag ); + level endon( "updating_deathflag_" + deathflag ); + waittillframeend; + spawnerKeys = getarraykeys( level.deathflags[ deathflag ][ "spawners" ] ); + if ( spawnerKeys.size > 0 ) + { + return; + } + aiKeys = getarraykeys( level.deathflags[ deathflag ][ "ai" ] ); + if ( aiKeys.size > 0 ) + { + return; + } + flag_set( deathflag ); +} +outdoor_think( trigger ) +{ + assert( trigger has_spawnflag(level.SPAWNFLAG_TRIGGER_AI_AXIS) + || trigger has_spawnflag(level.SPAWNFLAG_TRIGGER_AI_ALLIES) + || trigger has_spawnflag(level.SPAWNFLAG_TRIGGER_AI_NEUTRAL), + "trigger_outdoor at " + trigger.origin + " is not set up to trigger AI! Check one of the AI checkboxes on the trigger." ); + trigger endon( "death" ); + for ( ;; ) + { + trigger waittill( "trigger", guy ); + if ( !IsAI( guy ) ) + { + continue; + } + guy thread ignore_triggers( 0.15 ); + guy disable_cqbwalk(); + guy.wantShotgun = false; + } +} +indoor_think( trigger ) +{ + assert( trigger has_spawnflag(level.SPAWNFLAG_TRIGGER_AI_AXIS) + || trigger has_spawnflag(level.SPAWNFLAG_TRIGGER_AI_ALLIES) + || trigger has_spawnflag(level.SPAWNFLAG_TRIGGER_AI_NEUTRAL), + "trigger_indoor at " + trigger.origin + " is not set up to trigger AI! Check one of the AI checkboxes on the trigger." ); + trigger endon( "death" ); + for ( ;; ) + { + trigger waittill( "trigger", guy ); + if ( !IsAI( guy ) ) + { + continue; + } + guy thread ignore_triggers( 0.15 ); + guy enable_cqbwalk(); + guy.wantShotgun = true; + } +} +trigger_spawner_monitor() +{ + println("Trigger spawner monitor running..."); + level._numTriggerSpawned = 0; + while(1) + { + wait_network_frame(); + wait_network_frame(); + level._numTriggerSpawned = 0; + } +} +ok_to_trigger_spawn(forceChoke) +{ + if(IsDefined(forceChoke)) + { + choked = forceChoke; + } + else + { + choked = false; + } + if(IsDefined(self.script_trigger) && NumRemoteClients()) + { + trigger = self.script_trigger; + if(IsDefined(trigger.targetname) && (trigger.targetname == "flood_spawner")) + { + choked = true; + if(IsDefined(trigger.script_choke) && !trigger.script_choke) + { + choked = false; + } + } + else if(trigger has_spawnflag(level.SPAWNFLAG_TRIGGER_SPAWN)) + { + if(IsDefined(trigger.script_choke) && trigger.script_choke) + { + choked = true; + } + } + } + if(IsDefined(self.targetname) && (self.targetname == "drone_axis" || self.targetname == "drone_allies")) + { + choked = true; + } + if( IsDefined(level._forcechoke) && level._numTriggerSpawned > 2 ) + { + return false; + } + if(choked && NumRemoteClients()) + { + if(level._numTriggerSpawned > 2) + { + println("Triggerspawn choke."); + return false; + } + } + return true; +} +trigger_spawner( trigger ) +{ + assertEx( IsDefined( trigger.target ), "Triggers with flag TRIGGER_SPAWN at " + trigger.origin + " must target at least one spawner." ); + trigger endon( "death" ); + trigger waittill( "trigger" ); + spawners = getentarray( trigger.target, "targetname" ); + for(i = 0; i < spawners.size; i++) + { + spawners[i].script_trigger = trigger; + } + array_thread( spawners, ::trigger_spawner_spawns_guys ); +} +trigger_spawner_spawns_guys() +{ + self endon( "death" ); + if ( IsSubStr( self.classname, "actor" ) ) + { + self script_delay(); + while(!self ok_to_trigger_spawn()) + { + wait_network_frame(); + } + if ( IsDefined( self.script_drone ) ) + { + spawned = dronespawn( self ); + level._numTriggerSpawned ++; + assertEx( IsDefined( level.drone_spawn_func ), "You need to put maps\_drone::init(); in your level script!" ); + spawned thread [[ level.drone_spawn_func ]](); + return; + } + self spawn_ai(); + level._numTriggerSpawned ++; + } +} +flood_spawner_scripted( spawners ) +{ + assertex( IsDefined( spawners ) && spawners.size, "Script tried to flood spawn without any spawners" ); + array_thread( spawners, ::flood_spawner_init ); + { + array_thread( spawners, ::flood_spawner_think ); + } +} +reincrement_count_if_deleted( spawner ) +{ + spawner endon( "death" ); + self waittill( "death" ); + if( !IsDefined( self ) ) + { + spawner.count++; + } +} +kill_trigger( trigger ) +{ + if( !IsDefined( trigger ) ) + { + return; + } + if( ( IsDefined( trigger.targetname ) ) &&( trigger.targetname != "flood_spawner" ) ) + { + return; + } + trigger Delete(); +} +kill_spawner_trigger( trigger ) +{ + trigger waittill( "trigger" ); + kill_spawnernum(trigger.script_killspawner); +} +empty_spawner( trigger ) +{ + emptyspawner = trigger.script_emptyspawner; + trigger waittill( "trigger" ); + spawners = GetSpawnerArray(); + for( i = 0; i < spawners.size; i++ ) + { + if( !IsDefined( spawners[i].script_emptyspawner ) ) + { + continue; + } + if( emptyspawner != spawners[i].script_emptyspawner ) + { + continue; + } + if( IsDefined( spawners[i].script_flanker ) ) + { + level notify( "stop_flanker_behavior" + spawners[i].script_flanker ); + } + spawners[i].count = 0; + spawners[i] notify( "emptied spawner" ); + } + trigger notify( "deleted spawners" ); +} +waittillDeathOrPainDeath() +{ + self endon( "death" ); + self waittill( "pain_death" ); +} +drop_gear() +{ + team = self.team; + waittillDeathOrPainDeath(); + if( !IsDefined( self ) ) + { + return; + } + self.ignoreForFixedNodeSafeCheck = true; + if( self.grenadeAmmo <= 0 ) + { + return; + } + if( IsDefined( self.dropweapon ) && !self.dropweapon ) + { + return; + } + level.nextGrenadeDrop--; + if( level.nextGrenadeDrop > 0 ) + { + return; + } + level.nextGrenadeDrop = 2 + RandomInt( 2 ); + max = 25; + min = 12; + spawn_grenade_bag( self.origin +( RandomInt( max )-min, RandomInt( max )-min, 2 ) +( 0, 0, 42 ), ( 0, RandomInt( 360 ), 0 ), self.team ); +} +random_tire( start, end ) +{ + model = spawn( "script_model", (0,0,0) ); + model.angles = ( 0, randomint( 360 ), 0 ); + dif = randomfloat( 1 ); + model.origin = start * dif + end * ( 1 - dif ); + model setmodel( "com_junktire" ); + vel = randomvector( 15000 ); + vel = ( vel[ 0 ], vel[ 1 ], abs( vel[ 2 ] ) ); + model physicslaunch( model.origin, vel ); + wait ( randomintrange ( 8, 12 ) ); + model delete(); +} +spawn_grenade_bag( origin, angles, team ) +{ + if( !IsDefined( level.grenade_cache ) || !IsDefined( level.grenade_cache[team] ) ) + { + level.grenade_cache_index[team] = 0; + level.grenade_cache[team] = []; + } + index = level.grenade_cache_index[team]; + grenade = level.grenade_cache[team][index]; + if( IsDefined( grenade ) ) + { + grenade Delete(); + } + count = self.grenadeammo; + grenade = Spawn( "weapon_" + self.grenadeWeapon, origin ); + level.grenade_cache[team][index] = grenade; + level.grenade_cache_index[team] = ( index + 1 ) % 16; + grenade.angles = angles; + grenade.count = count; + grenade SetModel( "grenade_bag" ); +} +dronespawn_setstruct( spawner ) +{ + if ( dronespawn_check() ) + { + return; + } + guy = spawner stalingradspawn(); + if (isDefined(guy) ) + { + spawner.count++ ; + dronespawn_setstruct_from_guy( guy ); + guy delete(); + } +} +dronespawn_check() +{ + if(IsDefined(level.dronestruct[self.classname])) + { + return true; + } + return false; +} +dronespawn_setstruct_from_guy ( guy ) +{ + if (!isDefined(guy)) + { + return; + } + if(dronespawn_check()) + { + return; + } + struct = spawnstruct(); + size = guy getattachsize(); + struct.attachedmodels = []; + for( i = 0; i < size; i++ ) + { + struct.attachedmodels[i] = guy GetAttachModelName( i ); + struct.attachedtags[i] = guy GetAttachTagName( i ); + } + struct.model = guy.model; + struct.weapon = guy.weapon; + level.dronestruct[guy.classname] = struct; +} +empty() +{ +} +spawn_prethink() +{ + assert( self != level ); + level.ai_classname_in_level[ self.classname ] = true; + prof_begin( "spawn_prethink" ); + if( IsDefined( self.script_drone ) ) + { + self thread dronespawn_setstruct(self); + } + if( IsDefined( self.script_aigroup ) ) + { + aigroup = self.script_aigroup; + aigroup_init( aigroup, self ); + } + if( IsDefined( self.script_delete ) ) + { + array_size = 0; + if( IsDefined( level._ai_delete ) ) + { + if( IsDefined( level._ai_delete[self.script_delete] ) ) + { + array_size = level._ai_delete[self.script_delete].size; + } + } + level._ai_delete[self.script_delete][array_size] = self; + } + deathflag_func = ::empty; + if ( IsDefined( self.script_deathflag ) ) + { + deathflag_func = ::deathflag_check_count; + thread spawner_deathflag(); + } + if ( IsDefined( self.target ) ) + { + crawl_through_targets_to_init_flags(); + } + for( ;; ) + { + prof_begin( "spawn_prethink" ); + self waittill( "spawned", spawn ); + [[ deathflag_func ]](); + if( !IsAlive( spawn ) ) + { + continue; + } + if( IsDefined( self.script_delete ) ) + { + for( i = 0; i < level._ai_delete[self.script_delete].size; i++ ) + { + if( level._ai_delete[self.script_delete][i] != self ) + { + level._ai_delete[self.script_delete][i] Delete(); + } + } + } + spawn.spawn_funcs = self.spawn_funcs; + spawn thread spawn_think( self ); + } +} +spawn_think( spawner ) +{ + assert( self != level ); + level.ai_classname_in_level[ self.classname ] = true; + if (IsDefined(spawner)) + { + spawn_think_action( spawner.targetname ); + } + else + { + spawn_think_action(); + } + assert( IsAlive( self ) ); + self endon( "death" ); + if ( GetDvar( #"zombiemode") != "1" && !IsDefined(self.name) && (self.type != "dog")) + { + self waittill( "set name and rank" ); + } + self.finished_spawning = true; + self notify("finished spawning"); + self thread run_spawn_functions(spawner); + assert( IsDefined( self.team ) ); +} +run_spawn_functions(spawner) +{ + self endon( "death" ); + waittillframeend; + if( IsDefined(spawner) && IsDefined( level.spawnerCallbackThread ) ) + { + spawner thread [[level.spawnerCallbackThread]]( self ); + } + for (i = 0; i < level.spawn_funcs[ self.team ].size; i++) + { + func = level.spawn_funcs[ self.team ][ i ]; + single_thread(self, func[ "function" ], func[ "param1" ], func[ "param2" ], func[ "param3" ], func[ "param4" ] ); + } + self thread maps\_audio::missile_audio_watcher(); + if (!IsDefined( self.spawn_funcs )) + { + return; + } + for (i = 0; i < self.spawn_funcs.size; i++) + { + func = self.spawn_funcs[ i ]; + single_thread(self, func[ "function" ], func[ "param1" ], func[ "param2" ], func[ "param3" ], func[ "param4" ] ); + } + self.spawn_funcs = undefined; + self.spawn_funcs = undefined; +} +living_ai_prethink() +{ + if ( IsDefined( self.script_deathflag ) ) + { + level.deathflags[ self.script_deathflag ] = true; + } + if ( IsDefined( self.target ) ) + { + crawl_through_targets_to_init_flags(); + } +} +crawl_through_targets_to_init_flags() +{ + array = get_node_funcs_based_on_target(); + if ( IsDefined( array ) ) + { + targets = array[ "node" ]; + get_func = array[ "get_target_func" ]; + for ( i = 0; i < targets.size; i++ ) + { + crawl_target_and_init_flags( targets[ i ], get_func ); + } + } +} +spawn_think_action( spawner_targetname ) +{ + if ( GetDvar( #"zombiemode" ) == "0" ) + { + self thread maps\_serverfaceanim::init_serverfaceanim(); + } + if (IsDefined(spawner_targetname) && !IsDefined(self.targetname)) + { + self.targetname = spawner_targetname + "_ai"; + } + self thread maps\_utility::ent_flag_init_ai_standards(); + self thread tanksquish(); + self.spawner_number = undefined; + if( !IsDefined( self.ai_number ) ) + { + set_ai_number(); + } + if ( IsDefined( self.script_dontshootwhilemoving ) ) + { + self.dontshootwhilemoving = true; + } + if ( IsDefined( self.script_deathflag ) ) + { + thread ai_deathflag(); + } + if( IsDefined( self.script_animname ) ) + { + self.animname = self.script_animname; + } + if ( IsDefined( self.script_forceColor ) ) + { + set_force_color( self.script_forceColor ); + if( (!IsDefined( self.script_no_respawn ) || self.script_no_respawn < 1) && !IsDefined(level.no_color_respawners_sm) ) + { + self thread replace_on_death(); + } + } + if ( IsDefined( self.script_fixednode ) ) + { + self.fixednode = ( self.script_fixednode == 1 ); + } + else + { + self.fixednode = self.team == "allies"; + } + set_default_covering_fire(); + if( ( IsDefined( self.script_moveoverride ) ) &&( self.script_moveoverride == 1 ) ) + { + override = true; + } + else + { + override = false; + } + if( IsDefined( self.script_noteworthy ) && self.script_noteworthy == "mgpair" ) + { + thread maps\_mg_penetration::create_mg_team(); + } + if ( GetDvar( #"zombiemode" ) == "0" ) + { + level thread maps\_friendlyfire::friendly_fire_think( self ); + } + if( IsDefined( self.script_threatbiasgroup ) ) + { + self SetThreatBiasGroup( self.script_threatbiasgroup ); + } + else if( self.team == "allies" ) + { + self SetThreatBiasGroup( "allies" ); + } + else + { + self SetThreatBiasGroup( "axis" ); + } + set_default_pathenemy_settings(); + self.heavy_machine_gunner = IsSubStr( self.classname, "mgportable" ); + maps\_gameskill::grenadeAwareness(); + self.walkdist = 16; + if( IsDefined( self.script_ignoreme ) ) + { + assertEx( self.script_ignoreme == true, "Tried to set self.script_ignoreme to false, not allowed. Just set it to undefined." ); + self.ignoreme = true; + } + if ( IsDefined( self.script_ignore_suppression ) ) + { + assertEx( self.script_ignore_suppression == true, "Tried to set self.script_ignore_suppresion to false, not allowed. Just set it to undefined." ); + self.ignoreSuppression = true; + } + if( IsDefined( self.script_hero ) ) + { + AssertEx( self.team == "allies", "Only use script_hero kvp on friendly AI, else use magic_bullet_shield directly." ); + AssertEx( self.script_hero == 1, "Tried to set script_hero to something other than 1" ); + self make_hero(); + } + if ( IsDefined( self.script_ignoreall ) ) + { + assertEx( self.script_ignoreall == true, "Tried to set self.script_ignoreme to false, not allowed. Just set it to undefined." ); + self.ignoreall = true; + self clearenemy(); + } + if( GetDvar( #"zombiemode") != "1" && IsDefined( self.script_disable_bleeder ) ) + { + assertEx( self.script_disable_bleeder == true, "self.script_disable_bleeder can only be set to true. To set to true, leave it undefined." ); + self disable_ai_bleeder(); + } + if( GetDvar( #"zombiemode") != "1" && IsDefined( self.script_disable_reviver ) ) + { + assertEx( self.script_disable_reviver == true, "self.script_disable_reviver can only be set to true. To set to true, leave it undefined." ); + self disable_ai_reviver(); + } + if( IsDefined( self.script_disablereact ) ) + { + self disable_react(); + } + if( IsDefined( self.script_disablepain ) ) + { + self disable_pain(); + } + if( IsDefined( self.script_disableturns ) ) + { + self.disableTurns = true; + } + if( IsDefined( self.script_sightrange ) ) + { + self.maxSightDistSqrd = self.script_sightrange; + } + else if( WeaponClass( self.weapon ) == "gas" ) + { + self.maxSightDistSqrd = 1024 * 1024; + } + if( self.team != "axis" ) + { + if( IsDefined( self.script_followmin ) ) + { + self.followmin = self.script_followmin; + } + if( IsDefined( self.script_followmax ) ) + { + self.followmax = self.script_followmax; + } + } + if ( self.team == "axis" ) + { + if ( self.type == "human" ) + { + self thread drop_gear(); + } + self thread maps\_gameskill::auto_adjust_enemy_death_detection(); + } + if( IsDefined( self.script_fightdist ) ) + { + self.pathenemyfightdist = self.script_fightdist; + } + if( IsDefined( self.script_maxdist ) ) + { + self.pathenemylookahead = self.script_maxdist; + } + if ( IsDefined( self.script_longdeath ) ) + { + assertex( !self.script_longdeath, "Long death is enabled by default so don't set script_longdeath to true, check ai with export " + self.export ); + self.a.disableLongDeath = true; + assertEX( self.team != "allies", "Allies can't do long death, so why disable it on guy with export " + self.export ); + } + if( IsDefined( self.script_grenades ) ) + { + self.grenadeAmmo = self.script_grenades; + } + if( IsDefined( self.script_pacifist ) ) + { + self.pacifist = true; + } + if( IsDefined( self.script_startinghealth ) ) + { + self.health = self.script_startinghealth; + } + if( IsDefined(self.script_allowdeath) ) + { + self.allowdeath = self.script_allowdeath; + } + if( IsDefined(self.script_nodropweapon) ) + { + self.dropweapon = 0; + } + if( IsDefined( self.script_forcegib ) ) + { + self.force_gib = 1; + if( call_overloaded_func( "animscripts\death", "isValidGibRef", self.script_forcegib ) ) + { + self.custom_gib_refs[0] = self.script_forcegib; + } + } + if( IsDefined( self.script_stealth ) ) + { + self thread call_overloaded_func( "maps\_stealth_logic", "stealth_ai" ); + } + if( IsDefined( self.script_patroller ) ) + { + self thread maps\_patrol::patrol(); + return; + } + else if( IsDefined( self.script_contextual_melee ) ) + { + self contextual_melee(self.script_contextual_melee); + } + if( IsDefined( self.script_spiderhole ) ) + { + self thread maps\_spiderhole::spiderhole(); + return; + } + if (is_true(self.script_rusher)) + { + self call_overloaded_func( "maps\_rusher", "rush" ); + return; + } + if( IsDefined( self.script_enable_cqbwalk ) ) + { + self maps\_utility::enable_cqbwalk(); + } + if( IsDefined( self.script_enable_heat ) ) + { + self maps\_utility::enable_heat(); + } + if( IsDefined( self.script_disable_idle_strafe ) && self.script_disable_idle_strafe ) + { + self.disableIdleStrafing = true; + } + if( IsDefined( self.script_playerseek ) ) + { + if( self.script_playerseek == 1 ) + { + self thread player_seek(); + return; + } + else + { + self thread player_seek( self.script_playerseek ); + } + } + if( IsDefined( self.script_banzai ) ) + { + self thread maps\_banzai::spawned_banzai_dynamic(); + } + else if( IsDefined( self.script_banzai_spawn ) ) + { + self thread maps\_banzai::spawned_banzai_immediate(); + } + if( self.heavy_machine_gunner ) + { + thread maps\_mgturret::portable_mg_behavior(); + } + if( IsDefined( self.used_an_mg42 ) ) + { + return; + } + assertEx( (self.goalradius == 8 || self.goalradius == 4), "Changed the goalradius on guy without waiting for spawn_failed. Note that this change will NOT show up by putting a breakpoint on the actors goalradius field because breakpoints don't properly handle the first frame an actor exists." ); + if( override ) + { + self thread set_goalradius_based_on_settings(); + self SetGoalPos( self.origin ); + return; + } + if( IsDefined( self.target ) ) + { + self thread go_to_node(); + } + else + { + self thread set_goalradius_based_on_settings(); + if (IsDefined(self.script_spawner_targets)) + { + self thread go_to_spawner_target(StrTok(self.script_spawner_targets," ")); + } + } + if( IsDefined( self.script_goalvolume ) ) + { + thread set_goal_volume(); + } + if( IsDefined( self.script_turnrate ) ) + { + self.turnrate = self.script_turnrate; + } + self maps\_dds::dds_ai_init(); +} +set_default_covering_fire() +{ + self.provideCoveringFire = self.team == "allies" && self.fixedNode; +} +flag_turret_for_use( ai ) +{ + self endon( "death" ); + if( !self.flagged_for_use ) + { + ai.used_an_mg42 = true; + self.flagged_for_use = true; + ai waittill( "death" ); + self.flagged_for_use = false; + self notify( "get new user" ); + return; + } + println( "Turret was already flagged for use" ); +} +set_goal_volume() +{ + self endon( "death" ); + waittillframeend; + self SetGoalVolume( level.goalVolumes[self.script_goalvolume] ); +} +get_target_ents( target ) +{ + return getentarray( target, "targetname" ); +} +get_target_nodes( target ) +{ + return getnodearray( target, "targetname" ); +} +get_target_structs( target ) +{ + return getstructarray( target, "targetname" ); +} +node_has_radius( node ) +{ + return IsDefined( node.radius ) && node.radius != 0; +} +go_to_origin( node, optional_arrived_at_node_func ) +{ + self go_to_node( node, "origin", optional_arrived_at_node_func ); +} +go_to_struct( node, optional_arrived_at_node_func ) +{ + self go_to_node( node, "struct", optional_arrived_at_node_func ); +} +go_to_node( node, goal_type, optional_arrived_at_node_func ) +{ + self endon("death"); + if ( IsDefined( self.used_an_mg42 ) ) + { + return; + } + array = get_node_funcs_based_on_target( node, goal_type ); + if ( !IsDefined( array ) ) + { + self notify( "reached_path_end" ); + return; + } + if ( !IsDefined( optional_arrived_at_node_func ) ) + { + optional_arrived_at_node_func = ::empty_arrived_func; + } + go_to_node_using_funcs( array[ "node" ], array[ "get_target_func" ], array[ "set_goal_func_quits" ], optional_arrived_at_node_func ); +} +spawner_targets_init() +{ + allnodes = GetAllNodes(); + level.script_spawner_targets_nodes = []; + for( i = 0; i < allnodes.size; i++) + { + if(IsDefined(allnodes[i].script_spawner_targets)) + { + level.script_spawner_targets_nodes[level.script_spawner_targets_nodes.size] = allnodes[i]; + } + } +} +go_to_spawner_target(target_names) +{ + self endon("death"); + self notify("go_to_spawner_target"); + self endon("go_to_spawner_target"); + nodes = []; + occupied_nodes = []; + nodesPresent = false; + for ( i = 0; i < target_names.size; i++) + { + target_nodes = get_spawner_target_nodes(target_names[i]); + if( target_nodes.size > 0 ) + { + nodesPresent = true; + } + for ( i = 0; i < target_nodes.size; i++) + { + if ( IsNodeOccupied(target_nodes[i]) || is_true(target_nodes[i].node_claimed) ) + { + occupied_nodes = array_add(occupied_nodes, target_nodes[i]); + } + else + { + nodes = array_add(nodes, target_nodes[i]); + } + } + } + if( nodes.size == 0 ) + { + while( nodes.size == 0 ) + { + for ( i = 0; i < occupied_nodes.size; i++) + { + if( !IsNodeOccupied(occupied_nodes[i]) && !is_true(occupied_nodes[i].node_claimed)) + { + nodes = array_add(nodes, occupied_nodes[i]); + break; + } + } + wait( 0.1 ); + } + } + AssertEx(nodesPresent, "No spawner target nodes for AI."); + goal = undefined; + if( nodes.size > 0 ) + { + goal = random(nodes); + } + if (IsDefined(goal)) + { + if( IsDefined( self.script_radius ) ) + { + self.goalradius = self.script_radius; + } + else + { + self.goalradius = 400; + } + goal.node_claimed = true; + self SetGoalNode(goal); + self thread release_spawner_target_node(goal); + self waittill("goal"); + } + self set_goalradius_based_on_settings(goal); +} +release_spawner_target_node(node) +{ + self waittill_any("death", "goal_changed"); + node.node_claimed = undefined; +} +get_spawner_target_nodes(group) +{ + if(group == "") + { + return []; + } + nodes = []; + for ( i = 0; i < level.script_spawner_targets_nodes.size; i++) + { + groups = strtok(level.script_spawner_targets_nodes[i].script_spawner_targets," "); + for ( j = 0; j < groups.size; j++) + { + if (groups[j] == group) + { + nodes[nodes.size] = level.script_spawner_targets_nodes[i]; + } + } + } + return nodes; +} +empty_arrived_func( node ) +{ +} +get_least_used_from_array( array ) +{ + assertex( array.size > 0, "Somehow array had zero entrees" ); + if ( array.size == 1 ) + { + return array[ 0 ]; + } + targetname = array[ 0 ].targetname; + if ( !IsDefined( level.go_to_node_arrays[ targetname ] ) ) + { + level.go_to_node_arrays[ targetname ] = array; + } + array = level.go_to_node_arrays[ targetname ]; + first = array[ 0 ]; + newarray = []; + for ( i = 0; i < array.size - 1; i++ ) + { + newarray[ i ] = array[ i + 1 ]; + } + newarray[ array.size - 1 ] = array[ 0 ]; + level.go_to_node_arrays[ targetname ] = newarray; + return first; +} +go_to_node_using_funcs( node, get_target_func, set_goal_func_quits, optional_arrived_at_node_func, require_player_dist ) +{ + self endon( "stop_going_to_node" ); + self endon( "death" ); + for ( ;; ) + { + node = get_least_used_from_array( node ); + player_wait_dist = require_player_dist; + if( isdefined( node.script_requires_player ) ) + { + if( node.script_requires_player > 1 ) + player_wait_dist = node.script_requires_player; + else + player_wait_dist = 256; + node.script_requires_player = false; + } + self set_goalradius_based_on_settings( node ); + if ( IsDefined( node.height ) ) + { + self.goalheight = node.height; + } + else + { + self.goalheight = level.default_goalheight; + } + [[ set_goal_func_quits ]]( node ); + self waittill( "goal" ); + [[ optional_arrived_at_node_func ]]( node ); + if ( IsDefined( node.script_flag_set ) ) + { + flag_set( node.script_flag_set ); + } + if ( IsDefined( node.script_flag_clear ) ) + { + flag_set( node.script_flag_clear ); + } + if ( IsDefined( node.script_ent_flag_set ) ) + { + if( !self flag_exists( node.script_ent_flag_set ) ) + AssertEx( "Tried to set a ent flag "+ node.script_ent_flag_set +" on a node, but it doesnt exist." ); + self ent_flag_set( node.script_ent_flag_set ); + } + if ( IsDefined( node.script_ent_flag_clear ) ) + { + if( !self flag_exists( node.script_ent_flag_clear ) ) + AssertEx( "Tried to clear a ent flag "+ node.script_ent_flag_clear +" on a node, but it doesnt exist." ); + self ent_flag_clear( node.script_ent_flag_clear ); + } + if ( targets_and_uses_turret( node ) ) + { + return true; + } + if( IsDefined( node.script_enable_cqbwalk ) ) + { + self enable_cqbwalk(); + } + if( IsDefined( node.script_disable_cqbwalk ) ) + { + self disable_cqbwalk(); + } + if( IsDefined( node.script_enable_heat ) ) + { + self enable_heat(); + } + if( IsDefined( node.script_disable_heat ) ) + { + self disable_heat(); + } + if( IsDefined( node.script_sprint ) ) + { + if( node.script_sprint ) + { + self.sprint = true; + } + else + { + self.sprint = false; + } + } + if( IsDefined( node.script_walk ) ) + { + if( node.script_walk ) + { + self.walk = true; + } + else + { + self.walk = false; + } + } + if ( IsDefined( node.script_flag_wait ) ) + { + flag_wait( node.script_flag_wait ); + } + while ( isdefined( node.script_requires_player ) ) + { + node.script_requires_player = false; + if ( self go_to_node_wait_for_player( node, get_target_func, player_wait_dist ) ) + { + node.script_requires_player = true; + node notify( "script_requires_player" ); + break; + } + wait 0.1; + } + if( IsDefined( node.script_aigroup ) ) + { + waittill_ai_group_cleared( node.script_aigroup ); + } + node script_delay(); + if ( !IsDefined( node.target ) ) + { + break; + } + nextNode_array = [[ get_target_func ]]( node.target ); + if ( !nextNode_array.size ) + { + break; + } + node = nextNode_array; + } + if( IsDefined( self.arrived_at_end_node_func ) ) + [[ self.arrived_at_end_node_func ]]( node ); + self notify( "reached_path_end" ); + if( IsDefined( self.delete_on_path_end ) ) + self Delete(); + self set_goalradius_based_on_settings( node ); +} +go_to_node_wait_for_player( node, get_target_func, dist ) +{ + players = get_players(); + for( i=0; i< players.size; i++ ) + { + player = players[i]; + if ( distancesquared( player.origin, node.origin ) < distancesquared( self.origin, node.origin ) ) + return true; + } + vec = anglestoforward( self.angles ); + if ( isdefined( node.target ) ) + { + temp = [[ get_target_func ]]( node.target ); + if ( temp.size == 1 ) + vec = vectornormalize( temp[ 0 ].origin - node.origin ); + else if ( isdefined( node.angles ) ) + vec = anglestoforward( node.angles ); + } + else if ( isdefined( node.angles ) ) + vec = anglestoforward( node.angles ); + vec2 = []; + for( i=0; i< players.size; i++ ) + { + player = players[i]; + vec2[ vec2.size ] = vectornormalize( ( player.origin - self.origin ) ); + } + for( i=0; i< vec2.size; i++ ) + { + value = vec2[i]; + if ( vectordot( vec, value ) > 0 ) + return true; + } + dist2rd = dist * dist; + for( i=0; i< players.size; i++ ) + { + player = players[i]; + if ( distancesquared( player.origin, self.origin ) < dist2rd ) + return true; + } + return false; +} +go_to_node_set_goal_pos( ent ) +{ + self set_goal_pos( ent.origin ); +} +go_to_node_set_goal_node( node ) +{ + self set_goal_node( node ); +} +targets_and_uses_turret( node ) +{ + if ( !IsDefined( node.target ) ) + { + return false; + } + turrets = getentarray( node.target, "targetname" ); + if ( !turrets.size ) + { + return false; + } + turret = turrets[ 0 ]; + if ( turret.classname != "misc_turret" ) + { + return false; + } + thread use_a_turret( turret ); + return true; +} +remove_crawled( ent ) +{ + waittillframeend; + if ( IsDefined( ent ) ) + { + ent.crawled = undefined; + } +} +crawl_target_and_init_flags( ent, get_func ) +{ + oldsize = 0; + targets = []; + index = 0; + for ( ;; ) + { + if ( !IsDefined( ent.crawled ) ) + { + ent.crawled = true; + level thread remove_crawled( ent ); + if ( IsDefined( ent.script_flag_set ) ) + { + if ( !IsDefined( level.flag[ ent.script_flag_set ] ) ) + { + flag_init( ent.script_flag_set ); + } + } + if ( IsDefined( ent.script_flag_wait ) ) + { + if ( !IsDefined( level.flag[ ent.script_flag_wait ] ) ) + { + flag_init( ent.script_flag_wait ); + } + } + if ( IsDefined( ent.target ) ) + { + new_targets = [[ get_func ]]( ent.target ); + targets = add_to_array( targets, new_targets ); + } + } + index++ ; + if ( index >= targets.size ) + { + break; + } + ent = targets[ index ]; + } +} +get_node_funcs_based_on_target( node, goal_type ) +{ + get_target_func[ "origin" ] = ::get_target_ents; + get_target_func[ "node" ] = ::get_target_nodes; + get_target_func[ "struct" ] = ::get_target_structs; + set_goal_func_quits[ "origin" ] = ::go_to_node_set_goal_pos; + set_goal_func_quits[ "struct" ] = ::go_to_node_set_goal_pos; + set_goal_func_quits[ "node" ] = ::go_to_node_set_goal_node; + if ( !IsDefined( goal_type ) ) + { + goal_type = "node"; + } + array = []; + if ( IsDefined( node ) ) + { + array[ "node" ][ 0 ] = node; + } + else + { + node = getentarray( self.target, "targetname" ); + if ( node.size > 0 ) + { + goal_type = "origin"; + } + if ( goal_type == "node" ) + { + node = getnodearray( self.target, "targetname" ); + if ( !node.size ) + { + node = getstructarray( self.target, "targetname" ); + if ( !node.size ) + { + return; + } + goal_type = "struct"; + } + } + array[ "node" ] = node; + } + array[ "get_target_func" ] = get_target_func[ goal_type ]; + array[ "set_goal_func_quits" ] = set_goal_func_quits[ goal_type ]; + return array; +} +set_goalradius_based_on_settings( node ) +{ + self endon( "death" ); + waittillframeend; + if( IsDefined( self.script_radius ) ) + { + self.goalradius = self.script_radius; + } + else if( IsDefined( self.script_banzai_spawn ) ) + { + self.goalradius = 64; + } + else if ( IsDefined( node ) && node_has_radius( node ) ) + { + self.goalradius = node.radius; + } + else + { + self.goalradius = level.default_goalradius; + } + if (is_true(self.script_forcegoal)) + { + self thread force_goal(); + } +} +reachPathEnd() +{ + self waittill( "goal" ); + self notify( "reached_path_end" ); +} +autoTarget( targets ) +{ + for( ;; ) + { + user = self GetTurretOwner(); + if( !IsAlive( user ) ) + { + wait( 1.5 ); + continue; + } + if( !IsDefined( user.enemy ) ) + { + self SetTargetEntity( random( targets ) ); + self notify( "startfiring" ); + self StartFiring(); + } + wait( 2 + RandomFloat( 1 ) ); + } +} +manualTarget( targets ) +{ + for( ;; ) + { + self SetTargetEntity( random( targets ) ); + self notify( "startfiring" ); + self StartFiring(); + wait( 2 + RandomFloat( 1 ) ); + } +} +use_a_turret( turret ) +{ + if( self.team == "axis" && self.health == 150 ) + { + self.health = 100; + self.a.disableLongDeath = true; + } + unmanned = false; + self Useturret( turret ); + if( ( IsDefined( turret.target ) ) &&( turret.target != turret.targetname ) ) + { + ents = GetEntArray( turret.target, "targetname" ); + targets = []; + for( i = 0; i < ents.size; i++ ) + { + if( ents[i].classname == "script_origin" ) + { + targets[targets.size] = ents[i]; + } + } + if( targets.size > 0 ) + { + turret.manual_targets = targets; + turret SetMode( "auto_nonai" ); + turret thread maps\_mgturret::burst_fire_unmanned(); + unmanned = true; + } + } + if( !unmanned ) + { + self thread maps\_mgturret::mg42_firing( turret ); + } + turret notify( "startfiring" ); +} +fallback_spawner_think( num, node_array, ignoreWhileFallingBack ) +{ + self endon( "death" ); + level.max_fallbackers[num]+= self.count; + firstspawn = true; + while( self.count > 0 ) + { + self waittill( "spawned", spawn ); + if( firstspawn ) + { + if( GetDvar( #"fallback" ) == "1" ) + { + println( "^a First spawned: ", num ); + } + level notify( ( "fallback_firstspawn" + num ) ); + firstspawn = false; + } + maps\_spawner::waitframe(); + if( spawn_failed( spawn ) ) + { + level notify( ( "fallbacker_died" + num ) ); + level.max_fallbackers[num]--; + continue; + } + spawn thread fallback_ai_think( num, node_array, "is spawner", ignoreWhileFallingBack ); + } +} +fallback_ai_think_death( ai, num ) +{ + ai waittill( "death" ); + level.current_fallbackers[num]--; + level notify( ( "fallbacker_died" + num ) ); +} +fallback_ai_think( num, node_array, spawner, ignoreWhileFallingBack ) +{ + if( ( !IsDefined( self.fallback ) ) ||( !IsDefined( self.fallback[num] ) ) ) + { + self.fallback[num] = true; + } + else + { + return; + } + self.script_fallback = num; + if( !IsDefined( spawner ) ) + { + level.current_fallbackers[num]++; + } + if( ( IsDefined( node_array ) ) &&( level.fallback_initiated[num] ) ) + { + self thread fallback_ai( num, node_array, ignoreWhileFallingBack ); + } + level thread fallback_ai_think_death( self, num ); +} +fallback_death( ai, num ) +{ + ai waittill( "death" ); + if (IsDefined(ai.fallback_node)) + { + ai.fallback_node.fallback_occupied = false; + } + level notify( ( "fallback_reached_goal" + num ) ); +} +fallback_goal( ignoreWhileFallingBack ) +{ + self waittill( "goal" ); + self.ignoresuppression = false; + if( IsDefined( ignoreWhileFallingBack ) && ignoreWhileFallingBack ) + { + self.ignoreall = false; + } + self notify( "fallback_notify" ); + self notify( "stop_coverprint" ); +} +fallback_interrupt() +{ + self notify( "stop_fallback_interrupt" ); + self endon( "stop_fallback_interrupt" ); + self endon( "stop_going_to_node" ); + self endon ("goto next fallback"); + self endon ("fallback_notify"); + self endon( "death" ); + while(1) + { + origin = self.origin; + wait 2; + if ( self.origin == origin ) + { + self.ignoreall = false; + return; + } + } +} +fallback_ai( num, node_array, ignoreWhileFallingBack ) +{ + self notify( "stop_going_to_node" ); + self endon( "stop_going_to_node" ); + self endon ("goto next fallback"); + self endon( "death" ); + node = undefined; + while( 1 ) + { + ASSERTEX((node_array.size >= level.current_fallbackers[num]), "Number of fallbackers exceeds number of fallback nodes for fallback # " + num + ". Add more fallback nodes or reduce possible fallbackers."); + node = node_array[RandomInt( node_array.size )]; + if (!IsDefined(node.fallback_occupied) || !node.fallback_occupied) + { + node.fallback_occupied = true; + self.fallback_node = node; + break; + } + wait( 0.1 ); + } + self StopUseTurret(); + self.ignoresuppression = true; + if( self.ignoreall == false && IsDefined( ignoreWhileFallingBack ) && ignoreWhileFallingBack ) + { + self.ignoreall = true; + self thread fallback_interrupt(); + } + self SetGoalNode( node ); + if( node.radius != 0 ) + { + self.goalradius = node.radius; + } + self endon( "death" ); + level thread fallback_death( self, num ); + self thread fallback_goal( ignoreWhileFallingBack ); + if( GetDvar( #"fallback" ) == "1" ) + { + self thread coverprint( node.origin ); + } + self waittill( "fallback_notify" ); + level notify( ( "fallback_reached_goal" + num ) ); +} +coverprint( org ) +{ + self endon( "fallback_notify" ); + self endon( "stop_coverprint" ); + self endon ("death"); + while( 1 ) + { + line( self.origin +( 0, 0, 35 ), org, ( 0.2, 0.5, 0.8 ), 0.5 ); + print3d( ( self.origin +( 0, 0, 70 ) ), "Falling Back", ( 0.98, 0.4, 0.26 ), 0.85 ); + maps\_spawner::waitframe(); + } +} +fallback_overmind( num, group, ignoreWhileFallingBack, percent ) +{ + fallback_nodes = undefined; + nodes = GetAllNodes(); + for( i = 0; i < nodes.size; i++ ) + { + if( ( IsDefined( nodes[i].script_fallback ) ) &&( nodes[i].script_fallback == num ) ) + { + fallback_nodes = add_to_array( fallback_nodes, nodes[i] ); + } + } + if( IsDefined( fallback_nodes ) ) + { + level thread fallback_overmind_internal( num, group, fallback_nodes, ignoreWhileFallingBack, percent ); + } +} +fallback_overmind_internal( num, group, fallback_nodes, ignoreWhileFallingBack, percent ) +{ + level.current_fallbackers[num] = 0; + level.max_fallbackers[num] = 0; + level.spawner_fallbackers[num] = 0; + level.fallback_initiated[num] = false; + spawners = GetSpawnerArray(); + for( i = 0; i < spawners.size; i++ ) + { + if( ( IsDefined( spawners[i].script_fallback ) ) &&( spawners[i].script_fallback == num ) ) + { + if( spawners[i].count > 0 ) + { + spawners[i] thread fallback_spawner_think( num, fallback_nodes, ignoreWhileFallingBack ); + level.spawner_fallbackers[num]++; + } + } + } + assertex ( level.spawner_fallbackers[num] <= fallback_nodes.size, "There are more fallback spawners than fallback nodes. Add more node or remove spawners from script_fallback: "+ num ); + ai = GetAiArray(); + for( i = 0; i < ai.size; i++ ) + { + if( ( IsDefined( ai[i].script_fallback ) ) &&( ai[i].script_fallback == num ) ) + { + ai[i] thread fallback_ai_think( num, undefined, undefined, ignoreWhileFallingBack ); + } + } + if( ( !level.current_fallbackers[num] ) &&( !level.spawner_fallbackers[num] ) ) + { + return; + } + spawners = undefined; + ai = undefined; + thread fallback_wait( num, group, ignoreWhileFallingBack, percent ); + level waittill( ( "fallbacker_trigger" + num ) ); + fallback_add_previous_group(num, fallback_nodes); + if( GetDvar( #"fallback" ) == "1" ) + { + println( "^a fallback trigger hit: ", num ); + } + level.fallback_initiated[num] = true; + fallback_ai = undefined; + ai = GetAiArray(); + for( i = 0; i < ai.size; i++ ) + { + if( ( ( IsDefined( ai[i].script_fallback ) ) &&( ai[i].script_fallback == num ) ) || ( ( IsDefined( ai[i].script_fallback_group ) ) &&( IsDefined( group ) ) &&( ai[i].script_fallback_group == group ) ) ) + { + fallback_ai = add_to_array( fallback_ai, ai[i] ); + } + } + ai = undefined; + if( !IsDefined( fallback_ai ) ) + { + return; + } + if( !IsDefined( percent ) ) + { + percent = 0.4; + } + first_half = fallback_ai.size * percent; + first_half = Int( first_half ); + level notify( "fallback initiated " + num ); + fallback_text( fallback_ai, 0, first_half ); + first_half_ai = []; + for( i = 0; i < first_half; i++ ) + { + fallback_ai[i] thread fallback_ai( num, fallback_nodes, ignoreWhileFallingBack ); + first_half_ai[i] = fallback_ai[i]; + } + for( i = 0; i < first_half; i++ ) + { + level waittill( ( "fallback_reached_goal" + num ) ); + } + fallback_text( fallback_ai, first_half, fallback_ai.size ); + for( i = 0; i < fallback_ai.size; i++ ) + { + if( IsAlive( fallback_ai[i] ) ) + { + set_fallback = true; + for (p = 0; p < first_half_ai.size; p++) + { + if ( isalive(first_half_ai[p])) + { + if (fallback_ai[i] == first_half_ai[p]) + { + set_fallback = false; + } + } + } + if (set_fallback) + { + fallback_ai[i] thread fallback_ai( num, fallback_nodes, ignoreWhileFallingBack ); + } + } + } +} +fallback_text( fallbackers, start, end ) +{ + if( GetTime() <= level._nextcoverprint ) + { + return; + } + for( i = start; i < end; i++ ) + { + if( !IsAlive( fallbackers[i] ) ) + { + continue; + } + level._nextcoverprint = GetTime() + 2500 + RandomInt( 2000 ); + return; + } +} +fallback_wait( num, group, ignoreWhileFallingBack, percent ) +{ + level endon( ( "fallbacker_trigger" + num ) ); + if( GetDvar( #"fallback" ) == "1" ) + { + println( "^a Fallback wait: ", num ); + } + for( i = 0; i < level.spawner_fallbackers[num]; i++ ) + { + if( GetDvar( #"fallback" ) == "1" ) + { + println( "^a Waiting for spawners to be hit: ", num, " i: ", i ); + } + level waittill( ( "fallback_firstspawn" + num ) ); + } + if( GetDvar( #"fallback" ) == "1" ) + { + println( "^a Waiting for AI to die, fall backers for group ", num, " is ", level.current_fallbackers[num] ); + } + ai = GetAiArray(); + for( i = 0; i < ai.size; i++ ) + { + if( ( ( IsDefined( ai[i].script_fallback ) ) &&( ai[i].script_fallback == num ) ) || ( ( IsDefined( ai[i].script_fallback_group ) ) &&( IsDefined( group ) ) &&( ai[i].script_fallback_group == group ) ) ) + { + ai[i] thread fallback_ai_think( num, undefined, undefined, ignoreWhileFallingBack ); + } + } + ai = undefined; + deadfallbackers = 0; + while( deadfallbackers < level.max_fallbackers[num] * percent ) + { + if( GetDvar( #"fallback" ) == "1" ) + { + println( "^cwaiting for " + deadfallbackers + " to be more than " +( level.max_fallbackers[num] * 0.5 ) ); + } + level waittill( ( "fallbacker_died" + num ) ); + deadfallbackers++; + } + println( deadfallbackers , " fallbackers have died, time to retreat" ); + level notify( ( "fallbacker_trigger" + num ) ); +} +fallback_think( trigger ) +{ + ignoreWhileFallingBack = false; + if( IsDefined( trigger.script_ignoreall ) && trigger.script_ignoreall ) + { + ignoreWhileFallingBack = true; + } + if( ( !IsDefined( level.fallback ) ) ||( !IsDefined( level.fallback[trigger.script_fallback] ) ) ) + { + percent = 0.5; + if( IsDefined( trigger.script_percent ) ) + { + percent = trigger.script_percent / 100; + } + level thread fallback_overmind( trigger.script_fallback, trigger.script_fallback_group, ignoreWhileFallingBack, percent ); + } + trigger waittill( "trigger" ); + level notify( ( "fallbacker_trigger" + trigger.script_fallback ) ); + kill_trigger( trigger ); +} +fallback_add_previous_group(num, node_array) +{ + if (!IsDefined (level.current_fallbackers[num - 1])) + { + return; + } + for (i = 0; i < level.current_fallbackers[num - 1]; i++) + { + level.max_fallbackers[num]++; + } + for (i = 0; i < level.current_fallbackers[num - 1]; i++) + { + level.current_fallbackers[num]++; + } + ai = GetAiArray(); + for( i = 0; i < ai.size; i++ ) + { + if( ( ( IsDefined( ai[i].script_fallback ) ) && ( ai[i].script_fallback == (num - 1) ) ) ) + { + ai[i].script_fallback++; + if (IsDefined (ai[i].fallback_node)) + { + ai[i].fallback_node.fallback_occupied = false; + ai[i].fallback_node = undefined; + } + } + } +} +delete_me() +{ + maps\_spawner::waitframe(); + self Delete(); +} +waitframe() +{ + wait( 0.05 ); +} +friendly_mg42_death_notify( guy, mg42 ) +{ + mg42 endon( "friendly_finished_using_mg42" ); + guy waittill( "death" ); + mg42 notify( "friendly_finished_using_mg42" ); + println( "^a guy using gun died" ); +} +friendly_mg42_wait_for_use( mg42 ) +{ + mg42 endon( "friendly_finished_using_mg42" ); + self.useable = true; + self setcursorhint("HINT_NOICON"); + self setHintString(&"PLATFORM_USEAIONMG42"); + self waittill( "trigger" ); + println( "^a was used by player, stop using turret" ); + self.useable = false; + self SetHintString( "" ); + self StopUSeturret(); + self notify( "stopped_use_turret" ); + mg42 notify( "friendly_finished_using_mg42" ); +} +friendly_mg42_useable( mg42, node ) +{ + if( self.useable ) + { + return false; + } + if( ( IsDefined( self.turret_use_time ) ) &&( GetTime() < self.turret_use_time ) ) + { + return false; + } + players = get_players(); + for( q = 0; q < players.size; q++ ) + { + if( Distancesquared( players[q].origin, node.origin ) < 100 * 100 ) + { + return false; + } + } + if( IsDefined( self.chainnode ) ) + { + player_count = 0; + for( q = 0; q < players.size; q++ ) + { + if( Distancesquared( players[q].origin, self.chainnode.origin ) > 1100 * 1100 ) + { + player_count++; + } + } + if( player_count == players.size ) + { + return false; + } + } + return true; +} +friendly_mg42_endtrigger( mg42, guy ) +{ + mg42 endon( "friendly_finished_using_mg42" ); + self waittill( "trigger" ); + println( "^a Told friendly to leave the MG42 now" ); + mg42 notify( "friendly_finished_using_mg42" ); +} +noFour() +{ + self endon( "death" ); + self waittill( "goal" ); + self.goalradius = self.oldradius; + if( self.goalradius < 32 ) + { + self.goalradius = 400; + } +} +friendly_mg42_think( mg42, node ) +{ + self endon( "death" ); + mg42 endon( "friendly_finished_using_mg42" ); + level thread friendly_mg42_death_notify( self, mg42 ); + self.oldradius = self.goalradius; + self.goalradius = 28; + self thread noFour(); + self SetGoalNode( node ); + self.ignoresuppression = true; + self waittill( "goal" ); + self.goalradius = self.oldradius; + if( self.goalradius < 32 ) + { + self.goalradius = 400; + } + self.ignoresuppression = false; + self.goalradius = self.oldradius; + players = get_players(); + for( q = 0; q < players.size; q++ ) + { + if( Distancesquared( players[q].origin, node.origin ) < 32 * 32 ) + { + mg42 notify( "friendly_finished_using_mg42" ); + return; + } + } + self.friendly_mg42 = mg42; + self thread friendly_mg42_wait_for_use( mg42 ); + self thread friendly_mg42_cleanup( mg42 ); + self USeturret( mg42 ); + if( IsDefined( mg42.target ) ) + { + stoptrigger = GetEnt( mg42.target, "targetname" ); + if( IsDefined( stoptrigger ) ) + { + stoptrigger thread friendly_mg42_endtrigger( mg42, self ); + } + } + while( 1 ) + { + if( Distance( self.origin, node.origin ) < 32 ) + { + self USeturret( mg42 ); + } + else + { + break; + } + if( IsDefined( self.chainnode ) ) + { + if( Distance( self.origin, self.chainnode.origin ) > 1100 ) + { + break; + } + } + wait( 1 ); + } + mg42 notify( "friendly_finished_using_mg42" ); +} +friendly_mg42_cleanup( mg42 ) +{ + self endon( "death" ); + mg42 waittill( "friendly_finished_using_mg42" ); + self friendly_mg42_doneUsingTurret(); +} +friendly_mg42_doneUsingTurret() +{ + self endon( "death" ); + turret = self.friendly_mg42; + self.friendly_mg42 = undefined; + self StopUSeturret(); + self notify( "stopped_use_turret" ); + self.useable = false; + self.goalradius = self.oldradius; + if( !IsDefined( turret ) ) + { + return; + } + if( !IsDefined( turret.target ) ) + { + return; + } + node = GetNode( turret.target, "targetname" ); + oldradius = self.goalradius; + self.goalradius = 8; + self SetGoalNode( node ); + wait( 2 ); + self.goalradius = 384; + return; + self waittill( "goal" ); + if( IsDefined( self.target ) ) + { + node = GetNode( self.target, "targetname" ); + if( IsDefined( node.target ) ) + { + node = GetNode( node.target, "targetname" ); + } + if( IsDefined( node ) ) + { + self SetGoalNode( node ); + } + } + self.goalradius = oldradius; +} +tanksquish() +{ + if ( IsDefined( level.noTankSquish ) ) + { + assertex( level.noTankSquish, "level.noTankSquish must be true or undefined" ); + return; + } + if ( IsDefined( level.levelHasVehicles ) && !level.levelHasVehicles ) + { + return; + } + while ( 1 ) + { + self waittill( "damage", amt, who, force, b, mod, d, e ); + if ( !isDefined(mod) ) + { + continue; + } + if ( mod != "MOD_CRUSH" ) + { + continue; + } + if ( !IsDefined( self ) ) + { + return; + } + if ( isalive( self ) ) + { + continue; + } + if ( !isalive( who ) ) + { + return; + } + force = vector_scale( force, 50000 ); + force = ( force[ 0 ], force[ 1 ], abs( force[ 2 ] ) ); + if(IsDefined( level._effect ) && IsDefined( level._effect["tanksquish"] ) ) + { + PlayFX( level._effect["tanksquish"], self.origin + (0, 0, 30)); + } + self startRagdoll(); + self playsound( "chr_crunch" ); + return; + } +} +spawnWaypointFriendlies() +{ + self.count = 1; + spawn = self spawn_ai(); + if ( spawn_failed( spawn ) ) + { + return; + } + spawn.friendlyWaypoint = true; +} +goalVolumes() +{ + volumes = GetEntArray( "info_volume", "classname" ); + level.deathchain_goalVolume = []; + level.goalVolumes = []; + for( i = 0; i < volumes.size; i++ ) + { + volume = volumes[i]; + if( IsDefined( volume.script_deathChain ) ) + { + level.deathchain_goalVolume[volume.script_deathChain] = volume; + } + if( IsDefined( volume.script_goalvolume ) ) + { + level.goalVolumes[volume.script_goalVolume] = volume; + } + } +} +aigroup_init( aigroup, spawner ) +{ + if( !IsDefined( level._ai_group[aigroup] ) ) + { + level._ai_group[aigroup] = SpawnStruct(); + level._ai_group[aigroup].aigroup = aigroup; + level._ai_group[aigroup].aicount = 0; + level._ai_group[aigroup].spawnercount = 0; + level._ai_group[aigroup].killed_count = 0; + level._ai_group[aigroup].ai = []; + level._ai_group[aigroup].spawners = []; + level._ai_group[aigroup].cleared_count = 0; + if (!IsDefined(level.flag[aigroup + "_cleared"])) + { + flag_init(aigroup + "_cleared"); + } + level thread set_ai_group_cleared_flag(level._ai_group[aigroup]); + } + if (IsDefined(spawner)) + { + spawner thread aigroup_spawnerthink( level._ai_group[aigroup] ); + } +} +aigroup_spawnerthink( tracker ) +{ + self endon( "death" ); + self.decremented = false; + tracker.spawnercount++; + self thread aigroup_spawnerdeath( tracker ); + self thread aigroup_spawnerempty( tracker ); + while( self.count ) + { + self waittill( "spawned", soldier ); + if( spawn_failed( soldier ) ) + { + continue; + } + soldier.aigroup = tracker.aigroup; + soldier thread aigroup_soldierthink( tracker ); + } + waittillframeend; + if( self.decremented ) + { + return; + } + self.decremented = true; + tracker.spawnercount--; +} +aigroup_spawnerdeath( tracker ) +{ + self waittill( "death" ); + if( self.decremented ) + { + return; + } + tracker.spawnercount--; +} +aigroup_spawnerempty( tracker ) +{ + self endon( "death" ); + self waittill( "emptied spawner" ); + waittillframeend; + if( self.decremented ) + { + return; + } + self.decremented = true; + tracker.spawnercount--; +} +aigroup_soldierthink( tracker ) +{ + tracker.aicount++; + tracker.ai[tracker.ai.size] = self; + if ( IsDefined( self.script_deathflag_longdeath ) ) + { + self waittillDeathOrPainDeath(); + } + else + { + self waittill( "death" ); + } + tracker.aicount--; + tracker.killed_count++; +} +set_ai_group_cleared_flag(tracker) +{ + waittillframeend; + while (true) + { + if ((tracker.aicount + tracker.spawnercount) <= tracker.cleared_count) + { + flag_set(tracker.aigroup + "_cleared"); + break; + } + wait .05; + } +} +flood_trigger_think( trigger ) +{ + assertEX( IsDefined( trigger.target ), "flood_spawner at " + trigger.origin + " without target" ); + floodSpawners = GetEntArray( trigger.target, "targetname" ); + assertex( floodSpawners.size, "flood_spawner at with target " + trigger.target + " without any targets" ); + for(i = 0; i < floodSpawners.size; i++) + { + floodSpawners[i].script_trigger = trigger; + } + array_thread( floodSpawners, ::flood_spawner_init ); + trigger waittill( "trigger" ); + floodSpawners = GetEntArray( trigger.target, "targetname" ); + { + array_thread( floodSpawners, ::flood_spawner_think, trigger ); + } +} +flood_spawner_init( spawner ) +{ + assertex(self has_spawnflag(level.SPAWNFLAG_ACTOR_SPAWNER), "Spawner at origin" + self.origin + "/" +( self GetOrigin() ) + " is not a spawner!"); +} +trigger_requires_player( trigger ) +{ + if( !IsDefined( trigger ) ) + { + return false; + } + return IsDefined( trigger.script_requires_player ); +} +flood_spawner_think( trigger ) +{ + self endon( "death" ); + self notify( "stop current floodspawner" ); + self endon( "stop current floodspawner" ); + requires_player = trigger_requires_player( trigger ); + script_delay(); + while( self.count > 0 ) + { + if( requires_player ) + { + while( !any_player_IsTouching( trigger ) ) + { + wait( 0.5 ); + } + } + while(!(self ok_to_trigger_spawn())) + { + wait_network_frame(); + } + soldier = self spawn_ai(); + if( spawn_failed( soldier ) ) + { + wait( 2 ); + continue; + } + level._numTriggerSpawned ++; + soldier thread reincrement_count_if_deleted( self ); + soldier waittill( "death", attacker ); + if ( !player_saw_kill( soldier, attacker ) ) + { + self.count++; + } + if( !IsDefined( soldier ) ) + { + continue; + } + if( !script_wait( true ) ) + { + players = get_players(); + if (players.size == 1) + { + wait( RandomFloatrange( 5, 9 ) ); + } + else if (players.size == 2) + { + wait( RandomFloatrange( 3, 6 ) ); + } + else if (players.size == 3) + { + wait( RandomFloatrange( 1, 4 ) ); + } + else if (players.size == 4) + { + wait( RandomFloatrange( 0.5, 1.5 ) ); + } + } + } +} +player_saw_kill( guy, attacker ) +{ + if ( IsDefined( self.script_force_count ) ) + { + if ( self.script_force_count ) + { + return true; + } + } + if ( !IsDefined( guy ) ) + { + return false; + } + if ( IsAlive( attacker ) ) + { + if ( IsPlayer( attacker ) ) + { + return true; + } + players = get_players(); + for( q = 0; q < players.size; q++ ) + { + if ( DistanceSquared( attacker.origin, players[q].origin ) < 200 * 200 ) + { + return true; + } + } + } + else + { + if ( IsDefined( attacker ) ) + { + if ( attacker.classname == "worldspawn" ) + { + return false; + } + player = get_closest_player( attacker.origin ); + if ( IsDefined( player ) && distance( attacker.origin, player.origin ) < 200 ) + { + return true; + } + } + } + closest_player = get_closest_player( guy.origin ); + if ( IsDefined( closest_player ) && distance( guy.origin, closest_player.origin ) < 200 ) + { + return true; + } + return bulletTracePassed( closest_player geteye(), guy geteye(), false, undefined ); +} +show_bad_path() +{ +} +objective_event_init( trigger ) +{ + flag = trigger get_trigger_flag(); + assertex( IsDefined( flag ), "Objective event at origin " + trigger.origin + " does not have a script_flag. " ); + flag_init( flag ); + assertex( IsDefined( level.deathSpawner[trigger.script_deathChain] ), "The objective event trigger for deathchain " + trigger.script_deathchain + " is not associated with any AI." ); + while( level.deathSpawner[trigger.script_deathChain] > 0 ) + { + level waittill( "spawner_expired" + trigger.script_deathChain ); + } + flag_set( flag ); +} +#using_animtree( "generic_human" ); +spawner_dronespawn( spawner ) +{ + assert( IsDefined( level.dronestruct[ spawner.classname ] ) ); + struct = level.dronestruct[ spawner.classname ]; + drone = spawn( "script_model", spawner.origin ); + drone.angles = spawner.angles; + drone setmodel( struct.model ); + drone UseAnimTree( #animtree ); + drone makefakeai(); + attachedmodels = struct.attachedmodels; + attachedtags = struct.attachedtags; + for ( i = 0;i < attachedmodels.size;i++ ) + { + drone attach( attachedmodels[ i ], attachedtags[ i ], true ); + } + if ( IsDefined( struct.weapon ) ) + { + drone.weapon = struct.weapon; + self call_overloaded_func( "animscripts\init", "initWeapon", drone.weapon ); + drone useweaponhidetags( drone.weapon ); + } + if ( IsDefined( spawner.script_startingposition ) ) + { + drone.script_startingposition = spawner.script_startingposition; + } + if ( IsDefined( spawner.script_noteworthy ) ) + { + drone.script_noteworthy = spawner.script_noteworthy; + } + if ( IsDefined( spawner.script_deleteai ) ) + { + drone.script_deleteai = spawner.script_deleteai; + } + if ( IsDefined( spawner.script_linkto ) ) + { + drone.script_linkto = spawner.script_linkto; + } + if ( IsDefined( spawner.script_moveoverride ) ) + { + drone.script_moveoverride = spawner.script_moveoverride; + } + if ( issubstr( spawner.classname, "ally" ) ) + { + drone.team = "allies"; + } + else if ( issubstr( spawner.classname, "enemy" ) ) + { + drone.team = "axis"; + } + else + { + drone.team = "neutral"; + } + if ( IsDefined( spawner.target ) ) + { + drone.target = spawner.target; + } + drone.spawner = spawner; + assert( IsDefined( drone ) ); + if ( IsDefined( spawner.script_noteworthy ) && spawner.script_noteworthy == "drone_delete_on_unload" ) + { + drone.drone_delete_on_unload = true; + } + else + { + drone.drone_delete_on_unload = false; + } + spawner notify( "drone_spawned", drone ); + return drone; +} +spawner_make_real_ai( drone ) +{ + if(!IsDefined(drone.spawner)) + { + println("----failed dronespawned guy info----"); + println("drone.classname: "+drone.classname); + println("drone.origin : "+drone.origin); + assertmsg("makerealai called on drone does with no .spawner"); + } + orgorg = drone.spawner.origin; + organg = drone.spawner.angles; + drone.spawner.origin = drone.origin; + drone.spawner.angles = drone.angles; + guy = drone.spawner stalingradspawn(); + failed = spawn_failed(guy); + if(failed) + { + println("----failed dronespawned guy info----"); + println("failed guys spawn position : "+drone.origin); + println("failed guys spawner export key: "+drone.spawner.export); + println("getaiarray size is: "+getaiarray().size); + println("------------------------------------"); + assertMSG("failed to make real ai out of drone (see console for more info)"); + } + drone.spawner.origin = orgorg; + drone.spawner.angles = organg; + drone Delete(); + return guy; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_specialops.gsc b/BO1/PC/ZM/maps/_specialops.gsc new file mode 100644 index 0000000..008eea3 Binary files /dev/null and b/BO1/PC/ZM/maps/_specialops.gsc differ diff --git a/BO1/PC/ZM/maps/_spiderhole.gsc b/BO1/PC/ZM/maps/_spiderhole.gsc new file mode 100644 index 0000000..58eeaa1 --- /dev/null +++ b/BO1/PC/ZM/maps/_spiderhole.gsc @@ -0,0 +1,301 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_anim; +spiderhole() +{ + self endon( "death" ); + self waittill( "finished spawning" ); + wait_network_frame(); + self.ignoreme = true; + self.pacifist = true; + self.old_animname = self.animname; + self.animname = "spiderhole"; + spider_lid = undefined; + target_node = undefined; + ASSERTex( IsDefined( self.target ), " Spiderhole Spawner @ " + self.origin + " does NOT target anything!" ); + ents = getentarray( self.target, "targetname" ); + anim_org = GetStruct( self.target, "targetname" ); + for( i = 0; i < ents.size; i++ ) + { + if( isDefined( ents[i].script_noteworthy ) && ents[i].script_noteworthy == "spiderhole_lid" ) + { + spider_lid = ents[i]; + } + } + ASSERTex( IsDefined( anim_org ), " SpiderHole Spawner @ " + self.origin + " does NOT target a script_struct!" ); + anim_org thread anim_loop_aligned( self, "spiderhole_idle_crouch", undefined, "open_lid" ); + if( IsDefined( spider_lid ) && IsDefined( spider_lid.radius ) ) + { + emerge_trig = spawn( "trigger_radius", self.origin, 0, spider_lid.radius, spider_lid.radius ); + emerge_trig waittill( "trigger" ); + emerge_trig delete(); + } + if( isDefined( self.script_delay_min ) && isDefined( self.script_delay_max ) ) + { + wait( RandomFloatRange( self.script_delay_min, self.script_delay_max ) ); + } + while( 1 ) + { + closest_player = get_closest_player( self.origin ); + if( distancesquared( closest_player.origin, self.origin ) > 96 * 96 ) + { + break; + } + wait( 0.05 ); + } + nodes = getnodearray( self.target, "targetname" ); + if( nodes.size > 0 ) + { + target_node = nodes[RandomInt( nodes.size )]; + } + if( isdefined( spider_lid ) ) + { + if( isDefined( spider_lid.script_fxid ) ) + { + playfx( level._effect[spider_lid.script_fxid], spider_lid.origin ); + } + } + chance = 0; + if( isDefined( self.script_spiderhole_charge ) ) + { + chance = self.script_spiderhole_charge; + } + self notify( "open_lid" ); + anim_org notify("open_lid"); + level notify("open_lid"); + spider_lid notify("emerge"); + spider_lid notSolid(); + radius = 1024; + if( IsDefined( spider_lid ) && IsDefined( spider_lid.script_radius ) ) + { + radius = spider_lid.script_radius; + } + self.pacifist = false; + closest_player = get_closest_player( self.origin ); + if( chance >= RandomInt( 100 )) + { + self thread spiderhole_charge( anim_org, spider_lid, closest_player ); + } + else + { + self thread spiderhole_run_to_node( anim_org, spider_lid, target_node ); + } +} +spiderhole_charge( anim_org, spider_lid, closest_player ) +{ + self endon( "death" ); + self spiderhole_anim( anim_org, spider_lid, closest_player ); + self.goalradius = 64; + self.ignoreall = false; + self.pacifist = false; + self.banzai_no_wait = true; + self maps\_banzai::banzai_force(); +} +spiderhole_charge_internal() +{ + players = get_players(); + squad = getaiarray( "allies" ); + squad = array_remove(squad,level.sarge); + squad = array_remove(squad,level.polonsky); + combined = array_combine( players, squad ); + guy = get_closest_living( self.origin, combined, 1024); + if(!isDefined(guy)) + { + guy = players[randomint(players.size)]; + } + self thread set_goal_to_guy( guy ); + self playsound( "jpn_charge" ); + self thread spiderhole_charge_think(); +} +set_goal_to_guy(guy) +{ + self endon("death"); + while(issentient(guy)) + { + self setgoalpos(guy.origin); + wait(.1); + } + self thread spiderhole_charge_internal(); +} +spiderhole_charge_think() +{ + self endon( "death" ); + self waittill("stop_spiderhole"); + self.goalradius = 2048; + self set_default_pathenemy_settings(); + if( isDefined( self.old_run_combatanim ) ) + { + self.run_combatanim = self.old_run_combatanim; + } +} +spiderhole_run_to_node( anim_org, spider_lid, target_node ) +{ + self endon( "death" ); + if( isDefined( target_node ) ) + { + closest_player = get_closest_player( self.origin ); + self spiderhole_anim( anim_org, spider_lid ,closest_player); + assertex( self.goalheight == 80, "Tried to set goalheight on guy with export " + self.export + " before running spawn_failed on the guy." ); + if( IsDefined( target_node.height ) ) + { + self.goalheight = target_node.height; + } + else + { + self.goalheight = level.default_goalheight; + } + if( target_node.radius != 0 ) + { + self.goalradius = target_node.radius; + } + else + { + self.goalradius = 32; + } + self SetGoalNode( target_node ); + } + else + { + self.allowdeath = true; + self spiderhole_anim_internal( self.script_spiderhole_anim, self, spider_lid ); + } +} +spiderhole_reset_death( delay ) +{ + self endon( "death" ); + wait( delay ); + self.nodeathragdoll = false; + self.deathanim = undefined; + self.nodeathragdoll = undefined; +} +#using_animtree("generic_human"); +spiderhole_anim( anim_org, lid, closest_object ) +{ + if( isDefined( self.script_spiderhole_anim ) ) + { + self.allowdeath = true; + self.deathanim =%exposed_crouch_death_fetal; + self.nodeathragdoll = true; + self.ignoreme = false; + self spiderhole_anim_internal( self.script_spiderhole_anim, anim_org, lid, closest_object ); + self spiderhole_duck( self.script_spiderhole_anim, anim_org, lid, closest_object ); + return; + } + self spiderhole_getout_anim( anim_org, lid, closest_object ); + self.nodeathragdoll = false; + self.deathanim = undefined; + self.nodeathragdoll = undefined; +} +spiderhole_getout_anim( anim_org, lid, closest_object ) +{ + num = RandomInt( 100 ); + if( num > 80 ) + { + getout_anim = "stumble_out"; + } + else + { + getout_anim = "jump_out"; + } + self spiderhole_anim_internal( getout_anim, anim_org, lid, closest_object ); + lid thread spiderhole_drop_lid_to_ground(); + self thread spiderhole_reset_death( 1 ); +} +spiderhole_anim_internal( anim_ref, anim_org, lid, closest_object ) +{ + if( IsDefined( closest_object ) ) + { + angles = VectorToAngles( closest_object.origin - self.origin ); + anim_org.angles = ( 0, angles[1], 0 ); + } + if( IsDefined( lid ) ) + { + tag_origin = Spawn( "script_model", lid.origin ); + tag_origin SetModel( "tag_origin_animate" ); + tag_origin.angles = anim_org.angles; + lid LinkTo( tag_origin, "origin_animate_jnt"); + lid.tag_lid = tag_origin; + lid.tag_lid.anim_ref = anim_ref; + tag_origin assign_animtree( "spiderhole_lid" ); + tag_origin SetAnimKnob( level.scr_anim["spiderhole_lid"][anim_ref], 1, 0.2, 1 ); + } + addNotetrack_customFunction( self.animname, "fire", ::spiderhole_gun_spray, anim_ref ); + addNotetrack_customFunction( self.animname, "grenade_toss", ::spiderhole_grenade_toss, anim_ref ); + anim_org anim_single_aligned( self, anim_ref ); + self notify("out_of_spiderhole"); + if(isDefined(lid)) + { + lid notify("out_of_spiderhole"); + } +} +spiderhole_drop_lid_to_ground() +{ + if(!isDefined(level.no_spider_lid_drop)) + { + wait(1.5); + self Unlink(); + groundPos = PhysicsTrace( self.origin + (0,0,64), self.origin - (0,0,256) ); + self MoveTo( groundPos + (0,0,6), 0.5 ); + } +} +spiderhole_duck( anim_ref, anim_org, lid, closest_object ) +{ + self endon( "death" ); + if( anim_ref == "grenade_toss" || anim_ref == "gun_spray" ) + { + anim_org thread anim_loop_aligned( self, "spiderhole_idle_crouch", undefined, "emerge" ); + if( isDefined( self.script_delay_min ) && isDefined( self.script_delay_max ) ) + { + wait( RandomFloatRange( self.script_delay_min, self.script_delay_max ) ); + } + else + { + wait( .1); + } + while( 1 ) + { + closest_player = get_closest_player( self.origin ); + if( DistanceSquared( closest_player.origin, self.origin ) > 96 * 96 ) + { + break; + } + wait( 0.05 ); + } + self notify( "emerge" ); + self spiderhole_getout_anim( anim_org, lid, closest_object ); + } +} +spiderhole_grenade_toss( guy ) +{ + tag = guy GetTagOrigin( "tag_weapon_left" ); + target = get_closest_player( guy.origin ); + guy MagicGrenade( tag, target.origin, 3 ); +} +spiderhole_gun_spray( guy ) +{ + guy Shoot( guy.accuracy ); +} +line_to_tag( tag_name ) +{ + self endon( "death" ); + player = get_players()[0]; + while( 1 ) + { + line( player.origin, self GetTagorigin( tag_name ) ); + wait( 0.05 ); + } +} +do_print3d( msg, time, offset ) +{ +} +draw_tag_angles( tagname ) +{ +} +monitor_spiderhole_death(lid) +{ + self endon("out_of_spiderhole"); + self waittill("death"); + lid solid(); + lid notify("guy_dead"); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_splash_screens.gsc b/BO1/PC/ZM/maps/_splash_screens.gsc new file mode 100644 index 0000000..00957c6 --- /dev/null +++ b/BO1/PC/ZM/maps/_splash_screens.gsc @@ -0,0 +1,207 @@ + +#include maps\_utility; +main() +{ + wait(0.05); + production_build = false; + if( !production_build || level.script == "creek_1" || level.script == "crossroads" || level.script == "flashpoint" || level.script == "fullahead" || level.script == "quagmire" || level.script == "collateral_damage" ) + { + return; + } + freeze_players(); + create_screen_generic(); + create_splash_hudelems(); + switch(level.script) + { + case "creek_1": + set_text_creek_1(); + break; + case "crossroads": + set_text_crossroads(); + break; + case "flashpoint": + set_text_flashpoint(); + break; + case "fullahead": + set_text_fullahead(); + break; + case "quagmire": + set_text_quagmire(); + break; + case "inc_squad_urban": + set_text_inc_squad_urban(); + break; + default: + break; + } + wait_for_x_press(); + destroy_all(); + unfreeze_players(); +} +freeze_players() +{ + players = get_players(); + for(i = 0; i < players.size; i++) + { + players[i] freezecontrols(true); + } +} +unfreeze_players() +{ + players = get_players(); + for(i = 0; i < players.size; i++) + { + players[i] freezecontrols(false); + } +} +wait_for_x_press() +{ + wait(5); + breakme = false; + while(!breakme) + { + players = get_players(); + for(i = 0; i < players.size; i++) + { + if(players[i] UseButtonPressed()) + { + breakme = true; + } + } + wait(0.05); + } +} +create_screen_generic() +{ + level.screen_generic = NewHudElem(); + level.screen_generic.x = 0; + level.screen_generic.y = 0; + level.screen_generic.horzAlign = "fullscreen"; + level.screen_generic.vertAlign = "fullscreen"; + level.screen_generic SetShader( "black", 640, 480 ); + level.screen_generic.alpha = 1; + level.screen_generic.sort = 1; +} +create_hudelem( x, y, alignX, alignY, horzAlign, vertAlign, foreground, alpha, fontscale) +{ + new_elem = NewHudElem(); + new_elem.x = x; + new_elem.y = y; + new_elem.alignX = alignX; + new_elem.alignY = alignY; + new_elem.horzAlign = horzAlign; + new_elem.vertAlign = vertAlign; + new_elem.foreground = foreground; + new_elem.alpha = alpha; + new_elem.fontscale = fontscale; + return new_elem; +} +create_splash_hudelems() +{ + level.press_x_hud = create_hudelem(0, 360, "center", "top", "center", "top", true, 1, 2); + level.press_x_hud setText( "Press X to Start" ); + level.instructions_elem = create_hudelem(0, 100, "center", "top", "center", "top", true, 1, 2.7); + level.instructions_elem2 = create_hudelem(0, 130, "center", "top", "center", "top", true, 1, 1.5); + level.instructions_elem3 = create_hudelem(0, 150, "center", "top", "center", "top", true, 1, 1.5); + level.instructions_elem4 = create_hudelem(0, 170, "center", "top", "center", "top", true, 1, 1.5); + level.instructions_elem5 = create_hudelem(0, 200, "center", "top", "center", "top", true, 1, 1.5); + level.instructions_elem6 = create_hudelem(0, 220, "center", "top", "center", "top", true, 1, 1.5); + level.instructions_elem7 = create_hudelem(0, 240, "center", "top", "center", "top", true, 1, 1.5); + level.instructions_elem8 = create_hudelem(0, 280, "center", "top", "center", "top", true, 1, 1.5); + level.instructions_elem9 = create_hudelem(0, 300, "center", "top", "center", "top", true, 1, 1.5); + level.instructions_elem10 = create_hudelem(0, 320, "center", "top", "center", "top", true, 1, 1.5); +} +destroy_all() +{ + level.screen_generic fadeOvertime( 3 ); + level.screen_generic.alpha = 0; + level.instructions_elem destroy(); + level.instructions_elem2 destroy(); + level.instructions_elem3 destroy(); + level.instructions_elem4 destroy(); + level.instructions_elem5 destroy(); + level.instructions_elem6 destroy(); + level.instructions_elem7 destroy(); + level.instructions_elem8 destroy(); + level.instructions_elem9 destroy(); + level.instructions_elem10 destroy(); + level.press_x_hud destroy(); +} +set_text_creek_1() +{ + level.instructions_elem setText( "UP A CREEK" ); + level.instructions_elem2 setText( "Scripting: 1st pass for beats 1, 2, 3, 5 and 6" ); + level.instructions_elem3 setText( "Building: 1st pass rough out from beat 1 to beat 6" ); + level.instructions_elem4 setText( "Key Event: Beat 4 - Boat Combat" ); + level.instructions_elem5 setText( "Mission Synopsis: The NVA might be getting Nukes from Kusnetsov. "); + level.instructions_elem6 setText( "The squad proceeds up the river in search of Kusnetsov"); + level.instructions_elem7 setText( "Along the way the squad must survive ambushes and deserted villages..."); + level.instructions_elem8 setText( "Playable Feature: Hero Characters"); + level.instructions_elem9 setText( "Playable Feature: Drivable Boat/platform and Exploration"); + level.instructions_elem10 setText( "Playable Feature: Create A Class"); +} +set_text_crossroads() +{ + level.instructions_elem setText( "CROSSROADS" ); + level.instructions_elem2 setText( "Scripting: 1st pass for beats 1, 2, 3, 5 and 6" ); + level.instructions_elem3 setText( "Building: 1st pass rough out from beat 1 to beat 5" ); + level.instructions_elem4 setText( "Key Event: Beat 4 - Rooftops" ); + level.instructions_elem5 setText( "Mission Synopsis: At a low key meeting in a Cairo bar, Reznov and the squad wait for the contact to arrive. "); + level.instructions_elem6 setText( "The squad is ambushed and barely make it out of the bar."); + level.instructions_elem7 setText( "The team must now fight over the roof tops of the city and escape with the informants intel..."); + level.instructions_elem8 setText( "Playable Feature: Hero Characters"); + level.instructions_elem9 setText( "Playable Feature: Core movement = Door Breaching"); + level.instructions_elem10 setText( "Playable Feature: Platform Bus Rail and Sonic Tracking"); +} +set_text_flashpoint() +{ + level.instructions_elem setText( "FLASHPOINT" ); + level.instructions_elem2 setText( "Scripting: 1st pass for beats 1 to 7" ); + level.instructions_elem3 setText( "Building: 1st pass rough out from beat 1 to beat 7" ); + level.instructions_elem4 setText( "Key Event: Beat 6 and 7 - Hanger, Rocket Takeoff" ); + level.instructions_elem5 setText( "Mision Snyopsis: We need to extract a VIP - or so we think - "); + level.instructions_elem6 setText( "The team must get through the rocket facility avoiding many test areas."); + level.instructions_elem7 setText( "Once the rockets coordinates are sabotaged the team must get out alive..."); + level.instructions_elem8 setText( "Playable Feature: Hero Characters"); + level.instructions_elem9 setText( ""); + level.instructions_elem10 setText( "Playable Feature: Zip Line, Beat 5"); +} +set_text_fullahead() +{ + level.instructions_elem setText( "FULLAHEAD" ); + level.instructions_elem2 setText( "Scripting: 1st pass from beat 2 to beat 8" ); + level.instructions_elem3 setText( "Building: 1st pass rough out from beat 1 to beat 8" ); + level.instructions_elem4 setText( "Mission Synopsis: The squad is trying to find the mysterious ghostship."); + level.instructions_elem5 setText( "Once discovered, they learn its a floating super virus lab for the Dead Nazis."); + level.instructions_elem6 setText( "However the men of Kusnetzov are also looking for the same boat..."); + level.instructions_elem7 setText( "Playable Feature: Hero Characters"); + level.instructions_elem8 setText( "Playable Feature: Core movement = SLIDING after Beat 2"); + level.instructions_elem9 setText( "Do you want to see Beat 1 geo?: Use - jump to Start - exterior"); + level.instructions_elem10 setText( ""); +} +set_text_quagmire() +{ + level.instructions_elem setText( "QUAGMIRE" ); + level.instructions_elem2 setText( "Scripting: 1st pass from beat 1 to beat 8" ); + level.instructions_elem3 setText( "Building: 1st pass rough out from beat 1 to beat 8" ); + level.instructions_elem4 setText( "Key Event: Beat 6 to 8 - Down to One, Street Fighter, High Low" ); + level.instructions_elem5 setText( "Mission Synopsis: At the height of the TET offensive, the squad gets new orders. "); + level.instructions_elem6 setText( "They must fight their way over and through Hue City to secure an American embassy."); + level.instructions_elem7 setText( "Then they find an injured CIA agent and have to get out of dodge..."); + level.instructions_elem8 setText( "Playable Feature: Hero Characters"); + level.instructions_elem9 setText( "Playable Feature: Core movement = Door Breaching"); + level.instructions_elem10 setText( "Playable Feature: Helicopter platform"); +} +set_text_inc_squad_urban() +{ + level.instructions_elem setText( "INCUBATOR: SQUAD CONTROL" ); + level.instructions_elem2 setText( "Sprint: Week 3" ); + level.instructions_elem3 setText( "" ); + level.instructions_elem4 setText( "Player Controls:" ); + level.instructions_elem5 setText( "Press LB to designate an area for the squad to move to, User will see YELLOW ringed marker to designate marker placement." ); + level.instructions_elem6 setText( "BLUE ringed markers are for AI node selection, these will remain on screen until AI is near" ); + level.instructions_elem7 setText( "GREY ringed markers signify areas that are too far for voice orders to be heard, RED signifies an attack or action order" ); + level.instructions_elem8 setText( "" ); + level.instructions_elem9 setText( "1st pass tank destruction event implemented, 1st pass dumpster/MG event implemented " ); + level.instructions_elem10 setText( "AI revive functioning, MACV Office from Quagmire ported over to warhouse interior (1st pass AI node placement also present)" ); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_sticky_grenade.gsc b/BO1/PC/ZM/maps/_sticky_grenade.gsc new file mode 100644 index 0000000..a52b5d4 Binary files /dev/null and b/BO1/PC/ZM/maps/_sticky_grenade.gsc differ diff --git a/BO1/PC/ZM/maps/_swimming.gsc b/BO1/PC/ZM/maps/_swimming.gsc new file mode 100644 index 0000000..3f3a5f8 Binary files /dev/null and b/BO1/PC/ZM/maps/_swimming.gsc differ diff --git a/BO1/PC/ZM/maps/_t72.gsc b/BO1/PC/ZM/maps/_t72.gsc new file mode 100644 index 0000000..e4fa437 Binary files /dev/null and b/BO1/PC/ZM/maps/_t72.gsc differ diff --git a/BO1/PC/ZM/maps/_tank_zsu23.gsc b/BO1/PC/ZM/maps/_tank_zsu23.gsc new file mode 100644 index 0000000..504cb3f Binary files /dev/null and b/BO1/PC/ZM/maps/_tank_zsu23.gsc differ diff --git a/BO1/PC/ZM/maps/_tiara.gsc b/BO1/PC/ZM/maps/_tiara.gsc new file mode 100644 index 0000000..4924184 Binary files /dev/null and b/BO1/PC/ZM/maps/_tiara.gsc differ diff --git a/BO1/PC/ZM/maps/_treadfx.gsc b/BO1/PC/ZM/maps/_treadfx.gsc new file mode 100644 index 0000000..a2d824e Binary files /dev/null and b/BO1/PC/ZM/maps/_treadfx.gsc differ diff --git a/BO1/PC/ZM/maps/_truck.gsc b/BO1/PC/ZM/maps/_truck.gsc new file mode 100644 index 0000000..5166212 Binary files /dev/null and b/BO1/PC/ZM/maps/_truck.gsc differ diff --git a/BO1/PC/ZM/maps/_truck_gaz63.gsc b/BO1/PC/ZM/maps/_truck_gaz63.gsc new file mode 100644 index 0000000..80d7bdd --- /dev/null +++ b/BO1/PC/ZM/maps/_truck_gaz63.gsc @@ -0,0 +1,407 @@ + +#include maps\_vehicle; +#include maps\_utility; +#include common_scripts\utility; +main( model, type ) +{ + if(self.vehicletype == "truck_gaz63_player_single50_physics") + { + build_aianims( ::set_50cal_gunner_anims , ::set_50cal_vehicle_anims ); + } + else if( self.vehicletype == "truck_gaz63_player_single50" || self.vehicletype == "truck_gaz63_player_single50_nodeath" ) + { + build_aianims( ::set_gunner_anims , ::set_gunner_vehicle_anims ); + } + else if(self.vehicletype == "truck_gaz63_player_single50_bulletdamage" ) + { + build_aianims( ::set_gunner_anims , ::set_gunner_vehicle_anims ); + } + else + { + build_aianims( ::setanims , ::set_vehicle_anims ); + } + build_unload_groups( ::unload_groups ); + if(IsSubStr(self.vehicletype, "_low")) + { + self thread attach_truck_bed_low(); + } + else + { + self thread attach_truck_bed(); + } + self thread turret_sound_init(); +} +turret_sound_init() +{ + self.sound_org = spawn ("script_origin", self.origin); + self.sound_org linkto( self); + switch(self.vehicletype) + { + case "truck_gaz63_quad50": + self.sound_org.soundalias = "wpn_gaz_quad50_turret_loop_npc"; + break; + case "truck_gaz63_single50": + case "truck_gaz63_player_single50_physics": + case "truck_gaz63_player_single50_bulletdamage": + self.sound_org.soundalias = "wpn_gaz_single50_turret_loop_npc"; + break; + default: + self.sound_org.soundalias = "wpn_gaz_quad50_turret_loop_npc"; + break; + } + self.sound_org.flux = "wpn_gaz_quad50_flux_npc_l"; + self waittill( "death" ); + self.sound_org delete(); +} +attach_truck_bed() +{ + bed_base = "t5_veh_gaz66_flatbed"; + bed_dead = "t5_veh_gaz66_flatbed_dead"; + switch(self.vehicletype) + { + case "truck_gaz63_canvas": + self Attach(bed_base, "tag_origin_animate_jnt"); + self Attach( "t5_veh_gaz66_canvas", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_canvas_camorack": + self Attach("t5_veh_gaz66_troops", "tag_origin_animate_jnt"); + self Attach( "t5_veh_gaz66_canvas", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_flatbed": + case "truck_gaz63_flatbed_camorack": + self Attach(bed_base, "tag_origin_animate_jnt"); + break; + case "truck_gaz63_tanker": + self Attach( "t5_veh_gaz66_tanker", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_troops": + case "truck_gaz63_troops_camorack": + case "truck_gaz63_troops_bulletdamage": + self Attach( "t5_veh_gaz66_troops", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_camorack": + self Attach( "t5_veh_truck_gaz63_camo_rack", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_quad50": + self Attach( "t5_veh_gaz66_quad50" ); + break; + case "truck_gaz63_single50": + self Attach( "t5_veh_gaz66_single50" ); + break; + case "truck_gaz63_player_single50": + case "truck_gaz63_player_single50_bulletdamage": + case "truck_gaz63_player_single50_nodeath": + self Attach(bed_base, "tag_origin_animate_jnt"); + self Attach ("t5_veh_gunner_turret_enemy_50cal", "tag_gunner_attach"); + break; + case "truck_gaz63_player_single50_physics": + self Attach(bed_base, "tag_origin_animate_jnt"); + self Attach ("t5_veh_gunner_turret_enemy_50cal", "tag_gunner_attach"); + break; + default: + break; + } + self waittill("death"); + if(!IsDefined(self) || !IsDefined(self.vehicletype)) + { + return; + } + switch(self.vehicletype) + { + case "truck_gaz63_canvas_camorack": + self Detach( "t5_veh_gaz66_troops", "tag_origin_animate_jnt" ); + self Detach( "t5_veh_gaz66_canvas", "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_troops_dead", "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_canvas_dead", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_canvas": + self Detach( bed_base, "tag_origin_animate_jnt" ); + self Detach( "t5_veh_gaz66_canvas", "tag_origin_animate_jnt" ); + self Attach( bed_dead, "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_canvas_dead", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_flatbed": + case "truck_gaz63_flatbed_camorack": + self Detach( bed_base, "tag_origin_animate_jnt" ); + self Attach( bed_dead, "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_tanker": + self Detach( "t5_veh_gaz66_tanker", "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_tanker_dead", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_troops": + case "truck_gaz63_troops_bulletdamage": + case "truck_gaz63_troops_camorack": + self Detach( "t5_veh_gaz66_troops", "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_troops_dead", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_camorack": + break; + case "truck_gaz63_quad50": + self Detach("t5_veh_gaz66_quad50"); + self Attach("t5_veh_gaz66_quad50_dead"); + break; + case "truck_gaz63_single50": + self Detach("t5_veh_gaz66_single50"); + self Attach("t5_veh_gaz66_single50_dead"); + break; + case "truck_gaz63_player_single50": + case "truck_gaz63_player_single50_physics": + case "truck_gaz63_player_single50_bulletdamage": + self Detach( bed_base, "tag_origin_animate_jnt" ); + self Detach ("t5_veh_gunner_turret_enemy_50cal", "tag_gunner_attach"); + self Attach( bed_dead, "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_player_single50_nodeath": + break; + default: + break; + } +} +attach_truck_bed_low() +{ + bed_base = "t5_veh_gaz66_flatbed_low"; + bed_dead = "t5_veh_gaz66_flatbed_dead_low"; + switch(self.vehicletype) + { + case "truck_gaz63_canvas_low": + self Attach(bed_base, "tag_origin_animate_jnt"); + self Attach( "t5_veh_gaz66_canvas_low", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_flatbed_low": + self Attach(bed_base, "tag_origin_animate_jnt"); + break; + case "truck_gaz63_tanker_low": + self Attach( "t5_veh_gaz66_tanker_low", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_troops_low": + self Attach( "t5_veh_gaz66_troops_low", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_camorack_low": + self Attach( "t5_veh_truck_gaz63_camo_rack_low", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_quad50_low": + case "truck_gaz63_quad50_low_no_deathmodel": + self Attach( "t5_veh_gaz66_quad50_low" ); + break; + case "truck_gaz63_single50_low": + self Attach( "t5_veh_gaz66_single50_low" ); + break; + default: + break; + } + self waittill("death"); + if(!IsDefined(self) || !IsDefined(self.vehicletype)) + { + return; + } + switch(self.vehicletype) + { + case "truck_gaz63_canvas_low": + self Detach( bed_base, "tag_origin_animate_jnt" ); + self Detach( "t5_veh_gaz66_canvas_low", "tag_origin_animate_jnt" ); + self Attach( bed_dead, "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_canvas_dead_low", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_flatbed_low": + self Detach( bed_base, "tag_origin_animate_jnt" ); + self Attach( bed_dead, "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_tanker_low": + self Detach( "t5_veh_gaz66_tanker_low", "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_tanker_dead_low", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_troops_low": + self Detach( "t5_veh_gaz66_troops_low", "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_troops_dead_low", "tag_origin_animate_jnt" ); + break; + case "truck_gaz63_camorack_low": + break; + case "truck_gaz63_quad50_low": + self Detach("t5_veh_gaz66_quad50_low"); + self Attach("t5_veh_gaz66_quad50_dead_low"); + break; + case "truck_gaz63_single50_low": + self Detach("t5_veh_gaz66_single50_low"); + self Attach("t5_veh_gaz66_single50_dead_low"); + break; + default: + break; + } +} +#using_animtree( "vehicles" ); +set_vehicle_anims( positions ) +{ + positions[ 0 ].sittag = "tag_driver"; + positions[ 1 ].sittag = "tag_passenger"; + positions[ 2 ].sittag = "tag_guy1"; + positions[ 3 ].sittag = "tag_guy6"; + positions[ 4 ].sittag = "tag_guy3"; + positions[ 5 ].sittag = "tag_guy8"; + positions[ 6 ].sittag = "tag_guy5"; + positions[ 7 ].sittag = "tag_guy2"; + positions[ 8 ].sittag = "tag_guy7"; + positions[ 9 ].sittag = "tag_guy4"; + positions[ 0 ].vehicle_getoutanim_clear = false; + positions[ 1 ].vehicle_getoutanim_clear = false; + positions[ 0 ].vehicle_getinanim = %v_gaz63_driver_door_open; + positions[ 1 ].vehicle_getinanim = %v_gaz63_passenger_door_open; + positions[ 0 ].vehicle_getoutanim = %v_gaz63_driver_door_open; + positions[ 1 ].vehicle_getoutanim = %v_gaz63_passenger_door_open; + return positions; +} +#using_animtree( "generic_human" ); +set_gunner_vehicle_anims(positions) +{ + return positions; +} +set_gunner_anims() +{ + positions = []; + num_positions = 3; + for( i =0 ;i < num_positions; i++ ) + { + positions[ i ] = spawnstruct(); + } + positions[0].sittag = "tag_driver"; + positions[1].sittag = "tag_passenger"; + positions[2].sittag = "tag_gunner1"; + positions[2].vehiclegunner = 1; + positions[2].idle = %ai_50cal_gunner_aim; + positions[2].aimup = %ai_50cal_gunner_aim_up; + positions[2].aimdown = %ai_50cal_gunner_aim_down; + return positions; +} +#using_animtree( "vehicles" ); +set_50cal_vehicle_anims( positions ) +{ + positions[ 0 ].sittag = "tag_driver"; + positions[ 1 ].sittag = "tag_passenger"; + positions[ 2 ].sittag = "tag_gunner1"; + positions[ 0 ].vehicle_getoutanim_clear = false; + positions[ 1 ].vehicle_getoutanim_clear = false; + positions[ 0 ].vehicle_getinanim = %v_gaz63_driver_door_open; + positions[ 1 ].vehicle_getinanim = %v_gaz63_passenger_door_open; + positions[ 0 ].vehicle_getoutanim = %v_gaz63_driver_door_open; + positions[ 1 ].vehicle_getoutanim = %v_gaz63_passenger_door_open; + return positions; +} +#using_animtree( "generic_human" ); +set_50cal_gunner_anims() +{ + positions = []; + num_positions = 3; + for( i =0 ;i < num_positions; i++ ) + { + positions[ i ] = spawnstruct(); + } + positions[0].sittag = "tag_driver"; + positions[1].sittag = "tag_passenger"; + positions[2].sittag = "tag_gunner1"; + positions[2].vehiclegunner = 1; + positions[2].idle = %ai_50cal_gunner_aim; + positions[2].aimup = %ai_50cal_gunner_aim_up; + positions[2].aimdown = %ai_50cal_gunner_aim_down; + positions[ 0 ].getout = %crew_truck_driver_climbout; + positions[ 1 ].getout = %crew_truck_passenger_climbout; + positions[ 2 ].getout = %crew_truck_guy1_climbout; + positions[ 0 ].getout_combat = %crew_gaz63_driver_jump_out; + positions[ 1 ].getout_combat = %crew_gaz63_passenger_climbout_fast; + positions[ 2 ].getout_combat = %crew_truck_guy1_climbout_fast; + positions[ 0 ].idle = %crew_truck_driver_sit_idle; + positions[ 1 ].idle = %crew_gaz63_passenger_sit_idle; + return positions; +} +setanims() +{ + positions = []; + num_positions = 10; + for( i =0 ;i < num_positions; i++ ) + { + positions[ i ] = spawnstruct(); + } + positions[ 0 ].sittag = "tag_driver"; + positions[ 1 ].sittag = "tag_passenger"; + positions[ 2 ].sittag = "tag_guy1"; + positions[ 3 ].sittag = "tag_guy6"; + positions[ 4 ].sittag = "tag_guy3"; + positions[ 5 ].sittag = "tag_guy8"; + positions[ 6 ].sittag = "tag_guy5"; + positions[ 7 ].sittag = "tag_guy2"; + positions[ 8 ].sittag = "tag_guy7"; + positions[ 9 ].sittag = "tag_guy4"; + positions[ 0 ].getout = %crew_truck_driver_climbout; + positions[ 1 ].getout = %crew_truck_passenger_climbout; + positions[ 2 ].getout = %crew_truck_guy1_climbout; + positions[ 3 ].getout = %crew_truck_guy6_climbout; + positions[ 4 ].getout = %crew_truck_guy3_climbout; + positions[ 5 ].getout = %crew_truck_guy8_climbout; + positions[ 6 ].getout = %crew_truck_guy5_climbout; + positions[ 7 ].getout = %crew_truck_guy2_climbout; + positions[ 8 ].getout = %crew_truck_guy7_climbout; + positions[ 9 ].getout = %crew_truck_guy4_climbout; + positions[ 0 ].getout_combat = %crew_gaz63_driver_jump_out; + positions[ 1 ].getout_combat = %crew_gaz63_passenger_climbout_fast; + positions[ 2 ].getout_combat = %crew_truck_guy1_climbout_fast; + positions[ 3 ].getout_combat = %crew_truck_guy6_climbout_fast; + positions[ 4 ].getout_combat = %crew_truck_guy3_climbout; + positions[ 5 ].getout_combat = %crew_truck_guy8_climbout; + positions[ 6 ].getout_combat = %crew_truck_guy5_climbout_fast; + positions[ 7 ].getout_combat = %crew_truck_guy2_climbout_fast; + positions[ 8 ].getout_combat = %crew_truck_guy7_climbout; + positions[ 9 ].getout_combat = %crew_truck_guy4_climbout; + positions[ 0 ].idle = %crew_truck_driver_sit_idle; + positions[ 1 ].idle = %crew_gaz63_passenger_sit_idle; + positions[ 2 ].idle = %crew_truck_guy1_sit_idle; + positions[ 3 ].idle = %crew_truck_guy6_sit_idle; + positions[ 4 ].idle = %crew_truck_guy3_sit_idle; + positions[ 5 ].idle = %crew_truck_guy8_sit_idle; + positions[ 6 ].idle = %crew_truck_guy5_sit_idle; + positions[ 7 ].idle = %crew_truck_guy2_sit_idle; + positions[ 8 ].idle = %crew_truck_guy7_sit_idle; + positions[ 9 ].idle = %crew_truck_guy4_sit_idle; + return positions; +} +unload_groups() +{ + unload_groups = []; + unload_groups[ "all" ] = []; + unload_groups[ "passengers" ] = []; + unload_groups[ "rear_passengers" ] = []; + unload_groups[ "driver" ] = []; + group = "all"; + unload_groups[ group ][ unload_groups[ group ].size ] = 0; + unload_groups[ group ][ unload_groups[ group ].size ] = 1; + unload_groups[ group ][ unload_groups[ group ].size ] = 2; + unload_groups[ group ][ unload_groups[ group ].size ] = 3; + unload_groups[ group ][ unload_groups[ group ].size ] = 4; + unload_groups[ group ][ unload_groups[ group ].size ] = 5; + unload_groups[ group ][ unload_groups[ group ].size ] = 6; + unload_groups[ group ][ unload_groups[ group ].size ] = 7; + unload_groups[ group ][ unload_groups[ group ].size ] = 8; + unload_groups[ group ][ unload_groups[ group ].size ] = 9; + group = "passengers"; + unload_groups[ group ][ unload_groups[ group ].size ] = 1; + unload_groups[ group ][ unload_groups[ group ].size ] = 2; + unload_groups[ group ][ unload_groups[ group ].size ] = 3; + unload_groups[ group ][ unload_groups[ group ].size ] = 4; + unload_groups[ group ][ unload_groups[ group ].size ] = 5; + unload_groups[ group ][ unload_groups[ group ].size ] = 6; + unload_groups[ group ][ unload_groups[ group ].size ] = 7; + unload_groups[ group ][ unload_groups[ group ].size ] = 8; + unload_groups[ group ][ unload_groups[ group ].size ] = 9; + group = "rear_passengers"; + unload_groups[ group ][ unload_groups[ group ].size ] = 2; + unload_groups[ group ][ unload_groups[ group ].size ] = 3; + unload_groups[ group ][ unload_groups[ group ].size ] = 4; + unload_groups[ group ][ unload_groups[ group ].size ] = 5; + unload_groups[ group ][ unload_groups[ group ].size ] = 6; + unload_groups[ group ][ unload_groups[ group ].size ] = 7; + unload_groups[ group ][ unload_groups[ group ].size ] = 8; + unload_groups[ group ][ unload_groups[ group ].size ] = 9; + group = "driver"; + unload_groups[ group ][ unload_groups[ group ].size ] = 0; + unload_groups[ "default" ] = unload_groups[ "passengers" ]; + return unload_groups; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_truck_gaz66.gsc b/BO1/PC/ZM/maps/_truck_gaz66.gsc new file mode 100644 index 0000000..1d58fa5 --- /dev/null +++ b/BO1/PC/ZM/maps/_truck_gaz66.gsc @@ -0,0 +1,226 @@ + +#include maps\_vehicle; +main( model, type ) +{ + if(self.vehicletype == "truck_gaz66_player_single50") + { + build_aianims( ::set_gunner_anims , ::set_gunner_vehicle_anims ); + } + else + { + build_aianims( ::setanims , ::set_vehicle_anims ); + build_unload_groups( ::unload_groups ); + } + self thread attach_truck_bed(); +} +attach_truck_bed() +{ + bed_base = "t5_veh_gaz66_flatbed"; + bed_dead = "t5_veh_gaz66_flatbed_dead"; + switch(self.vehicletype) + { + case "truck_gaz66_canvas": + self Attach(bed_base, "tag_origin_animate_jnt"); + self Attach( "t5_veh_gaz66_canvas", "tag_origin_animate_jnt" ); + break; + case "truck_gaz66_flatbed": + self Attach(bed_base, "tag_origin_animate_jnt"); + break; + case "truck_gaz66_tanker": + case "truck_gaz66_tanker_physics": + self Attach( "t5_veh_gaz66_tanker", "tag_origin_animate_jnt" ); + break; + case "truck_gaz66_troops": + case "truck_gaz66_troops_physics": + self Attach( "t5_veh_gaz66_troops", "tag_origin_animate_jnt" ); + break; + case "truck_gaz66_troops_attacking_physics": + self Attach( "t5_veh_gaz66_troops_no_benches", "tag_origin_animate_jnt" ); + break; + case "truck_gaz66_single50": + self Attach("t5_veh_gaz66_single50", "tag_origin_animate_jnt" ); + break; + case "truck_gaz66_player_single50": + self Attach(bed_base, "tag_origin_animate_jnt"); + self Attach ("t5_veh_gunner_turret_enemy_50cal", "tag_gunner_attach"); + break; + default: + break; + } + self waittill("death"); + if(!IsDefined(self) || !IsDefined(self.vehicletype)) + { + return; + } + switch(self.vehicletype) + { + case "truck_gaz66_canvas": + self Detach(bed_base, "tag_origin_animate_jnt"); + self Detach( "t5_veh_gaz66_canvas", "tag_origin_animate_jnt" ); + self Attach(bed_dead, "tag_origin_animate_jnt"); + self Attach( "t5_veh_gaz66_canvas_dead", "tag_origin_animate_jnt" ); + break; + case "truck_gaz66_flatbed": + self Detach(bed_base, "tag_origin_animate_jnt"); + self Attach(bed_dead, "tag_origin_animate_jnt"); + break; + case "truck_gaz66_tanker": + case "truck_gaz66_tanker_physics": + self Detach( "t5_veh_gaz66_tanker", "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_tanker_dead", "tag_origin_animate_jnt" ); + break; + case "truck_gaz66_troops": + case "truck_gaz66_troops_physics": + self Detach( "t5_veh_gaz66_troops", "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_troops_dead", "tag_origin_animate_jnt" ); + break; + case "truck_gaz66_troops_attacking_physics": + self Detach( "t5_veh_gaz66_troops_no_benches", "tag_origin_animate_jnt" ); + self Attach( "t5_veh_gaz66_troops_dead", "tag_origin_animate_jnt" ); + break; + case "truck_gaz66_single50": + self Detach("t5_veh_gaz66_single50", "tag_origin_animate_jnt"); + self Attach("t5_veh_gaz66_single50_dead", "tag_origin_animate_jnt"); + break; + case "truck_gaz66_player_single50": + self Detach( bed_base, "tag_origin_animate_jnt" ); + self Detach ("t5_veh_gunner_turret_enemy_50cal", "tag_gunner_attach"); + self Attach(bed_dead, "tag_origin_animate_jnt"); + break; + default: + break; + } +} +#using_animtree( "vehicles" ); +set_vehicle_anims( positions ) +{ + positions[ 0 ].sittag = "tag_driver"; + positions[ 1 ].sittag = "tag_passenger"; + positions[ 2 ].sittag = "tag_guy1"; + positions[ 3 ].sittag = "tag_guy6"; + positions[ 4 ].sittag = "tag_guy3"; + positions[ 5 ].sittag = "tag_guy8"; + positions[ 6 ].sittag = "tag_guy5"; + positions[ 7 ].sittag = "tag_guy2"; + positions[ 8 ].sittag = "tag_guy7"; + positions[ 9 ].sittag = "tag_guy4"; + positions[ 0 ].vehicle_getoutanim_clear = false; + positions[ 1 ].vehicle_getoutanim_clear = false; + positions[ 0 ].vehicle_getinanim = %v_gaz63_driver_door_open; + positions[ 1 ].vehicle_getinanim = %v_gaz63_passenger_door_open; + positions[ 0 ].vehicle_getoutanim = %v_gaz63_driver_door_open; + positions[ 1 ].vehicle_getoutanim = %v_gaz63_passenger_door_open; + return positions; +} +#using_animtree( "generic_human" ); +setanims() +{ + positions = []; + num_positions = 10; + for( i =0 ;i < num_positions; i++ ) + { + positions[ i ] = spawnstruct(); + } + positions[ 0 ].sittag = "tag_driver"; + positions[ 1 ].sittag = "tag_passenger"; + positions[ 2 ].sittag = "tag_guy1"; + positions[ 3 ].sittag = "tag_guy6"; + positions[ 4 ].sittag = "tag_guy3"; + positions[ 5 ].sittag = "tag_guy8"; + positions[ 6 ].sittag = "tag_guy5"; + positions[ 7 ].sittag = "tag_guy2"; + positions[ 8 ].sittag = "tag_guy7"; + positions[ 9 ].sittag = "tag_guy4"; + positions[ 0 ].getout = %crew_truck_driver_climbout; + positions[ 1 ].getout = %crew_truck_passenger_climbout; + positions[ 2 ].getout = %crew_truck_guy1_climbout; + positions[ 3 ].getout = %crew_truck_guy6_climbout; + positions[ 4 ].getout = %crew_truck_guy3_climbout; + positions[ 5 ].getout = %crew_truck_guy8_climbout; + positions[ 6 ].getout = %crew_truck_guy5_climbout; + positions[ 7 ].getout = %crew_truck_guy2_climbout; + positions[ 8 ].getout = %crew_truck_guy7_climbout; + positions[ 9 ].getout = %crew_truck_guy4_climbout; + positions[ 0 ].getout_combat = %crew_gaz63_driver_jump_out; + positions[ 1 ].getout_combat = %crew_gaz63_passenger_climbout_fast; + positions[ 2 ].getout_combat = %crew_truck_guy1_climbout_fast; + positions[ 3 ].getout_combat = %crew_truck_guy6_climbout_fast; + positions[ 4 ].getout_combat = %crew_truck_guy3_climbout; + positions[ 5 ].getout_combat = %crew_truck_guy8_climbout; + positions[ 6 ].getout_combat = %crew_truck_guy5_climbout_fast; + positions[ 7 ].getout_combat = %crew_truck_guy2_climbout_fast; + positions[ 8 ].getout_combat = %crew_truck_guy7_climbout; + positions[ 9 ].getout_combat = %crew_truck_guy4_climbout; + positions[ 0 ].idle = %crew_truck_driver_sit_idle; + positions[ 1 ].idle = %crew_gaz63_passenger_sit_idle; + positions[ 2 ].idle = %crew_truck_guy1_sit_idle; + positions[ 3 ].idle = %crew_truck_guy6_sit_idle; + positions[ 4 ].idle = %crew_truck_guy3_sit_idle; + positions[ 5 ].idle = %crew_truck_guy8_sit_idle; + positions[ 6 ].idle = %crew_truck_guy5_sit_idle; + positions[ 7 ].idle = %crew_truck_guy2_sit_idle; + positions[ 8 ].idle = %crew_truck_guy7_sit_idle; + positions[ 9 ].idle = %crew_truck_guy4_sit_idle; + return positions; +} +unload_groups() +{ + unload_groups = []; + unload_groups[ "all" ] = []; + unload_groups[ "passengers" ] = []; + unload_groups[ "rear_passengers" ] = []; + group = "all"; + unload_groups[ group ][ unload_groups[ group ].size ] = 0; + unload_groups[ group ][ unload_groups[ group ].size ] = 1; + unload_groups[ group ][ unload_groups[ group ].size ] = 2; + unload_groups[ group ][ unload_groups[ group ].size ] = 3; + unload_groups[ group ][ unload_groups[ group ].size ] = 4; + unload_groups[ group ][ unload_groups[ group ].size ] = 5; + unload_groups[ group ][ unload_groups[ group ].size ] = 6; + unload_groups[ group ][ unload_groups[ group ].size ] = 7; + unload_groups[ group ][ unload_groups[ group ].size ] = 8; + unload_groups[ group ][ unload_groups[ group ].size ] = 9; + group = "passengers"; + unload_groups[ group ][ unload_groups[ group ].size ] = 2; + unload_groups[ group ][ unload_groups[ group ].size ] = 3; + unload_groups[ group ][ unload_groups[ group ].size ] = 4; + unload_groups[ group ][ unload_groups[ group ].size ] = 5; + unload_groups[ group ][ unload_groups[ group ].size ] = 6; + unload_groups[ group ][ unload_groups[ group ].size ] = 7; + unload_groups[ group ][ unload_groups[ group ].size ] = 8; + unload_groups[ group ][ unload_groups[ group ].size ] = 9; + group = "rear_passengers"; + unload_groups[ group ][ unload_groups[ group ].size ] = 3; + unload_groups[ group ][ unload_groups[ group ].size ] = 4; + unload_groups[ group ][ unload_groups[ group ].size ] = 5; + unload_groups[ group ][ unload_groups[ group ].size ] = 6; + unload_groups[ group ][ unload_groups[ group ].size ] = 7; + unload_groups[ group ][ unload_groups[ group ].size ] = 8; + unload_groups[ group ][ unload_groups[ group ].size ] = 9; + unload_groups[ "default" ] = unload_groups[ "passengers" ]; + return unload_groups; +} +#using_animtree( "generic_human" ); +set_gunner_vehicle_anims(positions) +{ + return positions; +} +set_gunner_anims() +{ + positions = []; + num_positions = 3; + for( i =0 ;i < num_positions; i++ ) + { + positions[ i ] = spawnstruct(); + } + positions[0].sittag = "tag_driver"; + positions[1].sittag = "tag_passenger"; + positions[2].sittag = "tag_gunner1"; + positions[ 0 ].idle = %crew_truck_driver_sit_idle; + positions[ 1 ].idle = %crew_gaz63_passenger_sit_idle; + positions[2].vehiclegunner = 1; + positions[2].idle = %ai_50cal_gunner_aim; + positions[2].aimup = %ai_50cal_gunner_aim_up; + positions[2].aimdown = %ai_50cal_gunner_aim_down; + return positions; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_uaz.gsc b/BO1/PC/ZM/maps/_uaz.gsc new file mode 100644 index 0000000..de01940 Binary files /dev/null and b/BO1/PC/ZM/maps/_uaz.gsc differ diff --git a/BO1/PC/ZM/maps/_utility.gsc b/BO1/PC/ZM/maps/_utility.gsc new file mode 100644 index 0000000..25341ea --- /dev/null +++ b/BO1/PC/ZM/maps/_utility.gsc @@ -0,0 +1,8103 @@ +#include common_scripts\utility; +#include maps\_utility_code; +array_levelthread( array, process, var1, var2, var3, var4 ) +{ + keys = getArrayKeys( array ); + if( IsDefined( var4 ) ) + { + for( i = 0 ; i < keys.size ; i++ ) + { + thread [[ process ]]( array[ keys[ i ] ], var1, var2, var3, var4 ); + } + return; + } + if( IsDefined( var3 ) ) + { + for( i = 0 ; i < keys.size ; i++ ) + { + thread [[ process ]]( array[ keys[ i ] ], var1, var2, var3 ); + } + return; + } + if( IsDefined( var2 ) ) + { + for( i = 0 ; i < keys.size ; i++ ) + { + thread [[ process ]]( array[ keys[ i ] ], var1, var2 ); + } + return; + } + if( IsDefined( var1 ) ) + { + for( i = 0 ; i < keys.size ; i++ ) + { + thread [[ process ]]( array[ keys[ i ] ], var1 ); + } + return; + } + for( i = 0 ; i < keys.size ; i++ ) + { + thread [[ process ]]( array[ keys[ i ] ] ); + } +} +set_vision_set( visionset, transition_time ) +{ + if ( init_vision_set( visionset ) ) + { + return; + } + if ( !IsDefined( transition_time ) ) + { + transition_time = 1; + } + visionSetNaked( visionset, transition_time ); +} +ent_flag_wait( msg ) +{ + self endon("death"); + while( !self.ent_flag[ msg ] ) + { + self waittill( msg ); + } +} +ent_flag_wait_either( flag1, flag2 ) +{ + self endon("death"); + for( ;; ) + { + if( ent_flag( flag1 ) ) + { + return; + } + if( ent_flag( flag2 ) ) + { + return; + } + self waittill_either( flag1, flag2 ); + } +} +ent_flag_wait_or_timeout( flagname, timer ) +{ + self endon("death"); + start_time = gettime(); + for( ;; ) + { + if( self.ent_flag[ flagname ] ) + { + break; + } + if( gettime() >= start_time + timer * 1000 ) + { + break; + } + self ent_wait_for_flag_or_time_elapses( flagname, timer ); + } +} +ent_flag_waitopen( msg ) +{ + self endon("death"); + while( self.ent_flag[ msg ] ) + { + self waittill( msg ); + } +} +ent_flag_init( message, val ) +{ + if( !IsDefined( self.ent_flag ) ) + { + self.ent_flag = []; + self.ent_flags_lock = []; + } + if ( !IsDefined( level.first_frame ) ) + { + assertEx( !IsDefined( self.ent_flag[ message ] ), "Attempt to reinitialize existing flag '" + message + "' on entity."); + } + if (is_true(val)) + { + self.ent_flag[ message ] = true; + } + else + { + self.ent_flag[ message ] = false; + } +} +ent_flag_set_delayed( message, delay ) +{ + wait( delay ); + self ent_flag_set( message ); +} +ent_flag_set( message ) +{ + self.ent_flag[ message ] = true; + self notify( message ); +} +ent_flag_toggle( message ) +{ + if (self ent_flag(message)) + { + self ent_flag_clear(message); + } + else + { + self ent_flag_set(message); + } +} +ent_flag_clear( message ) +{ + if( self.ent_flag[ message ] ) + { + self.ent_flag[ message ] = false; + self notify( message ); + } +} +ent_flag_clear_delayed( message, delay ) +{ + wait( delay ); + self ent_flag_clear( message ); +} +ent_flag( message ) +{ + AssertEx( IsDefined( message ), "Tried to check flag but the flag was not defined." ); + AssertEx( IsDefined( self.ent_flag[ message ] ), "Tried to check entity flag '" + message + "', but the flag was not initialized."); + if( !self.ent_flag[ message ] ) + { + return false; + } + return true; +} +ent_flag_init_ai_standards() +{ + message_array = []; + message_array[ message_array.size ] = "goal"; + message_array[ message_array.size ] = "damage"; + for( i = 0; i < message_array.size; i++) + { + self ent_flag_init( message_array[ i ] ); + self thread ent_flag_wait_ai_standards( message_array[ i ] ); + } +} +ent_flag_wait_ai_standards( message ) +{ + self endon("death"); + self waittill( message ); + self.ent_flag[ message ] = true; +} +flag_wait_either( flag1, flag2 ) +{ + for( ;; ) + { + if( flag( flag1 ) ) + { + return; + } + if( flag( flag2 ) ) + { + return; + } + level waittill_either( flag1, flag2 ); + } +} +flag_wait_any( flag1, flag2, flag3, flag4 ) +{ + array = []; + if( IsDefined( flag4 ) ) + { + array[ array.size ] = flag1; + array[ array.size ] = flag2; + array[ array.size ] = flag3; + array[ array.size ] = flag4; + } + else if( IsDefined( flag3 ) ) + { + array[ array.size ] = flag1; + array[ array.size ] = flag2; + array[ array.size ] = flag3; + } + else if( IsDefined( flag2 ) ) + { + flag_wait_either( flag1, flag2 ); + return; + } + else + { + assertmsg( "flag_wait_any() needs at least 2 flags passed to it" ); + return; + } + for( ;; ) + { + for(i=0; i= start_time + timer * 1000 ) + { + break; + } + wait_for_flag_or_time_elapses( flagname, timer ); + } +} +flag_waitopen_or_timeout( flagname, timer ) +{ + start_time = gettime(); + for( ;; ) + { + if( !level.flag[ flagname ] ) + { + break; + } + if( gettime() >= start_time + timer * 1000 ) + { + break; + } + wait_for_flag_or_time_elapses( flagname, timer ); + } +} +flag_trigger_init( message, trigger, continuous ) +{ + flag_init( message ); + if( !IsDefined( continuous ) ) + { + continuous = false; + } + assert( isSubStr( trigger.classname, "trigger" ) ); + trigger thread _flag_wait_trigger( message, continuous ); + return trigger; +} +flag_triggers_init( message, triggers, all ) +{ + flag_init( message ); + if( !IsDefined( all ) ) + { + all = false; + } + for( index = 0; index < triggers.size; index ++ ) + { + assert( isSubStr( triggers[ index ].classname, "trigger" ) ); + triggers[ index ] thread _flag_wait_trigger( message, false ); + } + return triggers; +} +flag_assert( msg ) +{ + assertEx( !flag( msg ), "Flag " + msg + " set too soon!" ); +} +flag_set_delayed( message, delay ) +{ + wait( delay ); + flag_set( message ); +} +flag_clear_delayed( message, delay ) +{ + wait( delay ); + flag_clear( message ); +} +_flag_wait_trigger( message, continuous ) +{ + self endon( "death" ); + for( ;; ) + { + self waittill( "trigger", other ); + flag_set( message ); + if( !continuous ) + { + return; + } + while( other isTouching( self ) ) + { + wait( 0.05 ); + } + flag_clear( message ); + } +} +wait_endon( waitTime, endOnString, endonString2, endonString3 ) +{ + self endon ( endOnString ); + if ( isDefined( endonString2 ) ) + self endon ( endonString2 ); + if ( isDefined( endonString3 ) ) + self endon ( endonString3 ); + wait ( waitTime ); +} +level_end_save() +{ + if( level.missionfailed ) + { + return; + } + if ( flag( "game_saving" ) ) + { + return; + } + players = get_players(); + if( !IsAlive( players[0] ) ) + { + return; + } + flag_set( "game_saving" ); + imagename = "levelshots / autosave / autosave_" + level.script + "end"; + saveGame( "levelend", &"AUTOSAVE_AUTOSAVE", imagename, true ); + flag_clear( "game_saving" ); +} +autosave_by_name( name ) +{ + thread autosave_by_name_thread( name ); +} +autosave_by_name_thread( name, timeout ) +{ + if( !IsDefined( level.curAutoSave ) ) + { + level.curAutoSave = 1; + } + imageName = "levelshots / autosave / autosave_" + level.script + level.curAutoSave; + result = level maps\_autosave::try_auto_save( level.curAutoSave, "autosave", imagename, timeout ); + if( IsDefined( result ) && result ) + { + level.curAutoSave++; + } +} +error( message ) +{ + println( "^c * ERROR * ", message ); + wait 0.05; +} +error2( message ) +{ + println( "^c * ERROR * ", message ); + wait 0.05; +} +debug_message( message, origin, duration ) +{ + if( !IsDefined( duration ) ) + { + duration = 5; + } + for( time = 0; time < ( duration * 20 );time ++ ) + { + print3d( ( origin + ( 0, 0, 45 ) ), message, ( 0.48, 9.4, 0.76 ), 0.85 ); + wait 0.05; + } +} +debug_message_clear( message, origin, duration, extraEndon ) +{ + if( IsDefined( extraEndon ) ) + { + level notify( message + extraEndon ); + level endon( message + extraEndon ); + } + else + { + level notify( message ); + level endon( message ); + } + if( !IsDefined( duration ) ) + { + duration = 5; + } + for( time = 0; time < ( duration * 20 );time ++ ) + { + print3d( ( origin + ( 0, 0, 45 ) ), message, ( 0.48, 9.4, 0.76 ), 0.85 ); + wait 0.05; + } +} +precache( model ) +{ + ent = spawn( "script_model", ( 0, 0, 0 ) ); + ent.origin = get_players()[0] getorigin(); + ent setmodel( model ); + ent delete(); +} +closerFunc( dist1, dist2 ) +{ + return dist1 >= dist2; +} +fartherFunc( dist1, dist2 ) +{ + return dist1 <= dist2; +} +getClosest( org, array, dist ) +{ + return compareSizes( org, array, dist, ::closerFunc ); +} +getFarthest( org, array, dist ) +{ + return compareSizes( org, array, dist, ::fartherFunc ); +} +compareSizesFx( org, array, dist, compareFunc ) +{ + if( !array.size ) + { + return undefined; + } + if( IsDefined( dist ) ) + { + struct = undefined; + keys = getArrayKeys( array ); + for( i = 0; i < keys.size; i++ ) + { + newdist = distance( array[ keys[ i ] ].v[ "origin" ], org ); + if( [[ compareFunc ]]( newDist, dist ) ) + { + continue; + } + dist = newdist; + struct = array[ keys[ i ] ]; + } + return struct; + } + keys = getArrayKeys( array ); + struct = array[ keys[ 0 ] ]; + dist = distance( struct.v[ "origin" ], org ); + for( i = 1; i < keys.size; i++ ) + { + newdist = distance( array[ keys[ i ] ].v[ "origin" ], org ); + if( [[ compareFunc ]]( newDist, dist ) ) + { + continue; + } + dist = newdist; + struct = array[ keys[ i ] ]; + } + return struct; +} +compareSizes( org, array, dist, compareFunc ) +{ + if( !array.size ) + { + return undefined; + } + if( IsDefined( dist ) ) + { + ent = undefined; + keys = GetArrayKeys( array ); + for( i = 0; i < keys.size; i++ ) + { + newdist = distance( array[ keys[ i ] ].origin, org ); + if( [[ compareFunc ]]( newDist, dist ) ) + { + continue; + } + dist = newdist; + ent = array[ keys[ i ] ]; + } + return ent; + } + keys = GetArrayKeys( array ); + ent = array[ keys[ 0 ] ]; + dist = Distance( ent.origin, org ); + for( i = 1; i < keys.size; i++ ) + { + newdist = distance( array[ keys[ i ] ].origin, org ); + if( [[ compareFunc ]]( newDist, dist ) ) + { + continue; + } + dist = newdist; + ent = array[ keys[ i ] ]; + } + return ent; +} +get_closest_point( origin, points, maxDist ) +{ + assert( points.size ); + closestPoint = points[ 0 ]; + dist = Distance( origin, closestPoint ); + for( index = 0; index < points.size; index ++ ) + { + testDist = distance( origin, points[ index ] ); + if( testDist >= dist ) + { + continue; + } + dist = testDist; + closestPoint = points[ index ]; + } + if( !IsDefined( maxDist ) || dist <= maxDist ) + { + return closestPoint; + } + return undefined; +} +get_within_range( org, array, dist ) +{ + guys = []; + for( i = 0; i < array.size; i++ ) + { + if( distance( array[ i ].origin, org ) <= dist ) + { + guys[ guys.size ] = array[ i ]; + } + } + return guys; +} +get_outside_range( org, array, dist ) +{ + guys = []; + for( i = 0; i < array.size; i++ ) + { + if( distance( array[ i ].origin, org ) > dist ) + { + guys[ guys.size ] = array[ i ]; + } + } + return guys; +} +get_closest_living( org, array, dist ) +{ + if( !IsDefined( dist ) ) + { + dist = 9999999; + } + if( array.size < 1 ) + { + return; + } + ent = undefined; + for( i = 0;i < array.size;i++ ) + { + if( !isalive( array[ i ] ) ) + { + continue; + } + newdist = distance( array[ i ].origin, org ); + if( newdist >= dist ) + { + continue; + } + dist = newdist; + ent = array[ i ]; + } + return ent; +} +get_highest_dot( start, end, array ) +{ + if( !array.size ) + { + return; + } + ent = undefined; + angles = VectorToAngles( end - start ); + dotforward = AnglesToForward( angles ); + dot = -1; + for( i = 0;i < array.size;i++ ) + { + angles = vectorToAngles( array[ i ].origin - start ); + forward = AnglesToForward( angles ); + newdot = VectorDot( dotforward, forward ); + if( newdot < dot ) + { + continue; + } + dot = newdot; + ent = array[ i ]; + } + return ent; +} +get_closest_index( org, array, dist ) +{ + if( !IsDefined( dist ) ) + { + dist = 9999999; + } + if( array.size < 1 ) + { + return; + } + index = undefined; + for( i = 0;i < array.size;i++ ) + { + newdist = distance( array[ i ].origin, org ); + if( newdist >= dist ) + { + continue; + } + dist = newdist; + index = i; + } + return index; +} +get_farthest( org, array ) +{ + if( array.size < 1 ) + { + return; + } + dist = Distance( array[0].origin, org ); + ent = array[0]; + for( i = 1; i < array.size; i++ ) + { + newdist = Distance( array[i].origin, org ); + if( newdist <= dist ) + { + continue; + } + dist = newdist; + ent = array[i]; + } + return ent; +} +get_closest_exclude( org, ents, excluders ) +{ + if( !IsDefined( ents ) ) + { + return undefined; + } + range = 0; + if( IsDefined( excluders ) && excluders.size ) + { + exclude = []; + for( i = 0;i < ents.size;i++ ) + { + exclude[ i ] = false; + } + for( i = 0;i < ents.size;i++ ) + { + for( p = 0;p < excluders.size;p ++ ) + { + if( ents[ i ] == excluders[ p ] ) + { + exclude[ i ] = true; + } + } + } + found_unexcluded = false; + for( i = 0;i < ents.size;i++ ) + { + if( ( !exclude[ i ] ) && ( IsDefined( ents[ i ] ) ) ) + { + found_unexcluded = true; + range = distance( org, ents[ i ].origin ); + ent = i; + i = ents.size + 1; + } + } + if( !found_unexcluded ) + { + return( undefined ); + } + } + else + { + for( i = 0;i < ents.size;i++ ) + { + if( IsDefined( ents[ i ] ) ) + { + range = distance( org, ents[ 0 ].origin ); + ent = i; + i = ents.size + 1; + } + } + } + ent = undefined; + for( i = 0;i < ents.size;i++ ) + { + if( IsDefined( ents[ i ] ) ) + { + exclude = false; + if( IsDefined( excluders ) ) + { + for( p = 0;p < excluders.size;p ++ ) + { + if( ents[ i ] == excluders[ p ] ) + { + exclude = true; + } + } + } + if( !exclude ) + { + newrange = distance( org, ents[ i ].origin ); + if( newrange <= range ) + { + range = newrange; + ent = i; + } + } + } + } + if( IsDefined( ent ) ) + { + return ents[ ent ]; + } + else + { + return undefined; + } +} +get_closest_ai( org, team ) +{ + if( IsDefined( team ) ) + { + ents = GetAiArray( team ); + } + else + { + ents = GetAiArray(); + } + if( ents.size == 0 ) + { + return undefined; + } + return getClosest( org, ents ); +} +get_array_of_closest( org, array, excluders, max, maxdist ) +{ + if( !IsDefined( max ) ) + { + max = array.size; + } + if( !IsDefined( excluders ) ) + { + excluders = []; + } + maxdists2rd = undefined; + if( IsDefined( maxdist ) ) + { + maxdists2rd = maxdist * maxdist; + } + dist = []; + index = []; + for( i = 0;i < array.size;i++ ) + { + excluded = false; + for( p = 0;p < excluders.size;p ++ ) + { + if( array[ i ] != excluders[ p ] ) + { + continue; + } + excluded = true; + break; + } + if( excluded ) + { + continue; + } + if( !IsDefined(array[ i ]) ) + { + continue; + } + length = distancesquared( org, array[ i ].origin ); + if( IsDefined( maxdists2rd ) && maxdists2rd < length ) + { + continue; + } + dist[ dist.size ] = length; + index[ index.size ] = i; + } + for( ;; ) + { + change = false; + for( i = 0;i < dist.size - 1;i++ ) + { + if( dist[ i ] <= dist[ i + 1 ] ) + { + continue; + } + change = true; + temp = dist[ i ]; + dist[ i ] = dist[ i + 1 ]; + dist[ i + 1 ] = temp; + temp = index[ i ]; + index[ i ] = index[ i + 1 ]; + index[ i + 1 ] = temp; + } + if( !change ) + { + break; + } + } + newArray = []; + if( max > dist.size ) + { + max = dist.size; + } + for( i = 0;i < max;i++ ) + { + newArray[ i ] = array[ index[ i ] ]; + } + return newArray; +} +get_array_of_farthest( org, array, excluders, max ) +{ + sorted_array = get_array_of_closest( org, array, excluders, max ); + sorted_array = array_reverse( sorted_array ); + return( sorted_array ); +} +get_closest_ai_exclude( org, team, excluders ) +{ + if( IsDefined( team ) ) + { + ents = GetAiArray( team ); + } + else + { + ents = GetAiArray(); + } + if( ents.size == 0 ) + { + return undefined; + } + return get_closest_exclude( org, ents, excluders ); +} +stop_magic_bullet_shield() +{ + if ( IsAI(self) ) + { + self BloodImpact( "normal" ); + } + self.attackerAccuracy = 1; + self notify("stop_magic_bullet_shield"); + self.magic_bullet_shield = undefined; + self._mbs = undefined; +} +magic_bullet_shield() +{ + if (!is_true(self.magic_bullet_shield)) + { + if( IsAI(self) || IsPlayer(self)) + { + self.magic_bullet_shield = true; + if (!IsDefined(self._mbs)) + { + self._mbs = SpawnStruct(); + } + if ( IsAI(self) ) + { + AssertEx( IsAlive( self ), "Tried to do magic_bullet_shield on a dead or undefined guy." ); + self._mbs.last_pain_time = 0; + self._mbs.ignore_time = 5; + self._mbs.turret_ignore_time = 5; + self BloodImpact( "hero" ); + } + self.attackerAccuracy = 0.1; + } + else + { + if (self is_vehicle()) + { + AssertMsg("Use veh_magic_bullet_shield for vehicles."); + } + else + { + AssertMsg("magic_bullet_shield does not support entity of classname '" + self.classname + "'."); + } + } + } +} +debug_magic_bullet_shield_death(guy) +{ + targetname = "none"; + if (IsDefined(guy.targetname)) + { + targetname = guy.targetname; + } + guy endon("stop_magic_bullet_shield"); + guy waittill("death"); + AssertEx(!IsDefined(guy), "Guy died with magic bullet shield on with targetname: " + targetname); +} +disable_long_death() +{ + assertex( isalive( self ), "Tried to disable long death on a non living thing" ); + self.a.disableLongDeath = true; +} +enable_long_death() +{ + assertex( isalive( self ), "Tried to enable long death on a non living thing" ); + self.a.disableLongDeath = false; +} +get_ignoreme() +{ + return self.ignoreme; +} +set_ignoreme( val ) +{ + assertex( IsSentient( self ), "Non ai tried to set ignoreme" ); + self.ignoreme = val; +} +set_ignoreall( val ) +{ + assertEx( isSentient( self ), "Non ai tried to set ignoraell" ); + self.ignoreall = val; +} +get_pacifist() +{ + return self.pacifist; +} +set_pacifist( val ) +{ + assertex( IsSentient( self ), "Non ai tried to set pacifist" ); + self.pacifist = val; +} +ignore_me_timer( time, endon_msg ) +{ + self notify("ignore_me_timer"); + self.ignore_me_timer_old = self get_ignoreme(); + if( !self.ignore_me_timer_old ) + { + ai = GetAiArray( "axis" ); + for( i = 0; i < ai.size; i++ ) + { + guy = ai[ i ]; + if( IsAlive( guy.enemy ) && guy.enemy == self ) + { + guy notify( "enemy" ); + } + } + } + self endon( "death" ); + self endon( "ignore_me_timer" ); + self set_ignoreme(true); + waittill_any_or_timeout( time, endon_msg ); + self set_ignoreme(self.ignore_me_timer_old); +} +turret_ignore_me_timer( time ) +{ + self endon( "death" ); + self endon( "pain" ); + self.turretInvulnerability = true; + wait time; + self.turretInvulnerability = false; +} +exploder_damage() +{ + if( IsDefined( self.v[ "delay" ] ) ) + { + delay = self.v[ "delay" ]; + } + else + { + delay = 0; + } + if( IsDefined( self.v[ "damage_radius" ] ) ) + { + radius = self.v[ "damage_radius" ]; + } + else + { + radius = 128; + } + damage = self.v[ "damage" ]; + origin = self.v[ "origin" ]; + wait( delay ); + self.model RadiusDamage( origin, radius, damage, damage / 3 ); +} +exploder( num ) +{ + [[ level.exploderFunction ]]( num ); +} +exploder_before_load( num ) +{ + waittillframeend; + waittillframeend; + activate_exploder( num ); +} +exploder_after_load( num ) +{ + activate_exploder( num ); +} +activate_exploder_on_clients(num) +{ + if(!IsDefined(level._exploder_ids[num])) + { + return; + } + if(!IsDefined(level._client_exploders[num])) + { + level._client_exploders[num] = 1; + } + if(!IsDefined(level._client_exploder_ids[num])) + { + level._client_exploder_ids[num] = 1; + } + ActivateClientExploder(level._exploder_ids[num]); +} +delete_exploder_on_clients(num) +{ + if(!IsDefined(level._exploder_ids[num])) + { + return; + } + if(!IsDefined(level._client_exploders[num])) + { + return; + } + level._client_exploders[num] = undefined; + level._client_exploder_ids[num] = undefined; + DeactivateClientExploder(level._exploder_ids[num]); +} +activate_exploder( num ) +{ + num = int( num ); + client_send = true; + prof_begin( "activate_exploder" ); + for( i = 0;i < level.createFXent.size;i++ ) + { + ent = level.createFXent[ i ]; + if( !IsDefined( ent ) ) + { + continue; + } + if( ent.v[ "type" ] != "exploder" ) + { + continue; + } + if( !IsDefined( ent.v[ "exploder" ] ) ) + { + continue; + } + if( ent.v[ "exploder" ] != num ) + { + continue; + } + if(IsDefined(ent.v["exploder_server"])) + { + client_send = false; + } + ent activate_individual_exploder(); + } + if(level.clientScripts) + { + if(!level.createFX_enabled && client_send == true) + { + activate_exploder_on_clients(num); + } + } + prof_end( "activate_exploder" ); +} +stop_exploder( num ) +{ + num = int( num ); + if(level.clientScripts) + { + if(!level.createFX_enabled) + { + delete_exploder_on_clients(num); + } + } + for( i = 0;i < level.createFXent.size;i++ ) + { + ent = level.createFXent[ i ]; + if( !IsDefined( ent ) ) + { + continue; + } + if( ent.v[ "type" ] != "exploder" ) + { + continue; + } + if( !IsDefined( ent.v[ "exploder" ] ) ) + { + continue; + } + if( ent.v[ "exploder" ] != num ) + { + continue; + } + if ( !IsDefined( ent.looper ) ) + { + continue; + } + ent.looper delete(); + } +} +activate_individual_exploder() +{ + level notify("exploder" + self.v["exploder"]); + if(level.createFX_enabled || !level.clientScripts || !IsDefined(level._exploder_ids[int(self.v["exploder"])] ) || IsDefined(self.v["exploder_server"])) + { + if( IsDefined( self.v[ "firefx" ] ) ) + { + self thread fire_effect(); + } + if( IsDefined( self.v[ "fxid" ] ) && self.v[ "fxid" ] != "No FX" ) + { + self thread cannon_effect(); + } + else if( IsDefined( self.v[ "soundalias" ] ) ) + { + self thread sound_effect(); + } + if( IsDefined( self.v[ "earthquake" ] ) ) + { + self thread exploder_earthquake(); + } + if( IsDefined( self.v[ "rumble" ] ) ) + { + self thread exploder_rumble(); + } + } + if( IsDefined( self.v[ "trailfx" ] ) ) + { + self thread trail_effect(); + } + if( IsDefined( self.v[ "damage" ] ) ) + { + self thread exploder_damage(); + } + if( self.v[ "exploder_type" ] == "exploder" ) + { + self thread brush_show(); + } + else if( ( self.v[ "exploder_type" ] == "exploderchunk" ) || ( self.v[ "exploder_type" ] == "exploderchunk visible" ) ) + { + self thread brush_throw(); + } + else + { + self thread brush_delete(); + } +} +loop_sound_Delete( ender, ent ) +{ + ent endon( "death" ); + self waittill( ender ); + ent Delete(); +} +loop_fx_sound( alias, origin, ender, timeout ) +{ + org = Spawn( "script_origin", ( 0, 0, 0 ) ); + if( IsDefined( ender ) ) + { + thread loop_sound_Delete( ender, org ); + self endon( ender ); + } + org.origin = origin; + org PlayLoopSound( alias ); + if( !IsDefined( timeout ) ) + { + return; + } + wait( timeout ); +} +brush_delete() +{ + num = self.v[ "exploder" ]; + if( IsDefined( self.v[ "delay" ] ) ) + { + wait( self.v[ "delay" ] ); + } + else + { + wait( .05 ); + } + if( !IsDefined( self.model ) ) + { + return; + } + assert( IsDefined( self.model ) ); + if( self.model has_spawnflag(level.SPAWNFLAG_MODEL_DYNAMIC_PATH) ) + { + self.model ConnectPaths(); + } + if( level.createFX_enabled ) + { + if( IsDefined( self.exploded ) ) + { + return; + } + self.exploded = true; + self.model Hide(); + self.model NotSolid(); + wait( 3 ); + self.exploded = undefined; + self.model Show(); + self.model Solid(); + return; + } + if( !IsDefined( self.v[ "fxid" ] ) || self.v[ "fxid" ] == "No FX" ) + { + self.v[ "exploder" ] = undefined; + } + waittillframeend; + self.model Delete(); +} +brush_Show() +{ + if( IsDefined( self.v[ "delay" ] ) ) + { + wait( self.v[ "delay" ] ); + } + assert( IsDefined( self.model ) ); + self.model Show(); + self.model Solid(); + if( self.model has_spawnflag(level.SPAWNFLAG_MODEL_DYNAMIC_PATH) ) + { + if( !IsDefined( self.model.disconnect_paths ) ) + { + self.model ConnectPaths(); + } + else + { + self.model DisconnectPaths(); + } + } + if( level.createFX_enabled ) + { + if( IsDefined( self.exploded ) ) + { + return; + } + self.exploded = true; + wait( 3 ); + self.exploded = undefined; + self.model Hide(); + self.model NotSolid(); + } +} +brush_throw() +{ + if( IsDefined( self.v[ "delay" ] ) ) + { + wait( self.v[ "delay" ] ); + } + ent = undefined; + if( IsDefined( self.v[ "target" ] ) ) + { + ent = getent( self.v[ "target" ], "targetname" ); + } + if( !IsDefined( ent ) ) + { + ent = GetStruct( self.v["target"], "targetname" ); + if( !IsDefined( ent ) ) + { + self.model Delete(); + return; + } + } + self.model Show(); + startorg = self.v[ "origin" ]; + startang = self.v[ "angles" ]; + org = ent.origin; + temp_vec = ( org - self.v[ "origin" ] ); + x = temp_vec[ 0 ]; + y = temp_vec[ 1 ]; + z = temp_vec[ 2 ]; + physics = IsDefined( self.v[ "physics" ] ); + if ( physics ) + { + target = undefined; + if ( IsDefined( ent.target ) ) + { + target = getent( ent.target, "targetname" ); + } + if ( !IsDefined( target ) ) + { + contact_point = startorg; + throw_vec = ent.origin; + } + else + { + contact_point = ent.origin; + throw_vec = vector_scale(target.origin - ent.origin, self.v[ "physics" ]); + } + self.model physicslaunch( contact_point, throw_vec ); + return; + } + else + { + self.model RotateVelocity( ( x, y, z ), 12 ); + self.model moveGravity( ( x, y, z ), 12 ); + } + if( level.createFX_enabled ) + { + if( IsDefined( self.exploded ) ) + { + return; + } + self.exploded = true; + wait( 3 ); + self.exploded = undefined; + self.v[ "origin" ] = startorg; + self.v[ "angles" ] = startang; + self.model Hide(); + return; + } + self.v[ "exploder" ] = undefined; + wait( 6 ); + self.model Delete(); +} +shock_onpain() +{ + self endon( "death" ); + self endon( "disconnect" ); + if( GetDvar( #"blurpain" ) == "" ) + { + SetDvar( "blurpain", "on" ); + } + while( 1 ) + { + oldhealth = self.health; + self waittill( "damage", damage, attacker, direction_vec, point, mod ); + if( IsDefined( level.shock_onpain ) && !level.shock_onpain ) + { + continue; + } + if( IsDefined( self.shock_onpain ) && !self.shock_onpain ) + { + continue; + } + if( self.health < 1 ) + { + continue; + } + if( mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" ) + { + continue; + } + else if( mod == "MOD_GRENADE_SPLASH" || mod == "MOD_GRENADE" || mod == "MOD_EXPLOSIVE" ) + { + self shock_onexplosion( damage ); + } + else + { + if( GetDvar( #"blurpain" ) == "on" ) + { + self ShellShock( "pain", 0.5 ); + } + } + } +} +shock_onexplosion( damage ) +{ + time = 0; + multiplier = self.maxhealth / 100; + scaled_damage = damage * multiplier; + if( scaled_damage >= 90 ) + { + time = 4; + } + else if( scaled_damage >= 50 ) + { + time = 3; + } + else if( scaled_damage >= 25 ) + { + time = 2; + } + else if( scaled_damage > 10 ) + { + time = 1; + } + if( time ) + { + self ShellShock( "explosion", time ); + } +} +shock_ondeath() +{ + self waittill( "death" ); + if( IsDefined( level.shock_ondeath ) && !level.shock_ondeath ) + { + return; + } + if( IsDefined( self.shock_ondeath ) && !self.shock_ondeath ) + { + return; + } + if( IsDefined( self.specialDeath ) ) + { + return; + } + if( GetDvar( #"r_texturebits" ) == "16" ) + { + return; + } +} +delete_on_death( ent ) +{ + ent endon( "death" ); + self waittill( "death" ); + if( IsDefined( ent ) ) + { + ent delete(); + } +} +delete_on_death_wait_sound( ent, sounddone ) +{ + ent endon( "death" ); + self waittill( "death" ); + if( IsDefined( ent ) ) + { + if ( ent iswaitingonsound() ) + { + ent waittill( sounddone ); + } + ent Delete(); + } +} +is_dead_sentient() +{ + return isSentient( self ) && !isalive( self ); +} +play_sound_on_tag( alias, tag, ends_on_death ) +{ + if ( is_dead_sentient() ) + { + return; + } + org = Spawn( "script_origin", ( 0, 0, 0 ) ); + org endon( "death" ); + thread delete_on_death_wait_sound( org, "sounddone" ); + if ( IsDefined( tag ) ) + { + org LinkTo( self, tag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); + } + else + { + org.origin = self.origin; + org.angles = self.angles; + org LinkTo( self ); + } + org PlaySound( alias, "sounddone" ); + if ( IsDefined( ends_on_death ) ) + { + assertex( ends_on_death, "ends_on_death must be true or undefined" ); + wait_for_sounddone_or_death( org ); + if(is_dead_sentient()) + { + org StopSounds(); + } + wait( 0.05 ); + } + else + { + org waittill( "sounddone" ); + } + org Delete(); +} +play_sound_on_tag_endon_death( alias, tag ) +{ + play_sound_on_tag( alias, tag, true ); +} +play_sound_on_entity( alias ) +{ + play_sound_on_tag( alias ); +} +play_loop_sound_on_tag( alias, tag, bStopSoundOnDeath ) +{ + org = Spawn( "script_origin", ( 0, 0, 0 ) ); + org endon( "death" ); + if ( !IsDefined( bStopSoundOnDeath ) ) + { + bStopSoundOnDeath = true; + } + if ( bStopSoundOnDeath ) + { + thread delete_on_death( org ); + } + if( IsDefined( tag ) ) + { + org LinkTo( self, tag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); + } + else + { + org.origin = self.origin; + org.angles = self.angles; + org LinkTo( self ); + } + org PlayLoopSound( alias ); + self waittill( "stop sound" + alias ); + org StopLoopSound( alias ); + org Delete(); +} +stop_loop_sound_on_entity( alias ) +{ + self notify( "stop sound" + alias ); +} +play_loop_sound_on_entity( alias, offset ) +{ + org = Spawn( "script_origin", ( 0, 0, 0 ) ); + org endon( "death" ); + thread delete_on_death( org ); + if( IsDefined( offset ) ) + { + org.origin = self.origin + offset; + org.angles = self.angles; + org LinkTo( self ); + } + else + { + org.origin = self.origin; + org.angles = self.angles; + org LinkTo( self ); + } + org PlayLoopSound( alias ); + self waittill( "stop sound" + alias ); + org StopLoopSound( 0.1 ); + org Delete(); +} +play_sound_in_space( alias, origin, master ) +{ + org = Spawn( "script_origin", ( 0, 0, 1 ) ); + if( !IsDefined( origin ) ) + { + origin = self.origin; + } + org.origin = origin; + if( IsDefined( master ) && master ) + { + org PlaySoundAsMaster( alias, "sounddone" ); + } + else + { + org PlaySound( alias, "sounddone" ); + } + org waittill( "sounddone" ); + if( IsDefined( org ) ) + { + org Delete(); + } +} +spawn_failed( spawn ) +{ + if ( IsDefined(spawn) && IsAlive(spawn) ) + { + if ( !IsDefined(spawn.finished_spawning) ) + { + spawn waittill("finished spawning"); + } + waittillframeend; + if ( IsAlive(spawn) ) + { + return false; + } + } + return true; +} +spawn_setcharacter( data ) +{ + codescripts\character::precache( data ); + self waittill( "spawned", spawn ); + if( maps\_utility::spawn_failed( spawn ) ) + { + return; + } + println( "Size is ", data[ "attach" ].size ); + spawn codescripts\character::new(); + spawn codescripts\character::load( data ); +} +assign_animtree(animname) +{ + if( IsDefined( animname ) ) + { + self.animname = animname; + } + assertEx( IsDefined( level.scr_animtree[ self.animname ] ), "There is no level.scr_animtree for animname " + self.animname ); + animtree = level.scr_animtree[ self.animname ]; + self UseAnimTree(animtree); +} +assign_model(animname) +{ + if (!IsDefined(animname)) + { + animname = self.animname; + } + assertEx( IsDefined( level.scr_model[ animname ] ), "There is no level.scr_model for animname " + animname ); + self SetModel( level.scr_model[ animname ] ); +} +spawn_anim_model( animname, origin, angles, is_simple_prop ) +{ + if ( !IsDefined( origin ) ) + { + origin = ( 0, 0, 0 ); + } + model = spawn( "script_model", origin ); + model assign_model(animname); + model init_anim_model(animname, is_simple_prop); + if(!isDefined(angles)) + { + angles = (0,0,0); + } + model.angles = angles; + return model; +} +init_anim_model(animname, is_simple_prop) +{ + if (!IsDefined(animname)) + { + animname = self.animname; + } + AssertEx(IsDefined(animname), "Trying to init anim model with no animname."); + self.animname = animname; + if (is_true(is_simple_prop)) + { + if (!IsDefined(self.anim_link)) + { + self.anim_link = Spawn("script_model", self.origin); + self.anim_link SetModel("tag_origin_animate"); + level thread delete_anim_link_on_death(self, self.anim_link); + } + self.anim_link.animname = animname; + self.anim_link assign_animtree(); + self Unlink(); + self.anim_link.angles = self.angles; + self.anim_link.origin = self.origin; + self LinkTo(self.anim_link, "origin_animate_jnt"); + } + else + { + self assign_animtree(); + } +} +delete_anim_link_on_death(ent, anim_link) +{ + anim_link endon("death"); + ent waittill("death"); + anim_link Delete(); +} +triggerOff() +{ + if (!isdefined (self.realOrigin)) + { + self.realOrigin = self.origin; + } + if (self.origin == self.realorigin) + { + self.origin += (0, 0, -10000); + } +} +triggerOn() +{ + if (isDefined (self.realOrigin) ) + { + self.origin = self.realOrigin; + } +} +trigger_use( strName, strKey, ent ) +{ + if( !IsDefined( strKey ) ) + { + strKey = "targetname"; + } + if( !IsDefined( ent ) ) + { + ent = get_players()[0]; + } + eTrigger = GetEnt( strName, strKey ); + if( !IsDefined( eTrigger ) ) + { + assertmsg( "trigger not found: " + strName + " key: " + strKey ); + return; + } + eTrigger UseBy( ent ); + level notify( strName, ent ); + return eTrigger; +} +set_flag_on_notify( notifyStr, strFlag ) +{ + if( !level.flag[ strFlag ] ) + { + self waittill( notifyStr ); + flag_set( strFlag ); + } +} +set_flag_on_trigger( eTrigger, strFlag ) +{ + if( !level.flag[ strFlag ] ) + { + eTrigger waittill( "trigger", eOther ); + flag_set( strFlag ); + return eOther; + } +} +set_flag_on_targetname_trigger( msg ) +{ + assert( IsDefined( level.flag[ msg ] ) ); + if( flag( msg ) ) + { + return; + } + trigger = GetEnt( msg, "targetname" ); + trigger waittill( "trigger" ); + flag_set( msg ); +} +waittill_dead( guys, num, timeoutLength ) +{ + allAlive = true; + for( i = 0;i < guys.size;i++ ) + { + if( isalive( guys[ i ] ) ) + { + continue; + } + allAlive = false; + break; + } + assertex( allAlive, "Waittill_Dead was called with dead or removed AI in the array, meaning it will never pass." ); + if( !allAlive ) + { + newArray = []; + for( i = 0;i < guys.size;i++ ) + { + if( isalive( guys[ i ] ) ) + { + newArray[ newArray.size ] = guys[ i ]; + } + } + guys = newArray; + } + ent = SpawnStruct(); + if( IsDefined( timeoutLength ) ) + { + ent endon( "thread_timed_out" ); + ent thread waittill_dead_timeout( timeoutLength ); + } + ent.count = guys.size; + if( IsDefined( num ) && num < ent.count ) + { + ent.count = num; + } + array_thread( guys, ::waittill_dead_thread, ent ); + while( ent.count > 0 ) + { + ent waittill( "waittill_dead guy died" ); + } +} +waittill_dead_or_dying( guys, num, timeoutLength ) +{ + newArray = []; + for( i = 0;i < guys.size;i++ ) + { + if( isalive( guys[ i ] ) && !guys[ i ].ignoreForFixedNodeSafeCheck ) + { + newArray[ newArray.size ] = guys[ i ]; + } + } + guys = newArray; + ent = spawnStruct(); + if( IsDefined( timeoutLength ) ) + { + ent endon( "thread_timed_out" ); + ent thread waittill_dead_timeout( timeoutLength ); + } + ent.count = guys.size; + if( IsDefined( num ) && num < ent.count ) + { + ent.count = num; + } + array_thread( guys, ::waittill_dead_or_dying_thread, ent ); + while( ent.count > 0 ) + { + ent waittill( "waittill_dead_guy_dead_or_dying" ); + } +} +waittill_dead_thread( ent ) +{ + self waittill( "death" ); + ent.count-- ; + ent notify( "waittill_dead guy died" ); +} +waittill_dead_or_dying_thread( ent ) +{ + self waittill_either( "death", "pain_death" ); + ent.count-- ; + ent notify( "waittill_dead_guy_dead_or_dying" ); +} +waittill_dead_timeout( timeoutLength ) +{ + wait( timeoutLength ); + self notify( "thread_timed_out" ); +} +set_ai_group_cleared_count(aigroup, count) +{ + maps\_spawner::aigroup_init(aigroup); + level._ai_group[aigroup].cleared_count = count; +} +waittill_ai_group_cleared( aigroup ) +{ + AssertEx(IsDefined(level._ai_group[aigroup]), "The aigroup "+aigroup+" does not exist"); + flag_wait(aigroup + "_cleared"); +} +waittill_ai_group_count( aigroup, count ) +{ + while( level._ai_group[ aigroup ].spawnercount + level._ai_group[ aigroup ].aicount > count ) + { + wait( 0.25 ); + } +} +waittill_ai_group_ai_count( aigroup, count ) +{ + while( level._ai_group[ aigroup ].aicount > count ) + { + wait( 0.25 ); + } +} +waittill_ai_group_spawner_count( aigroup, count ) +{ + while( level._ai_group[ aigroup ].spawnercount > count ) + { + wait( 0.25 ); + } +} +waittill_ai_group_amount_killed( aigroup, amount_killed ) +{ + while( level._ai_group[ aigroup ].killed_count < amount_killed ) + { + wait( 0.25 ); + } +} +get_ai_group_count( aigroup ) +{ + return( level._ai_group[ aigroup ].spawnercount + level._ai_group[ aigroup ].aicount ); +} +get_ai_group_sentient_count( aigroup ) +{ + return( level._ai_group[ aigroup ].aicount ); +} +get_ai_group_ai( aigroup ) +{ + aiSet = []; + for( index = 0; index < level._ai_group[ aigroup ].ai.size; index ++ ) + { + if( !isAlive( level._ai_group[ aigroup ].ai[ index ] ) ) + { + continue; + } + aiSet[ aiSet.size ] = level._ai_group[ aigroup ].ai[ index ]; + } + return( aiSet ); +} +get_ai( name, type ) +{ + array = get_ai_array( name, type ); + if( array.size > 1 ) + { + assertMsg( "get_ai used for more than one living ai of type " + type + " called " + name + "." ); + return undefined; + } + return array[0]; +} +get_ai_array(name, type) +{ + ai = GetAIArray(); + if (!IsDefined(type)) + { + type = "script_noteworthy"; + } + array = []; + for(i=0; i 1 ) + { + assertMsg( "get_aispecies used for more than one living ai of type " + type + " called " + name + "." ); + return undefined; + } + return array[0]; +} +get_aispecies_array(name, type, breed) +{ + if( !IsDefined( breed ) ) + { + breed = "all"; + } + ai = getaispeciesarray("allies", breed); + ai = array_combine(ai, getaispeciesarray("axis", breed) ); + array = []; + for(i=0; i= 4 ) + { + nextpoint = 0; + } + line( arrow[ p ], arrow[ nextpoint ], color, 1.0 ); + } +} +battlechatter_off( team ) +{ + maps\_dds::dds_disable( team ); + return; +} +battlechatter_on( team ) +{ + maps\_dds::dds_enable( team ); + return; +} +dds_set_player_character_name( hero_name ) +{ + if( !IsPlayer( self ) ) + { + PrintLn( "dds 'dds_set_player_character_name' function was not called on a player. No changes made." ); + return; + } + switch( hero_name ) + { + case "mason": + case "hudson": + case "reznov": + level.dds.player_character_name = GetSubStr( hero_name, 0, 3 ); + PrintLn( "dds setting player name to '" + level.dds.player_character_name + "'" ); + break; + default: + printLn( "dds: '" + hero_name + "' not a valid player name; setting to 'mason' (mas)" ); + level.dds.player_character_name = "mas"; + break; + } + self.dds_characterID = level.dds.player_character_name; +} +dds_exclude_this_ai() +{ + if( IsAI( self ) && IsAlive( self ) ) + { + self.dds_characterID = undefined; + } + else + { + PrintLn( "Tried to mark an entity for DDS removal that was not an AI or not alive." ); + } +} +debugorigin() +{ + self notify( "Debug origin" ); + self endon( "Debug origin" ); + self endon( "death" ); + for( ;; ) + { + forward = AnglesToForward( self.angles ); + forwardFar = vector_scale( forward, 30 ); + forwardClose = vector_scale( forward, 20 ); + right = AnglesToRight( self.angles ); + left = vector_scale( right, -10 ); + right = vector_scale( right, 10 ); + line( self.origin, self.origin + forwardFar, ( 0.9, 0.7, 0.6 ), 0.9 ); + line( self.origin + forwardFar, self.origin + forwardClose + right, ( 0.9, 0.7, 0.6 ), 0.9 ); + line( self.origin + forwardFar, self.origin + forwardClose + left, ( 0.9, 0.7, 0.6 ), 0.9 ); + wait( 0.05 ); + } +} +get_links() +{ + return Strtok( self.script_linkTo, " " ); +} +get_linked_ents() +{ + array = []; + if ( IsDefined( self.script_linkto ) ) + { + linknames = get_links(); + for ( i = 0; i < linknames.size; i++ ) + { + ent = getent( linknames[ i ], "script_linkname" ); + if ( IsDefined( ent ) ) + { + array[ array.size ] = ent; + } + } + } + return array; +} +get_linked_structs() +{ + array = []; + if ( IsDefined( self.script_linkto ) ) + { + linknames = get_links(); + for ( i = 0; i < linknames.size; i++ ) + { + ent = getstruct( linknames[ i ], "script_linkname" ); + if ( IsDefined( ent ) ) + { + array[ array.size ] = ent; + } + } + } + return array; +} +get_last_ent_in_chain( sEntityType ) +{ + ePathpoint = self; + while ( IsDefined(ePathpoint.target) ) + { + wait (0.05); + if ( IsDefined( ePathpoint.target ) ) + { + switch ( sEntityType ) + { + case "vehiclenode": + ePathpoint = getvehiclenode( ePathpoint.target, "targetname" ); + break; + case "pathnode": + ePathpoint = getnode( ePathpoint.target, "targetname" ); + break; + case "ent": + ePathpoint = getent( ePathpoint.target, "targetname" ); + break; + default: + assertmsg("sEntityType needs to be 'vehiclenode', 'pathnode' or 'ent'"); + } + } + else + { + break; + } + } + ePathend = ePathpoint; + return ePathend; +} +timeout( timeout ) +{ + self endon( "death" ); + wait( timeout ); + self notify( "timeout" ); +} +set_forcegoal() +{ + if( IsDefined( self.set_forcedgoal ) ) + { + return; + } + self.oldfightdist = self.pathenemyfightdist; + self.oldmaxdist = self.pathenemylookahead; + self.oldmaxsight = self.maxsightdistsqrd; + self.pathenemyfightdist = 8; + self.pathenemylookahead = 8; + self.maxsightdistsqrd = 1; + self.set_forcedgoal = true; +} +unset_forcegoal() +{ + if( !IsDefined( self.set_forcedgoal ) ) + { + return; + } + self.pathenemyfightdist = self.oldfightdist; + self.pathenemylookahead = self.oldmaxdist; + self.maxsightdistsqrd = self.oldmaxsight; + self.set_forcedgoal = undefined; +} +array_removeDead_keepkeys( array ) +{ + newArray = []; + keys = getarraykeys( array ); + for( i = 0; i < keys.size; i++ ) + { + key = keys[ i ]; + if( !isalive( array[ key ] ) ) + { + continue; + } + newArray[ key ] = array[ key ]; + } + return newArray; +} +array_removeDead( array ) +{ + newArray = []; + if( !IsDefined( array ) ) + { + return undefined; + } + for( i = 0; i < array.size; i++ ) + { + if( !isalive( array[ i ] ) || ( isDefined( array[i].isacorpse) && array[i].isacorpse) ) + { + continue; + } + newArray[ newArray.size ] = array[ i ]; + } + return newArray; +} +struct_arraySpawn() +{ + struct = SpawnStruct(); + struct.array = []; + struct.lastindex = 0; + return struct; +} +structarray_add( struct, object ) +{ + assert( !IsDefined( object.struct_array_index ) ); + struct.array[ struct.lastindex ] = object; + object.struct_array_index = struct.lastindex; + struct.lastindex ++ ; +} +structarray_remove( struct, object ) +{ + structarray_swaptolast( struct, object ); + struct.array[ struct.lastindex - 1 ] = undefined; + struct.lastindex -- ; +} +structarray_swaptolast( struct, object ) +{ + struct structarray_swap( struct.array[ struct.lastindex - 1 ], object ); +} +structarray_shuffle( struct, shuffle ) +{ + for( i = 0;i < shuffle;i++ ) + { + struct structarray_swap( struct.array[ i ], struct.array[ randomint( struct.lastindex ) ] ); + } +} +custom_battlechatter( string ) +{ + excluders = []; + excluders[ 0 ] = self; + buddy = get_closest_ai_exclude( self.origin, self.team, excluders ); + if( IsDefined( buddy ) && Distance( buddy.origin, self.origin ) > 384 ) + { + buddy = undefined; + } + self animscripts\battlechatter_ai::beginCustomEvent(); + tokens = Strtok( string, "_" ); + if( !tokens.size ) + { + return; + } + if( tokens[ 0 ] == "move" ) + { + if( tokens.size > 1 ) + { + modifier = tokens[ 1 ]; + } + else + { + modifier = "generic"; + } + self animscripts\battlechatter_ai::addGenericAliasEx( "order", "move", modifier ); + } + else if( tokens[ 0 ] == "infantry" ) + { + self animscripts\battlechatter_ai::addGenericAliasEx( "threat", "infantry", tokens[ 1 ] ); + if( tokens.size > 2 && tokens[ 2 ] != "inbound" ) + { + self animscripts\battlechatter_ai::addGenericAliasEx( "direction", "relative", tokens[ 2 ] ); + } + else if( tokens.size > 2 ) + { + self animscripts\battlechatter_ai::addGenericAliasEx( "direction", "inbound", tokens[ 3 ] ); + } + } + else if( tokens[ 0 ] == "vehicle" ) + { + self animscripts\battlechatter_ai::addGenericAliasEx( "threat", "vehicle", tokens[ 1 ] ); + if( tokens.size > 2 && tokens[ 2 ] != "inbound" ) + { + self animscripts\battlechatter_ai::addGenericAliasEx( "direction", "relative", tokens[ 2 ] ); + } + else if( tokens.size > 2 ) + { + self animscripts\battlechatter_ai::addGenericAliasEx( "direction", "inbound", tokens[ 3 ] ); + } + } + self animscripts\battlechatter_ai::endCustomEvent( 2000 ); +} +buildbcalias( action, type, modifier ) +{ + if( IsDefined( modifier ) ) + { + return( self.countryID + "_" + self.npcID + "_" + action + "_" + type + "_" + modifier ); + } + else + { + return( self.countryID + "_" + self.npcID + "_" + action + "_" + type ); + } +} +get_stop_watch( time, othertime ) +{ + watch = NewHudElem(); + if( level.console ) + { + watch.x = 68; + watch.y = 35; + } + else + { + watch.x = 58; + watch.y = 95; + } + watch.alignx = "center"; + watch.aligny = "middle"; + watch.horzAlign = "left"; + watch.vertAlign = "middle"; + if( IsDefined( othertime ) ) + { + timer = othertime; + } + else + { + timer = level.explosiveplanttime; + } + watch setClock( timer, time, "hudStopwatch", 64, 64 ); + return watch; +} +missionfailedwrapper( fail_hint, shader, iWidth, iHeight, fDelay, x, y ) +{ + if( level.missionfailed ) + { + return; + } + if ( IsDefined( level.nextmission ) ) + { + return; + } + if ( GetDvar( #"failure_disabled" ) == "1" ) + { + return; + } + screen_message_delete(); + if( IsDefined( fail_hint ) ) + { + SetDvar( "ui_deadquote", fail_hint ); + } + if( IsDefined( shader ) ) + { + get_players()[0] thread maps\_load_common::special_death_indicator_hudelement( shader, iWidth, iHeight, fDelay, x, y ); + } + level.missionfailed = true; + flag_set( "missionfailed" ); + MissionFailed(); +} +nextmission() +{ + maps\_endmission::_nextmission(); +} +prefetchnext() +{ + maps\_endmission::prefetch_next(); +} +script_delay() +{ + if( IsDefined( self.script_delay ) ) + { + wait( self.script_delay ); + return true; + } + else if( IsDefined( self.script_delay_min ) && IsDefined( self.script_delay_max ) ) + { + wait( RandomFloatrange( self.script_delay_min, self.script_delay_max ) ); + return true; + } + return false; +} +script_wait( called_from_spawner ) +{ + if (!IsDefined(called_from_spawner)) + { + called_from_spawner = false; + } + coop_scalar = 1; + if ( called_from_spawner ) + { + players = get_players(); + if (players.size == 2) + { + coop_scalar = 0.7; + } + else if (players.size == 3) + { + coop_scalar = 0.4; + } + else if (players.size == 4) + { + coop_scalar = 0.1; + } + } + startTime = GetTime(); + if( IsDefined( self.script_wait ) ) + { + wait( self.script_wait * coop_scalar); + if( IsDefined( self.script_wait_add ) ) + { + self.script_wait += self.script_wait_add; + } + } + else if( IsDefined( self.script_wait_min ) && IsDefined( self.script_wait_max ) ) + { + wait( RandomFloatrange( self.script_wait_min, self.script_wait_max ) * coop_scalar); + if( IsDefined( self.script_wait_add ) ) + { + self.script_wait_min += self.script_wait_add; + self.script_wait_max += self.script_wait_add; + } + } + return( GetTime() - startTime ); +} +enter_vehicle( vehicle, tag ) +{ + self maps\_vehicle_aianim::vehicle_enter( vehicle, tag ); +} +guy_array_enter_vehicle( guy, vehicle ) +{ + maps\_vehicle_aianim::guy_array_enter( guy, vehicle ); +} +run_to_vehicle_load(vehicle, bGodDriver, seat_tag) +{ + self maps\_vehicle_aianim::run_to_vehicle( vehicle, bGodDriver, seat_tag ); +} +vehicle_unload(delay) +{ + self maps\_vehicle::do_unload(delay); +} +vehicle_override_anim(action, tag, animation) +{ + self maps\_vehicle_aianim::override_anim(action, tag, animation); +} +set_wait_for_players(seat_tag, player_array) +{ + vehicleanim = level.vehicle_aianims[ self.vehicletype ]; + for(i = 0; i < vehicleanim.size; i++) + { + if(vehicleanim[i].sittag == seat_tag) + { + vehicleanim[i].wait_for_player = []; + for(j = 0; j < player_array.size; j++) + { + vehicleanim[i].wait_for_player[j] = player_array[j]; + } + break; + } + } +} +set_wait_for_notify(seat_tag, custom_notify) +{ + vehicleanim = level.vehicle_aianims[ self.vehicletype ]; + for(i = 0; i < vehicleanim.size; i++) + { + if(vehicleanim[i].sittag == seat_tag) + { + vehicleanim[i].wait_for_notify = custom_notify; + break; + } + } +} +is_on_vehicle(vehicle) +{ + if(!IsDefined(self.viewlockedentity)) + { + return false; + } + else if(self.viewlockedentity == vehicle) + { + return true; + } + if(!IsDefined(self.groundentity)) + { + return false; + } + else if(self.groundentity == vehicle) + { + return true; + } + return false; +} +get_force_color_guys( team, color ) +{ + ai = GetAiArray( team ); + guys = []; + for( i = 0; i < ai.size; i++ ) + { + guy = ai[ i ]; + if( !IsDefined( guy.script_forceColor ) ) + { + continue; + } + if( guy.script_forceColor != color ) + { + continue; + } + guys[ guys.size ] = guy; + } + return guys; +} +get_all_force_color_friendlies() +{ + ai = GetAiArray( "allies" ); + guys = []; + for( i = 0; i < ai.size; i++ ) + { + guy = ai[ i ]; + if( !IsDefined( guy.script_forceColor ) ) + { + continue; + } + guys[ guys.size ] = guy; + } + return guys; +} +enable_ai_color() +{ + if( IsDefined( self.script_forceColor ) ) + { + return; + } + if( !IsDefined( self.old_forceColor ) ) + { + return; + } + set_force_color( self.old_forcecolor ); + self.old_forceColor = undefined; +} +disable_ai_color() +{ + if( IsDefined( self.new_force_color_being_set ) ) + { + self endon( "death" ); + self waittill( "done_setting_new_color" ); + } + self clearFixedNodeSafeVolume(); + if( !IsDefined( self.script_forceColor ) ) + { + return; + } + assertEx( !IsDefined( self.old_forcecolor ), "Tried to disable forcecolor on a guy that somehow had a old_forcecolor already. Investigate!!!" ); + self.old_forceColor = self.script_forceColor; + level.arrays_of_colorForced_ai[ self.team ][ self.script_forcecolor ] = array_remove( level.arrays_of_colorForced_ai[ self.team ][ self.script_forcecolor ], self ); + maps\_colors::left_color_node(); + self.script_forceColor = undefined; + self.currentColorCode = undefined; +} +clear_force_color() +{ + disable_ai_color(); +} +check_force_color( _color ) +{ + color = level.colorCheckList[ tolower( _color ) ]; + if( IsDefined( self.script_forcecolor ) && color == self.script_forcecolor ) + { + return true; + } + else + { + return false; + } +} +get_force_color() +{ + color = self.script_forceColor; + return color; +} +shortenColor( color ) +{ + assertEx( IsDefined( level.colorCheckList[ tolower( color ) ] ), "Tried to set force color on an undefined color: " + color ); + return level.colorCheckList[ tolower( color ) ]; +} +set_force_color( _color ) +{ + color = shortenColor( _color ); + assertEx( maps\_colors::colorIsLegit( color ), "Tried to set force color on an undefined color: " + color ); + if( !isAI( self ) ) + { + set_force_color_spawner( color ); + return; + } + assertEx( isalive( self ), "Tried to set force color on a dead / undefined entity." ); + if( self.team == "allies" ) + { + self.fixedNode = true; + self.fixedNodeSafeRadius = 64; + self.pathEnemyFightDist = 0; + self.pathEnemyLookAhead = 0; + } + self.script_color_axis = undefined; + self.script_color_allies = undefined; + self.old_forcecolor = undefined; + if( IsDefined( self.script_forcecolor ) ) + { + level.arrays_of_colorForced_ai[ self.team ][ self.script_forcecolor ] = array_remove( level.arrays_of_colorForced_ai[ self.team ][ self.script_forcecolor ], self ); + } + self.script_forceColor = color; + level.arrays_of_colorForced_ai[ self.team ][ self.script_forceColor ] = array_add( level.arrays_of_colorForced_ai[ self.team ][ self.script_forceColor ], self ); + thread new_color_being_set( color ); +} +set_force_color_spawner( color ) +{ + self.script_forceColor = color; + self.old_forceColor = undefined; +} +issue_color_orders( color_team, team ) +{ + colorCodes = Strtok( color_team, " " ); + colors = []; + colorCodesByColorIndex = []; + for( i = 0;i < colorCodes.size;i++ ) + { + color = undefined; + if( issubstr( colorCodes[ i ], "r" ) ) + { + color = "r"; + } + else if( issubstr( colorCodes[ i ], "b" ) ) + { + color = "b"; + } + else if( issubstr( colorCodes[ i ], "y" ) ) + { + color = "y"; + } + else if( issubstr( colorCodes[ i ], "c" ) ) + { + color = "c"; + } + else if( issubstr( colorCodes[ i ], "g" ) ) + { + color = "g"; + } + else if( issubstr( colorCodes[ i ], "p" ) ) + { + color = "p"; + } + else if( issubstr( colorCodes[ i ], "o" ) ) + { + color = "o"; + } + else + { + assertEx( 0, "Trigger at origin " + self getorigin() + " had strange color index " + colorCodes[ i ] ); + } + colorCodesByColorIndex[ color ] = colorCodes[ i ]; + colors[ colors.size ] = color; + } + assert( colors.size == colorCodes.size ); + for( i = 0;i < colorCodes.size;i++ ) + { + level.arrays_of_colorCoded_spawners[ team ][ colorCodes[ i ] ] = array_removeUndefined( level.arrays_of_colorCoded_spawners[ team ][ colorCodes[ i ] ] ); + assertex( IsDefined( level.arrays_of_colorCoded_spawners[ team ][ colorCodes[ i ] ] ), "Trigger refer to a color# that does not exist in any node for this team." ); + for( p = 0;p < level.arrays_of_colorCoded_spawners[ team ][ colorCodes[ i ] ].size;p ++ ) + { + level.arrays_of_colorCoded_spawners[ team ][ colorCodes[ i ] ][ p ].currentColorCode = colorCodes[ i ]; + } + } + for( i = 0;i < colors.size;i++ ) + { + level.arrays_of_colorForced_ai[ team ][ colors[ i ] ] = array_removeDead( level.arrays_of_colorForced_ai[ team ][ colors[ i ] ] ); + level.currentColorForced[ team ][ colors[ i ] ] = colorCodesByColorIndex[ colors[ i ] ]; + } + for( i = 0;i < colorCodes.size;i++ ) + { + ai_array = []; + ai_array = maps\_colors::issue_leave_node_order_to_ai_and_get_ai( colorCodes[ i ], colors[ i ], team ); + maps\_colors::issue_color_order_to_ai( colorCodes[ i ], colors[ i ], team, ai_array ); + } +} +disable_replace_on_death() +{ + self.replace_on_death = undefined; + self notify( "_disable_reinforcement" ); +} +createLoopEffect( fxid ) +{ + ent = maps\_createfx::createEffect( "loopfx", fxid ); + ent.v[ "delay" ] = 0.5; + return ent; +} +createOneshotEffect( fxid ) +{ + ent = maps\_createfx::createEffect( "oneshotfx", fxid ); + ent.v[ "delay" ] = -15; + return ent; +} +reportExploderIds() +{ + if(!IsDefined(level._exploder_ids)) + { + return; + } + keys = GetArrayKeys( level._exploder_ids ); + println("Server Exploder dictionary : "); + for( i = 0; i < keys.size; i++ ) + { + println(keys[i] + " : " + level._exploder_ids[keys[i]]); + } +} +getExploderId( ent ) +{ + if(!IsDefined(level._exploder_ids)) + { + level._exploder_ids = []; + level._exploder_id = 1; + } + if(!IsDefined(level._exploder_ids[ent.v["exploder"]])) + { + level._exploder_ids[ent.v["exploder"]] = level._exploder_id; + level._exploder_id ++; + } + return level._exploder_ids[ent.v["exploder"]]; +} +createExploder( fxid ) +{ + ent = maps\_createfx::createEffect( "exploder", fxid ); + ent.v[ "delay" ] = 0; + ent.v[ "exploder_type" ] = "normal"; + return ent; +} +vehicle_detachfrompath() +{ + maps\_vehicle::vehicle_pathDetach(); +} +vehicle_resumepath() +{ + thread maps\_vehicle::vehicle_resumepathvehicle(); +} +vehicle_land() +{ + maps\_vehicle::vehicle_landvehicle(); +} +vehicle_liftoff( height ) +{ + maps\_vehicle::vehicle_liftoffvehicle( height ); +} +vehicle_dynamicpath( node, bwaitforstart ) +{ + maps\_vehicle::vehicle_paths( node, bwaitforstart ); +} +groundpos( origin ) +{ + return bullettrace( origin, ( origin + ( 0, 0, -100000 ) ), 0, self )[ "position" ]; +} +playergroundpos(origin) +{ + return playerphysicstrace(origin, ( origin + ( 0, 0, -100000 ) )); +} +getvehiclespawner( targetname ) +{ + spawner = getent( targetname + "_vehiclespawner", "targetname" ); + return spawner; +} +getvehiclespawnerarray( targetname ) +{ + spawner = getentarray( targetname + "_vehiclespawner", "targetname" ); + return spawner; +} +player_fudge_moveto( dest, moverate ) +{ + if( !IsDefined( moverate ) ) + { + moverate = 200; + } + org = Spawn( "script_origin", self.origin ); + org.angles = self.angles; + self LinkTo( org ); + dist = Distance( self.origin, dest ); + movetime = dist/moverate; + org MoveTo( dest, dist/moverate, .05, .05 ); + wait( movetime ); + self UnLink(); + org Delete(); +} +add_start( msg, func, loc_string ) +{ + assertex( !IsDefined( level._loadStarted ), "Can't create starts after _load" ); + if( !IsDefined( level.start_functions ) ) + { + level.start_functions = []; + } + msg = tolower( msg ); + level.start_functions[ msg ] = func; + if( IsDefined(loc_string) ) + { + precachestring(loc_string); + level.start_loc_string[ msg ] = loc_string; + } + else + { + level.start_loc_string[ msg ] = &"MISSING_LOC_STRING"; + } +} +default_start( func, bSplash ) +{ + level.default_start = func; +} +start_teleport_players( start_name, coop_sort ) +{ + players = get_players(); + if( IsDefined( coop_sort ) && coop_sort ) + { + starts = get_sorted_starts( start_name ); + } + else + { + starts = getstructarray( start_name, "targetname" ); + } + assertex( starts.size >= players.size, "Need more start positions for players!" ); + for (i = 0; i < players.size; i++) + { + players[i] setOrigin( starts[i].origin ); + if( IsDefined( starts[i].angles ) ) + { + players[i] setPlayerAngles( starts[i].angles ); + } + } + set_breadcrumbs(starts); +} +get_sorted_starts( start_name ) +{ + player_starts = getstructarray( start_name, "targetname" ); + for( i = 0; i < player_starts.size; i++ ) + { + for( j = i; j < player_starts.size; j++ ) + { + assertex( IsDefined( player_starts[j].script_int ), "start at: " + player_starts[j].origin + " must have a script_int set for coop spawning" ); + assertex( IsDefined( player_starts[i].script_int ), "start at: " + player_starts[i].origin + " must have a script_int set for coop spawning" ); + if( player_starts[j].script_int < player_starts[i].script_int ) + { + temp = player_starts[i]; + player_starts[i] = player_starts[j]; + player_starts[j] = temp; + } + } + } + return player_starts; +} +start_teleport_ai( start_name, ai_names ) +{ + friendly_ai = get_ai_array( ai_names, "script_noteworthy" ); + ai_starts = getstructarray( start_name + "_ai", "targetname"); + assertex( ai_starts.size >= friendly_ai.size, "Need more start positions for ai!" ); + for (i = 0; i < friendly_ai.size; i++) + { + start_i = 0; + if (IsDefined(friendly_ai[i].script_int)) + { + for (j = 0; j < ai_starts.size; j++) + { + if (IsDefined(ai_starts[j].script_int)) + { + if (ai_starts[j].script_int == friendly_ai[i].script_int) + { + start_i = j; + break; + } + } + } + } + friendly_ai[i] start_teleport_single_ai(ai_starts[start_i]); + ai_starts = array_remove(ai_starts, ai_starts[start_i]); + } +} +start_teleport_single_ai(ai_start) +{ + if( IsDefined( ai_start.angles ) ) + { + self forceteleport( ai_start.origin, ai_start.angles ); + } + else + { + self forceteleport( ai_start.origin ); + } + if (IsDefined(ai_start.target)) + { + node = GetNode(ai_start.target, "targetname"); + if (IsDefined(node)) + { + self SetGoalNode(node); + return; + } + } + self SetGoalPos(ai_start.origin); +} +start_teleport( start_name, ai_names, coop_sort ) +{ + if( IsDefined( ai_names ) ) + { + start_teleport_ai( start_name, ai_names ); + } + start_teleport_players( start_name, coop_sort ); +} +within_fov( start_origin, start_angles, end_origin, fov ) +{ + normal = VectorNormalize( end_origin - start_origin ); + forward = AnglesToForward( start_angles ); + dot = VectorDot( forward, normal ); + return dot >= fov; +} +wait_for_buffer_time_to_pass( last_queue_time, buffer_time ) +{ + timer = buffer_time * 1000 - ( gettime() - last_queue_time ); + timer *= 0.001; + if ( timer > 0 ) + { + wait( timer ); + } +} +dialogue_queue( msg ) +{ + self maps\_anim::anim_single_queue( self, msg ); +} +hint_position_internal( bgAlpha ) +{ + if( level.console ) + { + self.elm.fontScale = 2; + } + else + { + self.elm.fontScale = 1.6; + } + self.elm.x = 0; + self.elm.y = -40; + self.elm.alignX = "center"; + self.elm.alignY = "bottom"; + self.elm.horzAlign = "center"; + self.elm.vertAlign = "middle"; + self.elm.sort = 1; + self.elm.alpha = 0.8; + if( !IsDefined( self.bg ) ) + { + return; + } + self.bg.x = 0; + self.bg.y = -40; + self.bg.alignX = "center"; + self.bg.alignY = "middle"; + self.bg.horzAlign = "center"; + self.bg.vertAlign = "middle"; + self.bg.sort = -1; + if( level.console ) + { + self.bg SetShader( "popmenu_bg", 650, 52 ); + } + else + { + self.bg SetShader( "popmenu_bg", 650, 42 ); + } + if ( !IsDefined( bgAlpha ) ) + { + bgAlpha = 0.5; + } + self.bg.alpha = bgAlpha; +} +string( num ) +{ + return( "" + num ); +} +clear_threatbias( group1, group2 ) +{ + SetThreatBias( group1, group2, 0 ); + SetThreatBias( group2, group1, 0 ); +} +add_global_spawn_function( team, function, param1, param2, param3 ) +{ + assertEx( IsDefined( level.spawn_funcs ), "Tried to add_global_spawn_function before calling _load" ); + func = []; + func[ "function" ] = function; + func[ "param1" ] = param1; + func[ "param2" ] = param2; + func[ "param3" ] = param3; + level.spawn_funcs[ team ][ level.spawn_funcs[ team ].size ] = func; +} +remove_global_spawn_function( team, function ) +{ + assertEx( IsDefined( level.spawn_funcs ), "Tried to remove_global_spawn_function before calling _load" ); + array = []; + for( i = 0; i < level.spawn_funcs[ team ].size; i++ ) + { + if( level.spawn_funcs[ team ][ i ][ "function" ] != function ) + { + array[ array.size ] = level.spawn_funcs[ team ][ i ]; + } + } + assertEx( level.spawn_funcs[ team ].size != array.size, "Tried to remove a function from level.spawn_funcs, but that function didn't exist!" ); + level.spawn_funcs[ team ] = array; +} +add_spawn_function( function, param1, param2, param3, param4 ) +{ + AssertEx( !IsDefined( level._loadStarted ) || !IsAlive( self ), "Tried to add_spawn_function to a living guy." ); + func = []; + func[ "function" ] = function; + func[ "param1" ] = param1; + func[ "param2" ] = param2; + func[ "param3" ] = param3; + func[ "param4" ] = param4; + if (!IsDefined(self.spawn_funcs)) + { + self.spawn_funcs = []; + } + self.spawn_funcs[ self.spawn_funcs.size ] = func; +} +add_spawn_function_veh( veh_targetname, function, param1, param2, param3, param4 ) +{ + assertEx( IsDefined(level.vehicleSpawners), "Tried to add_spawn_function_veh before vehicle spawners were inited"); + func = []; + func[ "function" ] = function; + func[ "param1" ] = param1; + func[ "param2" ] = param2; + func[ "param3" ] = param3; + func[ "param4" ] = param4; + func_count_added = 0; + for( i = 0; func_count_added < level.vehicleSpawners.size; i++ ) + { + if(!IsDefined(level.vehicleSpawners[i])) + { + continue; + } + else + { + for( j = 0; j < level.vehicleSpawners[i].size; j++ ) + { + if( IsDefined(level.vehicleSpawners[i][j].targetname) && level.vehicleSpawners[i][j].targetname == veh_targetname + "_vehiclespawner" ) + { + if(!IsDefined( level.vehicleSpawners[i][j].spawn_funcs )) + { + level.vehicleSpawners[i][j].spawn_funcs = []; + } + level.vehicleSpawners[i][j].spawn_funcs[ level.vehicleSpawners[i][j].spawn_funcs.size ] = func; + } + } + func_count_added++; + } + } +} +add_spawn_function_veh_by_type( veh_type, function, param1, param2, param3, param4 ) +{ + assertEx( IsDefined(level.vehicleSpawners), "Tried to add_spawn_function_veh_by_type before vehicle spawners were inited"); + func = []; + func[ "function" ] = function; + func[ "param1" ] = param1; + func[ "param2" ] = param2; + func[ "param3" ] = param3; + func[ "param4" ] = param4; + func_count_added = 0; + for( i = 0; func_count_added < level.vehicleSpawners.size; i++ ) + { + if(!IsDefined(level.vehicleSpawners[i])) + { + continue; + } + else + { + for( j = 0; j < level.vehicleSpawners[i].size; j++ ) + { + if( IsDefined(level.vehicleSpawners[i][j].vehicletype) && level.vehicleSpawners[i][j].vehicletype == veh_type ) + { + if(!IsDefined( level.vehicleSpawners[i][j].spawn_funcs )) + { + level.vehicleSpawners[i][j].spawn_funcs = []; + } + level.vehicleSpawners[i][j].spawn_funcs[ level.vehicleSpawners[i][j].spawn_funcs.size ] = func; + } + } + func_count_added++; + } + } +} +ignore_triggers( timer ) +{ + self endon( "death" ); + self.ignoreTriggers = true; + if( IsDefined( timer ) ) + { + wait( timer ); + } + else + { + wait( 0.5 ); + } + self.ignoreTriggers = false; +} +delayThread( timer, func, param1, param2, param3, param4 ) +{ + thread delayThread_proc( func, timer, param1, param2, param3, param4 ); +} +activate_trigger_with_targetname( msg ) +{ + trigger = getent( msg, "targetname" ); + trigger activate_trigger(); +} +activate_trigger_with_noteworthy( msg ) +{ + trigger = getent( msg, "script_noteworthy" ); + trigger activate_trigger(); +} +disable_trigger_with_targetname( msg ) +{ + trigger = getent( msg, "targetname" ); + trigger trigger_off(); +} +disable_trigger_with_noteworthy( msg ) +{ + trigger = getent( msg, "script_noteworthy" ); + trigger trigger_off(); +} +enable_trigger_with_targetname( msg ) +{ + trigger = getent( msg, "targetname" ); + trigger trigger_on(); +} +enable_trigger_with_noteworthy( msg ) +{ + trigger = getent( msg, "script_noteworthy" ); + trigger trigger_on(); +} +is_hero() +{ + return IsDefined( level.hero_list[ get_ai_number() ] ); +} +get_ai_number() +{ + if( !IsDefined( self.ai_number ) ) + { + set_ai_number(); + } + return self.ai_number; +} +set_ai_number() +{ + self.ai_number = level.ai_number; + level.ai_number ++ ; +} +make_hero() +{ + self magic_bullet_shield(); + level.hero_list[ self.ai_number ] = self; + self.ikpriority = 5; + self thread unmake_hero_on_death(); +} +unmake_hero_on_death() +{ + self waittill("death"); + level.hero_list[ self.ai_number ] = undefined; +} +unmake_hero() +{ + self thread stop_magic_bullet_shield(); + level.hero_list[ self.ai_number ] = undefined; + self.ikpriority = 0; +} +get_heroes() +{ + return level.hero_list; +} +replace_on_death() +{ + maps\_colors::colorNode_replace_on_death(); +} +spawn_reinforcement( classname, color ) +{ + maps\_colors::colorNode_spawn_reinforcement( classname, color ); +} +clear_promotion_order() +{ + level.current_color_order = []; +} +set_promotion_order( deadguy, replacer ) +{ + if( !IsDefined( level.current_color_order ) ) + { + level.current_color_order = []; + } + deadguy = shortenColor( deadguy ); + replacer = shortenColor( replacer ); + level.current_color_order[ deadguy ] = replacer; + if( !IsDefined( level.current_color_order[ replacer ] ) ) + { + set_empty_promotion_order( replacer ); + } +} +set_empty_promotion_order( deadguy ) +{ + if( !IsDefined( level.current_color_order ) ) + { + level.current_color_order = []; + } + level.current_color_order[ deadguy ] = "none"; +} +remove_dead_from_array( array ) +{ + newarray = []; + for( i = 0; i < array.size; i++ ) + { + if( !isalive( array[ i ] ) ) + { + continue; + } + newarray[ newarray.size ] = array[ i ]; + } + return newarray; +} +remove_heroes_from_array( array ) +{ + newarray = []; + for( i = 0; i < array.size; i++ ) + { + if( array[ i ] is_hero() ) + { + continue; + } + newarray[ newarray.size ] = array[ i ]; + } + return newarray; +} +remove_all_animnamed_guys_from_array( array ) +{ + newarray = []; + for( i = 0; i < array.size; i++ ) + { + if( IsDefined( array[ i ].animname ) ) + { + continue; + } + newarray[ newarray.size ] = array[ i ]; + } + return newarray; +} +remove_color_from_array( array, color ) +{ + newarray = []; + for( i = 0; i < array.size; i++ ) + { + guy = array[ i ]; + if( !IsDefined( guy.script_forceColor ) ) + { + continue; + } + if( guy.script_forceColor == color ) + { + continue; + } + newarray[ newarray.size ] = guy; + } + return newarray; +} +remove_noteworthy_from_array( array, noteworthy ) +{ + newarray = []; + for( i = 0; i < array.size; i++ ) + { + guy = array[ i ]; + if( IsDefined( guy.script_noteworthy ) && guy.script_noteworthy == noteworthy ) + { + continue; + } + newarray[ newarray.size ] = guy; + } + return newarray; +} +get_closest_colored_friendly( color, origin ) +{ + allies = get_force_color_guys( "allies", color ); + allies = remove_heroes_from_array( allies ); + if( !IsDefined( origin ) ) + { + players = get_players(); + friendly_origin = players[0].origin; + } + else + { + friendly_origin = origin; + } + return getclosest( friendly_origin, allies ); +} +remove_without_classname( array, classname ) +{ + newarray = []; + for( i = 0; i < array.size; i++ ) + { + if( !issubstr( array[ i ].classname, classname ) ) + { + continue; + } + newarray[ newarray.size ] = array[ i ]; + } + return newarray; +} +remove_without_model( array, model ) +{ + newarray = []; + for( i = 0; i < array.size; i++ ) + { + if( !issubstr( array[ i ].model, model ) ) + { + continue; + } + newarray[ newarray.size ] = array[ i ]; + } + return newarray; +} +get_closest_colored_friendly_with_classname( color, classname, origin ) +{ + allies = get_force_color_guys( "allies", color ); + allies = remove_heroes_from_array( allies ); + if( !IsDefined( origin ) ) + { + players = get_players(); + friendly_origin = players[0].origin; + } + else + { + friendly_origin = origin; + } + allies = remove_without_classname( allies, classname ); + return getclosest( friendly_origin, allies ); +} +promote_nearest_friendly( colorFrom, colorTo ) +{ + for( ;; ) + { + friendly = get_closest_colored_friendly( colorFrom ); + if( !IsAlive( friendly ) ) + { + wait( 1 ); + continue; + } + friendly set_force_color( colorTo ); + return; + } +} +instantly_promote_nearest_friendly( colorFrom, colorTo ) +{ + for( ;; ) + { + friendly = get_closest_colored_friendly( colorFrom ); + if( !IsAlive( friendly ) ) + { + assertex( 0, "Instant promotion from " + colorFrom + " to " + colorTo + " failed!" ); + return; + } + friendly set_force_color( colorTo ); + return; + } +} +instantly_promote_nearest_friendly_with_classname( colorFrom, colorTo, classname ) +{ + for( ;; ) + { + friendly = get_closest_colored_friendly_with_classname( colorFrom, classname ); + if( !IsAlive( friendly ) ) + { + assertex( 0, "Instant promotion from " + colorFrom + " to " + colorTo + " failed!" ); + return; + } + friendly set_force_color( colorTo ); + return; + } +} +promote_nearest_friendly_with_classname( colorFrom, colorTo, classname ) +{ + for( ;; ) + { + friendly = get_closest_colored_friendly_with_classname( colorFrom, classname ); + if( !isalive( friendly ) ) + { + wait( 1 ); + continue; + } + friendly set_force_color( colorTo ); + return; + } +} +instantly_set_color_from_array_with_classname( array, color, classname ) +{ + foundGuy = false; + newArray = []; + for( i = 0; i < array.size; i++ ) + { + guy = array[ i ]; + if( foundGuy || !isSubstr( guy.classname, classname ) ) + { + newArray[ newArray.size ] = guy; + continue; + } + foundGuy = true; + guy set_force_color( color ); + } + return newArray; +} +instantly_set_color_from_array( array, color ) +{ + foundGuy = false; + newArray = []; + for( i = 0; i < array.size; i++ ) + { + guy = array[ i ]; + if( foundGuy ) + { + newArray[ newArray.size ] = guy; + continue; + } + foundGuy = true; + guy set_force_color( color ); + } + return newArray; +} +wait_for_flag_or_timeout( msg, timer ) +{ + if( flag( msg ) ) + { + return; + } + ent = SpawnStruct(); + ent thread ent_waits_for_level_notify( msg ); + ent thread ent_times_out( timer ); + ent waittill( "done" ); +} +wait_for_trigger_or_timeout( timer ) +{ + ent = SpawnStruct(); + ent thread ent_waits_for_trigger( self ); + ent thread ent_times_out( timer ); + ent waittill( "done" ); +} +wait_for_either_trigger( msg1, msg2 ) +{ + ent = SpawnStruct(); + array = []; + array = array_combine( array, GetEntArray( msg1, "targetname" ) ); + array = array_combine( array, GetEntArray( msg2, "targetname" ) ); + for( i = 0; i < array.size; i++ ) + { + ent thread ent_waits_for_trigger( array[ i ] ); + } + ent waittill( "done" ); +} +dronespawn( spawner ) +{ + drone = maps\_spawner::spawner_dronespawn( spawner ); + assert( IsDefined( drone ) ); + return drone; +} +make_real_ai( drone ) +{ + return maps\_spawner::spawner_make_real_ai( drone ); +} +get_trigger_flag(flag_name_override) +{ + if (IsDefined(flag_name_override)) + { + return flag_name_override; + } + if( IsDefined( self.script_flag ) ) + { + return self.script_flag; + } + if( IsDefined( self.script_noteworthy ) ) + { + return self.script_noteworthy; + } + assertex( 0, "Flag trigger at " + self.origin + " has no script_flag set." ); +} +is_spawner() +{ + return (is_true(self.is_spawner)); +} +set_default_pathenemy_settings() +{ + if( self.team == "allies" ) + { + self.pathEnemyLookAhead = 350; + self.pathEnemyFightDist = 350; + return; + } + if( self.team == "axis" ) + { + self.pathEnemyLookAhead = 350; + self.pathEnemyFightDist = 350; + return; + } +} +enable_heat() +{ + self thread call_overloaded_func( "animscripts\anims_table", "setup_heat_anim_array" ); +} +disable_heat() +{ + self thread call_overloaded_func( "animscripts\anims_table", "reset_heat_anim_array" ); +} +enable_cqbwalk() +{ + self.cqbwalking = true; + level thread call_overloaded_func( "animscripts\cqb", "findCQBPointsOfInterest" ); + self thread call_overloaded_func( "animscripts\anims_table", "setup_cqb_anim_array" ); +} +disable_cqbwalk() +{ + if(!IsDefined(self) && (!IsAlive(self)) ) + { + return; + } + self.cqbwalking = false; + self.sprint = false; + self.cqb_point_of_interest = undefined; + self thread call_overloaded_func( "animscripts\anims_table", "reset_cqb_anim_array" ); +} +enable_cqbsprint() +{ + if( !( self animscripts\utility::isCQBWalking() ) ) + self enable_cqbwalk(); + self.sprint = true; +} +disable_cqbsprint() +{ + self.sprint = false; +} +cqb_aim( the_target ) +{ + if( !IsDefined( the_target ) ) + { + self.cqb_target = undefined; + } + else + { + self.cqb_target = the_target; + if( !IsDefined( the_target.origin ) ) + { + assertmsg( "target passed into cqb_aim does not have an origin!" ); + } + } +} +set_force_cover( val ) +{ + assertex( val == "hide" || val == "none" || val == "show", "invalid force cover set on guy" ); + assertex( IsAlive( self ), "Tried to set force cover on a dead guy" ); + self.a.forced_cover = val; +} +waittill_notify_or_timeout( msg, timer ) +{ + self endon( msg ); + wait( timer ); +} +waittill_any_or_timeout( timer, string1, string2, string3, string4, string5 ) +{ + assert( IsDefined( string1 ) ); + self endon( string1 ); + if ( IsDefined( string2 ) ) + { + self endon( string2 ); + } + if ( IsDefined( string3 ) ) + { + self endon( string3 ); + } + if ( IsDefined( string4 ) ) + { + self endon( string4 ); + } + if ( IsDefined( string5 ) ) + { + self endon( string5 ); + } + wait( timer ); +} +scrub_guy() +{ + self SetThreatBiasGroup( self.team ); + self.script_accuracy = 1; + self.perfectAim = false; + set_default_pathenemy_settings(); + maps\_gameskill::grenadeAwareness(); + self clear_force_color(); + maps\_spawner::set_default_covering_fire(); + self.interval = 96; + self.disableArrivals = undefined; + self.ignoreme = false; + self.threatbias = 0; + self.pacifist = false; + self.pacifistWait = 20; + self.IgnoreRandomBulletDamage = false; + self.playerPushable = true; + self.precombatrunEnabled = true; + self.accuracystationarymod = 1; + self.allowdeath = false; + self.anglelerprate = 540; + self.badplaceawareness = 0.75; + self.chainfallback = 0; + self.dontavoidplayer = 0; + self.drawoncompass = 1; + self.activatecrosshair = true; + self.dropweapon = 1; + self.goalradius = level.default_goalradius; + self.goalheight = level.default_goalheight; + self.ignoresuppression = 0; + self PushPlayer( false ); + if ( IsDefined( self.magic_bullet_shield ) && self.magic_bullet_shield ) + { + stop_magic_bullet_shield(); + } + self disable_replace_on_death(); + self.maxsightdistsqrd = 8192*8192; + if( WeaponClass( self.weapon ) == "gas" ) + { + self.maxSightDistSqrd = 1024 * 1024; + } + self.script_forceGrenade = 0; + self.walkdist = 16; + self unmake_hero(); + self.pushable = true; + call_overloaded_func( "animscripts\init", "set_anim_playback_rate" ); + self.fixednode = self.team == "allies"; + if( IsDefined( self.script_grenades ) ) + { + self.grenadeAmmo = self.script_grenades; + } + else + { + self.grenadeAmmo = 3; + } +} +send_notify( msg ) +{ + self notify( msg ); +} +getfx( fx ) +{ + assertEx( IsDefined( level._effect[ fx ] ), "Fx " + fx + " is not defined in level._effect." ); + return level._effect[ fx ]; +} +getanim( anime ) +{ + assertex( IsDefined( self.animname ), "Called getanim on a guy with no animname" ); + assertEx( IsDefined( level.scr_anim[ self.animname ][ anime ] ), "Called getanim on an inexistent anim" ); + return level.scr_anim[ self.animname ][ anime ]; +} +getanim_from_animname( anime, animname ) +{ + assertEx( IsDefined( animname ), "Must supply an animname" ); + assertEx( IsDefined( level.scr_anim[ animname ][ anime ] ), "Called getanim on an inexistent anim" ); + return level.scr_anim[ animname ][ anime ]; +} +getanim_generic( anime ) +{ + assertEx( IsDefined( level.scr_anim[ "generic" ][ anime ] ), "Called getanim_generic on an inexistent anim" ); + return level.scr_anim[ "generic" ][ anime ]; +} +add_hint_string( name, string, optionalFunc ) +{ + assertex( IsDefined( level.trigger_hint_string ), "Tried to add a hint string before _load was called." ); + assertex( IsDefined( name ), "Set a name for the hint string. This should be the same as the script_hint on the trigger_hint." ); + assertex( IsDefined( string ), "Set a string for the hint string. This is the string you want to appear when the trigger is hit." ); + level.trigger_hint_string[ name ] = string; + precachestring( string ); + if( IsDefined( optionalFunc ) ) + { + level.trigger_hint_func[ name ] = optionalFunc; + } +} +ThrowGrenadeAtPlayerASAP() +{ + players = get_players(); + if ( players.size > 0 ) + { + best_target = undefined; + closest_dist = 99999999; + for (i=0;i 1 ) + { + scale = 1; + } + force = vector_scale( force, scale ); + total_force = force[ 0 ] + force[ 1 ] + force[ 2 ]; + } +} +set_goal_entity( ent ) +{ + self setGoalEntity( ent ); +} +activate_trigger() +{ + assertEx( !IsDefined( self.trigger_off ), "Tried to activate trigger that is OFF( either from trigger_off or from flags set on it through shift - G menu" ); + if( IsDefined( self.script_color_allies ) ) + { + self.activated_color_trigger = true; + maps\_colors::activate_color_trigger( "allies" ); + } + if( IsDefined( self.script_color_axis ) ) + { + self.activated_color_trigger = true; + maps\_colors::activate_color_trigger( "axis" ); + } + self notify( "trigger" ); +} +self_delete() +{ + if (IsDefined(self)) + { + self delete(); + } +} +remove_noColor_from_array( ai ) +{ + newarray = []; + for( i = 0; i < ai.size; i++ ) + { + guy = ai[ i ]; + if( guy has_color() ) + { + newarray[ newarray.size ] = guy; + } + } + return newarray; +} +has_color() +{ + if( self.team == "axis" ) + { + return IsDefined( self.script_color_axis ) || IsDefined( self.script_forceColor ); + } + return IsDefined( self.script_color_allies ) || IsDefined( self.script_forceColor ); +} +clear_colors() +{ + clear_team_colors( "axis" ); + clear_team_colors( "allies" ); +} +clear_team_colors( team ) +{ + level.currentColorForced[ team ][ "r" ] = undefined; + level.currentColorForced[ team ][ "b" ] = undefined; + level.currentColorForced[ team ][ "c" ] = undefined; + level.currentColorForced[ team ][ "y" ] = undefined; + level.currentColorForced[ team ][ "p" ] = undefined; + level.currentColorForced[ team ][ "o" ] = undefined; + level.currentColorForced[ team ][ "g" ] = undefined; +} +get_script_palette() +{ + rgb = []; + rgb[ "r" ] = ( 1, 0, 0 ); + rgb[ "o" ] = ( 1, 0.5, 0 ); + rgb[ "y" ] = ( 1, 1, 0 ); + rgb[ "g" ] = ( 0, 1, 0 ); + rgb[ "c" ] = ( 0, 1, 1 ); + rgb[ "b" ] = ( 0, 0, 1 ); + rgb[ "p" ] = ( 1, 0, 1 ); + return rgb; +} +notify_delay( sNotifyString, fDelay ) +{ + assert( IsDefined( self ) ); + assert( IsDefined( sNotifyString ) ); + assert( IsDefined( fDelay ) ); + self endon( "death" ); + if( fDelay > 0 ) + { + wait fDelay; + } + if( !IsDefined( self ) ) + { + return; + } + self notify( sNotifyString ); +} +gun_remove() +{ + self animscripts\shared::placeWeaponOn( self.weapon, "none" ); +} +gun_switchto( weaponName, whichHand ) +{ + self animscripts\shared::placeWeaponOn( weaponName, whichHand ); +} +gun_recall() +{ + self animscripts\shared::placeWeaponOn( self.weapon, "right" ); +} +custom_ai_weapon_loadout( primary, secondary, sidearm ) +{ + self animscripts\shared::detachAllWeaponModels(); + if( IsDefined(self.primaryweapon) && self.primaryweapon != "" ) + { + self animscripts\shared::detachWeapon(self.primaryweapon); + } + if( IsDefined(self.secondaryweapon) && self.secondaryweapon != "" ) + { + self animscripts\shared::detachWeapon(self.secondaryweapon); + } + if( IsDefined(self.sideArm) && self.sideArm != "" ) + { + self animscripts\shared::detachWeapon(self.sideArm); + } + self.primaryweapon = ""; + self.secondaryweapon = ""; + self.sidearm = ""; + if( IsDefined(primary) ) + { + if( GetWeaponModel(primary) != "" ) + { + self.primaryweapon = primary; + self call_overloaded_func( "animscripts\init", "initWeapon", self.primaryweapon ); + self animscripts\shared::placeWeaponOn( self.primaryweapon, "right"); + } + else + { + assertex( false, "custom_ai_weapon_loadout: primary weapon " + primary + " is not in a csv or isn't precached" ); + } + } + if( IsDefined(secondary) ) + { + if( GetWeaponModel(secondary) != "" ) + { + self.secondaryweapon = secondary; + self call_overloaded_func( "animscripts\init", "initWeapon", self.secondaryweapon ); + self animscripts\shared::placeWeaponOn( self.secondaryweapon, "back"); + } + else + { + assertex( false, "custom_ai_weapon_loadout: secondary weapon " + secondary + " is not in a csv or isn't precached" ); + } + } + if( IsDefined(sidearm) ) + { + if( GetWeaponModel(sidearm) != "" ) + { + self.sidearm = sidearm; + self call_overloaded_func( "animscripts\init", "initWeapon", self.sidearm ); + } + else + { + assertex( false, "custom_ai_weapon_loadout: sidearm weapon " + sidearm + " is not in a csv or isn't precached" ); + } + } + self.weapon = self.primaryweapon; + self animscripts\weaponList::RefillClip(); + self.isSniper = animscripts\combat_utility::isSniperRifle( self.weapon ); +} +lerp_player_view_to_tag( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc ) +{ + if( IsPlayer( self ) ) + { + self endon( "disconnect" ); + } + lerp_player_view_to_tag_internal( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, undefined ); +} +lerp_player_view_to_tag_and_hit_geo( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc ) +{ + if( IsPlayer( self ) ) + { + self endon( "disconnect" ); + } + lerp_player_view_to_tag_internal( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, true ); +} +lerp_player_view_to_position( origin, angles, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo ) +{ + if( IsPlayer( self ) ) + { + self endon( "disconnect" ); + } + linker = spawn( "script_origin", ( 0, 0, 0 ) ); + linker.origin = self.origin; + linker.angles = self getplayerangles(); + if( IsDefined( hit_geo ) ) + { + self playerlinkto( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo ); + } + else if( IsDefined( right_arc ) ) + { + self playerlinkto( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc ); + } + else if( IsDefined( fraction ) ) + { + self playerlinkto( linker, "", fraction ); + } + else + { + self playerlinkto( linker ); + } + linker moveto( origin, lerptime, lerptime * 0.25 ); + linker rotateto( angles, lerptime, lerptime * 0.25 ); + linker waittill( "movedone" ); + linker delete(); +} +lerp_player_view_to_tag_oldstyle( tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc ) +{ + lerp_player_view_to_tag_oldstyle_internal( tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, false ); +} +lerp_player_view_to_position_oldstyle( origin, angles, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo ) +{ + if( IsPlayer( self ) ) + { + self endon( "disconnect" ); + } + linker = spawn( "script_origin", ( 0, 0, 0 ) ); + linker.origin = get_player_feet_from_view(); + linker.angles = self getplayerangles(); + if( IsDefined( hit_geo ) ) + { + self playerlinktodelta( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo ); + } + else if( IsDefined( right_arc ) ) + { + self playerlinktodelta( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc ); + } + else if( IsDefined( fraction ) ) + { + self playerlinktodelta( linker, "", fraction ); + } + else + { + self playerlinktodelta( linker ); + } + linker moveto( origin, lerptime, lerptime * 0.25 ); + linker rotateto( angles, lerptime, lerptime * 0.25 ); + linker waittill( "movedone" ); + linker delete(); +} +lerp_player_view_to_moving_position_oldstyle( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo ) +{ + if( IsPlayer( self ) ) + { + self endon( "disconnect" ); + } + linker = spawn( "script_origin", ( 0, 0, 0 ) ); + linker.origin = self.origin; + linker.angles = self getplayerangles(); + if( IsDefined( hit_geo ) ) + { + self playerlinktodelta( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo ); + } + else if( IsDefined( right_arc ) ) + { + self playerlinktodelta( linker, "", fraction, right_arc, left_arc, top_arc, bottom_arc ); + } + else if( IsDefined( fraction ) ) + { + self playerlinktodelta( linker, "", fraction ); + } + else + { + self playerlinktodelta( linker ); + } + max_count=lerptime/0.0167; + count=0; + while (count < max_count) + { + origin = ent gettagorigin( tag ); + angles = ent gettagangles( tag ); + linker moveto( origin, 0.0167*(max_count-count) ); + linker rotateto( angles, 0.0167*(max_count-count) ); + wait( 0.0167 ); + count++; + } + linker delete(); +} +timer( time ) +{ + wait( time ); +} +waittill_either_function( func1, parm1, func2, parm2 ) +{ + ent = spawnstruct(); + thread waittill_either_function_internal( ent, func1, parm1 ); + thread waittill_either_function_internal( ent, func2, parm2 ); + ent waittill( "done" ); +} +waittill_msg( msg ) +{ + if( IsPlayer( self ) ) + { + self endon( "disconnect" ); + } + self waittill( msg ); +} +display_hint( hint ) +{ + if ( GetDvar( #"chaplincheat" ) == "1" ) + { + return; + } + if( IsDefined( level.trigger_hint_func[ hint ] ) ) + { + if( [[ level.trigger_hint_func[ hint ] ]]() ) + { + return; + } + HintPrint( level.trigger_hint_string[ hint ], level.trigger_hint_func[ hint ] ); + } + else + { + HintPrint( level.trigger_hint_string[ hint ] ); + } +} +getGenericAnim( anime ) +{ + assertex( IsDefined( level.scr_anim[ "generic" ][ anime ] ), "Generic anim " + anime + " was not defined in your _anim file." ); + return level.scr_anim[ "generic" ][ anime ]; +} +enable_careful() +{ + assertex( isai( self ), "Tried to make an ai careful but it wasn't called on an AI" ); + self.script_careful = true; +} +disable_careful() +{ + assertex( isai( self ), "Tried to unmake an ai careful but it wasn't called on an AI" ); + self.script_careful = false; + self notify( "stop_being_careful" ); +} +set_fixednode_true() +{ + self.fixednode = true; +} +set_fixednode_false() +{ + self.fixednode = true; +} +spawn_ai() +{ + ai = undefined; + if( IsDefined( self.lastSpawnTime ) && self.lastSpawnTime >= GetTime() ) + { + wait(0.05); + } + no_enemy_info = is_true(self.script_noenemyinfo); + if ( IsDefined( self.script_forcespawn ) ) + { + ai = self StalingradSpawn(no_enemy_info); + } + else + { + ai = self DoSpawn(no_enemy_info); + } + if( IsDefined( ai ) ) + { + self.lastSpawnTime = GetTime(); + } + return ai; +} +kill_spawnernum( number ) +{ + spawners = GetSpawnerArray(); + for( i = 0; i < spawners.size; i++ ) + { + if( !IsDefined( spawners[i].script_killspawner ) ) + { + continue; + } + if( number != spawners[i].script_killspawner ) + { + continue; + } + spawners[i] Delete(); + } +} +function_stack( func, param1, param2, param3, param4 ) +{ + self endon( "death" ); + localentity = spawnstruct(); + localentity thread function_stack_proc( self, func, param1, param2, param3, param4 ); + localentity waittill_either( "function_done", "death" ); +} +set_goal_node( node ) +{ + self.last_set_goalnode = node; + self.last_set_goalpos = undefined; + self.last_set_goalent = undefined; + self SetGoalNode( node ); +} +set_goal_pos( origin ) +{ + self.last_set_goalnode = undefined; + self.last_set_goalpos = origin; + self.last_set_goalent = undefined; + self SetGoalPos( origin ); +} +set_goal_ent( target ) +{ + set_goal_pos( target.origin ); + self.last_set_goalent = target; +} +run_thread_on_targetname( msg, func, param1, param2, param3 ) +{ + array = getentarray( msg, "targetname" ); + array_thread( array, func, param1, param2, param3 ); +} +run_thread_on_noteworthy( msg, func, param1, param2, param3 ) +{ + array = getentarray( msg, "script_noteworthy" ); + array_thread( array, func, param1, param2, param3 ); +} +handsignal( action, end_on, wait_till ) +{ + if ( IsDefined( end_on ) ) + { + level endon( end_on ); + } + if ( IsDefined( wait_till ) ) + { + level waittill( wait_till ); + } + switch ( action ) + { + case "go": + self maps\_anim::anim_generic(self, "signal_go"); + break; + case "onme": + self maps\_anim::anim_generic(self, "signal_onme"); + break; + case "stop": + self maps\_anim::anim_generic(self, "signal_stop"); + break; + case "moveup": + self maps\_anim::anim_generic(self, "signal_moveup"); + break; + case "moveout": + self maps\_anim::anim_generic(self, "signal_moveout"); + break; + } +} +add_dialogue_line( name, msg, blocking ) +{ +} +add_dialogue_line_internal( name, msg ) +{ + if( GetDvarInt( #"loc_warnings") ) + { + return; + } + if ( !IsDefined( level.dialogue_huds ) ) + { + level.dialogue_huds = []; + } + for ( index = 0;; index++ ) + { + if ( !IsDefined( level.dialogue_huds[ index ] ) ) + { + break; + } + } + level.dialogue_huds[ index ] = true; + hudelem = maps\_hud_util::createFontString( "default", 1.5 ); + hudelem.location = 0; + hudelem.alignX = "left"; + hudelem.alignY = "top"; + hudelem.foreground = 1; + hudelem.sort = 20; + hudelem.alpha = 0; + hudelem fadeOverTime( 0.5 ); + hudelem.alpha = 1; + hudelem.x = 40; + hudelem.y = 260 + index * 18; + hudelem.label = "<" + name + "> " + msg; + hudelem.color = (1,1,0); + wait( 2 ); + timer = 2 * 20; + hudelem fadeOverTime( 6 ); + hudelem.alpha = 0; + for ( i = 0; i < timer; i++ ) + { + hudelem.color = ( 1, 1, 1 / ( timer - i ) ); + wait( 0.05 ); + } + wait( 4 ); + hudelem destroy(); + level.dialogue_huds[ index ] = undefined; +} +alphabetize( array ) +{ + if ( array.size <= 1 ) + { + return array; + } + count = 0; + for ( ;; ) + { + changed = false; + for ( i = 0; i < array.size - 1; i++ ) + { + if ( is_later_in_alphabet( array[ i ], array[ i + 1 ] ) ) + { + val = array[ i ]; + array[ i ] = array[ i + 1 ]; + array[ i + 1 ] = val; + changed = true; + count++; + if ( count >= 10 ) + { + count = 0; + wait( 0.05 ); + } + } + } + if ( !changed ) + { + return array; + } + } + return array; +} +set_grenadeammo( count ) +{ + self.grenadeammo = count; +} +get_player_feet_from_view() +{ + tagorigin = self.origin; + upvec = anglestoup( self getplayerangles() ); + height = self GetPlayerViewHeight(); + player_eye = tagorigin + (0,0,height); + player_eye_fake = tagorigin + vector_scale( upvec, height ); + diff_vec = player_eye - player_eye_fake; + fake_origin = tagorigin + diff_vec; + return fake_origin; +} +set_console_status() +{ + if ( !IsDefined( level.Console ) ) + { + level.Console = GetDvar( #"consoleGame" ) == "true"; + } + else + { + assertex( level.Console == ( GetDvar( #"consoleGame" ) == "true" ), "Level.console got set incorrectly." ); + } + if ( !IsDefined( level.Consolexenon ) ) + { + level.xenon = GetDvar( #"xenonGame" ) == "true"; + } + else + { + assertex( level.xenon == ( GetDvar( #"xenonGame" ) == "true" ), "Level.xenon got set incorrectly." ); + } +} +autosave_now( optional_useless_string, suppress_print ) +{ + return maps\_autosave::autosave_game_now( suppress_print ); +} +set_generic_deathanim( deathanim ) +{ + self.deathanim = getgenericanim( deathanim ); +} +set_deathanim( deathanim ) +{ + self.deathanim = getanim( deathanim ); +} +clear_deathanim() +{ + self.deathanim = undefined; +} +lerp_fov_overtime( time, destfov, use_camera_tween ) +{ + level endon("stop_lerping_thread"); + if( !IsDefined( use_camera_tween ) ) + { + basefov = GetDvarFloat( #"cg_fov" ); + incs = int( time/.05 ); + incfov = ( destfov - basefov ) / incs ; + currentfov = basefov; + if(incfov == 0) + { + return; + } + for ( i = 0; i < incs; i++ ) + { + currentfov += incfov; + self SetClientDvar( "cg_fov", currentfov ); + wait .05; + } + self SetClientDvar( "cg_fov", destfov ); + } + else + { + self StartCameraTween( time ); + self SetClientDvar( "cg_fov", destfov ); + } +} +apply_fog() +{ + maps\_load_common::set_fog_progress( 0 ); +} +apply_end_fog() +{ + maps\_load_common::set_fog_progress( 1 ); +} +anim_stopanimscripted(blend_time) +{ + anim_ent = get_anim_ent(); + anim_ent StopAnimScripted(blend_time); + anim_ent notify( "single anim", "end" ); + anim_ent notify( "looping anim", "end" ); + if (IsDefined(anim_ent.anim_loop_ender)) + { + anim_ent notify( anim_ent.anim_loop_ender ); + } + anim_ent notify("_anim_stopped"); +} +get_anim_ent() +{ + if (IsDefined(self.anim_link)) + { + self.anim_link.animname = self.animname; + return self.anim_link; + } + return self; +} +enable_additive_pain( enable_regular_pain_on_low_health ) +{ + AssertEx( IsAI( self ), "Enable_additive_pain should be called on AI only." ); + self thread call_overloaded_func( "animscripts\pain", "additive_pain_think", enable_regular_pain_on_low_health ); +} +disable_pain() +{ + assertex( isalive( self ), "Tried to disable pain on a non ai" ); + self.a.disablePain = true; + self.allowPain = false; +} +enable_pain() +{ + assertex( isalive( self ), "Tried to enable pain on a non ai" ); + self.a.disablePain = false; + self.allowPain = true; +} +disable_react() +{ + assertex( isalive( self ), "Tried to disable react on a non ai" ); + self.a.disableReact = true; + self.allowReact = false; +} +enable_react() +{ + assertex( isalive( self ), "Tried to enable react on a non ai" ); + self.a.disableReact = false; + self.allowReact = true; +} +enable_rambo() +{ + if( IsDefined( level.norambo ) ) + { + level.norambo = undefined; + } +} +disable_rambo() +{ + level.norambo = 1; +} +die() +{ + self dodamage( self.health + 150, (0,0,0) ); +} +getmodel( str ) +{ + assertex( IsDefined( level.scr_model[ str ] ), "Tried to getmodel on model " + str + " but level.scr_model[ " + str + " was not defined." ); + return level.scr_model[ str ]; +} +isADS( player ) +{ + return ( player playerADS() > 0.5 ); +} +enable_auto_adjust_threatbias(player) +{ + level.auto_adjust_threatbias = true; + if ( level.gameskill >= 2 ) + { + player.threatbias = int( maps\_gameskill::get_locked_difficulty_val( "threatbias", 1 ) ); + return; + } + level.auto_adjust_difficulty_frac = GetDvarInt( #"autodifficulty_frac" ); + current_frac = level.auto_adjust_difficulty_frac * 0.01; + players = get_players(); + level.coop_player_threatbias_scalar = maps\_gameskill::getCoopValue( "coopFriendlyThreatBiasScalar", players.size ); + if (!IsDefined(level.coop_player_threatbias_scalar)) + { + level.coop_player_threatbias_scalar = 1; + } + player.threatbias = int( maps\_gameskill::get_blended_difficulty( "threatbias", current_frac ) * level.coop_player_threatbias_scalar); +} +disable_auto_adjust_threatbias() +{ + level.auto_adjust_threatbias = false; +} +waittill_player_looking_at(origin, dot, do_trace) +{ + while (!is_player_looking_at(origin, dot, do_trace)) + { + wait .05; + } +} +is_player_looking_at(origin, dot, do_trace) +{ + AssertEx(IsPlayer(self), "player_looking_at must be called on a player."); + if (!IsDefined(dot)) + { + dot = .7; + } + if (!IsDefined(do_trace)) + { + do_trace = true; + } + eye = self get_eye(); + delta_vec = AnglesToForward(VectorToAngles(origin - eye)); + view_vec = AnglesToForward(self GetPlayerAngles()); + new_dot = VectorDot( delta_vec, view_vec ); + if ( new_dot >= dot ) + { + if (do_trace) + { + return BulletTracePassed( origin, eye, false, undefined ); + } + else + { + return true; + } + } + return false; +} +look_at(origin_or_ent, tween, force, tag, offset) +{ + if (is_true(force)) + { + self FreezeControls(true); + } + if (IsDefined(tween)) + { + self StartCameraTween(tween); + } + self notify("look_at_begin"); + origin = origin_or_ent; + if (!IsVec(origin_or_ent)) + { + ent = origin_or_ent; + if (IsDefined(tag)) + { + origin = ent GetTagOrigin(tag); + } + else if (IsAI(origin_or_ent) && !IsDefined(offset)) + { + origin = ent get_eye(); + } + else + { + origin = ent.origin; + } + } + if (IsDefined(offset)) + { + origin = origin + offset; + } + player_org = self get_eye(); + vec_to_pt = origin - player_org; + self SetPlayerAngles(VectorToAngles(vec_to_pt)); + wait tween; + if (is_true(force)) + { + self FreezeControls(false); + } + self notify("look_at_end"); +} +add_wait( func, parm1, parm2, parm3 ) +{ + ent = spawnstruct(); + ent.caller = self; + ent.func = func; + ent.parms = []; + if ( IsDefined( parm1 ) ) + { + ent.parms[ ent.parms.size ] = parm1; + } + if ( IsDefined( parm2 ) ) + { + ent.parms[ ent.parms.size ] = parm2; + } + if ( IsDefined( parm3 ) ) + { + ent.parms[ ent.parms.size ] = parm3; + } + level.wait_any_func_array[ level.wait_any_func_array.size ] = ent; +} +do_wait_any() +{ + assertex( IsDefined( level.wait_any_func_array ), "Tried to do a do_wait without addings funcs first" ); + assertex( level.wait_any_func_array.size > 0, "Tried to do a do_wait without addings funcs first" ); + do_wait( level.wait_any_func_array.size - 1 ); +} +do_wait( count_to_reach ) +{ + if ( !IsDefined( count_to_reach ) ) + { + count_to_reach = 0; + } + assertex( IsDefined( level.wait_any_func_array ), "Tried to do a do_wait without addings funcs first" ); + ent = spawnstruct(); + array = level.wait_any_func_array; + endons = level.do_wait_endons_array; + after_array = level.run_func_after_wait_array; + level.wait_any_func_array = []; + level.run_func_after_wait_array = []; + level.do_wait_endons_array = []; + ent.count = array.size; + ent array_levelthread( array, ::waittill_func_ends, endons ); + for ( ;; ) + { + if ( ent.count <= count_to_reach ) + { + break; + } + ent waittill( "func_ended" ); + } + ent notify( "all_funcs_ended" ); + array_levelthread( after_array, ::exec_func, [] ); +} +waterfx( endflag ) +{ + if ( IsDefined( endflag ) ) + { + flag_assert( endflag ); + level endon( endflag ); + } + for ( ;; ) + { + wait( randomfloatrange( 0.15, 0.3 ) ); + start = self.origin + (0,0,150); + end = self.origin - (0,0,150); + trace = BulletTrace( start, end, false, undefined ); + if ( trace[ "surfacetype" ] != "water" ) + { + continue; + } + fx = "water_movement"; + if ( self == level.player ) + { + if ( distance( level.player getvelocity(), (0,0,0) ) < 5 ) + { + fx = "water_stop"; + } + } + else if ( IsDefined( level._effect[ "water_" + self.a.movement ] ) ) + { + fx = "water_" + self.a.movement; + } + playfx( getfx( fx ), trace[ "position" ], trace[ "normal" ] ); + } +} +fail_on_friendly_fire() +{ + if ( !IsDefined( level.friendlyfire_friendly_kill_points ) ) + { + level.friendlyfire_friendly_kill_points = level.friendlyfire[ "friend_kill_points" ]; + } + level.friendlyfire[ "friend_kill_points" ] = -60000; +} +giveachievement_wrapper( achievement, all_players ) +{ + if ( achievement == "" ) + { + return; + } + if ( isCoopEPD() ) + { + return; + } + if( !( maps\_cheat::is_cheating() ) && ! ( flag("has_cheated") ) ) + { + if( IsDefined( all_players ) && all_players ) + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + players[i] GiveAchievement( achievement ); + } + } + else + { + if( !IsPlayer( self ) ) + { + println( "^1self needs to be a player for _utility::giveachievement_wrapper()" ); + return; + } + self GiveAchievement( achievement ); + } + } +} +slowmo_start() +{ + flag_set( "disable_slowmo_cheat" ); +} +slowmo_end() +{ + maps\_cheat::slowmo_system_defaults(); + flag_clear( "disable_slowmo_cheat" ); +} +slowmo_setspeed_slow( speed ) +{ + if( !maps\_cheat::slowmo_check_system() ) + { + return; + } + level.slowmo.speed_slow = speed; +} +slowmo_setspeed_norm( speed ) +{ + if( !maps\_cheat::slowmo_check_system() ) + { + return; + } + level.slowmo.speed_norm = speed; +} +slowmo_setlerptime_in( time ) +{ + if( !maps\_cheat::slowmo_check_system() ) + { + return; + } + level.slowmo.lerp_time_in = time; +} +slowmo_setlerptime_out( time ) +{ + if( !maps\_cheat::slowmo_check_system() ) + { + return; + } + level.slowmo.lerp_time_out = time; +} +slowmo_lerp_in() +{ + if( !flag( "disable_slowmo_cheat" ) ) + { + return; + } + level.slowmo thread maps\_cheat::gamespeed_set( level.slowmo.speed_slow, level.slowmo.speed_current, level.slowmo.lerp_time_in ); +} +slowmo_lerp_out() +{ + if( !flag( "disable_slowmo_cheat" ) ) + { + return; + } + level.slowmo thread maps\_cheat::gamespeed_reset(); +} +arcademode_assignpoints( amountDvar, player ) +{ + if ( GetDvar( #"arcademode" ) != "1" ) + { + return; + } +} +arcadeMode() +{ + isArcadeMode = GetDvar( #"arcademode" ) == "1"; + if ( GetDvar( #"zombiemode" ) == "1" ) + { + isArcadeMode = false; + } + return isArcadeMode; +} +coopGame() +{ + return (( GetDvar( #"systemlink" ) == "1" ) || (GetDvar( #"onlinegame" ) == "1" ) || IsSplitScreen() ); +} +player_is_near_live_grenade() +{ + grenades = getentarray( "grenade", "classname" ); + for ( i = 0; i < grenades.size; i++ ) + { + grenade = grenades[ i ]; + players = get_players(); + for( j = 0; j < players.size; j++ ) + { + if( DistanceSquared( grenade.origin, players[j].origin ) < 250 * 250 ) + { + return true; + } + } + } + return false; +} +player_died_recently() +{ + return GetDvarInt( #"player_died_recently" ) > 0; +} +set_splitscreen_fog( start_dist, halfway_dist, halfway_height, base_height, red, green, blue, trans_time, cull_dist ) +{ + if( !IsSplitScreen() ) + { + return; + } + if( !IsDefined( start_dist ) ) + { + start_dist = 0; + } + if( !IsDefined( halfway_dist ) ) + { + halfway_dist = 200; + } + if( !IsDefined( base_height ) ) + { + base_height = -2000; + } + if( !IsDefined( red ) ) + { + red = 1; + } + if( !IsDefined( green ) ) + { + green = 1; + } + if( !IsDefined( blue ) ) + { + blue = 0; + } + if( !IsDefined( trans_time ) ) + { + trans_time = 0; + } + if( !IsDefined( cull_dist ) ) + { + cull_dist = 2000; + } + halfway_height = base_height + 2000; + level.splitscreen_fog = true; + SetVolFog( start_dist, halfway_dist, halfway_height, base_height, red, green, blue, 0 ); + SetCullDist( cull_dist ); +} +default_fog_print() +{ + wait_for_first_player(); +} +share_screen( player, toggle, instant ) +{ + if( !IsSplitscreen() ) + { + return; + } + time = 1; + if( IsDefined( instant ) && instant ) + { + time = 0.1; + } + toggle = !toggle; + SplitViewAllowed( player GetEntityNumber(), toggle, time ); +} +get_players(t) +{ + if(IsDefined(t)) + { + return(GetPlayers(t)); + } + else + { + return(GetPlayers()); + } +} +get_host() +{ + players = get_players("all"); + for( i = 0; i < players.size; i++ ) + { + if( players[i] GetEntityNumber() == 0 ) + { + return players[i]; + } + } +} +is_coop() +{ + players = get_players("all"); + if( players.size > 1 ) + { + return true; + } + return false; +} +any_player_IsTouching( ent, t ) +{ + players = []; + if(IsDefined(t)) + { + players = get_players(t); + } + else + { + players = get_players(); + } + for( i = 0; i < players.size; i++ ) + { + if( IsAlive( players[i] ) && players[i] IsTouching( ent ) ) + { + return true; + } + } + return false; +} +get_player_touching( ent, t ) +{ + players = []; + if(IsDefined(t)) + { + players = get_players(t); + } + else + { + players = get_players(); + } + for( i = 0; i < players.size; i++ ) + { + if( IsAlive( players[i] ) && players[i] IsTouching( ent ) ) + { + return players[i]; + } + } + return undefined; +} +get_closest_player( org, t ) +{ + players = []; + if(IsDefined(t)) + { + players = get_players(t); + } + else + { + players = get_players(); + } + return GetClosest( org, players ); +} +clear_player_spawnpoints() +{ + level.player_spawnpoints = []; +} +freezecontrols_all( toggle, delay ) +{ + if( IsDefined( delay ) ) + { + wait( delay ); + } + players = get_players("all"); + for( i = 0; i < players.size; i++ ) + { + players[i] FreezeControls( toggle ); + } +} +set_all_players_blur( amount, time ) +{ + wait_for_first_player(); + flag_wait( "all_players_connected" ); + players = get_players("all"); + for( i = 0; i < players.size; i++ ) + { + players[i] SetBlur( amount, time ); + } +} +set_all_players_double_vision( amount, time ) +{ + wait_for_first_player(); + flag_wait( "all_players_connected" ); + players = get_players("all"); + for( i = 0; i < players.size; i++ ) + { + players[i] SetDoubleVision( amount, time ); + } +} +set_all_players_shock( shellshock_file, time ) +{ + wait_for_first_player(); + flag_wait( "all_players_connected" ); + players = get_players("all"); + for( i = 0; i < players.size; i++ ) + { + players[i] Shellshock( shellshock_file, time ); + } +} +set_all_players_visionset( vision_file, time ) +{ + wait_for_first_player(); + flag_wait( "all_players_connected" ); + players = get_players("all"); + for( i = 0; i < players.size; i++ ) + { + players[i] VisionSetNaked( vision_file, time ); + } +} +player_flag_wait( msg ) +{ + while( !self.flag[msg] ) + { + self waittill( msg ); + } +} +player_flag_wait_either( flag1, flag2 ) +{ + for( ;; ) + { + if( flag( flag1 ) ) + { + return; + } + if( flag( flag2 ) ) + { + return; + } + self waittill_either( flag1, flag2 ); + } +} +player_flag_waitopen( msg ) +{ + while( self.flag[msg] ) + { + self waittill( msg ); + } +} +player_flag_init( message, trigger ) +{ + if( !IsDefined( self.flag ) ) + { + self.flag = []; + self.flags_lock = []; + } + assertex( !IsDefined( self.flag[message] ), "Attempt to reinitialize existing message: " + message ); + self.flag[message] = false; +} +player_flag_set_delayed( message, delay ) +{ + wait( delay ); + player_flag_set( message ); +} +player_flag_set( message ) +{ + self.flag[message] = true; + self notify( message ); +} +player_flag_clear( message ) +{ + self.flag[message] = false; + self notify( message ); +} +player_flag( message ) +{ + assertex( IsDefined( message ), "Tried to check flag but the flag was not defined." ); + if( !self.flag[message] ) + { + return false; + } + return true; +} +wait_for_first_player() +{ + players = get_players("all"); + if( !IsDefined( players ) || players.size == 0 ) + { + level waittill( "first_player_ready" ); + } +} +wait_for_all_players() +{ + flag_wait( "all_players_connected" ); +} +findBoxCenter( mins, maxs ) +{ + center = ( 0, 0, 0 ); + center = maxs - mins; + center = ( center[0]/2, center[1]/2, center[2]/2 ) + mins; + return center; +} +expandMins( mins, point ) +{ + if ( mins[0] > point[0] ) + { + mins = ( point[0], mins[1], mins[2] ); + } + if ( mins[1] > point[1] ) + { + mins = ( mins[0], point[1], mins[2] ); + } + if ( mins[2] > point[2] ) + { + mins = ( mins[0], mins[1], point[2] ); + } + return mins; +} +expandMaxs( maxs, point ) +{ + if ( maxs[0] < point[0] ) + { + maxs = ( point[0], maxs[1], maxs[2] ); + } + if ( maxs[1] < point[1] ) + { + maxs = ( maxs[0], point[1], maxs[2] ); + } + if ( maxs[2] < point[2] ) + { + maxs = ( maxs[0], maxs[1], point[2] ); + } + return maxs; +} +get_ai_touching_volume( team, volume_name, volume ) +{ + if ( !IsDefined( volume ) ) + { + volume = getent( volume_name, "targetname" ); + assertEx( IsDefined( volume ), volume_name + " does not exist" ); + } + guys = getaiarray( team ); + guys_touching_volume = []; + for( i=0; i < guys.size; i++ ) + { + if ( guys[i] isTouching( volume ) ) + { + guys_touching_volume[guys_touching_volume.size] = guys[i]; + } + } + return guys_touching_volume; +} +registerClientSys(sSysName) +{ + if(!IsDefined(level._clientSys)) + { + level._clientSys = []; + } + if(level._clientSys.size >= 32) + { + error("Max num client systems exceeded."); + return; + } + if(IsDefined(level._clientSys[sSysName])) + { + error("Attempt to re-register client system : " + sSysName); + return; + } + else + { + level._clientSys[sSysName] = spawnstruct(); + level._clientSys[sSysName].sysID = ClientSysRegister(sSysName); + } +} +setClientSysState(sSysName, sSysState, player) +{ + if(!IsDefined(level._clientSys)) + { + error("setClientSysState called before registration of any systems."); + return; + } + if(!IsDefined(level._clientSys[sSysName])) + { + error("setClientSysState called on unregistered system " + sSysName); + return; + } + if(IsDefined(player)) + { + player ClientSysSetState(level._clientSys[sSysName].sysID, sSysState); + } + else + { + ClientSysSetState(level._clientSys[sSysName].sysID, sSysState); + level._clientSys[sSysName].sysState = sSysState; + } +} +wait_network_frame() +{ + if(NumRemoteClients()) + { + snapshot_ids = getsnapshotindexarray(); + acked = undefined; + while (!IsDefined(acked)) + { + level waittill("snapacknowledged"); + acked = snapshotacknowledged(snapshot_ids); + } + } + else + { + wait(0.1); + } +} +clientNotify(event) +{ + if(level.clientscripts) + { + if(IsPlayer(self)) + { + maps\_utility::setClientSysState("levelNotify", event, self); + } + else + { + maps\_utility::setClientSysState("levelNotify", event); + } + } +} +ok_to_spawn( max_wait_seconds ) +{ + if( IsDefined( max_wait_seconds ) ) + { + timer = GetTime() + max_wait_seconds * 1000; + while( GetTime() < timer && !OkToSpawn() ) + { + wait( 0.05 ); + } + } + else + { + while( !OkToSpawn() ) + { + wait( 0.05 ); + } + } +} +set_breadcrumbs(starts) +{ + if(!IsDefined(level._player_breadcrumbs)) + { + maps\_callbackglobal::Player_BreadCrumb_Reset((0,0,0)); + } + for(i = 0; i < starts.size; i++) + { + for(j = 0; j < starts.size; j++) + { + level._player_breadcrumbs[i][j].pos = starts[j].origin; + if(IsDefined(starts[j].angles)) + { + level._player_breadcrumbs[i][j].ang = starts[j].angles; + } + else + { + level._player_breadcrumbs[i][j].ang = (0,0,0); + } + } + } +} +set_breadcrumbs_player_positions() +{ + if(!IsDefined(level._player_breadcrumbs)) + { + maps\_callbackglobal::Player_BreadCrumb_Reset((0,0,0)); + } + players = get_players(); + for(i = 0; i < players.size; i++) + { + level._player_breadcrumbs[i][0].pos = players[i].origin; + level._player_breadcrumbs[i][0].ang = players[i].angles; + } +} +spread_array_thread( entities, process, var1, var2, var3 ) +{ + keys = getArrayKeys( entities ); + if ( IsDefined( var3 ) ) + { + for( i = 0 ; i < keys.size ; i++ ) + { + entities[ keys[ i ] ] thread [[ process ]]( var1, var2, var3 ); + wait_network_frame(); + } + return; + } + if ( IsDefined( var2 ) ) + { + for( i = 0 ; i < keys.size ; i++ ) + { + entities[ keys[ i ] ] thread [[ process ]]( var1, var2 ); + wait_network_frame(); + } + return; + } + if ( IsDefined( var1 ) ) + { + for( i = 0 ; i < keys.size ; i++ ) + { + entities[ keys[ i ] ] thread [[ process ]]( var1 ); + wait_network_frame(); + } + return; + } + for( i = 0 ; i < keys.size ; i++ ) + { + entities[ keys[ i ] ] thread [[ process ]](); + wait_network_frame(); + } +} +simple_floodspawn( name, spawn_func, spawn_func_2 ) +{ + spawners = getEntArray( name, "targetname" ); + assertex( spawners.size, "no spawners with targetname " + name + " found!" ); + if( IsDefined( spawn_func ) ) + { + for( i = 0; i < spawners.size; i++ ) + { + spawners[i] add_spawn_function( spawn_func ); + } + } + if( IsDefined( spawn_func_2 ) ) + { + for( i = 0; i < spawners.size; i++ ) + { + spawners[i] add_spawn_function( spawn_func_2 ); + } + } + for( i = 0; i < spawners.size; i++ ) + { + if( i % 2 ) + { + wait_network_frame(); + } + spawners[i] thread maps\_spawner::flood_spawner_init(); + spawners[i] thread maps\_spawner::flood_spawner_think(); + } +} +simple_spawn( name_or_spawners, spawn_func, param1, param2, param3, param4, param5 ) +{ + spawners = []; + if (IsString(name_or_spawners)) + { + spawners = GetEntArray( name_or_spawners, "targetname" ); + AssertEx( spawners.size, "no spawners with targetname " + name_or_spawners + " found!" ); + } + else + { + if (IsArray(name_or_spawners)) + { + spawners = name_or_spawners; + } + else + { + spawners[0] = name_or_spawners; + } + } + ai_array = []; + for( i = 0; i < spawners.size; i++ ) + { + spawners[i].spawning = true; + if( i % 2 ) + { + wait_network_frame(); + } + ai = spawners[i] spawn_ai(); + if(!spawn_failed( ai )) + { + if (IsDefined( spawn_func )) + { + single_thread(ai, spawn_func, param1, param2, param3, param4, param5); + } + ai_array = add_to_array( ai_array, ai ); + } + spawners[i].spawning = undefined; + } + return ai_array; +} +simple_spawn_single( name_or_spawner, spawn_func, param1, param2, param3, param4, param5 ) +{ + if (IsString(name_or_spawner)) + { + spawner = GetEnt( name_or_spawner, "targetname" ); + AssertEx( IsDefined( spawner ), "no spawner with targetname " + name_or_spawner + " found!" ); + } + else if (IsArray(name_or_spawner)) + { + AssertMsg("simple_spawn_single cannot be used on an array of spawners. use simple_spawn instead."); + } + ai = simple_spawn(name_or_spawner, spawn_func, param1, param2, param3, param4, param5); + AssertEx( ai.size <= 1, "simple_spawn called from simple_spawn_single somehow spawned more than one guy!" ); + if (ai.size) + { + return ai[0]; + } +} +CanSpawnThink() +{ + level.canSpawnInOneFrame = 3; + for(;;) + { + level.canSpawnCount = 0; + wait_network_frame(); + } +} +CanSpawn() +{ + if(!isdefined(level.canSpawnInOneFrame)) + { + thread CanSpawnThink(); + } + return true; +} +SpawnThrottleEnableThread() +{ + level notify ("spawn_throttle_enable_thread_ender"); + level endon ("spawn_throttle_enable_thread_ender"); + if (isdefined(level.flag["all_players_connected"])) + { + flag_wait("all_players_connected"); + level.spawnThrottleEnable = true; + } +} +SpawnThrottleEnable() +{ + if(!isdefined(level.spawnThrottleEnable) || (isdefined(level.spawnThrottleEnable) && level.spawnThrottleEnable == false) ) + { + level.spawnThrottleEnable = false; + thread SpawnThrottleEnableThread(); + } + return level.spawnThrottleEnable; +} +DoSpawn(no_enemy_info, targetname) +{ + if(SpawnThrottleEnable()) + { + while(!CanSpawn()) + { + wait_network_frame(); + } + } + if(isdefined(level.canSpawnCount)) + { + level.canSpawnCount += 1; + } + if(!IsDefined(no_enemy_info)) + { + return self CodeSpawnerSpawn(); + } + else if(!IsDefined(targetname)) + { + return self CodeSpawnerSpawn(no_enemy_info); + } + else + { + return self CodeSpawnerSpawn(no_enemy_info, targetname); + } +} +StalingradSpawn(no_enemy_info, targetname) +{ + if(SpawnThrottleEnable()) + { + while(!CanSpawn()) + { + wait_network_frame(); + } + } + if(isdefined(level.canSpawnCount)) + { + level.canSpawnCount += 1; + } + if(!IsDefined(no_enemy_info)) + { + return self CodeSpawnerForceSpawn(); + } + else if(!IsDefined(targetname)) + { + return self CodeSpawnerForceSpawn(no_enemy_info); + } + else + { + return self CodeSpawnerForceSpawn(no_enemy_info, targetname); + } +} +Spawn(classname, origin, flags, radius, height, destructibledef) +{ + if(SpawnThrottleEnable()) + { + while(!CanSpawn()) + { + wait_network_frame(); + } + } + if(isdefined(level.canSpawnCount)) + { + level.canSpawnCount += 1; + } + if(IsDefined(destructibledef)) + { + return CodeSpawn(classname, origin, flags, radius, height, destructibledef); + } + else if(IsDefined(height)) + { + return CodeSpawn(classname, origin, flags, radius, height); + } + else if(IsDefined(radius)) + { + return CodeSpawn(classname, origin, flags, radius); + } + else if(IsDefined(flags)) + { + return CodeSpawn(classname, origin, flags); + } + else + { + return CodeSpawn(classname, origin); + } +} +SpawnVehicle( modelname, targetname, vehicletype, origin, angles, destructibledef ) +{ + if(SpawnThrottleEnable()) + { + while(!CanSpawn()) + { + wait_network_frame(); + } + } + if(isdefined(level.canSpawnCount)) + { + level.canSpawnCount += 1; + } + assert(IsDefined(targetname)); + assert(IsDefined(vehicletype)); + assert(IsDefined(origin)); + assert(IsDefined(angles)); + if(IsDefined(destructibledef)) + { + return CodeSpawnVehicle( modelname, targetname, vehicletype, origin, angles, destructibledef ); + } + else + { + return CodeSpawnVehicle( modelname, targetname, vehicletype, origin, angles ); + } +} +SpawnTurret( classname, origin, weaponinfoname ) +{ + if(SpawnThrottleEnable()) + { + while(!CanSpawn()) + { + wait_network_frame(); + } + } + if(isdefined(level.canSpawnCount)) + { + level.canSpawnCount += 1; + } + return CodeSpawnTurret(classname, origin, weaponinfoname); +} +PlayLoopedFX( effectid, repeat, position, cull, forward, up ) +{ + if(SpawnThrottleEnable()) + { + while(!CanSpawn()) + { + wait_network_frame(); + } + } + if(isdefined(level.canSpawnCount)) + { + level.canSpawnCount += 1; + } + if(IsDefined(up)) + { + return CodePlayLoopedFX(effectid, repeat, position, cull, forward, up); + } + else if(IsDefined(forward)) + { + return CodePlayLoopedFX(effectid, repeat, position, cull, forward); + } + else if(IsDefined(cull)) + { + return CodePlayLoopedFX(effectid, repeat, position, cull); + } + else + { + return CodePlayLoopedFX(effectid, repeat, position); + } +} +SpawnFx( effect, position, forward, up ) +{ + if(SpawnThrottleEnable()) + { + while(!CanSpawn()) + { + wait_network_frame(); + } + } + if(isdefined(level.canSpawnCount)) + { + level.canSpawnCount += 1; + } + if(IsDefined(up)) + { + return CodeSpawnFx(effect, position, forward, up); + } + else if(IsDefined(forward)) + { + return CodeSpawnFx(effect, position, forward); + } + else + { + return CodeSpawnFx(effect, position); + } +} +spawn_model(model_name, origin, angles) +{ + if (!IsDefined(origin)) + { + origin = (0, 0, 0); + } + model = Spawn( "script_model", origin ); + model SetModel( model_name ); + if( IsDefined( angles ) ) + { + model.angles = angles; + } + return model; +} +is_plane() +{ + if(self.vehicleclass == "plane") + { + return true; + } + return false; +} +is_boat() +{ + if(self.vehicleclass == "boat") + { + return true; + } + return false; +} +is_helicopter() +{ + if(self.vehicleclass == "helicopter") + { + return true; + } + return false; +} +is_tank() +{ + if(self.vehicleclass == "tank") + { + return true; + } + return false; +} +is_artillery() +{ + if(self.vehicleclass == "artillery") + { + return true; + } + return false; +} +is_4wheel() +{ + if(self.vehicleclass == "4 wheel") + { + return true; + } + return false; +} +is_vehicle() +{ + return (IsDefined(self.classname) && (self.classname == "script_vehicle")); +} +go_path(path_start) +{ + self maps\_vehicle::getonpath(path_start); + self maps\_vehicle::gopath(); +} +disable_driver_turret() +{ + self notify( "stop_turret_shoot"); +} +enable_driver_turret() +{ + self notify( "stop_turret_shoot"); + self thread maps\_vehicle::turret_attack_think(); +} +set_switch_node(src_node, dst_node) +{ + assert(IsDefined(src_node)); + assert(IsDefined(dst_node)); + self.bSwitchingNodes = true; + self.dst_node = dst_node; + self SetSwitchNode(src_node, dst_node); +} +create_billboard() +{ + level.billboardBlack = newHudElem(); + level.billboardBlack.x = 268; + level.billboardBlack.y = 20; + level.billboardBlack.horzAlign = "fullscreen"; + level.billboardBlack.vertAlign = "fullscreen"; + level.billboardBlack.sort = 0; + level.billboardBlack.alpha = .3; + level.billboardBlack setShader("black", 120, 55); + level.billboardWhite = newHudElem(); + level.billboardWhite.x = 270; + level.billboardWhite.y = 22; + level.billboardWhite.horzAlign = "fullscreen"; + level.billboardWhite.vertAlign = "fullscreen"; + level.billboardWhite.sort = 1; + level.billboardWhite.alpha = .3; + level.billboardWhite setShader("white", 116, 50); + level.billboardName = NewHudElem(); + level.billboardName.alignX = "left"; + level.billboardName.x = 260; + level.billboardName.y = 25; + level.billboardName.sort = 2; + level.billboardName.fontscale = 1.0; + level.billboardName.color = ( 0, 0, 0 ); + level.billboardType = NewHudElem(); + level.billboardType.alignX = "left"; + level.billboardType.x = 260; + level.billboardType.y = 40; + level.billboardType.sort = 2; + level.billboardType.fontscale = 1.0; + level.billboardType.color = ( 0, 0, 0 ); + level.billboardSize = NewHudElem(); + level.billboardSize.alignX = "left"; + level.billboardSize.x = 260; + level.billboardSize.y = 55; + level.billboardSize.sort = 2; + level.billboardSize.fontscale = 1.0; + level.billboardSize.color = ( 0, 0, 0 ); + level.billboardName setText("Name: "); + level.billboardType setText( "Type:" ); + level.billboardSize setText( "Size:" ); +} +destroy_billboard() +{ + assertEx( IsDefined( level.billboardName ), "No billboard is created call create_billboard" ); + level.billboardBlack destroy(); + level.billboardWhite destroy(); + level.billboardName destroy(); + level.billboardType destroy(); + level.billboardSize destroy(); +} +update_billboard( event_name, event_type, event_size, event_state, disable_fade ) +{ + assertEx( IsDefined( level.billboardName ), "No billboard is created call create_billboard" ); + if( !IsDefined(event_name) ) + { + event_name = "undefined"; + } + if( !IsDefined(event_type) ) + { + event_type = "undefined"; + } + if( !IsDefined(event_size) ) + { + event_size = "undefined"; + } + color = "black"; + for(i = 0; i < 10; i++) + { + if(color == "black") + { + level.billboardName.color = ( 1, 0, 0); + level.billboardType.color = ( 1, 0, 0 ); + level.billboardSize.color = ( 1, 0, 0 ); + color = "red"; + } + else + { + level.billboardName.color = ( 0, 0, 0); + level.billboardType.color = ( 0, 0, 0 ); + level.billboardSize.color = ( 0, 0, 0 ); + color = "black"; + } + wait(0.1); + } + level.billboardBlack.alpha = 1; + level.billboardWhite.alpha = 1; + if( IsDefined(event_state)) + { + level.billboardName setText( "Name: " + event_name + " (" + event_state + ")" ); + } + else + { + level.billboardName setText( "Name: " + event_name ); + } + level.billboardType setText( "Type: " + event_type ); + level.billboardSize setText( "Size: " + event_size ); + wait(3); + if(IsDefined(disable_fade) && disable_fade) + { + return; + } + deltaT = 0.7 / 60; + for(i = 0; i < 60; i++) + { + level.billboardBlack.alpha -= deltaT; + level.billboardWhite.alpha -= deltaT; + wait(0.05); + } +} +heli_toggle_main_rotor_fx( alternate ) +{ + if(alternate) + { + self SetClientFlag(0); + } + else + { + self ClearClientFlag(0); + } +} +veh_toggle_tread_fx( on ) +{ + if(!on) + { + self SetClientFlag(6); + } + else + { + self ClearClientFlag(6); + } +} +veh_toggle_exhaust_fx( on ) +{ + if(!on) + { + self SetClientFlag(8); + } + else + { + self ClearClientFlag(8); + } +} +veh_toggle_lights( on ) +{ + if(on) + { + self SetClientFlag(10); + } + else + { + self ClearClientFlag(10); + } +} +heli_toggle_rotor_fx( on ) +{ + if(!on) + { + self SetClientFlag(1); + } + else + { + self ClearClientFlag(1); + } +} +vehicle_toggle_sounds( on ) +{ + if(!on) + { + self SetClientFlag(2); + } + else + { + self ClearClientFlag(2); + } +} +spawn_manager_set_global_active_count( cnt ) +{ + AssertEx( cnt <= 32, "Max number of Active AI at a given time cant be more than 32" ); + level.spawn_manager_max_ai = cnt; +} +sm_use_trig_when_complete( spawn_manager_targetname, trig_name, trig_key, once_only ) +{ + self thread sm_use_trig_when_complete_internal( spawn_manager_targetname, trig_name, trig_key, once_only ); +} +sm_use_trig_when_complete_internal( spawn_manager_targetname, trig_name, trig_key, once_only ) +{ + if(IsDefined(once_only) && once_only ) + { + trigger = GetEnt(trig_name, trig_key); + AssertEX(IsDefined(trigger), "The trigger " + trig_key + " / " + trig_name + " does not exist."); + trigger endon("trigger"); + } + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + flag_wait("sm_" + spawn_manager_targetname + "_complete"); + trigger_use(trig_name, trig_key); + } + else + { + AssertMsg("sm_use_trig_when_complete: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +sm_use_trig_when_cleared( spawn_manager_targetname, trig_name, trig_key, once_only ) +{ + self thread sm_use_trig_when_cleared_internal( spawn_manager_targetname, trig_name, trig_key, once_only ); +} +sm_use_trig_when_cleared_internal( spawn_manager_targetname, trig_name, trig_key, once_only ) +{ + if(IsDefined(once_only) && once_only ) + { + trigger = GetEnt(trig_name, trig_key); + AssertEX(IsDefined(trigger), "The trigger " + trig_key + " / " + trig_name + " does not exist."); + trigger endon("trigger"); + } + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + flag_wait("sm_" + spawn_manager_targetname + "_cleared"); + trigger_use(trig_name, trig_key); + } + else + { + AssertMsg("sm_use_trig_when_cleared: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +sm_use_trig_when_enabled( spawn_manager_targetname, trig_name, trig_key, once_only ) +{ + self thread sm_use_trig_when_enabled_internal( spawn_manager_targetname, trig_name, trig_key, once_only ); +} +sm_use_trig_when_enabled_internal( spawn_manager_targetname, trig_name, trig_key, once_only ) +{ + if(IsDefined(once_only) && once_only ) + { + trigger = GetEnt(trig_name, trig_key); + AssertEX(IsDefined(trigger), "The trigger " + trig_key + " / " + trig_name + " does not exist."); + trigger endon("trigger"); + } + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + flag_wait("sm_" + spawn_manager_targetname + "_enabled"); + trigger_use(trig_name, trig_key); + } + else + { + AssertMsg("sm_use_trig_when_cleared: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +sm_run_func_when_complete( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 ) +{ + self thread sm_run_func_when_complete_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 ); +} +sm_run_func_when_complete_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 ) +{ + AssertEx(IsDefined(process), "sm_run_func_when_complete: the function is not defined"); + AssertEx(level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ), "sm_run_func_when_complete: Spawn manager '" + spawn_manager_targetname + "' not found."); + waittill_spawn_manager_complete( spawn_manager_targetname ); + single_func(ent, process, var1, var2, var3, var4, var5); +} +sm_run_func_when_cleared( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 ) +{ + self thread sm_run_func_when_cleared_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 ); +} +sm_run_func_when_cleared_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 ) +{ + AssertEx(IsDefined(process), "sm_run_func_when_cleared: the function is not defined"); + AssertEx(level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ), "sm_run_func_when_cleared: Spawn manager '" + spawn_manager_targetname + "' not found."); + waittill_spawn_manager_cleared(spawn_manager_targetname); + single_func(ent, process, var1, var2, var3, var4, var5); +} +sm_run_func_when_enabled( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 ) +{ + self thread sm_run_func_when_enabled_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 ); +} +sm_run_func_when_enabled_internal( spawn_manager_targetname, process, ent, var1, var2, var3, var4, var5 ) +{ + AssertEx(IsDefined(process), "sm_run_func_when_enabled: the function is not defined"); + AssertEx(level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ), "sm_run_func_when_enabled: Spawn manager '" + spawn_manager_targetname + "' not found."); + waittill_spawn_manager_enabled( spawn_manager_targetname ); + single_func(ent, process, var1, var2, var3, var4, var5); +} +spawn_manager_enable( spawn_manager_targetname, no_assert ) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + for (i = 0; i < level.spawn_managers.size; i++) + { + if (level.spawn_managers[i].sm_id == spawn_manager_targetname) + { + level.spawn_managers[i] notify("enable"); + return; + } + } + } + else if (!is_true(no_assert)) + { + AssertMsg("spawn_manager_enable: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +spawn_manager_disable( spawn_manager_targetname, no_assert ) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + for( i = 0; i < level.spawn_managers.size; i++ ) + { + if( level.spawn_managers[i].sm_id == spawn_manager_targetname ) + { + level.spawn_managers[i] notify("disable"); + return; + } + } + } + else if (!is_true(no_assert)) + { + AssertMsg("spawn_manager_disable: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +spawn_manager_kill( spawn_manager_targetname, no_assert ) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + for( i = 0; i < level.spawn_managers.size; i++ ) + { + if( level.spawn_managers[i].sm_id == spawn_manager_targetname ) + { + level.spawn_managers[i] notify("kill"); + return; + } + } + } + else if (!is_true(no_assert)) + { + AssertMsg("spawn_manager_kill: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +is_spawn_manager_enabled( spawn_manager_targetname ) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + if( flag( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + return true; + } + return false; + } + else + { + AssertMsg("is_spawn_manager_enabled: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +is_spawn_manager_complete( spawn_manager_targetname ) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + if( flag( "sm_" + spawn_manager_targetname + "_complete" ) ) + { + return true; + } + return false; + } + else + { + AssertMsg("is_spawn_manager_complete: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +is_spawn_manager_cleared( spawn_manager_targetname ) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + if( flag( "sm_" + spawn_manager_targetname + "_cleared" ) ) + { + return true; + } + return false; + } + else + { + AssertMsg("is_spawn_manager_cleared: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +is_spawn_manager_killed( spawn_manager_targetname ) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + if( flag( "sm_" + spawn_manager_targetname + "_killed" ) ) + { + return true; + } + return false; + } + else + { + AssertMsg("is_spawn_manager_killed: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +waittill_spawn_manager_cleared(spawn_manager_targetname) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + flag_wait("sm_" + spawn_manager_targetname + "_cleared"); + } + else + { + AssertMsg("waittill_spawn_manager_cleared: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +waittill_spawn_manager_ai_remaining(spawn_manager_targetname, count_to_reach) +{ + AssertEX( IsDefined(count_to_reach), "# of AI remaining not specified in _utility::waittill_spawn_manager_ai_remaining()"); + AssertEX( count_to_reach, "# of AI remaining specified in _utility::waittill_spawn_manager_ai_remaining() is 0, use waittill_spawn_manager_cleared" ); + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + flag_wait("sm_" + spawn_manager_targetname + "_complete"); + } + else + { + AssertMsg("waittill_spawn_manager_ai_remaining: Spawn manager '" + spawn_manager_targetname + "' not found."); + } + if( flag( "sm_" + spawn_manager_targetname + "_cleared" ) ) + { + return; + } + spawn_manager = maps\_spawn_manager::get_spawn_manager_array( spawn_manager_targetname ); + AssertEx( spawn_manager.size, "Somehow the spawn manager doesnt exist, but related flag existed before." ); + AssertEx( ( spawn_manager.size == 1 ), "Found two spawn managers with same targetname." ); + while( ( IsDefined( spawn_manager[0] ) ) && ( spawn_manager[0].activeAI.size > count_to_reach ) ) + { + wait(0.1); + } +} +waittill_spawn_manager_complete(spawn_manager_targetname) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + flag_wait("sm_" + spawn_manager_targetname + "_complete"); + } + else + { + AssertMsg("waittill_spawn_manager_complete: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +waittill_spawn_manager_enabled(spawn_manager_targetname) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + flag_wait("sm_" + spawn_manager_targetname + "_enabled"); + } + else + { + AssertMsg("waittill_spawn_manager_enabled: Spawn manager '" + spawn_manager_targetname + "' not found."); + } +} +waittill_spawn_manager_spawned_count( spawn_manager_targetname, count ) +{ + if( level flag_exists( "sm_" + spawn_manager_targetname + "_enabled" ) ) + { + flag_wait("sm_" + spawn_manager_targetname + "_enabled"); + } + else + { + AssertMsg("waittill_spawn_manager_spawned_count: Spawn manager '" + spawn_manager_targetname + "' not found."); + } + spawn_manager = maps\_spawn_manager::get_spawn_manager_array( spawn_manager_targetname ); + AssertEx( spawn_manager.size, "Somehow the spawn manager doesnt exist, but related flag existed before." ); + AssertEx( ( spawn_manager.size == 1 ), "Found two spawn managers with same targetname." ); + Assert( spawn_manager[0].count > count, "waittill_spawn_manager_spawned_count : Count should be less than total count on the spawn manager." ); + original_count = spawn_manager[0].count; + while(1) + { + if( IsDefined( spawn_manager[0].spawnCount ) && ( spawn_manager[0].spawnCount < count ) && !is_spawn_manager_killed( spawn_manager_targetname ) ) + { + wait(0.5); + } + else + { + break; + } + } + return; +} +contextual_melee(melee_name, which_set) +{ + self maps\_contextual_melee::main(melee_name, which_set); +} +add_meatshield_target(meatshield, scripted) +{ + maps\_meatshield::add_target(meatshield, scripted); +} +add_meatshield_angle_limits(guy, leftarc, rightarc) +{ + maps\_meatshield::add_angle_limits( guy, leftarc, rightarc ); +} +veh_magic_bullet_shield( on ) +{ + assertex(!IsAI(self), "This is for vehicles, please use magic_bullet_shield for AI."); + assertex(!IsPlayer(self), "This is for vehicles, please use magic_bullet_shield for players."); + if(!on) + { + self maps\_vehicle::godoff(); + } + else + { + self maps\_vehicle::godon(); + } +} +OnFirstPlayerConnect_Callback(func) +{ + maps\_callbackglobal::AddCallback("on_first_player_connect", func); +} +OnFirstPlayerConnect_CallbackRemove(func) +{ + maps\_callbackglobal::RemoveCallback("on_first_player_connect", func); +} +OnPlayerConnect_Callback(func) +{ + maps\_callbackglobal::AddCallback("on_player_connect", func); +} +OnPlayerConnect_CallbackRemove(func) +{ + maps\_callbackglobal::RemoveCallback("on_player_connect", func); +} +OnPlayerDisconnect_Callback(func) +{ + maps\_callbackglobal::AddCallback("on_player_disconnect", func); +} +OnPlayerDisconnect_CallbackRemove(func) +{ + maps\_callbackglobal::RemoveCallback("on_player_disconnect", func); +} +OnPlayerDamage_Callback(func) +{ + maps\_callbackglobal::AddCallback("on_player_damage", func); +} +OnPlayerDamage_CallbackRemove(func) +{ + maps\_callbackglobal::RemoveCallback("on_player_damage", func); +} +OnPlayerLastStand_Callback(func) +{ + maps\_callbackglobal::AddCallback("on_player_last_stand", func); +} +OnPlayerLastStand_CallbackRemove(func) +{ + maps\_callbackglobal::RemoveCallback("on_player_last_stand", func); +} +OnPlayerKilled_Callback(func) +{ + maps\_callbackglobal::AddCallback("on_player_killed", func); +} +OnPlayerKilled_CallbackRemove(func) +{ + maps\_callbackglobal::RemoveCallback("on_player_killed", func); +} +OnActorDamage_Callback(func) +{ + maps\_callbackglobal::AddCallback("on_actor_damage", func); +} +OnActorDamage_CallbackRemove(func) +{ + maps\_callbackglobal::RemoveCallback("on_actor_damage", func); +} +OnActorKilled_Callback(func) +{ + maps\_callbackglobal::AddCallback("on_actor_killed", func); +} +OnActorKilled_CallbackRemove(func) +{ + maps\_callbackglobal::RemoveCallback("on_actor_killed", func); +} +OnVehicleDamage_Callback(func) +{ + maps\_callbackglobal::AddCallback("on_vehicle_damage", func); +} +OnVehicleDamage_CallbackRemove(func) +{ + maps\_callbackglobal::RemoveCallback("on_vehicle_damage", func); +} +OnSaveRestored_Callback(func) +{ + maps\_callbackglobal::AddCallback("on_save_restored", func); +} +OnSaveRestored_CallbackRemove(func) +{ + maps\_callbackglobal::RemoveCallback("on_save_restored", func); +} +aim_at_target(target, duration) +{ + self endon("death"); + self endon("stop_aim_at_target"); + assert( IsDefined(target) ); + if( !IsDefined(target) ) + { + return; + } + self SetEntityTarget( target ); + self.a.allow_shooting = false; + if( IsDefined(duration) && duration > 0 ) + { + elapsed = 0; + while( elapsed < duration ) + { + elapsed += 0.05; + wait(0.05); + } + stop_aim_at_target(); + } +} +stop_aim_at_target() +{ + self ClearEntityTarget(); + self.a.allow_shooting = true; + self notify("stop_aim_at_target"); +} +shoot_at_target(target, tag, fireDelay, duration) +{ + self endon("death"); + self endon("stop_shoot_at_target"); + assert( IsDefined(target) ); + if( !IsDefined(target) ) + { + return; + } + if( IsDefined(tag) && tag != "" && tag != "tag_eye" && tag != "tag_head" ) + { + self SetEntityTarget( target, 1, tag ); + } + else + { + self SetEntityTarget( target ); + } + self animscripts\weaponList::RefillClip(); + if( IsDefined(fireDelay) && fireDelay > 0 ) + { + self.a.allow_shooting = false; + wait( fireDelay ); + } + self.a.allow_shooting = true; + self.cansee_override = true; + self call_overloaded_func( "animscripts\shoot_behavior", "setShootEnt", target ); + self waittill("shoot"); + if( IsDefined(duration) ) + { + if( duration > 0) + { + elapsed = 0; + while( elapsed < duration ) + { + elapsed += 0.05; + wait(0.05); + } + } + else if (duration == -1) + { + target waittill("death"); + } + } + stop_shoot_at_target(); +} +shoot_at_target_untill_dead(target, tag, fireDelay) +{ + shoot_at_target(target, tag, fireDelay, -1); +} +stop_shoot_at_target() +{ + self ClearEntityTarget(); + self.cansee_override = false; + self notify("stop_shoot_at_target"); +} +add_trigger_to_ent(ent) +{ + if(!IsDefined(ent._triggers)) + { + ent._triggers = []; + } + ent._triggers[self GetEntityNumber()] = 1; +} +remove_trigger_from_ent(ent) +{ + if(!IsDefined(ent._triggers)) + return; + if(!IsDefined(ent._triggers[self GetEntityNumber()])) + return; + ent._triggers[self GetEntityNumber()] = 0; +} +ent_already_in_trigger(trig) +{ + if(!IsDefined(self._triggers)) + return false; + if(!IsDefined(self._triggers[trig GetEntityNumber()])) + return false; + if(!self._triggers[trig GetEntityNumber()]) + return false; + return true; +} +trigger_thread(ent, on_enter_payload, on_exit_payload) +{ + ent endon("entityshutdown"); + ent endon("death"); + if(ent ent_already_in_trigger(self)) + return; + self add_trigger_to_ent(ent); + endon_condition = "leave_trigger_" + self GetEntityNumber(); + if(IsDefined(on_enter_payload)) + { + self thread [[on_enter_payload]](ent, endon_condition); + } + while(IsDefined(ent) && ent IsTouching(self)) + { + wait(0.01); + } + ent notify(endon_condition); + if(IsDefined(ent) && IsDefined(on_exit_payload)) + { + self thread [[on_exit_payload]](ent); + } + if(IsDefined(ent)) + { + self remove_trigger_from_ent(ent); + } +} +set_swimming_depth_of_field( toggle, set_values, near_start, near_end, far_start, far_end, near_blur, far_blur) +{ + AssertEx(IsDefined(toggle), "toggle must be set to true or false"); + if(toggle) + { + level._swimming.toggle_depth_of_field = true; + if(IsDefined(set_values) && set_values) + { + AssertEx(IsDefined(near_start), "Depth of Field value near_start undefined"); + AssertEx(IsDefined(near_end), "Depth of Field value near_end undefined"); + AssertEx(IsDefined(far_start), "Depth of Field value far_start undefined"); + AssertEx(IsDefined(far_end), "Depth of Field value far_end undefined"); + AssertEx(IsDefined(near_blur), "Depth of Field value near_blur undefined"); + AssertEx(IsDefined(far_blur), "Depth of Field value far_blur undefined"); + AssertEx(near_start < near_end, "Depth of Field value near_start must be < near_end"); + AssertEx(far_start < far_end, "Depth of Field value far_start must be < far_end"); + level._swimming.dof_near_start = near_start; + level._swimming.dof_near_end = near_end; + level._swimming.dof_far_start = far_start; + level._swimming.dof_far_end = far_end; + level._swimming.dof_near_blur = near_blur; + level._swimming.dof_far_blur = far_blur; + } + } + else if(!toggle) + { + level._swimming.toggle_depth_of_field = false; + } +} +disable_swimming() +{ + self maps\_swimming::disable(); +} +enable_swimming() +{ + self maps\_swimming::enable(); +} +hide_swimming_arms() +{ + self ClientNotify("_swimming:hide_arms"); +} +show_swimming_arms() +{ + self ClientNotify("_swimming:show_arms"); +} +delete_ents( mask, origin, radius ) +{ + ents = entsearch( mask, origin, radius ); + for( i = 0; i < ents.size; i++ ) + { + ents[i] delete(); + } +} +set_drop_weapon(weapon_name) +{ + AssertEx(IsDefined(weapon_name) && IsString(weapon_name), "_utility::set_drop_weapon: Invalid weapon name!"); + self.script_dropweapon = weapon_name; +} +take_and_giveback_weapons(mynotify, no_autoswitch) +{ + take_weapons(); + self waittill (mynotify); + give_weapons(no_autoswitch); +} +take_weapons() +{ + self.curweapon = self GetCurrentWeapon(); + self.weapons_list = self GetWeaponsList(); + self.offhand = self GetCurrentOffhand(); + weapon_list_modified = []; + for ( i = 0; i < self.weapons_list.size; i++) + { + if( !is_weapon_attachment( self.weapons_list[i] ) ) + weapon_list_modified[ weapon_list_modified.size ] = self.weapons_list[i]; + } + self.weapons_list = weapon_list_modified; + if( is_weapon_attachment( self.curweapon ) ) + { + self.curweapon = get_baseweapon_for_attachment( self.curweapon ); + } + self.weapons_info = []; + for ( i = 0; i < self.weapons_list.size; i++) + { + self.weapons_info[i] = SpawnStruct(); + if (IsDefined(self.offhand) && self.weapons_list[i] == self.offhand ) + { + self.weapons_info[i]._ammo = 0; + self.weapons_info[i]._stock = self GetWeaponAmmoStock(self.weapons_list[i]); + } + else + { + self.weapons_info[i]._ammo = self GetWeaponAmmoClip(self.weapons_list[i]); + self.weapons_info[i]._stock = self GetWeaponAmmoStock(self.weapons_list[i]); + self.weapons_info[i]._renderOptions = self GetWeaponRenderOptions( self.weapons_list[i] ); + } + } + self TakeAllWeapons(); +} +give_weapons(no_autoswitch) +{ + for (i=0; i < self.weapons_list.size; i++) + { + if( IsDefined( self.weapons_info[i]._renderOptions ) ) + { + self GiveWeapon(self.weapons_list[i], 0, self.weapons_info[i]._renderOptions ); + } + else + { + self GiveWeapon(self.weapons_list[i]); + } + self SetWeaponAmmoClip(self.weapons_list[i], self.weapons_info[i]._ammo); + self SetWeaponAmmoStock(self.weapons_list[i], self.weapons_info[i]._stock ); + } + self.weapons_info = undefined; + if( IsDefined( self.curweapon ) && self.curweapon != "none" && !IsDefined(no_autoswitch) ) + { + self SwitchToWeapon(self.curweapon); + } +} +is_weapon_attachment( weapon_name ) +{ + weapon_pieces = StrTok(weapon_name, "_"); + if( weapon_pieces[0] == "ft" || weapon_pieces[0] == "mk" || weapon_pieces[0] == "gl" ) + { + return true; + } + return false; +} +get_baseweapon_for_attachment( weapon_name ) +{ + Assert( is_weapon_attachment( weapon_name ) ); + weapon_pieces = StrTok( weapon_name, "_" ); + attachment = weapon_pieces[0]; + Assert( weapon_pieces[0] == "ft" || weapon_pieces[0] == "mk" || weapon_pieces[0] == "gl" || weapon_pieces[0] == "db" ); + weapon = weapon_pieces[1]; + Assert( weapon_pieces[1] != "ft" && weapon_pieces[1] != "mk" && weapon_pieces[1] != "gl" && weapon_pieces[1] != "db" ); + for ( i = 0; i < self.weapons_list.size; i++) + { + if( IsSubStr( self.weapons_list[i], weapon ) && IsSubStr( self.weapons_list[i], attachment ) ) + return self.weapons_list[i]; + } + return self.weapons_list[0]; +} +set_near_plane(val) +{ + self SetClientDvar("r_znear", val); +} +reset_near_plane() +{ + self SetClientDvar("r_znear", 4); +} +average_origin( ent_array ) +{ + AssertEx( IsArray(ent_array), "_utility::average_position passed a non-array" ); + AssertEx( ent_array.size > 0, "_utility::average_position passed a size zero array"); + if(IsVec(ent_array[0])) + { + return(average_origin_internal( ent_array )); + } + org_array = []; + for(i=0; i 0)) + { + camera = linked_ent GetTagOrigin("tag_camera"); + if (IsDefined(camera)) + { + return camera; + } + } + } + pos = self GetEye(); + return pos; +} +vehicle_node_wait( strName, strKey ) +{ + if( !IsDefined( strKey ) ) + { + strKey = "targetname"; + } + nodes = GetVehicleNodeArray( strName, strKey ); + AssertEX( IsDefined(nodes) && nodes.size > 0, "_utility::vehicle_node_wait - vehicle node not found: " + strName + " key: " + strKey ); + ent = SpawnStruct(); + array_thread( nodes, common_scripts\utility::trigger_wait_think, ent ); + ent waittill( "trigger", eOther, node_hit ); + level notify( strName, eOther ); + if(IsDefined(node_hit)) + { + node_hit.who = eother; + return node_hit; + } + else + { + return eOther; + } +} +timescale_tween(start, end, time, delay, step_time) +{ + DEFAULT_STEP_TIME = .1; + if (!IsDefined(step_time)) + { + step_time = DEFAULT_STEP_TIME; + } + num_steps = time / step_time; + time_scale_range = end - start; + time_scale_step = 0; + if (num_steps > 0) + { + time_scale_step = abs(time_scale_range) / num_steps; + } + if (IsDefined(delay)) + { + wait delay; + } + level notify("timescale_tween"); + level endon("timescale_tween"); + time_scale = start; + SetTimeScale(time_scale); + while (time_scale != end) + { + wait(step_time); + if (time_scale_range > 0) + { + time_scale = min(time_scale + time_scale_step, end); + } + else if (time_scale_range < 0) + { + time_scale = max(time_scale - time_scale_step, end); + } + SetTimeScale(time_scale); + } +} +player_seek( delayed ) +{ + self endon("death"); + self.ignoresuppression = 1; + if( IsDefined( self.target ) || IsDefined( self.script_spawner_targets ) ) + { + self waittill("goal"); + } + while(1) + { + if( IsDefined( delayed ) ) + { + wait( RandomIntRange( 6, 12 ) ); + } + else + { + wait( 0.05 ); + } + if( self.goalradius > 100 ) + { + self.goalradius = self.goalradius - 100; + } + self.pathenemyFightdist = self.goalradius; + closest_player = get_closest_player( self.origin ); + self SetGoalEntity( closest_player ); + self animscripts\combat_utility::FindCoverNearSelf(); + } +} +set_spawner_targets(spawner_targets) +{ + self thread maps\_spawner::go_to_spawner_target(StrTok(spawner_targets," ")); +} +ragdoll_death() +{ + self animscripts\utility::do_ragdoll_death(); +} +is_destructible() +{ + if (!IsDefined(self.script_noteworthy)) + { + return false; + } + switch (self.script_noteworthy) + { + case "explodable_barrel": + return true; + } + return false; +} +register_overloaded_func( filename, funcname, func ) +{ + if ( !isDefined( level._overloaded_funcs ) ) + { + level._overloaded_funcs = []; + } + if ( !isDefined( level._overloaded_funcs[filename] ) ) + { + level._overloaded_funcs[filename] = []; + } + if ( isDefined( level._overloaded_funcs[filename][funcname] ) ) + { + error( "Tried to call register_overloaded_func() on a previously registered filename['" + filename + "']/funcname['" + funcname + "'] combination." ); + return; + } + level._overloaded_funcs[filename][funcname] = func; +} +call_overloaded_func( filename, funcname, var1, var2, var3, var4, var5 ) +{ + if ( !isDefined( level._overloaded_funcs ) ) + { + if ( GetDvar( #"zombiemode" ) == "1" ) + { + println( "call_overloaded_func: no overloaded_funcs registered." ); + } + else + { + assertex( false, "call_overloaded_func: no overloaded_funcs registered." ); + } + return false; + } + if ( !isDefined( level._overloaded_funcs[filename] ) ) + { + if ( GetDvar( #"zombiemode" ) == "1" ) + { + println( "call_overloaded_func: no overloaded_funcs registered for filename: '" + filename + "'." ); + } + else + { + assertex( false, "call_overloaded_func: no overloaded_funcs registered for filename: '" + filename + "'." ); + } + return false; + } + if ( !isDefined( level._overloaded_funcs[filename][funcname] ) ) + { + if ( GetDvar( #"zombiemode" ) == "1" ) + { + println( "call_overloaded_func: no overloaded_func registered for filename['" + filename + "']/funcname['" + funcname + "'] combination." ); + } + else + { + assertex( false, "call_overloaded_func: no overloaded_func registered for filename['" + filename + "']/funcname['" + funcname + "'] combination." ); + } + return false; + } + if ( IsDefined( var5 ) ) + { + return self [[ level._overloaded_funcs[filename][funcname] ]]( var1, var2, var3, var4, var5 ); + } + if ( IsDefined( var4 ) ) + { + return self [[ level._overloaded_funcs[filename][funcname] ]]( var1, var2, var3, var4 ); + } + if ( IsDefined( var3 ) ) + { + return self [[ level._overloaded_funcs[filename][funcname] ]]( var1, var2, var3 ); + } + if ( IsDefined( var2 ) ) + { + return self [[ level._overloaded_funcs[filename][funcname] ]]( var1, var2 ); + } + if ( IsDefined( var1 ) ) + { + return self [[ level._overloaded_funcs[filename][funcname] ]]( var1 ); + } + return self [[ level._overloaded_funcs[filename][funcname] ]](); +} +get_overloaded_func( filename, funcname ) +{ + if ( !isDefined( level._overloaded_funcs ) ) + { + if ( GetDvar( #"zombiemode" ) == "1" ) + { + println( "get_overloaded_func: no overloaded_funcs registered." ); + } + else + { + assertex( false, "get_overloaded_func: no overloaded_funcs registered." ); + } + return false; + } + if ( !isDefined( level._overloaded_funcs[filename] ) ) + { + if ( GetDvar( #"zombiemode" ) == "1" ) + { + println( "get_overloaded_func: no overloaded_funcs registered for filename: '" + filename + "'." ); + } + else + { + assertex( false, "get_overloaded_func: no overloaded_funcs registered for filename: '" + filename + "'." ); + } + return false; + } + if ( !isDefined( level._overloaded_funcs[filename][funcname] ) ) + { + if ( GetDvar( #"zombiemode" ) == "1" ) + { + println( "get_overloaded_func: no overloaded_func registered for filename['" + filename + "']/funcname['" + funcname + "'] combination." ); + } + else + { + assertex( false, "get_overloaded_func: no overloaded_func registered for filename['" + filename + "']/funcname['" + funcname + "'] combination." ); + } + return false; + } + return level._overloaded_funcs[filename][funcname]; +} +waittill_not_moving() +{ + self endon("death"); + self endon( "disconnect" ); + self endon( "detonated" ); + level endon( "game_ended" ); + prevorigin = self.origin; + while(1) + { + wait .15; + if ( self.origin == prevorigin ) + break; + prevorigin = self.origin; + } +} +turn_off_friendly_player_look() +{ + level._dont_look_at_player = true; +} +turn_on_friendly_player_look() +{ + level._dont_look_at_player = false; +} +force_goal(node_or_org, radius, shoot, end_on, keep_colors) +{ + self endon("death"); + goalradius = self.goalradius; + if (IsDefined(radius)) + { + self.goalradius = radius; + } + color_enabled = false; + if (!is_true(keep_colors)) + { + if (IsDefined(get_force_color())) + { + color_enabled = true; + self disable_ai_color(); + } + } + allowpain = self.allowpain; + allowreact = self.allowreact; + ignoreall = self.ignoreall; + ignoreme = self.ignoreme; + dontshootwhilemoving = self.dontshootwhilemoving; + ignoresuppression = self.ignoresuppression; + suppressionthreshold = self.suppressionthreshold; + nododgemove = self.nododgemove; + grenadeawareness = self.grenadeawareness; + pathenemylookahead = self.pathenemylookahead; + pathenemyfightdist = self.pathenemyfightdist; + meleeattackdist = self.meleeattackdist; + fixednodesaferadius = self.fixednodesaferadius; + if (is_false(shoot)) + { + self set_ignoreall(true); + } + self.dontshootwhilemoving = undefined; + self.pathenemyfightdist = 0; + self.pathenemylookahead = 0; + self.ignoresuppression = true; + self.suppressionthreshold = 1; + self.nododgemove = true; + self.grenadeawareness = 0; + self.meleeattackdist = 0; + self.fixednodesaferadius = 0; + if ( GetDvar( #"zombiemode" ) != "1" ) + { + self set_ignoreme(true); + self disable_react(); + self disable_pain(); + } + self PushPlayer(true); + if (IsDefined(node_or_org)) + { + if (IsVec(node_or_org)) + { + self set_goal_pos(node_or_org); + } + else + { + self set_goal_node(node_or_org); + } + } + if (IsDefined(end_on)) + { + self waittill(end_on); + } + else + { + self waittill("goal"); + } + if (color_enabled) + { + enable_ai_color(); + } + self PushPlayer(false); + if ( GetDvar( #"zombiemode" ) == "1" ) + { + if (IsDefined(radius)) + { + self.goalradius = goalradius; + } + } + else + { + self.goalradius = goalradius; + self set_ignoreall(ignoreall); + self set_ignoreme(ignoreme); + if (allowpain) + { + self enable_pain(); + } + if (allowreact) + { + self enable_react(); + } + } + self.ignoresuppression = ignoresuppression; + self.suppressionthreshold = suppressionthreshold; + self.nododgemove = nododgemove; + self.dontshootwhilemoving = dontshootwhilemoving; + self.grenadeawareness = grenadeawareness; + self.pathenemylookahead = pathenemylookahead; + self.pathenemyfightdist = pathenemyfightdist; + self.meleeattackdist = meleeattackdist; + self.fixednodesaferadius = fixednodesaferadius; +} +restore_ik_headtracking_limits() +{ + SetSavedDvar("ik_pitch_limit_thresh", 10); + SetSavedDvar("ik_pitch_limit_max", 60); + SetSavedDvar("ik_roll_limit_thresh", 30); + SetSavedDvar("ik_roll_limit_max", 100); + SetSavedDvar("ik_yaw_limit_thresh", 10); + SetSavedDvar("ik_yaw_limit_max", 90); +} +relax_ik_headtracking_limits() +{ + SetSavedDvar("ik_pitch_limit_thresh", 110); + SetSavedDvar("ik_pitch_limit_max", 120); + SetSavedDvar("ik_roll_limit_thresh", 90); + SetSavedDvar("ik_roll_limit_max", 100); + SetSavedDvar("ik_yaw_limit_thresh", 80); + SetSavedDvar("ik_yaw_limit_max", 90); +} +do_notetracks(flag) +{ + self animscripts\shared::DoNoteTracks(flag); +} +rumble_delay(delay, rumble) +{ + wait delay; + self PlayRumbleOnEntity(rumble); +} +enable_random_weapon_drops() +{ + level.rw_enabled = true; +} +disable_random_weapon_drops() +{ + level.rw_enabled = false; +} +enable_random_alt_weapon_drops() +{ + level.rw_attachments_allowed = true; +} +disable_random_alt_weapon_drops() +{ + level.rw_attachments_allowed = false; +} +set_random_alt_weapon_drops( attachment_abbreviation, on_or_off ) +{ + AssertEX(IsDefined(attachment_abbreviation), "set_random_alt_weapon_drops called without passing in an attachment type"); + AssertEX(IsDefined(on_or_off), "set_random_alt_weapon_drops called without telling the function whether it is on or off"); + switch( attachment_abbreviation ) + { + case "ft": + level.rw_ft_allowed = on_or_off; + break; + case "gl": + level.rw_gl_allowed = on_or_off; + break; + case "mk": + level.rw_mk_allowed = on_or_off; + break; + default: + AssertEX(false, "Weapon of type: " + attachment_abbreviation + " is not a valid attachment abbreviation." ); + break; + } +} +button_held_think(which_button) +{ + self endon("disconnect"); + if (!IsDefined(self._holding_button)) + { + self._holding_button = []; + } + self._holding_button[which_button] = false; + time_started = 0; + use_time = GetDvarInt("g_useholdtime"); + while(1) + { + if(self._holding_button[which_button]) + { + if(!self [[level._button_funcs[which_button]]]()) + { + self._holding_button[which_button] = false; + } + } + else + { + if(self [[level._button_funcs[which_button]]]()) + { + if(time_started == 0) + { + time_started = GetTime(); + } + if((GetTime() - time_started) > use_time) + { + self._holding_button[which_button] = true; + } + } + else + { + if(time_started != 0) + { + time_started = 0; + } + } + } + wait(0.05); + } +} +use_button_held() +{ + init_button_wrappers(); + if(!IsDefined(self._use_button_think_threaded)) + { + self thread button_held_think(level.BUTTON_USE); + self._use_button_think_threaded = true; + } + return self._holding_button[level.BUTTON_USE]; +} +ads_button_held() +{ + init_button_wrappers(); + if(!IsDefined(self._ads_button_think_threaded)) + { + self thread button_held_think(level.BUTTON_ADS); + self._ads_button_think_threaded = true; + } + return self._holding_button[level.BUTTON_ADS]; +} +attack_button_held() +{ + init_button_wrappers(); + if(!IsDefined(self._attack_button_think_threaded)) + { + self thread button_held_think(level.BUTTON_ATTACK); + self._attack_button_think_threaded = true; + } + return self._holding_button[level.BUTTON_ATTACK]; +} +use_button_pressed() +{ + return (self UseButtonPressed()); +} +ads_button_pressed() +{ + return (self AdsButtonPressed()); +} +attack_button_pressed() +{ + return (self AttackButtonPressed()); +} +init_button_wrappers() +{ + if (!IsDefined(level._button_funcs)) + { + level.BUTTON_USE = 0; + level.BUTTON_ADS = 1; + level.BUTTON_ATTACK = 2; + level._button_funcs[level.BUTTON_USE] = ::use_button_pressed; + level._button_funcs[level.BUTTON_ADS] = ::ads_button_pressed; + level._button_funcs[level.BUTTON_ATTACK] = ::attack_button_pressed; + } +} +play_movie_on_surface(movie_name, is_looping, is_in_memory, start_on_notify, notify_when_done, notify_offset) +{ + level endon("stop_movie"); + if (!IsDefined(level.flag["movie_loaded"])) + { + flag_init("movie_loaded"); + } + if (!IsDefined(is_looping)) + { + is_looping = false; + } + if (!IsDefined(is_in_memory)) + { + is_in_memory = true; + } + if (!IsDefined(notify_offset) || notify_offset < .3) + { + notify_offset = .3; + } + level thread load_movie(movie_name, is_looping, is_in_memory, IsDefined(start_on_notify)); + if (IsDefined(start_on_notify)) + { + level waittill(start_on_notify); + } + playsoundatposition(movie_name+"_movie",(0,0,0)); + flag_wait("movie_loaded"); + Pause3DCinematic(false); + waittill_movie_done(notify_when_done, notify_offset, is_looping); + flag_clear("movie_loaded"); +} +start_movie_scene() +{ + level notify("kill_scene_subs_thread"); + level._scene_subs = []; +} +add_scene_line(scene_line, time, duration) +{ + if(!IsDefined(level._scene_subs)) + { + level._scene_subs = []; + } + sl = SpawnStruct(); + sl.line = scene_line; + sl.time = time; + sl.duration = duration; + for(i = 0; i < level._scene_subs.size; i ++) + { + if(time < level._scene_subs[i].time) + { + PrintLn("*** ERROR: Cannot add an earlier line after a later one. Times must always increase."); + return; + } + } + level._scene_subs[level._scene_subs.size] = sl; +} +sub_fade(alpha, duration) +{ + self notify("kill_fade"); + self endon("kill_fade"); + if(alpha == 1) + { + self.alpha = 0; + } + self fadeOverTime( duration ); + self.alpha = alpha; + wait( duration ); +} +do_scene_sub(sub_string, duration) +{ + if(!GetDvarInt( #"cg_subtitles")) + return; + if (!IsDefined(level.vo_hud)) + { + level.vo_hud = NewHudElem(); + level.vo_hud.fontscale = 2; + level.vo_hud.horzAlign = "center"; + level.vo_hud.vertAlign = "middle"; + level.vo_hud.alignX = "center"; + level.vo_hud.alignY = "middle"; + level.vo_hud.y = 180; + level.vo_hud.sort = 0; + } + fade_duration = 0.2; + level.vo_hud thread sub_fade(1, fade_duration); + old_scale = level.vo_hud.fontscale; + level.vo_hud.fontscale = 1.5; + old_sort = level.vo_hud.sort; + level.vo_hud.sort = 1; + level.vo_hud SetText(sub_string); + wait (duration - fade_duration); + level.vo_hud sub_fade(0, fade_duration); + level.vo_hud SetText(""); + level.vo_hud.sort = old_sort; + level.vo_hud.fontscale = old_scale; +} +playback_scene_subs() +{ + if(!IsDefined(level._scene_subs)) + { + return; + } + level notify("kill_scene_subs_thread"); + level endon("kill_scene_subs_thread"); + scene_start = GetTime(); + for(i = 0; i < level._scene_subs.size; i ++) + { + level._scene_subs[i].time = scene_start + (level._scene_subs[i].time * 1000); + } + for(i = 0; i < level._scene_subs.size; i ++) + { + while(GetTime() < level._scene_subs[i].time) + { + wait(0.05); + } + do_scene_sub(level._scene_subs[i].line, level._scene_subs[i].duration); + } + level._scene_subs = undefined; +} +play_movie(movie_name, is_looping, is_in_memory, start_on_notify, use_fullscreen_trans, notify_when_done, notify_offset, snapshot) +{ + level endon("stop_movie"); + if (!IsDefined(level.flag["movie_loaded"])) + { + flag_init("movie_loaded"); + } + if (!IsDefined(level.flag["movie_failed"])) + { + flag_init("movie_failed"); + } + if (!IsDefined(is_looping)) + { + is_looping = false; + } + if (!IsDefined(is_in_memory)) + { + is_in_memory = true; + } + if (!IsDefined(notify_offset) || notify_offset < .3) + { + notify_offset = .3; + } + if(!IsDefined (snapshot)) + { + snapshot = 0; + } + fullscreen_trans_in = "none"; + fullscreen_trans_out = "none"; + if (is_true(use_fullscreen_trans)) + { + fullscreen_trans_in = "white"; + fullscreen_trans_out = "white"; + if (IsDefined(level.movie_trans_in)) + { + fullscreen_trans_in = level.movie_trans_in; + } + if (IsDefined(level.movie_trans_out)) + { + fullscreen_trans_out = level.movie_trans_out; + } + } + level thread load_movie(movie_name, is_looping, is_in_memory, IsDefined(start_on_notify)); + if (IsDefined(start_on_notify)) + { + level waittill(start_on_notify); + } + level thread playback_scene_subs(); + level thread handle_movie_dvars(); + vision_set = movie_fade_in(movie_name, fullscreen_trans_in); + hud = start_movie(movie_name, fullscreen_trans_in); + if (flag("movie_failed")) + { + if (IsDefined(notify_when_done)) + { + wait .05; + level notify(notify_when_done); + if (IsDefined(notify_offset)) + { + wait notify_offset; + } + } + } + else + { + waittill_movie_done(notify_when_done, notify_offset, is_looping); + } + clientNotify ("pmo"); + flag_clear("movie_loaded"); + flag_clear("movie_failed"); + level.movie_trans_in = undefined; + level.movie_trans_out = undefined; + if (IsDefined(hud)) + { + hud Destroy(); + } + level thread movie_fade_out(movie_name, vision_set, fullscreen_trans_out); + level waittill_notify_or_timeout("cine_notify", 1); +} +handle_movie_dvars() +{ + players = GetPlayers(); + for (i=0;i= 100) && IsDefined(notify_when_done)) + { + level notify(notify_when_done); + } + while (timeleft >= cutoff_time) + { + if (IsDefined(notify_when_done) && (timeleft <= notify_offset)) + { + level notify(notify_when_done); + } + wait 0.05; + timeleft = GetCinematicTimeRemaining(); + PrintLn(timeleft); + if (timeleft < oldtimeleft ) + { + oldtimeleft = timeleft; + } + else + { + timeleft -= 0.05; + } + } + if (IsDefined(notify_when_done)) + { + level notify(notify_when_done); + } +} +wont_disable_player_firing() +{ + if(!IsDefined(self)) + { + return; + } + self.NoFriendlyfire = true; + self.ignoreforfriendlyfire = 1; +} +allow_divetoprone( allowed ) +{ + if( !IsDefined( allowed ) ) + { + return; + } + SetDvar( "dtp", allowed ); +} +waittill_player_shoots(weapon_type, ender) +{ + if(IsDefined(ender)) + { + self endon (ender); + } + if(!IsDefined (weapon_type)) + { + weapon_type = "any"; + } + while(1) + { + self waittill ("weapon_fired"); + gun = self GetCurrentWeapon(); + if(weapon_type == "any") + { + return gun; + } + else if(weapon_type =="silenced") + { + if( IsSubStr(gun, "silencer")) + { + return gun; + } + } + else + { + if( !IsSubStr(gun, "silencer")) + { + return gun; + } + } + continue; + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_utility_code.gsc b/BO1/PC/ZM/maps/_utility_code.gsc new file mode 100644 index 0000000..c154927 --- /dev/null +++ b/BO1/PC/ZM/maps/_utility_code.gsc @@ -0,0 +1,626 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_hud_util; +structarray_swap( object1, object2 ) +{ + index1 = object1.struct_array_index; + index2 = object2.struct_array_index; + self.array[ index2 ] = object1; + self.array[ index1 ] = object2; + self.array[ index1 ].struct_array_index = index1; + self.array[ index2 ].struct_array_index = index2; +} +waitSpread_insert( allotment ) +{ + gapIndex = -1; + gap = 0; + for ( p = 0; p < allotment.size - 1; p++ ) + { + newgap = allotment[ p + 1 ] - allotment[ p ]; + if ( newgap <= gap ) + { + continue; + } + gap = newgap; + gapIndex = p; + } + assert( gap > 0 ); + newAllotment = []; + for ( i = 0; i < allotment.size; i++ ) + { + if ( gapIndex == i - 1 ) + { + newAllotment[ newAllotment.size ] = randomfloatrange( allotment[ gapIndex ], allotment[ gapIndex + 1 ] ); + } + newAllotment[ newAllotment.size ] = allotment[ i ]; + } + return newAllotment; +} +waittill_objective_event_proc( requireTrigger ) +{ + while ( level.deathSpawner[ self.script_deathChain ] > 0 ) + { + level waittill( "spawner_expired" + self.script_deathChain ); + } + if ( requireTrigger ) + { + self waittill( "trigger" ); + } + flag = self get_trigger_flag(); + flag_set( flag ); +} +wait_until_done_speaking() +{ + self endon( "death" ); + while ( self.isSpeaking ) + { + wait( 0.05 ); + } +} +ent_waits_for_level_notify( msg ) +{ + level waittill( msg ); + self notify( "done" ); +} +ent_waits_for_trigger( trigger ) +{ + trigger waittill( "trigger" ); + self notify( "done" ); +} +ent_times_out( timer ) +{ + wait( timer ); + self notify( "done" ); +} +update_debug_friendlycolor_on_death() +{ + self notify( "debug_color_update" ); + self endon( "debug_color_update" ); + num = self.ai_number; + self waittill( "death" ); + level.debug_color_friendlies[ num ] = undefined; + level notify( "updated_color_friendlies" ); +} +update_debug_friendlycolor( num ) +{ + thread update_debug_friendlycolor_on_death(); + if ( isdefined( self.script_forceColor ) ) + { + level.debug_color_friendlies[ num ] = self.script_forceColor; + } + else + { + level.debug_color_friendlies[ num ] = undefined; + } + level notify( "updated_color_friendlies" ); +} +insure_player_does_not_set_forcecolor_twice_in_one_frame() +{ +} +new_color_being_set( color ) +{ + self notify( "new_color_being_set" ); + self.new_force_color_being_set = true; + maps\_colors::left_color_node(); + self endon( "new_color_being_set" ); + self endon( "death" ); + waittillframeend; + waittillframeend; + if ( isdefined( self.script_forceColor ) ) + { + self.currentColorCode = level.currentColorForced[ self.team ][ self.script_forceColor ]; + self thread maps\_colors::goto_current_ColorIndex(); + } + self.new_force_color_being_set = undefined; + self notify( "done_setting_new_color" ); +} +delayThread_proc( func, timer, param1, param2, param3, param4 ) +{ + self endon( "death" ); + wait( timer ); + if ( isdefined( param4 ) ) + { + thread [[ func ]]( param1, param2, param3, param4 ); + } + else if ( isdefined( param3 ) ) + { + thread [[ func ]]( param1, param2, param3 ); + } + else if ( isdefined( param2 ) ) + { + thread [[ func ]]( param1, param2 ); + } + else if ( isdefined( param1 ) ) + { + thread [[ func ]]( param1 ); + } + else + { + thread [[ func ]](); + } +} +wait_for_flag_or_time_elapses( flagname, timer ) +{ + level endon( flagname ); + wait( timer ); +} +ent_wait_for_flag_or_time_elapses( flagname, timer ) +{ + self endon( flagname ); + wait( timer ); +} +waittill_either_function_internal( ent, func, parm ) +{ + ent endon( "done" ); + [[ func ]]( parm ); + ent notify( "done" ); +} +HintPrintWait( length, breakfunc ) +{ + if ( !isdefined( breakfunc ) ) + { + wait( length ); + return; + } + timer = length * 20; + for ( i = 0; i < timer; i++ ) + { + if ( [[ breakfunc ]]() ) + { + break; + } + wait( 0.05 ); + } +} +HintPrint( string, breakfunc ) +{ + MYFADEINTIME = 1.0; + MYFLASHTIME = 0.75; + MYALPHAHIGH = 0.95; + MYALPHALOW = 0.4; + flag_waitopen( "global_hint_in_use" ); + flag_set( "global_hint_in_use" ); + Hint = createFontString( "objective", 2 ); + Hint.alpha = 0.9; + Hint.x = 0; + Hint.y = -68; + Hint.alignx = "center"; + Hint.aligny = "middle"; + Hint.horzAlign = "center"; + Hint.vertAlign = "middle"; + Hint.foreground = false; + Hint.hidewhendead = true; + Hint setText( string ); + Hint.alpha = 0; + Hint FadeOverTime( MYFADEINTIME ); + Hint.alpha = MYALPHAHIGH; + HintPrintWait( MYFADEINTIME ); + if ( isdefined( breakfunc ) ) + { + for ( ;; ) + { + Hint FadeOverTime( MYFLASHTIME ); + Hint.alpha = MYALPHALOW; + HintPrintWait( MYFLASHTIME, breakfunc ); + if ( [[ breakfunc ]]() ) + { + break; + } + Hint FadeOverTime( MYFLASHTIME ); + Hint.alpha = MYALPHAHIGH; + HintPrintWait( MYFLASHTIME ); + if ( [[ breakfunc ]]() ) + { + break; + } + } + } + else + { + for ( i = 0; i < 5; i++ ) + { + Hint FadeOverTime( MYFLASHTIME ); + Hint.alpha = MYALPHALOW; + HintPrintWait( MYFLASHTIME ); + Hint FadeOverTime( MYFLASHTIME ); + Hint.alpha = MYALPHAHIGH; + HintPrintWait( MYFLASHTIME ); + } + } + Hint Destroy(); + flag_clear( "global_hint_in_use" ); +} +lerp_player_view_to_tag_internal( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo ) +{ + if( IsPlayer( self ) ) + { + self endon( "disconnect" ); + } + if ( isdefined( self.first_frame_time ) && ent.first_frame_time == gettime() ) + { + wait( 0.10 ); + } + origin = ent gettagorigin( tag ); + angles = ent gettagangles( tag ); + self lerp_player_view_to_position( origin, angles, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo ); + if ( IsDefined(hit_geo) && hit_geo ) + { + return; + } + if( IsDefined( right_arc ) ) + { + self playerlinkto( ent, tag, fraction, right_arc, left_arc, top_arc, bottom_arc ); + } + else if( IsDefined( fraction ) ) + { + self playerlinkto( ent, tag, fraction ); + } + else + { + self playerlinkto( ent ); + } +} +lerp_player_view_to_tag_oldstyle_internal( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo ) +{ + if( IsPlayer( self ) ) + { + self endon( "disconnect" ); + } + if ( isdefined( ent.first_frame_time ) && ent.first_frame_time == gettime() ) + { + wait( 0.10 ); + } + origin = ent gettagorigin( tag ); + angles = ent gettagangles( tag ); + self lerp_player_view_to_position_oldstyle( origin, angles, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, true ); + if ( hit_geo ) + { + return; + } + self playerlinktodelta( ent, tag, fraction, right_arc, left_arc, top_arc, bottom_arc, false ); +} +lerp_player_view_to_moving_tag_oldstyle_internal( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, hit_geo ) +{ + if( IsPlayer( self ) ) + { + self endon( "disconnect" ); + } + if ( isdefined( ent.first_frame_time ) && ent.first_frame_time == gettime() ) + { + wait( 0.10 ); + } + self lerp_player_view_to_position_oldstyle( ent, tag, lerptime, fraction, right_arc, left_arc, top_arc, bottom_arc, true ); + if ( hit_geo ) + { + return; + } + self playerlinkto( ent, tag, fraction, right_arc, left_arc, top_arc, bottom_arc, false ); +} +function_stack_proc( caller, func, param1, param2, param3, param4 ) +{ + if ( !isdefined( caller.function_stack ) ) + { + caller.function_stack = []; + } + caller.function_stack[ caller.function_stack.size ] = self; + function_stack_caller_waits_for_turn( caller ); + if ( isdefined( caller ) ) + { + if ( isdefined( param4 ) ) + { + caller [[ func ]]( param1, param2, param3, param4 ); + } + else if ( isdefined( param3 ) ) + { + caller [[ func ]]( param1, param2, param3 ); + } + else if ( isdefined( param2 ) ) + { + caller [[ func ]]( param1, param2 ); + } + else if ( isdefined( param1 ) ) + { + caller [[ func ]]( param1 ); + } + else + { + caller [[ func ]](); + } + if ( isdefined( caller ) ) + { + caller.function_stack = array_remove( caller.function_stack, self ); + caller notify( "level_function_stack_ready" ); + } + } + if ( isdefined( self ) ) + { + self notify( "function_done" ); + } +} +function_stack_caller_waits_for_turn( caller ) +{ + caller endon( "death" ); + self endon( "death" ); + while ( caller.function_stack[ 0 ] != self ) + { + caller waittill( "level_function_stack_ready" ); + } +} +alphabet_compare( a, b ) +{ + list = []; + val = 1; + list[ "0" ] = val; val++; + list[ "1" ] = val; val++; + list[ "2" ] = val; val++; + list[ "3" ] = val; val++; + list[ "4" ] = val; val++; + list[ "5" ] = val; val++; + list[ "6" ] = val; val++; + list[ "7" ] = val; val++; + list[ "8" ] = val; val++; + list[ "9" ] = val; val++; + list[ "_" ] = val; val++; + list[ "a" ] = val; val++; + list[ "b" ] = val; val++; + list[ "c" ] = val; val++; + list[ "d" ] = val; val++; + list[ "e" ] = val; val++; + list[ "f" ] = val; val++; + list[ "g" ] = val; val++; + list[ "h" ] = val; val++; + list[ "i" ] = val; val++; + list[ "j" ] = val; val++; + list[ "k" ] = val; val++; + list[ "l" ] = val; val++; + list[ "m" ] = val; val++; + list[ "n" ] = val; val++; + list[ "o" ] = val; val++; + list[ "p" ] = val; val++; + list[ "q" ] = val; val++; + list[ "r" ] = val; val++; + list[ "s" ] = val; val++; + list[ "t" ] = val; val++; + list[ "u" ] = val; val++; + list[ "v" ] = val; val++; + list[ "w" ] = val; val++; + list[ "x" ] = val; val++; + list[ "y" ] = val; val++; + list[ "z" ] = val; val++; + a = tolower( a ); + b = tolower( b ); + val1 = 0; + if ( isdefined( list[ a ] ) ) + { + val1 = list[ a ]; + } + val2 = 0; + if ( isdefined( list[ b ] ) ) + { + val2 = list[ b ]; + } + if ( val1 > val2 ) + { + return "1st"; + } + if ( val1 < val2 ) + { + return "2nd"; + } + return "same"; +} +is_later_in_alphabet( string1, string2 ) +{ + count = string1.size; + if ( count >= string2.size ) + { + count = string2.size; + } + for ( i = 0; i < count; i++ ) + { + val = alphabet_compare( string1[ i ], string2[ i ] ); + if ( val == "1st" ) + { + return true; + } + if ( val == "2nd" ) + { + return false; + } + } + return string1.size > string2.size; +} +wait_for_sounddone_or_death( org ) +{ + self endon( "death" ); + org waittill( "sounddone" ); +} +sound_effect() +{ + self effect_soundalias(); +} +effect_soundalias() +{ + origin = self.v[ "origin" ]; + alias = self.v[ "soundalias" ]; + self exploder_delay(); + play_sound_in_space( alias, origin ); +} +cannon_effect() +{ + if( isdefined( self.v[ "repeat" ] ) ) + { + for( i = 0;i < self.v[ "repeat" ];i ++ ) + { + playfx( level._effect[ self.v[ "fxid" ] ], self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); + self exploder_delay(); + } + return; + } + self exploder_delay(); + if ( isdefined( self.looper ) ) + { + self.looper delete(); + } + self.looper = spawnFx( getfx( self.v[ "fxid" ] ), self.v[ "origin" ], self.v[ "forward" ], self.v[ "up" ] ); + triggerFx( self.looper ); + exploder_playSound(); +} +exploder_delay() +{ + if( !isdefined( self.v[ "delay" ] ) ) + { + self.v[ "delay" ] = 0; + } + min_delay = self.v[ "delay" ]; + max_delay = self.v[ "delay" ] + 0.001; + if( isdefined( self.v[ "delay_min" ] ) ) + { + min_delay = self.v[ "delay_min" ]; + } + if( isdefined( self.v[ "delay_max" ] ) ) + { + max_delay = self.v[ "delay_max" ]; + } + if( min_delay > 0 ) + { + wait( randomfloatrange( min_delay, max_delay ) ); + } +} +exploder_earthquake() +{ + earthquake_name = self.v[ "earthquake" ]; + assertex(IsDefined(level.earthquake) && IsDefined(level.earthquake[earthquake_name]), + "No earthquake '" + earthquake_name + "' defined for exploder - call add_earthquake() in your level script."); + self exploder_delay(); + eq = level.earthquake[earthquake_name]; + earthquake( eq[ "magnitude" ], eq[ "duration" ], self.v[ "origin" ], eq[ "radius" ] ); +} +exploder_rumble() +{ + self exploder_delay(); + level.player PlayRumbleonentity( self.v[ "rumble" ] ); +} +exploder_playSound() +{ + if( !isdefined( self.v[ "soundalias" ] ) || self.v[ "soundalias" ] == "nil" ) + { + return; + } + play_sound_in_space( self.v[ "soundalias" ], self.v[ "origin" ] ); +} +fire_effect() +{ + forward = self.v[ "forward" ]; + up = self.v[ "up" ]; + org = undefined; + firefxSound = self.v[ "firefxsound" ]; + origin = self.v[ "origin" ]; + firefx = self.v[ "firefx" ]; + ender = self.v[ "ender" ]; + if( !isdefined( ender ) ) + { + ender = "createfx_effectStopper"; + } + timeout = self.v[ "firefxtimeout" ]; + fireFxDelay = 0.5; + if( isdefined( self.v[ "firefxdelay" ] ) ) + { + fireFxDelay = self.v[ "firefxdelay" ]; + } + self exploder_delay(); + if( isdefined( firefxSound ) ) + { + level thread loop_fx_sound( firefxSound, origin, ender, timeout ); + } + playfx( level._effect[ firefx ], self.v[ "origin" ], forward, up ); +} +trail_effect() +{ + self exploder_delay(); + if( !IsDefined( self.v["trailfxtag"] ) ) + { + self.v["trailfxtag"] = "tag_origin"; + } + temp_ent = undefined; + if(self.v["trailfxtag"] == "tag_origin") + { + PlayFxOnTag( level._effect[self.v["trailfx"]], self.model, self.v["trailfxtag"] ); + } + else + { + temp_ent = Spawn( "script_model", self.model.origin ); + temp_ent SetModel( "tag_origin" ); + temp_ent LinkTo( self.model ); + PlayFxOnTag( level._effect[self.v["trailfx"]], temp_ent, self.v["trailfxtag"] ); + } + if( IsDefined( self.v["trailfxsound"] ) ) + { + if(!isdefined(temp_ent)) + { + self.model PlayLoopSound( self.v["trailfxsound"] ); + } + else + { + temp_ent PlayLoopSound( self.v["trailfxsound"] ); + } + } + if( IsDefined( self.v[ "ender" ] ) ) + { + } + if( !IsDefined( self.v["trailfxtimeout"] ) ) + { + return; + } + wait( self.v["trailfxtimeout"] ); + if(isdefined(temp_ent)) + { + temp_ent Delete(); + } +} +trail_effect_ender( ent, ender ) +{ + ent endon( "death" ); + self waittill( ender ); + ent Delete(); +} +init_vision_set( visionset ) +{ + level.lvl_visionset = visionset; + if ( !isdefined ( level.vision_cheat_enabled ) ) + { + level.vision_cheat_enabled = false; + } + return level.vision_cheat_enabled; +} +exec_func( func, endons ) +{ + for ( i = 0; i < endons.size; i++ ) + { + endons[ i ].caller endon( endons[ i ].ender ); + } + if ( func.parms.size == 0 ) + { + func.caller [[ func.func ]](); + } + else if ( func.parms.size == 1 ) + { + func.caller [[ func.func ]]( func.parms[ 0 ] ); + } + else if ( func.parms.size == 2 ) + { + func.caller [[ func.func ]]( func.parms[ 0 ], func.parms[ 1 ] ); + } + else if ( func.parms.size == 3 ) + { + func.caller [[ func.func ]]( func.parms[ 0 ], func.parms[ 1 ], func.parms[ 2 ] ); + } +} +waittill_func_ends( func, endons ) +{ + self endon( "all_funcs_ended" ); + exec_func( func, endons ); + self.count--; + self notify( "func_ended" ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_vehicle.gsc b/BO1/PC/ZM/maps/_vehicle.gsc new file mode 100644 index 0000000..eab24f8 --- /dev/null +++ b/BO1/PC/ZM/maps/_vehicle.gsc @@ -0,0 +1,4981 @@ + +#include maps\_utility; +#include common_scripts\utility; +#using_animtree( "vehicles" ); +init_vehicles() +{ + precachemodel( "fx" ); + if(IsDefined(level.bypassVehicleScripts)) + { + return; + } + level.heli_default_decel = 10; + thread dump_handle(); + init_aircraft_list(); + init_boat_list(); + maps\_vehicletypes::setup_types(); + generate_colmaps_vehicles(); + setup_targetname_spawners(); + setup_dvars(); + setup_levelvars(); + array_thread( getentarray( "truckjunk", "targetname" ), ::truckjunk ); + setup_ai(); + setup_triggers(); + allvehiclesprespawn = precache_scripts(); + setup_vehicles( allvehiclesprespawn ); + array_levelthread( level.vehicle_processtriggers, ::trigger_process ); + level.vehicle_processtriggers = undefined; + init_level_has_vehicles(); + level.vehicle_enemy_tanks = []; + level.vehicle_enemy_tanks[ "vehicle_ger_tracked_king_tiger" ] = true; +} +init_aircraft_list() +{ + level.aircraft_list = []; + level.aircraft_list[ "player_corsair" ] = true; + level.aircraft_list[ "rufe" ] = true; + level.aircraft_list[ "corsair" ] = true; + level.aircraft_list[ "zero" ] = true; + level.aircraft_list[ "pby" ] = true; + level.aircraft_list[ "pby_blackcat" ] = true; + level.aircraft_list[ "jap_gunboat" ] = true; + level.aircraft_list[ "il2" ] = true; +} +init_boat_list() +{ + level.boat_list = []; + level.boat_list["rubber_raft"] = true; + level.boat_list[ "jap_ptboat" ] = true; + level.boat_list[ "jap_shinyo" ] = true; + level.boat_list[ "jap_merchant_ship" ] = true; +} +init_level_has_vehicles() +{ + level.levelHasVehicles = false; + if ( level.vehicle_spawngroup.size > 0 ) + { + level.levelHasVehicles = true; + } + if ( level.vehicle_spawners.size > 0 ) + { + level.levelHasVehicles = true; + } + if ( level.vehicles[ "allies" ].size > 0 ) + { + level.levelHasVehicles = true; + } + if ( level.vehicles[ "axis" ].size > 0 ) + { + level.levelHasVehicles = true; + } + if ( level.vehicles[ "neutral" ].size > 0 ) + { + level.levelHasVehicles = true; + } + classname = getentarray( "script_vehicle", "classname" ); + if ( classname.size > 0 ) + { + level.levelHasVehicles = true; + } +} +trigger_getlinkmap( trigger ) +{ + linkMap = []; + if( IsDefined( trigger.script_linkTo ) ) + { + links = strtok( trigger.script_linkTo, " " ); + for( i = 0; i < links.size; i++ ) + { + linkMap[ links[ i ] ] = true; + } + links = undefined; + } + return linkMap; +} +setup_script_gatetrigger( trigger ) +{ + gates = []; + if( IsDefined( trigger.script_gatetrigger ) ) + { + return level.vehicle_gatetrigger[ trigger.script_gatetrigger ]; + } + return gates; +} +setup_script_vehiclespawngroup( trigger, vehicles ) +{ + script_vehiclespawngroup = false; + if( IsDefined( trigger.script_vehiclespawngroup ) ) + { + script_vehiclespawngroup = true; + } + return script_vehiclespawngroup; +} +trigger_process( trigger ) +{ + if( IsDefined( trigger.classname ) && ( trigger.classname == "trigger_multiple" || trigger.classname == "trigger_radius" || trigger.classname == "trigger_lookat" ) ) + { + bTriggeronce = true; + } + else + { + bTriggeronce = false; + } + trigger.processed_trigger = undefined; + if( IsDefined( trigger.script_noteworthy ) && trigger.script_noteworthy == "trigger_multiple" ) + { + bTriggeronce = false; + } + gates = setup_script_gatetrigger( trigger ); + script_vehiclespawngroup = IsDefined( trigger.script_vehiclespawngroup ); + script_vehicledetour = IsDefined( trigger.script_vehicledetour ) && ( is_node_script_origin( trigger ) || is_node_script_struct( trigger ) ) ; + detoured = IsDefined( trigger.detoured ) && !( is_node_script_origin( trigger ) || is_node_script_struct( trigger ) ); + gotrigger = true; + while( gotrigger ) + { + trigger waittill( "trigger", other ); + if ( IsDefined( trigger.script_vehicletriggergroup ) ) + { + if( !IsDefined( other.script_vehicletriggergroup ) ) + { + continue; + } + if( IsDefined(other) && other.script_vehicletriggergroup != trigger.script_vehicletriggergroup ) + { + continue; + } + } + if( IsDefined( trigger.enabled ) && !trigger.enabled ) + { + trigger waittill( "enable" ); + } + if ( IsDefined( trigger.script_flag_set ) ) + { + if ( IsDefined(other) && IsDefined( other.vehicle_flags ) ) + { + other.vehicle_flags[ trigger.script_flag_set ] = true; + } + if ( IsDefined(other) ) + { + other notify( "vehicle_flag_arrived", trigger.script_flag_set ); + } + flag_set( trigger.script_flag_set ); + } + if ( IsDefined( trigger.script_flag_clear ) ) + { + if ( IsDefined(other) && IsDefined( other.vehicle_flags ) ) + { + other.vehicle_flags[ trigger.script_flag_clear ] = false; + } + flag_clear( trigger.script_flag_clear ); + } + if( IsDefined(other) && script_vehicledetour ) + { + other thread path_detour_script_origin( trigger ); + } + else if ( detoured && IsDefined( other ) ) + { + other thread path_detour( trigger ); + } + if ( IsDefined( trigger.script_delay ) ) + { + wait trigger.script_delay; + } + targs = []; + if( bTriggeronce ) + { + if( IsDefined( trigger.target ) && IsDefined( level.vehicle_target[ trigger.target ] ) ) + { + targs = level.vehicle_target[ trigger.target ]; + } + gotrigger = false; + } + if ( IsDefined( trigger.script_vehicleGroupDelete ) ) + { + if( !IsDefined( level.vehicle_DeleteGroup[ trigger.script_vehicleGroupDelete ] ) ) + { + println( "failed to find deleteable vehicle with script_vehicleGroupDelete group number: ", trigger.script_vehicleGroupDelete ); + level.vehicle_DeleteGroup[ trigger.script_vehicleGroupDelete ] = []; + } + array_delete( level.vehicle_DeleteGroup[ trigger.script_vehicleGroupDelete ] ); + } + if( script_vehiclespawngroup ) + { + level notify( "spawnvehiclegroup" + trigger.script_vehiclespawngroup ); + waittillframeend; + } + if ( gates.size > 0 && bTriggeronce ) + { + array_levelthread( gates, ::path_gate_open ); + } + if ( IsDefined( trigger.script_VehicleStartMove ) ) + { + if ( !IsDefined( level.vehicle_StartMoveGroup[ trigger.script_VehicleStartMove ] ) ) + { + println( "^3Vehicle start trigger is: ", trigger.script_VehicleStartMove ); + return; + } + array_thread( level.vehicle_StartMoveGroup[ trigger.script_VehicleStartMove ], ::gopath ); + } + } +} +path_detour_get_detourpath( detournode ) +{ + detourpath = undefined; + for( j = 0; j < level.vehicle_detourpaths[ detournode.script_vehicledetour ].size; j++ ) + { + if( level.vehicle_detourpaths[ detournode.script_vehicledetour ][ j ] != detournode ) + { + if( !islastnode( level.vehicle_detourpaths[ detournode.script_vehicledetour ][ j ] ) ) + { + detourpath = level.vehicle_detourpaths[ detournode.script_vehicledetour ][ j ]; + } + } + } + return detourpath; +} +path_detour_script_origin( detournode ) +{ + detourpath = path_detour_get_detourpath( detournode ); + if( IsDefined( detourpath ) ) + { + self thread vehicle_paths( detourpath ); + } +} +crash_detour_check( detourpath ) +{ + return + ( + IsDefined( detourpath.script_crashtype ) + && + ( + IsDefined( self.deaddriver ) + || self.health <= 0 + || detourpath.script_crashtype == "forced" + || ( level.vclogin_vehicles ) + ) + && + ( + !IsDefined( detourpath.derailed ) + || ( IsDefined( detourpath.script_crashtype ) && detourpath.script_crashtype == "plane" ) + ) + ); +} +crash_derailed_check( detourpath ) +{ + return IsDefined( detourpath.derailed ) && detourpath.derailed; +} +path_detour( node ) +{ + detournode = getvehiclenode( node.target, "targetname" ); + detourpath = path_detour_get_detourpath( detournode ); + if( !IsDefined( detourpath ) ) + { + return; + } + if( node.detoured && !IsDefined( detourpath.script_vehicledetourgroup ) ) + { + return; + } + if( crash_detour_check( detourpath ) ) + { + self notify( "crashpath", detourpath ); + detourpath.derailed = 1; + self notify( "newpath" ); + self setSwitchNode( node, detourpath ); + return; + } + else + { + if( crash_derailed_check( detourpath ) ) + { + return; + } + if( IsDefined( detourpath.script_vehicledetourgroup ) ) + { + if( !IsDefined( self.script_vehicledetourgroup ) ) + { + return; + } + if( detourpath.script_vehicledetourgroup != self.script_vehicledetourgroup ) + { + return; + } + } + } +} +vehicle_Levelstuff( vehicle, trigger ) +{ + if( IsDefined( vehicle.script_linkname ) ) + { + level.vehicle_link = array_2dadd( level.vehicle_link, vehicle.script_linkname, vehicle ); + } + if( IsDefined( vehicle.targetname ) ) + { + level.vehicle_target = array_2dadd( level.vehicle_target, vehicle.targetname, vehicle ); + } + if( IsDefined( vehicle.script_VehicleSpawngroup ) ) + { + level.vehicle_SpawnGroup = array_2dadd( level.vehicle_SpawnGroup, vehicle.script_VehicleSpawngroup, vehicle ); + } + if( IsDefined( vehicle.script_VehicleStartMove ) ) + { + level.vehicle_StartMoveGroup = array_2dadd( level.vehicle_StartMoveGroup, vehicle.script_VehicleStartMove, vehicle ); + } + if( IsDefined( vehicle.script_vehicleGroupDelete ) ) + { + level.vehicle_DeleteGroup = array_2dadd( level.vehicle_DeleteGroup, vehicle.script_vehicleGroupDelete, vehicle ); + } +} +spawn_array( spawners ) +{ + ai = []; + for( i = 0; i < spawners.size; i++ ) + { + spawners[ i ].count = 1; + dronespawn = false; + if( IsDefined( spawners[ i ].script_drone ) ) + { + dronespawn = true; + spawned = dronespawn( spawners[ i ] ); + } + else + { + spawned = spawners[ i ] spawn_ai(); + if (!IsAlive(spawned)) + { + continue; + } + } + assert( IsDefined( spawned ) ); + ai[ ai.size ] = spawned; + } + ai = remove_non_riders_from_array( ai ); + return ai; +} +remove_non_riders_from_array( ai ) +{ + living_ai = []; + for( i = 0; i < ai.size; i++ ) + { + if ( !ai_should_be_added( ai[ i ] ) ) + { + continue; + } + living_ai[ living_ai.size ] = ai[ i ]; + } + return living_ai; +} +ai_should_be_added( ai ) +{ + if( isalive( ai ) ) + { + return true; + } + if ( !IsDefined( ai ) ) + { + return false; + } + if ( !IsDefined( ai.classname ) ) + { + return false; + } + return ai.classname == "script_model"; +} +spawn_group() +{ + HasRiders = ( IsDefined( self.script_vehicleride ) ); + HasWalkers = ( IsDefined( self.script_vehiclewalk ) ); + if( !( HasRiders || HasWalkers ) ) + { + return; + } + spawners = []; + riderspawners = []; + walkerspawners = []; + if( HasRiders ) + { + riderspawners = level.vehicle_RideSpawners[ self.script_vehicleride ]; + } + if( !IsDefined( riderspawners ) ) + { + riderspawners = []; + } + if( HasWalkers ) + { + walkerspawners = level.vehicle_walkspawners[ self.script_vehiclewalk ]; + } + if( !IsDefined( walkerspawners ) ) + { + walkerspawners = []; + } + spawners = array_combine( riderspawners, walkerspawners ); + startinvehicles = []; + for(i = 0; i < spawners.size; i ++) + { + spawners[i].script_forcespawn = true; + } + ai = spawn_array( spawners ); + if( HasRiders ) + { + if( IsDefined( level.vehicle_RideAI[ self.script_vehicleride ] ) ) + { + ai = array_combine( ai, level.vehicle_RideAI[ self.script_vehicleride ] ); + } + } + if( HasWalkers ) + { + if( IsDefined( level.vehicle_WalkAI[ self.script_vehiclewalk ] ) ) + { + ai = array_combine( ai, level.vehicle_WalkAI[ self.script_vehiclewalk ] ); + ai vehicle_rider_walk_setup (self); + } + } + ai = sort_by_startingpos( ai ); + for ( i = 0; i < ai.size; i++ ) + { + ai[ i ] thread maps\_vehicle_aianim::vehicle_enter( self, self.script_tag ); + } +} +sort_by_startingpos( guysarray ) +{ + firstarray = []; + secondarray = []; + for ( i = 0 ; i < guysarray.size ; i++ ) + { + if ( IsDefined( guysarray[ i ].script_startingposition ) ) + { + firstarray[ firstarray.size ] = guysarray[ i ]; + } + else + { + secondarray[ secondarray.size ] = guysarray[ i ]; + } + } + return array_combine( firstarray, secondarray ); +} +vehicle_rider_walk_setup( vehicle ) +{ + if ( !IsDefined( self.script_vehiclewalk ) ) + { + return; + } + if ( IsDefined( self.script_followmode ) ) + { + self.FollowMode = self.script_followmode; + } + else + { + self.FollowMode = "cover nodes"; + } + if ( !IsDefined( self.target ) ) + { + return; + } + node = getnode( self.target, "targetname" ); + if( IsDefined( node ) ) + { + self.NodeAftervehicleWalk = node; + } +} +runtovehicle( guy ) +{ + guyarray = []; + climbinnode = self.climbnode; + climbinanim = self.climbanim; + closenode = climbinnode[ 0 ]; + currentdist = 5000; + thenode = undefined; + for( i = 0; i < climbinnode.size; i++ ) + { + climborg = self gettagorigin( climbinnode[ i ] ); + climbang = self gettagangles( climbinnode[ i ] ); + org = getstartorigin( climborg, climbang, climbinanim[ i ] ); + distance = distance( guy.origin, climborg ); + if( distance < currentdist ) + { + currentdist = distance; + closenode = climbinnode[ i ]; + thenode = i; + } + } + climbang = undefined; + climborg = undefined; + thread runtovehicle_setgoal( guy ); + while( !guy.vehicle_goal ) + { + climborg = self gettagorigin( climbinnode[ thenode ] ); + climbang = self gettagangles( climbinnode[ thenode ] ); + org = getStartOrigin( climborg, climbang, climbinanim[ thenode ] ); + guy set_forcegoal(); + guy setgoalpos( org ); + guy.goalradius = 64; + wait .25; + } + guy unset_forcegoal(); + if( self getspeedmph() < 1 ) + { + guy linkto( self ); + guy animscripted( "hopinend", climborg, climbang, climbinanim[ thenode ] ); + guy waittillmatch( "hopinend", "end" ); + guy enter_vehicle( self ); + } +} +runtovehicle_setgoal( guy ) +{ + guy.vehicle_goal = false; + self endon( "death" ); + guy endon( "death" ); + guy waittill( "goal" ); + guy.vehicle_goal = true; +} +setup_groundnode_detour( node ) +{ + realdetournode = getvehiclenode( node.targetname, "target" ); + if( !IsDefined( realdetournode ) ) + { + return; + } + realdetournode.detoured = 0; + add_proccess_trigger( realdetournode ); +} +add_proccess_trigger( trigger ) +{ + if( IsDefined( trigger.processed_trigger ) ) + { + return; + } + level.vehicle_processtriggers[ level.vehicle_processtriggers.size ] = trigger; + trigger.processed_trigger = true; +} +islastnode( node ) +{ + if( !IsDefined( node.target ) ) + { + return true; + } + if( !IsDefined( getvehiclenode( node.target, "targetname" ) ) && !IsDefined( get_vehiclenode_any_dynamic( node.target ) ) ) + { + return true; + } + return false; +} +vehicle_paths( node ) +{ + assertex( IsDefined( node ) || IsDefined( self.attachedpath ), "vehicle_path() called without a path" ); + self notify( "newpath" ); + if( IsDefined( node ) ) + { + self.attachedpath = node; + } + pathstart = self.attachedpath; + self.currentNode = self.attachedpath; + if( !IsDefined( pathstart ) ) + { + return; + } + self endon( "newpath" ); + nextpoint = pathstart; + while ( IsDefined( nextpoint ) ) + { + self waittill( "reached_node", nextpoint ); + if( !IsDefined( self ) ) + { + return; + } + self.currentNode = nextpoint; + if( IsDefined( nextpoint.gateopen ) && !nextpoint.gateopen ) + { + self thread path_gate_wait_till_open( nextpoint ); + } + nextpoint notify( "trigger", self ); + if( IsDefined( nextpoint.script_dropbombs ) && nextpoint.script_dropbombs > 0 ) + { + amount = nextpoint.script_dropbombs; + delay = 0; + delaytrace = 0; + if( IsDefined( nextpoint.script_dropbombs_delay ) && nextpoint.script_dropbombs_delay > 0 ) + { + delay = nextpoint.script_dropbombs_delay; + } + if( IsDefined( nextpoint.script_dropbombs_delaytrace ) && nextpoint.script_dropbombs_delaytrace > 0 ) + { + delaytrace = nextpoint.script_dropbombs_delaytrace; + } + self notify( "drop_bombs", amount, delay, delaytrace ); + } + if ( IsDefined( nextpoint.script_volumedown ) ) + { + assertex( !IsDefined( nextpoint.script_volumedown ), "Tried to volume down while voluming up, or vice versa" ); + self thread volume_down( nextpoint.script_volumedown ); + } + if ( IsDefined( nextpoint.script_volumeup ) ) + { + assertex( !IsDefined( nextpoint.script_volumeup ), "Tried to volume down while voluming up, or vice versa" ); + self thread volume_up( nextpoint.script_volumeup ); + } + if ( IsDefined( nextpoint.script_noteworthy ) ) + { + self notify( nextpoint.script_noteworthy ); + self notify( "noteworthy", nextpoint.script_noteworthy ); + } + if ( IsDefined( nextpoint.script_notify) ) + { + self notify( nextpoint.script_notify ); + level notify( nextpoint.script_notify ); + } + waittillframeend; + if( !IsDefined( self ) ) + { + return; + } + if ( IsDefined( nextpoint.script_noteworthy ) ) + { + if ( nextpoint.script_noteworthy == "godon" ) + { + self godon(); + } + else if ( nextpoint.script_noteworthy == "godoff" ) + { + self godoff(); + } + else if ( nextpoint.script_noteworthy == "deleteme" ) + { + self Delete(); + return; + } + else if ( nextpoint.script_noteworthy == "drivepath" ) + { + self DrivePath(); + } + else if ( nextpoint.script_noteworthy == "lockpath" ) + { + self StartPath(); + } + else if ( nextpoint.script_noteworthy == "brake" ) + { + if( self.isphysicsvehicle ) + { + self SetBrake(1); + } + } + } + if ( IsDefined( nextpoint.script_crashtypeoverride ) ) + { + self.script_crashtypeoverride = nextpoint.script_crashtypeoverride; + } + if ( IsDefined( nextpoint.script_badplace ) ) + { + self.script_badplace = nextpoint.script_badplace; + } + if ( IsDefined( nextpoint.script_turretmg ) ) + { + self.script_turretmg = nextpoint.script_turretmg; + } + if ( IsDefined( nextpoint.script_team ) ) + { + self.vteam = nextpoint.script_team; + } + if ( IsDefined( nextpoint.script_turningdir ) ) + { + self notify( "turning", nextpoint.script_turningdir ); + } + if ( IsDefined( nextpoint.script_deathroll ) ) + { + if ( nextpoint.script_deathroll == 0 ) + { + self thread deathrolloff(); + } + else + { + self thread deathrollon(); + } + } + if ( IsDefined( nextpoint.script_vehicleaianim ) ) + { + if ( IsDefined( nextpoint.script_parameters ) && nextpoint.script_parameters == "queue" ) + { + self.queueanim = true; + } + if ( IsDefined( nextpoint.script_startingposition ) ) + { + self.groupedanim_pos = nextpoint.script_startingposition; + } + self notify( "groupedanimevent", nextpoint.script_vehicleaianim ); + } + if ( IsDefined( nextpoint.script_wheeldirection ) ) + { + self wheeldirectionchange( nextpoint.script_wheeldirection ); + } + if ( IsDefined( nextpoint.script_exploder ) ) + { + level exploder( nextpoint.script_exploder ); + } + if ( IsDefined( nextpoint.script_flag_set ) ) + { + if ( IsDefined( self.vehicle_flags ) ) + { + self.vehicle_flags[ nextpoint.script_flag_set ] = true; + } + self notify( "vehicle_flag_arrived", nextpoint.script_flag_set ); + flag_set( nextpoint.script_flag_set ); + } + if ( IsDefined( nextpoint.script_flag_clear ) ) + { + if ( IsDefined( self.vehicle_flags ) ) + { + self.vehicle_flags[ nextpoint.script_flag_clear ] = false; + } + flag_clear( nextpoint.script_flag_clear ); + } + if ( IsDefined( nextpoint.script_unload ) ) + { + self thread unload_node( nextpoint ); + } + if (IsDefined(nextpoint.script_wait)) + { + self SetSpeed( 0, 10, 10 ); + nextpoint script_wait(); + self ResumeSpeed(10); + } + if( IsDefined( nextpoint.script_flag_wait ) ) + { + if ( !IsDefined( self.vehicle_flags ) ) + { + self.vehicle_flags = []; + } + self.vehicle_flags[ nextpoint.script_flag_wait ] = true; + self notify( "vehicle_flag_arrived", nextpoint.script_flag_wait ); + self ent_flag_set("waiting_for_flag"); + if ( !flag( nextpoint.script_flag_wait ) ) + { + self SetSpeed( 0, 10, 10 ); + } + flag_wait( nextpoint.script_flag_wait ); + self ent_flag_clear("waiting_for_flag"); + self ResumeSpeed(10); + } + if ( IsDefined( self.set_lookat_point ) ) + { + self.set_lookat_point = undefined; + self clearLookAtEnt(); + } + if (IsDefined(nextpoint.script_lights_on)) + { + if (nextpoint.script_lights_on) + { + self lights_on(); + } + else + { + self lights_off(); + } + } + if (IsDefined(nextpoint.script_sirens_on)) + { + if (nextpoint.script_sirens_on) + { + self sirens_on(); + } + else + { + self sirens_off(); + } + } + if ( !IsDefined( nextpoint.target ) ) + { + break; + } + } + self notify( "reached_dynamic_path_end" ); + if( IsDefined( self.script_vehicle_selfremove ) ) + { + self delete(); + } +} +must_stop_at_next_point( nextpoint ) +{ + if( IsDefined( nextpoint.script_unload ) ) + { + return true; + } + return IsDefined( nextpoint.script_flag_wait ) && !flag( nextpoint.script_flag_wait ); +} +setvehgoalnode( node ) +{ + self endon( "death" ); + stop = false; + if( !IsDefined( stop ) ) + { + stop = true; + } + if( IsDefined( node.script_stopnode ) ) + { + stop = node.script_stopnode; + } + if( IsDefined( node.script_unload ) ) + { + stop = true; + } + script_anglevehicle = IsDefined( node.script_anglevehicle ) && node.script_anglevehicle; + script_goalyaw = IsDefined( node.script_goalyaw ) && node.script_goalyaw; + if ( IsDefined( node.script_anglevehicle ) || IsDefined( node.script_goalyaw ) ) + { + self forcetarget( node, script_goalyaw, script_anglevehicle ); + } + else + { + self unforcetarget(); + } + if( IsDefined( node.script_flag_wait ) ) + { + if( !flag( node.script_flag_wait ) ) + { + stop = true; + } + } + if( !IsDefined( node.target ) ) + { + stop = true; + } + self setvehgoalpos_wrap( node.origin, stop ); +} +forcetarget( node, script_goalyaw, script_anglevehicle ) +{ + if ( script_goalyaw ) + { + self cleartargetyaw(); + self setgoalyaw( node.angles[ 1 ] ); + } + else + { + self cleargoalyaw(); + self settargetyaw( node.angles[ 1 ] ); + } +} +unforcetarget() +{ + self cleargoalyaw(); + self cleartargetyaw(); +} +deathrollon() +{ + if( self.health > 0 ) + { + self.rollingdeath = 1; + } +} +deathrolloff() +{ + self.rollingdeath = undefined; + self notify( "deathrolloff" ); +} +getonpath(path_start) +{ + if( !IsDefined( path_start ) ) + { + return; + } + if( isDefined( self.hasstarted ) ) + { + self.hasstarted = undefined; + } + self.attachedpath = path_start; + if( !IsDefined(self.drivepath) || !self.drivepath ) + { + self.origin = path_start.origin; + self AttachPath( path_start ); + } + if( !IsDefined( self.dontDisconnectPaths ) ) + { + self DisconnectPaths(); + } + if (is_true(self.isphysicsvehicle)) + { + self SetBrake(true); + } + self thread vehicle_paths(); +} +create_vehicle_from_spawngroup_and_gopath( spawnGroup ) +{ + vehicleArray = maps\_vehicle::scripted_spawn( spawnGroup ); + for( i = 0; i < vehicleArray.size; i++ ) + { + if (IsDefined(vehicleArray[ i ])) + { + vehicleArray[ i ] thread maps\_vehicle::gopath(); + } + } + return vehicleArray; +} +gopath() +{ + self endon( "death" ); + self endon( "stop path" ); + if( self.isphysicsvehicle ) + { + self SetBrake(false); + } + if( IsDefined( self.script_vehiclestartmove ) ) + { + level.vehicle_StartMoveGroup[ self.script_vehiclestartmove ] = array_remove( level.vehicle_StartMoveGroup[ self.script_vehiclestartmove ], self ); + } + if( IsDefined( self.hasstarted ) ) + { + println( "vehicle already moving when triggered with a startmove" ); + return; + } + else + { + self.hasstarted = true; + } + self script_delay(); + self notify( "start_vehiclepath" ); + if( IsDefined( self.drivepath ) && self.drivepath ) + { + self DrivePath( self.attachedpath ); + } + else + { + self StartPath(); + } + wait .05; + self ConnectPaths(); + self waittill( "reached_end_node" ); + if ( !IsDefined( self.dontDisconnectPaths ) ) + { + self DisconnectPaths(); + } + if( IsDefined( self.currentnode ) && IsDefined( self.currentnode.script_noteworthy ) && self.currentnode.script_noteworthy == "deleteme" ) + { + return; + } + if ( !IsDefined( self.dontunloadonend ) ) + { + do_unload( self.script_unloaddelay ); + } +} +do_unload( delay ) +{ + self endon( "unload" ); + if (IsDefined(delay) && delay > 0) + { + wait delay; + } + self notify( "unload" ); +} +path_gate_open( node ) +{ + node.gateopen = true; + node notify( "gate opened" ); +} +path_gate_wait_till_open( pathspot ) +{ + self endon( "death" ); + self.waitingforgate = true; + self vehicle_setspeed( 0, 15, "path gate closed" ); + pathspot waittill( "gate opened" ); + self.waitingforgate = false; + if( self.health > 0 ) + { + script_resumespeed( "gate opened", level.vehicle_ResumeSpeed ); + } +} +spawner_setup( vehicles, spawngroup, from ) +{ + if( !IsDefined( level.vehicleSpawners ) ) + { + level.vehicleSpawners = []; + } + level.vehicleSpawners[ spawngroup ] = []; + vehicle = []; + for( i = 0; i < vehicles.size; i++ ) + { + vehicles[i] thread vehicle_main(); + if( !IsDefined( vehicle[ spawngroup ] ) ) + { + vehicle[ spawngroup ] = []; + } + script_struct = SpawnStruct(); + script_struct setspawnervariables( vehicles[ i ], from ); + vehicle[ spawngroup ] = array_add(vehicle[ spawngroup ], script_struct); + level.vehicleSpawners[ spawngroup ][ i ] = script_struct; + } + while( 1 ) + { + spawnedvehicles = []; + level waittill( "spawnvehiclegroup" + spawngroup ); + for( i = 0; i < vehicle[ spawngroup ].size; i++ ) + { + spawnedvehicles[ spawnedvehicles.size ] = vehicle_spawn( vehicle[ spawngroup ][ i ] ); + } + level notify( "vehiclegroup spawned" + spawngroup, spawnedvehicles ); + } +} +scripted_spawn( group ) +{ + thread scripted_spawn_go( group ); + level waittill( "vehiclegroup spawned" + group, vehicles ); + return vehicles; +} +scripted_spawn_go( group ) +{ + waittillframeend; + level notify( "spawnvehiclegroup" + group ); +} +setspawnervariables( vehicle, from ) +{ + self.spawnermodel = vehicle.model; + self.angles = vehicle.angles; + self.origin = vehicle.origin; + if( IsDefined( vehicle.script_delay ) ) + { + self.script_delay = vehicle.script_delay; + } + if( IsDefined( vehicle.script_noteworthy ) ) + { + self.script_noteworthy = vehicle.script_noteworthy; + } + if( IsDefined( vehicle.script_parameters ) ) + { + self.script_parameters = vehicle.script_parameters; + } + if( IsDefined( vehicle.script_team ) ) + { + self.vteam = vehicle.script_team; + } + if( IsDefined( vehicle.script_vehicleride ) ) + { + self.script_vehicleride = vehicle.script_vehicleride; + } + if( IsDefined( vehicle.target ) ) + { + self.target = vehicle.target; + } + if( IsDefined( vehicle.targetname ) ) + { + self.targetname = vehicle.targetname; + } + else + { + self.targetname = "notdefined"; + } + self.spawnedtargetname = self.targetname; + self.targetname = self.targetname + "_vehiclespawner"; + if( IsDefined( vehicle.triggeredthink ) ) + { + self.triggeredthink = vehicle.triggeredthink; + } + if( IsDefined( vehicle.script_sound ) ) + { + self.script_sound = vehicle.script_sound; + } + if( IsDefined( vehicle.script_turretmg ) ) + { + self.script_turretmg = vehicle.script_turretmg; + } + if( IsDefined( vehicle.script_startinghealth ) ) + { + self.script_startinghealth = vehicle.script_startinghealth; + } + if( IsDefined( vehicle.spawnerNum ) ) + { + self.spawnerNum = vehicle.spawnerNum; + } + if( IsDefined( vehicle.script_deathnotify ) ) + { + self.script_deathnotify = vehicle.script_deathnotify; + } + if( IsDefined( vehicle.script_turret ) ) + { + self.script_turret = vehicle.script_turret; + } + if( IsDefined( vehicle.script_linkTo ) ) + { + self.script_linkTo = vehicle.script_linkTo; + } + if( IsDefined( vehicle.script_VehicleSpawngroup ) ) + { + self.script_VehicleSpawngroup = vehicle.script_VehicleSpawngroup; + } + if( IsDefined( vehicle.script_VehicleStartMove ) ) + { + self.script_VehicleStartMove = vehicle.script_VehicleStartMove; + } + if( IsDefined( vehicle.script_vehicleGroupDelete ) ) + { + self.script_vehicleGroupDelete = vehicle.script_vehicleGroupDelete; + } + if( IsDefined( vehicle.script_vehicle_selfremove ) ) + { + self.script_vehicle_selfremove = vehicle.script_vehicle_selfremove; + } + if( IsDefined( vehicle.script_nomg ) ) + { + self.script_nomg = vehicle.script_nomg; + } + if( IsDefined( vehicle.script_badplace ) ) + { + self.script_badplace = vehicle.script_badplace; + } + if( IsDefined( vehicle.script_vehicleride ) ) + { + self.script_vehicleride = vehicle.script_vehicleride; + } + if( IsDefined( vehicle.script_vehiclewalk ) ) + { + self.script_vehiclewalk = vehicle.script_vehiclewalk; + } + if( IsDefined( vehicle.script_linkName ) ) + { + self.script_linkName = vehicle.script_linkName; + } + if( IsDefined( vehicle.script_crashtypeoverride ) ) + { + self.script_crashtypeoverride = vehicle.script_crashtypeoverride; + } + if( IsDefined( vehicle.script_unloaddelay ) ) + { + self.script_unloaddelay = vehicle.script_unloaddelay; + } + if( IsDefined( vehicle.script_unloadmgguy ) ) + { + self.script_unloadmgguy = vehicle.script_unloadmgguy; + } + if( IsDefined( vehicle.script_keepdriver ) ) + { + self.script_keepdriver = vehicle.script_keepdriver; + } + if( IsDefined( vehicle.script_fireondrones ) ) + { + self.script_fireondrones = vehicle.script_fireondrones; + } + if( IsDefined( vehicle.script_tankgroup ) ) + { + self.script_tankgroup = vehicle.script_tankgroup; + } + if( IsDefined( vehicle.script_playerconeradius ) ) + { + self.script_playerconeradius = vehicle.script_playerconeradius; + } + if( IsDefined( vehicle.script_cobratarget ) ) + { + self.script_cobratarget = vehicle.script_cobratarget; + } + if( IsDefined( vehicle.script_targettype ) ) + { + self.script_targettype = vehicle.script_targettype; + } + if( IsDefined( vehicle.script_targetoffset_z ) ) + { + self.script_targetoffset_z = vehicle.script_targetoffset_z; + } + if( IsDefined( vehicle.script_wingman ) ) + { + self.script_wingman = vehicle.script_wingman; + } + if( IsDefined( vehicle.script_mg_angle ) ) + { + self.script_mg_angle = vehicle.script_mg_angle; + } + if( IsDefined( vehicle.script_physicsjolt ) ) + { + self.script_physicsjolt = vehicle.script_physicsjolt; + } + if( IsDefined( vehicle.script_lights_on ) ) + { + self.script_lights_on = vehicle.script_lights_on; + } + if( IsDefined( vehicle.script_sirens_on ) ) + { + self.script_sirens_on = vehicle.script_sirens_on; + } + if( IsDefined( vehicle.script_vehicledetourgroup ) ) + { + self.script_vehicledetourgroup = vehicle.script_vehicledetourgroup; + } + if( IsDefined( vehicle.speed ) ) + { + self.speed = vehicle.speed; + } + if( IsDefined( vehicle.script_vehicletriggergroup ) ) + { + self.script_vehicletriggergroup = vehicle.script_vehicletriggergroup; + } + if( IsDefined( vehicle.script_cheap ) ) + { + self.script_cheap = vehicle.script_cheap; + } + if ( IsDefined( vehicle.script_volume ) ) + { + self.script_volume = vehicle.script_volume; + } + if( IsDefined( vehicle.script_nonmovingvehicle ) ) + { + self.script_nonmovingvehicle = vehicle.script_nonmovingvehicle; + } + if( IsDefined( vehicle.script_flag ) ) + { + self.script_flag = vehicle.script_flag; + } + if ( IsDefined( vehicle.script_disconnectpaths ) ) + { + self.script_disconnectpaths = vehicle.script_disconnectpaths; + } + if ( IsDefined( vehicle.script_bulletshield ) ) + { + self.script_bulletshield = vehicle.script_bulletshield; + } + if ( IsDefined( vehicle.script_volumeramp ) ) + { + self.script_volumeramp = vehicle.script_volumeramp; + } + if ( IsDefined( vehicle.script_godmode ) ) + { + self.script_godmode = vehicle.script_godmode; + } + if (IsDefined (vehicle.script_vehicleattackgroup)) + { + self.script_vehicleattackgroup = vehicle.script_vehicleattackgroup; + } + if (IsDefined (vehicle.script_vehicleattackgroupwait)) + { + self.script_vehicleattackgroupwait = vehicle.script_vehicleattackgroupwait; + } + if (IsDefined (vehicle.script_friendname)) + { + self.script_friendname = vehicle.script_friendname; + } + if( IsDefined( vehicle.script_unload ) ) + { + self.script_unload = vehicle.script_unload; + } + if( IsDefined(vehicle.script_string)) + { + self.script_string = vehicle.script_string; + } + if( IsDefined(vehicle.script_int)) + { + self.script_int = vehicle.script_int; + } + if( IsDefined(vehicle.script_ignoreme)) + { + self.script_ignoreme = vehicle.script_ignoreme; + } + if( vehicle.count > 0 ) + { + self.count = vehicle.count; + } + else + { + self.count = 1; + } + if( !IsDefined(self.vehicletype) ) + { + if( IsDefined( vehicle.vehicletype ) ) + { + self.vehicletype = vehicle.vehicletype; + } + else + { + self.vehicletype = maps\_vehicletypes::get_type( vehicle.model ); + } + } + if( IsDefined(vehicle.destructibledef) ) + { + self.destructibledef = vehicle.destructibledef; + } + if( !(vehicle.spawnflags & 2) && vehicle IsVehicleUsable() ) + { + self.usable = 1; + } + if ( IsDefined( vehicle.drivepath ) ) + { + self.drivepath = vehicle.drivepath; + } + if( IsDefined( vehicle.script_numbombs ) ) + { + self.script_numbombs = vehicle.script_numbombs; + } + if( IsDefined(vehicle.exhaust_fx)) + { + self.exhaust_fx = vehicle.exhaust_fx; + } + if( IsDefined(vehicle.deathfx)) + { + self.deathfx = vehicle.deathfx; + } + vehicle delete(); + id = vehicle_spawnidgenerate( self.origin ); + self.spawner_id = id; + level.vehicle_spawners[ id ] = self; +} +vehicle_spawnidgenerate( origin ) +{ + return "spawnid" + int( origin[ 0 ] ) + "a" + int( origin[ 1 ] ) + "a" + int( origin[ 2 ] ); +} +vehicleDamageAssist() +{ + self endon( "death" ); + self.attackers = []; + self.attackerData = []; + while( true ) + { + self waittill( "damage", amount, attacker ); + if( !IsDefined ( attacker ) || !isPlayer(attacker) ) + { + continue; + } + if ( !IsDefined( self.attackerData[ attacker getEntityNumber() ] ) ) + { + self.attackers[ self.attackers.size ] = attacker; + self.attackerData[ attacker getEntityNumber() ] = false; + } + } +} +vehicle_spawn( vspawner, from ) +{ + if( !vspawner.count ) + { + return; + } + vehicle = spawnVehicle( vspawner.spawnermodel, vspawner.spawnedtargetname, vspawner.vehicletype, vspawner.origin, vspawner.angles, vspawner.destructibledef ); + if (IsDefined(vspawner.destructibledef)) + { + vehicle.destructibledef = vspawner.destructibledef; + vehicle thread maps\_destructible::destructible_think(); + } + if( IsDefined( vspawner.script_delay ) ) + { + vehicle.script_delay = vspawner.script_delay; + } + if( IsDefined( vspawner.script_noteworthy ) ) + { + vehicle.script_noteworthy = vspawner.script_noteworthy; + } + if( IsDefined( vspawner.script_parameters ) ) + { + vehicle.script_parameters = vspawner.script_parameters; + } + if( IsDefined( vspawner.script_team ) ) + { + vehicle.vteam = vspawner.script_team; + } + if( IsDefined( vspawner.script_vehicleride ) ) + { + vehicle.script_vehicleride = vspawner.script_vehicleride; + } + if( IsDefined( vspawner.target ) ) + { + vehicle.target = vspawner.target; + } + if( IsDefined( vspawner.vehicletype ) && !IsDefined( vehicle.vehicletype ) ) + { + vehicle.vehicletype = vspawner.vehicletype; + } + if( IsDefined( vspawner.triggeredthink ) ) + { + vehicle.triggeredthink = vspawner.triggeredthink; + } + if( IsDefined( vspawner.script_sound ) ) + { + vehicle.script_sound = vspawner.script_sound; + } + if( IsDefined( vspawner.script_turretmg ) ) + { + vehicle.script_turretmg = vspawner.script_turretmg; + } + if( IsDefined( vspawner.script_startinghealth ) ) + { + vehicle.script_startinghealth = vspawner.script_startinghealth; + } + if(IsDefined( vspawner.script_deathnotify ) ) + { + vehicle.script_deathnotify = vspawner.script_deathnotify; + } + if( IsDefined( vspawner.script_turret ) ) + { + vehicle.script_turret = vspawner.script_turret; + } + if( IsDefined(vspawner.script_linkTo ) ) + { + vehicle.script_linkTo = vspawner.script_linkTo; + } + if( IsDefined( vspawner.script_VehicleSpawngroup ) ) + { + vehicle.script_VehicleSpawngroup = vspawner.script_VehicleSpawngroup; + } + if( IsDefined( vspawner.script_VehicleStartMove ) ) + { + vehicle.script_VehicleStartMove = vspawner.script_VehicleStartMove; + } + if( IsDefined( vspawner.script_vehicleGroupDelete ) ) + { + vehicle.script_vehicleGroupDelete = vspawner.script_vehicleGroupDelete; + } + if( IsDefined( vspawner.script_vehicle_selfremove ) ) + { + vehicle.script_vehicle_selfremove = vspawner.script_vehicle_selfremove; + } + if( IsDefined( vspawner.script_nomg ) ) + { + vehicle.script_nomg = vspawner.script_nomg; + } + if( IsDefined( vspawner.script_badplace ) ) + { + vehicle.script_badplace = vspawner.script_badplace; + } + if( IsDefined( vspawner.script_vehicleride ) ) + { + vehicle.script_vehicleride = vspawner.script_vehicleride; + } + if( IsDefined( vspawner.script_vehiclewalk ) ) + { + vehicle.script_vehiclewalk = vspawner.script_vehiclewalk; + } + if( IsDefined( vspawner.script_linkName ) ) + { + vehicle.script_linkName = vspawner.script_linkName; + } + if( IsDefined( vspawner.script_crashtypeoverride ) ) + { + vehicle.script_crashtypeoverride = vspawner.script_crashtypeoverride; + } + if( IsDefined( vspawner.script_unloaddelay ) ) + { + vehicle.script_unloaddelay = vspawner.script_unloaddelay; + } + if( IsDefined( vspawner.script_unloadmgguy ) ) + { + vehicle.script_unloadmgguy = vspawner.script_unloadmgguy; + } + if( IsDefined( vspawner.script_keepdriver ) ) + { + vehicle.script_keepdriver = vspawner.script_keepdriver; + } + if( IsDefined( vspawner.script_fireondrones ) ) + { + vehicle.script_fireondrones = vspawner.script_fireondrones; + } + if( IsDefined( vspawner.script_tankgroup ) ) + { + vehicle.script_tankgroup = vspawner.script_tankgroup; + } + if( IsDefined( vspawner.script_playerconeradius ) ) + { + vehicle.script_playerconeradius = vspawner.script_playerconeradius; + } + if( IsDefined( vspawner.script_cobratarget ) ) + { + vehicle.script_cobratarget = vspawner.script_cobratarget; + } + if( IsDefined( vspawner.script_targettype ) ) + { + vehicle.script_targettype = vspawner.script_targettype; + } + if( IsDefined( vspawner.script_targetoffset_z ) ) + { + vehicle.script_targetoffset_z = vspawner.script_targetoffset_z; + } + if( IsDefined( vspawner.script_wingman ) ) + { + vehicle.script_wingman = vspawner.script_wingman; + } + if( IsDefined( vspawner.script_mg_angle ) ) + { + vehicle.script_mg_angle = vspawner.script_mg_angle; + } + if( IsDefined( vspawner.script_physicsjolt ) ) + { + vehicle.script_physicsjolt = vspawner.script_physicsjolt; + } + if( IsDefined( vspawner.script_cheap ) ) + { + vehicle.script_cheap = vspawner.script_cheap; + } + if ( IsDefined( vspawner.script_flag ) ) + { + vehicle.script_flag = vspawner.script_flag; + } + if( IsDefined( vspawner.script_lights_on ) ) + { + vehicle.script_lights_on = vspawner.script_lights_on; + } + if( IsDefined( vspawner.script_sirens_on ) ) + { + vehicle.script_sirens_on = vspawner.script_sirens_on; + } + if( IsDefined( vspawner.script_vehicledetourgroup ) ) + { + vehicle.script_vehicledetourgroup = vspawner.script_vehicledetourgroup; + } + if( IsDefined( vspawner.speed ) ) + { + vehicle.speed = vspawner.speed; + } + if ( IsDefined( vspawner.script_volume ) ) + { + vehicle.script_volume = vspawner.script_volume; + } + if( IsDefined( vspawner.spawner_id ) ) + { + vehicle.spawner_id = vspawner.spawner_id; + } + if( IsDefined( vspawner.script_vehicletriggergroup ) ) + { + vehicle.script_vehicletriggergroup = vspawner.script_vehicletriggergroup; + } + if ( IsDefined( vspawner.script_disconnectpaths ) ) + { + vehicle.script_disconnectpaths = vspawner.script_disconnectpaths; + } + if ( IsDefined( vspawner.script_godmode ) ) + { + vehicle.script_godmode = vspawner.script_godmode; + } + if ( IsDefined( vspawner.script_bulletshield ) ) + { + vehicle.script_bulletshield = vspawner.script_bulletshield; + } + if ( IsDefined( vspawner.script_volumeramp ) ) + { + vehicle.script_volumeramp = vspawner.script_volumeramp; + } + if( IsDefined( vspawner.script_numbombs ) ) + { + vehicle.script_numbombs = vspawner.script_numbombs; + } + if( IsDefined( vspawner.script_flag ) ) + { + vehicle.script_flag = vspawner.script_flag; + } + if( IsDefined( vspawner.script_nonmovingvehicle ) ) + { + vehicle.script_nonmovingvehicle = vspawner.script_nonmovingvehicle; + } + if( IsDefined( vspawner.script_vehicleattackgroup ) ) + { + vehicle.script_vehicleattackgroup = vspawner.script_vehicleattackgroup; + } + if( IsDefined( vspawner.script_vehicleattackgroupwait ) ) + { + vehicle.script_vehicleattackgroupwait = vspawner.script_vehicleattackgroupwait; + } + if (IsDefined (vspawner.script_friendname)) + { + vehicle.script_friendname = vspawner.script_friendname; + } + if( IsDefined( vspawner.script_unload ) ) + { + vehicle.unload_group = vspawner.script_unload; + } + if(IsDefined(vspawner.script_string)) + { + vehicle.script_string = vspawner.script_string; + } + if(IsDefined(vspawner.script_int)) + { + vehicle.script_int = vspawner.script_int; + } + vehicle_init( vehicle ); + if( IsDefined( vehicle.targetname ) ) + { + level notify( "new_vehicle_spawned" + vehicle.targetname, vehicle ); + } + if( IsDefined( vehicle.script_noteworthy ) ) + { + level notify( "new_vehicle_spawned" + vehicle.script_noteworthy, vehicle ); + } + if ( IsDefined( vehicle.spawner_id ) ) + { + level notify( "new_vehicle_spawned" + vehicle.spawner_id, vehicle ); + } + if( IsDefined( vspawner.usable ) ) + { + vehicle makeVehicleUsable(); + } + if( IsDefined( vspawner.drivepath ) ) + { + vehicle.drivepath = vspawner.drivepath; + } + if( IsDefined(vspawner.exhaust_fx)) + { + vehicle.exhaust_fx = vspawner.exhaust_fx; + } + if( IsDefined(vspawner.deathfx)) + { + vehicle.deathfx = vspawner.deathfx; + } + if( IsDefined(vspawner.script_ignoreme)) + { + vehicle.script_ignoreme = vspawner.script_ignoreme; + } + if ( vehicle.vteam == "axis" && IsDefined( level.vehicle_enemy_tanks[ vspawner.spawnermodel ] ) ) + { + vehicle thread vehicleDamageAssist(); + } + if( IsDefined(vspawner.spawn_funcs) ) + { + for( i = 0; i < vspawner.spawn_funcs.size; i++ ) + { + if (IsDefined(vehicle)) + { + func = vspawner.spawn_funcs[ i ]; + single_thread(vehicle, func[ "function" ], func[ "param1" ], func[ "param2" ], func[ "param3" ], func[ "param4" ]); + } + } + } + return vehicle; +} +waittill_vehiclespawn( targetname ) +{ + level waittill( "new_vehicle_spawned" + targetname, vehicle ); + return vehicle; +} +waittill_vehiclespawn_noteworthy( noteworthy ) +{ + level waittill( "new_vehicle_spawned" + noteworthy, vehicle ); + return vehicle; +} +waittill_vehiclespawn_spawner_id( spawner_id ) +{ + level waittill( "new_vehicle_spawned" + spawner_id, vehicle ); + return vehicle; +} +wait_vehiclespawn( targetname ) +{ + println( "wait_vehiclespawn() called; change to waittill_vehiclespawn()" ); + level waittill( "new_vehicle_spawned" + targetname, vehicle ); + return vehicle; +} +spawn_through( vehicle ) +{ + struct = spawnstruct(); + struct setspawnervariables( vehicle ); + return vehicle_spawn( struct ); +} +vehicle_init( vehicle ) +{ + vehicle UseAnimTree( #animtree ); + if( vehicle.classname == "script_model" ) + { + vehicle = spawn_through( vehicle ); + return; + } + vehicle ent_flag_init("waiting_for_flag"); + vehicle.takedamage = !is_true(vehicle.script_godmode); + vehicle.zerospeed = true; + if( !IsDefined( vehicle.modeldummyon ) ) + { + vehicle.modeldummyon = false; + } + type = vehicle.vehicletype; + vehicle vehicle_life(); + vehicle thread vehicle_main(); + vehicle vehicle_setteam(); + vehicle thread maingun_FX(); + vehicle.riders = []; + vehicle.unloadque = []; + if( !IsDefined(vehicle.unload_group) ) + { + vehicle.unload_group = "default"; + } + vehicle.getoutrig = []; + if( IsDefined( level.vehicle_attachedmodels ) && IsDefined( level.vehicle_attachedmodels[ type ] ) ) + { + rigs = level.vehicle_attachedmodels[ type ]; + strings = getarraykeys( rigs ); + for( i = 0; i < strings.size; i++ ) + { + vehicle.getoutrig[ strings[ i ] ] = undefined; + vehicle.getoutriganimating[ strings[ i ] ] = false; + } + } + vehicle thread vehicle_badplace(); + if (is_true(vehicle.script_lights_on)) + { + vehicle lights_on(); + } + if (is_true(vehicle.script_sirens_on)) + { + vehicle sirens_on(); + } + if( !vehicle isCheap() ) + { + vehicle friendlyfire_shield(); + } + vehicle thread maps\_vehicle_aianim::handle_attached_guys(); + if( !vehicle isCheap() ) + { + vehicle thread vehicle_handleunloadevent(); + } + vehicle thread turret_attack_think(); + if( !vehicle isCheap() ) + { + vehicle thread vehicle_weapon_fired(); + } + if( IsDefined( vehicle.script_physicsjolt ) && vehicle.script_physicsjolt ) + { + vehicle thread physicsjolt_proximity(); + } + vehicle_Levelstuff( vehicle ); + vehicle thread vehicle_compasshandle(); + vehicle thread animate_drive_idle(); + if( !vehicle isCheap() ) + { + vehicle thread mginit(); + } + if( IsDefined( level.vehicleSpawnCallbackThread ) ) + { + level thread [[ level.vehicleSpawnCallbackThread ]]( vehicle ); + } + if( !vehicle isCheap() ) + { + vehicle thread disconnect_paths_whenstopped(); + } + if (!IsDefined (vehicle.script_nonmovingvehicle)) + { + path_start = undefined; + if(IsDefined(vehicle.target)) + { + path_start = GetVehicleNode(vehicle.target, "targetname"); + if(!IsDefined(path_start)) + { + path_start = GetEnt(vehicle.target, "targetname"); + if(!IsDefined(path_start)) + { + path_start = getstruct(vehicle.target, "targetname"); + } + } + } + if(IsDefined(path_start) && vehicle.vehicletype != "inc_base_jump_spotlight") + { + vehicle thread getonpath(path_start); + } + } + if (IsDefined (vehicle.script_vehicleattackgroup)) + { + vehicle thread attackgroup_think(); + } + if( vehicle hasHelicopterDustKickup() ) + { + if(!level.clientscripts) + { + vehicle thread aircraft_dust_kickup(); + } + } + vehicle spawn_group(); + vehicle thread kill(); + if ( !IsDefined( vehicle.script_volume ) ) + { + vehicle thread init_ramp_volume(); + } + vehicle apply_truckjunk(); +} +init_ramp_volume() +{ + time = 2; + if ( self is_plane() ) + { + time = 1; + } + if ( IsDefined( self.script_volumeramp ) ) + { + time = self.script_volumeramp; + } + self volume_up( time ); +} +kill_damage() +{ + if( !IsDefined(self) || self.radiusdamageradius <= 0 ) + { + return; + } + wait(0.05); + if (IsDefined(self)) + { + self RadiusDamage( self.origin, self.radiusdamageradius, self.radiusdamagemax, self.radiusdamagemin, self, "MOD_EXPLOSIVE" ); + } +} +kill() +{ + self endon( "nodeath_thread" ); + type = self.vehicletype; + model = self.model; + targetname = self.targetname; + attacker = undefined; + arcadeModePointsRewarded = false; + while ( 1 ) + { + rumbletrigger = self.rumbletrigger; + mgturret = self.mgturret; + vteam = self.vteam; + script_linkname = self.script_linkname; + if ( IsDefined( self ) ) + { + self waittill( "death", attacker ); + } + if( arcadeMode() && false == arcadeModePointsRewarded ) + { + if( IsDefined(self.vteam) && (self.vteam != "allies") ) + { + if ( IsDefined( self.attackers ) ) + { + for ( i = 0; i < self.attackers.size; i++ ) + { + player = self.attackers[i]; + if ( !IsDefined( player ) ) + { + continue; + } + if ( player == attacker ) + { + continue; + } + player.assists++; + arcademode_assignpoints( "arcademode_score_tankassist", player ); + } + self.attackers = []; + self.attackerData = []; + } + if( IsPlayer( attacker ) ) + { + arcademode_assignpoints( "arcademode_score_tank", attacker ); + attacker.kills++; + } + } + else + { + arcademode_assignpoints( "arcademode_score_tank_friendly", attacker ); + } + arcadeModePointsRewarded = true; + } + if (IsDefined(self)) + { + self lights_off(); + self sirens_off(); + self interior_lights_off(); + } + if( IsDefined( rumbletrigger ) ) + { + rumbletrigger delete(); + } + if( IsDefined( mgturret ) ) + { + array_levelthread( mgturret, ::turret_deleteme ); + mgturret = undefined; + } + if( IsDefined( vteam ) ) + { + level.vehicles[ vteam ] = array_remove( level.vehicles[ vteam ], self ); + } + if ( IsDefined( script_linkname ) ) + { + level.vehicle_link[ script_linkname ] = array_remove( level.vehicle_link[ script_linkname ], self ); + } + if( IsDefined( targetname ) ) + { + level.vehicle_target[ targetname ] = array_remove( level.vehicle_target[ targetname ], self ); + } + if( IsDefined( self.script_VehicleSpawngroup ) ) + { + level.vehicle_SpawnGroup[ self.script_VehicleSpawngroup ] = array_remove( level.vehicle_SpawnGroup[ self.script_VehicleSpawngroup ], self ); + } + if( IsDefined( self.script_VehicleStartMove ) ) + { + level.vehicle_StartMoveGroup[ self.script_VehicleStartMove ] = array_remove( level.vehicle_StartMoveGroup[ self.script_VehicleStartMove ], self ); + } + if( IsDefined( self.script_vehicleGroupDelete ) ) + { + level.vehicle_DeleteGroup[ self.script_vehicleGroupDelete ] = array_remove( level.vehicle_DeleteGroup[ self.script_vehicleGroupDelete ], self ); + } + if( !IsDefined( self ) || is_corpse() ) + { + if ( IsDefined( self.riders ) ) + { + for ( j = 0; j < self.riders.size; j++ ) + { + if ( IsDefined( self.riders[ j ] ) ) + { + self.riders[ j ] delete(); + } + } + } + if( self is_corpse() ) + { + self.riders = []; + continue; + } + self notify( "delete_destructible" ); + return; + } + if( IsDefined( level.vehicle_death_thread[ type ] ) ) + { + thread [[ level.vehicle_death_thread[ type ] ]](); + } + if( IsDefined( self.deathquakescale ) && self.deathquakescale > 0 ) + { + Earthquake( + self.deathquakescale, + self.deathquakeduration, + self.origin, + self.deathquakeradius + ); + } + thread kill_damage(); + if( !IsDefined( self.destructibledef ) ) + { + if( IsDefined( self.deathmodel ) && self.deathmodel != "" ) + { + self thread set_death_model( self.deathmodel, self.modelswapdelay ); + } + if( (!IsDefined( self.mantled ) || !self.mantled ) && !IsDefined(self.nodeathfx) ) + { + thread kill_fx(); + } + if( IsDefined( self.delete_on_death ) ) + { + wait( 0.05 ); + if( !IsDefined( self.dontDisconnectPaths ) ) + { + self disconnectpaths(); + } + self freevehicle(); + self.isacorpse = true; + wait 0.05; + self notify( "death_finished" ); + self delete(); + continue; + } + } + maps\_vehicle_aianim::blowup_riders(); + thread kill_badplace( type ); + if( IsDefined( level.vehicle_deathnotify ) && IsDefined( level.vehicle_deathnotify[ self.vehicletype ] ) ) + { + level notify( level.vehicle_deathnotify[ self.vehicletype ], attacker ); + } + if ( self.classname == "script_vehicle" ) + { + self thread kill_jolt( type ); + } + if( !IsDefined( self.destructibledef ) ) + { + if( IsDefined( self.script_crashtypeoverride ) ) + { + crashtype = self.script_crashtypeoverride; + } + else if( self is_plane() ) + { + crashtype = "aircraft"; + } + else if(self is_helicopter()) + { + crashtype = "helicopter"; + } + else if( IsDefined( self.currentnode ) && crash_path_check( self.currentnode ) ) + { + crashtype = "none"; + } + else + { + crashtype = "tank"; + } + if( crashtype == "aircraft" ) + { + self thread aircraft_crash(); + } + if( crashtype == "helicopter" ) + { + if(IsDefined(self.script_nocorpse)) + { + self thread helicopter_explode(); + } + else + { + self thread helicopter_crash(); + } + } + if( crashtype == "tank" ) + { + if( !IsDefined( self.rollingdeath ) ) + { + self vehicle_setspeed( 0, 25, "Dead" ); + } + else + { + self waittill( "deathrolloff" ); + self vehicle_setspeed( 0, 25, "Dead, finished path intersection" ); + } + wait .4; + self vehicle_setspeed( 0, 10000, "deadstop" ); + self notify( "deadstop" ); + if ( !IsDefined( self.dontDisconnectPaths ) ) + { + self disconnectpaths(); + } + if( ( IsDefined( self.tankgetout ) ) && ( self.tankgetout > 0 ) ) + { + self waittill( "animsdone" ); + } + } + } + if( IsDefined( self.turretweapon ) && self.turretweapon != "" ) + { + self clearTurretTarget(); + } + if( IsDefined(self) && (self is_plane() || self is_boat()) ) + { + if( ( IsDefined( self.crashing ) ) && ( self.crashing == true ) ) + { + self waittill( "crash_done" ); + } + } + else + { + if( IsDefined(self.isphysicsvehicle) && self.isphysicsvehicle ) + { + while( IsDefined(self) && self GetSpeedMPH() > 2.0 ) + { + wait(0.1); + } + } + else + { + while( IsDefined( self ) && self getspeedmph() > 0 ) + { + wait( 0.1 ); + } + } + } + self notify( "stop_looping_death_fx" ); + self notify( "death_finished" ); + wait( 0.5 ); + if( is_corpse() ) + { + continue; + } + if( IsDefined( self ) ) + { + while( IsDefined( self.dontfreeme ) && IsDefined(self) ) + { + wait( .05 ); + } + if( !IsDefined( self ) ) + { + continue; + } + occupants = self GetVehOccupants(); + if(IsDefined(occupants) && occupants.size) + { + for(i = 0; i < occupants.size; i++) + { + self UseBy(occupants[i]); + } + } + self freevehicle(); + self.isacorpse = true; + if ( self.modeldummyon ) + { + self hide(); + } + } + if( ( IsDefined( self.crashing ) ) && ( self.crashing == true ) ) + { + self delete(); + continue; + } + } +} +is_corpse() +{ + if (IsDefined(self)) + { + if (is_true(self.isacorpse)) + { + return true; + } + else if ( IsDefined(self.classname) && (self.classname == "script_vehicle_corpse")) + { + return true; + } + } + return false; +} +set_death_model( sModel, fDelay ) +{ + assert( IsDefined( sModel ) ); + if( IsDefined( fDelay ) && ( fDelay > 0 ) ) + { + wait fDelay; + } + if(!IsDefined(self)) + { + return; + } + eModel = get_dummy(); + eModel clearanim( %root, 0 ); + if( IsDefined( self ) ) + { + eModel setmodel( sModel ); + eModel SetVehicleAttachments( 1 ); + } +} +aircraft_crash() +{ + self.crashing = true; + if( IsDefined( self.unloading ) ) + { + while( IsDefined( self.unloading ) ) + { + wait( 0.05 ); + } + } + if( !IsDefined( self ) ) + { + return; + } + self thread aircraft_crash_move(); +} +helicopter_crash() +{ + self.crashing = true; + if( IsDefined( self.unloading ) ) + { + while( IsDefined( self.unloading ) ) + { + wait( 0.05 ); + } + } + if( !IsDefined( self ) ) + { + return; + } + level thread helicopter_crash_move(self); +} +helicopter_explode() +{ + fx_origin = self GetTagOrigin(self.kill_fx_struct.tag); + PlayFx( self.kill_fx_struct.effect, fx_origin ); + self Delete(); +} +get_unused_crash_locations() +{ + unusedLocations = []; + for ( i = 0; i < level.helicopter_crash_locations.size; i++ ) + { + if ( IsDefined( level.helicopter_crash_locations[ i ].claimed ) ) + { + continue; + } + unusedLocations[ unusedLocations.size ] = level.helicopter_crash_locations[ i ]; + } + return unusedLocations; +} +aircraft_crash_move() +{ + self endon( "death" ); + forward = AnglesToForward( self.angles + ( 45, 0, 0 ) ); + dest_point = self.origin + vector_scale( forward, 10000 ); + dest_point = ( dest_point[0], dest_point[1], -700 ); + self SetSpeed( 300, 30 ); + self SetNearGoalNotifyDist( 300 ); + self SetVehGoalPos( dest_point, 1 ); + self waittill_any( "goal", "near_goal" ); + self notify( "crash_done" ); +} +helicopter_crash_move(heli) +{ + death_model = heli.deathmodel; + death_org = heli.origin; + death_angles = heli.angles; + death_heli = Spawn("script_model", death_org); + death_heli SetModel(death_model); + death_heli.angles = death_angles; + death_heli PhysicsLaunch(death_heli.origin, (200, 0, 0)); + if (isDefined(heli.kill_fx_struct.effect) && isDefined(heli.kill_fx_struct.tag) ) + { + PlayFxOnTag( heli.kill_fx_struct.effect, death_heli, heli.kill_fx_struct.tag ); + } + heli Delete(); +} +crash_path_check( node ) +{ + targ = node; + search_depth = 5; + while( IsDefined( targ ) && search_depth >= 0 ) + { + if( ( IsDefined( targ.detoured ) ) && ( targ.detoured == 0 ) ) + { + detourpath = path_detour_get_detourpath( getvehiclenode( targ.target, "targetname" ) ); + if( IsDefined( detourpath ) && IsDefined( detourpath.script_crashtype ) ) + { + return true; + } + } + if( IsDefined( targ.target ) ) + { + targ1 = getvehiclenode( targ.target, "targetname" ); + if (IsDefined(targ1) && IsDefined(targ1.target) && IsDefined(targ.targetname) && targ1.target == targ.targetname) + { + return false; + } + else if (IsDefined(targ1) && targ1 == node) + { + return false; + } + else + { + targ = targ1; + } + } + else + { + targ = undefined; + } + search_depth--; + } + return false; +} +death_firesound( sound ) +{ + self thread play_loop_sound_on_tag( sound, undefined, false ); + self waittill_any( "fire_extinguish", "stop_crash_loop_sound" ); + if ( !IsDefined( self ) ) + { + return; + } + self notify( "stop sound" + sound ); +} +kill_fx() +{ + if( self isdestructible() ) + { + return; + } + level notify( "vehicle_explosion", self.origin ); + self explode_notify_wrapper(); + struct = build_death_fx( self.deathfx, self.deathfxtag, self.deathfxsound ); + thread kill_fx_thread( struct ); +} +vehicle_flag_arrived( msg ) +{ + if ( !IsDefined( self.vehicle_flags ) ) + { + self.vehicle_flags = []; + } + while ( !IsDefined( self.vehicle_flags[ msg ] ) ) + { + self waittill( "vehicle_flag_arrived", notifymsg ); + if ( msg == notifymsg ) + { + return; + } + } +} +kill_fx_thread( struct ) +{ + assert( IsDefined( struct ) ); + if( IsDefined( struct.waitDelay ) ) + { + if( struct.waitDelay >= 0 ) + { + wait struct.waitDelay; + } + else + { + self waittill( "death_finished" ); + } + } + if ( !IsDefined( self ) ) + { + return; + } + if( self is_helicopter() ) + { + self.kill_fx_struct = struct; + return; + } + if( IsDefined( struct.notifyString ) ) + { + self notify( struct.notifyString ); + } + eModel = get_dummy(); + if( IsDefined( struct.effect ) ) + { + if( ( struct.bEffectLooping ) && ( !IsDefined( self.delete_on_death ) ) ) + { + if( IsDefined( struct.tag ) ) + { + if( ( IsDefined( struct.stayontag ) ) && ( struct.stayontag == true ) ) + { + thread loop_fx_on_vehicle_tag( struct.effect, struct.delay, struct.tag ); + } + else + { + thread playLoopedFxontag( struct.effect, struct.delay, struct.tag ); + } + } + else + { + forward = ( eModel.origin + ( 0, 0, 100 ) ) - eModel.origin; + playfx( struct.effect, eModel.origin, forward ); + } + } + else if( IsDefined( struct.tag ) ) + { + if ( IsDefined(self.modeldummyon) && self.modeldummyon ) + { + playfxontag( struct.effect, deathfx_ent(), struct.tag ); + } + else + { + playfxontag( struct.effect, self, struct.tag ); + } + } + else + { + forward = ( eModel.origin + ( 0, 0, 100 ) ) - eModel.origin; + playfx( struct.effect, eModel.origin, forward ); + } + } + if( ( IsDefined( struct.sound ) ) && ( !IsDefined( self.delete_on_death ) ) ) + { + if( struct.bSoundlooping ) + { + thread death_firesound( struct.sound ); + } + else + { + self play_sound_in_space( struct.sound ); + } + } +} +loop_fx_on_vehicle_tag( effect, loopTime, tag ) +{ + assert( IsDefined( effect ) ); + assert( IsDefined( tag ) ); + assert( IsDefined( loopTime ) ); + self endon( "stop_looping_death_fx" ); + while( IsDefined( self ) ) + { + playfxontag( effect, deathfx_ent(), tag ); + wait loopTime; + } +} +build_death_fx( effect, tag, sound, bEffectLooping, delay, bSoundlooping, waitDelay, stayontag, notifyString ) +{ + if( !IsDefined( bSoundlooping ) ) + { + bSoundlooping = false; + } + if( !IsDefined( bEffectLooping ) ) + { + bEffectLooping = false; + } + if( !IsDefined( delay ) ) + { + delay = 1; + } + struct = spawnstruct(); + struct.effect = effect; + struct.tag = tag; + struct.sound = sound; + struct.bSoundlooping = bSoundlooping; + struct.delay = delay; + struct.waitDelay = waitDelay; + struct.stayontag = stayontag; + struct.notifyString = notifyString; + struct.bEffectLooping = bEffectLooping; + return struct; +} +get_script_modelvehicles() +{ + array = []; + models = getentarray( "script_model", "classname" ); + if ( IsDefined( level.modelvehicles ) ) + { + return level.modelvehicles; + } + level.modelvehicles = []; + for( i = 0; i < models.size; i++ ) + { + if( IsDefined( models[ i ].targetname ) + && ( models[ i ].targetname == "destructible" + || models[ i ].targetname == "zpu" + || models[ i ].targetname == "exploder" ) ) + { + continue; + } + if( IsDefined( models[ i ].script_noteworthy ) && models[ i ].script_noteworthy == "notvehicle" ) + { + continue; + } + if( maps\_vehicletypes::is_type( models[ i ].model ) ) + { + array[ array.size ] = models[ i ]; + models[ i ].vehicletype = maps\_vehicletypes::get_type( models[ i ].model ); + } + } + level.modelvehicles = array; + return level.modelvehicles; +} +precache_scripts() +{ + vehicles = getentarray( "script_vehicle", "classname" ); + vehicles = array_combine( vehicles, get_script_modelvehicles() ); + playerdrivablevehicles = []; + allvehiclesprespawn = []; + for( i = 0; i < vehicles.size; i++ ) + { + if (vehicles[ i ] has_spawnflag(level.SPAWNFLAG_VEHICLE_USEABLE)) + { + playerdrivablevehicles[ playerdrivablevehicles.size ] = vehicles[ i ]; + } + allvehiclesprespawn[ allvehiclesprespawn.size ] = vehicles[ i ]; + } + if( playerdrivablevehicles.size > 0 ) + { + thread maps\_vehicledrive::main(); + } + return allvehiclesprespawn; +} +vehicle_modelinarray( arrayofmodels, model ) +{ + for( i = 0; i < arrayofmodels.size; i++ ) + { + if( arrayofmodels[ i ] == model ) + { + return true; + } + } + return false; +} +vehicle_kill_disconnect_paths_forever() +{ + self notify( "kill_disconnect_paths_forever" ); +} +disconnect_paths_whenstopped() +{ + self endon( "death" ); + self endon( "kill_disconnect_paths_forever" ); + if ( IsDefined( self.script_disconnectpaths ) && !self.script_disconnectpaths ) + { + self.dontDisconnectPaths = true; + return; + } + wait( randomfloat( 1 ) ); + while( IsDefined( self ) ) + { + if( self getspeed() < 1 ) + { + if ( !IsDefined( self.dontDisconnectPaths ) ) + { + self disconnectpaths(); + } + self notify( "speed_zero_path_disconnect" ); + while( self getspeed() < 1 ) + { + wait( 0.05 ); + } + } + self connectpaths(); + wait( 1 ); + } +} +vehicle_setspeed( speed, rate, msg ) +{ + if( self getspeedmph() == 0 && speed == 0 ) + { + return; + } + self setspeed( speed, rate ); +} +debug_vehiclesetspeed( speed, rate, msg ) +{ +} +script_resumespeed( msg, rate ) +{ + self endon( "death" ); + fSetspeed = 0; + type = "resumespeed"; + if( !IsDefined( self.resumemsgs ) ) + { + self.resumemsgs = []; + } + if( IsDefined( self.waitingforgate ) && self.waitingforgate ) + { + return; + } + if( IsDefined( self.attacking ) && self.attacking ) + { + fSetspeed = self.attackspeed; + type = "setspeed"; + } + self.zerospeed = false; + if( fSetspeed == 0 ) + { + self.zerospeed = true; + } + if( type == "resumespeed" ) + { + self resumespeed( rate ); + } + else if( type == "setspeed" ) + { + self vehicle_setspeed( fSetspeed, 15, "resume setspeed from attack" ); + } + self notify( "resuming speed" ); +} +print_resumespeed( timer ) +{ + self notify( "newresumespeedmsag" ); + self endon( "newresumespeedmsag" ); + self endon( "death" ); + while( gettime() < timer && IsDefined( self.resumemsgs ) ) + { + if( self.resumemsgs.size > 6 ) + { + start = self.resumemsgs.size - 5; + } + else + { + start = 0; + } + for( i = start; i < self.resumemsgs.size; i++ ) + { + position = i * 32; + print3d( self.origin + ( 0, 0, position ), "resuming speed: " + self.resumemsgs[ i ], ( 0, 1, 0 ), 1, 3 ); + } + wait .05; + } +} +godon() +{ + self.takedamage = false; +} +godoff() +{ + self.takedamage = true; +} +setturretfireondrones( b ) +{ + if( IsDefined( self.mgturret ) && self.mgturret.size ) + { + for( i = 0; i < self.mgturret.size; i++ ) + { + self.mgturret[ i ].script_fireondrones = b; + } + } +} +getnormalanimtime( animation ) +{ + animtime = self getanimtime( animation ); + animlength = getanimlength( animation ); + if( animtime == 0 ) + { + return 0; + } + return self getanimtime( animation ) / getanimlength( animation ); +} +rotor_anim() +{ + length = getanimlength( self getanim( "rotors" ) ); + for ( ;; ) + { + self setanim( self getanim( "rotors" ), 1, 0, 1 ); + wait( length ); + } +} +animate_drive_idle() +{ + if( !IsDefined( self.wheeldir ) ) + { + self.wheeldir = 1; + } + model = self.model; + if( IsDefined( self.isphysicsvehicle ) && self.isphysicsvehicle ) + { + return; + } + if( !IsDefined( level.vehicle_DriveIdle[ model ] ) ) + { + return; + } + newanimtime = undefined; + if( !IsDefined( level.vehicle_DriveIdle_r[ model ] ) ) + { + level.vehicle_DriveIdle_r[ model ] = level.vehicle_DriveIdle[ model ]; + } + self endon( "death" ); + normalspeed = level.vehicle_DriveIdle_normal_speed[ model ]; + thread animate_drive_idle_death(); + animrate = 1.0; + if( ( IsDefined( level.vehicle_DriveIdle_animrate ) ) && ( IsDefined( level.vehicle_DriveIdle_animrate[ model ] ) ) ) + { + animrate = level.vehicle_DriveIdle_animrate[ model ]; + } + lastdir = self.wheeldir; + animatemodel = self; + animation = level.vehicle_DriveIdle[ model ]; + while( 1 ) + { + if( !normalspeed ) + { + animatemodel setanim( level.vehicle_DriveIdle[ model ], 1, .2, animrate ); + thread animtimer( .5 ); + self waittill( "animtimer" ); + continue; + } + speed = self getspeedmph(); + if( lastdir != self.wheeldir ) + { + dif = 0; + if( self.wheeldir ) + { + animation = level.vehicle_DriveIdle [ model ]; + dif = 1 - animatemodel getnormalanimtime( level.vehicle_DriveIdle_r [ model ] ); + animatemodel clearanim( level.vehicle_DriveIdle_r [ model ], 0 ); + } + else + { + animation = level.vehicle_DriveIdle_r[ model ]; + dif = 1 - animatemodel getnormalanimtime( level.vehicle_DriveIdle [ model ] ); + animatemodel clearanim( level.vehicle_DriveIdle[ model ], 0 ); + } + newanimtime = 0.01; + if( newanimtime >= 1 || newanimtime == 0 ) + { + newanimtime = 0.01; + } + lastdir = self.wheeldir; + } + if( speed == 0 ) + { + animatemodel setanim( animation, 1, .2, 0 ); + } + else + { + animatemodel setanim( animation, 1, .2, speed / normalspeed ); + } + if( IsDefined( newanimtime ) ) + { + animatemodel setanimtime( animation, newanimtime ); + newanimtime = undefined; + } + thread animtimer( .2 ); + self waittill( "animtimer" ); + } +} +animtimer( time ) +{ + self endon( "animtimer" ); + wait time; + self notify( "animtimer" ); +} +animate_drive_idle_death() +{ + model = self.model; + self UseAnimTree( #animtree ); + self waittill( "death_finished" ); + if( IsDefined( self ) ) + { + self clearanim( level.vehicle_DriveIdle[ model ], 0 ); + } +} +setup_dynamic_detour( pathnode , get_func ) +{ + prevnode = [[ get_func ]]( pathnode.targetname ); + assertex( IsDefined( prevnode ), "detour can't be on start node" ); + prevnode.detoured = 0; +} +setup_ai() +{ + ai = getaiarray(); + for( i = 0; i < ai.size; i++ ) + { + if( IsDefined( ai[ i ].script_vehicleride ) ) + { + level.vehicle_RideAI = array_2dadd( level.vehicle_RideAI, ai[ i ].script_vehicleride, ai[ i ] ); + } + else if( IsDefined( ai[ i ].script_vehiclewalk ) ) + { + level.vehicle_WalkAI = array_2dadd( level.vehicle_WalkAI, ai[ i ].script_vehiclewalk, ai[ i ] ); + } + } + ai = getspawnerarray(); + for( i = 0; i < ai.size; i++ ) + { + if( IsDefined( ai[ i ].script_vehicleride ) ) + { + level.vehicle_RideSpawners = array_2dadd( level.vehicle_RideSpawners, ai[ i ].script_vehicleride, ai[ i ] ); + } + if( IsDefined( ai[ i ].script_vehiclewalk ) ) + { + level.vehicle_walkspawners = array_2dadd( level.vehicle_walkspawners, ai[ i ].script_vehiclewalk, ai[ i ] ); + } + } +} +array_2dadd( array, firstelem, newelem ) +{ + if( !IsDefined( array[ firstelem ] ) ) + { + array[ firstelem ] = []; + } + array[ firstelem ][ array[ firstelem ].size ] = newelem; + return array; +} +is_node_script_origin( pathnode ) +{ + return IsDefined( pathnode.classname ) && pathnode.classname == "script_origin"; +} +node_trigger_process() +{ + processtrigger = false; + if( self has_spawnflag( level.SPAWNFLAG_VEHICLE_NODE_START_NODE ) ) + { + if( IsDefined( self.script_crashtype ) ) + { + level.vehicle_crashpaths[ level.vehicle_crashpaths.size ] = self; + } + level.vehicle_startnodes[ level.vehicle_startnodes.size ] = self; + } + if( IsDefined( self.script_vehicledetour ) && IsDefined( self.targetname ) ) + { + get_func = undefined; + if( IsDefined( get_from_entity( self.targetname ) ) ) + { + get_func = ::get_from_entity_target; + } + if( IsDefined( get_from_spawnstruct( self.targetname ) ) ) + { + get_func = ::get_from_spawnstruct_target; + } + if( IsDefined( get_func ) ) + { + setup_dynamic_detour( self, get_func ); + processtrigger = true; + } + else + { + setup_groundnode_detour( self ); + } + level.vehicle_detourpaths = array_2dadd( level.vehicle_detourpaths, self.script_vehicledetour, self ); + if( level.vehicle_detourpaths[ self.script_vehicledetour ].size > 2 ) + { + println( "more than two script_vehicledetour grouped in group number: ", self.script_vehicledetour ); + } + } + if( IsDefined( self.script_gatetrigger ) ) + { + level.vehicle_gatetrigger = array_2dadd( level.vehicle_gatetrigger, self.script_gatetrigger, self ); + self.gateopen = false; + } + if ( IsDefined( self.script_flag_set ) ) + { + if ( !IsDefined( level.flag[ self.script_flag_set ] ) ) + { + flag_init( self.script_flag_set ); + } + } + if ( IsDefined( self.script_flag_clear ) ) + { + if ( !IsDefined( level.flag[ self.script_flag_clear ] ) ) + { + flag_init( self.script_flag_clear ); + } + } + if( IsDefined( self.script_flag_wait ) ) + { + if ( !IsDefined( level.flag[ self.script_flag_wait ] ) ) + { + flag_init( self.script_flag_wait ); + } + } + if (IsDefined( self.script_VehicleSpawngroup ) + || IsDefined( self.script_VehicleStartMove ) + || IsDefined( self.script_gatetrigger ) + || IsDefined( self.script_Vehiclegroupdelete )) + { + processtrigger = true; + } + if( processtrigger ) + { + add_proccess_trigger( self ); + } +} +setup_triggers() +{ + level.vehicle_processtriggers = []; + triggers = []; + triggers = array_combine( getallvehiclenodes(), getentarray( "script_origin", "classname" ) ); + triggers = array_combine( triggers, level.struct ); + triggers = array_combine( triggers, getentarray( "trigger_radius", "classname" ) ); + triggers = array_combine( triggers, getentarray( "trigger_multiple", "classname" ) ); + triggers = array_combine( triggers, getentarray( "trigger_lookat", "classname" ) ); + array_thread( triggers, ::node_trigger_process ); +} +is_node_script_struct( node ) +{ + if( ! IsDefined( node.targetname ) ) + { + return false; + } + return IsDefined( getstruct( node.targetname, "targetname" ) ); +} +setup_vehicles( allvehiclesprespawn ) +{ + vehicles = allvehiclesprespawn; + spawnvehicles = []; + groups = []; + nonspawned = []; + for( i = 0; i < vehicles.size; i++ ) + { + vehicles[ i ] vehicle_load_assets(); + if( vehicles[ i ] has_spawnflag(level.SPAWNFLAG_VEHICLE_SPAWNER) ) + { + AssertEX(IsDefined(vehicles[i].script_vehiclespawngroup), "Vehicle of type: " + vehicles[i].vehicletype + " has SPAWNER flag set, but is not part of a script_vehiclespawngroup or doesn't have a targetname." ); + } + if( IsDefined( vehicles[ i ].script_vehiclespawngroup ) ) + { + if( !IsDefined( spawnvehicles[ vehicles[ i ].script_vehiclespawngroup ] ) ) + { + spawnvehicles[ vehicles[ i ].script_vehiclespawngroup ] = []; + } + spawnvehicles[ vehicles[ i ].script_vehiclespawngroup ] + [ spawnvehicles[ vehicles[ i ].script_vehiclespawngroup ].size ] = vehicles[ i ]; + addgroup[ 0 ] = vehicles[ i ].script_vehiclespawngroup; + groups = array_merge( groups, addgroup ); + continue; + } + else + { + nonspawned[ nonspawned.size ] = vehicles[ i ]; + } + } + for( i = 0; i < groups.size; i++ ) + { + thread spawner_setup( spawnvehicles[ groups[ i ] ], groups[ i ], "main" ); + } + for( i = 0; i < nonspawned.size; i++ ) + { + thread vehicle_init( nonspawned[ i ] ); + } +} +vehicle_life() +{ + if (IsDefined(self.destructibledef)) + { + self.health = 99999; + } + else + { + type = self.vehicletype; + if( !IsDefined( self.healthdefault ) ) + { + wait 2; + } + assertEX( IsDefined( self.healthdefault ), "need to specify health settings in vehicle gdt for vehicletype: " + type ); + if( IsDefined( self.script_startinghealth ) ) + { + self.health = self.script_startinghealth; + } + else + { + if( self.healthdefault == -1 ) + { + return; + } + else if( IsDefined( self.healthmin ) && IsDefined( self.healthmax ) && (self.healthmax - self.healthmin) > 0 ) + { + self.health = ( randomint( self.healthmax - self.healthmin ) + self.healthmin ); + println("set range health: " + self.health); + } + else + { + self.health = self.healthdefault; + println("set health: " + self.health); + } + } + } +} +vehicle_load_assets() +{ + precachevehicle( self.vehicletype ); + precachemodel( self.model ); + precache_extra_models(); + if( IsDefined(self.deathmodel) && self.deathmodel != "" ) + { + precache_death_model_wrapper( self.deathmodel ); + } + if( IsDefined(self.shootshock) && self.shootshock != "" ) + { + precacheShader( "black" ); + precacheShellShock( self.shootshock ); + } + if( IsDefined(self.shootrumble) && self.shootrumble != "" ) + { + PrecacheRumble( self.shootrumble ); + } + if( IsDefined( self.rumbletype ) && self.rumbletype != "" ) + { + precacherumble( self.rumbletype ); + } + if( IsDefined(self.secturrettype) && self.secturrettype != "" ) + { + precacheturret( self.secturrettype ); + } + if( IsDefined(self.secturretmodel) && self.secturretmodel != "" ) + { + precachemodel( self.secturretmodel ); + } + self vehicle_load_fx(); +} +precache_death_model_wrapper( death_model_name ) +{ + if (!IsDefined(self.script_string) || (IsDefined(self.script_string) && self.script_string != "no_deathmodel") ) + { + PrecacheModel( death_model_name ); + } +} +precache_extra_models() +{ + switch( self.vehicletype ) + { + case "heli_huey": + case "heli_huey_player": + case "heli_huey_small": + case "heli_huey_heavyhog": + case "heli_huey_heavyhog_creek": + case "heli_huey_usmc_heavyhog_khesanh": + case "heli_huey_medivac": + case "heli_huey_medivac_khesanh": + case "heli_huey_gunship": + case "heli_huey_assault": + case "heli_huey_usmc": + case "heli_huey_usmc_khesanh": + case "heli_huey_usmc_khesanh_std": + case "heli_huey_side_minigun": + case "heli_huey_side_minigun_uwb": + self maps\_huey::precache_submodels(); + break; + case "heli_hind_player": + self maps\_hind_player::precache_models(); + self maps\_hind_player::precache_weapons(); + self maps\_hind_player::precache_hud(); + break; + case "truck_gaz63_camorack": + PrecacheModel("t5_veh_truck_gaz63_camo_rack"); + break; + case "truck_gaz63_canvas": + case "truck_gaz66_canvas": + PrecacheModel("t5_veh_gaz66_flatbed"); + PrecacheModel("t5_veh_gaz66_flatbed_dead"); + PrecacheModel("t5_veh_gaz66_canvas"); + PrecacheModel("t5_veh_gaz66_canvas_dead"); + break; + case "truck_gaz63_canvas_camorack": + PrecacheModel("t5_veh_gaz66_troops"); + PrecacheModel("t5_veh_gaz66_troops_dead"); + PrecacheModel("t5_veh_gaz66_canvas"); + PrecacheModel("t5_veh_gaz66_canvas_dead"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack_back_canvas"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack_dead"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack_back"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack_back_dead"); + break; + case "truck_gaz63_flatbed": + case "truck_gaz66_flatbed": + PrecacheModel("t5_veh_gaz66_flatbed"); + PrecacheModel("t5_veh_gaz66_flatbed_dead"); + break; + case "truck_gaz63_flatbed_camorack": + PrecacheModel("t5_veh_gaz66_flatbed"); + PrecacheModel("t5_veh_gaz66_flatbed_dead"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack_dead"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack_back"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack_back_dead"); + break; + case "truck_gaz63_tanker": + case "truck_gaz66_tanker": + case "truck_gaz66_tanker_physics": + PrecacheModel("t5_veh_gaz66_tanker"); + precache_death_model_wrapper("t5_veh_gaz66_tanker_dead"); + break; + case "truck_gaz63_troops": + case "truck_gaz66_troops": + case "truck_gaz66_troops_physics": + case "truck_gaz63_troops_bulletdamage": + PrecacheModel("t5_veh_gaz66_troops"); + PrecacheModel("t5_veh_gaz66_troops_dead"); + break; + case "truck_gaz63_troops_camorack": + PrecacheModel("t5_veh_gaz66_troops"); + PrecacheModel("t5_veh_gaz66_troops_dead"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack_dead"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack_back"); + PrecacheModel("t5_veh_truck_gaz63_camo_rack_back_dead"); + break; + case "truck_gaz66_troops_attacking_physics": + PrecacheModel("t5_veh_gaz66_troops_no_benches"); + PrecacheModel("t5_veh_gaz66_troops_dead"); + break; + case "truck_gaz63_single50": + case "truck_gaz66_single50": + PrecacheModel("t5_veh_gaz66_single50"); + PrecacheModel("t5_veh_gaz66_single50_dead"); + PrecacheModel("t5_veh_gaz66_flatbed"); + PrecacheModel("t5_veh_gaz66_flatbed_dead"); + break; + case "truck_gaz63_player_single50": + case "truck_gaz63_player_single50_physics": + case "truck_gaz66_player_single50": + case "truck_gaz63_player_single50_bulletdamage": + PrecacheModel("t5_veh_gunner_turret_enemy_50cal"); + PrecacheModel("t5_veh_gaz66_flatbed"); + PrecacheModel("t5_veh_gaz66_flatbed_dead"); + break; + case "truck_gaz63_player_single50_nodeath": + PrecacheModel("t5_veh_gunner_turret_enemy_50cal"); + PrecacheModel("t5_veh_gaz66_flatbed"); + break; + case "truck_gaz63_quad50": + case "truck_gaz66_quad50": + PrecacheModel("t5_veh_gaz66_quad50"); + PrecacheModel("t5_veh_gaz66_quad50_dead"); + PrecacheModel("t5_veh_gaz66_flatbed"); + PrecacheModel("t5_veh_gaz66_flatbed_dead"); + break; + case "truck_gaz63_camorack_low": + PrecacheModel("t5_veh_truck_gaz63_camo_rack_low"); + break; + case "truck_gaz63_canvas_low": + PrecacheModel("t5_veh_gaz66_flatbed_low"); + PrecacheModel("t5_veh_gaz66_flatbed_dead_low"); + PrecacheModel("t5_veh_gaz66_canvas_low"); + PrecacheModel("t5_veh_gaz66_canvas_dead_low"); + break; + case "truck_gaz63_flatbed_low": + PrecacheModel("t5_veh_gaz66_flatbed_low"); + PrecacheModel("t5_veh_gaz66_flatbed_dead_low"); + break; + case "truck_gaz63_tanker_low": + PrecacheModel("t5_veh_gaz66_tanker_low"); + PrecacheModel("t5_veh_gaz66_tanker_dead_low"); + break; + case "truck_gaz63_troops_low": + PrecacheModel("t5_veh_gaz66_troops_low"); + PrecacheModel("t5_veh_gaz66_troops_dead_low"); + break; + case "truck_gaz63_single50_low": + PrecacheModel("t5_veh_gaz66_single50_low"); + PrecacheModel("t5_veh_gaz66_single50_dead_low"); + PrecacheModel("t5_veh_gaz66_flatbed_low"); + PrecacheModel("t5_veh_gaz66_flatbed_dead_low"); + break; + case "truck_gaz63_quad50_low": + PrecacheModel("t5_veh_gaz66_quad50_low"); + PrecacheModel("t5_veh_gaz66_quad50_dead_low"); + PrecacheModel("t5_veh_gaz66_flatbed_low"); + PrecacheModel("t5_veh_gaz66_flatbed_dead_low"); + break; + case "truck_gaz63_quad50_low_no_deathmodel": + PrecacheModel("t5_veh_gaz66_quad50_low"); + break; + case "tank_snowcat_plow": + precacheModel("t5_veh_snowcat_plow"); + break; + case "boat_pbr": + PreCacheModel( "t5_veh_boat_pbr_set01_friendly" ); + PreCacheModel( "t5_veh_boat_pbr_waterbox" ); + break; + case "boat_pbr_player": + PrecacheModel( "t5_veh_boat_pbr_set01" ); + PrecacheModel( "t5_veh_boat_pbr_stuff" ); + break; + case "police": + PrecacheModel( "t5_veh_police_lightbar" ); + break; + } +} +vehicle_load_fx() +{ + if( IsDefined( self.exhaustfxname ) && self.exhaustfxname != "" ) + { + self.exhaust_fx = loadfx( self.exhaustfxname ); + } + maps\_treadfx::loadtreadfx(self); + if( IsDefined(self.deathfxname) && self.deathfxname != "" ) + { + self.deathfx = loadfx( self.deathfxname ); + } + if( IsDefined( self.rotorMainRunningFxName ) && self.rotorMainRunningFxName != "" ) + { + self.rotorMainRunningFx = loadfx( self.rotorMainRunningFxName ); + } + if( IsDefined( self.rotorTailRunningFxName ) && self.rotorTailRunningFxName != "" ) + { + self.rotorTailRunningFx = loadfx( self.rotorTailRunningFxName ); + } + if( IsDefined( self.rotorMainIdleFxName ) && self.rotorMainIdleFxName != "" ) + { + self.rotorMainIdleFx = loadfx( self.rotorMainIdleFxName ); + } + if( IsDefined( self.rotorTailIdleFxName ) && self.rotorTailIdleFxName != "" ) + { + self.rotorTailIdleFx = loadfx( self.rotorTailIdleFxName ); + } + if( IsDefined( self.rotorMainStartFxName ) && self.rotorMainStartFxName != "" ) + { + self.rotorMainStartFx = loadfx( self.rotorMainStartFxName ); + } + if( IsDefined( self.rotorTailStartFxName ) && self.rotorTailStartFxName != "" ) + { + self.rotorTailStartFx = loadfx( self.rotorTailStartFxName ); + } + if( IsDefined( self.rotorMainStopFxName ) && self.rotorMainStopFxName != "" ) + { + self.rotorMainStopFx = loadfx( self.rotorMainStopFxName ); + } + if( IsDefined( self.rotorTailStopFxName ) && self.rotorTailStopFxName != "" ) + { + self.rotorTailStopFx = loadfx( self.rotorTailStopFxName ); + } + if (is_true(level._vehicle_load_lights)) + { + if (self.vehicletype == "police") + { + self.headlightFX = LoadFX("vehicle/light/fx_cuba_police_headlight"); + self.taillightLeftFX = LoadFX("vehicle/light/fx_cuba_police_taillight_left"); + self.taillightRightFX = LoadFX("vehicle/light/fx_cuba_police_taillight_right"); + self.frontDLightFX = LoadFX("maps/cuba/fx_cuba_veh_front_end_lights"); + self.interiorLightFX = LoadFX("maps/cuba/fx_cuba_veh_interior_lights"); + } + else if (self.vehicletype == "cuba_player") + { + self.taillightFX = LoadFX("vehicle/light/fx_cuba_car_brakelight"); + } + else + { + self.headlightFX = LoadFX( "vehicle/light/fx_jeep_uaz_headlight" ); + self.taillightFX = LoadFX( "vehicle/light/fx_jeep_uaz_taillight" ); + } + } + if (is_true(level._vehicle_load_sirens)) + { + self.sirenlightFX = LoadFX( "maps/cuba/fx_cuba_siren_light" ); + } +} +mginit() +{ + type = self.vehicletype; + if( (( IsDefined( self.script_nomg ) ) && ( self.script_nomg > 0 ) ) ) + { + return; + } + if( !IsDefined( self.secturrettype ) || self.secturrettype == "" ) + { + return; + } + mgangle = 0; + if( IsDefined( self.script_mg_angle ) ) + { + mgangle = self.script_mg_angle; + } + self.mgturret[ 0 ] = spawnTurret( "misc_turret", ( 0, 0, 0 ), self.secturrettype ); + self.mgturret[ 0 ] linkto( self, self.secturrettag, ( 0, 0, 0 ), ( 0, -1 * mgangle, 0 ) ); + self.mgturret[ 0 ] setmodel( self.secturretmodel ); + self.mgturret[ 0 ].angles = self.angles; + self.mgturret[ 0 ].isvehicleattached = true; + self.mgturret[ 0 ] thread maps\_mgturret::burst_fire_unmanned(); + self.mgturret[ 0 ] maketurretunusable(); + level thread maps\_mgturret::mg42_setdifficulty( self.mgturret[ 0 ], getdifficulty() ); + if( IsDefined( self.script_fireondrones ) ) + { + self.mgturret[ 0 ].script_fireondrones = self.script_fireondrones; + } + self.mgturret[ 0 ] setshadowhint( "never" ); + if ( IsDefined( self.secturretdeletedelay ) ) + { + self.mgturret[ 0 ].deletedelay = self.secturretdeletedelay; + } + if( IsDefined( self.secturretdefaultoffmode ) ) + { + self.mgturret[ 0 ] setmode( self.secturretdefaultoffmode ); + } + if( IsDefined( self.secturretmaxrange ) ) + { + self.mgturret[ 0 ].maxrange = self.secturretmaxrange; + } + if( !IsDefined( self.script_turretmg ) ) + { + self.script_turretmg = true;; + } + if( IsDefined( self.script_turretmg ) && self.script_turretmg == 0 ) + { + self thread mgoff(); + } + else + { + self.script_turretmg = 1; + self thread mgon(); + } + self thread mgtoggle(); +} +mgtoggle() +{ + self endon( "death" ); + if( self.script_turretmg ) + { + lasttoggle = 1; + } + else + { + lasttoggle = 0; + } + while( 1 ) + { + if( lasttoggle != self.script_turretmg ) + { + lasttoggle = self.script_turretmg; + if( self.script_turretmg ) + { + self thread mgon(); + } + else + { + self thread mgoff(); + } + } + wait .5; + } +} +mgoff() +{ + type = self.vehicletype; + self.script_turretmg = 0; + if( ( self is_plane() ) && ( self hasHelicopterTurret() ) ) + { + self thread chopper_Turret_Off(); + return; + } + if( !IsDefined( self ) || !IsDefined( self.mgturret ) ) + { + return; + } + for( i = 0; i < self.mgturret.size; i++ ) + { + if( IsDefined( self.mgturret[ i ].script_fireondrones ) ) + { + self.mgturret[ i ].script_fireondrones = false; + } + if( IsDefined( self.secturretdefaultoffmode ) ) + { + self.mgturret[ i ] setmode( self.secturretdefaultoffmode ); + } + else + { + self.mgturret[ i ] setmode( "manual" ); + } + } +} +mgon() +{ + type = self.vehicletype; + self.script_turretmg = 1; + if( !IsDefined( self ) || !IsDefined( self.mgturret ) ) + { + return; + } + for( i = 0; i < self.mgturret.size; i++ ) + { + if( IsDefined( self.mgturret[ i ].bAiControlled ) && !self.mgturret[i].bAiControlled ) + { + continue; + } + if( IsDefined( self.mgturret[ i ].script_fireondrones ) ) + { + self.mgturret[ i ].script_fireondrones = true; + } + if( IsDefined( self.secturretdefaultonmode ) ) + { + self.mgturret[ i ] setmode( self.secturretdefaultonmode ); + } + else + { + self.mgturret[ i ] setmode( "auto_nonai" ); + } + if( ( self.vteam == "allies" ) || ( self.vteam == "friendly" ) ) + { + self.mgturret[ i ] setTurretTeam( "allies" ); + } + else if( ( self.vteam == "axis" ) || ( self.vteam == "enemy" ) ) + { + self.mgturret[ i ] setTurretTeam( "axis" ); + } + } +} +isCheap() +{ + if( !IsDefined( self.script_cheap ) ) + { + return false; + } + if( !self.script_cheap ) + { + return false; + } + return true; +} +hasHelicopterDustKickup() +{ + if( !is_plane() ) + { + return false; + } + if( isCheap() ) + { + return false; + } + return true; +} +hasHelicopterTurret() +{ + if( !IsDefined( self.vehicletype ) ) + { + return false; + } + if( isCheap() ) + { + return false; + } + if( self.vehicletype == "cobra" ) + { + return true; + } + if( self.vehicletype == "cobra_player" ) + { + return true; + } + return false; +} +chopper_Turret_Off() +{ + self notify( "mg_off" ); +} +playLoopedFxontag( effect, durration, tag ) +{ + eModel = get_dummy(); + effectorigin = spawn( "script_origin", eModel.origin ); + self endon( "fire_extinguish" ); + thread playLoopedFxontag_originupdate( tag, effectorigin ); + while( 1 ) + { + playfx( effect, effectorigin.origin, effectorigin.upvec ); + wait durration; + } +} +playLoopedFxontag_originupdate( tag, effectorigin ) +{ + effectorigin.angles = self gettagangles( tag ); + effectorigin.origin = self gettagorigin( tag ); + effectorigin.forwardvec = anglestoforward( effectorigin.angles ); + effectorigin.upvec = anglestoup( effectorigin.angles ); + while( IsDefined( self ) && self.classname == "script_vehicle" && self getspeedmph() > 0 ) + { + eModel = get_dummy(); + effectorigin.angles = eModel gettagangles( tag ); + effectorigin.origin = eModel gettagorigin( tag ); + effectorigin.forwardvec = anglestoforward( effectorigin.angles ); + effectorigin.upvec = anglestoup( effectorigin.angles ); + wait .05; + } +} +setup_dvars() +{ +} +setup_levelvars() +{ + level.vehicle_ResumeSpeed = 5; + level.vehicle_DeleteGroup = []; + level.vehicle_SpawnGroup = []; + level.vehicle_StartMoveGroup = []; + level.vehicle_RideAI = []; + level.vehicle_WalkAI = []; + level.vehicle_DeathSwitch = []; + level.vehicle_RideSpawners = []; + level.vehicle_walkspawners = []; + level.vehicle_gatetrigger = []; + level.vehicle_crashpaths = []; + level.vehicle_target = []; + level.vehicle_link = []; + level.vehicle_truckjunk = []; + level.vehicle_detourpaths = []; + level.vehicle_startnodes = []; + level.vehicle_spawners = []; + level.vehicle_walkercount = []; + level.helicopter_crash_locations = getentarray( "helicopter_crash_location", "targetname" ); + level.vclogin_vehicles = 0; + level.playervehicle = spawn( "script_origin", ( 0, 0, 0 ) ); + level.playervehiclenone = level.playervehicle; + level.vehicles = []; + level.vehicles[ "allies" ] = []; + level.vehicles[ "axis" ] = []; + level.vehicles[ "neutral" ] = []; + if( !IsDefined( level.vehicle_death_thread ) ) + { + level.vehicle_death_thread = []; + } + if( !IsDefined( level.vehicle_DriveIdle ) ) + { + level.vehicle_DriveIdle = []; + } + if( !IsDefined( level.vehicle_DriveIdle_r ) ) + { + level.vehicle_DriveIdle_r = []; + } + if( !IsDefined( level.attack_origin_condition_threadd ) ) + { + level.attack_origin_condition_threadd = []; + } + if( !IsDefined( level.vehiclefireanim ) ) + { + level.vehiclefireanim = []; + } + if( !IsDefined( level.vehiclefireanim_settle ) ) + { + level.vehiclefireanim_settle = []; + } + if( !IsDefined( level.vehicle_hasname ) ) + { + level.vehicle_hasname = []; + } + if( !IsDefined( level.vehicle_turret_requiresrider ) ) + { + level.vehicle_turret_requiresrider = []; + } + if( !IsDefined( level.vehicle_isStationary ) ) + { + level.vehicle_isStationary = []; + } + if( !IsDefined( level.vehicle_compassicon ) ) + { + level.vehicle_compassicon = []; + } + if( !IsDefined( level.vehicle_unloadgroups ) ) + { + level.vehicle_unloadgroups = []; + } + if( !IsDefined( level.vehicle_aianims ) ) + { + level.vehicle_aianims = []; + } + if( !IsDefined( level.vehicle_unloadwhenattacked ) ) + { + level.vehicle_unloadwhenattacked = []; + } + if( !IsDefined( level.vehicle_deckdust ) ) + { + level.vehicle_deckdust = []; + } + if( !IsDefined( level.vehicle_types ) ) + { + level.vehicle_types = []; + } + if( !IsDefined( level.vehicle_compass_types ) ) + { + level.vehicle_compass_types = []; + } + if( !IsDefined( level.vehicle_bulletshield ) ) + { + level.vehicle_bulletshield = []; + } + if( !IsDefined( level.vehicle_death_jolt ) ) + { + level.vehicle_death_jolt = []; + } + if( !IsDefined( level.vehicle_death_badplace ) ) + { + level.vehicle_death_badplace = []; + } + maps\_vehicle_aianim::setup_aianimthreads(); +} +attacker_isonmyteam( attacker ) +{ + if( ( IsDefined( attacker ) ) && IsDefined( attacker.vteam ) && ( IsDefined( self.vteam ) ) && ( attacker.vteam == self.vteam ) ) + { + return true; + } + else + { + return false; + } +} +is_godmode() +{ + return (!self.takedamage); +} +attacker_troop_isonmyteam( attacker ) +{ + if ( IsDefined( self.vteam ) && self.vteam == "allies" && IsDefined( attacker ) && IsDefined(level.player) && attacker == level.player ) + { + return true; + } + else if( isai( attacker ) && attacker.team == self.vteam ) + { + return true; + } + else + { + return false; + } +} +bulletshielded( type ) +{ + if ( !IsDefined( self.script_bulletshield ) ) + { + return false; + } + type = tolower( type ); + if ( ! IsDefined( type ) || ! issubstr( type, "bullet" ) ) + { + return false; + } + if ( self.script_bulletshield ) + { + return true; + } + else + { + return false; + } +} +friendlyfire_shield() +{ + self.friendlyfire_shield = true; + if ( IsDefined( level.vehicle_bulletshield[ self.vehicletype ] ) && !IsDefined( self.script_bulletshield ) ) + { + self.script_bulletshield = level.vehicle_bulletshield[ self.vehicletype ]; + } +} +friendlyfire_shield_callback( attacker, amount, type ) +{ + if( !IsDefined(self.friendlyfire_shield) || !self.friendlyfire_shield ) + { + return false; + } + if( + ( ! IsDefined( attacker ) && self.vteam != "neutral" ) || + attacker_isonmyteam( attacker ) || + attacker_troop_isonmyteam( attacker ) || + isDestructible() || + bulletshielded( type ) + ) + { + return true; + } + return false; +} +vehicle_kill_rumble_forever() +{ + self notify( "kill_rumble_forever" ); +} +vehicle_kill_badplace_forever() +{ + self notify( "kill_badplace_forever" ); +} +vehicle_badplace() +{ + if( !IsDefined( self.script_badplace ) ) + { + return; + } + self endon( "kill_badplace_forever" ); + self endon( "death" ); + self endon( "delete" ); + if( IsDefined( level.custombadplacethread ) ) + { + self thread [[ level.custombadplacethread ]](); + return; + } + hasturret = IsDefined( self.turretweapon ) && self.turretweapon != ""; + bp_duration = .5; + bp_height = 300; + bp_angle_left = 17; + bp_angle_right = 17; + for( ;; ) + { + if( !self.script_badplace ) + { + while( !self.script_badplace ) + { + wait .5; + } + } + speed = self getspeedmph(); + if( speed <= 0 ) + { + wait bp_duration; + continue; + } + if( speed < 5 ) + { + bp_radius = 200; + } + else if( ( speed > 5 ) && ( speed < 8 ) ) + { + bp_radius = 350; + } + else + { + bp_radius = 500; + } + if( IsDefined( self.BadPlaceModifier ) ) + { + bp_radius = ( bp_radius * self.BadPlaceModifier ); + } + if( hasturret ) + { + bp_direction = anglestoforward( self gettagangles( "tag_turret" ) ); + } + else + { + bp_direction = anglestoforward( self.angles ); + } + badplace_arc( "", bp_duration, self.origin, bp_radius * 1.9, bp_height, bp_direction, bp_angle_left, bp_angle_right, "allies", "axis" ); + badplace_cylinder( "", bp_duration, self.origin, 200, bp_height, "allies", "axis" ); + wait bp_duration + .05; + } +} +turret_attack_think() +{ + if( self is_plane() ) + { + return; + } + thread turret_shoot(); +} +isStationary() +{ + type = self.vehicletype; + if( IsDefined( level.vehicle_isStationary[ type ] ) && level.vehicle_isStationary[ type ] ) + { + return true; + } + else + { + return false; + } +} +turret_shoot() +{ + type = self.vehicletype; + self endon( "death" ); + self endon( "stop_turret_shoot" ); + index = 0; + turrets = self.turrettagarray; + while( self.health > 0 ) + { + self waittill( "turret_fire" ); + self notify( "groupedanimevent", "turret_fire" ); + if ( ! turrets.size ) + { + self fireWeapon(); + } + else if( IsDefined(turrets[ index ]) && turrets[ index ] != "" ) + { + self fireweapon( turrets[ index ] ); + index++ ; + if ( index >= turrets.size ) + { + index = 0; + } + } + } +} +vehicle_weapon_fired() +{ + if( !(self is_tank() ) ) + { + return; + } + self endon( "death" ); + while( true ) + { + self waittill( "weapon_fired" ); + owner = self GetVehicleOwner(); + if( IsDefined( owner ) && IsPlayer( owner ) ) + { + if( !IsDefined( owner.vehicle_shoot_shock_overlay ) ) + { + owner.vehicle_shoot_shock_overlay = newClientHudElem( owner ); + owner.vehicle_shoot_shock_overlay.x = 0; + owner.vehicle_shoot_shock_overlay.y = 0; + owner.vehicle_shoot_shock_overlay setshader( "black", 640, 480 ); + owner.vehicle_shoot_shock_overlay.alignX = "left"; + owner.vehicle_shoot_shock_overlay.alignY = "top"; + owner.vehicle_shoot_shock_overlay.horzAlign = "fullscreen"; + owner.vehicle_shoot_shock_overlay.vertAlign = "fullscreen"; + owner.vehicle_shoot_shock_overlay.alpha = 0; + } + owner.vehicle_shoot_shock_overlay.alpha = .5; + owner.vehicle_shoot_shock_overlay fadeOverTime( 0.2 ); + owner.vehicle_shoot_shock_overlay.alpha = 0; + } + } +} +vehicle_compasshandle() +{ + wait_for_first_player(); + self endon( "stop_vehicle_compasshandle" ); + type = self.vehicletype; + if( !IsDefined(self.addtocompass) || !self.addtocompass ) + { + return; + } + self endon( "death" ); + level.compassradius = int( GetDvar( #"compassMaxRange" ) ); + self.onplayerscompass = false; + while ( 1 ) + { + player = get_closest_player( self.origin ); + if ( distance( self.origin, player.origin ) < level.compassradius ) + { + if ( !( self.onplayerscompass ) ) + { + self AddVehicleToCompass( maps\_vehicletypes::get_compassTypeForVehicleType( self.vehicletype ) ); + self.onplayerscompass = true; + } + } + else + { + if ( self.onplayerscompass ) + { + self RemoveVehicleFromCompass(); + self.onplayerscompass = false; + } + } + wait .5; + } +} +vehicle_setteam() +{ + type = self.vehicletype; + if( IsDefined( self.vteam ) && self.vteam == "allies" ) + { + no_name = self is_plane() || ( IsDefined( self.script_friendname ) && ( self.script_friendname == "" || self.script_friendname == "none" || self.script_friendname == "0" ) ); + correct_type = ( type == "sherman" || type == "sherman_flame" || type == "t34" || type == "ot34" || type == "see2_t34" || type == "see2_ot34" ); + if( !no_name && correct_type ) + { + self maps\_vehiclenames::get_name(); + } + } + level.vehicles[ self.vteam ] = array_add( level.vehicles[ self.vteam ], self ); +} +vehicle_handleunloadevent() +{ + self endon( "death" ); + type = self.vehicletype; + while( 1 ) + { + self waittill( "unload", who ); + self notify( "groupedanimevent", "unload" ); + } +} +get_vehiclenode_any_dynamic( target ) +{ + path_start = getvehiclenode( target, "targetname" ); + if( !IsDefined( path_start ) ) + { + path_start = getent( target, "targetname" ); + } + else if( is_plane() ) + { + println( "helicopter node targetname: " + path_start.targetname ); + println( "vehicletype: " + self.vehicletype ); + assertmsg( "helicopter on vehicle path( see console for info )" ); + } + if( !IsDefined( path_start ) ) + { + path_start = getstruct( target, "targetname" ); + } + return path_start; +} +vehicle_resumepathvehicle() +{ + if( !self is_plane() ) + { + self resumespeed( 35 ); + return; + } + node = undefined; + if( IsDefined( self.currentnode.target ) ) + { + node = get_vehiclenode_any_dynamic( self.currentnode.target ); + } + if( !IsDefined( node ) ) + { + return; + } + vehicle_paths( node ); +} +vehicle_landvehicle() +{ + self setNearGoalNotifyDist( 2 ); + self sethoverparams( 0, 0, 0 ); + self cleargoalyaw(); + self settargetyaw( flat_angle( self.angles )[ 1 ] ); + self setvehgoalpos_wrap( groundpos( self.origin ), 1 ); + self waittill( "goal" ); +} +setvehgoalpos_wrap( origin, bStop ) +{ + if( self.health <= 0 ) + { + return; + } + if( IsDefined( self.originheightoffset ) ) + { + origin += ( 0, 0, self.originheightoffset ); + } + self setvehgoalpos( origin, bStop ); +} +vehicle_liftoffvehicle( height ) +{ + if( !IsDefined( height ) ) + { + height = 512; + } + dest = self.origin + ( 0, 0, height ); + self setNearGoalNotifyDist( 10 ); + self setvehgoalpos_wrap( dest, 1 ); + self waittill( "goal" ); +} +waittill_stable() +{ + offset = 12; + stabletime = 400; + timer = gettime() + stabletime; + while( IsDefined( self ) ) + { + if( self.angles[ 0 ] > offset || self.angles [ 0 ] < ( - 1 * offset ) ) + { + timer = gettime() + stabletime; + } + if( self.angles[ 2 ] > offset || self.angles [ 2 ] < ( - 1 * offset ) ) + { + timer = gettime() + stabletime; + } + if( gettime() > timer ) + { + break; + } + wait .05; + } +} +unload_node( node ) +{ + if ( !IsDefined( node.script_flag_wait ) ) + { + self notify( "newpath" ); + } + assert( IsDefined( self ) ); + pathnode = getnode( node.targetname, "target" ); + if( IsDefined( pathnode ) && self.riders.size ) + { + for( i = 0; i < self.riders.size; i++ ) + { + if( isai( self.riders[ i ] ) ) + { + self.riders[ i ] thread maps\_spawner::go_to_node( pathnode ); + } + } + } + if( self is_plane() ) + { + waittill_stable(); + } + else + { + self setspeed( 0, 35 ); + } + if( IsDefined( node.script_noteworthy ) ) + { + if( node.script_noteworthy == "wait_for_flag" ) + { + flag_wait( node.script_flag ); + } + } + self notify( "unload", node.script_unload ); + if ( maps\_vehicle_aianim::riders_unloadable( node.script_unload ) ) + { + self waittill( "unloaded" ); + } + if ( IsDefined( node.script_flag_wait ) ) + { + return; + } + if( IsDefined( self ) ) + { + thread vehicle_resumepathvehicle(); + } +} +move_turrets_here( model ) +{ + type = self.vehicletype; + if( !IsDefined( self.mgturret ) ) + { + return; + } + if( self.mgturret.size == 0 ) + { + return; + } + for( i = 0; i < self.mgturret.size; i++ ) + { + self.mgturret[ i ] unlink(); + self.mgturret[ i ] linkto( model, self.secturrettag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); + } +} +vehicle_pathdetach() +{ + self.attachedpath = undefined; + self notify( "newpath" ); + self setGoalyaw( flat_angle( self.angles )[ 1 ] ); + self setvehgoalpos( self.origin + ( 0, 0, 4 ), 1 ); +} +vehicle_to_dummy() +{ + assertEx( !IsDefined( self.modeldummy ), "Vehicle_to_dummy was called on a vehicle that already had a dummy." ); + self.modeldummy = spawn( "script_model", self.origin ); + self.modeldummy setmodel( self.model ); + self.modeldummy.origin = self.origin; + self.modeldummy.angles = self.angles; + self.modeldummy useanimtree( #animtree ); + self hide(); + self notify( "animtimer" ); + self thread model_dummy_death(); + move_riders_here( self.modelDummy ); + move_turrets_here( self.modeldummy ); + move_ghettotags_here( self.modeldummy ); + move_lights_here( self.modeldummy ); + move_effects_ent_here( self.modeldummy ); + copy_destructable_attachments( self.modeldummy ); + self.modeldummyon = true; + return self.modeldummy; +} +move_effects_ent_here( model ) +{ + ent = deathfx_ent(); + ent unlink(); + ent linkto( model ); +} +model_dummy_death() +{ + modeldummy = self.modeldummy; + modeldummy endon( "death" ); + while ( IsDefined( self ) ) + { + self waittill( "death" ); + waittillframeend; + } + modeldummy delete(); +} +move_lights_here( model ) +{ + if ( !IsDefined( self.lights ) ) + { + return; + } + keys = getarraykeys( self.lights ); + for ( i = 0 ; i < keys.size ; i++ ) + { + self.lights[ keys[ i ] ] unlink(); + self.lights[ keys[ i ] ] linkto( model, self.lights[ keys[ i ] ].lighttag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); + } +} +move_ghettotags_here( model ) +{ + if ( !IsDefined( self.ghettotags ) ) + { + return; + } + for ( i = 0 ; i < self.ghettotags.size ; i++ ) + { + self.ghettotags[ i ] unlink(); + self.ghettotags[ i ] linkto( model ); + } +} +dummy_to_vehicle() +{ + assertEx( IsDefined( self.modeldummy ), "Tried to turn a vehicle from a dummy into a vehicle. Can only be called on vehicles that have been turned into dummies with vehicle_to_dummy." ); + if( self is_plane() ) + { + self.modeldummy.origin = self gettagorigin( "tag_ground" ); + } + else + { + self.modeldummy.origin = self.origin; + self.modeldummy.angles = self.angles; + } + self show(); + move_riders_here( self ); + move_turrets_here( self ); + move_lights_here( self ); + move_effects_ent_here( self ); + self.modeldummyon = false; + self.modeldummy delete(); + self.modeldummy = undefined; + if ( self hasHelicopterDustKickup() ) + { + if(!level.clientscripts) + { + self notify( "stop_kicking_up_dust" ); + self thread aircraft_dust_kickup(); + } + } + return self.modeldummy; +} +move_riders_here( base ) +{ + if ( !IsDefined( self.riders ) ) + { + return; + } + riders = self.riders; + for( i = 0; i < riders.size; i++ ) + { + if( !IsDefined( riders[ i ] ) ) + { + continue; + } + guy = riders[ i ]; + guy unlink(); + animpos = maps\_vehicle_aianim::anim_pos( self, guy.pos ); + guy linkto( base, animpos.sittag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); + if( isai( guy ) ) + { + guy teleport( base gettagorigin( animpos.sittag ) ); + } + else + { + guy.origin = base gettagorigin( animpos.sittag ); + } + } +} +setup_targetname_spawners() +{ + level.vehicle_targetname_array = []; + vehicles = array_combine( getentarray( "script_vehicle", "classname" ), get_script_modelvehicles() ); + highestGroup = 0; + for( i = 0; i < vehicles.size; i++ ) + { + vehicle = vehicles[ i ]; + if( IsDefined( vehicle.script_vehicleSpawnGroup ) ) + { + if( vehicle.script_vehicleSpawnGroup > highestGroup ) + { + highestGroup = vehicle.script_vehicleSpawnGroup; + } + } + } + for( i = 0; i < vehicles.size; i++ ) + { + vehicle = vehicles[ i ]; + if( IsDefined( vehicle.targetname ) && vehicle has_spawnflag(level.SPAWNFLAG_VEHICLE_SPAWNER)) + { + if( !IsDefined( vehicle.script_vehicleSpawnGroup ) ) + { + highestGroup ++ ; + vehicle.script_vehicleSpawnGroup = highestGroup; + } + if( !IsDefined( level.vehicle_targetname_array[ vehicle.targetname ] ) ) + { + level.vehicle_targetname_array[ vehicle.targetname ] = []; + } + level.vehicle_targetname_array[ vehicle.targetname ][ vehicle.script_vehicleSpawnGroup ] = true; + } + } +} +spawn_vehicles_from_targetname( name ) +{ + assertEx( IsDefined( level.vehicle_targetname_array[ name ] ), "No vehicle spawners had targetname " + name ); + array = level.vehicle_targetname_array[ name ]; + keys = getArrayKeys( array ); + vehicles = []; + for( i = 0; i < keys.size; i++ ) + { + vehicleArray = scripted_spawn( keys[ i ] ); + vehicles = array_combine( vehicles, vehicleArray ); + } + return vehicles; +} +spawn_vehicle_from_targetname( name ) +{ + vehicleArray = spawn_vehicles_from_targetname( name ); + assertEx( vehicleArray.size == 1, "Tried to spawn a vehicle from targetname " + name + " but it returned " + vehicleArray.size + " vehicles, instead of 1" ); + return vehicleArray[ 0 ]; +} +spawn_vehicle_from_targetname_and_drive( name ) +{ + vehicleArray = spawn_vehicles_from_targetname( name ); + assertEx( vehicleArray.size == 1, "Tried to spawn a vehicle from targetname " + name + " but it returned " + vehicleArray.size + " vehicles, instead of 1" ); + vehicleArray[ 0 ] thread gopath(); + return vehicleArray[ 0 ]; +} +spawn_vehicles_from_targetname_and_drive( name ) +{ + vehicleArray = spawn_vehicles_from_targetname( name ); + for( i = 0; i < vehicleArray.size; i++ ) + { + vehicleArray[ i ] thread goPath(); + } + return vehicleArray; +} +aircraft_dust_kickup( model ) +{ + self endon( "death" ); + self endon( "death_finished" ); + self endon( "stop_kicking_up_dust" ); + assert( IsDefined( self.vehicletype ) ); + maxHeight = 1200; + minHeight = 350; + slowestRepeatWait = 0.15; + fastestRepeatWait = 0.05; + numFramesPerTrace = 3; + doTraceThisFrame = numFramesPerTrace; + defaultRepeatRate = 1.0; + repeatRate = defaultRepeatRate; + trace = undefined; + d = undefined; + trace_ent = self; + if ( IsDefined( model ) ) + { + trace_ent = model; + } + while( IsDefined( self ) ) + { + if( repeatRate <= 0 ) + { + repeatRate = defaultRepeatRate; + } + wait repeatRate; + if( !IsDefined( self ) ) + { + return; + } + doTraceThisFrame -- ; + if( doTraceThisFrame <= 0 ) + { + doTraceThisFrame = numFramesPerTrace; + trace = bullettrace( trace_ent.origin, trace_ent.origin - ( 0, 0, 100000 ), false, trace_ent ); + d = distance( trace_ent.origin, trace[ "position" ] ); + repeatRate = ( ( d - minHeight ) / ( maxHeight - minHeight ) ) * ( slowestRepeatWait - fastestRepeatWait ) + fastestRepeatWait; + } + if( !IsDefined( trace ) ) + { + continue; + } + assert( IsDefined( d ) ); + if( d > maxHeight ) + { + repeatRate = defaultRepeatRate; + continue; + } + if( IsDefined( trace[ "entity" ] ) ) + { + repeatRate = defaultRepeatRate; + continue; + } + if( !IsDefined( trace[ "position" ] ) ) + { + repeatRate = defaultRepeatRate; + continue; + } + if( !IsDefined( trace[ "surfacetype" ] ) ) + { + trace[ "surfacetype" ] = "dirt"; + } + assertEx( IsDefined( level._vehicle_effect[ self.vehicletype ] ), self.vehicletype + " vehicle script hasn't run _tradfx properly" ); + assertEx( IsDefined( level._vehicle_effect[ self.vehicletype ][ trace[ "surfacetype" ] ] ), "UNKNOWN SURFACE TYPE: " + trace[ "surfacetype" ] ); + if( level._vehicle_effect[ self.vehicletype ][ trace[ "surfacetype" ] ] != -1 ) + { + playfx( level._vehicle_effect[ self.vehicletype ][ trace[ "surfacetype" ] ], trace[ "position" ] ); + } + } +} +tank_crush( crushedVehicle, endNode, tankAnim, truckAnim, animTree, soundAlias ) +{ + assert( IsDefined( crushedVehicle ) ); + assert( IsDefined( endNode ) ); + assert( IsDefined( tankAnim ) ); + assert( IsDefined( truckAnim ) ); + assert( IsDefined( animTree ) ); + animatedTank = vehicle_to_dummy(); + self setspeed( 7, 5, 5 ); + animLength = getanimlength( tankAnim ); + move_to_time = ( animLength / 3 ); + move_from_time = ( animLength / 3 ); + node_origin = crushedVehicle.origin; + node_angles = crushedVehicle.angles; + node_forward = anglesToForward( node_angles ); + node_up = anglesToUp( node_angles ); + node_right = anglesToRight( node_angles ); + anim_start_org = getStartOrigin( node_origin, node_angles, tankAnim ); + anim_start_ang = getStartAngles( node_origin, node_angles, tankAnim ); + animStartingVec_Forward = anglesToForward( anim_start_ang ); + animStartingVec_Up = anglesToUp( anim_start_ang ); + animStartingVec_Right = anglesToRight( anim_start_ang ); + tank_Forward = anglesToForward( animatedTank.angles ); + tank_Up = anglesToUp( animatedTank.angles ); + tank_Right = anglesToRight( animatedTank.angles ); + offset_Vec = ( node_origin - anim_start_org ); + offset_Forward = vectorDot( offset_Vec, animStartingVec_Forward ); + offset_Up = vectorDot( offset_Vec, animStartingVec_Up ); + offset_Right = vectorDot( offset_Vec, animStartingVec_Right ); + dummy = spawn( "script_origin", animatedTank.origin ); + dummy.origin += vector_scale( tank_Forward, offset_Forward ); + dummy.origin += vector_scale( tank_Up, offset_Up ); + dummy.origin += vector_scale( tank_Right, offset_Right ); + offset_Vec = anglesToForward( node_angles ); + offset_Forward = vectorDot( offset_Vec, animStartingVec_Forward ); + offset_Up = vectorDot( offset_Vec, animStartingVec_Up ); + offset_Right = vectorDot( offset_Vec, animStartingVec_Right ); + dummyVec = vector_scale( tank_Forward, offset_Forward ); + dummyVec += vector_scale( tank_Up, offset_Up ); + dummyVec += vector_scale( tank_Right, offset_Right ); + dummy.angles = vectorToAngles( dummyVec ); + if( IsDefined( soundAlias ) ) + { + level thread play_sound_in_space( soundAlias, node_origin ); + } + animatedTank linkto( dummy ); + crushedVehicle useAnimTree( animTree ); + animatedTank useAnimTree( animTree ); + assert( IsDefined( level._vehicle_effect[ "tankcrush" ][ "window_med" ] ) ); + assert( IsDefined( level._vehicle_effect[ "tankcrush" ][ "window_large" ] ) ); + crushedVehicle thread tank_crush_fx_on_tag( "tag_window_left_glass_fx", level._vehicle_effect[ "tankcrush" ][ "window_med" ], "veh_glass_break_small", 0.2 ); + crushedVehicle thread tank_crush_fx_on_tag( "tag_window_right_glass_fx", level._vehicle_effect[ "tankcrush" ][ "window_med" ], "veh_glass_break_small", 0.4 ); + crushedVehicle thread tank_crush_fx_on_tag( "tag_windshield_back_glass_fx", level._vehicle_effect[ "tankcrush" ][ "window_large" ], "veh_glass_break_large", 0.7 ); + crushedVehicle thread tank_crush_fx_on_tag( "tag_windshield_front_glass_fx", level._vehicle_effect[ "tankcrush" ][ "window_large" ], "veh_glass_break_large", 1.5 ); + crushedVehicle animscripted( "tank_crush_anim", node_origin, node_angles, truckAnim ); + animatedTank animscripted( "tank_crush_anim", dummy.origin, dummy.angles, tankAnim ); + dummy moveTo( node_origin, move_to_time, ( move_to_time / 2 ), ( move_to_time / 2 ) ); + dummy rotateTo( node_angles, move_to_time, ( move_to_time / 2 ), ( move_to_time / 2 ) ); + wait move_to_time; + animLength -= move_to_time; + animLength -= move_from_time; + wait animLength; + temp = spawn( "script_model", ( anim_start_org ) ); + temp.angles = anim_start_ang; + anim_end_org = temp localToWorldCoords( getMoveDelta( tankAnim, 0, 1 ) ); + anim_end_ang = anim_start_ang + ( 0, getAngleDelta( tankAnim, 0, 1 ), 0 ); + temp delete(); + animEndingVec_Forward = anglesToForward( anim_end_ang ); + animEndingVec_Up = anglesToUp( anim_end_ang ); + animEndingVec_Right = anglesToRight( anim_end_ang ); + attachPos = self getAttachPos( endNode ); + tank_Forward = anglesToForward( attachPos[ 1 ] ); + tank_Up = anglesToUp( attachPos[ 1 ] ); + tank_Right = anglesToRight( attachPos[ 1 ] ); + offset_Vec = ( node_origin - anim_end_org ); + offset_Forward = vectorDot( offset_Vec, animEndingVec_Forward ); + offset_Up = vectorDot( offset_Vec, animEndingVec_Up ); + offset_Right = vectorDot( offset_Vec, animEndingVec_Right ); + dummy.final_origin = attachPos[ 0 ]; + dummy.final_origin += vector_scale( tank_Forward, offset_Forward ); + dummy.final_origin += vector_scale( tank_Up, offset_Up ); + dummy.final_origin += vector_scale( tank_Right, offset_Right ); + offset_Vec = anglesToForward( node_angles ); + offset_Forward = vectorDot( offset_Vec, animEndingVec_Forward ); + offset_Up = vectorDot( offset_Vec, animEndingVec_Up ); + offset_Right = vectorDot( offset_Vec, animEndingVec_Right ); + dummyVec = vector_scale( tank_Forward, offset_Forward ); + dummyVec += vector_scale( tank_Up, offset_Up ); + dummyVec += vector_scale( tank_Right, offset_Right ); + dummy.final_angles = vectorToAngles( dummyVec ); + if( GetDvar( #"debug_tankcrush" ) == "1" ) + { + thread draw_line_from_ent_for_time( get_players()[0], self.origin, 1, 0, 0, animLength / 2 ); + thread draw_line_from_ent_for_time( get_players()[0], anim_end_org, 0, 1, 0, animLength / 2 ); + thread draw_line_from_ent_to_ent_for_time( get_players()[0], dummy, 0, 0, 1, animLength / 2 ); + } + dummy moveTo( dummy.final_origin, move_from_time, ( move_from_time / 2 ), ( move_from_time / 2 ) ); + dummy rotateTo( dummy.final_angles, move_from_time, ( move_from_time / 2 ), ( move_from_time / 2 ) ); + wait move_from_time; + self dontInterpolate(); + self attachPath( endNode ); + dummy_to_vehicle(); +} +tank_crush_fx_on_tag( tagName, fxName, soundAlias, startDelay ) +{ + if( IsDefined( startDelay ) ) + { + wait startDelay; + } + playfxontag( fxName, self, tagName ); + if( IsDefined( soundAlias ) ) + { + self thread play_sound_on_tag( soundAlias, tagName ); + } +} +loadplayer( player, position, animfudgetime ) +{ + if( !IsDefined( animfudgetime ) ) + { + animfudgetime = 0; + } + assert( IsDefined( self.riders ) ); + assert( self.riders.size ); + guy = undefined; + for( i = 0; i < self.riders.size; i++ ) + { + if( self.riders[ i ].pos == position ) + { + guy = self.riders[ i ]; + guy.drone_delete_on_unload = true; + guy.playerpiggyback = true; + break; + } + } + assertex( !isai( guy ), "guy in position of player needs to have script_drone set, use script_startingposition ans script drone in your map" ); + assert( IsDefined( guy ) ); + thread show_rigs( position ); + animpos = maps\_vehicle_aianim::anim_pos( self, position ); + guy notify( "newanim" ); + guy detachall(); + guy setmodel( "fastrope_arms" ); + guy useanimtree( animpos.player_animtree ); + thread maps\_vehicle_aianim::guy_idle( guy, position ); + player playerlinktodelta( guy, "tag_player", 1.0, 70, 70, 90, 90 ); + guy hide(); + animtime = getanimlength( animpos.getout ); + animtime -= animfudgetime; + self waittill( "unload" ); + player disableweapons(); + guy notsolid(); + wait animtime; + player unlink(); + player enableweapons(); +} +show_rigs( position ) +{ + wait .01; + self thread maps\_vehicle_aianim::getout_rigspawn( self, position ); + if( !self.riders.size ) + { + return; + } + for( i = 0; i < self.riders.size; i++ ) + { + self thread maps\_vehicle_aianim::getout_rigspawn( self, self.riders[ i ].pos ); + } +} +turret_deleteme( turret ) +{ + if ( IsDefined( self ) ) + { + if ( IsDefined( turret.deletedelay ) ) + { + wait turret.deletedelay; + } + } + turret delete(); +} +wheeldirectionchange( direction ) +{ + if( direction <= 0 ) + { + self.wheeldir = 0; + } + else + { + self.wheeldir = 1; + } +} +maingun_FX() +{ + if( !IsDefined( level.vehicle_deckdust[ self.model ] ) ) + { + return; + } + self endon( "death" ); + while( true ) + { + self waittill( "weapon_fired" ); + playfxontag( level.vehicle_deckdust[ self.model ], self, "tag_engine_exhaust" ); + barrel_origin = self gettagorigin( "tag_flash" ); + ground = physicstrace( barrel_origin, barrel_origin + ( 0, 0, -128 ) ); + physicsExplosionSphere( ground, 192, 100, 1 ); + } +} +group_light( model, name, group ) +{ + if( !IsDefined( level.vehicle_lights_group ) ) + { + level.vehicle_lights_group = []; + } + if( !IsDefined( level.vehicle_lights_group[ model ] ) ) + { + level.vehicle_lights_group[ model ] = []; + } + if( !IsDefined( level.vehicle_lights_group[ model ][ group ] ) ) + { + level.vehicle_lights_group[ model ][ group ] = []; + } + level.vehicle_lights_group[ model ][ group ][ level.vehicle_lights_group[ model ][ group ].size ] = name; +} +lights_on() +{ + self SetClientFlag(10); +} +lights_off() +{ + self ClearClientFlag(10); +} +sirens_on() +{ + self SetClientFlag(11); +} +sirens_off() +{ + self ClearClientFlag(11); +} +interior_lights_on() +{ + self SetClientFlag(12); +} +interior_lights_off() +{ + self ClearClientFlag(12); +} +deathfx_ent() +{ + if ( !IsDefined( self.deathfx_ent ) ) + { + ent = spawn( "script_model", ( 0, 0, 0 ) ); + emodel = get_dummy(); + ent setmodel( self.model ); + ent.origin = emodel.origin; + ent.angles = emodel.angles; + ent notsolid(); + ent hide(); + ent linkto( emodel ); + self.deathfx_ent = ent; + } + else + { + self.deathfx_ent setmodel( self.model ); + } + return self.deathfx_ent; +} +build_drive( forward, reverse, normalspeed, rate ) +{ + if( !IsDefined( normalspeed ) ) + { + normalspeed = 10; + } + level.vehicle_DriveIdle[ self.model ] = forward; + if( IsDefined( reverse ) ) + { + level.vehicle_DriveIdle_r[ self.model ] = reverse; + } + level.vehicle_DriveIdle_normal_speed[ self.model ] = normalspeed; + if( IsDefined( rate ) ) + { + level.vehicle_DriveIdle_animrate[ self.model ] = rate; + } +} +build_aianims( aithread, vehiclethread ) +{ + level.vehicle_aianims[ self.vehicletype ] = [[ aithread ]](); + if( IsDefined( vehiclethread ) ) + { + level.vehicle_aianims[ self.vehicletype ] = [[ vehiclethread ]]( level.vehicle_aianims[ self.vehicletype ] ); + } +} +build_attach_models( modelsthread ) +{ + level.vehicle_attachedmodels[ level.vttype ] = [[ modelsthread ]]();; +} +build_unload_groups( unloadgroupsthread ) +{ + level.vehicle_unloadgroups[ self.vehicletype ] = [[ unloadgroupsthread ]](); +} +build_vehiclewalk( num_walkers ) +{ + level.vehicle_walkercount[ level.vttype ] = num_walkers; +} +get_from_spawnstruct( target ) +{ + return getstruct( target, "targetname" ); +} +get_from_entity( target ) +{ + return getent( target, "targetname" ); +} +get_from_spawnstruct_target( target ) +{ + return getstruct( target, "target" ); +} +get_from_entity_target( target ) +{ + return getent( target, "target" ); +} +get_from_vehicle_node( target ) +{ + return getvehiclenode( target, "targetname" ); +} +set_lookat_from_dest( dest ) +{ + viewTarget = getent( dest.script_linkto, "script_linkname" ); + if ( !IsDefined( viewTarget ) ) + { + return; + } + self setLookAtEnt( viewTarget ); + self.set_lookat_point = true; +} +getspawner_byid( id ) +{ + return level.vehicle_spawners[ id ]; +} +vehicle_getspawner() +{ + assert( IsDefined( self.spawner_id ) ); + return getspawner_byid( self.spawner_id ); +} +isDestructible() +{ + return IsDefined( self.destructible_type ); +} +attackgroup_think() +{ + self endon ("death"); + self endon ("switch group"); + self endon ("killed all targets"); + if (IsDefined (self.script_vehicleattackgroupwait)) + { + wait (self.script_vehicleattackgroupwait); + } + for(;;) + { + group = getentarray("script_vehicle", "classname"); + valid_targets = []; + for (i = 0; i< group.size; i++) + { + if( !IsDefined( group[i].script_vehiclespawngroup ) ) + { + continue; + } + if (group[i].script_vehiclespawngroup == self.script_vehicleattackgroup) + { + if (group[i].vteam != self.vteam) + { + valid_targets = array_add(valid_targets, group[i]); + } + } + } + if (valid_targets.size == 0) + { + wait (0.5); + continue; + } + for (;;) + { + current_target = undefined; + if (valid_targets.size != 0) + { + current_target = self get_nearest_target(valid_targets); + } + else + { + self notify ("killed all targets"); + } + if (current_target.health <= 0) + { + valid_targets = array_remove(valid_targets, current_target); + continue; + } + else + { + self setturrettargetent( current_target, (0,0,50) ); + if( IsDefined( self.fire_delay_min ) && IsDefined( self.fire_delay_max ) ) + { + if( self.fire_delay_max < self.fire_delay_min ) + { + self.fire_delay_max = self.fire_delay_min; + } + wait ( randomintrange(self.fire_delay_min, self.fire_delay_max) ); + } + else + { + wait (randomintrange(4, 6)); + } + self fireweapon(); + } + } + } +} +get_nearest_target(valid_targets) +{ + nearest_dist = 999999; + nearest = undefined; + for (i = 0; i < valid_targets.size; i++) + { + if( !IsDefined( valid_targets[i] ) ) + { + continue; + } + current_dist = distance( self.origin, valid_targets[i].origin ); + if (current_dist < nearest_dist) + { + nearest_dist = current_dist; + nearest = valid_targets[i]; + } + } + return nearest; +} +generate_colmaps_vehicles() +{ + array_delete(GetEntArray( "colmap_vehicle", "targetname" )); +} +dump_vehicles() +{ +} +copy_destructable_attachments( modeldummy ) +{ + attachedModelCount = self getattachsize(); + attachedModels = []; + for ( i = 0 ; i < attachedModelCount ; i++ ) + { + attachedModels[ i ] = tolower( self getAttachModelName( i ) ); + } + for ( i = 0 ; i < attachedModels.size ; i++ ) + { + modeldummy attach( attachedModels[ i ], tolower( self getattachtagname( i ) ) ); + } +} +get_dummy() +{ + if ( self.modeldummyon ) + { + eModel = self.modeldummy; + } + else + { + eModel = self; + } + return eModel; +} +apply_truckjunk( eVehicle, truckjunk ) +{ + if ( !IsDefined( self.spawner_id ) ) + { + return; + } + if ( !IsDefined( level.vehicle_truckjunk[ self.spawner_id ] ) ) + { + return; + } + truckjunk = level.vehicle_truckjunk[ self.spawner_id ]; + self.truckjunk = []; + for ( i = 0 ; i < truckjunk.size ; i++ ) + { + model = spawn( "script_model", self.origin ); + model setmodel( truckjunk[ i ].model ); + model linkto( self, "tag_body", truckjunk[ i ].origin, truckjunk[ i ].angles ); + self.truckjunk[ i ] = model; + } +} +truckjunk() +{ + assert( IsDefined( self.target ) ); + linked_vehicle = getent( self.target, "targetname" ); + assert( IsDefined( linked_vehicle ) ); + spawner_id = vehicle_spawnidgenerate( linked_vehicle.origin ); + target = getent( self.target, "targetname" ); + ghettotag = ghetto_tag_create( target ); + if ( IsDefined( self.script_noteworthy ) ) + { + ghettotag.script_noteworthy = self.script_noteworthy; + } + if ( !IsDefined( level.vehicle_truckjunk[ spawner_id ] ) ) + { + level.vehicle_truckjunk[ spawner_id ] = []; + } + if ( IsDefined( self.script_startingposition ) ) + { + ghettotag.script_startingposition = self.script_startingposition; + } + level.vehicle_truckjunk[ spawner_id ][ level.vehicle_truckjunk[ spawner_id ].size ] = ghettotag; + self delete(); +} +ghetto_tag_create( target ) +{ + struct = spawnstruct(); + struct.origin = self.origin - target gettagorigin( "tag_body" ); + struct.angles = self.angles - target gettagangles( "tag_body" ); + struct.model = self.model; + if ( IsDefined( struct.targetname ) ) + { + level.struct_class_names[ "targetname" ][ struct.targetname ] = undefined; + } + if ( IsDefined( struct.target ) ) + { + level.struct_class_names[ "target" ][ struct.target ] = undefined; + } + return struct; +} +vehicle_dump() +{ +} +dump_handle() +{ +} +twobuttonspressed( button1, button2 ) +{ +} +vehicle_load_ai( ai ) +{ + maps\_vehicle_aianim::load_ai( ai ); +} +volume_up( timer ) +{ + self notify( "new_volume_command" ); + self endon( "new_volume_command" ); + assertex( IsDefined( timer ), "No timer defined! "); + self endon( "death" ); + timer = timer * 20; + for ( i = 0; i <= timer; i++ ) + { + self setenginevolume( i / timer ); + wait( 0.05 ); + } +} +volume_down( timer ) +{ + self notify( "new_volume_command" ); + self endon( "new_volume_command" ); + assertex( IsDefined( timer ), "No timer defined! "); + self endon( "death" ); + timer = timer * 20; + for ( i = 0; i <= timer; i++ ) + { + self setenginevolume( ( timer - i ) / timer ); + wait( 0.05 ); + } +} +kill_badplace( type ) +{ + if ( !IsDefined( level.vehicle_death_badplace[ type ] ) ) + { + return; + } + struct = level.vehicle_death_badplace[ type ]; + if ( IsDefined( struct.delay ) ) + { + wait struct.delay; + } + if(!IsDefined(self)) + { + return; + } + BadPlace_Cylinder( "vehicle_kill_badplace", struct.duration, self.origin, struct.radius, struct.height, struct.team1, struct.team2 ); +} +kill_jolt( type ) +{ + if ( IsDefined( level.vehicle_death_jolt[ type ] ) ) + { + self.dontfreeme = true; + wait level.vehicle_death_jolt[ type ].delay; + } + if( !IsDefined( self ) ) + { + return; + } + self joltbody( ( self.origin + ( 23, 33, 64 ) ), 3 ); + wait 2; + if( !IsDefined( self ) ) + { + return; + } + self.dontfreeme = undefined; +} +vehicle_main() +{ + switch( self.vehicletype ) + { + case "tank_t72": + self maps\_t72::main(); + break; + case "tank_zsu23": + case "tank_zsu23_low": + self maps\_tank_zsu23::main(); + break; + case "truck_bm21": + case "truck_bm21_troops": + case "truck_maz543": + self maps\_truck::main(); + break; + case "boat_pbr": + case "boat_pbr_player": + self maps\_boat_pbr::main(); + break; + case "truck_gaz66": + case "truck_gaz66_physics": + case "truck_gaz66_canvas": + case "truck_gaz66_flatbed": + case "truck_gaz66_tanker": + case "truck_gaz66_tanker_physics": + case "truck_gaz66_troops": + case "truck_gaz66_troops_physics": + case "truck_gaz66_troops_attacking_physics": + case "truck_gaz66_single50": + case "truck_gaz66_quad50": + case "truck_gaz66_player_single50": + self maps\_truck_gaz66::main(); + break; + case "truck_gaz63": + case "truck_gaz63_canvas": + case "truck_gaz63_canvas_camorack": + case "truck_gaz63_flatbed": + case "truck_gaz63_flatbed_camorack": + case "truck_gaz63_tanker": + case "truck_gaz63_troops": + case "truck_gaz63_troops_bulletdamage": + case "truck_gaz63_troops_camorack": + case "truck_gaz63_single50": + case "truck_gaz63_player_single50": + case "truck_gaz63_player_single50_nodeath": + case "truck_gaz63_player_single50_physics": + case "truck_gaz63_player_single50_bulletdamage": + case "truck_gaz63_quad50": + case "truck_gaz63_camorack": + case "truck_gaz63_low": + case "truck_gaz63_canvas_low": + case "truck_gaz63_flatbed_low": + case "truck_gaz63_tanker_low": + case "truck_gaz63_troops_low": + case "truck_gaz63_single50_low": + case "truck_gaz63_quad50_low": + case "truck_gaz63_quad50_low_no_deathmodel": + case "truck_gaz63_camorack_low": + self maps\_truck_gaz63::main(); + break; + case "jeep_uaz": + case "jeep_uaz_closetop": + case "jeep_uaz_closetop_physics": + case "jeep_uaz_physics": + self maps\_uaz::main(); + break; + case "jeep_intl": + case "jeep_player": + case "jeep_player_slow": + case "jeep_willys": + case "jeep_ultimate": + self maps\_jeep::main(); + break; + case "heli_chinook": + self maps\_chinook::main(); + break; + case "heli_cobra": + case "heli_cobra_khesanh": + self maps\_cobra::main(); + break; + case "heli_hip": + case "heli_hip_sidegun": + case "heli_hip_sidegun_uwb": + case "heli_hip_sidegun_spotlight": + self maps\_hip::main(); + break; + case "heli_huey": + case "heli_huey_vista": + case "heli_huey_assault": + case "heli_huey_assault_river": + case "heli_huey_gunship": + case "heli_huey_gunship_river": + case "heli_huey_heavyhog": + case "heli_huey_heavyhog_creek": + case "heli_huey_usmc_heavyhog_khesanh": + case "heli_huey_heavyhog_river": + case "heli_huey_medivac": + case "heli_huey_medivac_khesanh": + case "heli_huey_medivac_river": + case "heli_huey_minigun": + case "heli_huey_player": + case "heli_huey_small": + case "heli_huey_usmc": + case "heli_huey_usmc_gunship": + case "heli_huey_usmc_heavyhog": + case "heli_huey_usmc_khesanh": + case "heli_huey_usmc_khesanh_std": + case "heli_huey_usmc_minigun": + case "heli_huey_side_minigun": + case "heli_huey_side_minigun_uwb": + { + self maps\_huey::main(); + } + break; + case "heli_hind_player": + self maps\_hind_player::main(); + break; + case "plane_mig17": + self maps\_mig17::main(); + break; + case "plane_phantom": + self maps\_mig17::main(); + break; + case "wpn_zpu_antiair": + self maps\_zpu_antiair::main(); + break; + case "apc_brt40": + case "apc_m113": + case "apc_m113_khesanh_outcasts": + case "apc_m113_khesanh_warchicken": + case "apc_m113_khesanh_plain": + case "apc_bmp": + self maps\_apc::main(); + break; + case "apc_btr40_flashpoint": + case "apc_btr60": + case "apc_btr60_grenade": + self maps\_btr::main(); + break; + case "civ_tanker": + case "civ_tanker_civ": + case "civ_sedan_luxury": + self maps\_civ_vehicle::main(); + break; + case "tiara": + self maps\_tiara::main(); + break; + case "police": + self maps\_policecar::main(); + break; + case "tank_snowcat": + case "tank_snowcat_plow": + case "tank_snowcat_troops": + self maps\_snowcat::main(); + break; + case "rcbomb": + self maps\_rcbomb::main(); + break; + case "boat_sampan_pow": + case "boat_sampan": + self maps\_sampan::main(); + break; + case "boat_nvapbr": + self maps\_boat_nvapbr::main(); + break; + case "boat_patrol_nva": + self maps\_boat_patrol_nva::main(); + break; + case "motorcycle_ai": + self maps\_motorcycle::main(); + break; + default: + break; + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_vehicle_aianim.gsc b/BO1/PC/ZM/maps/_vehicle_aianim.gsc new file mode 100644 index 0000000..2fde2fe --- /dev/null +++ b/BO1/PC/ZM/maps/_vehicle_aianim.gsc @@ -0,0 +1,2033 @@ + +#include maps\_utility; +#include common_scripts\utility; +#using_animtree( "generic_human" ); +vehicle_enter( vehicle, tag ) +{ + assertEX( !isdefined( self.ridingvehicle ), "ai can't ride two vehicles at the same time" ); + if (IsDefined(tag)) + { + self.forced_startingposition = anim_pos_from_tag(vehicle, tag); + } + type = vehicle.vehicletype; + vehicleanim = vehicle get_aianims(); + maxpos = level.vehicle_aianims[ type ].size; + if( isdefined( self.script_vehiclewalk ) ) + { + pos = set_walkerpos( self, level.vehicle_walkercount[ type ] ); + vehicle thread WalkWithVehicle( self, pos ); + return; + } + vehicle.attachedguys[ vehicle.attachedguys.size ] = self; + pos = vehicle set_pos( self, maxpos ); + if( !isdefined( pos ) ) + { + return; + } + if ( pos == 0 ) + self.drivingVehicle = true; + animpos = anim_pos( vehicle, pos ); + vehicle.usedPositions[ pos ] = true; + self.pos = pos; + if( isdefined( animpos.delay ) ) + { + self.delay = animpos.delay; + if( isdefined( animpos.delayinc ) ) + { + vehicle.delayer = self.delay; + } + } + if( isdefined( animpos.delayinc ) ) + { + vehicle.delayer += animpos.delayinc; + self.delay = vehicle.delayer; + } + self.ridingvehicle = vehicle; + self.orghealth = self.health; + self.vehicle_idle = animpos.idle; + self.vehicle_idle_combat = animpos.idle_combat; + self.vehicle_standattack = animpos.standattack; + self.standing = 0; + self.allowdeath = false; + if( isdefined( self.deathanim ) && !isdefined( self.magic_bullet_shield ) ) + { + self.allowdeath = true; + } + if ( isdefined( animpos.death ) ) + { + vehicle thread guy_death( self, animpos ); + } + if ( !isdefined( self.vehicle_idle ) ) + { + self.allowdeath = true; + } + vehicle.riders[ vehicle.riders.size ] = self; + if ( !isdefined( animpos.explosion_death ) ) + { + vehicle thread guy_vehicle_death( self ); + } + if ( self.classname != "script_model" && spawn_failed( self ) ) + { + return; + } + org = vehicle gettagorigin( animpos.sittag ); + angles = vehicle gettagAngles( animpos.sittag ); + self linkto( vehicle, animpos.sittag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); + if( isai( self ) ) + { + self teleport( org, angles ); + self.a.disablelongdeath = true; + if( isdefined( animpos.bHasGunWhileRiding ) && !animpos.bHasGunWhileRiding ) + { + self gun_remove(); + } + if( IsDefined( animpos.vehiclegunner ) ) + { + self.vehicle_pos = pos; + self.vehicle = vehicle; + self AnimCustom( ::guy_man_gunner_turret ); + } + else if( isdefined( animpos.mgturret ) && !( isdefined( vehicle.script_nomg ) && vehicle.script_nomg > 0 ) ) + { + vehicle thread guy_man_turret( self, pos ); + } + if( IsDefined( self.script_combat_getout ) && self.script_combat_getout ) + { + self.do_combat_getout = true; + } + if( IsDefined( self.script_combat_idle ) && self.script_combat_idle ) + { + self.do_combat_idle = true; + } + } + else + { + if ( isdefined( animpos.bHasGunWhileRiding ) && !animpos.bHasGunWhileRiding ) + { + detach_models_with_substr( self, "weapon_" ); + } + self.origin = org; + self.angles = angles; + if( IsDefined( animpos.vehiclegunner ) ) + { + self.vehicle_pos = pos; + self.vehicle = vehicle; + self thread guy_man_gunner_turret(); + } + else if( isdefined( animpos.mgturret ) && !( isdefined( vehicle.script_nomg ) && vehicle.script_nomg > 0 ) ) + { + vehicle thread guy_man_turret( self, pos ); + } + } + if ( pos == 0 && isdefined(vehicleanim[0].death) ) + { + vehicle thread driverdead( self ); + } + if( !IsDefined( animpos.vehiclegunner ) ) + { + vehicle thread guy_handle( self, pos ); + vehicle thread guy_idle( self, pos ); + } +} +guy_array_enter( guysarray, vehicle ) +{ + guysarray = maps\_vehicle::sort_by_startingpos( guysarray ); + lastguy = false; + for( i = 0;i < guysarray.size;i ++ ) + { + if( !( i + 1 < guysarray.size ) ) + { + lastguy = true; + } + guysarray[ i ] vehicle_enter( vehicle ); + } +} +handle_attached_guys() +{ + type = self.vehicletype; + if( isdefined( self.script_vehiclewalk ) ) + { + for( i = 0;i < 6;i ++ ) + { + self.walk_tags[ i ] = ( "tag_walker" + i ); + self.walk_tags_used[ i ] = false; + } + } + self.attachedguys = []; + if( !( isdefined( level.vehicle_aianims ) && isdefined( level.vehicle_aianims[ type ] ) ) ) + return; + maxpos = level.vehicle_aianims[ type ].size; + if( isdefined( self.script_noteworthy ) && self.script_noteworthy == "ai_wait_go" ) + thread ai_wait_go(); + self.runningtovehicle = []; + self.usedPositions = []; + self.getinorgs = []; + self.delayer = 0; + vehicleanim = self get_aianims(); + for( i = 0;i < maxpos;i ++ ) + { + self.usedPositions[ i ] = false; + if( isdefined( self.script_nomg ) && self.script_nomg && isdefined( vehicleanim[ i ].bIsgunner ) && vehicleanim[ i ].bIsgunner ) + self.usedpositions[ 1 ] = true; + } +} +load_ai_goddriver( array ) +{ + load_ai( array, true ); +} +guy_death( guy, animpos ) +{ + waittillframeend; + guy endon ("death"); + guy.allowdeath = false; + guy.health = 100000; + guy endon ( "jumping_out" ); + guy waittill ( "damage" ); + thread guy_deathimate_me( guy,animpos ); +} +guy_deathimate_me( guy,animpos ) +{ + animtimer = gettime()+ ( getanimlength( animpos.death )*1000 ); + angles = guy.angles; + origin = guy.origin; + guy = convert_guy_to_drone( guy ); + [[ level.global_kill_func ]]( "MOD_RIFLE_BULLET", "torso_upper", origin ); + detach_models_with_substr( guy, "weapon_" ); + guy linkto ( self, animpos.sittag, (0,0,0),(0,0,0) ); + guy notsolid(); + thread animontag( guy, animpos.sittag, animpos.death ); + if(!isdefined(animpos.death_delayed_ragdoll)) + guy waittillmatch ( "animontagdone" , "start_ragdoll" ); + else + { + guy unlink(); + guy startragdoll(); + wait animpos.death_delayed_ragdoll; + guy delete(); + return; + } + guy unlink(); + if( GetDvar( #"ragdoll_enable") == "0" ) + { + guy delete(); + return; + } + while( gettime() < animtimer && !guy isragdoll() ) + { + guy startragdoll(); + wait .05; + } + if(!guy isragdoll()) + guy delete(); +} +load_ai( array, bGoddriver ) +{ + if(!isdefined(bGoddriver)) + bGoddriver = false; + if ( !isdefined( array ) ) + { + array = vehicle_get_riders(); + } + array_levelthread( array, ::get_in_vehicle, bGoddriver ); +} +is_rider( guy ) +{ + for( i = 0;i < self.riders.size;i ++ ) + { + if( self.riders[ i ] == guy ) + { + return true; + } + } + return false; +} +vehicle_get_riders() +{ + array = []; + ai = getaiarray( self.vteam ); + for ( i = 0;i < ai.size;i++ ) + { + guy = ai[ i ]; + if ( !isdefined( guy.script_vehicleride ) ) + continue; + if ( guy.script_vehicleride != self.script_vehicleride ) + continue; + array[ array.size ] = guy; + } + return array; +} +get_my_vehicleride() +{ + array = []; + assertex( isdefined( self.script_vehicleride ), "Tried to get my ride but I have no .script_vehicleride" ); + vehicles = getentarray( "script_vehicle", "classname" ); + for ( i = 0; i < vehicles.size; i++ ) + { + vehicle = vehicles[ i ]; + if ( !isdefined( vehicle.script_vehicleride ) ) + continue; + if ( vehicle.script_vehicleride != self.script_vehicleride ) + continue; + array[ array.size ] = vehicle; + } + assertex( array.size == 1, "Tried to get my ride but there was zero or multiple rides to choose from" ); + return array[ 0 ]; +} +get_in_vehicle( guy, bGoddriver ) +{ + if ( is_rider( guy ) ) + { + return; + } + if ( !handle_detached_guys_check() ) + { + return; + } + assertEX( isalive( guy ), "tried to load a vehicle with dead guy, check your AI count to assure spawnability of ai's" ); + guy run_to_vehicle(self, bGoddriver); +} +handle_detached_guys_check() +{ + if( vehicle_hasavailablespots() ) + return true; + assertmsg( "script sent too many ai to vehicle( max is: " + level.vehicle_aianims[ self.vehicletype ].size + " )" ); +} +vehicle_hasavailablespots() +{ + if( level.vehicle_aianims[ self.vehicletype ].size - self.runningtovehicle.size ) + return true; + else + return false; +} +run_to_vehicle_loaded( vehicle ) +{ + vehicle endon( "death" ); + self waittill_any( "long_death", "death", "enteredvehicle" ); + vehicle.runningtovehicle = array_remove( vehicle.runningtovehicle, self ); + if ( !vehicle.runningtovehicle.size && vehicle.riders.size && vehicle.usedpositions[0] ) + { + vehicle notify( "loaded" ); + } +} +remove_magic_bullet_shield_from_guy_on_unload_or_death( guy ) +{ + self waittill_any( "unload","death" ); + guy stop_magic_bullet_shield(); +} +run_to_vehicle( vehicle, bGodDriver, seat_tag ) +{ + if(!isdefined(bGodDriver)) + { + bGodDriver = false; + } + vehicleanim = vehicle get_aianims(); + if( isdefined( vehicle.runtovehicleoverride ) ) + { + vehicle thread [[ vehicle.runtovehicleoverride ]]( self ); + return; + } + vehicle endon( "death" ); + self endon( "death" ); + vehicle.runningtovehicle[ vehicle.runningtovehicle.size ] = self; + self thread run_to_vehicle_loaded( vehicle ); + availablepositions = []; + chosenorg = undefined; + origin = 0; + bIsgettin = false; + for( i = 0; i < vehicleanim.size; i++ ) + { + if( isdefined( vehicleanim[ i ].getin ) ) + { + bIsgettin = true; + break; + } + } + if( !bIsgettin ) + { + self notify( "enteredvehicle" ); + self enter_vehicle( vehicle ); + return; + } + while( vehicle getspeedmph() > 1 ) + { + wait .05; + } + positions = vehicle get_availablepositions(); + if( !vehicle.usedPositions[ 0 ] ) + { + chosenorg = vehicle vehicle_getInstart( 0 ); + if( bGoddriver ) + { + assertEX( !isdefined(self.magic_bullet_shield), "magic_bullet_shield guy told to god mode drive a vehicle, you should simply load_ai without the god function for this guy"); + self thread magic_bullet_shield(); + vehicle thread remove_magic_bullet_shield_from_guy_on_unload_or_death( self ); + } + } + else if( isdefined( self.script_startingposition ) ) + { + position_valid = -1; + for( i = 0; i < positions.availablepositions.size; i++ ) + { + if( positions.availablepositions[i].pos == self.script_startingposition ) + { + position_valid = i; + } + } + if( position_valid > -1 ) + { + chosenorg = positions.availablepositions[position_valid]; + } + else + { + if( positions.availablepositions.size ) + { + chosenorg = getclosest( self.origin, positions.availablepositions ); + } + else + { + chosenorg = undefined; + } + } + } + else if( IsDefined(seat_tag)) + { + for(i = 0; i < vehicleanim.size; i++) + { + if(vehicleanim[i].sittag == seat_tag) + { + for(j = 0; j < positions.availablepositions.size; j++) + { + if(positions.availablepositions[j].pos == i) + { + chosenorg = positions.availablepositions[j]; + break; + } + } + break; + } + } + } + else if( positions.availablepositions.size ) + { + chosenorg = getclosest( self.origin, positions.availablepositions ); + } + else + { + chosenorg = undefined; + } + if( ( !positions.availablepositions.size ) && ( positions.nonanimatedpositions.size ) ) + { + self notify( "enteredvehicle" ); + self enter_vehicle( vehicle ); + return; + } + else if( !isdefined( chosenorg ) ) + { + return; + } + self.forced_startingposition = chosenorg.pos; + vehicle.usedpositions[ chosenorg.pos ] = true; + self.script_moveoverride = true; + self notify( "stop_going_to_node" ); + if(IsDefined(vehicleanim[ chosenorg.pos ].wait_for_notify)) + { + if(IsDefined(vehicleanim[ chosenorg.pos ].waiting)) + { + self set_forcegoal(); + self.goalradius = 64; + self setgoalpos( chosenorg.origin ); + self waittill( "goal" ); + self unset_forcegoal(); + self AnimScripted("anim_wait_done", self.origin, self.angles, vehicleanim[ chosenorg.pos ].waiting); + vehicle waittill( vehicleanim[ chosenorg.pos ].wait_for_notify ); + } + } + else if(IsDefined(vehicleanim[ chosenorg.pos ].wait_for_player)) + { + if(IsDefined(vehicleanim[ chosenorg.pos ].waiting)) + { + self set_forcegoal(); + self.goalradius = 64; + self setgoalpos( chosenorg.origin ); + self waittill( "goal" ); + self unset_forcegoal(); + self AnimScripted("anim_wait_done", self.origin, self.angles, vehicleanim[ chosenorg.pos ].waiting); + while(true) + { + on_vehicle = 0; + for(i = 0; i < vehicleanim[ chosenorg.pos ].wait_for_player.size; i++) + { + if(vehicleanim[ chosenorg.pos ].wait_for_player[i] is_on_vehicle(vehicle)) + { + on_vehicle++; + } + } + if(on_vehicle == vehicleanim[ chosenorg.pos ].wait_for_player.size) + { + break; + } + wait(0.05); + } + } + } + self set_forcegoal(); + self.goalradius = 16; + self setgoalpos( chosenorg.origin ); + self waittill( "goal" ); + self unset_forcegoal(); + self.allowdeath = false; + if( isdefined( chosenorg ) ) + { + if( isdefined( vehicleanim[ chosenorg.pos ].vehicle_getinanim ) ) + { + vehicle = vehicle getanimatemodel(); + vehicle thread setanimrestart_once( vehicleanim[ chosenorg.pos ].vehicle_getinanim, vehicleanim[ chosenorg.pos ].vehicle_getinanim_clear ); + } + if( isdefined( vehicleanim[ chosenorg.pos ].vehicle_getinsoundtag ) ) + { + origin = vehicle gettagorigin( vehicleanim[ chosenorg.pos ].vehicle_getinsoundtag ); + } + else + { + origin = vehicle.origin; + } + if( isdefined( vehicleanim[ chosenorg.pos ].vehicle_getinsound ) ) + { + sound = vehicleanim[ chosenorg.pos ].vehicle_getinsound; + } + else + { + sound = "veh_truck_door_open"; + } + vehicle thread maps\_utility::play_sound_in_space( sound, origin ); + vehicle animontag( self, vehicleanim[ chosenorg.pos ].sittag, vehicleanim[ chosenorg.pos ].getin ); + } + self notify( "enteredvehicle" ); + self enter_vehicle( vehicle ); +} +driverdead( guy ) +{ + self.driver = guy; + self endon( "death" ); + guy waittill( "death" ); + self.deaddriver = true; + self setwaitspeed(0); + self setspeed(0,4); + self waittill( "reached_wait_speed" ); + self notify ("unload"); +} +anim_pos( vehicle, pos ) +{ + return( vehicle get_aianims()[ pos ]); +} +anim_pos_from_tag(vehicle, tag) +{ + vehicleanims = level.vehicle_aianims[ vehicle.vehicletype ]; + keys = GetArrayKeys(vehicleanims); + for (i = 0; i < keys.size; i++) + { + pos = keys[i]; + if (IsDefined(vehicleanims[pos].sittag) && vehicleanims[pos].sittag == tag) + { + return pos; + } + } +} +guy_deathhandle( guy, pos ) +{ + guy waittill( "death" ); + if ( !isdefined( self ) ) + return; + self.riders = array_remove( self.riders, guy ); + self.usedPositions[ pos ] = false; +} +setup_aianimthreads() +{ + if( !isdefined( level.vehicle_aianimthread ) ) + level.vehicle_aianimthread = []; + if ( !isdefined( level.vehicle_aianimcheck ) ) + level.vehicle_aianimcheck = []; + level.vehicle_aianimthread[ "idle" ] = ::guy_idle; + level.vehicle_aianimthread[ "duck" ] = ::guy_duck; + level.vehicle_aianimthread[ "duck_once" ] = ::guy_duck_once; + level.vehicle_aianimcheck[ "duck_once" ] = ::guy_duck_once_check; + level.vehicle_aianimthread[ "weave" ] = ::guy_weave; + level.vehicle_aianimcheck[ "weave" ] = ::guy_weave_check; + level.vehicle_aianimthread[ "stand" ] = ::guy_stand; + level.vehicle_aianimthread[ "turn_right" ] = ::guy_turn_right; + level.vehicle_aianimcheck[ "turn_right" ] = ::guy_turn_right_check; + level.vehicle_aianimthread[ "turn_left" ] = ::guy_turn_left; + level.vehicle_aianimcheck[ "turn_left" ] = ::guy_turn_right_check; + level.vehicle_aianimthread[ "turn_hardright" ] = ::guy_turn_hardright; + level.vehicle_aianimthread[ "turn_hardleft" ] = ::guy_turn_hardleft; + level.vehicle_aianimthread[ "turret_fire" ] = ::guy_turret_fire; + level.vehicle_aianimthread[ "turret_turnleft" ] = ::guy_turret_turnleft; + level.vehicle_aianimthread[ "turret_turnright" ] = ::guy_turret_turnright; + level.vehicle_aianimthread[ "unload" ] = ::guy_unload; + level.vehicle_aianimthread[ "reaction" ] = ::guy_turret_turnright; + level.vehicle_aianimthread[ "drive_reaction" ] = ::guy_drive_reaction; + level.vehicle_aianimcheck[ "drive_reaction" ] = ::guy_drive_reaction_check; + level.vehicle_aianimthread[ "death_fire" ] = ::guy_death_fire; + level.vehicle_aianimcheck[ "death_fire" ] = ::guy_death_fire_check; + level.vehicle_aianimthread["move_to_driver"] = ::guy_move_to_driver; +} +guy_handle( guy, pos ) +{ + guy.vehicle_idling = true; + guy.queued_anim_threads = []; + thread guy_deathhandle( guy, pos ); + thread guy_queue_anim( guy, pos ); + guy endon( "death" ); + guy endon( "jumpedout" ); + while( 1 ) + { + self waittill( "groupedanimevent", other ); + if ( isdefined( level.vehicle_aianimcheck[ other ] ) && ! [[ level.vehicle_aianimcheck[ other ] ]]( guy, pos ) ) + continue; + if ( isdefined( self.groupedanim_pos ) ) + { + if(pos != self.groupedanim_pos) + continue; + waittillframeend; + self.groupedanim_pos = undefined; + } + if( isdefined( level.vehicle_aianimthread[ other ] ) ) + { + if ( isdefined( self.queueanim ) && self.queueanim ) + { + add_anim_queue( guy, level.vehicle_aianimthread[ other ] ); + waittillframeend; + self.queueanim = false; + } + else + { + guy notify( "newanim" ); + guy.queued_anim_threads = []; + thread [[ level.vehicle_aianimthread[ other ] ]]( guy, pos ); + } + } + else + println( "leaaaaaaaaaaaaaak", other ); + } +} +add_anim_queue( guy, sthread ) +{ + guy.queued_anim_threads[ guy.queued_anim_threads.size ] = sthread; +} +guy_queue_anim( guy, pos ) +{ + guy endon( "death" ); + self endon( "death" ); + lastanimframe = gettime() - 100; + while ( 1 ) + { + if ( guy.queued_anim_threads.size ) + { + if ( gettime() != lastanimframe ) + guy waittill( "anim_on_tag_done" ); + if ( !guy.queued_anim_threads.size ) + continue; + guy notify( "newanim" ); + thread [[ guy.queued_anim_threads[ 0 ] ]]( guy, pos ); + guy.queued_anim_threads = array_remove( guy.queued_anim_threads, guy.queued_anim_threads[ 0 ] ); + wait .05; + } + else + { + guy waittill( "anim_on_tag_done" ); + lastanimframe = gettime(); + } + } +} +guy_stand( guy, pos ) +{ + animpos = anim_pos( self, pos ); + vehicleanim = self get_aianims(); + if( !isdefined( animpos.standup ) ) + return; + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animontag( guy, animpos.sittag, animpos.standup ); + guy_stand_attack( guy, pos ); +} +guy_stand_attack( guy, pos ) +{ + animpos = anim_pos( self, pos ); + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + guy.standing = 1; + mintime = 0; + while( 1 ) + { + timer2 = gettime() + 2000; + while( gettime() < timer2 && isdefined( guy.enemy ) ) + animontag( guy, animpos.sittag, guy.vehicle_standattack, undefined, undefined, "firing" ); + rnum = randomint( 5 ) + 10; + for( i = 0;i < rnum;i ++ ) + animontag( guy, animpos.sittag, animpos.standidle ); + } +} +guy_stand_down( guy, pos ) +{ + animpos = anim_pos( self, pos ); + if( !isdefined( animpos.standdown ) ) + { + thread guy_stand_attack( guy, pos ); + return; + } + animontag( guy, animpos.sittag, animpos.standdown ); + guy.standing = 0; + thread guy_idle( guy, pos ); +} +driver_idle_speed( driver, pos ) +{ + driver endon( "newanim" ); + self endon( "death" ); + driver endon( "death" ); + animpos = anim_pos( self, pos ); + while( 1 ) + { + if( self getspeedmph() == 0 ) + driver.vehicle_idle = animpos.idle_animstop; + else + driver.vehicle_idle = animpos.idle_anim; + wait .25; + } +} +guy_reaction( guy, pos ) +{ + animpos = anim_pos( self, pos ); + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + if( isdefined( animpos.reaction ) ) + animontag( guy, animpos.sittag, animpos.reaction ); + thread guy_idle( guy, pos ); +} +guy_turret_turnleft( guy, pos ) +{ + animpos = anim_pos( self, pos ); + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + while( 1 ) + animontag( guy, animpos.sittag, guy.turret_turnleft ); +} +guy_turret_turnright( guy, pos ) +{ + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animpos = anim_pos( self, pos ); + while( 1 ) + animontag( guy, animpos.sittag, guy.turret_turnleft ); +} +guy_turret_fire( guy, pos ) +{ + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animpos = anim_pos( self, pos ); + if( isdefined( animpos.turret_fire ) ) + animontag( guy, animpos.sittag, animpos.turret_fire ); + thread guy_idle( guy, pos ); +} +guy_idle( guy, pos, ignoredeath ) +{ + guy endon( "newanim" ); + if( !isdefined(ignoredeath)) + self endon( "death" ); + guy endon( "death" ); + guy.vehicle_idling = true; + guy notify( "gotime" ); + if( !isdefined( guy.vehicle_idle ) ) + { + return; + } + animpos = anim_pos( self, pos ); + if( isdefined( animpos.mgturret ) ) + return; + if ( isdefined( animpos.hideidle ) && animpos.hideidle ) + guy hide(); + if( isdefined( animpos.idle_animstop ) && isdefined( animpos.idle_anim ) ) + thread driver_idle_speed( guy, pos ); + while( 1 ) + { + guy notify( "idle" ); + if( isdefined( guy.vehicle_idle_override ) ) + animontag( guy, animpos.sittag, guy.vehicle_idle_override ); + else if( isdefined( animpos.idleoccurrence ) ) + { + theanim = randomoccurrance( guy, animpos.idleoccurrence ); + animontag( guy, animpos.sittag, guy.vehicle_idle[ theanim ] ); + } + else if( isdefined( guy.playerpiggyback ) && isdefined( animpos.player_idle ) ) + animontag( guy, animpos.sittag, animpos.player_idle ); + else + { + if ( isdefined( animpos.vehicle_idle ) ) + self thread setanimrestart_once( animpos.vehicle_idle ); + if ( isdefined( guy.do_combat_idle ) && guy.do_combat_idle && isdefined( guy.vehicle_idle_combat ) ) + { + animontag( guy, animpos.sittag, guy.vehicle_idle_combat ); + } + else + { + animontag( guy, animpos.sittag, guy.vehicle_idle ); + } + } + } +} +randomoccurrance( guy, occurrences ) +{ + range = []; + totaloccurrance = 0; + for( i = 0;i < occurrences.size;i ++ ) + { + totaloccurrance += occurrences[ i ]; + range[ i ] = totaloccurrance; + } + pick = randomint( totaloccurrance ); + for( i = 0;i < occurrences.size;i ++ ) + if( pick < range[ i ] ) + return i; +} +guy_duck_once_check( guy, pos ) +{ + return isdefined( anim_pos( self, pos ).duck_once ); +} +guy_duck_once( guy, pos ) +{ + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animpos = anim_pos( self, pos ); + if ( isdefined( animpos.duck_once ) ) + { + if ( isdefined( animpos.vehicle_duck_once ) ) + self thread setanimrestart_once( animpos.vehicle_duck_once ); + animontag( guy, animpos.sittag, animpos.duck_once ); + } + thread guy_idle( guy, pos ); +} +guy_weave_check( guy, pos ) +{ + return isdefined( anim_pos( self, pos ).weave ); +} +guy_weave( guy, pos ) +{ + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animpos = anim_pos( self, pos ); + if ( isdefined( animpos.weave ) ) + { + if ( isdefined( animpos.vehicle_weave ) ) + self thread setanimrestart_once( animpos.vehicle_weave ); + animontag( guy, animpos.sittag, animpos.weave ); + } + thread guy_idle( guy, pos ); +} +guy_duck( guy, pos ) +{ + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animpos = anim_pos( self, pos ); + if( isdefined( animpos.duckin ) ) + animontag( guy, animpos.sittag, animpos.duckin ); + thread guy_duck_idle( guy, pos ); +} +guy_duck_idle( guy, pos ) +{ + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animpos = anim_pos( self, pos ); + theanim = randomoccurrance( guy, animpos.duckidleoccurrence ); + while( 1 ) + animontag( guy, animpos.sittag, animpos.duckidle[ theanim ] ); +} +guy_duck_out( guy, pos ) +{ + animpos = anim_pos( self, pos ); + if( isdefined( animpos.ducking ) && guy.ducking ) + { + animontag( guy, animpos.sittag, animpos.duckout ); + guy.ducking = false; + } + thread guy_idle( guy, pos ); +} +guy_unload_que( guy ) +{ + self endon( "death" ); + self.unloadque = array_add( self.unloadque, guy ); + guy waittill_any( "death", "jumpedout" ); + self.unloadque = array_remove( self.unloadque, guy ); + if( !self.unloadque.size ) + { + self notify( "unloaded" ); + self.unload_group = "default"; + } +} +riders_unloadable( unload_group ) +{ + if( ! self.riders.size ) + return false; + for ( i = 0; i < self.riders.size; i++ ) + { + assert( isdefined( self.riders[i].pos ) ); + if( check_unloadgroup( self.riders[i].pos, unload_group ) ) + return true; + } + return false; +} +check_unloadgroup( pos, unload_group ) +{ + if( ! isdefined( unload_group ) ) + unload_group = self.unload_group; + type = self.vehicletype; + if( !isdefined( level.vehicle_unloadgroups[ type ] ) ) + return true; + if ( !isdefined( level.vehicle_unloadgroups[ type ][ unload_group ] ) ) + { + println( "Invalid Unload group on node at origin: " + self.currentnode.origin + " with group:( \"" + unload_group + "\" )" ); + println( "Unloading everybody" ); + return true; + } + group = level.vehicle_unloadgroups[ type ][ unload_group ]; + for( i = 0;i < group.size;i ++ ) + if( pos == group[ i ] ) + return true; + return false; +} +getoutrig_model_idle( model, tag, animation ) +{ + self endon( "unload" ); + while( 1 ) + animontag( model, tag, animation ); +} +getoutrig_model( animpos, model, tag, animation, bIdletillunload ) +{ + type = self.vehicletype; + if( bIdletillunload ) + { + thread getoutrig_model_idle( model, tag , level.vehicle_attachedmodels[ type ][ animpos.getoutrig ].idleanim ); + self waittill( "unload" ); + } + self.unloadque = array_add( self.unloadque, model ); + self thread getoutrig_abort( model, tag, animation ); + if ( !isdefined( self.crashing ) ) + animontag( model, tag, animation ); + model unlink(); + if( !isdefined( self ) ) + { + model delete(); + return; + } + assert( isdefined( self.unloadque ) ); + self.unloadque = array_remove( self.unloadque, model ); + if ( !self.unloadque.size ) + self notify( "unloaded" ); + self.getoutrig[ animpos.getoutrig ] = undefined; + wait 10; + model delete(); +} +getoutrig_disable_abort_notify_after_riders_out() +{ + wait .05; + while( isalive( self ) && self.unloadque.size > 2 ) + wait .05; + if( ! isalive( self ) || ( isdefined(self.crashing) && self.crashing ) ) + return; + self notify ( "getoutrig_disable_abort" ); +} +getoutrig_abort_while_deploying() +{ + self endon ("end_getoutrig_abort_while_deploying"); + while ( !isdefined( self.crashing ) ) + wait 0.05; + array_delete( self.riders ); + self notify ("crashed_while_deploying"); +} +getoutrig_abort( model, tag, animation ) +{ + totalAnimTime = getanimlength( animation ); + ropesFallAnimTime = totalAnimTime - 1.0; + if(self.vehicletype == "mi17") + ropesFallAnimTime = totalAnimTime - .5; + ropesDeployedAnimTime = 2.5; + assert( totalAnimTime > ropesDeployedAnimTime ); + assert( ropesFallAnimTime - ropesDeployedAnimTime > 0 ); + self endon( "getoutrig_disable_abort" ); + thread getoutrig_disable_abort_notify_after_riders_out(); + thread getoutrig_abort_while_deploying(); + waittill_notify_or_timeout( "crashed_while_deploying" , ropesDeployedAnimTime ); + self notify ("end_getoutrig_abort_while_deploying"); + while ( !isdefined( self.crashing ) ) + wait 0.05; + thread animontag( model, tag, animation ); + waittillframeend; + model setanimtime( animation, ropesFallAnimTime / totalAnimTime ); + for ( i = 0 ; i < self.riders.size ; i++ ) + { + if ( !isdefined( self.riders[ i ] ) ) + continue; + if ( !isdefined( self.riders[ i ].ragdoll_getout_death ) ) + continue; + if ( self.riders[ i ].ragdoll_getout_death != 1 ) + continue; + if ( !isdefined( self.riders[ i ].ridingvehicle ) ) + continue; + self.riders[i] damage_notify_wrapper( 100, self.riders[i].ridingvehicle ); + } +} +setanimrestart_once( vehicle_anim, bClearAnim ) +{ + self endon( "death" ); + self endon( "dont_clear_anim" ); + if ( !isdefined( bClearAnim ) ) + bClearAnim = true; + cycletime = getanimlength( vehicle_anim ); + self SetAnimRestart( vehicle_anim ); + wait cycletime; + if ( bClearAnim ) + self clearanim( vehicle_anim, 0 ); +} +getout_rigspawn( animatemodel, pos , bIdletillunload ) +{ + if( !isdefined( bIdletillunload ) ) + bIdletillunload = true; + type = self.vehicletype; + animpos = anim_pos( self, pos ); + if ( isdefined( self.attach_model_override ) && isdefined( self.attach_model_override[ animpos.getoutrig ] ) ) + overrridegetoutrig = true; + else + overrridegetoutrig = false; + if ( !isdefined( animpos.getoutrig ) || isdefined( self.getoutrig[ animpos.getoutrig ] ) || overrridegetoutrig ) + return; + origin = animatemodel gettagorigin( level.vehicle_attachedmodels[ type ][ animpos.getoutrig ].tag ); + angles = animatemodel gettagangles( level.vehicle_attachedmodels[ type ][ animpos.getoutrig ].tag ); + self.getoutriganimating[ animpos.getoutrig ] = true; + getoutrig_model = spawn( "script_model", origin ); + getoutrig_model.angles = angles; + getoutrig_model.origin = origin; + getoutrig_model setmodel( level.vehicle_attachedmodels[ type ][ animpos.getoutrig ].model ); + self.getoutrig[ animpos.getoutrig ] = getoutrig_model; + getoutrig_model UseAnimTree( #animtree ); + getoutrig_model linkto( animatemodel, level.vehicle_attachedmodels[ type ][ animpos.getoutrig ].tag, ( 0, 0, 0 ), ( 0, 0, 0 ) ); + thread getoutrig_model( animpos, getoutrig_model, level.vehicle_attachedmodels[ type ][ animpos.getoutrig ].tag , level.vehicle_attachedmodels[ type ][ animpos.getoutrig ].dropanim, bIdletillunload ); + return getoutrig_model; +} +check_sound_tag_dupe( soundtag ) +{ + if( !isdefined( self.sound_tag_dupe ) ) + self.sound_tag_dupe = []; + duped = false; + if( !isdefined( self.sound_tag_dupe[ soundtag ] ) ) + self.sound_tag_dupe[ soundtag ] = true; + else + duped = true; + thread check_sound_tag_dupe_reset( soundtag ); + return duped; +} +check_sound_tag_dupe_reset( soundtag ) +{ + wait .05; + if( ! isdefined( self ) ) + return; + self.sound_tag_dupe[ soundtag ] = false; + keys = getarraykeys(self.sound_tag_dupe); + for ( i = 0; i < keys.size; i++ ) + if( self.sound_tag_dupe[ keys[i] ] ) + return; + self.sound_tag_dupe = undefined; +} +guy_unload( guy, pos ) +{ + animpos = anim_pos( self, pos ); + type = self.vehicletype; + if( !check_unloadgroup( pos ) ) + { + thread guy_idle( guy, pos ); + return; + } + if ( !isdefined( animpos.getout ) ) + { + thread guy_idle( guy, pos ); + return; + } + if ( isdefined( animpos.hideidle ) && animpos.hideidle ) + guy show(); + thread guy_unload_que( guy ); + self endon( "death" ); + if( isai( guy ) && isalive( guy ) ) + guy endon( "death" ); + animatemodel = getanimatemodel(); + if ( isdefined( animpos.vehicle_getoutanim ) ) + { + animatemodel thread setanimrestart_once( animpos.vehicle_getoutanim, animpos.vehicle_getoutanim_clear ); + self notify( "open_door_climbout" ); + sound_tag_dupped = false; + if (is_true(self._vehicle_use_interior_lights)) + { + self maps\_vehicle::interior_lights_on(); + } + if ( isdefined( animpos.vehicle_getoutsoundtag ) ) + { + sound_tag_dupped = check_sound_tag_dupe( animpos.vehicle_getoutsoundtag ); + origin = animatemodel gettagorigin( animpos.vehicle_getoutsoundtag ); + } + else + origin = animatemodel.origin; + if ( isdefined( animpos.vehicle_getoutsound ) ) + sound = animpos.vehicle_getoutsound; + else + sound = "veh_truck_door_open"; + if( ! sound_tag_dupped ) + thread maps\_utility::play_sound_in_space( sound, origin ); + sound_tag_dupped = undefined; + } + delay = 0; + if ( isdefined( animpos.getout_timed_anim ) ) + delay += getanimlength( animpos.getout_timed_anim ); + if( isdefined( animpos.delay ) ) + delay += animpos.delay; + if( isdefined( guy.delay ) ) + delay += guy.delay; + if ( delay > 0 ) + { + thread guy_idle( guy, pos ); + wait delay; + } + hascombatjumpout = isdefined( animpos.getout_combat ); + if( !hascombatjumpout && guy.standing ) + guy_stand_down( guy, pos ); + else if( !hascombatjumpout && !guy.vehicle_idling && isdefined( guy.vehicle_idle ) ) + guy waittill( "idle" ); + guy.deathanim = undefined; + guy notify( "newanim" ); + if( isai( guy ) ) + { + guy pushplayer( true ); + } + bNoanimUnload = false; + if( isdefined( animpos.bNoanimUnload ) ) + { + bNoanimUnload = true; + } + else if( !isdefined( animpos.getout ) || + ( !isdefined( self.script_unloadmgguy ) && ( isdefined( animpos.bIsgunner ) && animpos.bIsgunner ) ) || + isdefined( self.script_keepdriver ) && pos == 0 ) + { + self thread guy_idle( guy, pos ); + return; + } + if ( guy should_give_orghealth() ) + { + guy.health = guy.orghealth; + } + guy.orghealth = undefined; + if( isai( guy ) && isalive( guy ) ) + { + guy endon( "death" ); + } + guy.allowdeath = false; + if( isdefined( animpos.exittag ) ) + { + tag = animpos.exittag; + } + else + { + tag = animpos.sittag; + } + if( hascombatjumpout && guy.standing ) + { + animation = animpos.getout_combat; + } + else if( hascombatjumpout && isdefined( guy.do_combat_getout ) && ( guy.do_combat_getout )) + { + animation = animpos.getout_combat; + } + else if ( isdefined( guy.get_out_override ) ) + { + animation = guy.get_out_override; + } + else if( isdefined( guy.playerpiggyback ) && isdefined( animpos.player_getout ) ) + { + animation = animpos.player_getout; + } + else + { + animation = animpos.getout; + } + if( !bNoanimUnload ) + { + thread guy_unlink_on_death( guy ); + if( isdefined( animpos.getoutrig ) ) + { + if ( ! isdefined( self.getoutrig[ animpos.getoutrig ] ) ) + { + thread guy_idle( guy, pos ); + getoutrig_model = self getout_rigspawn( animatemodel, guy.pos, false ); + } + } + if( isdefined( animpos.getoutsnd ) ) + guy thread play_sound_on_tag( animpos.getoutsnd, "J_Wrist_RI", true ); + if( isdefined( guy.playerpiggyback ) && isdefined( animpos.player_getout_sound ) ) + guy thread play_sound_on_entity( animpos.player_getout_sound ); + if( isdefined( animpos.getoutloopsnd ) ) + guy thread play_loop_sound_on_tag( animpos.getoutloopsnd ); + if( isdefined( guy.playerpiggyback ) && isdefined( animpos.player_getout_sound_loop ) ) + get_players()[0] thread play_loop_sound_on_entity( animpos.player_getout_sound_loop ); + guy notify( "newanim" ); + guy notify( "jumping_out"); + guy.ragdoll_getout_death = true; + if( isdefined( animpos.ragdoll_getout_death ) ) + { + guy.ragdoll_getout_death = true; + if ( isdefined( animpos.ragdoll_fall_anim ) ) + guy.ragdoll_fall_anim = animpos.ragdoll_fall_anim; + } + animontag( guy, tag, animation ); + if ( isdefined( animpos.getout_secondary ) ) + { + secondaryunloadtag = tag; + if ( isdefined( animpos.getout_secondary_tag ) ) + secondaryunloadtag = animpos.getout_secondary_tag; + animontag( guy, secondaryunloadtag, animpos.getout_secondary); + } + if( isdefined( guy.playerpiggyback ) && isdefined( animpos.player_getout_sound_loop ) ) + get_players()[0] thread stop_loop_sound_on_entity( animpos.player_getout_sound_loop ); + if( isdefined( animpos.getoutloopsnd ) ) + guy thread stop_loop_sound_on_entity( animpos.getoutloopsnd ); + if( isdefined( guy.playerpiggyback ) && isdefined( animpos.player_getout_sound_end ) ) + get_players()[0] thread play_sound_on_entity( animpos.player_getout_sound_end ); + } + self.riders = array_remove( self.riders, guy ); + self.usedPositions[ pos ] = false; + guy.ridingvehicle = undefined; + guy.drivingVehicle = undefined; + if ( !isalive( self ) && !isdefined( animpos.unload_ondeath ) ) + { + guy delete(); + return; + } + guy unlink(); + if( !isdefined( guy.magic_bullet_shield ) ) + guy.allowdeath = true; + if( !isai( guy ) ) + { + if( is_true(guy.drone_delete_on_unload) ) + { + guy delete(); + return; + } + guy = make_real_ai( guy ); + } + if( isalive( guy ) ) + { + guy.a.disablelongdeath = false; + guy.forced_startingposition = undefined; + guy notify( "jumpedout" ); + if( isdefined( animpos.getoutstance ) ) + { + guy.desired_anim_pose = animpos.getoutstance; + guy allowedstances( "crouch" ); + guy thread animscripts\utility::UpdateAnimPose(); + guy allowedstances( "stand", "crouch", "prone" ); + } + guy pushplayer( false ); + qSetGoalPos = false; + if (guy has_color()) + { + qSetGoalPos = false; + } + else if (!IsDefined(guy.target) && !IsDefined(guy.script_spawner_targets)) + { + qSetGoalPos = true; + } + else if (!IsDefined(guy.script_spawner_targets)) + { + targetedNodes = getNodeArray( guy.target, "targetname" ); + if( targetedNodes.size == 0 ) + { + qSetGoalPos = true; + } + } + if (qSetGoalPos) + { + if (!IsDefined(guy.script_goalradius)) + { + guy.goalradius = 600; + } + guy setGoalPos( guy.origin ); + } + } + if( isdefined( animpos.getout_delete ) && animpos.getout_delete ) + { + guy delete(); + return; + } +} +animontag( guy, tag , animation, notetracks, sthreads, flag ) +{ + guy notify( "animontag_thread" ); + guy endon( "animontag_thread" ); + if( !isdefined( flag ) ) + flag = "animontagdone"; + if( isdefined( self.modeldummy ) ) + animatemodel = self.modeldummy; + else + animatemodel = self; + if( !isdefined( tag ) ) + { + org = guy.origin; + angles = guy.angles; + } + else + { + org = animatemodel gettagOrigin( tag ); + angles = animatemodel gettagAngles( tag ); + } + if( isdefined( guy.ragdoll_getout_death ) ) + level thread animontag_ragdoll_death( guy, self ); + guy animscripted( flag, org, angles, animation ); + if( isai( guy ) ) + thread DoNoteTracks( guy, animatemodel, flag ); + if( isdefined( notetracks ) ) + { + for( i = 0;i < notetracks.size;i ++ ) + { + guy waittillmatch( flag, notetracks[ i ] ); + guy thread [[ sthreads[ i ] ]](); + } + } + guy waittillmatch( flag, "end" ); + guy notify( "anim_on_tag_done" ); + guy.ragdoll_getout_death = undefined; +} +animontag_ragdoll_death_watch_for_damage() +{ + self endon( "anim_on_tag_done" ); + while(1) + { + self waittill( "damage", damage, attacker, damageDirection, damagePoint, damageMod ); + self notify( "vehicle_damage", damage, attacker, damageDirection, damagePoint, damageMod ); + } +} +animontag_ragdoll_death_watch_for_damage_notdone() +{ + self endon( "anim_on_tag_done" ); + while(1) + { + self waittill( "damage_notdone", damage, attacker, damageDirection, damagePoint, damageMod ); + self notify( "vehicle_damage", damage, attacker, damageDirection, damagePoint, damageMod ); + } +} +animontag_ragdoll_death( guy, vehicle ) +{ + if ( isdefined( guy.magic_bullet_shield ) && guy.magic_bullet_shield ) + return; + if( !isAI( guy ) ) + guy setCanDamage( true ); + guy endon( "anim_on_tag_done" ); + guy thread animontag_ragdoll_death_watch_for_damage(); + guy thread animontag_ragdoll_death_watch_for_damage_notdone(); + damage = undefined; + attacker = undefined; + damageDirection = undefined; + damagePoint = undefined; + damageMod = undefined; + explosiveDamage = false; + vehicleallreadydead = vehicle.health <= 0; + while ( true ) + { + if(!vehicleallreadydead && !( isdefined( vehicle ) && vehicle.health > 0) ) + break; + guy waittill( "vehicle_damage", damage, attacker, damageDirection, damagePoint, damageMod ); + explosiveDamage = call_overloaded_func( "animscripts\pain", "isExplosiveDamageMOD", damageMod ); + if( !isdefined( damage ) ) + continue; + if ( damage < 1 ) + continue; + if( !isdefined( attacker ) ) + continue; + if( isdefined( guy.ridingvehicle ) && attacker == guy.ridingvehicle ) + break; + if ( IsPlayer(attacker) && (explosiveDamage || !IsDefined(guy.allow_ragdoll_getout_death) || guy.allow_ragdoll_getout_death) ) + break; + } + if( !isdefined(guy) ) + return; + arcademode_assignpoints( "arcademode_score_enemyexitingcar", attacker ); + guy.deathanim = undefined; + guy.deathFunction = undefined; + guy.anim_disablePain = true; + if ( isdefined( guy.ragdoll_fall_anim ) ) + { + moveDelta = getmovedelta( guy.ragdoll_fall_anim, 0, 1 ); + groundPos = physicstrace( guy.origin + ( 0, 0, 16 ), guy.origin - ( 0, 0, 10000 ) ); + distanceFromGround = distance( guy.origin + ( 0, 0, 16 ), groundPos ); + if ( abs( moveDelta[ 2 ] + 16 ) <= abs( distanceFromGround ) ) + { + guy thread play_sound_on_entity( "generic_death_falling" ); + guy animscripted( "fastrope_fall", guy.origin, guy.angles, guy.ragdoll_fall_anim ); + guy waittillmatch( "fastrope_fall", "start_ragdoll" ); + } + } + if( !isdefined(guy) ) + return; + guy.deathanim = undefined; + guy.deathFunction = undefined; + guy.anim_disablePain = true; + guy doDamage( guy.health + 100, attacker.origin, attacker ); + if( explosiveDamage ) + { + guy stopanimscripted(); + guy.delayedDeath = false; + guy.allowDeath = true; + guy.noGibDeathAnim = true; + guy.health = guy.maxHealth; + guy doDamage( guy.health + 100, damagePoint, attacker, -1, "explosive" ); + } + else + { + guy animscripts\utility::do_ragdoll_death(); + } +} +DoNoteTracks( guy, vehicle, flag ) +{ + guy endon( "newanim" ); + vehicle endon( "death" ); + guy endon( "death" ); + guy animscripts\shared::DoNoteTracks( flag ); +} +animatemoveintoplace( guy, org, angles, movetospotanim ) +{ + guy animscripted( "movetospot", org, angles, movetospotanim ); + guy waittillmatch( "movetospot", "end" ); +} +guy_vehicle_death( guy ) +{ + animpos = anim_pos( self, guy.pos ); + if ( isdefined( animpos.getout ) ) + self endon( "unload" ); + guy endon ("death"); + self endon( "forcedremoval" ); + self waittill( "death" ); + if ( isdefined(animpos.unload_ondeath) && isdefined( self ) ) + { + thread guy_idle( guy, guy.pos, true ); + wait animpos.unload_ondeath; + self.groupedanim_pos = guy.pos; + self notify ("groupedanimevent","unload"); + return; + } + if ( isdefined( guy ) ) + { + origin = guy.origin; + guy delete(); + [[ level.global_kill_func ]]( "MOD_RIFLE_BULLET", "torso_upper", origin ); + } +} +guy_turn_right_check( guy, pos ) +{ + return isdefined( anim_pos( self, pos ).turn_right ); +} +guy_turn_right( guy, pos ) +{ + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animpos = anim_pos( self, pos ); + if ( isdefined( animpos.vehicle_turn_right ) ) + thread setanimrestart_once( animpos.vehicle_turn_right ); + animontag( guy, animpos.sittag, animpos.turn_right ); + thread guy_idle( guy, pos ); +} +guy_turn_left( guy, pos ) +{ + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animpos = anim_pos( self, pos ); + if ( isdefined( animpos.vehicle_turn_left ) ) + self thread setanimrestart_once( animpos.vehicle_turn_left ); + animontag( guy, animpos.sittag, animpos.turn_left ); + thread guy_idle( guy, pos ); +} +guy_turn_left_check( guy, pos ) +{ + return isdefined( anim_pos( self, pos ).turn_left ); +} +guy_turn_hardright( guy, pos ) +{ + animpos = level.vehicle_aianims[ self.vehicletype ][ pos ]; + if( isdefined( animpos.idle_hardright ) ) + guy.vehicle_idle_override = animpos.idle_hardright; +} +guy_turn_hardleft( guy, pos ) +{ + animpos = level.vehicle_aianims[ self.vehicletype ][ pos ]; + if( isdefined( animpos.idle_hardleft ) ) + guy.vehicle_idle_override = animpos.idle_hardleft; +} +guy_drive_reaction( guy, pos ) +{ + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animpos = anim_pos( self, pos ); + animontag( guy, animpos.sittag, animpos.drive_reaction ); + thread guy_idle( guy, pos ); +} +guy_drive_reaction_check( guy, pos ) +{ + return isdefined( anim_pos( self, pos ).drive_reaction ); +} +guy_death_fire( guy, pos ) +{ + guy endon( "newanim" ); + self endon( "death" ); + guy endon( "death" ); + animpos = anim_pos( self, pos ); + animontag( guy, animpos.sittag, animpos.death_fire ); + thread guy_idle( guy, pos ); +} +guy_death_fire_check( guy, pos ) +{ + return isdefined( anim_pos( self, pos ).death_fire ); +} +guy_move_to_driver(guy, pos) +{ + guy endon("newanim"); + self endon("death"); + guy endon("death"); + pos = 0; + animpos = anim_pos(self, pos); + guy.pos = 0; + guy.drivingvehicle = true; + guy.vehicle_idle = animpos.idle; + guy.ridingvehicle = self; + guy.orghealth = guy.health; + self.attachedguys = array_remove(self.attachedguys, self.attachedguys[1]); + self.attachedguys[0] = guy; + if(IsDefined(animpos.move_to_driver)) + { + animontag(guy, animpos.sittag, animpos.move_to_driver); + guy Unlink(); + guy LinkTo(self, animpos.sittag); + } + wait(0.05); + thread guy_idle(guy, pos); + guy notify("moved_to_driver"); +} +ai_wait_go() +{ + self endon( "death" ); + self waittill( "loaded" ); + self maps\_vehicle::gopath(); +} +set_pos( guy, maxpos ) +{ + pos = undefined; + script_startingposition = isdefined(guy.script_startingposition); + if( isdefined( guy.forced_startingposition ) ) + { + pos = guy.forced_startingposition; + assertEx( (( pos < maxpos ) && ( pos >= 0 ) ), "script_startingposition on a vehicle rider must be between " + maxpos + " and 0" ); + return pos; + } + if ( script_startingposition && !self.usedpositions[ guy.script_startingposition ] ) + { + pos = guy.script_startingposition; + assertEx( (( pos < maxpos ) && ( pos >= 0 ) ), "script_startingposition on a vehicle rider must be between " + maxpos + " and 0" ); + } + else + { + if( script_startingposition ) + { + println("vehicle rider with script_startingposition: "+guy.script_startingposition+" and script_vehicleride: "+self.script_vehicleride+" that's been taken" ); + assertmsg("startingposition conflict, see console"); + } + assert( !script_startingposition ); + for( j = 0;j < self.usedPositions.size;j ++ ) + { + if( self.usedPositions[ j ] == true ) + continue; + pos = j; + break; + } + } + return pos; +} +guy_man_gunner_turret() +{ + self notify( "animontag_thread" ); + self endon( "animontag_thread" ); + self endon( "death" ); + self.vehicle endon( "death" ); + aimBlendTime = .05; + animLimit = 60; + animpos = anim_pos( self.vehicle, self.vehicle_pos ); + for( ;; ) + { + if ( IsAI(self) ) + { + self AnimMode( "point relative" ); + org = self.vehicle gettagorigin( animpos.sittag ); + org2 = self.vehicle gettagorigin( "tag_gunner_turret1" ); + } + self ClearAnim( %root, aimBlendTime ); + self SetAnim( animpos.idle, 1.0 ); + pitchDelta = self.vehicle GetGunnerAnimPitch( animpos.vehiclegunner - 1 ); + if ( pitchDelta >= 0 ) + { + if( pitchDelta > animLimit ) + { + pitchDelta = animLimit; + } + weight = pitchDelta / animLimit; + self setAnimLimited( animpos.aimdown, weight, aimBlendTime ); + self setAnimLimited( animpos.idle, 1.0 - weight, aimBlendTime ); + } + else if ( pitchDelta < 0 ) + { + if( pitchDelta < 0-animLimit ) + { + pitchDelta = 0-animLimit; + } + weight = 0-(pitchDelta / animLimit); + self setAnimLimited( animpos.aimup, weight, aimBlendTime ); + self setAnimLimited( animpos.idle, 1.0 - weight, aimBlendTime ); + } + wait .05; + } +} +guy_man_turret( guy , pos ) +{ + animpos = anim_pos( self, pos ); + turret = self.mgturret[ animpos.mgturret ]; + turret setdefaultdroppitch( 0 ); + wait( 0.1 ); + turret endon( "death" ); + guy endon( "death" ); + level thread maps\_mgturret::mg42_setdifficulty( turret, getdifficulty() ); + turret setmode( "auto_ai" ); + turret setturretignoregoals( true ); + guy.script_on_vehicle_turret = 1; + while( 1 ) + { + if( !isdefined( guy getturret() ) ) + guy useturret( turret ); + wait 1; + } +} +guy_unlink_on_death( guy ) +{ + guy endon( "jumpedout" ); + guy waittill( "death" ); + if( isdefined( guy ) ) + guy unlink(); +} +blowup_riders() +{ + self array_levelthread( self.riders, ::guy_blowup ); +} +guy_blowup( guy ) +{ + if( ! isdefined( guy.pos ) ) + return; + pos = guy.pos; + anim_pos = anim_pos( self, pos ); + if ( !isdefined( anim_pos.explosion_death ) ) + return; + [[ level.global_kill_func ]]( "MOD_RIFLE_BULLET", "torso_upper", guy.origin ); + guy.deathanim = anim_pos.explosion_death; + angles = self.angles; + origin = guy.origin; + if ( isdefined( anim_pos.explosion_death_offset ) ) + { + origin += vector_scale( anglestoforward( angles ), anim_pos.explosion_death_offset[ 0 ] ); + origin += vector_scale( anglestoright( angles ), anim_pos.explosion_death_offset[ 1 ] ); + origin += vector_scale( anglestoup( angles ), anim_pos.explosion_death_offset[ 2 ] ); + } + guy = convert_guy_to_drone( guy ); + detach_models_with_substr( guy, "weapon_" ); + guy notsolid(); + guy.origin = origin; + guy.angles = angles; + guy stopanimscripted(); + guy animscripted( "deathanim", origin, angles, anim_pos.explosion_death ); + fraction = .3; + if ( isdefined( anim_pos.explosion_death_ragdollfraction ) ) + fraction = anim_pos.explosion_death_ragdollfraction; + animlength = getanimlength( anim_pos.explosion_death ); + timer = gettime() + ( animlength * 1000 ); + wait animlength * fraction; + force = (0,0,1); + org = guy.origin; + if( GetDvar( #"ragdoll_enable") == "0" ) + { + guy delete(); + return; + } + while ( ! guy isragdoll() && gettime() < timer ) + { + org = guy.origin; + wait .05; + force = guy.origin-org; + guy startragdoll(); + } + wait .05; + force = vector_scale( force,20000 ); + for ( i = 0; i < 3; i++ ) + { + if ( isdefined( guy ) ) + org = guy.origin; + wait( 0.05 ); + } + if ( !guy isragdoll() ) + guy delete(); +} +convert_guy_to_drone( guy, bKeepguy ) +{ + if ( !isdefined( bKeepguy ) ) + bKeepguy = false; + model = spawn( "script_model", guy.origin ); + model.angles = guy.angles; + model setmodel( guy.model ); + size = guy getattachsize(); + for ( i = 0;i < size;i++ ) + { + model attach( guy getattachmodelname( i ), guy getattachtagname( i ) ); + } + model useanimtree( #animtree ); + if ( isdefined( guy.team ) ) + model.team = guy.team; + if ( !bKeepguy ) + guy delete(); + model makefakeai(); + return model; +} +vehicle_animate( animation, animtree ) +{ + self UseAnimTree( animtree ); + self setAnim( animation ); +} +vehicle_getInstart( pos ) +{ + animpos = anim_pos( self, pos ); + return vehicle_getanimstart( animpos.getin, animpos.sittag, pos ); +} +vehicle_getanimstart( animation, tag, pos ) +{ + struct = spawnstruct(); + origin = undefined; + angles = undefined; + assert( isdefined( animation ) ); + org = self gettagorigin( tag ); + ang = self gettagangles( tag ); + origin = getstartorigin( org, ang, animation ); + angles = getstartangles( org, ang, animation ); + struct.origin = origin; + struct.angles = angles; + struct.pos = pos; + return struct; +} +get_availablepositions() +{ + vehicleanim = get_aianims(); + availablepositions = []; + nonanimatedpositions = []; + for( i = 0;i < self.usedPositions.size;i ++ ) + { + if( !self.usedPositions[ i ] ) + { + if( isdefined( vehicleanim[ i ].getin ) ) + { + availablepositions[ availablepositions.size ] = vehicle_getInstart( i ); + } + else + { + nonanimatedpositions[ nonanimatedpositions.size ] = i; + } + } + } + struct = spawnstruct(); + struct.availablepositions = availablepositions; + struct.nonanimatedpositions = nonanimatedpositions; + return struct; +} +set_walkerpos( guy, maxpos ) +{ + pos = undefined; + if( isdefined( guy.script_startingposition ) ) + { + pos = guy.script_startingposition; + assertEx( (( pos < maxpos ) && ( pos >= 0 ) ), "script_startingposition on a vehicle rider must be between " + maxpos + " and 0" ); + } + else + { + pos = -1; + for( j = 0;j < self.walk_tags_used.size;j ++ ) + { + if( self.walk_tags_used[ j ] == true ) + continue; + pos = j; + self.walk_tags_used[ j ] = true; + break; + } + assertEX( pos >= 0, "Vehicle ran out of walking spots. This is usually caused by making more than 6 AI walk with a vehicle." ); + } + return pos; +} +WalkWithVehicle( guy, pos ) +{ + if( !IsDefined(self.walkers) ) + self.walkers = []; + self.walkers[ self.walkers.size ] = guy; + if( !isdefined( guy.FollowMode ) ) + guy.FollowMode = "close"; + guy.WalkingVehicle = self; + if( guy.FollowMode == "close" ) + { + guy.vehiclewalkmember = pos; + level thread vehiclewalker_freespot_ondeath( guy ); + } + guy notify( "stop friendly think" ); + guy vehiclewalker_updateGoalPos( self, "once" ); + guy thread vehiclewalker_removeonunload( self ); + guy thread vehiclewalker_updateGoalPos( self ); + guy thread vehiclewalker_teamUnderAttack(); +} +vehiclewalker_removeonunload( vehicle ) +{ + vehicle endon( "death" ); + vehicle waittill( "unload" ); + vehicle.walkers = array_remove( vehicle.walkers, self ); +} +shiftSides( side ) +{ + if( !isdefined( side ) ) + return; + if( ( side != "left" ) && ( side != "right" ) ) + { + return; + } + if( !isdefined( self.WalkingVehicle ) ) + return; + if( self.WalkingVehicle.walk_tags[ self.vehiclewalkmember ].side == side ) + return; + for( i = 0;i < self.WalkingVehicle.walk_tags.size;i ++ ) + { + if( self.WalkingVehicle.walk_tags[ i ].side != side ) + continue; + if( self.WalkingVehicle.walk_tags_used[ i ] == false ) + { + if( self.WalkingVehicle getspeedMPH() > 0 ) + { + self notify( "stop updating goalpos" ); + self setgoalpos( self.WalkingVehicle.backpos.origin ); + self.WalkingVehicle.walk_tags_used[ self.vehiclewalkmember ] = false; + self.vehiclewalkmember = i; + self.WalkingVehicle.walk_tags_used[ self.vehiclewalkmember ] = true; + self waittill( "goal" ); + self thread vehiclewalker_updateGoalPos( self.WalkingVehicle ); + } + else + self.vehiclewalkmember = i; + return; + } + } +} +vehiclewalker_freespot_ondeath( guy ) +{ + guy waittill( "death" ); + if( !isdefined( guy.WalkingVehicle ) ) + return; + guy.WalkingVehicle.walk_tags_used[ guy.vehiclewalkmember ] = false; +} +vehiclewalker_teamUnderAttack() +{ + self endon( "death" ); + for( ;; ) + { + self waittill( "damage", amount, attacker ); + if( !isdefined( attacker ) ) + continue; + if( ( !isdefined( attacker.team ) ) || ( isplayer( attacker ) ) ) + continue; + if( ( isdefined( self.RidingTank ) ) && ( isdefined( self.RidingTank.allowUnloadIfAttacked ) ) && ( self.RidingTank.allowUnloadIfAttacked == false ) ) + continue; + if( ( isdefined( self.WalkingVehicle ) ) && ( isdefined( self.WalkingVehicle.allowUnloadIfAttacked ) ) && ( self.WalkingVehicle.allowUnloadIfAttacked == false ) ) + continue; + self.WalkingVehicle.teamUnderAttack = true; + self.WalkingVehicle notify( "unload" ); + return; + } +} +GetNewNodePositionAheadofVehicle( guy ) +{ + minimumDistance = 300 + ( 50 * ( self getspeedMPH() ) ); + nextNode = undefined; + if( !isdefined( self.CurrentNode.target ) ) + return self.origin; + nextNode = getVehicleNode( self.CurrentNode.target, "targetname" ); + if( !isdefined( nextNode ) ) + { + if( isdefined( guy.NodeAfterVehicleWalk ) ) + return guy.NodeAfterVehicleWalk.origin; + else + return self.origin; + } + if( distance( self.origin, nextNode.origin ) >= minimumDistance ) + return nextNode.origin; + for( ;; ) + { + if( distance( self.origin, nextNode.origin ) >= minimumDistance ) + return nextNode.origin; + if( !isdefined( nextNode.target ) ) + break; + nextNode = getVehicleNode( nextNode.target, "targetname" ); + } + if( isdefined( guy.NodeAfterVehicleWalk ) ) + return guy.NodeAfterVehicleWalk.origin; + else + return self.origin; +} +vehiclewalker_updateGoalPos( tank, option ) +{ + self endon( "death" ); + tank endon( "death" ); + self endon( "stop updating goalpos" ); + self endon( "unload" ); + for( ;; ) + { + if( self.FollowMode == "cover nodes" ) + { + self.oldgoalradius = self.goalradius; + self.goalradius = 300; + self.walkdist = 64; + position = tank GetNewNodePositionAheadofVehicle( self ); + } + else + { + self.oldgoalradius = self.goalradius; + self.goalradius = 2; + self.walkdist = 64; + position = tank gettagOrigin( tank.walk_tags[ self.vehiclewalkmember ] ); + } + if( ( isdefined( option ) ) && ( option == "once" ) ) + { + trace = bulletTrace( ( position + ( 0, 0, 100 ) ), ( position - ( 0, 0, 500 ) ), false, undefined ); + if( self.FollowMode == "close" ) + self teleport( trace[ "position" ] ); + self setGoalPos( trace[ "position" ] ); + return; + } + tankSpeed = tank getspeedmph(); + if( tankSpeed > 0 ) + { + trace = bulletTrace( ( position + ( 0, 0, 100 ) ), ( position - ( 0, 0, 500 ) ), false, undefined ); + self setGoalPos( trace[ "position" ] ); + } + wait 0.5; + } +} +getanimatemodel() +{ + if( isdefined( self.modeldummy ) ) + return self.modeldummy; + else + return self; +} +animpos_override_standattack( type, pos, animation ) +{ + level.vehicle_aianims[ type ][ pos ].vehicle_standattack = animation; +} +detach_models_with_substr( guy, substr ) +{ + size = guy getattachsize(); + modelstodetach = []; + tagsstodetach = []; + index = 0; + for ( i = 0;i < size;i++ ) + { + modelname = guy getattachmodelname( i ); + tagname = guy getattachtagname( i ); + if ( issubstr( modelname, substr ) ) + { + modelstodetach[ index ] = modelname; + tagsstodetach[ index ] = tagname; + } + } + for ( i = 0; i < modelstodetach.size; i++ ) + guy detach( modelstodetach[ i ], tagsstodetach[ i ] ); +} +should_give_orghealth() +{ + if ( !isai( self ) ) + return false; + if ( !isdefined( self.orghealth ) ) + return false; + return !isdefined( self.magic_bullet_shield ); +} +get_aianims() +{ + vehicleanims = level.vehicle_aianims[ self.vehicletype ]; + if (IsDefined(self.vehicle_aianims)) + { + keys = GetArrayKeys(vehicleanims); + for (i = 0; i < keys.size; i++) + { + key = keys[i]; + if (IsDefined(self.vehicle_aianims[key])) + { + override = self.vehicle_aianims[key]; + if (IsDefined(override.idle)) + { + vehicleanims[key].idle = override.idle; + } + if (IsDefined(override.getout)) + { + vehicleanims[key].getout = override.getout; + } + if (IsDefined(override.getin)) + { + vehicleanims[key].getin = override.getin; + } + if (IsDefined(override.waiting)) + { + vehicleanims[key].waiting = override.waiting; + } + } + } + } + return vehicleanims; +} +override_anim(action, tag, animation) +{ + pos = anim_pos_from_tag(self, tag); + AssertEx(IsDefined(pos), "_vehicle_aianim::override_anim - No valid position set up for tag '" + tag + "' on vehicle of type '" + self.vehicletype + "'."); + if (!IsDefined(self.vehicle_aianims) || !IsDefined(self.vehicle_aianims[pos])) + { + self.vehicle_aianims[pos] = SpawnStruct(); + } + switch (action) + { + case "getin": + self.vehicle_aianims[pos].getin = animation; + break; + case "idle": + self.vehicle_aianims[pos].idle = animation; + break; + case "getout": + self.vehicle_aianims[pos].getout = animation; + break; + default: AssertMsg("_vehicle_aianim::override_anim - '" + action + "' action is not supported for overriding the animation."); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_vehicle_dials.gsc b/BO1/PC/ZM/maps/_vehicle_dials.gsc new file mode 100644 index 0000000..062cb77 Binary files /dev/null and b/BO1/PC/ZM/maps/_vehicle_dials.gsc differ diff --git a/BO1/PC/ZM/maps/_vehicle_turret_ai.gsc b/BO1/PC/ZM/maps/_vehicle_turret_ai.gsc new file mode 100644 index 0000000..74959a3 --- /dev/null +++ b/BO1/PC/ZM/maps/_vehicle_turret_ai.gsc @@ -0,0 +1,471 @@ + +#include maps\_utility; +#include common_scripts\utility; +enable_turret( turret_index, weapon_type, enemy_team, optional_wait_min, optional_wait_max, forced_targets ) +{ + if( !IsDefined( self.turret_ai_array ) ) + { + init_turret_info(); + } + if( !isdefined( weapon_type ) ) + { + weapon_type = "mg"; + } + if( !IsDefined( enemy_team ) ) + { + enemy_team = "axis"; + } + if( IsDefined( forced_targets ) ) + { + self set_forced_target( forced_targets ); + } + self thread turret_ai_thread( turret_index, weapon_type, enemy_team, optional_wait_min, optional_wait_max ); +} +disable_turret( turret_index ) +{ + if( !IsDefined( self.turret_ai_array ) ) + { + init_turret_info(); + } + if( !IsDefined( turret_index ) ) + { + PrintLn( "turret index missing! disable_turret returning" ); + return; + } + self.turret_ai_array[turret_index].enabled = false; + self clearGunnerTarget( turret_index ); +} +init_turret_info() +{ + self.turret_ai_array = []; + for( i = 0; i < 4; i++ ) + { + self.turret_ai_array[i] = spawnstruct(); + self.turret_ai_array[i].enabled = false; + self.turret_ai_array[i].target_ent = undefined; + fire_angles = undefined; + weapon = self SeatGetWeapon( i + 1 ); + if( IsDefined(weapon) ) + { + fire_angles = self GetSeatFiringAngles( i + 1 ); + } + if( !isdefined( fire_angles ) ) + { + fire_angles = (0,0,0); + } + self.turret_ai_array[i].rest_angle = AngleClamp180( fire_angles[1] - self.angles[1] ); + } +} +fire_turret_for_time( turret_index, time ) +{ + if( !IsDefined( self.turret_ai_array ) ) + { + init_turret_info(); + } + weapon = self SeatGetWeapon( turret_index + 1 ); + firetime = WeaponFireTime( weapon ); + assert( time > firetime ); + num_shots = time / firetime; + alias = undefined; + alias2 = undefined; + for(i = 0; i < num_shots; i++) + { + self fireGunnerWeapon( turret_index ); + if( IsDefined( self.turret_audio_override ) ) + { + if( !IsDefined( self.sound_ent ) ) + { + self.sound_ent = Spawn( "script_origin", self.origin ); + self.sound_ent LinkTo(self); + self thread kill_audio_ent(self.sound_ent); + } + if( IsDefined( self.turret_audio_override_alias ) ) + { + alias = self.turret_audio_override_alias; + } + if( IsDefined( self.turret_audio_ring_override_alias ) ) + { + alias2 = self.turret_audio_ring_override_alias; + } + else + { + alias = "wpn_gaz_quad50_turret_loop_npc"; + } + self.sound_ent PlayLoopSound( alias ); + } + wait firetime; + } + if( IsDefined( self.sound_ent ) ) + { + self.sound_ent Delete(); + self notify( "stop_audio_delete" ); + if(IsDefined( alias2 ) ) + { + self playsound( alias2 ); + } + } +} +kill_audio_ent(audio_ent) +{ + self endon( "stop_audio_delete" ); + self waittill( "death" ); + wait 2; + if( IsDefined( audio_ent ) ) + { + audio_ent Delete(); + } +} +turret_ai_thread( turret_index, weapon_type, enemy_team, optional_wait_min, optional_wait_max ) +{ + self endon ("death"); + weapon = self SeatGetWeapon( turret_index + 1 ); + if( !IsDefined(weapon) ) + { + println( "Failed to start gunner turret ai for " + turret_index + " " + self.vehicletype + ". No weapon." ); + return; + } + if( IsDefined(self.turret_ai_array[turret_index]) && self.turret_ai_array[turret_index].enabled == true ) + { + println( "Failed to start gunner turret ai for " + turret_index + " " + self.vehicletype + ". Already started." ); + return; + } + self.turret_ai_array[turret_index].enabled = true; + while( self.turret_ai_array[turret_index].enabled ) + { + if( (isdefined(self.player_controlled_heli) && self.player_controlled_heli == true) || choose_target( turret_index, enemy_team ) ) + { + if( weapon_type == "mg" ) + { + fire_turret_for_time( turret_index, .6 ); + wait 1; + fire_turret_for_time( turret_index, .6 ); + wait 1; + } + else if( weapon_type == "slow_mg" ) + { + burst_fire( turret_index, 3, 0.25 ); + wait 1; + burst_fire( turret_index, 3, 0.25); + wait 1; + } + else if( weapon_type == "fast_mg" ) + { + fire_turret_for_time( turret_index, 1.75 ); + } + else if( weapon_type == "huey_minigun" ) + { + burst_fire( turret_index, 0.5, 0.1 ); + } + else if( weapon_type == "huey_spotlight" ) + { + wait RandomFloat(1, 4); + } + else if( weapon_type == "target_finder_only" ) + { + wait 1; + } + else if( weapon_type == "flame" ) + { + flame_fire( turret_index, 2 ); + } + else if( weapon_type == "grenade" ) + { + burst_fire( turret_index, 2, 1.5); + } + else if( weapon_type == "grenade_btr" ) + { + burst_fire_rebirthbtr( turret_index, 2, 1.5); + } + if( IsDefined( optional_wait_min ) && IsDefined( optional_wait_max ) ) + { + wait( RandomFloatRange( optional_wait_min, optional_wait_max ) ); + } + } + else + { + wait 2; + } + } +} +score_angle( target_ent, turret_index ) +{ + return (score_angle_position(target_ent.origin, turret_index)); +} +score_angle_position( origin, turret_index ) +{ + if( !IsDefined( self.turret_ai_array ) ) + { + init_turret_info(); + } + angles_to_target = VectorToAngles( origin - self.origin ); + rest_angle = self.turret_ai_array[turret_index].rest_angle + self.angles[1]; + angle_diff = AngleClamp180( angles_to_target[1] - rest_angle ); + angle_diff = abs( angle_diff ); + if( angle_diff < 90 ) + { + return (angle_diff / 90) * 50; + } + return -1000; +} +score_distance( target_ent ) +{ + max_range = 3000 * 3000; + dist2 = DistanceSquared( target_ent.origin, self.origin ); + if ( dist2 < max_range ) + { + return (dist2 / max_range) * 100; + } + return -1000; +} +score_special( target_ent, turret_index ) +{ + for( i = 0; i < 4; i++ ) + { + if( isdefined(self.turret_ai_array[i].target_ent) && i != turret_index ) + { + if( self.turret_ai_array[i].target_ent == target_ent ) + { + return -50; + } + } + } + return 0; +} +choose_target( turret_index, enemy_team ) +{ + if( !IsDefined( self.turret_ai_array ) ) + { + init_turret_info(); + } + player = self getseatoccupant( turret_index+1 ); + if( isdefined(player) ) + { + self ClearGunnerTarget( turret_index ); + return false; + } + if( IsDefined( self._forced_target_ent_array ) ) + { + self update_forced_gunner_targets(); + if( self._forced_target_ent_array.size == 0 ) + { + self ClearGunnerTarget( turret_index ); + return false; + } + else + { + best_target = score_target( self._forced_target_ent_array, turret_index ); + if( IsDefined( best_target ) ) + { + self setGunnerTargetEnt( best_target, (0,0,30), turret_index ); + return true; + } + else + { + self ClearGunnerTarget( turret_index ); + return false; + } + } + } + else + { + ai = getaiarray( enemy_team ); + if(isDefined(level.heli_attack_drone_targets_func)) + { + ai = [[ level.heli_attack_drone_targets_func ]]( ai, enemy_team ); + } + best_target = score_target( ai, turret_index ); + self.turret_ai_array[turret_index].target_ent = best_target; + if( IsDefined(best_target) ) + { + self setGunnerTargetEnt( best_target, (0,0,30), turret_index ); + return true; + } + self ClearGunnerTarget( turret_index ); + return false; + } +} +burst_fire( turret_index, bullet_count, interval ) +{ + for(i = 0; i < bullet_count; i++) + { + self fireGunnerWeapon( turret_index ); + wait interval; + } +} +burst_fire_rebirthbtr( turret_index, bullet_count, interval ) +{ + for(i = 0; i < bullet_count; i++) + { + self fireGunnerWeapon( turret_index ); + self playsound( "wpn_china_lake_fire_npc" ); + wait interval; + } +} +flame_fire( turret_index, interval ) +{ + while( interval > 0 ) + { + self fireGunnerWeapon( turret_index ); + wait( 0.05 ); + interval -= 0.05; + } + self StopFireWeapon( turret_index ); +} +score_target( target_array, turret_index ) +{ + if( !IsDefined( target_array ) || !IsDefined( turret_index ) ) + { + return; + } + else + { + best_score = 0; + best_target = undefined; + for ( i = 0 ; i < target_array.size ; i++ ) + { + score = score_distance( target_array[i] ); + score += score_angle( target_array[i], turret_index ); + score += score_special( target_array[i], turret_index ); + if( score > best_score ) + { + best_score = score; + best_target = target_array[i]; + } + } + return best_target; + } +} +setup_driver_turret_aim_assist( driver_turret, target_radius, target_offset ) +{ + self endon( "death" ); + if(!IsDefined(target_radius)) + { + target_radius = 60; + } + if(!IsDefined(target_offset)) + { + target_offset = (0, 0, 30); + } + while( 1 ) + { + driver = self getseatoccupant( 0 ); + if( isdefined(driver) ) + { + ai = getaiarray( "axis" ); + best_target = undefined; + fov = GetDvarFloat( #"cg_fov"); + for( i = 0; i < ai.size; i++ ) + { + if( target_isincircle( ai[i], driver, fov, target_radius ) ) + best_target = ai[i]; + } + if( isdefined(driver_turret) ) + { + if( isdefined(best_target) ) + { + self setGunnerTargetEnt( best_target, target_offset, driver_turret ); + } + else + { + self clearGunnerTarget( driver_turret ); + } + } + else + { + if( isdefined(best_target) ) + { + self SetTurretTargetEnt( best_target, target_offset, driver_turret ); + } + else + { + self ClearTurretTarget( driver_turret ); + } + } + wait 0.05; + } + else + { + wait 1; + } + } +} +update_forced_gunner_targets() +{ + if( IsDefined( self._forced_target_ent_array ) ) + { + self._forced_target_ent_array = remove_dead_from_array( self._forced_target_ent_array ); + } + else + { + turret_debug_message( "_vehicle_turret_ai couldn't update_forced_gunner_targets since none exist. " ); + } +} +set_forced_target( target_array ) +{ + if( IsDefined( target_array ) ) + { + forced_targets = []; + if( !IsArray( target_array ) ) + { + forced_targets[ forced_targets.size ] = target_array; + } + else + { + forced_targets = target_array; + } + if( !IsDefined( self._forced_target_ent_array ) || ( self._forced_target_ent_array.size == 0 ) ) + { + self._forced_target_ent_array = forced_targets; + } + else + { + for( i = 0; i < forced_targets.size; i++ ) + { + self._forced_target_ent_array = array_add( self._forced_target_ent_array, forced_targets[ i ] ); + } + } + } + else + { + if( IsDefined( self._forced_target_ent_array ) ) + { + turret_debug_message( "_vehicle_turret_ai tried to set_forced_target without any targets." ); + } + else + { + self._forced_target_ent_array = []; + } + } +} +clear_forced_target( target_to_remove ) +{ + if( IsDefined( self._forced_target_ent_array ) ) + { + if( IsDefined( target_to_remove ) ) + { + if( IsArray( target_to_remove ) ) + { + for( i = 0; i < target_to_remove.size; i++ ) + { + self._forced_target_ent_array = array_remove( self._forced_target_ent_array, target_to_remove[ i ] ); + } + } + else + { + self._forced_target_ent_array = array_remove( self._forced_target_ent_array, target_to_remove ); + } + } + else + { + self._forced_target_ent_array = undefined; + } + } + else + { + turret_debug_message( "_vehicle_turret_ai tried to clear_forced_target, but no targets existed. " ); + } +} +turret_debug_message( debug_string ) +{ +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_vehicle_utility.gsc b/BO1/PC/ZM/maps/_vehicle_utility.gsc new file mode 100644 index 0000000..7ffa7a1 Binary files /dev/null and b/BO1/PC/ZM/maps/_vehicle_utility.gsc differ diff --git a/BO1/PC/ZM/maps/_vehicledrive.gsc b/BO1/PC/ZM/maps/_vehicledrive.gsc new file mode 100644 index 0000000..3aaa3be Binary files /dev/null and b/BO1/PC/ZM/maps/_vehicledrive.gsc differ diff --git a/BO1/PC/ZM/maps/_vehiclenames.gsc b/BO1/PC/ZM/maps/_vehiclenames.gsc new file mode 100644 index 0000000..8ee7695 Binary files /dev/null and b/BO1/PC/ZM/maps/_vehiclenames.gsc differ diff --git a/BO1/PC/ZM/maps/_vehicletypes.gsc b/BO1/PC/ZM/maps/_vehicletypes.gsc new file mode 100644 index 0000000..d35c31c Binary files /dev/null and b/BO1/PC/ZM/maps/_vehicletypes.gsc differ diff --git a/BO1/PC/ZM/maps/_waw_destructible_opel_blitz.gsc b/BO1/PC/ZM/maps/_waw_destructible_opel_blitz.gsc new file mode 100644 index 0000000..f18e131 Binary files /dev/null and b/BO1/PC/ZM/maps/_waw_destructible_opel_blitz.gsc differ diff --git a/BO1/PC/ZM/maps/_waw_zombiemode_radio.gsc b/BO1/PC/ZM/maps/_waw_zombiemode_radio.gsc new file mode 100644 index 0000000..f7b8d71 Binary files /dev/null and b/BO1/PC/ZM/maps/_waw_zombiemode_radio.gsc differ diff --git a/BO1/PC/ZM/maps/_weaponobjects.gsc b/BO1/PC/ZM/maps/_weaponobjects.gsc new file mode 100644 index 0000000..aceff28 --- /dev/null +++ b/BO1/PC/ZM/maps/_weaponobjects.gsc @@ -0,0 +1,557 @@ + +#include common_scripts\utility; +#include maps\_utility; +init() +{ + level thread onPlayerConnect(); + level.claymoreFXid = LoadFX( "weapon/claymore/fx_claymore_laser" ); + level.watcherWeaponNames = []; + level.watcherWeaponNames = getWatcherWeapons(); + level.retrievableWeapons = []; + level.retrievableWeapons = getRetrievableWeapons(); + setup_retrievable_hint_strings(); + level.weaponobjectexplodethisframe = false; +} +onPlayerConnect() +{ + for(;;) + { + level waittill("connecting", player); + player.usedWeapons = false; + player.hits = 0; + player thread onPlayerSpawned(); + } +} +onPlayerSpawned() +{ + self endon("disconnect"); + for(;;) + { + self waittill("spawned_player"); + self create_base_watchers(); + self create_satchel_watcher(); + self create_ied_watcher(); + if ( GetDvar( #"zombiemode" ) == "1" ) + { + self create_claymore_watcher_zm(); + self create_ballistic_knife_watcher_zm( "knife_ballistic", "knife_ballistic_zm" ); + self create_ballistic_knife_watcher_zm( "knife_ballistic_upgraded", "knife_ballistic_upgraded_zm" ); + self create_ballistic_knife_watcher_zm( "knife_ballistic_bowie", "knife_ballistic_bowie_zm" ); + self create_ballistic_knife_watcher_zm( "knife_ballistic_bowie_upgraded", "knife_ballistic_bowie_upgraded_zm" ); + } + else + { + self create_ballistic_knife_watcher(); + } + self setup_retrievable_watcher(); + self thread watch_weapon_object_usage(); + } +} +setup_retrievable_hint_strings() +{ + create_retrievable_hint("hatchet", &"WEAPON_HATCHET_PICKUP"); + create_retrievable_hint("satchel_charge", &"WEAPON_SATCHEL_CHARGE_PICKUP"); + create_retrievable_hint("claymore", &"WEAPON_CLAYMORE_PICKUP"); +} +create_retrievable_hint(name, hint) +{ + retrieveHint = spawnStruct(); + retrieveHint.name = name; + retrieveHint.hint = hint; + level.retrieveHints[name] = retrieveHint; +} +create_base_watchers() +{ + for( i = 0; i < level.watcherWeaponNames.size; i++ ) + { + watcherName = GetSubStr( level.watcherWeaponNames[i], 0, level.watcherWeaponNames[i].size - 3 ); + self create_weapon_object_watcher( watcherName, level.watcherWeaponNames[i], self.team ); + } + for( i = 0; i < level.retrievableWeapons.size; i++ ) + { + watcherName = GetSubStr( level.retrievableWeapons[i], 0, level.retrievableWeapons[i].size - 3 ); + self create_weapon_object_watcher( watcherName, level.retrievableWeapons[i], self.team ); + } +} +create_claymore_watcher() +{ + watcher = self create_use_weapon_object_watcher( "claymore", "claymore_sp", self.team ); + watcher.watchForFire = true; + watcher.detonate = ::weapon_detonate; + watcher.onSpawnFX = ::on_spawn_claymore_fx; + watcher.activateSound = "wpn_claymore_alert"; + detectionConeAngle = weapons_get_dvar_int( "scr_weaponobject_coneangle" ); + watcher.detectionDot = cos( detectionConeAngle ); + watcher.detectionMinDist = weapons_get_dvar_int( "scr_weaponobject_mindist" ); + watcher.detectionGracePeriod = weapons_get_dvar( "scr_weaponobject_graceperiod" ); + watcher.detonateRadius = weapons_get_dvar_int( "scr_weaponobject_radius" ); +} +create_claymore_watcher_zm() +{ + watcher = self create_use_weapon_object_watcher( "claymore", "claymore_zm", self.team ); + watcher.pickup = level.pickup_claymores; + watcher.pickup_trigger_listener = level.pickup_claymores_trigger_listener; + watcher.skip_weapon_object_damage = true; +} +on_spawn_claymore_fx() +{ + self endon("death"); + while(1) + { + self waittill_not_moving(); + org = self getTagOrigin( "tag_fx" ); + ang = self getTagAngles( "tag_fx" ); + fx = spawnFx( level.claymoreFXid, org, anglesToForward( ang ), anglesToUp( ang ) ); + triggerfx( fx ); + self thread clear_fx_on_death( fx ); + originalOrigin = self.origin; + while(1) + { + wait .25; + if ( self.origin != originalOrigin ) + break; + } + fx delete(); + } +} +clear_fx_on_death( fx ) +{ + fx endon("death"); + self waittill("death"); + fx delete(); +} +create_satchel_watcher() +{ + watcher = self create_use_weapon_object_watcher( "satchel_charge", "satchel_charge_sp", self.team ); + watcher.altDetonate = true; + watcher.watchForFire = true; + watcher.disarmable = true; + watcher.headIcon = false; + watcher.detonate = ::weapon_detonate; + watcher.altWeapon = "satchel_charge_detonator_sp"; +} +create_ied_watcher() +{ + watcher = self create_use_weapon_object_watcher( "ied", "ied_sp", self.team ); + watcher.altDetonate = true; + watcher.watchForFire = true; + watcher.disarmable = false; + watcher.headIcon = false; + watcher.detonate = ::weapon_detonate; + watcher.altWeapon = "satchel_charge_detonator_sp"; +} +create_ballistic_knife_watcher() +{ + watcher = self create_use_weapon_object_watcher( "knife_ballistic", "knife_ballistic_sp", self.team ); + watcher.onSpawn = maps\_ballistic_knife::on_spawn; + watcher.onSpawnRetrieveTriggers = maps\_ballistic_knife::on_spawn_retrieve_trigger; + watcher.storeDifferentObject = true; +} +create_ballistic_knife_watcher_zm( name, weapon ) +{ + watcher = self create_use_weapon_object_watcher( name, weapon, self.team ); + watcher.onSpawn = maps\_ballistic_knife::on_spawn; + watcher.onSpawnRetrieveTriggers = maps\_ballistic_knife::on_spawn_retrieve_trigger; + watcher.storeDifferentObject = true; + self notify( "zmb_lost_knife" ); +} +create_use_weapon_object_watcher( name, weapon, ownerTeam ) +{ + weaponObjectWatcher = create_weapon_object_watcher( name, weapon, ownerTeam ); + return weaponObjectWatcher; +} +weapon_detonate(attacker) +{ + if ( IsDefined( attacker ) ) + { + self Detonate( attacker ); + } + else + { + self Detonate(); + } +} +create_weapon_object_watcher( name, weapon, ownerTeam ) +{ + if ( !IsDefined(self.weaponObjectWatcherArray) ) + { + self.weaponObjectWatcherArray = []; + } + weaponObjectWatcher = get_weapon_object_watcher( name ); + if ( !IsDefined( weaponObjectWatcher ) ) + { + weaponObjectWatcher = SpawnStruct(); + self.weaponObjectWatcherArray[self.weaponObjectWatcherArray.size] = weaponObjectWatcher; + } + if ( GetDvar( #"scr_deleteexplosivesonspawn") == "" ) + setdvar("scr_deleteexplosivesonspawn", "1"); + if ( GetDvarInt( #"scr_deleteexplosivesonspawn") == 1 ) + { + weaponObjectWatcher delete_weapon_object_array(); + } + if ( !IsDefined( weaponObjectWatcher.objectArray ) ) + weaponObjectWatcher.objectArray = []; + weaponObjectWatcher.name = name; + weaponObjectWatcher.ownerTeam = ownerTeam; + weaponObjectWatcher.type = "use"; + weaponObjectWatcher.weapon = weapon; + weaponObjectWatcher.watchForFire = false; + weaponObjectWatcher.disarmable = false; + weaponObjectWatcher.altDetonate = false; + weaponObjectWatcher.detectable = true; + weaponObjectWatcher.headIcon = true; + weaponObjectWatcher.activateSound = undefined; + weaponObjectWatcher.altWeapon = undefined; + weaponObjectWatcher.onSpawn = undefined; + weaponObjectWatcher.onSpawnFX = undefined; + weaponObjectWatcher.onSpawnRetrieveTriggers = undefined; + weaponObjectWatcher.onDetonated = undefined; + weaponObjectWatcher.detonate = undefined; + return weaponObjectWatcher; +} +setup_retrievable_watcher() +{ + for( i = 0; i < level.retrievableWeapons.size; i++ ) + { + watcher = get_weapon_object_watcher_by_weapon( level.retrievableWeapons[i] ); + if( !isDefined( watcher.onSpawnRetrieveTriggers ) ) + watcher.onSpawnRetrieveTriggers = ::on_spawn_retrievable_weapon_object; + if( !isDefined( watcher.pickUp ) ) + watcher.pickUp = ::pick_up; + } +} +watch_weapon_object_usage() +{ + self endon( "death" ); + self endon( "disconnect" ); + if ( !IsDefined(self.weaponObjectWatcherArray) ) + { + self.weaponObjectWatcherArray = []; + } + self thread watch_weapon_object_spawn(); + self thread watch_weapon_projectile_object_spawn(); + self thread watch_weapon_object_detonation(); + self thread watch_weapon_object_alt_detonation(); + self thread watch_weapon_object_alt_detonate(); + self thread delete_weapon_objects_on_disconnect(); +} +watch_weapon_object_spawn() +{ + self endon( "disconnect" ); + self endon( "death" ); + while(1) + { + self waittill( "grenade_fire", weapon, weapname ); + watcher = get_weapon_object_watcher_by_weapon( weapname ); + if ( IsDefined(watcher) ) + { + self add_weapon_object(watcher, weapon); + } + } +} +watch_weapon_projectile_object_spawn() +{ + self endon( "disconnect" ); + self endon( "death" ); + while(1) + { + self waittill( "missile_fire", weapon, weapname ); + watcher = get_weapon_object_watcher_by_weapon( weapname ); + if ( IsDefined(watcher) ) + { + self add_weapon_object(watcher, weapon); + } + } +} +watch_weapon_object_detonation() +{ + self endon("death"); + self endon("disconnect"); + while(1) + { + self waittill( "detonate" ); + weap = self GetCurrentWeapon(); + watcher = get_weapon_object_watcher_by_weapon( weap ); + if ( IsDefined( watcher ) ) + { + watcher detonate_weapon_object_array(); + } + } +} +watch_weapon_object_alt_detonation() +{ + self endon("death"); + self endon("disconnect"); + self endon("no_alt_detonate"); + while(1) + { + self waittill( "alt_detonate" ); + for ( watcher = 0; watcher < self.weaponObjectWatcherArray.size; watcher++ ) + { + if ( self.weaponObjectWatcherArray[watcher].altDetonate ) + { + self.weaponObjectWatcherArray[watcher] detonate_weapon_object_array(); + } + } + } +} +watch_weapon_object_alt_detonate() +{ + self endon("death"); + self endon( "disconnect" ); + self endon( "detonated" ); + level endon( "game_ended" ); + self endon("no_alt_detonate"); + for ( ;; ) + { + self waittill( "action_notify_use_doubletap" ); + self notify ( "alt_detonate" ); + } +} +delete_weapon_objects_on_disconnect() +{ + self endon("death"); + self waittill("disconnect"); + if ( !IsDefined(self.weaponObjectWatcherArray) ) + return; + watchers = []; + for ( watcher = 0; watcher < self.weaponObjectWatcherArray.size; watcher++ ) + { + weaponObjectWatcher = SpawnStruct(); + watchers[watchers.size] = weaponObjectWatcher; + weaponObjectWatcher.objectArray = []; + if ( IsDefined( self.weaponObjectWatcherArray[watcher].objectArray ) ) + { + weaponObjectWatcher.objectArray = self.weaponObjectWatcherArray[watcher].objectArray; + } + } + wait .05; + for ( watcher = 0; watcher < watchers.size; watcher++ ) + { + watchers[watcher] delete_weapon_object_array(); + } +} +on_spawn_retrievable_weapon_object( watcher, player ) +{ + self endon( "death" ); + self SetOwner( player ); + self.owner = player; + self waittill_not_moving(); + self.pickUpTrigger = Spawn( "trigger_radius_use", self.origin, 0, 64, 64 ); + self.pickUpTrigger SetCursorHint( "HINT_NOICON" ); + if( isDefined(level.retrieveHints[watcher.name]) ) + self.pickUpTrigger SetHintString( level.retrieveHints[watcher.name].hint ); + else + self.pickUpTrigger SetHintString( &"WEAPON_GENERIC_PICKUP" ); + player ClientClaimTrigger( self.pickUpTrigger ); + self.pickupTrigger enablelinkto(); + self.pickupTrigger linkto( self ); + thread watch_use_trigger( self.pickUpTrigger, watcher.pickUp ); + if ( isDefined( watcher.pickup_trigger_listener ) ) + { + self thread [[watcher.pickup_trigger_listener]]( self.pickUpTrigger, player ); + } + self thread watch_shutdown( player ); +} +weapons_get_dvar_int( dvar, def ) +{ + return int( weapons_get_dvar( dvar, def ) ); +} +weapons_get_dvar( dvar, def ) +{ + if ( getdvar( dvar ) != "" ) + { + return GetDvarFloat( dvar ); + } + else + { + SetDvar( dvar, def ); + return def; + } +} +get_weapon_object_watcher( name ) +{ + if ( !IsDefined(self.weaponObjectWatcherArray) ) + { + return undefined; + } + for ( watcher = 0; watcher < self.weaponObjectWatcherArray.size; watcher++ ) + { + if ( self.weaponObjectWatcherArray[watcher].name == name ) + { + return self.weaponObjectWatcherArray[watcher]; + } + } + return undefined; +} +get_weapon_object_watcher_by_weapon( weapon ) +{ + if ( !IsDefined(self.weaponObjectWatcherArray) ) + { + return undefined; + } + for ( watcher = 0; watcher < self.weaponObjectWatcherArray.size; watcher++ ) + { + if ( IsDefined(self.weaponObjectWatcherArray[watcher].weapon) && self.weaponObjectWatcherArray[watcher].weapon == weapon ) + { + return self.weaponObjectWatcherArray[watcher]; + } + if ( IsDefined(self.weaponObjectWatcherArray[watcher].weapon) && IsDefined(self.weaponObjectWatcherArray[watcher].altWeapon) && self.weaponObjectWatcherArray[watcher].altWeapon == weapon ) + { + return self.weaponObjectWatcherArray[watcher]; + } + } + return undefined; +} +pick_up() +{ + player = self.owner; + self destroy_ent(); + clip_ammo = player GetWeaponAmmoClip( self.name ); + clip_max_ammo = WeaponClipSize( self.name ); + if( clip_ammo < clip_max_ammo ) + { + clip_ammo++; + } + player SetWeaponAmmoClip( self.name, clip_ammo ); +} +destroy_ent() +{ + self delete(); +} +add_weapon_object(watcher, weapon) +{ + watcher.objectArray[watcher.objectArray.size] = weapon; + weapon.owner = self; + weapon.detonated = false; + weapon.name = watcher.weapon; + if ( !is_true( watcher.skip_weapon_object_damage ) ) + { + weapon thread weapon_object_damage(watcher); + } + weapon.owner notify ("weapon_object_placed",weapon); + if ( IsDefined(watcher.onSpawn) ) + weapon thread [[watcher.onSpawn]](watcher, self); + if ( IsDefined(watcher.onSpawnFX) ) + weapon thread [[watcher.onSpawnFX]](); + if( isDefined(watcher.onSpawnRetrieveTriggers) ) + weapon thread [[watcher.onSpawnRetrieveTriggers]](watcher, self); + RefreshHudAmmoCounter(); +} +detonate_weapon_object_array() +{ + if ( isDefined( self.disableDetonation ) && self.disableDetonation ) + return; + if ( IsDefined(self.objectArray) ) + { + for ( i = 0; i < self.objectArray.size; i++ ) + { + if ( isdefined(self.objectArray[i]) ) + self thread wait_and_detonate( self.objectArray[i], 0.1 ); + } + } + self.objectArray = []; +} +delete_weapon_object_array() +{ + if ( IsDefined(self.objectArray) ) + { + for ( i = 0; i < self.objectArray.size; i++ ) + { + if ( isdefined(self.objectArray[i]) ) + self.objectArray[i] delete(); + } + } + self.objectArray = []; +} +watch_use_trigger( trigger, callback ) +{ + self endon( "delete" ); + while ( true ) + { + trigger waittill( "trigger", player ); + if ( !IsAlive( player ) ) + continue; + if ( !player IsOnGround() ) + continue; + if ( IsDefined( trigger.triggerTeam ) && ( player.pers["team"] != trigger.triggerTeam ) ) + continue; + if ( IsDefined( trigger.claimedBy ) && ( player != trigger.claimedBy ) ) + continue; + if ( player UseButtonPressed() && !player.throwingGrenade && !player MeleeButtonPressed() ) + self thread [[callback]](); + } +} +watch_shutdown( player ) +{ + player endon( "disconnect" ); + pickUpTrigger = self.pickUpTrigger; + self waittill( "death" ); + pickUpTrigger delete(); +} +weapon_object_damage( watcher ) +{ + self endon( "death" ); + self setcandamage(true); + self.health = 100000; + attacker = undefined; + while(1) + { + self waittill ( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags ); + if ( !isDefined(self.allowAIToAttack) ) + { + if ( !IsPlayer(attacker) ) + continue; + } + if ( damage < 5 ) + { + if ( isdefined( watcher.specialGrenadeDisabledTime ) ) + { + self thread disabled_by_special_grenade( watcher.specialGrenadeDisabledTime ); + } + continue; + } + break; + } + if ( level.weaponobjectexplodethisframe ) + wait .1 + randomfloat(.4); + else + wait .05; + if (!IsDefined(self)) + return; + level.weaponobjectexplodethisframe = true; + thread reset_weapon_object_explode_this_frame(); + if ( IsDefined( type ) && (IsSubStr( type, "MOD_GRENADE_SPLASH" ) || IsSubStr( type, "MOD_GRENADE" ) || IsSubStr( type, "MOD_EXPLOSIVE" )) ) + self.wasChained = true; + if ( IsDefined( iDFlags ) && (iDFlags & level.iDFLAGS_PENETRATION) ) + self.wasDamagedFromBulletPenetration = true; + self.wasDamaged = true; + watcher thread wait_and_detonate( self, 0.0, attacker ); +} +wait_and_detonate( object, delay, attacker ) +{ + object endon("death"); + if ( delay ) + wait ( delay ); + if ( object.detonated ) + return; + if( !IsDefined(self.detonate) ) + return; + object.detonated = true; + object notify("detonated"); + object [[self.detonate]](attacker); +} +disabled_by_special_grenade( disableTime ) +{ + self notify ( "damagedBySpecial" ); + self endon ( "damagedBySpecial" ); + self endon ( "death" ); + self.disabledBySpecial = true; + wait ( disableTime ); + self.disabledBySpecial = false; +} +reset_weapon_object_explode_this_frame() +{ + wait .05; + level.weaponobjectexplodethisframe = false; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_weapons.gsc b/BO1/PC/ZM/maps/_weapons.gsc new file mode 100644 index 0000000..d5efaf2 Binary files /dev/null and b/BO1/PC/ZM/maps/_weapons.gsc differ diff --git a/BO1/PC/ZM/maps/_weather.gsc b/BO1/PC/ZM/maps/_weather.gsc new file mode 100644 index 0000000..aaf6f31 --- /dev/null +++ b/BO1/PC/ZM/maps/_weather.gsc @@ -0,0 +1,422 @@ + +#include maps\_utility; +#include common_scripts\utility; +rainHard(transition) +{ + println ("Rain becomes Hard over " + transition + " seconds"); + level notify ("rain_change", "hard", transition); + level thread rainEffectChange(10, transition); + wait (transition*0.5); + level.ambient_modifier["rain"] = ""; + wait (transition*0.5); +} +rainMedium(transition) +{ + println ("Rain becomes Medium over " + transition + " seconds"); + level notify ("rain_change", "medium", transition); + level thread rainEffectChange(5, transition); + wait (transition*0.5); + level.ambient_modifier["rain"] = "med"; + wait (transition*0.5); +} +rainLight(transition) +{ + println ("Rain becomes Light over " + transition + " seconds"); + level notify ("rain_change", "light", transition); + level thread rainEffectChange(1, transition); + wait (transition*0.5); + level.ambient_modifier["rain"] = "light"; + wait (transition*0.5); +} +rainNone(transition) +{ + println ("Rain fades out over " + transition + " seconds"); + level notify ("rain_change", "none", transition); + level thread rainEffectChange(0, transition); + wait (transition*0.5); + level.ambient_modifier["rain"] = "norain"; + wait (transition*0.5); +} +rainInit(lvl) +{ + if (lvl == "none") + { + level.rainLevel = 0; + level._effect["rain_drops"] = level._effect["rain_" + level.rainLevel]; + rainNone(0.1); + } + else if (lvl == "light") + { + level.rainLevel = 1; + level._effect["rain_drops"] = level._effect["rain_" + level.rainLevel]; + rainLight(0.1); + } + if (lvl == "medium") + { + level.rainLevel = 5; + level._effect["rain_drops"] = level._effect["rain_" + level.rainLevel]; + rainMedium(0.1); + } + if (lvl == "hard") + { + level.rainLevel = 10; + level._effect["rain_drops"] = level._effect["rain_" + level.rainLevel]; + rainHard(0.1); + } + else + { + level.rainLevel = 10; + level._effect["rain_drops"] = level._effect["rain_" + level.rainLevel]; + rainHard(0.1); + } +} +lightning(normal, flash) +{ + if( !IsDefined( level.disableLightning ) ) + { + level.disableLightning = false; + } + [[normal]](); + waittillframeend; + for (;;) + { + lightningThink(normal, flash); + } +} +rainEffectChange(change, transition) +{ + level notify ("rain_level_change"); + level endon ("rain_level_change"); + if (level.rainLevel > change) + { + dif = level.rainLevel - change; + transition /= dif; + for (i=0;i 0) + { + wait (timer); + } + if( level.rainLevel != 0 && !level.disableLightning ) + { + lightningStrike( normal, flash ); + } + level.nextLightning = gettime() + ((rainlevelwait() + rainlevelRandomwait())*1000); + } +} +lightningStrike( normalfunc, flashfunc ) +{ + if( !IsDefined( level.pauseLightning ) ) + { + level.pauseLightning = false; + } + if( level.pauseLightning ) + { + return; + } + flash[0] = "quick"; + flash[1] = "double"; + flash[2] = "triple"; + flashType = RandomInt( flash.size ); + thread thunder( flash[flashType] ); + lit_num = 0; + if( IsDefined( level.lightningExploderIndex ) ) + { + if( level.lightningExploder.size > 1 ) + { + while( lit_num == level.lightningExploderIndex ) + { + lit_num = RandomInt( level.lightningExploder.size ); + } + } + level.lightningExploderIndex = lit_num; + } + switch( flash[flashType] ) + { + case "quick": + { + lightningflash( normalfunc, flashfunc ); + break; + } + case "double": + { + lightningflash( normalfunc, flashfunc ); + wait( 0.05 ); + lightningflash( normalfunc, flashfunc ); + break; + } + case "triple": + { + lightningflash( normalfunc, flashfunc ); + wait( 0.05 ); + lightningflash( normalfunc, flashfunc ); + wait( 0.5 ); + lightningflash( normalfunc, flashfunc ); + break; + } + } +} +lightningflash( normalfunc, flashfunc ) +{ + if (isdefined (level.lightningExploderIndex)) + { + exploder(level.lightningExploder[level.lightningExploderIndex]); + } + [[flashfunc]](); + wait RandomFloatRange( 0.05, 0.1 ); + [[normalfunc]](); +} +thunder( flashType ) +{ + if (level.rainLevel == 0) + { + wait (6 + randomfloat(2)); + } + else if (level.rainLevel == 1) + { + wait (5 + randomfloat(1.8)); + } + else if (level.rainLevel == 2) + { + wait (4.5 + randomfloat(1.6)); + } + else if (level.rainLevel == 3) + { + wait (4 + randomfloat(1.6)); + } + else if (level.rainLevel == 4) + { + wait (3.5 + randomfloat(1.5)); + } + else if (level.rainLevel == 5) + { + wait (3 + randomfloat(1.5)); + } + else if (level.rainLevel == 6) + { + wait (2.5 + randomfloat(1.2)); + } + else if (level.rainLevel == 7) + { + wait (2 + randomfloat(0.75)); + } + else if (level.rainLevel == 8) + { + wait (1.25 + randomfloat(0.5)); + } + else if (level.rainLevel == 9) + { + wait (1); + } + else if (level.rainLevel == 10) + { + wait (0.75); + } + thunderDistant = "thunder_farL"; + thunderClose = "thunder_closeL"; + if( IsDefined( level.thunder_distant_sound ) ) + { + thunderDistant = level.thunder_distant_sound; + } + if( IsDefined( level.thunder_strike_sound ) ) + { + thunderClose = level.thunder_close_sound; + } + if( IsDefined( level.thunderSoundEmitter ) ) + { + emitter_thunder( thunderDistant, thunderClose, flashType ); + } + else + { + array_thread( get_players(), ::player_thunder, thunderDistant, thunderClose, flashType ); + } +} +emitter_thunder( thunderDistant, thunderClose, flashType ) +{ + ent = Spawn( "script_origin", level.thunderSoundEmitter.origin ); + ent thread thunder_playsound( thunderDistant, thunderClose, flashType ); +} +player_thunder( thunderDistant, thunderClose, flashType ) +{ + ent = Spawn( "script_origin", ( 0, 0, 0 ) ); + ent.origin = self.origin + ( 0, 0, 60 ); + ent LinkTo( self ); + ent thread thunder_playsound( thunderDistant, thunderClose, flashType ); +} +thunder_playsound( thunderDistant, thunderClose, flashType ) +{ + if( level.rainlevel <= 7 ) + { + self PlaySound( thunderDistant, "sounddone" ); + } + else + { + sound = thunderClose; + doRumble = true; + if( IsDefined( flashType ) && flashType == "quick" ) + { + sound = thunderDistant; + doRumble = false; + } + else if( IsDefined( flashType ) && flashType == "triple" ) + { + sound = thunderClose; + doRumble = true; + } + else + { + if( RandomInt( 100 ) < 40 ) + { + sound = thunderDistant; + doRumble = false; + } + } + self PlaySound( sound, "sounddone" ); + if( doRumble ) + { + array_thread( get_players(), ::thunder_rumble ); + } + } + self waittill( "sounddone" ); + self Delete(); +} +thunder_rumble() +{ + self endon( "death" ); + self endon( "disconnect" ); + wait( 0.1 ); + self notify( "thunder_rumble" ); + self endon( "thunder_rumble" ); + duration = 0.5; + stopTime = GetTime() + ( duration * 1000 ); + while( GetTime() <= stopTime ) + { + self PlayRumbleOnEntity( "damage_heavy" ); + wait( 0.05 ); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode.gsc b/BO1/PC/ZM/maps/_zombiemode.gsc new file mode 100644 index 0000000..5959a53 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode.gsc @@ -0,0 +1,4682 @@ +#include maps\_anim; +#include maps\_utility; +#include common_scripts\utility; +#include maps\_music; +#include maps\_zombiemode_utility; +#include maps\_busing; +#using_animtree( "generic_human" ); +main() +{ + level.player_too_many_weapons_monitor = true; + level.player_too_many_weapons_monitor_func = ::player_too_many_weapons_monitor; + level._dontInitNotifyMessage = 1; + init_additionalprimaryweapon_machine_locations(); + level thread maps\_zombiemode_ffotd::main_start(); + level.zombiemode = true; + level.reviveFeature = false; + level.contextualMeleeFeature = false; + level.swimmingFeature = false; + level.calc_closest_player_using_paths = true; + level.zombie_melee_in_water = true; + level.put_timed_out_zombies_back_in_queue = true; + level.use_alternate_poi_positioning = true; + level.zombies_timeout_spawn = 0; + level.zombies_timeout_playspace = 0; + level.zombies_timeout_undamaged = 0; + level.zombie_player_killed_count = 0; + level.zombie_trap_killed_count = 0; + level.zombie_pathing_failed = 0; + level.zombie_breadcrumb_failed = 0; + level.zombie_visionset = "zombie_neutral"; + if(GetDvar("anim_intro") == "1") + { + level.zombie_anim_intro = 1; + } + else + { + level.zombie_anim_intro = 0; + } + precache_shaders(); + precache_models(); + PrecacheItem( "frag_grenade_zm" ); + PrecacheItem( "claymore_zm" ); + level.skill_override = 1; + maps\_gameskill::setSkill(undefined,level.skill_override); + level.disable_player_damage_knockback = true; + level._ZOMBIE_GIB_PIECE_INDEX_ALL = 0; + level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM = 1; + level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM = 2; + level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG = 3; + level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG = 4; + level._ZOMBIE_GIB_PIECE_INDEX_HEAD = 5; + level._ZOMBIE_GIB_PIECE_INDEX_GUTS = 6; + init_dvars(); + init_mutators(); + init_strings(); + init_levelvars(); + init_animscripts(); + init_sounds(); + init_shellshocks(); + init_flags(); + init_client_flags(); + register_offhand_weapons_for_level_defaults(); + if ( !isdefined( level.zombie_ai_limit ) ) + { + level.zombie_ai_limit = 24; + SetAILimit( level.zombie_ai_limit ); + } + init_fx(); + maps\_zombiemode_load::main(); + maps\_zombiemode_zone_manager::init(); + maps\_zombiemode_audio::audio_init(); + maps\_zombiemode_claymore::init(); + maps\_zombiemode_weapons::init(); + maps\_zombiemode_equipment::init(); + maps\_zombiemode_blockers::init(); + maps\_zombiemode_spawner::init(); + maps\_zombiemode_powerups::init(); + maps\_zombiemode_perks::init(); + maps\_zombiemode_user::init(); + maps\_zombiemode_weap_cymbal_monkey::init(); + maps\_zombiemode_weap_freezegun::init(); + maps\_zombiemode_weap_tesla::init(); + maps\_zombiemode_weap_thundergun::init(); + maps\_zombiemode_weap_crossbow::init(); + maps\_zombiemode_bowie::bowie_init(); + maps\_zombiemode_traps::init(); + maps\_zombiemode_weapon_box::init(); + init_function_overrides(); + level thread last_stand_pistol_rank_init(); + level thread [[level.Player_Spawn_func]](); + level thread onPlayerConnect(); + level thread post_all_players_connected(); + init_utility(); + maps\_utility::registerClientSys("zombify"); + init_anims(); + if( isDefined( level.custom_ai_type ) ) + { + for( i = 0; i < level.custom_ai_type.size; i++ ) + { + [[ level.custom_ai_type[i] ]](); + } + } + if( level.mutators[ "mutator_friendlyFire" ] ) + { + SetDvar( "friendlyfire_enabled", "1" ); + } + initZombieLeaderboardData(); + initializeStatTracking(); + if ( GetPlayers().size <= 1 ) + { + incrementCounter( "global_solo_games", 1 ); + } + else if( level.systemLink ) + { + incrementCounter( "global_systemlink_games", 1 ); + } + else if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size ) + { + incrementCounter( "global_splitscreen_games", 1 ); + } + else + { + incrementCounter( "global_coop_games", 1 ); + } + if( IsSplitScreen() ) + { + set_splitscreen_fog( 350, 2986.33, 10000, -480, 0.805, 0.715, 0.61, 0.0, 10000 ); + } + level thread maps\_zombiemode_ffotd::main_end(); +} +post_all_players_connected() +{ + flag_wait( "all_players_connected" ); + println( "sessions: mapname=", level.script, " gametype zom isserver 1 player_count=", get_players().size ); + maps\_zombiemode_score::init(); + level difficulty_init(); + level thread clear_mature_blood(); + level thread end_game(); + if(!level.zombie_anim_intro) + { + level thread round_start(); + } + level thread players_playing(); + if ( IsDefined( level.crawlers_enabled ) && level.crawlers_enabled == 1 ) + { + level thread crawler_round_tracker(); + } + level thread track_players_ammo_count(); + DisableGrenadeSuicide(); + level.startInvulnerableTime = GetDvarInt( #"player_deathInvulnerableTime" ); + if(!IsDefined(level.music_override) ) + { + level.music_override = false; + } +} +zombiemode_melee_miss() +{ + if( isDefined( self.enemy.curr_pay_turret ) ) + { + self.enemy doDamage( GetDvarInt( #"ai_meleeDamage" ), self.origin, self, undefined, "melee", "none" ); + } +} +init_additionalprimaryweapon_machine_locations() +{ + switch ( Tolower( GetDvar( #"mapname" ) ) ) + { + case "zombie_theater": + level.zombie_additionalprimaryweapon_machine_origin = (1172.4, -359.7, 320); + level.zombie_additionalprimaryweapon_machine_angles = (0, 90, 0); + level.zombie_additionalprimaryweapon_machine_clip_origin = (1160, -360, 448); + level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0); + break; + case "zombie_pentagon": + level.zombie_additionalprimaryweapon_machine_origin = (-1081.4, 1496.9, -512); + level.zombie_additionalprimaryweapon_machine_angles = (0, 162.2, 0); + level.zombie_additionalprimaryweapon_machine_clip_origin = (-1084, 1489, -448); + level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 341.4, 0); + break; + case "zombie_cosmodrome": + level.zombie_additionalprimaryweapon_machine_origin = (420.8, 1359.1, 55); + level.zombie_additionalprimaryweapon_machine_angles = (0, 270, 0); + level.zombie_additionalprimaryweapon_machine_clip_origin = (436, 1359, 177); + level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0); + level.zombie_additionalprimaryweapon_machine_monkey_angles = (0, 0, 0); + level.zombie_additionalprimaryweapon_machine_monkey_origins = []; + level.zombie_additionalprimaryweapon_machine_monkey_origins[0] = (398.8, 1398.6, 60); + level.zombie_additionalprimaryweapon_machine_monkey_origins[1] = (380.8, 1358.6, 60); + level.zombie_additionalprimaryweapon_machine_monkey_origins[2] = (398.8, 1318.6, 60); + break; + case "zombie_coast": + level.zombie_additionalprimaryweapon_machine_origin = (2424.4, -2884.3, 314); + level.zombie_additionalprimaryweapon_machine_angles = (0, 231.6, 0); + level.zombie_additionalprimaryweapon_machine_clip_origin = (2435, -2893, 439); + level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 322.2, 0); + break; + case "zombie_temple": + level.zombie_additionalprimaryweapon_machine_origin = (-1352.9, -1437.2, -485); + level.zombie_additionalprimaryweapon_machine_angles = (0, 297.8, 0); + level.zombie_additionalprimaryweapon_machine_clip_origin = (-1342, -1431, -361); + level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 28.8, 0); + break; + case "zombie_moon": + level.zombie_additionalprimaryweapon_machine_origin = (1480.8, 3450, -65); + level.zombie_additionalprimaryweapon_machine_angles = (0, 180, 0); + break; + case "zombie_cod5_prototype": + level.zombie_additionalprimaryweapon_machine_origin = (-160, -528, 1); + level.zombie_additionalprimaryweapon_machine_angles = (0, 0, 0); + level.zombie_additionalprimaryweapon_machine_clip_origin = (-162, -517, 17); + level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0); + break; + case "zombie_cod5_asylum": + level.zombie_additionalprimaryweapon_machine_origin = (-91, 540, 64); + level.zombie_additionalprimaryweapon_machine_angles = (0, 90, 0); + level.zombie_additionalprimaryweapon_machine_clip_origin = (-103, 540, 92); + level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0); + break; + case "zombie_cod5_sumpf": + level.zombie_additionalprimaryweapon_machine_origin = (9565, 327, -529); + level.zombie_additionalprimaryweapon_machine_angles = (0, 90, 0); + level.zombie_additionalprimaryweapon_machine_clip_origin = (9555, 327, -402); + level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0); + break; + case "zombie_cod5_factory": + level.zombie_additionalprimaryweapon_machine_origin = (-1089, -1366, 67); + level.zombie_additionalprimaryweapon_machine_angles = (0, 90, 0); + level.zombie_additionalprimaryweapon_machine_clip_origin = (-1100, -1365, 70); + level.zombie_additionalprimaryweapon_machine_clip_angles = (0, 0, 0); + break; + } +} +track_players_ammo_count() +{ + self endon("disconnect"); + self endon("death"); + wait(5); + while(1) + { + players = get_players(); + for(i=0;i 5) + { + continue; + } + if ( players[i] maps\_laststand::player_is_in_laststand() ) + { + continue; + } + else if (players[i] GetAmmoCount( weap ) < 5 && players[i] GetAmmoCount( weap ) > 0) + { + if (players[i].player_ammo_low != 1 ) + { + players[i].player_ammo_low = 1; + players[i] maps\_zombiemode_audio::create_and_play_dialog( "general", "ammo_low" ); + players[i] thread ammo_dialog_timer(); + } + } + else if (players[i] GetAmmoCount( weap ) == 0) + { + if(!isDefined(weap) || weap == "none") + { + continue; + } + wait(2); + if( !isdefined( players[i] ) ) + { + return; + } + if( players[i] GetAmmoCount( weap ) != 0 ) + { + continue; + } + if( players[i].player_ammo_out != 1 ) + { + players[i].player_ammo_out = 1; + players[i] maps\_zombiemode_audio::create_and_play_dialog( "general", "ammo_out" ); + players[i] thread ammoout_dialog_timer(); + } + } + else + { + continue; + } + } + wait(.5); + } +} +ammo_dialog_timer() +{ + self endon("disconnect"); + self endon("death"); + wait(20); + self.player_ammo_low = 0; +} +ammoout_dialog_timer() +{ + self endon("disconnect"); + self endon("death"); + wait(20); + self.player_ammo_out = 0; +} +spawn_vo() +{ + wait(1); + players = getplayers(); + if(players.size > 1) + { + player = random(players); + index = maps\_zombiemode_weapons::get_player_index(player); + player thread spawn_vo_player(index,players.size); + } +} +spawn_vo_player(index,num) +{ + sound = "plr_" + index + "_vox_" + num +"play"; + self playsound(sound, "sound_done"); + self waittill("sound_done"); +} +testing_spawner_bug() +{ + wait( 0.1 ); + level.round_number = 7; + spawners = []; + spawners[0] = GetEnt( "testy", "targetname" ); + while( 1 ) + { + wait( 1 ); + level.enemy_spawns = spawners; + } +} +precache_shaders() +{ + PrecacheShader( "hud_chalk_1" ); + PrecacheShader( "hud_chalk_2" ); + PrecacheShader( "hud_chalk_3" ); + PrecacheShader( "hud_chalk_4" ); + PrecacheShader( "hud_chalk_5" ); + PrecacheShader( "zom_icon_community_pot" ); + PrecacheShader( "zom_icon_community_pot_strip" ); + precacheshader("zom_icon_player_life"); +} +precache_models() +{ + precachemodel( "char_ger_zombieeye" ); + precachemodel( "p_zom_win_bars_01_vert04_bend_180" ); + precachemodel( "p_zom_win_bars_01_vert01_bend_180" ); + precachemodel( "p_zom_win_bars_01_vert04_bend" ); + precachemodel( "p_zom_win_bars_01_vert01_bend" ); + PreCacheModel( "p_zom_win_cell_bars_01_vert04_bent" ); + precachemodel( "p_zom_win_cell_bars_01_vert01_bent" ); + PrecacheModel( "tag_origin" ); + PrecacheModel( "p_zom_counter_0" ); + PrecacheModel( "p_zom_counter_1" ); + PrecacheModel( "p_zom_counter_2" ); + PrecacheModel( "p_zom_counter_3" ); + PrecacheModel( "p_zom_counter_4" ); + PrecacheModel( "p_zom_counter_5" ); + PrecacheModel( "p_zom_counter_6" ); + PrecacheModel( "p_zom_counter_7" ); + PrecacheModel( "p_zom_counter_8" ); + PrecacheModel( "p_zom_counter_9" ); + precachemodel("zombie_revive"); + PrecacheModel( "zombie_z_money_icon" ); +} +init_shellshocks() +{ + level.player_killed_shellshock = "zombie_death"; + PrecacheShellshock( level.player_killed_shellshock ); +} +init_strings() +{ + PrecacheString( &"ZOMBIE_WEAPONCOSTAMMO" ); + PrecacheString( &"ZOMBIE_ROUND" ); + PrecacheString( &"SCRIPT_PLUS" ); + PrecacheString( &"ZOMBIE_GAME_OVER" ); + PrecacheString( &"ZOMBIE_SURVIVED_ROUND" ); + PrecacheString( &"ZOMBIE_SURVIVED_ROUNDS" ); + PrecacheString( &"ZOMBIE_SURVIVED_NOMANS" ); + PrecacheString( &"ZOMBIE_EXTRA_LIFE" ); + add_zombie_hint( "undefined", &"ZOMBIE_UNDEFINED" ); + add_zombie_hint( "default_treasure_chest_950", &"ZOMBIE_RANDOM_WEAPON_950" ); + add_zombie_hint( "default_buy_barrier_piece_10", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_10" ); + add_zombie_hint( "default_buy_barrier_piece_20", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_20" ); + add_zombie_hint( "default_buy_barrier_piece_50", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_50" ); + add_zombie_hint( "default_buy_barrier_piece_100", &"ZOMBIE_BUTTON_BUY_BACK_BARRIER_100" ); + add_zombie_hint( "default_reward_barrier_piece", &"ZOMBIE_BUTTON_REWARD_BARRIER" ); + add_zombie_hint( "default_reward_barrier_piece_10", &"ZOMBIE_BUTTON_REWARD_BARRIER_10" ); + add_zombie_hint( "default_reward_barrier_piece_20", &"ZOMBIE_BUTTON_REWARD_BARRIER_20" ); + add_zombie_hint( "default_reward_barrier_piece_30", &"ZOMBIE_BUTTON_REWARD_BARRIER_30" ); + add_zombie_hint( "default_reward_barrier_piece_40", &"ZOMBIE_BUTTON_REWARD_BARRIER_40" ); + add_zombie_hint( "default_reward_barrier_piece_50", &"ZOMBIE_BUTTON_REWARD_BARRIER_50" ); + add_zombie_hint( "default_buy_debris_100", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_100" ); + add_zombie_hint( "default_buy_debris_200", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_200" ); + add_zombie_hint( "default_buy_debris_250", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_250" ); + add_zombie_hint( "default_buy_debris_500", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_500" ); + add_zombie_hint( "default_buy_debris_750", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_750" ); + add_zombie_hint( "default_buy_debris_1000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1000" ); + add_zombie_hint( "default_buy_debris_1250", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1250" ); + add_zombie_hint( "default_buy_debris_1500", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1500" ); + add_zombie_hint( "default_buy_debris_1750", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_1750" ); + add_zombie_hint( "default_buy_debris_2000", &"ZOMBIE_BUTTON_BUY_CLEAR_DEBRIS_2000" ); + add_zombie_hint( "default_buy_door_100", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_100" ); + add_zombie_hint( "default_buy_door_200", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_200" ); + add_zombie_hint( "default_buy_door_250", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_250" ); + add_zombie_hint( "default_buy_door_500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_500" ); + add_zombie_hint( "default_buy_door_750", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_750" ); + add_zombie_hint( "default_buy_door_1000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1000" ); + add_zombie_hint( "default_buy_door_1250", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1250" ); + add_zombie_hint( "default_buy_door_1500", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1500" ); + add_zombie_hint( "default_buy_door_1750", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_1750" ); + add_zombie_hint( "default_buy_door_2000", &"ZOMBIE_BUTTON_BUY_OPEN_DOOR_2000" ); + add_zombie_hint( "default_buy_area_100", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_100" ); + add_zombie_hint( "default_buy_area_200", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_200" ); + add_zombie_hint( "default_buy_area_250", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_250" ); + add_zombie_hint( "default_buy_area_500", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_500" ); + add_zombie_hint( "default_buy_area_750", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_750" ); + add_zombie_hint( "default_buy_area_1000", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1000" ); + add_zombie_hint( "default_buy_area_1250", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1250" ); + add_zombie_hint( "default_buy_area_1500", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1500" ); + add_zombie_hint( "default_buy_area_1750", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_1750" ); + add_zombie_hint( "default_buy_area_2000", &"ZOMBIE_BUTTON_BUY_OPEN_AREA_2000" ); + add_zombie_hint( "powerup_fire_sale_cost", &"ZOMBIE_FIRE_SALE_COST" ); +} +init_sounds() +{ + add_sound( "end_of_round", "mus_zmb_round_over" ); + add_sound( "end_of_game", "mus_zmb_game_over" ); + add_sound( "chalk_one_up", "mus_zmb_chalk" ); + add_sound( "purchase", "zmb_cha_ching" ); + add_sound( "no_purchase", "zmb_no_cha_ching" ); + add_sound( "playerzombie_usebutton_sound", "zmb_zombie_vocals_attack" ); + add_sound( "playerzombie_attackbutton_sound", "zmb_zombie_vocals_attack" ); + add_sound( "playerzombie_adsbutton_sound", "zmb_zombie_vocals_attack" ); + add_sound( "zombie_head_gib", "zmb_zombie_head_gib" ); + add_sound( "rebuild_barrier_piece", "zmb_repair_boards" ); + add_sound( "rebuild_barrier_metal_piece", "zmb_metal_repair" ); + add_sound( "rebuild_barrier_hover", "zmb_boards_float" ); + add_sound( "debris_hover_loop", "zmb_couch_loop" ); + add_sound( "break_barrier_piece", "zmb_break_boards" ); + add_sound( "grab_metal_bar", "zmb_bar_pull" ); + add_sound( "break_metal_bar", "zmb_bar_break" ); + add_sound( "drop_metal_bar", "zmb_bar_drop" ); + add_sound("blocker_end_move", "zmb_board_slam"); + add_sound( "barrier_rebuild_slam", "zmb_board_slam" ); + add_sound( "bar_rebuild_slam", "zmb_bar_repair" ); + add_sound( "zmb_rock_fix", "zmb_break_rock_barrier_fix" ); + add_sound( "zmb_vent_fix", "evt_vent_slat_repair" ); + add_sound( "door_slide_open", "zmb_door_slide_open" ); + add_sound( "door_rotate_open", "zmb_door_slide_open" ); + add_sound( "debris_move", "zmb_weap_wall" ); + add_sound( "open_chest", "zmb_lid_open" ); + add_sound( "music_chest", "zmb_music_box" ); + add_sound( "close_chest", "zmb_lid_close" ); + add_sound( "weapon_show", "zmb_weap_wall" ); +} +init_levelvars() +{ + level.is_zombie_level = true; + level.laststandpistol = "m1911_zm"; + level.first_round = true; + level.round_number = 1; + level.round_start_time = 0; + level.pro_tips_start_time = 0; + level.intermission = false; + level.dog_intermission = false; + level.zombie_total = 0; + level.total_zombies_killed = 0; + level.no_laststandmissionfail = true; + level.hudelem_count = 0; + level.zombie_move_speed = 1; + level.enemy_spawns = []; + level.zombie_rise_spawners = []; + level.counter_model[0] = "p_zom_counter_0"; + level.counter_model[1] = "p_zom_counter_1"; + level.counter_model[2] = "p_zom_counter_2"; + level.counter_model[3] = "p_zom_counter_3"; + level.counter_model[4] = "p_zom_counter_4"; + level.counter_model[5] = "p_zom_counter_5"; + level.counter_model[6] = "p_zom_counter_6"; + level.counter_model[7] = "p_zom_counter_7"; + level.counter_model[8] = "p_zom_counter_8"; + level.counter_model[9] = "p_zom_counter_9"; + level.zombie_vars = []; + difficulty = 1; + column = int(difficulty) + 1; + set_zombie_var( "zombie_health_increase", 100, false, column ); + set_zombie_var( "zombie_health_increase_multiplier",0.1, true, column ); + set_zombie_var( "zombie_health_start", 150, false, column ); + set_zombie_var( "zombie_spawn_delay", 2.0, true, column ); + set_zombie_var( "zombie_new_runner_interval", 10, false, column ); + set_zombie_var( "zombie_move_speed_multiplier", 8, false, column ); + set_zombie_var( "zombie_max_ai", 24, false, column ); + set_zombie_var( "zombie_ai_per_player", 6, false, column ); + set_zombie_var( "below_world_check", -1000 ); + set_zombie_var( "spectators_respawn", true ); + set_zombie_var( "zombie_use_failsafe", true ); + set_zombie_var( "zombie_between_round_time", 10 ); + set_zombie_var( "zombie_intermission_time", 15 ); + set_zombie_var( "game_start_delay", 0, false, column ); + set_zombie_var( "penalty_no_revive", 0.10, true, column ); + set_zombie_var( "penalty_died", 0.0, true, column ); + set_zombie_var( "penalty_downed", 0.05, true, column ); + set_zombie_var( "starting_lives", 1, false, column ); + players = get_players(); + points = set_zombie_var( ("zombie_score_start_"+players.size+"p"), 3000, false, column ); + points = set_zombie_var( ("zombie_score_start_"+players.size+"p"), 3000, false, column ); + set_zombie_var( "zombie_score_kill_4player", 50 ); + set_zombie_var( "zombie_score_kill_3player", 50 ); + set_zombie_var( "zombie_score_kill_2player", 50 ); + set_zombie_var( "zombie_score_kill_1player", 50 ); + set_zombie_var( "zombie_score_kill_4p_team", 30 ); + set_zombie_var( "zombie_score_kill_3p_team", 35 ); + set_zombie_var( "zombie_score_kill_2p_team", 45 ); + set_zombie_var( "zombie_score_kill_1p_team", 0 ); + set_zombie_var( "zombie_score_damage_normal", 10 ); + set_zombie_var( "zombie_score_damage_light", 10 ); + set_zombie_var( "zombie_score_bonus_melee", 80 ); + set_zombie_var( "zombie_score_bonus_head", 50 ); + set_zombie_var( "zombie_score_bonus_neck", 20 ); + set_zombie_var( "zombie_score_bonus_torso", 10 ); + set_zombie_var( "zombie_score_bonus_burn", 10 ); + set_zombie_var( "zombie_flame_dmg_point_delay", 500 ); + set_zombie_var( "zombify_player", false ); + if ( IsSplitScreen() ) + { + set_zombie_var( "zombie_timer_offset", 280 ); + } +} +init_dvars() +{ + setSavedDvar( "fire_world_damage", "0" ); + setSavedDvar( "fire_world_damage_rate", "0" ); + setSavedDvar( "fire_world_damage_duration", "0" ); + if( GetDvar( #"zombie_debug" ) == "" ) + { + SetDvar( "zombie_debug", "0" ); + } + if( GetDvar( #"zombie_cheat" ) == "" ) + { + SetDvar( "zombie_cheat", "0" ); + } + if ( level.script != "zombie_cod5_prototype" ) + { + SetDvar( "magic_chest_movable", "1" ); + } + if(GetDvar( #"magic_box_explore_only") == "") + { + SetDvar( "magic_box_explore_only", "1" ); + } + SetDvar( "revive_trigger_radius", "75" ); + SetDvar( "player_lastStandBleedoutTime", "45" ); + SetDvar( "scr_deleteexplosivesonspawn", "0" ); +} +init_mutators() +{ + level.mutators = []; + init_mutator( "mutator_noPerks" ); + init_mutator( "mutator_noTraps" ); + init_mutator( "mutator_noMagicBox" ); + init_mutator( "mutator_noRevive" ); + init_mutator( "mutator_noPowerups" ); + init_mutator( "mutator_noReloads" ); + init_mutator( "mutator_noBoards" ); + init_mutator( "mutator_fogMatch" ); + init_mutator( "mutator_quickStart" ); + init_mutator( "mutator_headshotsOnly" ); + init_mutator( "mutator_friendlyFire" ); + init_mutator( "mutator_doubleMoney" ); + init_mutator( "mutator_susceptible" ); + init_mutator( "mutator_powerShot" ); +} +init_mutator( mutator_s ) +{ + level.mutators[ mutator_s ] = ( "1" == GetDvar( mutator_s ) ); +} +init_function_overrides() +{ + level.custom_introscreen = ::zombie_intro_screen; + level.custom_intermission = ::player_intermission; + level.reset_clientdvars = ::onPlayerConnect_clientDvars; + level.playerlaststand_func = ::player_laststand; + level.global_damage_func = maps\_zombiemode_spawner::zombie_damage; + level.global_damage_func_ads = maps\_zombiemode_spawner::zombie_damage_ads; + level.overridePlayerKilled = ::player_killed_override; + level.overridePlayerDamage = ::player_damage_override; + level.overrideActorKilled = ::actor_killed_override; + level.overrideActorDamage = ::actor_damage_override; + level.melee_miss_func = ::zombiemode_melee_miss; + level.player_becomes_zombie = ::zombify_player; + level.is_friendly_fire_on = ::is_friendly_fire_on; + level.can_revive = ::can_revive; + level.zombie_last_stand = ::last_stand_pistol_swap; + level.zombie_last_stand_pistol_memory = ::last_stand_save_pistol_ammo; + level.zombie_last_stand_ammo_return = ::last_stand_restore_pistol_ammo; + level.prevent_player_damage = ::player_prevent_damage; + if( !IsDefined( level.Player_Spawn_func ) ) + { + level.Player_Spawn_func = ::coop_player_spawn_placement; + } +} +initZombieLeaderboardData() +{ + level.zombieLeaderboardStatVariable["zombie_theater"]["highestwave"] = "zombie_theater_highestwave"; + level.zombieLeaderboardStatVariable["zombie_theater"]["timeinwave"] = "zombie_theater_timeinwave"; + level.zombieLeaderboardStatVariable["zombie_theater"]["totalpoints"] = "zombie_theater_totalpoints"; + level.zombieLeaderboardStatVariable["zombie_pentagon"]["highestwave"] = "zombie_pentagon_highestwave"; + level.zombieLeaderboardStatVariable["zombie_pentagon"]["timeinwave"] = "zombie_pentagon_timeinwave"; + level.zombieLeaderboardStatVariable["zombie_pentagon"]["totalpoints"] = "zombie_pentagon_totalpoints"; + level.zombieLeaderboardStatVariable["zombie_cod5_asylum"]["highestwave"] = "zombie_asylum_highestwave"; + level.zombieLeaderboardStatVariable["zombie_cod5_asylum"]["timeinwave"] = "zombie_asylum_timeinwave"; + level.zombieLeaderboardStatVariable["zombie_cod5_asylum"]["totalpoints"] = "zombie_asylum_totalpoints"; + level.zombieLeaderboardStatVariable["zombie_cod5_factory"]["highestwave"] = "zombie_factory_highestwave"; + level.zombieLeaderboardStatVariable["zombie_cod5_factory"]["timeinwave"] = "zombie_factory_timeinwave"; + level.zombieLeaderboardStatVariable["zombie_cod5_factory"]["totalpoints"] = "zombie_factory_totalpoints"; + level.zombieLeaderboardStatVariable["zombie_cod5_prototype"]["highestwave"] = "zombie_prototype_highestwave"; + level.zombieLeaderboardStatVariable["zombie_cod5_prototype"]["timeinwave"] = "zombie_prototype_timeinwave"; + level.zombieLeaderboardStatVariable["zombie_cod5_prototype"]["totalpoints"] = "zombie_prototype_totalpoints"; + level.zombieLeaderboardStatVariable["zombie_cod5_sumpf"]["highestwave"] = "zombie_sumpf_highestwave"; + level.zombieLeaderboardStatVariable["zombie_cod5_sumpf"]["timeinwave"] = "zombie_sumpf_timeinwave"; + level.zombieLeaderboardStatVariable["zombie_cod5_sumpf"]["totalpoints"] = "zombie_sumpf_totalpoints"; + level.zombieLeaderboardStatVariable["zombie_cosmodrome"]["highestwave"] = "zombie_cosmodrome_highestwave"; + level.zombieLeaderboardStatVariable["zombie_cosmodrome"]["timeinwave"] = "zombie_cosmodrome_timeinwave"; + level.zombieLeaderboardStatVariable["zombie_cosmodrome"]["totalpoints"] = "zombie_cosmodrome_totalpoints"; + level.zombieLeaderboardStatVariable["zombie_coast"]["highestwave"] = "zombie_coast_highestwave"; + level.zombieLeaderboardStatVariable["zombie_coast"]["timeinwave"] = "zombie_coast_timeinwave"; + level.zombieLeaderboardStatVariable["zombie_coast"]["totalpoints"] = "zombie_coast_totalpoints"; + level.zombieLeaderboardStatVariable["zombie_temple"]["highestwave"] = "zombie_temple_highestwave"; + level.zombieLeaderboardStatVariable["zombie_temple"]["timeinwave"] = "zombie_temple_timeinwave"; + level.zombieLeaderboardStatVariable["zombie_temple"]["totalpoints"] = "zombie_temple_totalpoints"; + level.zombieLeaderboardStatVariable["zombie_moon"]["highestwave"] = "zombie_moon_highestwave"; + level.zombieLeaderboardStatVariable["zombie_moon"]["timeinwave"] = "zombie_moon_timeinwave"; + level.zombieLeaderboardStatVariable["zombie_moon"]["totalpoints"] = "zombie_moon_totalpoints"; + level.zombieLeaderboardStatVariable["zombie_moon"]["nomanslandtime"] = "zombie_moon_nomansland"; + level.zombieLeaderboardNumber["zombie_theater"]["waves"] = 0; + level.zombieLeaderboardNumber["zombie_theater"]["points"] = 1; + level.zombieLeaderboardNumber["zombie_pentagon"]["waves"] = 6; + level.zombieLeaderboardNumber["zombie_pentagon"]["points"] = 7; + level.zombieLeaderboardNumber["zombie_cod5_asylum"]["waves"] = 9; + level.zombieLeaderboardNumber["zombie_cod5_asylum"]["points"] = 10; + level.zombieLeaderboardNumber["zombie_cod5_factory"]["waves"] = 12; + level.zombieLeaderboardNumber["zombie_cod5_factory"]["points"] = 13; + level.zombieLeaderboardNumber["zombie_cod5_prototype"]["waves"] = 15; + level.zombieLeaderboardNumber["zombie_cod5_prototype"]["points"] = 16; + level.zombieLeaderboardNumber["zombie_cod5_sumpf"]["waves"] = 18; + level.zombieLeaderboardNumber["zombie_cod5_sumpf"]["points"] = 19; + level.zombieLeaderboardNumber["zombie_cosmodrome"]["waves"] = 21; + level.zombieLeaderboardNumber["zombie_cosmodrome"]["points"] = 22; + level.zombieLeaderboardNumber["zombie_coast"]["waves"] = 24; + level.zombieLeaderboardNumber["zombie_coast"]["points"] = 25; + level.zombieLeaderboardNumber["zombie_temple"]["waves"] = 27; + level.zombieLeaderboardNumber["zombie_temple"]["points"] = 28; + level.zombieLeaderboardNumber["zombie_moon"]["waves"] = 30; + level.zombieLeaderboardNumber["zombie_moon"]["points"] = 31; + level.zombieLeaderboardNumber["zombie_moon"]["kills"] = 32; +} +init_flags() +{ + flag_init( "spawn_point_override" ); + flag_init( "power_on" ); + flag_init( "crawler_round" ); + flag_init( "spawn_zombies", true ); + flag_init( "dog_round" ); + flag_init( "begin_spawning" ); + flag_init( "end_round_wait" ); + flag_init( "wait_and_revive" ); + flag_init("instant_revive"); +} +init_client_flags() +{ + level._ZOMBIE_SCRIPTMOVER_FLAG_BOX_RANDOM = 15; + if(is_true(level.use_clientside_board_fx)) + { + level._ZOMBIE_SCRIPTMOVER_FLAG_BOARD_HORIZONTAL_FX = 14; + level._ZOMBIE_SCRIPTMOVER_FLAG_BOARD_VERTICAL_FX = 13; + } + if(is_true(level.use_clientside_rock_tearin_fx)) + { + level._ZOMBIE_SCRIPTMOVER_FLAG_ROCK_FX = 12; + } + level._ZOMBIE_PLAYER_FLAG_CLOAK_WEAPON = 14; + level._ZOMBIE_PLAYER_FLAG_DIVE2NUKE_VISION = 13; + level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK = 12; + if(is_true(level.riser_fx_on_client)) + { + level._ZOMBIE_ACTOR_ZOMBIE_RISER_FX = 8; + if(!isDefined(level._no_water_risers)) + { + level._ZOMBIE_ACTOR_ZOMBIE_RISER_FX_WATER = 9; + } + if(is_true(level.risers_use_low_gravity_fx)) + { + level._ZOMBIE_ACTOR_ZOMBIE_RISER_LOWG_FX = 7; + } + } +} +init_fx() +{ + level._effect["wood_chunk_destory"] = LoadFX( "impacts/fx_large_woodhit" ); + level._effect["fx_zombie_bar_break"] = LoadFX( "maps/zombie/fx_zombie_bar_break" ); + level._effect["fx_zombie_bar_break_lite"] = LoadFX( "maps/zombie/fx_zombie_bar_break_lite" ); + level._effect["edge_fog"] = LoadFX( "maps/zombie/fx_fog_zombie_amb" ); + level._effect["chest_light"] = LoadFX( "env/light/fx_ray_sun_sm_short" ); + level._effect["eye_glow"] = LoadFX( "misc/fx_zombie_eye_single" ); + level._effect["headshot"] = LoadFX( "impacts/fx_flesh_hit" ); + level._effect["headshot_nochunks"] = LoadFX( "misc/fx_zombie_bloodsplat" ); + level._effect["bloodspurt"] = LoadFX( "misc/fx_zombie_bloodspurt" ); + level._effect["tesla_head_light"] = LoadFX( "maps/zombie/fx_zombie_tesla_neck_spurt"); + level._effect["rise_burst_water"] = LoadFX("maps/zombie/fx_zombie_body_wtr_burst"); + level._effect["rise_billow_water"] = LoadFX("maps/zombie/fx_zombie_body_wtr_billowing"); + level._effect["rise_dust_water"] = LoadFX("maps/zombie/fx_zombie_body_wtr_falling"); + level._effect["rise_burst"] = LoadFX("maps/zombie/fx_mp_zombie_hand_dirt_burst"); + level._effect["rise_billow"] = LoadFX("maps/zombie/fx_mp_zombie_body_dirt_billowing"); + level._effect["rise_dust"] = LoadFX("maps/zombie/fx_mp_zombie_body_dust_falling"); + level._effect["fall_burst"] = LoadFX("maps/zombie/fx_mp_zombie_hand_dirt_burst"); + level._effect["fall_billow"] = LoadFX("maps/zombie/fx_mp_zombie_body_dirt_billowing"); + level._effect["fall_dust"] = LoadFX("maps/zombie/fx_mp_zombie_body_dust_falling"); + level._effect["character_fire_pain_sm"] = LoadFX( "env/fire/fx_fire_player_sm_1sec" ); + level._effect["character_fire_death_sm"] = LoadFX( "env/fire/fx_fire_player_md" ); + level._effect["character_fire_death_torso"] = LoadFX( "env/fire/fx_fire_player_torso" ); + level._effect["def_explosion"] = LoadFX("explosions/fx_default_explosion"); + level._effect["betty_explode"] = LoadFX("weapon/bouncing_betty/fx_explosion_betty_generic"); +} +init_standard_zombie_anims() +{ + level.scr_anim["zombie"]["death1"] = %ai_zombie_death_v1; + level.scr_anim["zombie"]["death2"] = %ai_zombie_death_v2; + level.scr_anim["zombie"]["death3"] = %ai_zombie_crawl_death_v1; + level.scr_anim["zombie"]["death4"] = %ai_zombie_crawl_death_v2; + level.scr_anim["zombie"]["walk1"] = %ai_zombie_walk_v1; + level.scr_anim["zombie"]["walk2"] = %ai_zombie_walk_v2; + level.scr_anim["zombie"]["walk3"] = %ai_zombie_walk_v3; + level.scr_anim["zombie"]["walk4"] = %ai_zombie_walk_v4; + level.scr_anim["zombie"]["walk5"] = %ai_zombie_walk_v6; + level.scr_anim["zombie"]["walk6"] = %ai_zombie_walk_v7; + level.scr_anim["zombie"]["walk7"] = %ai_zombie_walk_v9; + level.scr_anim["zombie"]["walk8"] = %ai_zombie_walk_v9; + level.scr_anim["zombie"]["run1"] = %ai_zombie_walk_fast_v1; + level.scr_anim["zombie"]["run2"] = %ai_zombie_walk_fast_v2; + level.scr_anim["zombie"]["run3"] = %ai_zombie_walk_fast_v3; + level.scr_anim["zombie"]["run4"] = %ai_zombie_run_v2; + level.scr_anim["zombie"]["run5"] = %ai_zombie_run_v4; + level.scr_anim["zombie"]["run6"] = %ai_zombie_run_v3; + level.scr_anim["zombie"]["sprint1"] = %ai_zombie_sprint_v1; + level.scr_anim["zombie"]["sprint2"] = %ai_zombie_sprint_v2; + level.scr_anim["zombie"]["sprint3"] = %ai_zombie_sprint_v1; + level.scr_anim["zombie"]["sprint4"] = %ai_zombie_sprint_v2; + level.scr_anim["zombie"]["crawl1"] = %ai_zombie_crawl; + level.scr_anim["zombie"]["crawl2"] = %ai_zombie_crawl_v1; + level.scr_anim["zombie"]["crawl3"] = %ai_zombie_crawl_v2; + level.scr_anim["zombie"]["crawl4"] = %ai_zombie_crawl_v3; + level.scr_anim["zombie"]["crawl5"] = %ai_zombie_crawl_v4; + level.scr_anim["zombie"]["crawl6"] = %ai_zombie_crawl_v5; + level.scr_anim["zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a; + level.scr_anim["zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b; + level.scr_anim["zombie"]["crawl_sprint1"] = %ai_zombie_crawl_sprint; + level.scr_anim["zombie"]["crawl_sprint2"] = %ai_zombie_crawl_sprint_1; + level.scr_anim["zombie"]["crawl_sprint3"] = %ai_zombie_crawl_sprint_2; + if( !isDefined( level._zombie_melee ) ) + { + level._zombie_melee = []; + } + if( !isDefined( level._zombie_walk_melee ) ) + { + level._zombie_walk_melee = []; + } + if( !isDefined( level._zombie_run_melee ) ) + { + level._zombie_run_melee = []; + } + level._zombie_melee["zombie"] = []; + level._zombie_walk_melee["zombie"] = []; + level._zombie_run_melee["zombie"] = []; + level._zombie_melee["zombie"][0] = %ai_zombie_attack_v2; + level._zombie_melee["zombie"][1] = %ai_zombie_attack_v4; + level._zombie_melee["zombie"][2] = %ai_zombie_attack_v6; + level._zombie_melee["zombie"][3] = %ai_zombie_attack_v1; + level._zombie_melee["zombie"][4] = %ai_zombie_attack_forward_v1; + level._zombie_melee["zombie"][5] = %ai_zombie_attack_forward_v2; + level._zombie_run_melee["zombie"][0] = %ai_zombie_run_attack_v1; + level._zombie_run_melee["zombie"][1] = %ai_zombie_run_attack_v2; + level._zombie_run_melee["zombie"][2] = %ai_zombie_run_attack_v3; + if( isDefined( level.zombie_anim_override ) ) + { + [[ level.zombie_anim_override ]](); + } + level._zombie_walk_melee["zombie"][0] = %ai_zombie_walk_attack_v1; + level._zombie_walk_melee["zombie"][1] = %ai_zombie_walk_attack_v2; + level._zombie_walk_melee["zombie"][2] = %ai_zombie_walk_attack_v3; + level._zombie_walk_melee["zombie"][3] = %ai_zombie_walk_attack_v4; + if( !isDefined( level._zombie_melee_crawl ) ) + { + level._zombie_melee_crawl = []; + } + level._zombie_melee_crawl["zombie"] = []; + level._zombie_melee_crawl["zombie"][0] = %ai_zombie_attack_crawl; + level._zombie_melee_crawl["zombie"][1] = %ai_zombie_attack_crawl_lunge; + if( !isDefined( level._zombie_stumpy_melee ) ) + { + level._zombie_stumpy_melee = []; + } + level._zombie_stumpy_melee["zombie"] = []; + level._zombie_stumpy_melee["zombie"][0] = %ai_zombie_walk_on_hands_shot_a; + level._zombie_stumpy_melee["zombie"][1] = %ai_zombie_walk_on_hands_shot_b; + if( !isDefined( level._zombie_tesla_death ) ) + { + level._zombie_tesla_death = []; + } + level._zombie_tesla_death["zombie"] = []; + level._zombie_tesla_death["zombie"][0] = %ai_zombie_tesla_death_a; + level._zombie_tesla_death["zombie"][1] = %ai_zombie_tesla_death_b; + level._zombie_tesla_death["zombie"][2] = %ai_zombie_tesla_death_c; + level._zombie_tesla_death["zombie"][3] = %ai_zombie_tesla_death_d; + level._zombie_tesla_death["zombie"][4] = %ai_zombie_tesla_death_e; + if( !isDefined( level._zombie_tesla_crawl_death ) ) + { + level._zombie_tesla_crawl_death = []; + } + level._zombie_tesla_crawl_death["zombie"] = []; + level._zombie_tesla_crawl_death["zombie"][0] = %ai_zombie_tesla_crawl_death_a; + level._zombie_tesla_crawl_death["zombie"][1] = %ai_zombie_tesla_crawl_death_b; + if( !isDefined( level._zombie_knockdowns ) ) + { + level._zombie_knockdowns = []; + } + level._zombie_knockdowns["zombie"] = []; + level._zombie_knockdowns["zombie"]["front"] = []; + level._zombie_knockdowns["zombie"]["front"]["no_legs"] = []; + level._zombie_knockdowns["zombie"]["front"]["no_legs"][0] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["zombie"]["front"]["no_legs"][1] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["zombie"]["front"]["no_legs"][2] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["zombie"]["front"]["has_legs"] = []; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][0] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][1] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][2] = %ai_zombie_thundergun_hit_upontoback; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][3] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][4] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][5] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][6] = %ai_zombie_thundergun_hit_stumblefall; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][7] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][8] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][9] = %ai_zombie_thundergun_hit_upontoback; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][10] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][11] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][12] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][13] = %ai_zombie_thundergun_hit_deadfallknee; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][14] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][15] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][16] = %ai_zombie_thundergun_hit_upontoback; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][17] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][18] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][19] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["zombie"]["front"]["has_legs"][20] = %ai_zombie_thundergun_hit_flatonback; + level._zombie_knockdowns["zombie"]["left"] = []; + level._zombie_knockdowns["zombie"]["left"][0] = %ai_zombie_thundergun_hit_legsout_right; + level._zombie_knockdowns["zombie"]["right"] = []; + level._zombie_knockdowns["zombie"]["right"][0] = %ai_zombie_thundergun_hit_legsout_left; + level._zombie_knockdowns["zombie"]["back"] = []; + level._zombie_knockdowns["zombie"]["back"][0] = %ai_zombie_thundergun_hit_faceplant; + if( !isDefined( level._zombie_getups ) ) + { + level._zombie_getups = []; + } + level._zombie_getups["zombie"] = []; + level._zombie_getups["zombie"]["back"] = []; + level._zombie_getups["zombie"]["back"]["early"] = []; + level._zombie_getups["zombie"]["back"]["early"][0] = %ai_zombie_thundergun_getup_b; + level._zombie_getups["zombie"]["back"]["early"][1] = %ai_zombie_thundergun_getup_c; + level._zombie_getups["zombie"]["back"]["late"] = []; + level._zombie_getups["zombie"]["back"]["late"][0] = %ai_zombie_thundergun_getup_b; + level._zombie_getups["zombie"]["back"]["late"][1] = %ai_zombie_thundergun_getup_c; + level._zombie_getups["zombie"]["back"]["late"][2] = %ai_zombie_thundergun_getup_quick_b; + level._zombie_getups["zombie"]["back"]["late"][3] = %ai_zombie_thundergun_getup_quick_c; + level._zombie_getups["zombie"]["belly"] = []; + level._zombie_getups["zombie"]["belly"]["early"] = []; + level._zombie_getups["zombie"]["belly"]["early"][0] = %ai_zombie_thundergun_getup_a; + level._zombie_getups["zombie"]["belly"]["late"] = []; + level._zombie_getups["zombie"]["belly"]["late"][0] = %ai_zombie_thundergun_getup_a; + level._zombie_getups["zombie"]["belly"]["late"][1] = %ai_zombie_thundergun_getup_quick_a; + if( !isDefined( level._zombie_freezegun_death ) ) + { + level._zombie_freezegun_death = []; + } + level._zombie_freezegun_death["zombie"] = []; + level._zombie_freezegun_death["zombie"][0] = %ai_zombie_freeze_death_a; + level._zombie_freezegun_death["zombie"][1] = %ai_zombie_freeze_death_b; + level._zombie_freezegun_death["zombie"][2] = %ai_zombie_freeze_death_c; + level._zombie_freezegun_death["zombie"][3] = %ai_zombie_freeze_death_d; + level._zombie_freezegun_death["zombie"][4] = %ai_zombie_freeze_death_e; + if( !isDefined( level._zombie_freezegun_death_missing_legs ) ) + { + level._zombie_freezegun_death_missing_legs = []; + } + level._zombie_freezegun_death_missing_legs["zombie"] = []; + level._zombie_freezegun_death_missing_legs["zombie"][0] = %ai_zombie_crawl_freeze_death_01; + level._zombie_freezegun_death_missing_legs["zombie"][1] = %ai_zombie_crawl_freeze_death_02; + if( !isDefined( level._zombie_deaths ) ) + { + level._zombie_deaths = []; + } + level._zombie_deaths["zombie"] = []; + level._zombie_deaths["zombie"][0] = %ch_dazed_a_death; + level._zombie_deaths["zombie"][1] = %ch_dazed_b_death; + level._zombie_deaths["zombie"][2] = %ch_dazed_c_death; + level._zombie_deaths["zombie"][3] = %ch_dazed_d_death; + if( !isDefined( level._zombie_rise_anims ) ) + { + level._zombie_rise_anims = []; + } + level._zombie_rise_anims["zombie"] = []; + level._zombie_rise_anims["zombie"][1]["walk"][0] = %ai_zombie_traverse_ground_v1_walk; + level._zombie_rise_anims["zombie"][1]["run"][0] = %ai_zombie_traverse_ground_v1_run; + level._zombie_rise_anims["zombie"][1]["sprint"][0] = %ai_zombie_traverse_ground_climbout_fast; + level._zombie_rise_anims["zombie"][2]["walk"][0] = %ai_zombie_traverse_ground_v2_walk_altA; + if( !isDefined( level._zombie_rise_death_anims ) ) + { + level._zombie_rise_death_anims = []; + } + level._zombie_rise_death_anims["zombie"] = []; + level._zombie_rise_death_anims["zombie"][1]["in"][0] = %ai_zombie_traverse_ground_v1_deathinside; + level._zombie_rise_death_anims["zombie"][1]["in"][1] = %ai_zombie_traverse_ground_v1_deathinside_alt; + level._zombie_rise_death_anims["zombie"][1]["out"][0] = %ai_zombie_traverse_ground_v1_deathoutside; + level._zombie_rise_death_anims["zombie"][1]["out"][1] = %ai_zombie_traverse_ground_v1_deathoutside_alt; + level._zombie_rise_death_anims["zombie"][2]["in"][0] = %ai_zombie_traverse_ground_v2_death_low; + level._zombie_rise_death_anims["zombie"][2]["in"][1] = %ai_zombie_traverse_ground_v2_death_low_alt; + level._zombie_rise_death_anims["zombie"][2]["out"][0] = %ai_zombie_traverse_ground_v2_death_high; + level._zombie_rise_death_anims["zombie"][2]["out"][1] = %ai_zombie_traverse_ground_v2_death_high_alt; + if( !isDefined( level._zombie_run_taunt ) ) + { + level._zombie_run_taunt = []; + } + if( !isDefined( level._zombie_board_taunt ) ) + { + level._zombie_board_taunt = []; + } + level._zombie_run_taunt["zombie"] = []; + level._zombie_board_taunt["zombie"] = []; + level._zombie_board_taunt["zombie"][0] = %ai_zombie_taunts_4; + level._zombie_board_taunt["zombie"][1] = %ai_zombie_taunts_7; + level._zombie_board_taunt["zombie"][2] = %ai_zombie_taunts_9; + level._zombie_board_taunt["zombie"][3] = %ai_zombie_taunts_5b; + level._zombie_board_taunt["zombie"][4] = %ai_zombie_taunts_5c; + level._zombie_board_taunt["zombie"][5] = %ai_zombie_taunts_5d; + level._zombie_board_taunt["zombie"][6] = %ai_zombie_taunts_5e; + level._zombie_board_taunt["zombie"][7] = %ai_zombie_taunts_5f; +} +init_anims() +{ + init_standard_zombie_anims(); +} +init_animscripts() +{ + animscripts\zombie_init::firstInit(); + anim.idleAnimArray ["stand"] = []; + anim.idleAnimWeights ["stand"] = []; + anim.idleAnimArray ["stand"][0][0] = %ai_zombie_idle_v1_delta; + anim.idleAnimWeights ["stand"][0][0] = 10; + anim.idleAnimArray ["crouch"] = []; + anim.idleAnimWeights ["crouch"] = []; + anim.idleAnimArray ["crouch"][0][0] = %ai_zombie_idle_crawl_delta; + anim.idleAnimWeights ["crouch"][0][0] = 10; +} +zombie_intro_screen( string1, string2, string3, string4, string5 ) +{ + flag_wait( "all_players_connected" ); +} +players_playing() +{ + players = get_players(); + level.players_playing = players.size; + wait( 20 ); + players = get_players(); + level.players_playing = players.size; +} +difficulty_init() +{ + flag_wait( "all_players_connected" ); + difficulty =1; + table = "mp/zombiemode.csv"; + column = int(difficulty)+1; + players = get_players(); + points = 500; + points = set_zombie_var( ("zombie_score_start_"+players.size+"p"), 3000, false, column ); + for ( p=0; p weapon_limit ) + { + if ( !isdefined( level.player_too_many_weapons_monitor_callback ) || self [[level.player_too_many_weapons_monitor_callback]]( primary_weapons_to_take ) ) + { + self thread player_too_many_weapons_monitor_takeaway_sequence( primary_weapons_to_take ); + self waittill( "player_too_many_weapons_monitor_takeaway_sequence_done" ); + } + } + wait( get_player_too_many_weapons_monitor_wait_time() ); + } +} +player_monitor_travel_dist() +{ + self endon("disconnect"); + prevpos = self.origin; + while(1) + { + wait .1; + self.stats["distance_traveled"] += distance( self.origin, prevpos ); + prevpos = self.origin; + } +} +player_grenade_watcher() +{ + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "grenade_fire", grenade, weapName ); + if( isdefined( grenade ) && isalive( grenade ) ) + { + grenade.team = self.team; + } + } +} +player_prevent_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + if ( eInflictor == self || eAttacker == self ) + { + return false; + } + if ( isdefined( eInflictor ) && isdefined( eInflictor.team ) ) + { + if ( eInflictor.team == self.team ) + { + return true; + } + } + return false; +} +player_revive_monitor() +{ + self endon( "disconnect" ); + while (1) + { + self waittill( "player_revived", reviver ); + bbPrint( "zombie_playerdeaths: round %d playername %s deathtype revived x %f y %f z %f", level.round_number, self.playername, self.origin ); + if ( IsDefined(reviver) ) + { + self maps\_zombiemode_audio::create_and_play_dialog( "general", "revive_up" ); + points = self.score_lost_when_downed; + reviver maps\_zombiemode_score::player_add_points( "reviver", points ); + self.score_lost_when_downed = 0; + } + } +} +laststand_giveback_player_perks() +{ + if ( IsDefined( self.laststand_perks ) ) + { + lost_perk_index = int( -1 ); + if( self.laststand_perks.size > 1 ) + { + lost_perk_index = RandomInt( self.laststand_perks.size-1 ); + } + for ( i=0; i= 3 ) + { + weapon_to_take = primary_weapons_that_can_be_taken[primary_weapons_that_can_be_taken.size - 1]; + if ( weapon_to_take == self GetCurrentWeapon() ) + { + self SwitchToWeapon( primary_weapons_that_can_be_taken[0] ); + } + self TakeWeapon( weapon_to_take ); + } + return weapon_to_take; +} +player_laststand( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) +{ + if ( self HasPerk( "specialty_additionalprimaryweapon" ) ) + { + self.weapon_taken_by_losing_specialty_additionalprimaryweapon = self take_additionalprimaryweapon(); + } + self clear_is_drinking(); + self thread remove_deadshot_bottle(); + self thread remote_revive_watch(); + self maps\_zombiemode_score::player_downed_penalty(); + self DisableOffhandWeapons(); + self thread last_stand_grenade_save_and_return(); + if( sMeansOfDeath != "MOD_SUICIDE" && sMeansOfDeath != "MOD_FALLING" ) + { + self maps\_zombiemode_audio::create_and_play_dialog( "general", "revive_down" ); + } + bbPrint( "zombie_playerdeaths: round %d playername %s deathtype downed x %f y %f z %f", level.round_number, self.playername, self.origin ); + if( IsDefined( level._zombie_minigun_powerup_last_stand_func ) ) + { + self thread [[level._zombie_minigun_powerup_last_stand_func]](); + } + if( IsDefined( level._zombie_tesla_powerup_last_stand_func ) ) + { + self thread [[level._zombie_tesla_powerup_last_stand_func]](); + } + if( IsDefined( self.intermission ) && self.intermission ) + { + bbPrint( "zombie_playerdeaths: round %d playername %s deathtype died x %f y %f z %f", level.round_number, self.playername, self.origin ); + level waittill( "forever" ); + } +} +failsafe_revive_give_back_weapons() +{ + for ( i = 0; i < 10; i++ ) + { + wait( 0.05 ); + if ( !isdefined( self.reviveProgressBar ) ) + { + continue; + } + players = get_players(); + for ( playerIndex = 0; playerIndex < players.size; playerIndex++ ) + { + revivee = players[playerIndex]; + if ( self maps\_laststand::is_reviving( revivee ) ) + { + continue; + } + } + self maps\_laststand::revive_give_back_weapons( "none" ); + if ( isdefined( self.reviveProgressBar ) ) + { + self.reviveProgressBar maps\_hud_util::destroyElem(); + } + if ( isdefined( self.reviveTextHud ) ) + { + self.reviveTextHud destroy(); + } + return; + } +} +spawnSpectator() +{ + self endon( "disconnect" ); + self endon( "spawned_spectator" ); + self notify( "spawned" ); + self notify( "end_respawn" ); + if( level.intermission ) + { + return; + } + if( IsDefined( level.no_spectator ) && level.no_spectator ) + { + wait( 3 ); + ExitLevel(); + } + self.is_zombie = true; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( self != players[i] ) + { + players[i] thread failsafe_revive_give_back_weapons(); + } + } + self notify ( "zombified" ); + if( IsDefined( self.revivetrigger ) ) + { + self.revivetrigger delete(); + self.revivetrigger = undefined; + } + self.zombification_time = GetTime(); + resetTimeout(); + self StopShellshock(); + self StopRumble( "damage_heavy" ); + self.sessionstate = "spectator"; + self.spectatorclient = -1; + self remove_from_spectate_list(); + self.maxhealth = self.health; + self.shellshocked = false; + self.inWater = false; + self.friendlydamage = undefined; + self.hasSpawned = true; + self.spawnTime = GetTime(); + self.afk = false; + println( "*************************Zombie Spectator***" ); + self detachAll(); + self setSpectatePermissions( true ); + self thread spectator_thread(); + self Spawn( self.origin, self.angles ); + self notify( "spawned_spectator" ); +} +setSpectatePermissions( isOn ) +{ + self AllowSpectateTeam( "allies", isOn ); + self AllowSpectateTeam( "axis", false ); + self AllowSpectateTeam( "freelook", false ); + self AllowSpectateTeam( "none", false ); +} +spectator_thread() +{ + self endon( "disconnect" ); + self endon( "spawned_player" ); +} +spectator_toggle_3rd_person() +{ + self endon( "disconnect" ); + self endon( "spawned_player" ); + third_person = true; + self set_third_person( true ); +} +set_third_person( value ) +{ + if( value ) + { + self SetClientDvars( "cg_thirdPerson", "1", + "cg_fov", "40", + "cg_thirdPersonAngle", "354" ); + self setDepthOfField( 0, 128, 512, 4000, 6, 1.8 ); + } + else + { + self SetClientDvars( "cg_thirdPerson", "0", + "cg_fov", "65", + "cg_thirdPersonAngle", "0" ); + self setDepthOfField( 0, 0, 512, 4000, 4, 0 ); + } +} +last_stand_revive() +{ + level endon( "between_round_over" ); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] maps\_laststand::player_is_in_laststand() && players[i].revivetrigger.beingRevived == 0 ) + { + players[i] maps\_laststand::auto_revive(); + } + } +} +last_stand_pistol_rank_init() +{ + level.pistol_values = []; + flag_wait( "_start_zm_pistol_rank" ); + if( flag( "solo_game" ) ) + { + level.pistol_values[ level.pistol_values.size ] = "m1911_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75dw_zm"; + level.pistol_values[ level.pistol_values.size ] = "python_zm"; + level.pistol_values[ level.pistol_values.size ] = "python_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75dw_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "m1911_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "ray_gun_zm"; + level.pistol_values[ level.pistol_values.size ] = "freezegun_zm"; + level.pistol_values[ level.pistol_values.size ] = "ray_gun_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "freezegun_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "microwavegundw_zm"; + level.pistol_values[ level.pistol_values.size ] = "microwavegundw_upgraded_zm"; + } + else + { + level.pistol_values[ level.pistol_values.size ] = "m1911_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75dw_zm"; + level.pistol_values[ level.pistol_values.size ] = "python_zm"; + level.pistol_values[ level.pistol_values.size ] = "python_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "cz75dw_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "m1911_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "ray_gun_zm"; + level.pistol_values[ level.pistol_values.size ] = "freezegun_zm"; + level.pistol_values[ level.pistol_values.size ] = "ray_gun_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "freezegun_upgraded_zm"; + level.pistol_values[ level.pistol_values.size ] = "microwavegundw_zm"; + level.pistol_values[ level.pistol_values.size ] = "microwavegundw_upgraded_zm"; + } +} +last_stand_pistol_swap() +{ + if ( self has_powerup_weapon() ) + { + self.lastActiveWeapon = "none"; + } + if ( !self HasWeapon( self.laststandpistol ) ) + { + self GiveWeapon( self.laststandpistol ); + } + ammoclip = WeaponClipSize( self.laststandpistol ); + doubleclip = ammoclip * 2; + if( is_true( self._special_solo_pistol_swap ) || (self.laststandpistol == "m1911_upgraded_zm" && !self.hadpistol) ) + { + self._special_solo_pistol_swap = 0; + self.hadpistol = false; + self SetWeaponAmmoStock( self.laststandpistol, doubleclip ); + } + else if( flag("solo_game") && self.laststandpistol == "m1911_upgraded_zm") + { + self SetWeaponAmmoStock( self.laststandpistol, doubleclip ); + } + else if ( self.laststandpistol == "m1911_zm" ) + { + self SetWeaponAmmoStock( self.laststandpistol, doubleclip ); + } + else if ( self.laststandpistol == "ray_gun_zm" || self.laststandpistol == "ray_gun_upgraded_zm" ) + { + if ( self.stored_weapon_info[ self.laststandpistol ].total_amt >= ammoclip ) + { + self SetWeaponAmmoClip( self.laststandpistol, ammoclip ); + self.stored_weapon_info[ self.laststandpistol ].given_amt = ammoclip; + } + else + { + self SetWeaponAmmoClip( self.laststandpistol, self.stored_weapon_info[ self.laststandpistol ].total_amt ); + self.stored_weapon_info[ self.laststandpistol ].given_amt = self.stored_weapon_info[ self.laststandpistol ].total_amt; + } + self SetWeaponAmmoStock( self.laststandpistol, 0 ); + } + else + { + if ( self.stored_weapon_info[ self.laststandpistol ].stock_amt >= doubleclip ) + { + self SetWeaponAmmoStock( self.laststandpistol, doubleclip ); + self.stored_weapon_info[ self.laststandpistol ].given_amt = doubleclip + self.stored_weapon_info[ self.laststandpistol ].clip_amt + self.stored_weapon_info[ self.laststandpistol ].left_clip_amt; + } + else + { + self SetWeaponAmmoStock( self.laststandpistol, self.stored_weapon_info[ self.laststandpistol ].stock_amt ); + self.stored_weapon_info[ self.laststandpistol ].given_amt = self.stored_weapon_info[ self.laststandpistol ].total_amt; + } + } + self SwitchToWeapon( self.laststandpistol ); +} +last_stand_best_pistol() +{ + pistol_array = []; + current_weapons = self GetWeaponsListPrimaries(); + for( i = 0; i < current_weapons.size; i++ ) + { + if( WeaponClass( current_weapons[i] ) == "pistol" ) + { + if ( (current_weapons[i] != "m1911_zm" && !flag("solo_game") ) || (!flag("solo_game") && current_weapons[i] != "m1911_upgraded_zm" )) + { + if ( self GetAmmoCount( current_weapons[i] ) <= 0 ) + { + continue; + } + } + pistol_array_index = pistol_array.size; + pistol_array[ pistol_array_index ] = SpawnStruct(); + pistol_array[ pistol_array_index ].gun = current_weapons[i]; + pistol_array[ pistol_array_index ].value = 0; + for( j = 0; j < level.pistol_values.size; j++ ) + { + if( level.pistol_values[j] == current_weapons[i] ) + { + pistol_array[ pistol_array_index ].value = j; + break; + } + } + } + } + self.laststandpistol = last_stand_compare_pistols( pistol_array ); +} +last_stand_compare_pistols( struct_array ) +{ + if( !IsArray( struct_array ) || struct_array.size <= 0 ) + { + self.hadpistol = false; + if(isDefined(self.stored_weapon_info)) + { + stored_weapon_info = GetArrayKeys( self.stored_weapon_info ); + for( j = 0; j < stored_weapon_info.size; j++ ) + { + if( stored_weapon_info[ j ] == level.laststandpistol) + { + self.hadpistol = true; + } + } + } + return level.laststandpistol; + } + highest_score_pistol = struct_array[0]; + for( i = 1; i < struct_array.size; i++ ) + { + if( struct_array[i].value > highest_score_pistol.value ) + { + highest_score_pistol = struct_array[i]; + } + } + if( flag( "solo_game" ) ) + { + self._special_solo_pistol_swap = 0; + if( highest_score_pistol.value <= 4 ) + { + self.hadpistol = false; + self._special_solo_pistol_swap = 1; + return level.laststandpistol; + } + else + { + return highest_score_pistol.gun; + } + } + else + { + return highest_score_pistol.gun; + } +} +last_stand_save_pistol_ammo() +{ + weapon_inventory = self GetWeaponsList(); + self.stored_weapon_info = []; + for( i = 0; i < weapon_inventory.size; i++ ) + { + weapon = weapon_inventory[i]; + if ( WeaponClass( weapon ) == "pistol" ) + { + self.stored_weapon_info[ weapon ] = SpawnStruct(); + self.stored_weapon_info[ weapon ].clip_amt = self GetWeaponAmmoClip( weapon ); + self.stored_weapon_info[ weapon ].left_clip_amt = 0; + dual_wield_name = WeaponDualWieldWeaponName( weapon ); + if ( "none" != dual_wield_name ) + { + self.stored_weapon_info[ weapon ].left_clip_amt = self GetWeaponAmmoClip( dual_wield_name ); + } + self.stored_weapon_info[ weapon ].stock_amt = self GetWeaponAmmoStock( weapon ); + self.stored_weapon_info[ weapon ].total_amt = self.stored_weapon_info[ weapon ].clip_amt + self.stored_weapon_info[ weapon ].left_clip_amt + self.stored_weapon_info[ weapon ].stock_amt; + self.stored_weapon_info[ weapon ].given_amt = 0; + } + } + self last_stand_best_pistol(); +} +last_stand_restore_pistol_ammo() +{ + self.weapon_taken_by_losing_specialty_additionalprimaryweapon = undefined; + if( !IsDefined( self.stored_weapon_info ) ) + { + return; + } + weapon_inventory = self GetWeaponsList(); + weapon_to_restore = GetArrayKeys( self.stored_weapon_info ); + for( i = 0; i < weapon_inventory.size; i++ ) + { + weapon = weapon_inventory[i]; + if ( weapon != self.laststandpistol ) + { + continue; + } + for( j = 0; j < weapon_to_restore.size; j++ ) + { + check_weapon = weapon_to_restore[j]; + if( weapon == check_weapon ) + { + dual_wield_name = WeaponDualWieldWeaponName( weapon_to_restore[j] ); + if ( weapon != "m1911_zm" ) + { + last_clip = self GetWeaponAmmoClip( weapon ); + last_left_clip = 0; + if ( "none" != dual_wield_name ) + { + last_left_clip = self GetWeaponAmmoClip( dual_wield_name ); + } + last_stock = self GetWeaponAmmoStock( weapon ); + last_total = last_clip + last_left_clip + last_stock; + used_amt = self.stored_weapon_info[ weapon ].given_amt - last_total; + if ( used_amt >= self.stored_weapon_info[ weapon ].stock_amt ) + { + used_amt -= self.stored_weapon_info[ weapon ].stock_amt; + self.stored_weapon_info[ weapon ].stock_amt = 0; + self.stored_weapon_info[ weapon ].clip_amt -= used_amt; + if ( self.stored_weapon_info[ weapon ].clip_amt < 0 ) + { + self.stored_weapon_info[ weapon ].clip_amt = 0; + } + } + else + { + new_stock_amt = self.stored_weapon_info[ weapon ].stock_amt - used_amt; + if ( new_stock_amt < self.stored_weapon_info[ weapon ].stock_amt ) + { + self.stored_weapon_info[ weapon ].stock_amt = new_stock_amt; + } + } + } + self SetWeaponAmmoClip( weapon_to_restore[j], self.stored_weapon_info[ weapon_to_restore[j] ].clip_amt ); + if ( "none" != dual_wield_name ) + { + self SetWeaponAmmoClip( dual_wield_name , self.stored_weapon_info[ weapon_to_restore[j] ].left_clip_amt ); + } + self SetWeaponAmmoStock( weapon_to_restore[j], self.stored_weapon_info[ weapon_to_restore[j] ].stock_amt ); + break; + } + } + } +} +zombiemode_solo_last_stand_pistol() +{ + level.laststandpistol = "m1911_upgraded_zm"; +} +last_stand_grenade_save_and_return() +{ + self endon( "death" ); + lethal_nade_amt = 0; + has_lethal_nade = false; + tactical_nade_amt = 0; + has_tactical_nade = false; + weapons_on_player = self GetWeaponsList(); + for ( i = 0; i < weapons_on_player.size; i++ ) + { + if ( self is_player_lethal_grenade( weapons_on_player[i] ) ) + { + has_lethal_nade = true; + lethal_nade_amt = self GetWeaponAmmoClip( self get_player_lethal_grenade() ); + self SetWeaponAmmoClip( self get_player_lethal_grenade(), 0 ); + self TakeWeapon( self get_player_lethal_grenade() ); + } + else if ( self is_player_tactical_grenade( weapons_on_player[i] ) ) + { + has_tactical_nade = true; + tactical_nade_amt = self GetWeaponAmmoClip( self get_player_tactical_grenade() ); + self SetWeaponAmmoClip( self get_player_tactical_grenade(), 0 ); + self TakeWeapon( self get_player_tactical_grenade() ); + } + } + self waittill( "player_revived" ); + if ( has_lethal_nade ) + { + self GiveWeapon( self get_player_lethal_grenade() ); + self SetWeaponAmmoClip( self get_player_lethal_grenade(), lethal_nade_amt ); + } + if ( has_tactical_nade ) + { + self GiveWeapon( self get_player_tactical_grenade() ); + self SetWeaponAmmoClip( self get_player_tactical_grenade(), tactical_nade_amt ); + } +} +spectators_respawn() +{ + level endon( "between_round_over" ); + if( !IsDefined( level.zombie_vars["spectators_respawn"] ) || !level.zombie_vars["spectators_respawn"] ) + { + return; + } + if( !IsDefined( level.custom_spawnPlayer ) ) + { + level.custom_spawnPlayer = ::spectator_respawn; + } + while( 1 ) + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( players[i].sessionstate == "spectator" ) + { + players[i] [[level.spawnPlayer]](); + if (isDefined(level.script) && level.round_number > 6 && players[i].score < 1500) + { + players[i].old_score = players[i].score; + players[i].score = 1500; + players[i] maps\_zombiemode_score::set_player_score_hud(); + } + } + } + wait( 1 ); + } +} +spectator_respawn() +{ + println( "*************************Respawn Spectator***" ); + assert( IsDefined( self.spectator_respawn ) ); + origin = self.spectator_respawn.origin; + angles = self.spectator_respawn.angles; + self setSpectatePermissions( false ); + new_origin = undefined; + if ( isdefined( level.check_valid_spawn_override ) ) + { + new_origin = [[ level.check_valid_spawn_override ]]( self ); + } + if ( !isdefined( new_origin ) ) + { + new_origin = check_for_valid_spawn_near_team( self ); + } + if( IsDefined( new_origin ) ) + { + self Spawn( new_origin, angles ); + } + else + { + self Spawn( origin, angles ); + } + if ( IsDefined( self get_player_placeable_mine() ) ) + { + self TakeWeapon( self get_player_placeable_mine() ); + self set_player_placeable_mine( undefined ); + } + self maps\_zombiemode_equipment::equipment_take(); + self.is_burning = undefined; + self.abilities = []; + self.is_zombie = false; + self.ignoreme = false; + setClientSysState("lsm", "0", self); + self RevivePlayer(); + self notify( "spawned_player" ); + if(IsDefined(level._zombiemode_post_respawn_callback)) + { + self thread [[level._zombiemode_post_respawn_callback]](); + } + self maps\_zombiemode_score::player_reduce_points( "died" ); + bowie_triggers = GetEntArray( "bowie_upgrade", "targetname" ); + self._bowie_zm_equipped = undefined; + players = get_players(); + for( i = 0; i < bowie_triggers.size; i++ ) + { + bowie_triggers[i] SetVisibleToAll(); + for( j = 0; j < players.size; j++ ) + { + if( IsDefined( players[j]._bowie_zm_equipped ) && players[j]._bowie_zm_equipped == 1 ) + { + bowie_triggers[i] SetInvisibleToPlayer( players[j] ); + } + } + } + sickle_triggers = GetEntArray( "sickle_upgrade", "targetname" ); + self._sickle_zm_equipped = undefined; + players = get_players(); + for( i = 0; i < sickle_triggers.size; i++ ) + { + sickle_triggers[i] SetVisibleToAll(); + for( j = 0; j < players.size; j++ ) + { + if( IsDefined( players[j]._sickle_zm_equipped ) && players[j]._sickle_zm_equipped == 1 ) + { + sickle_triggers[i] SetInvisibleToPlayer( players[j] ); + } + } + } + claymore_triggers = getentarray("claymore_purchase","targetname"); + for(i = 0; i < claymore_triggers.size; i++) + { + claymore_triggers[i] SetVisibleToPlayer(self); + claymore_triggers[i].claymores_triggered = false; + } + self thread player_zombie_breadcrumb(); + return true; +} +check_for_valid_spawn_near_team( revivee ) +{ + players = get_players(); + spawn_points = getstructarray("player_respawn_point", "targetname"); + closest_group = undefined; + closest_distance = 100000000; + backup_group = undefined; + backup_distance = 100000000; + if( spawn_points.size == 0 ) + return undefined; + for( i = 0; i < players.size; i++ ) + { + if( is_player_valid( players[i] ) ) + { + for( j = 0 ; j < spawn_points.size; j++ ) + { + if( isdefined(spawn_points[i].script_int) ) + ideal_distance = spawn_points[i].script_int; + else + ideal_distance = 1000; + if ( spawn_points[j].locked == false ) + { + distance = DistanceSquared( players[i].origin, spawn_points[j].origin ); + if( distance < ( ideal_distance * ideal_distance ) ) + { + if ( distance < closest_distance ) + { + closest_distance = distance; + closest_group = j; + } + } + else + { + if ( distance < backup_distance ) + { + backup_group = j; + backup_distance = distance; + } + } + } + } + } + if ( !IsDefined( closest_group ) ) + { + closest_group = backup_group; + } + if ( IsDefined( closest_group ) ) + { + spawn_array = getstructarray( spawn_points[closest_group].target, "targetname" ); + for( k = 0; k < spawn_array.size; k++ ) + { + if( spawn_array[k].script_int == (revivee.entity_num + 1) ) + { + return spawn_array[k].origin; + } + } + return spawn_array[0].origin; + } + } + return undefined; +} +get_players_on_team(exclude) +{ + teammates = []; + players = get_players(); + for(i=0;i= 10 ) + { + multiplier *= level.round_number * 0.15; + } + player_num = get_players().size; + if( player_num == 1 ) + { + max += int( ( 0.5 * level.zombie_vars["zombie_ai_per_player"] ) * multiplier ); + } + else + { + max += int( ( ( player_num - 1 ) * level.zombie_vars["zombie_ai_per_player"] ) * multiplier ); + } + if( !isDefined( level.max_zombie_func ) ) + { + level.max_zombie_func = ::default_max_zombie_func; + } + if ( !(IsDefined( level.kill_counter_hud ) && level.zombie_total > 0) ) + { + level.zombie_total = [[ level.max_zombie_func ]]( max ); + } + if ( IsDefined( level.zombie_total_set_func ) ) + { + level thread [[ level.zombie_total_set_func ]](); + } + if ( level.round_number < 10 ) + { + level thread zombie_speed_up(); + } + mixed_spawns = 0; + old_spawn = undefined; + while( 1 ) + { + while( get_enemy_count() >= level.zombie_ai_limit || level.zombie_total <= 0 ) + { + wait( 0.1 ); + } + if ( !flag("spawn_zombies" ) ) + { + flag_wait( "spawn_zombies" ); + } + spawn_point = level.enemy_spawns[RandomInt( level.enemy_spawns.size )]; + if( !IsDefined( old_spawn ) ) + { + old_spawn = spawn_point; + } + else if( Spawn_point == old_spawn ) + { + spawn_point = level.enemy_spawns[RandomInt( level.enemy_spawns.size )]; + } + old_spawn = spawn_point; + if ( IsDefined( level.mixed_rounds_enabled ) && level.mixed_rounds_enabled == 1 ) + { + spawn_dog = false; + if ( level.round_number > 30 ) + { + if ( RandomInt(100) < 3 ) + { + spawn_dog = true; + } + } + else if ( level.round_number > 25 && mixed_spawns < 3 ) + { + if ( RandomInt(100) < 2 ) + { + spawn_dog = true; + } + } + else if ( level.round_number > 20 && mixed_spawns < 2 ) + { + if ( RandomInt(100) < 2 ) + { + spawn_dog = true; + } + } + else if ( level.round_number > 15 && mixed_spawns < 1 ) + { + if ( RandomInt(100) < 1 ) + { + spawn_dog = true; + } + } + if ( spawn_dog ) + { + keys = GetArrayKeys( level.zones ); + for ( i=0; i 0 ) + { + maps\_zombiemode_ai_dogs::special_dog_spawn( undefined, 1 ); + level.zombie_total--; + wait_network_frame(); + } + } + } + } + } + } + ai = spawn_zombie( spawn_point ); + if( IsDefined( ai ) ) + { + level.zombie_total--; + ai thread round_spawn_failsafe(); + count++; + } + wait( level.zombie_vars["zombie_spawn_delay"] ); + wait_network_frame(); + } +} +zombie_speed_up() +{ + if( level.round_number <= 3 ) + { + return; + } + level endon( "intermission" ); + level endon( "end_of_round" ); + level endon( "restart_round" ); + while ( level.zombie_total > 4 ) + { + wait( 2.0 ); + } + num_zombies = get_enemy_count(); + while( num_zombies > 3 ) + { + wait( 2.0 ); + num_zombies = get_enemy_count(); + } + zombies = GetAiSpeciesArray( "axis", "all" ); + while( zombies.size > 0 ) + { + if( zombies.size == 1 && zombies[0].has_legs == true ) + { + if ( isdefined( level.zombie_speed_up ) ) + { + zombies[0] thread [[ level.zombie_speed_up ]](); + break; + } + else + { + var = randomintrange(1, 4); + zombies[0] set_run_anim( "sprint" + var ); + zombies[0].run_combatanim = level.scr_anim[zombies[0].animname]["sprint" + var]; + } + } + wait(0.5); + zombies = GetAiSpeciesArray( "axis", "all" ); + } +} +round_spawning_test() +{ + while (true) + { + spawn_point = level.enemy_spawns[RandomInt( level.enemy_spawns.size )]; + ai = spawn_zombie( spawn_point ); + ai waittill("death"); + wait 5; + } +} +round_pause( delay ) +{ + if ( !IsDefined( delay ) ) + { + delay = 30; + } + level.countdown_hud = create_counter_hud(); + level.countdown_hud SetValue( delay ); + level.countdown_hud.color = ( 1, 1, 1 ); + level.countdown_hud.alpha = 1; + level.countdown_hud FadeOverTime( 2.0 ); + wait( 2.0 ); + level.countdown_hud.color = ( 0.21, 0, 0 ); + level.countdown_hud FadeOverTime( 3.0 ); + wait(3); + while (delay >= 1) + { + wait (1); + delay--; + level.countdown_hud SetValue( delay ); + } + players = GetPlayers(); + for (i=0; i 0 ) + { + round_pause( level.zombie_vars["game_start_delay"] ); + } + flag_set( "begin_spawning" ); + level.chalk_hud1 = create_chalk_hud(); + level.chalk_hud2 = create_chalk_hud( 64 ); + if( !isDefined(level.round_spawn_func) ) + { + level.round_spawn_func = ::round_spawning; + } + if ( !isDefined(level.round_wait_func) ) + { + level.round_wait_func = ::round_wait; + } + if ( !IsDefined(level.round_think_func) ) + { + level.round_think_func = ::round_think; + } + if( level.mutators["mutator_fogMatch"] ) + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + players[i] thread set_fog( 729.34, 971.99, 338.336, 398.623, 0.58, 0.60, 0.56, 3 ); + } + } + level thread [[ level.round_think_func ]](); +} +create_chalk_hud( x ) +{ + if( !IsDefined( x ) ) + { + x = 0; + } + hud = create_simple_hud(); + hud.alignX = "left"; + hud.alignY = "bottom"; + hud.horzAlign = "user_left"; + hud.vertAlign = "user_bottom"; + hud.color = ( 0.21, 0, 0 ); + hud.x = x; + hud.y = -4; + hud.alpha = 0; + hud.fontscale = 32.0; + hud SetShader( "hud_chalk_1", 64, 64 ); + return hud; +} +destroy_chalk_hud() +{ + if( isDefined( level.chalk_hud1 ) ) + { + level.chalk_hud1 Destroy(); + level.chalk_hud1 = undefined; + } + if( isDefined( level.chalk_hud2 ) ) + { + level.chalk_hud2 Destroy(); + level.chalk_hud2 = undefined; + } +} +play_door_dialog() +{ + level endon( "power_on" ); + self endon ("warning_dialog"); + timer = 0; + while(1) + { + wait(0.05); + players = get_players(); + for(i = 0; i < players.size; i++) + { + dist = distancesquared(players[i].origin, self.origin ); + if(dist > 70*70) + { + timer =0; + continue; + } + while(dist < 70*70 && timer < 3) + { + wait(0.5); + timer++; + } + if(dist > 70*70 && timer >= 3) + { + self playsound("door_deny"); + players[i] maps\_zombiemode_audio::create_and_play_dialog( "general", "door_deny" ); + wait(3); + self notify ("warning_dialog"); + } + } + } +} +wait_until_first_player() +{ + players = get_players(); + if( !IsDefined( players[0] ) ) + { + level waittill( "first_player_ready" ); + } +} +chalk_one_up() +{ + huds = []; + huds[0] = level.chalk_hud1; + huds[1] = level.chalk_hud2; + if( level.round_number >= 1 && level.round_number <= 5 ) + { + huds[0] SetShader( "hud_chalk_" + level.round_number, 64, 64 ); + } + else if ( level.round_number >= 5 && level.round_number <= 10 ) + { + huds[0] SetShader( "hud_chalk_5", 64, 64 ); + } + if( level.round_number > 5 && level.round_number <= 10 ) + { + huds[1] SetShader( "hud_chalk_" + ( level.round_number - 5 ), 64, 64 ); + } + if ( IsDefined( level.chalk_override ) ) + { + huds[0] SetText( level.chalk_override ); + huds[1] SetText( " " ); + } + else if( level.round_number <= 5 ) + { + huds[1] SetText( " " ); + } + else if( level.round_number > 10 ) + { + huds[0].fontscale = 32; + huds[0] SetValue( level.round_number ); + huds[1] SetText( " " ); + } + if(!IsDefined(level.doground_nomusic)) + { + level.doground_nomusic = 0; + } + if( level.first_round ) + { + intro = true; + if( isdefined( level._custom_intro_vox ) ) + { + level thread [[level._custom_intro_vox]](); + } + else + { + level thread play_level_start_vox_delayed(); + } + } + else + { + intro = false; + } + if( level.round_number == 5 || level.round_number == 10 || level.round_number == 20 || level.round_number == 35 || level.round_number == 50 ) + { + players = getplayers(); + rand = RandomIntRange(0,players.size); + players[rand] thread maps\_zombiemode_audio::create_and_play_dialog( "general", "round_" + level.round_number ); + } + round = undefined; + if( intro ) + { + round = create_simple_hud(); + round.alignX = "center"; + round.alignY = "bottom"; + round.horzAlign = "user_center"; + round.vertAlign = "user_bottom"; + round.fontscale = 16; + round.color = ( 1, 1, 1 ); + round.x = 0; + round.y = -265; + round.alpha = 0; + round SetText( &"ZOMBIE_ROUND" ); + huds[0].color = ( 1, 1, 1 ); + huds[0].alpha = 0; + huds[0].horzAlign = "user_center"; + huds[0].x = -5; + huds[0].y = -200; + huds[1] SetText( " " ); + round FadeOverTime( 1 ); + round.alpha = 1; + huds[0] FadeOverTime( 1 ); + huds[0].alpha = 1; + wait( 1 ); + round FadeOverTime( 2 ); + round.color = ( 0.21, 0, 0 ); + huds[0] FadeOverTime( 2 ); + huds[0].color = ( 0.21, 0, 0 ); + wait(2); + } + else + { + for ( i=0; i 10 ) + { + level.chalk_hud2 SetText( " " ); + } + time = level.zombie_vars["zombie_between_round_time"]; + if ( time > 3 ) + { + time = time - 2; + } + for( i = 0; i < huds.size; i++ ) + { + if( IsDefined( huds[i] ) ) + { + huds[i] FadeOverTime( time * 0.25 ); + huds[i].color = ( 1, 1, 1 ); + } + } + fade_time = 0.5; + steps = ( time * 0.5 ) / fade_time; + for( q = 0; q < steps; q++ ) + { + for( i = 0; i < huds.size; i++ ) + { + if( !IsDefined( huds[i] ) ) + { + continue; + } + huds[i] FadeOverTime( fade_time ); + huds[i].alpha = 0; + } + wait( fade_time ); + for( i = 0; i < huds.size; i++ ) + { + if( !IsDefined( huds[i] ) ) + { + continue; + } + huds[i] FadeOverTime( fade_time ); + huds[i].alpha = 1; + } + wait( fade_time ); + } + for( i = 0; i < huds.size; i++ ) + { + if( !IsDefined( huds[i] ) ) + { + continue; + } + huds[i] FadeOverTime( time * 0.25 ); + huds[i].color = ( 0.21, 0, 0 ); + huds[i].alpha = 0; + } + wait ( 2.0 ); +} +round_think() +{ + for( ;; ) + { + maxreward = 50 * level.round_number; + if ( maxreward > 500 ) + maxreward = 500; + level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward; + level.pro_tips_start_time = GetTime(); + level.zombie_last_run_time = GetTime(); + level thread maps\_zombiemode_audio::change_zombie_music( "round_start" ); + chalk_one_up(); + maps\_zombiemode_powerups::powerup_round_start(); + players = get_players(); + array_thread( players, maps\_zombiemode_blockers::rebuild_barrier_reward_reset ); + level thread award_grenades_for_survivors(); + bbPrint( "zombie_rounds: round %d player_count %d", level.round_number, players.size ); + level.round_start_time = GetTime(); + level thread [[level.round_spawn_func]](); + level notify( "start_of_round" ); + [[level.round_wait_func]](); + level.first_round = false; + level notify( "end_of_round" ); + level thread maps\_zombiemode_audio::change_zombie_music( "round_end" ); + UploadStats(); + if ( 1 != players.size ) + { + level thread spectators_respawn(); + } + level chalk_round_over(); + timer = level.zombie_vars["zombie_spawn_delay"]; + if ( timer > 0.08 ) + { + level.zombie_vars["zombie_spawn_delay"] = timer * 0.95; + } + else if ( timer < 0.08 ) + { + level.zombie_vars["zombie_spawn_delay"] = 0.08; + } + level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier"]; + level.round_number++; + level notify( "between_round_over" ); + } +} +award_grenades_for_survivors() +{ + players = get_players(); + for (i = 0; i < players.size; i++) + { + if (!players[i].is_zombie) + { + lethal_grenade = players[i] get_player_lethal_grenade(); + if( !players[i] HasWeapon( lethal_grenade ) ) + { + players[i] GiveWeapon( lethal_grenade ); + players[i] SetWeaponAmmoClip( lethal_grenade, 0 ); + } + if ( players[i] GetFractionMaxAmmo( lethal_grenade ) < .25 ) + { + players[i] SetWeaponAmmoClip( lethal_grenade, 2 ); + } + else if (players[i] GetFractionMaxAmmo( lethal_grenade ) < .5 ) + { + players[i] SetWeaponAmmoClip( lethal_grenade, 3 ); + } + else + { + players[i] SetWeaponAmmoClip( lethal_grenade, 4 ); + } + } + } +} +ai_calculate_health( round_number ) +{ + level.zombie_health = level.zombie_vars["zombie_health_start"]; + for ( i=2; i<=round_number; i++ ) + { + if( i >= 10 ) + { + level.zombie_health += Int( level.zombie_health * level.zombie_vars["zombie_health_increase_multiplier"] ); + } + else + { + level.zombie_health = Int( level.zombie_health + level.zombie_vars["zombie_health_increase"] ); + } + } +} +round_spawn_failsafe() +{ + self endon("death"); + prevorigin = self.origin; + while(1) + { + if( !level.zombie_vars["zombie_use_failsafe"] ) + { + return; + } + if ( is_true( self.ignore_round_spawn_failsafe ) ) + { + return; + } + wait( 30 ); + if ( isDefined(self.lastchunk_destroy_time) ) + { + if ( (GetTime() - self.lastchunk_destroy_time) < 8000 ) + continue; + } + if ( self.origin[2] < level.zombie_vars["below_world_check"] ) + { + if(is_true(level.put_timed_out_zombies_back_in_queue ) && !flag("dog_round") ) + { + level.zombie_total++; + } + self dodamage( self.health + 100, (0,0,0) ); + break; + } + if ( DistanceSquared( self.origin, prevorigin ) < 576 ) + { + if(is_true(level.put_timed_out_zombies_back_in_queue ) && !flag("dog_round")) + { + if(!self.ignoreall && !is_true(self.nuked) && !is_true(self.marked_for_death)) + { + level.zombie_total++; + } + } + level.zombies_timeout_playspace++; + self dodamage( self.health + 100, (0,0,0) ); + break; + } + prevorigin = self.origin; + } +} +round_wait() +{ + wait( 1 ); + if( flag("dog_round" ) ) + { + wait(7); + while( level.dog_intermission ) + { + wait(0.5); + } + } + else + { + while( get_enemy_count() > 0 || level.zombie_total > 0 || level.intermission ) + { + if( flag( "end_round_wait" ) ) + { + return; + } + wait( 1.0 ); + } + } +} +is_friendly_fire_on() +{ + return level.mutators[ "mutator_friendlyFire" ]; +} +can_revive( reviver ) +{ + if( self has_powerup_weapon() ) + { + return false; + } + return true; +} +zombify_player() +{ + self maps\_zombiemode_score::player_died_penalty(); + bbPrint( "zombie_playerdeaths: round %d playername %s deathtype died x %f y %f z %f", level.round_number, self.playername, self.origin ); + if ( IsDefined( level.deathcard_spawn_func ) ) + { + self [[level.deathcard_spawn_func]](); + } + if( !IsDefined( level.zombie_vars["zombify_player"] ) || !level.zombie_vars["zombify_player"] ) + { + if (!is_true(self.solo_respawn )) + { + self thread spawnSpectator(); + } + return; + } + self.ignoreme = true; + self.is_zombie = true; + self.zombification_time = GetTime(); + self.team = "axis"; + self notify( "zombified" ); + if( IsDefined( self.revivetrigger ) ) + { + self.revivetrigger Delete(); + } + self.revivetrigger = undefined; + self setMoveSpeedScale( 0.3 ); + self reviveplayer(); + self TakeAllWeapons(); + self GiveWeapon( "zombie_melee", 0 ); + self SwitchToWeapon( "zombie_melee" ); + self DisableWeaponCycling(); + self DisableOffhandWeapons(); + self VisionSetNaked( "zombie_turned", 1 ); + maps\_utility::setClientSysState( "zombify", 1, self ); + self thread maps\_zombiemode_spawner::zombie_eye_glow(); + self thread injured_walk(); + self thread playerzombie_player_damage(); + self thread playerzombie_soundboard(); +} +playerzombie_player_damage() +{ + self endon( "death" ); + self endon( "disconnect" ); + self thread playerzombie_infinite_health(); + self.zombiehealth = level.zombie_health; + while( 1 ) + { + self waittill( "damage", amount, attacker, directionVec, point, type ); + if( !IsDefined( attacker ) || !IsPlayer( attacker ) ) + { + wait( 0.05 ); + continue; + } + self.zombiehealth -= amount; + if( self.zombiehealth <= 0 ) + { + self thread playerzombie_downed_state(); + self waittill( "playerzombie_downed_state_done" ); + self.zombiehealth = level.zombie_health; + } + } +} +playerzombie_downed_state() +{ + self endon( "death" ); + self endon( "disconnect" ); + downTime = 15; + startTime = GetTime(); + endTime = startTime +( downTime * 1000 ); + self thread playerzombie_downed_hud(); + self.playerzombie_soundboard_disable = true; + self thread maps\_zombiemode_spawner::zombie_eye_glow_stop(); + self DisableWeapons(); + self AllowStand( false ); + self AllowCrouch( false ); + self AllowProne( true ); + while( GetTime() < endTime ) + { + wait( 0.05 ); + } + self.playerzombie_soundboard_disable = false; + self thread maps\_zombiemode_spawner::zombie_eye_glow(); + self EnableWeapons(); + self AllowStand( true ); + self AllowCrouch( false ); + self AllowProne( false ); + self notify( "playerzombie_downed_state_done" ); +} +playerzombie_downed_hud() +{ + self endon( "death" ); + self endon( "disconnect" ); + text = NewClientHudElem( self ); + text.alignX = "center"; + text.alignY = "middle"; + text.horzAlign = "user_center"; + text.vertAlign = "user_bottom"; + text.foreground = true; + text.font = "default"; + text.fontScale = 1.8; + text.alpha = 0; + text.color = ( 1.0, 1.0, 1.0 ); + text SetText( &"ZOMBIE_PLAYERZOMBIE_DOWNED" ); + text.y = -113; + if( IsSplitScreen() ) + { + text.y = -137; + } + text FadeOverTime( 0.1 ); + text.alpha = 1; + self waittill( "playerzombie_downed_state_done" ); + text FadeOverTime( 0.1 ); + text.alpha = 0; +} +playerzombie_infinite_health() +{ + self endon( "death" ); + self endon( "disconnect" ); + bighealth = 100000; + while( 1 ) + { + if( self.health < bighealth ) + { + self.health = bighealth; + } + wait( 0.1 ); + } +} +playerzombie_soundboard() +{ + self endon( "death" ); + self endon( "disconnect" ); + self.playerzombie_soundboard_disable = false; + self.buttonpressed_use = false; + self.buttonpressed_attack = false; + self.buttonpressed_ads = false; + self.useSound_waitTime = 3 * 1000; + self.useSound_nextTime = GetTime(); + useSound = "playerzombie_usebutton_sound"; + self.attackSound_waitTime = 3 * 1000; + self.attackSound_nextTime = GetTime(); + attackSound = "playerzombie_attackbutton_sound"; + self.adsSound_waitTime = 3 * 1000; + self.adsSound_nextTime = GetTime(); + adsSound = "playerzombie_adsbutton_sound"; + self.inputSound_nextTime = GetTime(); + while( 1 ) + { + if( self.playerzombie_soundboard_disable ) + { + wait( 0.05 ); + continue; + } + if( self UseButtonPressed() ) + { + if( self can_do_input( "use" ) ) + { + self thread playerzombie_play_sound( useSound ); + self thread playerzombie_waitfor_buttonrelease( "use" ); + self.useSound_nextTime = GetTime() + self.useSound_waitTime; + } + } + else if( self AttackButtonPressed() ) + { + if( self can_do_input( "attack" ) ) + { + self thread playerzombie_play_sound( attackSound ); + self thread playerzombie_waitfor_buttonrelease( "attack" ); + self.attackSound_nextTime = GetTime() + self.attackSound_waitTime; + } + } + else if( self AdsButtonPressed() ) + { + if( self can_do_input( "ads" ) ) + { + self thread playerzombie_play_sound( adsSound ); + self thread playerzombie_waitfor_buttonrelease( "ads" ); + self.adsSound_nextTime = GetTime() + self.adsSound_waitTime; + } + } + wait( 0.05 ); + } +} +can_do_input( inputType ) +{ + if( GetTime() < self.inputSound_nextTime ) + { + return false; + } + canDo = false; + switch( inputType ) + { + case "use": + if( GetTime() >= self.useSound_nextTime && !self.buttonpressed_use ) + { + canDo = true; + } + break; + case "attack": + if( GetTime() >= self.attackSound_nextTime && !self.buttonpressed_attack ) + { + canDo = true; + } + break; + case "ads": + if( GetTime() >= self.useSound_nextTime && !self.buttonpressed_ads ) + { + canDo = true; + } + break; + default: + ASSERTMSG( "can_do_input(): didn't recognize inputType of " + inputType ); + break; + } + return canDo; +} +playerzombie_play_sound( alias ) +{ + self play_sound_on_ent( alias ); +} +playerzombie_waitfor_buttonrelease( inputType ) +{ + if( inputType != "use" && inputType != "attack" && inputType != "ads" ) + { + ASSERTMSG( "playerzombie_waitfor_buttonrelease(): inputType of " + inputType + " is not recognized." ); + return; + } + notifyString = "waitfor_buttonrelease_" + inputType; + self notify( notifyString ); + self endon( notifyString ); + if( inputType == "use" ) + { + self.buttonpressed_use = true; + while( self UseButtonPressed() ) + { + wait( 0.05 ); + } + self.buttonpressed_use = false; + } + else if( inputType == "attack" ) + { + self.buttonpressed_attack = true; + while( self AttackButtonPressed() ) + { + wait( 0.05 ); + } + self.buttonpressed_attack = false; + } + else if( inputType == "ads" ) + { + self.buttonpressed_ads = true; + while( self AdsButtonPressed() ) + { + wait( 0.05 ); + } + self.buttonpressed_ads = false; + } +} +remove_ignore_attacker() +{ + self notify( "new_ignore_attacker" ); + self endon( "new_ignore_attacker" ); + self endon( "disconnect" ); + if( !isDefined( level.ignore_enemy_timer ) ) + { + level.ignore_enemy_timer = 0.4; + } + wait( level.ignore_enemy_timer ); + self.ignoreAttacker = undefined; +} +player_damage_override_cheat( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); + return 0; +} +player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + iDamage = self check_player_damage_callbacks( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); + if ( !iDamage ) + { + return 0; + } + if( sWeapon == "crossbow_explosive_upgraded_zm" && sMeansOfDeath == "MOD_IMPACT" ) + { + level.monkey_bolt_holder = self; + } + if( GetSubStr(sWeapon, 0, 8 ) == "blow_gun" && sMeansOfDeath == "MOD_IMPACT" ) + { + eAttacker notify( "blow_gun_hit", self, eInflictor ); + } + if( self maps\_laststand::player_is_in_laststand() ) + { + return 0; + } + if ( isDefined( eInflictor ) ) + { + if ( is_true( eInflictor.water_damage ) ) + { + return 0; + } + } + if( isDefined( eAttacker ) ) + { + if(is_true(eAttacker.is_zombie)) + { + self.stats["damage_taken"] += iDamage; + } + if( isDefined( self.ignoreAttacker ) && self.ignoreAttacker == eAttacker ) + { + return 0; + } + if( (isDefined( eAttacker.is_zombie ) && eAttacker.is_zombie) || level.mutators["mutator_friendlyFire"] ) + { + self.ignoreAttacker = eAttacker; + self thread remove_ignore_attacker(); + if ( isdefined( eAttacker.custom_damage_func ) ) + { + iDamage = eAttacker [[ eAttacker.custom_damage_func ]]( self ); + } + else if ( isdefined( eAttacker.meleeDamage ) ) + { + iDamage = eAttacker.meleeDamage; + } + else + { + iDamage = 50; + } + } + eAttacker notify( "hit_player" ); + if( is_true(eattacker.is_zombie) && eattacker.animname == "director_zombie" ) + { + self PlaySound( "zmb_director_light_hit" ); + if(RandomIntRange(0,1) == 0 ) + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "hitmed" ); + } + else + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "hitlrg" ); + } + } + else if( sMeansOfDeath != "MOD_FALLING" ) + { + self PlaySound( "evt_player_swiped" ); + if(RandomIntRange(0,1) == 0 ) + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "hitmed" ); + } + else + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "hitlrg" ); + } + } + } + finalDamage = iDamage; + if ( is_placeable_mine( sWeapon ) || sWeapon == "freezegun_zm" || sWeapon == "freezegun_upgraded_zm" ) + { + return 0; + } + if ( isDefined( self.player_damage_override ) ) + { + self thread [[ self.player_damage_override ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); + } + if( sMeansOfDeath == "MOD_FALLING" ) + { + if ( self HasPerk( "specialty_flakjacket" ) && isdefined( self.divetoprone ) && self.divetoprone == 1 ) + { + if ( IsDefined( level.zombiemode_divetonuke_perk_func ) ) + { + [[ level.zombiemode_divetonuke_perk_func ]]( self, self.origin ); + } + return 0; + } + } + if( sMeansOfDeath == "MOD_PROJECTILE" || sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" ) + { + if ( self HasPerk( "specialty_flakjacket" ) ) + { + return 0; + } + if( self.health > 75 ) + { + return 75; + } + } + if( iDamage < self.health ) + { + if ( IsDefined( eAttacker ) ) + { + eAttacker.sound_damage_player = self; + if( IsDefined( eAttacker.has_legs ) && !eAttacker.has_legs ) + { + self maps\_zombiemode_audio::create_and_play_dialog( "general", "crawl_hit" ); + } + else if( IsDefined( eAttacker.animname ) && ( eAttacker.animname == "monkey_zombie" ) ) + { + self maps\_zombiemode_audio::create_and_play_dialog( "general", "monkey_hit" ); + } + } + return finalDamage; + } + if( level.intermission ) + { + level waittill( "forever" ); + } + players = get_players(); + count = 0; + for( i = 0; i < players.size; i++ ) + { + if( players[i] == self || players[i].is_zombie || players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator" ) + { + count++; + } + } + if( count < players.size ) + { + return finalDamage; + } + if ( players.size == 1 && flag( "solo_game" ) ) + { + if ( self.lives == 0 ) + { + self.intermission = true; + } + } + solo_death = ( players.size == 1 && flag( "solo_game" ) && self.lives == 0 ); + non_solo_death = ( players.size > 1 || ( players.size == 1 && !flag( "solo_game" ) ) ); + if ( solo_death || non_solo_death ) + { + self thread maps\_laststand::PlayerLastStand( eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime ); + self player_fake_death(); + } + if( count == players.size ) + { + if ( players.size == 1 && flag( "solo_game" ) ) + { + if ( self.lives == 0 ) + { + level notify("pre_end_game"); + wait_network_frame(); + level notify( "end_game" ); + } + else + { + self thread wait_and_revive(); + return finalDamage; + } + } + else + { + level notify("pre_end_game"); + wait_network_frame(); + level notify( "end_game" ); + } + return 0; + } + else + { + return finalDamage; + } +} +check_player_damage_callbacks( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + if ( !isdefined( level.player_damage_callbacks ) ) + { + return iDamage; + } + for ( i = 0; i < level.player_damage_callbacks.size; i++ ) + { + newDamage = self [[ level.player_damage_callbacks[i] ]]( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ); + if ( -1 != newDamage ) + { + return newDamage; + } + } + return iDamage; +} +register_player_damage_callback( func ) +{ + if ( !isdefined( level.player_damage_callbacks ) ) + { + level.player_damage_callbacks = []; + } + level.player_damage_callbacks[level.player_damage_callbacks.size] = func; +} +wait_and_revive() +{ + flag_set( "wait_and_revive" ); + if ( isdefined( self.waiting_to_revive ) && self.waiting_to_revive == true ) + { + return; + } + self.waiting_to_revive = true; + if ( isdefined( level.exit_level_func ) ) + { + self thread [[ level.exit_level_func ]](); + } + else + { + self thread default_exit_level(); + } + while ( 1 ) + { + if ( self maps\_laststand::player_is_in_laststand() ) + { + break; + } + wait_network_frame(); + } + solo_revive_time = 10.0; + self.revive_hud setText( &"ZOMBIE_REVIVING_SOLO", self ); + self maps\_laststand::revive_hud_show_n_fade( solo_revive_time ); + flag_wait_or_timeout("instant_revive", solo_revive_time); + flag_clear( "wait_and_revive" ); + self maps\_laststand::auto_revive( self ); + self.lives--; + self.waiting_to_revive = false; +} +actor_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, modelIndex, psOffsetTime ) +{ + if( weapon == "crossbow_explosive_upgraded_zm" && meansofdeath == "MOD_IMPACT" ) + { + level.monkey_bolt_holder = self; + } + if( GetSubStr(weapon, 0, 8 ) == "blow_gun" && meansofdeath == "MOD_IMPACT" ) + { + attacker notify( "blow_gun_hit", self, inflictor ); + } + if ( isdefined( attacker.animname ) && attacker.animname == "quad_zombie" ) + { + if ( isdefined( self.animname ) && self.animname == "quad_zombie" ) + { + return 0; + } + } + if( !isdefined( self) || !isdefined( attacker ) ) + return damage; + if ( !isplayer( attacker ) && isdefined( self.non_attacker_func ) ) + { + override_damage = self [[ self.non_attacker_func ]]( damage, weapon ); + if ( override_damage ) + return override_damage; + } + if ( !isplayer( attacker ) && !isplayer( self ) ) + return damage; + if( !isdefined( damage ) || !isdefined( meansofdeath ) ) + return damage; + if( meansofdeath == "" ) + return damage; + old_damage = damage; + final_damage = damage; + if ( IsDefined( self.actor_damage_func ) ) + { + final_damage = [[ self.actor_damage_func ]]( weapon, old_damage, attacker ); + } + if ( IsDefined( self.actor_full_damage_func ) ) + { + final_damage = [[ self.actor_full_damage_func ]]( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, modelIndex, psOffsetTime ); + } + if( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) + attacker = attacker.owner; + if( !isDefined( self.damage_assists ) ) + { + self.damage_assists = []; + } + if ( !isdefined( self.damage_assists[attacker.entity_num] ) ) + { + self.damage_assists[attacker.entity_num] = attacker; + } + if( level.mutators[ "mutator_headshotsOnly" ] && !is_headshot( weapon, sHitLoc, meansofdeath ) ) + { + return 0; + } + if( level.mutators[ "mutator_powerShot" ] ) + { + final_damage = int( final_damage * 1.5 ); + } + if ( is_true( self.in_water ) ) + { + if ( int( final_damage ) >= self.health ) + { + self.water_damage = true; + } + } + return int( final_damage ); +} +is_headshot( sWeapon, sHitLoc, sMeansOfDeath ) +{ + return (sHitLoc == "head" || sHitLoc == "helmet") && sMeansOfDeath != "MOD_MELEE" && sMeansOfDeath != "MOD_BAYONET" && sMeansOfDeath != "MOD_IMPACT"; +} +actor_killed_override(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime) +{ + if ( game["state"] == "postgame" ) + return; + if( isai(attacker) && isDefined( attacker.script_owner ) ) + { + if ( attacker.script_owner.team != self.aiteam ) + attacker = attacker.script_owner; + } + if( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) + attacker = attacker.owner; + if( IsPlayer( level.monkey_bolt_holder ) && sMeansOfDeath == "MOD_GRENADE_SPLASH" + && ( sWeapon == "crossbow_explosive_upgraded_zm" || sWeapon == "explosive_bolt_upgraded_zm" ) ) + { + level._bolt_on_back = level._bolt_on_back + 1; + } + if ( isdefined( attacker ) && isplayer( attacker ) ) + { + multiplier = 1; + if( is_headshot( sWeapon, sHitLoc, sMeansOfDeath ) ) + { + multiplier = 1.5; + } + type = undefined; + if ( IsDefined(self.animname) ) + { + switch( self.animname ) + { + case "quad_zombie": + type = "quadkill"; + break; + case "ape_zombie": + type = "apekill"; + break; + case "zombie": + type = "zombiekill"; + break; + case "zombie_dog": + type = "dogkill"; + break; + } + } + } + if(is_true(self.is_ziplining)) + { + self.deathanim = undefined; + } + if ( IsDefined( self.actor_killed_override ) ) + { + self [[ self.actor_killed_override ]]( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime ); + } +} +process_assist( type, attacker ) +{ + if ( isDefined( self.damage_assists ) ) + { + for ( j = 0; j < self.damage_assists.size; j++ ) + { + player = self.damage_assists[j]; + if ( !isDefined( player ) ) + continue; + if ( player == attacker ) + continue; + } + self.damage_assists = undefined; + } +} +end_game() +{ + level waittill ( "end_game" ); + clientnotify( "zesn" ); + level thread maps\_zombiemode_audio::change_zombie_music( "game_over" ); + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + setClientSysState( "lsm", "0", players[i] ); + } + StopAllRumbles(); + level.intermission = true; + level.zombie_vars["zombie_powerup_insta_kill_time"] = 0; + level.zombie_vars["zombie_powerup_fire_sale_time"] = 0; + level.zombie_vars["zombie_powerup_point_doubler_time"] = 0; + wait 0.1; + update_leaderboards(); + game_over = []; + survived = []; + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + game_over[i] = NewClientHudElem( players[i] ); + game_over[i].alignX = "center"; + game_over[i].alignY = "middle"; + game_over[i].horzAlign = "center"; + game_over[i].vertAlign = "middle"; + game_over[i].y -= 130; + game_over[i].foreground = true; + game_over[i].fontScale = 3; + game_over[i].alpha = 0; + game_over[i].color = ( 1.0, 1.0, 1.0 ); + game_over[i] SetText( &"ZOMBIE_GAME_OVER" ); + game_over[i] FadeOverTime( 1 ); + game_over[i].alpha = 1; + if ( players[i] isSplitScreen() ) + { + game_over[i].y += 40; + } + survived[i] = NewClientHudElem( players[i] ); + survived[i].alignX = "center"; + survived[i].alignY = "middle"; + survived[i].horzAlign = "center"; + survived[i].vertAlign = "middle"; + survived[i].y -= 100; + survived[i].foreground = true; + survived[i].fontScale = 2; + survived[i].alpha = 0; + survived[i].color = ( 1.0, 1.0, 1.0 ); + if ( players[i] isSplitScreen() ) + { + survived[i].y += 40; + } + if( level.round_number < 2 ) + { + if( level.script == "zombie_moon" ) + { + if( !isdefined(level.left_nomans_land) ) + { + nomanslandtime = level.nml_best_time; + player_survival_time = int( nomanslandtime/1000 ); + player_survival_time_in_mins = maps\_zombiemode::to_mins( player_survival_time ); + survived[i] SetText( &"ZOMBIE_SURVIVED_NOMANS", player_survival_time_in_mins ); + } + else if( level.left_nomans_land==2 ) + { + survived[i] SetText( &"ZOMBIE_SURVIVED_ROUND" ); + } + } + else + { + survived[i] SetText( &"ZOMBIE_SURVIVED_ROUND" ); + } + } + else + { + survived[i] SetText( &"ZOMBIE_SURVIVED_ROUNDS", level.round_number ); + } + survived[i] FadeOverTime( 1 ); + survived[i].alpha = 1; + } + players = get_players(); + for (i = 0; i < players.size; i++) + { + players[i] SetClientDvars( "ammoCounterHide", "1", + "miniscoreboardhide", "1" ); + } + destroy_chalk_hud(); + UploadStats(); + wait( 1 ); + wait( 2 ); + intermission(); + wait( level.zombie_vars["zombie_intermission_time"] ); + level notify( "stop_intermission" ); + array_thread( get_players(), ::player_exit_level ); + bbPrint( "zombie_epilogs: rounds %d", level.round_number ); + players = get_players(); + for (i = 0; i < players.size; i++) + { + survived[i] FadeOverTime( 1 ); + survived[i].alpha = 0; + game_over[i] FadeOverTime( 1 ); + game_over[i].alpha = 0; + } + wait( 1.5 ); + for ( j = 0; j < get_players().size; j++ ) + { + player = get_players()[j]; + player CameraActivate( false ); + survived[j] Destroy(); + game_over[j] Destroy(); + } + if ( level.onlineGame || level.systemLink ) + { + ExitLevel( false ); + } + else + { + MissionFailed(); + } + wait( 666 ); +} +update_leaderboards() +{ + uploadGlobalStatCounters(); + if ( GetPlayers().size <= 1 ) + { + cheater_found = maps\_zombiemode_ffotd::nazizombies_checking_for_cheats(); + if( cheater_found == false ) + { + nazizombies_upload_solo_highscore(); + } + return; + } + if( level.systemLink ) + { + return; + } + if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size ) + { + return; + } + cheater_found = maps\_zombiemode_ffotd::nazizombies_checking_for_cheats(); + if( cheater_found == false ) + { + nazizombies_upload_highscore(); + nazizombies_set_new_zombie_stats(); + } +} +initializeStatTracking() +{ + level.global_zombies_killed = 0; +} +uploadGlobalStatCounters() +{ + incrementCounter( "global_zombies_killed", level.global_zombies_killed ); + incrementCounter( "global_zombies_killed_by_players", level.zombie_player_killed_count ); + incrementCounter( "global_zombies_killed_by_traps", level.zombie_trap_killed_count ); +} +player_fake_death() +{ + level notify ("fake_death"); + self notify ("fake_death"); + self TakeAllWeapons(); + self AllowProne( true ); + self AllowStand( false ); + self AllowCrouch( false ); + self.ignoreme = true; + self EnableInvulnerability(); + wait( 1 ); + self FreezeControls( true ); +} +player_exit_level() +{ + self AllowStand( true ); + self AllowCrouch( false ); + self AllowProne( false ); + if( IsDefined( self.game_over_bg ) ) + { + self.game_over_bg.foreground = true; + self.game_over_bg.sort = 100; + self.game_over_bg FadeOverTime( 1 ); + self.game_over_bg.alpha = 1; + } +} +player_killed_override() +{ + level waittill( "forever" ); +} +injured_walk() +{ + self.ground_ref_ent = Spawn( "script_model", ( 0, 0, 0 ) ); + self.player_speed = 50; + self AllowSprint( false ); + self AllowProne( false ); + self AllowCrouch( false ); + self AllowAds( false ); + self AllowJump( false ); + self PlayerSetGroundReferenceEnt( self.ground_ref_ent ); + self thread limp(); +} +limp() +{ + level endon( "disconnect" ); + level endon( "death" ); + stumble = 0; + alt = 0; + while( 1 ) + { + velocity = self GetVelocity(); + player_speed = abs( velocity[0] ) + abs( velocity[1] ); + if( player_speed < 10 ) + { + wait( 0.05 ); + continue; + } + speed_multiplier = player_speed / self.player_speed; + p = RandomFloatRange( 3, 5 ); + if( RandomInt( 100 ) < 20 ) + { + p *= 3; + } + r = RandomFloatRange( 3, 7 ); + y = RandomFloatRange( -8, -2 ); + stumble_angles = ( p, y, r ); + stumble_angles = vector_scale( stumble_angles, speed_multiplier ); + stumble_time = RandomFloatRange( .35, .45 ); + recover_time = RandomFloatRange( .65, .8 ); + stumble++; + if( speed_multiplier > 1.3 ) + { + stumble++; + } + self thread stumble( stumble_angles, stumble_time, recover_time ); + level waittill( "recovered" ); + } +} +stumble( stumble_angles, stumble_time, recover_time, no_notify ) +{ + stumble_angles = self adjust_angles_to_player( stumble_angles ); + self.ground_ref_ent RotateTo( stumble_angles, stumble_time, ( stumble_time/4*3 ), ( stumble_time/4 ) ); + self.ground_ref_ent waittill( "rotatedone" ); + base_angles = ( RandomFloat( 4 ) - 4, RandomFloat( 5 ), 0 ); + base_angles = self adjust_angles_to_player( base_angles ); + self.ground_ref_ent RotateTo( base_angles, recover_time, 0, ( recover_time / 2 ) ); + self.ground_ref_ent waittill( "rotatedone" ); + if( !IsDefined( no_notify ) ) + { + level notify( "recovered" ); + } +} +adjust_angles_to_player( stumble_angles ) +{ + pa = stumble_angles[0]; + ra = stumble_angles[2]; + rv = AnglesToRight( self.angles ); + fv = AnglesToForward( self.angles ); + rva = ( rv[0], 0, rv[1]*-1 ); + fva = ( fv[0], 0, fv[1]*-1 ); + angles = vector_scale( rva, pa ); + angles = angles + vector_scale( fva, ra ); + return angles +( 0, stumble_angles[1], 0 ); +} +coop_player_spawn_placement() +{ + structs = getstructarray( "initial_spawn_points", "targetname" ); + temp_ent = Spawn( "script_model", (0,0,0) ); + for( i = 0; i < structs.size; i++ ) + { + temp_ent.origin = structs[i].origin; + temp_ent placeSpawnpoint(); + structs[i].origin = temp_ent.origin; + } + temp_ent Delete(); + flag_wait( "all_players_connected" ); + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + players[i] setorigin( structs[i].origin ); + players[i] setplayerangles( structs[i].angles ); + players[i].spectator_respawn = structs[i]; + } +} +player_zombie_breadcrumb() +{ + self endon( "disconnect" ); + self endon( "spawned_spectator" ); + level endon( "intermission" ); + self.zombie_breadcrumbs = []; + self.zombie_breadcrumb_distance = 24 * 24; + self.zombie_breadcrumb_area_num = 3; + self.zombie_breadcrumb_area_distance = 16; + self store_crumb( self.origin ); + last_crumb = self.origin; + self thread debug_breadcrumbs(); + while( 1 ) + { + wait_time = 0.1; + store_crumb = true; + airborne = false; + crumb = self.origin; + if ( !self IsOnGround() && self isinvehicle() ) + { + trace = bullettrace( self.origin + (0,0,10), self.origin, false, undefined ); + crumb = trace["position"]; + } + if( !airborne && DistanceSquared( crumb, last_crumb ) < self.zombie_breadcrumb_distance ) + { + store_crumb = false; + } + if ( airborne && self IsOnGround() ) + { + store_crumb = true; + airborne = false; + } + if( isDefined( level.custom_breadcrumb_store_func ) ) + { + store_crumb = self [[ level.custom_breadcrumb_store_func ]]( store_crumb ); + } + if( isDefined( level.custom_airborne_func ) ) + { + airborne = self [[ level.custom_airborne_func ]]( airborne ); + } + if( store_crumb ) + { + debug_print( "Player is storing breadcrumb " + crumb ); + if( IsDefined(self.node) ) + { + debug_print( "has closest node " ); + } + last_crumb = crumb; + self store_crumb( crumb ); + } + wait( wait_time ); + } +} +store_crumb( origin ) +{ + offsets = []; + height_offset = 32; + index = 0; + for( j = 1; j <= self.zombie_breadcrumb_area_num; j++ ) + { + offset = ( j * self.zombie_breadcrumb_area_distance ); + offsets[0] = ( origin[0] - offset, origin[1], origin[2] ); + offsets[1] = ( origin[0] + offset, origin[1], origin[2] ); + offsets[2] = ( origin[0], origin[1] - offset, origin[2] ); + offsets[3] = ( origin[0], origin[1] + offset, origin[2] ); + offsets[4] = ( origin[0] - offset, origin[1], origin[2] + height_offset ); + offsets[5] = ( origin[0] + offset, origin[1], origin[2] + height_offset ); + offsets[6] = ( origin[0], origin[1] - offset, origin[2] + height_offset ); + offsets[7] = ( origin[0], origin[1] + offset, origin[2] + height_offset ); + for ( i = 0; i < offsets.size; i++ ) + { + self.zombie_breadcrumbs[index] = offsets[i]; + index++; + } + } +} +to_mins( seconds ) +{ + hours = 0; + minutes = 0; + if( seconds > 59 ) + { + minutes = int( seconds / 60 ); + seconds = int( seconds * 1000 ) % ( 60 * 1000 ); + seconds = seconds * 0.001; + if( minutes > 59 ) + { + hours = int( minutes / 60 ); + minutes = int( minutes * 1000 ) % ( 60 * 1000 ); + minutes = minutes * 0.001; + } + } + if( hours < 10 ) + { + hours = "0" + hours; + } + if( minutes < 10 ) + { + minutes = "0" + minutes; + } + seconds = Int( seconds ); + if( seconds < 10 ) + { + seconds = "0" + seconds; + } + combined = "" + hours + ":" + minutes + ":" + seconds; + return combined; +} +nazizombies_upload_solo_highscore() +{ + map_name = GetDvar( #"mapname" ); + if ( !isZombieLeaderboardAvailable( map_name, "kills" ) ) + return; + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( map_name == "zombie_moon" ) + { + nomanslandtime = level.nml_best_time; + nomansland_kills = level.nml_kills; + nomansland_score = level.nml_score; + player_survival_time = int( nomanslandtime/1000 ); + total_score = nomansland_score; + total_kills = nomansland_kills; + leaderboard_number = getZombieLeaderboardNumber( map_name, "kills" ); + rounds_survived = level.round_number; + if( isdefined(level.nml_didteleport) && (level.nml_didteleport==false) ) + { + rounds_survived = 0; + } + rankNumber = makeNMLRankNumberSolo( total_kills, total_score ); + if( !isdefined(level.round_number) ) + { + level.round_number = 0; + } + if( !isdefined(level.nml_pap) ) + { + level.nml_pap = 0; + } + if( !isdefined(level.nml_speed) ) + { + level.nml_speed = 0; + } + if( !isdefined(level.nml_jugg) ) + { + level.nml_jugg = 0; + } + if( !isdefined(level.sololb_build_number) ) + { + level.sololb_build_number = 48; + } + players[i] UploadScore( leaderboard_number, int(rankNumber), total_kills, total_score, player_survival_time, rounds_survived, level.sololb_build_number, level.nml_pap, level.nml_speed, level.nml_jugg ); + } + } +} +makeNMLRankNumberSolo( total_kills, total_score ) +{ + maximum_survival_time = 108000; + if( total_kills > 2000 ) + total_kills = 2000; + if( total_score > 99999 ) + total_score = 99999; + score_padding = ""; + if ( total_score < 10 ) + score_padding += "0000"; + else if( total_score < 100 ) + score_padding += "000"; + else if( total_score < 1000 ) + score_padding += "00"; + else if( total_score < 10000 ) + score_padding += "0"; + rankNumber = total_kills + score_padding + total_score; + return rankNumber; +} +nazizombies_upload_highscore() +{ + playersRank = 1; + if( level.players_playing == 1 ) + playersRank = 4; + else if( level.players_playing == 2 ) + playersRank = 3; + else if( level.players_playing == 3 ) + playersRank = 2; + map_name = GetDvar( #"mapname" ); + if ( !isZombieLeaderboardAvailable( map_name, "waves" ) || !isZombieLeaderboardAvailable( map_name, "points" ) ) + return; + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + pre_highest_wave = players[i] playerZombieStatGet( map_name, "highestwave" ); + pre_time_in_wave = players[i] playerZombieStatGet( map_name, "timeinwave" ); + new_highest_wave = level.round_number + "" + playersRank; + new_highest_wave = int( new_highest_wave ); + if( new_highest_wave >= pre_highest_wave ) + { + if( players[i].zombification_time == 0 ) + { + players[i].zombification_time = GetTime(); + } + player_survival_time = players[i].zombification_time - level.round_start_time; + player_survival_time = int( player_survival_time/1000 ); + if( new_highest_wave > pre_highest_wave || player_survival_time > pre_time_in_wave ) + { + rankNumber = makeRankNumber( level.round_number, playersRank, player_survival_time ); + leaderboard_number = getZombieLeaderboardNumber( map_name, "waves" ); + players[i] UploadScore( leaderboard_number, int(rankNumber), level.round_number, player_survival_time, level.players_playing ); + players[i] playerZombieStatSet( map_name, "highestwave", new_highest_wave ); + players[i] playerZombieStatSet( map_name, "timeinwave", player_survival_time ); + } + } + pre_total_points = players[i] playerZombieStatGet( map_name, "totalpoints" ); + if( players[i].score_total > pre_total_points ) + { + leaderboard_number = getZombieLeaderboardNumber( map_name, "points" ); + players[i] UploadScore( leaderboard_number, players[i].score_total, players[i].kills, level.players_playing ); + players[i] playerZombieStatSet( map_name, "totalpoints", players[i].score_total ); + } + } +} +isZombieLeaderboardAvailable( map, type ) +{ + if ( !isDefined( level.zombieLeaderboardNumber[map] ) ) + return 0; + if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) ) + return 0; + return 1; +} +getZombieLeaderboardNumber( map, type ) +{ + if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) ) + assertMsg( "Unknown leaderboard number for map " + map + "and type " + type ); + return level.zombieLeaderboardNumber[map][type]; +} +getZombieStatVariable( map, variable ) +{ + if ( !isDefined( level.zombieLeaderboardStatVariable[map][variable] ) ) + assertMsg( "Unknown stat variable " + variable + " for map " + map ); + return level.zombieLeaderboardStatVariable[map][variable]; +} +playerZombieStatGet( map, variable ) +{ + stat_variable = getZombieStatVariable( map, variable ); + result = self zombieStatGet( stat_variable ); + return result; +} +playerZombieStatSet( map, variable, value ) +{ + stat_variable = getZombieStatVariable( map, variable ); + self zombieStatSet( stat_variable, value ); +} +nazizombies_set_new_zombie_stats() +{ + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + total_kills = players[i] zombieStatGet( "zombie_kills" ) + players[i].stats["kills"]; + total_points = players[i] zombieStatGet( "zombie_points" ) + players[i].stats["score"]; + total_rounds = players[i] zombieStatGet( "zombie_rounds" ) + (level.round_number - 1); + total_downs = players[i] zombieStatGet( "zombie_downs" ) + players[i].stats["downs"]; + total_revives = players[i] zombieStatGet( "zombie_revives" ) + players[i].stats["revives"]; + total_perks = players[i] zombieStatGet( "zombie_perks_consumed" ) + players[i].stats["perks"]; + total_headshots = players[i] zombieStatGet( "zombie_heashots" ) + players[i].stats["headshots"]; + total_zombie_gibs = players[i] zombieStatGet( "zombie_gibs" ) + players[i].stats["zombie_gibs"]; + players[i] zombieStatSet( "zombie_kills", total_kills ); + players[i] zombieStatSet( "zombie_points", total_points ); + players[i] zombieStatSet( "zombie_rounds", total_rounds ); + players[i] zombieStatSet( "zombie_downs", total_downs ); + players[i] zombieStatSet( "zombie_revives", total_revives ); + players[i] zombieStatSet( "zombie_perks_consumed", total_perks ); + players[i] zombieStatSet( "zombie_heashots", total_headshots ); + players[i] zombieStatSet( "zombie_gibs", total_zombie_gibs ); + } +} +makeRankNumber( wave, players, time ) +{ + if( time > 86400 ) + time = 86400; + padding = ""; + if ( 10 > time ) + padding += "0000"; + else if( 100 > time ) + padding += "000"; + else if( 1000 > time ) + padding += "00"; + else if( 10000 > time ) + padding += "0"; + rank = wave + "" + players + padding + time; + return rank; +} +zombieStatGet( dataName ) +{ + if( level.systemLink ) + { + return; + } + if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size ) + { + return; + } + return ( self getdstat( "PlayerStatsList", dataName ) ); +} +zombieStatSet( dataName, value ) +{ + if( level.systemLink ) + { + return; + } + if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size ) + { + return; + } + self setdstat( "PlayerStatsList", dataName, value ); +} +intermission() +{ + level.intermission = true; + level notify( "intermission" ); + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + setclientsysstate( "levelNotify", "zi", players[i] ); + players[i] SetClientDvars( "cg_thirdPerson", "0", + "cg_fov", "65" ); + players[i].health = 100; + players[i] thread [[level.custom_intermission]](); + } + wait( 0.25 ); + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + setClientSysState( "lsm", "0", players[i] ); + } + visionset = "zombie"; + if( IsDefined( level.zombie_vars["intermission_visionset"] ) ) + { + visionset = level.zombie_vars["intermission_visionset"]; + } + level thread maps\_utility::set_all_players_visionset( visionset, 2 ); + level thread zombie_game_over_death(); +} +zombie_game_over_death() +{ + zombies = GetAiArray( "axis" ); + for( i = 0; i < zombies.size; i++ ) + { + if( !IsAlive( zombies[i] ) ) + { + continue; + } + zombies[i] SetGoalPos( zombies[i].origin ); + } + for( i = 0; i < zombies.size; i++ ) + { + if( !IsAlive( zombies[i] ) ) + { + continue; + } + wait( 0.5 + RandomFloat( 2 ) ); + if ( isdefined( zombies[i] ) ) + { + zombies[i] maps\_zombiemode_spawner::zombie_head_gib(); + zombies[i] DoDamage( zombies[i].health + 666, zombies[i].origin ); + } + } +} +player_intermission() +{ + self closeMenu(); + self closeInGameMenu(); + level endon( "stop_intermission" ); + self endon("disconnect"); + self endon("death"); + self notify( "_zombie_game_over" ); + self.score = self.score_total; + self.sessionstate = "intermission"; + self.spectatorclient = -1; + self.killcamentity = -1; + self.archivetime = 0; + self.psoffsettime = 0; + self.friendlydamage = undefined; + points = getstructarray( "intermission", "targetname" ); + if( !IsDefined( points ) || points.size == 0 ) + { + points = getentarray( "info_intermission", "classname" ); + if( points.size < 1 ) + { + println( "NO info_intermission POINTS IN MAP" ); + return; + } + } + self.game_over_bg = NewClientHudelem( self ); + self.game_over_bg.horzAlign = "fullscreen"; + self.game_over_bg.vertAlign = "fullscreen"; + self.game_over_bg SetShader( "black", 640, 480 ); + self.game_over_bg.alpha = 1; + org = undefined; + while( 1 ) + { + points = array_randomize( points ); + for( i = 0; i < points.size; i++ ) + { + point = points[i]; + if( !IsDefined( org ) ) + { + self Spawn( point.origin, point.angles ); + } + if( IsDefined( points[i].target ) ) + { + if( !IsDefined( org ) ) + { + org = Spawn( "script_model", self.origin + ( 0, 0, -60 ) ); + org SetModel("tag_origin"); + } + org.origin = points[i].origin; + org.angles = points[i].angles; + for ( j = 0; j < get_players().size; j++ ) + { + player = get_players()[j]; + player CameraSetPosition( org ); + player CameraSetLookAt(); + player CameraActivate( true ); + } + speed = 20; + if( IsDefined( points[i].speed ) ) + { + speed = points[i].speed; + } + target_point = getstruct( points[i].target, "targetname" ); + dist = Distance( points[i].origin, target_point.origin ); + time = dist / speed; + q_time = time * 0.25; + if( q_time > 1 ) + { + q_time = 1; + } + self.game_over_bg FadeOverTime( q_time ); + self.game_over_bg.alpha = 0; + org MoveTo( target_point.origin, time, q_time, q_time ); + org RotateTo( target_point.angles, time, q_time, q_time ); + wait( time - q_time ); + self.game_over_bg FadeOverTime( q_time ); + self.game_over_bg.alpha = 1; + wait( q_time ); + } + else + { + self.game_over_bg FadeOverTime( 1 ); + self.game_over_bg.alpha = 0; + wait( 5 ); + self.game_over_bg thread fade_up_over_time(1); + } + } + } +} +fade_up_over_time(t) +{ + self FadeOverTime( t ); + self.alpha = 1; +} +prevent_near_origin() +{ + while (1) + { + players = get_players(); + for (i = 0; i < players.size; i++) + { + for (q = 0; q < players.size; q++) + { + if (players[i] != players[q]) + { + if (check_to_kill_near_origin(players[i], players[q])) + { + p1_org = players[i].origin; + p2_org = players[q].origin; + wait 5; + if (check_to_kill_near_origin(players[i], players[q])) + { + if ( (distance(players[i].origin, p1_org) < 30) && distance(players[q].origin, p2_org) < 30) + { + setsaveddvar("player_deathInvulnerableTime", 0); + players[i] DoDamage( players[i].health + 1000, players[i].origin, undefined, undefined, "riflebullet" ); + setsaveddvar("player_deathInvulnerableTime", level.startInvulnerableTime); + } + } + } + } + } + } + wait 0.2; + } +} +check_to_kill_near_origin(player1, player2) +{ + if (!isdefined(player1) || !isdefined(player2)) + { + return false; + } + if (distance(player1.origin, player2.origin) > 12) + { + return false; + } + if ( player1 maps\_laststand::player_is_in_laststand() || player2 maps\_laststand::player_is_in_laststand() ) + { + return false; + } + if (!isalive(player1) || !isalive(player2)) + { + return false; + } + return true; +} +crawler_round_tracker() +{ + level.crawler_round_count = 1; + level.next_crawler_round = 4; + sav_func = level.round_spawn_func; + while ( 1 ) + { + level waittill ( "between_round_over" ); + if ( level.round_number == level.next_crawler_round ) + { + sav_func = level.round_spawn_func; + crawler_round_start(); + level.round_spawn_func = ::round_spawning; + if ( IsDefined( level.next_dog_round ) ) + { + level.next_crawler_round = level.next_dog_round + randomintrange( 2, 3 ); + } + else + { + level.next_crawler_round = randomintrange( 4, 6 ); + } + } + else if ( flag( "crawler_round" ) ) + { + crawler_round_stop(); + if ( IsDefined( level.next_dog_round ) && + level.next_dog_round == level.round_number ) + { + level.round_spawn_func = sav_func; + } + level.crawler_round_count += 1; + } + } +} +crawler_round_start() +{ + flag_set( "crawler_round" ); + if(!IsDefined (level.crawlerround_nomusic)) + { + level.crawlerround_nomusic = 0; + } + level.crawlerround_nomusic = 1; + level notify( "crawler_round_starting" ); + clientnotify( "crawler_start" ); +} +crawler_round_stop() +{ + flag_clear( "crawler_round" ); + if(!IsDefined (level.crawlerround_nomusic)) + { + level.crawlerround_nomusic = 0; + } + level.crawlerround_nomusic = 0; + level notify( "crawler_round_ending" ); + clientnotify( "crawler_stop" ); +} +default_exit_level() +{ + zombies = GetAiArray( "axis" ); + for ( i = 0; i < zombies.size; i++ ) + { + if ( is_true( zombies[i].ignore_solo_last_stand ) ) + { + continue; + } + if ( isDefined( zombies[i].find_exit_point ) ) + { + zombies[i] thread [[ zombies[i].find_exit_point ]](); + continue; + } + if ( zombies[i].ignoreme ) + { + zombies[i] thread default_delayed_exit(); + } + else + { + zombies[i] thread default_find_exit_point(); + } + } +} +default_delayed_exit() +{ + self endon( "death" ); + while ( 1 ) + { + if ( !flag( "wait_and_revive" ) ) + { + return; + } + if ( !self.ignoreme ) + { + break; + } + wait_network_frame(); + } + self thread default_find_exit_point(); +} +default_find_exit_point() +{ + self endon( "death" ); + player = getplayers()[0]; + dist_zombie = 0; + dist_player = 0; + dest = 0; + away = VectorNormalize( self.origin - player.origin ); + endPos = self.origin + vector_scale( away, 600 ); + locs = array_randomize( level.enemy_dog_locations ); + for ( i = 0; i < locs.size; i++ ) + { + dist_zombie = DistanceSquared( locs[i].origin, endPos ); + dist_player = DistanceSquared( locs[i].origin, player.origin ); + if ( dist_zombie < dist_player ) + { + dest = i; + break; + } + } + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self setgoalpos( locs[dest].origin ); + while ( 1 ) + { + if ( !flag( "wait_and_revive" ) ) + { + break; + } + wait_network_frame(); + } + self thread maps\_zombiemode_spawner::find_flesh(); +} +play_level_start_vox_delayed() +{ + wait(5); + players = getplayers(); + num = RandomIntRange( 0, players.size ); + players[num] maps\_zombiemode_audio::create_and_play_dialog( "general", "intro" ); +} +init_screen_stats() +{ + level.zombies_timeout_spawn_info = NewHudElem(); + level.zombies_timeout_spawn_info.alignX = "right"; + level.zombies_timeout_spawn_info.x = 100; + level.zombies_timeout_spawn_info.y = 80; + level.zombies_timeout_spawn_info.label = "Timeout(Spawncloset): "; + level.zombies_timeout_spawn_info.fontscale = 1.2; + level.zombies_timeout_playspace_info = NewHudElem(); + level.zombies_timeout_playspace_info.alignX = "right"; + level.zombies_timeout_playspace_info.x = 100; + level.zombies_timeout_playspace_info.y = 95; + level.zombies_timeout_playspace_info.label ="Timeout(Playspace): "; + level.zombies_timeout_playspace_info.fontscale = 1.2; + level.zombie_player_killed_count_info = NewHudElem(); + level.zombie_player_killed_count_info.alignX = "right"; + level.zombie_player_killed_count_info.x = 100; + level.zombie_player_killed_count_info.y = 110; + level.zombie_player_killed_count_info.label = "Zombies killed by players: "; + level.zombie_player_killed_count_info.fontscale = 1.2; + level.zombie_trap_killed_count_info = NewHudElem(); + level.zombie_trap_killed_count_info.alignX = "right"; + level.zombie_trap_killed_count_info.x = 100; + level.zombie_trap_killed_count_info.y = 125; + level.zombie_trap_killed_count_info.label = "Zombies killed by traps: "; + level.zombie_trap_killed_count_info.fontscale = 1.2; + level.zombie_pathing_failed_info = NewHudElem(); + level.zombie_pathing_failed_info.alignX = "right"; + level.zombie_pathing_failed_info.x = 100; + level.zombie_pathing_failed_info.y = 140; + level.zombie_pathing_failed_info.label = "Pathing failed: "; + level.zombie_pathing_failed_info.fontscale = 1.2; + level.zombie_breadcrumb_failed_info = NewHudElem(); + level.zombie_breadcrumb_failed_info.alignX = "right"; + level.zombie_breadcrumb_failed_info.x = 100; + level.zombie_breadcrumb_failed_info.y = 155; + level.zombie_breadcrumb_failed_info.label = "Breadcrumbs failed: "; + level.zombie_breadcrumb_failed_info.fontscale = 1.2; + level.player_0_distance_traveled_info = NewHudElem(); + level.player_0_distance_traveled_info.alignX = "right"; + level.player_0_distance_traveled_info.x = 100; + level.player_0_distance_traveled_info.y = 170; + level.player_0_distance_traveled_info.label = "Player(0) Distance traveled: "; + level.player_0_distance_traveled_info.fontscale = 1.2; +} +update_screen_stats() +{ + flag_wait("all_players_spawned"); + while(1) + { + wait(1); + if(getdvarint("zombie_show_stats") == 0) + { + level.zombies_timeout_spawn_info.alpha = 0; + level.zombies_timeout_playspace_info.alpha = 0; + level.zombie_player_killed_count_info.alpha = 0; + level.zombie_trap_killed_count_info.alpha = 0; + level.zombie_pathing_failed_info.alpha = 0; + level.zombie_breadcrumb_failed_info.alpha = 0; + level.player_0_distance_traveled_info.alpha = 0; + continue; + } + else + { + level.zombies_timeout_spawn_info.alpha = 1; + level.zombies_timeout_playspace_info.alpha = 1; + level.zombie_player_killed_count_info.alpha = 1; + level.zombie_trap_killed_count_info.alpha = 1; + level.zombie_pathing_failed_info.alpha = 1; + level.zombie_breadcrumb_failed_info.alpha = 1; + level.player_0_distance_traveled_info.alpha = 1; + level.zombies_timeout_spawn_info setValue( level.zombies_timeout_spawn ); + level.zombies_timeout_playspace_info SetValue(level.zombies_timeout_playspace ); + level.zombie_player_killed_count_info SetValue( level.zombie_player_killed_count); + level.zombie_trap_killed_count_info SetValue( level.zombie_trap_killed_count); + level.zombie_pathing_failed_info SetValue( level.zombie_pathing_failed ); + level.zombie_breadcrumb_failed_info SetValue( level.zombie_breadcrumb_failed ); + level.player_0_distance_traveled_info SetValue( get_players()[0].stats["distance_traveled"] ); + } + } +} +register_sidequest( id, solo_stat, solo_collectible, coop_stat, coop_collectible ) +{ + if ( !IsDefined( level.zombie_sidequest_solo_stat ) ) + { + level.zombie_sidequest_previously_completed = []; + level.zombie_sidequest_solo_stat = []; + level.zombie_sidequest_solo_collectible = []; + level.zombie_sidequest_coop_stat = []; + level.zombie_sidequest_coop_collectible = []; + } + level.zombie_sidequest_solo_stat[id] = solo_stat; + level.zombie_sidequest_solo_collectible[id] = solo_collectible; + level.zombie_sidequest_coop_stat[id] = coop_stat; + level.zombie_sidequest_coop_collectible[id] = coop_collectible; + flag_wait( "all_players_spawned" ); + level.zombie_sidequest_previously_completed[id] = false; + if ( flag( "solo_game" ) ) + { + if ( IsDefined( level.zombie_sidequest_solo_collectible[id] ) ) + { + level.zombie_sidequest_previously_completed[id] = HasCollectible( level.zombie_sidequest_solo_collectible[id] ); + } + } + else + { + if ( level.systemLink || GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size ) + { + if ( IsDefined( level.zombie_sidequest_coop_collectible[id] ) ) + { + level.zombie_sidequest_previously_completed[id] = HasCollectible( level.zombie_sidequest_coop_collectible[id] ); + } + return; + } + if ( !isdefined( level.zombie_sidequest_coop_stat[id] ) ) + { + return; + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] zombieStatGet( level.zombie_sidequest_coop_stat[id] ) ) + { + level.zombie_sidequest_previously_completed[id] = true; + return; + } + } + } +} +is_sidequest_previously_completed(id) +{ + return is_true( level.zombie_sidequest_previously_completed[id] ); +} +set_sidequest_completed(id) +{ + if ( maps\_cheat::is_cheating() || flag( "has_cheated" ) ) + { + return; + } + if ( flag( "solo_game" ) ) + { + client_notify_str = "SQS"; + } + else + { + client_notify_str = "SQC"; + } + clientnotify( client_notify_str ); + level notify( "zombie_sidequest_completed", id ); + level.zombie_sidequest_previously_completed[id] = true; + if ( level.systemLink ) + { + return; + } + if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size ) + { + return; + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( level.zombie_sidequest_solo_stat[id] ) ) + { + players[i] zombieStatSet( level.zombie_sidequest_solo_stat[id], (players[i] zombieStatGet( level.zombie_sidequest_solo_stat[id] ) + 1) ); + } + if ( !flag( "solo_game" ) && isdefined( level.zombie_sidequest_coop_stat[id] ) ) + { + players[i] zombieStatSet( level.zombie_sidequest_coop_stat[id], (players[i] zombieStatGet( level.zombie_sidequest_coop_stat[id] ) + 1) ); + } + } +} + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_ai_ape.gsc b/BO1/PC/ZM/maps/_zombiemode_ai_ape.gsc new file mode 100644 index 0000000..21f20a4 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_ai_ape.gsc @@ -0,0 +1,1511 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include animscripts\zombie_Utility; +init() +{ + PrecacheRumble( "explosion_generic" ); + init_ape_zombie_anims(); + init_ape_powerup_drops(); + level._effect["ape_groundhit"] = loadfx("maps/zombie/fx_zombie_ape_grnd_hit"); + level._effect["ape_spawn"] = loadfx("maps/zombie/fx_zombie_ape_spawn_dust"); + level._effect["ape_impact"] = loadfx("maps/zombie/fx_zombie_flesh_hit_ape"); + level._effect["ape_trail"] = loadfx("maps/zombie/fx_zombie_ape_spawn_trail"); + if( !isDefined( level.ape_zombie_spawn_heuristic ) ) + { + level.ape_zombie_spawn_heuristic = maps\_zombiemode_ai_ape::ape_zombie_default_spawn_heuristic; + } + if( !isDefined( level.ape_zombie_pathfind_heuristic ) ) + { + level.ape_zombie_pathfind_heuristic = maps\_zombiemode_ai_ape::ape_zombie_default_pathfind_heuristic; + } + if ( !isDefined( level.ape_zombie_enter_level ) ) + { + level.ape_zombie_enter_level = maps\_zombiemode_ai_ape::ape_zombie_default_enter_level; + } + if ( !isDefined( level.ape_zombie_activation ) ) + { + level.ape_zombie_activation = ::ape_zombie_check_for_activation; + } + precacheshellshock( "electrocution" ); + level.ape_idle_nodes = GetNodeArray( "boss_idle", "script_noteworthy" ); + level.num_ape_zombies = 0; + level.ape_zombie_spawners = GetEntArray( "boss_zombie_spawner", "targetname" ); + array_thread( level.ape_zombie_spawners, ::add_spawn_function, maps\_zombiemode_ai_ape::ape_prespawn ); + if( !isDefined( level.max_ape_zombies ) ) + { + level.max_ape_zombies = 1; + } + if( !isDefined( level.ape_respawn_timer ) ) + { + level.ape_respawn_timer = 30; + } + if( !isDefined( level.ape_zombie_health_mult ) ) + { + level.ape_zombie_health_mult = 7; + } + if( !isDefined( level.ape_zombie_damage_mult ) ) + { + level.ape_zombie_damage_mult = 2; + } + if( !isDefined( level.ape_zombie_min_health ) ) + { + level.ape_zombie_min_health = 10000; + } + if( !isDefined( level.ape_zombie_scream_a_chance ) ) + { + level.ape_zombie_scream_a_chance = 100; + } + if( !isDefined( level.ape_zombie_scream_a_radius ) ) + { + level.ape_zombie_scream_a_radius_sq = 512*512; + } + if( !isDefined( level.ape_zombie_scream_b_chance ) ) + { + level.ape_zombie_scream_b_chance = 0; + } + if( !isDefined( level.ape_zombie_scream_b_radius ) ) + { + level.ape_zombie_scream_b_radius_sq = 512*512; + } + if( !isDefined( level.ape_zombie_groundhit_damage ) ) + { + level.ape_zombie_groundhit_damage = 100; + } + if( !isDefined( level.ape_zombie_groundhit_trigger_radius ) ) + { + level.ape_zombie_groundhit_trigger_radius = 96; + } + if( !isDefined( level.ape_zombie_groundhit_damage_radius ) ) + { + level.ape_zombie_groundhit_damage_radius = 280; + } + if( !isDefined( level.ape_zombie_proximity_wake ) ) + { + level.ape_zombie_proximity_wake = 48; + } + if( !isDefined( level.ape_thundergun_damage ) ) + { + level.ape_thundergun_damage = 250; + } + if( !isDefined( level.ape_fire_damage ) ) + { + level.ape_fire_damage = 500; + } + if( !isDefined( level.ape_ground_attack_delay ) ) + { + level.ape_ground_attack_delay = 5000; + } + if( !isDefined( level.ape_tesla_damage ) ) + { + level.ape_tesla_damage = 1000; + } + firstSpawners = GetEntArray( "first_boss_spawner", "script_noteworthy" ); + if( isDefined( firstSpawners ) && firstSpawners.size > 0 ) + { + if( firstSpawners.size > level.max_ape_zombies ) + { + chosenSpawners = []; + while( chosenSpawners.size < level.max_ape_zombies ) + { + index = RandomInt( firstSpawners.size ); + if( firstSpawners[index].script_string == "boss" ) + { + chosenSpawners = array_add( chosenSpawners, firstSpawners[index] ); + } + firstSpawners = array_remove( firstSpawners, firstSpawners[index] ); + } + } + else + { + chosenSpawners = firstSpawners; + } + for( i = 0; i < chosenSpawners.size; i++ ) + { + chosenSpawners[i] ape_zombie_spawn(); + } + } + level thread ape_zombie_update_proximity_wake(); + level.ammo_spawn = true; + level.ape_death = 0; + level.ape_death_ammo = 2; + level.ape_death_total = 0; + level.ape_health_reduce = 0.7; + level.ape_intermission = false; + flag_init( "ape_round" ); + flag_clear( "ape_round" ); + flag_init( "tgun_react" ); + flag_clear( "tgun_react" ); + flag_init( "last_ape_down" ); + flag_clear( "last_ape_down" ); + level thread ape_adjust_max_ammo(); + level thread ape_round_tracker(); +} +#using_animtree( "generic_human" ); +ape_prespawn() +{ + self.animname = "ape_zombie"; + self.custom_idle_setup = maps\_zombiemode_ai_ape::ape_zombie_idle_setup; + self.damage_mult = level.ape_zombie_damage_mult; + self.a.idleAnimOverrideArray = []; + self.a.idleAnimOverrideArray["stand"] = []; + self.a.idleAnimOverrideWeights["stand"] = []; + self.a.idleAnimOverrideArray["stand"][0][0] = %ai_zombie_simianaut_idle; + self.a.idleAnimOverrideWeights["stand"][0][0] = 10; + self.a.idleAnimOverrideArray["stand"][0][1] = %ai_zombie_simianaut_idle; + self.a.idleAnimOverrideWeights["stand"][0][1] = 10; + rand = randomIntRange( 1, 5 ); + self.deathanim = level.scr_anim["ape_zombie"]["death"+rand]; + self.ignorelocationaldamage = true; + self.ignoreall = true; + self.allowdeath = true; + self.is_zombie = true; + self.has_legs = true; + self allowedStances( "stand" ); + self.gibbed = false; + self.head_gibbed = false; + self.disableArrivals = true; + self.disableExits = true; + self.grenadeawareness = 0; + self.badplaceawareness = 0; + self.ignoreSuppression = true; + self.suppressionThreshold = 1; + self.noDodgeMove = true; + self.dontShootWhileMoving = true; + self.pathenemylookahead = 0; + self.badplaceawareness = 0; + self.chatInitialized = false; + self.a.disablePain = true; + self disable_react(); + if ( isdefined( level.user_ryan_ape ) ) + { + self thread maps\_zombiemode_ai_ape::ape_health_watch(); + } + self.freezegun_damage = 0; + self.dropweapon = false; + self thread maps\_zombiemode_spawner::zombie_damage_failsafe(); + self thread maps\_zombiemode_spawner::delayed_zombie_eye_glow(); + self.flame_damage_time = 0; + self.meleeDamage = 50; + self.no_powerups = true; + self thread maps\_zombiemode_ai_ape::ape_set_airstrike_damage(); + self.thundergun_disintegrate_func = ::ape_thundergun_disintegrate; + self.thundergun_fling_func = ::ape_thundergun_disintegrate; + self.fire_damage_func = ::ape_fire_damage; + self.custom_damage_func = ::ape_custom_damage; + self.actor_damage_func = ::ape_actor_damage; + self.nuke_damage_func = ::ape_nuke_damage; + self.tesla_damage_func = ::ape_tesla_damage; + self.dog_damage_func = ::ape_dog_damage; + self.zombie_damage_fx_func = ::ape_zombie_damage_fx; + self.non_attacker_func = ::ape_non_attacker; + self.entered_level = false; + self.chest_beat = false; + self.restart = 0; + self.speed_up = 0; + self setPhysParams( 24, 0, 36 ); + self setTeamForEntity( "axis" ); + self notify( "zombie_init_done" ); +} +ape_health_watch() +{ + self endon( "death" ); + while ( 1 ) + { + wait( 1 ); + } +} +ape_set_airstrike_damage() +{ + flag_wait( "all_players_connected" ); + players = GetPlayers(); + if ( players.size == 4 ) + { + self.maxAirstrikeDamage = 125; + } + else + { + self.maxAirstrikeDamage = 100; + } +} +ape_zombie_idle_setup() +{ + self.a.array["turn_left_45"] = %exposed_tracking_turn45L; + self.a.array["turn_left_90"] = %exposed_tracking_turn90L; + self.a.array["turn_left_135"] = %exposed_tracking_turn135L; + self.a.array["turn_left_180"] = %exposed_tracking_turn180L; + self.a.array["turn_right_45"] = %exposed_tracking_turn45R; + self.a.array["turn_right_90"] = %exposed_tracking_turn90R; + self.a.array["turn_right_135"] = %exposed_tracking_turn135R; + self.a.array["turn_right_180"] = %exposed_tracking_turn180L; + self.a.array["exposed_idle"] = array( %ai_zombie_simianaut_idle, %ai_zombie_simianaut_idle ); + self.a.array["straight_level"] = %ai_zombie_simianaut_idle; + self.a.array["stand_2_crouch"] = %ai_zombie_shot_leg_right_2_crawl; +} +init_ape_zombie_anims() +{ + level.scr_anim["ape_zombie"]["death1"] = %ai_zombie_boss_death; + level.scr_anim["ape_zombie"]["death2"] = %ai_zombie_boss_death_a; + level.scr_anim["ape_zombie"]["death3"] = %ai_zombie_boss_death_explode; + level.scr_anim["ape_zombie"]["death4"] = %ai_zombie_boss_death_mg; + level.scr_anim["ape_zombie"]["walk1"] = %ai_zombie_simianaut_walk; + level.scr_anim["ape_zombie"]["walk2"] = %ai_zombie_simianaut_walk; + level.scr_anim["ape_zombie"]["walk3"] = %ai_zombie_simianaut_walk; + level.scr_anim["ape_zombie"]["walk4"] = %ai_zombie_simianaut_walk; + level.scr_anim["ape_zombie"]["walk5"] = %ai_zombie_simianaut_walk; + level.scr_anim["ape_zombie"]["walk6"] = %ai_zombie_simianaut_walk; + level.scr_anim["ape_zombie"]["walk7"] = %ai_zombie_simianaut_walk; + level.scr_anim["ape_zombie"]["walk8"] = %ai_zombie_simianaut_walk; + level.scr_anim["ape_zombie"]["run1"] = %ai_zombie_walk_fast_v1; + level.scr_anim["ape_zombie"]["run2"] = %ai_zombie_walk_fast_v2; + level.scr_anim["ape_zombie"]["run3"] = %ai_zombie_walk_fast_v3; + level.scr_anim["ape_zombie"]["run4"] = %ai_zombie_run_v2; + level.scr_anim["ape_zombie"]["run5"] = %ai_zombie_run_v4; + level.scr_anim["ape_zombie"]["run6"] = %ai_zombie_run_v3; + level.scr_anim["ape_zombie"]["sprint1"] = %ai_zombie_simianaut_run_man; + level.scr_anim["ape_zombie"]["sprint2"] = %ai_zombie_simianaut_run_side; + level.scr_anim["ape_zombie"]["sprint3"] = %ai_zombie_simianaut_run; + level.scr_anim["ape_zombie"]["sprint4"] = %ai_zombie_simianaut_run_fast; + level.scr_anim["ape_zombie"]["wounded1"] = %ai_zombie_simianaut_run_wounded; + level.scr_anim["ape_zombie"]["crawl1"] = %ai_zombie_crawl; + level.scr_anim["ape_zombie"]["crawl2"] = %ai_zombie_crawl_v1; + level.scr_anim["ape_zombie"]["crawl3"] = %ai_zombie_crawl_v2; + level.scr_anim["ape_zombie"]["crawl4"] = %ai_zombie_crawl_v3; + level.scr_anim["ape_zombie"]["crawl5"] = %ai_zombie_crawl_v4; + level.scr_anim["ape_zombie"]["crawl6"] = %ai_zombie_crawl_v5; + level.scr_anim["ape_zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a; + level.scr_anim["ape_zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b; + level.scr_anim["ape_zombie"]["crawl_sprint1"] = %ai_zombie_crawl_sprint; + level.scr_anim["ape_zombie"]["crawl_sprint2"] = %ai_zombie_crawl_sprint_1; + level.scr_anim["ape_zombie"]["crawl_sprint3"] = %ai_zombie_crawl_sprint_2; + if( !isDefined( level._zombie_melee ) ) + { + level._zombie_melee = []; + } + if( !isDefined( level._zombie_walk_melee ) ) + { + level._zombie_walk_melee = []; + } + if( !isDefined( level._zombie_run_melee ) ) + { + level._zombie_run_melee = []; + } + level._zombie_melee["ape_zombie"] = []; + level._zombie_walk_melee["ape_zombie"] = []; + level._zombie_run_melee["ape_zombie"] = []; + level._zombie_melee["ape_zombie"][0] = %ai_semianaut_attack_v1; + level._zombie_melee["ape_zombie"][1] = %ai_semianaut_attack_v1; + level._zombie_melee["ape_zombie"][2] = %ai_semianaut_attack_v1; + level._zombie_melee["ape_zombie"][3] = %ai_semianaut_attack_v1; + level._zombie_melee["ape_zombie"][3] = %ai_semianaut_attack_v1; + if( isDefined( level.ape_zombie_anim_override ) ) + { + [[ level.ape_zombie_anim_override ]](); + } + level._zombie_run_melee["ape_zombie"][0] = %ai_semianaut_attack_v1; + level._zombie_run_melee["ape_zombie"][1] = %ai_semianaut_attack_v1; + level._zombie_run_melee["ape_zombie"][2] = %ai_semianaut_attack_v1; + if( !isDefined( level._zombie_melee_crawl ) ) + { + level._zombie_melee_crawl = []; + } + level._zombie_melee_crawl["ape_zombie"] = []; + level._zombie_melee_crawl["ape_zombie"][0] = %ai_zombie_attack_crawl; + level._zombie_melee_crawl["ape_zombie"][1] = %ai_zombie_attack_crawl_lunge; + if( !isDefined( level._zombie_stumpy_melee ) ) + { + level._zombie_stumpy_melee = []; + } + level._zombie_stumpy_melee["ape_zombie"] = []; + level._ape_zombie_stumpy_melee["ape_zombie"][0] = %ai_zombie_walk_on_hands_shot_a; + level._ape_zombie_stumpy_melee["ape_zombie"][1] = %ai_zombie_walk_on_hands_shot_b; + if( !isDefined( level._zombie_tesla_deaths ) ) + { + level._zombie_tesla_deaths = []; + } + level._zombie_tesla_death["ape_zombie"] = []; + level._zombie_tesla_death["ape_zombie"][0] = %ai_zombie_boss_tesla_death_a; + level._zombie_tesla_death["ape_zombie"][1] = %ai_zombie_boss_tesla_death_a; + level._zombie_tesla_death["ape_zombie"][2] = %ai_zombie_boss_tesla_death_a; + level._zombie_tesla_death["ape_zombie"][3] = %ai_zombie_boss_tesla_death_a; + level._zombie_tesla_death["ape_zombie"][4] = %ai_zombie_boss_tesla_death_a; + if( !isDefined( level._zombie_tesla_crawl_death ) ) + { + level._zombie_tesla_crawl_death = []; + } + level._zombie_tesla_crawl_death["ape_zombie"] = []; + level._zombie_tesla_crawl_death["ape_zombie"][0] = %ai_zombie_tesla_crawl_death_a; + level._zombie_tesla_crawl_death["ape_zombie"][1] = %ai_zombie_tesla_crawl_death_b; + if( !isDefined( level._zombie_deaths ) ) + { + level._zombie_deaths = []; + } + level._zombie_deaths["ape_zombie"] = []; + level._zombie_deaths["ape_zombie"][0] = %ai_zombie_boss_death; + level._zombie_deaths["ape_zombie"][1] = %ai_zombie_boss_death_a; + level._zombie_deaths["ape_zombie"][2] = %ai_zombie_boss_death_explode; + level._zombie_deaths["ape_zombie"][3] = %ai_zombie_boss_death_mg; + if( !isDefined( level._zombie_rise_anims ) ) + { + level._zombie_rise_anims = []; + } + level._zombie_rise_anims["ape_zombie"] = []; + level._zombie_rise_anims["ape_zombie"][1]["walk"][0] = %ai_zombie_traverse_ground_v1_walk; + level._zombie_rise_anims["ape_zombie"][1]["run"][0] = %ai_zombie_traverse_ground_v1_run; + level._zombie_rise_anims["ape_zombie"][1]["sprint"][0] = %ai_zombie_traverse_ground_climbout_fast; + level._zombie_rise_anims["ape_zombie"][2]["walk"][0] = %ai_zombie_traverse_ground_v2_walk_altA; + if( !isDefined( level._zombie_rise_death_anims ) ) + { + level._zombie_rise_death_anims = []; + } + level._zombie_rise_death_anims["ape_zombie"] = []; + level._zombie_rise_death_anims["ape_zombie"][1]["in"][0] = %ai_zombie_traverse_ground_v1_deathinside; + level._zombie_rise_death_anims["ape_zombie"][1]["in"][1] = %ai_zombie_traverse_ground_v1_deathinside_alt; + level._zombie_rise_death_anims["ape_zombie"][1]["out"][0] = %ai_zombie_traverse_ground_v1_deathoutside; + level._zombie_rise_death_anims["ape_zombie"][1]["out"][1] = %ai_zombie_traverse_ground_v1_deathoutside_alt; + level._zombie_rise_death_anims["ape_zombie"][2]["in"][0] = %ai_zombie_traverse_ground_v2_death_low; + level._zombie_rise_death_anims["ape_zombie"][2]["in"][1] = %ai_zombie_traverse_ground_v2_death_low_alt; + level._zombie_rise_death_anims["ape_zombie"][2]["out"][0] = %ai_zombie_traverse_ground_v2_death_high; + level._zombie_rise_death_anims["ape_zombie"][2]["out"][1] = %ai_zombie_traverse_ground_v2_death_high_alt; + if( !isDefined( level._zombie_run_taunt ) ) + { + level._zombie_run_taunt = []; + } + if( !isDefined( level._zombie_board_taunt ) ) + { + level._zombie_board_taunt = []; + } + level._zombie_run_taunt["ape_zombie"] = []; + level._zombie_board_taunt["ape_zombie"] = []; + level._zombie_board_taunt["ape_zombie"][0] = %ai_zombie_taunts_4; + level._zombie_board_taunt["ape_zombie"][1] = %ai_zombie_taunts_7; + level._zombie_board_taunt["ape_zombie"][2] = %ai_zombie_taunts_9; + level._zombie_board_taunt["ape_zombie"][3] = %ai_zombie_taunts_5b; + level._zombie_board_taunt["ape_zombie"][4] = %ai_zombie_taunts_5c; + level._zombie_board_taunt["ape_zombie"][5] = %ai_zombie_taunts_5d; + level._zombie_board_taunt["ape_zombie"][6] = %ai_zombie_taunts_5e; + level._zombie_board_taunt["ape_zombie"][7] = %ai_zombie_taunts_5f; +} +init_ape_powerup_drops() +{ + level.ape_powerup_array = []; + if( !isDefined(level.zombie_powerup_array) ) + { + return; + } + for ( i = 0; i < level.zombie_powerup_array.size; i++ ) + { + powerup = level.zombie_powerup_array[i]; + if ( level.zombie_include_powerups[powerup] ) + { + if ( powerup != "full_ammo" ) + { + level.ape_powerup_array[ level.ape_powerup_array.size ] = powerup; + } + } + } + level.ape_powerup_array = array_randomize( level.ape_powerup_array ); + level.ape_powerup_index = 0; +} +ape_zombie_spawn() +{ + self.script_moveoverride = true; + if( !isDefined( level.num_ape_zombies ) ) + { + level.num_ape_zombies = 0; + } + level.num_ape_zombies++; + ape_zombie = self maps\_zombiemode_net::network_safe_stalingrad_spawn( "boss_zombie_spawn", 1 ); + self.count = 666; + self.last_spawn_time = GetTime(); + if( !spawn_failed( ape_zombie ) ) + { + ape_zombie.script_noteworthy = self.script_noteworthy; + ape_zombie.targetname = self.targetname; + ape_zombie.target = self.target; + ape_zombie.deathFunction = maps\_zombiemode_ai_ape::ape_zombie_die; + ape_zombie.animname = "ape_zombie"; + ape_zombie thread ape_zombie_think(); + if( isDefined( level.ape_zombie_death_pos ) && level.ape_zombie_death_pos.size > 0 ) + { + level.ape_zombie_death_pos = array_remove( level.ape_zombie_death_pos, level.ape_zombie_death_pos[0] ); + } + } + else + { + level.num_ape_zombies--; + } +} +ape_round_spawning() +{ + level endon( "intermission" ); + level endon( "end_of_round" ); + level endon( "restart_round" ); + if ( level.intermission ) + { + return; + } + level.ape_intermission = true; + level thread ape_round_aftermath(); + max = 1; + level.zombie_total = max; + count = 0; + while( count < max ) + { + spawner = ape_zombie_pick_best_spawner(); + if ( isdefined( spawner ) ) + { + spawner ape_zombie_spawn(); + level.zombie_total--; + count++; + break; + } + } +} +ape_round_wait() +{ + wait( 1 ); + if ( flag( "ape_round" ) ) + { + wait( 7 ); + while ( level.ape_intermission ) + { + wait( 0.5 ); + } + } +} +ape_round_aftermath() +{ + flag_wait( "last_ape_down" ); + ape_stop_fog(); + wait( 6 ); + level.ape_intermission = false; +} +ape_stop_fog() +{ + start_dist = 50; + half_dist = 1209; + half_height = 442; + base_height = -925; + fog_r = 0.88; + fog_g = 0.92; + fog_b = 1.1; + fog_scale = 1; + sun_col_r = 0; + sun_col_g = 0; + sun_col_b = 0; + sun_dir_x = 0; + sun_dir_y = 0; + sun_dir_z = 0; + sun_start_ang = 0; + sun_stop_ang = 0; + time = 3; + max_fog_opacity = 1; + clear_fog_threads(); + setVolFog(start_dist, half_dist, half_height, base_height, fog_r, fog_g, fog_b, fog_scale, + sun_col_r, sun_col_g, sun_col_b, sun_dir_x, sun_dir_y, sun_dir_z, sun_start_ang, + sun_stop_ang, time, max_fog_opacity); +} +ape_round_tracker() +{ + level.ape_save_spawn_func = level.round_spawn_func; + level.ape_save_wait_func = level.round_wait_func; + level.next_ape_round = randomintrange( 7, 9 ); + level.prev_ape_round = level.next_ape_round; + while ( 1 ) + { + level waittill( "between_round_over" ); + if ( level.round_number == level.next_ape_round ) + { + level.ape_save_spawn_func = level.round_spawn_func; + level.ape_save_wait_func = level.round_wait_func; + ape_round_start(); + level.round_spawn_func = ::ape_round_spawning; + level.round_wait_func = ::ape_round_wait; + level.prev_ape_round = level.next_ape_round; + level.next_ape_round = level.round_number + randomintrange( 5, 8 ); + } + else if ( level.prev_ape_round == level.round_number ) + { + ape_round_start(); + } + else if ( flag( "ape_round" ) ) + { + ape_round_stop(); + } + } +} +ape_round_start() +{ + flag_set( "ape_round" ); + if ( isDefined( level.ape_round_start ) ) + { + level thread [[ level.ape_round_start ]](); + } +} +ape_round_stop() +{ + flag_clear( "ape_round" ); + flag_clear( "last_ape_down" ); + if ( isDefined( level.ape_round_stop ) ) + { + level thread [[ level.ape_round_stop ]](); + } +} +ape_zombie_manager() +{ + start_ape = getent( "start_boss_spawner", "script_noteworthy" ); + if ( isDefined( start_ape ) ) + { + while ( true ) + { + if ( level.num_ape_zombies < level.max_ape_zombies ) + { + start_ape ape_zombie_spawn(); + break; + } + wait( 0.5 ); + } + } + while( true ) + { + AssertEx( isDefined( level.num_ape_zombies ) && isDefined( level.max_ape_zombies ), "Either max_ape_zombies or num_ape_zombies not defined, this should never be the case!" ); + while( level.num_ape_zombies < level.max_ape_zombies ) + { + spawner = ape_zombie_pick_best_spawner(); + if( isDefined( spawner ) ) + { + spawner ape_zombie_spawn(); + } + wait( 10 ); + } + wait( 10 ); + } +} +ape_zombie_pick_best_spawner() +{ + best_spawner = undefined; + best_score = -1; + for( i = 0; i < level.ape_zombie_spawners.size; i++ ) + { + score = [[ level.ape_zombie_spawn_heuristic ]]( level.ape_zombie_spawners[i] ); + if( score > best_score ) + { + best_spawner = level.ape_zombie_spawners[i]; + best_score = score; + } + } + return best_spawner; +} +ape_zombie_think() +{ + self endon( "death" ); + self.is_activated = false; + self.run_index = -1; + self thread ape_zombie_is_activated(); + self thread ape_zombie_check_player_proximity(); + self thread ape_zombie_choose_run(); + self thread ape_zombie_check_laststand(); + self thread [[ level.ape_zombie_activation ]](); + players = getplayers(); + if ( players.size > 1 ) + { + self thread ape_zombie_wait_for_switch(); + } + self.ignoreall = false; + self.pathEnemyFightDist = 64; + self.meleeAttackDist = 64; + adjusted_health = level.ape_zombie_min_health; + if( self.maxhealth < adjusted_health ) + { + self.maxhealth = level.ape_zombie_min_health; + self.health = level.ape_zombie_min_health; + } + if ( isdefined( level.user_ryan_ape_health ) ) + { + self.maxhealth = 1; + self.health = 1; + } + players = GetPlayers(); + if ( players.size == 4 ) + { + bonus = int( self.health * .5 ); + self.maxhealth += bonus; + self.health += bonus; + } + self.maxsightdistsqrd = 96 * 96; + self.zombie_move_speed = "walk"; + self thread [[ level.ape_zombie_enter_level ]](); + if ( isDefined( level.ape_zombie_custom_think ) ) + { + self thread [[ level.ape_zombie_custom_think ]](); + } + while( true ) + { + if ( !self.entered_level ) + { + wait_network_frame(); + continue; + } + else if ( isDefined( self.custom_think ) && self.custom_think ) + { + wait_network_frame(); + continue; + } + else if( isDefined( self.performing_activation ) && self.performing_activation ) + { + wait_network_frame(); + continue; + } + else if ( isDefined( self.ground_hit ) && self.ground_hit ) + { + wait_network_frame(); + continue; + } + else if( !isDefined( self.following_player ) || !self.following_player ) + { + self thread maps\_zombiemode_ai_ape::ape_find_flesh(); + self.following_player = true; + } + wait( 1 ); + } +} +ape_zombie_pick_idle_point() +{ + best_score = -1; + best_node = undefined; + for( i = 0; i < level.ape_idle_nodes.size; i++ ) + { + score = [[ level.ape_zombie_pathfind_heuristic ]]( level.ape_idle_nodes[i] ); + if( score > best_score ) + { + best_score = score; + best_node = level.ape_idle_nodes[i]; + } + } + return best_node; +} +ape_zombie_default_pathfind_heuristic( node ) +{ + if( !isDefined( node.targetname ) || !isDefined( level.zones[node.targetname] ) ) + { + return -1; + } + if( isDefined( node.is_claimed ) && node.is_claimed && ( !isDefined( self.curr_idle_node ) || self.curr_idle_node != node ) ) + { + return -1; + } + players = get_players(); + score = 0; + for( i = 0; i < players.size; i++ ) + { + dist = distanceSquared( node.origin, players[i].origin ); + if( dist > 10000*10000 ) + { + dist = 10000*10000; + } + if( dist <= 1 ) + { + score += 10000*10000; + continue; + } + score += int( 10000*10000/dist ); + } + return score; +} +ape_zombie_default_spawn_heuristic( spawner ) +{ + if( isDefined( spawner.last_spawn_time ) && (GetTime() - spawner.last_spawn_time < 30000) ) + { + return -1; + } + if( !isDefined( spawner.script_noteworthy ) ) + { + return -1; + } + if( spawner.script_noteworthy != "first_boss_spawner" && (!isDefined( level.zones ) || !isDefined( level.zones[ spawner.script_noteworthy ] ) || !level.zones[ spawner.script_noteworthy ].is_enabled ) ) + { + return -1; + } + score = 0; + if( !isDefined( level.ape_zombie_death_pos ) || level.ape_zombie_death_pos.size == 0 ) + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + score = int( distanceSquared( spawner.origin, players[i].origin ) ); + } + } + else + { + dist = int( distanceSquared( level.ape_zombie_death_pos[0], spawner.origin ) ); + if( dist > 10000*10000 ) + { + dist = 10000*10000; + } + if( dist <= 1 ) + { + dist = 1; + } + score = int( 10000*10000/dist ); + } + return score; +} +ape_zombie_choose_run() +{ + self endon( "death" ); + while( true ) + { + if( self.is_activated ) + { + self.zombie_move_speed = "sprint"; + if ( self.speed_up ) + { + self set_run_anim( "sprint4" ); + self.run_combatanim = level.scr_anim["ape_zombie"]["sprint4"]; + self.crouchRunAnim = level.scr_anim["ape_zombie"]["sprint4"]; + self.crouchrun_combatanim = level.scr_anim["ape_zombie"]["sprint4"]; + } + else + { + rand = randomIntRange( 1, 4 ); + if ( self.run_index == rand ) + { + rand++; + if ( rand >= 4 ) + { + rand = 1; + } + } + self.run_index = rand; + self set_run_anim( "sprint"+rand ); + self.run_combatanim = level.scr_anim["ape_zombie"]["sprint"+rand]; + self.crouchRunAnim = level.scr_anim["ape_zombie"]["sprint"+rand]; + self.crouchrun_combatanim = level.scr_anim["ape_zombie"]["sprint"+rand]; + rand_f = randomFloatRange( 2, 3 ); + wait( rand_f ); + } + } + else + { + self.zombie_move_speed = "walk"; + self set_run_anim( "walk1" ); + self.run_combatanim = level.scr_anim["ape_zombie"]["walk1"]; + self.crouchRunAnim = level.scr_anim["ape_zombie"]["walk1"]; + self.crouchrun_combatanim = level.scr_anim["ape_zombie"]["walk1"]; + } + wait( 0.05 ); + } +} +ape_zombie_check_laststand() +{ + self endon( "death" ); + while ( !self.entered_level ) + { + wait_network_frame(); + } + while ( 1 ) + { + if ( isdefined( self.favoriteenemy ) ) + { + if ( self.favoriteenemy maps\_laststand::player_is_in_laststand() ) + { + ape_zombie_switch_player( 0 ); + } + } + wait_network_frame(); + } +} +ape_zombie_wait_for_switch() +{ + self endon( "death" ); + self endon( "already_switched" ); + while ( !self.entered_level ) + { + wait_network_frame(); + } + time = RandomFloatRange( 15, 30 ); + wait( time ); + self.nextGroundHit = GetTime(); + self ape_zombie_switch_player( 1 ); +} +ape_zombie_switch_player( speed_up ) +{ + players = getplayers(); + if ( players.size > 1 ) + { + self.ignore_player[ self.ignore_player.size ] = self.favoriteenemy; + if ( self.ignore_player.size >= get_number_of_valid_players() ) + { + self.ignore_player = []; + } + } + player = get_closest_valid_player( self.origin, self.ignore_player ); + if( !isDefined( player ) ) + { + self maps\_zombiemode_spawner::zombie_history( "ape find flesh -> can't find player, continue" ); + player = players[0]; + } + self.favoriteenemy = player; + self.speed_up = speed_up; + if ( speed_up == 0 ) + { + self notify( "already_switched" ); + } +} +wait_for_round_over() +{ + self endon( "stop_managing_health" ); + while( true ) + { + level waittill( "between_round_over" ); + self notify( "update_health" ); + wait( 0.05 ); + } +} +wait_for_activation() +{ + self waittill( "ape_activated" ); + self notify( "update_health" ); + self notify( "stop_managing_health" ); +} +ape_zombie_check_player_proximity() +{ + self endon( "death" ); + while ( 1 ) + { + if ( isdefined( self.performing_activation ) && self.performing_activation ) + { + break; + } + if ( isdefined( self.enemy ) ) + { + dist = distance( self.origin, self.enemy.origin ); + if ( dist < level.ape_zombie_proximity_wake ) + { + self notify( "hit_player" ); + break; + } + } + wait_network_frame(); + } +} +ape_zombie_update_proximity_wake() +{ + while ( !isdefined( level.round_number ) ) + { + wait( 1 ); + } + while ( 1 ) + { + if ( level.round_number >= 20 ) + { + level.ape_zombie_proximity_wake = 120; + break; + } + else if ( level.round_number >= 15 ) + { + level.ape_zombie_proximity_wake = 102; + } + else if ( level.round_number >= 10 ) + { + level.ape_zombie_proximity_wake = 84; + } + wait( 1 ); + } +} +ape_zombie_damage_during_activate() +{ + self endon( "death" ); + self endon( "play_activate_done" ); + wait( 1.6 ); + self waittill_either( "damage", "hit_player" ); + self notify( "play_activate_done" ); +} +ape_zombie_play_activate() +{ + self endon( "death" ); + self endon( "play_activate_done" ); + self thread ape_zombie_damage_during_activate(); + time = getAnimLength( %ai_zombie_simianaut_chest_beat ); + self SetFlaggedAnimKnobAllRestart( "chestbeat_anim", %ai_zombie_simianaut_chest_beat, %body, 1, .1, 1 ); + time = time / 1.0; + wait( time ); + self notify( "play_activate_done" ); +} +ape_zombie_check_for_activation() +{ + self endon( "death" ); + self endon( "ape_activated" ); + if( self.is_activated == true ) + { + if( isDefined( self.curr_idle_node ) ) + { + self.curr_idle_node.is_claimed = false; + } + return; + } + while( !self.entered_level ) + { + wait_network_frame(); + } + self waittill_either( "damage", "hit_player" ); + self notify( "stop_find_flesh" ); + self.following_player = false; + self.performing_activation = true; + self.ground_hit = true; + self thread scream_a_watcher( "groundhit_anim" ); + self thread groundhit_watcher( "groundhit_anim" ); + self playsound( "zmb_engineer_vocals_hit" ); + self animcustom( ::ape_zombie_play_activate ); + self waittill( "play_activate_done" ); + self.performing_activation = false; + self.ground_hit = false; + self.is_activated = true; + if( isDefined( self.curr_idle_node ) ) + { + self.curr_idle_node.is_claimed = false; + } + self notify( "ape_activated" ); +} +ape_zombie_is_activated() +{ + self waittill( "ape_activated" ); + self thread ape_zombie_ground_hit_think(); + self thread ape_zombie_push_zombies(); +} +ape_zombie_ground_hit() +{ + self endon( "death" ); + if ( self.ground_hit ) + { + return; + } + self.ground_hit = true; + self thread groundhit_watcher( "groundhit_anim" ); + self animscripted( "groundhit_anim", self.origin, self.angles, %ai_zombie_simianaut_ground_pound ); + animscripts\traverse\zombie_shared::wait_anim_length(%ai_zombie_simianaut_ground_pound, .02); + self.ground_hit = false; + self.nextGroundHit = GetTime() + level.ape_ground_attack_delay; + if ( self.chest_beat ) + { + time = getAnimLength( %ai_zombie_simianaut_taunt ); + self animscripted( "taunt_anim", self.origin, self.angles, %ai_zombie_simianaut_taunt ); + wait( time ); + self.chest_beat = false; + } + self thread animscripts\zombie_combat::main(); +} +ape_zombie_ground_hit_think() +{ + self endon( "death" ); + self.ground_hit = false; + self.nextGroundHit = GetTime() + level.ape_ground_attack_delay; + while( 1 ) + { + if ( !self.ground_hit && GetTime() >= self.nextGroundHit ) + { + players = GetPlayers(); + closeEnough = false; + origin = self GetEye(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] maps\_laststand::player_is_in_laststand() ) + { + continue; + } + test_origin = players[i] GetEye(); + d = DistanceSquared( origin, test_origin ); + if ( d > level.ape_zombie_groundhit_trigger_radius * level.ape_zombie_groundhit_trigger_radius ) + { + continue; + } + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + continue; + } + closeEnough = true; + break; + } + if ( closeEnough ) + { + self animcustom( ::ape_zombie_ground_hit ); + } + } + wait_network_frame(); + } +} +scream_a_watcher( animname ) +{ + self endon( "death" ); + rand = RandomInt( 100 ); + if( rand > level.ape_zombie_scream_a_chance ) + { + return; + } + self waittillmatch( animname, "scream_a" ); + players = get_players(); + affected_players = []; + for( i = 0; i < players.size; i++ ) + { + if( distanceSquared( players[i].origin, self.origin ) < level.ape_zombie_scream_a_radius_sq ) + { + affected_players = array_add( affected_players, players[i] ); + } + } + for( i = 0; i < affected_players.size; i++ ) + { + affected_players[i] ShellShock( "electrocution", 1.5, true ); + } +} +groundhit_watcher( animname ) +{ + self endon( "death" ); + self waittillmatch( animname, "fire" ); + playfxontag(level._effect["ape_groundhit"],self,"tag_origin"); + origin = self.origin + ( 0, 0, 40 ); + zombies_axis = get_array_of_closest( origin, GetAiSpeciesArray( "axis", "all" ), undefined, undefined, level.ape_zombie_groundhit_damage_radius ); + dogs = get_array_of_closest( origin, GetAiSpeciesArray( "allies", "zombie_dog" ), undefined, undefined, level.ape_zombie_groundhit_damage_radius ); + zombies = array_combine( zombies_axis, dogs ); + if ( IsDefined( zombies ) ) + { + for ( i = 0; i < zombies.size; i++ ) + { + if ( !IsDefined( zombies[i] ) ) + { + continue; + } + if ( is_magic_bullet_shield_enabled( zombies[i] ) ) + { + continue; + } + test_origin = zombies[i] GetEye(); + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + continue; + } + if ( zombies[i] == self ) + { + continue; + } + if ( zombies[i].animname == "ape_zombie" ) + { + continue; + } + refs = []; + refs[refs.size] = "guts"; + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + refs[refs.size] = "head"; + if( refs.size ) + { + zombies[i].a.gib_ref = random( refs ); + } + zombies[i] DoDamage( zombies[i].health + 666, self.origin, self ); + } + } + players = get_players(); + affected_players = []; + for( i = 0; i < players.size; i++ ) + { + if ( !is_player_valid( players[i] ) ) + { + continue; + } + test_origin = players[i] GetEye(); + if( distanceSquared( origin, test_origin ) > level.ape_zombie_groundhit_damage_radius * level.ape_zombie_groundhit_damage_radius ) + { + continue; + } + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + continue; + } + affected_players = array_add( affected_players, players[i] ); + } + self.chest_beat = false; + for( i = 0; i < affected_players.size; i++ ) + { + self.chest_beat = true; + if ( players.size > 1 ) + { + if ( i == 0 ) + { + player = affected_players[i]; + if ( player IsOnGround() ) + { + player DoDamage( player.health, player.origin, self ); + } + self.favoriteenemy = player; + self ape_zombie_switch_player( 0 ); + self thread ape_zombie_wait_for_switch(); + } + else + { + affected_players[i] ShellShock( "electrocution", 1.5, true ); + } + } + else + { + if ( affected_players[i] IsOnGround() ) + { + affected_players[i] ShellShock( "electrocution", 1.5, true ); + } + } + } +} +scream_b_watcher( animname ) +{ + self endon( "death" ); + rand = RandomInt( 100 ); + if( rand > level.ape_zombie_scream_b_chance ) + { + return; + } + self waittillmatch( animname, "scream_b" ); + players = get_players(); + affected_players = []; + for( i = 0; i < players.size; i++ ) + { + if( distanceSquared( players[i].origin, self.origin ) < level.ape_zombie_scream_b_radius_sq ) + { + affected_players = array_add( affected_players, players[i] ); + } + } + for( i = 0; i < affected_players.size; i++ ) + { + affected_players[i] ShellShock( "electrocution", 1.5, true ); + } +} +ape_zombie_die() +{ + self maps\_zombiemode_spawner::reset_attack_spot(); + self.grenadeAmmo = 0; + if( isDefined( self.curr_idle_node ) ) + { + self.curr_idle_node.is_claimed = false; + } + self playsound( "zmb_engineer_death_bells" ); + level maps\_zombiemode_spawner::zombie_death_points( self.origin, self.damagemod, self.damagelocation, self.attacker,self ); + if( self.damagemod == "MOD_BURNED" ) + { + self thread animscripts\zombie_death::flame_death_fx(); + } + if( !isDefined( level.ape_zombie_death_pos ) ) + { + level.ape_zombie_death_pos = []; + } + level.ape_zombie_death_pos = array_add( level.ape_zombie_death_pos, self.origin ); + if ( !self.restart ) + { + self ape_zombie_powerup_drop(); + if ( level.round_number <= 22 ) + { + level.ape_zombie_min_health = level.ape_zombie_min_health * 2; + } + } + level.ape_death++; + level.ape_death_total++; + if ( level.ape_death >= level.ape_death_ammo ) + { + level.ammo_spawn = true; + level.ape_death = 0; + } + if ( level.ape_death_total == 1 ) + { + level.ape_zombie_groundhit_damage_radius = 300; + } + else if ( level.ape_death_total == 2 ) + { + level.ape_zombie_groundhit_damage_radius = 320; + } + level.round_spawn_func = level.ape_save_spawn_func; + level.round_wait_func = level.ape_save_wait_func; + flag_set( "last_ape_down" ); + return false; +} +ape_zombie_powerup_drop() +{ + if( !level.ape_powerup_array.size ) + { + return; + } + if ( level.ammo_spawn ) + { + level.zombie_powerup_ape = "full_ammo"; + } + else + { + level.zombie_powerup_ape = level.ape_powerup_array[ level.ape_powerup_index ]; + level.ape_powerup_index++; + if ( level.ape_powerup_index >= level.zombie_powerup_ape.size ) + { + level.ape_powerup_index = 0; + level.ape_powerup_array = array_randomize( level.ape_powerup_array ); + } + } + level.zombie_vars["zombie_drop_item"] = 1; + level.powerup_drop_count--; + level thread maps\_zombiemode_powerups::powerup_drop( self.origin ); +} +ape_adjust_max_ammo() +{ + while ( 1 ) + { + level waittill( "between_round_over" ); + wait_network_frame(); + } +} +ape_zombie_wait_for_respawn() +{ + level thread wait_for_round(); + level waittill( "respawn_now" ); + level.num_ape_zombies--; +} +wait_for_round() +{ + level endon( "respawn_now" ); + level waittill( "between_round_over" ); + wait( 1 ); + level waittill( "between_round_over" ); + if ( RandomInt(100) < 50 ) + { + wait( 1 ); + level waittill( "between_round_over" ); + } + level notify( "respawn_now" ); +} +ape_thundergun_disintegrate( player ) +{ + self endon( "death" ); + self DoDamage( level.ape_thundergun_damage, player.origin, player ); + if ( self.health > 0 && !flag( "tgun_react" ) ) + { + flag_set( "tgun_react" ); + time = getAnimLength( %ai_zombie_simianaut_react_tgun ); + self animscripted( "tgunreact_anim", self.origin, self.angles, %ai_zombie_simianaut_react_tgun ); + wait( time ); + wait( 2.5 ); + flag_clear( "tgun_react" ); + } +} +ape_fire_damage( trap ) +{ + self endon( "death" ); + self DoDamage( level.ape_fire_damage, self.origin ); + while ( 1 ) + { + wait( 0.25 ); + if ( self IsTouching( trap ) ) + { + self DoDamage( level.ape_fire_damage, self.origin, trap ); + } + else + { + if ( self.health > 0 ) + { + self.marked_for_death = undefined; + } + break; + } + } +} +ape_trap_reaction( trap ) +{ + self endon( "death" ); + trap notify( "trap_done" ); +} +ape_custom_damage( player ) +{ + self endon( "death" ); + if ( isDefined( self.ground_hit ) && self.ground_hit ) + { + return level.ape_zombie_groundhit_damage; + } + return self.meleeDamage; +} +ape_actor_damage( weapon, damage, attacker ) +{ + self endon( "death" ); + switch( weapon ) + { + case "spas_zm": + case "spas_upgraded_zm": + case "ithaca_zm": + case "ithaca_upgraded_zm": + case "minigun_zm": + case "minigun_upgraded_zm": + damage *= 0.5; + break; + case "python_zm": + case "python_upgraded_zm": + damage *= 0.3; + break; + case "ray_gun_zm": + case "ray_gun_upgraded_zm": + damage *= 0.25; + break; + case "bowie_knife_zm": + damage *= 0.1; + break; + } + if ( level.zombie_vars["zombie_insta_kill"] ) + { + damage *= 2; + } + if ( (float(self.health - damage) / self.maxhealth) < 0.7 ) + { + self animscripts\zombie_death::helmetPop(); + } + return damage; +} +ape_nuke_damage( location ) +{ + self endon( "death" ); + if ( !self.entered_level ) + { + return; + } + nuke_dist_sq = 1024 * 1024; + if ( DistanceSquared( self.origin, location ) < nuke_dist_sq ) + { + damage = self.maxhealth * 0.5; + self DoDamage( damage, self.origin ); + if ( self.is_activated && self.health > 0 ) + { + time = getAnimLength( %ai_zombie_simianaut_react_nuke ); + self animscripted( "nukereact_anim", self.origin, self.angles, %ai_zombie_simianaut_react_nuke ); + wait( time ); + } + self.is_activated = true; + } +} +ape_tesla_damage( origin, player ) +{ + self DoDamage( level.ape_tesla_damage, origin, player ); + if ( self.health > 0 ) + { + self.zombie_tesla_hit = false; + } +} +ape_dog_damage() +{ + DOG_MELEE_DAMAGE = 100; + self DoDamage( DOG_MELEE_DAMAGE, self.origin ); +} +ape_zombie_damage_fx( mod, hit_location, hit_origin, player ) +{ + Playfx( level._effect["ape_impact"], hit_origin ); +} +ape_non_attacker( damage, weapon ) +{ + TURRET_DAMAGE = 25; + if ( weapon == "zombie_ability_turret" ) + { + return TURRET_DAMAGE; + } + return 0; +} +ape_zombie_default_enter_level() +{ + Playfx( level._effect["ape_spawn"], self.origin ); + playsoundatposition( "zmb_bolt", self.origin ); + PlayRumbleOnPosition("explosion_generic", self.origin); + self.entered_level = true; +} +ape_zombie_knockdown() +{ + self endon( "death" ); + time = getAnimLength( %ai_zombie_thundergun_hit_forwardtoface ); + self animscripted( "down", self.origin, self.angles, %ai_zombie_thundergun_hit_forwardtoface, "normal", %body, 1 ); + wait( time ); + time = getAnimLength( %ai_zombie_thundergun_getup_a ); + self animscripted( "up", self.origin, self.angles, %ai_zombie_thundergun_getup_a, "normal", %body, 1 ); + wait( time ); +} +ape_zombie_push_zombies() +{ + self endon( "death" ); + while ( 1 ) + { + pushed = 0; + origin = self GetEye(); + zombies = get_array_of_closest( origin, GetAiSpeciesArray( "axis", "all" ), undefined, undefined, 60 ); + for ( i = 0; i < zombies.size; i++ ) + { + if ( zombies[i].animname == "zombie" ) + { + if ( !isdefined( zombies[i].ape_knockdown_time ) || zombies[i].ape_knockdown_time < GetTime() ) + { + if ( pushed <= 3 ) + { + zombies[i].ape_knockdown_time = GetTime() + 30000; + zombies[i] thread ape_zombie_knockdown(); + pushed++; + } + } + } + } + rand = RandomFloatRange( 2, 5 ); + wait( rand ); + } +} +ape_pathing() +{ + self endon( "death" ); + while ( 1 ) + { + if( IsDefined( self.favoriteenemy ) ) + { + self.ignoreall = false; + self OrientMode( "face default" ); + self SetGoalPos( self.favoriteenemy.origin ); + } + wait_network_frame(); + } +} +ape_find_flesh() +{ + self endon( "death" ); + level endon( "intermission" ); + self endon( "stop_find_flesh" ); + if( level.intermission ) + { + return; + } + self.helitarget = true; + self maps\_zombiemode_spawner::zombie_history( "ape find flesh -> start" ); + self.goalradius = 48; + players = getplayers(); + self.ignore_player = []; + player = get_closest_valid_player( self.origin, self.ignore_player ); + if( !isDefined( player ) ) + { + self maps\_zombiemode_spawner::zombie_history( "ape find flesh -> can't find player, continue" ); + } + self.favoriteenemy = player; + while( 1 ) + { + if ( isdefined( level.user_ryan_ape_pathing ) ) + { + self thread maps\_zombiemode_ai_ape::ape_pathing(); + } + else + { + self thread maps\_zombiemode_spawner::zombie_pathing(); + } + self.zombie_path_timer = GetTime() + ( RandomFloatRange( 1, 3 ) * 1000 ); + while( GetTime() < self.zombie_path_timer ) + { + wait( 0.1 ); + } + self maps\_zombiemode_spawner::zombie_history( "ape find flesh -> bottom of loop" ); + debug_print( "Zombie is re-acquiring enemy, ending breadcrumb search" ); + self notify( "zombie_acquire_enemy" ); + } +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_ai_astro.gsc b/BO1/PC/ZM/maps/_zombiemode_ai_astro.gsc new file mode 100644 index 0000000..82be289 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_ai_astro.gsc @@ -0,0 +1,708 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include animscripts\zombie_Utility; +init() +{ + PrecacheRumble( "explosion_generic" ); + init_astro_zombie_anims(); + init_astro_zombie_fx(); + if ( !isDefined( level.astro_zombie_enter_level ) ) + { + level.astro_zombie_enter_level = ::astro_zombie_default_enter_level; + } + level.num_astro_zombies = 0; + level.astro_zombie_spawners = GetEntArray( "astronaut_zombie", "targetname" ); + array_thread( level.astro_zombie_spawners, ::add_spawn_function, maps\_zombiemode_ai_astro::astro_prespawn ); + level.max_astro_zombies = 1; + level.astro_zombie_health_mult = 4; + level.min_astro_round_wait = 1; + level.max_astro_round_wait = 2; + level.astro_round_start = 1; + level.next_astro_round = level.astro_round_start + RandomIntRange( 0, level.max_astro_round_wait + 1 ); + level.zombies_left_before_astro_spawn = 1; + level.zombie_left_before_spawn = 0; + level.astro_explode_radius = 400; + level.astro_explode_blast_radius = 150; + level.astro_explode_pulse_min = 100; + level.astro_explode_pulse_max = 300; + level.astro_headbutt_delay = 2000; + level.astro_headbutt_radius_sqr = 64 * 64; + level.zombie_total_update = false; + level.zombie_total_set_func = ::astro_zombie_total_update; + maps\_zombiemode_spawner::register_zombie_damage_callback( ::astro_damage_callback ); +} +#using_animtree( "generic_human" ); +astro_prespawn() +{ + self.animname = "astro_zombie"; + self.custom_idle_setup = ::astro_zombie_idle_setup; + self.a.idleAnimOverrideArray = []; + self.a.idleAnimOverrideArray["stand"] = []; + self.a.idleAnimOverrideWeights["stand"] = []; + self.a.idleAnimOverrideArray["stand"][0][0] = %ai_zombie_idle_v1_delta; + self.a.idleAnimOverrideWeights["stand"][0][0] = 10; + self.a.idleAnimOverrideArray["stand"][0][1] = %ai_zombie_idle_v1_delta; + self.a.idleAnimOverrideWeights["stand"][0][1] = 10; + self.ignoreall = true; + self.allowdeath = true; + self.is_zombie = true; + self.has_legs = true; + self allowedStances( "stand" ); + self.gibbed = false; + self.head_gibbed = false; + self.disableArrivals = true; + self.disableExits = true; + self.grenadeawareness = 0; + self.badplaceawareness = 0; + self.ignoreSuppression = true; + self.suppressionThreshold = 1; + self.noDodgeMove = true; + self.dontShootWhileMoving = true; + self.pathenemylookahead = 0; + self.badplaceawareness = 0; + self.chatInitialized = false; + self.a.disablePain = true; + self disable_react(); + self.dropweapon = false; + self thread maps\_zombiemode_spawner::zombie_damage_failsafe(); + self maps\_zombiemode_spawner::set_zombie_run_cycle( "walk" ); + self thread maps\_zombiemode_spawner::delayed_zombie_eye_glow(); + self.flame_damage_time = 0; + self.meleeDamage = 50; + self.no_powerups = true; + self.no_gib = true; + self.ignorelocationaldamage = true; + self.actor_damage_func = ::astro_actor_damage; + self.nuke_damage_func = ::astro_nuke_damage; + self.custom_damage_func = ::astro_custom_damage; + self.microwavegun_sizzle_func = ::astro_microwavegun_sizzle; + self setTeamForEntity( "axis" ); + self.ignore_distance_tracking = true; + self.ignore_enemy_count = true; + self.ignore_gravity = true; + self.ignore_devgui_death = true; + self.ignore_nml_delete = true; + self.ignore_round_spawn_failsafe = true; + self.ignore_poi_targetname = []; + self.ignore_poi_targetname[ self.ignore_poi_targetname.size ] = "zm_bhb"; + self notify( "zombie_init_done" ); +} +astro_zombie_idle_setup() +{ + self.a.array["turn_left_45"] = %exposed_tracking_turn45L; + self.a.array["turn_left_90"] = %exposed_tracking_turn90L; + self.a.array["turn_left_135"] = %exposed_tracking_turn135L; + self.a.array["turn_left_180"] = %exposed_tracking_turn180L; + self.a.array["turn_right_45"] = %exposed_tracking_turn45R; + self.a.array["turn_right_90"] = %exposed_tracking_turn90R; + self.a.array["turn_right_135"] = %exposed_tracking_turn135R; + self.a.array["turn_right_180"] = %exposed_tracking_turn180L; + self.a.array["exposed_idle"] = array( %ai_zombie_idle_v1_delta, %ai_zombie_idle_v1_delta ); + self.a.array["straight_level"] = %ai_zombie_idle_v1_delta; + self.a.array["stand_2_crouch"] = %ai_zombie_shot_leg_right_2_crawl; +} +init_astro_zombie_anims() +{ + level.scr_anim["astro_zombie"]["death1"] = %ai_zombie_napalm_death_01; + level.scr_anim["astro_zombie"]["death2"] = %ai_zombie_napalm_death_02; + level.scr_anim["astro_zombie"]["death3"] = %ai_zombie_napalm_death_03; + level.scr_anim["astro_zombie"]["walk1"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["walk2"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["walk3"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["walk4"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["walk5"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["walk6"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["walk7"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["walk8"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["run1"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["run2"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["run3"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["run4"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["run5"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["run6"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["sprint1"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["sprint2"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["sprint3"] = %ai_zombie_astro_walk_moon_v1; + level.scr_anim["astro_zombie"]["sprint4"] = %ai_zombie_astro_walk_moon_v1; + if( !isDefined( level._zombie_melee ) ) + { + level._zombie_melee = []; + } + if( !isDefined( level._zombie_walk_melee ) ) + { + level._zombie_walk_melee = []; + } + if( !isDefined( level._zombie_run_melee ) ) + { + level._zombie_run_melee = []; + } + level._zombie_melee["astro_zombie"] = []; + level._zombie_walk_melee["astro_zombie"] = []; + level._zombie_run_melee["astro_zombie"] = []; + level._zombie_melee["astro_zombie"][0] = %ai_zombie_attack_v2; + level._zombie_melee["astro_zombie"][1] = %ai_zombie_attack_v4; + level._zombie_melee["astro_zombie"][2] = %ai_zombie_attack_v6; + if( isDefined( level.astro_zombie_anim_override ) ) + { + [[ level.astro_zombie_anim_override ]](); + } + if( !isDefined( level._zombie_deaths ) ) + { + level._zombie_deaths = []; + } + level._zombie_deaths["astro_zombie"] = []; + level._zombie_deaths["astro_zombie"][0] = %ai_zombie_napalm_death_01; + level._zombie_deaths["astro_zombie"][1] = %ai_zombie_napalm_death_02; + level._zombie_deaths["astro_zombie"][2] = %ai_zombie_napalm_death_03; + if( !isDefined( level._zombie_run_taunt ) ) + { + level._zombie_run_taunt = []; + } + if( !isDefined( level._zombie_board_taunt ) ) + { + level._zombie_board_taunt = []; + } + level._zombie_run_taunt["astro_zombie"] = []; + level._zombie_board_taunt["astro_zombie"] = []; + level._zombie_board_taunt["astro_zombie"][0] = %ai_zombie_taunts_4; + level._zombie_board_taunt["astro_zombie"][1] = %ai_zombie_taunts_7; + level._zombie_board_taunt["astro_zombie"][2] = %ai_zombie_taunts_9; + level._zombie_board_taunt["astro_zombie"][3] = %ai_zombie_taunts_5b; + level._zombie_board_taunt["astro_zombie"][4] = %ai_zombie_taunts_5c; + level._zombie_board_taunt["astro_zombie"][5] = %ai_zombie_taunts_5d; + level._zombie_board_taunt["astro_zombie"][6] = %ai_zombie_taunts_5e; + level._zombie_board_taunt["astro_zombie"][7] = %ai_zombie_taunts_5f; +} +init_astro_zombie_fx() +{ + level._effect[ "astro_spawn" ] = loadfx( "maps/zombie/fx_zombie_boss_spawn" ); + level._effect[ "astro_explosion" ] = loadfx( "maps/zombie_moon/fx_moon_qbomb_explo_distort" ); +} +astro_zombie_spawn() +{ + self.script_moveoverride = true; + if( !isDefined( level.num_astro_zombies ) ) + { + level.num_astro_zombies = 0; + } + level.num_astro_zombies++; + astro_zombie = self maps\_zombiemode_net::network_safe_stalingrad_spawn( "astro_zombie_spawn", 1 ); + self.count = 100; + if( !spawn_failed( astro_zombie ) ) + { + astro_zombie.script_noteworthy = self.script_noteworthy; + astro_zombie.targetname = self.targetname + "_ai"; + astro_zombie.target = self.target; + astro_zombie.deathFunction = ::astro_zombie_die; + astro_zombie.animname = "astro_zombie"; + astro_zombie thread astro_zombie_think(); + _debug_astro_print( "astro spawned in " + level.round_number ); + } + else + { + level.num_astro_zombies--; + } + return astro_zombie; +} +astro_zombie_can_spawn() +{ + if ( !is_true( level.zombie_total_update ) ) + { + return false; + } + if ( level.zombie_total > level.zombies_left_before_astro_spawn ) + { + return false; + } + return true; +} +astro_zombie_manager() +{ + self notify( "astro_manager_end" ); + self endon( "astro_manager_end" ); + flag_wait( "all_players_connected" ); + spawner = getent( "astronaut_zombie", "targetname" ); + while ( true ) + { + if ( !is_true( level.on_the_moon ) ) + { + wait( 0.5 ); + continue; + } + if ( astro_zombie_can_spawn() ) + { + astro = spawner astro_zombie_spawn(); + if ( !spawn_failed( astro ) ) + { + break; + } + wait_network_frame(); + } + wait( 0.5 ); + } +} +astro_zombie_total_update() +{ + level.zombie_total_update = true; + level.zombies_left_before_astro_spawn = RandomIntRange( int( level.zombie_total * 0.25 ), int( level.zombie_total * 0.75 ) ); + if ( level.round_number >= level.next_astro_round && level.num_astro_zombies < level.max_astro_zombies ) + { + level thread astro_zombie_manager(); + } + _debug_astro_print( "next astro round = " + level.next_astro_round ); + _debug_astro_print( "zombies to kill = " + ( level.zombie_total - level.zombies_left_before_astro_spawn ) ); +} +astro_zombie_think() +{ + self endon( "death" ); + self.entered_level = false; + self.ignoreall = false; + self.pathEnemyFightDist = 64; + self.meleeAttackDist = 64; + self.maxhealth = level.zombie_health * GetPlayers().size * level.astro_zombie_health_mult; + self.health = self.maxhealth; + self.maxsightdistsqrd = 96 * 96; + self.zombie_move_speed = "walk"; + self thread [[ level.astro_zombie_enter_level ]](); + if ( isDefined( level.astro_zombie_custom_think ) ) + { + self thread [[ level.astro_zombie_custom_think ]](); + } + self thread astro_zombie_headbutt_think(); + while( true ) + { + if ( !self.entered_level ) + { + wait_network_frame(); + continue; + } + else if ( is_true( self.custom_think ) ) + { + wait_network_frame(); + continue; + } + else if( !isDefined( self.following_player ) || !self.following_player ) + { + self thread maps\_zombiemode_spawner::find_flesh(); + self.following_player = true; + } + wait( 1 ); + } +} +astro_zombie_headbutt_think() +{ + self endon( "death" ); + self.is_headbutt = false; + self.next_headbutt_time = GetTime() + level.astro_headbutt_delay; + self thread astro_zombie_headbutt_watcher( "headbutt_anim" ); + self thread astro_zombie_headbutt_release_watcher( "headbutt_anim" ); + while ( 1 ) + { + if ( !isdefined( self.enemy ) ) + { + wait_network_frame(); + continue; + } + if ( !self.is_headbutt && GetTime() > self.next_headbutt_time ) + { + origin = self GetEye(); + test_origin = self.enemy GetEye(); + dist_sqr = DistanceSquared( origin, test_origin ); + if ( dist_sqr > level.astro_headbutt_radius_sqr ) + { + wait_network_frame(); + continue; + } + yaw = GetYawToOrigin( self.enemy.origin ); + if ( abs( yaw ) > 45 ) + { + wait_network_frame(); + continue; + } + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + wait_network_frame(); + continue; + } + self.is_headbutt = true; + self thread astro_turn_player(); + headbutt_anim = %ai_zombie_astro_headbutt; + time = getAnimLength( headbutt_anim ); + self animscripted( "headbutt_anim", self.origin, self.angles, headbutt_anim, "normal", %body, 1, 0.1 ); + self.player_to_headbutt thread astro_restore_move_speed( time ); + wait( time ); + self.next_headbutt_time = GetTime() + level.astro_headbutt_delay; + self.is_headbutt = false; + } + wait_network_frame(); + } +} +astro_restore_move_speed( time ) +{ + self endon( "disconnect" ); + wait( time ); + self AllowJump( true ); + self AllowProne( true ); + self AllowCrouch( true ); + self SetMoveSpeedScale( 1 ); +} +astro_turn_player() +{ + self endon( "death" ); + self.player_to_headbutt = self.enemy; + player = self.player_to_headbutt; + up = player.origin + ( 0, 0, 10 ); + facing_astro = VectorToAngles( self.origin - up ); + player thread astro_watch_controls( self ); + if ( self.health > 0 ) + { + player FreezeControls( true ); + } + _debug_astro_print( player.playername + " locked" ); + lerp_time = 0.2; + enemy_to_player = VectorNormalize( player.origin - self.origin ); + link_org = self.origin + ( 40 * enemy_to_player ); + player lerp_player_view_to_position( link_org, facing_astro, lerp_time, 1 ); + wait( lerp_time ); + player FreezeControls( false ); + player AllowJump( false ); + player AllowStand( true ); + player AllowProne( false ); + player AllowCrouch( false ); + player SetMoveSpeedScale( 0.1 ); + player notify( "released" ); + dist = Distance( self.origin, player.origin ); + _debug_astro_print( "grab dist = " + dist ); +} +astro_watch_controls( astro ) +{ + self endon( "released" ); + self endon( "disconnect" ); + zombie_attack = %ai_zombie_astro_headbutt; + animLen = getAnimLength( zombie_attack ); + time = 0.5 + animLen; + astro waittill_notify_or_timeout( "death", time ); + self FreezeControls( false ); + _debug_astro_print( self.playername + " released from watch" ); +} +astro_zombie_headbutt_watcher( animname ) +{ + self endon( "death" ); + while ( 1 ) + { + self waittillmatch( animname, "fire" ); + if ( !isdefined( self.player_to_headbutt ) || !is_player_valid( self.player_to_headbutt ) ) + { + continue; + } + self thread astro_zombie_attack(); + self thread astro_zombie_teleport_enemy(); + } +} +astro_zombie_headbutt_release_watcher( animname ) +{ + self endon( "death" ); + _RELEASE_DIST = 59.0; + while ( 1 ) + { + self waittillmatch( animname, "headbutt_start" ); + player = self.player_to_headbutt; + if ( !isdefined( player ) || !isalive( player ) ) + { + continue; + } + dist = Distance( player.origin, self.origin ); + _debug_astro_print( "distance before headbutt = " + dist ); + if ( dist < _RELEASE_DIST ) + { + continue; + } + player AllowJump( true ); + player AllowProne( true ); + player AllowCrouch( true ); + player SetMoveSpeedScale( 1 ); + release_anim = %ai_zombie_astro_headbutt_release; + time = getAnimLength( release_anim ); + self animscripted( "release_anim", self.origin, self.angles, release_anim, "normal", %body, 1, 0.1 ); + wait( time ); + } +} +astro_zombie_attack() +{ + self endon( "death" ); + if ( !isdefined( self.player_to_headbutt ) ) + { + return; + } + player = self.player_to_headbutt; + perk_list = []; + vending_triggers = getentarray( "zombie_vending", "targetname" ); + for ( i = 0; i < vending_triggers.size; i++ ) + { + perk = vending_triggers[i].script_noteworthy; + if ( player HasPerk( perk ) ) + { + perk_list[ perk_list.size ] = perk; + } + } + take_perk = false; + if ( perk_list.size > 0 && !IsDefined(player._retain_perks)) + { + take_perk = true; + perk_list = array_randomize( perk_list ); + perk = perk_list[0]; + perk_str = perk + "_stop"; + player notify( perk_str ); + if ( flag( "solo_game" ) && perk == "specialty_quickrevive" ) + { + player.lives--; + } + player thread astro_headbutt_damage( self, self.origin ); + } + if ( !take_perk ) + { + damage = player.health - 1; + player DoDamage( damage, self.origin, self ); + } +} +astro_headbutt_damage( astro, org ) +{ + self endon( "disconnect" ); + self waittill( "perk_lost" ); + damage = self.health - 1; + if ( isdefined( astro ) ) + { + self DoDamage( damage, astro.origin, astro ); + } + else + { + self DoDamage( damage, org ); + } +} +astro_zombie_teleport_enemy() +{ + self endon( "death" ); + player = self.player_to_headbutt; + black_hole_teleport_structs = getstructarray( "struct_black_hole_teleport", "targetname" ); + chosen_spot = undefined; + if ( isDefined( level._special_blackhole_bomb_structs ) ) + { + black_hole_teleport_structs = [[level._special_blackhole_bomb_structs]](); + } + player_current_zone = player get_current_zone(); + if ( !IsDefined( black_hole_teleport_structs ) || black_hole_teleport_structs.size == 0 || !IsDefined( player_current_zone ) ) + { + return; + } + black_hole_teleport_structs = array_randomize( black_hole_teleport_structs ); + for ( i = 0; i < black_hole_teleport_structs.size; i++ ) + { + volume = level.zones[ black_hole_teleport_structs[i].script_string ].volumes[0]; + active_zone = check_point_in_active_zone( black_hole_teleport_structs[i].origin ); + if ( check_point_in_active_zone( black_hole_teleport_structs[i].origin ) && + ( player_current_zone != black_hole_teleport_structs[i].script_string ) ) + { + if ( !flag( "power_on" ) || volume.script_string == "lowgravity" ) + { + chosen_spot = black_hole_teleport_structs[i]; + break; + } + else + { + chosen_spot = black_hole_teleport_structs[i]; + } + } + else if ( active_zone ) + { + chosen_spot = black_hole_teleport_structs[i]; + } + } + if ( IsDefined( chosen_spot ) ) + { + player thread astro_zombie_teleport( chosen_spot ); + } +} +astro_zombie_teleport( struct_dest ) +{ + self endon( "death" ); + if( !IsDefined( struct_dest ) ) + { + return; + } + prone_offset = (0, 0, 49); + crouch_offset = (0, 0, 20); + stand_offset = (0, 0, 0); + destination = undefined; + if( self GetStance() == "prone" ) + { + destination = struct_dest.origin + prone_offset; + } + else if( self GetStance() == "crouch" ) + { + destination = struct_dest.origin + crouch_offset; + } + else + { + destination = struct_dest.origin + stand_offset; + } + if( IsDefined( level._black_hole_teleport_override ) ) + { + level [[ level._black_hole_teleport_override ]]( self ); + } + self FreezeControls( true ); + self DisableOffhandWeapons(); + self DisableWeapons(); + self DontInterpolate(); + self SetOrigin( destination ); + self SetPlayerAngles( struct_dest.angles ); + self EnableOffhandWeapons(); + self EnableWeapons(); + self FreezeControls( false ); + Earthquake( 0.8, 0.75, self.origin, 1000, self ); + PlayRumbleOnPosition("explosion_generic", self.origin); + self playsoundtoplayer( "zmb_gersh_teleporter_go_2d", self ); +} +astro_zombie_die() +{ + PlayFxOnTag( level._effect[ "astro_explosion" ], self, "J_SpineLower" ); + self stoploopsound( 1 ); + self playsound( "evt_astro_zombie_explo" ); + self thread astro_delay_delete(); + self thread astro_player_pulse(); + level.num_astro_zombies--; + level.next_astro_round = level.round_number + RandomIntRange( level.min_astro_round_wait, level.max_astro_round_wait + 1 ); + level.zombie_total_update = false; + _debug_astro_print( "astro killed in " + level.round_number ); + return self maps\_zombiemode_spawner::zombie_death_animscript(); +} +astro_delay_delete() +{ + self endon( "death" ); + self SetPlayerCollision( 0 ); + self thread maps\_zombiemode_spawner::zombie_eye_glow_stop(); + wait_network_frame(); + self Hide(); +} +astro_player_pulse() +{ + eye_org = self GetEye(); + foot_org = self.origin + ( 0, 0, 8 ); + mid_org = ( foot_org[0], foot_org[1], ( foot_org[2] + eye_org[2] ) / 2 ); + astro_org = self.origin; + if ( isdefined( self.player_to_headbutt ) ) + { + self.player_to_headbutt AllowJump( true ); + self.player_to_headbutt AllowProne( true ); + self.player_to_headbutt AllowCrouch( true ); + self.player_to_headbutt Unlink(); + wait_network_frame(); + wait_network_frame(); + } + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + if ( !is_player_valid( player ) ) + { + continue; + } + test_org = player GetEye(); + explode_radius = level.astro_explode_radius; + if ( DistanceSquared( eye_org, test_org ) > explode_radius * explode_radius ) + { + continue; + } + test_org_foot = player.origin + ( 0, 0, 8 ); + test_org_mid = ( test_org_foot[0], test_org_foot[1], ( test_org_foot[2] + test_org[2] ) / 2 ); + if ( !BulletTracePassed( eye_org, test_org, false, undefined ) ) + { + if ( !BulletTracePassed( mid_org, test_org_mid, false, undefined ) ) + { + if ( !BulletTracePassed( foot_org, test_org_foot, false, undefined ) ) + { + continue; + } + } + } + dist = distance( eye_org, test_org ); + scale = 1.0 - ( dist / explode_radius ); + if ( scale < 0 ) + { + scale = 0; + } + bonus = ( level.astro_explode_pulse_max - level.astro_explode_pulse_min ) * scale; + pulse = level.astro_explode_pulse_min + bonus; + dir = ( player.origin[0] - astro_org[0], player.origin[1] - astro_org[1], 0 ); + dir = VectorNormalize( dir ); + dir += ( 0, 0, 1 ); + dir *= pulse; + player SetOrigin( player.origin + ( 0, 0, 1 ) ); + player_velocity = dir; + player SetVelocity( player_velocity ); + if( isdefined( level.ai_astro_explode ) ) + { + player thread [[ level.ai_astro_explode ]]( mid_org ); + } + } +} +astro_actor_damage( weapon, damage, attacker ) +{ + self endon( "death" ); + switch( weapon ) + { + case "microwavegundw_zm": + case "microwavegundw_upgraded_zm": + damage = 0; + break; + } + return damage; +} +astro_nuke_damage() +{ + self endon( "death" ); +} +astro_custom_damage( player ) +{ + damage = self.meleeDamage; + if ( self.is_headbutt ) + { + damage = player.health - 1; + } + _debug_astro_print( "astro damage = " + damage ); + return damage; +} +astro_microwavegun_sizzle( player ) +{ + _debug_astro_print( "astro sizzle" ); +} +astro_zombie_default_enter_level() +{ + Playfx( level._effect["astro_spawn"], self.origin ); + playsoundatposition( "zmb_bolt", self.origin ); + PlayRumbleOnPosition("explosion_generic", self.origin); + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "general", "astro_spawn" ); + self.entered_level = true; +} +astro_damage_callback( mod, hit_location, hit_origin, player, amount ) +{ + if ( isdefined( self.animname ) && self.animname == "astro_zombie" ) + { + return true; + } + return false; +} +_debug_astro_health_watch() +{ + self endon( "death" ); + while ( 1 ) + { + wait( 1 ); + } +} +_debug_astro_print( str ) +{ +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_ai_director.gsc b/BO1/PC/ZM/maps/_zombiemode_ai_director.gsc new file mode 100644 index 0000000..2e04ddd --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_ai_director.gsc @@ -0,0 +1,2126 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include animscripts\zombie_Utility; +#using_animtree( "generic_human" ); +init() +{ + PrecacheRumble( "explosion_generic" ); + director_precache_models(); + init_director_zombie_anims(); + level._effect["director_groundhit"] = loadfx("maps/zombie/fx_zombie_boss_grnd_hit"); + level._effect["director_spawn"] = loadfx("maps/zombie/fx_zombie_boss_spawn"); + level._effect["director_weapon_light"] = loadfx("maps/zombie/fx_zombie_boss_weapon_light"); + level._effect["director_weapon_light_big"] = loadfx("maps/zombie/fx_zombie_boss_weapon_light_big"); + level._effect["director_weapon_light_blink"] = loadfx("maps/zombie/fx_zombie_boss_weapon_light_blink"); + level._effect["director_weapon_docile"] = loadfx("maps/zombie/fx_zombie_boss_weapon_docile"); + level._effect["director_death_head"] = loadfx("maps/zombie/fx_zombie_boss_death_head"); + level._effect["director_death_torso"] = loadfx("maps/zombie/fx_zombie_boss_death_torso"); + level._effect["director_death_weapon"] = loadfx("maps/zombie/fx_zombie_boss_weapon_defeat"); + level._effect["director_impact_humangun"] = loadfx("weapon/human_gun/fx_hgun_impact_exp_lrg"); + level._effect["director_impact_humangun_upgraded"] = loadfx("weapon/human_gun/fx_hgun_impact_exp_lrg_ug"); + if( !isDefined( level.director_zombie_spawn_heuristic ) ) + { + level.director_zombie_spawn_heuristic = maps\_zombiemode_ai_director::director_zombie_default_spawn_heuristic; + } + if( !isDefined( level.director_zombie_pathfind_heuristic ) ) + { + level.director_zombie_pathfind_heuristic = maps\_zombiemode_ai_director::director_zombie_default_pathfind_heuristic; + } + if ( !isDefined( level.director_zombie_enter_level ) ) + { + level.director_zombie_enter_level = maps\_zombiemode_ai_director::director_zombie_default_enter_level; + } + if ( !isDefined( level.director_reenter_level ) ) + { + level.director_reenter_level = ::director_reenter_level; + } + if ( !isDefined( level.director_exit_level ) ) + { + level.director_exit_level = ::director_exit_level; + } + if ( !isDefined( level.director_find_exit ) ) + { + level.director_find_exit = ::director_find_exit; + } + if ( !isDefined( level.director_devgui_health ) ) + { + level.director_devgui_health = ::director_devgui_health; + } + precacheshellshock( "electrocution" ); + level.num_director_zombies = 0; + level.director_zombie_spawners = GetEntArray( "boss_zombie_spawner", "targetname" ); + array_thread( level.director_zombie_spawners, ::add_spawn_function, maps\_zombiemode_ai_director::director_prespawn ); + if( !isDefined( level.max_director_zombies ) ) + { + level.max_director_zombies = 1; + } + if( !isDefined( level.director_zombie_health_mult ) ) + { + level.director_zombie_health_mult = 7; + } + if( !isDefined( level.director_zombie_max_health ) ) + { + level.director_zombie_max_health = 1000000; + } + if( !isDefined( level.director_zombie_scream_a_chance ) ) + { + level.director_zombie_scream_a_chance = 100; + } + if( !isDefined( level.director_zombie_scream_a_radius ) ) + { + level.director_zombie_scream_a_radius_sq = 1024*1024; + } + if( !isDefined( level.director_zombie_scream_b_chance ) ) + { + level.director_zombie_scream_b_chance = 0; + } + if( !isDefined( level.director_zombie_scream_b_radius ) ) + { + level.director_zombie_scream_b_radius_sq = 512*512; + } + if( !isDefined( level.director_zombie_groundhit_damage ) ) + { + level.director_zombie_groundhit_damage = 90; + } + if( !isDefined( level.director_zombie_groundhit_radius ) ) + { + level.director_zombie_groundhit_radius = 256; + } + if( !isDefined( level.director_zombie_proximity_wake ) ) + { + level.director_zombie_proximity_wake = 1296; + } + if( !isDefined( level.director_ground_attack_delay ) ) + { + level.director_ground_attack_delay = 5000; + } + if( !isDefined( level.director_max_ammo_chance_default ) ) + { + level.director_max_ammo_chance_default = 10; + } + if( !isDefined( level.director_max_ammo_chance_inc ) ) + { + level.director_max_ammo_chance_inc = 5; + } + if( !isDefined( level.director_max_damage_taken ) ) + { + level.director_max_damage_taken = 250000; + level.director_max_damage_taken_easy = 1000; + } + if( !isDefined( level.director_max_speed_buff ) ) + { + level.director_max_speed_buff = 2; + } + level thread director_zombie_manager(); + level.director_death = 0; + level.director_health_reduce = 0.7; + level.scr_anim["zombie"]["sprint5"] = %ai_zombie_fast_sprint_01; + level.scr_anim["zombie"]["sprint6"] = %ai_zombie_fast_sprint_02; + level.director_zombie_range = 480 * 480; + level.director_enemy_range = 900 * 900; + level.director_speed_buff_range = 300; + level.director_speed_buff_range_sq = level.director_speed_buff_range * level.director_speed_buff_range; + level.director_electric_buff_range = 256; + level.director_electric_buff_range_sq = level.director_electric_buff_range * level.director_electric_buff_range; + level.director_electrify_range_sq = 1024 * 1024; + level.director_speed_buff = 0; + level thread setup_player_damage_watchers(); + level thread director_max_ammo_watcher(); +} +director_precache_models() +{ + PrecacheModel( "t5_weapon_engineer_club" ); + PrecacheModel( "c_zom_george_romero_zombiefied_fb" ); +} +#using_animtree( "generic_human" ); +director_prespawn() +{ + self.animname = "director_zombie"; + self.custom_idle_setup = maps\_zombiemode_ai_director::director_zombie_idle_setup; + self.a.idleAnimOverrideArray = []; + self.a.idleAnimOverrideArray["stand"] = []; + self.a.idleAnimOverrideWeights["stand"] = []; + self.a.idleAnimOverrideArray["stand"][0][0] = %ai_zombie_boss_idle_a_coast; + self.a.idleAnimOverrideWeights["stand"][0][0] = 10; + self.a.idleAnimOverrideArray["stand"][0][1] = %ai_zombie_boss_idle_b_coast; + self.a.idleAnimOverrideWeights["stand"][0][1] = 10; + self.ignoreall = true; + self.allowdeath = true; + self.is_zombie = true; + self.has_legs = true; + self allowedStances( "stand" ); + self.gibbed = false; + self.head_gibbed = false; + self.disableArrivals = true; + self.disableExits = true; + self.grenadeawareness = 0; + self.badplaceawareness = 0; + self.ignoreSuppression = true; + self.suppressionThreshold = 1; + self.noDodgeMove = true; + self.dontShootWhileMoving = true; + self.pathenemylookahead = 0; + self.badplaceawareness = 0; + self.chatInitialized = false; + self.a.disablePain = true; + self disable_react(); + self.freezegun_damage = 0; + self.dropweapon = false; + self thread maps\_zombiemode_spawner::zombie_damage_failsafe(); + self thread maps\_zombiemode_spawner::delayed_zombie_eye_glow(); + self.flame_damage_time = 0; + self.meleeDamage = 50; + self.no_powerups = true; + self.custom_damage_func = ::director_custom_damage; + self.nuke_damage_func = ::director_nuke_damage; + self.tesla_damage_func = ::director_tesla_damage; + self.actor_full_damage_func = ::director_full_damage; + self.instakill_func = ::director_instakill; + self.humangun_hit_response = ::director_humangun_hit_response; + self.melee_anim_func = ::director_melee_anim; + self.set_animarray_standing_override = ::director_set_animarray_standing; + self.melee_miss_func = ::director_melee_miss; + self.flinger_func = ::director_fling; + self.non_attacker_func = ::director_non_attacker; + self.noChangeDuringMelee = true; + self.ignore_enemy_count = true; + self.ignore_water_damage = true; + self.ignore_speed_buff = true; + self.ignore_devgui_death = true; + self.no_damage_points = true; + self.electrified = true; + self.ground_hit = false; + self.nextGroundHit = 0; + self.can_move_with_bolt = true; + self.ignore_all_poi = true; + self.check_melee_path = true; + self.allowpain = false; + self setTeamForEntity( "axis" ); + if ( isDefined( level.director_init_done ) ) + { + self thread [[ level.director_init_done ]](); + } + level.zombie_director = self; + self notify( "zombie_init_done" ); +} +director_health_watch() +{ + self endon( "death" ); + while ( 1 ) + { + wait( 1 ); + } +} +director_zombie_idle_setup() +{ + self.a.array["turn_left_45"] = %exposed_tracking_turn45L; + self.a.array["turn_left_90"] = %exposed_tracking_turn90L; + self.a.array["turn_left_135"] = %exposed_tracking_turn135L; + self.a.array["turn_left_180"] = %exposed_tracking_turn180L; + self.a.array["turn_right_45"] = %exposed_tracking_turn45R; + self.a.array["turn_right_90"] = %exposed_tracking_turn90R; + self.a.array["turn_right_135"] = %exposed_tracking_turn135R; + self.a.array["turn_right_180"] = %exposed_tracking_turn180L; + self.a.array["exposed_idle"] = array( %ai_zombie_boss_idle_a_coast, %ai_zombie_boss_idle_b_coast ); + self.a.array["straight_level"] = %ai_zombie_boss_idle_a_coast; + self.a.array["stand_2_crouch"] = %ai_zombie_shot_leg_right_2_crawl; +} +init_director_zombie_anims() +{ + level.scr_anim["director_zombie"]["death1"] = %ai_zombie_boss_death_coast; + level.scr_anim["director_zombie"]["death2"] = %ai_zombie_boss_death_a_coast; + level.scr_anim["director_zombie"]["death3"] = %ai_zombie_boss_death_explode_coast; + level.scr_anim["director_zombie"]["death4"] = %ai_zombie_boss_death_mg_coast; + level.scr_anim["director_zombie"]["walk1"] = %ai_zombie_boss_walk_slow_coast; + level.scr_anim["director_zombie"]["walk2"] = %ai_zombie_boss_walk_a_coast; + level.scr_anim["director_zombie"]["run1"] = %ai_zombie_walk_fast_v1; + level.scr_anim["director_zombie"]["run2"] = %ai_zombie_walk_fast_v2; + level.scr_anim["director_zombie"]["run3"] = %ai_zombie_walk_fast_v3; + level.scr_anim["director_zombie"]["run4"] = %ai_zombie_run_v2; + level.scr_anim["director_zombie"]["run5"] = %ai_zombie_run_v4; + level.scr_anim["director_zombie"]["run6"] = %ai_zombie_run_v3; + level.scr_anim["director_zombie"]["sprint1"] = %ai_zombie_boss_sprint_a_coast; + level.scr_anim["director_zombie"]["sprint2"] = %ai_zombie_boss_sprint_a_coast; + level.scr_anim["director_zombie"]["sprint3"] = %ai_zombie_boss_sprint_b_coast; + level.scr_anim["director_zombie"]["sprint4"] = %ai_zombie_boss_sprint_b_coast; + level.scr_anim["director_zombie"]["crawl1"] = %ai_zombie_crawl; + level.scr_anim["director_zombie"]["crawl2"] = %ai_zombie_crawl_v1; + level.scr_anim["director_zombie"]["crawl3"] = %ai_zombie_crawl_v2; + level.scr_anim["director_zombie"]["crawl4"] = %ai_zombie_crawl_v3; + level.scr_anim["director_zombie"]["crawl5"] = %ai_zombie_crawl_v4; + level.scr_anim["director_zombie"]["crawl6"] = %ai_zombie_crawl_v5; + level.scr_anim["director_zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a; + level.scr_anim["director_zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b; + level.scr_anim["director_zombie"]["crawl_sprint1"] = %ai_zombie_crawl_sprint; + level.scr_anim["director_zombie"]["crawl_sprint2"] = %ai_zombie_crawl_sprint_1; + level.scr_anim["director_zombie"]["crawl_sprint3"] = %ai_zombie_crawl_sprint_2; + level.scr_anim["director_zombie"]["walk2sprint"] = %ai_zombie_boss_walk_2_sprint_coast; + level.scr_anim["director_zombie"]["sprint2walk"] = %ai_zombie_boss_sprint_2_walk_coast; + if( !isDefined( level._zombie_melee ) ) + { + level._zombie_melee = []; + } + if( !isDefined( level._zombie_walk_melee ) ) + { + level._zombie_walk_melee = []; + } + if( !isDefined( level._zombie_run_melee ) ) + { + level._zombie_run_melee = []; + } + level._zombie_melee["director_zombie"] = []; + level._zombie_walk_melee["director_zombie"] = []; + level._zombie_run_melee["director_zombie"] = []; + level._zombie_melee["director_zombie"][0] = %ai_zombie_boss_attack_multiswing_a_coast; + level._zombie_melee["director_zombie"][1] = %ai_zombie_boss_attack_multiswing_b_coast; + level._zombie_melee["director_zombie"][2] = %ai_zombie_boss_attack_swing_overhead_coast; + level._zombie_melee["director_zombie"][3] = %ai_zombie_boss_attack_swing_swipe_coast; + if( isDefined( level.director_zombie_anim_override ) ) + { + [[ level.director_zombie_anim_override ]](); + } + level._zombie_run_melee["director_zombie"][0] = %ai_zombie_boss_attack_running_coast; + level._zombie_run_melee["director_zombie"][1] = %ai_zombie_boss_attack_sprinting_coast; + level._zombie_run_melee["director_zombie"][2] = %ai_zombie_boss_attack_running_coast; + if( !isDefined( level._zombie_melee_crawl ) ) + { + level._zombie_melee_crawl = []; + } + level._zombie_melee_crawl["director_zombie"] = []; + level._zombie_melee_crawl["director_zombie"][0] = %ai_zombie_attack_crawl; + level._zombie_melee_crawl["director_zombie"][1] = %ai_zombie_attack_crawl_lunge; + if( !isDefined( level._zombie_stumpy_melee ) ) + { + level._zombie_stumpy_melee = []; + } + level._zombie_stumpy_melee["director_zombie"] = []; + level._director_zombie_stumpy_melee["director_zombie"][0] = %ai_zombie_walk_on_hands_shot_a; + level._director_zombie_stumpy_melee["director_zombie"][1] = %ai_zombie_walk_on_hands_shot_b; + if( !isDefined( level._zombie_tesla_deaths ) ) + { + level._zombie_tesla_deaths = []; + } + level._zombie_tesla_death["director_zombie"] = []; + level._zombie_tesla_death["director_zombie"][0] = %ai_zombie_boss_tesla_death_a_coast; + level._zombie_tesla_death["director_zombie"][1] = %ai_zombie_boss_tesla_death_a_coast; + level._zombie_tesla_death["director_zombie"][2] = %ai_zombie_boss_tesla_death_a_coast; + level._zombie_tesla_death["director_zombie"][3] = %ai_zombie_boss_tesla_death_a_coast; + level._zombie_tesla_death["director_zombie"][4] = %ai_zombie_boss_tesla_death_a_coast; + if( !isDefined( level._zombie_tesla_crawl_death ) ) + { + level._zombie_tesla_crawl_death = []; + } + level._zombie_tesla_crawl_death["director_zombie"] = []; + level._zombie_tesla_crawl_death["director_zombie"][0] = %ai_zombie_tesla_crawl_death_a; + level._zombie_tesla_crawl_death["director_zombie"][1] = %ai_zombie_tesla_crawl_death_b; + if( !isDefined( level._zombie_deaths ) ) + { + level._zombie_deaths = []; + } + level._zombie_deaths["director_zombie"] = []; + level._zombie_deaths["director_zombie"][0] = %ai_zombie_boss_death_coast; + level._zombie_deaths["director_zombie"][1] = %ai_zombie_boss_death_a_coast; + level._zombie_deaths["director_zombie"][2] = %ai_zombie_boss_death_explode_coast; + level._zombie_deaths["director_zombie"][3] = %ai_zombie_boss_death_mg_coast; + if( !isDefined( level._zombie_rise_anims ) ) + { + level._zombie_rise_anims = []; + } + level._zombie_rise_anims["director_zombie"] = []; + level._zombie_rise_anims["director_zombie"][1]["walk"][0] = %ai_zombie_traverse_ground_v1_walk; + level._zombie_rise_anims["director_zombie"][1]["run"][0] = %ai_zombie_traverse_ground_v1_run; + level._zombie_rise_anims["director_zombie"][1]["sprint"][0] = %ai_zombie_traverse_ground_climbout_fast; + level._zombie_rise_anims["director_zombie"][2]["walk"][0] = %ai_zombie_traverse_ground_v2_walk_altA; + if( !isDefined( level._zombie_rise_death_anims ) ) + { + level._zombie_rise_death_anims = []; + } + level._zombie_rise_death_anims["director_zombie"] = []; + level._zombie_rise_death_anims["director_zombie"][1]["in"][0] = %ai_zombie_traverse_ground_v1_deathinside; + level._zombie_rise_death_anims["director_zombie"][1]["in"][1] = %ai_zombie_traverse_ground_v1_deathinside_alt; + level._zombie_rise_death_anims["director_zombie"][1]["out"][0] = %ai_zombie_traverse_ground_v1_deathoutside; + level._zombie_rise_death_anims["director_zombie"][1]["out"][1] = %ai_zombie_traverse_ground_v1_deathoutside_alt; + level._zombie_rise_death_anims["director_zombie"][2]["in"][0] = %ai_zombie_traverse_ground_v2_death_low; + level._zombie_rise_death_anims["director_zombie"][2]["in"][1] = %ai_zombie_traverse_ground_v2_death_low_alt; + level._zombie_rise_death_anims["director_zombie"][2]["out"][0] = %ai_zombie_traverse_ground_v2_death_high; + level._zombie_rise_death_anims["director_zombie"][2]["out"][1] = %ai_zombie_traverse_ground_v2_death_high_alt; + if( !isDefined( level._zombie_run_taunt ) ) + { + level._zombie_run_taunt = []; + } + if( !isDefined( level._zombie_board_taunt ) ) + { + level._zombie_board_taunt = []; + } + level._zombie_run_taunt["director_zombie"] = []; + level._zombie_board_taunt["director_zombie"] = []; + level._zombie_board_taunt["director_zombie"][0] = %ai_zombie_taunts_4; + level._zombie_board_taunt["director_zombie"][1] = %ai_zombie_taunts_7; + level._zombie_board_taunt["director_zombie"][2] = %ai_zombie_taunts_9; + level._zombie_board_taunt["director_zombie"][3] = %ai_zombie_taunts_5b; + level._zombie_board_taunt["director_zombie"][4] = %ai_zombie_taunts_5c; + level._zombie_board_taunt["director_zombie"][5] = %ai_zombie_taunts_5d; + level._zombie_board_taunt["director_zombie"][6] = %ai_zombie_taunts_5e; + level._zombie_board_taunt["director_zombie"][7] = %ai_zombie_taunts_5f; +} +director_zombie_spawn() +{ + self.script_moveoverride = true; + if( !isDefined( level.num_director_zombies ) ) + { + level.num_director_zombies = 0; + } + level.num_director_zombies++; + director_zombie = self maps\_zombiemode_net::network_safe_stalingrad_spawn( "boss_zombie_spawn", 1 ); + director_zombie Hide(); + self.count = 666; + self.last_spawn_time = GetTime(); + if( !spawn_failed( director_zombie ) ) + { + director_zombie.script_noteworthy = self.script_noteworthy; + director_zombie.targetname = self.targetname; + director_zombie.target = self.target; + director_zombie.deathFunction = maps\_zombiemode_ai_director::director_zombie_die; + director_zombie.animname = "director_zombie"; + director_zombie thread director_zombie_think(); + } + else + { + level.num_director_zombies--; + } +} +director_zombie_manager() +{ + start_boss = getent( "start_boss_spawner", "script_noteworthy" ); + if ( isDefined( start_boss ) ) + { + while ( true ) + { + if ( level.num_director_zombies < level.max_director_zombies ) + { + start_boss director_zombie_spawn(); + break; + } + wait( 0.5 ); + } + } + while( true ) + { + AssertEx( isDefined( level.num_director_zombies ) && isDefined( level.max_director_zombies ), "Either max_director_zombies or num_director_zombies not defined, this should never be the case!" ); + while( level.num_director_zombies < level.max_director_zombies ) + { + spawner = director_zombie_pick_best_spawner(); + if( isDefined( spawner ) ) + { + spawner director_zombie_spawn(); + } + wait( 10 ); + } + wait( 10 ); + } +} +director_zombie_pick_best_spawner() +{ + best_spawner = undefined; + best_score = -1; + for( i = 0; i < level.director_zombie_spawners.size; i++ ) + { + score = [[ level.director_zombie_spawn_heuristic ]]( level.director_zombie_spawners[i] ); + if( score > best_score ) + { + best_spawner = level.director_zombie_spawners[i]; + best_score = score; + } + } + return best_spawner; +} +show_damage() +{ + while ( 1 ) + { + iprintln( "damage = " + self.dmg_taken ); + wait( 1 ); + } +} +director_display_damage() +{ + self endon( "death" ); + while ( 1 ) + { + display = GetDvarInt( #"scr_director_display_damage" ); + if ( display ) + { + print3d( self.origin + ( 0, 0, 72 ), "Damage " + self.dmg_taken, ( 1, 1, 1 ), 1, 1, 10 ); + } + wait( .5 ); + } +} +director_devgui_health() +{ + if ( isDefined( level.zombie_director ) ) + { + level.zombie_director director_reset_health( true ); + } +} +director_reset_health( easy ) +{ + players = getplayers(); + num_players = players.size; + self.max_damage_taken = level.director_max_damage_taken * num_players; + if ( is_true( easy ) ) + { + self.max_damage_taken = level.director_max_damage_taken_easy * num_players; + } + self.damage_one = self.max_damage_taken * .33; + self.damage_two = self.max_damage_taken * .66; + director_print( "reset damage " + self.max_damage_taken ); +} +director_flip_light_flag() +{ + if ( !is_true( self.director_light_set ) ) + { + self.director_light_set = true; + self setclientflag( level._ZOMBIE_ACTOR_FLAG_DIRECTOR_LIGHT ); + } + else + { + self.director_light_set = undefined; + self clearclientflag( level._ZOMBIE_ACTOR_FLAG_DIRECTOR_LIGHT ); + } +} +director_reset_light_flag() +{ + self endon( "death" ); + if ( self.health_state == "pristine" ) + { + self director_flip_light_flag(); + wait( 0.25 ); + self director_flip_light_flag(); + wait( 0.25 ); + self director_flip_light_flag(); + wait( 0.25 ); + self director_flip_light_flag(); + } + else if ( self.health_state == "full" ) + { + self director_flip_light_flag(); + wait( 0.25 ); + self director_flip_light_flag(); + wait( 0.25 ); + self director_flip_light_flag(); + } + else if ( self.health_state == "damage_one" ) + { + self director_flip_light_flag(); + wait( 0.25 ); + self director_flip_light_flag(); + } + else if ( self.health_state == "damage_two" ) + { + self director_flip_light_flag(); + } +} +director_watch_damage() +{ + self endon( "death" ); + self endon( "humangun_leave" ); + self.dmg_taken = 0; + self director_reset_health( false ); + self.health_state = "pristine"; + while ( 1 ) + { + self waittill( "damage", amount, attacker, direction, point, method ); + if ( !is_true( self.start_zombies ) ) + { + self.start_zombies = true; + self notify( "director_spawn_zombies" ); + } + if ( is_true( self.leaving_level ) ) + { + return; + } + self.dmg_taken += amount; + if ( self.health_state == "pristine" ) + { + self.health_state = "full"; + self director_flip_light_flag(); + } + else if ( self.health_state == "full" && self.dmg_taken >= self.damage_one ) + { + self.health_state = "damage_one"; + self director_flip_light_flag(); + if( IsDefined( level._audio_director_vox_play ) ) + { + rand = RandomIntRange( 0, 5 ); + self thread [[ level._audio_director_vox_play ]]( "vox_romero_weaken_" + rand, .25 ); + } + if( IsDefined( attacker ) && IsPlayer( attacker ) ) + { + attacker thread maps\_zombiemode_audio::create_and_play_dialog( "director", "weaken" ); + } + } + else if ( self.health_state == "damage_one" && self.dmg_taken >= self.damage_two ) + { + self.health_state = "damage_two"; + self.light StopLoopSound(2); + self director_flip_light_flag(); + if( IsDefined( level._audio_director_vox_play ) ) + { + rand = RandomIntRange( 0, 5 ); + self thread [[ level._audio_director_vox_play ]]( "vox_romero_weaken_" + rand, .25 ); + } + if( IsDefined( attacker ) && IsPlayer( attacker ) ) + { + attacker thread maps\_zombiemode_audio::create_and_play_dialog( "director", "weaken" ); + } + } + if ( self.dmg_taken >= self.max_damage_taken ) + { + self director_flip_light_flag(); + break; + } + if ( is_true( self.in_water ) ) + { + wait_network_frame(); + if ( !is_true( self.leaving_level ) && !is_true( self.entering_level ) && !is_true( self.sprint2walk ) ) + { + self thread director_scream_in_water(); + } + } + } + self setclientflag( level._ZOMBIE_ACTOR_FLAG_DIRECTOR_DEATH ); + if ( is_true( self.is_sliding ) ) + { + self.skip_stumble = true; + self waittill( "zombie_end_traverse" ); + } + self notify( "director_exit" ); + self.defeated = true; + self notify( "disable_activation" ); + self notify( "disable_buff" ); + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self.ignoreall = true; + if ( is_true( self.is_traversing ) ) + { + self.skip_stumble = true; + self waittill( "zombie_end_traverse" ); + } + level notify( "director_submerging_audio" ); + if( IsDefined( level._audio_director_vox_play ) ) + { + self thread [[ level._audio_director_vox_play ]]( "vox_director_die", .25, true ); + } + if ( is_true( self.skip_stumble ) ) + { + self.skip_stumble = undefined; + } + else + { + self animcustom( ::director_custom_stumble ); + self waittill_notify_or_timeout( "stumble_done", 7.2 ); + } + if ( isdefined( level.director_should_drop_special_powerup ) && [[level.director_should_drop_special_powerup]]() ) + { + level thread maps\_zombiemode_powerups::specific_powerup_drop( "tesla", self.origin ); + } + else + { + level thread maps\_zombiemode_powerups::specific_powerup_drop( "minigun", self.origin ); + } + forward = VectorNormalize( AnglesToForward( self.angles ) ); + end_pos = self.origin - vector_scale( forward, 32 ); + level thread maps\_zombiemode_powerups::specific_powerup_drop( "free_perk", end_pos ); + level notify( "quiet_on_the_set_achieved" ); + exit = self thread [[ level.director_find_exit ]](); + self thread director_leave_map( exit, self.in_water ); +} +director_custom_stumble() +{ + director_print( "custom stumble" ); + stumble_anim = %ai_zombie_boss_stumble_coast; + self thread director_stumble_watcher( "stumble_anim" ); + self SetFlaggedAnimKnobAllRestart( "stumble_anim", stumble_anim, %body, 1, .1, 1 ); + animscripts\traverse\zombie_shared::wait_anim_length( stumble_anim, .02 ); + self notify( "stumble_done" ); +} +director_stumble_watcher( animname ) +{ + self endon( "death" ); + self waittillmatch( animname, "weapon_fx" ); + playfxontag( level._effect["director_death_weapon"], self, "tag_light" ); +} +director_scream_in_water() +{ + self endon( "death" ); + if ( !isDefined( self.water_scream ) ) + { + self.water_scream = true; + if ( is_true( self.is_melee ) ) + { + while ( 1 ) + { + if ( !is_true( self.is_melee ) ) + { + break; + } + wait_network_frame(); + } + } + if( IsDefined( level._audio_director_vox_play ) ) + { + self thread [[ level._audio_director_vox_play ]]( "vox_director_pain_yell", .25, true ); + } + scream_anim = %ai_zombie_boss_nuke_react_coast; + self thread director_scream_delay(); + self thread director_zombie_sprint_watcher( "scream_anim" ); + self director_animscripted( scream_anim, "scream_anim" ); + wait( 3 ); + self.water_scream = undefined; + } +} +director_scream_delay() +{ + wait( 2.6 ); + clientnotify( "ZDA" ); + self thread director_blur(); +} +director_blur() +{ + self endon( "death" ); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + player ShellShock( "electrocution", 1.7, true ); + } +} +director_zombie_think() +{ + self endon( "death" ); + self.pathEnemyFightDist = 96; + self.meleeAttackDist = 96; + self.maxhealth = level.director_zombie_max_health; + self.health = level.director_zombie_max_health; + self.maxsightdistsqrd = 96 * 96; + self.is_activated = false; + self.entering_level = true; + self.zombie_move_speed = "walk"; + self director_zombie_choose_buff(); + self [[ level.director_zombie_enter_level ]](); + level notify( "audio_begin_director_vox" ); + self thread director_watch_damage(); + self thread zombie_melee_watcher(); + self thread director_zombie_update_goal_radius(); + self thread director_kill_prone(); + self.ignoreall = false; + if ( isDefined( level.director_zombie_custom_think ) ) + { + self thread [[ level.director_zombie_custom_think ]](); + } + self thread director_zombie_check_for_buff(); + self thread director_zombie_choose_run(); + self thread director_zombie_health_manager(); + self SetClientFlag( level._ZOMBIE_ACTOR_FLAG_DIRECTORS_STEPS ); + self.entering_level = undefined; + self BloodImpact( "hero" ); + self thread director_zombie_update(); +} +director_zombie_update() +{ + self endon( "death" ); + self endon( "director_exit" ); + while( true ) + { + if ( is_true( self.custom_think ) ) + { + wait_network_frame(); + continue; + } + else if ( is_true( self.defeated ) ) + { + wait( 5 ); + continue; + } + else if ( is_true( self.performing_activation ) ) + { + wait_network_frame(); + continue; + } + else if ( is_true( self.ground_hit ) ) + { + wait_network_frame(); + continue; + } + else if ( !is_true( self.following_player ) ) + { + self thread maps\_zombiemode_spawner::find_flesh(); + self.following_player = true; + } + wait( 1 ); + } +} +director_add_weapon() +{ + self Attach( "t5_weapon_engineer_club", "tag_weapon_right" ); + self.light = Spawn( "script_model", self GetTagOrigin( "tag_light" ) ); + self.light PlayLoopSound("zmb_director_light_docile_loop", 2 ); + self.light.angles = self GetTagAngles( "tag_light" ); + self.light SetModel( "tag_origin" ); + self.light LinkTo( self, "tag_light" ); + wait_network_frame(); + wait_network_frame(); + self director_flip_light_flag(); +} +director_zombie_choose_buff() +{ + if ( is_true( self.ground_hit ) || GetTime() < self.nextGroundHit || !self.is_activated ) + { + self.buff = "speed"; + } + else + { + rand = RandomInt( 100 ); + if ( rand < 50 ) + { + self.buff = "electric"; + } + else + { + self.buff = "speed"; + } + } +} +director_zombie_default_pathfind_heuristic( node ) +{ + if( !isDefined( node.targetname ) || !isDefined( level.zones[node.targetname] ) ) + { + return -1; + } + players = get_players(); + score = 0; + for( i = 0; i < players.size; i++ ) + { + dist = distanceSquared( node.origin, players[i].origin ); + if( dist > 10000*10000 ) + { + dist = 10000*10000; + } + if( dist <= 1 ) + { + score += 10000*10000; + continue; + } + score += int( 10000*10000/dist ); + } + return score; +} +director_zombie_default_spawn_heuristic( spawner ) +{ + if( isDefined( spawner.last_spawn_time ) && (GetTime() - spawner.last_spawn_time < 30000) ) + { + return -1; + } + if( !isDefined( spawner.script_noteworthy ) ) + { + return -1; + } + if( !isDefined( level.zones ) || !isDefined( level.zones[ spawner.script_noteworthy ] ) || !level.zones[ spawner.script_noteworthy ].is_enabled ) + { + return -1; + } + score = 0; + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + score = int( distanceSquared( spawner.origin, players[i].origin ) ); + } + return score; +} +director_zombie_choose_run() +{ + self endon( "death" ); + while( true ) + { + if ( isDefined( self.choose_run ) ) + { + if ( self thread [[ self.choose_run ]]() ) + { + wait_network_frame(); + continue; + } + } + if ( is_true( self.walk2sprint ) ) + { + transition_anim = level.scr_anim["director_zombie"]["walk2sprint"]; + self set_run_anim( "walk2sprint" ); + self.run_combatanim = transition_anim; + self.crouchRunAnim = transition_anim; + self.crouchrun_combatanim = transition_anim; + self.needs_run_update = true; + time = getAnimLength( transition_anim ); + wait( time ); + self.walk2sprint = undefined; + } + if ( is_true( self.sprint2walk ) ) + { + self animcustom( ::director_sprint2walk ); + self waittill_notify_or_timeout( "transition_done", 1.74 ); + self.sprint2walk = undefined; + } + if( self.is_activated ) + { + self.zombie_move_speed = "sprint"; + rand = randomIntRange( 1, 4 ); + self set_run_anim( "sprint"+rand ); + self.run_combatanim = level.scr_anim["director_zombie"]["sprint"+rand]; + self.crouchRunAnim = level.scr_anim["director_zombie"]["sprint"+rand]; + self.crouchrun_combatanim = level.scr_anim["director_zombie"]["sprint"+rand]; + self.needs_run_update = true; + self director_wait_for_run_change(); + } + else + { + walk_version = "walk1"; + self.zombie_move_speed = "walk"; + self set_run_anim( walk_version ); + self.run_combatanim = level.scr_anim["director_zombie"][walk_version]; + self.crouchRunAnim = level.scr_anim["director_zombie"][walk_version]; + self.crouchrun_combatanim = level.scr_anim["director_zombie"][walk_version]; + self.needs_run_update = true; + } + wait_network_frame(); + } +} +director_wait_for_run_change() +{ + self endon( "death" ); + self endon( "director_calmed" ); + self endon( "director_exit" ); + self endon( "director_run_change" ); + randf = randomFloatRange( 2, 3 ); + wait( randf ); +} +director_zombie_health_manager() +{ + self endon( "death" ); + while ( 1 ) + { + self waittill( "damage" ); + self.maxhealth = level.director_zombie_max_health; + self.health = level.director_zombie_max_health; + director_print( "health = " + self.health ); + } +} +director_zombie_update_goal_radius() +{ + self endon( "death" ); + self endon( "director_exit" ); + while ( 1 ) + { + if ( is_true( self.leaving_level ) ) + { + self.pathEnemyFightDist = 48; + self.meleeAttackDist = 48; + self.goalradius = 32; + return; + } + if ( isDefined( self.enemy ) ) + { + heightDiff = abs( self.enemy.origin[2] - self.origin[2] ); + in_zone = self maps\_zombiemode_zone_manager::entity_in_zone( "residence_roof_zone" ); + canMelee = animscripts\zombie_melee::CanMeleeDesperate(); + if ( heightDiff < 24 && !is_true( self.is_activated ) && !in_zone && canMelee ) + { + self.pathEnemyFightDist = 96; + self.meleeAttackDist = 96; + self.goalradius = 90; + } + else + { + self.pathEnemyFightDist = 48; + self.meleeAttackDist = 48; + self.goalradius = 32; + } + } + wait( .5 ); + } +} +director_kill_prone() +{ + self endon( "death" ); + _KILL_DIST = 144; + _HEIGHT_DIST = 48; + while ( 1 ) + { + if ( isdefined( self.enemy ) ) + { + if ( is_true( self.is_activated ) ) + { + d = Distance2DSquared( self.enemy.origin, self.origin ); + h = self.enemy.origin[2] - self.origin[2]; + if ( d < _KILL_DIST && h < _HEIGHT_DIST ) + { + self.enemy DoDamage( self.enemy.health * 10, self.enemy.origin, self ); + } + } + } + wait( 0.5 ); + } +} +director_zombie_check_player_proximity() +{ + self endon( "death" ); + while ( 1 ) + { + if ( isdefined( self.performing_activation ) && self.performing_activation ) + { + break; + } + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + dist = DistanceSquared( self.origin, players[i].origin ); + if ( dist < level.director_zombie_proximity_wake ) + { + self notify( "hit_player" ); + break; + } + } + wait_network_frame(); + } +} +director_zombie_update_proximity_wake() +{ + while ( !isdefined( level.round_number ) ) + { + wait( 1 ); + } + while ( 1 ) + { + if ( level.round_number >= 20 ) + { + level.director_zombie_proximity_wake = 120; + break; + } + else if ( level.round_number >= 15 ) + { + level.director_zombie_proximity_wake = 102; + } + else if ( level.round_number >= 10 ) + { + level.director_zombie_proximity_wake = 84; + } + wait( 1 ); + } +} +director_activation_damage() +{ + self endon( "death" ); + self endon( "disable_activation" ); + self endon( "hit_player" ); + self waittill( "activation_damage", attacker, weapon ); + if ( isDefined( attacker ) && IsPlayer( attacker ) ) + { + attacker maps\_zombiemode_score::player_add_points( "damage" ); + attacker thread maps\_zombiemode_audio::create_and_play_dialog( "director", "anger" ); + } + self notify( "director_aggro" ); +} +director_activation_hit_player() +{ + self endon( "death" ); + self endon( "disable_activation" ); + self endon( "damage" ); + self waittill( "hit_player" ); + self notify( "director_aggro" ); +} +director_zombie_check_for_activation() +{ + self endon( "death" ); + self endon( "disable_activation" ); + self.is_activated = false; + self thread director_activation_damage(); + self thread director_activation_hit_player(); + self waittill( "director_aggro" ); + self notify( "director_spawn_zombies" ); + self.is_activated = true; + if ( is_true( self.is_traversing ) ) + { + self waittill( "zombie_end_traverse" ); + } + self notify( "stop_find_flesh" ); + self.following_player = false; + self.performing_activation = true; + self.ground_hit = true; + self thread scream_a_watcher( "aggro_anim" ); + self thread groundhit_watcher( "aggro_anim" ); + self thread director_zombie_sprint_watcher( "aggro_anim" ); + self thread director_zombified_watcher( "aggro_anim" ); + if( IsDefined( level._audio_director_vox_play ) ) + { + self thread [[ level._audio_director_vox_play ]]( "vox_director_angered", .25, true ); + } + self playsound("zmb_director_light_start"); + aggro_anim = %ai_zombie_boss_enrage_start_coast; + if ( RandomInt( 100 ) < 50 ) + { + aggro_anim = %ai_zombie_boss_enrage_start_a_coast; + } + if( IsDefined( level._audio_director_vox_play ) ) + { + self thread [[ level._audio_director_vox_play ]]( "vox_director_slam", .25, true ); + } + self director_animscripted( aggro_anim, "aggro_anim", true ); + self.performing_activation = false; + self.ground_hit = false; + self.delay_time = undefined; + self notify( "director_activated" ); + if ( !is_true( self.is_traversing ) ) + { + self director_transition( "sprint" ); + } + self thread director_zombie_ground_hit_think(); +} +director_zombified_watcher( animname ) +{ + self endon( "death" ); + self waittillmatch( animname, "scream_a" ); + if ( !is_true( self.director_zombified ) ) + { + self setmodel( "c_zom_george_romero_zombiefied_fb" ); + self.director_zombified = true; + } +} +director_zombie_check_for_buff() +{ + self endon( "death" ); + self endon( "disable_buff" ); + wait( 5 ); + while ( 1 ) + { + if ( is_true( self.performing_activation ) ) + { + wait( 3 ); + continue; + } + if ( is_true( self.is_transition ) ) + { + wait( 1 ); + continue; + } + if ( self.buff == "speed" ) + { + if ( level.round_number < 6 ) + { + self director_zombie_choose_buff(); + wait( 3 ); + continue; + } + num = director_zombie_get_num_speed_buff(); + if ( num >= level.director_max_speed_buff ) + { + self director_zombie_choose_buff(); + wait( 3 ); + continue; + } + } + { + zombies_in_range = director_get_zombies_to_buff(); + if ( zombies_in_range.size ) + { + self thread director_zombie_apply_buff( zombies_in_range ); + self.buff_cooldown = GetTime() + ( zombies_in_range.size * 5000 ); + self director_buff_cooldown(); + } + } + wait( 1 ); + } +} +director_buff_cooldown() +{ + self endon( "death" ); + while ( 1 ) + { + t = GetTime(); + if ( t >= self.buff_cooldown ) + { + break; + } + wait( 0.1 ); + } +} +director_get_zombies_to_buff() +{ + zombies_in_range = []; + zombies = GetAiSpeciesArray( "axis", "all" ); + for ( i = 0; i < zombies.size; i++ ) + { + if ( !self director_zombie_can_buff( zombies[i] ) ) + { + continue; + } + zombies_in_range = add_to_array( zombies_in_range, zombies[i] ); + } + return zombies_in_range; +} +director_zombie_enemy_is_far() +{ + self endon( "death" ); + far_enough = false; + if ( isDefined( self.favoriteenemy ) ) + { + height = Abs( self.origin[2] - self.favoriteenemy.origin[2] ); + if ( height > 72 ) + { + far_enough = true; + } + dist_enemy = DistanceSquared( self.origin, self.favoriteenemy.origin ); + if ( dist_enemy > level.director_enemy_range ) + { + far_enough = true; + } + } + return far_enough; +} +director_zombie_can_buff( zombie ) +{ + self endon( "death" ); + if ( is_true( zombie.ignoreme ) ) + { + return false; + } + range = level.director_speed_buff_range_sq; + if ( self.buff == "electric" ) + { + range = level.director_electric_buff_range_sq; + if ( is_true( zombie.electrified ) ) + { + return false; + } + } + else if ( self.buff == "speed" ) + { + if ( is_true( zombie.ignore_speed_buff ) ) + { + return false; + } + if ( is_true( zombie.speed_buff ) ) + { + return false; + } + if ( is_true( zombie.in_water ) ) + { + return false; + } + } + height = Abs( self.origin[2] - zombie.origin[2] ); + if ( height > 72 ) + { + return false; + } + dist = DistanceSquared( self.origin, zombie.origin ); + if ( dist > range ) + { + return false; + } + forward = VectorNormalize( AnglesToForward( self.angles ) ); + zombie_dir = VectorNormalize( zombie.origin - self.origin ); + dot = VectorDot( forward, zombie_dir ); + if ( dot < 0.5 ) + { + return false; + } + return true; +} +director_zombie_apply_buff( zombies ) +{ + self endon( "death" ); + if ( self.buff == "electric" ) + { + self director_zombie_electric_buff( zombies ); + } + else if ( self.buff == "speed" ) + { + enrage_anim = %ai_zombie_boss_enrage_start_scream_coast; + self director_zombie_speed_buff( zombies, enrage_anim ); + } + self director_zombie_choose_buff(); +} +director_zombie_speed_buff( zombies, enrage_anim ) +{ + self endon( "death" ); + director_print( "apply speed buff " + zombies.size ); + if( IsDefined( level._audio_director_vox_play ) ) + { + self thread [[ level._audio_director_vox_play ]]( "vox_director_speed_buff", .25, true ); + } + if ( IsDefined( enrage_anim ) ) + { + self director_animscripted( enrage_anim, "enrage_anim" ); + } + level.director_speed_buff = director_zombie_get_num_speed_buff(); + speed_count = level.director_max_speed_buff - level.director_speed_buff; + director_print( "speed buff current = " + level.director_speed_buff + " adding " + speed_count ); + if ( speed_count > zombies.size ) + { + speed_count = zombies.size; + } + for ( i = 0; i < speed_count; i++ ) + { + if ( isDefined( zombies[i] ) ) + { + zombies[i] thread zombie_speed_buff(); + } + } + players = getplayers(); + for(i=0;i= self.nextGroundHit ) + { + players = GetPlayers(); + closeEnough = false; + origin = self GetEye(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] maps\_laststand::player_is_in_laststand() ) + { + continue; + } + if ( is_true( players[i].divetoprone ) ) + { + continue; + } + stance = players[i] GetStance(); + if ( stance == "prone" ) + { + continue; + } + test_origin = players[i] GetEye(); + d = DistanceSquared( origin, test_origin ); + if ( d > level.director_zombie_groundhit_radius * level.director_zombie_groundhit_radius ) + { + continue; + } + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + continue; + } + closeEnough = true; + break; + } + if ( closeEnough ) + { + if( IsDefined( level._audio_director_vox_play ) ) + { + self thread [[ level._audio_director_vox_play ]]( "vox_director_slam", .25, true ); + } + self animcustom( ::director_zombie_ground_hit ); + } + } + wait_network_frame(); + } +} +scream_a_watcher( animname ) +{ + self endon( "death" ); + self waittillmatch( animname, "scream_a" ); + clientnotify( "ZDA" ); + self thread director_blur(); +} +director_zombie_sprint_watcher( animname ) +{ + self endon( "death" ); + self waittillmatch( animname, "scream_a" ); + origin = self GetEye(); + zombies = get_array_of_closest( origin, GetAiSpeciesArray( "axis", "all" ), undefined, undefined, level.director_speed_buff_range ); + if ( IsDefined( zombies ) ) + { + zombies_in_range = []; + for ( i = 0; i < zombies.size; i++ ) + { + if ( !IsDefined( zombies[i] ) ) + { + continue; + } + if ( is_true( zombies[i].ignore_speed_buff ) ) + { + continue; + } + if ( is_true( zombies[i].speed_buff ) ) + { + continue; + } + if ( is_true( zombies[i].in_water ) ) + { + continue; + } + height = Abs( self.origin[2] - zombies[i].origin[2] ); + if ( height > 72 ) + { + continue; + } + if ( zombies[i] == self ) + { + continue; + } + forward = VectorNormalize( AnglesToForward( self.angles ) ); + zombie_dir = VectorNormalize( zombies[i].origin - self.origin ); + dot = VectorDot( forward, zombie_dir ); + if ( dot < 0.5 ) + { + continue; + } + zombies_in_range = add_to_array( zombies_in_range, zombies[i] ); + } + if ( zombies_in_range.size > 0 ) + { + self director_zombie_speed_buff( zombies_in_range ); + } + } +} +groundhit_watcher( animname ) +{ + self endon( "death" ); + self waittillmatch( animname, "wrench_hit" ); + playfxontag(level._effect["director_groundhit"],self,"tag_origin"); + origin = self GetEye(); + zombies = get_array_of_closest( origin, GetAiSpeciesArray( "axis", "all" ), undefined, undefined, level.director_electric_buff_range ); + electrified = 0; + if ( IsDefined( zombies ) ) + { + for ( i = 0; i < zombies.size; i++ ) + { + if ( !IsDefined( zombies[i] ) ) + { + continue; + } + if ( is_true( zombies[i].electrified ) ) + { + continue; + } + test_origin = zombies[i] GetEye(); + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + continue; + } + if ( zombies[i] == self ) + { + continue; + } + zombies[i] zombie_set_electric_buff(); + electrified++; + } + } + director_print( "apply electric buff " + electrified ); + players = get_players(); + affected_players = []; + for( i = 0; i < players.size; i++ ) + { + test_origin = players[i] GetEye(); + d = DistanceSquared( origin, test_origin ); + if( d > level.director_electrify_range_sq ) + { + continue; + } + heightDiff = abs( origin[2] - test_origin[2] ); + if ( heightDiff > 96 ) + { + continue; + } + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + continue; + } + affected_players = array_add( affected_players, players[i] ); + } + for( i = 0; i < affected_players.size; i++ ) + { + if ( affected_players[i] IsOnGround() ) + { + affected_players[i] player_electrify(); + } + } +} +scream_b_watcher( animname ) +{ + self endon( "death" ); + rand = RandomInt( 100 ); + if( rand > level.director_zombie_scream_b_chance ) + { + return; + } + self waittillmatch( animname, "scream_b" ); + players = get_players(); + affected_players = []; + for( i = 0; i < players.size; i++ ) + { + if( distanceSquared( players[i].origin, self.origin ) < level.director_zombie_scream_b_radius_sq ) + { + affected_players = array_add( affected_players, players[i] ); + } + } + for( i = 0; i < affected_players.size; i++ ) + { + affected_players[i] ShellShock( "electrocution", 1.5, true ); + } +} +director_zombie_die() +{ + return true; +} +director_custom_damage( player ) +{ + self endon( "death" ); + if ( isDefined( self.ground_hit ) && self.ground_hit ) + { + return level.director_zombie_groundhit_damage; + } + return self.meleeDamage; +} +director_nuke_damage() +{ + self endon( "death" ); + if ( is_true( self.is_traversing ) ) + { + return; + } + if ( is_true( self.leaving_level ) ) + { + return; + } + if ( !isDefined( self.nuke_react ) ) + { + self.nuke_react = true; + nuke_anim = %ai_zombie_boss_nuke_react_coast; + self director_animscripted( nuke_anim, "nuke_anim" ); + self.nuke_react = undefined; + } +} +director_tesla_damage( origin, player ) +{ + self.zombie_tesla_hit = false; + if ( is_true( self.leaving_level ) ) + { + return; + } + if ( !is_true( self.is_activated ) ) + { + self notify( "activation_damage", player, "tesla_gun_zm" ); + } +} +director_full_damage( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, modelIndex, psOffsetTime ) +{ + self endon( "death" ); + self notify( "activation_damage", attacker, weapon ); + if ( sHitLoc == "head" || sHitLoc == "helmet" || sHitLoc == "neck" ) + { + return damage; + } + switch ( weapon ) + { + case "aug_acog_mk_upgraded_zm": + case "commando_upgraded_zm": + damage *= 4.75; + break; + case "galil_upgraded_zm": + case "fnfal_upgraded_zm": + damage *= 3.5; + break; + case "famas_upgraded_zm": + damage *= 9.25; + break; + case "zombie_nesting_doll_single": + damage /= 20; + break; + } + return damage; +} +director_zombie_default_enter_level() +{ + Playfx( level._effect["director_spawn"], self.origin ); + playsoundatposition( "zmb_bolt", self.origin ); + PlayRumbleOnPosition("explosion_generic", self.origin); +} +setup_player_damage_watchers() +{ + flag_wait( "all_players_connected" ); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i].player_damage_override = ::player_damage_watcher; + } +} +player_damage_watcher( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + if ( IsPlayer( eAttacker ) ) + { + return; + } + if ( is_true( eAttacker.electrified ) ) + { + self player_electrify(); + } +} +player_electrify() +{ + self endon( "death" ); + self endon( "disconnect" ); + SHOCK_TIME = 0.25; + if ( !IsDefined( self.electrified ) ) + { + self.electrified = true; + self setelectrified( SHOCK_TIME ); + self ShellShock( "electrocution", 0.5, true ); + self PlaySound("zmb_director_damage_zort"); + self setclientflag( level._CF_PLAYER_ELECTRIFIED ); + wait( SHOCK_TIME ); + self clearclientflag( level._CF_PLAYER_ELECTRIFIED ); + self.electrified = undefined; + } +} +zombie_set_electric_buff() +{ + self.electrified = true; + self setclientflag( level._ZOMBIE_ACTOR_FLAG_ELECTRIFIED ); + self playloopsound("zmb_electric_zombie_loop"); + self thread zombie_melee_watcher(true); + self.actor_killed_override = ::zombie_clear_electric_buff; +} +zombie_melee_watcher(is_zombie) +{ + self endon( "death" ); + if(is_true(is_zombie)) + { + self endon("stop_melee_watch"); + } + while ( 1 ) + { + self waittill( "damage", amount, attacker, direction, point, method ); + if ( IsPlayer( attacker ) ) + { + if ( method == "MOD_MELEE" ) + { + attacker player_electrify(); + attacker thread maps\_zombiemode_audio::create_and_play_dialog( "general", "damage_shocked" ); + } + } + } +} +zombie_clear_electric_buff( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime ) +{ + self clearclientflag( level._ZOMBIE_ACTOR_FLAG_ELECTRIFIED ); + self StopLoopSound(3); + if ( IsDefined( sMeansOfDeath ) && IsDefined( attacker ) && IsPlayer( attacker )) + { + if ( sMeansOfDeath == "MOD_MELEE" ) + { + attacker player_electrify(); + } + } + if ( IsDefined( sMeansOfDeath ) ) + { + if ( is_true( level.director_max_ammo_available ) && !is_true( self.ignoreme ) ) + { + self zombie_drop_max_ammo(); + } + } + self.electrified = undefined; +} +zombie_drop_max_ammo() +{ + chance = RandomInt( 100 ); + director_print( "chance " + chance + " < " + level.director_max_ammo_chance ); + if ( chance < level.director_max_ammo_chance ) + { + level.director_max_ammo_available = false; + level.director_max_ammo_chance = level.director_max_ammo_chance_default; + level thread maps\_zombiemode_powerups::specific_powerup_drop( "full_ammo", self.origin ); + level notify( "director_max_ammo_drop" ); + } + else + { + level.director_max_ammo_chance += level.director_max_ammo_chance_inc; + } +} +director_max_ammo_watcher() +{ + level.director_max_ammo_available = false; + level.director_max_ammo_chance = level.director_max_ammo_chance_default; + flag_wait( "power_on" ); + level.director_max_ammo_round = level.round_number + randomintrange( 1, 4 ); + director_print( "next max ammo round " + level.director_max_ammo_round ); + while ( 1 ) + { + level waittill( "between_round_over" ); + if ( level.round_number >= level.director_max_ammo_round ) + { + level.director_max_ammo_available = true; + level waittill( "director_max_ammo_drop" ); + level.director_max_ammo_round = level.round_number + randomintrange( 4, 6 ); + director_print( "next max ammo round " + level.director_max_ammo_round ); + } + } +} +director_instakill() +{ +} +director_humangun_hit_response( upgraded ) +{ + if ( is_true( self.defeated ) || is_true( self.leaving_level ) || is_true( self.entering_level ) ) + { + return; + } + if ( upgraded ) + { + if ( !is_true( self.impact_humangun_upgraded ) ) + { + self.impact_humangun_upgraded = true; + self setclientflag( level._ZOMBIE_ACTOR_FLAG_HUMANGUN_UPGRADED_HIT_RESPONSE ); + } + else + { + self.impact_humangun_upgraded = undefined; + self clearclientflag( level._ZOMBIE_ACTOR_FLAG_HUMANGUN_UPGRADED_HIT_RESPONSE ); + } + if ( isDefined( self.water_trigger ) && isDefined( self.water_trigger.target ) ) + { + self notify( "disable_activation" ); + self notify( "disable_buff" ); + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self notify( "humangun_leave" ); + self.ignoreall = true; + self setclientflag( level._ZOMBIE_ACTOR_FLAG_DIRECTOR_DEATH ); + exit = getstruct( self.water_trigger.target, "targetname" ); + self thread director_leave_map( exit, true ); + } + else + { + self director_humangun_react(); + self director_calmed( undefined, true ); + } + } + else + { + if ( !is_true( self.impact_humangun ) ) + { + self.impact_humangun = true; + self setclientflag( level._ZOMBIE_ACTOR_FLAG_HUMANGUN_HIT_RESPONSE ); + } + else + { + self.impact_humangun = undefined; + self clearclientflag( level._ZOMBIE_ACTOR_FLAG_HUMANGUN_HIT_RESPONSE ); + } + if ( is_true( self.in_water ) ) + { + return; + } + self director_humangun_react(); + self director_calmed( 10, true ); + } +} +director_humangun_react() +{ + if ( is_true( self.is_activated ) ) + { + self notify( "disable_activation" ); + self.finish_anim = undefined; + } + self animcustom( ::director_custom_idle ); + self thread director_delay_melee( 0.6 ); +} +director_delay_melee( time ) +{ + self endon( "death" ); + self.cant_melee = true; + wait( time ); + self.cant_melee = false; +} +director_custom_idle() +{ + self endon( "death" ); + idle_anim = %ai_zombie_boss_idle_b_coast; + self SetFlaggedAnimKnobAllRestart( "idle_anim", idle_anim, %body, 1, .1, 1 ); + wait( 0.5 ); +} +director_leave_map( exit, calm ) +{ + self endon( "death" ); + self.leaving_level = true; + self [[ level.director_exit_level ]]( exit, calm ); + self.leaving_level = undefined; + if ( !is_true( self.defeated ) ) + { + self thread director_reset_light_flag(); + } + self thread director_reenter_map(); +} +director_reenter_map() +{ + r = RandomInt( 100 ); + devgui_timeaway = 0; + if ( devgui_timeaway > 0 ) + { + director_print( "devgui leave for " + devgui_timeaway ); + wait( devgui_timeaway ); + } + else if ( is_true( self.defeated ) || r > 50 ) + { + director_print( "leaving for the round" ); + level waittill( "between_round_over" ); + wait( 1 ); + level waittill( "between_round_over" ); + } + else + { + s = RandomIntRange( 60, 300 ); + director_print( "leaving for " + s + " seconds" ); + wait( s ); + } + self.entering_level = true; + self [[ level.director_reenter_level ]](); + self.performing_activation = false; + self.ground_hit = false; + self.following_player = false; + self.defeated = undefined; + level notify( "audio_begin_director_vox" ); + self thread director_zombie_check_for_buff(); + self thread director_watch_damage(); + self thread director_zombie_update_goal_radius(); + self thread director_zombie_update(); + self.entering_level = undefined; +} +director_reenter_level() +{ +} +director_exit_level() +{ +} +director_find_exit() +{ +} +director_transition( type ) +{ + self endon( "death" ); + if ( !is_true( self.is_traversing ) ) + { + if ( type == "walk" ) + { + self.sprint2walk = true; + director_print( "sprint2walk" ); + } + else if ( type == "sprint" ) + { + self.walk2sprint = true; + director_print( "walk2sprint" ); + } + self notify( "director_run_change" ); + } +} +director_calmed( delay, humangun ) +{ + if ( is_true( self.is_activated ) ) + { + director_print( "director_calmed" ); + self.is_activated = false; + self notify( "director_calmed" ); + if ( !is_true( self.in_water ) ) + { + self thread director_zombie_check_for_activation(); + } + if ( !is_true( humangun ) && !is_true( self.is_traversing ) && !is_true( self.ignore_transition ) ) + { + self director_transition( "walk" ); + } + else + { + self setmodel( "c_zom_george_romero_light_fb" ); + self.director_zombified = undefined; + } + } + if ( isDefined( delay ) ) + { + if ( isDefined( self.delay_time ) ) + { + self.delay_time += delay * 1000; + } + else + { + self.delay_time = GetTime() + delay * 1000; + self thread director_delayed_activation(); + } + } +} +director_delayed_activation() +{ + self endon( "death" ); + self endon( "disable_activation" ); + while ( 1 ) + { + if ( !isDefined( self.delay_time ) ) + { + return; + } + if ( GetTime() >= self.delay_time ) + { + if ( !self.is_activated ) + { + self notify( "hit_player" ); + } + self.delay_time = undefined; + return; + } + wait_network_frame(); + } +} +director_melee_anim( attack_anim ) +{ + self endon( "death" ); + if ( !isDefined( self.is_melee ) ) + { + self.is_melee = true; + time = getAnimLength( attack_anim ); + wait( time ); + self.is_melee = undefined; + } +} +director_set_animarray_standing() +{ + self.a.array["exposed_idle"] = array( %ai_zombie_boss_idle_a_coast, %ai_zombie_boss_idle_b_coast ); + self.a.array["straight_level"] = %ai_zombie_boss_idle_a_coast; + self.a.array["stand_2_crouch"] = %ai_zombie_boss_idle_a_coast; +} +director_melee_miss() +{ + self endon( "death" ); + if ( isDefined( self.enemy ) ) + { + d = Distance( self.origin, self.enemy.origin ); + heightDiff = abs( self.enemy.origin[2] - self.origin[2] ); + if ( d <= self.meleeAttackDist && heightDiff < 96 ) + { + if ( is_true( self.enemy.is_frozen ) ) + { + if ( isDefined( self.enemy.ice_trigger ) ) + { + self.enemy.ice_trigger notify( "damage" ); + } + } + else + { + self.enemy DoDamage( self.meleeDamage, self.origin, self, 0, "MOD_MELEE" ); + } + } + } +} +director_fling( pos ) +{ + self endon( "death" ); + self.is_fling = true; + self animcustom( ::director_custom_fling ); + self.is_fling = undefined; +} +director_custom_fling() +{ + self endon( "death" ); + fling_anim = %ai_zombie_boss_flinger_flail_coast; + self SetFlaggedAnimKnobAllRestart( "fling_anim", fling_anim, %body, 1, .1, 1 ); + animscripts\traverse\zombie_shared::wait_anim_length( fling_anim, .02 ); +} +director_non_attacker( damage, weapon ) +{ + if ( is_true( self.leaving_level ) ) + { + return damage; + } + if ( !is_true( self.is_activated ) ) + { + self notify( "activation_damage", undefined, weapon ); + } + return damage; +} +director_animscripted( director_anim, director_notify, finish_anim ) +{ + if ( !is_true( self.finish_anim ) ) + { + if ( is_true( finish_anim ) ) + { + self.finish_anim = true; + } + self.is_animscripted = true; + time = getAnimLength( director_anim ); + self animscripted( director_notify, self.origin, self.angles, director_anim, "normal", %body, 1, 0.1 ); + wait( time ); + self.is_animscripted = undefined; + self.finish_anim = undefined; + } + else + { + director_print( "animscripted never played" ); + } +} +director_print( str ) +{ +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_ai_dogs.gsc b/BO1/PC/ZM/maps/_zombiemode_ai_dogs.gsc new file mode 100644 index 0000000..de71f27 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_ai_dogs.gsc @@ -0,0 +1,695 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_net; +#include maps\_music; +init() +{ + level.dogs_enabled = true; + level.dog_rounds_enabled = false; + level.dog_round_count = 1; + level.enemy_dog_spawns = []; + level.enemy_dog_locations = []; + flag_init( "dog_round" ); + flag_init( "dog_clips" ); + PreCacheRumble( "explosion_generic" ); + if ( GetDvar( #"zombie_dog_animset" ) == "" ) + { + SetDvar( "zombie_dog_animset", "zombie" ); + } + if ( GetDvar( #"scr_dog_health_walk_multiplier" ) == "" ) + { + SetDvar( "scr_dog_health_walk_multiplier", "4.0" ); + } + if ( GetDvar( #"scr_dog_run_distance" ) == "" ) + { + SetDvar( "scr_dog_run_distance", "500" ); + } + level.melee_range_sav = GetDvar( #"ai_meleeRange" ); + level.melee_height_sav = GetDvar( #"ai_meleeWidth" ); + level.melee_width_sav = GetDvar( #"ai_meleeHeight" ); + SetSavedDvar( "dog_MeleeDamage", "100" ); + set_zombie_var( "dog_fire_trail_percent", 50 ); + level._effect[ "lightning_dog_spawn" ] = Loadfx( "maps/zombie/fx_zombie_dog_lightning_buildup" ); + level._effect[ "dog_eye_glow" ] = Loadfx( "maps/zombie/fx_zombie_dog_eyes" ); + level._effect[ "dog_gib" ] = Loadfx( "maps/zombie/fx_zombie_dog_explosion" ); + level._effect[ "dog_trail_fire" ] = Loadfx( "maps/zombie/fx_zombie_dog_fire_trail" ); + level._effect[ "dog_trail_ash" ] = Loadfx( "maps/zombie/fx_zombie_dog_ash_trail" ); + animscripts\zombie_dog_init::initDogAnimations(); + dog_spawner_init(); + level thread dog_clip_monitor(); +} +enable_dog_rounds() +{ + level.dog_rounds_enabled = true; + if( !isdefined( level.dog_round_track_override ) ) + { + level.dog_round_track_override = ::dog_round_tracker; + } + level thread [[level.dog_round_track_override]](); +} +dog_spawner_init() +{ + dogs = getEntArray( "zombie_dog_spawner", "script_noteworthy" ); + later_dogs = getentarray("later_round_dog_spawners", "script_noteworthy" ); + dogs = array_combine( dogs, later_dogs ); + if( dogs.size == 0 ) + { + return; + } + for( i = 0; i < dogs.size; i++ ) + { + if( maps\_zombiemode_spawner::is_spawner_targeted_by_blocker( dogs[i] ) ) + { + dogs[i].is_enabled = false; + } + else + { + dogs[i].is_enabled = true; + } + } + assert( dogs.size > 0 ); + level.dog_health = 100; + array_thread( dogs, ::add_spawn_function, ::dog_init ); + level.enemy_dog_spawns = getEntArray( "zombie_spawner_dog_init", "targetname" ); +} +dog_round_spawning() +{ + level endon( "intermission" ); + level.dog_targets = getplayers(); + for( i = 0 ; i < level.dog_targets.size; i++ ) + { + level.dog_targets[i].hunted_by = 0; + } + if( level.intermission ) + { + return; + } + level.dog_intermission = true; + level thread dog_round_aftermath(); + players = get_players(); + array_thread( players, ::play_dog_round ); + wait(7); + if( level.dog_round_count < 3 ) + { + max = players.size * 6; + } + else + { + max = players.size * 8; + } + level.zombie_total = max; + dog_health_increase(); + count = 0; + while( count < max ) + { + num_player_valid = get_number_of_valid_players(); + while( get_enemy_count() >= num_player_valid * 2 ) + { + wait( 2 ); + num_player_valid = get_number_of_valid_players(); + } + players = get_players(); + favorite_enemy = get_favorite_enemy(); + if ( IsDefined( level.dog_spawn_func ) ) + { + spawn_loc = [[level.dog_spawn_func]]( level.enemy_dog_spawns, favorite_enemy ); + ai = spawn_zombie( level.enemy_dog_spawns[0] ); + if( IsDefined( ai ) ) + { + ai.favoriteenemy = favorite_enemy; + spawn_loc thread dog_spawn_fx( ai, spawn_loc ); + level.zombie_total--; + count++; + } + } + else + { + spawn_point = dog_spawn_sumpf_logic( level.enemy_dog_spawns, favorite_enemy ); + ai = spawn_zombie( spawn_point ); + if( IsDefined( ai ) ) + { + ai.favoriteenemy = favorite_enemy; + spawn_point thread dog_spawn_fx( ai ); + level.zombie_total--; + count++; + } + } + waiting_for_next_dog_spawn( count, max ); + } +} +waiting_for_next_dog_spawn( count, max ) +{ + default_wait = 1.5; + if( level.dog_round_count == 1) + { + default_wait = 3; + } + else if( level.dog_round_count == 2) + { + default_wait = 2.5; + } + else if( level.dog_round_count == 3) + { + default_wait = 2; + } + else + { + default_wait = 1.5; + } + default_wait = default_wait - ( count / max ); + wait( default_wait ); +} +dog_round_aftermath() +{ + level waittill( "last_dog_down" ); + level thread maps\_zombiemode_audio::change_zombie_music( "dog_end" ); + power_up_origin = level.last_dog_origin; + if( IsDefined( power_up_origin ) ) + { + level thread maps\_zombiemode_powerups::specific_powerup_drop( "full_ammo", power_up_origin ); + } + wait(2); + clientnotify( "dog_stop" ); + wait(6); + level.dog_intermission = false; +} +dog_spawn_fx( ai, ent ) +{ + if ( !IsDefined(ent) ) + { + ent = GetStruct( self.target, "targetname" ); + } + if ( isdefined( ent ) ) + { + Playfx( level._effect["lightning_dog_spawn"], ent.origin ); + playsoundatposition( "zmb_hellhound_prespawn", ent.origin ); + wait( 1.5 ); + playsoundatposition( "zmb_hellhound_bolt", ent.origin ); + Earthquake( 0.5, 0.75, ent.origin, 1000); + PlayRumbleOnPosition("explosion_generic", ent.origin); + playsoundatposition( "zmb_hellhound_spawn", ent.origin ); + angle = VectorToAngles( ai.favoriteenemy.origin - ent.origin ); + angles = ( ai.angles[0], angle[1], ai.angles[2] ); + ai ForceTeleport( ent.origin, angles ); + } + assertex( IsDefined( ai ), "Ent isn't defined." ); + assertex( IsAlive( ai ), "Ent is dead." ); + assertex( ai.isdog, "Ent isn't a dog;" ); + assertex( is_magic_bullet_shield_enabled( ai ), "Ent doesn't have a magic bullet shield." ); + ai zombie_setup_attack_properties_dog(); + ai stop_magic_bullet_shield(); + wait( 0.1 ); + ai show(); + ai.ignoreme = false; + ai notify( "visible" ); +} +dog_spawn_sumpf_logic( dog_array, favorite_enemy) +{ + assertex( dog_array.size > 0, "Dog Spawner array is empty." ); + dog_array = array_randomize( dog_array ); + for( i = 0; i < dog_array.size; i++ ) + { + if( IsDefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_array[i] ) + { + continue; + } + if( DistanceSquared( dog_array[i].origin, favorite_enemy.origin ) > ( 400 * 400 ) && DistanceSquared( dog_array[i].origin, favorite_enemy.origin ) < ( 800 * 800 ) ) + { + if(distanceSquared( ( 0, 0, dog_array[i].origin[2] ), ( 0, 0, favorite_enemy.origin[2] ) ) > 100 * 100 ) + { + continue; + } + else + { + level.old_dog_spawn = dog_array[i]; + return dog_array[i]; + } + } + } + return dog_array[0]; +} +dog_spawn_factory_logic( dog_array, favorite_enemy) +{ + dog_locs = array_randomize( level.enemy_dog_locations ); + for( i = 0; i < dog_locs.size; i++ ) + { + if( IsDefined( level.old_dog_spawn ) && level.old_dog_spawn == dog_locs[i] ) + { + continue; + } + dist_squared = DistanceSquared( dog_locs[i].origin, favorite_enemy.origin ); + if( dist_squared > ( 400 * 400 ) && dist_squared < ( 1000 * 1000 ) ) + { + level.old_dog_spawn = dog_locs[i]; + return dog_locs[i]; + } + } + return dog_locs[0]; +} +get_favorite_enemy() +{ + dog_targets = getplayers(); + least_hunted = dog_targets[0]; + for( i = 0; i < dog_targets.size; i++ ) + { + if ( !IsDefined( dog_targets[i].hunted_by ) ) + { + dog_targets[i].hunted_by = 0; + } + if( !is_player_valid( dog_targets[i] ) ) + { + continue; + } + if( !is_player_valid( least_hunted ) ) + { + least_hunted = dog_targets[i]; + } + if( dog_targets[i].hunted_by < least_hunted.hunted_by ) + { + least_hunted = dog_targets[i]; + } + } + least_hunted.hunted_by += 1; + return least_hunted; +} +dog_health_increase() +{ + players = getplayers(); + if( level.dog_round_count == 1 ) + { + level.dog_health = 400; + } + else if( level.dog_round_count == 2 ) + { + level.dog_health = 900; + } + else if( level.dog_round_count == 3 ) + { + level.dog_health = 1300; + } + else if( level.dog_round_count == 4 ) + { + level.dog_health = 1600; + } + if( level.dog_health > 1600 ) + { + level.dog_health = 1600; + } +} +dog_round_tracker() +{ + level.dog_round_count = 1; + level.next_dog_round = randomintrange( 5, 8 ); + old_spawn_func = level.round_spawn_func; + old_wait_func = level.round_wait_func; + while ( 1 ) + { + level waittill ( "between_round_over" ); + if ( level.round_number == level.next_dog_round ) + { + level.music_round_override = true; + old_spawn_func = level.round_spawn_func; + old_wait_func = level.round_wait_func; + dog_round_start(); + level.round_spawn_func = ::dog_round_spawning; + level.next_dog_round = level.round_number + randomintrange( 4, 6 ); + } + else if ( flag( "dog_round" ) ) + { + dog_round_stop(); + level.round_spawn_func = old_spawn_func; + level.round_wait_func = old_wait_func; + level.music_round_override = false; + level.dog_round_count += 1; + } + } +} +dog_round_start() +{ + flag_set( "dog_round" ); + flag_set( "dog_clips" ); + level thread maps\_zombiemode_audio::change_zombie_music( "dog_start" ); + if(!IsDefined (level.doground_nomusic)) + { + level.doground_nomusic = 0; + } + level.doground_nomusic = 1; + level notify( "dog_round_starting" ); + clientnotify( "dog_start" ); + level.melee_range_sav = 100; + level.melee_height_sav = 0; + level.melee_width_sav = 0; + if(IsDefined(level.dog_melee_range)) + { + SetDvar( "ai_meleeRange", level.dog_melee_range ); + } + else + { + SetDvar( "ai_meleeRange", "100" ); + } + SetDvar( "ai_meleeWidth", "0" ); + SetDvar( "ai_meleeHeight", "0" ); +} +dog_round_stop() +{ + flag_clear( "dog_round" ); + flag_clear( "dog_clips" ); + if(!IsDefined (level.doground_nomusic)) + { + level.doground_nomusic = 0; + } + level.doground_nomusic = 0; + level notify( "dog_round_ending" ); + clientnotify( "dog_stop" ); + SetDvar( "ai_meleeRange", level.melee_range_sav ); + SetDvar( "ai_meleeWidth", level.melee_width_sav ); + SetDvar( "ai_meleeHeight", level.melee_height_sav ); +} +play_dog_round() +{ + self playlocalsound( "zmb_dog_round_start" ); + variation_count =5; + wait (1); + play_sound_2D( "zmb_vox_ann_dogstart" ); + wait(3.5); + players = getplayers(); + num = randomintrange(0,players.size); + players[num] maps\_zombiemode_audio::create_and_play_dialog( "general", "dog_spawn" ); +} +dog_init() +{ + self.targetname = "zombie_dog"; + self.script_noteworthy = undefined; + self.animname = "zombie_dog"; + self.ignoreall = true; + self.ignoreme = true; + self.allowdeath = true; + self.allowpain = false; + self.force_gib = true; + self.is_zombie = true; + self.has_legs = true; + self.gibbed = false; + self.head_gibbed = false; + if ( !isDefined(level.zombietron) ) + { + self.default_goalheight = 40; + } + animscripts\zombie_dog_init::change_anim_set( GetDvar( #"zombie_dog_animset" ) ); + self.grenadeawareness = 0; + self.badplaceawareness = 0; + self.ignoreSuppression = true; + self.suppressionThreshold = 1; + self.noDodgeMove = true; + self.dontShootWhileMoving = true; + self.pathenemylookahead = 0; + self.badplaceawareness = 0; + self.chatInitialized = false; + self setTeamForEntity( "axis" ); + health_multiplier = 1.0; + if ( GetDvar( #"scr_dog_health_walk_multiplier" ) != "" ) + { + health_multiplier = GetDvarFloat( #"scr_dog_health_walk_multiplier" ); + } + self.maxhealth = int( level.dog_health * health_multiplier ); + self.health = int( level.dog_health * health_multiplier ); + self.freezegun_damage = 0; + self.zombie_move_speed = "sprint"; + self thread dog_run_think(); + self thread dog_stalk_audio(); + self thread maps\_zombiemode::round_spawn_failsafe(); + self hide(); + self thread magic_bullet_shield(); + self dog_fx_eye_glow(); + self dog_fx_trail(); + self thread dog_death(); + self.a.disablePain = true; + self disable_react(); + self ClearEnemy(); + self ClearGoalVolume(); + self.flame_damage_time = 0; + self.meleeDamage = 40; + self.thundergun_disintegrate_func = ::dog_thundergun_disintegrate; + self.thundergun_knockdown_func = ::dog_thundergun_knockdown; + self maps\_zombiemode_spawner::zombie_history( "zombie_dog_spawn_init -> Spawned = " + self.origin ); + if ( isDefined(level.achievement_monitor_func) ) + { + self [[level.achievement_monitor_func]](); + } +} +dog_fx_eye_glow() +{ + self.fx_dog_eye = Spawn( "script_model", self GetTagOrigin( "J_EyeBall_LE" ) ); + assert( IsDefined( self.fx_dog_eye ) ); + self.fx_dog_eye.angles = self GetTagAngles( "J_EyeBall_LE" ); + self.fx_dog_eye SetModel( "tag_origin" ); + self.fx_dog_eye LinkTo( self, "J_EyeBall_LE" ); +} +dog_fx_trail() +{ + if( !is_mature() || randomint( 100 ) > level.zombie_vars["dog_fire_trail_percent"] ) + { + self.fx_dog_trail_type = level._effect[ "dog_trail_ash" ]; + self.fx_dog_trail_sound = "zmb_hellhound_loop_breath"; + } + else + { + self.a.nodeath = true; + self.fx_dog_trail_type = level._effect[ "dog_trail_fire" ]; + self.fx_dog_trail_sound = "zmb_hellhound_loop_fire"; + } + self.fx_dog_trail = Spawn( "script_model", self GetTagOrigin( "tag_origin" ) ); + assert( IsDefined( self.fx_dog_trail ) ); + self.fx_dog_trail.angles = self GetTagAngles( "tag_origin" ); + self.fx_dog_trail SetModel( "tag_origin" ); + self.fx_dog_trail LinkTo( self, "tag_origin" ); +} +dog_death() +{ + self waittill( "death" ); + if( get_enemy_count() == 0 && level.zombie_total == 0 ) + { + level.last_dog_origin = self.origin; + level notify( "last_dog_down" ); + } + if( IsPlayer( self.attacker ) ) + { + event = "death"; + if ( issubstr( self.damageweapon, "knife_ballistic_" ) ) + { + event = "ballistic_knife_death"; + } + self.attacker maps\_zombiemode_score::player_add_points( event, self.damagemod, self.damagelocation, true ); + if( RandomIntRange(0,100) >= 80 ) + { + self.attacker maps\_zombiemode_audio::create_and_play_dialog( "kill", "hellhound" ); + } + } + if( isdefined( self.attacker ) && isai( self.attacker ) ) + { + self.attacker notify( "killed", self ); + } + self stoploopsound(); + assert( IsDefined( self.fx_dog_eye ) ); + self.fx_dog_eye delete(); + assert( IsDefined( self.fx_dog_trail ) ); + self.fx_dog_trail delete(); + if ( IsDefined( self.a.nodeath ) ) + { + level thread dog_explode_fx( self.origin ); + self delete(); + } + else + { + self PlaySound( "zmb_hellhound_vocals_death" ); + } +} +dog_explode_fx( origin ) +{ + fx = network_safe_spawn( "dog_death_fx", 2, "script_model", origin ); + assert( IsDefined( fx ) ); + fx SetModel( "tag_origin" ); + PlayFxOnTag( level._effect["dog_gib"], fx, "tag_origin" ); + fx playsound( "zmb_hellhound_explode" ); + wait( 5 ); + fx delete(); +} +zombie_setup_attack_properties_dog() +{ + self maps\_zombiemode_spawner::zombie_history( "zombie_setup_attack_properties()" ); + self thread dog_behind_audio(); + self.ignoreall = false; + self.pathEnemyFightDist = 64; + self.meleeAttackDist = 64; + self.disableArrivals = true; + self.disableExits = true; +} +stop_dog_sound_on_death() +{ + self waittill("death"); + self stopsounds(); +} +dog_behind_audio() +{ + self thread stop_dog_sound_on_death(); + self endon("death"); + self waittill_any( "dog_running", "dog_combat" ); + self PlaySound( "zmb_hellhound_vocals_close", "sounddone" ); + self waittill( "sounddone" ); + while(1) + { + players = get_players(); + for(i=0;i 90) && distance2d(self.origin,players[i].origin) > 100) + { + self playsound( "zmb_hellhound_vocals_close", "sounddone" ); + self waittill( "sounddone" ); + } + } + } + wait(.75); + } +} +dog_clip_monitor() +{ + clips_on = false; + level.dog_clips = GetEntArray( "dog_clips", "targetname" ); + while (1) + { + for ( i=0; i= 9 ) + { + return false; + } + if ( !IsDefined(num_to_spawn) ) + { + num_to_spawn = 1; + } + spawn_point = undefined; + count = 0; + while ( count < num_to_spawn ) + { + players = get_players(); + favorite_enemy = get_favorite_enemy(); + if ( IsDefined( spawners ) ) + { + spawn_point = spawners[ RandomInt(spawners.size) ]; + ai = spawn_zombie( spawn_point ); + if( IsDefined( ai ) ) + { + ai.favoriteenemy = favorite_enemy; + spawn_point thread dog_spawn_fx( ai ); + count++; + flag_set( "dog_clips" ); + } + } + else + { + if ( IsDefined( level.dog_spawn_func ) ) + { + spawn_loc = [[level.dog_spawn_func]]( level.enemy_dog_spawns, favorite_enemy ); + ai = spawn_zombie( level.enemy_dog_spawns[0] ); + if( IsDefined( ai ) ) + { + ai.favoriteenemy = favorite_enemy; + spawn_loc thread dog_spawn_fx( ai, spawn_loc ); + count++; + flag_set( "dog_clips" ); + } + } + else + { + spawn_point = dog_spawn_factory_logic( level.enemy_dog_spawns, favorite_enemy ); + ai = spawn_zombie( spawn_point ); + if( IsDefined( ai ) ) + { + ai.favoriteenemy = favorite_enemy; + spawn_point thread dog_spawn_fx( ai ); + count++; + flag_set( "dog_clips" ); + } + } + } + waiting_for_next_dog_spawn( count, num_to_spawn ); + } + return true; +} +dog_run_think() +{ + self endon( "death" ); + self waittill( "visible" ); + if ( self.health > level.dog_health ) + { + self.maxhealth = level.dog_health; + self.health = level.dog_health; + } + assert( IsDefined( self.fx_dog_eye ) ); + network_safe_play_fx_on_tag( "dog_fx", 2, level._effect["dog_eye_glow"], self.fx_dog_eye, "tag_origin" ); + assert( IsDefined( self.fx_dog_trail ) ); + network_safe_play_fx_on_tag( "dog_fx", 2, self.fx_dog_trail_type, self.fx_dog_trail, "tag_origin" ); + self playloopsound( self.fx_dog_trail_sound ); +} +dog_stalk_audio() +{ + self endon( "death" ); + self endon( "dog_running" ); + self endon( "dog_combat" ); + while(1) + { + self playsound( "zmb_hellhound_vocals_amb", "stalk_vox_done" ); + self waittill( "stalk_vox_done" ); + wait randomfloatrange(1,4); + } +} +dog_thundergun_disintegrate( player ) +{ + self endon( "death" ); + self DoDamage( self.health + 666, player.origin, player ); +} +dog_thundergun_knockdown( player, gib ) +{ + self endon( "death" ); + damage = int( self.maxhealth * 0.5 ); + self DoDamage( damage, player.origin, player ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_ai_faller.gsc b/BO1/PC/ZM/maps/_zombiemode_ai_faller.gsc new file mode 100644 index 0000000..5bf98d7 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_ai_faller.gsc @@ -0,0 +1,649 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#using_animtree("generic_human"); +faller_init() +{ + level._zombie_fall_anims["zombie"] = []; + level._zombie_fall_anims["zombie"]["default"] = %ai_zombie_jump_down_72; + level._zombie_fall_anims["zombie"]["emerge"] = %ai_zombie_ceiling_emerge_01; + level._zombie_fall_anims["zombie"]["fall"] = %ai_zombie_ceiling_dropdown_01; + level._zombie_fall_anims["zombie"]["fall_loop"] = %ai_zombie_ceiling_fall_loop; + level._zombie_fall_anims["zombie"]["land"][0] = %ai_zombie_ceiling_fall_land; + level._zombie_fall_anims["zombie"]["land"][1] = %ai_zombie_ceiling_fall_land_02; + level._zombie_fall_anims["zombie"]["attack"][0] = %ai_zombie_ceiling_attack_01; + level._zombie_fall_anims["zombie"]["attack"][1] = %ai_zombie_ceiling_attack_02; + level._zombie_fall_anims["zombie"]["emerge_death"] = %ai_zombie_ceiling_death; + level.zombie_custom_think_logic = ::check_do_zombie_fall; + level thread setup_faller_locations(); +} +setup_faller_locations() +{ + flag_wait("zones_initialized"); + zkeys = GetArrayKeys(level.zones); + for ( i = 0; i < level.zones.size; i++ ) + { + zone = level.zones[ zkeys[i] ]; + if ( IsDefined( zone.volumes[0].target ) ) + { + zone.fall_locations = GetStructArray(zone.volumes[0].target + "_fall", "targetname"); + for ( x = 0; x < zone.fall_locations.size; x++ ) + { + zone.fall_locations[x].is_enabled = true; + } + } + } +} +get_available_fall_locations() +{ + level.zombie_fall_spawners = []; + zone = level.zones[ self.zone_name ]; + if ( IsDefined( zone ) ) + { + for(x=0; x 0 ) + { + for ( i = 0; i < parms.size; i++ ) + { + if ( parms[i] == "drop_now" ) + { + self.drop_now = true; + } + if ( parms[i] == "drop_not_occupied" ) + { + self.drop_not_occupied = true; + } + } + } + } +} +setup_deathfunc() +{ + self endon( "death" ); + while ( !is_true( self.zombie_init_done ) ) + { + wait_network_frame(); + } + self.deathFunction = ::zombie_fall_death_func; +} +do_zombie_fall() +{ + self endon("death"); + self thread setup_deathfunc(); + self.no_powerups = true; + self.in_the_ceiling = true; + self.anchor = spawn("script_origin", self.origin); + self.anchor.angles = self.angles; + self linkto(self.anchor); + if ( !IsDefined( self.zone_name ) ) + { + self.zone_name = self get_current_zone(); + } + spots = get_available_fall_locations(); + if( spots.size < 1 ) + { + self unlink(); + self.anchor delete(); + self Hide(); + self delayThread( 0.1, ::zombie_faller_delete ); + return; + } + else if ( GetDvarInt(#"zombie_fall_test") ) + { + player = GetPlayers()[0]; + spot = undefined; + bestDist = 0.0; + for ( i = 0; i < spots.size; i++ ) + { + checkDist = DistanceSquared(spots[i].origin, player.origin); + if ( !IsDefined(spot) || checkDist < bestDist ) + { + spot = spots[i]; + bestDist = checkDist; + } + } + } + else + { + spot = random(spots); + } + self.zombie_faller_location = spot; + self.zombie_faller_location.is_enabled = false; + self.zombie_faller_location parse_script_parameters(); + if( !isDefined( spot.angles ) ) + { + spot.angles = (0, 0, 0); + } + anim_org = spot.origin; + anim_ang = spot.angles; + self Hide(); + self.anchor moveto(anim_org, .05); + self.anchor waittill("movedone"); + target_org = maps\_zombiemode_spawner::get_desired_origin(); + if (IsDefined(target_org)) + { + anim_ang = VectorToAngles(target_org - self.origin); + self.anchor RotateTo((0, anim_ang[1], 0), .05); + self.anchor waittill("rotatedone"); + } + self unlink(); + self.anchor delete(); + self thread hide_pop(); + level thread zombie_fall_death(self, spot); + spot thread zombie_fall_fx(self); + self thread zombie_faller_death_wait(); + self thread zombie_faller_do_fall(); +} +zombie_faller_do_fall() +{ + self endon("death"); + emerge_anim = self get_fall_emerge_anim(); + self AnimScripted("fall_emerge", self.origin, self.zombie_faller_location.angles, emerge_anim); + self animscripts\zombie_shared::DoNoteTracks("fall_emerge", ::handle_fall_notetracks, undefined, self.zombie_faller_location); + self.zombie_faller_wait_start = GetTime(); + self.zombie_faller_should_drop = false; + self thread zombie_fall_wait(); + self thread zombie_faller_watch_all_players(); + while ( !self.zombie_faller_should_drop ) + { + if ( self zombie_fall_should_attack(self.zombie_faller_location) ) + { + attack_anim = self get_attack_anim(self.zombie_faller_location); + self AnimScripted("attack", self.origin, self.zombie_faller_location.angles, attack_anim); + self animscripts\zombie_shared::DoNoteTracks("attack", ::handle_fall_notetracks, undefined, self.zombie_faller_location); + if ( !(self zombie_faller_always_drop()) && randomfloat(1) > 0.5 ) + { + self.zombie_faller_should_drop = true; + } + } + else + { + if ( (self zombie_faller_always_drop()) ) + { + self.zombie_faller_should_drop = true; + break; + } + else if ( GetTime() >= self.zombie_faller_wait_start + 20000 ) + { + self.zombie_faller_should_drop = true; + break; + } + else if ( self zombie_faller_drop_not_occupied() ) + { + self.zombie_faller_should_drop = true; + break; + } + else + { + attack_anim = self get_attack_anim(self.zombie_faller_location); + self AnimScripted("attack", self.origin, self.zombie_faller_location.angles, attack_anim); + self animscripts\zombie_shared::DoNoteTracks("attack", ::handle_fall_notetracks, undefined, self.zombie_faller_location); + } + } + } + self notify("falling"); + spot = self.zombie_faller_location; + self zombie_faller_enable_location(); + fall_anim = self get_fall_anim(spot); + self AnimScripted("fall", self.origin, spot.angles, fall_anim); + self animscripts\zombie_shared::DoNoteTracks("fall", ::handle_fall_notetracks, undefined, spot); + self.deathFunction = maps\_zombiemode_spawner::zombie_death_animscript; + self notify("fall_anim_finished"); + spot notify("stop_zombie_fall_fx"); + self StopAnimScripted(); + landAnim = random(level._zombie_fall_anims["zombie"]["land"]); + landAnimDelta = 15; + ground_pos = groundpos_ignore_water_new( self.origin ); + physDist = self.origin[2] - ground_pos[2] + landAnimDelta; + if ( physDist > 0 ) + { + fallAnim = level._zombie_fall_anims["zombie"]["fall_loop"]; + if ( IsDefined( fallAnim ) ) + { + self.fall_anim = fallAnim; + self animcustom(::zombie_fall_loop); + self waittill("faller_on_ground"); + } + self.landAnim = landAnim; + self animcustom(::zombie_land); + wait( GetAnimLength( landAnim ) ); + } + self.in_the_ceiling = false; + self traverseMode( "gravity" ); + self SetAnimKnobAllRestart( animscripts\zombie_run::GetRunAnim(), %body, 1, 0.2, 1 ); + self.no_powerups = false; + self notify("zombie_custom_think_done", spot.script_noteworthy ); +} +zombie_fall_loop() +{ + self endon("death"); + self setFlaggedAnimKnobRestart( "fall_loop", self.fall_anim, 1, 0.20, 1.0 ); + while(1) + { + ground_pos = groundpos_ignore_water_new( self.origin ); + if( self.origin[2] - ground_pos[2] < 20) + { + self notify("faller_on_ground"); + break; + } + wait .05; + } +} +zombie_land() +{ + self setFlaggedAnimKnobRestart( "land", self.landAnim, 1, 0.20, 1.0 ); + wait( GetAnimLength( self.landAnim ) ); +} +zombie_faller_always_drop() +{ + if ( IsDefined(self.zombie_faller_location.drop_now) ) + { + if ( self.zombie_faller_location.drop_now == true ) + { + return true; + } + } + return false; +} +zombie_faller_drop_not_occupied() +{ + if ( is_true(self.zombie_faller_location.drop_not_occupied) ) + { + if( isDefined(self.zone_name) && isDefined(level.zones[ self.zone_name ]) ) + { + return !level.zones[ self.zone_name ].is_occupied; + } + } + return false; +} +zombie_faller_watch_all_players() +{ + players = get_players(); + for(i=0; i 0; +} +zombie_fall_get_vicitims(spot) +{ + ret = []; + players = GetPlayers(); + checkDist2 = 40.0; + checkDist2 *= checkDist2; + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + if ( player maps\_laststand::player_is_in_laststand() ) + { + continue; + } + stance = player GetStance(); + if ( stance == "crouch" || stance == "prone" ) + { + continue; + } + zCheck = self.origin[2] - player.origin[2]; + if ( zCheck < 0.0 || zCheck > 120.0 ) + { + continue; + } + dist2 = Distance2DSquared(player.origin, self.origin); + if ( dist2 < checkDist2 ) + { + ret[ret.size] = player; + } + } + return ret; +} +get_fall_emerge_anim(spot) +{ + return level._zombie_fall_anims[self.animname]["emerge"]; +} +get_fall_anim(spot) +{ + return level._zombie_fall_anims[self.animname]["fall"]; +} +get_attack_anim(spot) +{ + return random(level._zombie_fall_anims[self.animname]["attack"]); +} +zombie_faller_enable_location() +{ + if ( IsDefined( self.zombie_faller_location ) ) + { + self.zombie_faller_location.is_enabled = true; + self.zombie_faller_location = undefined; + } +} +zombie_faller_death_wait() +{ + self waittill( "death" ); + self endon( "falling" ); + self zombie_faller_enable_location(); +} +zombie_fall_death_func() +{ + self animmode( "noclip" ); + self.deathanim = level._zombie_fall_anims["zombie"]["emerge_death"]; + return self maps\_zombiemode_spawner::zombie_death_animscript(); +} +zombie_fall_death(zombie, spot) +{ + zombie endon("fall_anim_finished"); + while (zombie.health > 1) + { + zombie waittill("damage", amount, attacker, dir, p, type); + } + zombie StopAnimScripted(); + spot notify("stop_zombie_fall_fx"); +} +_damage_mod_to_damage_type(type) +{ + toks = strtok(type, "_"); + if(toks.size<2) + { + return type; + } + returnStr = toks[1]; + for(i=2;i= level.monkey_pack_max ) + { + break; + } + time = RandomFloatRange( 3.2, 4.4 ); + wait( time ); + wait_network_frame(); + } +} +monkey_setup_packs() +{ + level.monkey_packs_killed = 0; + players = getplayers(); + if ( players.size > level.monkey_encounters ) + { + level.monkey_pack_max = players.size + level.monkey_encounters; + } + else + { + level.monkey_pack_max = players.size * 2; + } + level.monkey_encounters++; +} +monkey_setup_health() +{ + switch( level.monkey_encounters ) + { + case 1: + level.monkey_zombie_health = level.zombie_health * 0.25; + break; + case 2: + level.monkey_zombie_health = level.zombie_health * 0.5; + break; + case 3: + level.monkey_zombie_health = level.zombie_health * 0.75; + break; + default: + level.monkey_zombie_health = level.zombie_health; + break; + } + if ( level.zombie_health > 1600 ) + { + level.zombie_health = 1600; + } + monkey_print( "monkey health = " + level.monkey_zombie_health ); +} +monkey_setup_spawners() +{ + level.current_monkey_spawners = []; + for ( i = 0; i < level.monkey_zombie_spawners.size; i++ ) + { + if ( level.zones[ level.monkey_zombie_spawners[i].script_noteworthy ].is_enabled ) + { + level.current_monkey_spawners[ level.current_monkey_spawners.size ] = level.monkey_zombie_spawners[i]; + } + } + level.current_monkey_spawners = array_randomize( level.current_monkey_spawners ); + level.monkey_spawner_idx = 0; +} +monkey_get_next_spawner() +{ + spawner = level.current_monkey_spawners[ level.monkey_spawner_idx ]; + assertex( isdefined( spawner ), "no monkey spawner found" ); + if ( isdefined( spawner ) ) + { + level.monkey_spawner_idx++; + if ( level.monkey_spawner_idx == level.current_monkey_spawners.size ) + { + level monkey_setup_spawners(); + } + } + return spawner; +} +monkey_get_available_spawners() +{ + spawners = []; + for ( i = 0; i < level.monkey_zombie_spawners.size; i++ ) + { + if ( level.zones[ level.monkey_zombie_spawners[i].script_noteworthy ].is_enabled ) + { + spawners[ spawners.size ] = level.monkey_zombie_spawners[i]; + } + } + spawners = array_randomize( spawners ); + return spawners; +} +monkey_pack_man_setup_perks() +{ + level.monkey_perks = []; + vending_triggers = getentarray( "zombie_vending", "targetname" ); + for ( i = 0; i < vending_triggers.size; i++ ) + { + if ( vending_triggers[i].targeted ) + { + continue; + } + players = getplayers(); + for ( j = 0; j < players.size; j++ ) + { + perk = vending_triggers[i].script_noteworthy; + org = vending_triggers[i].origin; + if ( isdefined( vending_triggers[i].realorigin ) ) + { + org = vending_triggers[i].realorigin; + } + zone_enabled = check_point_in_active_zone( org ); + if ( players[j] HasPerk( perk ) && zone_enabled ) + { + level.monkey_perks[ level.monkey_perks.size ] = vending_triggers[i]; + break; + } + } + } + if ( level.monkey_perks.size > 1 ) + { + level.monkey_perks = array_randomize( level.monkey_perks ); + } + level.monkey_perk_idx = 0; +} +monkey_pack_man_get_next_perk() +{ + if ( level.monkey_perks.size == 0 ) + { + self.perk = undefined; + return; + } + perk = level.monkey_perks[ level.monkey_perk_idx ]; + perk.targeted = 1; + level.monkey_perk_idx++; + if ( level.monkey_perk_idx == level.monkey_perks.size ) + { + level monkey_pack_man_setup_perks(); + } + self.perk = perk; +} +monkey_pack_spawn() +{ + monkey_print( "spawning pack" ); + pack = SpawnStruct(); + pack.monkeys = []; + pack.attack = []; + pack.target = undefined; + level.monkey_pack[ level.monkey_pack.size ] = pack; + pack thread monkey_pack_think(); +} +monkey_pack_think() +{ + self.ground_hit_time = GetTime(); + self monkey_pack_man_get_next_perk(); + self monkey_pack_set_machine(); + self monkey_pack_choose_enemy(); + self.spawning_done = false; + for ( i = 0; i < level.monkeys_per_pack; i++ ) + { + spawner = monkey_get_next_spawner(); + if ( isdefined( spawner ) ) + { + monkey = spawner monkey_zombie_spawn( self ); + self.monkeys[ self.monkeys.size ] = monkey; + } + if ( i < (level.monkeys_per_pack-1) ) + { + time = RandomFloatRange( 2.2, 4.4 ); + wait( time ); + } + } + self.spawning_done = true; + self thread monkey_pack_update_enemy(); + self thread monkey_pack_update_perk(); +} +monkey_pack_update_perk() +{ + while ( 1 ) + { + if ( !isdefined( self.perk ) ) + { + break; + } + if ( self.machine.monkey_health == 0 ) + { + monkey_print( "pack destroyed " + self.machine.targetname ); + self monkey_pack_take_perk(); + wait_network_frame(); + self monkey_pack_clear_perk_pos(); + self monkey_pack_man_get_next_perk(); + self monkey_pack_set_machine(); + for ( i = 0; i < self.monkeys.size; i++ ) + { + if ( !self.monkeys[i].charge_player ) + { + self.monkeys[i].perk = self.perk; + self.monkeys[i] notify( "stop_perk_attack" ); + } + } + } + wait_network_frame(); + } +} +monkey_pack_next_perk() +{ + perk = undefined; + perk_idx = -1; + num_perks = 0; + keys = getarraykeys( level.monkey_perks ); + for ( i = 0; i < keys.size; i++ ) + { + if ( level.monkey_perks[ keys[i] ] > num_perks ) + { + num_perks = level.monkey_perks[ keys[i] ]; + perk_idx = i; + } + } + if ( perk_idx >= 0 ) + { + perk = keys[ perk_idx ]; + } + if ( isdefined( perk ) ) + { + monkey_print( "perk is " + perk ); + } + else + { + monkey_print( "no more perks" ); + } + self.perk = perk; +} +monkey_pack_set_machine() +{ + self.machine = undefined; + if ( !isdefined( self.perk ) ) + { + return; + } + targets = getentarray( self.perk.target, "targetname" ); + for ( j = 0; j < targets.size; j++ ) + { + if ( targets[j].classname == "script_model" ) + { + self.machine = targets[j]; + } + } +} +monkey_pack_choose_enemy() +{ + monkey_enemy = []; + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( !is_player_valid( players[i] ) ) + { + continue; + } + monkey_enemy[ monkey_enemy.size ] = players[i]; + } + monkey_enemy = array_randomize( monkey_enemy ); + if ( monkey_enemy.size > 0 ) + { + self.enemy = monkey_enemy[0]; + } + else + { + self.enemy = players[0]; + } +} +monkey_pack_update_enemy() +{ + while ( self.monkeys.size > 0 ) + { + players = getplayers(); + total_dist = 1000000; + player_idx = 0; + for ( i = 0; i < players.size; i++ ) + { + if ( !is_player_valid( players[i] ) ) + { + continue; + } + dist = 0; + for ( j = 0; j < self.monkeys.size; j++ ) + { + if ( !isdefined( self.monkeys[j] ) ) + { + continue; + } + dist += Distance( players[i].origin, self.monkeys[j].origin ); + } + if ( dist < total_dist ) + { + total_dist = dist; + player_idx = i; + } + } + if ( isdefined( players ) ) + { + if ( isdefined( self.enemy ) ) + { + if ( self.enemy != players[ player_idx ] ) + { + monkey_print( "pack enemy is " + self.enemy.playername ); + } + } + else + { + monkey_print( "pack enemy is " + players[ player_idx ].playername ); + } + self.enemy = players[ player_idx ]; + } + wait( 0.2 ); + } +} +monkey_zombie_check_ground_hit() +{ + if ( GetTime() >= self.ground_hit_time ) + { + return true; + } + return false; +} +monkey_pack_update_ground_hit( hitter ) +{ + self.ground_hit_time = GetTime() + level.ground_hit_delay; + level.ground_hit_delay = RandomFloatRange( 4.5, 6.5 ) * 1000; + for ( i = 0; i < self.monkeys.size; i++ ) + { + if ( isDefined( self.monkeys[i] ) ) + { + self.monkeys[i].ground_hit_time = self.ground_hit_time; + } + } + groundpound_reset = level.monkey_zombie_groundhit_trigger_radius * 2; + groundpound_reset_sq = groundpound_reset * groundpound_reset; + for ( i = 0; i < level.monkey_pack.size; i++ ) + { + pack = level.monkey_pack[i]; + if ( self == pack ) + { + continue; + } + for ( j = 0; j < pack.monkeys.size; j++ ) + { + monkey = pack.monkeys[j]; + if ( !isDefined( monkey ) ) + { + continue; + } + if ( hitter == monkey ) + { + continue; + } + dist_sq = DistanceSquared( hitter.origin, monkey.origin ); + if ( dist_sq <= groundpound_reset_sq ) + { + monkey.ground_hit_time = self.ground_hit_time; + } + } + } + monkey_print( "next ground hit in " + level.ground_hit_delay ); +} +monkey_round_wait() +{ + wait( 1 ); + if ( flag( "monkey_round" ) ) + { + wait( 7 ); + while ( level.monkey_intermission ) + { + wait( 0.5 ); + } + } +} +monkey_round_aftermath() +{ + flag_wait( "last_monkey_down" ); + level thread maps\_zombiemode_audio::change_zombie_music( "dog_end" ); + level.round_spawn_func = level.monkey_save_spawn_func; + level.round_wait_func = level.monkey_save_wait_func; + wait( 6 ); + level.monkey_intermission = false; +} +monkey_round_tracker() +{ + flag_wait( "power_on" ); + flag_wait( "perk_bought" ); + level.monkey_save_spawn_func = level.round_spawn_func; + level.monkey_save_wait_func = level.round_wait_func; + level.next_monkey_round = level.round_number + randomintrange( 1, 4 ); + level.prev_monkey_round = level.next_monkey_round; + while ( 1 ) + { + level waittill( "between_round_over" ); + if ( level.round_number == level.next_monkey_round ) + { + if ( !monkey_player_has_perk() ) + { + level.next_monkey_round++; + monkey_print( "next monkey round at " + level.next_monkey_round ); + continue; + } + level.music_round_override = true; + level.monkey_save_spawn_func = level.round_spawn_func; + level.monkey_save_wait_func = level.round_wait_func; + monkey_round_start(); + level.round_spawn_func = ::monkey_round_spawning; + level.round_wait_func = ::monkey_round_wait; + level.prev_monkey_round = level.next_monkey_round; + level.next_monkey_round = level.round_number + randomintrange( 4, 6 ); + monkey_print( "next monkey round at " + level.next_monkey_round ); + } + else if ( flag( "monkey_round" ) ) + { + monkey_round_stop(); + level.music_round_override = false; + } + } +} +monkey_round_start() +{ + flag_set( "monkey_round" ); + flag_set( "monkey_free_perk" ); + if ( isDefined( level.monkey_round_start ) ) + { + level thread [[ level.monkey_round_start ]](); + } + level thread monkey_zombie_setup_perks(); + level monkey_setup_health(); + level monkey_setup_spawners(); + level monkey_setup_packs(); + level monkey_pack_man_setup_perks(); + level thread monkey_grenade_watcher(); + clientnotify( "monkey_start" ); + level thread play_delayed_player_vox(); +} +play_delayed_player_vox() +{ + wait(8); + players = getplayers(); + players[RandomIntRange(0,players.size)] maps\_zombiemode_audio::create_and_play_dialog( "general", "monkey_spawn" ); +} +monkey_round_stop() +{ + flag_clear( "monkey_round" ); + flag_clear( "last_monkey_down" ); + if ( isDefined( level.monkey_round_stop ) ) + { + level thread [[ level.monkey_round_stop ]](); + } + clientnotify( "monkey_stop" ); + level notify( "grenade_watcher_stop" ); +} +monkey_player_has_perk() +{ + vending_triggers = getentarray( "zombie_vending", "targetname" ); + for ( i = 0; i < vending_triggers.size; i++ ) + { + players = getplayers(); + for ( j = 0; j < players.size; j++ ) + { + perk = vending_triggers[i].script_noteworthy; + org = vending_triggers[i].origin; + if ( isdefined( vending_triggers[i].realorigin ) ) + { + org = vending_triggers[i].realorigin; + } + zone_enabled = check_point_in_active_zone( org ); + if ( players[j] HasPerk( perk ) && zone_enabled ) + { + return true; + } + } + } + return false; +} +monkey_zombie_manager() +{ + while( true ) + { + AssertEx( isDefined( level.num_monkey_zombies ) && isDefined( level.max_monkey_zombies ), "Either max_monkey_zombies or num_monkey_zombies not defined, this should never be the case!" ); + while( level.num_monkey_zombies < level.max_monkey_zombies ) + { + spawner = monkey_zombie_pick_best_spawner(); + if( isDefined( spawner ) ) + { + spawner monkey_zombie_spawn(); + } + wait( 10 ); + } + wait( 10 ); + } +} +monkey_zombie_pick_best_spawner() +{ + best_spawner = undefined; + best_score = -1; + for( i = 0; i < level.monkey_zombie_spawners.size; i++ ) + { + score = [[ level.monkey_zombie_spawn_heuristic ]]( level.monkey_zombie_spawners[i] ); + if( score > best_score ) + { + best_spawner = level.monkey_zombie_spawners[i]; + best_score = score; + } + } + return best_spawner; +} +monkey_zombie_choose_run() +{ + self endon( "death" ); + rand = randomIntRange( 1, 3 ); + self set_run_anim( "run"+rand ); + self.run_combatanim = level.scr_anim["monkey_zombie"]["run"+rand]; + self.crouchRunAnim = level.scr_anim["monkey_zombie"]["run"+rand]; + self.crouchrun_combatanim = level.scr_anim["monkey_zombie"]["run"+rand]; + self.zombie_move_speed = "run"; + self waittill( "speed_up" ); + rand = randomIntRange( 1, 5 ); + self set_run_anim( "sprint"+rand ); + self.run_combatanim = level.scr_anim["monkey_zombie"]["sprint"+rand]; + self.crouchRunAnim = level.scr_anim["monkey_zombie"]["sprint"+rand]; + self.crouchrun_combatanim = level.scr_anim["monkey_zombie"]["sprint"+rand]; + self.zombie_move_speed = "sprint"; +} +monkey_zombie_think() +{ + self endon( "death" ); + self thread play_random_monkey_vox(); + self.goalradius = 32; + self.pathEnemyFightDist = 64; + self.meleeAttackDist = 64; + self.charge_player = false; + level.monkey_zombie_min_health = int( level.monkey_zombie_health ); + if( self.maxhealth < level.monkey_zombie_min_health ) + { + self.maxhealth = level.monkey_zombie_min_health; + self.health = level.monkey_zombie_min_health; + } + if ( isdefined( level.user_ryan_monkey_health ) ) + { + self.maxhealth = 1; + self.health = 1; + } + self thread monkey_zombie_choose_run(); + self.maxsightdistsqrd = 96 * 96; + self [[ level.monkey_zombie_enter_level ]](); + if ( isDefined( level.monkey_zombie_custom_think ) ) + { + self thread [[ level.monkey_zombie_custom_think ]](); + } + self thread monkey_zombie_ground_hit_think(); + self thread monkey_zombie_grenade_watcher(); + self thread monkey_zombie_bhb_watcher(); + self thread monkey_zombie_speed_watcher(); + self thread monkey_zombie_fling_watcher(); + self thread monkey_zombie_update(); + if ( isDefined( level.monkey_zombie_failsafe ) ) + { + self thread [[ level.monkey_zombie_failsafe ]](); + } +} +monkey_zombie_debug() +{ + self endon( "death" ); + while( true ) + { + forward = VectorNormalize( AnglesToForward( self.angles ) ); + end_pos = self.origin - vector_scale( forward, 120 ); + recordLine( self.origin, end_pos, (.5,1,0), "Script", self ); + wait_network_frame(); + } +} +monkey_zombie_update() +{ + self endon( "death" ); + self endon( "monkey_update_stop" ); + self animmode( "none" ); + while( true ) + { + if ( isDefined( self.custom_think ) && self.custom_think ) + { + wait_network_frame(); + continue; + } + else if ( self.state == "bhb_response" || self.state == "grenade_response" ) + { + wait_network_frame(); + continue; + } + else if ( isDefined( self.perk ) ) + { + self thread monkey_zombie_destroy_perk(); + self waittill( "stop_perk_attack" ); + wait_network_frame(); + continue; + } + else if ( isDefined( self.ground_hit ) && self.ground_hit ) + { + wait_network_frame(); + continue; + } + else if( !isDefined( self.following_player ) || !self.following_player ) + { + self thread maps\_zombiemode_ai_monkey::monkey_find_flesh(); + self.following_player = true; + self monkey_zombie_set_state( "charge_player" ); + } + wait( 1 ); + } +} +monkey_zombie_get_perk_pos() +{ + points = getstructarray( self.pack.machine.target, "targetname" ); + for ( i = 0; i < points.size; i++ ) + { + if ( isdefined( self.pack.attack[i] ) ) + { + continue; + } + self.pack.attack[i] = self; + self.attack = points[i]; + break; + } +} +monkey_pack_clear_perk_pos() +{ + self.attack = []; +} +monkey_zombie_health_watcher() +{ + self endon( "death" ); + health_limit = self.health * 0.75; + while ( 1 ) + { + if ( self.health <= health_limit ) + { + self StopAnimScripted(); + wait_network_frame(); + self notify( "stop_perk_attack" ); + self monkey_zombie_set_state( "charge_player" ); + self.charge_player = true; + self.perk = undefined; + break; + } + wait_network_frame(); + } +} +monkey_zombie_fling_watcher() +{ + self endon( "death" ); + half_health = level.monkey_zombie_health * 0.5; + while ( 1 ) + { + if ( self.health <= half_health ) + { + self.thundergun_fling_func = undefined; + break; + } + wait_network_frame(); + } +} +monkey_zombie_speed_watcher() +{ + self endon( "death" ); + while ( 1 ) + { + if ( self.health < self.maxhealth ) + { + break; + } + wait_network_frame(); + } + self notify( "speed_up" ); +} +monkey_grenade_watcher() +{ + self endon( "death" ); + level.monkey_grenades = []; + level.monkey_bhbs = []; + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] thread monkey_grenade_watch(); + } +} +monkey_grenade_watch() +{ + self endon( "death" ); + level endon( "grenade_watcher_stop" ); + while ( true ) + { + self waittill( "grenade_fire", grenade, weapName ); + if ( is_lethal_grenade( weapName ) ) + { + grenade thread monkey_grenade_wait(); + grenade.thrower = self; + level.monkey_grenades[ level.monkey_grenades.size ] = grenade; + } + if ( weapName == "zombie_black_hole_bomb" ) + { + grenade thread monkey_bhb_wait(); + level.monkey_bhbs[ level.monkey_bhbs.size ] = grenade; + } + monkey_print( "thrown from " + weapName ); + } +} +monkey_grenade_wait() +{ + self waittill( "death" ); + level.monkey_grenades = array_remove( level.monkey_grenades, self ); + monkey_print( "remove grenade from level" ); +} +monkey_bhb_wait() +{ + self waittill( "death" ); + level.monkey_bhbs = array_remove( level.monkey_bhbs, self ); + monkey_print( "remove bhb from level" ); +} +monkey_zombie_grenade_throw_watcher( target, animname ) +{ + self endon( "death" ); + self waittillmatch( animname, "grenade_throw" ); + throw_angle = RandomIntRange( 20, 30 ); + dir = VectorToAngles( target.origin - self.origin ); + dir = ( dir[0] - throw_angle, dir[1], dir[2] ); + dir = AnglesToForward( dir ); + velocity = dir * 550; + fuse = RandomFloatRange( 1, 2 ); + hand_pos = self GetTagOrigin( "TAG_WEAPON_RIGHT" ); + grenade_type = target get_player_lethal_grenade(); + self MagicGrenadeType( grenade_type, hand_pos, velocity, fuse ); +} +monkey_zombie_grenade_throw( target ) +{ + self endon( "death" ); + throw_anim = []; + forward = VectorNormalize( AnglesToForward( self.angles ) ); + end_pos = self.origin + vector_scale( forward, 96 ); + if ( BulletTracePassed( self.origin, end_pos, false, undefined ) ) + { + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_run_01; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_run_02; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_run_03; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_run_04; + } + else + { + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_still_01; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_still_02; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_still_03; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_still_04; + } + throw_back_anim = throw_anim[ RandomInt( throw_anim.size ) ]; + self animscripted( "throw_back_anim", self.origin, self.angles, throw_back_anim ); + self thread monkey_zombie_grenade_throw_watcher( target, "throw_back_anim" ); + animscripts\traverse\zombie_shared::wait_anim_length( throw_back_anim, .02 ); + choose = RandomInt( level._zombie_board_taunt["monkey_zombie"].size ); + taunt_anim = level._zombie_board_taunt["monkey_zombie"][ choose ]; + self animscripted( "taunt_anim", self.origin, self.angles, taunt_anim ); + animscripts\traverse\zombie_shared::wait_anim_length( taunt_anim, .02 ); + self notify( "throw_done" ); +} +monkey_zombie_watch_machine_damage() +{ + self endon( "death" ); + self endon( "stop_perk_attack" ); + self endon( "stop_machine_watch" ); + arrival_health = self.health; + while ( 1 ) + { + monkey_zone = self monkey_get_zone(); + if ( isdefined( monkey_zone ) ) + { + if ( monkey_zone.is_occupied || self.health < arrival_health ) + { + monkey_print( "player is here, go crazy" ); + self.machine_damage = level.machine_damage_max; + break; + } + } + wait_network_frame(); + } +} +monkey_zombie_set_state( state ) +{ + self.state = state; + monkey_print( "set state to " + state ); +} +monkey_zombie_get_state() +{ + if ( isdefined( self.state ) ) + { + return self.state; + } + return undefined; +} +monkey_zombie_attack_perk() +{ + self endon( "death" ); + self endon( "stop_perk_attack" ); + self endon( "next_perk" ); + if ( !isdefined( self.perk ) ) + { + return; + } + flag_clear( "monkey_free_perk" ); + self.following_player = false; + self thread monkey_zombie_health_watcher(); + self monkey_zombie_set_state( "attack_perk" ); + level thread play_player_perk_theft_vox( self.perk.script_noteworthy, self ); + spot = self.attack.script_int; + self Teleport( self.attack.origin, self.attack.angles ); + monkey_print( "attack " + self.perk.script_noteworthy + " from " + spot ); + choose = 0; + if ( spot == 1 ) + { + choose = RandomIntRange( 1, 3 ); + } + else if ( spot == 3 ) + { + choose = RandomIntRange( 3, 5 ); + } + perk_attack_anim = undefined; + if ( choose == 2 ) + { + if ( isdefined( level.monkey_perk_attack_anims[ self.perk.script_noteworthy ] ) ) + { + perk_attack_anim = level.monkey_perk_attack_anims[ self.perk.script_noteworthy ][ "left_top" ]; + } + } + else if ( choose == 4 ) + { + if ( isdefined( level.monkey_perk_attack_anims[ self.perk.script_noteworthy ] ) ) + { + perk_attack_anim = level.monkey_perk_attack_anims[ self.perk.script_noteworthy ][ "right_top" ]; + } + } + if ( !isdefined( perk_attack_anim ) ) + { + perk_attack_anim = level.monkey_perk_attack_anims[ choose ]; + } + time = getAnimLength( perk_attack_anim ); + self thread monkey_wait_to_drop(); + while ( 1 ) + { + monkey_pack_flash_perk( self.perk.script_noteworthy ); + self animscripted( "perk_attack_anim", self.attack.origin, self.attack.angles, perk_attack_anim, "normal", %body, 1, 0.2 ); + self thread play_attack_impacts( time ); + if ( self monkey_zombie_perk_damage( self.machine_damage ) ) + { + break; + } + wait( time ); + } + self notify( "stop_machine_watch" ); + self monkey_zombie_set_state( "attack_perk_done" ); +} +monkey_wait_to_drop() +{ + self endon( "death" ); + wait( 0.2 ); + self.dropped = false; + self.perk_attack_origin = self.attack.origin; + while ( true ) + { + diff = abs( self.perk_attack_origin[2] - self.origin[2] ); + if ( diff < 8 ) + { + break; + } + wait_network_frame(); + } + self.dropped = true; + monkey_print( "close to ground" ); +} +play_player_perk_theft_vox( perk, monkey ) +{ + force_quit = 0; + if( !IsDefined( level.perk_theft_vox ) ) + level.perk_theft_vox = []; + if( !IsDefined( level.perk_theft_vox[perk] ) ) + level.perk_theft_vox[perk] = false; + if( level.perk_theft_vox[perk] ) + return; + level.perk_theft_vox[perk] = true; + while(1) + { + player = getplayers(); + rand = RandomIntRange(0, player.size ); + if ( monkey monkey_zombie_perk_damage( monkey.machine_damage ) ) + { + level.perk_theft_vox[perk] = false; + return; + } + if( ( IsAlive( player[rand] ) ) && ( !player[rand] maps\_laststand::player_is_in_laststand() ) && ( player[rand] HasPerk( perk ) ) ) + { + player[rand] maps\_zombiemode_audio::create_and_play_dialog( "perk", "steal_" + perk ); + break; + } + else if( force_quit >= 6 ) + { + break; + } + force_quit ++; + wait(.05); + } + while( !monkey monkey_zombie_perk_damage( monkey.machine_damage ) ) + { + wait(1); + } + level.perk_theft_vox[perk] = false; +} +play_attack_impacts( time ) +{ + self endon( "death" ); + for(i=0;i= 41 ) + self PlaySound( "zmb_monkey_attack_machine" ); + wait(RandomFloatRange(.7,1.1)); + } +} +monkey_zombie_destroy_perk() +{ + self endon( "death" ); + self endon( "stop_perk_attack" ); + if ( isdefined( self.perk ) ) + { + self monkey_zombie_set_state( "destroy_perk" ); + monkey_print( "goto " + self.perk.script_noteworthy ); + self monkey_zombie_get_perk_pos(); + if ( isdefined( self.attack ) ) + { + self SetGoalPos( self.attack.origin ); + self waittill( "goal" ); + self SetGoalPos( self.origin ); + self thread monkey_zombie_watch_machine_damage(); + self thread monkey_zombie_attack_perk(); + } + } +} +monkey_zombie_default_spawn_heuristic( spawner ) +{ + if( !isDefined( spawner.script_noteworthy ) ) + { + return -1; + } + if( !isDefined( level.zones ) || !isDefined( level.zones[ spawner.script_noteworthy ] ) || !level.zones[ spawner.script_noteworthy ].is_enabled ) + { + return -1; + } + score = 0; + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + score = int( distanceSquared( spawner.origin, players[i].origin ) ); + } + return score; +} +monkey_zombie_ground_hit() +{ + self endon( "death" ); + if ( self.ground_hit ) + { + return; + } + self monkey_zombie_set_state( "ground_pound" ); + self.ground_hit = true; + self thread groundhit_watcher( "groundhit_anim" ); + choose = RandomInt( level.monkey_groundpound_anims.size ); + groundpound_anim = level.monkey_groundpound_anims[ choose ]; + self animscripted( "groundhit_anim", self.origin, self.angles, groundpound_anim ); + animscripts\traverse\zombie_shared::wait_anim_length(groundpound_anim, .02); + self.ground_hit = false; + self monkey_zombie_set_state( "ground_pound_done" ); + self.nextGroundHit = GetTime() + level.monkey_ground_attack_delay; + if ( self.chest_beat ) + { + choose = RandomInt( level._zombie_board_taunt["monkey_zombie"].size ); + taunt_anim = level._zombie_board_taunt["monkey_zombie"][ choose ]; + self animscripted( "taunt_anim", self.origin, self.angles, taunt_anim ); + time = getAnimLength( taunt_anim ); + wait( time ); + self.chest_beat = false; + } + self thread animscripts\zombie_combat::main(); +} +monkey_pack_ready_to_detonate( claymore ) +{ + for ( i = 0; i < self.monkeys.size; i++ ) + { + if ( self.monkeys[i] == self ) + { + continue; + } + ready = self.monkeys[i].force_detonate; + if ( isdefined( ready ) ) + { + for ( j = 0; j < ready.size; j++ ) + { + if ( claymore == ready[j] ) + { + return true; + } + } + } + } + return false; +} +monkey_zombie_force_groundhit() +{ + if ( !isdefined( level.claymores ) ) + { + return false; + } + claymore_dist = 216*216; + height_max = 12; + self.force_detonate = []; + for ( i = 0; i < level.claymores.size; i++ ) + { + if ( self.pack monkey_pack_ready_to_detonate( level.claymores[i] ) ) + { + continue; + } + height_diff = abs( self.origin[2] - level.claymores[i].origin[2] ); + if ( height_diff < height_max ) + { + if ( DistanceSquared( self.origin, level.claymores[i].origin ) < claymore_dist ) + { + self.force_detonate[ self.force_detonate.size ] = level.claymores[i]; + } + } + } + return self.force_detonate.size > 0; +} +monkey_zombie_ground_hit_think() +{ + self endon( "death" ); + self.ground_hit = false; + self.nextGroundHit = GetTime() + level.monkey_ground_attack_delay; + while( 1 ) + { + if ( self.state == "attack_perk" ) + { + wait_network_frame(); + continue; + } + if ( !self.dropped ) + { + wait( 1 ); + continue; + } + if ( !self.ground_hit && self monkey_zombie_force_groundhit() ) + { + self.pack monkey_pack_update_ground_hit( self ); + self animcustom( ::monkey_zombie_ground_hit ); + } + else if ( !self.ground_hit && self monkey_zombie_check_ground_hit() ) + { + players = GetPlayers(); + closeEnough = false; + origin = self GetEye(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] maps\_laststand::player_is_in_laststand() ) + { + continue; + } + test_origin = players[i] GetEye(); + d = DistanceSquared( origin, test_origin ); + if ( d > level.monkey_zombie_groundhit_trigger_radius * level.monkey_zombie_groundhit_trigger_radius ) + { + continue; + } + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + continue; + } + closeEnough = true; + break; + } + if ( closeEnough ) + { + self.pack monkey_pack_update_ground_hit( self ); + self animcustom( ::monkey_zombie_ground_hit ); + } + } + wait_network_frame(); + } +} +groundhit_watcher( animname ) +{ + self endon( "death" ); + self waittillmatch( animname, "fire" ); + playfxontag( level._effect["monkey_groundhit"], self, "tag_origin" ); + origin = self.origin + ( 0, 0, 40 ); + zombies_axis = get_array_of_closest( origin, GetAiSpeciesArray( "axis", "all" ), undefined, undefined, level.monkey_zombie_groundhit_damage_radius ); + dogs = get_array_of_closest( origin, GetAiSpeciesArray( "allies", "zombie_dog" ), undefined, undefined, level.monkey_zombie_groundhit_damage_radius ); + zombies = array_combine( zombies_axis, dogs ); + if ( IsDefined( zombies ) ) + { + for ( i = 0; i < zombies.size; i++ ) + { + if ( !IsDefined( zombies[i] ) ) + { + continue; + } + if ( is_magic_bullet_shield_enabled( zombies[i] ) ) + { + continue; + } + test_origin = zombies[i] GetEye(); + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + continue; + } + if ( zombies[i] == self ) + { + continue; + } + if ( zombies[i].animname == "monkey_zombie" ) + { + continue; + } + refs = []; + refs[refs.size] = "guts"; + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + refs[refs.size] = "head"; + if( refs.size ) + { + zombies[i].a.gib_ref = random( refs ); + } + zombies[i] DoDamage( zombies[i].health * 10, self.origin, self ); + } + } + players = get_players(); + affected_players = []; + for( i = 0; i < players.size; i++ ) + { + if ( !is_player_valid( players[i] ) ) + { + continue; + } + test_origin = players[i] GetEye(); + if( distanceSquared( origin, test_origin ) > level.monkey_zombie_groundhit_damage_radius * level.monkey_zombie_groundhit_damage_radius ) + { + continue; + } + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + continue; + } + affected_players = array_add( affected_players, players[i] ); + } + self.chest_beat = false; + for( i = 0; i < affected_players.size; i++ ) + { + self.chest_beat = true; + player = affected_players[i]; + if ( player IsOnGround() ) + { + damage = player.maxhealth * 0.5; + player ShellShock( "electrocution", 1.5, true ); + player DoDamage( damage, self.origin, self ); + } + } + if ( isdefined( self.force_detonate ) ) + { + for ( i = 0; i < self.force_detonate.size; i++ ) + { + if ( isdefined( self.force_detonate[i] ) ) + { + self.force_detonate[i] detonate( undefined ); + } + } + } +} +monkey_zombie_grenade_pickup() +{ + self endon( "death" ); + pickup_dist_sq = 32*32; + picked_up = false; + while ( isdefined( self.monkey_grenade ) ) + { + self SetGoalPos( self.monkey_grenade.origin ); + grenade_dist_sq = DistanceSquared( self.origin, self.monkey_grenade.origin ); + if ( grenade_dist_sq <= pickup_dist_sq ) + { + self.monkey_thrower = self.monkey_grenade.thrower; + self.monkey_grenade delete(); + self.monkey_grenade = undefined; + picked_up = true; + monkey_print( "deleting grenade" ); + } + wait_network_frame(); + } + if ( picked_up ) + { + while ( 1 ) + { + self SetGoalPos( self.monkey_thrower.origin ); + target_dir = self.monkey_thrower.origin - self.origin; + monkey_dir = AnglesToForward( self.angles ); + dot = VectorDot( VectorNormalize( target_dir ), VectorNormalize( monkey_dir ) ); + if ( dot >= 0.5 ) + { + break; + } + wait_network_frame(); + } + self thread monkey_zombie_grenade_throw( self.monkey_thrower ); + self waittill( "throw_done" ); + } +} +monkey_zombie_grenade_response() +{ + self endon( "death" ); + monkey_print( "go for grenade" ); + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self notify( "monkey_update_stop" ); + self notify( "stop_perk_attack" ); + self.following_player = false; + self monkey_zombie_set_state( "grenade_response" ); + self monkey_zombie_clear_attack_pos(); + self monkey_zombie_grenade_pickup(); + self thread monkey_zombie_update(); + self monkey_zombie_set_state( "grenade_response_done" ); +} +monkey_zombie_grenade_watcher() +{ + self endon( "death" ); + grenade_respond_dist_sq = 120 * 120; + while ( 1 ) + { + if ( self.state == "default" ) + { + wait_network_frame(); + continue; + } + if ( is_true( self.ground_hit ) ) + { + wait_network_frame(); + continue; + } + if ( is_true( self.monkey_grenade ) ) + { + wait_network_frame(); + continue; + } + if ( level.monkey_grenades.size > 0 ) + { + for ( i = 0; i < level.monkey_grenades.size; i++ ) + { + grenade = level.monkey_grenades[i]; + if ( !isdefined( grenade ) || isdefined( grenade.monkey ) ) + { + wait_network_frame(); + continue; + } + grenade_dist_sq = DistanceSquared( self.origin, grenade.origin ); + if ( grenade_dist_sq <= grenade_respond_dist_sq ) + { + grenade.monkey = self; + self.monkey_grenade = grenade; + self monkey_zombie_grenade_response(); + break; + } + } + } + wait_network_frame(); + } +} +monkey_zombie_bhb_teleport() +{ + self endon( "death" ); + monkey_print( "bhb teleport" ); + black_hole_teleport = getstructarray( "struct_black_hole_teleport", "targetname" ); + assertex( black_hole_teleport.size > 0, "struct_black_hole_teleport not found" ); + zone_name = self get_current_zone(); + locations = []; + for ( i = 0; i < black_hole_teleport.size; i++ ) + { + bhb_zone_name = black_hole_teleport[i].script_string; + if ( !isDefined( bhb_zone_name ) || !isDefined( zone_name ) ) + { + continue; + } + if ( bhb_zone_name == zone_name ) + { + continue; + } + if ( !level.zones[ bhb_zone_name ].is_enabled ) + { + continue; + } + locations[ locations.size ] = black_hole_teleport[i]; + } + self StopAnimScripted(); + wait_network_frame(); + so = spawn( "script_origin", self.origin ); + so.angles = self.angles; + self linkto( so ); + if ( locations.size > 0 ) + { + locations = array_randomize( locations ); + so.origin = locations[0].origin; + so.angles = locations[0].angles; + } + else + { + so.origin = self.spawn_origin; + so.angles = self.spawn_angles; + } + wait_network_frame(); + self unlink(); + so delete(); + maps\_zombiemode_weap_black_hole_bomb::black_hole_bomb_create_exit_portal( self.origin ); +} +monkey_zombie_bhb_failsafe() +{ + self endon( "death" ); + self endon( "bhb_old_failsafe" ); + prev_origin = self.origin; + min_movement = 16*16; + while ( true ) + { + wait( 1 ); + dist = DistanceSquared( prev_origin, self.origin ); + if ( dist < min_movement ) + { + break; + } + prev_origin = self.origin; + } + if ( self.state == "ground_pound" ) + { + return; + } + self.safeToChangeScript = true; + self animmode( "none" ); +} +monkey_zombie_bhb_run() +{ + self endon( "death" ); + jump_dist_sq = 64*64; + jump = false; + wait_network_frame(); + if ( !isdefined( self.monkey_bhb ) || !isdefined( self.monkey_bhb.origin ) ) + { + return; + } + self.safeToChangeScript = false; + self SetGoalPos( self.monkey_bhb.origin ); + while ( isdefined( self.monkey_bhb ) ) + { + bhb_dist_sq = DistanceSquared( self.origin, self.monkey_bhb.origin ); + if ( bhb_dist_sq <= jump_dist_sq ) + { + jump = true; + break; + } + wait_network_frame(); + } + if ( jump ) + { + jump_anim = %ai_zombie_monkey_portal_jump_01; + self animscripted( "jump_anim", self.origin, self.angles, jump_anim ); + jump_length = getanimlength( jump_anim ); + pre_jump = jump_length * 0.625; + post_jump = jump_length * 0.375; + wait( pre_jump ); + self stopanimscripted(); + wait_network_frame(); + self monkey_zombie_bhb_teleport(); + } + wait_network_frame(); + self.safeToChangeScript = true; + self SetGoalPos( self.origin ); + self waittill_any_or_timeout( 0.5, "goal" ); + self notify( "bhb_old_failsafe" ); + wait_network_frame(); + self thread monkey_zombie_bhb_failsafe(); +} +monkey_zombie_clear_attack_pos() +{ + if ( isDefined( self.attack ) ) + { + if ( isDefined( self.pack.attack ) ) + { + for ( i = 0; i < self.pack.attack.size; i++ ) + { + if ( self == self.pack.attack[i] ) + { + self.pack.attack = array_remove( self.pack.attack, self ); + self.attack = undefined; + return; + } + } + } + } +} +monkey_zombie_bhb_response() +{ + self endon( "death" ); + monkey_print( "bhb response" ); + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self notify( "monkey_update_stop" ); + self notify( "stop_perk_attack" ); + self.following_player = false; + self monkey_zombie_set_state( "bhb_response" ); + self monkey_zombie_clear_attack_pos(); + self monkey_zombie_bhb_run(); + self thread monkey_zombie_update(); + self monkey_zombie_set_state( "bhb_response_done" ); +} +monkey_zombie_bhb_watcher() +{ + self endon( "death" ); + bhb_respond_dist_sq = 512 * 512; + while ( 1 ) + { + if ( self.state == "default" || + self.state == "ground_pound" || self.state == "ground_pound_taunt" || + self.state == "grenade_reponse" || self.state == "bhb_response" || + self.state == "attack_perk" || !self.dropped ) + { + wait_network_frame(); + continue; + } + if ( level.monkey_bhbs.size > 0 ) + { + for ( i = 0; i < level.monkey_bhbs.size; i++ ) + { + bhb = level.monkey_bhbs[i]; + if ( is_true( bhb.is_valid ) ) + { + if ( !isDefined( bhb ) || !isDefined( bhb.origin ) || !isDefined( self.origin ) ) + { + continue; + } + bhb_dist_sq = DistanceSquared( self.origin, bhb.origin ); + if ( bhb_dist_sq <= bhb_respond_dist_sq ) + { + self.monkey_bhb = bhb; + self monkey_zombie_bhb_response(); + } + } + } + } + wait_network_frame(); + } +} +monkey_remove_from_pack() +{ + for ( i = 0; i < level.monkey_pack.size; i++ ) + { + pack = level.monkey_pack[i]; + for ( j = 0; j < pack.monkeys.size; j++ ) + { + if ( self == pack.monkeys[j] ) + { + pack.monkeys = array_remove( pack.monkeys, self ); + if ( pack.monkeys.size == 0 && pack.spawning_done ) + { + if ( isdefined( pack.perk ) ) + { + pack.perk.targeted = 0; + } + level.monkey_packs_killed++; + flag_set( "monkey_pack_down" ); + level.monkey_pack = array_remove( level.monkey_pack, pack ); + } + } + } + } + if ( level.monkey_packs_killed >= level.monkey_pack_max ) + { + flag_set( "last_monkey_down" ); + if ( self monkey_zombie_can_drop_free_perk() ) + { + forward = VectorNormalize( AnglesToForward( self.angles ) ); + end_pos = self.origin - vector_scale( forward, 32 ); + level thread maps\_zombiemode_powerups::specific_powerup_drop( "free_perk", end_pos ); + } + drop_pos = self.origin; + if ( self.state == "attack_perk" || !self.dropped ) + { + drop_pos = self.attack.origin; + } + level thread maps\_zombiemode_powerups::specific_powerup_drop( "full_ammo", drop_pos ); + } +} +monkey_zombie_can_drop_free_perk() +{ + if ( !flag( "monkey_free_perk" ) ) + { + return false; + } + max_perks = level.max_perks; + if ( flag( "solo_game" ) ) + { + if ( level.solo_lives_given >= level.max_solo_lives ) + { + players = getplayers(); + if ( !players[0] HasPerk( "specialty_quickrevive" ) ) + { + max_perks--; + } + } + } + players = getplayers(); + vending_triggers = getentarray( "zombie_vending", "targetname" ); + for ( i = 0; i < players.size; i++ ) + { + num_perks = 0; + for ( j = 0; j < vending_triggers.size; j++ ) + { + perk = vending_triggers[j].script_noteworthy; + if ( players[i] HasPerk( perk ) ) + { + num_perks++; + } + } + if ( num_perks < max_perks ) + { + return true; + } + } + return false; +} +monkey_zombie_die() +{ + self maps\_zombiemode_spawner::reset_attack_spot(); + self.grenadeAmmo = 0; + self thread maps\_zombiemode_audio::do_zombies_playvocals( "death", self.animname ); + self thread maps\_zombiemode_spawner::zombie_eye_glow_stop(); + PlayFX( level._effect["monkey_death"], self.origin ); + level maps\_zombiemode_spawner::zombie_death_points( self.origin, self.damagemod, self.damagelocation, self.attacker,self ); + if( RandomIntRange(0,100) >= 75 ) + { + if( IsDefined( self.attacker ) && IsPlayer( self.attacker ) ) + self.attacker maps\_zombiemode_audio::create_and_play_dialog( "kill", "space_monkey" ); + } + if( self.damagemod == "MOD_BURNED" ) + { + self thread animscripts\zombie_death::flame_death_fx(); + } + level.monkey_death++; + level.monkey_death_total++; + self monkey_remove_from_pack(); + return false; +} +monkey_custom_damage( player ) +{ + self endon( "death" ); + damage = self.meleeDamage; + if ( isDefined( self.ground_hit ) && self.ground_hit ) + { + damage = int( player.maxhealth * 0.25 ); + } + return damage; +} +monkey_zombie_default_enter_level() +{ + Playfx( level._effect["monkey_spawn"], self.origin ); + playsoundatposition( "zmb_bolt", self.origin ); + PlayRumbleOnPosition("explosion_generic", self.origin); +} +monkey_pathing() +{ + self endon( "death" ); + while ( 1 ) + { + if( IsDefined( self.favoriteenemy ) ) + { + self.ignoreall = false; + self OrientMode( "face default" ); + self SetGoalPos( self.favoriteenemy.origin ); + } + wait_network_frame(); + } +} +monkey_find_flesh() +{ + self endon( "death" ); + level endon( "intermission" ); + self endon( "stop_find_flesh" ); + if( level.intermission ) + { + return; + } + self maps\_zombiemode_spawner::zombie_history( "monkey find flesh -> start" ); + self.goalradius = 48; + players = getplayers(); + self.ignore_player = []; + player = get_closest_valid_player( self.origin, self.ignore_player ); + if( !isDefined( player ) ) + { + self maps\_zombiemode_spawner::zombie_history( "monkey find flesh -> can't find player, continue" ); + } + self.favoriteenemy = player; + while( 1 ) + { + if ( isdefined( self.pack ) && isdefined( self.pack.enemy ) ) + { + if ( !isdefined( self.favoriteenemy ) || self.favoriteenemy != self.pack.enemy ) + { + self.favoriteenemy = self.pack.enemy; + } + } + if ( isdefined( level.user_ryan_monkey_pathing ) ) + { + self thread maps\_zombiemode_ai_monkey::monkey_pathing(); + } + else + { + self thread maps\_zombiemode_spawner::zombie_pathing(); + } + self.zombie_path_timer = GetTime() + ( RandomFloatRange( 1, 3 ) * 1000 ); + while( GetTime() < self.zombie_path_timer ) + { + wait( 0.1 ); + } + self maps\_zombiemode_spawner::zombie_history( "monkey find flesh -> bottom of loop" ); + debug_print( "Zombie is re-acquiring enemy, ending breadcrumb search" ); + self notify( "zombie_acquire_enemy" ); + } +} +monkey_zombie_setup_perks() +{ + vending_triggers = getentarray( "zombie_vending", "targetname" ); + for ( i = 0; i < vending_triggers.size; i++ ) + { + vending_triggers[i] monkey_zombie_perk_init(); + } +} +monkey_zombie_perk_init() +{ + self.targeted = 0; + machine = undefined; + targets = getentarray( self.target, "targetname" ); + for ( i = 0; i < targets.size; i++ ) + { + if ( targets[i].classname == "script_model" ) + { + machine = targets[i]; + break; + } + } + assertex( isdefined( machine ), "no machine found for " + self.target ); + if ( isdefined( machine ) ) + { + machine.monkey_health = 100; + } +} +monkey_zombie_perk_damage( amount ) +{ + if ( !isdefined( self.perk ) ) + { + return true; + } + machine = self.pack.machine; + machine.monkey_health -= amount; + if ( machine.monkey_health < 0 ) + { + machine.monkey_health = 0; + } + return machine.monkey_health == 0; +} +monkey_pack_take_perk() +{ + players = getplayers(); + self.perk.targeted = 0; + perk = self.perk.script_noteworthy; + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] HasPerk( perk ) ) + { + perk_str = perk + "_stop"; + players[i] notify( perk_str ); + if ( flag( "solo_game" ) && perk == "specialty_quickrevive" ) + { + players[i].lives--; + } + } + } +} +monkey_perk_lost( perk ) +{ + if ( perk == "specialty_armorvest" ) + { + if ( self.health > self.maxhealth ) + { + self.health = self.maxhealth; + } + } + if ( isdefined( self.perk_hud ) ) + { + keys = getarraykeys( self.perk_hud ); + for ( i = 0; i < self.perk_hud.size; i++ ) + { + self.perk_hud[ keys[i] ].x = i * 30; + } + } +} +monkey_perk_bought( perk ) +{ + flag_set( "perk_bought" ); + level.perk_bought_func = undefined; +} +monkey_pack_flash_perk( perk ) +{ + if ( !isdefined( perk ) ) + { + return; + } + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] maps\_zombiemode_perks::perk_hud_start_flash( perk ); + } +} +monkey_pack_stop_flash( perk, taken ) +{ + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] maps\_zombiemode_perks::perk_hud_stop_flash( perk, taken ); + } +} +monkey_get_zone() +{ + zone = undefined; + keys = getarraykeys( level.zones ); + for ( i = 0; i < keys.size; i++ ) + { + zone = level.zones[ keys[i] ]; + for ( j = 0; j < zone.volumes.size; j++ ) + { + if ( self isTouching( zone.volumes[j] ) ) + { + return zone; + } + } + } + assertex( isdefined( zone ), "monkey is NOT in a zone" ); + return zone; +} +monkey_fling( player ) +{ + monkey_print( "fling monkey damage" ); + damage = int( level.monkey_zombie_health * 0.5 ); + self DoDamage( damage, self.origin, self ); + forward = VectorNormalize( AnglesToForward( self.angles ) ); + attack_dir = VectorNormalize( self.origin - player.origin ); + dot = VectorDot( attack_dir, forward ); + if ( dot < 0 ) + { + end_pos = self.origin - vector_scale( forward, 120 ); + if ( sightTracePassed( self.origin, end_pos, false, self ) ) + { + recordLine( self.origin, end_pos, (0,1,0), "Script", self ); + roll_anim = []; + roll_anim[ roll_anim.size ] = %ai_zombie_monkey_thundergun_roll_01; + roll_anim[ roll_anim.size ] = %ai_zombie_monkey_thundergun_roll_02; + roll_anim[ roll_anim.size ] = %ai_zombie_monkey_thundergun_roll_03; + roll_anim[ roll_anim.size ] = %ai_zombie_monkey_thundergun_roll_04; + rollback_anim = roll_anim[ RandomInt( roll_anim.size ) ]; + self animscripted( "rollback_anim", self.origin, self.angles, rollback_anim ); + animscripts\traverse\zombie_shared::wait_anim_length( rollback_anim, .02 ); + } + else + { + recordLine( self.origin, end_pos, (1,0,0), "Script", self ); + } + } + self.thundergun_fling_func = undefined; +} +monkey_revive_solo_fx() +{ + vending_triggers = getentarray( "zombie_vending", "targetname" ); + for ( i = 0; i < vending_triggers.size; i++ ) + { + if ( vending_triggers[i].script_noteworthy == "specialty_quickrevive" ) + { + vending_triggers[i] delete(); + break; + } + } +} +monkey_print( str ) +{ +} +play_random_monkey_vox() +{ + self endon( "death" ); + while(1) + { + self thread maps\_zombiemode_audio::do_zombies_playvocals( "ambient", "monkey_zombie" ); + wait(RandomFloatRange(1.25,3)); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_ai_napalm.gsc b/BO1/PC/ZM/maps/_zombiemode_ai_napalm.gsc new file mode 100644 index 0000000..f121a4d --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_ai_napalm.gsc @@ -0,0 +1,870 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include animscripts\zombie_Utility; +#include maps\_zombiemode_spawner; +#include maps\_zombiemode_net; +#using_animtree( "generic_human" ); +napalm_zombie_init() +{ + init_napalm_fx(); + level.napalmZombiesEnabled = true; + level.napalmZombieMinRoundWait = 1; + level.napalmZombieMaxRoundWait = 2; + level.napalmZombieRoundRequirement = 5; + level.nextNapalmSpawnRound = level.napalmZombieRoundRequirement + RandomIntRange(0, level.napalmZombieMaxRoundWait+1); + level.napalmZombieDamageRadius = 250; + level.napalmExplodeRadius = 90.0; + level.napalmExplodeKillRadiusJugs = 90.0; + level.napalmExplodeKillRadius = 150.0; + level.napalmExplodeDamageRadius = 400.0; + level.napalmExplodeDamageRadiusWet = 250.0; + level.napalmExplodeDamageMin = 50; + level.napalmHealthMultiplier = 4; + level.napalm_zombie_spawners = GetEntArray( "napalm_zombie_spawner", "script_noteworthy" ); + if ( GetDvar("zombiemode_debug_napalm") == "" ) + { + SetDvar("zombiemode_debug_napalm", "0"); + } + flag_init("zombie_napalm_force_spawn"); + array_thread(level.napalm_zombie_spawners, ::add_spawn_function, ::napalm_zombie_spawn); + array_thread(level.napalm_zombie_spawners, ::add_spawn_function, maps\_zombiemode::round_spawn_failsafe); + maps\_zombiemode_spawner::register_zombie_damage_callback( ::_napalm_damage_callback ); + _napalm_InitAnims(); + _napalm_InitSounds(); + thread _napalm_InitSpawners(); +} +_napalm_InitAnims() +{ + level.scr_anim["napalm_zombie"]["death1"] = %ai_zombie_napalm_death_01; + level.scr_anim["napalm_zombie"]["death2"] = %ai_zombie_napalm_death_02; + level.scr_anim["napalm_zombie"]["death3"] = %ai_zombie_napalm_death_03; + level.scr_anim["napalm_zombie"]["death4"] = %ai_zombie_napalm_death_01; + level.scr_anim["napalm_zombie"]["walk1"] = %ai_zombie_napalm_run_01; + level.scr_anim["napalm_zombie"]["walk2"] = %ai_zombie_napalm_run_02; + level.scr_anim["napalm_zombie"]["walk3"] = %ai_zombie_napalm_run_03; + level.scr_anim["napalm_zombie"]["walk4"] = %ai_zombie_napalm_run_01; + level.scr_anim["napalm_zombie"]["walk5"] = %ai_zombie_napalm_run_02; + level.scr_anim["napalm_zombie"]["walk6"] = %ai_zombie_napalm_run_03; + level.scr_anim["napalm_zombie"]["walk7"] = %ai_zombie_napalm_run_01; + level.scr_anim["napalm_zombie"]["walk8"] = %ai_zombie_napalm_run_02; + level.scr_anim["napalm_zombie"]["crawl1"] = %ai_zombie_crawl; + level.scr_anim["napalm_zombie"]["crawl2"] = %ai_zombie_crawl_v1; + level.scr_anim["napalm_zombie"]["crawl3"] = %ai_zombie_crawl_v2; + level.scr_anim["napalm_zombie"]["crawl4"] = %ai_zombie_crawl_v3; + level.scr_anim["napalm_zombie"]["crawl5"] = %ai_zombie_crawl_v4; + level.scr_anim["napalm_zombie"]["crawl6"] = %ai_zombie_crawl_v5; + level.scr_anim["napalm_zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a; + level.scr_anim["napalm_zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b; + level.scr_anim["napalm_zombie"]["crawl_sprint1"] = %ai_zombie_crawl_sprint; + level.scr_anim["napalm_zombie"]["crawl_sprint2"] = %ai_zombie_crawl_sprint_1; + level.scr_anim["napalm_zombie"]["crawl_sprint3"] = %ai_zombie_crawl_sprint_2; + level.scr_anim["napalm_zombie"]["sprint1"] = %ai_zombie_sprint_v1; + level.scr_anim["napalm_zombie"]["sprint2"] = %ai_zombie_sprint_v2; + level.scr_anim["napalm_zombie"]["sprint3"] = %ai_zombie_sprint_v1; + level.scr_anim["napalm_zombie"]["sprint4"] = %ai_zombie_sprint_v2; + level._zombie_melee["napalm_zombie"] = level._zombie_melee["zombie"]; + level._zombie_run_melee["napalm_zombie"] = level._zombie_run_melee["zombie"]; + level._zombie_walk_melee["napalm_zombie"] = level._zombie_walk_melee["zombie"]; + level._zombie_knockdowns["napalm_zombie"] = []; + level._zombie_knockdowns["napalm_zombie"]["front"] = []; + level._zombie_knockdowns["napalm_zombie"]["front"]["no_legs"] = []; + level._zombie_knockdowns["napalm_zombie"]["front"]["no_legs"][0] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["napalm_zombie"]["front"]["no_legs"][1] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["napalm_zombie"]["front"]["no_legs"][2] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"] = []; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][0] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][1] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][2] = %ai_zombie_thundergun_hit_upontoback; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][3] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][4] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][5] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][6] = %ai_zombie_thundergun_hit_stumblefall; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][7] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][8] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][9] = %ai_zombie_thundergun_hit_upontoback; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][10] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][11] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][12] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][13] = %ai_zombie_thundergun_hit_deadfallknee; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][14] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][15] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][16] = %ai_zombie_thundergun_hit_upontoback; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][17] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][18] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][19] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["napalm_zombie"]["front"]["has_legs"][20] = %ai_zombie_thundergun_hit_flatonback; + level._zombie_knockdowns["napalm_zombie"]["left"] = []; + level._zombie_knockdowns["napalm_zombie"]["left"][0] = %ai_zombie_thundergun_hit_legsout_right; + level._zombie_knockdowns["napalm_zombie"]["right"] = []; + level._zombie_knockdowns["napalm_zombie"]["right"][0] = %ai_zombie_thundergun_hit_legsout_left; + level._zombie_knockdowns["napalm_zombie"]["back"] = []; + level._zombie_knockdowns["napalm_zombie"]["back"][0] = %ai_zombie_thundergun_hit_faceplant; + level._zombie_getups["napalm_zombie"] = []; + level._zombie_getups["napalm_zombie"]["back"] = []; + level._zombie_getups["napalm_zombie"]["back"]["early"] = []; + level._zombie_getups["napalm_zombie"]["back"]["early"][0] = %ai_zombie_thundergun_getup_b; + level._zombie_getups["napalm_zombie"]["back"]["early"][1] = %ai_zombie_thundergun_getup_c; + level._zombie_getups["napalm_zombie"]["back"]["late"] = []; + level._zombie_getups["napalm_zombie"]["back"]["late"][0] = %ai_zombie_thundergun_getup_b; + level._zombie_getups["napalm_zombie"]["back"]["late"][1] = %ai_zombie_thundergun_getup_c; + level._zombie_getups["napalm_zombie"]["back"]["late"][2] = %ai_zombie_thundergun_getup_quick_b; + level._zombie_getups["napalm_zombie"]["back"]["late"][3] = %ai_zombie_thundergun_getup_quick_c; + level._zombie_getups["napalm_zombie"]["belly"] = []; + level._zombie_getups["napalm_zombie"]["belly"]["early"] = []; + level._zombie_getups["napalm_zombie"]["belly"]["early"][0] = %ai_zombie_thundergun_getup_a; + level._zombie_getups["napalm_zombie"]["belly"]["late"] = []; + level._zombie_getups["napalm_zombie"]["belly"]["late"][0] = %ai_zombie_thundergun_getup_a; + level._zombie_getups["napalm_zombie"]["belly"]["late"][1] = %ai_zombie_thundergun_getup_quick_a; + level._zombie_melee_crawl["napalm_zombie"] = level._zombie_melee_crawl["zombie"]; + level._zombie_stumpy_melee["napalm_zombie"] = level._zombie_stumpy_melee["zombie"]; + level._zombie_tesla_death["napalm_zombie"] = level._zombie_tesla_death["zombie"]; + level._zombie_tesla_crawl_death["napalm_zombie"] = level._zombie_tesla_crawl_death["zombie"]; + level._zombie_deaths["napalm_zombie"] = []; + level._zombie_deaths["napalm_zombie"][0] = %ai_zombie_napalm_death_01; + level._zombie_deaths["napalm_zombie"][1] = %ai_zombie_napalm_death_02; + level._zombie_deaths["napalm_zombie"][2] = %ai_zombie_napalm_death_03; + level._zombie_board_taunt["napalm_zombie"] = level._zombie_board_taunt["zombie"]; +} +_napalm_InitSounds() +{ + level.zmb_vox["napalm_zombie"] = []; + level.zmb_vox["napalm_zombie"]["ambient"] = "napalm_ambient"; + level.zmb_vox["napalm_zombie"]["sprint"] = "napalm_ambient"; + level.zmb_vox["napalm_zombie"]["attack"] = "napalm_attack"; + level.zmb_vox["napalm_zombie"]["teardown"] = "napalm_attack"; + level.zmb_vox["napalm_zombie"]["taunt"] = "napalm_ambient"; + level.zmb_vox["napalm_zombie"]["behind"] = "napalm_ambient"; + level.zmb_vox["napalm_zombie"]["death"] = "napalm_explode"; + level.zmb_vox["napalm_zombie"]["crawler"] = "napalm_ambient"; +} +_napalm_InitSpawners() +{ + flag_wait("zones_initialized"); + testOrigin = Spawn("script_model", (0,0,0)); + testOrigin SetModel("tag_origin"); + zkeys = GetArrayKeys(level.zones); + for ( z = 0; z < zkeys.size; z++ ) + { + zoneName = zkeys[z]; + zone = level.zones[zoneName]; + zone.napalm_spawn_locations = []; + } + spawnPoints = GetStructArray("special_zombie_spawn", "targetname"); + for ( i = 0; i < spawnPoints.size; i++ ) + { + s = spawnPoints[i]; + testOrigin.origin = s.origin + (0,0,50); + for ( z = 0; z < zkeys.size; z++ ) + { + zoneName = zkeys[z]; + zone = level.zones[zoneName]; + inZone = testOrigin _entity_in_zone(zone); + if ( inZone ) + { + s.zoneName = zoneName; + zone.napalm_spawn_locations = array_add(zone.napalm_spawn_locations, s); + } + } + } +} +_entity_in_zone(zone) +{ + for (i = 0; i < zone.volumes.size; i++) + { + if ( self IsTouching( zone.volumes[i] ) ) + { + return true; + } + } + return false; +} +init_napalm_fx() +{ + level._effect["napalm_fire_forearm"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_forearm" ); + level._effect["napalm_fire_torso"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_torso" ); + level._effect["napalm_fire_ground"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_ground2" ); + level._effect["napalm_explosion"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_exp" ); + level._effect["napalm_fire_trigger"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_end2" ); + level._effect["napalm_spawn"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_spawn7"); + level._effect["napalm_distortion"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_heat" ); + level._effect["napalm_fire_forearm_end"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_torso_end" ); + level._effect["napalm_fire_torso_end"] = LoadFX( "maps/zombie_temple/fx_ztem_napalm_zombie_forearm_end" ); + level._effect["napalm_steam"] = LoadFX( "maps/zombie_temple/fx_ztem_zombie_torso_steam_runner" ); + level._effect["napalm_feet_steam"] = LoadFX( "maps/zombie_temple/fx_ztem_zombie_torso_steam_runner" ); +} +napalm_zombie_spawn( animname_set ) +{ + zombie_spawn_init( animname_set ); + self.animname = "napalm_zombie"; + self thread napalm_zombie_client_flag(); + self.napalm_zombie_glowing = false; + self.maxhealth *= (GetPlayers().size * level.napalmHealthMultiplier); + self.health = self.maxhealth; + self.no_gib = true; + self.rising = true; + self.no_damage_points = true; + self.explosive_volume = 0; + self.ignore_enemy_count = true; + self.deathFunction = ::napalm_zombie_death; + self.actor_full_damage_func = ::_napalm_zombie_damage; + self.nuke_damage_func = ::_napalm_nuke_damage; + self.instakill_func = undefined; + self._zombie_shrink_callback = ::_napalm_Shrink; + self._zombie_unshrink_callback = ::_napalm_Unshrink; + self.water_trigger_func = ::napalm_enter_water_trigger; + self maps\_zombiemode_spawner::set_zombie_run_cycle("walk"); + self.custom_damage_func = ::napalm_custom_damage; + self.thundergun_knockdown_func = maps\_zombiemode_spawner::zombie_knockdown; + self.monkey_bolt_taunts = ::napalm_monkey_bolt_taunts; + self thread _zombie_WatchStopEffects(); + self thread _zombie_ExplodeNearPlayers(); + self thread napalm_watch_for_sliding(); + self thread napalm_zombie_count_watch(); + old_origin = self.origin; + closest = GetClosest(self.origin, GetPlayers()); + angles = VectorToAngles(closest.origin - self.origin); + anchor = Spawn("script_origin", self.origin); + anchor.angles = angles; + self linkto(anchor); + self Hide(); + self.a.disablepain = true; + self magic_bullet_shield(); + anim_org = self.origin + (0, 0, -45); + anchor MoveTo(anim_org, 0.05); + anchor waittill("movedone"); + anchor RotateTo(angles, 0.05); + anchor waittill("rotatedone"); + self Unlink(); + anchor Delete(); + self thread maps\_zombiemode_spawner::hide_pop(); + level thread napalm_fire_trigger( self, 80, 6, true ); + self PlaySound( "zmb_ignite" ); + self playsound( "evt_napalm_zombie_spawn" ); + fwd = anglestoforward( self.angles ); + playfx( level._effect["napalm_spawn"], old_origin, fwd, (0,0,1) ); + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "general", "napalm_spawn" ); + speed = "run"; + spawn_anim = random(level._zombie_rise_anims["zombie"][1][speed]); + time = getanimlength(spawn_anim); + self animscripted("napalm_spawn", self.origin, self.angles, spawn_anim, "normal"); + wait( time ); + self.rising = false; + self stop_magic_bullet_shield(); + self.a.disablepain = true; + self BloodImpact( "hero" ); + self PlaySound( level.zmb_vox["napalm_zombie"]["ambient"] ); +} +napalm_zombie_client_flag() +{ + if(isdefined(level._CF_ACTOR_IS_NAPALM_ZOMBIE)) + { + self SetClientFlag(level._CF_ACTOR_IS_NAPALM_ZOMBIE); + self waittill("death"); + self clearclientflag(level._CF_ACTOR_IS_NAPALM_ZOMBIE); + napalm_clear_radius_fx_all_players(); + } +} +_napalm_nuke_damage() +{ +} +_napalm_instakill_func() +{ +} +napalm_custom_damage( player ) +{ + damage = self.meleeDamage; + if ( isDefined( self.overrideDeathDamage ) ) + { + damage = int( self.overrideDeathDamage ); + } + return damage; +} +_zombie_RunExplosionWindupEffects() +{ + fx = []; + fx["J_Elbow_LE"] = "napalm_fire_forearm_end"; + fx["J_Elbow_RI"] = "napalm_fire_forearm_end"; + fx["J_Clavicle_RI"] = "napalm_fire_forearm_end"; + fx["J_Clavicle_LE"] = "napalm_fire_forearm_end"; + fx["J_SpineLower"] = "napalm_fire_torso_end"; + offsets["J_SpineLower"] = (0.0, 10.0, 0.0); + watch = []; + keys = GetArrayKeys(fx); + for ( i = 0; i < keys.size; i++ ) + { + jointName = keys[i]; + fxName = fx[jointName]; + offset = offsets[jointName]; + effectEnt = self _zombie_SetupFXOnJoint(jointName, fxName, offset); + watch[i] = effectEnt; + } + self waittill( "stop_fx" ); + if ( !IsDefined(self) ) + { + return; + } + for ( i = 0; i < watch.size; i++ ) + { + watch[i] Delete(); + } +} +_zombie_WatchStopEffects() +{ + self waittill("death"); + self notify("stop_fx"); +} +_zombie_ExplodeNearPlayers() +{ + self endon("death"); + if(level.napalmExplodeRadius<=0) + { + return; + } + self.canExplodeTime = gettime() + 2000; + napalmExplodeRadiusSqr = level.napalmExplodeRadius*level.napalmExplodeRadius; + napalmPlayerWarningRadius = level.napalmExplodeDamageRadius; + napalmPlayerWarningRadiusSqr = napalmPlayerWarningRadius * napalmPlayerWarningRadius; + while(1) + { + wait .1; + if(is_true(self.is_traversing)) + { + continue; + } + players = get_players(); + for(i=0;i gettime() ) + { + player exit_napalm_radius(); + } + continue; + } + if( !isDefined(self.favoriteenemy) || !isPlayer(self.favoriteenemy)) + { + continue; + } + if ( self.rising ) + { + continue; + } + if ( self.canExplodeTime > gettime() ) + { + continue; + } + if( abs(player.origin[2] - self.origin[2]) > 50 ) + { + continue; + } + if(distance2dsquared(player.origin,self.origin) > napalmExplodeRadiusSqr) + { + continue; + } + if(isdefined(level._CF_ACTOR_NAPALM_ZOMBIE_EXPLODE)) + { + self SetClientFlag(level._CF_ACTOR_NAPALM_ZOMBIE_EXPLODE); + } + self playsound( "evt_napalm_zombie_charge" ); + explode_wind_up = %ai_zombie_napalm_attack_01; + time = getanimlength(explode_wind_up); + animScale = 2.0; + self animscripted("napalm_explode", self.origin, self.angles, explode_wind_up, "normal", undefined, animScale); + wait time/animScale; + napalm_clear_radius_fx_all_players(); + self.killed_self = true; + self dodamage(self.health + 666, self.origin); + return; + } + } +} +napalm_zombie_death() +{ + zombies_axis = get_array_of_closest( self.origin, GetAiSpeciesArray( "axis", "all" ), undefined, undefined, level.napalmZombieDamageRadius ); + dogs = get_array_of_closest( self.origin, GetAiSpeciesArray( "allies", "zombie_dog" ), undefined, undefined, level.napalmZombieDamageRadius ); + zombies = array_combine( zombies_axis, dogs ); + if( IsDefined( level._effect["napalm_explosion"] ) ) + { + PlayFxOnTag( level._effect["napalm_explosion"], self, "J_SpineLower" ); + } + self playsound( "evt_napalm_zombie_explo" ); + if( isdefined( self.attacker ) && isPlayer( self.attacker ) ) + { + self.attacker thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "napalm" ); + } + level notify("napalm_death", self.explosive_volume); + self thread napalm_delay_delete(); + if(!self napalm_standing_in_water(true)) + { + level thread napalm_fire_trigger( self, 80, 20, false ); + } + self thread _napalm_damage_zombies(zombies); + napalm_clear_radius_fx_all_players(); + self _napalm_damage_players(); + if( isDefined(self.attacker) && isPlayer(self.attacker) && !is_true(self.killed_self) && !is_true(self.shrinked) ) + { + players = get_players(); + for(i=0;i damageRadius * damageRadius ) + { + continue; + } + test_origin_foot = players[i].origin+(0,0,8); + test_origin_mid = (test_origin_foot[0], test_origin_foot[1], (test_origin_foot[2] + test_origin[2])/2 ); + if ( !BulletTracePassed( eyeOrigin, test_origin, false, undefined ) ) + { + if ( !BulletTracePassed( midOrigin, test_origin_mid, false, undefined ) ) + { + if ( !BulletTracePassed( footOrigin, test_origin_foot, false, undefined ) ) + { + continue; + } + } + } + players_damaged_by_explosion = true; + if( IsDefined( level._effect["player_fire_death_napalm"] ) ) + { + PlayFxOnTag( level._effect["player_fire_death_napalm"], players[i], "J_SpineLower" ); + } + dist = distance( eyeOrigin, test_origin ); + killPlayerDamage = 100; + killJusgsPlayerDamage = 250; + shellShockMinTime = 1.5; + shellShockMaxTime = 3.0; + damage = level.napalmExplodeDamageMin; + shellShockTime = shellShockMaxTime; + if(distGetTime()) + { + wait .1; + } + self thread napalm_end_wet_fx(); + self.wet = false; +} +napalm_watch_for_sliding() +{ + self endon("death"); + while(1) + { + if(is_true(self.sliding)) + { + self thread napalm_add_wet_time(4); + } + wait 1; + } +} +napalm_start_wet_fx() +{ + self setclientflag(level._CF_ACTOR_NAPALM_ZOMBIE_WET); +} +napalm_end_wet_fx() +{ + self clearclientflag(level._CF_ACTOR_NAPALM_ZOMBIE_WET); +} +napalm_standing_in_water(forceCheck) +{ + doTrace = !isDefined(self.standing_in_water_debounce); + doTrace = doTrace || self.standing_in_water_debounceself.origin[2]; + } + return self.standing_in_water; +} +napalm_monkey_bolt_taunts(monkey_bolt) +{ + return true; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_ai_quad.gsc b/BO1/PC/ZM/maps/_zombiemode_ai_quad.gsc new file mode 100644 index 0000000..7f75ae7 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_ai_quad.gsc @@ -0,0 +1,689 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include animscripts\zombie_Utility; +init() +{ + init_quad_zombie_anims(); + level.quad_spawners = GetEntArray( "quad_zombie_spawner", "script_noteworthy" ); + array_thread( level.quad_spawners, ::add_spawn_function, maps\_zombiemode_ai_quad::quad_prespawn ); +} +wait_for_leap() +{ + while ( 1 ) + { + wait( 5 ); + self.custom_attack = true; + wait( .5 ); + self.custom_attack = false; + } +} +#using_animtree( "generic_human" ); +quad_prespawn() +{ + self.animname = "quad_zombie"; + self.custom_idle_setup = maps\_zombiemode_ai_quad::quad_zombie_idle_setup; + self.a.idleAnimOverrideArray = []; + self.a.idleAnimOverrideArray["stand"] = []; + self.a.idleAnimOverrideArray["stand"] = []; + self.a.idleAnimOverrideArray["stand"][0][0] = %ai_zombie_quad_idle; + self.a.idleAnimOverrideWeights["stand"][0][0] = 10; + self.a.idleAnimOverrideArray["stand"][0][1] = %ai_zombie_quad_idle_2; + self.a.idleAnimOverrideWeights["stand"][0][1] = 10; + self.no_eye_glow = true; + self maps\_zombiemode_spawner::zombie_spawn_init( true ); + self.maxhealth = int( self.maxhealth * 0.75 ); + self.health = self.maxhealth; + self.freezegun_damage = 0; + self.meleeDamage = 45; + self playsound( "zmb_quad_spawn" ); + self.death_explo_radius_zomb = 96; + self.death_explo_radius_plr = 96; + self.death_explo_damage_zomb = 1.05; + self.death_gas_radius = 125; + self.death_gas_time = 7; + if ( isdefined( level.quad_explode ) && level.quad_explode == true ) + { + self.deathanimscript = ::quad_post_death; + self.actor_killed_override = ::quad_killed_override; + } + self set_default_attack_properties(); + self.thundergun_disintegrate_func = ::quad_thundergun_disintegrate; + self.thundergun_knockdown_func = ::quad_thundergun_knockdown; + self.pre_teleport_func = ::quad_pre_teleport; + self.post_teleport_func = ::quad_post_teleport; + self.can_explode = false; + self.exploded = false; + self thread quad_trail(); + self AllowPitchAngle(1); + if ( isdefined( level.quad_traverse_death_fx ) ) + { + self thread [[ level.quad_traverse_death_fx ]](); + } + self setPhysParams( 15, 0, 24 ); + self._bhb_walk_attract = ::quad_bhb_attract_walk; + self._bhb_run_attract = ::quad_bhb_attract_run; + self._bhb_horizon_death = ::quad_bhb_horizon_death; + if ( isdefined( level.quad_prespawn ) ) + { + self thread [[ level.quad_prespawn ]](); + } +} +quad_zombie_idle_setup() +{ + self.a.array["turn_left_45"] = %exposed_tracking_turn45L; + self.a.array["turn_left_90"] = %exposed_tracking_turn90L; + self.a.array["turn_left_135"] = %exposed_tracking_turn135L; + self.a.array["turn_left_180"] = %exposed_tracking_turn180L; + self.a.array["turn_right_45"] = %exposed_tracking_turn45R; + self.a.array["turn_right_90"] = %exposed_tracking_turn90R; + self.a.array["turn_right_135"] = %exposed_tracking_turn135R; + self.a.array["turn_right_180"] = %exposed_tracking_turn180L; + self.a.array["exposed_idle"] = array( %ai_zombie_quad_idle, %ai_zombie_quad_idle_2 ); + self.a.array["straight_level"] = %ai_zombie_quad_idle; + self.a.array["stand_2_crouch"] = %ai_zombie_shot_leg_right_2_crawl; +} +init_quad_zombie_anims() +{ + level.scr_anim["quad_zombie"]["death1"] = %ai_zombie_quad_death; + level.scr_anim["quad_zombie"]["death2"] = %ai_zombie_quad_death_2; + level.scr_anim["quad_zombie"]["death3"] = %ai_zombie_quad_death_3; + level.scr_anim["quad_zombie"]["death4"] = %ai_zombie_quad_death_4; + level.scr_anim["quad_zombie"]["walk1"] = %ai_zombie_quad_crawl; + level.scr_anim["quad_zombie"]["walk2"] = %ai_zombie_quad_crawl; + level.scr_anim["quad_zombie"]["walk3"] = %ai_zombie_quad_crawl; + level.scr_anim["quad_zombie"]["walk4"] = %ai_zombie_quad_crawl_2; + level.scr_anim["quad_zombie"]["walk5"] = %ai_zombie_quad_crawl_2; + level.scr_anim["quad_zombie"]["walk6"] = %ai_zombie_quad_crawl_3; + level.scr_anim["quad_zombie"]["walk7"] = %ai_zombie_quad_crawl_3; + level.scr_anim["quad_zombie"]["walk8"] = %ai_zombie_quad_crawl_3; + level.scr_anim["quad_zombie"]["run1"] = %ai_zombie_quad_crawl_run; + level.scr_anim["quad_zombie"]["run2"] = %ai_zombie_quad_crawl_run_2; + level.scr_anim["quad_zombie"]["run3"] = %ai_zombie_quad_crawl_run_3; + level.scr_anim["quad_zombie"]["run4"] = %ai_zombie_quad_crawl_run_4; + level.scr_anim["quad_zombie"]["run5"] = %ai_zombie_quad_crawl_run_5; + level.scr_anim["quad_zombie"]["run6"] = %ai_zombie_quad_crawl_run; + level.scr_anim["quad_zombie"]["sprint1"] = %ai_zombie_quad_crawl_sprint; + level.scr_anim["quad_zombie"]["sprint2"] = %ai_zombie_quad_crawl_sprint_2; + level.scr_anim["quad_zombie"]["sprint3"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["sprint4"] = %ai_zombie_quad_crawl_sprint; + level.scr_anim["quad_zombie"]["crawl1"] = %ai_zombie_quad_crawl_01; + level.scr_anim["quad_zombie"]["crawl2"] = %ai_zombie_quad_crawl_01; + level.scr_anim["quad_zombie"]["crawl3"] = %ai_zombie_quad_crawl_02; + level.scr_anim["quad_zombie"]["crawl4"] = %ai_zombie_quad_crawl_02; + level.scr_anim["quad_zombie"]["crawl5"] = %ai_zombie_quad_crawl_03; + level.scr_anim["quad_zombie"]["crawl6"] = %ai_zombie_quad_crawl_03; + level.scr_anim["quad_zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a; + level.scr_anim["quad_zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b; + level.scr_anim["quad_zombie"]["crawl_sprint1"] = %ai_zombie_crawl_sprint; + level.scr_anim["quad_zombie"]["crawl_sprint2"] = %ai_zombie_crawl_sprint_1; + level.scr_anim["quad_zombie"]["crawl_sprint3"] = %ai_zombie_crawl_sprint_2; + if( !isDefined( level._zombie_melee ) ) + { + level._zombie_melee = []; + } + if( !isDefined( level._zombie_walk_melee ) ) + { + level._zombie_walk_melee = []; + } + if( !isDefined( level._zombie_run_melee ) ) + { + level._zombie_run_melee = []; + } + level._zombie_melee["quad_zombie"] = []; + level._zombie_walk_melee["quad_zombie"] = []; + level._zombie_run_melee["quad_zombie"] = []; + level._zombie_melee["quad_zombie"][0] = %ai_zombie_quad_attack; + level._zombie_melee["quad_zombie"][1] = %ai_zombie_quad_attack_2; + level._zombie_melee["quad_zombie"][2] = %ai_zombie_quad_attack_3; + level._zombie_melee["quad_zombie"][3] = %ai_zombie_quad_attack_4; + level._zombie_melee["quad_zombie"][4] = %ai_zombie_quad_attack_5; + level._zombie_melee["quad_zombie"][5] = %ai_zombie_quad_attack_6; + level._zombie_melee["quad_zombie"][6] = %ai_zombie_quad_attack_double; + level._zombie_melee["quad_zombie"][7] = %ai_zombie_quad_attack_double_2; + level._zombie_melee["quad_zombie"][8] = %ai_zombie_quad_attack_double_3; + level._zombie_melee["quad_zombie"][9] = %ai_zombie_quad_attack_double_4; + level._zombie_melee["quad_zombie"][10] = %ai_zombie_quad_attack_double_5; + level._zombie_melee["quad_zombie"][11] = %ai_zombie_quad_attack_double_6; + if( isDefined( level.quad_zombie_anim_override ) ) + { + [[ level.quad_zombie_anim_override ]](); + } + if( !isDefined( level._zombie_melee_crawl ) ) + { + level._zombie_melee_crawl = []; + } + level._zombie_melee_crawl["quad_zombie"] = []; + level._zombie_melee_crawl["quad_zombie"][0] = %ai_zombie_attack_crawl; + level._zombie_melee_crawl["quad_zombie"][1] = %ai_zombie_attack_crawl_lunge; + if( !isDefined( level._zombie_stumpy_melee ) ) + { + level._zombie_stumpy_melee = []; + } + level._zombie_stumpy_melee["quad_zombie"] = []; + level._zombie_stumpy_melee["quad_zombie"][0] = %ai_zombie_walk_on_hands_shot_a; + level._zombie_stumpy_melee["quad_zombie"][1] = %ai_zombie_walk_on_hands_shot_b; + if( !isDefined( level._zombie_tesla_death ) ) + { + level._zombie_tesla_death = []; + } + level._zombie_tesla_death["quad_zombie"] = []; + level._zombie_tesla_death["quad_zombie"][0] = %ai_zombie_quad_death_tesla; + level._zombie_tesla_death["quad_zombie"][1] = %ai_zombie_quad_death_tesla_2; + level._zombie_tesla_death["quad_zombie"][2] = %ai_zombie_quad_death_tesla_3; + level._zombie_tesla_death["quad_zombie"][3] = %ai_zombie_quad_death_tesla_4; + if( !isDefined( level._zombie_tesla_crawl_death ) ) + { + level._zombie_tesla_crawl_death = []; + } + level._zombie_tesla_crawl_death["quad_zombie"] = []; + level._zombie_tesla_crawl_death["quad_zombie"][0] = %ai_zombie_tesla_crawl_death_a; + level._zombie_tesla_crawl_death["quad_zombie"][1] = %ai_zombie_tesla_crawl_death_b; + if( !isDefined( level._zombie_freezegun_death ) ) + { + level._zombie_freezegun_death = []; + } + level._zombie_freezegun_death["quad_zombie"] = []; + level._zombie_freezegun_death["quad_zombie"][0] = %ai_zombie_quad_freeze_death_a; + level._zombie_freezegun_death["quad_zombie"][1] = %ai_zombie_quad_freeze_death_b; + if( !isDefined( level._zombie_deaths ) ) + { + level._zombie_deaths = []; + } + level._zombie_deaths["quad_zombie"] = []; + level._zombie_deaths["quad_zombie"][0] = %ai_zombie_quad_death; + level._zombie_deaths["quad_zombie"][1] = %ai_zombie_quad_death_2; + level._zombie_deaths["quad_zombie"][2] = %ai_zombie_quad_death_3; + level._zombie_deaths["quad_zombie"][3] = %ai_zombie_quad_death_4; + level._zombie_deaths["quad_zombie"][4] = %ai_zombie_quad_death_5; + level._zombie_deaths["quad_zombie"][5] = %ai_zombie_quad_death_6; + if( !isDefined( level._zombie_rise_anims ) ) + { + level._zombie_rise_anims = []; + } + level._zombie_rise_anims["quad_zombie"] = []; + level._zombie_rise_anims["quad_zombie"][1]["walk"][0] = %ai_zombie_quad_traverse_ground_crawlfast; + level._zombie_rise_anims["quad_zombie"][1]["run"][0] = %ai_zombie_quad_traverse_ground_crawlfast; + level._zombie_rise_anims["quad_zombie"][1]["sprint"][0] = %ai_zombie_quad_traverse_ground_crawlfast; + level._zombie_rise_anims["quad_zombie"][2]["walk"][0] = %ai_zombie_quad_traverse_ground_crawlfast; + if( !isDefined( level._zombie_rise_death_anims ) ) + { + level._zombie_rise_death_anims = []; + } + level._zombie_rise_death_anims["quad_zombie"] = []; + level._zombie_rise_death_anims["quad_zombie"][1]["in"][0] = %ai_zombie_traverse_ground_v1_deathinside; + level._zombie_rise_death_anims["quad_zombie"][1]["in"][1] = %ai_zombie_traverse_ground_v1_deathinside_alt; + level._zombie_rise_death_anims["quad_zombie"][1]["out"][0] = %ai_zombie_traverse_ground_v1_deathoutside; + level._zombie_rise_death_anims["quad_zombie"][1]["out"][1] = %ai_zombie_traverse_ground_v1_deathoutside_alt; + level._zombie_rise_death_anims["quad_zombie"][2]["in"][0] = %ai_zombie_traverse_ground_v2_death_low; + level._zombie_rise_death_anims["quad_zombie"][2]["in"][1] = %ai_zombie_traverse_ground_v2_death_low_alt; + level._zombie_rise_death_anims["quad_zombie"][2]["out"][0] = %ai_zombie_traverse_ground_v2_death_high; + level._zombie_rise_death_anims["quad_zombie"][2]["out"][1] = %ai_zombie_traverse_ground_v2_death_high_alt; + if( !isDefined( level._zombie_run_taunt ) ) + { + level._zombie_run_taunt = []; + } + if( !isDefined( level._zombie_board_taunt ) ) + { + level._zombie_board_taunt = []; + } + level._zombie_run_taunt["quad_zombie"] = []; + level._zombie_board_taunt["quad_zombie"] = []; + level._zombie_board_taunt["quad_zombie"][0] = %ai_zombie_quad_taunt; + level._zombie_board_taunt["quad_zombie"][1] = %ai_zombie_quad_taunt_2; + level._zombie_board_taunt["quad_zombie"][2] = %ai_zombie_quad_taunt_3; + level._zombie_board_taunt["quad_zombie"][3] = %ai_zombie_quad_taunt_4; + level._zombie_board_taunt["quad_zombie"][4] = %ai_zombie_quad_taunt_5; + level._zombie_board_taunt["quad_zombie"][5] = %ai_zombie_quad_taunt_6; + level._effect[ "quad_explo_gas" ] = LoadFX( "maps/zombie/fx_zombie_quad_gas_nova6" ); + level._effect[ "quad_trail" ] = Loadfx( "maps/zombie/fx_zombie_quad_trail" ); +} +quad_vox() +{ + self endon( "death" ); + wait( 5 ); + quad_wait = 5; + while(1) + { + players = getplayers(); + for(i=0;i 1200 * 1200) + { + self playsound( "zmb_quad_amb" ); + quad_wait = 7; + } + else if(DistanceSquared(self.origin, players[i].origin) > 200 * 200) + { + self playsound( "zmb_quad_vox" ); + quad_wait = 5; + } + else if(DistanceSquared(self.origin, players[i].origin) < 150 * 150) + { + wait(.05); + } + } + wait randomfloatrange( 1, quad_wait ); + } +} +quad_close() +{ + self endon( "death" ); + while(1) + { + players = getplayers(); + for(i=0;i height_tolerance ) + { + z_check = false; + } + if ( dist > min_dist && dist < max_dist && self.nextSpecial < GetTime() && z_check ) + { + cansee = SightTracePassed( self.origin, self.enemy.origin, false, undefined ); + if( cansee ) + self set_leap_attack_properties(); + else + self set_default_attack_properties(); + } + else + { + self set_default_attack_properties(); + } + } +} +quad_zombie_think() +{ + self endon( "death" ); + self.specialAttack = maps\_zombiemode_ai_quad::TryLeap; + self.state = "waiting"; + self.isAttacking = false; + self.nextSpecial = GetTime(); + for (;;) + { + switch ( self.state ) + { + case "waiting": + check_wait(); + break; + case "leaping": + break; + } + wait_network_frame(); + } +} +trackCollision() +{ + self endon( "death" ); + self endon( "stop_coll" ); + while ( 1 ) + { + check = self GetHitEntType(); + if ( check != "none" ) + { + self thread quad_stop_leap(); + self notify( "stop_leap" ); + self notify( "stop_coll" ); + } + wait_network_frame(); + } +} +quad_finish_leap() +{ + self endon( "death" ); + self.state = "waiting"; + self.isAttacking = false; + self.nextSpecial = GetTime() + 3000; + self animMode("none"); + self.syncedMeleeTarget = undefined; + self OrientMode("face enemy"); + self thread animscripts\zombie_combat::main(); +} +quad_stop_leap() +{ + self endon( "death" ); + self SetFlaggedAnimKnobAllRestart("attack",%ai_zombie_quad_attack_leap_loop_out, %body, 1, .1, 1); + self animscripts\zombie_shared::DoNoteTracks( "attack" ); + self quad_finish_leap(); +} +quad_leap_attack() +{ + self endon( "death" ); + self endon( "stop_leap" ); + self.state = "leaping"; + self.isAttacking = true; + if( IsDefined( self.enemy ) ) + { + self.syncedMeleeTarget = self.enemy; + angles = VectorToAngles( self.enemy.origin - self.origin ); + self OrientMode( "face angle", angles[1] ); + } + self set_default_attack_properties(); + self.goalradius = 4; + self animMode("nogravity"); + leap_in = %ai_zombie_quad_attack_leap_loop_in; + delta = GetMoveDelta( leap_in, 0, 1 ); + self SetFlaggedAnimKnobAllRestart("attack",%ai_zombie_quad_attack_leap_loop_in, %body, 1, .1, 1); + animscripts\traverse\zombie_shared::wait_anim_length(leap_in, .02); + use_loop = false; + if ( use_loop ) + { + leap_loop = %ai_zombie_quad_attack_leap_loop; + self thread trackCollision(); + self SetFlaggedAnimKnobAllRestart("attack",leap_loop, %body, 1, .1, 1); + delta = GetMoveDelta( leap_loop, 0, 1 ); + anim_dist = length( delta ); + anim_time = getanimlength( leap_loop ); + rate = anim_dist / getanimlength( leap_loop ); + goal_dist = length( self.enemy.origin - self.origin ); + goal_dist -= 16; + animscripts\traverse\zombie_shared::wait_anim_length(leap_loop, .02); + } + self notify( "stop_coll" ); + leap_out = %ai_zombie_quad_attack_leap_attack; + if ( isdefined(self.enemy) ) + { + delta = self.enemy.origin - self.origin; + deltaF = ( delta[0], delta[1], 0 ); + attack_dist = length( deltaF ); + if ( attack_dist <= 64 ) + { + leap_out = %ai_zombie_quad_attack_leap_attack; + } + } + delta = GetMoveDelta( leap_out, 0, 1 ); + self SetFlaggedAnimKnobAllRestart("attack",leap_out, %body, 1, .1, 1); + while ( 1 ) + { + self waittill("attack", note); + if ( note == "end" ) + { + break; + } + else if ( note == "fire" ) + { + if ( !IsDefined( self.enemy ) ) + { + break; + } + oldhealth = self.enemy.health; + self melee(); + } + else if ( note == "gravity on" ) + { + self animMode("none"); + } + } + quad_finish_leap(); +} +TryLeap() +{ + if ( self.state == "leaping" ) + { + return true; + } + if ( !IsDefined( self.enemy ) ) + { + return false; + } + if ( DistanceSquared( self.origin, self.enemy.origin ) > 512*512 ) + { + animscripts\zombie_melee::debug_melee( "Not doing melee - Distance to enemy is more than 512 units." ); + return false; + } + if ( self.a.pose == "prone" ) + { + return false; + } + if ( !self.can_leap ) + { + return false; + } + self thread maps\_zombiemode_ai_quad::quad_leap_attack(); + self notify( "special_attack" ); + return true; +} +quad_thundergun_disintegrate( player ) +{ + self endon( "death" ); + self DoDamage( self.health + 666, player.origin, player ); +} +quad_thundergun_knockdown( player, gib ) +{ + self endon( "death" ); + damage = int( self.maxhealth * 0.5 ); + self DoDamage( damage, player.origin, player ); +} +quad_gas_explo_death() +{ + death_vars = []; + death_vars["explo_radius_zomb"] = self.death_explo_radius_zomb; + death_vars["explo_radius_plr"] = self.death_explo_radius_plr; + death_vars["explo_damage_zomb"] = self.death_explo_damage_zomb; + death_vars["gas_radius"] = self.death_gas_radius; + death_vars["gas_time"] = self.death_gas_time; + self thread quad_death_explo( self.origin, death_vars ); + level thread quad_gas_area_of_effect( self.origin, death_vars ); + self Delete(); +} +quad_death_explo( origin, death_vars ) +{ + playsoundatposition( "zmb_quad_explo", origin ); + PlayFx( level._effect["dog_gib"], origin ); + players = get_players(); + zombies = GetAIArray( "axis" ); + for(i = 0; i < players.size; i++) + { + if( Distance( origin, players[i].origin ) <= death_vars["explo_radius_plr"] ) + { + is_immune = false; + if ( isdefined( level.quad_gas_immune_func ) ) + { + is_immune = players[i] thread [[ level.quad_gas_immune_func ]](); + } + if ( !is_immune ) + { + players[i] ShellShock( "explosion", 2.5 ); + } + } + } + self.exploded = true; + self RadiusDamage( origin, death_vars["explo_radius_zomb"], level.zombie_health, level.zombie_health, self, "MOD_EXPLOSIVE" ); +} +quad_damage_func( player ) +{ + if ( self.exploded ) + { + return 0; + } + return self.meleeDamage; +} +quad_gas_area_of_effect( origin, death_vars ) +{ + effectArea = spawn( "trigger_radius", origin, 0, death_vars["gas_radius"], 100 ); + PlayFX( level._effect[ "quad_explo_gas" ], origin ); + gas_time = 0; + while( gas_time <= death_vars["gas_time"] ) + { + players = get_players(); + for(i = 0; i < players.size; i++) + { + is_immune = false; + if ( isdefined( level.quad_gas_immune_func ) ) + { + is_immune = players[i] thread [[ level.quad_gas_immune_func ]](); + } + if( players[i] IsTouching( effectArea ) && !is_immune ) + { + players[i] setblur( 4, .1 ); + } + else + { + players[i] setblur( 0, .5 ); + } + } + wait(1); + gas_time = gas_time + 1; + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[i] setblur( 0, .5 ); + } + effectArea Delete(); +} +quad_trail() +{ + self endon( "death" ); + self waittill( "quad_end_traverse_anim" ); + self.fx_quad_trail = Spawn( "script_model", self GetTagOrigin( "tag_origin" ) ); + self.fx_quad_trail.angles = self GetTagAngles( "tag_origin" ); + self.fx_quad_trail SetModel( "tag_origin" ); + self.fx_quad_trail LinkTo( self, "tag_origin" ); + maps\_zombiemode_net::network_safe_play_fx_on_tag( "quad_fx", 2, level._effect[ "quad_trail" ], self.fx_quad_trail, "tag_origin" ); +} +quad_post_death() +{ + if ( isdefined( self.fx_quad_trail ) ) + { + self.fx_quad_trail unlink(); + self.fx_quad_trail delete(); + } + if ( self.can_explode ) + { + self thread quad_gas_explo_death(); + } +} +quad_killed_override( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime ) +{ + if ( sMeansOfDeath == "MOD_PISTOL_BULLET" || sMeansOfDeath == "MOD_RIFLE_BULLET" ) + { + self.can_explode = true; + } + else + { + self.can_explode = false; + if ( isdefined( self.fx_quad_trail ) ) + { + self.fx_quad_trail unlink(); + self.fx_quad_trail delete(); + } + } + if(isDefined(level._override_quad_explosion)) + { + [[level._override_quad_explosion]](self); + } +} +quad_pre_teleport() +{ + if ( isDefined( self.fx_quad_trail ) ) + { + self.fx_quad_trail unlink(); + self.fx_quad_trail delete(); + wait( .1 ); + } +} +quad_post_teleport() +{ + if ( isDefined( self.fx_quad_trail ) ) + { + self.fx_quad_trail unlink(); + self.fx_quad_trail delete(); + } + if ( self.health > 0 ) + { + self.fx_quad_trail = Spawn( "script_model", self GetTagOrigin( "tag_origin" ) ); + self.fx_quad_trail.angles = self GetTagAngles( "tag_origin" ); + self.fx_quad_trail SetModel( "tag_origin" ); + self.fx_quad_trail LinkTo( self, "tag_origin" ); + maps\_zombiemode_net::network_safe_play_fx_on_tag( "quad_fx", 2, level._effect[ "quad_trail" ], self.fx_quad_trail, "tag_origin" ); + } +} +quad_bhb_attract_walk() +{ + self endon( "death" ); + flag_wait( "bhb_anim_change_allowed" ); + level._black_hole_bomb_zombies_anim_change = add_to_array( level._black_hole_bomb_zombies_anim_change, self, false ); + self ent_flag_wait( "bhb_anim_change" ); + self.a.runBlendTime = 0.9; + self clear_run_anim(); + rand = RandomIntRange( 1, 4 ); + self.needs_run_update = true; + self._had_legs = true; + self set_run_anim( "slow_pull_"+rand ); + self.run_combatanim = level.scr_anim[self.animname]["slow_pull_"+rand]; + self.crouchRunAnim = level.scr_anim[self.animname]["slow_pull_"+rand]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["slow_pull_"+rand]; + self._black_hole_attract_walk = 1; + self._bhb_change_anim_notified = 1; + self.a.runBlendTime = self._normal_run_blend_time; +} +quad_bhb_attract_run() +{ + self endon( "death" ); + rand = RandomIntRange( 1, 4 ); + flag_wait( "bhb_anim_change_allowed" ); + level._black_hole_bomb_zombies_anim_change = add_to_array( level._black_hole_bomb_zombies_anim_change, self, false ); + self ent_flag_wait( "bhb_anim_change" ); + self.a.runBlendTime = 0.9; + self clear_run_anim(); + self.needs_run_update = true; + self set_run_anim( "fast_pull_" + rand ); + self.run_combatanim = level.scr_anim[self.animname]["fast_pull_" + rand]; + self.crouchRunAnim = level.scr_anim[self.animname]["fast_pull_" + rand]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["fast_pull_" + rand]; + self._black_hole_attract_run = 1; + self._bhb_change_anim_notified = 1; + self.a.runBlendTime = self._normal_run_blend_time; +} +quad_bhb_horizon_death( bhb_org, poi_ent ) +{ + self endon( "death" ); + self playsound ("wpn_gersh_device_kill"); + rand_int = RandomIntRange( 1, 4 ); + anim_str = "black_hole_death_" + rand_int; + pulled_in_anim = level.scr_anim[self.animname][anim_str]; + self AnimScripted( "pulled_in_complete", self.origin, self.angles, pulled_in_anim ); + self waittill_either( "bhb_burst", "pulled_in_complete" ); + PlayFXOnTag( level._effect[ "black_hole_bomb_zombie_destroy" ], self, "tag_origin" ); + poi_ent notify( "black_hole_bomb_kill" ); + self DoDamage( self.health + 50, self.origin + ( 0, 0, 50 ), self._black_hole_bomb_tosser, "zombie_black_hole_bomb", "MOD_CRUSH" ); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_ai_sonic.gsc b/BO1/PC/ZM/maps/_zombiemode_ai_sonic.gsc new file mode 100644 index 0000000..8823930 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_ai_sonic.gsc @@ -0,0 +1,803 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include animscripts\zombie_Utility; +#include maps\_zombiemode_spawner; +#include maps\_zombiemode_net; +#using_animtree( "generic_human" ); +sonic_zombie_init() +{ + level.sonicZombiesEnabled = true; + level.sonicZombieMinRoundWait = 1; + level.sonicZombieMaxRoundWait = 3; + level.sonicZombieRoundRequirement = 4; + level.nextSonicSpawnRound = level.sonicZombieRoundRequirement + RandomIntRange(0, level.sonicZombieMaxRoundWait+1); + level.sonicPlayerDamage = 10; + level.sonicScreamDamageRadius = 300; + level.sonicScreamAttackRadius = 240; + level.sonicScreamAttackDebounceMin = 3; + level.sonicScreamAttackDebounceMax = 9; + level.sonicScreamAttackNext = 0; + level.sonicHealthMultiplier = 2.5; + level.sonic_zombie_spawners = GetEntArray( "sonic_zombie_spawner", "script_noteworthy" ); + if ( GetDvar("zombiemode_debug_sonic") == "" ) + { + SetDvar("zombiemode_debug_sonic", "0"); + } + set_zombie_var( "thundergun_knockdown_damage", 15 ); + level.thundergun_gib_refs = []; + level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "guts"; + level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "right_arm"; + level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "left_arm"; + array_thread(level.sonic_zombie_spawners, ::add_spawn_function, ::sonic_zombie_spawn); + array_thread(level.sonic_zombie_spawners, ::add_spawn_function, maps\_zombiemode::round_spawn_failsafe); + maps\_zombiemode_spawner::register_zombie_damage_callback( ::_sonic_damage_callback ); + _sonic_InitFX(); + _sonic_InitAnims(); + _sonic_InitSounds(); + thread _sonic_InitSpawners(); +} +_sonic_InitFX() +{ + level._effect["sonic_explosion"] = LoadFX( "maps/zombie_temple/fx_ztem_sonic_zombie" ); + level._effect["sonic_spawn"] = LoadFX( "maps/zombie_temple/fx_ztem_sonic_zombie_spawn" ); + level._effect["sonic_attack"] = LoadFX( "maps/zombie_temple/fx_ztem_sonic_zombie_attack" ); +} +_sonic_InitAnims() +{ + level.scr_anim["sonic_zombie"]["death1"] = %ai_zombie_sonic_death_03; + level.scr_anim["sonic_zombie"]["death2"] = %ai_zombie_sonic_death_02; + level.scr_anim["sonic_zombie"]["death3"] = %ai_zombie_sonic_death_03; + level.scr_anim["sonic_zombie"]["death4"] = %ai_zombie_sonic_death_02; + level.scream_attack_death = %ai_zombie_sonic_death_01; + level.scr_anim["sonic_zombie"]["walk1"] = %ai_zombie_sonic_run_01; + level.scr_anim["sonic_zombie"]["walk2"] = %ai_zombie_sonic_run_02; + level.scr_anim["sonic_zombie"]["walk3"] = %ai_zombie_sonic_run_03; + level.scr_anim["sonic_zombie"]["walk4"] = %ai_zombie_sonic_run_01; + level.scr_anim["sonic_zombie"]["walk5"] = %ai_zombie_sonic_run_02; + level.scr_anim["sonic_zombie"]["walk6"] = %ai_zombie_sonic_run_03; + level.scr_anim["sonic_zombie"]["walk7"] = %ai_zombie_sonic_run_01; + level.scr_anim["sonic_zombie"]["walk8"] = %ai_zombie_sonic_run_02; + level.scr_anim["sonic_zombie"]["run1"] = %ai_zombie_sonic_run_01; + level.scr_anim["sonic_zombie"]["run2"] = %ai_zombie_sonic_run_02; + level.scr_anim["sonic_zombie"]["run3"] = %ai_zombie_sonic_run_03; + level.scr_anim["sonic_zombie"]["run4"] = %ai_zombie_sonic_run_01; + level.scr_anim["sonic_zombie"]["run5"] = %ai_zombie_sonic_run_02; + level.scr_anim["sonic_zombie"]["run6"] = %ai_zombie_sonic_run_03; + level.scr_anim["sonic_zombie"]["sprint1"] = %ai_zombie_sonic_run_01; + level.scr_anim["sonic_zombie"]["sprint2"] = %ai_zombie_sonic_run_02; + level.scr_anim["sonic_zombie"]["sprint3"] = %ai_zombie_sonic_run_03; + level.scr_anim["sonic_zombie"]["sprint4"] = %ai_zombie_sonic_run_01; + level.scr_anim["sonic_zombie"]["crawl1"] = %ai_zombie_crawl; + level.scr_anim["sonic_zombie"]["crawl2"] = %ai_zombie_crawl_v1; + level.scr_anim["sonic_zombie"]["crawl3"] = %ai_zombie_crawl_v2; + level.scr_anim["sonic_zombie"]["crawl4"] = %ai_zombie_crawl_v3; + level.scr_anim["sonic_zombie"]["crawl5"] = %ai_zombie_crawl_v4; + level.scr_anim["sonic_zombie"]["crawl6"] = %ai_zombie_crawl_v5; + level.scr_anim["sonic_zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a; + level.scr_anim["sonic_zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b; + level.scr_anim["sonic_zombie"]["crawl_sprint1"] = %ai_zombie_crawl_sprint; + level.scr_anim["sonic_zombie"]["crawl_sprint2"] = %ai_zombie_crawl_sprint_1; + level.scr_anim["sonic_zombie"]["crawl_sprint3"] = %ai_zombie_crawl_sprint_2; + level.scr_anim["sonic_zombie"]["scream"] = []; + level.scr_anim["sonic_zombie"]["scream"][0] = %ai_zombie_sonic_attack_01; + level.scr_anim["sonic_zombie"]["scream"][1] = %ai_zombie_sonic_attack_02; + level.scr_anim["sonic_zombie"]["scream"][2] = %ai_zombie_sonic_attack_03; + level._zombie_melee["sonic_zombie"] = level._zombie_melee["zombie"]; + level._zombie_run_melee["sonic_zombie"] = level._zombie_run_melee["zombie"]; + level._zombie_walk_melee["sonic_zombie"] = level._zombie_walk_melee["zombie"]; + level._zombie_melee_crawl["sonic_zombie"] = level._zombie_melee_crawl["zombie"]; + level._zombie_stumpy_melee["sonic_zombie"] = level._zombie_stumpy_melee["zombie"]; + level._zombie_tesla_death["sonic_zombie"] = level._zombie_tesla_death["zombie"]; + level._zombie_tesla_crawl_death["sonic_zombie"] = level._zombie_tesla_crawl_death["zombie"]; + level._zombie_knockdowns["sonic_zombie"] = []; + level._zombie_knockdowns["sonic_zombie"]["front"] = []; + level._zombie_knockdowns["sonic_zombie"]["front"]["no_legs"] = []; + level._zombie_knockdowns["sonic_zombie"]["front"]["no_legs"][0] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["sonic_zombie"]["front"]["no_legs"][1] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["sonic_zombie"]["front"]["no_legs"][2] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"] = []; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][0] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][1] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][2] = %ai_zombie_thundergun_hit_upontoback; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][3] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][4] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][5] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][6] = %ai_zombie_thundergun_hit_stumblefall; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][7] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][8] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][9] = %ai_zombie_thundergun_hit_upontoback; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][10] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][11] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][12] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][13] = %ai_zombie_thundergun_hit_deadfallknee; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][14] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][15] = %ai_zombie_thundergun_hit_doublebounce; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][16] = %ai_zombie_thundergun_hit_upontoback; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][17] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][18] = %ai_zombie_thundergun_hit_armslegsforward; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][19] = %ai_zombie_thundergun_hit_forwardtoface; + level._zombie_knockdowns["sonic_zombie"]["front"]["has_legs"][20] = %ai_zombie_thundergun_hit_flatonback; + level._zombie_knockdowns["sonic_zombie"]["left"] = []; + level._zombie_knockdowns["sonic_zombie"]["left"][0] = %ai_zombie_thundergun_hit_legsout_right; + level._zombie_knockdowns["sonic_zombie"]["right"] = []; + level._zombie_knockdowns["sonic_zombie"]["right"][0] = %ai_zombie_thundergun_hit_legsout_left; + level._zombie_knockdowns["sonic_zombie"]["back"] = []; + level._zombie_knockdowns["sonic_zombie"]["back"][0] = %ai_zombie_thundergun_hit_faceplant; + level._zombie_getups["sonic_zombie"] = []; + level._zombie_getups["sonic_zombie"]["back"] = []; + level._zombie_getups["sonic_zombie"]["back"]["early"] = []; + level._zombie_getups["sonic_zombie"]["back"]["early"][0] = %ai_zombie_thundergun_getup_b; + level._zombie_getups["sonic_zombie"]["back"]["early"][1] = %ai_zombie_thundergun_getup_c; + level._zombie_getups["sonic_zombie"]["back"]["late"][0] = %ai_zombie_thundergun_getup_b; + level._zombie_getups["sonic_zombie"]["back"]["late"] = []; + level._zombie_getups["sonic_zombie"]["back"]["late"][1] = %ai_zombie_thundergun_getup_c; + level._zombie_getups["sonic_zombie"]["back"]["late"][2] = %ai_zombie_thundergun_getup_quick_b; + level._zombie_getups["sonic_zombie"]["back"]["late"][3] = %ai_zombie_thundergun_getup_quick_c; + level._zombie_getups["sonic_zombie"]["belly"] = []; + level._zombie_getups["sonic_zombie"]["belly"]["early"] = []; + level._zombie_getups["sonic_zombie"]["belly"]["early"][0] = %ai_zombie_thundergun_getup_a; + level._zombie_getups["sonic_zombie"]["belly"]["late"] = []; + level._zombie_getups["sonic_zombie"]["belly"]["late"][0] = %ai_zombie_thundergun_getup_a; + level._zombie_getups["sonic_zombie"]["belly"]["late"][1] = %ai_zombie_thundergun_getup_quick_a; + level._zombie_deaths["sonic_zombie"] = []; + level._zombie_deaths["sonic_zombie"][0] = %ai_zombie_sonic_death_01; + level._zombie_deaths["sonic_zombie"][1] = %ai_zombie_sonic_death_02; + level._zombie_deaths["sonic_zombie"][2] = %ai_zombie_sonic_death_03; + level._zombie_board_taunt["sonic_zombie"] = level._zombie_board_taunt["zombie"]; +} +_sonic_InitSounds() +{ + level.zmb_vox["sonic_zombie"] = []; + level.zmb_vox["sonic_zombie"]["ambient"] = "sonic_ambient"; + level.zmb_vox["sonic_zombie"]["sprint"] = "sonic_ambient"; + level.zmb_vox["sonic_zombie"]["attack"] = "sonic_attack"; + level.zmb_vox["sonic_zombie"]["teardown"] = "sonic_attack"; + level.zmb_vox["sonic_zombie"]["taunt"] = "sonic_ambient"; + level.zmb_vox["sonic_zombie"]["behind"] = "sonic_ambient"; + level.zmb_vox["sonic_zombie"]["death"] = "sonic_explode"; + level.zmb_vox["sonic_zombie"]["crawler"] = "sonic_ambient"; + level.zmb_vox["sonic_zombie"]["scream"] = "sonic_scream"; +} +_sonic_InitSpawners() +{ + flag_wait("zones_initialized"); + testOrigin = Spawn("script_model", (0,0,0)); + testOrigin SetModel("tag_origin"); + zkeys = GetArrayKeys(level.zones); + for ( z = 0; z < zkeys.size; z++ ) + { + zoneName = zkeys[z]; + zone = level.zones[zoneName]; + zone.sonic_spawn_locations = []; + } + spawnPoints = GetStructArray("special_zombie_spawn", "targetname"); + for ( i = 0; i < spawnPoints.size; i++ ) + { + s = spawnPoints[i]; + testOrigin.origin = s.origin + (0,0,50); + for ( z = 0; z < zkeys.size; z++ ) + { + zoneName = zkeys[z]; + zone = level.zones[zoneName]; + inZone = testOrigin _entity_in_zone(zone); + if ( inZone ) + { + s.zoneName = zoneName; + zone.sonic_spawn_locations = array_add(zone.sonic_spawn_locations, s); + } + } + } +} +_entity_in_zone(zone) +{ + for (i = 0; i < zone.volumes.size; i++) + { + if ( self IsTouching( zone.volumes[i] ) ) + { + return true; + } + } + return false; +} +sonic_zombie_spawn( animname_set ) +{ + zombie_spawn_init( animname_set ); + self.animname = "sonic_zombie"; + if(isdefined(level._CF_ACTOR_IS_SONIC_ZOMBIE)) + { + self SetClientFlag(level._CF_ACTOR_IS_SONIC_ZOMBIE); + } + self.maxhealth = int(self.maxhealth * level.sonicHealthMultiplier); + self.health = self.maxhealth; + self.gibbed = true; + self.ignore_enemy_count = true; + self.sonicScreamAttackDebounceMin = 6; + self.sonicScreamAttackDebounceMax = 10; + self.death_knockdown_range = 480; + self.death_gib_range = 360; + self.death_fling_range = 240; + self.death_scream_range = 480; + self _updateNextScreamTime(); + self.deathFunction = ::sonic_zombie_death; + self._zombie_shrink_callback = ::_sonic_Shrink; + self._zombie_unshrink_callback = ::_sonic_Unshrink; + self.thundergun_knockdown_func = maps\_zombiemode_spawner::zombie_knockdown; + self.monkey_bolt_taunts = ::sonic_monkey_bolt_taunts; + self maps\_zombiemode_spawner::set_zombie_run_cycle( "sprint"); + self thread _zombie_screamAttackThink(); + self thread _zombie_RunEffects(); + self thread _zombie_InitSideStep(); + self thread _zombie_death_watch(); + self thread sonic_zombie_count_watch(); + closest = GetClosest(self.origin, GetPlayers()); + angles = VectorToAngles(closest.origin - self.origin); + anchor = Spawn("script_origin", self.origin); + anchor.angles = (0,angles[1],0); + self linkto(anchor); + self Hide(); + self.a.disablepain = true; + self.rising = true; + self magic_bullet_shield(); + anim_org = self.origin + (0, 0, -45); + anchor MoveTo(anim_org, 0.05); + anchor waittill("movedone"); + anchor RotateTo((0,angles[1],0), 0.05); + anchor waittill("rotatedone"); + self Unlink(); + anchor Delete(); + self thread maps\_zombiemode_spawner::hide_pop(); + self playsound( "evt_sonic_spawn" ); + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "general", "sonic_spawn" ); + speed = "sprint"; + spawn_anim = random(level._zombie_rise_anims["zombie"][1][speed]); + time = getanimlength(spawn_anim); + speedUp = 1.5; + self animscripted("sonic_spawn", self.origin, self.angles, spawn_anim, "normal", %root, speedUp); + fxWait = 0.3; + wait(fxWait); + self PlaySound( "zmb_vocals_sonic_scream" ); + PlayFX( level._effect["sonic_spawn"], self.origin, (0,0,1) ); + wait( Max(0, time/speedUp - fxWait) ); + self.rising = false; + self stop_magic_bullet_shield(); + self.a.disablepain = true; +} +_zombie_InitSideStep() +{ + self.zombie_can_sidestep = true; + self.sideStepAnims["step_left"] = array( %ai_zombie_sonic_sidestep_left_a, %ai_zombie_sonic_sidestep_left_b ); + self.sideStepAnims["step_right"] = array( %ai_zombie_sonic_sidestep_right_a, %ai_zombie_sonic_sidestep_right_b ); + self.sideStepAnims["roll_forward"] = array( %ai_zombie_sonic_duck_a, %ai_zombie_sonic_duck_b, %ai_zombie_sonic_duck_c ); +} +_zombie_death_watch() +{ + self waittill("death"); + if(isdefined(level._CF_ACTOR_IS_SONIC_ZOMBIE)) + { + self ClearClientFlag(level._CF_ACTOR_IS_SONIC_ZOMBIE); + } +} +_zombie_ambient_sounds() +{ + self endon("death"); + while(1) + { + self maps\_zombiemode_audio::do_zombies_playvocals( "ambient", "sonic_zombie" ); + } +} +_updateNextScreamTime() +{ + self.sonicScreamAttackNext = GetTime(); + self.sonicScreamAttackNext += randomIntRange(self.sonicScreamAttackDebounceMin*1000, self.sonicScreamAttackDebounceMax*1000); +} +_canScreamNow() +{ + if(GetTime() > self.sonicScreamAttackNext) + { + return true; + } + return false; +} +_zombie_screamAttackThink() +{ + self endon("death"); + thinkDebounce = .1; + while( !isDefined(self.favoriteenemy) || !isPlayer(self.favoriteenemy)) + { + wait thinkDebounce; + } + while(true) + { + hasHead = !is_true(self.head_gibbed); + notMini = !is_true(self.shrinked); + screamTime = level _canScreamNow() && self _canScreamNow(); + if( screamTime && !self.ignoreAll && !is_true(self.is_traversing) && hasHead && notMini) + { + blurPlayers = self _zombie_any_players_in_blur_area(); + if(blurPlayers) + { + self _zombie_screamAttackAnim(); + } + } + wait thinkDebounce; + } +} +_zombie_getNearByPlayers() +{ + nearByPlayers = []; + radiusSqr = level.sonicScreamAttackRadius * level.sonicScreamAttackRadius; + players = get_players(); + for(i=0; i 70 ) + { + continue; + } + if( distance2dsquared(playerOrigin, self.origin) > radiusSqr ) + { + continue; + } + nearByPlayers[nearByPlayers.size] = players[i]; + } + return nearByPlayers; +} +_zombie_screamAttackAnim() +{ + level _updateNextScreamTime(); + self _updateNextScreamTime(); + self.deathanim = level.scream_attack_death; + scream_attack_anim = random(level.scr_anim["sonic_zombie"]["scream"]); + time = getAnimLength( scream_attack_anim ); + scream_attack_times = getnotetracktimes( scream_attack_anim, "fire" ); + self thread _zombie_screamAttack( scream_attack_times[0] * time ); + self animscripted( "sonic_zombie_scream", self.origin, self.angles, scream_attack_anim); + self _zombie_screamAttackAnim_wait(time); + self stopanimscripted(.5); + self _zombie_scream_attack_done(); + death_anims = level._zombie_deaths[self.animname]; + self.deathanim = random(death_anims); +} +_zombie_screamAttackAnim_wait(time) +{ + self endon("death"); + endTime = GetTime() + (time*1000); + while(GetTime() 70 ) + { + return false; + } + radiusSqr = level.sonicScreamDamageRadius * level.sonicScreamDamageRadius; + if( distance2dsquared(self.origin, sonic_zombie.origin) > radiusSqr ) + { + return false; + } + dirToPlayer = self.origin - sonic_zombie.origin; + dirToPlayer = vectornormalize(dirToPlayer); + sonicDir = anglestoforward(sonic_zombie.angles); + dot = vectordot(dirToPlayer, sonicDir); + if(dot<.4) + { + return false; + } + return true; +} +_zombie_any_players_in_blur_area() +{ + if(is_true(level.intermission)) + { + return false; + } + players = get_players(); + for(i=0;i knockdown_range_squared ) + { + return; + } + if ( !BulletTracePassed( center, test_origin, false, undefined ) ) + { + continue; + } + if ( test_range_squared < fling_range_squared ) + { + level.sonicZombie_fling_enemies[level.sonicZombie_fling_enemies.size] = zombies[i]; + dist_mult = (fling_range_squared - test_range_squared) / fling_range_squared; + fling_vec = VectorNormalize( test_origin - center ); + fling_vec = (fling_vec[0], fling_vec[1], abs( fling_vec[2] )); + fling_vec = vector_scale( fling_vec, 100 + 100 * dist_mult ); + level.sonicZombie_fling_vecs[level.sonicZombie_fling_vecs.size] = fling_vec; + } + else if ( test_range_squared < gib_range_squared ) + { + level.sonicZombie_knockdown_enemies[level.sonicZombie_knockdown_enemies.size] = zombies[i]; + level.sonicZombie_knockdown_gib[level.sonicZombie_knockdown_gib.size] = true; + } + else + { + level.sonicZombie_knockdown_enemies[level.sonicZombie_knockdown_enemies.size] = zombies[i]; + level.sonicZombie_knockdown_gib[level.sonicZombie_knockdown_gib.size] = false; + } + } +} +_sonicZombie_fling_zombie( player, fling_vec, index ) +{ + if( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + self DoDamage( self.health + 666, player.origin, player ); + if ( self.health <= 0 ) + { + points = 10; + if ( !index ) + { + points = maps\_zombiemode_score::get_zombie_death_player_points(); + } + else if ( 1 == index ) + { + points = 30; + } + player maps\_zombiemode_score::player_add_points( "thundergun_fling", points ); + self StartRagdoll(); + self LaunchRagdoll( fling_vec ); + } +} +_sonicZombie_knockdown_zombie( player, gib ) +{ + self endon( "death" ); + if( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + if ( IsDefined( self.thundergun_knockdown_func ) ) + { + self.lander_knockdown = 1; + self [[ self.thundergun_knockdown_func ]]( player, gib ); + } + else + { + if ( gib ) + { + self.a.gib_ref = random( level.thundergun_gib_refs ); + self thread animscripts\zombie_death::do_gib(); + } + self.thundergun_handle_pain_notetracks = maps\_zombiemode_weap_thundergun::handle_thundergun_pain_notetracks; + self DoDamage( 20, player.origin, player ); + } +} +_sonic_Shrink() +{ +} +_sonic_Unshrink() +{ +} +sonic_zombie_count_watch() +{ + if(!isDefined(level.sonicZombieCount)) + { + level.sonicZombieCount=0; + } + level.sonicZombieCount++; + self waittill("death"); + level.sonicZombieCount--; + if(is_true(self.shrinked)) + { + level.nextSonicSpawnRound = level.round_number + 1; + } + else + { + level.nextSonicSpawnRound = level.round_number + RandomIntRange(level.sonicZombieMinRoundWait, level.sonicZombieMaxRoundWait + 1); + } + attacker = self.attacker; + if ( isdefined( attacker ) && isplayer( attacker ) && is_true( attacker.screamAttackBlur ) ) + { + attacker notify( "blinded_by_the_fright_achieved" ); + } +} +_sonic_damage_callback( mod, hit_location, hit_origin, player, amount ) +{ + if(is_true(self.lander_knockdown)) + { + return false; + } + if ( self.classname == "actor_zombie_sonic" ) + { + if(!isDefined(self.damageCount)) + { + self.damageCount = 0; + } + if(self.damageCount % int(GetPlayers().size * level.sonicHealthMultiplier) == 0) + { + player maps\_zombiemode_score::player_add_points( "thundergun_fling", 10, hit_location, self.isdog ); + } + self.damageCount++; + self thread maps\_zombiemode_powerups::check_for_instakill( player, mod, hit_location ); + return true; + } + return false; +} +sonic_monkey_bolt_taunts(monkey_bolt) +{ + return is_true(self.rising); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_audio.gsc b/BO1/PC/ZM/maps/_zombiemode_audio.gsc new file mode 100644 index 0000000..6eeb251 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_audio.gsc @@ -0,0 +1,1146 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_music; +#include maps\_busing; +audio_init() +{ + level init_audio_aliases(); + level init_music_states(); + level thread init_audio_functions(); +} +init_audio_aliases() +{ + level.devil_vox = []; + level.devil_vox["prefix"] = "zmb_vox_ann_"; + level.devil_vox["powerup"] = []; + level.devil_vox["powerup"]["carpenter"] = "carpenter"; + level.devil_vox["powerup"]["insta_kill"] = "instakill"; + level.devil_vox["powerup"]["double_points"] = "doublepoints"; + level.devil_vox["powerup"]["nuke"] = "nuke"; + level.devil_vox["powerup"]["full_ammo"] = "maxammo"; + level.devil_vox["powerup"]["fire_sale"] = "firesale"; + level.devil_vox["powerup"]["fire_sale_short"] = "firesale_short"; + level.devil_vox["powerup"]["minigun"] = "death_machine"; + level.devil_vox["powerup"]["bonfire_sale"] = "bonfiresale"; + level.devil_vox["powerup"]["all_revive"] = undefined; + level.devil_vox["powerup"]["tesla"] = "tesla"; + level.devil_vox["powerup"]["random_weapon"] = "random_weapon"; + level.devil_vox["powerup"]["bonus_points_player"] = "points_positive"; + level.devil_vox["powerup"]["bonus_points_team"] = "points_positive"; + level.devil_vox["powerup"]["lose_points_team"] = "points_negative"; + level.devil_vox["powerup"]["lose_perk"] = "powerup_negative"; + level.devil_vox["powerup"]["empty_clip"] = "powerup_negative"; + level.plr_vox = []; + level.plr_vox["prefix"] = "vox_plr_"; + level.plr_vox["general"] = []; + level.plr_vox["general"]["crawl_spawn"] = "spawn_crawl"; + level.plr_vox["general"]["crawl_spawn_response"] = "resp_spawn_crawl"; + level.plr_vox["general"]["dog_spawn"] = "spawn_dog"; + level.plr_vox["general"]["dog_spawn_response"] = undefined; + level.plr_vox["general"]["quad_spawn"] = "spawn_quad"; + level.plr_vox["general"]["quad_spawn_response"] = undefined; + level.plr_vox["general"]["ammo_low"] = "ammo_low"; + level.plr_vox["general"]["ammo_low_response"] = undefined; + level.plr_vox["general"]["ammo_out"] = "ammo_out"; + level.plr_vox["general"]["ammo_out_response"] = undefined; + level.plr_vox["general"]["door_deny"] = "nomoney"; + level.plr_vox["general"]["door_deny_response"] = undefined; + level.plr_vox["general"]["perk_deny"] = "nomoney"; + level.plr_vox["general"]["perk_deny_response"] = undefined; + level.plr_vox["general"]["intro"] = "level_start"; + level.plr_vox["general"]["intro_response"] = undefined; + level.plr_vox["general"]["shoot_arm"] = "shoot_limb"; + level.plr_vox["general"]["shoot_arm_response"] = undefined; + level.plr_vox["general"]["box_move"] = "box_move"; + level.plr_vox["general"]["box_move_response"] = undefined; + level.plr_vox["general"]["no_money"] = "nomoney"; + level.plr_vox["general"]["no_money_response"] = undefined; + level.plr_vox["general"]["oh_shit"] = "ohshit"; + level.plr_vox["general"]["oh_shit_response"] = "resp_ohshit"; + level.plr_vox["general"]["revive_down"] = "revive_down"; + level.plr_vox["general"]["revive_down_response"] = undefined; + level.plr_vox["general"]["revive_up"] = "revive_up"; + level.plr_vox["general"]["revive_up_response"] = undefined; + level.plr_vox["general"]["crawl_hit"] = "crawler_hit"; + level.plr_vox["general"]["crawl_hit_response"] = undefined; + level.plr_vox["general"]["teleport_gersh"] = "teleport_gersh_device"; + level.plr_vox["general"]["teleport_gersh_response"] = undefined; + level.plr_vox["general"]["monkey_spawn"] = "monkey_start"; + level.plr_vox["general"]["monkey_spawn_response"] = undefined; + level.plr_vox["general"]["monkey_hit"] = "space_monkey_hit"; + level.plr_vox["general"]["monkey_hit_response"] = undefined; + level.plr_vox["general"]["sigh"] = "sigh"; + level.plr_vox["general"]["sigh_response"] = undefined; + level.plr_vox["general"]["zipline"] = "zipline"; + level.plr_vox["general"]["zipline_response"] = undefined; + level.plr_vox["general"]["water_damage"] = "damage_water"; + level.plr_vox["general"]["water_damage_response"] = undefined; + level.plr_vox["general"]["turret_active"] = "turret_active"; + level.plr_vox["general"]["turret_active_response"] = undefined; + level.plr_vox["general"]["turret_inactive"] = "turret_inactive"; + level.plr_vox["general"]["turret_inactive_response"] = undefined; + level.plr_vox["general"]["yes"] = "yes"; + level.plr_vox["general"]["yes_response"] = undefined; + level.plr_vox["general"]["no"] = "no"; + level.plr_vox["general"]["no_response"] = undefined; + level.plr_vox["general"]["uncertain"] = "uncertain"; + level.plr_vox["general"]["uncertain_response"] = undefined; + level.plr_vox["general"]["hitmed"] = "gen_hitmed"; + level.plr_vox["general"]["hitmed_response"] = undefined; + level.plr_vox["general"]["hitlrg"] = "gen_hitlrg"; + level.plr_vox["general"]["hitlrg_response"] = undefined; + level.plr_vox["catapult"] = []; + level.plr_vox["catapult"]["zombie"] = "catapult_zmb"; + level.plr_vox["catapult"]["zombie_response"] = undefined; + level.plr_vox["catapult"]["ally"] = "catapult_ally"; + level.plr_vox["catapult"]["ally_response"] = undefined; + level.plr_vox["catapult"]["rival"] = "catapult_rival"; + level.plr_vox["catapult"]["rival_response"] = undefined; + level.plr_vox["catapult"]["self"] = "catapult_self"; + level.plr_vox["catapult"]["self_response"] = undefined; + level.plr_vox["general"]["weather_good"] = "weather_good"; + level.plr_vox["general"]["weather_good_response"] = undefined; + level.plr_vox["general"]["weather_bad"] = "weather_bad"; + level.plr_vox["general"]["weather_bad_response"] = undefined; + level.plr_vox["director"] = []; + level.plr_vox["director"]["anger"] = "director_anger"; + level.plr_vox["director"]["anger_response"] = undefined; + level.plr_vox["director"]["weaken"] = "director_weaken"; + level.plr_vox["director"]["weaken_response"] = undefined; + level.plr_vox["director"]["water"] = "director_water"; + level.plr_vox["director"]["water_response"] = undefined; + level.plr_vox["director"]["exit"] = "director_exit"; + level.plr_vox["director"]["exit_response"] = undefined; + level.plr_vox["general"]["round_5"] = "round_5"; + level.plr_vox["general"]["round_5_response"] = undefined; + level.plr_vox["general"]["round_20"] = "round_20"; + level.plr_vox["general"]["round_20_response"] = undefined; + level.plr_vox["general"]["round_10"] = "round_10"; + level.plr_vox["general"]["round_10_response"] = undefined; + level.plr_vox["general"]["round_35"] = "round_35"; + level.plr_vox["general"]["round_35_response"] = undefined; + level.plr_vox["general"]["round_50"] = "round_50"; + level.plr_vox["general"]["round_50_response"] = undefined; + level.plr_vox["general"]["water_frozen"] = "damage_frozen"; + level.plr_vox["general"]["water_frozen_response"] = undefined; + level.plr_vox["general"]["react_sparkers"] = "react_sparkers"; + level.plr_vox["general"]["react_sparkers_response"] = undefined; + level.plr_vox["general"]["damage_shocked"] = "damage_shocked"; + level.plr_vox["general"]["damage_shocked_response"] = undefined; + level.plr_vox["general"]["react_sprinters"] = "react_sprinters"; + level.plr_vox["general"]["react_sprinters_response"] = undefined; + level.plr_vox["general"]["location_maze"] = "location_maze"; + level.plr_vox["general"]["location_maze_response"] = undefined; + level.plr_vox["general"]["location_waterfall"] = "location_waterfall"; + level.plr_vox["general"]["location_waterfall_response"] = undefined; + level.plr_vox["general"]["mine_see"] = "mine_see"; + level.plr_vox["general"]["mine_see_response"] = undefined; + level.plr_vox["general"]["mine_ride"] = "mine_ride"; + level.plr_vox["general"]["mine_ride_response"] = undefined; + level.plr_vox["general"]["spikes_close"] = "spikes_close"; + level.plr_vox["general"]["spikes_close_response"] = undefined; + level.plr_vox["general"]["spikes_damage"] = "spikes_dmg"; + level.plr_vox["general"]["spikes_damage_response"] = undefined; + level.plr_vox["general"]["geyser"] = "geyser"; + level.plr_vox["general"]["geyser_response"] = undefined; + level.plr_vox["general"]["slide"] = "slide"; + level.plr_vox["general"]["slide_response"] = undefined; + level.plr_vox["general"]["poweron"] = "power_on"; + level.plr_vox["general"]["poweron_response"] = undefined; + level.plr_vox["general"]["sonic_spawn"] = "sonic_spawn"; + level.plr_vox["general"]["sonic_spawn_response"] = undefined; + level.plr_vox["general"]["sonic_hit"] = "sonic_dmg"; + level.plr_vox["general"]["sonic_hit_response"] = undefined; + level.plr_vox["general"]["napalm_spawn"] = "napalm_spawn"; + level.plr_vox["general"]["napalm_spawn_response"] = undefined; + level.plr_vox["general"]["thief_steal"] = "thief_steal"; + level.plr_vox["general"]["thief_steal_response"] = undefined; + level.plr_vox["general"]["start"] = "start"; + level.plr_vox["general"]["start_response"] = undefined; + level.plr_vox["perk"] = []; + level.plr_vox["perk"]["specialty_armorvest"] = "perk_jugga"; + level.plr_vox["perk"]["specialty_armorvest_response"] = undefined; + level.plr_vox["perk"]["specialty_quickrevive"] = "perk_revive"; + level.plr_vox["perk"]["specialty_quickrevive_response"] = undefined; + level.plr_vox["perk"]["specialty_fastreload"] = "perk_speed"; + level.plr_vox["perk"]["specialty_fastreload_response"] = undefined; + level.plr_vox["perk"]["specialty_rof"] = "perk_doubletap"; + level.plr_vox["perk"]["specialty_rof_response"] = undefined; + level.plr_vox["perk"]["specialty_longersprint"] = "perk_stamin"; + level.plr_vox["perk"]["specialty_longersprint_response"] = undefined; + level.plr_vox["perk"]["specialty_flakjacket"] = "perk_phdflopper"; + level.plr_vox["perk"]["specialty_flakjacket_response"] = undefined; + level.plr_vox["perk"]["specialty_deadshot"] = "perk_deadshot"; + level.plr_vox["perk"]["specialty_deadshot_response"] = undefined; + level.plr_vox["perk"]["steal_specialty_armorvest"] = "perk_steal_jugga"; + level.plr_vox["perk"]["steal_specialty_armorvest_response"] = undefined; + level.plr_vox["perk"]["steal_specialty_quickrevive"] = "perk_steal_revive"; + level.plr_vox["perk"]["steal_specialty_quickrevive_response"] = undefined; + level.plr_vox["perk"]["steal_specialty_fastreload"] = "perk_steal_speed"; + level.plr_vox["perk"]["steal_specialty_fastreload_response"] = undefined; + level.plr_vox["perk"]["steal_specialty_longersprint"] = "perk_steal_stamin"; + level.plr_vox["perk"]["steal_specialty_longersprint_response"] = undefined; + level.plr_vox["perk"]["steal_specialty_flakjacket"] = "perk_steal_prone"; + level.plr_vox["perk"]["steal_specialty_flakjacket_response"] = undefined; + level.plr_vox["powerup"] = []; + level.plr_vox["powerup"]["nuke"] = "powerup_nuke"; + level.plr_vox["powerup"]["nuke_response"] = undefined; + level.plr_vox["powerup"]["insta_kill"] = "powerup_insta"; + level.plr_vox["powerup"]["insta_kill_response"] = undefined; + level.plr_vox["powerup"]["full_ammo"] = "powerup_ammo"; + level.plr_vox["powerup"]["full_ammo_response"] = undefined; + level.plr_vox["powerup"]["double_points"] = "powerup_double"; + level.plr_vox["powerup"]["double_points_response"] = undefined; + level.plr_vox["powerup"]["carpenter"] = "powerup_carp"; + level.plr_vox["powerup"]["carpenter_response"] = undefined; + level.plr_vox["powerup"]["firesale"] = "powerup_firesale"; + level.plr_vox["powerup"]["firesale_response"] = undefined; + level.plr_vox["powerup"]["minigun"] = "powerup_minigun"; + level.plr_vox["powerup"]["minigun_response"] = undefined; + level.plr_vox["kill"] = []; + level.plr_vox["kill"]["melee"] = "kill_melee"; + level.plr_vox["kill"]["melee_response"] = undefined; + level.plr_vox["kill"]["melee_instakill"] = "kill_insta"; + level.plr_vox["kill"]["melee_instakill_response"] = undefined; + level.plr_vox["kill"]["weapon_instakill"] = "kill_insta"; + level.plr_vox["kill"]["weapon_instakill_response"] = undefined; + level.plr_vox["kill"]["closekill"] = "kill_close"; + level.plr_vox["kill"]["closekill_response"] = undefined; + level.plr_vox["kill"]["damage"] = "kill_damaged"; + level.plr_vox["kill"]["damage_response"] = undefined; + level.plr_vox["kill"]["streak"] = "kill_streak"; + level.plr_vox["kill"]["streak_response"] = undefined; + level.plr_vox["kill"]["headshot"] = "kill_headshot"; + level.plr_vox["kill"]["headshot_response"] = "resp_kill_headshot"; + level.plr_vox["kill"]["explosive"] = "kill_explo"; + level.plr_vox["kill"]["explosive_response"] = undefined; + level.plr_vox["kill"]["flame"] = "kill_flame"; + level.plr_vox["kill"]["flame_response"] = undefined; + level.plr_vox["kill"]["raygun"] = "kill_ray"; + level.plr_vox["kill"]["raygun_response"] = undefined; + level.plr_vox["kill"]["bullet"] = "kill_streak"; + level.plr_vox["kill"]["bullet_response"] = undefined; + level.plr_vox["kill"]["tesla"] = "kill_tesla"; + level.plr_vox["kill"]["tesla_response"] = undefined; + level.plr_vox["kill"]["monkey"] = "kill_monkey"; + level.plr_vox["kill"]["monkey_response"] = undefined; + level.plr_vox["kill"]["thundergun"] = "kill_thunder"; + level.plr_vox["kill"]["thundergun_response"] = undefined; + level.plr_vox["kill"]["freeze"] = "kill_freeze"; + level.plr_vox["kill"]["freeze_response"] = undefined; + level.plr_vox["kill"]["crawler"] = "kill_crawler"; + level.plr_vox["kill"]["crawler_response"] = undefined; + level.plr_vox["kill"]["hellhound"] = "kill_hellhound"; + level.plr_vox["kill"]["hellhound_response"] = undefined; + level.plr_vox["kill"]["quad"] = "kill_quad"; + level.plr_vox["kill"]["quad_response"] = undefined; + level.plr_vox["kill"]["space_monkey"] = "kill_space_monkey"; + level.plr_vox["kill"]["space_monkey_response"] = undefined; + level.plr_vox["kill"]["gersh_device"] = "kill_gersh_device"; + level.plr_vox["kill"]["gersh_device_response"] = undefined; + level.plr_vox["kill"]["sickle"] = "kill_sickle"; + level.plr_vox["kill"]["sickle_response"] = undefined; + level.plr_vox["kill"]["human"] = "kill_human"; + level.plr_vox["kill"]["human_response"] = undefined; + level.plr_vox["kill"]["ubersniper"] = "kill_ubersniper"; + level.plr_vox["kill"]["ubersniper_response"] = undefined; + level.plr_vox["kill"]["dolls"] = "kill_dolls"; + level.plr_vox["kill"]["dolls_response"] = undefined; + level.plr_vox["kill"]["claymore"] = "kill_claymore"; + level.plr_vox["kill"]["claymore_response"] = undefined; + level.plr_vox["kill"]["sonic"] = "sonic_kill"; + level.plr_vox["kill"]["sonic_response"] = undefined; + level.plr_vox["kill"]["napalm"] = "napalm_kill"; + level.plr_vox["kill"]["napalm_response"] = undefined; + level.plr_vox["kill"]["shrink"] = "kill_shrink"; + level.plr_vox["kill"]["shrink_response"] = undefined; + level.plr_vox["kill"]["shrunken"] = "kill_shrunken"; + level.plr_vox["kill"]["shrunken_response"] = undefined; + level.plr_vox["kill"]["spikemore"] = "kill_spikemore"; + level.plr_vox["kill"]["spikemore_response"] = undefined; + level.plr_vox["kill"]["thief"] = "kill_thief"; + level.plr_vox["kill"]["thief_response"] = undefined; + level.plr_vox["weapon_pickup"] = []; + level.plr_vox["weapon_pickup"]["pistol"] = "wpck_crappy"; + level.plr_vox["weapon_pickup"]["pistol_response"] = undefined; + level.plr_vox["weapon_pickup"]["smg"] = "wpck_smg"; + level.plr_vox["weapon_pickup"]["smg_response"] = undefined; + level.plr_vox["weapon_pickup"]["dualwield"] = "wpck_dual"; + level.plr_vox["weapon_pickup"]["dualwield_response"] = undefined; + level.plr_vox["weapon_pickup"]["shotgun"] = "wpck_shotgun"; + level.plr_vox["weapon_pickup"]["shotgun_response"] = undefined; + level.plr_vox["weapon_pickup"]["rifle"] = "wpck_sniper"; + level.plr_vox["weapon_pickup"]["rifle_response"] = undefined; + level.plr_vox["weapon_pickup"]["burstrifle"] = "wpck_mg"; + level.plr_vox["weapon_pickup"]["burstrifle_response"] = undefined; + level.plr_vox["weapon_pickup"]["assault"] = "wpck_mg"; + level.plr_vox["weapon_pickup"]["assault_response"] = undefined; + level.plr_vox["weapon_pickup"]["sniper"] = "wpck_sniper"; + level.plr_vox["weapon_pickup"]["sniper_response"] = undefined; + level.plr_vox["weapon_pickup"]["mg"] = "wpck_mg"; + level.plr_vox["weapon_pickup"]["mg_response"] = undefined; + level.plr_vox["weapon_pickup"]["launcher"] = "wpck_launcher"; + level.plr_vox["weapon_pickup"]["launcher_response"] = undefined; + level.plr_vox["weapon_pickup"]["grenade"] = "wpck_grenade"; + level.plr_vox["weapon_pickup"]["grenade_response"] = undefined; + level.plr_vox["weapon_pickup"]["bowie"] = "wpck_bowie"; + level.plr_vox["weapon_pickup"]["bowie_response"] = undefined; + level.plr_vox["weapon_pickup"]["sickle"] = "wpck_sickle"; + level.plr_vox["weapon_pickup"]["sickle_response"] = undefined; + level.plr_vox["weapon_pickup"]["raygun"] = "wpck_raygun"; + level.plr_vox["weapon_pickup"]["raygun_response"] = undefined; + level.plr_vox["weapon_pickup"]["monkey"] = "wpck_monkey"; + level.plr_vox["weapon_pickup"]["monkey_response"] = "resp_wpck_monkey"; + level.plr_vox["weapon_pickup"]["tesla"] = "wpck_tesla"; + level.plr_vox["weapon_pickup"]["tesla_response"] = undefined; + level.plr_vox["weapon_pickup"]["thunder"] = "wpck_thunder"; + level.plr_vox["weapon_pickup"]["thunder_response"] = undefined; + level.plr_vox["weapon_pickup"]["freezegun"] = "wpck_freeze"; + level.plr_vox["weapon_pickup"]["freezegun_response"] = undefined; + level.plr_vox["weapon_pickup"]["crossbow"] = "wpck_launcher"; + level.plr_vox["weapon_pickup"]["crossbow_response"] = undefined; + level.plr_vox["weapon_pickup"]["upgrade"] = "wpck_upgrade"; + level.plr_vox["weapon_pickup"]["upgrade_response"] = undefined; + level.plr_vox["weapon_pickup"]["upgrade_wait"] = "wpck_upgrade_wait"; + level.plr_vox["weapon_pickup"]["upgrade_wait_response"] = undefined; + level.plr_vox["weapon_pickup"]["favorite"] = "wpck_favorite"; + level.plr_vox["weapon_pickup"]["favorite_response"] = undefined; + level.plr_vox["weapon_pickup"]["favorite_upgrade"] = "wpck_favorite_upgrade"; + level.plr_vox["weapon_pickup"]["favorite_upgrade_response"] = undefined; + level.plr_vox["weapon_pickup"]["sickle"] = "wpck_sickle"; + level.plr_vox["weapon_pickup"]["sickle_response"] = undefined; + level.plr_vox["weapon_pickup"]["dolls"] = "wpck_dolls"; + level.plr_vox["weapon_pickup"]["dolls_response"] = undefined; + level.plr_vox["weapon_pickup"]["gersh"] = "wpck_gersh_device"; + level.plr_vox["weapon_pickup"]["gersh_response"] = undefined; + level.plr_vox["weapon_pickup"]["human"] = "wpck_human"; + level.plr_vox["weapon_pickup"]["human_response"] = undefined; + level.plr_vox["weapon_pickup"]["ubersniper"] = "wpck_ubersniper"; + level.plr_vox["weapon_pickup"]["ubersniper_response"] = undefined; + level.plr_vox["weapon_pickup"]["shrink"] = "wpck_shrink"; + level.plr_vox["weapon_pickup"]["shrink_response"] = undefined; + level.plr_vox["weapon_pickup"]["spikemore"] = "wpck_spikemore"; + level.plr_vox["weapon_pickup"]["spikemore_response"] = undefined; + level.plr_vox["eggs"] = []; + level.plr_vox["eggs"]["achievement"] = "achievement"; + level.plr_vox["eggs"]["music_activate"] = "secret"; + level.plr_vox["eggs"]["meteors"] = "egg_pedastool"; + level.plr_vox["eggs"]["room_screen"] = "egg_room_screen"; + level.plr_vox["eggs"]["room_dress"] = "egg_room_dress"; + level.plr_vox["eggs"]["room_lounge"] = "egg_room_lounge"; + level.plr_vox["eggs"]["room_rest"] = "egg_room_rest"; + level.plr_vox["eggs"]["room_alley"] = "egg_room_alley"; + level.plr_vox["eggs"]["portrait_dempsey"] = "egg_port_dempsey"; + level.plr_vox["eggs"]["portrait_nikolai"] = "egg_port_nikolai"; + level.plr_vox["eggs"]["portrait_takeo"] = "egg_port_takeo"; + level.plr_vox["eggs"]["portrait_richtofan"] = "egg_port_richtofan"; + level.plr_vox["eggs"]["portrait_empty"] = "egg_port_empty"; + level.plr_vox["eggs"]["gersh_response"] = "cosmo_egg"; + level.plr_vox["eggs"]["coast_response"] = "egg_response"; + level.plr_vox["eggs"]["dolls"] = "egg_dolls"; + level.plr_vox["eggs"]["quest1"] = "quest_step1"; + level.plr_vox["eggs"]["quest2"] = "quest_step2"; + level.plr_vox["eggs"]["quest3"] = "quest_step3"; + level.plr_vox["eggs"]["quest4"] = "quest_step4"; + level.plr_vox["eggs"]["quest5"] = "quest_step5"; + level.plr_vox["eggs"]["quest6"] = "quest_step6"; + level.plr_vox["eggs"]["quest7"] = "quest_step7"; + level.plr_vox["eggs"]["quest8"] = "quest_step8"; + level.plr_vox["eggs"]["rod"] = "rod"; + level.zmb_vox = []; + level.zmb_vox["prefix"] = "zmb_vocals_"; + level.zmb_vox["zombie"] = []; + level.zmb_vox["zombie"]["ambient"] = "zombie_ambience"; + level.zmb_vox["zombie"]["sprint"] = "zombie_sprint"; + level.zmb_vox["zombie"]["attack"] = "zombie_attack"; + level.zmb_vox["zombie"]["teardown"] = "zombie_teardown"; + level.zmb_vox["zombie"]["taunt"] = "zombie_taunt"; + level.zmb_vox["zombie"]["behind"] = "zombie_behind"; + level.zmb_vox["zombie"]["death"] = "zombie_death"; + level.zmb_vox["zombie"]["crawler"] = "zombie_crawler"; + level.zmb_vox["quad_zombie"] = []; + level.zmb_vox["quad_zombie"]["ambient"] = "quad_ambience"; + level.zmb_vox["quad_zombie"]["sprint"] = "quad_sprint"; + level.zmb_vox["quad_zombie"]["attack"] = "quad_attack"; + level.zmb_vox["quad_zombie"]["behind"] = "quad_behind"; + level.zmb_vox["quad_zombie"]["death"] = "quad_death"; + level.zmb_vox["thief_zombie"] = []; + level.zmb_vox["thief_zombie"]["ambient"] = "thief_ambience"; + level.zmb_vox["thief_zombie"]["sprint"] = "thief_sprint"; + level.zmb_vox["thief_zombie"]["steal"] = "thief_steal"; + level.zmb_vox["thief_zombie"]["death"] = "thief_death"; + level.zmb_vox["thief_zombie"]["anger"] = "thief_anger"; + level.zmb_vox["boss_zombie"] = []; + level.zmb_vox["boss_zombie"]["ambient"] = "boss_ambience"; + level.zmb_vox["boss_zombie"]["sprint"] = "boss_sprint"; + level.zmb_vox["boss_zombie"]["attack"] = "boss_attack"; + level.zmb_vox["boss_zombie"]["behind"] = "boss_behind"; + level.zmb_vox["boss_zombie"]["death"] = "boss_death"; + level.zmb_vox["monkey_zombie"] = []; + level.zmb_vox["monkey_zombie"]["ambient"] = "monkey_ambience"; + level.zmb_vox["monkey_zombie"]["sprint"] = "monkey_sprint"; + level.zmb_vox["monkey_zombie"]["attack"] = "monkey_attack"; + level.zmb_vox["monkey_zombie"]["behind"] = "monkey_behind"; + level.zmb_vox["monkey_zombie"]["death"] = "monkey_death"; + if( isdefined( level._audio_alias_override ) ) + { + level thread [[level._audio_alias_override]](); + } +} +init_audio_functions() +{ + flag_wait( "all_players_connected" ); + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + players[i] thread zombie_behind_vox(); + players[i] thread player_killstreak_timer(); + players[i] thread oh_shit_vox(); + } +} +zombie_behind_vox() +{ + self endon("disconnect"); + self endon("death"); + if(!IsDefined(level._zbv_vox_last_update_time)) + { + level._zbv_vox_last_update_time = 0; + level._audio_zbv_shared_ent_list = GetAISpeciesArray("axis"); + } + while(1) + { + wait(1); + t = GetTime(); + if(t > level._zbv_vox_last_update_time + 1000) + { + level._zbv_vox_last_update_time = t; + level._audio_zbv_shared_ent_list = GetAISpeciesArray("axis"); + } + zombs = level._audio_zbv_shared_ent_list; + played_sound = false; + for(i=0;i 95) && abs( z_diff ) < 50 ) + { + zombs[i] thread maps\_zombiemode_audio::do_zombies_playvocals( "behind", zombs[i].animname ); + played_sound = true; + break; + } + } + } + if(played_sound) + { + wait(5); + } + } +} +attack_vox_network_choke() +{ + while(1) + { + level._num_attack_vox = 0; + wait_network_frame(); + } +} +do_zombies_playvocals( alias_type, zombie_type ) +{ + self endon( "death" ); + if( !IsDefined( zombie_type ) ) + { + zombie_type = "zombie"; + } + if( is_true( self.shrinked ) ) + { + return; + } + if( !IsDefined( self.talking ) ) + { + self.talking = false; + } + if( !IsDefined( level.zmb_vox[zombie_type] ) ) + { + return; + } + if( !IsDefined( level.zmb_vox[zombie_type][alias_type] ) ) + { + return; + } + if(alias_type == "attack") + { + if(!IsDefined(level._num_attack_vox)) + { + level thread attack_vox_network_choke(); + } + if(level._num_attack_vox > 4) + { + return; + } + level._num_attack_vox ++; + } + alias = level.zmb_vox["prefix"] + level.zmb_vox[zombie_type][alias_type]; + if( alias_type == "attack" || alias_type == "behind" || alias_type == "death" || alias_type == "anger" || alias_type == "steal" ) + { + self PlaySound( alias ); + } + else if( !self.talking ) + { + self.talking = true; + self PlaySound( alias, "sounddone" ); + self waittill( "sounddone" ); + self.talking = false; + } +} +oh_shit_vox() +{ + self endon("disconnect"); + self endon("death"); + while(1) + { + wait(1); + players = getplayers(); + zombs = GetAISpeciesArray("axis"); + if( players.size > 1 ) + { + close_zombs = 0; + for( i=0; i 4 ) + { + if( randomintrange( 0, 20 ) < 5 ) + { + self create_and_play_dialog( "general", "oh_shit" ); + wait(4); + } + } + } + } +} +create_and_play_dialog( category, type, response, force_variant, override ) +{ + waittime = .25; + if( !IsDefined( level.plr_vox[category][type] ) ) + { + return; + } + if( self maps\_laststand::player_is_in_laststand() && ( type != "revive_down" || type != "revive_up" ) ) + { + return; + } + alias_suffix = level.plr_vox[category][type]; + if( IsDefined( response ) ) + alias_suffix = response + alias_suffix; + index = maps\_zombiemode_weapons::get_player_index(self); + if( is_true( level.player_4_vox_override ) && index == 3 ) + { + index = 4; + } + prefix = level.plr_vox["prefix"] + index + "_"; + if( !IsDefined ( self.sound_dialog ) ) + { + self.sound_dialog = []; + self.sound_dialog_available = []; + } + if ( !IsDefined ( self.sound_dialog[ alias_suffix ] ) ) + { + num_variants = maps\_zombiemode_spawner::get_number_variants( prefix + alias_suffix ); + if( num_variants <= 0 ) + { + return; + } + for( i = 0; i < num_variants; i++ ) + { + self.sound_dialog[ alias_suffix ][ i ] = i; + } + self.sound_dialog_available[ alias_suffix ] = []; + } + if ( self.sound_dialog_available[ alias_suffix ].size <= 0 ) + { + self.sound_dialog_available[ alias_suffix ] = self.sound_dialog[ alias_suffix ]; + } + variation = random( self.sound_dialog_available[ alias_suffix ] ); + self.sound_dialog_available[ alias_suffix ] = array_remove( self.sound_dialog_available[ alias_suffix ], variation ); + if( IsDefined( force_variant ) ) + { + variation = force_variant; + } + if( !IsDefined( override ) ) + { + override = false; + } + sound_to_play = alias_suffix + "_" + variation; + if( isdefined( level._audio_custom_player_playvox ) ) + { + self thread [[level._audio_custom_player_playvox]]( prefix, index, sound_to_play, waittime, category, type, override ); + } + else + { + self thread do_player_playvox( prefix, index, sound_to_play, waittime, category, type, override ); + } +} +do_player_playvox( prefix, index, sound_to_play, waittime, category, type, override ) +{ + players = getplayers(); + if( !IsDefined( level.player_is_speaking ) ) + { + level.player_is_speaking = 0; + } + if( is_true(level.skit_vox_override) && !override ) + return; + if( level.player_is_speaking != 1 ) + { + level.player_is_speaking = 1; + self playsound( prefix + sound_to_play, "sound_done" + sound_to_play ); + self waittill( "sound_done" + sound_to_play ); + wait( waittime ); + level.player_is_speaking = 0; + if( !flag( "solo_game" ) && ( isdefined (level.plr_vox[category][type + "_response"] ))) + { + if ( isDefined( level._audio_custom_response_line ) ) + { + level thread [[ level._audio_custom_response_line ]]( self, index, category, type ); + } + else + { + level thread setup_response_line( self, index, category, type ); + } + } + } +} +setup_response_line( player, index, category, type ) +{ + Dempsey = 0; + Nikolai = 1; + Takeo = 2; + Richtofen = 3; + switch( player.entity_num ) + { + case 0: + level setup_hero_rival( player, Nikolai, Richtofen, category, type ); + break; + case 1: + level setup_hero_rival( player, Richtofen, Takeo, category, type ); + break; + case 2: + level setup_hero_rival( player, Dempsey, Nikolai, category, type ); + break; + case 3: + level setup_hero_rival( player, Takeo, Dempsey, category, type ); + break; + } + return; +} +setup_hero_rival( player, hero, rival, category, type ) +{ + players = getplayers(); + playHero = false; + playRival = false; + hero_player = undefined; + rival_player = undefined; + for ( i = 0; i < players.size; i++ ) + { + if ( players[i].entity_num == hero ) + { + playHero = true; + hero_player = players[i]; + } + if ( players[i].entity_num == rival ) + { + playRival = true; + rival_player = players[i]; + } + } + if(playHero && playRival) + { + if(randomfloatrange(0,1) < .5) + { + playRival = false; + } + else + { + playHero = false; + } + } + if( playHero && IsDefined( hero_player ) ) + { + if( distancesquared (player.origin, hero_player.origin) < 500*500) + { + hero_player create_and_play_dialog( category, type + "_response", "hr_" ); + } + else if( isdefined( rival_player ) ) + { + playRival = true; + } + } + if( playRival && IsDefined( rival_player ) ) + { + if( distancesquared (player.origin, rival_player.origin) < 500*500) + { + rival_player create_and_play_dialog( category, type + "_response", "riv_" ); + } + } +} +do_announcer_playvox( category ) +{ + if( !IsDefined( category ) ) + return; + if( !IsDefined( level.devil_is_speaking ) ) + { + level.devil_is_speaking = 0; + } + alias = level.devil_vox["prefix"] + category; + if( level.devil_is_speaking == 0 ) + { + level.devil_is_speaking = 1; + level play_sound_2D( alias ); + wait 2.0; + level.devil_is_speaking =0; + } +} +player_killstreak_timer() +{ + self endon("disconnect"); + self endon("death"); + if(getdvar ("zombie_kills") == "") + { + setdvar ("zombie_kills", "7"); + } + if(getdvar ("zombie_kill_timer") == "") + { + setdvar ("zombie_kill_timer", "5"); + } + kills = GetDvarInt( #"zombie_kills"); + time = GetDvarInt( #"zombie_kill_timer"); + if (!isdefined (self.timerIsrunning)) + { + self.timerIsrunning = 0; + } + while(1) + { + self waittill( "zom_kill", zomb ); + if( IsDefined( zomb._black_hole_bomb_collapse_death ) && zomb._black_hole_bomb_collapse_death == 1 ) + { + continue; + } + if( is_true( zomb.microwavegun_death ) ) + { + continue; + } + self.killcounter ++; + if (self.timerIsrunning != 1) + { + self.timerIsrunning = 1; + self thread timer_actual(kills, time); + } + } +} +player_zombie_kill_vox( hit_location, player, mod, zombie ) +{ + weapon = player GetCurrentWeapon(); + dist = DistanceSquared( player.origin, zombie.origin ); + if( !isdefined(level.zombie_vars["zombie_insta_kill"] ) ) + level.zombie_vars["zombie_insta_kill"] = 0; + instakill = level.zombie_vars["zombie_insta_kill"]; + death = get_mod_type( hit_location, mod, weapon, zombie, instakill, dist, player ); + chance = get_mod_chance( death ); + if( !IsDefined( player.force_wait_on_kill_line ) ) + player.force_wait_on_kill_line = false; + if( ( chance > RandomIntRange( 1, 100 ) ) && player.force_wait_on_kill_line == false ) + { + player.force_wait_on_kill_line = true; + player create_and_play_dialog( "kill", death ); + wait(2); + player.force_wait_on_kill_line = false; + } +} +get_mod_chance( meansofdeath ) +{ + chance = undefined; + switch( meansofdeath ) + { + case "sickle": chance = 40; break; + case "melee": chance = 40; break; + case "melee_instakill": chance = 99; break; + case "weapon_instakill": chance = 10; break; + case "explosive": chance = 60; break; + case "flame": chance = 60; break; + case "raygun": chance = 75; break; + case "headshot": chance = 99; break; + case "crawler": chance = 30; break; + case "quad": chance = 30; break; + case "astro": chance = 99; break; + case "closekill": chance = 15; break; + case "bullet": chance = 10; break; + case "claymore": chance = 99; break; + case "dolls": chance = 99; break; + case "default": chance = 1; break; + } + return chance; +} +get_mod_type( impact, mod, weapon, zombie, instakill, dist, player ) +{ + close_dist = 64 * 64; + far_dist = 400 * 400; + if( IsDefined( zombie._black_hole_bomb_collapse_death ) && zombie._black_hole_bomb_collapse_death == 1 ) + { + return "default"; + } + if( is_placeable_mine( weapon ) ) + { + if( !instakill ) + return "claymore"; + else + return "weapon_instakill"; + } + if( ( mod == "MOD_MELEE" || + mod == "MOD_BAYONET" || + mod == "MOD_UNKNOWN" ) && + dist < close_dist ) + { + if( !instakill ) + { + if( player HasWeapon( "sickle_knife_zm" ) ) + return "sickle"; + else + return "melee"; + } + else + return "melee_instakill"; + } + if( IsDefined( zombie.damageweapon ) && zombie.damageweapon == "zombie_nesting_doll_single" ) + { + if( !instakill ) + return "dolls"; + else + return "weapon_instakill"; + } + if( ( mod == "MOD_GRENADE" || + mod == "MOD_GRENADE_SPLASH" || + mod == "MOD_PROJECTILE_SPLASH" || + mod == "MOD_EXPLOSIVE" ) && + weapon != "ray_gun_zm" ) + { + if( !instakill ) + return "explosive"; + else + return "weapon_instakill"; + } + if( ( IsSubStr( weapon, "flame" ) || + IsSubStr( weapon, "molotov_" ) || + IsSubStr( weapon, "napalmblob_" ) ) && + ( mod == "MOD_BURNED" || + mod == "MOD_GRENADE" || + mod == "MOD_GRENADE_SPLASH" ) ) + { + if( !instakill ) + return "flame"; + else + return "weapon_instakill"; + } + if( weapon == "ray_gun_zm" && + dist > far_dist ) + { + if( !instakill ) + return "raygun"; + else + return "weapon_instakill"; + } + if( ( mod == "MOD_RIFLE_BULLET" || + mod == "MOD_PISTOL_BULLET" ) && + ( impact == "head" && + dist > far_dist && + !instakill ) ) + { + return "headshot"; + } + if( mod != "MOD_MELEE" && + impact != "head" && + zombie.animname == "quad_zombie" && + !instakill ) + { + return "quad"; + } + if( mod != "MOD_MELEE" && + impact != "head" && + zombie.animname == "astro_zombie" && + !instakill ) + { + return "astro"; + } + if( mod != "MOD_MELEE" && + impact != "head" && + !zombie.has_legs && + !instakill ) + { + return "crawler"; + } + if( mod != "MOD_BURNED" && + dist < close_dist && + !instakill ) + { + return "closekill"; + } + if( mod == "MOD_RIFLE_BULLET" || + mod == "MOD_PISTOL_BULLET" ) + { + if( !instakill ) + return "bullet"; + else + return "weapon_instakill"; + } + return "default"; +} +timer_actual(kills, time) +{ + self endon("disconnect"); + self endon("death"); + timer = gettime() + (time * 1000); + while(getTime() < timer) + { + if (self.killcounter > kills) + { + self create_and_play_dialog( "kill", "streak" ); + wait(1); + self.killcounter = 0; + timer = -1; + } + wait(0.1); + } + self.killcounter = 0; + self.timerIsrunning = 0; +} +perks_a_cola_jingle_timer() +{ + self endon( "death" ); + self thread play_random_broken_sounds(); + while(1) + { + wait(randomfloatrange(31,45)); + if(randomint(100) < 15) + { + self thread play_jingle_or_stinger(self.script_sound); + } + } +} +play_jingle_or_stinger( perksacola ) +{ + playsoundatposition ("evt_electrical_surge", self.origin); + if(!IsDefined (self.jingle_is_playing )) + { + self.jingle_is_playing = 0; + } + if (IsDefined ( perksacola )) + { + if(self.jingle_is_playing == 0 && level.music_override == false) + { + self.jingle_is_playing = 1; + self playsound ( perksacola, "sound_done"); + self waittill ("sound_done"); + self.jingle_is_playing = 0; + } + } +} +play_random_broken_sounds() +{ + self endon( "death" ); + level endon ("jingle_playing"); + if (!isdefined (self.script_sound)) + { + self.script_sound = "null"; + } + if (self.script_sound == "mus_perks_revive_jingle") + { + while(1) + { + wait(randomfloatrange(7, 18)); + playsoundatposition ("zmb_perks_broken_jingle", self.origin); + playsoundatposition ("evt_electrical_surge", self.origin); + } + } + else + { + while(1) + { + wait(randomfloatrange(7, 18)); + playsoundatposition ("evt_electrical_surge", self.origin); + } + } +} +perk_vox( perk ) +{ + self endon( "death" ); + self endon( "disconnect" ); + wait( 1.5 ); + if( !IsDefined( level.plr_vox["perk"][perk] ) ) + { + return; + } + self create_and_play_dialog( "perk", perk ); +} +dialog_debugger( category, type ) +{ +} +init_music_states() +{ + level.music_override = false; + level.music_round_override = false; + level.old_music_state = undefined; + level.zmb_music_states = []; + level.zmb_music_states["round_start"] = spawnStruct(); + level.zmb_music_states["round_start"].music = "mus_zombie_round_start"; + level.zmb_music_states["round_start"].is_alias = true; + level.zmb_music_states["round_start"].override = true; + level.zmb_music_states["round_start"].round_override = true; + level.zmb_music_states["round_start"].musicstate = "WAVE"; + level.zmb_music_states["round_end"] = spawnStruct(); + level.zmb_music_states["round_end"].music = "mus_zombie_round_over"; + level.zmb_music_states["round_end"].is_alias = true; + level.zmb_music_states["round_end"].override = true; + level.zmb_music_states["round_end"].round_override = true; + level.zmb_music_states["round_end"].musicstate = "SILENCE"; + level.zmb_music_states["wave_loop"] = spawnStruct(); + level.zmb_music_states["wave_loop"].music = "WAVE"; + level.zmb_music_states["wave_loop"].is_alias = false; + level.zmb_music_states["wave_loop"].override = true; + level.zmb_music_states["game_over"] = spawnStruct(); + level.zmb_music_states["game_over"].music = "mus_zombie_game_over"; + level.zmb_music_states["game_over"].is_alias = true; + level.zmb_music_states["game_over"].override = false; + level.zmb_music_states["game_over"].musicstate = "SILENCE"; + level.zmb_music_states["dog_start"] = spawnStruct(); + level.zmb_music_states["dog_start"].music = "mus_zombie_dog_start"; + level.zmb_music_states["dog_start"].is_alias = true; + level.zmb_music_states["dog_start"].override = true; + level.zmb_music_states["dog_end"] = spawnStruct(); + level.zmb_music_states["dog_end"].music = "mus_zombie_dog_end"; + level.zmb_music_states["dog_end"].is_alias = true; + level.zmb_music_states["dog_end"].override = true; + level.zmb_music_states["egg"] = spawnStruct(); + level.zmb_music_states["egg"].music = "EGG"; + level.zmb_music_states["egg"].is_alias = false; + level.zmb_music_states["egg"].override = false; + level.zmb_music_states["egg_safe"] = spawnStruct(); + level.zmb_music_states["egg_safe"].music = "EGG_SAFE"; + level.zmb_music_states["egg_safe"].is_alias = false; + level.zmb_music_states["egg_safe"].override = false; + level.zmb_music_states["egg_a7x"] = spawnStruct(); + level.zmb_music_states["egg_a7x"].music = "EGG_A7X"; + level.zmb_music_states["egg_a7x"].is_alias = false; + level.zmb_music_states["egg_a7x"].override = false; + level.zmb_music_states["sam_reveal"] = spawnStruct(); + level.zmb_music_states["sam_reveal"].music = "SAM"; + level.zmb_music_states["sam_reveal"].is_alias = false; + level.zmb_music_states["sam_reveal"].override = false; +} +change_zombie_music( state ) +{ + wait(.05); + m = level.zmb_music_states[state]; + if( !IsDefined( m ) ) + { + return; + } + do_logic = true; + if( !IsDefined( level.old_music_state ) ) + { + do_logic = false; + } + if(do_logic) + { + if( level.old_music_state == m ) + { + return; + } + else if( level.old_music_state.music == "mus_zombie_game_over" ) + { + return; + } + } + if( !IsDefined( m.round_override ) ) + m.round_override = false; + if( m.override == true && level.music_override == true ) + return; + if( m.round_override == true && level.music_round_override == true ) + return; + if( m.is_alias ) + { + if( IsDefined( m.musicstate ) ) + setmusicstate( m.musicstate ); + play_sound_2d( m.music ); + } + else + { + setmusicstate( m.music ); + } + level.old_music_state = m; +} +weapon_toggle_vox( alias, weapon ) +{ + self notify( "audio_activated_trigger" ); + self endon( "audio_activated_trigger" ); + prefix = "vox_pa_switcher_"; + sound_to_play = prefix + alias; + type = undefined; + if( IsDefined( weapon ) ) + { + type = get_weapon_num( weapon ); + if( !IsDefined( type ) ) + { + return; + } + } + self StopSounds(); + wait(.05); + if( IsDefined( type ) ) + { + self PlaySound( prefix + "weapon_" + type, "sounddone" ); + self waittill( "sounddone" ); + } + self PlaySound( sound_to_play + "_0" ); +} +get_weapon_num( weapon ) +{ + weapon_num = undefined; + switch( weapon ) + { + case "humangun_zm": + weapon_num = 0; + break; + case "sniper_explosive_zm": + weapon_num = 1; + break; + case "tesla_gun_zm": + weapon_num = 2; + break; + } + return weapon_num; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_auto_turret.gsc b/BO1/PC/ZM/maps/_zombiemode_auto_turret.gsc new file mode 100644 index 0000000..8b12406 Binary files /dev/null and b/BO1/PC/ZM/maps/_zombiemode_auto_turret.gsc differ diff --git a/BO1/PC/ZM/maps/_zombiemode_betty.gsc b/BO1/PC/ZM/maps/_zombiemode_betty.gsc new file mode 100644 index 0000000..fa53a2c Binary files /dev/null and b/BO1/PC/ZM/maps/_zombiemode_betty.gsc differ diff --git a/BO1/PC/ZM/maps/_zombiemode_blockers.gsc b/BO1/PC/ZM/maps/_zombiemode_blockers.gsc new file mode 100644 index 0000000..258f273 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_blockers.gsc @@ -0,0 +1,2367 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#using_animtree( "generic_human" ); +init() +{ + init_blockers(); + if ( isdefined( level.quantum_bomb_register_result_func ) ) + { + [[level.quantum_bomb_register_result_func]]( "open_nearest_door", ::quantum_bomb_open_nearest_door_result, 35, ::quantum_bomb_open_nearest_door_validation ); + } +} +init_blockers() +{ + level.exterior_goals = getstructarray( "exterior_goal", "targetname" ); + for( i = 0; i < level.exterior_goals.size; i++ ) + { + level.exterior_goals[i] thread blocker_init(); + } + zombie_doors = GetEntArray( "zombie_door", "targetname" ); + for( i = 0; i < zombie_doors.size; i++ ) + { + zombie_doors[i] thread door_init(); + } + zombie_debris = GetEntArray( "zombie_debris", "targetname" ); + for( i = 0; i < zombie_debris.size; i++ ) + { + zombie_debris[i] thread debris_init(); + } + flag_blockers = GetEntArray( "flag_blocker", "targetname" ); + for( i = 0; i < flag_blockers.size; i++ ) + { + flag_blockers[i] thread flag_blocker(); + } + window_shutter = GetEntArray( "window_shutter", "targetname" ); + for( i = 0; i < window_shutter.size; i++ ) + { + window_shutter[i] thread shutter_init(); + } +} +door_init() +{ + self.type = undefined; + self._door_open = false; + targets = GetEntArray( self.target, "targetname" ); + if( isDefined(self.script_flag) && !IsDefined( level.flag[self.script_flag] ) ) + { + if( IsDefined( self.script_flag ) ) + { + tokens = Strtok( self.script_flag, "," ); + for ( i=0; i "+self.script_animname ); + AssertEx( IsDefined( level.blocker_anim_func ), "Blocker_init: You must define a level.blocker_anim_func" ); + break; + case "counter_1s": + parent_trig.counter_1s = self; + return; + case "counter_10s": + parent_trig.counter_10s = self; + return; + case "counter_100s": + parent_trig.counter_100s = self; + return; + case "explosives": + if ( !IsDefined(parent_trig.explosives) ) + { + parent_trig.explosives = []; + } + parent_trig.explosives[parent_trig.explosives.size] = self; + return; + } + } + if ( self.classname == "script_brushmodel" ) + { + self DisconnectPaths(); + } + parent_trig.doors[parent_trig.doors.size] = self; +} +door_buy() +{ + self waittill( "trigger", who, force ); + if ( GetDvarInt( #"zombie_unlock_all") > 0 || is_true( force ) ) + { + return true; + } + if( !who UseButtonPressed() ) + { + return false; + } + if( who in_revive_trigger() ) + { + return false; + } + if( is_player_valid( who ) ) + { + players = get_players(); + if ( players.size == 1 && who.score >= self.zombie_cost ) + { + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); + } + else if( level.team_pool[ who.team_num ].score >= self.zombie_cost ) + { + who maps\_zombiemode_score::minus_to_team_score( self.zombie_cost ); + } + else if( level.team_pool[ who.team_num ].score + who.score >= self.zombie_cost ) + { + team_points = level.team_pool[ who.team_num ].score; + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost - team_points ); + who maps\_zombiemode_score::minus_to_team_score( team_points ); + } + else + { + play_sound_at_pos( "no_purchase", self.doors[0].origin ); + who maps\_zombiemode_audio::create_and_play_dialog( "general", "door_deny", undefined, 0 ); + return false; + } + bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type door", who.playername, who.score, level.team_pool[ who.team_num ].score, level.round_number, self.zombie_cost, self.script_flag, self.origin ); + } + return true; +} +door_delay() +{ + if ( IsDefined( self.explosives ) ) + { + for ( i=0; i steps_per_stage * stage_num ) + { + stage_num++; + } + if ( num_stages - stage_num == 0 ) + { + ones = kills_remaining % 10; + } + else + { + ones = i % 10; + } + self.counter_1s set_counter( ones ); + if ( IsDefined( self.counter_10s ) ) + { + if ( num_stages - stage_num <= 1 ) + { + tens = int( kills_remaining / 10 ); + } + else + { + tens = i % 10; + } + self.counter_10s set_counter( tens ); + } + if ( IsDefined( self.counter_100s ) ) + { + if ( num_stages - stage_num <= 1 ) + { + hundreds = int( kills_remaining / 100 ); + } + else + { + hundreds = i % 10; + } + self.counter_100s set_counter( hundreds ); + } + level.kill_counter_hud SetValue( hundreds*100 + tens*10 + ones ); + wait (0.1); + } + level.kill_counter_hud FadeOverTime( 1.0 ); + level.kill_counter_hud.color = ( 0.21, 0, 0 ); + while ( level.total_zombies_killed < self.kill_goal ) + { + kills_remaining = self.kill_goal - level.total_zombies_killed; + self.counter_1s set_counter( kills_remaining % 10 ); + if ( IsDefined( self.counter_10s ) ) + { + self.counter_10s set_counter( int( kills_remaining / 10 ) ); + } + if ( IsDefined( self.counter_100s ) ) + { + self.counter_100s set_counter( int( kills_remaining / 100 ) ); + } + level.kill_counter_hud SetValue( kills_remaining ); + level waittill( "zom_kill" ); + } + players = GetPlayers(); + for (i=0; i= 0.5 ) + { + self MoveTo( self.origin + vector, time, time * 0.25, time * 0.25 ); + } + else + { + self MoveTo( self.origin + vector, time ); + } + self thread door_solid_thread(); + if ( !open ) + { + self thread disconnect_paths_when_done(); + } + } + wait(randomfloat(.15)); + break; + case "anim": + self [[ level.blocker_anim_func ]]( self.script_animname ); + self thread door_solid_thread_anim(); + wait(randomfloat(.15)); + break; + case "physics": + self thread physics_launch_door( self ); + wait(0.10); + break; + } +} +door_think() +{ + self endon("kill_door_think"); + cost = 1000; + if( IsDefined( self.zombie_cost ) ) + { + cost = self.zombie_cost; + } + while( 1 ) + { + switch( self.script_noteworthy ) + { + case "electric_door": + flag_wait( "power_on" ); + break; + case "electric_buyable_door": + flag_wait( "power_on" ); + self set_hint_string( self, "default_buy_door_" + cost ); + if ( !self door_buy() ) + { + continue; + } + break; + case "delay_door": + if ( !self door_buy() ) + { + continue; + } + self door_delay( cost ); + break; + case "kill_counter_door": + if ( !self door_buy() ) + { + continue; + } + self door_kill_counter(); + break; + default: + if ( !self door_buy() ) + { + continue; + } + break; + } + self door_opened(); + break; + } + self._door_open = true; + self notify("door_opened"); +} +door_opened() +{ + if( IsDefined( self.script_flag ) ) + { + tokens = Strtok( self.script_flag, "," ); + for ( i=0; i 0 || is_true( force ) ) + { + } + else + { + if( !who UseButtonPressed() ) + { + continue; + } + if( who in_revive_trigger() ) + { + continue; + } + } + if( is_player_valid( who ) ) + { + players = get_players(); + if(GetDvarInt( #"zombie_unlock_all") > 0) + { + } + else if ( players.size == 1 && who.score >= self.zombie_cost ) + { + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); + } + else if( level.team_pool[ who.team_num ].score >= self.zombie_cost ) + { + who maps\_zombiemode_score::minus_to_team_score( self.zombie_cost ); + } + else if( level.team_pool[ who.team_num ].score + who.score >= self.zombie_cost ) + { + team_points = level.team_pool[ who.team_num ].score; + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost - team_points ); + who maps\_zombiemode_score::minus_to_team_score( team_points ); + } + else + { + play_sound_at_pos( "no_purchase", self.origin ); + who maps\_zombiemode_audio::create_and_play_dialog( "general", "door_deny", undefined, 1 ); + continue; + } + bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type door", who.playername, who.score, level.team_pool[ who.team_num ].score, level.round_number, self.zombie_cost, self.script_flag, self.origin ); + junk = getentarray( self.target, "targetname" ); + if( IsDefined( self.script_flag ) ) + { + tokens = Strtok( self.script_flag, "," ); + for ( i=0; i 3) + { + wait(0.05); + } + } + level._blocker_choke ++; + if( all_chunks_intact( self.barrier_chunks ) ) + { + continue; + } + if( no_valid_repairable_boards( self.barrier_chunks ) ) + { + continue; + } + self blocker_trigger_think(); + } +} +blocker_trigger_think() +{ + cost = 10; + if( IsDefined( self.zombie_cost ) ) + { + cost = self.zombie_cost; + } + original_cost = cost; + radius = 96; + height = 96; + if( IsDefined( self.trigger_location ) ) + { + trigger_location = self.trigger_location; + } + else + { + trigger_location = self; + } + if( IsDefined( trigger_location.radius ) ) + { + radius = trigger_location.radius; + } + if( IsDefined( trigger_location.height ) ) + { + height = trigger_location.height; + } + trigger_pos = groundpos( trigger_location.origin ) + ( 0, 0, 4 ); + trigger = Spawn( "trigger_radius", trigger_pos, 0, radius, height ); + trigger thread trigger_delete_on_repair(); + if(IsDefined(level._zombiemode_blocker_trigger_extra_thread)) + { + trigger thread [[level._zombiemode_blocker_trigger_extra_thread]](); + } + trigger set_hint_string( self, "default_reward_barrier_piece" ); + trigger SetCursorHint( "HINT_NOICON" ); + while( 1 ) + { + trigger waittill( "trigger", player ); + if( player hasperk( "specialty_fastreload" ) ) + { + has_perk = "specialty_fastreload"; + } + else + { + has_perk = undefined; + } + if( all_chunks_intact( self.barrier_chunks ) ) + { + trigger notify("all_boards_repaired"); + return; + } + if( no_valid_repairable_boards( self.barrier_chunks ) ) + { + trigger notify("no valid boards"); + return; + } + players = GetPlayers(); + while( 1 ) + { + if( !player IsTouching( trigger ) ) + { + break; + } + if( !is_player_valid( player ) ) + { + break; + } + if( player in_revive_trigger() ) + { + break; + } + if( players.size == 1 && IsDefined( players[0].intermission ) && players[0].intermission == 1) + { + break; + } + if( player hacker_active() ) + { + break; + } + if( !player use_button_held() ) + { + break; + } + chunk = get_random_destroyed_chunk( self.barrier_chunks ); + if(IsDefined(chunk.script_parameter) && chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents") + { + if(IsDefined(chunk.unbroken_section)) + { + chunk Show(); + chunk Solid(); + chunk.unbroken_section self_delete(); + } + } + else + { + chunk Show(); + } + if ( !isDefined( chunk.script_parameters ) || chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents") + { + if(!is_true(level.use_clientside_board_fx)) + { + if( !IsDefined( chunk.material ) || ( IsDefined( chunk.material ) && chunk.material != "rock" ) ) + { + chunk play_sound_on_ent( "rebuild_barrier_piece" ); + } + playsoundatposition ("zmb_cha_ching", (0,0,0)); + } + } + if ( chunk.script_parameters == "bar" ) + { + chunk play_sound_on_ent( "rebuild_barrier_piece" ); + playsoundatposition ("zmb_cha_ching", (0,0,0)); + } + if(isdefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "bar" ) + { + if(isdefined(chunk.script_noteworthy)) + { + if(chunk.script_noteworthy == "5") + { + chunk hide(); + } + else if(chunk.script_noteworthy == "3" ) + { + chunk hide(); + } + } + } + } + self thread replace_chunk( chunk, has_perk ); + assert( IsDefined( self.clip ) ); + self.clip enable_trigger(); + self.clip DisconnectPaths(); + bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type repair", player.playername, player.score, level.team_pool[ player.team_num ].score, level.round_number, original_cost, self.target, self.origin ); + if( !self script_delay() ) + { + wait( 1 ); + } + if( !is_player_valid( player ) ) + { + break; + } + player.rebuild_barrier_reward += cost; + if( player.rebuild_barrier_reward < level.zombie_vars["rebuild_barrier_cap_per_round"] ) + { + player maps\_zombiemode_score::player_add_points( "rebuild_board", cost ); + player play_sound_on_ent( "purchase" ); + } + if(IsDefined(player.board_repair)) + { + player.board_repair += 1; + } + if( all_chunks_intact( self.barrier_chunks ) ) + { + trigger notify("all_boards_repaired"); + return; + } + if( no_valid_repairable_boards( self.barrier_chunks ) ) + { + trigger notify("no valid boards"); + return; + } + } + } +} +random_destroyed_chunk_show( ) +{ + wait( 0.5 ); + self Show(); +} +door_repaired_rumble_n_sound() +{ + players = GetPlayers(); + for(i = 0; i < players.size; i++) + { + if (distance (players[i].origin, self.origin) < 150) + { + if(isalive(players[i])) + { + players[i] thread board_completion(); + } + } + } +} +board_completion() +{ + self endon ("disconnect"); +} +trigger_delete_on_repair() +{ + while( IsDefined( self ) ) + { + self waittill_either("all_boards_repaired", "no valid boards"); + self thread door_repaired_rumble_n_sound(); + self delete(); + break; + } +} +blocker_doubler_hint( hint, original_cost ) +{ + self endon( "death" ); + doubler_status = level.zombie_vars["zombie_powerup_point_doubler_on"]; + while( 1 ) + { + wait( 0.5 ); + if( doubler_status != level.zombie_vars["zombie_powerup_point_doubler_on"] ) + { + doubler_status = level.zombie_vars["zombie_powerup_point_doubler_on"]; + cost = original_cost; + if( level.zombie_vars["zombie_powerup_point_doubler_on"] ) + { + cost = original_cost * 2; + } + self set_hint_string( self, hint + cost ); + } + } +} +rebuild_barrier_reward_reset() +{ + self.rebuild_barrier_reward = 0; +} +remove_chunk( chunk, node, destroy_immediately, zomb ) +{ + chunk update_states("mid_tear"); + if(IsDefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents") + { + chunk thread zombie_boardtear_audio_offset(chunk); + } + } + if(IsDefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "bar" ) + { + chunk thread zombie_bartear_audio_offset(chunk); + } + } + chunk NotSolid(); + fx = "wood_chunk_destory"; + if( IsDefined( self.script_fxid ) ) + { + fx = self.script_fxid; + } + if ( IsDefined( chunk.script_moveoverride ) && chunk.script_moveoverride ) + { + chunk Hide(); + } + if ( IsDefined( chunk.script_parameters ) && ( chunk.script_parameters == "bar" ) ) + { + if( IsDefined ( chunk.script_noteworthy ) && ( chunk.script_noteworthy == "4" ) ) + { + ent = Spawn( "script_origin", chunk.origin ); + ent.angles = node.angles +( 0, 180, 0 ); + dist = 100; + if(IsDefined(chunk.script_move_dist)) + { + dist_max = chunk.script_move_dist - 100; + dist = 100 + RandomInt(dist_max); + } + else + { + dist = 100 + RandomInt( 100 ); + } + dest = ent.origin + ( AnglesToForward( ent.angles ) * dist ); + trace = BulletTrace( dest + ( 0, 0, 16 ), dest + ( 0, 0, -200 ), false, undefined ); + if( trace["fraction"] == 1 ) + { + dest = dest + ( 0, 0, -200 ); + } + else + { + dest = trace["position"]; + } + chunk LinkTo( ent ); + time = ent fake_physicslaunch( dest, 300 + RandomInt( 100 ) ); + if( RandomInt( 100 ) > 40 ) + { + ent RotatePitch( 180, time * 0.5 ); + } + else + { + ent RotatePitch( 90, time, time * 0.5 ); + } + wait( time ); + chunk Hide(); + wait( 0.1); + ent Delete(); + } + else + { + ent = Spawn( "script_origin", chunk.origin ); + ent.angles = node.angles +( 0, 180, 0 ); + dist = 100; + if(IsDefined(chunk.script_move_dist)) + { + dist_max = chunk.script_move_dist - 100; + dist = 100 + RandomInt(dist_max); + } + else + { + dist = 100 + RandomInt( 100 ); + } + dest = ent.origin + ( AnglesToForward( ent.angles ) * dist ); + trace = BulletTrace( dest + ( 0, 0, 16 ), dest + ( 0, 0, -200 ), false, undefined ); + if( trace["fraction"] == 1 ) + { + dest = dest + ( 0, 0, -200 ); + } + else + { + dest = trace["position"]; + } + chunk LinkTo( ent ); + time = ent fake_physicslaunch( dest, 260 + RandomInt( 100 ) ); + if( RandomInt( 100 ) > 40 ) + { + ent RotatePitch( 180, time * 0.5 ); + } + else + { + ent RotatePitch( 90, time, time * 0.5 ); + } + wait( time ); + chunk Hide(); + wait( 0.1); + ent Delete(); + } + chunk update_states("destroyed"); + chunk notify( "destroyed" ); + } + if ( IsDefined ( chunk.script_parameters ) && chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) + { + ent = Spawn( "script_origin", chunk.origin ); + ent.angles = node.angles +( 0, 180, 0 ); + dist = 100; + if(IsDefined(chunk.script_move_dist)) + { + dist_max = chunk.script_move_dist - 100; + dist = 100 + RandomInt(dist_max); + } + else + { + dist = 100 + RandomInt( 100 ); + } + dest = ent.origin + ( AnglesToForward( ent.angles ) * dist ); + trace = BulletTrace( dest + ( 0, 0, 16 ), dest + ( 0, 0, -200 ), false, undefined ); + if( trace["fraction"] == 1 ) + { + dest = dest + ( 0, 0, -200 ); + } + else + { + dest = trace["position"]; + } + chunk LinkTo( ent ); + time = ent fake_physicslaunch( dest, 200 + RandomInt( 100 ) ); + if(IsDefined(chunk.unbroken_section)) + { + if(!IsDefined(chunk.material) || chunk.material != "metal") + { + chunk.unbroken_section self_delete(); + } + } + if( RandomInt( 100 ) > 40 ) + { + ent RotatePitch( 180, time * 0.5 ); + } + else + { + ent RotatePitch( 90, time, time * 0.5 ); + } + wait( time ); + if(IsDefined(chunk.unbroken_section)) + { + if(IsDefined(chunk.material) && chunk.material == "metal") + { + chunk.unbroken_section self_delete(); + } + } + chunk Hide(); + wait( 0.1); + ent Delete(); + chunk update_states("destroyed"); + chunk notify( "destroyed" ); + } + if ( IsDefined ( chunk.script_parameters ) && ( chunk.script_parameters == "grate" ) ) + { + if( IsDefined ( chunk.script_noteworthy ) && ( chunk.script_noteworthy == "6" ) ) + { + ent = Spawn( "script_origin", chunk.origin ); + ent.angles = node.angles +( 0, 180, 0 ); + dist = 100 + RandomInt( 100 ); + dest = ent.origin + ( AnglesToForward( ent.angles ) * dist ); + trace = BulletTrace( dest + ( 0, 0, 16 ), dest + ( 0, 0, -200 ), false, undefined ); + if( trace["fraction"] == 1 ) + { + dest = dest + ( 0, 0, -200 ); + } + else + { + dest = trace["position"]; + } + chunk LinkTo( ent ); + time = ent fake_physicslaunch( dest, 200 + RandomInt( 100 ) ); + if( RandomInt( 100 ) > 40 ) + { + ent RotatePitch( 180, time * 0.5 ); + } + else + { + ent RotatePitch( 90, time, time * 0.5 ); + } + wait( time ); + chunk Hide(); + ent Delete(); + chunk update_states("destroyed"); + chunk notify( "destroyed" ); + } + else + { + chunk Hide(); + chunk update_states("destroyed"); + chunk notify( "destroyed" ); + } + } +} +remove_chunk_rotate_grate( chunk ) +{ + if( IsDefined (chunk.script_parameters) && chunk.script_parameters == "grate" ) + { + chunk vibrate(( 0, 270, 0 ), 0.2, 0.4, 0.4); + return; + } +} +zombie_boardtear_audio_offset(chunk) +{ + if( IsDefined(chunk.material) && !IsDefined( chunk.already_broken ) ) + chunk.already_broken = false; + if( IsDefined(chunk.material) && chunk.material == "glass" && chunk.already_broken == false ) + { + chunk PlaySound( "zmb_break_glass_barrier" ); + wait( randomfloat( 0.3, 0.6 )); + chunk PlaySound( "zmb_break_glass_barrier" ); + chunk.already_broken = true; + } + else if( IsDefined(chunk.material) && chunk.material == "metal" && chunk.already_broken == false ) + { + chunk PlaySound( "grab_metal_bar" ); + wait( randomfloat( 0.3, 0.6 )); + chunk PlaySound( "break_metal_bar" ); + chunk.already_broken = true; + } + else if( IsDefined(chunk.material) && chunk.material == "rock" ) + { + if(!is_true(level.use_clientside_rock_tearin_fx)) + { + chunk PlaySound( "zmb_break_rock_barrier" ); + wait( randomfloat( 0.3, 0.6 )); + chunk PlaySound( "zmb_break_rock_barrier" ); + } + chunk.already_broken = true; + } + else if( IsDefined(chunk.material) && chunk.material == "metal_vent") + { + if(!is_true(level.use_clientside_board_fx)) + { + chunk PlaySound( "evt_vent_slat_remove" ); + } + } + else + { + if(!is_true(level.use_clientside_board_fx)) + { + chunk play_sound_on_ent( "break_barrier_piece" ); + wait( randomfloat( 0.3, 0.6 )); + chunk play_sound_on_ent( "break_barrier_piece" ); + } + chunk.already_broken = true; + } +} +zombie_bartear_audio_offset(chunk) +{ + chunk play_sound_on_ent( "grab_metal_bar" ); + wait( randomfloat( 0.3, 0.6 )); + chunk play_sound_on_ent( "break_metal_bar" ); + wait( randomfloat( 1.0, 1.3 )); + chunk play_sound_on_ent( "drop_metal_bar" ); +} +ensure_chunk_is_back_to_origin( chunk ) +{ + if ( chunk.origin != chunk.og_origin ) + { + chunk notsolid(); + chunk waittill( "movedone" ); + } +} +replace_chunk( chunk, perk, via_powerup ) +{ + chunk update_states("mid_repair"); + assert( IsDefined( chunk.og_origin ) ); + assert( IsDefined( chunk.og_angles ) ); + has_perk = false; + if( isDefined( perk ) ) + { + has_perk = true; + } + sound = "rebuild_barrier_hover"; + if( IsDefined( chunk.script_presound ) ) + { + sound = chunk.script_presound; + } + if( !isdefined( via_powerup ) ) + { + play_sound_at_pos( sound, chunk.origin ); + } + only_z = ( chunk.origin[0], chunk.origin[1], chunk.og_origin[2] ); + if( IsDefined(chunk.script_parameters) ) + { + if( chunk.script_parameters == "board" ) + { + chunk Show(); + if( has_perk ) + { + if( "specialty_fastreload" == perk ) + { + chunk RotateTo( chunk.og_angles, 0.15 ); + chunk waittill_notify_or_timeout( "rotatedone", 1 ); + wait( 0.1 ); + } + else if( "specialty_fastreload_upgrade" == perk ) + { + chunk RotateTo( chunk.og_angles, 0.08 ); + chunk waittill_notify_or_timeout( "rotatedone", 1 ); + wait( 0.1 ); + } + } + else + { + chunk RotateTo( chunk.angles + ( 0, -9, 0 ) , 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.angles + ( 0, 18, 0 ) , 0.1 ); + chunk waittill ("rotatedone"); + chunk MoveTo( only_z, 0.15); + chunk RotateTo( chunk.og_angles, 0.3 ); + chunk waittill_notify_or_timeout( "rotatedone", 1 ); + wait( 0.2 ); + } + } + else if(chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents" ) + { + if(IsDefined(chunk.unbroken_section)) + { + chunk.unbroken_section self_delete(); + chunk Show(); + } + else + { + chunk Show(); + } + if( has_perk ) + { + if( "specialty_fastreload" == perk ) + { + chunk RotateTo( chunk.og_angles, 0.15 ); + chunk waittill_notify_or_timeout( "rotatedone", 1 ); + wait( 0.1 ); + } + else if( "specialty_fastreload_upgrade" == perk ) + { + chunk RotateTo( chunk.og_angles, 0.08 ); + chunk waittill_notify_or_timeout( "rotatedone", 1 ); + wait( 0.1 ); + } + } + else + { + chunk RotateTo( chunk.angles + ( 0, -9, 0 ) , 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.angles + ( 0, 18, 0 ) , 0.1 ); + chunk waittill ("rotatedone"); + chunk MoveTo( only_z, 0.15); + chunk RotateTo( chunk.og_angles, 0.3 ); + chunk waittill_notify_or_timeout( "rotatedone", 1 ); + wait( 0.2 ); + } + } + if( IsDefined(chunk.script_parameters) ) + { + if( chunk.script_parameters == "bar" ) + { + chunk Show(); + if( has_perk ) + { + if( "specialty_fastreload" == perk ) + { + chunk RotateTo( chunk.og_angles, 0.15 ); + chunk waittill_notify_or_timeout( "rotatedone", 1 ); + wait( 0.1 ); + } + else if( "specialty_fastreload_upgrade" == perk ) + { + chunk RotateTo( chunk.og_angles, 0.08 ); + chunk waittill_notify_or_timeout( "rotatedone", 1 ); + wait( 0.1 ); + } + } + if(chunk.script_noteworthy == "3" || chunk.script_noteworthy == "5") + { + } + chunk RotateTo( chunk.angles + ( 0, -9, 0 ), 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.angles + ( 0, 18, 0 ), 0.1 ); + chunk waittill ("rotatedone"); + chunk MoveTo( only_z, 0.15); + chunk RotateTo( chunk.og_angles, 0.3 ); + chunk waittill_notify_or_timeout( "rotatedone", 1 ); + wait( 0.2 ); + } + } + } + if(isdefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents") + { + if( has_perk ) + { + if( "specialty_fastreload" == perk ) + { + chunk MoveTo( chunk.og_origin, 0.05 ); + chunk waittill_notify_or_timeout( "movedone", 1 ); + ensure_chunk_is_back_to_origin( chunk ); + } + else if( "specialty_fastreload_upgrade" == perk ) + { + chunk MoveTo( chunk.og_origin, 0.03 ); + chunk waittill_notify_or_timeout( "movedone", 1 ); + ensure_chunk_is_back_to_origin( chunk ); + } + } + else + { + chunk RotateTo( chunk.angles + ( 0, -9, 0 ), 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.angles + ( 0, 18, 0 ), 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.og_angles, 0.1 ); + chunk waittill_notify_or_timeout( "RotateTo", 0.1 ); + chunk MoveTo( chunk.og_origin, 0.1 ); + chunk waittill_notify_or_timeout( "movedone", 1 ); + ensure_chunk_is_back_to_origin( chunk ); + } + } + } + if(isdefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "bar" ) + { + if( has_perk ) + { + if( "specialty_fastreload" == perk ) + { + chunk Show(); + chunk MoveTo( chunk.og_origin, 0.05 ); + chunk waittill_notify_or_timeout( "movedone", 1 ); + ensure_chunk_is_back_to_origin( chunk ); + } + else if( "specialty_fastreload_upgrade" == perk ) + { + chunk Show(); + chunk MoveTo( chunk.og_origin, 0.03 ); + chunk waittill_notify_or_timeout( "movedone", 1 ); + ensure_chunk_is_back_to_origin( chunk ); + } + } + else if(chunk.script_noteworthy == "3") + { + chunk RotateTo( chunk.angles + ( 0, -9, 0 ), 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.angles + ( 0, 18, 0 ), 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.og_angles, 0.1 ); + chunk MoveTo( chunk.og_origin, 0.1 ); + chunk waittill_notify_or_timeout( "movedone", 1 ); + ensure_chunk_is_back_to_origin( chunk ); + chunk Show(); + } + else if(chunk.script_noteworthy == "5") + { + chunk RotateTo( chunk.angles + ( 0, -9, 0 ), 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.angles + ( 0, 18, 0 ), 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.og_angles, 0.1 ); + chunk MoveTo( chunk.og_origin, 0.1 ); + chunk waittill_notify_or_timeout( "movedone", 1 ); + ensure_chunk_is_back_to_origin( chunk ); + chunk Show(); + } + else + { + chunk Show(); + chunk RotateTo( chunk.angles + ( 0, -9, 0 ), 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.angles + ( 0, 18, 0 ), 0.1 ); + chunk waittill ("rotatedone"); + chunk RotateTo( chunk.og_angles, 0.1 ); + chunk MoveTo( chunk.og_origin, 0.1 ); + chunk waittill_notify_or_timeout( "movedone", 1 ); + ensure_chunk_is_back_to_origin( chunk ); + } + } + } + if( IsDefined(chunk.script_parameters) ) + { + if( chunk.script_parameters == "grate" ) + { + if( IsDefined ( chunk.script_noteworthy ) && ( chunk.script_noteworthy == "6" ) ) + { + amplitude1 = RandomfloatRange( 10, 15); + period1 = RandomfloatRange( 0.3, 0.5); + time1 = RandomfloatRange( 0.3, 0.4); + chunk vibrate(( 0, 180, 0 ), amplitude1, period1, time1); + wait(0.3); + chunk RotateTo( chunk.og_angles, 0.1 ); + chunk MoveTo( chunk.og_origin, 0.1 ); + chunk waittill_notify_or_timeout( "movedone", 1 ); + ensure_chunk_is_back_to_origin( chunk ); + chunk thread zombie_gratetear_audio_plus_fx_offset_repair_horizontal( chunk ); + chunk Show(); + } + else + { + wait( 0.5 ); + chunk waittill_notify_or_timeout( "movedone", 1 ); + chunk thread zombie_gratetear_audio_plus_fx_offset_repair_horizontal( chunk ); + chunk Show(); + } + } + } + sound = "barrier_rebuild_slam"; + if( IsDefined( self.script_ender ) ) + { + sound = self.script_ender; + } + if( IsDefined( chunk.script_string ) && chunk.script_string == "rock" ) + { + sound = "zmb_rock_fix"; + } + if( isdefined( chunk.script_parameters ) && chunk.script_parameters == "barricade_vents" ) + { + sound = "zmb_vent_fix"; + } + if(isdefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents") + { + if(chunk.script_noteworthy == "1" || chunk.script_noteworthy == "5" || chunk.script_noteworthy == "6") + { + chunk thread zombie_boardtear_audio_plus_fx_offset_repair_horizontal(chunk); + } + else + { + chunk thread zombie_boardtear_audio_plus_fx_offset_repair_verticle(chunk); + } + } + } + if(isdefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "bar" ) + { + if(chunk.script_noteworthy == "4" || chunk.script_noteworthy == "6") + { + if( IsDefined( chunk.script_squadname ) && ( chunk.script_squadname == "cosmodrome_storage_area" ) ) + { + } + if (!IsDefined( chunk.script_squadname ) ) + { + chunk thread zombie_bartear_audio_plus_fx_offset_repair_horizontal(chunk); + } + } + else + { + if ( IsDefined( chunk.script_squadname ) && ( chunk.script_squadname == "cosmodrome_storage_area" ) ) + { + } + if (!IsDefined( chunk.script_squadname ) ) + { + chunk thread zombie_bartear_audio_plus_fx_offset_repair_verticle(chunk); + } + } + } + } + chunk Solid(); + chunk update_states("repaired"); + fx = "wood_chunk_destory"; + if( IsDefined( self.script_fxid ) ) + { + fx = self.script_fxid; + } + if( IsDefined( chunk.script_string ) && chunk.script_string == "rock" ) + { + if( !is_true(level.use_clientside_rock_tearin_fx)) + { + play_sound_at_pos( sound, chunk.origin ); + } + } + else if( isDefined(chunk.script_parameters) && (chunk.script_parameters == "board" || chunk.script_parameters == "repair_board" || chunk.script_parameters == "barricade_vents")) + { + if(!is_true(level.use_clientside_board_fx)) + { + play_sound_at_pos( sound, chunk.origin ); + } + } + else + { + play_sound_at_pos( sound, chunk.origin ); + } + if( !Isdefined( self.clip ) ) + { + chunk Disconnectpaths(); + } +} +zombie_boardtear_audio_plus_fx_offset_repair_horizontal( chunk ) +{ + if(isDefined(chunk.material) && chunk.material == "rock" ) + { + if(is_true(level.use_clientside_rock_tearin_fx)) + { + chunk clearclientflag(level._ZOMBIE_SCRIPTMOVER_FLAG_ROCK_FX); + } + else + { + EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 ); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (0, 0, 30)); + wait( randomfloat( 0.3, 0.6 )); + chunk play_sound_on_ent( "break_barrier_piece" ); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (0, 0, -30)); + } + } + else + { + if(is_true(level.use_clientside_board_fx)) + { + chunk clearclientflag(level._ZOMBIE_SCRIPTMOVER_FLAG_BOARD_HORIZONTAL_FX); + } + else + { + EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 ); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (0, 0, 30)); + wait( randomfloat( 0.3, 0.6 )); + chunk play_sound_on_ent( "break_barrier_piece" ); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (0, 0, -30)); + } + } +} +zombie_boardtear_audio_plus_fx_offset_repair_verticle( chunk ) +{ + if(isDefined(chunk.material) && chunk.material == "rock") + { + if (is_true(level.use_clientside_rock_tearin_fx)) + { + chunk clearclientflag(level._ZOMBIE_SCRIPTMOVER_FLAG_ROCK_FX); + } + else + { + EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 ); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (30, 0, 0)); + wait( randomfloat( 0.3, 0.6 )); + chunk play_sound_on_ent( "break_barrier_piece" ); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (-30, 0, 0)); + } + } + else + { + if(is_true(level.use_clientside_board_fx)) + { + chunk clearclientflag(level._ZOMBIE_SCRIPTMOVER_FLAG_BOARD_VERTICAL_FX); + } + else + { + EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 ); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (30, 0, 0)); + wait( randomfloat( 0.3, 0.6 )); + chunk play_sound_on_ent( "break_barrier_piece" ); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (-30, 0, 0)); + } + } +} +zombie_gratetear_audio_plus_fx_offset_repair_horizontal( chunk ) +{ + EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 ); + chunk play_sound_on_ent( "bar_rebuild_slam" ); + switch( randomInt( 9 ) ) + { + case 0: + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + wait( randomfloat( 0.0, 0.3 )); + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + break; + case 1: + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + wait( randomfloat( 0.0, 0.3 )); + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + break; + case 2: + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + wait( randomfloat( 0.0, 0.3 )); + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + break; + case 3: + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + wait( randomfloat( 0.0, 0.3 )); + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + break; + case 4: + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + wait( randomfloat( 0.0, 0.3 )); + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + break; + case 5: + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + break; + case 6: + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + break; + case 7: + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + break; + case 8: + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + break; + } +} +zombie_bartear_audio_plus_fx_offset_repair_horizontal( chunk ) +{ + EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 ); + chunk play_sound_on_ent( "bar_rebuild_slam" ); + switch( randomInt( 9 ) ) + { + case 0: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); + break; + case 1: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_left" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); + break; + case 2: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); + break; + case 3: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_left" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); + break; + case 4: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); + break; + case 5: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); + break; + case 6: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); + break; + case 7: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_left" ); + break; + case 8: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); + break; + } +} +zombie_bartear_audio_plus_fx_offset_repair_verticle(chunk) +{ + EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 ); + chunk play_sound_on_ent( "bar_rebuild_slam" ); + switch( randomInt( 9 ) ) + { + case 0: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); + break; + case 1: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); + break; + case 2: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); + break; + case 3: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); + break; + case 4: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); + break; + case 5: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); + break; + case 6: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); + break; + case 7: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); + break; + case 8: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); + break; + } +} +add_new_zombie_spawners() +{ + if( isdefined( self.target ) ) + { + self.possible_spawners = getentarray( self.target, "targetname" ); + } + if( isdefined( self.script_string ) ) + { + spawners = getentarray( self.script_string, "targetname" ); + self.possible_spawners = array_combine( self.possible_spawners, spawners ); + } + if( !isdefined( self.possible_spawners ) ) + { + return; + } + zombies_to_add = self.possible_spawners; + for( i = 0; i < self.possible_spawners.size; i++ ) + { + self.possible_spawners[i].is_enabled = true; + add_spawner( self.possible_spawners[i] ); + } +} +flag_blocker() +{ + if( !IsDefined( self.script_flag_wait ) ) + { + AssertMsg( "Flag Blocker at " + self.origin + " does not have a script_flag_wait key value pair" ); + return; + } + if( !IsDefined( level.flag[self.script_flag_wait] ) ) + { + flag_init( self.script_flag_wait ); + } + type = "connectpaths"; + if( IsDefined( self.script_noteworthy ) ) + { + type = self.script_noteworthy; + } + flag_wait( self.script_flag_wait ); + self script_delay(); + if( type == "connectpaths" ) + { + self ConnectPaths(); + self disable_trigger(); + return; + } + if( type == "disconnectpaths" ) + { + self DisconnectPaths(); + self disable_trigger(); + return; + } + AssertMsg( "flag blocker at " + self.origin + ", the type \"" + type + "\" is not recognized" ); +} +update_states( states ) +{ + assertex( isdefined( states ) ); + self.state = states; +} +shutter_init() +{ + self.shutters = []; + self.lights = []; + self.area_triggers = []; + targets = GetEntArray(self.target, "targetname" ); + for(i=0;i min_size ) + { + shutter_light_green( self.lights ); + for(i=0;i "+self.shutters[i].script_animname ); + AssertEx( IsDefined( level.blocker_anim_func ), "Blocker_init: You must define a level.blocker_anim_func" ); + } + self.shutters[i] door_activate( 0.05 ); + } + cost = 1000; + if( IsDefined( self.zombie_cost ) ) + { + cost = self.zombie_cost; + } + self set_hint_string( self, "default_buy_door_" + cost ); + self thread shutter_think(); + } + else + { + self disable_trigger(); + self thread shutter_enable_zone( false ); + } +} +shutter_light_red( shutter_lights ) +{ + for(i=0;i= self.zombie_cost ) + { + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); + } + else if( level.team_pool[ who.team_num ].score >= self.zombie_cost ) + { + who maps\_zombiemode_score::minus_to_team_score( self.zombie_cost ); + } + else if( level.team_pool[ who.team_num ].score + who.score >= self.zombie_cost ) + { + team_points = level.team_pool[ who.team_num ].score; + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost - team_points ); + who maps\_zombiemode_score::minus_to_team_score( team_points ); + } + else + { + play_sound_at_pos( "zmb_no_cha_ching", self.shutters[0].origin ); + who maps\_zombiemode_audio::create_and_play_dialog( "general", "door_deny", undefined, 0 ); + continue; + } + bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type door", who.playername, who.score, level.team_pool[ who.team_num ].score, level.round_number, self.zombie_cost, self.target, self.origin ); + } + self disable_trigger(); + self thread shutter_move_switch(); + shutter_light_red( self.lights ); + self waittill( "switch_activated" ); + for(i=0;i= self.zombie_cost ) + { + if(!isDefined(who.has_claymores)) + { + who.has_claymores = 1; + play_sound_at_pos( "purchase", self.origin ); + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); + who maps\_zombiemode_weapons::check_collector_achievement( "claymore_zm" ); + who thread claymore_setup(); + who thread show_claymore_hint("claymore_purchased"); + if( self.claymores_triggered == false ) + { + model = getent( self.target, "targetname" ); + model thread maps\_zombiemode_weapons::weapon_show( who ); + self.claymores_triggered = true; + } + trigs = getentarray("claymore_purchase","targetname"); + for(i = 0; i < trigs.size; i++) + { + trigs[i] SetInvisibleToPlayer(who); + } + } + else + { + who thread show_claymore_hint("already_purchased"); + } + } + } + } +} +set_claymore_visible() +{ + players = getplayers(); + trigs = getentarray("claymore_purchase","targetname"); + while(1) + { + for(j = 0; j < players.size; j++) + { + if( !isdefined(players[j].has_claymores)) + { + for(i = 0; i < trigs.size; i++) + { + trigs[i] SetInvisibleToPlayer(players[j], false); + } + } + } + wait(1); + players = getplayers(); + } +} +claymore_watch() +{ + self endon("death"); + while(1) + { + self waittill("grenade_fire",claymore,weapname); + if(weapname == "claymore_zm") + { + claymore.owner = self; + claymore thread satchel_damage(); + claymore thread claymore_detonation(); + claymore thread play_claymore_effects(); + self notify( "zmb_enable_claymore_prompt" ); + } + } +} +claymore_setup() +{ + self thread claymore_watch(); + self giveweapon("claymore_zm"); + self setactionslot(4,"weapon","claymore_zm"); + self setweaponammostock("claymore_zm",2); +} +pickup_claymores() +{ + player = self.owner; + if ( !player hasweapon( "claymore_zm" ) ) + { + player thread claymore_watch(); + player giveweapon("claymore_zm"); + player setactionslot(4,"weapon","claymore_zm"); + player setweaponammoclip("claymore_zm",0); + player notify( "zmb_enable_claymore_prompt" ); + } + else + { + clip_ammo = player GetWeaponAmmoClip( self.name ); + clip_max_ammo = WeaponClipSize( self.name ); + if ( clip_ammo >= clip_max_ammo ) + { + player notify( "zmb_disable_claymore_prompt" ); + return; + } + } + self maps\_weaponobjects::pick_up(); + clip_ammo = player GetWeaponAmmoClip( self.name ); + clip_max_ammo = WeaponClipSize( self.name ); + if ( clip_ammo >= clip_max_ammo ) + { + player notify( "zmb_disable_claymore_prompt" ); + } +} +pickup_claymores_trigger_listener( trigger, player ) +{ + self thread pickup_claymores_trigger_listener_enable( trigger, player ); + self thread pickup_claymores_trigger_listener_disable( trigger, player ); +} +pickup_claymores_trigger_listener_enable( trigger, player ) +{ + self endon( "delete" ); + while ( true ) + { + player waittill_any( "zmb_enable_claymore_prompt", "spawned_player" ); + if ( !isDefined( trigger ) ) + { + return; + } + trigger trigger_on(); + trigger linkto( self ); + } +} +pickup_claymores_trigger_listener_disable( trigger, player ) +{ + self endon( "delete" ); + while ( true ) + { + player waittill( "zmb_disable_claymore_prompt" ); + if ( !isDefined( trigger ) ) + { + return; + } + trigger unlink(); + trigger trigger_off(); + } +} +shouldAffectWeaponObject( object ) +{ + pos = self.origin + (0,0,32); + dirToPos = pos - object.origin; + objectForward = anglesToForward( object.angles ); + dist = vectorDot( dirToPos, objectForward ); + if ( dist < level.claymore_detectionMinDist ) + return false; + dirToPos = vectornormalize( dirToPos ); + dot = vectorDot( dirToPos, objectForward ); + return ( dot > level.claymore_detectionDot ); +} +claymore_detonation() +{ + self endon("death"); + self waittill_not_moving(); + detonateRadius = 96; + spawnFlag = 1; + playerTeamToAllow = "axis"; + if( isDefined( self.owner ) && isDefined( self.owner.pers["team"] ) && self.owner.pers["team"] == "axis" ) + { + spawnFlag = 2; + playerTeamToAllow = "allies"; + } + damagearea = spawn("trigger_radius", self.origin + (0,0,0-detonateRadius), spawnFlag, detonateRadius, detonateRadius*2); + damagearea enablelinkto(); + damagearea linkto( self ); + self thread delete_claymores_on_death( damagearea ); + if(!isdefined(level.claymores)) + level.claymores = []; + level.claymores = array_add( level.claymores, self ); + if( level.claymores.size > 15 && GetDvar( #"player_sustainAmmo") != "0" ) + level.claymores[0] delete(); + while(1) + { + damagearea waittill( "trigger", ent ); + if ( isdefined( self.owner ) && ent == self.owner ) + continue; + if( isDefined( ent.pers ) && isDefined( ent.pers["team"] ) && ent.pers["team"] != playerTeamToAllow ) + continue; + if ( !ent shouldAffectWeaponObject( self ) ) + continue; + if ( ent damageConeTrace(self.origin, self) > 0 ) + { + self playsound ("claymore_activated_SP"); + wait 0.4; + if ( isdefined( self.owner ) ) + self detonate( self.owner ); + else + self detonate( undefined ); + return; + } + } +} +delete_claymores_on_death(ent) +{ + self waittill("death"); + level.claymores = array_remove_nokeys( level.claymores, self ); + wait .05; + if ( isdefined( ent ) ) + ent delete(); +} +satchel_damage() +{ + self setcandamage(true); + self.health = 100000; + attacker = undefined; + playerTeamToAllow = "axis"; + if( isDefined( self.owner ) && isDefined( self.owner.pers["team"] ) && self.owner.pers["team"] == "axis" ) + { + playerTeamToAllow = "allies"; + } + while(1) + { + self waittill("damage", amount, attacker); + self.health = self.maxhealth; + if ( !isplayer(attacker) ) + continue; + if ( isdefined( self.owner ) && attacker == self.owner ) + continue; + if( isDefined( attacker.pers ) && isDefined( attacker.pers["team"] ) && attacker.pers["team"] != playerTeamToAllow ) + continue; + break; + } + if ( level.satchelexplodethisframe ) + wait .1 + randomfloat(.4); + else + wait .05; + if (!isdefined(self)) + return; + level.satchelexplodethisframe = true; + thread reset_satchel_explode_this_frame(); + self detonate( attacker ); +} +reset_satchel_explode_this_frame() +{ + wait .05; + level.satchelexplodethisframe = false; +} +play_claymore_effects() +{ + self endon("death"); + self waittill_not_moving(); + PlayFXOnTag( level._effect[ "claymore_laser" ], self, "tag_fx" ); +} +give_claymores_after_rounds() +{ + while(1) + { + level waittill( "between_round_over" ); + { + players = get_players(); + for(i=0;i 0 ) + { + for ( i = 0; i < players.size; i++ ) + { + level.deathcards[i] = SpawnStruct(); + } + level.deathcard_laststand_func = ::deathcard_laststand; + if ( players.size > 1 ) + { + level.deathcard_spawn_func = ::deathcard_spawn; + } + } +} +deathcard_spawn() +{ + dc = Spawn( "script_model", self.origin + ( 0, 0, 40 ) ); + dc.angles = self.angles; + dc SetModel( "zombie_revive" ); + dc.player = self; + dc thread deathcard_timeout(); + dc thread deathcard_wobble(); + dc thread deathcard_grab(); + self.pro_tip_death_card_round = level.round_number + 1; +} +deathcard_laststand() +{ + players = get_players(); + if ( players.size == 1 ) + { + dc = level.deathcards[0]; + dc.player = self; + dc.weapon = []; + dc.score = self.score; + primaries = self GetWeaponsListPrimaries(); + dc.weapon[0] = primaries[0]; + dc.current_weapon = 0; + if ( primaries.size > 1 ) + { + dc.weapon[1] = primaries[1]; + currentWeapon = self GetCurrentWeapon(); + if ( currentWeapon == dc.weapon[1] ) + { + dc.current_weapon = 1; + } + } + dc.curr_ability = self.curr_ability; + if ( maps\_zombiemode_weap_cymbal_monkey::cymbal_monkey_exists() ) + { + dc.zombie_cymbal_monkey_count = self getweaponammoclip( "zombie_cymbal_monkey" ); + } + } + else + { + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] == self ) + { + dc = level.deathcards[i]; + dc.player = self; + dc.weapon = []; + dc.current_weapon = -1; + dc.score = int( self.score * 0.5 ); + primaries = self GetWeaponsListPrimaries(); + if ( primaries[0] == "m1911_zm" ) + { + dc.weapon[0] = "none"; + } + else + { + dc.weapon[0] = primaries[0]; + stock = self GetWeaponAmmoStock( primaries[0] ); + dc.stockCount[0] = int( stock * 0.5 ); + dc.current_weapon = 0; + } + if ( primaries.size > 1 ) + { + if ( primaries[1] == "m1911_zm" ) + { + dc.weapon[1] = "none"; + } + else + { + dc.weapon[1] = primaries[1]; + stock = self GetWeaponAmmoStock( primaries[1] ); + dc.stockCount[1] = int( stock * 0.5 ); + currentWeapon = players[i] GetCurrentWeapon(); + if ( currentWeapon == dc.weapon[1] ) + { + dc.current_weapon = 1; + } + else + { + dc.current_weapon = 0; + } + } + } + else + { + dc.weapon[1] = "none"; + } + dc.perk = deathcard_save_perks( self ); + dc.curr_ability = self.curr_ability; + if ( maps\_zombiemode_weap_cymbal_monkey::cymbal_monkey_exists() ) + { + dc.zombie_cymbal_monkey_count = self getweaponammoclip( "zombie_cymbal_monkey" ); + } + } + } + } +} +deathcard_save_perks( ent ) +{ + idx = 0; + perk_array = undefined; + if ( ent HasPerk( "specialty_armorvest" ) ) + { + perk_array[idx] = "specialty_armorvest"; + idx++; + } + else if ( ent HasPerk( "specialty_armorvest_upgrade" ) ) + { + perk_array[idx] = "specialty_armorvest_upgrade"; + idx++; + } + if ( ent HasPerk( "specialty_quickrevive" ) ) + { + perk_array[idx] = "specialty_quickrevive"; + idx++; + } + else if ( ent HasPerk( "specialty_quickrevive_upgrade" ) ) + { + perk_array[idx] = "specialty_quickrevive_upgrade"; + idx++; + } + if ( ent HasPerk( "specialty_fastreload" ) ) + { + perk_array[idx] = "specialty_fastreload"; + idx++; + } + else if ( ent HasPerk( "specialty_fastreload_upgrade" ) ) + { + perk_array[idx] = "specialty_fastreload_upgrade"; + idx++; + } + return( perk_array ); +} +deathcard_grab() +{ + self endon( "deatchcard_timedout" ); + wait( 1 ); + while ( isdefined( self ) ) + { + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if ( players[i].is_zombie ) + { + continue; + } + if ( players[i] == self.player ) + { + dist = distance( players[i].origin, self.origin ); + if ( dist < 64 ) + { + playfx( level._effect["powerup_grabbed"], self.origin ); + playfx( level._effect["powerup_grabbed_wave"], self.origin ); + players[i] deathcard_give( i ); + wait( 0.1 ); + playsoundatposition("zmb_powerup_grabbed_3p", self.origin); + self stoploopsound(); + self delete(); + self notify( "deathcard_grabbed" ); + players[i] clientnotify( "dc0" ); + } + } + } + wait_network_frame(); + } +} +deathcard_give( index ) +{ + dc = level.deathcards[index]; + if ( dc.current_weapon >= 0 ) + { + weapon = undefined; + stock = 0; + needSwitch = false; + if ( dc.weapon[dc.current_weapon] != "none" && !self HasWeapon( dc.weapon[dc.current_weapon] ) ) + { + weapon = dc.weapon[dc.current_weapon]; + stock = dc.stockCount[dc.current_weapon]; + needSwitch = true; + } + else + { + for ( i = 0; i < 2; i++ ) + { + if ( dc.current_weapon == i || dc.weapon[i] == "none" ) + { + continue; + } + if ( !self HasWeapon( dc.weapon[i] ) ) + { + weapon = dc.weapon[i]; + stock = dc.stockCount[i]; + } + } + } + if ( IsDefined( weapon ) ) + { + primaries = self GetWeaponsListPrimaries(); + if ( primaries.size >= 2 ) + { + takeWeapon = undefined; + if ( primaries[0] == "m1911_zm" || primaries[1] == "m1911_zm" ) + { + takeWeapon = "m1911_zm"; + } + else + { + takeWeapon = self GetCurrentWeapon(); + } + self TakeWeapon( takeWeapon ); + } + self GiveWeapon( weapon, 0 ); + self SetWeaponAmmoClip( weapon, WeaponClipSize( weapon ) ); + self SetWeaponAmmoStock( weapon, stock ); + if ( needSwitch ) + { + self SwitchToWeapon( weapon, 0 ); + } + } + } + if ( IsDefined( dc.perk ) ) + { + oldPerks = dc.perk.size; + if ( oldPerks >= 2 ) + { + newPerks = int( oldPerks * 0.5 ); + for ( i = 0; i < dc.perk.size; i++ ) + { + if ( self HasPerk( dc.perk[i] ) ) + { + continue; + } + remaining = dc.perk.size - i; + if ( remaining <= newPerks || RandomInt( 100 ) > 50 ) + { + maps\_zombiemode_perks::give_perk( dc.perk[i] ); + newPerks--; + } + if ( newPerks == 0 ) + { + break; + } + } + } + } + if ( maps\_zombiemode_weap_cymbal_monkey::cymbal_monkey_exists() ) + { + if ( dc.zombie_cymbal_monkey_count ) + { + self giveweapon( "zombie_cymbal_monkey" ); + self setweaponammoclip( "zombie_cymbal_monkey", dc.zombie_cymbal_monkey_count ); + } + } +} +deathcard_give_solo() +{ + dc = level.deathcards[0]; + self maps\_zombiemode::laststand_giveback_player_perks(); + take = true; + startWeapon = dc.weapon[dc.current_weapon]; + if ( startWeapon == "m1911_zm" ) + { + take = false; + } + currentWeapon = self GetCurrentWeapon(); + if ( currentWeapon != "none" && take ) + { + self TakeWeapon( currentWeapon ); + } + for ( i = 0; i < 2; i++ ) + { + if ( IsDefined( dc.weapon[i] ) ) + { + weapon = dc.weapon[i]; + if ( weapon != "m1911_zm" || take ) + { + self GiveWeapon( weapon, 0 ); + self SetWeaponAmmoClip( weapon, WeaponClipSize( weapon ) ); + self GiveStartAmmo( weapon ); + } + } + } + if ( dc.current_weapon >= 0 && take ) + { + self SwitchToWeapon( dc.weapon[dc.current_weapon], 0 ); + } + if ( maps\_zombiemode_weap_cymbal_monkey::cymbal_monkey_exists() ) + { + if ( dc.zombie_cymbal_monkey_count ) + { + self giveweapon( "zombie_cymbal_monkey" ); + self setweaponammoclip( "zombie_cymbal_monkey", dc.zombie_cymbal_monkey_count ); + } + } +} +deathcard_wobble() +{ + self endon ("deathcard_grabbed"); + self endon ("deathcard_timedout"); + if (isdefined(self)) + { + playfxontag (level._effect["powerup_on"], self, "tag_origin"); + self playsound("zmb_spawn_powerup"); + self playloopsound("evt_death_card_loop"); + } + while (isdefined(self)) + { + self rotateyaw( 360, 3, 3, 0 ); + wait( 3 ); + } +} +deathcard_timeout() +{ + self endon ("deathcard_grabbed"); + level waittill( "between_round_over" ); + wait( 1 ); + level waittill( "between_round_over" ); + self hide(); + self notify ("deathcard_timedout"); + self delete(); +} + + + + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_devgui.gsc b/BO1/PC/ZM/maps/_zombiemode_devgui.gsc new file mode 100644 index 0000000..cc51d22 Binary files /dev/null and b/BO1/PC/ZM/maps/_zombiemode_devgui.gsc differ diff --git a/BO1/PC/ZM/maps/_zombiemode_equip_gasmask.gsc b/BO1/PC/ZM/maps/_zombiemode_equip_gasmask.gsc new file mode 100644 index 0000000..1fe26e2 Binary files /dev/null and b/BO1/PC/ZM/maps/_zombiemode_equip_gasmask.gsc differ diff --git a/BO1/PC/ZM/maps/_zombiemode_equip_hacker.gsc b/BO1/PC/ZM/maps/_zombiemode_equip_hacker.gsc new file mode 100644 index 0000000..b9d3352 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_equip_hacker.gsc @@ -0,0 +1,787 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#using_animtree( "generic_human" ); +init() +{ + if ( !maps\_zombiemode_equipment::is_equipment_included( "equip_hacker_zm" ) ) + { + return; + } + maps\_zombiemode_equipment::register_equipment( "equip_hacker_zm", &"ZOMBIE_EQUIP_HACKER_PICKUP_HINT_STRING", &"ZOMBIE_EQUIP_HACKER_HOWTO", "hacker" ); + level._hackable_objects = []; + level._pooled_hackable_objects = []; + level thread hacker_on_player_connect(); + level thread hack_trigger_think(); + level thread hacker_trigger_pool_think(); + level thread hacker_round_reward(); + if(GetDvarInt(#"scr_debug_hacker") == 1) + { + level thread hacker_debug(); + } +} +hacker_round_reward() +{ + while(1) + { + level waittill("end_of_round" ); + if(!IsDefined(level._from_nml)) + { + players = get_players(); + for(i = 0; i < players.size; i ++) + { + if(IsDefined(players[i] get_player_equipment()) && players[i] get_player_equipment() == "equip_hacker_zm") + { + if(IsDefined(players[i].equipment_got_in_round["equip_hacker_zm"])) + { + got_in_round = players[i].equipment_got_in_round["equip_hacker_zm"]; + rounds_kept = level.round_number - got_in_round; + rounds_kept -= 1; + if(rounds_kept > 0) + { + rounds_kept = min(rounds_kept, 5); + score = rounds_kept * 500; + players[i] maps\_zombiemode_score::add_to_player_score( Int(score) ); + } + } + } + } + } + else + { + level._from_nml = undefined; + } + } +} +hacker_debug() +{ + while(1) + { + for(i = 0; i < level._hackable_objects.size; i ++) + { + hackable = level._hackable_objects[i]; + if(IsDefined(hackable.pooled) && hackable.pooled) + { + if(IsDefined(hackable._trigger)) + { + col = (0,255,0); + if(IsDefined(hackable.custom_debug_color)) + { + col = hackable.custom_debug_color; + } + Print3d(hackable.origin, "+", col, 1, 1); + } + else + { + Print3d(hackable.origin, "+", (0,0,255), 1, 1); + } + } + else + { + Print3d(hackable.origin, "+", (255,0,0), 1, 1); + } + } + wait(0.1); + } +} +hacker_trigger_pool_think() +{ + if(!IsDefined(level._zombie_hacker_trigger_pool_size)) + { + level._zombie_hacker_trigger_pool_size = 8; + } + pool_active = false; + level._hacker_pool = []; + while(1) + { + if(pool_active) + { + if(!any_hackers_active()) + { + destroy_pooled_items(); + } + else + { + sweep_pooled_items(); + add_eligable_pooled_items(); + } + } + else + { + if(any_hackers_active()) + { + pool_active = true; + } + } + wait(0.1); + } +} +destroy_pooled_items() +{ + pool_active = false; + for(i = 0; i < level._hacker_pool.size; i ++) + { + level._hacker_pool[i]._trigger Delete(); + level._hacker_pool[i]._trigger = undefined; + } + level._hacker_pool = []; +} +sweep_pooled_items() +{ + new_hacker_pool = []; + for(i = 0; i < level._hacker_pool.size; i ++) + { + if(level._hacker_pool[i] should_pooled_object_exist()) + { + new_hacker_pool[new_hacker_pool.size] = level._hacker_pool[i]; + } + else + { + level._hacker_pool[i]._trigger Delete(); + level._hacker_pool[i]._trigger = undefined; + } + } + level._hacker_pool = new_hacker_pool; +} +should_pooled_object_exist() +{ + players = get_players(); + for(i = 0; i < players.size; i ++) + { + if(players[i] hacker_active()) + { + if(IsDefined(self.entity)) + { + if(self.entity != players[i]) + { + if(distance2dsquared(players[i].origin, self.entity.origin) <= (self.radius * self.radius)) + { + return true; + } + } + } + else + { + if(distance2dsquared(players[i].origin, self.origin) <= (self.radius * self.radius)) + { + return true; + } + } + } + } + return false; +} +add_eligable_pooled_items() +{ + candidates = []; + for(i = 0; i < level._hackable_objects.size; i ++) + { + hackable = level._hackable_objects[i]; + if(IsDefined(hackable.pooled) && hackable.pooled && !IsDefined(hackable._trigger)) + { + if(!is_in_array(level._hacker_pool, hackable)) + { + if(hackable should_pooled_object_exist()) + { + candidates[candidates.size] = hackable; + } + } + } + } + for(i = 0; i < candidates.size; i ++) + { + candidate = candidates[i]; + height = 72; + radius = 32; + if(IsDefined(candidate.radius)) + { + radius = candidate.radius; + } + if(IsDefined(self.height)) + { + height = candidate.height; + } + trigger = Spawn( "trigger_radius_use", candidate.origin, 0, radius, height); + trigger UseTriggerRequireLookAt(); + trigger SetCursorHint( "HINT_NOICON" ); + trigger.radius = radius; + trigger.height = height; + trigger.beingHacked = false; + candidate._trigger = trigger; + level._hacker_pool[level._hacker_pool.size] = candidate; + } +} +any_hackers_active() +{ + players = get_players(); + for(i = 0; i < players.size; i ++) + { + if(players[i] hacker_active()) + { + return true; + } + } + return false;; +} +register_hackable(name, callback_func, qualifier_func) +{ + structs = getstructarray(name, "script_noteworthy"); + if(!IsDefined(structs)) + { + return; + } + for(i = 0; i < structs.size; i ++) + { + if(!is_in_array(level._hackable_objects, structs[i])) + { + structs[i]._hack_callback_func = callback_func; + structs[i]._hack_qualifier_func = qualifier_func; + structs[i].pooled = level._hacker_pooled; + if(IsDefined(structs[i].targetname)) + { + structs[i].hacker_target = GetEnt(structs[i].targetname, "targetname"); + } + level._hackable_objects[level._hackable_objects.size] = structs[i]; + if(IsDefined(level._hacker_pooled)) + { + level._pooled_hackable_objects[level._pooled_hackable_objects.size] = structs[i]; + } + structs[i] thread hackable_object_thread(); + wait_network_frame(); + } + } +} +register_hackable_struct(struct, callback_func, qualifier_func) +{ + if(!is_in_array(level._hackable_objects, struct)) + { + struct._hack_callback_func = callback_func; + struct._hack_qualifier_func = qualifier_func; + struct.pooled = level._hacker_pooled; + if(IsDefined(struct.targetname)) + { + struct.hacker_target = GetEnt(struct.targetname, "targetname"); + } + level._hackable_objects[level._hackable_objects.size] = struct; + if(IsDefined(level._hacker_pooled)) + { + level._pooled_hackable_objects[level._pooled_hackable_objects.size] = struct; + } + struct thread hackable_object_thread(); + } +} +register_pooled_hackable_struct(struct, callback_func, qualifier_func) +{ + level._hacker_pooled = true; + register_hackable_struct(struct, callback_func, qualifier_func); + level._hacker_pooled = undefined; +} +register_pooled_hackable(name, callback_func, qualifier_func) +{ + level._hacker_pooled = true; + register_hackable(name, callback_func, qualifier_func); + level._hacker_pooled = undefined; +} +deregister_hackable_struct(struct) +{ + if(is_in_array(level._hackable_objects, struct)) + { + new_list = []; + for(i = 0; i < level._hackable_objects.size; i ++) + { + if(level._hackable_objects[i] != struct) + { + new_list[new_list.size] = level._hackable_objects[i]; + } + else + { + level._hackable_objects[i] notify("hackable_deregistered"); + if(IsDefined(level._hackable_objects[i]._trigger)) + { + level._hackable_objects[i]._trigger Delete(); + } + if(IsDefined(level._hackable_objects[i].pooled) && level._hackable_objects[i].pooled) + { + level._hacker_pool = array_remove(level._hacker_pool, level._hackable_objects[i]); + level._pooled_hackable_objects = array_remove(level._pooled_hackable_objects, level._hackable_objects[i]); + } + } + } + level._hackable_objects = new_list; + } +} +deregister_hackable(noteworthy) +{ + new_list = []; + for(i = 0; i < level._hackable_objects.size; i ++) + { + if(!IsDefined(level._hackable_objects[i].script_noteworthy) || level._hackable_objects[i].script_noteworthy != noteworthy) + { + new_list[new_list.size] = level._hackable_objects[i]; + } + else + { + level._hackable_objects[i] notify("hackable_deregistered"); + if(IsDefined(level._hackable_objects[i]._trigger)) + { + level._hackable_objects[i]._trigger Delete(); + } + } + if(IsDefined(level._hackable_objects[i].pooled) && level._hackable_objects[i].pooled) + { + level._hacker_pool = array_remove(level._hacker_pool, level._hackable_objects[i]); + } + } + level._hackable_objects = new_list; +} +hack_trigger_think() +{ + while(1) + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + player = players[i]; + for(j = 0; j < level._hackable_objects.size; j ++) + { + hackable = level._hackable_objects[j]; + if(IsDefined(hackable._trigger)) + { + qualifier_passed = true; + if(IsDefined(hackable._hack_qualifier_func)) + { + qualifier_passed = hackable [[hackable._hack_qualifier_func]](player); + } + if ( player hacker_active() && qualifier_passed && !hackable._trigger.beingHacked) + { + hackable._trigger SetInvisibleToPlayer( player, false ); + } + else + { + hackable._trigger SetInvisibleToPlayer( player, true ); + } + } + } + } + wait( 0.1 ); + } +} +is_facing( facee ) +{ + orientation = self getPlayerAngles(); + forwardVec = anglesToForward( orientation ); + forwardVec2D = ( forwardVec[0], forwardVec[1], 0 ); + unitForwardVec2D = VectorNormalize( forwardVec2D ); + toFaceeVec = facee.origin - self.origin; + toFaceeVec2D = ( toFaceeVec[0], toFaceeVec[1], 0 ); + unitToFaceeVec2D = VectorNormalize( toFaceeVec2D ); + dotProduct = VectorDot( unitForwardVec2D, unitToFaceeVec2D ); + dot_limit = 0.8; + if(IsDefined(facee.dot_limit)) + { + dot_limit = facee.dot_limit; + } + return ( dotProduct > dot_limit ); +} +can_hack( hackable ) +{ + if ( !isAlive( self ) ) + { + return false; + } + if ( self maps\_laststand::player_is_in_laststand() ) + { + return false; + } + if(!self hacker_active() ) + { + return false; + } + if( !isDefined( hackable._trigger ) ) + { + return false; + } + if( IsDefined(hackable.player) ) + { + if(hackable.player != self) + { + return false; + } + } + if(self throwbuttonpressed()) + { + return false; + } + if(self FragButtonPressed()) + { + return false; + } + if(IsDefined(hackable._hack_qualifier_func)) + { + if(!hackable [[hackable._hack_qualifier_func]](self)) + { + return false; + } + } + if( !is_in_array( level._hackable_objects, hackable ) ) + { + return false; + } + radsquared = 32 * 32; + if(IsDefined(hackable.radius)) + { + radsquared = hackable.radius * hackable.radius; + } + origin = hackable.origin; + if(IsDefined(hackable.entity)) + { + origin = hackable.entity.origin; + } + if(distance2dsquared(self.origin, origin) > radsquared) + { + return false; + } + if ( !IsDefined(hackable.no_touch_check) && !self IsTouching( hackable._trigger ) ) + { + return false; + } + if ( !self is_facing( hackable ) ) + { + return false; + } + if( !IsDefined(hackable.no_sight_check) && !SightTracePassed( self.origin + ( 0, 0, 50 ), origin, false, undefined ) ) + { + return false; + } + if( !IsDefined(hackable.no_bullet_trace) && !bullettracepassed(self.origin + (0,0,50), origin, false, undefined) ) + { + return false; + } + return true; +} +is_hacking( hackable ) +{ + return ( can_hack( hackable ) && self UseButtonPressed() ); +} +set_hack_hint_string() +{ + if(IsDefined(self._trigger)) + { + if(IsDefined(self.custom_string)) + { + self._trigger SetHintString(self.custom_string); + } + else + { + if(!IsDefined(self.script_int) || self.script_int <= 0) + { + self._trigger SetHintString(&"ZOMBIE_HACK_NO_COST"); + } + else + { + self._trigger SetHintString(&"ZOMBIE_HACK", self.script_int); + } + } + } +} +tidy_on_deregister(hackable) +{ + self endon("clean_up_tidy_up"); + hackable waittill("hackable_deregistered"); + if( isdefined( self.hackerProgressBar ) ) + { + self.hackerProgressBar maps\_hud_util::destroyElem(); + } + if( isdefined( self.hackerTextHud ) ) + { + self.hackerTextHud destroy(); + } +} +hacker_do_hack( hackable ) +{ + timer = 0; + hacked = false; + hackable._trigger.beingHacked = true; + if( !isdefined(self.hackerProgressBar) ) + { + self.hackerProgressBar = self maps\_hud_util::createPrimaryProgressBar(); + } + if( !isdefined(self.hackerTextHud) ) + { + self.hackerTextHud = newclientHudElem( self ); + } + hack_duration = hackable.script_float; + if(self hasperk( "specialty_fastreload")) + { + hack_duration *= 0.66; + } + hack_duration = max(1.5, hack_duration); + self thread tidy_on_deregister(hackable); + self.hackerProgressBar maps\_hud_util::updateBar( 0.01, 1 / hack_duration ); + self.hackerTextHud.alignX = "center"; + self.hackerTextHud.alignY = "middle"; + self.hackerTextHud.horzAlign = "center"; + self.hackerTextHud.vertAlign = "bottom"; + self.hackerTextHud.y = -113; + if ( IsSplitScreen() ) + { + self.hackerTextHud.y = -107; + } + self.hackerTextHud.foreground = true; + self.hackerTextHud.font = "default"; + self.hackerTextHud.fontScale = 1.8; + self.hackerTextHud.alpha = 1; + self.hackerTextHud.color = ( 1.0, 1.0, 1.0 ); + self.hackerTextHud setText( &"ZOMBIE_HACKING" ); + self playloopsound( "zmb_progress_bar", .5 ); + while( self is_hacking ( hackable ) ) + { + wait( 0.05 ); + timer += 0.05; + if ( self maps\_laststand::player_is_in_laststand() ) + { + break; + } + if( timer >= hack_duration) + { + hacked = true; + break; + } + } + self stoploopsound( .5 ); + if( hacked ) + { + self playsound( "vox_mcomp_hack_success" ); + } + else + { + self playsound( "vox_mcomp_hack_fail" ); + } + if( isdefined( self.hackerProgressBar ) ) + { + self.hackerProgressBar maps\_hud_util::destroyElem(); + } + if( isdefined( self.hackerTextHud ) ) + { + self.hackerTextHud destroy(); + } + hackable set_hack_hint_string(); + if(IsDefined(hackable._trigger)) + { + hackable._trigger.beingHacked = false; + } + self notify("clean_up_tidy_up"); + return hacked; +} +lowreadywatcher(player) +{ + player endon("disconnected"); + self endon("kill_lowreadywatcher"); + self waittill("hackable_deregistered"); + player setlowready(0); +} +hackable_object_thread() +{ + self endon("hackable_deregistered"); + height = 72; + radius = 64; + if(IsDefined(self.radius)) + { + radius = self.radius; + } + if(IsDefined(self.height)) + { + height = self.height; + } + if(!IsDefined(self.pooled)) + { + trigger = Spawn( "trigger_radius_use", self.origin, 0, radius, height); + trigger UseTriggerRequireLookAt(); + trigger SetCursorHint( "HINT_NOICON" ); + trigger.radius = radius; + trigger.height = height; + trigger.beingHacked = false; + self._trigger = trigger; + } + cost = 0; + if(IsDefined(self.script_int)) + { + cost = self.script_int; + } + duration = 1.0; + if(IsDefined(self.script_float)) + { + duration = self.script_float; + } + while(1) + { + wait(0.1); + if(!IsDefined(self._trigger)) + { + continue; + } + players = get_players(); + if(IsDefined(self._trigger)) + { + self._trigger SetHintString(""); + if(IsDefined(self.entity)) + { + self.origin = self.entity.origin; + self._trigger.origin = self.entity.origin; + if(IsDefined(self.trigger_offset)) + { + self._trigger.origin += self.trigger_offset; + } + } + } + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] can_hack( self ) ) + { + self set_hack_hint_string(); + break; + } + } + for ( i = 0; i < players.size; i++ ) + { + hacker = players[i]; + if ( !hacker is_hacking( self ) ) + { + continue; + } + if( hacker.score >= cost || cost <= 0) + { + hacker setlowready(1); + self thread lowreadywatcher(hacker); + hack_success = hacker hacker_do_hack( self ); + self notify("kill_lowreadywatcher"); + if(IsDefined(hacker)) + { + hacker setlowready(0); + } + if(IsDefined(hacker) && hack_success) + { + if(cost) + { + if(cost > 0) + { + hacker maps\_zombiemode_score::minus_to_player_score( cost ); + } + else + { + hacker maps\_zombiemode_score::add_to_player_score( cost * -1 ); + } + } + hacker notify( "successful_hack" ); + if(IsDefined(self._hack_callback_func)) + { + self thread [[self._hack_callback_func]](hacker); + } + } + } + else + { + hacker play_sound_on_ent( "no_purchase" ); + hacker maps\_zombiemode_audio::create_and_play_dialog( "general", "no_money", undefined, 1 ); + } + } + } +} +hacker_on_player_connect() +{ + for( ;; ) + { + level waittill( "connecting", player ); + struct = SpawnStruct(); + struct.origin = player.origin; + struct.radius = 48; + struct.height = 64; + struct.script_float = 10; + struct.script_int = 500; + struct.entity = player; + struct.trigger_offset = (0,0,48); + register_pooled_hackable_struct(struct, ::player_hack, ::player_qualifier); + struct thread player_hack_disconnect_watcher(player); + } +} +player_hack_disconnect_watcher(player) +{ + player waittill("disconnect"); + deregister_hackable_struct(self); +} +player_hack(hacker) +{ + if(IsDefined(self.entity)) + { + self.entity maps\_zombiemode_score::player_add_points( "hacker_transfer", 500 ); + } + if( isdefined( hacker ) ) + { + hacker thread maps\_zombiemode_audio::create_and_play_dialog( "general", "hack_plr" ); + } +} +player_qualifier(player) +{ + if(player == self.entity) + { + return false; + } + if(self.entity maps\_laststand::player_is_in_laststand()) + { + return false; + } + if(player maps\_laststand::player_is_in_laststand()) + { + return false; + } + if(is_true(self.entity.sessionstate == "spectator")) + { + return false; + } + return true; +} +hide_hint_when_hackers_active(custom_logic_func, custom_logic_func_param) +{ + invis_to_any = 0; + while(1) + { + if(IsDefined(custom_logic_func)) + { + self [[custom_logic_func]](custom_logic_func_param); + } + if(maps\_zombiemode_equip_hacker::any_hackers_active()) + { + players = get_players(); + for(i = 0; i < players.size; i ++) + { + if ( players[i] hacker_active() ) + { + self SetInvisibleToPlayer( players[i], true ); + invis_to_any = 1; + } + else + { + self SetInvisibleToPlayer( players[i], false ); + } + } + } + else + { + if(invis_to_any) + { + invis_to_any = 0; + players = get_players(); + for(i = 0; i < players.size; i ++) + { + self SetInvisibleToPlayer( players[i], false ); + } + } + } + wait(0.1); + } +} +hacker_debug_print( msg, color ) +{ +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_equipment.gsc b/BO1/PC/ZM/maps/_zombiemode_equipment.gsc new file mode 100644 index 0000000..fd8f777 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_equipment.gsc @@ -0,0 +1,323 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_audio; +init() +{ + init_equipment_upgrade(); +} +register_equipment( equipment_name, hint, howto_hint, equipmentVO, watcher_thread ) +{ + if ( !IsDefined( level.zombie_include_equipment ) || !is_true( level.zombie_include_equipment[equipment_name] ) ) + { + return; + } + PrecacheString( hint ); + struct = SpawnStruct(); + if ( !IsDefined( level.zombie_equipment ) ) + { + level.zombie_equipment = []; + } + struct.equipment_name = equipment_name; + struct.hint = hint; + struct.howto_hint = howto_hint; + struct.vox = equipmentVO; + struct.triggers = []; + struct.models = []; + struct.watcher_thread = watcher_thread; + level.zombie_equipment[equipment_name] = struct; +} +is_equipment_included( equipment_name ) +{ + if ( !IsDefined( level.zombie_include_equipment ) ) + { + return false; + } + return IsDefined( level.zombie_include_equipment[equipment_name] ); +} +include_zombie_equipment( equipment_name ) +{ + if ( !IsDefined( level.zombie_include_equipment ) ) + { + level.zombie_include_equipment = []; + } + level.zombie_include_equipment[equipment_name] = true; + PrecacheItem( equipment_name ); +} +init_equipment_upgrade() +{ + equipment_spawns = []; + equipment_spawns = GetEntArray( "zombie_equipment_upgrade", "targetname" ); + for( i = 0; i < equipment_spawns.size; i++ ) + { + hint_string = get_equipment_hint( equipment_spawns[i].zombie_equipment_upgrade ); + equipment_spawns[i] SetHintString( hint_string ); + equipment_spawns[i] setCursorHint( "HINT_NOICON" ); + equipment_spawns[i] UseTriggerRequireLookAt(); + equipment_spawns[i] add_to_equipment_trigger_list( equipment_spawns[i].zombie_equipment_upgrade ); + equipment_spawns[i] thread equipment_spawn_think(); + } +} +get_equipment_hint( equipment_name ) +{ + AssertEx( IsDefined( level.zombie_equipment[equipment_name] ), equipment_name + " was not included or is not registered with the equipment system." ); + return level.zombie_equipment[equipment_name].hint; +} +get_equipment_howto_hint( equipment_name ) +{ + AssertEx( IsDefined( level.zombie_equipment[equipment_name] ), equipment_name + " was not included or is not registered with the equipment system." ); + return level.zombie_equipment[equipment_name].howto_hint; +} +add_to_equipment_trigger_list( equipment_name ) +{ + AssertEx( IsDefined( level.zombie_equipment[equipment_name] ), equipment_name + " was not included or is not registered with the equipment system." ); + level.zombie_equipment[equipment_name].triggers[level.zombie_equipment[equipment_name].triggers.size] = self; + level.zombie_equipment[equipment_name].models[level.zombie_equipment[equipment_name].models.size] = GetEnt( self.target, "targetname" ); +} +equipment_spawn_think() +{ + for ( ;; ) + { + self waittill( "trigger", player ); + if ( player in_revive_trigger() || player is_drinking() ) + { + wait( 0.1 ); + continue; + } + if( is_limited_equipment(self.zombie_equipment_upgrade)) + { + player setup_limited_equipment(self.zombie_equipment_upgrade); + if(isDefined(level.hacker_tool_positions)) + { + new_pos = random(level.hacker_tool_positions); + self.origin = new_pos.trigger_org; + model = getent(self.target,"targetname"); + model.origin = new_pos.model_org; + model.angles = new_pos.model_ang; + } + } + player equipment_give( self.zombie_equipment_upgrade ); + } +} +set_equipment_invisibility_to_player( equipment, invisible ) +{ + triggers = level.zombie_equipment[equipment].triggers; + for ( i = 0; i < triggers.size; i++ ) + { + if(isDefined(triggers[i])) + { + triggers[i] SetInvisibleToPlayer( self, invisible ); + } + } + models = level.zombie_equipment[equipment].models; + for ( i = 0; i < models.size; i++ ) + { + if(isDefined(models[i])) + { + models[i] SetInvisibleToPlayer( self, invisible ); + } + } +} +equipment_take() +{ + equipment = self get_player_equipment(); + if ( !isdefined( equipment ) ) + { + return; + } + if(self.current_equipment_active[equipment]) + { + self.current_equipment_active[equipment] = false; + self notify(equipment + "_deactivate"); + } + self notify(equipment + "_taken"); + self TakeWeapon( equipment ); + if( (!is_limited_equipment(equipment) ) || (is_limited_equipment(equipment) && !limited_equipment_in_use(equipment) )) + { + self set_equipment_invisibility_to_player( equipment, false ); + } + self set_player_equipment( undefined ); +} +equipment_give( equipment ) +{ + if ( self is_player_equipment( equipment ) ) + { + return; + } + curr_weapon = self GetCurrentWeapon(); + curr_weapon_was_curr_equipment = self is_player_equipment( curr_weapon ); + self equipment_take(); + if ( curr_weapon_was_curr_equipment ) + { + primaryWeapons = self GetWeaponsListPrimaries(); + if ( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 ) + { + self SwitchToWeapon( primaryWeapons[0] ); + } + } + self set_player_equipment( equipment ); + self GiveWeapon( equipment ); + self thread show_equipment_hint( equipment ); + self notify(equipment + "_given"); + self set_equipment_invisibility_to_player( equipment, true ); + self setactionslot( 1, "weapon", equipment ); + if(IsDefined(level.zombie_equipment[equipment].watcher_thread)) + { + self thread [[level.zombie_equipment[equipment].watcher_thread]](); + } + self thread equipment_slot_watcher(equipment); + self maps\_zombiemode_audio::create_and_play_dialog( "weapon_pickup", level.zombie_equipment[equipment].vox ); +} +equipment_slot_watcher(equipment) +{ + self notify("kill_equipment_slot_watcher"); + self endon("kill_equipment_slot_watcher"); + self endon("disconnect"); + while(1) + { + self waittill( "weapon_change", curr_weapon, prev_weapon ); + self.prev_weapon_before_equipment_change = undefined; + if ( isdefined( prev_weapon ) && "none" != prev_weapon ) + { + prev_weapon_type = WeaponInventoryType( prev_weapon ); + if ( "primary" == prev_weapon_type || "altmode" == prev_weapon_type ) + { + self.prev_weapon_before_equipment_change = prev_weapon; + } + } + if ( IsDefined( level.zombie_equipment[equipment].watcher_thread ) ) + { + if ( curr_weapon == equipment ) + { + if ( self.current_equipment_active[equipment] == true ) + { + self notify( equipment + "_deactivate" ); + self.current_equipment_active[equipment] = false; + } + else if ( self.current_equipment_active[equipment] == false ) + { + self notify( equipment + "_activate" ); + self.current_equipment_active[equipment] = true; + } + self waittill( "equipment_select_response_done" ); + } + } + else + { + if ( curr_weapon == equipment && !self.current_equipment_active[equipment] ) + { + self notify( equipment + "_activate" ); + self.current_equipment_active[equipment] = true; + } + else if ( curr_weapon != equipment && self.current_equipment_active[equipment] ) + { + self notify( equipment + "_deactivate" ); + self.current_equipment_active[equipment] = false; + } + } + } +} +is_limited_equipment(equipment) +{ + if(isDefined(level._limited_equipment)) + { + for(i=0;i 40 && z_dist < 135 ) + { + z_dist *= 2.5; + forward_scaling = 1.1; + } + else if( z_dist >= 135 ) + { + z_dist *= 2.7; + forward_scaling = 1.3; + } + else if( z_dist < 0 ) + { + z_dist *= 2.4; + forward_scaling = 1.0; + } + z_velocity = 2 * z_dist * world_gravity; + if( z_velocity < 0 ) + { + z_velocity *= -1; + } + if( z_dist < 0 ) + { + z_dist *= -1; + } + jump_time = Sqrt( 2 * pad_dist / world_gravity ); + jump_time_2 = Sqrt( 2 * z_dist / world_gravity ); + jump_time = jump_time + jump_time_2; + if( jump_time < 0 ) + { + jump_time *= -1; + } + x = jump_velocity[0] * forward_scaling / jump_time; + y = jump_velocity[1] * forward_scaling / jump_time; + z = z_velocity / jump_time; + fling_this_way = ( x, y, z ); + } + if( IsDefined( end_point.target ) ) + { + poi_spot = getstruct( end_point.target, "targetname" ); + } + else + { + poi_spot = end_point; + } + if( !IsDefined( self.script_index ) ) + { + ent_player.script_index = undefined; + } + else + { + ent_player.script_index = self.script_index; + } + if( IsDefined( self.script_start ) && self.script_start == 1 ) + { + if( !is_true( ent_player._padded ) ) + { + self playsound( "evt_jump_pad_launch" ); + playfx(level._effect["jump_pad_jump"],self.origin); + ent_player thread jump_pad_move( fling_this_way, jump_time, poi_spot ); + if( IsDefined( self.script_label ) ) + { + level notify( self.script_label ); + } + } + } + else + { + if( ent_player IsOnGround() && !is_true( ent_player._padded ) ) + { + self playsound( "evt_jump_pad_launch" ); + playfx(level._effect["jump_pad_jump"],self.origin); + ent_player thread jump_pad_move( fling_this_way, jump_time, poi_spot ); + if( IsDefined( self.script_label ) ) + { + level notify( self.script_label ); + } + } + } +} +jump_pad_cancel( ent_player ) +{ + ent_player notify( "left_jump_pad" ); + if( IsDefined( ent_player.poi_spot ) && !is_true( ent_player._padded ) ) + { + } + if( IsDefined( self.name ) ) + { + self._action_overrides = StrTok( self.name, "," ); + if( IsDefined( self._action_overrides ) ) + { + for( i = 0; i < self._action_overrides.size; i++ ) + { + ent_player jump_pad_player_overrides( self._action_overrides[i] ); + } + } + } +} +jump_pad_move( vec_direction, flt_time, struct_poi ) +{ + self endon( "death" ); + self endon( "disconnect" ); + start_time = GetTime(); + jump_time = flt_time * 500; + attract_dist = undefined; + num_attractors = 30; + added_poi_value = 0; + start_turned_on = true; + poi_start_func = undefined; + while( is_true( self.divetoprone ) || is_true( self._padded ) ) + { + wait( 0.05 ); + } + self._padded = 1; + self.lander = 1; + self SetStance( "stand" ); + wait( 0.1 ); + if( IsDefined( self.poi_spot ) ) + { + level jump_pad_ignore_poi_cleanup( self.poi_spot ); + self.poi_spot deactivate_zombie_point_of_interest(); + self.poi_spot Delete(); + } + if( IsDefined( struct_poi ) ) + { + self.poi_spot = Spawn( "script_origin", struct_poi.origin ); + if( IsDefined( level._pad_poi_ignore ) ) + { + level [[level._pad_poi_ignore]]( self.poi_spot ); + } + self thread jump_pad_enemy_follow_or_ignore( self.poi_spot ); + if( IsDefined( level._jump_pad_poi_start_override ) && !is_true( self.script_index ) ) + { + poi_start_func = level._jump_pad_poi_start_override; + } + if( IsDefined( level._jump_pad_poi_end_override ) ) + { + poi_end_func = level._jump_pad_poi_end_override; + } + self.poi_spot create_zombie_point_of_interest( attract_dist, num_attractors, added_poi_value, start_turned_on, poi_start_func ); + } + self SetOrigin( self.origin + ( 0, 0, 1 ) ); + if( 20 >= randomintrange( 0, 101 ) ) + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "jumppad" ); + } + while( GetTime() - start_time < jump_time ) + { + self SetVelocity( vec_direction ); + wait( 0.05 ); + } + while( !self IsOnGround() ) + { + wait( 0.05 ); + } + self._padded = 0; + self.lander = 0; + jump_pad_triggers = GetEntArray( "trig_jump_pad", "targetname" ); + for( i = 0; i < jump_pad_triggers.size; i++ ) + { + if( self IsTouching( jump_pad_triggers[i] ) ) + { + level thread failsafe_pad_poi_clean( jump_pad_triggers[i], self.poi_spot ); + return; + } + } + if( IsDefined( self.poi_spot ) ) + { + level jump_pad_ignore_poi_cleanup( self.poi_spot ); + self.poi_spot Delete(); + } +} +failsafe_pad_poi_clean( ent_trig, ent_poi ) +{ + if( IsDefined( ent_trig.script_wait ) ) + { + wait( ent_trig.script_wait ); + } + else + { + wait( 0.5 ); + } + if( IsDefined( ent_poi ) ) + { + level jump_pad_ignore_poi_cleanup( ent_poi ); + ent_poi deactivate_zombie_point_of_interest(); + ent_poi Delete(); + } +} +jump_pad_enemy_follow_or_ignore( ent_poi ) +{ + self endon( "death" ); + self endon( "disconnect" ); + zombies = GetAIArray( "axis" ); + for( i = 0; i < zombies.size; i++ ) + { + players = GetPlayers(); + if( IsDefined( zombies[i] ) && IsDefined( zombies[i].enemy ) && zombies[i].enemy != self && players.size > 1 ) + { + zombies[i] thread add_poi_to_ignore_list( ent_poi ); + } + else + { + zombies[i].ignore_distance_tracking = true; + zombies[i]._pad_follow = 1; + zombies[i] thread stop_chasing_the_sky( ent_poi ); + } + } +} +jump_pad_ignore_poi_cleanup( ent_poi ) +{ + zombies = GetAIArray( "axis" ); + for( i = 0; i < zombies.size; i++ ) + { + if( IsDefined( zombies[i] ) ) + { + if( is_true( zombies[i]._pad_follow ) ) + { + zombies[i]._pad_follow = 0; + zombies[i] notify( "stop_chasing_the_sky" ); + zombies[i].ignore_distance_tracking = false; + } + if( IsDefined( ent_poi ) ) + { + zombies[i] thread remove_poi_from_ignore_list( ent_poi ); + } + } + } +} +stop_chasing_the_sky( ent_poi ) +{ + self endon( "death" ); + self endon( "stop_chasing_the_sky" ); + while( is_true( self._pad_follow ) ) + { + flesh = get_closest_valid_player( self.origin ); + if( IsDefined( flesh ) && Distance2D( flesh.origin, self.origin ) < 10 * 10 + && IsDefined( self.favoriteenemy ) && flesh != self.favoriteenemy ) + { + self add_poi_to_ignore_list( ent_poi ); + return; + } + wait( 0.1 ); + } + self._pad_follow = 0; + self.ignore_distance_tracking = false; + self notify( "stop_chasing_the_sky" ); +} +jump_pad_player_overrides( st_behavior, int_clean ) +{ + if( !IsDefined( st_behavior ) || !IsString( st_behavior ) ) + { + return; + } + if( !IsDefined( int_clean ) ) + { + int_clean = 0; + } + switch( st_behavior ) + { + case "no_sprint": + if( !int_clean ) + { + } + else + { + } + break; + default: + if( IsDefined( level._jump_pad_level_behavior ) ) + { + self [[ level._jump_pad_level_behavior ]]( st_behavior, int_clean ); + } + else + { + } + break; + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_load.gsc b/BO1/PC/ZM/maps/_zombiemode_load.gsc new file mode 100644 index 0000000..1222e2b --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_load.gsc @@ -0,0 +1,679 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_hud_util; +#include maps\_load_common; +#include maps\_zombiemode_utility; +#using_animtree("generic_human"); +main( bScriptgened,bCSVgened,bsgenabled ) +{ + level.SPAWNFLAG_MODEL_DYNAMIC_PATH = 1; + level.SPAWNFLAG_TRIGGER_AI_AXIS = 1; + level.SPAWNFLAG_TRIGGER_AI_ALLIES = 2; + level.SPAWNFLAG_TRIGGER_AI_NEUTRAL = 4; + level.SPAWNFLAG_TRIGGER_NOT_PLAYER = 8; + level.SPAWNFLAG_TRIGGER_VEHICLE = 16; + level.SPAWNFLAG_TRIGGER_SPAWN = 32; + level.SPAWNFLAG_TRIGGER_TOUCH_ONCE = 64; + level.SPAWNFLAG_TRIGGER_SPAWN_MANAGER = 512; + level.SPAWNFLAG_TRIGGER_TRIGGER_ONCE = 1024; + level.SPAWNFLAG_ACTOR_SPAWNER = 1; + level.SPAWNFLAG_ACTOR_SCRIPTFORCESPAWN = 16; + level.SPAWNFLAG_ACTOR_SM_PRIORITY = 32; + level.SPAWNFLAG_VEHICLE_NODE_START_NODE = 1; + level.SPAWNFLAG_VEHICLE_USEABLE = 1; + level.SPAWNFLAG_VEHICLE_SPAWNER = 2; + level.SPAWNFLAG_TURRET_PREPLACED = 1; + level.SPAWNFLAG_PATH_NOT_CHAIN = 2; + level.SPAWNFLAG_PATH_DONT_STAND = 4; + level.SPAWNFLAG_PATH_DONT_CROUCH = 8; + level.SPAWNFLAG_PATH_DONT_PRONE = 16; + level.SPAWNFLAG_PATH_DISABLED = 512; + level.SPAWNFLAG_PATH_DONT_LEFT = 1024; + level.SPAWNFLAG_PATH_BALCONY = 1024; + level.SPAWNFLAG_PATH_DONT_RIGHT = 2048; + level.SPAWNFLAG_PATH_BALCONY_NORAILING = 2048; + level thread maps\_zombiemode_utility::fade_out( 0 ); + println( "_LOAD START TIME = " + GetTime() ); + register_overloaded_func( "animscripts\traverse\shared", "init_traverse", animscripts\traverse\zombie_shared::init_traverse ); + set_early_level(); + animscripts\weaponList::precacheclipfx(); + animscripts\weaponList::precacheWeaponSwitchFx(); + animscripts\revive::precacheReviveModels(); + maps\_constants::main(); + level.scr_anim[ "generic" ][ "signal_onme" ] = %CQB_stand_wave_on_me; + level.scr_anim[ "generic" ][ "signal_go" ] = %CQB_stand_wave_go_v1; + level.scr_anim[ "generic" ][ "signal_stop" ] = %CQB_stand_signal_stop; + level.scr_anim[ "generic" ][ "signal_moveup" ] = %CQB_stand_signal_move_up; + level.scr_anim[ "generic" ][ "signal_moveout" ] = %CQB_stand_signal_move_out; + if( !IsDefined( level.script_gen_dump_reasons ) ) + { + level.script_gen_dump_reasons = []; + } + if( !IsDefined( bsgenabled ) ) + { + level.script_gen_dump_reasons[level.script_gen_dump_reasons.size] = "First run"; + } + if( !IsDefined( bCSVgened ) ) + { + bCSVgened = false; + } + level.bCSVgened = bCSVgened; + if( !IsDefined( bScriptgened ) ) + { + bScriptgened = false; + } + else + { + bScriptgened = true; + } + level.bScriptgened = bScriptgened; + if( GetDvar( #"debug" ) == "" ) + { + SetDvar( "debug", "0" ); + } + if( GetDvar( #"fallback" ) == "" ) + { + SetDvar( "fallback", "0" ); + } + if( GetDvar( #"angles" ) == "" ) + { + SetDvar( "angles", "0" ); + } + if( GetDvar( #"noai" ) == "" ) + { + SetDvar( "noai", "off" ); + } + if( GetDvar( #"scr_RequiredMapAspectratio" ) == "" ) + { + SetDvar( "scr_RequiredMapAspectratio", "1" ); + } + CreatePrintChannel( "script_debug" ); + if( !IsDefined( anim.notetracks ) ) + { + anim.notetracks = []; + animscripts\zombie_shared::registerNoteTracks(); + } + level._loadStarted = true; + level.first_frame = true; + level.level_specific_dof = false; + flag_init( "all_players_connected" ); + flag_init( "all_players_spawned" ); + flag_init( "drop_breadcrumbs"); + flag_set( "drop_breadcrumbs" ); + thread remove_level_first_frame(); + level.wait_any_func_array = []; + level.run_func_after_wait_array = []; + level.do_wait_endons_array = []; + level.script = Tolower( GetDvar( #"mapname" ) ); + level.radiation_totalpercent = 0; + level.clientscripts = ( GetDvar( #"cg_usingClientScripts" ) != "" );; + level._client_exploders = []; + level._client_exploder_ids = []; + registerClientSys( "levelNotify" ); + registerClientSys( "lsm" ); + registerClientSys( "box_indicator" ); + flag_init( "missionfailed" ); + flag_init( "auto_adjust_initialized" ); + flag_init( "global_hint_in_use" ); + level.default_run_speed = 190; + SetSavedDvar( "g_speed", level.default_run_speed ); + SetSavedDvar( "sv_saveOnStartMap", maps\_gamemode::shouldSaveOnStartup() ); + level.dronestruct = []; + struct_class_init(); + if( !IsDefined( level.flag ) ) + { + level.flag = []; + level.flags_lock = []; + } + else + { + flags = GetArrayKeys( level.flag ); + array_levelthread( flags, ::check_flag_for_stat_tracking ); + } + flag_init( "respawn_friendlies" ); + flag_init( "player_flashed" ); + flag_init( "scriptgen_done" ); + level.script_gen_dump_reasons = []; + if( !IsDefined( level.script_gen_dump ) ) + { + level.script_gen_dump = []; + level.script_gen_dump_reasons[0] = "First run"; + } + if( !IsDefined( level.script_gen_dump2 ) ) + { + level.script_gen_dump2 = []; + } + if( IsDefined( level.createFXent ) ) + { + script_gen_dump_addline( "maps\\createfx\\"+level.script+"_fx::main(); ", level.script+"_fx" ); + } + if( IsDefined( level.script_gen_dump_preload ) ) + { + for( i = 0; i < level.script_gen_dump_preload.size; i++ ) + { + script_gen_dump_addline( level.script_gen_dump_preload[i].string, level.script_gen_dump_preload[i].signature ); + } + } + level.last_mission_sound_time = -5000; + level.hero_list = []; + level.ai_array = []; + thread precache_script_models(); + PrecacheHeadIcon( "headicon_american" ); + PrecacheModel( "tag_origin" ); + PrecacheModel( "tag_origin_animate" ); + PrecacheShellShock( "level_end" ); + PrecacheShellShock( "default" ); + PrecacheShellShock( "flashbang" ); + PrecacheShellShock( "dog_bite" ); + PrecacheShellShock( "pain" ); + PrecacheRumble( "damage_heavy" ); + precacherumble( "dtp_rumble" ); + precacherumble( "slide_rumble" ); + PrecacheRumble( "damage_light" ); + PrecacheRumble( "grenade_rumble" ); + PrecacheRumble( "artillery_rumble" ); + PrecacheRumble( "reload_small" ); + PrecacheRumble( "reload_medium" ); + PrecacheRumble( "reload_large" ); + PrecacheRumble( "reload_clipin" ); + PrecacheRumble( "reload_clipout" ); + PrecacheRumble( "reload_rechamber" ); + PrecacheRumble( "pullout_small" ); + PrecacheString( &"GAME_GET_TO_COVER" ); + PrecacheString( &"SCRIPT_GRENADE_DEATH" ); + PrecacheString( &"SCRIPT_GRENADE_SUICIDE_LINE1" ); + PrecacheString( &"SCRIPT_GRENADE_SUICIDE_LINE2" ); + PrecacheString( &"SCRIPT_EXPLODING_VEHICLE_DEATH" ); + PrecacheString( &"SCRIPT_EXPLODING_BARREL_DEATH" ); + PrecacheString( &"STARTS_AVAILABLE_STARTS" ); + PrecacheString( &"STARTS_CANCEL" ); + PrecacheString( &"STARTS_DEFAULT" ); + if ( GetDvar( #"zombiemode" ) != "1" ) + { + PreCacheShader( "overlay_low_health_splat" ); + } + PrecacheShader( "overlay_low_health" ); + PrecacheShader( "overlay_low_health_compass" ); + PrecacheShader( "hud_grenadeicon" ); + PrecacheShader( "hud_grenadepointer" ); + PrecacheShader( "hud_burningcaricon" ); + PrecacheShader( "hud_burningbarrelicon" ); + PrecacheShader( "black" ); + PrecacheShader( "white" ); + PreCacheShellShock( "death" ); + PreCacheShellShock( "explosion" ); + PreCacheShellShock( "tank_mantle" ); + if(isdefined(level._gamemode_precache)) + { + [[level._gamemode_precache]](); + } + WaterSimEnable( false ); + level.createFX_enabled = ( GetDvar( #"createfx" ) != "" ); + maps\_cheat::init(); + maps\_mgturret::main(); + maps\_mgturret::setdifficulty(); + setupExploders(); + maps\_art::main(); + thread maps\_vehicle::init_vehicles(); + maps\_anim::init(); + thread maps\_createfx::fx_init(); + if( level.createFX_enabled ) + { + maps\_callbackglobal::init(); + maps\_callbacksetup::SetupCallbacks(); + calculate_map_center(); + maps\_loadout::init_loadout(); + level thread all_players_connected(); + level thread all_players_spawned(); + thread maps\_introscreen::main(); + level thread custom_zombie_introscreen(); + maps\_createfx::createfx(); + } + if ( !isDefined(level.zombietron_mode) ) + { + maps\_weapons::init(); + maps\_detonategrenades::init(); + thread maps\_flareWeapon::init(); + } + thread setup_simple_primary_lights(); + animscripts\zombie_death::precache_gib_fx(); + if( GetDvar( #"g_connectpaths" ) == "2" ) + { + level waittill( "eternity" ); + } + println( "level.script: ", level.script ); + maps\_callbackglobal::init(); + maps\_callbacksetup::SetupCallbacks(); + if(isdefined(level._gamemode_initcallbacks)) + { + [[level._gamemode_initcallbacks]](); + } + maps\_autosave::main(); + maps\_anim::init(); + maps\_busing::businit(); + maps\_music::music_init(); + maps\_dds::dds_init(); + if(!IsDefined(level.reviveFeature)) + level.reviveFeature = true; + anim.useFacialAnims = false; + if( !IsDefined( level.missionfailed ) ) + { + level.missionfailed = false; + } + if( !IsDefined( level.blindfireTimeMin ) ) + { + level.blindfireTimeMin = 3000; + } + if( !IsDefined( level.blindfireTimeMax ) ) + { + level.blindfireTimeMax = 12000; + } + if( !IsDefined( level.secondBlindfireChance ) ) + { + level.secondBlindfireChance = 50; + } + if(isDefined(level.skill_override)) + { + maps\_gameskill::setSkill(undefined,level.skill_override); + } + else + { + maps\_gameskill::setSkill(); + } + if ( isdefined( level.zombiemode_precache_player_model_override ) ) + { + if( !IsDefined( level.player_loadout ) ) + { + level.player_loadout = []; + level.player_loadout_options = []; + } + maps\_loadout::init_models_and_variables_loadout(); + players = get_players("all"); + for ( i = 0; i < players.size; i++ ) + { + players[i] maps\_loadout::give_loadout(); + players[i].pers["class"] = "closequarters"; + } + level.loadoutComplete = true; + level notify("loadout complete"); + [[ level.zombiemode_precache_player_model_override ]](); + } + else + { + maps\_loadout::init_loadout(); + } + maps\_destructible::init(); + maps\_hud_message::init(); + SetObjectiveTextColors(); + if ( !isDefined(level.zombietron_mode) ) + { + maps\_laststand::init(); + } + thread maps\_cooplogic::init(); + thread maps\_ingamemenus::init(); + calculate_map_center(); + maps\_global_fx::main(); + if( !IsDefined( level.campaign ) ) + { + level.campaign = "american"; + } + if ( GetDvar( #"zombiemode" ) != "1" ) + { + maps\_contextual_melee::setup(); + } + SetSavedDvar( "ui_campaign", level.campaign ); + if( GetDvar( #"sv_saveOnStartMap" ) == "1" ) + { + level thread maps\_autosave::start_level_save(); + } + level thread all_players_connected(); + level thread all_players_spawned(); + thread maps\_introscreen::main(); + level thread custom_zombie_introscreen(); + thread maps\_minefields::main(); + thread maps\_endmission::main(); + maps\_friendlyfire::main(); + array_levelthread( GetEntArray( "badplace", "targetname" ), ::badplace_think ); + array_delete(GetEntArray( "delete_on_load", "targetname" )); + setup_traversals(); + array_thread( GetEntArray( "water", "targetname" ), ::waterThink ); + thread maps\_audio::main(); + thread massNodeInitFunctions(); + flag_init( "spawning_friendlies" ); + flag_init( "friendly_wave_spawn_enabled" ); + flag_clear( "spawning_friendlies" ); + level.spawn_funcs = []; + level.spawn_funcs["allies"] = []; + level.spawn_funcs["axis"] = []; + level.spawn_funcs["neutral"] = []; + thread maps\_spawner::goalVolumes(); + level.trigger_hint_string = []; + level.trigger_hint_func = []; + level.fog_trigger_current = undefined; + if( !IsDefined( level.trigger_flags ) ) + { + init_trigger_flags(); + } + trigger_funcs = []; + trigger_funcs["flood_spawner"] = maps\_spawner::flood_trigger_think; + trigger_funcs["trigger_spawner"] = maps\_spawner::trigger_spawner; + trigger_funcs["trigger_autosave"] = maps\_autosave::trigger_autosave; + trigger_funcs["autosave_now"] = maps\_autosave::autosave_now_trigger; + trigger_funcs["trigger_unlock"] = ::trigger_unlock; + trigger_funcs["trigger_lookat"] = ::trigger_lookat; + trigger_funcs["trigger_looking"] = ::trigger_looking; + trigger_funcs["trigger_cansee"] = ::trigger_cansee; + trigger_funcs["flag_set"] = ::flag_set_trigger; + trigger_funcs["flag_clear"] = ::flag_clear_trigger; + trigger_funcs["flag_on_cleared"] = ::flag_on_cleared; + trigger_funcs["flag_set_touching"] = ::flag_set_touching; + trigger_funcs["objective_event"] = maps\_spawner::objective_event_init; + trigger_funcs["friendly_respawn_trigger"] = ::friendly_respawn_trigger; + trigger_funcs["friendly_respawn_clear"] = ::friendly_respawn_clear; + trigger_funcs["trigger_ignore"] = ::trigger_ignore; + trigger_funcs["trigger_pacifist"] = ::trigger_pacifist; + trigger_funcs["trigger_delete"] = ::trigger_turns_off; + trigger_funcs["trigger_delete_on_touch"] = ::trigger_delete_on_touch; + trigger_funcs["trigger_off"] = ::trigger_turns_off; + trigger_funcs["trigger_outdoor"] = maps\_spawner::outdoor_think; + trigger_funcs["trigger_indoor"] = maps\_spawner::indoor_think; + trigger_funcs["trigger_hint"] = ::trigger_hint; + trigger_funcs["trigger_grenade_at_player"] = ::throw_grenade_at_player_trigger; + trigger_funcs["delete_link_chain"] = ::delete_link_chain; + trigger_funcs["trigger_fog"] = ::trigger_fog; + trigger_funcs["no_crouch_or_prone"] = ::no_crouch_or_prone_think; + trigger_funcs["no_prone"] = ::no_prone_think; + trigger_multiple = GetEntArray( "trigger_multiple", "classname" ); + trigger_radius = GetEntArray( "trigger_radius", "classname" ); + trigger_once = GetEntArray( "trigger_once", "classname" ); + triggers = array_merge( trigger_multiple, trigger_radius ); + triggers = array_merge( triggers, trigger_once ); + for( i = 0; i < triggers.size; i++ ) + { + if( triggers[i] has_spawnflag(level.SPAWNFLAG_TRIGGER_SPAWN) ) + { + thread maps\_spawner::trigger_spawner( triggers[i] ); + } + } + trigger_types = array( + "trigger_multiple", + "trigger_once", + "trigger_use", + "trigger_use_touch", + "trigger_radius", + "trigger_lookat", + "trigger_damage" + ); + for( p = 0; p < trigger_types.size; p++ ) + { + triggertype = trigger_types[p]; + triggers = GetEntArray( triggertype, "classname" ); + for( i = 0; i < triggers.size; i++ ) + { + if ((triggertype != "trigger_once") && triggers[i] has_spawnflag(level.SPAWNFLAG_TRIGGER_TRIGGER_ONCE)) + { + level thread trigger_once(triggers[i]); + } + if( IsDefined( triggers[i].script_flag_true ) ) + { + level thread script_flag_true_trigger( triggers[i] ); + } + if( IsDefined( triggers[i].script_flag_set ) ) + { + level thread flag_set_trigger( triggers[i], triggers[i].script_flag_set ); + } + if( IsDefined( triggers[i].script_flag_clear ) ) + { + level thread flag_clear_trigger( triggers[i], triggers[i].script_flag_clear ); + } + if( IsDefined( triggers[i].script_flag_false ) ) + { + level thread script_flag_false_trigger( triggers[i] ); + } + if( IsDefined( triggers[i].script_autosavename ) || IsDefined( triggers[i].script_autosave ) ) + { + level thread maps\_autosave::autosave_name_think( triggers[i] ); + } + if( IsDefined( triggers[i].script_fallback ) ) + { + level thread maps\_spawner::fallback_think( triggers[i] ); + } + if( IsDefined( triggers[i].script_mgTurretauto ) ) + { + level thread maps\_mgturret::mgTurret_auto( triggers[i] ); + } + if( IsDefined( triggers[i].script_killspawner ) ) + { + level thread maps\_spawner::kill_spawner_trigger( triggers[i] ); + } + if( IsDefined( triggers[i].script_emptyspawner ) ) + { + level thread maps\_spawner::empty_spawner( triggers[i] ); + } + if( IsDefined( triggers[i].script_prefab_exploder ) ) + { + triggers[i].script_exploder = triggers[i].script_prefab_exploder; + } + if( IsDefined( triggers[i].script_exploder ) ) + { + level thread exploder_load( triggers[i] ); + } + if( IsDefined( triggers[i].script_bctrigger ) ) + { + level thread bctrigger( triggers[i] ); + } + if( IsDefined( triggers[i].script_trigger_group ) ) + { + triggers[i] thread trigger_group(); + } + if( IsDefined( triggers[i].script_notify ) ) + { + level thread trigger_notify( triggers[i], triggers[i].script_notify ); + } + if( IsDefined( triggers[i].targetname ) ) + { + targetname = triggers[i].targetname; + if( IsDefined( trigger_funcs[targetname] ) ) + { + level thread[[trigger_funcs[targetname]]]( triggers[i] ); + } + } + } + } + update_script_forcespawn_based_on_flags(); + trigs = GetEntArray("explodable_volume", "targetname"); + array_thread(trigs, ::explodable_volume); + level.ai_number = 0; + level.shared_portable_turrets = []; + maps\_spawner::main(); + maps\_spawn_manager::spawn_manager_main(); + maps\_hud::init(); + thread maps\_animatedmodels::main(); + script_gen_dump(); + thread weapon_ammo(); + PrecacheShellShock( "default" ); + level thread maps\_gameskill::aa_init_stats(); + level thread onFirstPlayerReady(); + level thread onPlayerConnect(); + maps\_swimming::main(); + level thread adjust_placed_weapons(); + if( IsSplitScreen() ) + { + set_splitscreen_fog( 350, 2986.33, 10000, -480, 0.805, 0.715, 0.61, 0.0, 10000 ); + } + level notify( "load main complete" ); + if(level.zombie_anim_intro && IsDefined(level.zombiemode_anim_intro_scenes) && IsDefined(level.zombiemode_animated_intro)) + { + [[level.zombiemode_animated_intro]](level.zombiemode_anim_intro_scenes); + } + if(IsDefined(level.zombiemode_sidequest_init)) + { + [[level.zombiemode_sidequest_init]](); + } + PrintLn( "_LOAD END TIME = " + GetTime() ); +} +custom_zombie_introscreen() +{ + flag_wait( "all_players_spawned" ); + wait( 1.5 ); + level thread maps\_zombiemode_utility::fade_in(); +} +onPlayerConnect() +{ + for( ;; ) + { + level waittill( "connecting", player ); + if( !IsDefined( player.a ) ) + { + player.a = SpawnStruct(); + } + player thread animscripts\zombie_init::onPlayerConnect(); + player thread onPlayerSpawned(); + player thread onPlayerDisconnect(); + if( IsSplitScreen() ) + { + SetDvar( "r_watersim", false ); + } + } +} +onPlayerDisconnect() +{ + self waittill( "disconnect" ); + if( IsSplitScreen() ) + { + SetDvar( "r_watersim", true ); + } +} +onPlayerSpawned() +{ + self endon( "disconnect" ); + for( ;; ) + { + self GiveWeapon( "m1911_zm" ); + self SetSpawnWeapon( "m1911_zm" ); + self waittill( "spawned_player" ); + if( level.mutators[ "mutator_susceptible" ] ) + { + self.maxhealth = 50; + self.health = 50; + } + else + { + self.maxhealth = 100; + } + self.attackeraccuracy = 1; + self.pers["class"] = "closequarters"; + self.pers["team"] = "allies"; + println( "player health: "+self.health ); + if( level.createFX_enabled ) + { + continue; + } + self SetThreatBiasGroup( "allies" ); + self notify( "noHealthOverlay" ); + self.starthealth = self.maxhealth; + self.shellshocked = false; + self.inWater = false; + self DetachAll(); + players = get_players(); + if( players.size == 1 && (1 != GetDvarInt( #"zombiefive_norandomchar" )) ) + { + self.zm_random_char = RandomInt( 4 ); + } + if ( isdefined( level.zombiemode_give_player_model_override ) ) + { + self [[ level.zombiemode_give_player_model_override ]]( self GetEntityNumber() ); + if( IsDefined( level.player_viewmodel ) ) + { + self SetViewModel( level.player_viewmodel ); + } + } + else + { + self maps\_loadout::give_model( self.pers["class"] ); + } + maps\_loadout::give_loadout( true ); + self notify ( "CAC_loadout"); + if ( !isDefined(level.zombietron_mode) ) + { + players = get_players(); + if( players.size == 1 && IsDefined( self.zm_random_char ) ) + { + self player_set_viewmodel( self.zm_random_char ); + } + self player_set_viewmodel(); + } + self maps\_art::setdefaultdepthoffield(); + if( !IsDefined( self.player_inited ) || !self.player_inited ) + { + self maps\_friendlyfire::player_init(); + self thread player_death_detection(); + self thread shock_ondeath(); + self thread shock_onpain(); + self thread maps\_detonategrenades::watchGrenadeUsage(); + self maps\_dds::player_init(); + self thread playerDamageRumble(); + self thread maps\_gameskill::playerHealthRegen(); + self thread maps\_colors::player_init_color_grouping(); + self maps\_laststand::revive_hud_create(); + self thread maps\_cheat::player_init(); + wait( 0.05 ); + self.player_inited = true; + } + } +} +player_set_viewmodel( zm_random_solo_char ) +{ + if( IsDefined( zm_random_solo_char ) ) + { + self.entity_num = zm_random_solo_char; + } + if( !IsDefined( self.entity_num ) ) + { + self.entity_num = self GetEntityNumber(); + } + if ( isdefined( level.zombiemode_player_set_viewmodel_override ) ) + { + [[ level.zombiemode_player_set_viewmodel_override ]]( self.entity_num ); + } + else if( IsSubStr( level.script, "zombie_theater" ) ) + { + switch( self.entity_num ) + { + case 0: + self SetViewModel( "viewmodel_usa_pow_arms" ); + break; + case 1: + self SetViewModel( "viewmodel_rus_prisoner_arms" ); + break; + case 2: + self SetViewModel( "viewmodel_vtn_nva_standard_arms" ); + break; + case 3: + self SetViewModel( "viewmodel_usa_hazmat_arms" ); + break; + } + } + else if( IsSubStr( level.script, "zombie_pentagon" ) ) + { + switch( self.entity_num ) + { + case 0: + self SetViewModel( "viewmodel_usa_pow_arms" ); + break; + case 1: + self SetViewModel( "viewmodel_usa_pow_arms" ); + break; + case 2: + self SetViewModel( "viewmodel_usa_pow_arms" ); + break; + case 3: + self SetViewModel( "viewmodel_usa_pow_arms" ); + break; + } + } + else + { + self SetViewModel( "viewmodel_usa_pow_arms" ); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_money.gsc b/BO1/PC/ZM/maps/_zombiemode_money.gsc new file mode 100644 index 0000000..0207224 Binary files /dev/null and b/BO1/PC/ZM/maps/_zombiemode_money.gsc differ diff --git a/BO1/PC/ZM/maps/_zombiemode_net.gsc b/BO1/PC/ZM/maps/_zombiemode_net.gsc new file mode 100644 index 0000000..0115b2b Binary files /dev/null and b/BO1/PC/ZM/maps/_zombiemode_net.gsc differ diff --git a/BO1/PC/ZM/maps/_zombiemode_perks.gsc b/BO1/PC/ZM/maps/_zombiemode_perks.gsc new file mode 100644 index 0000000..737946c --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_perks.gsc @@ -0,0 +1,1582 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +init() +{ + place_additionalprimaryweapon_machine(); + vending_triggers = GetEntArray( "zombie_vending", "targetname" ); + vending_weapon_upgrade_trigger = GetEntArray("zombie_vending_upgrade", "targetname"); + flag_init("pack_machine_in_use"); + flag_init( "solo_game" ); + if( level.mutators["mutator_noPerks"] ) + { + for( i = 0; i < vending_triggers.size; i++ ) + { + vending_triggers[i] disable_trigger(); + } + for( i = 0; i < vending_weapon_upgrade_trigger.size; i++ ) + { + vending_weapon_upgrade_trigger[i] disable_trigger(); + } + return; + } + if ( vending_triggers.size < 1 ) + { + return; + } + if ( vending_weapon_upgrade_trigger.size >= 1 ) + { + array_thread( vending_weapon_upgrade_trigger, ::vending_weapon_upgrade );; + } + if( !isDefined( level.custom_vending_precaching ) ) + { + level.custom_vending_precaching = maps\_zombiemode_perks::default_vending_precaching; + } + [[ level.custom_vending_precaching ]](); + if( !isDefined( level.packapunch_timeout ) ) + { + level.packapunch_timeout = 15; + } + set_zombie_var( "zombie_perk_cost", 2000 ); + if( level.mutators["mutator_susceptible"] ) + { + set_zombie_var( "zombie_perk_juggernaut_health", 80 ); + set_zombie_var( "zombie_perk_juggernaut_health_upgrade", 95 ); + } + else + { + set_zombie_var( "zombie_perk_juggernaut_health", 160 ); + set_zombie_var( "zombie_perk_juggernaut_health_upgrade", 190 ); + } + array_thread( vending_triggers, ::vending_trigger_think ); + array_thread( vending_triggers, ::electric_perks_dialog ); + level thread turn_doubletap_on(); + if ( is_true( level.zombiemode_using_marathon_perk ) ) + { + level thread turn_marathon_on(); + } + if ( is_true( level.zombiemode_using_divetonuke_perk ) ) + { + level thread turn_divetonuke_on(); + level.zombiemode_divetonuke_perk_func = ::divetonuke_explode; + level._effect["divetonuke_groundhit"] = loadfx("maps/zombie/fx_zmb_phdflopper_exp"); + set_zombie_var( "zombie_perk_divetonuke_radius", 300 ); + set_zombie_var( "zombie_perk_divetonuke_min_damage", 1000 ); + set_zombie_var( "zombie_perk_divetonuke_max_damage", 5000 ); + } + level thread turn_jugger_on(); + level thread turn_revive_on(); + level thread turn_sleight_on(); + if( is_true( level.zombiemode_using_deadshot_perk ) ) + { + level thread turn_deadshot_on(); + } + if ( is_true( level.zombiemode_using_additionalprimaryweapon_perk ) ) + { + level thread turn_additionalprimaryweapon_on(); + } + level thread turn_PackAPunch_on(); + if ( isdefined( level.quantum_bomb_register_result_func ) ) + { + [[level.quantum_bomb_register_result_func]]( "give_nearest_perk", ::quantum_bomb_give_nearest_perk_result, 10, ::quantum_bomb_give_nearest_perk_validation ); + } +} +place_additionalprimaryweapon_machine() +{ + if ( !isdefined( level.zombie_additionalprimaryweapon_machine_origin ) ) + { + return; + } + machine = Spawn( "script_model", level.zombie_additionalprimaryweapon_machine_origin ); + machine.angles = level.zombie_additionalprimaryweapon_machine_angles; + machine setModel( "zombie_vending_three_gun" ); + machine.targetname = "vending_additionalprimaryweapon"; + machine_trigger = Spawn( "trigger_radius_use", level.zombie_additionalprimaryweapon_machine_origin + (0, 0, 30), 0, 20, 70 ); + machine_trigger.targetname = "zombie_vending"; + machine_trigger.target = "vending_additionalprimaryweapon"; + machine_trigger.script_noteworthy = "specialty_additionalprimaryweapon"; + if ( isdefined( level.zombie_additionalprimaryweapon_machine_clip_origin ) ) + { + machine_clip = spawn( "script_model", level.zombie_additionalprimaryweapon_machine_clip_origin ); + machine_clip.angles = level.zombie_additionalprimaryweapon_machine_clip_angles; + machine_clip setmodel( "collision_geo_64x64x256" ); + machine_clip Hide(); + } + if ( isdefined( level.zombie_additionalprimaryweapon_machine_monkey_origins ) ) + { + machine.target = "vending_additionalprimaryweapon_monkey_structs"; + for ( i = 0; i < level.zombie_additionalprimaryweapon_machine_monkey_origins.size; i++ ) + { + machine_monkey_struct = SpawnStruct(); + machine_monkey_struct.origin = level.zombie_additionalprimaryweapon_machine_monkey_origins[i]; + machine_monkey_struct.angles = level.zombie_additionalprimaryweapon_machine_monkey_angles; + machine_monkey_struct.script_int = i + 1; + machine_monkey_struct.script_notetworthy = "cosmo_monkey_additionalprimaryweapon"; + machine_monkey_struct.targetname = "vending_additionalprimaryweapon_monkey_structs"; + if ( !IsDefined( level.struct_class_names["targetname"][machine_monkey_struct.targetname] ) ) + { + level.struct_class_names["targetname"][machine_monkey_struct.targetname] = []; + } + size = level.struct_class_names["targetname"][machine_monkey_struct.targetname].size; + level.struct_class_names["targetname"][machine_monkey_struct.targetname][size] = machine_monkey_struct; + } + } + level.zombiemode_using_additionalprimaryweapon_perk = true; +} +default_vending_precaching() +{ + PrecacheItem( "zombie_perk_bottle_doubletap" ); + PrecacheItem( "zombie_perk_bottle_jugg" ); + PrecacheItem( "zombie_perk_bottle_revive" ); + PrecacheItem( "zombie_perk_bottle_sleight" ); + PrecacheItem( "zombie_knuckle_crack" ); + PrecacheShader( "specialty_doubletap_zombies" ); + if ( is_true( level.zombiemode_using_marathon_perk ) ) + { + PrecacheItem( "zombie_perk_bottle_marathon" ); + PrecacheShader( "specialty_marathon_zombies" ); + } + if ( is_true( level.zombiemode_using_divetonuke_perk ) ) + { + PrecacheItem( "zombie_perk_bottle_nuke" ); + PrecacheShader( "specialty_divetonuke_zombies" ); + } + if( is_true( level.zombiemode_using_deadshot_perk ) ) + { + PreCacheItem( "zombie_perk_bottle_deadshot" ); + PrecacheShader( "specialty_ads_zombies" ); + } + if ( is_true( level.zombiemode_using_additionalprimaryweapon_perk ) ) + { + PrecacheItem( "zombie_perk_bottle_additionalprimaryweapon" ); + PrecacheShader( "specialty_extraprimaryweapon_zombies" ); + } + PrecacheShader( "specialty_juggernaut_zombies" ); + PrecacheShader( "specialty_quickrevive_zombies" ); + PrecacheShader( "specialty_fastreload_zombies" ); + PrecacheShader( "specialty_juggernaut_zombies_pro" ); + PrecacheShader( "specialty_quickrevive_zombies_pro" ); + PrecacheShader( "specialty_fastreload_zombies_pro" ); + PrecacheShader( "minimap_icon_juggernog" ); + PrecacheShader( "minimap_icon_revive" ); + PrecacheShader( "minimap_icon_reload" ); + PrecacheModel("zombie_vending_doubletap_on"); + if ( is_true( level.zombiemode_using_marathon_perk ) ) + { + PrecacheModel("zombie_vending_marathon_on"); + } + if ( is_true( level.zombiemode_using_divetonuke_perk ) ) + { + PrecacheModel("zombie_vending_nuke_on"); + } + if ( is_true( level.zombiemode_using_deadshot_perk ) ) + { + PrecacheModel("zombie_vending_ads_on"); + } + if ( is_true( level.zombiemode_using_additionalprimaryweapon_perk ) ) + { + PrecacheModel("zombie_vending_three_gun_on"); + } + PreCacheModel("zombie_vending_jugg_on"); + PrecacheModel("zombie_vending_revive_on"); + PrecacheModel("zombie_vending_sleight_on"); + PrecacheModel("zombie_vending_packapunch_on"); + PrecacheString( &"ZOMBIE_PERK_DOUBLETAP" ); + if ( is_true( level.zombiemode_using_marathon_perk ) ) + { + PrecacheString( &"ZOMBIE_PERK_MARATHON" ); + } + if ( is_true( level.zombiemode_using_divetonuke_perk ) ) + { + PrecacheString( &"ZOMBIE_PERK_DIVETONUKE" ); + } + if ( is_true( level.zombiemode_using_additionalprimaryweapon_perk ) ) + { + PrecacheString( &"ZOMBIE_PERK_ADDITIONALWEAPONPERK" ); + } + PrecacheString( &"ZOMBIE_PERK_JUGGERNAUT" ); + PrecacheString( &"ZOMBIE_PERK_QUICKREVIVE" ); + PrecacheString( &"ZOMBIE_PERK_FASTRELOAD" ); + PrecacheString( &"ZOMBIE_PERK_PACKAPUNCH" ); + level._effect["doubletap_light"] = loadfx("misc/fx_zombie_cola_dtap_on"); + if ( is_true( level.zombiemode_using_marathon_perk ) ) + { + level._effect["marathon_light"] = loadfx("maps/zombie/fx_zmb_cola_staminup_on"); + } + if ( is_true( level.zombiemode_using_divetonuke_perk ) ) + { + level._effect["divetonuke_light"] = loadfx("misc/fx_zombie_cola_dtap_on"); + } + if ( is_true( level.zombiemode_using_deadshot_perk ) ) + { + level._effect["deadshot_light"] = loadfx("misc/fx_zombie_cola_dtap_on"); + } + if ( is_true( level.zombiemode_using_additionalprimaryweapon_perk ) ) + { + level._effect["additionalprimaryweapon_light"] = loadfx("misc/fx_zombie_cola_arsenal_on"); + } + level._effect["jugger_light"] = loadfx("misc/fx_zombie_cola_jugg_on"); + level._effect["revive_light"] = loadfx("misc/fx_zombie_cola_revive_on"); + level._effect["sleight_light"] = loadfx("misc/fx_zombie_cola_on"); + level._effect["packapunch_fx"] = loadfx("maps/zombie/fx_zombie_packapunch"); + level._effect["revive_light_flicker"] = loadfx("maps/zombie/fx_zmb_cola_revive_flicker"); +} +third_person_weapon_upgrade( current_weapon, origin, angles, packa_rollers, perk_machine ) +{ + forward = anglesToForward( angles ); + interact_pos = origin + (forward*-25); + PlayFx( level._effect["packapunch_fx"], origin+(0,1,-34), forward ); + worldgun = spawn( "script_model", interact_pos ); + worldgun.angles = self.angles; + worldgun setModel( GetWeaponModel( current_weapon ) ); + worldgun useweaponhidetags( current_weapon ); + worldgun rotateto( angles+(0,90,0), 0.35, 0, 0 ); + offsetdw = ( 3, 3, 3 ); + worldgundw = undefined; + if ( maps\_zombiemode_weapons::weapon_is_dual_wield( current_weapon ) ) + { + worldgundw = spawn( "script_model", interact_pos + offsetdw ); + worldgundw.angles = self.angles; + worldgundw setModel( maps\_zombiemode_weapons::get_left_hand_weapon_model_name( current_weapon ) ); + worldgundw useweaponhidetags( current_weapon ); + worldgundw rotateto( angles+(0,90,0), 0.35, 0, 0 ); + } + wait( 0.5 ); + worldgun moveto( origin, 0.5, 0, 0 ); + if ( isdefined( worldgundw ) ) + { + worldgundw moveto( origin + offsetdw, 0.5, 0, 0 ); + } + self playsound( "zmb_perks_packa_upgrade" ); + if( isDefined( perk_machine.wait_flag ) ) + { + perk_machine.wait_flag rotateto( perk_machine.wait_flag.angles+(179, 0, 0), 0.25, 0, 0 ); + } + wait( 0.35 ); + worldgun delete(); + if ( isdefined( worldgundw ) ) + { + worldgundw delete(); + } + wait( 3 ); + self playsound( "zmb_perks_packa_ready" ); + worldgun = spawn( "script_model", origin ); + worldgun.angles = angles+(0,90,0); + worldgun setModel( GetWeaponModel( level.zombie_weapons[current_weapon].upgrade_name ) ); + worldgun useweaponhidetags( level.zombie_weapons[current_weapon].upgrade_name ); + worldgun moveto( interact_pos, 0.5, 0, 0 ); + worldgundw = undefined; + if ( maps\_zombiemode_weapons::weapon_is_dual_wield( level.zombie_weapons[current_weapon].upgrade_name ) ) + { + worldgundw = spawn( "script_model", origin + offsetdw ); + worldgundw.angles = angles+(0,90,0); + worldgundw setModel( maps\_zombiemode_weapons::get_left_hand_weapon_model_name( level.zombie_weapons[current_weapon].upgrade_name ) ); + worldgundw useweaponhidetags( level.zombie_weapons[current_weapon].upgrade_name ); + worldgundw moveto( interact_pos + offsetdw, 0.5, 0, 0 ); + } + if( isDefined( perk_machine.wait_flag ) ) + { + perk_machine.wait_flag rotateto( perk_machine.wait_flag.angles-(179, 0, 0), 0.25, 0, 0 ); + } + wait( 0.5 ); + worldgun moveto( origin, level.packapunch_timeout, 0, 0); + if ( isdefined( worldgundw ) ) + { + worldgundw moveto( origin + offsetdw, level.packapunch_timeout, 0, 0); + } + worldgun.worldgundw = worldgundw; + return worldgun; +} +vending_machine_trigger_think() +{ + self endon("death"); + while(1) + { + players = get_players(); + for(i = 0; i < players.size; i ++) + { + if ( players[i] hacker_active() ) + { + self SetInvisibleToPlayer( players[i], true ); + } + else + { + self SetInvisibleToPlayer( players[i], false ); + } + } + wait(0.1); + } +} +vending_weapon_upgrade() +{ + perk_machine = GetEnt( self.target, "targetname" ); + perk_machine_sound = GetEntarray ( "perksacola", "targetname"); + packa_rollers = spawn("script_origin", self.origin); + packa_timer = spawn("script_origin", self.origin); + packa_rollers LinkTo( self ); + packa_timer LinkTo( self ); + if( isDefined( perk_machine.target ) ) + { + perk_machine.wait_flag = GetEnt( perk_machine.target, "targetname" ); + } + self UseTriggerRequireLookAt(); + self SetHintString( &"ZOMBIE_NEED_POWER" ); + self SetCursorHint( "HINT_NOICON" ); + level waittill("Pack_A_Punch_on"); + self thread vending_machine_trigger_think(); + self thread maps\_zombiemode_weapons::decide_hide_show_hint(); + perk_machine playloopsound("zmb_perks_packa_loop"); + self thread vending_weapon_upgrade_cost(); + for( ;; ) + { + self waittill( "trigger", player ); + index = maps\_zombiemode_weapons::get_player_index(player); + plr = "zmb_vox_plr_" + index + "_"; + current_weapon = player getCurrentWeapon(); + if ( "microwavegun_zm" == current_weapon ) + { + current_weapon = "microwavegundw_zm"; + } + if( !player maps\_zombiemode_weapons::can_buy_weapon() || + player maps\_laststand::player_is_in_laststand() || + is_true( player.intermission ) || + player isThrowingGrenade() || + player maps\_zombiemode_weapons::is_weapon_upgraded( current_weapon ) ) + { + wait( 0.1 ); + continue; + } + if( is_true(level.pap_moving)) + { + continue; + } + if( player isSwitchingWeapons() ) + { + wait(0.1); + continue; + } + if ( !IsDefined( level.zombie_include_weapons[current_weapon] ) ) + { + continue; + } + if ( player.score < self.cost ) + { + self playsound("deny"); + player maps\_zombiemode_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 ); + continue; + } + flag_set("pack_machine_in_use"); + player maps\_zombiemode_score::minus_to_player_score( self.cost ); + sound = "evt_bottle_dispense"; + playsoundatposition(sound, self.origin); + self thread maps\_zombiemode_audio::play_jingle_or_stinger("mus_perks_packa_sting"); + player maps\_zombiemode_audio::create_and_play_dialog( "weapon_pickup", "upgrade_wait" ); + origin = self.origin; + angles = self.angles; + if( isDefined(perk_machine)) + { + origin = perk_machine.origin+(0,0,35); + angles = perk_machine.angles+(0,90,0); + } + self disable_trigger(); + player thread do_knuckle_crack(); + self.current_weapon = current_weapon; + weaponmodel = player third_person_weapon_upgrade( current_weapon, origin, angles, packa_rollers, perk_machine ); + self enable_trigger(); + self SetHintString( &"ZOMBIE_GET_UPGRADED" ); + self setvisibletoplayer( player ); + self thread wait_for_player_to_take( player, current_weapon, packa_timer ); + self thread wait_for_timeout( current_weapon, packa_timer ); + self waittill_either( "pap_timeout", "pap_taken" ); + self.current_weapon = ""; + if ( isdefined( weaponmodel.worldgundw ) ) + { + weaponmodel.worldgundw delete(); + } + weaponmodel delete(); + self SetHintString( &"ZOMBIE_PERK_PACKAPUNCH", self.cost ); + self setvisibletoall(); + flag_clear("pack_machine_in_use"); + } +} +vending_weapon_upgrade_cost() +{ + while ( 1 ) + { + self.cost = 5000; + self SetHintString( &"ZOMBIE_PERK_PACKAPUNCH", self.cost ); + level waittill( "powerup bonfire sale" ); + self.cost = 1000; + self SetHintString( &"ZOMBIE_PERK_PACKAPUNCH", self.cost ); + level waittill( "bonfire_sale_off" ); + } +} +wait_for_player_to_take( player, weapon, packa_timer ) +{ + AssertEx( IsDefined( level.zombie_weapons[weapon] ), "wait_for_player_to_take: weapon does not exist" ); + AssertEx( IsDefined( level.zombie_weapons[weapon].upgrade_name ), "wait_for_player_to_take: upgrade_weapon does not exist" ); + upgrade_weapon = level.zombie_weapons[weapon].upgrade_name; + self endon( "pap_timeout" ); + while( true ) + { + packa_timer playloopsound( "zmb_perks_packa_ticktock" ); + self waittill( "trigger", trigger_player ); + packa_timer stoploopsound(.05); + if( trigger_player == player ) + { + current_weapon = player GetCurrentWeapon(); + if( is_player_valid( player ) && !player is_drinking() && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && "syrette_sp" != current_weapon && "none" != current_weapon && !player hacker_active()) + { + self notify( "pap_taken" ); + player notify( "pap_taken" ); + player.pap_used = true; + weapon_limit = 2; + if ( player HasPerk( "specialty_additionalprimaryweapon" ) ) + { + weapon_limit = 3; + } + primaries = player GetWeaponsListPrimaries(); + if( isDefined( primaries ) && primaries.size >= weapon_limit ) + { + player maps\_zombiemode_weapons::weapon_give( upgrade_weapon ); + } + else + { + player GiveWeapon( upgrade_weapon, 0, player maps\_zombiemode_weapons::get_pack_a_punch_weapon_options( upgrade_weapon ) ); + player GiveStartAmmo( upgrade_weapon ); + } + player SwitchToWeapon( upgrade_weapon ); + player maps\_zombiemode_weapons::play_weapon_vo(upgrade_weapon); + return; + } + } + wait( 0.05 ); + } +} +wait_for_timeout( weapon, packa_timer ) +{ + self endon( "pap_taken" ); + wait( level.packapunch_timeout ); + self notify( "pap_timeout" ); + packa_timer stoploopsound(.05); + packa_timer playsound( "zmb_perks_packa_deny" ); + maps\_zombiemode_weapons::unacquire_weapon_toggle( weapon ); +} +do_knuckle_crack() +{ + gun = self upgrade_knuckle_crack_begin(); + self waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" ); + self upgrade_knuckle_crack_end( gun ); +} +upgrade_knuckle_crack_begin() +{ + self increment_is_drinking(); + self AllowLean( false ); + self AllowAds( false ); + self AllowSprint( false ); + self AllowCrouch( true ); + self AllowProne( false ); + self AllowMelee( false ); + if ( self GetStance() == "prone" ) + { + self SetStance( "crouch" ); + } + primaries = self GetWeaponsListPrimaries(); + gun = self GetCurrentWeapon(); + weapon = "zombie_knuckle_crack"; + if ( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) ) + { + self notify( "zmb_lost_knife" ); + self TakeWeapon( gun ); + } + else + { + return; + } + self GiveWeapon( weapon ); + self SwitchToWeapon( weapon ); + return gun; +} +upgrade_knuckle_crack_end( gun ) +{ + assert( gun != "zombie_perk_bottle_doubletap" ); + assert( gun != "zombie_perk_bottle_jugg" ); + assert( gun != "zombie_perk_bottle_revive" ); + assert( gun != "zombie_perk_bottle_sleight" ); + assert( gun != "zombie_perk_bottle_marathon" ); + assert( gun != "zombie_perk_bottle_nuke" ); + assert( gun != "zombie_perk_bottle_deadshot" ); + assert( gun != "zombie_perk_bottle_additionalprimaryweapon" ); + assert( gun != "syrette_sp" ); + self AllowLean( true ); + self AllowAds( true ); + self AllowSprint( true ); + self AllowProne( true ); + self AllowMelee( true ); + weapon = "zombie_knuckle_crack"; + if ( self maps\_laststand::player_is_in_laststand() || is_true( self.intermission ) ) + { + self TakeWeapon(weapon); + return; + } + self decrement_is_drinking(); + self TakeWeapon(weapon); + primaries = self GetWeaponsListPrimaries(); + if( self is_drinking() ) + { + return; + } + else if( isDefined( primaries ) && primaries.size > 0 ) + { + self SwitchToWeapon( primaries[0] ); + } + else + { + self SwitchToWeapon( level.laststandpistol ); + } +} +turn_PackAPunch_on() +{ + level waittill("Pack_A_Punch_on"); + vending_weapon_upgrade_trigger = GetEntArray("zombie_vending_upgrade", "targetname"); + for(i=0; i 0 && direction[1] > 0)) + { + direction = (direction[0], direction[1] * -1, 0); + } + else if(direction[0] < 0) + { + direction = (direction[0] * -1, direction[1], 0); + } + self Vibrate( direction, 10, 0.5, 5); + } + self waittill("movedone"); + PlayFX(level._effect["poltergeist"], self.origin); + playsoundatposition ("zmb_box_poof", self.origin); + level clientNotify( "drb" ); + self.fx Unlink(); + self.fx delete(); + self Delete(); + machine_clip trigger_off(); + machine_clip ConnectPaths(); + machine_clip Delete(); +} +turn_jugger_on() +{ + machine = getentarray("vending_jugg", "targetname"); + level waittill("juggernog_on"); + for( i = 0; i < machine.size; i++ ) + { + machine[i] setmodel("zombie_vending_jugg_on"); + machine[i] vibrate((0,-100,0), 0.3, 0.4, 3); + machine[i] playsound("zmb_perks_power_on"); + machine[i] thread perk_fx( "jugger_light" ); + } + level notify( "specialty_armorvest_power_on" ); +} +turn_doubletap_on() +{ + machine = getentarray("vending_doubletap", "targetname"); + level waittill("doubletap_on"); + for( i = 0; i < machine.size; i++ ) + { + machine[i] setmodel("zombie_vending_doubletap_on"); + machine[i] vibrate((0,-100,0), 0.3, 0.4, 3); + machine[i] playsound("zmb_perks_power_on"); + machine[i] thread perk_fx( "doubletap_light" ); + } + level notify( "specialty_rof_power_on" ); +} +turn_marathon_on() +{ + machine = getentarray("vending_marathon", "targetname"); + level waittill("marathon_on"); + for( i = 0; i < machine.size; i++ ) + { + machine[i] setmodel("zombie_vending_marathon_on"); + machine[i] vibrate((0,-100,0), 0.3, 0.4, 3); + machine[i] playsound("zmb_perks_power_on"); + machine[i] thread perk_fx( "marathon_light" ); + } + level notify( "specialty_longersprint_power_on" ); +} +turn_divetonuke_on() +{ + machine = getentarray("vending_divetonuke", "targetname"); + level waittill("divetonuke_on"); + for( i = 0; i < machine.size; i++ ) + { + machine[i] setmodel("zombie_vending_nuke_on"); + machine[i] vibrate((0,-100,0), 0.3, 0.4, 3); + machine[i] playsound("zmb_perks_power_on"); + machine[i] thread perk_fx( "divetonuke_light" ); + } + level notify( "specialty_flakjacket_power_on" ); +} +divetonuke_explode( attacker, origin ) +{ + radius = level.zombie_vars["zombie_perk_divetonuke_radius"]; + min_damage = level.zombie_vars["zombie_perk_divetonuke_min_damage"]; + max_damage = level.zombie_vars["zombie_perk_divetonuke_max_damage"]; + RadiusDamage( origin, radius, max_damage, min_damage, attacker, "MOD_GRENADE_SPLASH" ); + PlayFx( level._effect["divetonuke_groundhit"], origin ); + attacker playsound("zmb_phdflop_explo"); + attacker SetClientFlag( level._ZOMBIE_PLAYER_FLAG_DIVE2NUKE_VISION ); + wait_network_frame(); + wait_network_frame(); + attacker ClearClientFlag( level._ZOMBIE_PLAYER_FLAG_DIVE2NUKE_VISION ); +} +turn_deadshot_on() +{ + machine = getentarray("vending_deadshot", "targetname"); + level waittill("deadshot_on"); + for( i = 0; i < machine.size; i++ ) + { + machine[i] setmodel("zombie_vending_ads_on"); + machine[i] vibrate((0,-100,0), 0.3, 0.4, 3); + machine[i] playsound("zmb_perks_power_on"); + machine[i] thread perk_fx( "deadshot_light" ); + } + level notify( "specialty_deadshot_power_on" ); +} +turn_additionalprimaryweapon_on() +{ + machine = getentarray("vending_additionalprimaryweapon", "targetname"); + if ( "zombie_cod5_prototype" != level.script && "zombie_cod5_sumpf" != level.script ) + { + flag_wait( "power_on" ); + } + wait ( 3 ); + for( i = 0; i < machine.size; i++ ) + { + machine[i] setmodel("zombie_vending_three_gun_on"); + machine[i] vibrate((0,-100,0), 0.3, 0.4, 3); + machine[i] playsound("zmb_perks_power_on"); + machine[i] thread perk_fx( "additionalprimaryweapon_light" ); + } + level notify( "specialty_additionalprimaryweapon_power_on" ); +} +perk_fx( fx ) +{ + wait(3); + playfxontag( level._effect[ fx ], self, "tag_origin" ); +} +electric_perks_dialog() +{ + flag_wait( "all_players_connected" ); + players = GetPlayers(); + if ( players.size == 1 ) + { + return; + } + self endon ("warning_dialog"); + level endon("switch_flipped"); + timer =0; + while(1) + { + wait(0.5); + players = get_players(); + for(i = 0; i < players.size; i++) + { + dist = distancesquared(players[i].origin, self.origin ); + if(dist > 70*70) + { + timer = 0; + continue; + } + if(dist < 70*70 && timer < 3) + { + wait(0.5); + timer ++; + } + if(dist < 70*70 && timer == 3) + { + players[i] thread do_player_vo("vox_start", 5); + wait(3); + self notify ("warning_dialog"); + } + } + } +} +vending_trigger_think() +{ + perk = self.script_noteworthy; + solo = false; + flag_init( "_start_zm_pistol_rank" ); + if ( IsDefined(perk) && + (perk == "specialty_quickrevive" || perk == "specialty_quickrevive_upgrade") ) + { + flag_wait( "all_players_connected" ); + players = GetPlayers(); + if ( players.size == 1 ) + { + solo = true; + flag_set( "solo_game" ); + level.solo_lives_given = 0; + players[0].lives = 0; + level maps\_zombiemode::zombiemode_solo_last_stand_pistol(); + } + } + flag_set( "_start_zm_pistol_rank" ); + if ( !solo ) + { + self SetHintString( &"ZOMBIE_NEED_POWER" ); + } + self SetCursorHint( "HINT_NOICON" ); + self UseTriggerRequireLookAt(); + cost = level.zombie_vars["zombie_perk_cost"]; + switch( perk ) + { + case "specialty_armorvest_upgrade": + case "specialty_armorvest": + cost = 2500; + break; + case "specialty_quickrevive_upgrade": + case "specialty_quickrevive": + if( solo ) + { + cost = 500; + } + else + { + cost = 1500; + } + break; + case "specialty_fastreload_upgrade": + case "specialty_fastreload": + cost = 3000; + break; + case "specialty_rof_upgrade": + case "specialty_rof": + cost = 2000; + break; + case "specialty_longersprint_upgrade": + case "specialty_longersprint": + cost = 2000; + break; + case "specialty_flakjacket_upgrade": + case "specialty_flakjacket": + cost = 2000; + break; + case "specialty_deadshot_upgrade": + case "specialty_deadshot": + cost = 1500; + break; + case "specialty_additionalprimaryweapon_upgrade": + case "specialty_additionalprimaryweapon": + cost = 4000; + break; + } + self.cost = cost; + if ( !solo ) + { + notify_name = perk + "_power_on"; + level waittill( notify_name ); + } + if(!IsDefined(level._perkmachinenetworkchoke)) + { + level._perkmachinenetworkchoke = 0; + } + else + { + level._perkmachinenetworkchoke ++; + } + for(i = 0; i < level._perkmachinenetworkchoke; i ++) + { + wait_network_frame(); + } + self thread maps\_zombiemode_audio::perks_a_cola_jingle_timer(); + perk_hum = spawn("script_origin", self.origin); + perk_hum playloopsound("zmb_perks_machine_loop"); + self thread check_player_has_perk(perk); + switch( perk ) + { + case "specialty_armorvest_upgrade": + case "specialty_armorvest": + self SetHintString( &"ZOMBIE_PERK_JUGGERNAUT", cost ); + break; + case "specialty_quickrevive_upgrade": + case "specialty_quickrevive": + if( solo ) + { + self SetHintString( &"ZOMBIE_PERK_QUICKREVIVE_SOLO", cost ); + } + else + { + self SetHintString( &"ZOMBIE_PERK_QUICKREVIVE", cost ); + } + break; + case "specialty_fastreload_upgrade": + case "specialty_fastreload": + self SetHintString( &"ZOMBIE_PERK_FASTRELOAD", cost ); + break; + case "specialty_rof_upgrade": + case "specialty_rof": + self SetHintString( &"ZOMBIE_PERK_DOUBLETAP", cost ); + break; + case "specialty_longersprint_upgrade": + case "specialty_longersprint": + self SetHintString( &"ZOMBIE_PERK_MARATHON", cost ); + break; + case "specialty_flakjacket_upgrade": + case "specialty_flakjacket": + self SetHintString( &"ZOMBIE_PERK_DIVETONUKE", cost ); + break; + case "specialty_deadshot_upgrade": + case "specialty_deadshot": + self SetHintString( &"ZOMBIE_PERK_DEADSHOT", cost ); + break; + case "specialty_additionalprimaryweapon_upgrade": + case "specialty_additionalprimaryweapon": + self SetHintString( &"ZOMBIE_PERK_ADDITIONALPRIMARYWEAPON", cost ); + break; + default: + self SetHintString( perk + " Cost: " + level.zombie_vars["zombie_perk_cost"] ); + } + for( ;; ) + { + self waittill( "trigger", player ); + index = maps\_zombiemode_weapons::get_player_index(player); + if (player maps\_laststand::player_is_in_laststand() || is_true( player.intermission ) ) + { + continue; + } + if(player in_revive_trigger()) + { + continue; + } + if( player isThrowingGrenade() ) + { + wait( 0.1 ); + continue; + } + if( player isSwitchingWeapons() ) + { + wait(0.1); + continue; + } + if( player is_drinking() ) + { + wait( 0.1 ); + continue; + } + if ( player HasPerk( perk ) ) + { + cheat = false; + if ( cheat != true ) + { + self playsound("deny"); + player maps\_zombiemode_audio::create_and_play_dialog( "general", "perk_deny", undefined, 1 ); + continue; + } + } + if ( player.score < cost ) + { + self playsound("evt_perk_deny"); + player maps\_zombiemode_audio::create_and_play_dialog( "general", "perk_deny", undefined, 0 ); + continue; + } + if ( player.num_perks >= 4 ) + { + self playsound("evt_perk_deny"); + player maps\_zombiemode_audio::create_and_play_dialog( "general", "sigh" ); + continue; + } + sound = "evt_bottle_dispense"; + playsoundatposition(sound, self.origin); + player maps\_zombiemode_score::minus_to_player_score( cost ); + player.perk_purchased = perk; + switch( perk ) + { + case "specialty_armorvest_upgrade": + case "specialty_armorvest": + sound = "mus_perks_jugger_sting"; + break; + case "specialty_quickrevive_upgrade": + case "specialty_quickrevive": + sound = "mus_perks_revive_sting"; + break; + case "specialty_fastreload_upgrade": + case "specialty_fastreload": + sound = "mus_perks_speed_sting"; + break; + case "specialty_rof_upgrade": + case "specialty_rof": + sound = "mus_perks_doubletap_sting"; + break; + case "specialty_longersprint_upgrade": + case "specialty_longersprint": + sound = "mus_perks_phd_sting"; + break; + case "specialty_flakjacket_upgrade": + case "specialty_flakjacket": + sound = "mus_perks_stamin_sting"; + break; + case "specialty_deadshot_upgrade": + case "specialty_deadshot": + sound = "mus_perks_jugger_sting"; + break; + case "specialty_additionalprimaryweapon_upgrade": + case "specialty_additionalprimaryweapon": + sound = "mus_perks_mulekick_sting"; + break; + default: + sound = "mus_perks_jugger_sting"; + break; + } + self thread maps\_zombiemode_audio::play_jingle_or_stinger (self.script_label); + gun = player perk_give_bottle_begin( perk ); + player waittill_any( "fake_death", "death", "player_downed", "weapon_change_complete" ); + player perk_give_bottle_end( gun, perk ); + if ( player maps\_laststand::player_is_in_laststand() || is_true( player.intermission ) ) + { + continue; + } + if ( isDefined( level.perk_bought_func ) ) + { + player [[ level.perk_bought_func ]]( perk ); + } + player.perk_purchased = undefined; + player give_perk( perk, true ); + bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type perk", + player.playername, player.score, level.team_pool[ player.team_num ].score, level.round_number, cost, perk, self.origin ); + } +} +solo_revive_buy_trigger_move( revive_trigger_noteworthy ) +{ + self endon( "death" ); + revive_perk_trigger = GetEnt( revive_trigger_noteworthy, "script_noteworthy" ); + revive_perk_trigger trigger_off(); + if( level.solo_lives_given >= 3 ) + { + if(IsDefined(level._solo_revive_machine_expire_func)) + { + revive_perk_trigger [[level._solo_revive_machine_expire_func]](); + } + return; + } + while( self.lives > 0 ) + { + wait( 0.1 ); + } + revive_perk_trigger trigger_on(); +} +unlocked_perk_upgrade( perk ) +{ + ch_ref = string(tablelookup( "mp/challengeTable_zmPerk.csv", 12, perk, 7 )); + ch_max = int(tablelookup( "mp/challengeTable_zmPerk.csv", 12, perk, 4 )); + ch_progress = self getdstat( "challengeStats", ch_ref, "challengeProgress" ); + if( ch_progress >= ch_max ) + { + return true; + } + return false; +} +give_perk( perk, bought ) +{ + self SetPerk( perk ); + self.num_perks++; + if ( is_true( bought ) ) + { + self thread maps\_zombiemode_audio::perk_vox( perk ); + self setblur( 4, 0.1 ); + wait(0.1); + self setblur(0, 0.1); + self notify( "perk_bought", perk ); + } + if(perk == "specialty_armorvest") + { + self.preMaxHealth = self.maxhealth; + self SetMaxHealth( level.zombie_vars["zombie_perk_juggernaut_health"] ); + } + else if(perk == "specialty_armorvest_upgrade") + { + self.preMaxHealth = self.maxhealth; + self SetMaxHealth( level.zombie_vars["zombie_perk_juggernaut_health_upgrade"] ); + } + if( perk == "specialty_deadshot" ) + { + self SetClientFlag(level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK); + } + else if( perk == "specialty_deadshot_upgrade" ) + { + self SetClientFlag(level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK); + } + players = getplayers(); + if ( players.size == 1 && perk == "specialty_quickrevive" ) + { + self.lives = 1; + level.solo_lives_given++; + if( level.solo_lives_given >= 3 ) + { + flag_set( "solo_revive" ); + } + self thread solo_revive_buy_trigger_move( perk ); + } + self perk_hud_create( perk ); + self.stats["perks"]++; + self thread perk_think( perk ); +} +check_player_has_perk(perk) +{ + self endon( "death" ); + dist = 128 * 128; + while(true) + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if(DistanceSquared( players[i].origin, self.origin ) < dist) + { + if(!players[i] hasperk(perk) && !(players[i] in_revive_trigger()) && (!players[i] hacker_active())) + { + self setinvisibletoplayer(players[i], false); + } + else + { + self SetInvisibleToPlayer(players[i], true); + } + } + } + wait(0.1); + } +} +vending_set_hintstring( perk ) +{ + switch( perk ) + { + case "specialty_armorvest_upgrade": + case "specialty_armorvest": + break; + } +} +perk_think( perk ) +{ + perk_str = perk + "_stop"; + result = self waittill_any_return( "fake_death", "death", "player_downed", perk_str ); + do_retain = true; + if( (get_players().size == 1) && perk == "specialty_quickrevive") + { + do_retain = false; + } + if(do_retain && IsDefined(self._retain_perks) && self._retain_perks) + { + return; + } + self UnsetPerk( perk ); + self.num_perks--; + switch(perk) + { + case "specialty_armorvest": + self SetMaxHealth( 100 ); + break; + case "specialty_additionalprimaryweapon": + if ( result == perk_str ) + { + self maps\_zombiemode::take_additionalprimaryweapon(); + } + break; + case "specialty_deadshot": + self ClearClientFlag(level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK); + break; + case "specialty_deadshot_upgrade": + self ClearClientFlag(level._ZOMBIE_PLAYER_FLAG_DEADSHOT_PERK); + break; + } + self perk_hud_destroy( perk ); + self.perk_purchased = undefined; + if ( IsDefined( level.perk_lost_func ) ) + { + self [[ level.perk_lost_func ]]( perk ); + } + self notify( "perk_lost" ); +} +perk_hud_create( perk ) +{ + if ( !IsDefined( self.perk_hud ) ) + { + self.perk_hud = []; + } + shader = ""; + switch( perk ) + { + case "specialty_armorvest_upgrade": + shader = "specialty_juggernaut_zombies_pro"; + break; + case "specialty_armorvest": + shader = "specialty_juggernaut_zombies"; + break; + case "specialty_quickrevive_upgrade": + shader = "specialty_quickrevive_zombies_pro"; + break; + case "specialty_quickrevive": + shader = "specialty_quickrevive_zombies"; + break; + case "specialty_fastreload_upgrade": + shader = "specialty_fastreload_zombies_pro"; + break; + case "specialty_fastreload": + shader = "specialty_fastreload_zombies"; + break; + case "specialty_rof_upgrade": + case "specialty_rof": + shader = "specialty_doubletap_zombies"; + break; + case "specialty_longersprint_upgrade": + case "specialty_longersprint": + shader = "specialty_marathon_zombies"; + break; + case "specialty_flakjacket_upgrade": + case "specialty_flakjacket": + shader = "specialty_divetonuke_zombies"; + break; + case "specialty_deadshot_upgrade": + case "specialty_deadshot": + shader = "specialty_ads_zombies"; + break; + case "specialty_additionalprimaryweapon_upgrade": + case "specialty_additionalprimaryweapon": + shader = "specialty_extraprimaryweapon_zombies"; + break; + default: + shader = ""; + break; + } + hud = create_simple_hud( self ); + hud.foreground = true; + hud.sort = 1; + hud.hidewheninmenu = false; + hud.alignX = "left"; + hud.alignY = "bottom"; + hud.horzAlign = "user_left"; + hud.vertAlign = "user_bottom"; + hud.x = self.perk_hud.size * 30; + hud.y = hud.y - 70; + hud.alpha = 1; + hud SetShader( shader, 24, 24 ); + self.perk_hud[ perk ] = hud; +} +perk_hud_destroy( perk ) +{ + self.perk_hud[ perk ] destroy_hud(); + self.perk_hud[ perk ] = undefined; +} +perk_hud_flash() +{ + self endon( "death" ); + self.flash = 1; + self ScaleOverTime( 0.05, 32, 32 ); + wait( 0.3 ); + self ScaleOverTime( 0.05, 24, 24 ); + wait( 0.3 ); + self.flash = 0; +} +perk_flash_audio( perk ) +{ + alias = undefined; + switch( perk ) + { + case "specialty_armorvest": + alias = "zmb_hud_flash_jugga"; + break; + case "specialty_quickrevive": + alias = "zmb_hud_flash_revive"; + break; + case "specialty_fastreload": + alias = "zmb_hud_flash_speed"; + break; + case "specialty_longersprint": + alias = "zmb_hud_flash_stamina"; + break; + case "specialty_flakjacket": + alias = "zmb_hud_flash_phd"; + break; + case "specialty_deadshot": + alias = "zmb_hud_flash_deadshot"; + break; + case "specialty_additionalprimaryweapon": + alias = "zmb_hud_flash_additionalprimaryweapon"; + break; + } + if( IsDefined( alias ) ) + self PlayLocalSound( alias ); +} +perk_hud_start_flash( perk ) +{ + if ( self HasPerk( perk ) && isdefined( self.perk_hud ) ) + { + hud = self.perk_hud[perk]; + if ( isdefined( hud ) ) + { + if ( !is_true( hud.flash ) ) + { + hud thread perk_hud_flash(); + self thread perk_flash_audio( perk ); + } + } + } +} +perk_hud_stop_flash( perk, taken ) +{ + if ( self HasPerk( perk ) && isdefined( self.perk_hud ) ) + { + hud = self.perk_hud[perk]; + if ( isdefined( hud ) ) + { + hud.flash = undefined; + if ( isdefined( taken ) ) + { + hud notify( "stop_flash_perk" ); + } + } + } +} +perk_give_bottle_begin( perk ) +{ + self increment_is_drinking(); + self AllowLean( false ); + self AllowAds( false ); + self AllowSprint( false ); + self AllowCrouch( true ); + self AllowProne( false ); + self AllowMelee( false ); + wait( 0.05 ); + if ( self GetStance() == "prone" ) + { + self SetStance( "crouch" ); + } + gun = self GetCurrentWeapon(); + weapon = ""; + switch( perk ) + { + case " _upgrade": + case "specialty_armorvest": + weapon = "zombie_perk_bottle_jugg"; + break; + case "specialty_quickrevive_upgrade": + case "specialty_quickrevive": + weapon = "zombie_perk_bottle_revive"; + break; + case "specialty_fastreload_upgrade": + case "specialty_fastreload": + weapon = "zombie_perk_bottle_sleight"; + break; + case "specialty_rof_upgrade": + case "specialty_rof": + weapon = "zombie_perk_bottle_doubletap"; + break; + case "specialty_longersprint_upgrade": + case "specialty_longersprint": + weapon = "zombie_perk_bottle_marathon"; + break; + case "specialty_flakjacket_upgrade": + case "specialty_flakjacket": + weapon = "zombie_perk_bottle_nuke"; + break; + case "specialty_deadshot_upgrade": + case "specialty_deadshot": + weapon = "zombie_perk_bottle_deadshot"; + break; + case "specialty_additionalprimaryweapon_upgrade": + case "specialty_additionalprimaryweapon": + weapon = "zombie_perk_bottle_additionalprimaryweapon"; + break; + } + self GiveWeapon( weapon ); + self SwitchToWeapon( weapon ); + return gun; +} +perk_give_bottle_end( gun, perk ) +{ + assert( gun != "zombie_perk_bottle_doubletap" ); + assert( gun != "zombie_perk_bottle_jugg" ); + assert( gun != "zombie_perk_bottle_revive" ); + assert( gun != "zombie_perk_bottle_sleight" ); + assert( gun != "zombie_perk_bottle_marathon" ); + assert( gun != "zombie_perk_bottle_nuke" ); + assert( gun != "zombie_perk_bottle_deadshot" ); + assert( gun != "zombie_perk_bottle_additionalprimaryweapon" ); + assert( gun != "syrette_sp" ); + self AllowLean( true ); + self AllowAds( true ); + self AllowSprint( true ); + self AllowProne( true ); + self AllowMelee( true ); + weapon = ""; + switch( perk ) + { + case "specialty_rof_upgrade": + case "specialty_rof": + weapon = "zombie_perk_bottle_doubletap"; + break; + case "specialty_longersprint_upgrade": + case "specialty_longersprint": + weapon = "zombie_perk_bottle_marathon"; + break; + case "specialty_flakjacket_upgrade": + case "specialty_flakjacket": + weapon = "zombie_perk_bottle_nuke"; + break; + case "specialty_armorvest_upgrade": + case "specialty_armorvest": + weapon = "zombie_perk_bottle_jugg"; + self.jugg_used = true; + break; + case "specialty_quickrevive_upgrade": + case "specialty_quickrevive": + weapon = "zombie_perk_bottle_revive"; + break; + case "specialty_fastreload_upgrade": + case "specialty_fastreload": + weapon = "zombie_perk_bottle_sleight"; + self.speed_used = true; + break; + case "specialty_deadshot_upgrade": + case "specialty_deadshot": + weapon = "zombie_perk_bottle_deadshot"; + break; + case "specialty_additionalprimaryweapon_upgrade": + case "specialty_additionalprimaryweapon": + weapon = "zombie_perk_bottle_additionalprimaryweapon"; + break; + } + if ( self maps\_laststand::player_is_in_laststand() || is_true( self.intermission ) ) + { + self TakeWeapon(weapon); + return; + } + self TakeWeapon(weapon); + if( self is_multiple_drinking() ) + { + self decrement_is_drinking(); + return; + } + else if( gun != "none" && !is_placeable_mine( gun ) && !is_equipment( gun ) ) + { + self SwitchToWeapon( gun ); + if( is_melee_weapon( gun ) ) + { + self decrement_is_drinking(); + return; + } + } + else + { + primaryWeapons = self GetWeaponsListPrimaries(); + if( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 ) + { + self SwitchToWeapon( primaryWeapons[0] ); + } + } + self waittill( "weapon_change_complete" ); + if ( !self maps\_laststand::player_is_in_laststand() && !is_true( self.intermission ) ) + { + self decrement_is_drinking(); + } +} +give_random_perk() +{ + vending_triggers = GetEntArray( "zombie_vending", "targetname" ); + perks = []; + for ( i = 0; i < vending_triggers.size; i++ ) + { + perk = vending_triggers[i].script_noteworthy; + if ( isdefined( self.perk_purchased ) && self.perk_purchased == perk ) + { + continue; + } + if ( !self HasPerk( perk ) ) + { + perks[ perks.size ] = perk; + } + } + if ( perks.size > 0 ) + { + perks = array_randomize( perks ); + self give_perk( perks[0] ); + } +} +lose_random_perk() +{ + vending_triggers = GetEntArray( "zombie_vending", "targetname" ); + perks = []; + for ( i = 0; i < vending_triggers.size; i++ ) + { + perk = vending_triggers[i].script_noteworthy; + if ( isdefined( self.perk_purchased ) && self.perk_purchased == perk ) + { + continue; + } + if ( self HasPerk( perk ) ) + { + perks[ perks.size ] = perk; + } + } + if ( perks.size > 0 ) + { + perks = array_randomize( perks ); + perk = perks[0]; + perk_str = perk + "_stop"; + self notify( perk_str ); + if ( flag( "solo_game" ) && perk == "specialty_quickrevive" ) + { + self.lives--; + } + } +} +update_perk_hud() +{ + if ( isdefined( self.perk_hud ) ) + { + keys = getarraykeys( self.perk_hud ); + for ( i = 0; i < self.perk_hud.size; i++ ) + { + self.perk_hud[ keys[i] ].x = i * 30; + } + } +} +quantum_bomb_give_nearest_perk_validation( position ) +{ + vending_triggers = GetEntArray( "zombie_vending", "targetname" ); + range_squared = 180 * 180; + for ( i = 0; i < vending_triggers.size; i++ ) + { + if ( DistanceSquared( vending_triggers[i].origin, position ) < range_squared ) + { + return true; + } + } + return false; +} +quantum_bomb_give_nearest_perk_result( position ) +{ + [[level.quantum_bomb_play_mystery_effect_func]]( position ); + vending_triggers = GetEntArray( "zombie_vending", "targetname" ); + nearest = 0; + for ( i = 1; i < vending_triggers.size; i++ ) + { + if ( DistanceSquared( vending_triggers[i].origin, position ) < DistanceSquared( vending_triggers[nearest].origin, position ) ) + { + nearest = i; + } + } + players = getplayers(); + perk = vending_triggers[nearest].script_noteworthy; + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + if ( player.sessionstate == "spectator" || player maps\_laststand::player_is_in_laststand() ) + { + continue; + } + if ( !player HasPerk( perk ) && ( !isdefined( player.perk_purchased ) || player.perk_purchased != perk) && RandomInt( 5 ) ) + { + if( player == self ) + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_good" ); + } + player give_perk( perk ); + player [[level.quantum_bomb_play_player_effect_func]](); + } + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_player_zipline.gsc b/BO1/PC/ZM/maps/_zombiemode_player_zipline.gsc new file mode 100644 index 0000000..487738e --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_player_zipline.gsc @@ -0,0 +1,534 @@ + +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +main() +{ + precache_zipline_assets(); + init_player_ziplines(); +} +#using_animtree ( "zombie_coast" ); +precache_zipline_assets() +{ + precachemodel("viewmodel_hands_no_model"); + level.zipline_anims = []; + level.zipline_anims["zipline_grab"] = %pb_zombie_zipline_grab; + level.zipline_anims["zipline_release"] = %pb_zombie_zipline_release; + level.zipline_anims["zipline_loop"] = %pb_zombie_zipline_loop; + level.zipline_animtree = #animtree; +} +init_player_ziplines() +{ + zipline_vehicles = getentarray("zipline_vehicles","script_noteworthy"); + zipline_trigs = getentarray("player_zipline","targetname"); + array_thread(zipline_trigs,::monitor_player_zipline,zipline_vehicles); + flag_wait("all_players_spawned"); + players = get_players(); + array_thread(players,::jump_button_monitor); +} +monitor_player_zipline(zipline_vehicles) +{ + zip_path = self.target; + targets = getentarray(self.target,"targetname"); + poi = undefined; + for(i=0;i 0 ) + { + self SwitchToWeapon( primaryWeapons[0] ); + } + } + self Allowstand(true); + self allowcrouch(true); + self EnableInvulnerability(); + vehicle attachpath( getvehiclenode(zip_path,"targetname")); + wait_network_frame(); + has_perk = false; + if(isDefined(self.perk_purchased)) + { + has_perk = true; + } + self player_enter_zipline(vehicle,zip_path); + sound_ent = spawn( "script_origin" , self.origin ); + sound_ent linkto( self ); + sound_ent playloopsound( "evt_zipline_slide" ); + sound_ent thread force_deletion_of_soundent( self, vehicle ); + vehicle startpath(); + wait(.5); + self maps\_zombiemode_audio::create_and_play_dialog( "general", "zipline" ); + if(!has_perk) + { + weaponname = self getcurrentweapon(); + if ( is_placeable_mine( weaponname ) || weaponname == "syrette_sp" ) + { + primaryWeapons = self GetWeaponsListPrimaries(); + if ( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 ) + { + self SwitchToWeapon( primaryWeapons[0] ); + } + } + self setviewmodel("viewmodel_hands_no_model"); + self enableweapons(); + } + end_node = get_zipline_end_node(zip_path); + wait(.75); + self EnableWeaponFire(); + while(distancesquared(vehicle.origin,end_node.origin) > (950*950)) + { + wait(.05); + } + self clearclientflag(level._CF_PLAYER_ZIPLINE_RUMBLE_QUAKE); + vehicle waittill("reached_end_node"); + self thread player_exit_zipline(vehicle,zip_trig); + if( IsDefined( sound_ent ) ) + { + sound_ent delete(); + } + wait(2); + self.is_ziplining = undefined; +} +force_deletion_of_soundent( player, vehicle ) +{ + vehicle endon( "reached_end_node" ); + vehicle endon( "player_unlinked" ); + player waittill_any( "death", "disconnect" ); + self Delete(); +} +zipline_player_death_disconnect_failsafe(player) +{ + self endon("player_unlinked"); + player waittill_any("death","disconnect"); + self unlink(); + self.in_use = undefined; +} +player_exit_zipline(vehicle,zip_trig) +{ + vehicle.in_use = undefined; + vehicle notify("player_unlinked"); + self DisableInvulnerability(); + self clearclientflag(level._CF_PLAYER_ZIPLINE_FAKE_PLAYER_SETUP ); + self move_to_safe_landing_spot(zip_trig,vehicle,self); + self unlink(); + release_time = GetAnimLength(level.zipline_anims["zipline_release"]); + self disableweapons(); + wait(release_time); + self setloweredweapon(0); + self Show(); + wait(1); + self maps\zombie_coast::coast_custom_viewmodel_override(); + self enableweapons(); + self EnableWeaponReload(); + self notify("exit_zipline"); + self allowcrouch(true); + self allowprone(true); + wait(.1); + Earthquake( RandomFloatRange( 0.35, 0.45 ), RandomFloatRange(.25, .5), self.origin, 100 ); + self.zipline_vehicle = undefined; + self allowads(true); + self allowsprint(true); + self decrement_is_drinking(); + self allowmelee(true); +} +move_to_safe_landing_spot(zip_trig,vehicle,zipliner) +{ + landing_spots = getstructarray(zip_trig.target,"targetname"); + if(landing_spots.size < 1) + { + return; + } + landing_spot_found = false; + while(!landing_spot_found) + { + for(i=0;i< landing_spots.size;i++) + { + if ( zipliner_can_land_here(landing_spots[i].origin,zipliner) ) + { + vehicle.origin = landing_spots[i].origin; + landing_spot_found = true; + } + } + wait(.05); + } +} +zipliner_can_land_here(spot,zipliner) +{ + players = get_players(); + for(i=0;i 0) + { + self.zipline_vehicle setspeed(speed - 5,.5); + } + } + } + } + if( distancesquared(self.origin,ai[i].origin) < (18*18)) + { + ai[i] dodamage(ai[i].health + 100,ai[i].origin); + level.zombie_total++; + } + } + wait(.05); + } +} +get_zipline_vehicle(vehicles) +{ + for(i=0;i= level.zombie_powerup_array.size ) + { + level.zombie_powerup_index = 0; + randomize_powerups(); + } + return powerup; +} +get_valid_powerup() +{ + if ( isdefined( level.zombie_powerup_boss ) ) + { + i = level.zombie_powerup_boss; + level.zombie_powerup_boss = undefined; + return level.zombie_powerup_array[ i ]; + } + if ( isdefined( level.zombie_powerup_ape ) ) + { + powerup = level.zombie_powerup_ape; + level.zombie_powerup_ape = undefined; + return powerup; + } + powerup = get_next_powerup(); + while( 1 ) + { + if( powerup == "carpenter" && get_num_window_destroyed() < 5 ) + { + powerup = get_next_powerup(); + } + else if( powerup == "fire_sale" && + ( level.zombie_vars["zombie_powerup_fire_sale_on"] == true || + level.chest_moves < 1 ) ) + { + powerup = get_next_powerup(); + } + else if( powerup == "all_revive" ) + { + if ( !maps\_laststand::player_num_in_laststand() ) + { + powerup = get_next_powerup(); + } + } + else if ( powerup == "bonfire_sale" ) + { + powerup = get_next_powerup(); + } + else if( powerup == "minigun" && mingun_no_drop() ) + { + powerup = get_next_powerup(); + } + else + { + return( powerup ); + } + } +} +mingun_no_drop() +{ + if( level.zombie_vars[ "zombie_powerup_minigun_on" ] == true ) + { + return true; + } + if( !flag( "power_on" ) ) + { + if( flag( "solo_game" ) ) + { + if( !flag( "solo_revive" ) ) + { + return true; + } + } + else + { + return true; + } + } + return false; +} +get_num_window_destroyed() +{ + num = 0; + for( i = 0; i < level.exterior_goals.size; i++ ) + { + if( all_chunks_destroyed( level.exterior_goals[i].barrier_chunks ) ) + { + num += 1; + } + } + return num; +} +watch_for_drop() +{ + flag_wait( "begin_spawning" ); + players = get_players(); + score_to_drop = ( players.size * level.zombie_vars["zombie_score_start_"+players.size+"p"] ) + level.zombie_vars["zombie_powerup_drop_increment"]; + while (1) + { + flag_wait( "zombie_drop_powerups" ); + players = get_players(); + curr_total_score = 0; + for (i = 0; i < players.size; i++) + { + curr_total_score += players[i].score_total; + } + if (curr_total_score > score_to_drop ) + { + level.zombie_vars["zombie_powerup_drop_increment"] *= 1.14; + score_to_drop = curr_total_score + level.zombie_vars["zombie_powerup_drop_increment"]; + level.zombie_vars["zombie_drop_item"] = 1; + } + wait( 0.5 ); + } +} +add_zombie_powerup( powerup_name, model_name, hint, fx ) +{ + if( IsDefined( level.zombie_include_powerups ) && !IsDefined( level.zombie_include_powerups[powerup_name] ) ) + { + return; + } + PrecacheModel( model_name ); + PrecacheString( hint ); + struct = SpawnStruct(); + if( !IsDefined( level.zombie_powerups ) ) + { + level.zombie_powerups = []; + } + struct.powerup_name = powerup_name; + struct.model_name = model_name; + struct.weapon_classname = "script_model"; + struct.hint = hint; + if( IsDefined( fx ) ) + { + struct.fx = LoadFx( fx ); + } + level.zombie_powerups[powerup_name] = struct; + level.zombie_powerup_array[level.zombie_powerup_array.size] = powerup_name; + add_zombie_special_drop( powerup_name ); +} +add_zombie_special_drop( powerup_name ) +{ + level.zombie_special_drop_array[ level.zombie_special_drop_array.size ] = powerup_name; +} +include_zombie_powerup( powerup_name ) +{ + if( "1" == GetDvar( #"mutator_noPowerups") ) + { + return; + } + if( !IsDefined( level.zombie_include_powerups ) ) + { + level.zombie_include_powerups = []; + } + level.zombie_include_powerups[powerup_name] = true; +} +powerup_round_start() +{ + level.powerup_drop_count = 0; +} +powerup_drop(drop_point) +{ + if( level.mutators["mutator_noPowerups"] ) + { + return; + } + if( level.powerup_drop_count >= level.zombie_vars["zombie_powerup_drop_max_per_round"] ) + { + return; + } + if( !isDefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0 ) + { + return; + } + rand_drop = randomint(100); + if (rand_drop > 2) + { + if (!level.zombie_vars["zombie_drop_item"]) + { + return; + } + debug = "score"; + } + else + { + debug = "random"; + } + playable_area = getentarray("player_volume","script_noteworthy"); + level.powerup_drop_count++; + powerup = maps\_zombiemode_net::network_safe_spawn( "powerup", 1, "script_model", drop_point + (0,0,40)); + valid_drop = false; + for (i = 0; i < playable_area.size; i++) + { + if (powerup istouching(playable_area[i])) + { + valid_drop = true; + } + } + if( valid_drop && level.rare_powerups_active ) + { + pos = ( drop_point[0], drop_point[1], drop_point[2] + 42 ); + if( check_for_rare_drop_override( pos ) ) + { + level.zombie_vars["zombie_drop_item"] = 0; + valid_drop = 0; + } + } + if(! valid_drop ) + { + level.powerup_drop_count--; + powerup delete(); + return; + } + powerup powerup_setup(); + print_powerup_drop( powerup.powerup_name, debug ); + powerup thread powerup_timeout(); + powerup thread powerup_wobble(); + powerup thread powerup_grab(); + level.zombie_vars["zombie_drop_item"] = 0; +} +specific_powerup_drop( powerup_name, drop_spot ) +{ + powerup = maps\_zombiemode_net::network_safe_spawn( "powerup", 1, "script_model", drop_spot + (0,0,40)); + if ( IsDefined(powerup) ) + { + struct = level.zombie_powerups[powerup_name]; + powerup SetModel( struct.model_name ); + playsoundatposition("zmb_spawn_powerup", powerup.origin); + powerup.powerup_name = struct.powerup_name; + powerup.hint = struct.hint; + if( IsDefined( struct.fx ) ) + { + powerup.fx = struct.fx; + } + powerup PlayLoopSound("zmb_spawn_powerup_loop"); + powerup thread powerup_timeout(); + powerup thread powerup_wobble(); + powerup thread powerup_grab(); + } +} +special_powerup_drop(drop_point) +{ + if( !isDefined(level.zombie_include_powerups) || level.zombie_include_powerups.size == 0 ) + { + return; + } + powerup = spawn ("script_model", drop_point + (0,0,40)); + playable_area = getentarray("player_volume","script_noteworthy"); + valid_drop = false; + for (i = 0; i < playable_area.size; i++) + { + if (powerup istouching(playable_area[i])) + { + valid_drop = true; + break; + } + } + if(!valid_drop) + { + powerup Delete(); + return; + } + powerup special_drop_setup(); +} +powerup_setup() +{ + powerup = get_valid_powerup(); + struct = level.zombie_powerups[powerup]; + self SetModel( struct.model_name ); + playsoundatposition("zmb_spawn_powerup", self.origin); + self.powerup_name = struct.powerup_name; + self.hint = struct.hint; + if( IsDefined( struct.fx ) ) + { + self.fx = struct.fx; + } + self PlayLoopSound("zmb_spawn_powerup_loop"); +} +special_drop_setup() +{ + powerup = undefined; + is_powerup = true; + if ( level.round_number <= 10 || maps\_laststand::player_num_in_laststand() ) + { + powerup = get_valid_powerup(); + } + else + { + powerup = level.zombie_special_drop_array[ RandomInt(level.zombie_special_drop_array.size) ]; + if ( level.round_number > 15 && + ( RandomInt(100) < (level.round_number - 15)*5 ) ) + { + powerup = "nothing"; + } + } + switch ( powerup ) + { + case "nuke": + case "insta_kill": + case "double_points": + case "carpenter": + case "fire_sale": + case "bonfire_sale": + case "all_revive": + case "minigun": + break; + case "full_ammo": + if ( level.round_number > 10 && + ( RandomInt(100) < (level.round_number - 10)*5 ) ) + { + powerup = level.zombie_powerup_array[ RandomInt(level.zombie_powerup_array.size) ]; + } + break; + case "dog": + if ( level.round_number >= 15 ) + { + is_powerup = false; + dog_spawners = GetEntArray( "special_dog_spawner", "targetname" ); + thread play_sound_2d( "sam_nospawn" ); + } + else + { + powerup = get_valid_powerup(); + } + break; + default: + is_powerup = false; + Playfx( level._effect["lightning_dog_spawn"], self.origin ); + playsoundatposition( "pre_spawn", self.origin ); + wait( 1.5 ); + playsoundatposition( "zmb_bolt", self.origin ); + Earthquake( 0.5, 0.75, self.origin, 1000); + PlayRumbleOnPosition("explosion_generic", self.origin); + playsoundatposition( "spawn", self.origin ); + wait( 1.0 ); + thread play_sound_2d( "sam_nospawn" ); + self Delete(); + } + if ( is_powerup ) + { + Playfx( level._effect["lightning_dog_spawn"], self.origin ); + playsoundatposition( "pre_spawn", self.origin ); + wait( 1.5 ); + playsoundatposition( "zmb_bolt", self.origin ); + Earthquake( 0.5, 0.75, self.origin, 1000); + PlayRumbleOnPosition("explosion_generic", self.origin); + playsoundatposition( "spawn", self.origin ); + struct = level.zombie_powerups[powerup]; + self SetModel( struct.model_name ); + playsoundatposition("zmb_spawn_powerup", self.origin); + self.powerup_name = struct.powerup_name; + self.hint = struct.hint; + if( IsDefined( struct.fx ) ) + { + self.fx = struct.fx; + } + self PlayLoopSound("zmb_spawn_powerup_loop"); + self thread powerup_timeout(); + self thread powerup_wobble(); + self thread powerup_grab(); + } +} +powerup_grab() +{ + self endon ("powerup_timedout"); + self endon ("powerup_grabbed"); + while (isdefined(self)) + { + players = get_players(); + for (i = 0; i < players.size; i++) + { + if( players[i] maps\_laststand::player_is_in_laststand() && self.powerup_name == "minigun" ) + { + continue; + } + if (distance (players[i].origin, self.origin) < 64) + { + if( IsDefined( self.powerup_name ) && self.powerup_name == "minigun" ) + { + playfx (level._effect["powerup_grabbed_solo"], self.origin); + } + else + { + playfx (level._effect["powerup_grabbed"], self.origin); + } + playfx (level._effect["powerup_grabbed_wave"], self.origin); + if( IsDefined( level.zombie_powerup_grab_func ) ) + { + level thread [[level.zombie_powerup_grab_func]](); + } + else + { + switch (self.powerup_name) + { + case "nuke": + level thread nuke_powerup( self ); + players[i] thread powerup_vo("nuke"); + zombies = getaiarray("axis"); + players[i].zombie_nuked = get_array_of_closest( self.origin, zombies ); + players[i] notify("nuke_triggered"); + break; + case "full_ammo": + level thread full_ammo_powerup( self ); + players[i] thread powerup_vo("full_ammo"); + break; + case "double_points": + level thread double_points_powerup( self ); + players[i] thread powerup_vo("double_points"); + break; + case "insta_kill": + level thread insta_kill_powerup( self ); + players[i] thread powerup_vo("insta_kill"); + break; + case "carpenter": + level thread start_carpenter( self.origin ); + players[i] thread powerup_vo("carpenter"); + break; + case "fire_sale": + level thread start_fire_sale( self ); + players[i] thread powerup_vo("firesale"); + break; + case "bonfire_sale": + level thread start_bonfire_sale( self ); + players[i] thread powerup_vo("firesale"); + break; + case "minigun": + level thread minigun_weapon_powerup( players[i] ); + players[i] thread powerup_vo( "insta_kill" ); + break; + case "all_revive": + level thread start_revive_all( self ); + players[i] thread powerup_vo("revive"); + break; + default: + println ("Unrecognized poweup."); + break; + } + } + wait( 0.1 ); + playsoundatposition("zmb_powerup_grabbed", self.origin); + self stoploopsound(); + if( self.powerup_name != "fire_sale" ) + { + level thread maps\_zombiemode_audio::do_announcer_playvox( level.devil_vox["powerup"][self.powerup_name] ); + } + self delete(); + self notify ("powerup_grabbed"); + } + } + wait 0.1; + } +} +start_revive_all( item ) +{ + players = get_players(); + reviver = players[0]; + for ( i = 0; i < players.size; i++ ) + { + if ( !players[i] maps\_laststand::player_is_in_laststand() ) + { + reviver = players[i]; + break; + } + } + for ( i = 0; i < players.size; i++ ) + { + if ( players[i] maps\_laststand::player_is_in_laststand() ) + { + players[i] maps\_laststand::revive_force_revive( reviver ); + players[i] notify ( "zombified" ); + } + } +} +start_fire_sale( item ) +{ + level notify ("powerup fire sale"); + level endon ("powerup fire sale"); + level thread maps\_zombiemode_audio::do_announcer_playvox( level.devil_vox["powerup"]["fire_sale_short"] ); + level.zombie_vars["zombie_powerup_fire_sale_on"] = true; + level thread toggle_fire_sale_on(); + level.zombie_vars["zombie_powerup_fire_sale_time"] = 30; + while ( level.zombie_vars["zombie_powerup_fire_sale_time"] > 0) + { + wait(0.1); + level.zombie_vars["zombie_powerup_fire_sale_time"] = level.zombie_vars["zombie_powerup_fire_sale_time"] - 0.1; + } + level.zombie_vars["zombie_powerup_fire_sale_on"] = false; + level notify ( "fire_sale_off" ); +} +start_bonfire_sale( item ) +{ + level notify ("powerup bonfire sale"); + level endon ("powerup bonfire sale"); + temp_ent = spawn("script_origin", (0,0,0)); + temp_ent playloopsound ("zmb_double_point_loop"); + level.zombie_vars["zombie_powerup_bonfire_sale_on"] = true; + level thread toggle_bonfire_sale_on(); + level.zombie_vars["zombie_powerup_bonfire_sale_time"] = 30; + while ( level.zombie_vars["zombie_powerup_bonfire_sale_time"] > 0) + { + wait(0.1); + level.zombie_vars["zombie_powerup_bonfire_sale_time"] = level.zombie_vars["zombie_powerup_bonfire_sale_time"] - 0.1; + } + level.zombie_vars["zombie_powerup_bonfire_sale_on"] = false; + level notify ( "bonfire_sale_off" ); + players = get_players(); + for (i = 0; i < players.size; i++) + { + players[i] playsound("zmb_points_loop_off"); + } + temp_ent Delete(); +} +start_carpenter( origin ) +{ + window_boards = getstructarray( "exterior_goal", "targetname" ); + total = level.exterior_goals.size; + carp_ent = spawn("script_origin", (0,0,0)); + carp_ent playloopsound( "evt_carpenter" ); + while(true) + { + windows = get_closest_window_repair(window_boards, origin); + if( !IsDefined( windows ) ) + { + carp_ent stoploopsound( 1 ); + carp_ent playsound( "evt_carpenter_end", "sound_done" ); + carp_ent waittill( "sound_done" ); + break; + } + else + window_boards = array_remove(window_boards, windows); + while(1) + { + if( all_chunks_intact( windows.barrier_chunks ) ) + { + break; + } + chunk = get_random_destroyed_chunk( windows.barrier_chunks ); + if( !IsDefined( chunk ) ) + break; + windows thread maps\_zombiemode_blockers::replace_chunk( chunk, undefined, true ); + windows.clip enable_trigger(); + windows.clip DisconnectPaths(); + wait_network_frame(); + wait(0.05); + } + wait_network_frame(); + } + players = get_players(); + for(i = 0; i < players.size; i++) + { + players[i] maps\_zombiemode_score::player_add_points( "carpenter_powerup", 200 ); + } + carp_ent delete(); +} +get_closest_window_repair( windows, origin ) +{ + current_window = undefined; + shortest_distance = undefined; + for( i = 0; i < windows.size; i++ ) + { + if( all_chunks_intact(windows[i].barrier_chunks ) ) + continue; + if( !IsDefined( current_window ) ) + { + current_window = windows[i]; + shortest_distance = DistanceSquared( current_window.origin, origin ); + } + else + { + if( DistanceSquared(windows[i].origin, origin) < shortest_distance ) + { + current_window = windows[i]; + shortest_distance = DistanceSquared( windows[i].origin, origin ); + } + } + } + return current_window; +} +powerup_vo( type ) +{ + self endon("death"); + self endon("disconnect"); + wait(randomfloatrange(3,3.5)); + self maps\_zombiemode_audio::create_and_play_dialog( "powerup", type ); +} +powerup_wobble() +{ + self endon ("powerup_grabbed"); + self endon ("powerup_timedout"); + if (isdefined(self)) + { + if( IsDefined( self.powerup_name ) && self.powerup_name == "minigun" ) + { + playfxontag (level._effect["powerup_on_solo"], self, "tag_origin"); + } + else + { + playfxontag (level._effect["powerup_on"], self, "tag_origin"); + } + } + while (isdefined(self)) + { + waittime = randomfloatrange(2.5, 5); + yaw = RandomInt( 360 ); + if( yaw > 300 ) + { + yaw = 300; + } + else if( yaw < 60 ) + { + yaw = 60; + } + yaw = self.angles[1] + yaw; + self rotateto ((-60 + randomint(120), yaw, -45 + randomint(90)), waittime, waittime * 0.5, waittime * 0.5); + wait randomfloat (waittime - 0.1); + } +} +powerup_timeout() +{ + self endon ("powerup_grabbed"); + wait 15; + for (i = 0; i < 40; i++) + { + if (i % 2) + { + self hide(); + } + else + { + self show(); + } + if (i < 15) + { + wait 0.5; + } + else if (i < 25) + { + wait 0.25; + } + else + { + wait 0.1; + } + } + self notify ("powerup_timedout"); + self delete(); +} +nuke_powerup( drop_item ) +{ + zombies = getaispeciesarray("axis"); + location = drop_item.origin; + PlayFx( drop_item.fx, location ); + level thread nuke_flash(); + wait( 0.5 ); + zombies = get_array_of_closest( location, zombies ); + zombies_nuked = []; + for (i = 0; i < zombies.size; i++) + { + if ( IsDefined(zombies[i].marked_for_death) && zombies[i].marked_for_death ) + { + continue; + } + if ( IsDefined(zombies[i].nuke_damage_func) ) + { + zombies[i] thread [[ zombies[i].nuke_damage_func ]](); + continue; + } + if( is_magic_bullet_shield_enabled( zombies[i] ) ) + { + continue; + } + zombies[i].marked_for_death = true; + zombies[i].nuked = true; + zombies_nuked[ zombies_nuked.size ] = zombies[i]; + } + for (i = 0; i < zombies_nuked.size; i++) + { + wait (randomfloatrange(0.1, 0.7)); + if( !IsDefined( zombies_nuked[i] ) ) + { + continue; + } + if( is_magic_bullet_shield_enabled( zombies_nuked[i] ) ) + { + continue; + } + if( i < 5 && !( zombies_nuked[i].isdog ) ) + { + zombies_nuked[i] thread animscripts\zombie_death::flame_death_fx(); + zombies_nuked[i] playsound ("evt_nuked"); + } + if( !( zombies_nuked[i].isdog ) ) + { + zombies_nuked[i] maps\_zombiemode_spawner::zombie_head_gib(); + zombies_nuked[i] playsound ("evt_nuked"); + } + zombies_nuked[i] dodamage( zombies_nuked[i].health + 666, zombies_nuked[i].origin ); + } + players = get_players(); + for(i = 0; i < players.size; i++) + { + players[i] maps\_zombiemode_score::player_add_points( "nuke_powerup", 400 ); + } +} +nuke_flash() +{ + players = getplayers(); + for(i=0; i= 0) + { + wait 0.1; + level.zombie_vars["zombie_powerup_insta_kill_time"] = level.zombie_vars["zombie_powerup_insta_kill_time"] - 0.1; + } + players = get_players(); + for (i = 0; i < players.size; i++) + { + players[i] playsound("zmb_insta_kill"); + } + temp_enta stoploopsound(2); + level.zombie_vars["zombie_powerup_insta_kill_on"] = false; + level.zombie_vars["zombie_powerup_insta_kill_time"] = 30; + temp_enta delete(); +} +point_doubler_on_hud( drop_item ) +{ + self endon ("disconnect"); + if ( level.zombie_vars["zombie_powerup_point_doubler_on"] ) + { + level.zombie_vars["zombie_powerup_point_doubler_time"] = 30; + return; + } + level.zombie_vars["zombie_powerup_point_doubler_on"] = true; + level thread time_remaining_on_point_doubler_powerup(); +} +time_remaining_on_point_doubler_powerup() +{ + temp_ent = spawn("script_origin", (0,0,0)); + temp_ent playloopsound ("zmb_double_point_loop"); + while ( level.zombie_vars["zombie_powerup_point_doubler_time"] >= 0) + { + wait 0.1; + level.zombie_vars["zombie_powerup_point_doubler_time"] = level.zombie_vars["zombie_powerup_point_doubler_time"] - 0.1; + } + level.zombie_vars["zombie_powerup_point_doubler_on"] = false; + players = get_players(); + for (i = 0; i < players.size; i++) + { + players[i] playsound("zmb_points_loop_off"); + } + temp_ent stoploopsound(2); + level.zombie_vars["zombie_powerup_point_doubler_time"] = 30; + temp_ent delete(); +} +toggle_bonfire_sale_on() +{ + level endon ("powerup bonfire sale"); + if( !isdefined ( level.zombie_vars["zombie_powerup_bonfire_sale_on"] ) ) + { + return; + } + if( level.zombie_vars["zombie_powerup_bonfire_sale_on"] ) + { + if ( isdefined( level.bonfire_init_func ) ) + { + level thread [[ level.bonfire_init_func ]](); + } + level waittill( "bonfire_sale_off" ); + } +} +toggle_fire_sale_on() +{ + level endon ("powerup fire sale"); + if( !isdefined ( level.zombie_vars["zombie_powerup_fire_sale_on"] ) ) + { + return; + } + if( level.zombie_vars["zombie_powerup_fire_sale_on"] ) + { + for( i = 0; i < level.chests.size; i++ ) + { + level.chests[i].zombie_cost = 10; + level.chests[i] set_hint_string( level.chests[i] , "powerup_fire_sale_cost" ); + if( level.chest_index != i ) + { + level.chests[i] thread maps\_zombiemode_weapons::show_chest(); + level.chests[i] thread maps\_zombiemode_weapons::hide_rubble(); + wait_network_frame(); + } + } + level waittill( "fire_sale_off" ); + for( i = 0; i < level.chests.size; i++ ) + { + if( level.chest_index != i ) + { + level thread remove_temp_chest( i ); + } + if(IsDefined(level.chests[i].grab_weapon_hint) && (level.chests[i].grab_weapon_hint == true)) + { + level.chests[i] thread fire_sale_weapon_wait(); + } + else + { + level.chests[i].zombie_cost = level.chests[i].old_cost; + level.chests[i] set_hint_string( level.chests[i] , "default_treasure_chest_" + level.chests[i].zombie_cost ); + } + } + } +} +fire_sale_weapon_wait() +{ + self.zombie_cost = self.old_cost; + while( isdefined( self.chest_user ) ) + { + wait_network_frame(); + } + self set_hint_string( self , "default_treasure_chest_" + self.zombie_cost ); +} +remove_temp_chest( chest_index ) +{ + while( isdefined( level.chests[chest_index].chest_user ) || (IsDefined(level.chests[chest_index]._box_open) && level.chests[chest_index]._box_open == true)) + { + wait_network_frame(); + } + playfx(level._effect["poltergeist"], level.chests[chest_index].orig_origin); + level.chests[chest_index] playsound ( "zmb_box_poof_land" ); + level.chests[chest_index] playsound( "zmb_couch_slam" ); + level.chests[chest_index] maps\_zombiemode_weapons::hide_chest(); + level.chests[chest_index] maps\_zombiemode_weapons::show_rubble(); +} +devil_dialog_delay() +{ + wait(1.0); +} +full_ammo_on_hud( drop_item ) +{ + self endon ("disconnect"); + hudelem = maps\_hud_util::createFontString( "objective", 2 ); + hudelem maps\_hud_util::setPoint( "TOP", undefined, 0, level.zombie_vars["zombie_timer_offset"] - (level.zombie_vars["zombie_timer_offset_interval"] * 2)); + hudelem.sort = 0.5; + hudelem.alpha = 0; + hudelem fadeovertime(0.5); + hudelem.alpha = 1; + hudelem.label = drop_item.hint; + hudelem thread full_ammo_move_hud(); +} +full_ammo_move_hud() +{ + players = get_players(); + for (i = 0; i < players.size; i++) + { + players[i] playsound ("zmb_full_ammo"); + } + wait 0.5; + move_fade_time = 1.5; + self FadeOverTime( move_fade_time ); + self MoveOverTime( move_fade_time ); + self.y = 270; + self.alpha = 0; + wait move_fade_time; + self destroy(); +} +check_for_rare_drop_override( pos ) +{ + if( IsDefined(flag("ape_round")) && flag("ape_round") ) + { + return( 0 ); + } + return( 0 ); +} +setup_firesale_audio() +{ + wait(2); + intercom = getentarray ("intercom", "targetname"); + while(1) + { + while( level.zombie_vars["zombie_powerup_fire_sale_on"] == false) + { + wait(0.2); + } + for(i=0;i 0) + { + wait(0.1); + level.zombie_vars["zombie_powerup_minigun_time"] = level.zombie_vars["zombie_powerup_minigun_time"] - 0.1; + } + setClientSysState( "levelNotify", "minie", ent_player ); + level thread minigun_weapon_powerup_remove( ent_player, str_gun_return_notify ); +} +minigun_weapon_powerup_remove( ent_player, str_gun_return_notify ) +{ + ent_player endon( "death" ); + ent_player endon( "player_downed" ); + ent_player TakeWeapon( "minigun_zm" ); + level.zombie_vars[ "zombie_powerup_minigun_on" ] = false; + ent_player._show_solo_hud = false; + level._zombie_minigun_powerup_last_stand_func = undefined; + ent_player notify( str_gun_return_notify ); + ent_player decrement_is_drinking(); + if( IsDefined( ent_player._zombie_gun_before_minigun ) ) + { + player_weapons = ent_player GetWeaponsListPrimaries(); + for( i = 0; i < player_weapons.size; i++ ) + { + if( player_weapons[i] == ent_player._zombie_gun_before_minigun ) + { + ent_player SwitchToWeapon( ent_player._zombie_gun_before_minigun ); + return; + } + } + } + primaryWeapons = ent_player GetWeaponsListPrimaries(); + if( primaryWeapons.size > 0 ) + { + ent_player SwitchToWeapon( primaryWeapons[0] ); + } + else + { + allWeapons = ent_player GetWeaponsList(); + for( i = 0; i < allWeapons.size; i++ ) + { + if( allWeapons[i] == "knife_zm" || allWeapons[i] == "bowie_knife_zm" ) + { + ent_player SwitchToWeapon( allWeapons[i] ); + return; + } + } + } +} +minigun_weapon_powerup_off() +{ + level.zombie_vars["zombie_powerup_minigun_time"] = 0; +} +minigun_watch_gunner_downed() +{ + primaryWeapons = self GetWeaponsListPrimaries(); + for( i = 0; i < primaryWeapons.size; i++ ) + { + if( primaryWeapons[i] == "minigun_zm" ) + { + self TakeWeapon( "minigun_zm" ); + } + } + self notify( "minigun_time_over" ); + level.zombie_vars[ "zombie_powerup_minigun_on" ] = false; + self._show_solo_hud = false; + level._zombie_minigun_powerup_last_stand_func = undefined; +} +print_powerup_drop( powerup, type ) +{ +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_score.gsc b/BO1/PC/ZM/maps/_zombiemode_score.gsc new file mode 100644 index 0000000..67cca6b --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_score.gsc @@ -0,0 +1,453 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +init() +{ + team_score_init(); +} +player_add_points( event, mod, hit_location ,is_dog) +{ + if( level.intermission ) + { + return; + } + if( !is_player_valid( self ) ) + { + return; + } + player_points = 0; + team_points = 0; + multiplier = get_points_multiplier(); + switch( event ) + { + case "death": + player_points = get_zombie_death_player_points(); + team_points = get_zombie_death_team_points(); + points = player_add_points_kill_bonus( mod, hit_location ); + if( level.zombie_vars["zombie_powerup_insta_kill_on"] == 1 && mod == "MOD_UNKNOWN" ) + { + points = points * 2; + } + player_points = player_points + points; + if ( team_points > 0 ) + { + team_points = team_points + points; + } + if(IsDefined(self.kill_tracker)) + { + self.kill_tracker++; + } + else + { + self.kill_tracker = 1; + } + self.stats["kills"] = self.kill_tracker; + break; + case "ballistic_knife_death": + player_points = get_zombie_death_player_points() + level.zombie_vars["zombie_score_bonus_melee"]; + if(IsDefined(self.kill_tracker)) + { + self.kill_tracker++; + } + else + { + self.kill_tracker = 1; + } + self.stats["kills"] = self.kill_tracker; + break; + case "damage_light": + player_points = level.zombie_vars["zombie_score_damage_light"]; + break; + case "damage": + player_points = level.zombie_vars["zombie_score_damage_normal"]; + break; + case "damage_ads": + player_points = Int( level.zombie_vars["zombie_score_damage_normal"] * 1.25 ); + break; + case "rebuild_board": + case "carpenter_powerup": + player_points = mod; + break; + case "nuke_powerup": + player_points = mod; + team_points = mod; + break; + case "thundergun_fling": + player_points = mod; + break; + case "reviver": + player_points = mod; + break; + default: + assertex( 0, "Unknown point event" ); + break; + } + player_points = multiplier * round_up_score( player_points, 5 ); + team_points = multiplier * round_up_score( team_points, 5 ); + self add_to_player_score( player_points ); + players = get_players(); + if ( players.size > 1 ) + { + self add_to_team_score( team_points ); + } + self.stats["score"] = self.score_total; +} +get_points_multiplier() +{ + multiplier = level.zombie_vars["zombie_point_scalar"]; + if( level.mutators["mutator_doubleMoney"] ) + { + multiplier *= 2; + } + return multiplier; +} +get_zombie_death_player_points() +{ + players = get_players(); + if( players.size == 1 ) + { + points = level.zombie_vars["zombie_score_kill_1player"]; + } + else if( players.size == 2 ) + { + points = level.zombie_vars["zombie_score_kill_2player"]; + } + else if( players.size == 3 ) + { + points = level.zombie_vars["zombie_score_kill_3player"]; + } + else + { + points = level.zombie_vars["zombie_score_kill_4player"]; + } + return( points ); +} +get_zombie_death_team_points() +{ + players = get_players(); + if( players.size == 1 ) + { + points = level.zombie_vars["zombie_score_kill_1p_team"]; + } + else if( players.size == 2 ) + { + points = level.zombie_vars["zombie_score_kill_2p_team"]; + } + else if( players.size == 3 ) + { + points = level.zombie_vars["zombie_score_kill_3p_team"]; + } + else + { + points = level.zombie_vars["zombie_score_kill_4p_team"]; + } + return( points ); +} +player_add_points_kill_bonus( mod, hit_location ) +{ + if( mod == "MOD_MELEE" ) + { + return level.zombie_vars["zombie_score_bonus_melee"]; + } + if( mod == "MOD_BURNED" ) + { + return level.zombie_vars["zombie_score_bonus_burn"]; + } + score = 0; + switch( hit_location ) + { + case "head": + case "helmet": + score = level.zombie_vars["zombie_score_bonus_head"]; + break; + case "neck": + score = level.zombie_vars["zombie_score_bonus_neck"]; + break; + case "torso_upper": + case "torso_lower": + score = level.zombie_vars["zombie_score_bonus_torso"]; + break; + } + return score; +} +player_reduce_points( event, mod, hit_location ) +{ + if( level.intermission ) + { + return; + } + points = 0; + switch( event ) + { + case "no_revive_penalty": + percent = level.zombie_vars["penalty_no_revive"]; + points = self.score * percent; + break; + case "died": + percent = level.zombie_vars["penalty_died"]; + points = self.score * percent; + break; + case "downed": + percent = level.zombie_vars["penalty_downed"];; + self notify("I_am_down"); + points = self.score * percent; + self.score_lost_when_downed = round_up_to_ten( int( points ) ); + break; + default: + assertex( 0, "Unknown point event" ); + break; + } + points = self.score - round_up_to_ten( int( points ) ); + if( points < 0 ) + { + points = 0; + } + self.score = points; + self set_player_score_hud(); +} +add_to_player_score( points, add_to_total ) +{ + if ( !IsDefined(add_to_total) ) + { + add_to_total = true; + } + if( !IsDefined( points ) || level.intermission ) + { + return; + } + self.score += points; + if ( add_to_total ) + { + self.score_total += points; + } + self set_player_score_hud(); +} +minus_to_player_score( points ) +{ + if( !IsDefined( points ) || level.intermission ) + { + return; + } + self.score -= points; + self set_player_score_hud(); +} +add_to_team_score( points ) +{ +} +minus_to_team_score( points ) +{ + if( !IsDefined( points ) || level.intermission ) + { + return; + } + team_pool = level.team_pool[ 0 ]; + if ( IsDefined( self.team_num ) && self.team_num != 0 ) + { + team_pool = level.team_pool[ self.team_num ]; + } + team_pool.score -= points; + team_pool set_team_score_hud(); +} +player_died_penalty() +{ + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( players[i] != self && !players[i].is_zombie ) + { + players[i] player_reduce_points( "no_revive_penalty" ); + } + } +} +player_downed_penalty() +{ + self player_reduce_points( "downed" ); +} +set_player_score_hud( init ) +{ + num = self.entity_num; + score_diff = self.score - self.old_score; + if ( IsPlayer( self ) ) + { + if( !level.onlineGame && !level.systemLink && IsSplitScreen() ) + { + self thread score_highlight( self, self.score, score_diff ); + } + else + { + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[i] thread score_highlight( self, self.score, score_diff ); + } + } + } + if( IsDefined( init ) && init ) + { + return; + } + self.old_score = self.score; +} +set_team_score_hud( init ) +{ + self.score = 0; + self.score_total = 0; +} +create_highlight_hud( x, y, value ) +{ + font_size = 8; + if ( self IsSplitscreen() ) + { + font_size *= 2; + } + hud = create_simple_hud( self ); + level.hudelem_count++; + hud.foreground = true; + hud.sort = 0; + hud.x = x; + hud.y = y; + hud.fontScale = font_size; + hud.alignX = "right"; + hud.alignY = "middle"; + hud.horzAlign = "user_right"; + hud.vertAlign = "user_bottom"; + if( value < 1 ) + { + hud.color = ( 0.21, 0, 0 ); + } + else + { + hud.color = ( 0.9, 0.9, 0.0 ); + hud.label = &"SCRIPT_PLUS"; + } + hud.hidewheninmenu = false; + hud SetValue( value ); + return hud; +} +score_highlight( scoring_player, score, value ) +{ + self endon( "disconnect" ); + score_x = -103; + score_y = -100; + if ( self IsSplitscreen() ) + { + score_y = -95; + } + x = score_x; + if( !level.onlineGame && !level.systemLink && IsSplitScreen() ) + { + y = score_y; + } + else + { + players = get_players(); + num = 0; + for ( i = 0; i < players.size; i++ ) + { + if ( scoring_player == players[i] ) + { + num = players.size - i - 1; + } + } + y = ( num * -20 ) + score_y; + } + if ( self IsSplitscreen() ) + { + y *= 2; + } + time = 0.5; + half_time = time * 0.5; + hud = self create_highlight_hud( x, y, value ); + hud MoveOverTime( time ); + hud.x -= 20 + RandomInt( 40 ); + hud.y -= ( -15 + RandomInt( 30 ) ); + wait( half_time ); + hud FadeOverTime( half_time ); + hud.alpha = 0; + wait( half_time ); + hud Destroy(); + level.hudelem_count--; +} +team_score_init() +{ + flag_wait( "all_players_connected" ); + level.team_pool = []; + players = get_players(); + if ( players.size == 1 ) + { + level.team_pool[0] = SpawnStruct(); + pool = level.team_pool[0]; + pool.team_num = 0; + pool.score = 0; + pool.old_score = pool.score; + pool.score_total = pool.score; + return; + } + if ( IsDefined( level.zombiemode_versus ) && level.zombiemode_versus ) + { + num_pools = 2; + } + else + { + num_pools = 1; + } + for (i=0; i 0) + { + stage thread time_limited_stage(sidequest); + } + if(IsDefined(stage.title)) + { + stage thread display_stage_title(sidequest.uses_teleportation); + } +} +display_stage_title(wait_for_teleport_done_notify) +{ + if(wait_for_teleport_done_notify) + { + level waittill("teleport_done"); + wait(2.0); + } + stage_text = NewHudElem(); + stage_text.location = 0; + stage_text.alignX = "center"; + stage_text.alignY = "middle"; + stage_text.foreground = 1; + stage_text.fontScale = 1.6; + stage_text.sort = 20; + stage_text.x = 320; + stage_text.y = 300; + stage_text.og_scale = 1; + stage_text.color = (128, 0, 0); + stage_text.alpha = 0; + stage_text.fontstyle3d = "shadowedmore"; + stage_text SetText(self.title); + stage_text FadeOverTime(0.5); + stage_text.alpha = 1; + wait(5.0); + stage_text FadeOverTime(1.0); + stage_text.alpha = 0; + wait(1.0); + stage_text Destroy(); +} +time_limited_stage(sidequest) +{ + level endon(sidequest.name + "_" + self.name + "_over"); + level endon("suspend_timer"); + level endon( "end_game" ); + time_limit = undefined; + if(IsDefined(self.time_limit_func)) + { + time_limit = [[self.time_limit_func]]() * 0.25; + } + else + { + time_limit = self.time_limit * 0.25; + } + wait(time_limit); + level notify("timed_stage_75_percent"); + wait(time_limit); + level notify("timed_stage_50_percent"); + wait(time_limit); + level notify("timed_stage_25_percent"); + wait(time_limit - 10); + level notify("timed_stage_10_seconds_to_go"); + wait(10); + stage_failed(sidequest, self); +} +sidequest_println(str) +{ +} +precache_sidequest_assets() +{ + sidequest_names = GetArrayKeys(level._zombie_sidequests); + for(i = 0; i < sidequest_names.size; i ++) + { + sq = level._zombie_sidequests[sidequest_names[i]]; + icon_keys = GetArrayKeys(sq.icons); + for(j = 0; j < icon_keys.size; j ++) + { + PreCacheShader(sq.icons[icon_keys[j]]); + } + stage_names = GetArrayKeys(sq.stages); + for(j = 0; j < stage_names.size; j ++) + { + stage = sq.stages[stage_names[j]]; + for(k = 0; k < stage.assets.size; k ++) + { + asset = stage.assets[k]; + if(IsDefined(asset.type) && asset.type == "struct") + { + if(IsDefined(asset.model)) + { + PreCacheModel(asset.model); + } + } + } + } + } +} +sidequest_complete(sidequest_name) +{ + return(level._zombie_sidequests[sidequest_name].sidequest_complete); +} +stage_completed(sidequest_name, stage_name) +{ + PrintLn("*** stage completed called."); + sidequest = level._zombie_sidequests[sidequest_name]; + stage = sidequest.stages[stage_name]; + level thread stage_completed_internal(sidequest, stage); +} +stage_completed_internal(sidequest, stage) +{ + level notify(sidequest.name + "_" + stage.name + "_over"); + level notify(sidequest.name + "_" + stage.name +"_completed"); + if(IsDefined(sidequest.generic_stage_end_func)) + { + PrintLn("Calling generic end func."); + stage [[sidequest.generic_stage_end_func]](); + } + if(IsDefined(stage.exit_func)) + { + PrintLn("Calling stage end func."); + stage [[stage.exit_func]](true); + } + stage.completed = true; + sidequest.last_completed_stage = sidequest.active_stage; + sidequest.active_stage = -1; + stage delete_stage_assets(); + all_complete = true; + stage_names = GetArrayKeys(sidequest.stages); + for(i = 0; i < stage_names.size; i ++) + { + if(sidequest.stages[stage_names[i]].completed == false) + { + all_complete = false; + break; + } + } + if(all_complete == true) + { + if(IsDefined(sidequest.complete_func)) + { + sidequest thread [[sidequest.complete_func]](); + } + level notify("sidequest_" + sidequest.name + "_complete"); + sidequest.sidequest_completed = true; + } +} +stage_failed_internal(sidequest, stage) +{ + level notify(sidequest.name + "_" + stage.name + "_over"); + level notify(sidequest.name + "_" + stage.name +"_failed"); + if(IsDefined(sidequest.generic_stage_end_func)) + { + stage [[sidequest.generic_stage_end_func]](); + } + if(IsDefined(stage.exit_func)) + { + stage [[stage.exit_func]](false); + } + sidequest.active_stage = -1; + stage delete_stage_assets(); +} +stage_failed(sidequest, stage) +{ + PrintLn("*** Stage failed called."); + if(IsString(sidequest)) + { + sidequest = level._zombie_sidequests[sidequest]; + } + if(IsString(stage)) + { + stage = sidequest.stages[stage]; + } + level thread stage_failed_internal(sidequest, stage); +} +get_sidequest_stage(sidequest, stage_number) +{ + stage = undefined; + stage_names = GetArrayKeys(sidequest.stages); + for(i = 0; i < stage_names.size; i ++) + { + if(sidequest.stages[stage_names[i]].stage_number == stage_number) + { + stage = sidequest.stages[stage_names[i]]; + break; + } + } + return stage; +} +get_damage_trigger(radius, origin, damage_types) +{ + trig = Spawn("trigger_damage", origin, 0, radius, 72); + trig thread dam_trigger_thread(damage_types); + return trig; +} +dam_trigger_thread(damage_types) +{ + self endon("death"); + damage_type = "NONE"; + while(1) + { + self waittill("damage", amount, attacker, dir, point, mod); + for(i = 0; i < damage_types.size; i ++) + { + if(mod == damage_types[i]) + { + self notify("triggered"); + } + } + } +} +use_trigger_thread() +{ + self endon("death"); + while(1) + { + self waittill("trigger", player); + self.owner_ent notify("triggered", player); + wait(0.1); + } +} +sidequest_stage_active(sidequest_name, stage_name) +{ + sidequest = level._zombie_sidequests[sidequest_name]; + stage = sidequest.stages[stage_name]; + if(sidequest.active_stage == stage.stage_number) + { + return true; + } + else + { + return false; + } +} +sidequest_start_next_stage(sidequest_name) +{ + sidequest = level._zombie_sidequests[sidequest_name]; + if(sidequest.sidequest_complete == true) + { + return; + } + last_completed = sidequest.last_completed_stage; + if(last_completed == -1) + { + last_completed = 0; + } + else + { + last_completed ++; + } + stage = get_sidequest_stage(sidequest, last_completed); + if(!IsDefined(stage)) + { + return; + } + stage_start(sidequest, stage); + return(stage); +} +main() +{ +} +is_facing( facee ) +{ + orientation = self getPlayerAngles(); + forwardVec = anglesToForward( orientation ); + forwardVec2D = ( forwardVec[0], forwardVec[1], 0 ); + unitForwardVec2D = VectorNormalize( forwardVec2D ); + toFaceeVec = facee.origin - self.origin; + toFaceeVec2D = ( toFaceeVec[0], toFaceeVec[1], 0 ); + unitToFaceeVec2D = VectorNormalize( toFaceeVec2D ); + dotProduct = VectorDot( unitForwardVec2D, unitToFaceeVec2D ); + return ( dotProduct > 0.9 ); +} +fake_use(notify_string, qualifier_func) +{ + waittillframeend; + while(1) + { + if(!IsDefined(self)) + { + return; + } + players = get_players(); + for(i = 0; i < players.size; i ++) + { + qualifier_passed = true; + if(IsDefined(qualifier_func)) + { + qualifier_passed = players[i] [[qualifier_func]](); + } + if(qualifier_passed && (DistanceSquared(self.origin, players[i].origin) < 64*64)) + { + if(players[i] is_facing(self)) + { + if(players[i] UseButtonPressed()) + { + self notify(notify_string, players[i]); + return; + } + } + } + } + wait(0.1); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_spawner.gsc b/BO1/PC/ZM/maps/_zombiemode_spawner.gsc new file mode 100644 index 0000000..e43bac6 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_spawner.gsc @@ -0,0 +1,3174 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_net; +#include maps\_zombiemode_audio; +#using_animtree( "generic_human" ); +init() +{ + level._CONTEXTUAL_GRAB_LERP_TIME = .3; + zombies = getEntArray( "zombie_spawner", "script_noteworthy" ); + for( i = 0; i < zombies.size; i++ ) + { + if( is_spawner_targeted_by_blocker( zombies[i] ) ) + { + zombies[i].is_enabled = false; + } + } + array_thread(zombies, ::add_spawn_function, ::zombie_spawn_init); + array_thread(zombies, ::add_spawn_function, maps\_zombiemode::round_spawn_failsafe); +} +#using_animtree( "generic_human" ); +is_spawner_targeted_by_blocker( ent ) +{ + if( IsDefined( ent.targetname ) ) + { + targeters = GetEntArray( ent.targetname, "target" ); + for( i = 0; i < targeters.size; i++ ) + { + if( targeters[i].targetname == "zombie_door" || targeters[i].targetname == "zombie_debris" ) + { + return true; + } + result = is_spawner_targeted_by_blocker( targeters[i] ); + if( result ) + { + return true; + } + } + } + return false; +} +zombie_spawn_init( animname_set ) +{ + if( !isDefined( animname_set ) ) + { + animname_set = false; + } + self.targetname = "zombie"; + self.script_noteworthy = undefined; + if( !animname_set ) + { + self.animname = "zombie"; + } + self thread play_ambient_zombie_vocals(); + self.ignoreall = true; + self.ignoreme = true; + self.allowdeath = true; + self.force_gib = true; + self.is_zombie = true; + self.has_legs = true; + self allowedStances( "stand" ); + self.zombie_damaged_by_bar_knockdown = false; + self.gibbed = false; + self.head_gibbed = false; + self PushPlayer( true ); + self.disableArrivals = true; + self.disableExits = true; + self.grenadeawareness = 0; + self.badplaceawareness = 0; + self.ignoreSuppression = true; + self.suppressionThreshold = 1; + self.noDodgeMove = true; + self.dontShootWhileMoving = true; + self.pathenemylookahead = 0; + self.badplaceawareness = 0; + self.chatInitialized = false; + self.a.disablepain = true; + self disable_react(); + self.maxhealth = level.zombie_health; + self.health = level.zombie_health; + self.freezegun_damage = 0; + self.dropweapon = false; + level thread zombie_death_event( self ); + self set_zombie_run_cycle(); + self thread zombie_think(); + self thread zombie_gib_on_damage(); + self thread zombie_damage_failsafe(); + if ( !isdefined( self.no_eye_glow ) || !self.no_eye_glow ) + { + self thread delayed_zombie_eye_glow(); + } + self.deathFunction = ::zombie_death_animscript; + self.flame_damage_time = 0; + self.meleeDamage = 60; + self zombie_history( "zombie_spawn_init -> Spawned = " + self.origin ); + self.thundergun_disintegrate_func = ::zombie_disintegrate; + self.thundergun_knockdown_func = ::zombie_knockdown; + self.tesla_head_gib_func = ::zombie_tesla_head_gib; + self setTeamForEntity( "axis" ); + self notify( "zombie_init_done" ); +} +delayed_zombie_eye_glow() +{ + self endon("zombie_delete"); + wait .5; + self zombie_eye_glow(); +} +zombie_damage_failsafe() +{ + self endon ("death"); + continue_failsafe_damage = false; + while (1) + { + wait 0.5; + if ( !isdefined( self.enemy ) || !IsPlayer( self.enemy ) ) + { + continue; + } + if (self istouching(self.enemy)) + { + old_org = self.origin; + if (!continue_failsafe_damage) + { + wait 5; + } + if (!isdefined(self.enemy) || !IsPlayer( self.enemy ) || self.enemy hasperk("specialty_armorvest") ) + { + continue; + } + if (self istouching(self.enemy) + && !self.enemy maps\_laststand::player_is_in_laststand() + && isalive(self.enemy)) + { + if (distancesquared(old_org, self.origin) < (60 * 60) ) + { + setsaveddvar("player_deathInvulnerableTime", 0); + self.enemy DoDamage( self.enemy.health + 1000, self.enemy.origin, undefined, undefined, "riflebullet" ); + setsaveddvar("player_deathInvulnerableTime", level.startInvulnerableTime); + continue_failsafe_damage = true; + } + } + } + else + { + continue_failsafe_damage = false; + } + } +} +set_zombie_run_cycle( new_move_speed ) +{ + if ( isDefined( new_move_speed ) ) + { + self.zombie_move_speed = new_move_speed; + } + else + { + self set_run_speed(); + self.zombie_move_speed_original = self.zombie_move_speed; + } + self.needs_run_update = true; + death_anims = level._zombie_deaths[self.animname]; + self.deathanim = random(death_anims); + switch(self.zombie_move_speed) + { + case "walk": + var = randomintrange(1, 8); + self set_run_anim( "walk" + var ); + self.run_combatanim = level.scr_anim[self.animname]["walk" + var]; + break; + case "run": + var = randomintrange(1, 6); + self set_run_anim( "run" + var ); + self.run_combatanim = level.scr_anim[self.animname]["run" + var]; + break; + case "sprint": + var = randomintrange(1, 4); + self set_run_anim( "sprint" + var ); + self.run_combatanim = level.scr_anim[self.animname]["sprint" + var]; + break; + } +} +set_run_speed() +{ + rand = randomintrange( level.zombie_move_speed, level.zombie_move_speed + 35 ); + if( rand <= 35 ) + { + self.zombie_move_speed = "walk"; + } + else if( rand <= 70 ) + { + self.zombie_move_speed = "run"; + } + else + { + self.zombie_move_speed = "sprint"; + } +} +should_skip_teardown( rise_struct_string ) +{ + if( IsDefined(rise_struct_string) && rise_struct_string == "find_flesh" ) + { + return true; + } + if( isDefined( self.script_string ) && self.script_string == "zombie_chaser" ) + { + return true; + } + return false; +} +zombie_think() +{ + self endon( "death" ); + assert( !self.isdog ); + rise_struct_string = undefined; + if (GetDvarInt( #"zombie_rise_test") || (isDefined(self.script_string) && self.script_string == "riser" )) + { + self thread do_zombie_rise(); + self waittill("risen", rise_struct_string ); + } + else + { + self notify("no_rise"); + } + node = undefined; + desired_nodes = []; + self.entrance_nodes = []; + if ( IsDefined( level.max_barrier_search_dist_override ) ) + { + max_dist = level.max_barrier_search_dist_override; + } + else + { + max_dist = 500; + } + if( IsDefined( self.target ) && self.target != "" ) + { + desired_origin = get_desired_origin(); + AssertEx( IsDefined( desired_origin ), "Spawner @ " + self.origin + " has a .target but did not find a target" ); + origin = desired_origin; + node = getclosest( origin, level.exterior_goals ); + self.entrance_nodes[0] = node; + self zombie_history( "zombie_think -> #1 entrance (script_forcegoal) origin = " + self.entrance_nodes[0].origin ); + } + else if ( self should_skip_teardown( rise_struct_string ) ) + { + self zombie_setup_attack_properties(); + if (isDefined(self.target)) + { + end_at_node = GetNode(self.target, "targetname"); + if (isDefined(end_at_node)) + { + self setgoalnode (end_at_node); + self waittill("goal"); + } + } + self thread find_flesh(); + return; + } + else + { + origin = self.origin; + desired_origin = get_desired_origin(); + if( IsDefined( desired_origin ) ) + { + origin = desired_origin; + } + nodes = get_array_of_closest( origin, level.exterior_goals, undefined, 3 ); + desired_nodes[0] = nodes[0]; + prev_dist = Distance( self.origin, nodes[0].origin ); + for( i = 1; i < nodes.size; i++ ) + { + dist = Distance( self.origin, nodes[i].origin ); + if( ( dist - prev_dist ) > max_dist ) + { + break; + } + prev_dist = dist; + desired_nodes[i] = nodes[i]; + } + node = desired_nodes[0]; + if( desired_nodes.size > 1 ) + { + node = desired_nodes[RandomInt(desired_nodes.size)]; + } + self.entrance_nodes = desired_nodes; + self zombie_history( "zombie_think -> #1 entrance origin = " + node.origin ); + self thread zombie_assure_node(); + } + AssertEx( IsDefined( node ), "Did not find a node!!! [Should not see this!]" ); + level thread draw_line_ent_to_pos( self, node.origin, "goal" ); + self.first_node = node; + self thread zombie_goto_entrance( node ); +} +get_desired_origin() +{ + if( IsDefined( self.target ) ) + { + ent = GetEnt( self.target, "targetname" ); + if( !IsDefined( ent ) ) + { + ent = getstruct( self.target, "targetname" ); + } + if( !IsDefined( ent ) ) + { + ent = GetNode( self.target, "targetname" ); + } + AssertEx( IsDefined( ent ), "Cannot find the targeted ent/node/struct, \"" + self.target + "\" at " + self.origin ); + return ent.origin; + } + return undefined; +} +zombie_goto_entrance( node, endon_bad_path ) +{ + assert( !self.isdog ); + self endon( "death" ); + level endon( "intermission" ); + if( IsDefined( endon_bad_path ) && endon_bad_path ) + { + self endon( "bad_path" ); + } + self zombie_history( "zombie_goto_entrance -> start goto entrance " + node.origin ); + self.got_to_entrance = false; + self.goalradius = 128; + self SetGoalPos( node.origin ); + self waittill( "goal" ); + self.got_to_entrance = true; + self zombie_history( "zombie_goto_entrance -> reached goto entrance " + node.origin ); + self tear_into_building(); + if(isDefined(self.first_node.clip)) + { + if(!isDefined(self.first_node.clip.disabled) || !self.first_node.clip.disabled) + { + self.first_node.clip disable_trigger(); + self.first_node.clip connectpaths(); + } + } + self zombie_setup_attack_properties(); + if( isDefined( level.pre_aggro_pathfinding_func ) ) + { + self [[ level.pre_aggro_pathfinding_func ]](); + } + self thread find_flesh(); +} +zombie_assure_node() +{ + self endon( "death" ); + self endon( "goal" ); + level endon( "intermission" ); + start_pos = self.origin; + if(IsDefined(self.entrance_nodes)) + { + for( i = 0; i < self.entrance_nodes.size; i++ ) + { + if( self zombie_bad_path() ) + { + self zombie_history( "zombie_assure_node -> assigned assured node = " + self.entrance_nodes[i].origin ); + println( "^1Zombie @ " + self.origin + " did not move for 1 second. Going to next closest node @ " + self.entrance_nodes[i].origin ); + level thread draw_line_ent_to_pos( self, self.entrance_nodes[i].origin, "goal" ); + self.first_node = self.entrance_nodes[i]; + self SetGoalPos( self.entrance_nodes[i].origin ); + } + else + { + return; + } + } + } + wait(2); + nodes = get_array_of_closest( self.origin, level.exterior_goals, undefined, 20 ); + if(IsDefined(nodes)) + { + self.entrance_nodes = nodes; + for( i = 0; i < self.entrance_nodes.size; i++ ) + { + if( self zombie_bad_path() ) + { + self zombie_history( "zombie_assure_node -> assigned assured node = " + self.entrance_nodes[i].origin ); + println( "^1Zombie @ " + self.origin + " did not move for 1 second. Going to next closest node @ " + self.entrance_nodes[i].origin ); + level thread draw_line_ent_to_pos( self, self.entrance_nodes[i].origin, "goal" ); + self.first_node = self.entrance_nodes[i]; + self SetGoalPos( self.entrance_nodes[i].origin ); + } + else + { + return; + } + } + } + self zombie_history( "zombie_assure_node -> failed to find a good entrance point" ); + wait(20); + self DoDamage( self.health + 10, self.origin ); +} +zombie_bad_path() +{ + self endon( "death" ); + self endon( "goal" ); + self thread zombie_bad_path_notify(); + self thread zombie_bad_path_timeout(); + self.zombie_bad_path = undefined; + while( !IsDefined( self.zombie_bad_path ) ) + { + wait( 0.05 ); + } + self notify( "stop_zombie_bad_path" ); + return self.zombie_bad_path; +} +zombie_bad_path_notify() +{ + self endon( "death" ); + self endon( "stop_zombie_bad_path" ); + self waittill( "bad_path" ); + self.zombie_bad_path = true; +} +zombie_bad_path_timeout() +{ + self endon( "death" ); + self endon( "stop_zombie_bad_path" ); + wait( 2 ); + self.zombie_bad_path = false; +} +tear_into_building() +{ + self endon( "death" ); + self endon("teleporting"); + self zombie_history( "tear_into_building -> start" ); + while( 1 ) + { + if( IsDefined( self.first_node.script_noteworthy ) ) + { + if( self.first_node.script_noteworthy == "no_blocker" ) + { + return; + } + } + if( !IsDefined( self.first_node.target ) ) + { + return; + } + if( all_chunks_destroyed( self.first_node.barrier_chunks ) ) + { + self zombie_history( "tear_into_building -> all chunks destroyed" ); + } + if( !get_attack_spot( self.first_node ) ) + { + self zombie_history( "tear_into_building -> Could not find an attack spot" ); + self thread do_a_taunt(); + wait( 0.5 ); + continue; + } + self.goalradius = 2; + self SetGoalPos( self.attacking_spot, self.first_node.angles ); + attacking_spot1a = self.attacking_spot; + self waittill( "goal" ); + self waittill_notify_or_timeout( "orientdone", 1 ); + self zombie_history( "tear_into_building -> Reach position and orientated" ); + if( all_chunks_destroyed( self.first_node.barrier_chunks ) ) + { + self zombie_history( "tear_into_building -> all chunks destroyed" ); + for( i = 0; i < self.first_node.attack_spots_taken.size; i++ ) + { + self.first_node.attack_spots_taken[i] = false; + } + return; + } + while( 1 ) + { + chunk = get_closest_non_destroyed_chunk( self.origin, self.first_node.barrier_chunks ); + if( !IsDefined( chunk ) ) + { + if( !all_chunks_destroyed( self.first_node.barrier_chunks ) ) + { + attack = self should_attack_player_thru_boards(); + if(isDefined(attack) && !attack && self.has_legs) + { + self do_a_taunt(); + } + else + { + wait_network_frame(); + } + continue; + } + for( i = 0; i < self.first_node.attack_spots_taken.size; i++ ) + { + self.first_node.attack_spots_taken[i] = false; + } + return; + } + self zombie_history( "tear_into_building -> animating" ); + tear_anim = get_tear_anim(chunk, self); + chunk maps\_zombiemode_blockers::update_states("target_by_zombie"); + self thread maps\_zombiemode_audio::do_zombies_playvocals( "teardown", self.animname ); + self AnimScripted( "tear_anim", attacking_spot1a, self.first_node.angles, tear_anim, "normal", undefined, 1, 0.3 ); + if ( tear_anim == %ai_zombie_bar_bend_l || tear_anim == %ai_zombie_bar_bend_l_2 || tear_anim == %ai_zombie_bar_bend_r || tear_anim == %ai_zombie_bar_bend_r_2 || tear_anim == %ai_zombie_bar_bend_m_1 || tear_anim == %ai_zombie_bar_bend_m_2 ) + { + self playsound( "zmb_bar_bend" ); + } + self zombie_tear_notetracks( "tear_anim", chunk, self.first_node ); + attack = self should_attack_player_thru_boards(); + if(isDefined(attack) && !attack && self.has_legs) + { + self do_a_taunt(); + } + if( all_chunks_destroyed( self.first_node.barrier_chunks ) ) + { + for( i = 0; i < self.first_node.attack_spots_taken.size; i++ ) + { + self.first_node.attack_spots_taken[i] = false; + } + return; + } + } + self reset_attack_spot(); + } +} +do_a_taunt() +{ + self endon ("death"); + if( !self.has_legs) + { + return false; + } + self.old_origin = self.origin; + if(GetDvar( #"zombie_taunt_freq") == "") + { + setdvar("zombie_taunt_freq","5"); + } + freq = GetDvarInt( #"zombie_taunt_freq"); + if( freq >= randomint(100) ) + { + anime = random(level._zombie_board_taunt[self.animname]); + self thread maps\_zombiemode_audio::do_zombies_playvocals( "taunt", self.animname ); + self animscripted("zombie_taunt",self.origin,self.angles,anime, "normal", undefined, 1, 0.4 ); + wait(getanimlength(anime)); + self ForceTeleport(self.old_origin); + } +} +should_attack_player_thru_boards() +{ + if( !self.has_legs) + { + return false; + } + if(IsDefined(self.first_node.barrier_chunks)) + { + for(i=0;i= randomint(100) ) + { + self.old_origin = self.origin; + if(self.attacking_spot_index == 0) + { + if(randomint(100) > 50) + { + self thread maps\_zombiemode_audio::do_zombies_playvocals( "attack", self.animname ); + self animscripted("window_melee",self.origin,self.angles,%ai_zombie_window_attack_arm_l_out, "normal", undefined, 1, 0.3 ); + } + else + { + self thread maps\_zombiemode_audio::do_zombies_playvocals( "attack", self.animname ); + self animscripted("window_melee",self.origin,self.angles,%ai_zombie_window_attack_arm_r_out, "normal", undefined, 1, 0.3 ); + } + self window_notetracks( "window_melee" ); + } + else if(self.attacking_spot_index == 2) + { + self thread maps\_zombiemode_audio::do_zombies_playvocals( "attack", self.animname ); + self animscripted("window_melee",self.origin,self.angles,%ai_zombie_window_attack_arm_r_out, "normal", undefined, 1, 0.3 ); + self window_notetracks( "window_melee" ); + } + else if(self.attacking_spot_index == 1) + { + self thread maps\_zombiemode_audio::do_zombies_playvocals( "attack", self.animname ); + self animscripted("window_melee",self.origin,self.angles,%ai_zombie_window_attack_arm_l_out, "normal", undefined, 1, 0.3 ); + self window_notetracks( "window_melee" ); + } + } + else + { + return false; + } +} +window_notetracks(msg) +{ + while(1) + { + self waittill( msg, notetrack ); + if( notetrack == "end" ) + { + self teleport(self.old_origin); + return; + } + if( notetrack == "fire" ) + { + if(self.ignoreall) + { + self.ignoreall = false; + } + if ( isDefined( self.first_node ) ) + { + _MELEE_DIST_SQ = 72*72; + _TRIGGER_DIST_SQ = 37*37; + for ( i = 0; i < self.player_targets.size; i++ ) + { + playerDistSq = Distance2DSquared( self.player_targets[i].origin, self.origin ); + heightDiff = abs( self.player_targets[i].origin[2] - self.origin[2] ); + if ( playerDistSq < _MELEE_DIST_SQ && (heightDiff * heightDiff) < _MELEE_DIST_SQ ) + { + triggerDistSq = Distance2DSquared( self.player_targets[i].origin, self.first_node.trigger_location.origin ); + heightDiff = abs( self.player_targets[i].origin[2] - self.first_node.trigger_location.origin[2] ); + if ( triggerDistSq < _TRIGGER_DIST_SQ && (heightDiff * heightDiff) < _TRIGGER_DIST_SQ ) + { + self.player_targets[i] DoDamage( self.meleeDamage, self.player_targets[i].origin, self, 0, "MOD_MELEE" ); + break; + } + } + } + } + else + { + self melee(); + } + } + } +} +reset_attack_spot() +{ + if( IsDefined( self.attacking_node ) ) + { + node = self.attacking_node; + index = self.attacking_spot_index; + node.attack_spots_taken[index] = false; + self.attacking_node = undefined; + self.attacking_spot_index = undefined; + } +} +get_attack_spot( node ) +{ + index = get_attack_spot_index( node ); + if( !IsDefined( index ) ) + { + return false; + } + self.attacking_node = node; + self.attacking_spot_index = index; + node.attack_spots_taken[index] = true; + self.attacking_spot = node.attack_spots[index]; + return true; +} +get_attack_spot_index( node ) +{ + indexes = []; + for( i = 0; i < node.attack_spots.size; i++ ) + { + if( !node.attack_spots_taken[i] ) + { + indexes[indexes.size] = i; + } + } + if( indexes.size == 0 ) + { + return undefined; + } + return indexes[RandomInt( indexes.size )]; +} +zombie_tear_notetracks( msg, chunk, node ) +{ + random_chance = undefined; + self endon("death"); + chunk thread check_for_zombie_death(self); + while( 1 ) + { + self waittill( msg, notetrack ); + if( notetrack == "end" ) + { + return; + } + if( notetrack == "board" ) + { + if( !chunk.destroyed ) + { + self.lastchunk_destroy_time = getTime(); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin ); + if(chunk.script_noteworthy == "4" || chunk.script_noteworthy == "6") + { + chunk thread zombie_boardtear_offset_fx_horizontle(chunk, node); + } + else + { + chunk thread zombie_boardtear_offset_fx_verticle(chunk, node); + } + zomb = self; + level thread maps\_zombiemode_blockers::remove_chunk( chunk, node, true, zomb ); + chunk notify("destroyed"); + } + } + else if( notetrack == "bar_bend" ) + { + if( !chunk.destroyed ) + { + self.lastchunk_destroy_time = getTime(); + if( chunk.script_noteworthy == "3" ) + { + if( IsDefined( chunk.script_string ) ) + { + if( chunk.script_string == "prestine_bend" ) + { + bar_bend_left = spawn( "script_model", chunk.origin); + bar_bend_left RotateTo( chunk.angles , 0.2, 0.1, 0.1 ); + bar_bend_left waittill("rotatedone"); + bar_bend_left SetModel( "p_zom_win_cell_bars_01_vert01_bent" ); + chunk Hide(); + thread bar_repair_bend_left( bar_bend_left, chunk); + } + else if ( chunk.script_string == "bar_bend" ) + { + bar_bend_left = spawn( "script_model", chunk.origin); + bar_bend_left RotateTo( chunk.angles , 0.2, 0.1, 0.1 ); + bar_bend_left waittill("rotatedone"); + bar_bend_left SetModel( "p_zom_win_cell_bars_bent_01_vert01_bent" ); + chunk Hide(); + thread bar_repair_bend_left( bar_bend_left, chunk); + } + } + } + if( chunk.script_noteworthy == "5" ) + { + if( IsDefined( chunk.script_string ) ) + { + if( chunk.script_string == "prestine_bend" ) + { + bar_bend_right = spawn( "script_model", chunk.origin); + bar_bend_right RotateTo( chunk.angles , 0.2, 0.1, 0.1 ); + bar_bend_right waittill("rotatedone"); + bar_bend_right SetModel( "p_zom_win_cell_bars_01_vert04_bent" ); + chunk Hide(); + thread bar_repair_bend_right( bar_bend_right, chunk); + } + else if ( chunk.script_string == "bar_bend" ) + { + bar_bend_right = spawn( "script_model", chunk.origin); + bar_bend_right RotateTo( chunk.angles , 0.2, 0.1, 0.1 ); + bar_bend_right waittill("rotatedone"); + bar_bend_right SetModel( "p_zom_win_cell_bars_bent_01_vert04_bent" ); + chunk Hide(); + thread bar_repair_bend_right( bar_bend_right, chunk); + } + } + } + zomb = self; + chunk thread zombie_bartear_offset_fx_verticle( chunk ); + level thread maps\_zombiemode_blockers::remove_chunk( chunk, node, true, zomb ); + chunk notify( "destroyed" ); + } + } + else if( notetrack == "bar" ) + { + if( !chunk.destroyed ) + { + self.lastchunk_destroy_time = getTime(); + if(chunk.script_noteworthy == "4" || chunk.script_noteworthy == "6") + { + if ( IsDefined( chunk.script_squadname ) && ( chunk.script_squadname == "cosmodrome_storage_area" ) ) + { + } + if (!IsDefined( chunk.script_squadname ) ) + { + chunk thread zombie_bartear_offset_fx_horizontle(chunk); + } + } + else + { + if ( IsDefined( chunk.script_squadname ) && ( chunk.script_squadname == "cosmodrome_storage_area" ) ) + { + } + if (!IsDefined( chunk.script_squadname ) ) + { + chunk thread zombie_bartear_offset_fx_verticle(chunk); + } + } + level thread maps\_zombiemode_blockers::remove_chunk( chunk, node, true, self ); + chunk notify("destroyed"); + } + } + } +} +bar_repair_bend_left( bar_bend_left, chunk ) +{ + while(1) + { + wait(0.2); + if( chunk get_chunk_state() == "repaired" ) + { + bar_bend_left delete(); + break; + } + } +} +bar_repair_bend_right( bar_bend_right, chunk ) +{ + while(1) + { + wait(0.2); + if( chunk get_chunk_state() == "repaired" ) + { + bar_bend_right delete(); + break; + } + } +} +zombie_boardtear_offset_fx_horizontle( chunk, node ) +{ + if ( IsDefined( chunk.script_parameters ) && ( chunk.script_parameters == "repair_board" ) ) + { + if(IsDefined(chunk.unbroken) && chunk.unbroken == true) + { + if(IsDefined(chunk.material) && chunk.material == "glass") + { + PlayFX( level._effect["glass_break"], chunk.origin, node.angles ); + chunk.unbroken = false; + } + else if(IsDefined(chunk.material) && chunk.material == "metal") + { + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin ); + chunk.unbroken = false; + } + else + { + PlayFX( level._effect["wall_break"], chunk.origin ); + chunk.unbroken = false; + } + } + } + else + { + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (0, 0, 30)); + wait( randomfloat( 0.2, 0.4 )); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (0, 0, -30)); + } +} +zombie_boardtear_offset_fx_verticle( chunk, node ) +{ + if ( IsDefined( chunk.script_parameters ) && ( chunk.script_parameters == "repair_board" ) ) + { + if(IsDefined(chunk.unbroken) && chunk.unbroken == true) + { + if(IsDefined(chunk.material) && chunk.material == "glass") + { + PlayFX( level._effect["glass_break"], chunk.origin, node.angles ); + chunk.unbroken = false; + } + else if(IsDefined(chunk.material) && chunk.material == "metal") + { + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin ); + chunk.unbroken = false; + } + else + { + PlayFX( level._effect["wall_break"], chunk.origin ); + chunk.unbroken = false; + } + } + } + else + { + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (30, 0, 0)); + wait( randomfloat( 0.2, 0.4 )); + PlayFx( level._effect["wood_chunk_destory"], chunk.origin + (-30, 0, 0)); + } +} +zombie_bartear_offset_fx_verticle( chunk ) +{ + if ( IsDefined ( chunk.script_parameters ) && ( chunk.script_parameters == "bar" ) || ( chunk.script_noteworthy == "board" )) + { + possible_tag_array_1 = []; + possible_tag_array_1[0] = "Tag_fx_top"; + possible_tag_array_1[1] = ""; + possible_tag_array_1[2] = "Tag_fx_top"; + possible_tag_array_1[3] = ""; + possible_tag_array_2 = []; + possible_tag_array_2[0] = ""; + possible_tag_array_2[1] = "Tag_fx_bottom"; + possible_tag_array_2[2] = ""; + possible_tag_array_2[3] = "Tag_fx_bottom"; + possible_tag_array_2 = array_randomize( possible_tag_array_2 ); + random_fx = []; + random_fx[0] = level._effect["fx_zombie_bar_break"]; + random_fx[1] = level._effect["fx_zombie_bar_break_lite"]; + random_fx[2] = level._effect["fx_zombie_bar_break"]; + random_fx[3] = level._effect["fx_zombie_bar_break_lite"]; + random_fx = array_randomize( random_fx ); + switch( randomInt( 9 ) ) + { + case 0: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); + break; + case 1: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); + break; + case 2: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); + break; + case 3: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); + break; + case 4: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); + break; + case 5: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_top" ); + break; + case 6: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_bottom" ); + break; + case 7: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_top" ); + break; + case 8: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_bottom" ); + break; + } + } + if ( IsDefined ( chunk.script_parameters ) && ( chunk.script_parameters == "grate" ) ) + { + EarthQuake( RandomFloatRange( 0.3, 0.4 ), RandomFloatRange(0.2, 0.4), chunk.origin, 150 ); + chunk play_sound_on_ent( "bar_rebuild_slam" ); + switch( randomInt( 9 ) ) + { + case 0: + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + wait( randomfloat( 0.0, 0.3 )); + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + break; + case 1: + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + wait( randomfloat( 0.0, 0.3 )); + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + break; + case 2: + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + wait( randomfloat( 0.0, 0.3 )); + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + break; + case 3: + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + wait( randomfloat( 0.0, 0.3 )); + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + break; + case 4: + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + wait( randomfloat( 0.0, 0.3 )); + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + break; + case 5: + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + break; + case 6: + PlayFX( level._effect["fx_zombie_bar_break_lite"], chunk.origin + (-30, 0, 0) ); + break; + case 7: + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + break; + case 8: + PlayFX( level._effect["fx_zombie_bar_break"], chunk.origin + (-30, 0, 0) ); + break; + } + } +} +zombie_bartear_offset_fx_horizontle( chunk ) +{ + if ( IsDefined ( chunk.script_parameters ) && ( chunk.script_parameters == "bar" ) || ( chunk.script_noteworthy == "board" )) + { + switch( randomInt( 10 ) ) + { + case 0: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); + break; + case 1: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_left" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); + break; + case 2: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); + break; + case 3: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_left" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); + break; + case 4: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); + wait( randomfloat( 0.0, 0.3 )); + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); + break; + case 5: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_left" ); + break; + case 6: + PlayFXOnTag( level._effect["fx_zombie_bar_break_lite"], chunk, "Tag_fx_right" ); + break; + case 7: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); + break; + case 8: + PlayFXOnTag( level._effect["fx_zombie_bar_break"], chunk, "Tag_fx_right" ); + break; + } + } +} +check_for_zombie_death(zombie) +{ + self endon("destroyed"); + wait(2.5); + self maps\_zombiemode_blockers::update_states("repaired"); +} +get_tear_anim( chunk, zombo ) +{ + anims = []; + anims[anims.size] = %ai_zombie_door_tear_high; + anims[anims.size] = %ai_zombie_door_tear_low; + anims[anims.size] = %ai_zombie_door_tear_left; + anims[anims.size] = %ai_zombie_door_tear_right; + anims[anims.size] = %ai_zombie_door_tear_v1; + anims[anims.size] = %ai_zombie_door_tear_v2; + anims[anims.size] = %ai_zombie_door_pound_v1; + anims[anims.size] = %ai_zombie_door_pound_v2; + tear_anim = anims[RandomInt( anims.size )]; + if(isdefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "board" || chunk.script_parameters == "repair_board") + { + if( self.has_legs ) + { + if(isdefined(chunk.script_noteworthy)) + { + if(IsDefined(chunk.unbroken) && chunk.unbroken == true) + { + if(IsDefined(chunk.material) && chunk.material == "metal") + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_boardtear_m_1; + } + if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_boardtear_m_4; + } + if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_door_tear_low; + } + if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_boardtear_m_5; + } + if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_door_tear_low; + } + if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_boardtear_m_6; + } + } + else + { + if(zombo.attacking_spot_index == 0) + { + tear_anim = %ai_zombie_door_pound_v1; + } + else + { + tear_anim = %ai_zombie_door_pound_v2; + } + } + } + else if(zombo.attacking_spot_index == 0) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_boardtear_m_1; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_boardtear_m_2; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_boardtear_m_3; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_boardtear_m_4; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_boardtear_m_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_boardtear_m_6; + } + } + else if(zombo.attacking_spot_index == 1) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_boardtear_r_1; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_boardtear_r_3; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_boardtear_r_4; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_boardtear_r_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_boardtear_r_6; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_boardtear_r_2; + } + } + else if(zombo.attacking_spot_index == 2) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_boardtear_l_1; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_boardtear_l_2; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_boardtear_l_4; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_boardtear_l_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_boardtear_l_6; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_boardtear_l_3; + } + } + } + } + } + } + if(isdefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "bar" ) + { + if( self.has_legs ) + { + if(isdefined(chunk.script_noteworthy)) + { + if(zombo.attacking_spot_index == 0) + { + if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_bartear_m_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_bartear_m_6; + } + else if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_bartear_m_3; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_bartear_m_2; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_bar_bend_m_2; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_bar_bend_m_1; + } + } + else if(zombo.attacking_spot_index == 1) + { + if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_bartear_r_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_bartear_r_6; + } + else if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_bartear_r_3; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_bar_bend_r; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_bartear_r_2; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_bar_bend_r_2; + } + } + else if(zombo.attacking_spot_index == 2) + { + if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_bartear_l_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_bartear_l_6; + } + else if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_bartear_l_3; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_bartear_l_2; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_bar_bend_l; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_bar_bend_L_2; + } + } + } + } + } + } + if(isdefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "grate" ) + { + if( self.has_legs ) + { + if(isdefined(chunk.script_noteworthy)) + { + if(zombo.attacking_spot_index == 0) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_boardtear_m_1; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_boardtear_m_2; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_boardtear_m_3; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_boardtear_m_4; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_boardtear_m_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_boardtear_m_6; + } + } + else if(zombo.attacking_spot_index == 1) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_boardtear_r_1; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_boardtear_r_3; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_boardtear_r_4; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_boardtear_r_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_boardtear_r_6; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_boardtear_r_2; + } + } + else if(zombo.attacking_spot_index == 2) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_boardtear_l_1; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_boardtear_l_2; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_boardtear_l_4; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_boardtear_l_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_boardtear_l_6; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_boardtear_l_3; + } + } + } + } + } + } + if(isdefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "board" || chunk.script_parameters == "repair_board") + { + if( self.has_legs == false ) + { + if(isdefined(chunk.script_noteworthy)) + { + if(zombo.attacking_spot_index == 0) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_boardtear_crawl_m_1; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_boardtear_crawl_m_2; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_boardtear_crawl_m_3; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_boardtear_crawl_m_4; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_boardtear_crawl_m_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_boardtear_crawl_m_6; + } + } + else if(zombo.attacking_spot_index == 1) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_boardtear_crawl_r_1; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_boardtear_crawl_r_3; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_boardtear_crawl_r_4; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_boardtear_crawl_r_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_boardtear_crawl_r_6; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_boardtear_crawl_r_2; + } + } + else if(zombo.attacking_spot_index == 2) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_boardtear_crawl_l_1; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_boardtear_crawl_l_2; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_boardtear_crawl_l_4; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_boardtear_crawl_l_5; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_boardtear_crawl_l_6; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_boardtear_crawl_l_3; + } + } + } + } + } + } + if(isdefined(chunk.script_parameters)) + { + if( chunk.script_parameters == "bar" ) + { + if( self.has_legs == false ) + { + if(isdefined(chunk.script_noteworthy)) + { + if(zombo.attacking_spot_index == 0) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_bartear_crawl_m_2; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_bartear_crawl_m_3; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_bartear_crawl_m_1; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_bartear_crawl_m_5; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_bartear_crawl_m_4; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_bartear_crawl_m_6; + } + } + else if(zombo.attacking_spot_index == 1) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_bartear_crawl_r_2; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_bartear_crawl_r_1; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_bartear_crawl_r_3; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_bartear_crawl_r_4; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_bartear_crawl_r_6; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_bartear_crawl_r_5; + } + } + else if(zombo.attacking_spot_index == 2) + { + if(chunk.script_noteworthy == "1") + { + tear_anim = %ai_zombie_bartear_crawl_l_2; + } + else if(chunk.script_noteworthy == "2") + { + tear_anim = %ai_zombie_bartear_crawl_l_3; + } + else if(chunk.script_noteworthy == "4") + { + tear_anim = %ai_zombie_bartear_crawl_l_5; + } + else if(chunk.script_noteworthy == "5") + { + tear_anim = %ai_zombie_bartear_crawl_l_4; + } + else if(chunk.script_noteworthy == "6") + { + tear_anim = %ai_zombie_bartear_crawl_l_6; + } + else if(chunk.script_noteworthy == "3") + { + tear_anim = %ai_zombie_bartear_crawl_l_1; + } + } + } + } + else if( self.has_legs == false) + { + anims = []; + anims[anims.size] = %ai_zombie_attack_crawl; + anims[anims.size] = %ai_zombie_attack_crawl_lunge; + tear_anim = anims[RandomInt( anims.size )]; + } + } + } + return tear_anim; +} +cap_zombie_head_gibs() +{ + if( !isDefined( level.max_head_gibs_per_frame ) ) + { + level.max_head_gibs_per_frame = 4; + } + while( true ) + { + level.head_gibs_this_frame = 0; + wait_network_frame(); + } +} +zombie_head_gib( attacker, means_of_death ) +{ + self endon( "death" ); + if ( !is_mature() ) + { + return false; + } + if ( is_german_build() ) + { + return; + } + if( IsDefined( self.head_gibbed ) && self.head_gibbed ) + { + return; + } + if( !isDefined( level.head_gibs_this_frame ) ) + { + level thread cap_zombie_head_gibs(); + } + if( level.head_gibs_this_frame >= level.max_head_gibs_per_frame ) + { + return; + } + level.head_gibs_this_frame++; + self.head_gibbed = true; + self zombie_eye_glow_stop(); + size = self GetAttachSize(); + for( i = 0; i < size; i++ ) + { + model = self GetAttachModelName( i ); + if( IsSubStr( model, "head" ) ) + { + if(isdefined(self.hatmodel)) + { + self detach( self.hatModel, "" ); + } + self Detach( model, "", true ); + if ( isDefined(self.torsoDmg5) ) + { + self Attach( self.torsoDmg5, "", true ); + } + break; + } + } + temp_array = []; + temp_array[0] = level._ZOMBIE_GIB_PIECE_INDEX_HEAD; + self gib( "normal", temp_array ); + self thread damage_over_time( self.health * 0.2, 1, attacker, means_of_death ); +} +damage_over_time( dmg, delay, attacker, means_of_death ) +{ + self endon( "death" ); + if( !IsAlive( self ) ) + { + return; + } + if( !IsPlayer( attacker ) ) + { + attacker = undefined; + } + while( 1 ) + { + if( IsDefined( delay ) ) + { + wait( delay ); + } + self DoDamage( dmg, self.origin, attacker, undefined, means_of_death, self.damagelocation ); + } +} +head_should_gib( attacker, type, point ) +{ + if ( !is_mature() ) + { + return false; + } + if ( is_german_build() ) + { + return false; + } + if( self.head_gibbed ) + { + return false; + } + if( !IsDefined( attacker ) || !IsPlayer( attacker ) ) + { + return false; + } + low_health_percent = ( self.health / self.maxhealth ) * 100; + if( low_health_percent > 10 ) + { + return false; + } + weapon = attacker GetCurrentWeapon(); + if( type != "MOD_RIFLE_BULLET" && type != "MOD_PISTOL_BULLET" ) + { + if( type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" ) + { + if( Distance( point, self GetTagOrigin( "j_head" ) ) > 55 ) + { + return false; + } + else + { + return true; + } + } + else if( type == "MOD_PROJECTILE" ) + { + if( Distance( point, self GetTagOrigin( "j_head" ) ) > 10 ) + { + return false; + } + else + { + return true; + } + } + else if( WeaponClass( weapon ) != "spread" ) + { + return false; + } + } + if( !animscripts\utility::damageLocationIsAny( "head", "helmet", "neck" ) ) + { + return false; + } + if( weapon == "none" || weapon == "m1911_zm" || WeaponIsGasWeapon( self.weapon ) ) + { + return false; + } + return true; +} +headshot_blood_fx() +{ + if( !IsDefined( self ) ) + { + return; + } + if( !is_mature() ) + { + return; + } + fxTag = "j_neck"; + fxOrigin = self GetTagOrigin( fxTag ); + upVec = AnglesToUp( self GetTagAngles( fxTag ) ); + forwardVec = AnglesToForward( self GetTagAngles( fxTag ) ); + PlayFX( level._effect["headshot"], fxOrigin, forwardVec, upVec ); + PlayFX( level._effect["headshot_nochunks"], fxOrigin, forwardVec, upVec ); + wait( 0.3 ); + if(IsDefined( self )) + { + if( self maps\_zombiemode_weap_tesla::enemy_killed_by_tesla() ) + { + PlayFxOnTag( level._effect["tesla_head_light"], self, fxTag ); + } + else + { + PlayFxOnTag( level._effect["bloodspurt"], self, fxTag ); + } + } +} +zombie_gib_on_damage() +{ + while( 1 ) + { + self waittill( "damage", amount, attacker, direction_vec, point, type ); + if( !IsDefined( self ) ) + { + return; + } + if( !self zombie_should_gib( amount, attacker, type ) ) + { + continue; + } + if( self head_should_gib( attacker, type, point ) && type != "MOD_BURNED" ) + { + self zombie_head_gib( attacker, type ); + if(IsDefined(attacker.headshot_count)) + { + attacker.headshot_count++; + } + else + { + attacker.headshot_count = 1; + } + attacker.stats["headshots"] = attacker.headshot_count; + attacker.stats["zombie_gibs"]++; + continue; + } + if( !self.gibbed ) + { + if( self animscripts\utility::damageLocationIsAny( "head", "helmet", "neck" ) ) + { + continue; + } + refs = []; + switch( self.damageLocation ) + { + case "torso_upper": + case "torso_lower": + refs[refs.size] = "guts"; + refs[refs.size] = "right_arm"; + break; + case "right_arm_upper": + case "right_arm_lower": + case "right_hand": + refs[refs.size] = "right_arm"; + break; + case "left_arm_upper": + case "left_arm_lower": + case "left_hand": + refs[refs.size] = "left_arm"; + break; + case "right_leg_upper": + case "right_leg_lower": + case "right_foot": + if( self.health <= 0 ) + { + refs[refs.size] = "right_leg"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "no_legs"; + } + break; + case "left_leg_upper": + case "left_leg_lower": + case "left_foot": + if( self.health <= 0 ) + { + refs[refs.size] = "left_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + } + break; + default: + if( self.damageLocation == "none" ) + { + if( type == "MOD_GRENADE" || type == "MOD_GRENADE_SPLASH" || type == "MOD_PROJECTILE" || type == "MOD_PROJECTILE_SPLASH" ) + { + refs = self derive_damage_refs( point ); + break; + } + } + else + { + refs[refs.size] = "guts"; + refs[refs.size] = "right_arm"; + refs[refs.size] = "left_arm"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + break; + } + } + if( refs.size ) + { + self.a.gib_ref = animscripts\zombie_death::get_random( refs ); + if( ( self.a.gib_ref == "no_legs" || self.a.gib_ref == "right_leg" || self.a.gib_ref == "left_leg" ) && self.health > 0 ) + { + self.has_legs = false; + self AllowedStances( "crouch" ); + self thread kill_crawler_over_time( (10 + RandomInt(40)) ); + self setPhysParams( 15, 0, 24 ); + health = self.health; + health = health * 0.1; + which_anim = RandomInt( 5 ); + if(self.a.gib_ref == "no_legs") + { + if(randomint(100) < 50) + { + self.deathanim = %ai_zombie_crawl_death_v1; + self set_run_anim( "death3" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl_hand_1"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl_hand_1"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl_hand_1"]; + } + else + { + self.deathanim = %ai_zombie_crawl_death_v1; + self set_run_anim( "death3" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl_hand_2"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl_hand_2"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl_hand_2"]; + } + } + else if( which_anim == 0 ) + { + self.deathanim = %ai_zombie_crawl_death_v1; + self set_run_anim( "death3" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl1"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl1"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl1"]; + } + else if( which_anim == 1 ) + { + self.deathanim = %ai_zombie_crawl_death_v2; + self set_run_anim( "death4" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl2"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl2"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl2"]; + } + else if( which_anim == 2 ) + { + self.deathanim = %ai_zombie_crawl_death_v1; + self set_run_anim( "death3" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl3"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl3"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl3"]; + } + else if( which_anim == 3 ) + { + self.deathanim = %ai_zombie_crawl_death_v2; + self set_run_anim( "death4" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl4"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl4"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl4"]; + } + else if( which_anim == 4 ) + { + self.deathanim = %ai_zombie_crawl_death_v1; + self set_run_anim( "death3" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl5"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl5"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl5"]; + } + } + } + if( self.health > 0 ) + { + self thread animscripts\zombie_death::do_gib(); + if ( IsPlayer( self ) ) + { + attacker.stats["zombie_gibs"]++; + } + } + } + } +} +kill_crawler_over_time( delay ) +{ + self endon( "death" ); + if( !IsAlive( self ) ) + { + return; + } + wait( delay ); + self DoDamage( self.health+100, self.origin ); +} +zombie_should_gib( amount, attacker, type ) +{ + if ( !is_mature() ) + { + return false; + } + if ( is_german_build() ) + { + return false; + } + if( !IsDefined( type ) ) + { + return false; + } + if ( IsDefined( self.no_gib ) && ( self.no_gib == 1 ) ) + { + return false; + } + if ( self maps\_zombiemode_weap_freezegun::is_freezegun_damage( type ) ) + { + return false; + } + switch( type ) + { + case "MOD_UNKNOWN": + case "MOD_CRUSH": + case "MOD_TELEFRAG": + case "MOD_FALLING": + case "MOD_SUICIDE": + case "MOD_TRIGGER_HURT": + case "MOD_BURNED": + return false; + case "MOD_MELEE": + { + return false; + } + } + if( type == "MOD_PISTOL_BULLET" || type == "MOD_RIFLE_BULLET" ) + { + if( !IsDefined( attacker ) || !IsPlayer( attacker ) ) + { + return false; + } + weapon = attacker GetCurrentWeapon(); + if( weapon == "none" || weapon == "m1911_zm" ) + { + return false; + } + if( WeaponIsGasWeapon( self.weapon ) ) + { + return false; + } + } + prev_health = amount + self.health; + if( prev_health <= 0 ) + { + prev_health = 1; + } + damage_percent = ( amount / prev_health ) * 100; + if( damage_percent < 10 ) + { + return false; + } + return true; +} +derive_damage_refs( point ) +{ + if( !IsDefined( level.gib_tags ) ) + { + init_gib_tags(); + } + closestTag = undefined; + for( i = 0; i < level.gib_tags.size; i++ ) + { + if( !IsDefined( closestTag ) ) + { + closestTag = level.gib_tags[i]; + } + else + { + if( DistanceSquared( point, self GetTagOrigin( level.gib_tags[i] ) ) < DistanceSquared( point, self GetTagOrigin( closestTag ) ) ) + { + closestTag = level.gib_tags[i]; + } + } + } + refs = []; + if( closestTag == "J_SpineLower" || closestTag == "J_SpineUpper" || closestTag == "J_Spine4" ) + { + refs[refs.size] = "guts"; + refs[refs.size] = "right_arm"; + } + else if( closestTag == "J_Shoulder_LE" || closestTag == "J_Elbow_LE" || closestTag == "J_Wrist_LE" ) + { + refs[refs.size] = "left_arm"; + } + else if( closestTag == "J_Shoulder_RI" || closestTag == "J_Elbow_RI" || closestTag == "J_Wrist_RI" ) + { + refs[refs.size] = "right_arm"; + } + else if( closestTag == "J_Hip_LE" || closestTag == "J_Knee_LE" || closestTag == "J_Ankle_LE" ) + { + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + } + else if( closestTag == "J_Hip_RI" || closestTag == "J_Knee_RI" || closestTag == "J_Ankle_RI" ) + { + refs[refs.size] = "right_leg"; + refs[refs.size] = "no_legs"; + } + ASSERTEX( array_validate( refs ), "get_closest_damage_refs(): couldn't derive refs from closestTag " + closestTag ); + return refs; +} +init_gib_tags() +{ + tags = []; + tags[tags.size] = "J_SpineLower"; + tags[tags.size] = "J_SpineUpper"; + tags[tags.size] = "J_Spine4"; + tags[tags.size] = "J_Shoulder_LE"; + tags[tags.size] = "J_Elbow_LE"; + tags[tags.size] = "J_Wrist_LE"; + tags[tags.size] = "J_Shoulder_RI"; + tags[tags.size] = "J_Elbow_RI"; + tags[tags.size] = "J_Wrist_RI"; + tags[tags.size] = "J_Hip_LE"; + tags[tags.size] = "J_Knee_LE"; + tags[tags.size] = "J_Ankle_LE"; + tags[tags.size] = "J_Hip_RI"; + tags[tags.size] = "J_Knee_RI"; + tags[tags.size] = "J_Ankle_RI"; + level.gib_tags = tags; +} +zombie_can_drop_powerups( zombie ) +{ + if( level.mutators["mutator_noPowerups"] ) + { + return false; + } + if( zombie.damageweapon == "zombie_cymbal_monkey" || !flag( "zombie_drop_powerups" ) ) + { + return false; + } + if ( isdefined(zombie.no_powerups) ) + { + return false; + } + return true; +} +zombie_death_points( origin, mod, hit_location, attacker, zombie ) +{ + if( !IsDefined( attacker ) || !IsPlayer( attacker ) ) + { + return; + } + if( zombie_can_drop_powerups( zombie ) ) + { + level thread maps\_zombiemode_powerups::powerup_drop( origin ); + } + level thread maps\_zombiemode_audio::player_zombie_kill_vox( hit_location, attacker, mod, zombie ); + event = "death"; + if ( issubstr( zombie.damageweapon, "knife_ballistic_" ) ) + { + event = "ballistic_knife_death"; + } + attacker maps\_zombiemode_score::player_add_points( event, mod, hit_location ); +} +get_number_variants(aliasPrefix) +{ + for(i=0; i<100; i++) + { + if( !SoundExists( aliasPrefix + "_" + i) ) + { + return i; + } + } +} +dragons_breath_flame_death_fx() +{ + if ( self.isdog ) + { + return; + } + if( !IsDefined( level._effect ) || !IsDefined( level._effect["character_fire_death_sm"] ) ) + { + return; + } + PlayFxOnTag( level._effect["character_fire_death_sm"], self, "J_SpineLower" ); + tagArray = []; + if( !IsDefined( self.a.gib_ref ) || self.a.gib_ref != "left_arm" ) + { + tagArray[tagArray.size] = "J_Elbow_LE"; + tagArray[tagArray.size] = "J_Wrist_LE"; + } + if( !IsDefined( self.a.gib_ref ) || self.a.gib_ref != "right_arm" ) + { + tagArray[tagArray.size] = "J_Elbow_RI"; + tagArray[tagArray.size] = "J_Wrist_RI"; + } + if( !IsDefined( self.a.gib_ref ) || (self.a.gib_ref != "no_legs" && self.a.gib_ref != "left_leg") ) + { + tagArray[tagArray.size] = "J_Knee_LE"; + tagArray[tagArray.size] = "J_Ankle_LE"; + } + if( !IsDefined( self.a.gib_ref ) || (self.a.gib_ref != "no_legs" && self.a.gib_ref != "right_leg") ) + { + tagArray[tagArray.size] = "J_Knee_RI"; + tagArray[tagArray.size] = "J_Ankle_RI"; + } + tagArray = array_randomize( tagArray ); + PlayFxOnTag( level._effect["character_fire_death_sm"], self, tagArray[0] ); +} +zombie_death_animscript() +{ + self reset_attack_spot(); + if( self maps\_zombiemode_weap_tesla::enemy_killed_by_tesla() || self maps\_zombiemode_weap_thundergun::enemy_killed_by_thundergun() ) + { + return false; + } + if ( self maps\_zombiemode_weap_freezegun::should_do_freezegun_death( self.damagemod ) ) + { + self thread maps\_zombiemode_weap_freezegun::freezegun_death( self.damagelocation, self.origin, self.attacker ); + if ( "MOD_EXPLOSIVE" == self.damagemod ) + { + return false; + } + } + if( self.has_legs && IsDefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" ) + { + self.deathanim = %ai_gib_bothlegs_gib; + } + self.grenadeAmmo = 0; + if ( IsDefined( self.nuked ) ) + { + if( zombie_can_drop_powerups( self ) ) + { + level thread maps\_zombiemode_powerups::powerup_drop( self.origin ); + } + } + else + { + level zombie_death_points( self.origin, self.damagemod, self.damagelocation, self.attacker, self ); + } + if( isdefined( self.attacker ) && isai( self.attacker ) ) + { + self.attacker notify( "killed", self ); + } + if( "rottweil72_upgraded_zm" == self.damageweapon && "MOD_RIFLE_BULLET" == self.damagemod ) + { + self thread dragons_breath_flame_death_fx(); + } + if( self.damagemod == "MOD_BURNED" ) + { + self thread animscripts\zombie_death::flame_death_fx(); + } + if( self.damagemod == "MOD_GRENADE" || self.damagemod == "MOD_GRENADE_SPLASH" ) + { + level notify( "zombie_grenade_death", self.origin ); + } + return false; +} +damage_on_fire( player ) +{ + self endon ("death"); + self endon ("stop_flame_damage"); + wait( 2 ); + while( isdefined( self.is_on_fire) && self.is_on_fire ) + { + if( level.round_number < 6 ) + { + dmg = level.zombie_health * RandomFloatRange( 0.2, 0.3 ); + } + else if( level.round_number < 9 ) + { + dmg = level.zombie_health * RandomFloatRange( 0.15, 0.25 ); + } + else if( level.round_number < 11 ) + { + dmg = level.zombie_health * RandomFloatRange( 0.1, 0.2 ); + } + else + { + dmg = level.zombie_health * RandomFloatRange( 0.1, 0.15 ); + } + if ( Isdefined( player ) && Isalive( player ) ) + { + self DoDamage( dmg, self.origin, player ); + } + else + { + self DoDamage( dmg, self.origin, level ); + } + wait( randomfloatrange( 1.0, 3.0 ) ); + } +} +player_using_hi_score_weapon( player ) +{ + weapon = player GetCurrentWeapon(); + if( weapon == "none" || WeaponIsSemiAuto( weapon ) ) + { + return( 1 ); + } + return( 0 ); +} +zombie_damage( mod, hit_location, hit_origin, player, amount ) +{ + if( is_magic_bullet_shield_enabled( self ) ) + { + return; + } + player.use_weapon_type = mod; + if(isDefined(self.marked_for_death)) + { + return; + } + if( !IsDefined( player ) ) + { + return; + } + if( self zombie_flame_damage( mod, player ) ) + { + if( self zombie_give_flame_damage_points() ) + { + player maps\_zombiemode_score::player_add_points( "damage", mod, hit_location, self.isdog ); + } + } + else if( self maps\_zombiemode_weap_tesla::is_tesla_damage( mod ) ) + { + self maps\_zombiemode_weap_tesla::tesla_damage_init( hit_location, hit_origin, player ); + return; + } + else + { + if ( self maps\_zombiemode_weap_freezegun::is_freezegun_damage( self.damagemod ) ) + { + self thread maps\_zombiemode_weap_freezegun::freezegun_damage_response( player, amount ); + } + if ( !self maps\_zombiemode_weap_freezegun::is_freezegun_shatter_damage( self.damagemod ) ) + { + if( player_using_hi_score_weapon( player ) ) + { + damage_type = "damage"; + } + else + { + damage_type = "damage_light"; + } + player maps\_zombiemode_score::player_add_points( damage_type, mod, hit_location, self.isdog ); + } + } + if ( IsDefined( self.zombie_damage_fx_func ) ) + { + self [[ self.zombie_damage_fx_func ]]( mod, hit_location, hit_origin, player ); + } + modName = remove_mod_from_methodofdeath( mod ); + if ( self maps\_zombiemode_weap_freezegun::is_freezegun_damage( self.damagemod ) ) + { + ; + } + else if( self.damageweapon == "claymore_zm" ) + { + if ( IsDefined( self.zombie_damage_claymore_func ) ) + { + self [[ self.zombie_damage_claymore_func ]]( mod, hit_location, hit_origin, player ); + } + else if ( isdefined( player ) && isalive( player ) ) + { + self DoDamage( level.round_number * randomintrange( 100, 200 ), self.origin, player); + } + else + { + self DoDamage( level.round_number * randomintrange( 100, 200 ), self.origin, undefined ); + } + } + else if ( mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" ) + { + if ( isdefined( player ) && isalive( player ) ) + { + self DoDamage( level.round_number + randomintrange( 100, 200 ), self.origin, player, 0, modName, hit_location); + } + else + { + self DoDamage( level.round_number + randomintrange( 100, 200 ), self.origin, undefined, 0, modName, hit_location ); + } + } + else if( mod == "MOD_PROJECTILE" || mod == "MOD_EXPLOSIVE" || mod == "MOD_PROJECTILE_SPLASH" ) + { + if ( isdefined( player ) && isalive( player ) ) + { + self DoDamage( level.round_number * randomintrange( 0, 100 ), self.origin, player, 0, modName, hit_location); + } + else + { + self DoDamage( level.round_number * randomintrange( 0, 100 ), self.origin, undefined, 0, modName, hit_location ); + } + } + if( IsDefined( self.a.gib_ref ) && (self.a.gib_ref == "no_legs") && isalive( self ) ) + { + if ( isdefined( player ) ) + { + rand = randomintrange(0, 100); + if(rand < 10) + { + player create_and_play_dialog( "general", "crawl_spawn" ); + } + } + } + else if( IsDefined( self.a.gib_ref ) && ( (self.a.gib_ref == "right_arm") || (self.a.gib_ref == "left_arm") ) ) + { + if( self.has_legs && isalive( self ) ) + { + if ( isdefined( player ) ) + { + rand = randomintrange(0, 100); + if(rand < 3) + { + player create_and_play_dialog( "general", "shoot_arm" ); + } + } + } + } + self thread maps\_zombiemode_powerups::check_for_instakill( player, mod, hit_location ); +} +zombie_damage_ads( mod, hit_location, hit_origin, player, amount ) +{ + if( is_magic_bullet_shield_enabled( self ) ) + { + return; + } + player.use_weapon_type = mod; + if( !IsDefined( player ) ) + { + return; + } + if( self zombie_flame_damage( mod, player ) ) + { + if( self zombie_give_flame_damage_points() ) + { + player maps\_zombiemode_score::player_add_points( "damage_ads", mod, hit_location ); + } + } + else if( self maps\_zombiemode_weap_tesla::is_tesla_damage( mod ) ) + { + self maps\_zombiemode_weap_tesla::tesla_damage_init( hit_location, hit_origin, player ); + return; + } + else + { + if ( self maps\_zombiemode_weap_freezegun::is_freezegun_damage( self.damagemod ) ) + { + self thread maps\_zombiemode_weap_freezegun::freezegun_damage_response( player, amount ); + } + if ( !self maps\_zombiemode_weap_freezegun::is_freezegun_shatter_damage( self.damagemod ) ) + { + if( player_using_hi_score_weapon( player ) ) + { + damage_type = "damage"; + } + else + { + damage_type = "damage_light"; + } + player maps\_zombiemode_score::player_add_points( damage_type, mod, hit_location ); + } + } + self thread maps\_zombiemode_powerups::check_for_instakill( player, mod, hit_location ); +} +zombie_give_flame_damage_points() +{ + if( GetTime() > self.flame_damage_time ) + { + self.flame_damage_time = GetTime() + level.zombie_vars["zombie_flame_dmg_point_delay"]; + return true; + } + return false; +} +zombie_flame_damage( mod, player ) +{ + if( mod == "MOD_BURNED" ) + { + self.moveplaybackrate = 0.8; + if( !IsDefined( self.is_on_fire ) || ( Isdefined( self.is_on_fire ) && !self.is_on_fire ) ) + { + self thread damage_on_fire( player ); + } + do_flame_death = true; + dist = 100 * 100; + ai = GetAiArray( "axis" ); + for( i = 0; i < ai.size; i++ ) + { + if( IsDefined( ai[i].is_on_fire ) && ai[i].is_on_fire ) + { + if( DistanceSquared( ai[i].origin, self.origin ) < dist ) + { + do_flame_death = false; + break; + } + } + } + if( do_flame_death ) + { + self thread animscripts\zombie_death::flame_death_fx(); + } + return true; + } + return false; +} +zombie_death_event( zombie ) +{ + zombie waittill( "death" ); + if ( !IsDefined( zombie ) ) + { + return; + } + if ( !zombie maps\_zombiemode_weap_freezegun::should_do_freezegun_death( zombie.damagemod ) ) + { + zombie thread maps\_zombiemode_audio::do_zombies_playvocals( "death", zombie.animname ); + zombie thread zombie_eye_glow_stop(); + } + if ( maps\_zombiemode_weapons::is_weapon_included( "freezegun_zm" ) ) + { + zombie thread maps\_zombiemode_weap_freezegun::freezegun_clear_extremity_damage_fx(); + zombie thread maps\_zombiemode_weap_freezegun::freezegun_clear_torso_damage_fx(); + } + if(isdefined (zombie.attacker) && isplayer(zombie.attacker) ) + { + if(!isdefined ( zombie.attacker.killcounter)) + { + zombie.attacker.killcounter = 1; + } + else + { + zombie.attacker.killcounter ++; + } + if ( IsDefined( zombie.sound_damage_player ) && zombie.sound_damage_player == zombie.attacker ) + { + zombie.attacker maps\_zombiemode_audio::create_and_play_dialog( "kill", "damage" ); + } + zombie.attacker notify("zom_kill"); + damageloc = zombie.damagelocation; + damagemod = zombie.damagemod; + attacker = zombie.attacker; + weapon = zombie.damageWeapon; + bbPrint( "zombie_kills: round %d zombietype zombie damagetype %s damagelocation %s playername %s playerweapon %s playerx %f playery %f playerz %f zombiex %f zombiey %f zombiez %f", + level.round_number, damagemod, damageloc, attacker.playername, weapon, attacker.origin, zombie.origin ); + } + level notify( "zom_kill" ); + level.total_zombies_killed++; +} +zombie_setup_attack_properties() +{ + self zombie_history( "zombie_setup_attack_properties()" ); + self.ignoreall = false; + self PushPlayer( true ); + self.pathEnemyFightDist = 64; + self.meleeAttackDist = 64; + self.maxsightdistsqrd = 128 * 128; + self.disableArrivals = true; + self.disableExits = true; +} +find_flesh() +{ + self endon( "death" ); + level endon( "intermission" ); + self endon( "stop_find_flesh" ); + if( level.intermission ) + { + return; + } + self.helitarget = true; + self.ignoreme = false; + self.ignore_player = []; + self zombie_history( "find flesh -> start" ); + self.goalradius = 32; + while( 1 ) + { + near_zombies = getaiarray("axis"); + same_enemy_count = 0; + for (i = 0; i < near_zombies.size; i++) + { + if ( isdefined( near_zombies[i] ) && isalive( near_zombies[i] ) ) + { + if ( isdefined( near_zombies[i].favoriteenemy ) && isdefined( self.favoriteenemy ) + && near_zombies[i].favoriteenemy == self.favoriteenemy ) + { + if ( distancesquared( near_zombies[i].origin, self.favoriteenemy.origin ) < 225 * 225 + && distancesquared( near_zombies[i].origin, self.origin ) > 525 * 525) + { + same_enemy_count++; + } + } + } + } + if (same_enemy_count > 12) + { + self.ignore_player[self.ignore_player.size] = self.favoriteenemy; + } + if (isDefined(level.zombieTheaterTeleporterSeekLogicFunc) ) + { + self [[ level.zombieTheaterTeleporterSeekLogicFunc ]](); + } + zombie_poi = self get_zombie_point_of_interest( self.origin ); + players = get_players(); + if( players.size == 1 ) + { + self.ignore_player = []; + } + else + { + for(i = 0; i < self.ignore_player.size; i++) + { + if( IsDefined( self.ignore_player[i] ) && IsDefined( self.ignore_player[i].ignore_counter ) && self.ignore_player[i].ignore_counter > 3 ) + { + self.ignore_player[i].ignore_counter = 0; + self.ignore_player = array_remove( self.ignore_player, self.ignore_player[i] ); + } + } + } + player = get_closest_valid_player( self.origin, self.ignore_player ); + if( !isDefined( player ) && !isDefined( zombie_poi ) ) + { + self zombie_history( "find flesh -> can't find player, continue" ); + if( IsDefined( self.ignore_player ) ) + { + self.ignore_player = []; + } + wait( 1 ); + continue; + } + self.enemyoverride = zombie_poi; + self.favoriteenemy = player; + self thread zombie_pathing(); + if( players.size > 1 ) + { + for(i = 0; i < self.ignore_player.size; i++) + { + if( IsDefined( self.ignore_player[i] ) ) + { + if( !IsDefined( self.ignore_player[i].ignore_counter ) ) + self.ignore_player[i].ignore_counter = 0; + else + self.ignore_player[i].ignore_counter += 1; + } + } + } + self thread attractors_generated_listener(); + self.zombie_path_timer = GetTime() + ( RandomFloatRange( 1, 3 ) * 1000 ); + while( GetTime() < self.zombie_path_timer ) + { + wait( 0.1 ); + } + self notify( "path_timer_done" ); + self zombie_history( "find flesh -> bottom of loop" ); + debug_print( "Zombie is re-acquiring enemy, ending breadcrumb search" ); + self notify( "zombie_acquire_enemy" ); + } +} +attractors_generated_listener() +{ + self endon( "death" ); + level endon( "intermission" ); + self endon( "stop_find_flesh" ); + self endon( "path_timer_done" ); + level waittill( "attractor_positions_generated" ); + self.zombie_path_timer = 0; +} +zombie_pathing() +{ + self endon( "death" ); + self endon( "zombie_acquire_enemy" ); + level endon( "intermission" ); + assert( IsDefined( self.favoriteenemy ) || IsDefined( self.enemyoverride ) ); + self thread zombie_follow_enemy(); + self waittill( "bad_path" ); + if( isDefined( self.enemyoverride ) ) + { + debug_print( "Zombie couldn't path to point of interest at origin: " + self.enemyoverride[0] + " Falling back to breadcrumb system" ); + if( isDefined( self.enemyoverride[1] ) ) + { + self.enemyoverride = self.enemyoverride[1] invalidate_attractor_pos( self.enemyoverride, self ); + self.zombie_path_timer = 0; + return; + } + } + else + { + debug_print( "Zombie couldn't path to player at origin: " + self.favoriteenemy.origin + " Falling back to breadcrumb system" ); + } + if( !isDefined( self.favoriteenemy ) ) + { + self.zombie_path_timer = 0; + return; + } + else + { + self.favoriteenemy endon( "disconnect" ); + } + players = get_players(); + valid_player_num = 0; + for( i = 0; i < players.size; i++ ) + { + if( is_player_valid( players[i], true ) ) + { + valid_player_num += 1; + } + } + if( players.size > 1 ) + { + if( array_check_for_dupes( self.ignore_player, self.favoriteenemy) ) + { + self.ignore_player[self.ignore_player.size] = self.favoriteenemy; + } + if( self.ignore_player.size < valid_player_num ) + { + self.zombie_path_timer = 0; + return; + } + } + crumb_list = self.favoriteenemy.zombie_breadcrumbs; + bad_crumbs = []; + while( 1 ) + { + if( !is_player_valid( self.favoriteenemy, true ) ) + { + self.zombie_path_timer = 0; + return; + } + goal = zombie_pathing_get_breadcrumb( self.favoriteenemy.origin, crumb_list, bad_crumbs, ( RandomInt( 100 ) < 20 ) ); + if ( !IsDefined( goal ) ) + { + debug_print( "Zombie exhausted breadcrumb search" ); + goal = self.favoriteenemy.spectator_respawn.origin; + } + debug_print( "Setting current breadcrumb to " + goal ); + self.zombie_path_timer += 100; + self SetGoalPos( goal ); + self waittill( "bad_path" ); + debug_print( "Zombie couldn't path to breadcrumb at " + goal + " Finding next breadcrumb" ); + for( i = 0; i < crumb_list.size; i++ ) + { + if( goal == crumb_list[i] ) + { + bad_crumbs[bad_crumbs.size] = i; + break; + } + } + } +} +zombie_pathing_get_breadcrumb( origin, breadcrumbs, bad_crumbs, pick_random ) +{ + assert( IsDefined( origin ) ); + assert( IsDefined( breadcrumbs ) ); + assert( IsArray( breadcrumbs ) ); + for( i = 0; i < breadcrumbs.size; i++ ) + { + if ( pick_random ) + { + crumb_index = RandomInt( breadcrumbs.size ); + } + else + { + crumb_index = i; + } + if( crumb_is_bad( crumb_index, bad_crumbs ) ) + { + continue; + } + return breadcrumbs[crumb_index]; + } + return undefined; +} +crumb_is_bad( crumb, bad_crumbs ) +{ + for ( i = 0; i < bad_crumbs.size; i++ ) + { + if ( bad_crumbs[i] == crumb ) + { + return true; + } + } + return false; +} +jitter_enemies_bad_breadcrumbs( start_crumb ) +{ + trace_distance = 35; + jitter_distance = 2; + index = start_crumb; + while (isdefined(self.favoriteenemy.zombie_breadcrumbs[ index + 1 ])) + { + current_crumb = self.favoriteenemy.zombie_breadcrumbs[ index ]; + next_crumb = self.favoriteenemy.zombie_breadcrumbs[ index + 1 ]; + angles = vectortoangles(current_crumb - next_crumb); + right = anglestoright(angles); + left = anglestoright(angles + (0,180,0)); + dist_pos = current_crumb + vector_scale( right, trace_distance ); + trace = bulletTrace( current_crumb, dist_pos, true, undefined ); + vector = trace["position"]; + if (distance(vector, current_crumb) < 17 ) + { + self.favoriteenemy.zombie_breadcrumbs[ index ] = current_crumb + vector_scale( left, jitter_distance ); + continue; + } + dist_pos = current_crumb + vector_scale( left, trace_distance ); + trace = bulletTrace( current_crumb, dist_pos, true, undefined ); + vector = trace["position"]; + if (distance(vector, current_crumb) < 17 ) + { + self.favoriteenemy.zombie_breadcrumbs[ index ] = current_crumb + vector_scale( right, jitter_distance ); + continue; + } + index++; + } +} +zombie_follow_enemy() +{ + self endon( "death" ); + self endon( "zombie_acquire_enemy" ); + self endon( "bad_path" ); + level endon( "intermission" ); + while( 1 ) + { + if( isDefined( self.enemyoverride ) && isDefined( self.enemyoverride[1] ) ) + { + if( distanceSquared( self.origin, self.enemyoverride[0] ) > 1*1 ) + { + self OrientMode( "face motion" ); + } + else + { + self OrientMode( "face point", self.enemyoverride[1].origin ); + } + self.ignoreall = true; + self SetGoalPos( self.enemyoverride[0] ); + } + else if( IsDefined( self.favoriteenemy ) ) + { + self.ignoreall = false; + self OrientMode( "face default" ); + self SetGoalPos( self.favoriteenemy.origin ); + } + if( isDefined( level.inaccesible_player_func ) ) + { + self [[ level.inaccessible_player_func ]](); + } + wait( 0.1 ); + } +} +zombie_eye_glow() +{ + if(!IsDefined(self)) + { + return; + } + if ( !isdefined( self.no_eye_glow ) || !self.no_eye_glow ) + { + self haseyes(1); + } +} +zombie_eye_glow_stop() +{ + if(!IsDefined(self)) + { + return; + } + if ( !isdefined( self.no_eye_glow ) || !self.no_eye_glow ) + { + self haseyes(0); + } +} +zombie_history( msg ) +{ +} +do_zombie_rise() +{ + self endon("death"); + self.zombie_rise_version = (RandomInt(99999) % 2) + 1; + if (self.zombie_move_speed != "walk") + { + self.zombie_rise_version = 1; + } + self.in_the_ground = true; + self.anchor = spawn("script_origin", self.origin); + self.anchor.angles = self.angles; + self linkto(self.anchor); + if ( IsDefined( self.zone_name ) ) + { + spots = level.zones[ self.zone_name ].rise_locations; + } + else if ( IsDefined( self.rise_target_name ) ) + { + spots = GetStructArray(self.rise_target_name, "targetname"); + } + else if( IsDefined( level.zombie_rise_spawners ) ) + { + if ( IsArray( level.zombie_rise_spawners ) ) + { + spots = level.zombie_rise_spawners[ self.script_index ]; + } + else + { + spots = level.zombie_rise_spawners; + } + } + else + { + spots = GetStructArray("zombie_rise", "targetname"); + } + if( spots.size < 1 ) + { + self unlink(); + self.anchor delete(); + return; + } + else + spot = random(spots); + if( !isDefined( spot.angles ) ) + { + spot.angles = (0, 0, 0); + } + anim_org = spot.origin; + anim_ang = spot.angles; + if (self.zombie_rise_version == 2) + { + anim_org = anim_org + (0, 0, -14); + } + else + { + anim_org = anim_org + (0, 0, -45); + } + self Hide(); + self.anchor moveto(anim_org, .05); + self.anchor waittill("movedone"); + target_org = maps\_zombiemode_spawner::get_desired_origin(); + if (IsDefined(target_org)) + { + anim_ang = VectorToAngles(target_org - self.origin); + self.anchor RotateTo((0, anim_ang[1], 0), .05); + self.anchor waittill("rotatedone"); + } + self unlink(); + self.anchor delete(); + self thread hide_pop(); + level thread zombie_rise_death(self, spot); + spot thread zombie_rise_fx(self); + self AnimScripted("rise", self.origin, spot.angles, self get_rise_anim()); + self animscripts\zombie_shared::DoNoteTracks("rise", ::handle_rise_notetracks, undefined, spot); + self notify("rise_anim_finished"); + spot notify("stop_zombie_rise_fx"); + self.in_the_ground = false; + self notify("risen", spot.script_noteworthy ); +} +hide_pop() +{ + wait .5; + self Show(); +} +handle_rise_notetracks(note, spot) +{ + if (note == "deathout" || note == "deathhigh") + { + self.zombie_rise_death_out = true; + self notify("zombie_rise_death_out"); + wait 2; + spot notify("stop_zombie_rise_fx"); + } +} +zombie_rise_death(zombie, spot) +{ + zombie.zombie_rise_death_out = false; + zombie endon("rise_anim_finished"); + while (zombie.health > 1) + { + zombie waittill("damage", amount); + } + spot notify("stop_zombie_rise_fx"); + zombie.deathanim = zombie get_rise_death_anim(); + zombie StopAnimScripted(); +} +zombie_rise_fx(zombie) +{ + self thread zombie_rise_dust_fx(zombie); + self thread zombie_rise_burst_fx(); + playsoundatposition ("zmb_zombie_spawn", self.origin); + zombie endon("death"); + self endon("stop_zombie_rise_fx"); + wait 1; + if (zombie.zombie_move_speed != "sprint") + { + wait 1; + } +} +zombie_rise_burst_fx() +{ + self endon("stop_zombie_rise_fx"); + self endon("rise_anim_finished"); + if(IsDefined(self.script_string) && self.script_string == "in_water") + { + playfx(level._effect["rise_burst_water"],self.origin + ( 0,0,randomintrange(5,10) ) ); + wait(.25); + playfx(level._effect["rise_billow_water"],self.origin + ( randomintrange(-10,10),randomintrange(-10,10),randomintrange(5,10) ) ); + } + else + { + playfx(level._effect["rise_burst"],self.origin + ( 0,0,randomintrange(5,10) ) ); + wait(.25); + playfx(level._effect["rise_billow"],self.origin + ( randomintrange(-10,10),randomintrange(-10,10),randomintrange(5,10) ) ); + } +} +zombie_rise_dust_fx(zombie) +{ + dust_tag = "J_SpineUpper"; + self endon("stop_zombie_rise_dust_fx"); + self thread stop_zombie_rise_dust_fx(zombie); + dust_time = 7.5; + dust_interval = .1; + if(IsDefined(self.script_string) && self.script_string == "in_water") + { + for (t = 0; t < dust_time; t += dust_interval) + { + PlayfxOnTag(level._effect["rise_dust_water"], zombie, dust_tag); + wait dust_interval; + } + } + else + { + for (t = 0; t < dust_time; t += dust_interval) + { + PlayfxOnTag(level._effect["rise_dust"], zombie, dust_tag); + wait dust_interval; + } + } +} +stop_zombie_rise_dust_fx(zombie) +{ + zombie waittill("death"); + self notify("stop_zombie_rise_dust_fx"); +} +get_rise_anim() +{ + speed = self.zombie_move_speed; + return random(level._zombie_rise_anims[self.animname][self.zombie_rise_version][speed]); +} +get_rise_death_anim() +{ + possible_anims = []; + if (self.zombie_rise_death_out) + { + possible_anims = level._zombie_rise_death_anims[self.animname][self.zombie_rise_version]["out"]; + } + else + { + possible_anims = level._zombie_rise_death_anims[self.animname][self.zombie_rise_version]["in"]; + } + return random(possible_anims); +} +make_crawler() +{ + if( !IsDefined( self ) ) + { + return; + } + self.has_legs = false; + self.needs_run_update = true; + self AllowedStances( "crouch" ); + damage_type[0] = "right_foot"; + damage_type[1] = "left_foot"; + refs = []; + switch( damage_type[ RandomInt(damage_type.size) ] ) + { + case "right_leg_upper": + case "right_leg_lower": + case "right_foot": + refs[refs.size] = "right_leg"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "right_leg"; + refs[refs.size] = "no_legs"; + break; + case "left_leg_upper": + case "left_leg_lower": + case "left_foot": + refs[refs.size] = "left_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "left_leg"; + refs[refs.size] = "no_legs"; + break; + } + if( refs.size ) + { + self.a.gib_ref = animscripts\zombie_death::get_random( refs ); + if( ( self.a.gib_ref == "no_legs" || self.a.gib_ref == "right_leg" || self.a.gib_ref == "left_leg" ) && self.health > 0 ) + { + self.has_legs = false; + self AllowedStances( "crouch" ); + which_anim = RandomInt( 5 ); + if(self.a.gib_ref == "no_legs") + { + if(randomint(100) < 50) + { + self.deathanim = %ai_zombie_crawl_death_v1; + self set_run_anim( "death3" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl_hand_1"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl_hand_1"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl_hand_1"]; + } + else + { + self.deathanim = %ai_zombie_crawl_death_v1; + self set_run_anim( "death3" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl_hand_2"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl_hand_2"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl_hand_2"]; + } + } + else if( which_anim == 0 ) + { + self.deathanim = %ai_zombie_crawl_death_v1; + self set_run_anim( "death3" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl1"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl1"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl1"]; + } + else if( which_anim == 1 ) + { + self.deathanim = %ai_zombie_crawl_death_v2; + self set_run_anim( "death4" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl2"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl2"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl2"]; + } + else if( which_anim == 2 ) + { + self.deathanim = %ai_zombie_crawl_death_v1; + self set_run_anim( "death3" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl3"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl3"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl3"]; + } + else if( which_anim == 3 ) + { + self.deathanim = %ai_zombie_crawl_death_v2; + self set_run_anim( "death4" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl4"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl4"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl4"]; + } + else if( which_anim == 4 ) + { + self.deathanim = %ai_zombie_crawl_death_v1; + self set_run_anim( "death3" ); + self.run_combatanim = level.scr_anim[self.animname]["crawl5"]; + self.crouchRunAnim = level.scr_anim[self.animname]["crawl5"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["crawl5"]; + } + } + } +} +zombie_disintegrate( player ) +{ + self DoDamage( self.health + 666, player.origin, player ); + if ( self.health <= 0 ) + { + player maps\_zombiemode_score::player_add_points( "death", "", "", self.isdog ); + if( self.has_legs ) + { + self.deathanim = random( level._zombie_knockdowns[self.animname]["front"]["has_legs"] ); + } + else + { + self.deathanim = random( level._zombie_tesla_crawl_death[self.animname] ); + } + self swap_to_dissolve_models(); + self setDeathContents( level.CONTENTS_CORPSE ); + self playweapondeatheffects( player GetCurrentWeapon() ); + self.thundergun_death = true; + self.thundergun_disintegrated_death = true; + self.skip_death_notetracks = true; + self.nodeathragdoll = true; + wait( GetDvarFloat( #"cg_dissolveTransitionTime" ) + 4 ); + self_delete(); + } +} +zombie_knockdown( player, gib ) +{ + if ( gib && !self.gibbed ) + { + self.a.gib_ref = random( level.thundergun_gib_refs ); + self thread animscripts\zombie_death::do_gib(); + } + self.thundergun_handle_pain_notetracks = maps\_zombiemode_weap_thundergun::handle_thundergun_pain_notetracks; + self DoDamage( level.zombie_vars["thundergun_knockdown_damage"], player.origin, player ); +} +zombie_tesla_head_gib() +{ + if( RandomInt( 100 ) < level.zombie_vars["tesla_head_gib_chance"] ) + { + wait( RandomFloat( 0.53, 1.0 ) ); + self zombie_head_gib(); + } + else + { + network_safe_play_fx_on_tag( "tesla_death_fx", 2, level._effect["tesla_shock_eyes"], self, "J_Eyeball_LE" ); + } +} +play_ambient_zombie_vocals() +{ + self endon( "death" ); + while(1) + { + type = "ambient"; + float = 2; + if( !IsDefined( self.zombie_move_speed ) ) + { + wait(.5); + continue; + } + switch(self.zombie_move_speed) + { + case "walk": type="ambient"; float=4; break; + case "run": type="sprint"; float=4; break; + case "sprint": type="sprint"; float=4; break; + } + if( self.animname == "zombie" && !self.has_legs ) + { + type = "crawler"; + } + else if( self.animname == "thief_zombie" ) + { + float = 1.2; + } + self thread maps\_zombiemode_audio::do_zombies_playvocals( type, self.animname ); + wait(RandomFloatRange(1,float)); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_spikemore.gsc b/BO1/PC/ZM/maps/_zombiemode_spikemore.gsc new file mode 100644 index 0000000..7944aac --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_spikemore.gsc @@ -0,0 +1,440 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +init() +{ + level.spikemore_detonate_radius = 96.0; + level.spikemore_fire_radius = 200.0; + level.spikemore_projectile_damage = 1500; + level.spikemore_projectile_speed = 1500; + level thread _update_spikemore_fires(); + PrecacheItem("spikemore_zm"); + PrecacheModel("t5_weapon_bamboo_spear_spikemore_small"); + trigs = getentarray("spikemore_purchase","targetname"); + for(i=0; i= self.zombie_cost ) + { + if ( !who is_player_placeable_mine( "spikemore_zm" ) ) + { + play_sound_at_pos( "purchase", self.origin ); + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); + who maps\_zombiemode_weapons::check_collector_achievement( "spikemore_zm" ); + who thread spikemore_setup(); + who thread show_spikemore_hint("spikemore_purchased"); + who thread maps\_zombiemode_audio::create_and_play_dialog( "weapon_pickup", "spikemore" ); + if( self.spikemores_triggered == false ) + { + model = getent( self.target, "targetname" ); + model thread maps\_zombiemode_weapons::weapon_show( who ); + self.spikemores_triggered = true; + } + trigs = getentarray("spikemore_purchase","targetname"); + for(i = 0; i < trigs.size; i++) + { + trigs[i] SetInvisibleToPlayer(who); + } + } + else + { + who thread show_spikemore_hint("already_purchased"); + } + } + else + { + who maps\_zombiemode_audio::create_and_play_dialog( "general", "no_money", undefined, 1 ); + } + } + } +} +set_spikemore_visible() +{ + players = getplayers(); + trigs = getentarray("spikemore_purchase","targetname"); + while(1) + { + for(j = 0; j < players.size; j++) + { + if( !players[j] is_player_placeable_mine( "spikemore_zm" ) ) + { + for(i = 0; i < trigs.size; i++) + { + trigs[i] SetInvisibleToPlayer(players[j], false); + } + } + } + wait(1); + players = getplayers(); + } +} +spikemore_watch() +{ + self endon("death"); + while(1) + { + self waittill("grenade_fire",spikemore,weapname); + if(weapname == "spikemore_zm") + { + spikemore.owner = self; + if ( is_true( self.is_on_minecart ) ) + { + spikemore maps\_zombiemode_spikemore::_spikemore_SmallSpearActivate(); + } + else + { + spikemore thread spikemore_detonation(); + } + self notify( "zmb_enable_spikemore_prompt" ); + } + } +} +spikemore_setup() +{ + self thread spikemore_watch(); + self giveweapon("spikemore_zm"); + self set_player_placeable_mine("spikemore_zm"); + self setactionslot(4,"weapon","spikemore_zm"); + self setweaponammostock("spikemore_zm",4); +} +pickup_spikemores() +{ + player = self.owner; + if ( !player hasweapon( "spikemore_zm" ) ) + { + player thread spikemore_watch(); + player giveweapon("spikemore_zm"); + player set_player_placeable_mine("spikemore_zm"); + player setactionslot(4,"weapon","spikemore_zm"); + player setweaponammoclip("spikemore_zm",0); + player notify( "zmb_enable_spikemore_prompt" ); + } + else + { + clip_ammo = player GetWeaponAmmoClip( self.name ); + clip_max_ammo = WeaponClipSize( self.name ); + if ( clip_ammo >= clip_max_ammo ) + { + player notify( "zmb_disable_spikemore_prompt" ); + return; + } + } + self maps\_weaponobjects::pick_up(); + clip_ammo = player GetWeaponAmmoClip( self.name ); + clip_max_ammo = WeaponClipSize( self.name ); + if ( clip_ammo >= clip_max_ammo ) + { + player notify( "zmb_disable_spikemore_prompt" ); + } +} +pickup_spikemores_trigger_listener( trigger, player ) +{ + self thread pickup_spikemores_trigger_listener_enable( trigger, player ); + self thread pickup_spikemores_trigger_listener_disable( trigger, player ); +} +pickup_spikemores_trigger_listener_enable( trigger, player ) +{ + self endon( "delete" ); + self endon( "death" ); + while ( true ) + { + player waittill_any( "zmb_enable_spikemore_prompt", "spawned_player" ); + if ( !isDefined( trigger ) ) + { + return; + } + trigger trigger_on(); + trigger linkto( self ); + } +} +pickup_spikemores_trigger_listener_disable( trigger, player ) +{ + self endon( "delete" ); + self endon( "death" ); + while ( true ) + { + player waittill( "zmb_disable_spikemore_prompt" ); + if ( !isDefined( trigger ) ) + { + return; + } + trigger unlink(); + trigger trigger_off(); + } +} +shouldAffectWeaponObject( object ) +{ + pos = self.origin + (0,0,32); + dirToPos = pos - object.origin; + objectForward = anglesToForward( object.angles ); + dist = vectorDot( dirToPos, objectForward ); + if ( dist < level.spikemore_detectionMinDist ) + return false; + dirToPos = vectornormalize( dirToPos ); + dot = vectorDot( dirToPos, objectForward ); + return ( dot > level.spikemore_detectionDot ); +} +spikemore_detonation() +{ + self endon("death"); + self waittill_not_moving(); + detonateRadius = 96; + spawnFlag = 1; + playerTeamToAllow = "axis"; + if( isDefined( self.owner ) && isDefined( self.owner.pers["team"] ) && self.owner.pers["team"] == "axis" ) + { + spawnFlag = 2; + playerTeamToAllow = "allies"; + } + damagearea = spawn("trigger_radius", self.origin + (0,0,0-detonateRadius), spawnFlag, detonateRadius, detonateRadius*2); + damagearea enablelinkto(); + damagearea linkto( self ); + self thread delete_spikemores_on_death( damagearea ); + if(!isdefined(level.spikemores)) + level.spikemores = []; + level.spikemores = array_add( level.spikemores, self ); + if( level.spikemores.size > 15 && GetDvar( #"player_sustainAmmo") != "0" ) + level.spikemores[0] delete(); + while(1) + { + damagearea waittill( "trigger", ent ); + if ( isdefined( self.owner ) && ent == self.owner ) + continue; + if( isDefined( ent.pers ) && isDefined( ent.pers["team"] ) && ent.pers["team"] != playerTeamToAllow ) + continue; + if ( !ent shouldAffectWeaponObject( self ) ) + continue; + if ( ent damageConeTrace(self.origin, self) > 0 ) + { + self _spikemore_SmallSpearActivate(); + return; + } + } +} +delete_spikemores_on_death(ent) +{ + self waittill("death"); + level.spikemores = array_remove_nokeys( level.spikemores, self ); + wait .05; + if ( isdefined( ent ) ) + ent delete(); +} +give_spikemores_after_rounds() +{ + while(1) + { + level waittill( "between_round_over" ); + { + players = get_players(); + for(i=0;i= level.spikemore_detectionDot; +} +_spikemore_filterTargetsByFOV( targets ) +{ + ret = []; + for ( i = 0; i < targets.size; i++ ) + { + if ( self _spikemore_TargetInFOV(targets[i]) ) + { + ret[ret.size] = targets[i]; + } + } + return ret; +} +_spikemore_SmallSpearActivate() +{ + _wait_to_fire_spikemore(); + targets = self _getZombiesInRange(level.spikemore_fire_radius); + targets = self _spikemore_FilterTargetsByFOV(targets); + if ( !IsDefined( targets ) ) + { + targets = []; + } + self _spikemore_SmallSpearDetonate(targets); + self Delete(); +} +_spikemore_SmallSpearDetonate(targets) +{ + self playsound ("claymore_activated_SP"); + wait 0.4; + self SetClientFlag( level._CF_SCRIPTMOVER_CLIENT_FLAG_SPIKEMORE ); + self playsound( "wpn_spikemore_exp" ); + for ( i = 0; i < targets.size; i++ ) + { + if(IsAI(targets[i])) + { + targets[i] thread _spikemore_damage(self.origin, self.owner); + } + else + { + targets[i] notify("spiked", self.owner); + } + } + wait(0.1); +} +_spikemore_damage(fromOrigin, fromOwner) +{ + numSpikes = 2; + if ( RandomInt(10) == 0 ) + { + numSpikes++; + } + zombieDamage = level.spikemore_projectile_damage * numSpikes; + dist = Distance(fromOrigin, self.origin); + time = dist / level.spikemore_projectile_speed; + wait(time); + if(self.animname != "napalm_zombie") + { + self.no_gib = true; + if( randomintrange(0,101) <= 75 ) + { + fromOwner thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "spikemore" ); + } + self DoDamage( zombieDamage, fromOrigin, fromOwner, -1, "projectile", "torso_upper" ); + self SetClientFlag( level._CF_ACTOR_CLIENT_FLAG_SPIKEMORE ); + } +} +_update_spikemore_fires() +{ + while ( true ) + { + level.hasSpikemoreFiredRecently = false; + wait(0.2); + } +} +_wait_to_fire_spikemore() +{ + while ( level.hasSpikemoreFiredRecently ) + { + wait_network_frame(); + } + level.hasSpikemoreFiredRecently = true; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_traps.gsc b/BO1/PC/ZM/maps/_zombiemode_traps.gsc new file mode 100644 index 0000000..dba82bf --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_traps.gsc @@ -0,0 +1,799 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +init() +{ + level.trap_kills = 0; + traps = GetEntArray( "zombie_trap", "targetname" ); + if( level.mutators["mutator_noTraps"] ) + { + disable_traps( traps ); + return; + } + array_thread( traps, ::trap_init ); + level.burning_zombies = []; + level.elec_trap_time = 40; + level.elec_trap_cooldown_time = 60; +} +disable_traps( traps ) +{ + for( i = 0; i < traps.size; i++ ) + { + if( isDefined( traps[i].target ) ) + { + components = GetEntArray( traps[i].target, "targetname" ); + for( j = 0; j < components.size; j++ ) + { + if( components[j].classname == "trigger_use" ) + { + components[j] disable_trigger(); + } + } + } + traps[i] disable_trigger(); + } +} +trap_init() +{ + self ent_flag_init( "flag_active" ); + self ent_flag_init( "flag_cooldown" ); + self._trap_type = ""; + if ( IsDefined(self.script_noteworthy) ) + { + self._trap_type = self.script_noteworthy; + if ( IsDefined( level._zombiemode_trap_activate_funcs ) && + IsDefined( level._zombiemode_trap_activate_funcs[ self._trap_type ] ) ) + { + self._trap_activate_func = level._zombiemode_trap_activate_funcs[ self._trap_type ]; + } + else + { + switch( self.script_noteworthy ) + { + case "rotating": + self._trap_activate_func = ::trap_activate_rotating; + break; + case "electric": + self._trap_activate_func = ::trap_activate_electric; + break; + case "flipper": + self._trap_activate_func = ::trap_activate_flipper; + break; + case "fire": + default: + self._trap_activate_func = ::trap_activate_fire; + } + } + if ( IsDefined( level._zombiemode_trap_use_funcs ) && + IsDefined( level._zombiemode_trap_use_funcs[ self._trap_type ] ) ) + { + self._trap_use_func = level._zombiemode_trap_use_funcs[ self._trap_type ]; + } + else + { + self._trap_use_func = ::trap_use_think; + } + } + self trap_model_type_init(); + self._trap_use_trigs = []; + self._trap_lights = []; + self._trap_movers = []; + self._trap_switches = []; + components = GetEntArray( self.target, "targetname" ); + for ( i=0; i 0, "_zombiemode_traps::init no use triggers found for "+self.target ); + if ( !IsDefined( self.zombie_cost ) ) + { + self.zombie_cost = 1000; + } + self._trap_in_use = 0; + self._trap_cooling_down = 0; + self thread trap_dialog(); + flag_wait( "all_players_connected" ); + self trap_lights_red(); + for ( i=0; i= trap.zombie_cost ) + { + who maps\_zombiemode_score::minus_to_player_score( trap.zombie_cost ); + } + else if( level.team_pool[who.team_num].score >= trap.zombie_cost ) + { + who maps\_zombiemode_score::minus_to_team_score( trap.zombie_cost ); + } + else if( level.team_pool[ who.team_num ].score + who.score >= trap.zombie_cost ) + { + team_points = level.team_pool[ who.team_num ].score; + who maps\_zombiemode_score::minus_to_player_score( trap.zombie_cost - team_points ); + who maps\_zombiemode_score::minus_to_team_score( team_points ); + } + else + { + continue; + } + trap._trap_in_use = 1; + trap trap_set_string( &"ZOMBIE_TRAP_ACTIVE" ); + play_sound_at_pos( "purchase", who.origin ); + if ( trap._trap_switches.size ) + { + trap thread trap_move_switches(); + trap waittill("switch_activated"); + } + trap trigger_on(); + trap thread [[ trap._trap_activate_func ]](); + trap waittill("trap_done"); + trap trigger_off(); + trap._trap_cooling_down = 1; + trap trap_set_string( &"ZOMBIE_TRAP_COOLDOWN" ); + wait( trap._trap_cooldown_time ); + trap._trap_cooling_down = 0; + trap notify("available"); + trap._trap_in_use = 0; + trap trap_set_string( &"ZOMBIE_BUTTON_BUY_TRAP", trap.zombie_cost ); + } + } +} +trap_lights_red() +{ + if( level.mutators["mutator_noTraps"] ) + { + return; + } + for(i=0;i 90) && (level.burning_zombies.size < 6) ) + { + level.burning_zombies[level.burning_zombies.size] = self; + self thread zombie_flame_watch(); + self playsound("ignite"); + self thread animscripts\zombie_death::flame_death_fx(); + wait( randomfloat(1.25) ); + } + else + { + refs[0] = "guts"; + refs[1] = "right_arm"; + refs[2] = "left_arm"; + refs[3] = "right_leg"; + refs[4] = "left_leg"; + refs[5] = "no_legs"; + refs[6] = "head"; + self.a.gib_ref = refs[randomint(refs.size)]; + playsoundatposition("zmb_zombie_arc", self.origin); + if( trap._trap_type == "electric" ) + { + if(randomint(100) > 50 ) + { + self thread electroctute_death_fx(); + self thread play_elec_vocals(); + } + } + wait(randomfloat(1.25)); + self playsound("zmb_zombie_arc"); + } + } + if ( IsDefined( self.fire_damage_func ) ) + { + self [[ self.fire_damage_func ]]( trap ); + } + else + { + self dodamage(self.health + 666, self.origin, trap); + } + break; + case "rotating": + case "centrifuge": + ang = VectorToAngles( trap.origin - self.origin ); + direction_vec = vector_scale( AnglesToRight( ang ), param); + if ( IsDefined( self.trap_reaction_func ) ) + { + self [[ self.trap_reaction_func ]]( trap ); + } + self StartRagdoll(); + self launchragdoll(direction_vec); + wait_network_frame(); + self.a.gib_ref = "head"; + self dodamage(self.health, self.origin, trap); + break; + } +} +zombie_flame_watch() +{ + if( level.mutators["mutator_noTraps"] ) + { + return; + } + self waittill("death"); + self stoploopsound(); + level.burning_zombies = array_remove_nokeys(level.burning_zombies,self); +} +play_elec_vocals() +{ + if( IsDefined (self) ) + { + org = self.origin; + wait(0.15); + playsoundatposition("zmb_elec_vocals", org); + playsoundatposition("zmb_zombie_arc", org); + playsoundatposition("zmb_exp_jib_zombie", org); + } +} +electroctute_death_fx() +{ + self endon( "death" ); + if (isdefined(self.is_electrocuted) && self.is_electrocuted ) + { + return; + } + self.is_electrocuted = true; + self thread electrocute_timeout(); + if(self.team == "axis") + { + level.bcOnFireTime = gettime(); + level.bcOnFireOrg = self.origin; + } + PlayFxOnTag( level._effect["elec_torso"], self, "J_SpineLower" ); + self playsound ("zmb_elec_jib_zombie"); + wait 1; + tagArray = []; + tagArray[0] = "J_Elbow_LE"; + tagArray[1] = "J_Elbow_RI"; + tagArray[2] = "J_Knee_RI"; + tagArray[3] = "J_Knee_LE"; + tagArray = array_randomize( tagArray ); + PlayFxOnTag( level._effect["elec_md"], self, tagArray[0] ); + self playsound ("zmb_elec_jib_zombie"); + wait 1; + self playsound ("zmb_elec_jib_zombie"); + tagArray[0] = "J_Wrist_RI"; + tagArray[1] = "J_Wrist_LE"; + if( !IsDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" ) + { + tagArray[2] = "J_Ankle_RI"; + tagArray[3] = "J_Ankle_LE"; + } + tagArray = array_randomize( tagArray ); + PlayFxOnTag( level._effect["elec_sm"], self, tagArray[0] ); + PlayFxOnTag( level._effect["elec_sm"], self, tagArray[1] ); +} +electrocute_timeout() +{ + self endon ("death"); + self playloopsound("fire_manager_0"); + wait 12; + self stoploopsound(); + if (isdefined(self) && isalive(self)) + { + self.is_electrocuted = false; + self notify ("stop_flame_damage"); + } +} +trap_dialog() +{ + self endon ("warning_dialog"); + level endon("switch_flipped"); + timer =0; + while(1) + { + wait(0.5); + players = get_players(); + for(i = 0; i < players.size; i++) + { + dist = distancesquared(players[i].origin, self.origin ); + if(dist > 70*70) + { + timer = 0; + continue; + } + if(dist < 70*70 && timer < 3) + { + wait(0.5); + timer ++; + } + if(dist < 70*70 && timer == 3) + { + index = maps\_zombiemode_weapons::get_player_index(players[i]); + plr = "plr_" + index + "_"; + wait(3); + self notify ("warning_dialog"); + } + } + } +} +get_trap_array( trap_type ) +{ + ents = GetEntArray( "zombie_trap", "targetname" ); + traps = []; + for ( i=0; i (max_positions[i]+diff) ) + { + actual_num_positions[i] = max_positions[i]; + diff += num_attracts_per_dist - max_positions[i]; + } + else + { + actual_num_positions[i] = num_attracts_per_dist + diff; + diff = 0; + } + } + self.attractor_positions = []; + failed = 0; + angle_offset = 0; + prev_last_index = -1; + for( j = 0; j < 4; j++ ) + { + if( (actual_num_positions[j]+failed) < max_positions[j] ) + { + actual_num_positions[j] += failed; + failed = 0; + } + else if( actual_num_positions[j] < max_positions[j] ) + { + actual_num_positions[j] = max_positions[j]; + failed = max_positions[j] - actual_num_positions[j]; + } + failed += self generated_radius_attract_positions( forward, angle_offset, actual_num_positions[j], self.attract_dists[j] ); + angle_offset += 15; + self.last_index[j] = int(actual_num_positions[j] - failed + prev_last_index); + prev_last_index = self.last_index[j]; + } + self notify( "attractor_positions_generated" ); + level notify( "attractor_positions_generated" ); +} +generated_radius_attract_positions( forward, offset, num_positions, attract_radius ) +{ + failed = 0; + degs_per_pos = 360 / num_positions; + for( i = offset; i < 360+offset; i += degs_per_pos ) + { + altforward = forward * attract_radius; + rotated_forward = ( (cos(i)*altforward[0] - sin(i)*altforward[1]), (sin(i)*altforward[0] + cos(i)*altforward[1]), altforward[2] ); + pos = maps\_zombiemode_server_throttle::server_safe_ground_trace( "poi_trace", 10, self.origin + rotated_forward + ( 0, 0, 100 ) ); + if( abs( pos[2] - self.origin[2] ) < 60 ) + { + pos_array = []; + pos_array[0] = pos; + pos_array[1] = self; + self.attractor_positions = array_add( self.attractor_positions , pos_array ); + } + else + { + failed++; + } + } + return failed; +} +debug_draw_attractor_positions() +{ +} +get_zombie_point_of_interest( origin ) +{ + curr_radius = undefined; + ent_array = getEntArray( "zombie_poi", "script_noteworthy" ); + best_poi = undefined; + position = undefined; + best_dist = 10000 * 10000; + for( i = 0; i < ent_array.size; i++ ) + { + if( !isDefined( ent_array[i].poi_active ) || !ent_array[i].poi_active ) + { + continue; + } + dist = distanceSquared( origin, ent_array[i].origin ); + dist -= ent_array[i].added_poi_value; + if( isDefined( ent_array[i].poi_radius ) ) + { + curr_radius = ent_array[i].poi_radius; + } + if( (!isDefined( curr_radius ) || dist < curr_radius) && dist < best_dist && ent_array[i] can_attract(self) ) + { + best_poi = ent_array[i]; + best_dist = dist; + } + } + if( isDefined( best_poi ) ) + { + if( isDefined( best_poi.attract_to_origin ) && best_poi.attract_to_origin ) + { + position = []; + position[0] = groundpos( best_poi.origin + (0, 0, 100) ); + position[1] = self; + } + else + { + position = self add_poi_attractor( best_poi ); + } + } + return position; +} +activate_zombie_point_of_interest() +{ + if( self.script_noteworthy != "zombie_poi" ) + { + return; + } + self.poi_active = true; +} +deactivate_zombie_point_of_interest() +{ + if( self.script_noteworthy != "zombie_poi" ) + { + return; + } + for( i = 0; i < self.attractor_array.size; i++ ) + { + self.attractor_array[i] notify( "kill_poi" ); + } + self.attractor_array = []; + self.claimed_attractor_positions = []; + self.poi_active = false; +} +assign_zombie_point_of_interest (origin, poi) +{ + position = undefined; + doremovalthread = false; + if (IsDefined(poi) && poi can_attract(self)) + { + if (!IsDefined(poi.attractor_array) || ( IsDefined(poi.attractor_array) && array_check_for_dupes( poi.attractor_array, self ) )) + doremovalthread = true; + position = self add_poi_attractor( poi ); + if (IsDefined(position) && doremovalthread && !array_check_for_dupes( poi.attractor_array, self )) + self thread update_on_poi_removal( poi ); + } + return position; +} +remove_poi_attractor( zombie_poi ) +{ + if( !isDefined( zombie_poi.attractor_array ) ) + { + return; + } + for( i = 0; i < zombie_poi.attractor_array.size; i++ ) + { + if( zombie_poi.attractor_array[i] == self ) + { + self notify( "kill_poi" ); + zombie_poi.attractor_array = array_remove( zombie_poi.attractor_array, zombie_poi.attractor_array[i] ); + zombie_poi.claimed_attractor_positions = array_remove( zombie_poi.claimed_attractor_positions, zombie_poi.claimed_attractor_positions[i] ); + } + } +} +add_poi_attractor( zombie_poi ) +{ + if( !isDefined( zombie_poi ) ) + { + return; + } + if( !isDefined( zombie_poi.attractor_array ) ) + { + zombie_poi.attractor_array = []; + } + if( array_check_for_dupes( zombie_poi.attractor_array, self ) ) + { + if( !isDefined( zombie_poi.claimed_attractor_positions ) ) + { + zombie_poi.claimed_attractor_positions = []; + } + if( !isDefined( zombie_poi.attractor_positions ) || zombie_poi.attractor_positions.size <= 0 ) + { + return undefined; + } + start = -1; + end = -1; + last_index = -1; + for( i = 0; i < 4; i++ ) + { + if( zombie_poi.claimed_attractor_positions.size < zombie_poi.last_index[i] ) + { + start = last_index+1; + end = zombie_poi.last_index[i]; + break; + } + last_index = zombie_poi.last_index[i]; + } + best_dist = 10000*10000; + best_pos = undefined; + if( start < 0 ) + { + start = 0; + } + if( end < 0 ) + { + return undefined; + } + for( i = int(start); i <= int(end); i++ ) + { + if( array_check_for_dupes( zombie_poi.claimed_attractor_positions, zombie_poi.attractor_positions[i] ) ) + { + if ( isDefined( zombie_poi.attractor_positions[i][0] ) && isDefined( self.origin ) ) + { + dist = distancesquared( zombie_poi.attractor_positions[i][0], self.origin ); + if( dist < best_dist || !isDefined( best_pos ) ) + { + best_dist = dist; + best_pos = zombie_poi.attractor_positions[i]; + } + } + } + } + if( !isDefined( best_pos ) ) + { + return undefined; + } + zombie_poi.attractor_array = array_add( zombie_poi.attractor_array, self ); + self thread update_poi_on_death( zombie_poi ); + zombie_poi.claimed_attractor_positions = array_add( zombie_poi.claimed_attractor_positions, best_pos ); + return best_pos; + } + else + { + for( i = 0; i < zombie_poi.attractor_array.size; i++ ) + { + if( zombie_poi.attractor_array[i] == self ) + { + if( isDefined( zombie_poi.claimed_attractor_positions ) && isDefined( zombie_poi.claimed_attractor_positions[i] ) ) + { + return zombie_poi.claimed_attractor_positions[i]; + } + } + } + } + return undefined; +} +can_attract( attractor ) +{ + if( !isDefined( self.attractor_array ) ) + { + self.attractor_array = []; + } + if( !array_check_for_dupes( self.attractor_array, attractor ) ) + { + return true; + } + if( isDefined(self.num_poi_attracts) && self.attractor_array.size >= self.num_poi_attracts ) + { + return false; + } + return true; +} +update_poi_on_death( zombie_poi ) +{ + self endon( "kill_poi" ); + self waittill( "death" ); + self remove_poi_attractor( zombie_poi ); +} +update_on_poi_removal (zombie_poi ) +{ + zombie_poi waittill( "death" ); + if( !isDefined( zombie_poi.attractor_array ) ) + return; + for( i = 0; i < zombie_poi.attractor_array.size; i++ ) + { + if( zombie_poi.attractor_array[i] == self ) + { + zombie_poi.attractor_array = array_remove_index( zombie_poi.attractor_array, i ); + zombie_poi.claimed_attractor_positions = array_remove_index( zombie_poi.claimed_attractor_positions, i ); + } + } +} +invalidate_attractor_pos( attractor_pos, zombie ) +{ + if( !isDefined( self ) || !isDefined( attractor_pos ) ) + { + wait( 0.1 ); + return undefined; + } + if( isDefined( self.attractor_positions) && !array_check_for_dupes( self.attractor_positions, attractor_pos ) ) + { + index = 0; + for( i = 0; i < self.attractor_positions.size; i++ ) + { + if( self.attractor_positions[i] == attractor_pos ) + { + index = i; + } + } + for( i = 0; i < self.last_index.size; i++ ) + { + if( index <= self.last_index[i] ) + { + self.last_index[i]--; + } + } + self.attractor_array = array_remove( self.attractor_array, zombie ); + self.attractor_positions = array_remove( self.attractor_positions, attractor_pos ); + for( i = 0; i < self.claimed_attractor_positions.size; i++ ) + { + if( self.claimed_attractor_positions[i][0] == attractor_pos[0] ) + { + self.claimed_attractor_positions = array_remove( self.claimed_attractor_positions, self.claimed_attractor_positions[i] ); + } + } + } + else + { + wait( 0.1 ); + } + return get_zombie_point_of_interest( zombie.origin ); +} +get_closest_valid_player( origin, ignore_player ) +{ + valid_player_found = false; + players = get_players(); + if( IsDefined( ignore_player ) ) + { + for(i = 0; i < ignore_player.size; i++ ) + { + players = array_remove( players, ignore_player[i] ); + } + } + while( !valid_player_found ) + { + player = GetClosest( origin, players ); + if( !isdefined( player ) ) + { + return undefined; + } + if( !is_player_valid( player, true ) ) + { + players = array_remove( players, player ); + continue; + } + return player; + } +} +is_player_valid( player, checkIgnoreMeFlag ) +{ + if( !IsDefined( player ) ) + { + return false; + } + if( !IsAlive( player ) ) + { + return false; + } + if( !IsPlayer( player ) ) + { + return false; + } + if( player.is_zombie == true ) + { + return false; + } + if( player.sessionstate == "spectator" ) + { + return false; + } + if( player.sessionstate == "intermission" ) + { + return false; + } + if( player maps\_laststand::player_is_in_laststand() ) + { + return false; + } + if ( player isnotarget() ) + { + return false; + } + if( isdefined(checkIgnoreMeFlag) && player.ignoreme ) + { + return false; + } + return true; +} +get_number_of_valid_players() +{ + players = get_players(); + num_player_valid = 0; + for( i = 0 ; i < players.size; i++ ) + { + if( is_player_valid( players[i] ) ) + num_player_valid += 1; + } + return num_player_valid; +} +in_revive_trigger() +{ + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( !IsDefined( players[i] ) || !IsAlive( players[i] ) ) + { + continue; + } + if( IsDefined( players[i].revivetrigger ) ) + { + if( self IsTouching( players[i].revivetrigger ) ) + { + return true; + } + } + } + return false; +} +get_closest_node( org, nodes ) +{ + return getClosest( org, nodes ); +} +non_destroyed_bar_board_order( origin, chunks ) +{ + first_bars = []; + first_bars1 = []; + first_bars2 = []; + for( i=0;i 0) + { + index = temp_array[RandomIntRange(0, temp_array.size)].index; + return ents[index]; + } + else + { + for( i = 1; i < ents.size; i++ ) + { + temp_dist = Distance2d( origin, ents[i].origin ); + if( temp_dist < dist ) + { + dist = temp_dist; + index = i; + } + } + return ents[index]; + } +} +disable_trigger() +{ + if( !IsDefined( self.disabled ) || !self.disabled ) + { + self.disabled = true; + self.origin = self.origin -( 0, 0, 10000 ); + } +} +enable_trigger() +{ + if( !IsDefined( self.disabled ) || !self.disabled ) + { + return; + } + self.disabled = false; + self.origin = self.origin +( 0, 0, 10000 ); +} +in_playable_area() +{ + playable_area = getentarray("player_volume","script_noteworthy"); + if( !IsDefined( playable_area ) ) + { + println( "No playable area playable_area found! Assume EVERYWHERE is PLAYABLE" ); + return true; + } + for(i=0;i 0 ) + { + return true; + } + else + { + return false; + } +} +add_spawner( spawner ) +{ + if( IsDefined( spawner.script_start ) && level.round_number < spawner.script_start ) + { + return; + } + if( IsDefined( spawner.is_enabled ) && !spawner.is_enabled) + { + return; + } + if( IsDefined( spawner.has_been_added ) && spawner.has_been_added ) + { + return; + } + spawner.has_been_added = true; + level.enemy_spawns[level.enemy_spawns.size] = spawner; +} +fake_physicslaunch( target_pos, power ) +{ + start_pos = self.origin; + gravity = GetDvarInt( #"bg_gravity" ) * -1; + dist = Distance( start_pos, target_pos ); + time = dist / power; + delta = target_pos - start_pos; + drop = 0.5 * gravity *( time * time ); + velocity = ( ( delta[0] / time ), ( delta[1] / time ), ( delta[2] - drop ) / time ); + level thread draw_line_ent_to_pos( self, target_pos ); + self MoveGravity( velocity, time ); + return time; +} +add_to_spectate_list() +{ + if( !IsDefined( level.spectate_list ) ) + { + level.spectate_list = []; + } + level.spectate_list[level.spectate_list.size] = self; +} +remove_from_spectate_list() +{ + if( !IsDefined( level.spectate_list ) ) + { + return undefined; + } + level.spectate_list = array_remove( level.spectate_list, self ); +} +get_next_from_spectate_list( ent ) +{ + index = 0; + for( i = 0; i < level.spectate_list.size; i++ ) + { + if( ent == level.spectate_list[i] ) + { + index = i; + } + } + index++; + if( index >= level.spectate_list.size ) + { + index = 0; + } + return level.spectate_list[index]; +} +get_random_from_spectate_list() +{ + return level.spectate_list[RandomInt(level.spectate_list.size)]; +} +add_zombie_hint( ref, text ) +{ + if( !IsDefined( level.zombie_hints ) ) + { + level.zombie_hints = []; + } + PrecacheString( text ); + level.zombie_hints[ref] = text; +} +get_zombie_hint( ref ) +{ + if( IsDefined( level.zombie_hints[ref] ) ) + { + return level.zombie_hints[ref]; + } + return level.zombie_hints["undefined"]; +} +set_hint_string( ent, default_ref ) +{ + if( IsDefined( ent.script_hint ) ) + { + self SetHintString( get_zombie_hint( ent.script_hint ) ); + } + else + { + self SetHintString( get_zombie_hint( default_ref ) ); + } +} +add_sound( ref, alias ) +{ + if( !IsDefined( level.zombie_sounds ) ) + { + level.zombie_sounds = []; + } + level.zombie_sounds[ref] = alias; +} +play_sound_at_pos( ref, pos, ent ) +{ + if( IsDefined( ent ) ) + { + if( IsDefined( ent.script_soundalias ) ) + { + PlaySoundAtPosition( ent.script_soundalias, pos ); + return; + } + if( IsDefined( self.script_sound ) ) + { + ref = self.script_sound; + } + } + if( ref == "none" ) + { + return; + } + if( !IsDefined( level.zombie_sounds[ref] ) ) + { + AssertMsg( "Sound \"" + ref + "\" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); + return; + } + PlaySoundAtPosition( level.zombie_sounds[ref], pos ); +} +play_sound_on_ent( ref ) +{ + if( IsDefined( self.script_soundalias ) ) + { + self PlaySound( self.script_soundalias ); + return; + } + if( IsDefined( self.script_sound ) ) + { + ref = self.script_sound; + } + if( ref == "none" ) + { + return; + } + if( !IsDefined( level.zombie_sounds[ref] ) ) + { + AssertMsg( "Sound \"" + ref + "\" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); + return; + } + self PlaySound( level.zombie_sounds[ref] ); +} +play_loopsound_on_ent( ref ) +{ + if( IsDefined( self.script_firefxsound ) ) + { + ref = self.script_firefxsound; + } + if( ref == "none" ) + { + return; + } + if( !IsDefined( level.zombie_sounds[ref] ) ) + { + AssertMsg( "Sound \"" + ref + "\" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); + return; + } + self PlaySound( level.zombie_sounds[ref] ); +} +string_to_float( string ) +{ + floatParts = strTok( string, "." ); + if ( floatParts.size == 1 ) + return int(floatParts[0]); + whole = int(floatParts[0]); + decimal = 0; + for ( i=floatParts[1].size-1; i>=0; i-- ) + { + decimal = decimal/10 + int(floatParts[1][i])/10; + } + if ( whole >= 0 ) + return (whole + decimal); + else + return (whole - decimal); +} +set_zombie_var( var, value, is_float, column ) +{ + if ( !IsDefined( is_float ) ) + { + is_float = false; + } + if ( !IsDefined(column) ) + { + column = 1; + } + table = "mp/zombiemode.csv"; + table_value = TableLookUp( table, 0, var, column ); + if ( IsDefined( table_value ) && table_value != "" ) + { + if( is_float ) + { + value = float( table_value ); + } + else + { + value = int( table_value ); + } + } + level.zombie_vars[var] = value; + return value; +} +get_table_var( table, var_name, value, is_float, column ) +{ + if ( !IsDefined(table) ) + { + table = "mp/zombiemode.csv"; + } + if ( !IsDefined(is_float) ) + { + is_float = false; + } + if ( !IsDefined(column) ) + { + column = 1; + } + table_value = TableLookUp( table, 0, var_name, column ); + if ( IsDefined( table_value ) && table_value != "" ) + { + if( is_float ) + { + value = string_to_float( table_value ); + } + else + { + value = int( table_value ); + } + } + return value; +} +debug_ui() +{ +} +hudelem_count() +{ +} +debug_round_advancer() +{ +} +print_run_speed( speed ) +{ +} +draw_line_ent_to_ent( ent1, ent2 ) +{ +} +draw_line_ent_to_pos( ent, pos, end_on ) +{ +} +debug_print( msg ) +{ +} +debug_blocker( pos, rad, height ) +{ +} +drawcylinder( pos, rad, height ) +{ +} +print3d_at_pos( msg, pos, thread_endon, offset ) +{ +} +debug_breadcrumbs() +{ +} +debug_attack_spots_taken() +{ + while( 1 ) + { + if( GetDvarInt( #"zombie_debug" ) != 2 ) + { + wait( 1 ); + continue; + } + wait( 0.05 ); + count = 0; + for( i = 0; i < self.attack_spots_taken.size; i++ ) + { + if( self.attack_spots_taken[i] ) + { + count++; + } + } + msg = "" + count + " / " + self.attack_spots_taken.size; + print3d( self.origin, msg ); + } +} +float_print3d( msg, time ) +{ +} +do_player_vo(snd, variation_count) +{ + index = maps\_zombiemode_weapons::get_player_index(self); + sound = "zmb_vox_plr_" + index + "_" + snd; + if(IsDefined (variation_count)) + { + sound = sound + "_" + randomintrange(0, variation_count); + } + if(!isDefined(level.player_is_speaking)) + { + level.player_is_speaking = 0; + } + if (level.player_is_speaking == 0) + { + level.player_is_speaking = 1; + self playsound(sound, "sound_done"); + self waittill("sound_done"); + wait(2); + level.player_is_speaking = 0; + } +} +is_magic_bullet_shield_enabled( ent ) +{ + if( !IsDefined( ent ) ) + return false; + return ( IsDefined( ent.magic_bullet_shield ) && ent.magic_bullet_shield == true ); +} +really_play_2D_sound(sound) +{ + temp_ent = spawn("script_origin", (0,0,0)); + temp_ent playsound (sound, sound + "wait"); + temp_ent waittill (sound + "wait"); + wait(0.05); + temp_ent delete(); +} +play_sound_2D(sound) +{ + level thread really_play_2D_sound(sound); +} +include_weapon( weapon_name, in_box, collector, weighting_func ) +{ + if( !isDefined( in_box ) ) + { + in_box = true; + } + if( !isDefined( collector ) ) + { + collector = false; + } + maps\_zombiemode_weapons::include_zombie_weapon( weapon_name, in_box, collector, weighting_func ); +} +include_powerup( powerup_name ) +{ + maps\_zombiemode_powerups::include_zombie_powerup( powerup_name ); +} +trigger_invisible( enable ) +{ + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + self SetInvisibleToPlayer( players[i], enable ); + } + } +} +print3d_ent( text, color, scale, offset, end_msg, overwrite ) +{ + self endon("death"); + if ( IsDefined(overwrite) && overwrite && IsDefined( self._debug_print3d_msg ) ) + { + self notify( "end_print3d" ); + wait(0.05); + } + self endon("end_print3d"); + if ( !IsDefined(color) ) + { + color = (1,1,1); + } + if ( !IsDefined(scale) ) + { + scale = 1.0; + } + if ( !IsDefined(offset) ) + { + offset = (0,0,0); + } + if ( IsDefined(end_msg) ) + { + self endon(end_msg); + } + self._debug_print3d_msg = text; + while (1) + { + print3d( self.origin+offset, self._debug_print3d_msg, color, scale ); + wait( 0.05 ); + } +} +isExplosiveDamage( meansofdeath ) +{ + explosivedamage = "MOD_GRENADE MOD_GRENADE_SPLASH MOD_PROJECTILE_SPLASH MOD_EXPLOSIVE"; + if( isSubstr( explosivedamage, meansofdeath ) ) + return true; + return false; +} +isPrimaryDamage( meansofdeath ) +{ + if( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) + return true; + return false; +} +isFireDamage( weapon, meansofdeath ) +{ + if ( ( isSubStr( weapon, "flame" ) || isSubStr( weapon, "molotov_" ) || isSubStr( weapon, "napalmblob_" ) ) && ( meansofdeath == "MOD_BURNED" || meansofdeath == "MOD_GRENADE" || meansofdeath == "MOD_GRENADE_SPLASH" ) ) + return true; + return false; +} +isPlayerExplosiveWeapon( weapon, meansofdeath ) +{ + if ( !isExplosiveDamage( meansofdeath ) ) + return false; + if ( weapon == "artillery_mp" ) + return false; + if ( issubstr(weapon, "turret" ) ) + return false; + return true; +} +swap_to_dissolve_models() +{ +} +add_teampot_icon() +{ + flag_wait( "all_players_connected" ); + players = GetPlayers(); + { + self SetCursorHint( "HINT_NOICON" ); + } +} +set_counter( value ) +{ + if ( self.model != level.counter_model[ value ] ) + { + self SetModel( level.counter_model[ value ] ); + } +} +create_counter_hud( x ) +{ + if( !IsDefined( x ) ) + { + x = 0; + } + hud = create_simple_hud(); + hud.alignX = "left"; + hud.alignY = "top"; + hud.horzAlign = "user_left"; + hud.vertAlign = "user_top"; + hud.color = ( 1, 1, 1 ); + hud.fontscale = 32; + hud.x = x; + hud.alpha = 0; + hud SetShader( "hud_chalk_1", 64, 64 ); + return hud; +} +get_current_zone() +{ + flag_wait( "zones_initialized" ); + zkeys = GetArrayKeys( level.zones ); + for( z=0; z 0 ); +} +decrement_is_drinking() +{ + self endon( "death" ); + if( self.is_drinking > 0 ) + { + self.is_drinking--; + } + else + { + AssertMsg( "making is_drinking less than 0" ); + } + if( self.is_drinking == 0 ) + { + self EnableOffhandWeapons(); + self EnableWeaponCycling(); + } +} +clear_is_drinking() +{ + self endon( "death" ); + self.is_drinking = 0; + self EnableOffhandWeapons(); + self EnableWeaponCycling(); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_utility_raven.gsc b/BO1/PC/ZM/maps/_zombiemode_utility_raven.gsc new file mode 100644 index 0000000..1a6e485 Binary files /dev/null and b/BO1/PC/ZM/maps/_zombiemode_utility_raven.gsc differ diff --git a/BO1/PC/ZM/maps/_zombiemode_weap_black_hole_bomb.gsc b/BO1/PC/ZM/maps/_zombiemode_weap_black_hole_bomb.gsc new file mode 100644 index 0000000..9b9920d --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_weap_black_hole_bomb.gsc @@ -0,0 +1,917 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include animscripts\zombie_Utility; +init() +{ + if( !black_hole_bomb_exists() ) + { + return; + } + level black_hole_bomb_anim_init(); + level._effect[ "black_hole_bomb_portal" ] = LoadFX( "maps/zombie/fx_zmb_blackhole_looping" ); + level._effect[ "black_hole_bomb_portal_exit" ] = LoadFX( "maps/zombie/fx_zmb_blackhole_exit" ); + level._effect[ "black_hole_bomb_zombie_soul" ] = LoadFX( "maps/zombie/fx_zmb_blackhole_zombie_death" ); + level._effect[ "black_hole_bomb_zombie_destroy" ] = LoadFX( "maps/zombie/fx_zmb_blackhole_zombie_flare" ); + level._effect[ "black_hole_bomb_zombie_gib" ] = LoadFX( "maps/zombie/fx_zombie_dog_explosion" ); + level._effect[ "black_hole_bomb_event_horizon" ] = LoadFX( "maps/zombie/fx_zmb_blackhole_implode" ); + level._effect[ "black_hole_samantha_steal" ] = LoadFX( "maps/zombie/fx_zmb_blackhole_trap_end" ); + level._effect[ "black_hole_bomb_zombie_pull" ] = LoadFX( "maps/zombie/fx_blackhole_zombie_breakup" ); + level._effect[ "black_hole_bomb_marker_flare" ] = LoadFX( "maps/zombie/fx_zmb_blackhole_flare_marker" ); + PreCacheModel( "t5_bh_bomb_world" ); + level._SCRIPTMOVER_CLIENT_FLAG_BLACKHOLE = 10; + level._ACTOR_CLIENT_FLAG_BLACKHOLE = 10; + level.zombie_death_animscript_override = ::black_hole_bomb_corpse_hide; + level.black_hole_bomb_poi_initial_attract_func = ::black_hole_bomb_initial_attract_func; + level.black_hole_bomb_poi_arrival_attract_func = ::black_hole_bomb_arrival_attract_func; + level._black_hole_bomb_zombies_anim_change = []; + flag_init( "bhb_anim_change_allowed" ); + level thread black_hole_bomb_throttle_anim_changes(); + flag_set( "bhb_anim_change_allowed" ); +} +player_give_black_hole_bomb() +{ + self giveweapon( "zombie_black_hole_bomb" ); + self set_player_tactical_grenade( "zombie_black_hole_bomb" ); + self thread player_handle_black_hole_bomb(); +} +#using_animtree( "zombie_cymbal_monkey" ); +player_handle_black_hole_bomb() +{ + self notify( "starting_black_hole_bomb" ); + self endon( "disconnect" ); + self endon( "starting_black_hole_bomb" ); + attract_dist_diff = level.black_hole_attract_dist_diff; + if( !isDefined( attract_dist_diff ) ) + { + attract_dist_diff = 10; + } + num_attractors = level.num_black_hole_bomb_attractors; + if( !isDefined( num_attractors ) ) + { + num_attractors = 15; + } + max_attract_dist = level.black_hole_bomb_attract_dist; + if( !isDefined( max_attract_dist ) ) + { + max_attract_dist = 2056; + } + while( true ) + { + grenade = get_thrown_black_hole_bomb(); + if( IsDefined( grenade ) ) + { + if( self maps\_laststand::player_is_in_laststand() || is_true( self.intermission ) ) + { + grenade delete(); + continue; + } + grenade hide(); + model = spawn( "script_model", grenade.origin ); + model SetModel( "t5_bh_bomb_world" ); + model linkTo( grenade ); + model.angles = grenade.angles; + info = spawnStruct(); + info.sound_attractors = []; + grenade thread monitor_zombie_groans( info ); + velocitySq = 10000*10000; + oldPos = grenade.origin; + while( velocitySq != 0 ) + { + wait( 0.05 ); + if( !isDefined( grenade ) ) + { + break; + } + velocitySq = distanceSquared( grenade.origin, oldPos ); + oldPos = grenade.origin; + } + if( isDefined( grenade ) ) + { + self thread black_hole_bomb_kill_counter( grenade ); + model unlink(); + model.origin = grenade.origin; + model.angles = grenade.angles; + model._black_hole_bomb_player = self; + model.targetname = "zm_bhb"; + model._new_ground_trace = true; + grenade resetmissiledetonationtime(); + if ( IsDefined( level.black_hole_bomb_loc_check_func ) ) + { + if ( [[ level.black_hole_bomb_loc_check_func ]]( grenade, model, info ) ) + { + continue; + } + } + if ( IsDefined( level._blackhole_bomb_valid_area_check ) ) + { + if ( [[ level._blackhole_bomb_valid_area_check ]]( grenade, model, self ) ) + { + continue; + } + } + valid_poi = check_point_in_active_zone( grenade.origin ); + if(valid_poi) + { + level thread black_hole_bomb_cleanup( grenade, model ); + if( IsDefined( level._black_hole_bomb_poi_override ) ) + { + model thread [[level._black_hole_bomb_poi_override]](); + } + model create_zombie_point_of_interest( max_attract_dist, num_attractors, 0, true, level.black_hole_bomb_poi_initial_attract_func, level.black_hole_bomb_poi_arrival_attract_func ); + model SetClientFlag( level._SCRIPTMOVER_CLIENT_FLAG_BLACKHOLE ); + grenade thread do_black_hole_bomb_sound( model, info ); + level thread black_hole_bomb_teleport_init( grenade ); + grenade.is_valid = true; + } + else + { + self.script_noteworthy = undefined; + level thread black_hole_bomb_stolen_by_sam( self, model ); + } + } + else + { + self.script_noteworthy = undefined; + level thread black_hole_bomb_stolen_by_sam( self, model ); + } + } + wait( 0.05 ); + } +} +wait_for_attractor_positions_complete() +{ + self waittill( "attractor_positions_generated" ); + self.attract_to_origin = false; +} +black_hole_bomb_cleanup( parent, model ) +{ + model endon( "sam_stole_it" ); + grenade_org = parent.origin; + while( true ) + { + if( !IsDefined( parent ) ) + { + if( IsDefined( model ) ) + { + model Delete(); + wait_network_frame(); + } + break; + } + wait( 0.05 ); + } + level thread black_hole_bomb_corpse_collect( grenade_org ); +} +black_hole_bomb_corpse_collect( vec_origin ) +{ + wait( 0.1 ); + corpse_array = GetCorpseArray(); + for( i = 0; i < corpse_array.size; i++ ) + { + if( DistanceSquared( corpse_array[i].origin, vec_origin ) < 192*192 ) + { + corpse_array[i] thread black_hole_bomb_corpse_delete(); + } + } +} +black_hole_bomb_corpse_delete() +{ + self Delete(); +} +do_black_hole_bomb_sound( model, info ) +{ + monk_scream_vox = false; + if( level.music_override == false ) + { + monk_scream_vox = false; + } + self playsound ("wpn_gersh_device_exp"); + self playloopsound ("wpn_gersh_device_loop_close"); + fakeorigin = self.origin; + self waittill( "explode", position ); + playsoundatposition ("wpn_gersh_device_implode", fakeorigin); + if( isDefined( model ) ) + { + } + for( i = 0; i < info.sound_attractors.size; i++ ) + { + if( isDefined( info.sound_attractors[i] ) ) + { + info.sound_attractors[i] notify( "black_hole_bomb_blown_up" ); + } + } + if( !monk_scream_vox ) + { + play_sound_in_space( "zmb_vox_monkey_explode", position ); + } +} +get_thrown_black_hole_bomb() +{ + self endon( "disconnect" ); + self endon( "starting_black_hole_bomb" ); + while( true ) + { + self waittill( "grenade_fire", grenade, weapName ); + if( weapName == "zombie_black_hole_bomb" ) + { + return grenade; + } + wait( 0.05 ); + } +} +monitor_zombie_groans( info ) +{ + self endon( "explode" ); + while( true ) + { + if( !isDefined( self ) ) + { + return; + } + if( !isDefined( self.attractor_array ) ) + { + wait( 0.05 ); + continue; + } + for( i = 0; i < self.attractor_array.size; i++ ) + { + if( array_check_for_dupes( info.sound_attractors, self.attractor_array[i] ) ) + { + if ( isDefined( self.origin ) && isDefined( self.attractor_array[i].origin ) ) + { + if( distanceSquared( self.origin, self.attractor_array[i].origin ) < 500 * 500 ) + { + info.sound_attractors = array_add( info.sound_attractors, self.attractor_array[i] ); + self.attractor_array[i] thread play_zombie_groans(); + } + } + } + } + wait( 0.05 ); + } +} +play_zombie_groans() +{ + self endon( "death" ); + self endon( "black_hole_bomb_blown_up" ); + while(1) + { + if( isdefined ( self ) ) + { + self playsound( "zmb_vox_zombie_groan" ); + wait randomfloatrange( 2, 3 ); + } + else + { + return; + } + } +} +black_hole_bomb_exists() +{ + return IsDefined( level.zombie_weapons["zombie_black_hole_bomb"] ); +} +black_hole_bomb_initial_attract_func( ent_poi ) +{ + self endon( "death" ); + if( IsDefined( self.pre_black_hole_bomb_run_combatanim ) ) + { + return; + } + if( IsDefined( self.script_string ) && self.script_string == "riser" ) + { + while( is_true( self.in_the_ground ) ) + { + wait( 0.05 ); + } + } + soul_spark_end = ent_poi.origin; + soul_burst_range = 50*50; + pulled_in_range = 128*128; + inner_range = 1024*1024; + outer_edge = 2056*2056; + distance_to_black_hole = 100000*100000; + self._distance_to_black_hole = 100000*100000; + self._black_hole_bomb_collapse_death = 0; + self._black_hole_attract_walk = 0; + self._black_hole_attract_run = 0; + self._current_black_hole_bomb_origin = ent_poi.origin; + self._normal_run_blend_time = 0.2; + self._black_hole_bomb_tosser = ent_poi._black_hole_bomb_player; + self._black_hole_bomb_being_pulled_in_fx = 0; + self.deathanim = self black_hole_bomb_death_while_attracted(); + if( !IsDefined( self._bhb_ent_flag_init ) ) + { + self ent_flag_init( "bhb_anim_change" ); + self._bhb_ent_flag_init = 1; + } + self.pre_black_hole_bomb_run_combatanim = self black_hole_bomb_store_movement_anim(); + if( IsDefined( level._black_hole_attract_override ) ) + { + level [ [ level._black_hole_attract_override ] ](); + } + while( IsDefined( ent_poi ) ) + { + self._distance_to_black_hole = DistanceSquared( self.origin, self._current_black_hole_bomb_origin ); + if( self._black_hole_attract_walk == 0 && ( self._distance_to_black_hole < outer_edge && self._distance_to_black_hole > inner_range ) ) + { + if( IsDefined( self._bhb_walk_attract ) ) + { + self [[ self._bhb_walk_attract ]](); + } + else + { + self black_hole_bomb_attract_walk(); + } + } + if( self._black_hole_attract_run == 0 && ( self._distance_to_black_hole < inner_range && self._distance_to_black_hole > pulled_in_range ) ) + { + if( IsDefined( self._bhb_run_attract ) ) + { + self [[ self._bhb_run_attract ]](); + } + else + { + self black_hole_bomb_attract_run(); + } + } + if( ( self._distance_to_black_hole < pulled_in_range ) && ( self._distance_to_black_hole > soul_burst_range ) ) + { + self._black_hole_bomb_collapse_death = 1; + if( IsDefined( self._bhb_horizon_death ) ) + { + self [[ self._bhb_horizon_death ]]( self._current_black_hole_bomb_origin, ent_poi ); + } + else + { + self black_hole_bomb_event_horizon_death( self._current_black_hole_bomb_origin, ent_poi ); + } + } + if( self._distance_to_black_hole < soul_burst_range ) + { + self._black_hole_bomb_collapse_death = 1; + if( IsDefined( self._bhb_horizon_death ) ) + { + self [[ self._bhb_horizon_death ]]( self._current_black_hole_bomb_origin, ent_poi ); + } + else + { + self black_hole_bomb_event_horizon_death( self._current_black_hole_bomb_origin, ent_poi ); + } + } + wait( 0.1 ); + } + self thread black_hole_bomb_escaped_zombie_reset(); +} +black_hole_bomb_store_movement_anim() +{ + self endon( "death" ); + current_anim = self.run_combatanim; + anim_keys = GetArrayKeys( level.scr_anim[self.animname] ); + for( j = 0; j < anim_keys.size; j++ ) + { + if( level.scr_anim[ self.animname ][ anim_keys[j] ] == current_anim ) + { + return anim_keys[j]; + } + } + AssertMsg( "couldn't find zombie run anim in the array keys" ); +} +black_hole_bomb_being_pulled_fx() +{ + self endon( "death" ); + wait_network_frame(); + self SetClientFlag( level._ACTOR_CLIENT_FLAG_BLACKHOLE ); + self._black_hole_bomb_being_pulled_in_fx = 1; +} +black_hole_bomb_attract_walk() +{ + self endon( "death" ); + flag_wait( "bhb_anim_change_allowed" ); + level._black_hole_bomb_zombies_anim_change = add_to_array( level._black_hole_bomb_zombies_anim_change, self, false ); + self ent_flag_wait( "bhb_anim_change" ); + self.a.runBlendTime = 0.9; + self clear_run_anim(); + if( self.has_legs ) + { + rand = RandomIntRange( 1, 4 ); + self.needs_run_update = true; + self._had_legs = true; + self set_run_anim( "slow_pull_"+rand ); + self.run_combatanim = level.scr_anim["zombie"]["slow_pull_"+rand]; + self.crouchRunAnim = level.scr_anim["zombie"]["slow_pull_"+rand]; + self.crouchrun_combatanim = level.scr_anim["zombie"]["slow_pull_"+rand]; + } + else + { + rand = RandomIntRange( 1, 3 ); + self.needs_run_update = true; + self._had_legs = false; + self set_run_anim( "crawler_slow_pull_"+rand ); + self.run_combatanim = level.scr_anim["zombie"]["crawler_slow_pull_"+rand]; + self.crouchRunAnim = level.scr_anim["zombie"]["crawler_slow_pull_"+rand]; + self.crouchrun_combatanim = level.scr_anim["zombie"]["crawler_slow_pull_"+rand]; + } + self._black_hole_attract_walk = 1; + self._bhb_change_anim_notified = 1; + self.a.runBlendTime = self._normal_run_blend_time; +} +black_hole_bomb_attract_run() +{ + self endon( "death" ); + rand = RandomIntRange( 1, 4 ); + flag_wait( "bhb_anim_change_allowed" ); + level._black_hole_bomb_zombies_anim_change = add_to_array( level._black_hole_bomb_zombies_anim_change, self, false ); + self ent_flag_wait( "bhb_anim_change" ); + self.a.runBlendTime = 0.9; + self clear_run_anim(); + if( self.has_legs ) + { + self.needs_run_update = true; + self set_run_anim( "fast_pull_" + rand ); + self.run_combatanim = level.scr_anim["zombie"]["fast_pull_" + rand]; + self.crouchRunAnim = level.scr_anim["zombie"]["fast_pull_" + rand]; + self.crouchrun_combatanim = level.scr_anim["zombie"]["fast_pull_" + rand]; + } + else + { + self.needs_run_update = true; + self set_run_anim( "crawler_fast_pull_" + rand ); + self.run_combatanim = level.scr_anim["zombie"]["crawler_fast_pull_" + rand]; + self.crouchRunAnim = level.scr_anim["zombie"]["crawler_fast_pull_" + rand]; + self.crouchrun_combatanim = level.scr_anim["zombie"]["crawler_fast_pull_" + rand]; + } + self._black_hole_attract_run = 1; + self._bhb_change_anim_notified = 1; + self.a.runBlendTime = self._normal_run_blend_time; +} +black_hole_bomb_death_anim() +{ + self endon( "death" ); + flt_moveto_time = 0.7; + rand = RandomIntRange( 1, 4 ); + if( self.has_legs ) + { + death_animation = level.scr_anim[ self.animname ][ "black_hole_death_"+rand ]; + } + else + { + death_animation = level.scr_anim[ self.animname ][ "crawler_black_hole_death_"+rand ]; + } + return death_animation; +} +black_hole_bomb_death_while_attracted() +{ + self endon( "death" ); + death_animation = undefined; + rand = RandomIntRange( 1, 5 ); + if( self.has_legs ) + { + death_animation = level.scr_anim[ self.animname ][ "attracted_death_" + rand ]; + } + return death_animation; +} +black_hole_bomb_arrival_attract_func( ent_poi ) +{ + self endon( "death" ); + self endon( "zombie_acquire_enemy" ); + self endon( "path_timer_done" ); + soul_spark_end = ent_poi.origin; + self waittill( "goal" ); + if( IsDefined( self._bhb_horizon_death ) ) + { + self [[ self._bhb_horizon_death ]]( self._current_black_hole_bomb_origin, ent_poi ); + } + else + { + self black_hole_bomb_event_horizon_death( self._current_black_hole_bomb_origin, ent_poi ); + } +} +black_hole_bomb_event_horizon_death( vec_black_hole_org, grenade ) +{ + self endon( "death" ); + self maps\_zombiemode_spawner::zombie_eye_glow_stop(); + self playsound ("wpn_gersh_device_kill"); + pulled_in_anim = black_hole_bomb_death_anim(); + self AnimScripted( "pulled_in_complete", self.origin, self.angles, pulled_in_anim ); + self waittill_either( "bhb_burst", "pulled_in_complete" ); + PlayFXOnTag( level._effect[ "black_hole_bomb_zombie_destroy" ], self, "tag_origin" ); + grenade notify( "black_hole_bomb_kill" ); + self DoDamage( self.health + 50, self.origin + ( 0, 0, 50 ), self._black_hole_bomb_tosser, "zombie_black_hole_bomb", "MOD_CRUSH" ); +} +black_hole_bomb_corpse_hide() +{ + if( IsDefined( self._black_hole_bomb_collapse_death ) && self._black_hole_bomb_collapse_death == 1 ) + { + PlayFXOnTag( level._effect[ "black_hole_bomb_zombie_gib" ], self, "tag_origin" ); + self Hide(); + } + if( IsDefined( self._black_hole_bomb_being_pulled_in_fx ) && self._black_hole_bomb_being_pulled_in_fx == 1 ) + { + } +} +black_hole_bomb_escaped_zombie_reset() +{ + self endon( "death" ); + flag_wait( "bhb_anim_change_allowed" ); + level._black_hole_bomb_zombies_anim_change = add_to_array( level._black_hole_bomb_zombies_anim_change, self, false ); + self ent_flag_wait( "bhb_anim_change" ); + self.a.runBlendTime = 0.9; + self clear_run_anim(); + self.needs_run_update = true; + if( !self.has_legs ) + { + legless_walk_anims = []; + legless_walk_anims = add_to_array( legless_walk_anims, "crawl1", false ); + legless_walk_anims = add_to_array( legless_walk_anims, "crawl5", false ); + legless_walk_anims = add_to_array( legless_walk_anims, "crawl_hand_1", false ); + legless_walk_anims = add_to_array( legless_walk_anims, "crawl_hand_2", false ); + rand_walk_anim = RandomInt( legless_walk_anims.size ); + legless_sprint_anims = []; + legless_sprint_anims = add_to_array( legless_sprint_anims, "crawl2", false ); + legless_sprint_anims = add_to_array( legless_sprint_anims, "crawl3", false ); + legless_sprint_anims = add_to_array( legless_sprint_anims, "crawl_sprint1", false ); + rand_sprint_anim = RandomInt( legless_sprint_anims.size ); + if( self.zombie_move_speed == "walk" ) + { + self set_run_anim( legless_walk_anims[ rand_walk_anim ] ); + self.run_combatanim = level.scr_anim[ self.animname ][ legless_walk_anims[ rand_walk_anim ] ]; + self.crouchRunAnim = level.scr_anim[ self.animname ][ legless_walk_anims[ rand_walk_anim ] ]; + self.crouchrun_combatanim = level.scr_anim[ self.animname ][ legless_walk_anims[ rand_walk_anim ] ]; + } + else if( self.zombie_move_speed == "run" ) + { + self set_run_anim( "crawl4" ); + self.run_combatanim = level.scr_anim[ self.animname ][ "crawl4" ]; + self.crouchRunAnim = level.scr_anim[ self.animname ][ "crawl4" ]; + self.crouchrun_combatanim = level.scr_anim[ self.animname ][ "crawl4" ]; + } + else if( self.zombie_move_speed == "sprint" ) + { + self set_run_anim( legless_sprint_anims[ rand_sprint_anim ] ); + self.run_combatanim = level.scr_anim[ self.animname ][ legless_sprint_anims[ rand_sprint_anim ] ]; + self.crouchRunAnim = level.scr_anim[ self.animname ][ legless_sprint_anims[ rand_sprint_anim ] ]; + self.crouchrun_combatanim = level.scr_anim[ self.animname ][ legless_sprint_anims[ rand_sprint_anim ] ]; + } + else + { + self set_run_anim( "crawl4" ); + self.run_combatanim = level.scr_anim[ self.animname ][ "crawl4" ]; + self.crouchRunAnim = level.scr_anim[ self.animname ][ "crawl4" ]; + self.crouchrun_combatanim = level.scr_anim[ self.animname ][ "crawl4" ]; + } + } + else + { + self set_run_anim( self.pre_black_hole_bomb_run_combatanim ); + self.run_combatanim = level.scr_anim[ self.animname ][ self.pre_black_hole_bomb_run_combatanim ]; + self.crouchRunAnim = level.scr_anim[ self.animname ][ self.pre_black_hole_bomb_run_combatanim ]; + self.crouchrun_combatanim = level.scr_anim[ self.animname ][ self.pre_black_hole_bomb_run_combatanim ]; + } + self.pre_black_hole_bomb_run_combatanim = undefined; + self._black_hole_attract_walk = 0; + self._black_hole_attract_run = 0; + self._bhb_change_anim_notified = 1; + self._black_hole_bomb_being_pulled_in_fx = 0; + self.a.runBlendTime = self._normal_run_blend_time; + which_anim = RandomInt( 10 ); + if( self.has_legs ) + { + if( which_anim > 5 ) + { + self.deathanim = level.scr_anim[self.animname]["death1"]; + } + else + { + self.deathanim = level.scr_anim[self.animname]["death2"]; + } + } + else + { + if( which_anim > 5 ) + { + self.deathanim = level.scr_anim[self.animname]["death3"]; + } + else + { + self.deathanim = level.scr_anim[self.animname]["death4"]; + } + } + self._had_legs = undefined; + self._bhb_ent_flag_init = 0; +} +black_hole_bomb_throttle_anim_changes() +{ + if( !IsDefined( level._black_hole_bomb_zombies_anim_change ) ) + { + level._black_hole_bomb_zombies_anim_change = []; + } + int_max_num_zombies_per_frame = 7; + array_zombies_allowed_to_switch = []; + while( IsDefined( level._black_hole_bomb_zombies_anim_change ) ) + { + if( level._black_hole_bomb_zombies_anim_change.size == 0 ) + { + wait( 0.1 ); + continue; + } + array_zombies_allowed_to_switch = level._black_hole_bomb_zombies_anim_change; + for( i = 0; i < array_zombies_allowed_to_switch.size; i++ ) + { + if( IsDefined( array_zombies_allowed_to_switch[i] ) && + IsAlive( array_zombies_allowed_to_switch[i] ) ) + { + array_zombies_allowed_to_switch[i] ent_flag_set( "bhb_anim_change" ); + } + if( i >= int_max_num_zombies_per_frame ) + { + break; + } + } + flag_clear( "bhb_anim_change_allowed" ); + for( i = 0; i < array_zombies_allowed_to_switch.size; i++ ) + { + if( !IsDefined( array_zombies_allowed_to_switch[i]._bhb_ent_flag_init ) ) + { + array_zombies_allowed_to_switch[i] ent_flag_init( "bhb_anim_change" ); + array_zombies_allowed_to_switch[i]._bhb_ent_flag_init = 1; + } + if( array_zombies_allowed_to_switch[i] ent_flag( "bhb_anim_change" ) ) + { + level._black_hole_bomb_zombies_anim_change = array_remove( level._black_hole_bomb_zombies_anim_change, array_zombies_allowed_to_switch[i] ); + } + } + level._black_hole_bomb_zombies_anim_change = array_removedead( level._black_hole_bomb_zombies_anim_change ); + level._black_hole_bomb_zombies_anim_change = array_removeundefined( level._black_hole_bomb_zombies_anim_change ); + flag_set( "bhb_anim_change_allowed" ); + wait_network_frame(); + wait( 0.1 ); + } +} +black_hole_bomb_teleport_init( ent_grenade ) +{ + if( !IsDefined( ent_grenade ) ) + { + return; + } + teleport_trigger = Spawn( "trigger_radius", ent_grenade.origin, 0, 64, 70 ); + ent_grenade thread black_hole_bomb_trigger_monitor( teleport_trigger ); + ent_grenade waittill( "explode" ); + teleport_trigger notify( "black_hole_complete" ); + wait( 0.1 ); + teleport_trigger Delete(); +} +black_hole_bomb_trigger_monitor( ent_trigger ) +{ + ent_trigger endon( "black_hole_complete" ); + while( 1 ) + { + ent_trigger waittill( "trigger", ent_player ); + if( IsPlayer( ent_player ) && !ent_player IsOnGround() && !is_true( ent_player.lander ) ) + { + ent_trigger thread black_hole_teleport_trigger_thread( ent_player, ::black_hole_time_before_teleport, ::black_hole_teleport_cancel ); + } + wait( 0.1 ); + } +} +black_hole_time_before_teleport( ent_player, str_endon ) +{ + ent_player endon( str_endon ); + if( !BulletTracePassed( ent_player GetEye(), self.origin + ( 0, 0, 65 ) , false, ent_player ) ) + { + return; + } + black_hole_teleport_structs = getstructarray( "struct_black_hole_teleport", "targetname" ); + chosen_spot = undefined; + if(isDefined(level._special_blackhole_bomb_structs)) + { + black_hole_teleport_structs = [[level._special_blackhole_bomb_structs]](); + } + if( !IsDefined( black_hole_teleport_structs ) || black_hole_teleport_structs.size == 0 ) + { + return; + } + black_hole_teleport_structs = array_randomize( black_hole_teleport_structs ); + if(isDefined(level._override_blackhole_destination_logic)) + { + chosen_spot = [[level._override_blackhole_destination_logic]](black_hole_teleport_structs,ent_player); + } + else + { + for( i = 0; i < black_hole_teleport_structs.size; i++ ) + { + if( check_point_in_active_zone( black_hole_teleport_structs[i].origin ) && + ( ent_player get_current_zone() != black_hole_teleport_structs[i].script_string ) ) + { + chosen_spot = black_hole_teleport_structs[i]; + break; + } + } + } + if( IsDefined( chosen_spot ) ) + { + self PlaySound( "zmb_gersh_teleporter_out" ); + ent_player thread black_hole_teleport( chosen_spot ); + } +} +black_hole_teleport_cancel( ent_player ) +{ +} +black_hole_teleport( struct_dest ) +{ + self endon( "death" ); + if( !IsDefined( struct_dest ) ) + { + return; + } + prone_offset = (0, 0, 49); + crouch_offset = (0, 0, 20); + stand_offset = (0, 0, 0); + destination = undefined; + if( self GetStance() == "prone" ) + { + destination = struct_dest.origin + prone_offset; + } + else if( self GetStance() == "crouch" ) + { + destination = struct_dest.origin + crouch_offset; + } + else + { + destination = struct_dest.origin + stand_offset; + } + if( IsDefined( level._black_hole_teleport_override ) ) + { + level [[ level._black_hole_teleport_override ]]( self ); + } + black_hole_bomb_create_exit_portal( struct_dest.origin ); + self FreezeControls( true ); + self DisableOffhandWeapons(); + self DisableWeapons(); + self DontInterpolate(); + self SetOrigin( destination ); + self SetPlayerAngles( struct_dest.angles ); + self EnableOffhandWeapons(); + self EnableWeapons(); + self FreezeControls( false ); + self thread slightly_delayed_player_response(); +} +slightly_delayed_player_response() +{ + wait(1); + self maps\_zombiemode_audio::create_and_play_dialog( "general", "teleport_gersh" ); +} +black_hole_teleport_trigger_thread( ent, on_enter_payload, on_exit_payload ) +{ + ent endon("death"); + self endon( "black_hole_complete" ); + if( ent black_hole_teleport_ent_already_in_trigger( self ) ) + { + return; + } + self black_hole_teleport_add_trigger_to_ent( ent ); + endon_condition = "leave_trigger_" + self GetEntityNumber(); + if( IsDefined( on_enter_payload ) ) + { + self thread [[ on_enter_payload ]]( ent, endon_condition ); + } + while( IsDefined( ent ) && ent IsTouching( self ) && IsDefined( self ) ) + { + wait( 0.01 ); + } + ent notify( endon_condition ); + if( IsDefined( ent ) && IsDefined( on_exit_payload ) ) + { + self thread [[on_exit_payload]]( ent ); + } + if( IsDefined( ent ) ) + { + self black_hole_teleport_remove_trigger_from_ent( ent ); + } +} +black_hole_teleport_add_trigger_to_ent(ent) +{ + if(!IsDefined(ent._triggers)) + { + ent._triggers = []; + } + ent._triggers[self GetEntityNumber()] = 1; +} +black_hole_teleport_remove_trigger_from_ent(ent) +{ + if(!IsDefined(ent._triggers)) + return; + if(!IsDefined(ent._triggers[self GetEntityNumber()])) + return; + ent._triggers[self GetEntityNumber()] = 0; +} +black_hole_teleport_ent_already_in_trigger(trig) +{ + if(!IsDefined(self._triggers)) + return false; + if(!IsDefined(self._triggers[trig GetEntityNumber()])) + return false; + if(!self._triggers[trig GetEntityNumber()]) + return false; + return true; +} +black_hole_bomb_kill_counter( grenade ) +{ + self endon( "death" ); + grenade endon( "death" ); + kill_count = 0; + for ( ;; ) + { + grenade waittill( "black_hole_bomb_kill" ); + kill_count++; + if( kill_count == 4 ) + { + self maps\_zombiemode_audio::create_and_play_dialog( "kill", "gersh_device" ); + } + if ( 5 <= kill_count ) + { + self notify( "black_hole_kills_achievement" ); + } + } +} +black_hole_bomb_create_exit_portal( pos ) +{ + exit_portal_fx_spot = Spawn( "script_model", pos ); + exit_portal_fx_spot SetModel( "tag_origin" ); + PlayFXOnTag( level._effect[ "black_hole_bomb_portal_exit" ], exit_portal_fx_spot, "tag_origin" ); + exit_portal_fx_spot thread black_hole_bomb_exit_clean_up(); + exit_portal_fx_spot PlaySound( "zmb_gersh_teleporter_go" ); +} +black_hole_bomb_exit_clean_up() +{ + wait( 4.0 ); + self Delete(); +} +black_hole_bomb_stolen_by_sam( ent_grenade, ent_model ) +{ + if( !IsDefined( ent_model ) ) + { + return; + } + direction = ent_model.origin; + direction = (direction[1], direction[0], 0); + if(direction[1] < 0 || (direction[0] > 0 && direction[1] > 0)) + { + direction = (direction[0], direction[1] * -1, 0); + } + else if(direction[0] < 0) + { + direction = (direction[0] * -1, direction[1], 0); + } + players = GetPlayers(); + for( i = 0; i < players.size; i++ ) + { + if( IsAlive( players[i] ) ) + { + if( is_true( level.player_4_vox_override ) ) + { + players[i] playlocalsound( "zmb_laugh_rich" ); + } + else + { + players[i] playlocalsound( "zmb_laugh_child" ); + } + } + } + PlayFXOnTag( level._effect[ "black_hole_samantha_steal" ], ent_model, "tag_origin" ); + ent_model MoveZ( 60, 1.0, 0.25, 0.25 ); + ent_model Vibrate( direction, 1.5, 2.5, 1.0 ); + ent_model waittill( "movedone" ); + ent_model Delete(); +} +#using_animtree( "generic_human" ); +black_hole_bomb_anim_init() +{ + if(isDefined(level._use_extra_blackhole_anims)) + { + [[level._use_extra_blackhole_anims]](); + } + level.scr_anim["zombie"]["slow_pull_1"] = %ai_zombie_blackhole_walk_slow_v1; + level.scr_anim["zombie"]["slow_pull_2"] = %ai_zombie_blackhole_walk_slow_v2; + level.scr_anim["zombie"]["slow_pull_3"] = %ai_zombie_blackhole_walk_slow_v3; + level.scr_anim["zombie"]["fast_pull_1"] = %ai_zombie_blackhole_walk_fast_v1; + level.scr_anim["zombie"]["fast_pull_2"] = %ai_zombie_blackhole_walk_fast_v2; + level.scr_anim["zombie"]["fast_pull_3"] = %ai_zombie_blackhole_walk_fast_v3; + level.scr_anim["zombie"]["black_hole_death_1"] = %ai_zombie_blackhole_death_v1; + level.scr_anim["zombie"]["black_hole_death_2"] = %ai_zombie_blackhole_death_v2; + level.scr_anim["zombie"]["black_hole_death_3"] = %ai_zombie_blackhole_death_v3; + level.scr_anim["zombie"]["crawler_slow_pull_1"] = %ai_zombie_blackhole_crawl_slow_v1; + level.scr_anim["zombie"]["crawler_slow_pull_2"] = %ai_zombie_blackhole_crawl_slow_v2; + level.scr_anim["zombie"]["crawler_fast_pull_1"] = %ai_zombie_blackhole_crawl_fast_v1; + level.scr_anim["zombie"]["crawler_fast_pull_2"] = %ai_zombie_blackhole_crawl_fast_v2; + level.scr_anim["zombie"]["crawler_fast_pull_3"] = %ai_zombie_blackhole_crawl_fast_v3; + level.scr_anim["zombie"]["crawler_black_hole_death_1"] =%ai_zombie_blackhole_crawl_death_v1; + level.scr_anim["zombie"]["crawler_black_hole_death_2"] =%ai_zombie_blackhole_crawl_death_v2; + level.scr_anim["zombie"]["crawler_black_hole_death_3"] =%ai_zombie_blackhole_crawl_death_v3; + level.scr_anim[ "zombie" ][ "attracted_death_1" ] = %ai_zombie_blackhole_death_preburst_v1; + level.scr_anim[ "zombie" ][ "attracted_death_2" ] = %ai_zombie_blackhole_death_preburst_v2; + level.scr_anim[ "zombie" ][ "attracted_death_3" ] = %ai_zombie_blackhole_death_preburst_v3; + level.scr_anim[ "zombie" ][ "attracted_death_4" ] = %ai_zombie_blackhole_death_preburst_v4; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_weap_crossbow.gsc b/BO1/PC/ZM/maps/_zombiemode_weap_crossbow.gsc new file mode 100644 index 0000000..bd93f46 Binary files /dev/null and b/BO1/PC/ZM/maps/_zombiemode_weap_crossbow.gsc differ diff --git a/BO1/PC/ZM/maps/_zombiemode_weap_cymbal_monkey.gsc b/BO1/PC/ZM/maps/_zombiemode_weap_cymbal_monkey.gsc new file mode 100644 index 0000000..fc40c6b Binary files /dev/null and b/BO1/PC/ZM/maps/_zombiemode_weap_cymbal_monkey.gsc differ diff --git a/BO1/PC/ZM/maps/_zombiemode_weap_freezegun.gsc b/BO1/PC/ZM/maps/_zombiemode_weap_freezegun.gsc new file mode 100644 index 0000000..12e06eb --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_weap_freezegun.gsc @@ -0,0 +1,428 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#using_animtree( "generic_human" ); +init() +{ + if ( !maps\_zombiemode_weapons::is_weapon_included( "freezegun_zm" ) ) + { + return; + } + level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_EXTREMITY_DAMAGE_FX = 15; + level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_TORSO_DAMAGE_FX = 14; + set_zombie_var( "freezegun_cylinder_radius", 120 ); + set_zombie_var( "freezegun_inner_range", 60 ); + set_zombie_var( "freezegun_outer_range", 600 ); + set_zombie_var( "freezegun_inner_damage", 1000 ); + set_zombie_var( "freezegun_outer_damage", 500 ); + set_zombie_var( "freezegun_shatter_range", 180 ); + set_zombie_var( "freezegun_shatter_inner_damage", 500 ); + set_zombie_var( "freezegun_shatter_outer_damage", 250 ); + set_zombie_var( "freezegun_cylinder_radius_upgraded", 180 ); + set_zombie_var( "freezegun_inner_range_upgraded", 120 ); + set_zombie_var( "freezegun_outer_range_upgraded", 900 ); + set_zombie_var( "freezegun_inner_damage_upgraded", 1500 ); + set_zombie_var( "freezegun_outer_damage_upgraded", 750 ); + set_zombie_var( "freezegun_shatter_range_upgraded", 300 ); + set_zombie_var( "freezegun_shatter_inner_damage_upgraded", 750 ); + set_zombie_var( "freezegun_shatter_outer_damage_upgraded", 500 ); + level._effect[ "freezegun_shatter" ] = LoadFX( "weapon/freeze_gun/fx_freezegun_shatter" ); + level._effect[ "freezegun_crumple" ] = LoadFX( "weapon/freeze_gun/fx_freezegun_crumple" ); + level._effect[ "freezegun_smoke_cloud" ] = loadfx( "weapon/freeze_gun/fx_freezegun_smoke_cloud" ); + level._effect[ "freezegun_damage_torso" ] = LoadFX( "maps/zombie/fx_zombie_freeze_torso" ); + level._effect[ "freezegun_damage_sm" ] = LoadFX( "maps/zombie/fx_zombie_freeze_md" ); + level._effect[ "freezegun_shatter_upgraded" ] = LoadFX( "weapon/freeze_gun/fx_exp_freezegun_impact" ); + level._effect[ "freezegun_crumple_upgraded" ] = LoadFX( "weapon/freeze_gun/fx_exp_freezegun_impact" ); + level._effect[ "freezegun_shatter_gib_fx" ] = LoadFX( "weapon/bullet/fx_flesh_gib_fatal_01" ); + level._effect[ "freezegun_shatter_gibtrail_fx" ] = LoadFX( "weapon/freeze_gun/fx_trail_freezegun_blood_streak" ); + level._effect[ "freezegun_crumple_gib_fx" ] = LoadFX( "system_elements/fx_null" ); + level._effect[ "freezegun_crumple_gibtrail_fx" ] = LoadFX( "system_elements/fx_null" ); + level thread freezegun_on_player_connect(); +} +freezegun_on_player_connect() +{ + for( ;; ) + { + level waittill( "connecting", player ); + player thread wait_for_thundergun_fired(); + } +} +wait_for_thundergun_fired() +{ + self endon( "disconnect" ); + self waittill( "spawned_player" ); + for( ;; ) + { + self waittill( "weapon_fired" ); + currentweapon = self GetCurrentWeapon(); + if( ( currentweapon == "freezegun_zm" ) || ( currentweapon == "freezegun_upgraded_zm" ) ) + { + self thread freezegun_fired( currentweapon == "freezegun_upgraded_zm" ); + view_pos = self GetTagOrigin( "tag_flash" ) - self GetPlayerViewHeight(); + view_angles = self GetTagAngles( "tag_flash" ); + playfx( level._effect["freezegun_smoke_cloud"], view_pos, AnglesToForward( view_angles ), AnglesToUp( view_angles ) ); + } + } +} +freezegun_fired( upgraded ) +{ + if ( !IsDefined( level.freezegun_enemies ) ) + { + level.freezegun_enemies = []; + level.freezegun_enemies_dist_ratio = []; + } + self freezegun_get_enemies_in_range( upgraded ); + for ( i = 0; i < level.freezegun_enemies.size; i++ ) + { + level.freezegun_enemies[i] thread freezegun_do_damage( upgraded, self, level.freezegun_enemies_dist_ratio[i] ); + } + level.freezegun_enemies = []; + level.freezegun_enemies_dist_ratio = []; +} +freezegun_get_cylinder_radius( upgraded ) +{ + if ( upgraded ) + { + return level.zombie_vars["freezegun_cylinder_radius_upgraded"]; + } + else + { + return level.zombie_vars["freezegun_cylinder_radius"]; + } +} +freezegun_get_inner_range( upgraded ) +{ + if ( upgraded ) + { + return level.zombie_vars["freezegun_inner_range_upgraded"]; + } + else + { + return level.zombie_vars["freezegun_inner_range"]; + } +} +freezegun_get_outer_range( upgraded ) +{ + if ( upgraded ) + { + return level.zombie_vars["freezegun_outer_range_upgraded"]; + } + else + { + return level.zombie_vars["freezegun_outer_range"]; + } +} +freezegun_get_inner_damage( upgraded ) +{ + if ( upgraded ) + { + return level.zombie_vars["freezegun_inner_damage_upgraded"]; + } + else + { + return level.zombie_vars["freezegun_inner_damage"]; + } +} +freezegun_get_outer_damage( upgraded ) +{ + if ( upgraded ) + { + return level.zombie_vars["freezegun_outer_damage_upgraded"]; + } + else + { + return level.zombie_vars["freezegun_outer_damage"]; + } +} +freezegun_get_shatter_range( upgraded ) +{ + if ( upgraded ) + { + return level.zombie_vars["freezegun_shatter_range_upgraded"]; + } + else + { + return level.zombie_vars["freezegun_shatter_range"]; + } +} +freezegun_get_shatter_inner_damage( upgraded ) +{ + if ( upgraded ) + { + return level.zombie_vars["freezegun_shatter_inner_damage_upgraded"]; + } + else + { + return level.zombie_vars["freezegun_shatter_inner_damage"]; + } +} +freezegun_get_shatter_outer_damage( upgraded ) +{ + if ( upgraded ) + { + return level.zombie_vars["freezegun_shatter_outer_damage_upgraded"]; + } + else + { + return level.zombie_vars["freezegun_shatter_outer_damage"]; + } +} +freezegun_get_enemies_in_range( upgraded ) +{ + inner_range = freezegun_get_inner_range( upgraded ); + outer_range = freezegun_get_outer_range( upgraded ); + cylinder_radius = freezegun_get_cylinder_radius( upgraded ); + view_pos = self GetWeaponMuzzlePoint(); + zombies = get_array_of_closest( view_pos, GetAiSpeciesArray( "axis", "all" ), undefined, undefined, (outer_range * 1.1) ); + if ( !isDefined( zombies ) ) + { + return; + } + freezegun_inner_range_squared = inner_range * inner_range; + freezegun_outer_range_squared = outer_range * outer_range; + cylinder_radius_squared = cylinder_radius * cylinder_radius; + forward_view_angles = self GetWeaponForwardDir(); + end_pos = view_pos + vector_scale( forward_view_angles, outer_range ); + for ( i = 0; i < zombies.size; i++ ) + { + if ( !IsDefined( zombies[i] ) || !IsAlive( zombies[i] ) ) + { + continue; + } + test_origin = zombies[i] getcentroid(); + test_range_squared = DistanceSquared( view_pos, test_origin ); + if ( test_range_squared > freezegun_outer_range_squared ) + { + zombies[i] freezegun_debug_print( "range", (1, 0, 0) ); + return; + } + normal = VectorNormalize( test_origin - view_pos ); + dot = VectorDot( forward_view_angles, normal ); + if ( 0 > dot ) + { + zombies[i] freezegun_debug_print( "dot", (1, 0, 0) ); + continue; + } + radial_origin = PointOnSegmentNearestToPoint( view_pos, end_pos, test_origin ); + if ( DistanceSquared( test_origin, radial_origin ) > cylinder_radius_squared ) + { + zombies[i] freezegun_debug_print( "cylinder", (1, 0, 0) ); + continue; + } + if ( 0 == zombies[i] DamageConeTrace( view_pos, self ) ) + { + zombies[i] freezegun_debug_print( "cone", (1, 0, 0) ); + continue; + } + level.freezegun_enemies[level.freezegun_enemies.size] = zombies[i]; + level.freezegun_enemies_dist_ratio[level.freezegun_enemies_dist_ratio.size] = (freezegun_outer_range_squared - test_range_squared) / (freezegun_outer_range_squared - freezegun_inner_range_squared); + } +} +freezegun_debug_print( msg, color ) +{ +} +freezegun_do_damage( upgraded, player, dist_ratio ) +{ + damage = Int( LerpFloat( freezegun_get_outer_damage( upgraded ), freezegun_get_inner_damage( upgraded ), dist_ratio ) ); + self DoDamage( damage, player.origin, player, undefined, "projectile" ); + self freezegun_debug_print( damage, (0, 1, 0) ); +} +freezegun_set_extremity_damage_fx() +{ + self setclientflag( level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_EXTREMITY_DAMAGE_FX ); +} +freezegun_clear_extremity_damage_fx() +{ + self clearclientflag( level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_EXTREMITY_DAMAGE_FX ); +} +freezegun_set_torso_damage_fx() +{ + self setclientflag( level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_TORSO_DAMAGE_FX ); +} +freezegun_clear_torso_damage_fx() +{ + self clearclientflag( level._ZOMBIE_ACTOR_FLAG_FREEZEGUN_TORSO_DAMAGE_FX ); +} +freezegun_damage_response( player, amount ) +{ + if ( IsDefined( self.freezegun_damage_response_func ) ) + { + if ( self [[ self.freezegun_damage_response_func ]]( player, amount ) ) + { + return; + } + } + self.freezegun_damage += amount; + new_move_speed = self.zombie_move_speed; + percent_dmg = self enemy_percent_damaged_by_freezegun(); + if ( 0.66 <= percent_dmg ) + { + new_move_speed = "walk"; + } + else if ( 0.33 <= percent_dmg ) + { + if ( "sprint" == self.zombie_move_speed ) + { + new_move_speed = "run"; + } + else + { + new_move_speed = "walk"; + } + } + if ( !self.isdog && self.zombie_move_speed != new_move_speed ) + { + maps\_zombiemode_spawner::set_zombie_run_cycle( new_move_speed ); + } + self thread freezegun_set_extremity_damage_fx(); +} +freezegun_do_gib( gib_type, upgraded ) +{ + gibArray = []; + gibArray[gibArray.size] = level._ZOMBIE_GIB_PIECE_INDEX_ALL; + if ( upgraded ) + { + gibArray[gibArray.size] = 7; + } + self gib( gib_type, gibArray ); + self hide(); + wait( 0.1 ); + self self_delete(); +} +freezegun_do_shatter( player, weap, shatter_trigger, crumple_trigger ) +{ + freezegun_debug_print( "shattered" ); + self freezegun_cleanup_freezegun_triggers( shatter_trigger, crumple_trigger ); + upgraded = (weap == "freezegun_upgraded_zm"); + self radiusDamage( self.origin, freezegun_get_shatter_range( upgraded ), freezegun_get_shatter_inner_damage( upgraded ), freezegun_get_shatter_outer_damage( upgraded ), player, "MOD_EXPLOSIVE", weap ); + if ( is_mature() ) + { + self thread freezegun_do_gib( "up", upgraded ); + } + else + { + self StartRagdoll(); + } +} +freezegun_wait_for_shatter( player, weap, shatter_trigger, crumple_trigger ) +{ + shatter_trigger endon( "cleanup_freezegun_triggers" ); + orig_attacker = self.attacker; + shatter_trigger waittill( "damage", amount, attacker, dir, org, mod ); + if ( isDefined( attacker ) && attacker == orig_attacker && "MOD_PROJECTILE" == mod && ("freezegun_zm" == attacker GetCurrentWeapon() || "freezegun_upgraded_zm" == attacker GetCurrentWeapon()) ) + { + self thread freezegun_do_crumple( weap, shatter_trigger, crumple_trigger ); + } + else + { + self thread freezegun_do_shatter( player, weap, shatter_trigger, crumple_trigger ); + } +} +freezegun_do_crumple( weap, shatter_trigger, crumple_trigger ) +{ + freezegun_debug_print( "crumpled" ); + self freezegun_cleanup_freezegun_triggers( shatter_trigger, crumple_trigger ); + upgraded = (weap == "freezegun_upgraded_zm"); + if ( is_mature() ) + { + self thread freezegun_do_gib( "freeze", upgraded ); + } + else + { + self StartRagdoll(); + } +} +freezegun_wait_for_crumple( weap, shatter_trigger, crumple_trigger ) +{ + crumple_trigger endon( "cleanup_freezegun_triggers" ); + crumple_trigger waittill( "trigger" ); + self thread freezegun_do_crumple( weap, shatter_trigger, crumple_trigger ); +} +freezegun_cleanup_freezegun_triggers( shatter_trigger, crumple_trigger ) +{ + self notify( "cleanup_freezegun_triggers" ); + shatter_trigger notify( "cleanup_freezegun_triggers" ); + crumple_trigger notify( "cleanup_freezegun_triggers" ); + shatter_trigger self_delete(); + crumple_trigger self_delete(); +} +freezegun_run_skipped_death_events() +{ + self thread maps\_zombiemode_audio::do_zombies_playvocals( "death", self.animname ); + self thread maps\_zombiemode_spawner::zombie_eye_glow_stop(); +} +freezegun_death( hit_location, hit_origin, player ) +{ + if ( self.isdog ) + { + self freezegun_run_skipped_death_events(); + return; + } + if ( !self.has_legs ) + { + if ( !isDefined( level._zombie_freezegun_death_missing_legs[self.animname] ) ) + { + self freezegun_run_skipped_death_events(); + return; + } + self.deathanim = random( level._zombie_freezegun_death_missing_legs[self.animname] ); + } + else + { + if ( !isDefined( level._zombie_freezegun_death[self.animname] ) ) + { + self freezegun_run_skipped_death_events(); + return; + } + self.deathanim = random( level._zombie_freezegun_death[self.animname] ); + } + self.freezegun_death = true; + self.skip_death_notetracks = true; + self.nodeathragdoll = true; + self PlaySound( "wpn_freezegun_impact_zombie" ); + if( RandomIntRange(0,101) >= 88 ) + { + player maps\_zombiemode_audio::create_and_play_dialog( "kill", "freeze" ); + } + anim_len = getanimlength( self.deathanim ); + self thread freezegun_set_extremity_damage_fx(); + self thread freezegun_set_torso_damage_fx(); + shatter_trigger = spawn( "trigger_damage", self.origin, 0, 15, 72 ); + shatter_trigger enablelinkto(); + shatter_trigger linkto( self ); + spawnflags = 1 + 2 + 4 + 16 + 64; + crumple_trigger = spawn( "trigger_radius", self.origin, spawnflags, 15, 72 ); + crumple_trigger enablelinkto(); + crumple_trigger linkto( self ); + weap = self.damageweapon; + self thread freezegun_wait_for_shatter( player, weap, shatter_trigger, crumple_trigger ); + self thread freezegun_wait_for_crumple( weap, shatter_trigger, crumple_trigger ); + self endon( "cleanup_freezegun_triggers" ); + wait( anim_len ); + self thread freezegun_do_crumple( weap, shatter_trigger, crumple_trigger ); +} +is_freezegun_damage( mod ) +{ + return (("MOD_EXPLOSIVE" == mod || "MOD_PROJECTILE" == mod) && IsDefined( self.damageweapon ) && (self.damageweapon == "freezegun_zm" || self.damageweapon == "freezegun_upgraded_zm")); +} +is_freezegun_shatter_damage( mod ) +{ + return ("MOD_EXPLOSIVE" == mod && IsDefined( self.damageweapon ) && (self.damageweapon == "freezegun_zm" || self.damageweapon == "freezegun_upgraded_zm")); +} +should_do_freezegun_death( mod ) +{ + return is_freezegun_damage( mod ); +} +enemy_damaged_by_freezegun() +{ + return 0 < self.freezegun_damage; +} +enemy_percent_damaged_by_freezegun() +{ + return self.freezegun_damage / self.maxhealth; +} +enemy_killed_by_freezegun() +{ + return ( IsDefined( self.freezegun_death ) && self.freezegun_death == true ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_weap_microwavegun.gsc b/BO1/PC/ZM/maps/_zombiemode_weap_microwavegun.gsc new file mode 100644 index 0000000..b719768 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_weap_microwavegun.gsc @@ -0,0 +1,484 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_net; +#using_animtree( "generic_human" ); +init() +{ + if( !maps\_zombiemode_weapons::is_weapon_included( "microwavegundw_zm" ) ) + { + return; + } + PrecacheModel( GetWeaponModel( "microwavegunlh_zm" ) ); + PrecacheModel( GetWeaponModel( "microwavegunlh_upgraded_zm" ) ); + level._ZOMBIE_ACTOR_FLAG_MICROWAVEGUN_INITIAL_HIT_RESPONSE = 6; + level._ZOMBIE_ACTOR_FLAG_MICROWAVEGUN_EXPAND_RESPONSE = 9; + maps\_zombiemode_spawner::register_zombie_damage_callback( ::microwavegun_zombie_damage_response ); + maps\_zombiemode_spawner::register_zombie_death_animscript_callback( ::microwavegun_zombie_death_response ); + set_zombie_var( "microwavegun_cylinder_radius", 180 ); + set_zombie_var( "microwavegun_sizzle_range", 480 ); + level._effect["microwavegun_zap_shock_dw"] = loadfx( "weapon/microwavegun/fx_zap_shock_dw" ); + level._effect["microwavegun_zap_shock_eyes_dw"] = loadfx( "weapon/microwavegun/fx_zap_shock_eyes_dw" ); + level._effect["microwavegun_zap_shock_lh"] = loadfx( "weapon/microwavegun/fx_zap_shock_lh" ); + level._effect["microwavegun_zap_shock_eyes_lh"] = loadfx( "weapon/microwavegun/fx_zap_shock_eyes_lh" ); + level._effect["microwavegun_zap_shock_ug"] = loadfx( "weapon/microwavegun/fx_zap_shock_ug" ); + level._effect["microwavegun_zap_shock_eyes_ug"] = loadfx( "weapon/microwavegun/fx_zap_shock_eyes_ug" ); + level._effect["microwavegun_sizzle_blood_eyes"] = loadfx( "weapon/microwavegun/fx_sizzle_blood_eyes" ); + level._effect["microwavegun_sizzle_death_mist"] = loadfx( "weapon/microwavegun/fx_sizzle_mist" ); + level._effect["microwavegun_sizzle_death_mist_low_g"] = loadfx( "weapon/microwavegun/fx_sizzle_mist_low_g" ); + if( !isDefined( level._zombie_microwavegun_zap_death ) ) + { + level._zombie_microwavegun_zap_death = []; + } + level._zombie_microwavegun_zap_death["zombie"] = []; + level._zombie_microwavegun_zap_death["zombie"][0] = %ai_zombie_tesla_death_a; + level._zombie_microwavegun_zap_death["zombie"][1] = %ai_zombie_tesla_death_b; + level._zombie_microwavegun_zap_death["zombie"][2] = %ai_zombie_tesla_death_c; + level._zombie_microwavegun_zap_death["zombie"][3] = %ai_zombie_tesla_death_d; + level._zombie_microwavegun_zap_death["zombie"][4] = %ai_zombie_tesla_death_e; + level._zombie_microwavegun_zap_death["quad_zombie"] = []; + level._zombie_microwavegun_zap_death["quad_zombie"][0] = %ai_zombie_quad_death_tesla; + level._zombie_microwavegun_zap_death["quad_zombie"][1] = %ai_zombie_quad_death_tesla_2; + level._zombie_microwavegun_zap_death["quad_zombie"][2] = %ai_zombie_quad_death_tesla_3; + level._zombie_microwavegun_zap_death["quad_zombie"][3] = %ai_zombie_quad_death_tesla_4; + if( !isDefined( level._zombie_microwavegun_zap_crawl_death ) ) + { + level._zombie_microwavegun_zap_crawl_death = []; + } + level._zombie_microwavegun_zap_crawl_death["zombie"] = []; + level._zombie_microwavegun_zap_crawl_death["zombie"][0] = %ai_zombie_tesla_crawl_death_a; + level._zombie_microwavegun_zap_crawl_death["zombie"][1] = %ai_zombie_tesla_crawl_death_b; + level._zombie_microwavegun_zap_crawl_death["quad_zombie"] = []; + level._zombie_microwavegun_zap_crawl_death["quad_zombie"][0] = %ai_zombie_tesla_crawl_death_a; + level._zombie_microwavegun_zap_crawl_death["quad_zombie"][1] = %ai_zombie_tesla_crawl_death_b; + if( !isDefined( level._zombie_microwavegun_sizzle_death ) ) + { + level._zombie_microwavegun_sizzle_death = []; + } + level._zombie_microwavegun_sizzle_death["zombie"] = []; + level._zombie_microwavegun_sizzle_death["zombie"][0] = %ai_zombie_microwave_death_a; + level._zombie_microwavegun_sizzle_death["zombie"][1] = %ai_zombie_microwave_death_b; + level._zombie_microwavegun_sizzle_death["zombie"][2] = %ai_zombie_microwave_death_c; + level._zombie_microwavegun_sizzle_death["zombie"][3] = %ai_zombie_microwave_death_walking_a; + level._zombie_microwavegun_sizzle_death["zombie"][4] = %ai_zombie_microwave_death_walking_b; + level._zombie_microwavegun_sizzle_death["zombie"][5] = %ai_zombie_microwave_death_walking_c; + level._zombie_microwavegun_sizzle_death["quad_zombie"] = []; + level._zombie_microwavegun_sizzle_death["quad_zombie"][0] = %ai_zombie_quad_microwave_death_a; + level._zombie_microwavegun_sizzle_death["quad_zombie"][1] = %ai_zombie_quad_microwave_death_b; + level._zombie_microwavegun_sizzle_death["quad_zombie"][2] = %ai_zombie_quad_microwave_death_c; + if( !isDefined( level._zombie_microwavegun_sizzle_crawl_death ) ) + { + level._zombie_microwavegun_sizzle_crawl_death = []; + } + level._zombie_microwavegun_sizzle_crawl_death["zombie"] = []; + level._zombie_microwavegun_sizzle_crawl_death["zombie"][0] = %ai_zombie_crawl_microwave_death_a; + level._zombie_microwavegun_sizzle_crawl_death["zombie"][1] = %ai_zombie_crawl_microwave_death_b; + level._zombie_microwavegun_sizzle_crawl_death["zombie"][2] = %ai_zombie_crawl_microwave_death_c; + level._zombie_microwavegun_sizzle_crawl_death["zombie"][3] = %ai_zombie_crawl_microwave_death_walking_a; + level._zombie_microwavegun_sizzle_crawl_death["zombie"][4] = %ai_zombie_crawl_microwave_death_walking_b; + level._zombie_microwavegun_sizzle_crawl_death["zombie"][5] = %ai_zombie_crawl_microwave_death_walking_c; + level thread microwavegun_on_player_connect(); + level._microwaveable_objects = []; +} +add_microwaveable_object(ent) +{ + level._microwaveable_objects = add_to_array(level._microwaveable_objects, ent, false); +} +remove_microwaveable_object(ent) +{ + level._microwaveable_objects = array_remove(level._microwaveable_objects, ent); +} +microwavegun_on_player_connect() +{ + for( ;; ) + { + level waittill( "connecting", player ); + player thread wait_for_microwavegun_fired(); + } +} +wait_for_microwavegun_fired() +{ + self endon( "disconnect" ); + self waittill( "spawned_player" ); + for( ;; ) + { + self waittill( "weapon_fired" ); + currentweapon = self GetCurrentWeapon(); + if( ( currentweapon == "microwavegun_zm" ) || ( currentweapon == "microwavegun_upgraded_zm" ) ) + { + self thread microwavegun_fired( currentweapon == "microwavegun_upgraded_zm" ); + } + } +} +microwavegun_network_choke() +{ + level.microwavegun_network_choke_count++; + if ( !(level.microwavegun_network_choke_count % 10) ) + { + wait_network_frame(); + wait_network_frame(); + wait_network_frame(); + } +} +microwavegun_fired(upgraded) +{ + if ( !IsDefined( level.microwavegun_sizzle_enemies ) ) + { + level.microwavegun_sizzle_enemies = []; + level.microwavegun_sizzle_vecs = []; + } + self microwavegun_get_enemies_in_range(upgraded, false); + self microwavegun_get_enemies_in_range(upgraded, true); + level.microwavegun_network_choke_count = 0; + for ( i = 0; i < level.microwavegun_sizzle_enemies.size; i++ ) + { + microwavegun_network_choke(); + level.microwavegun_sizzle_enemies[i] thread microwavegun_sizzle_zombie( self, level.microwavegun_sizzle_vecs[i], i ); + } + level.microwavegun_sizzle_enemies = []; + level.microwavegun_sizzle_vecs = []; +} +microwavegun_get_enemies_in_range(upgraded, microwaveable_objects) +{ + view_pos = self GetWeaponMuzzlePoint(); + test_list = undefined; + range = level.zombie_vars["microwavegun_sizzle_range"]; + cylinder_radius = level.zombie_vars["microwavegun_cylinder_radius"]; + if(microwaveable_objects) + { + test_list = level._microwaveable_objects; + range *= 10; + cylinder_radius *= 10; + } + else + { + test_list = GetAISpeciesArray("axis", "all"); + } + zombies = get_array_of_closest( view_pos, test_list, undefined, undefined, range); + if ( !isDefined( zombies ) ) + { + return; + } + sizzle_range_squared = range * range; + cylinder_radius_squared = cylinder_radius * cylinder_radius; + forward_view_angles = self GetWeaponForwardDir(); + end_pos = view_pos + vector_scale( forward_view_angles, range ); + for ( i = 0; i < zombies.size; i++ ) + { + if ( !IsDefined( zombies[i] ) || (IsAI(zombies[i]) && !IsAlive( zombies[i] )) ) + { + continue; + } + test_origin = zombies[i] getcentroid(); + test_range_squared = DistanceSquared( view_pos, test_origin ); + if ( test_range_squared > sizzle_range_squared ) + { + zombies[i] microwavegun_debug_print( "range", (1, 0, 0) ); + return; + } + normal = VectorNormalize( test_origin - view_pos ); + dot = VectorDot( forward_view_angles, normal ); + if ( 0 > dot ) + { + zombies[i] microwavegun_debug_print( "dot", (1, 0, 0) ); + continue; + } + radial_origin = PointOnSegmentNearestToPoint( view_pos, end_pos, test_origin ); + if ( DistanceSquared( test_origin, radial_origin ) > cylinder_radius_squared ) + { + zombies[i] microwavegun_debug_print( "cylinder", (1, 0, 0) ); + continue; + } + if ( 0 == zombies[i] DamageConeTrace( view_pos, self ) ) + { + zombies[i] microwavegun_debug_print( "cone", (1, 0, 0) ); + continue; + } + if(IsAI(zombies[i])) + { + level.microwavegun_sizzle_enemies[level.microwavegun_sizzle_enemies.size] = zombies[i]; + dist_mult = (sizzle_range_squared - test_range_squared) / sizzle_range_squared; + sizzle_vec = VectorNormalize( test_origin - view_pos ); + if ( 5000 < test_range_squared ) + { + sizzle_vec = sizzle_vec + VectorNormalize( test_origin - radial_origin ); + } + sizzle_vec = (sizzle_vec[0], sizzle_vec[1], abs( sizzle_vec[2] )); + sizzle_vec = vector_scale( sizzle_vec, 100 + 100 * dist_mult ); + level.microwavegun_sizzle_vecs[level.microwavegun_sizzle_vecs.size] = sizzle_vec; + } + else + { + zombies[i] notify("microwaved",self); + } + } +} +microwavegun_debug_print( msg, color ) +{ +} +microwavegun_sizzle_zombie( player, sizzle_vec, index ) +{ + if( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + if ( IsDefined( self.microwavegun_sizzle_func ) ) + { + self [[ self.microwavegun_sizzle_func ]]( player ); + return; + } + self.no_gib = true; + self.gibbed = true; + self DoDamage( self.health + 666, player.origin, player ); + if ( self.health <= 0 ) + { + points = 10; + if ( !index ) + { + points = maps\_zombiemode_score::get_zombie_death_player_points(); + } + else if ( 1 == index ) + { + points = 30; + } + player maps\_zombiemode_score::player_add_points( "thundergun_fling", points ); + self.microwavegun_death = true; + instant_explode = false; + if ( !self.isdog ) + { + if ( self.has_legs ) + { + self.deathanim = random( level._zombie_microwavegun_sizzle_death[self.animname] ); + } + else + { + self.deathanim = random( level._zombie_microwavegun_sizzle_crawl_death[self.animname] ); + } + } + else + { + self.a.nodeath = undefined; + instant_explode = true; + } + if ( is_true( self.is_traversing ) || is_true( self.in_the_ceiling ) ) + { + self.deathanim = undefined; + instant_explode = true; + } + if ( instant_explode ) + { + if( isdefined( self.animname ) && self.animname != "astro_zombie" ) + { + self thread setup_microwavegun_vox( player ); + } + self setclientflag( level._ZOMBIE_ACTOR_FLAG_MICROWAVEGUN_EXPAND_RESPONSE ); + self thread microwavegun_sizzle_death_ending(); + } + else + { + if( isdefined( self.animname ) && self.animname != "astro_zombie" ) + { + self thread setup_microwavegun_vox( player, 6 ); + } + self setclientflag( level._ZOMBIE_ACTOR_FLAG_MICROWAVEGUN_INITIAL_HIT_RESPONSE ); + self.nodeathragdoll = true; + self.handle_death_notetracks = ::microwavegun_handle_death_notetracks; + } + } +} +microwavegun_handle_death_notetracks( note ) +{ + if ( note == "expand" ) + { + self setclientflag( level._ZOMBIE_ACTOR_FLAG_MICROWAVEGUN_EXPAND_RESPONSE ); + } + else if ( note == "explode" ) + { + self clearclientflag( level._ZOMBIE_ACTOR_FLAG_MICROWAVEGUN_EXPAND_RESPONSE ); + self thread microwavegun_sizzle_death_ending(); + } +} +microwavegun_sizzle_death_ending() +{ + if ( !IsDefined( self ) ) + { + return; + } + self hide(); + wait( 0.1 ); + self self_delete(); +} +microwavegun_dw_zombie_hit_response_internal( mod, damageweapon, player ) +{ + player endon( "disconnect" ); + if ( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + if ( !self.isdog ) + { + if ( self.has_legs ) + { + self.deathanim = random( level._zombie_microwavegun_zap_death[self.animname] ); + } + else + { + self.deathanim = random( level._zombie_microwavegun_zap_crawl_death[self.animname] ); + } + } + else + { + self.a.nodeath = undefined; + } + if ( is_true( self.is_traversing ) ) + { + self.deathanim = undefined; + } + self.microwavegun_dw_death = true; + self thread microwavegun_zap_death_fx( damageweapon ); + if ( IsDefined( self.microwavegun_zap_damage_func ) ) + { + self [[self.microwavegun_zap_damage_func]]( player ); + return; + } + else + { + self DoDamage( self.health + 666, self.origin, player ); + } + player maps\_zombiemode_score::player_add_points( "death", "", "" ); + if( randomintrange(0,101) >= 75 ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "micro_dual" ); + } +} +microwavegun_zap_get_shock_fx( weapon ) +{ + if ( weapon == "microwavegundw_zm" ) + { + return level._effect["microwavegun_zap_shock_dw"]; + } + else if ( weapon == "microwavegunlh_zm" ) + { + return level._effect["microwavegun_zap_shock_lh"]; + } + else + { + return level._effect["microwavegun_zap_shock_ug"]; + } +} +microwavegun_zap_get_shock_eyes_fx( weapon ) +{ + if ( weapon == "microwavegundw_zm" ) + { + return level._effect["microwavegun_zap_shock_eyes_dw"]; + } + else if ( weapon == "microwavegunlh_zm" ) + { + return level._effect["microwavegun_zap_shock_eyes_lh"]; + } + else + { + return level._effect["microwavegun_zap_shock_eyes_ug"]; + } +} +microwavegun_zap_head_gib( weapon ) +{ + self endon("death"); + network_safe_play_fx_on_tag( "microwavegun_zap_death_fx", 2, microwavegun_zap_get_shock_eyes_fx( weapon ), self, "J_Eyeball_LE" ); +} +microwavegun_zap_death_fx( weapon ) +{ + tag = "J_SpineUpper"; + if ( self.isdog ) + { + tag = "J_Spine1"; + } + network_safe_play_fx_on_tag( "microwavegun_zap_death_fx", 2, microwavegun_zap_get_shock_fx( weapon ), self, tag ); + self playsound( "wpn_imp_tesla" ); + if ( is_true( self.head_gibbed ) ) + { + return; + } + if ( IsDefined( self.microwavegun_zap_head_gib_func ) ) + { + self thread [[ self.microwavegun_zap_head_gib_func ]]( weapon ); + } + else if ( "quad_zombie" != self.animname ) + { + self thread microwavegun_zap_head_gib( weapon ); + } +} +microwavegun_zombie_damage_response( mod, hit_location, hit_origin, player, amount ) +{ + if ( self is_microwavegun_dw_damage() ) + { + self thread microwavegun_dw_zombie_hit_response_internal( mod, self.damageweapon, player ); + return true; + } + return false; +} +microwavegun_zombie_death_response() +{ + if ( self enemy_killed_by_dw_microwavegun() ) + { + return true; + } + else if ( self enemy_killed_by_microwavegun() ) + { + return true; + } + return false; +} +is_microwavegun_dw_damage() +{ + return IsDefined( self.damageweapon ) && (self.damageweapon == "microwavegundw_zm" || self.damageweapon == "microwavegundw_upgraded_zm" || self.damageweapon == "microwavegunlh_zm" || self.damageweapon == "microwavegunlh_upgraded_zm") && (self.damagemod == "MOD_IMPACT"); +} +enemy_killed_by_dw_microwavegun() +{ + return is_true( self.microwavegun_dw_death ); +} +is_microwavegun_damage() +{ + return IsDefined( self.damageweapon ) && (self.damageweapon == "microwavegun_zm" || self.damageweapon == "microwavegun_upgraded_zm") && (self.damagemod != "MOD_GRENADE" && self.damagemod != "MOD_GRENADE_SPLASH"); +} +enemy_killed_by_microwavegun() +{ + return is_true( self.microwavegun_death ); +} +microwavegun_sound_thread() +{ + self endon( "disconnect" ); + self waittill( "spawned_player" ); + for( ;; ) + { + result = self waittill_any_return( "grenade_fire", "death", "player_downed", "weapon_change", "grenade_pullback" ); + if ( !IsDefined( result ) ) + { + continue; + } + if ( ( result == "weapon_change" || result == "grenade_fire" ) && self GetCurrentWeapon() == "microwavegun_zm" ) + { + self PlayLoopSound( "tesla_idle", 0.25 ); + } + else + { + self notify ("weap_away"); + self StopLoopSound(0.25); + } + } +} +setup_microwavegun_vox( player, waittime ) +{ + level notify( "force_end_microwave_vox" ); + level endon( "force_end_microwave_vox" ); + if( !isdefined( waittime ) ) + { + waittime = .05; + } + wait( waittime ); + if ( 50 > RandomIntRange( 1, 100 ) && isdefined( player ) ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "micro_single" ); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_weap_nesting_dolls.gsc b/BO1/PC/ZM/maps/_zombiemode_weap_nesting_dolls.gsc new file mode 100644 index 0000000..b32223f --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_weap_nesting_dolls.gsc @@ -0,0 +1,540 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include animscripts\zombie_Utility; +init() +{ + if( !nesting_dolls_exists() ) + { + return; + } + level.nesting_dolls_launch_speed = 500; + level.nesting_dolls_launch_angle = 45; + level.nesting_dolls_too_close_dist = 100 * 100; + level.nesting_dolls_det_time = 0.25; + level.nesting_dolls_player_aim_dot = Cos( 45 / 2 ); + level.nesting_dolls_damage_radius = 180; + gravity = getdvarfloat(#"bg_gravity"); + level.nesting_dolls_launch_peak_time = (( level.nesting_dolls_launch_speed * Sin( level.nesting_dolls_launch_angle ) ) / Abs( gravity )) * 0.5; + level.nesting_dolls_max_ids = 10; + setup_nesting_dolls_data(); + PreCacheItem( "zombie_nesting_doll_single" ); +} +setup_nesting_dolls_data() +{ + if ( IsDefined( level.nesting_dolls_override_setup ) ) + { + [[ level.nesting_dolls_override_setup ]](); + return; + } + level._effect["nesting_doll_trail_blue"] = loadFx("maps/zombie/fx_zmb_trail_doll_blue"); + level._effect["nesting_doll_trail_green"] = loadFx("maps/zombie/fx_zmb_trail_doll_green"); + level._effect["nesting_doll_trail_red"] = loadFx("maps/zombie/fx_zmb_trail_doll_red"); + level._effect["nesting_doll_trail_yellow"] = loadFx("maps/zombie/fx_zmb_trail_doll_yellow"); + level.nesting_dolls_data = []; + level.nesting_dolls_data[0] = SpawnStruct(); + level.nesting_dolls_data[0].name = "dempsey"; + level.nesting_dolls_data[0].id = 16; + level.nesting_dolls_data[0].trailFx = level._effect["nesting_doll_trail_blue"]; + level.nesting_dolls_data[1] = SpawnStruct(); + level.nesting_dolls_data[1].name = "nikolai"; + level.nesting_dolls_data[1].id = 17; + level.nesting_dolls_data[1].trailFx = level._effect["nesting_doll_trail_red"]; + level.nesting_dolls_data[2] = SpawnStruct(); + level.nesting_dolls_data[2].name = "takeo"; + level.nesting_dolls_data[2].id = 18; + level.nesting_dolls_data[2].trailFx = level._effect["nesting_doll_trail_green"]; + level.nesting_dolls_data[3] = SpawnStruct(); + level.nesting_dolls_data[3].name = "richtofen"; + level.nesting_dolls_data[3].id = 19; + level.nesting_dolls_data[3].trailFx = level._effect["nesting_doll_trail_yellow"]; + PreCacheModel( "t5_nesting_bomb_world_doll1_dempsey" ); + PreCacheModel( "t5_nesting_bomb_world_doll2_dempsey" ); + PreCacheModel( "t5_nesting_bomb_world_doll3_dempsey" ); + PreCacheModel( "t5_nesting_bomb_world_doll4_dempsey" ); + PreCacheModel( "t5_nesting_bomb_world_doll1_nikolai" ); + PreCacheModel( "t5_nesting_bomb_world_doll2_nikolai" ); + PreCacheModel( "t5_nesting_bomb_world_doll3_nikolai" ); + PreCacheModel( "t5_nesting_bomb_world_doll4_nikolai" ); + PreCacheModel( "t5_nesting_bomb_world_doll1_takeo" ); + PreCacheModel( "t5_nesting_bomb_world_doll2_takeo" ); + PreCacheModel( "t5_nesting_bomb_world_doll3_takeo" ); + PreCacheModel( "t5_nesting_bomb_world_doll4_takeo" ); + PreCacheModel( "t5_nesting_bomb_world_doll1_richtofen" ); + PreCacheModel( "t5_nesting_bomb_world_doll2_richtofen" ); + PreCacheModel( "t5_nesting_bomb_world_doll3_richtofen" ); + PreCacheModel( "t5_nesting_bomb_world_doll4_richtofen" ); +} +nesting_dolls_exists() +{ + return IsDefined( level.zombie_weapons["zombie_nesting_dolls"] ); +} +player_give_nesting_dolls() +{ + self nesting_dolls_create_randomized_indices( 0 ); + start_cammo = level.nesting_dolls_data[ self.nesting_dolls_randomized_indices[0][0] ].id; + self giveweapon( "zombie_nesting_dolls", 0, self CalcWeaponOptions( start_cammo ) ); + self set_player_tactical_grenade( "zombie_nesting_dolls" ); + self thread player_handle_nesting_dolls(); +} +#using_animtree( "zombie_cymbal_monkey" ); +player_handle_nesting_dolls() +{ + self notify( "starting_nesting_dolls" ); + self endon( "disconnect" ); + self endon( "starting_nesting_dolls" ); + while( true ) + { + grenade = get_thrown_nesting_dolls(); + if( IsDefined( grenade ) ) + { + if( self maps\_laststand::player_is_in_laststand() ) + { + grenade delete(); + continue; + } + self thread doll_spawner_cluster( grenade ); + } + wait( 0.05 ); + } +} +doll_spawner( start_grenade ) +{ + self endon( "disconnect" ); + self endon( "death" ); + num_dolls = 1; + max_dolls = 4; + self nesting_dolls_set_id(); + self thread nesting_dolls_setup_next_doll_throw(); + if ( IsDefined( start_grenade ) ) + { + start_grenade spawn_doll_model( self.doll_id, 0, self ); + start_grenade thread doll_behavior_explode_when_stopped( self, self.doll_id, 0 ); + } + while( num_dolls < max_dolls ) + { + self waittill( "spawn_doll", origin, angles ); + grenade_vel = self get_launch_velocity( origin, 2000 ); + if ( grenade_vel == ( 0, 0, 0 ) ) + { + grenade_vel = self get_random_launch_velocity( origin, angles); + } + grenade = self MagicGrenadeType( "zombie_nesting_doll_single", origin, grenade_vel ); + grenade spawn_doll_model( self.doll_id, num_dolls, self ); + grenade thread doll_behavior_explode_when_stopped( self, self.doll_id, num_dolls ); + num_dolls++; + } +} +doll_spawner_cluster( start_grenade ) +{ + self endon( "disconnect" ); + self endon( "death" ); + num_dolls = 1; + max_dolls = 4; + self nesting_dolls_set_id(); + self thread nesting_dolls_setup_next_doll_throw(); + self thread nesting_dolls_track_achievement( self.doll_id ); + self thread nesting_dolls_check_achievement( self.doll_id ); + if ( IsDefined( start_grenade ) ) + { + start_grenade spawn_doll_model( self.doll_id, 0, self ); + start_grenade thread doll_behavior_explode_when_stopped( self, self.doll_id, 0 ); + } + self waittill( "spawn_doll", origin, angles ); + while( num_dolls < max_dolls ) + { + grenade_vel = self get_cluster_launch_velocity( angles, num_dolls ); + grenade = self MagicGrenadeType( "zombie_nesting_doll_single", origin, grenade_vel ); + grenade spawn_doll_model( self.doll_id, num_dolls, self ); + grenade PlaySound( "wpn_nesting_pop_npc" ); + grenade thread doll_behavior_explode_when_stopped( self, self.doll_id, num_dolls ); + num_dolls++; + wait( 0.25 ); + } +} +doll_do_damage( origin, owner, id, index ) +{ + self waittill( "explode" ); + zombies = GetAiSpeciesArray( "axis", "all" ); + if ( zombies.size == 0 ) + { + return; + } + zombie_sort = get_array_of_closest( origin, zombies, undefined, undefined, level.nesting_dolls_damage_radius ); + for ( i = 0; i < zombie_sort.size; i++ ) + { + if ( IsAlive( zombie_sort[i] ) ) + { + if ( zombie_sort[i] DamageConeTrace( origin, owner ) == 1 ) + { + owner.nesting_dolls_tracker[id][index] = owner.nesting_dolls_tracker[id][index] + 1; + } + } + } + RadiusDamage( origin, level.nesting_dolls_damage_radius, 95000, 95000, owner, "MOD_GRENADE_SPLASH", "zombie_nesting_doll_single" ); +} +randomize_angles( angles ) +{ + random_yaw = RandomIntRange( -45, 45 ); + random_pitch = RandomIntRange( -45, -35 ); + random = ( random_pitch, random_yaw, 0 ); + return_angles = angles + random; + return return_angles; +} +get_random_launch_velocity( doll_origin, angles ) +{ + angles = randomize_angles( angles ); + trace_dist = level.nesting_dolls_launch_speed * level.nesting_dolls_launch_peak_time; + for ( i = 0; i < 4; i++ ) + { + dir = AnglesToForward( angles ); + if ( BulletTracePassed( doll_origin, doll_origin + dir * trace_dist, false, undefined ) ) + { + grenade_vel = dir * level.nesting_dolls_launch_speed; + return grenade_vel; + } + else + { + angles = angles + (0, 90, 0); + } + } + return (0, 0, level.nesting_dolls_launch_speed); +} +get_cluster_launch_velocity( angles, index ) +{ + random_pitch = RandomIntRange( -45, -35 ); + offsets = array( 45, 0, -45 ); + angles = angles + ( random_pitch, offsets[index - 1], 0 ); + dir = AnglesToForward( angles ); + grenade_vel = dir * level.nesting_dolls_launch_speed; + return grenade_vel; +} +get_launch_velocity( doll_origin, range ) +{ + velocity = ( 0, 0, 0 ); + target = get_doll_best_doll_target( doll_origin, range ); + if ( IsDefined( target ) ) + { + target_origin = target get_target_leading_pos(); + dir = VectorToAngles( target_origin - doll_origin ); + dir = ( dir[0] - level.nesting_dolls_launch_angle, dir[1], dir[2] ); + dir = AnglesToForward( dir ); + velocity = dir * level.nesting_dolls_launch_speed; + } + return velocity; +} +get_target_leading_pos( ) +{ + position = self.origin; + return position; +} +spawn_doll_model( id, index, parent ) +{ + self hide(); + self.doll_model = spawn( "script_model", self.origin ); + data_index = parent.nesting_dolls_randomized_indices[ id ][ index ]; + name = level.nesting_dolls_data[ data_index ].name; + model_index = index + 1; + model_name = "t5_nesting_bomb_world_doll" + model_index + "_" + name; + self.doll_model SetModel( model_name ); + self.doll_model UseAnimTree( #animtree ); + self.doll_model LinkTo( self ); + self.doll_model.angles = self.angles; + PlayFxOnTag( level.nesting_dolls_data[ data_index ].trailFx, self.doll_model, "tag_origin" ); + self.doll_model thread nesting_dolls_cleanup( self ); +} +doll_behavior_explode_when_stopped( parent, doll_id, index ) +{ + velocitySq = 10000*10000; + oldPos = self.origin; + while( velocitySq != 0 ) + { + wait( 0.1 ); + if( !isDefined( self ) ) + { + break; + } + velocitySq = distanceSquared( self.origin, oldPos ); + oldPos = self.origin; + } + if( isDefined( self ) ) + { + self.doll_model unlink(); + self.doll_model.origin = self.origin; + self.doll_model.angles = self.angles; + parent notify( "spawn_doll", self.origin, self.angles ); + self thread doll_do_damage( self.origin, parent, doll_id, index ); + self ResetMissileDetonationTime( level.nesting_dolls_det_time ); + if ( IsDefined( index ) && index == 3 ) + { + parent thread nesting_dolls_end_achievement_tracking( doll_id ); + } + } +} +nesting_dolls_end_achievement_tracking( doll_id ) +{ + wait( level.nesting_dolls_det_time + 0.1 ); + self notify( "end_achievement_tracker" + doll_id ); +} +get_player_aim_best_doll_target( range ) +{ + view_pos = self GetWeaponMuzzlePoint(); + zombies = get_array_of_closest( view_pos, GetAiSpeciesArray( "axis", "all" ), undefined, undefined, (range * 1.1) ); + if ( !isDefined( zombies ) ) + { + return; + } + range_squared = range * range; + forward_view_angles = self GetWeaponForwardDir(); + end_pos = view_pos + vector_scale( forward_view_angles, range ); + best_dot = -999.0; + best_target = undefined; + for ( i = 0; i < zombies.size; i++ ) + { + if ( !IsDefined( zombies[i] ) || !IsAlive( zombies[i] ) ) + { + continue; + } + test_origin = zombies[i] getcentroid(); + test_range_squared = DistanceSquared( view_pos, test_origin ); + if ( test_range_squared > range_squared ) + { + return; + } + normal = VectorNormalize( test_origin - view_pos ); + dot = VectorDot( forward_view_angles, normal ); + if ( dot < 0 ) + { + continue; + } + if ( dot < level.nesting_dolls_player_aim_dot ) + { + continue; + } + if ( 0 == zombies[i] DamageConeTrace( view_pos, self ) ) + { + continue; + } + if ( dot > best_dot ) + { + best_dot = dot; + best_target = zombies[i]; + } + } + return best_target; +} +get_doll_best_doll_target( origin, range ) +{ + zombies = GetAIArray( "axis" ); + if ( zombies.size > 0 ) + { + zombie_sort = get_array_of_closest( origin, zombies, undefined, undefined, range ); + for ( i = 0; i < zombie_sort.size; i++ ) + { + if ( IsDefined( zombie_sort[i] ) && IsAlive( zombie_sort[i] ) ) + { + centroid = zombie_sort[i] GetCentroid(); + if ( BulletTracePassed( origin, centroid, false, undefined ) ) + { + return zombie_sort[i]; + } + } + } + } + return undefined; +} +nesting_dolls_cleanup( parent ) +{ + while( true ) + { + if( !isDefined( parent ) ) + { + self_delete(); + return; + } + wait( 0.05 ); + } +} +do_nesting_dolls_sound( model, info ) +{ + monk_scream_vox = false; + if( level.music_override == false ) + { + monk_scream_vox = false; + self playsound( "zmb_monkey_song" ); + } + self waittill( "explode", position ); + if( isDefined( model ) ) + { + } + if( !monk_scream_vox ) + { + play_sound_in_space( "zmb_vox_monkey_explode", position ); + } +} +get_thrown_nesting_dolls() +{ + self endon( "disconnect" ); + self endon( "starting_nesting_dolls" ); + while( true ) + { + self waittill( "grenade_fire", grenade, weapName ); + if( weapName == "zombie_nesting_dolls" ) + { + return grenade; + } + wait( 0.05 ); + } +} +nesting_dolls_debug_print( msg, color ) +{ +} +nesting_dolls_tesla_nearby_zombies( doll ) +{ + wait( level.nesting_dolls_launch_peak_time ); + zombies = GetAiSpeciesArray( "axis", "all" ); + zombie_sort = get_array_of_closest( doll.origin, zombies, undefined, 15, 250 ); + for (i = 0; i < zombie_sort.size; i++) + { + centroid = zombie_sort[i] GetCentroid(); + level thread nesting_dolls_play_tesla_bolt( doll.origin, centroid ); + zombie_sort[i] thread maps\_zombiemode_weap_tesla::tesla_damage_init( "head", centroid, self ); + } +} +nesting_dolls_play_tesla_bolt( origin, target_origin ) +{ + fxOrg = Spawn( "script_model", origin ); + fxOrg SetModel( "tag_origin" ); + fx = PlayFxOnTag( level._effect["tesla_bolt"], fxOrg, "tag_origin" ); + playsoundatposition( "wpn_tesla_bounce", fxOrg.origin ); + fxOrg MoveTo( target_origin, 0.25 ); + fxOrg waittill( "movedone" ); + fxOrg delete(); +} +nesting_dolls_set_id() +{ + if ( !IsDefined( self.doll_id ) ) + { + self.doll_id = 0; + return; + } + self.doll_id = self.doll_id + 1; + if ( self.doll_id >= level.nesting_dolls_max_ids ) + { + self.doll_id = 0; + } +} +nesting_dolls_track_achievement( doll_id ) +{ + self endon( "end_achievement_tracker" + doll_id ); + if ( !IsDefined( self.nesting_dolls_tracker ) ) + { + self.nesting_dolls_tracker = []; + for ( i = 0; i < level.nesting_dolls_max_ids; i++ ) + { + self.nesting_dolls_tracker[i] = []; + } + } + for ( i = 0; i < 4; i++ ) + { + self.nesting_dolls_tracker[doll_id][i] = 0; + } +} +nesting_dolls_check_achievement( doll_id ) +{ + self waittill( "end_achievement_tracker" + doll_id ); + min_kills_per_doll = 1; + for ( i = 0; i < 4; i++ ) + { + if ( self.nesting_dolls_tracker[doll_id][i] < min_kills_per_doll ) + { + return; + } + } +} +nesting_dolls_create_randomized_indices( id ) +{ + if ( !IsDefined( self.nesting_dolls_randomized_indices ) ) + { + self.nesting_dolls_randomized_indices = []; + } + base_indices = array( 0, 1, 2, 3 ); + self.nesting_dolls_randomized_indices[id] = array_randomize( base_indices ); +} +nesting_dolls_setup_next_doll_throw() +{ + self endon( "death" ); + self endon( "disconnect" ); + wait(0.5); + next_id = self.doll_id + 1; + if ( next_id >= level.nesting_dolls_max_ids ) + { + next_id = 0; + } + self nesting_dolls_create_randomized_indices( next_id ); + if ( self HasWeapon( "zombie_nesting_dolls" ) ) + { + cammo = level.nesting_dolls_data[ self.nesting_dolls_randomized_indices[next_id][0] ].id; + self UpdateWeaponOptions( "zombie_nesting_dolls", self CalcWeaponOptions( cammo ) ); + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_weap_quantum_bomb.gsc b/BO1/PC/ZM/maps/_zombiemode_weap_quantum_bomb.gsc new file mode 100644 index 0000000..a2c67d8 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_weap_quantum_bomb.gsc @@ -0,0 +1,611 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include animscripts\zombie_Utility; +#using_animtree( "generic_human" ); +init_registration() +{ + level.quantum_bomb_register_result_func = ::quantum_bomb_register_result; + level.quantum_bomb_deregister_result_func = ::quantum_bomb_deregister_result; + level.quantum_bomb_in_playable_area_validation_func = ::quantum_bomb_in_playable_area_validation; + quantum_bomb_register_result( "random_lethal_grenade", ::quantum_bomb_lethal_grenade_result, 50 ); + quantum_bomb_register_result( "random_weapon_starburst", ::quantum_bomb_random_weapon_starburst_result, 75 ); + quantum_bomb_register_result( "pack_or_unpack_current_weapon", ::quantum_bomb_pack_or_unpack_current_weapon_result, 10, ::quantum_bomb_pack_or_unpack_current_weapon_validation ); + quantum_bomb_register_result( "auto_revive", ::quantum_bomb_auto_revive_result, 60, ::quantum_bomb_auto_revive_validation ); + quantum_bomb_register_result( "player_teleport", ::quantum_bomb_player_teleport_result, 20 ); + level.scr_anim["zombie"]["sprint5"] = %ai_zombie_fast_sprint_01; + level.scr_anim["zombie"]["sprint6"] = %ai_zombie_fast_sprint_02; + quantum_bomb_register_result( "zombie_speed_buff", ::quantum_bomb_zombie_speed_buff_result, 2 ); + quantum_bomb_register_result( "zombie_add_to_total", ::quantum_bomb_zombie_add_to_total_result, 70, ::quantum_bomb_zombie_add_to_total_validation ); + level._effect["zombie_fling_result"] = loadfx( "maps/zombie_moon/fx_moon_qbomb_explo_distort" ); + quantum_bomb_register_result( "zombie_fling", ::quantum_bomb_zombie_fling_result ); + level._effect["quantum_bomb_viewmodel_twist"] = LoadFX( "weapon/quantum_bomb/fx_twist" ); + level._effect["quantum_bomb_viewmodel_press"] = LoadFX( "weapon/quantum_bomb/fx_press" ); + level._effect["quantum_bomb_area_effect"] = loadfx( "weapon/quantum_bomb/area_effect" ); + level._effect["quantum_bomb_player_effect"] = loadfx( "weapon/quantum_bomb/player_effect" ); + level._effect["quantum_bomb_player_position_effect"] = loadfx( "weapon/quantum_bomb/fx_player_position_effect" ); + level._effect["quantum_bomb_mystery_effect"] = loadfx( "weapon/quantum_bomb/fx_mystery_effect" ); + level.quantum_bomb_play_area_effect_func = ::quantum_bomb_play_area_effect; + level.quantum_bomb_play_player_effect_func = ::quantum_bomb_play_player_effect; + level.quantum_bomb_play_player_effect_at_position_func = ::quantum_bomb_play_player_effect_at_position; + level.quantum_bomb_play_mystery_effect_func = ::quantum_bomb_play_mystery_effect; +} +init() +{ + if( !quantum_bomb_exists() ) + { + return; + } +} +quantum_bomb_debug_print_ln( msg ) +{ +} +quantum_bomb_debug_print_bold( msg ) +{ +} +quantum_bomb_debug_print_3d( msg, color ) +{ +} +quantum_bomb_register_result( name, result_func, chance, validation_func ) +{ + if ( !isdefined( level.quantum_bomb_results ) ) + { + level.quantum_bomb_results = []; + } + if ( isdefined( level.quantum_bomb_results[name] ) ) + { + quantum_bomb_debug_print_ln( "quantum_bomb_register_result(): '" + name + "' is already registered as a quantum bomb result.\n" ); + return; + } + result = SpawnStruct(); + result.name = name; + result.result_func = result_func; + if ( !isdefined( chance ) ) + { + result.chance = 100; + } + else + { + result.chance = clamp( chance, 1, 100 ); + } + if ( !isdefined( validation_func ) ) + { + result.validation_func = ::quantum_bomb_default_validation; + } + else + { + result.validation_func = validation_func; + } + level.quantum_bomb_results[name] = result; +} +quantum_bomb_deregister_result( name ) +{ + if ( !isdefined( level.quantum_bomb_results ) ) + { + level.quantum_bomb_results = []; + } + if ( !isdefined( level.quantum_bomb_results[name] ) ) + { + quantum_bomb_debug_print_ln( "quantum_bomb_deregister_result(): '" + name + "' is not registered as a quantum bomb result.\n" ); + return; + } + level.quantum_bomb_results[name] = undefined; +} +quantum_bomb_play_area_effect( position ) +{ + PlayFX( level._effect["quantum_bomb_area_effect"], position ); +} +quantum_bomb_play_player_effect() +{ + PlayFXOnTag( level._effect["quantum_bomb_player_effect"], self, "tag_origin" ); +} +quantum_bomb_play_player_effect_at_position( position ) +{ + PlayFX( level._effect["quantum_bomb_player_position_effect"], position ); +} +quantum_bomb_play_mystery_effect( position ) +{ + PlayFX( level._effect["quantum_bomb_mystery_effect"], position ); +} +quantum_bomb_clear_cached_data() +{ + level.quantum_bomb_cached_in_playable_area = undefined; + level.quantum_bomb_cached_closest_zombies = undefined; +} +quantum_bomb_select_result( position ) +{ + quantum_bomb_clear_cached_data(); + eligible_results = []; + chance = RandomInt( 100 ); + keys = GetArrayKeys( level.quantum_bomb_results ); + for ( i = 0; i < keys.size; i++ ) + { + result = level.quantum_bomb_results[keys[i]]; + if ( result.chance > chance && self [[result.validation_func]]( position ) ) + { + eligible_results[eligible_results.size] = result.name; + } + } + return level.quantum_bomb_results[eligible_results[RandomInt( eligible_results.size )]]; +} +player_give_quantum_bomb() +{ + self giveweapon( "zombie_quantum_bomb" ); + self set_player_tactical_grenade( "zombie_quantum_bomb" ); + self thread player_handle_quantum_bomb(); +} +player_handle_quantum_bomb() +{ + self notify( "starting_quantum_bomb" ); + self endon( "disconnect" ); + self endon( "starting_quantum_bomb" ); + level endon( "end_game" ); + while( true ) + { + grenade = self get_thrown_quantum_bomb(); + if( IsDefined( grenade ) ) + { + if( self maps\_laststand::player_is_in_laststand() ) + { + grenade delete(); + continue; + } + grenade waittill( "explode", position ); + playsoundatposition( "wpn_quantum_exp", position ); + result = self quantum_bomb_select_result( position ); + self thread [[result.result_func]]( position ); + quantum_bomb_debug_print_bold( "quantum_bomb exploded at " + position + ", result: '" + result.name + "'.\n" ); + } + wait( 0.05 ); + } +} +quantum_bomb_exists() +{ + return IsDefined( level.zombie_weapons["zombie_quantum_bomb"] ); +} +get_thrown_quantum_bomb() +{ + self endon( "disconnect" ); + self endon( "starting_quantum_bomb" ); + while( true ) + { + self waittill( "grenade_fire", grenade, weapName ); + if( weapName == "zombie_quantum_bomb" ) + { + return grenade; + } + wait( 0.05 ); + } +} +quantum_bomb_default_validation( position ) +{ + return true; +} +quantum_bomb_get_cached_closest_zombies( position ) +{ + if ( !isdefined( level.quantum_bomb_cached_closest_zombies ) ) + { + level.quantum_bomb_cached_closest_zombies = get_array_of_closest( position, GetAiSpeciesArray( "axis", "all" ) ); + } + return level.quantum_bomb_cached_closest_zombies; +} +quantum_bomb_get_cached_in_playable_area( position ) +{ + if ( !isdefined( level.quantum_bomb_cached_in_playable_area ) ) + { + level.quantum_bomb_cached_in_playable_area = check_point_in_playable_area( position ); + } + return level.quantum_bomb_cached_in_playable_area; +} +quantum_bomb_in_playable_area_validation( position ) +{ + return quantum_bomb_get_cached_in_playable_area( position ); +} +quantum_bomb_lethal_grenade_result( position ) +{ + self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_good" ); + self MagicGrenadeType( level.zombie_lethal_grenade_list[RandomInt( level.zombie_lethal_grenade_list.size )], position, (0, 0, 0), 0.35 ); +} +quantum_bomb_random_weapon_starburst_result( position ) +{ + self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_good" ); + weapon = "ray_gun_zm"; + rand = RandomInt( 20 ); + switch ( rand ) + { + case 0: + case 1: + case 2: + weapon = "ray_gun_upgraded_zm"; + if ( IsDefined( level.zombie_include_weapons["ray_gun_upgraded_zm"] ) ) + { + break; + } + case 3: + case 4: + weapon = "spas_upgraded_zm"; + if ( IsDefined( level.zombie_include_weapons["spas_upgraded_zm"] ) ) + { + break; + } + case 5: + case 6: + weapon = "china_lake_upgraded_zm"; + if ( IsDefined( level.zombie_include_weapons["china_lake_upgraded_zm"] ) ) + { + break; + } + case 7: + case 8: + weapon = "m72_law_upgraded_zm"; + if ( IsDefined( level.zombie_include_weapons["m72_law_upgraded_zm"] ) ) + { + break; + } + case 9: + weapon = "python_upgraded_zm"; + if ( IsDefined( level.zombie_include_weapons["python_upgraded_zm"] ) ) + { + break; + } + default: + weapon = "ray_gun_zm"; + break; + } + quantum_bomb_play_player_effect_at_position( position ); + base_pos = position + (0, 0, 40); + start_yaw = VectorToAngles( base_pos - self.origin ); + start_yaw = (0, start_yaw[1], 0); + weapon_model = spawn( "script_model", position ); + weapon_model.angles = start_yaw; + modelname = GetWeaponModel( weapon ); + weapon_model setmodel( modelname ); + weapon_model useweaponhidetags( weapon ); + weapon_model MoveTo( base_pos, 1, 0.25, 0.25 ); + weapon_model waittill( "movedone" ); + attacker = self; + for ( i = 0; i < 36; i++ ) + { + yaw = start_yaw + (RandomIntRange( -3, 3 ), i * 10, 0); + weapon_model.angles = yaw; + flash_pos = weapon_model GetTagOrigin( "tag_flash" ); + target_pos = flash_pos + vector_scale( AnglesToForward( yaw ), 40 ); + if ( !isdefined( attacker ) ) + { + attacker = undefined; + } + MagicBullet( weapon, flash_pos, target_pos, attacker ); + wait_network_frame(); + } + weapon_model Delete(); +} +quantum_bomb_pack_or_unpack_current_weapon_validation( position ) +{ + if ( !quantum_bomb_get_cached_in_playable_area( position ) ) + { + return false; + } + pack_triggers = GetEntArray( "zombie_vending_upgrade", "targetname" ); + range_squared = 180 * 180; + for ( i = 0; i < pack_triggers.size; i++ ) + { + if ( DistanceSquared( pack_triggers[i].origin, position ) < range_squared ) + { + return true; + } + } + return !RandomInt( 5 ); +} +quantum_bomb_pack_or_unpack_current_weapon_result( position ) +{ + quantum_bomb_play_mystery_effect( position ); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + if ( player.sessionstate == "spectator" || player maps\_laststand::player_is_in_laststand() ) + { + continue; + } + weapon = player GetCurrentWeapon(); + if ( "primary" != WeaponInventoryType( weapon ) || !isdefined( level.zombie_weapons[weapon] ) ) + { + continue; + } + if ( maps\_zombiemode_weapons::is_weapon_upgraded( weapon ) ) + { + if ( RandomInt( 5 ) ) + { + continue; + } + ziw_keys = GetArrayKeys( level.zombie_weapons ); + for ( weaponindex = 0; weaponindex < level.zombie_weapons.size; weaponindex++ ) + { + if ( IsDefined(level.zombie_weapons[ ziw_keys[weaponindex] ].upgrade_name) && + level.zombie_weapons[ ziw_keys[weaponindex] ].upgrade_name == weapon ) + { + if( player == self ) + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_bad" ); + } + player thread maps\_zombiemode_weapons::weapon_give( ziw_keys[weaponindex] ); + player quantum_bomb_play_player_effect(); + break; + } + } + } + else if ( isdefined( level.zombie_weapons[weapon].upgrade_name ) ) + { + if ( !RandomInt( 4 ) ) + { + continue; + } + weapon_limit = 2; + if ( player HasPerk( "specialty_additionalprimaryweapon" ) ) + { + weapon_limit = 3; + } + primaries = player GetWeaponsListPrimaries(); + if( isDefined( primaries ) && primaries.size < weapon_limit ) + { + player TakeWeapon( weapon ); + } + if( player == self ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_good" ); + } + player thread maps\_zombiemode_weapons::weapon_give( level.zombie_weapons[weapon].upgrade_name ); + player quantum_bomb_play_player_effect(); + } + } +} +quantum_bomb_auto_revive_validation( position ) +{ + if ( flag( "solo_game" ) ) + { + return false; + } + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + if ( player maps\_laststand::player_is_in_laststand() ) + { + return true; + } + } + return false; +} +quantum_bomb_auto_revive_result( position ) +{ + quantum_bomb_play_mystery_effect( position ); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + if ( player maps\_laststand::player_is_in_laststand() && RandomInt( 3 ) ) + { + player maps\_laststand::auto_revive( self ); + player quantum_bomb_play_player_effect(); + } + } +} +quantum_bomb_player_teleport_result( position ) +{ + quantum_bomb_play_mystery_effect( position ); + players = getplayers(); + players_to_teleport = []; + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + if ( player.sessionstate == "spectator" || player maps\_laststand::player_is_in_laststand() ) + { + continue; + } + if ( isdefined( level.quantum_bomb_prevent_player_getting_teleported ) && player [[level.quantum_bomb_prevent_player_getting_teleported]]( position ) ) + { + continue; + } + players_to_teleport[players_to_teleport.size] = player; + } + players_to_teleport = array_randomize( players_to_teleport ); + for ( i = 0; i < players_to_teleport.size; i++ ) + { + player = players_to_teleport[i]; + if ( i && RandomInt( 5 ) ) + { + continue; + } + level thread quantum_bomb_teleport_player( player ); + } +} +quantum_bomb_teleport_player( player ) +{ + black_hole_teleport_structs = getstructarray( "struct_black_hole_teleport", "targetname" ); + chosen_spot = undefined; + if ( isDefined( level._special_blackhole_bomb_structs ) ) + { + black_hole_teleport_structs = [[level._special_blackhole_bomb_structs]](); + } + player_current_zone = player get_current_zone(); + if ( !IsDefined( black_hole_teleport_structs ) || black_hole_teleport_structs.size == 0 || !IsDefined( player_current_zone ) ) + { + return; + } + black_hole_teleport_structs = array_randomize( black_hole_teleport_structs ); + if ( isDefined( level._override_blackhole_destination_logic ) ) + { + chosen_spot = [[level._override_blackhole_destination_logic]]( black_hole_teleport_structs, player ); + } + else + { + for ( i = 0; i < black_hole_teleport_structs.size; i++ ) + { + if ( check_point_in_active_zone( black_hole_teleport_structs[i].origin ) && + ( player_current_zone != black_hole_teleport_structs[i].script_string ) ) + { + chosen_spot = black_hole_teleport_structs[i]; + break; + } + } + } + if ( IsDefined( chosen_spot ) ) + { + player thread quantum_bomb_teleport( chosen_spot ); + } +} +quantum_bomb_teleport( struct_dest ) +{ + self endon( "death" ); + if( !IsDefined( struct_dest ) ) + { + return; + } + prone_offset = (0, 0, 49); + crouch_offset = (0, 0, 20); + stand_offset = (0, 0, 0); + destination = undefined; + if( self GetStance() == "prone" ) + { + destination = struct_dest.origin + prone_offset; + } + else if( self GetStance() == "crouch" ) + { + destination = struct_dest.origin + crouch_offset; + } + else + { + destination = struct_dest.origin + stand_offset; + } + if( IsDefined( level._black_hole_teleport_override ) ) + { + level [[ level._black_hole_teleport_override ]]( self ); + } + quantum_bomb_play_player_effect_at_position( self.origin ); + self FreezeControls( true ); + self DisableOffhandWeapons(); + self DisableWeapons(); + self playsoundtoplayer( "zmb_gersh_teleporter_go_2d", self ); + self DontInterpolate(); + self SetOrigin( destination ); + self SetPlayerAngles( struct_dest.angles ); + self EnableOffhandWeapons(); + self EnableWeapons(); + self FreezeControls( false ); + self quantum_bomb_play_player_effect(); + self thread quantum_bomb_slightly_delayed_player_response(); +} +quantum_bomb_slightly_delayed_player_response() +{ + wait(1); + self maps\_zombiemode_audio::create_and_play_dialog( "general", "teleport_gersh" ); +} +quantum_bomb_zombie_speed_buff_result( position ) +{ + quantum_bomb_play_mystery_effect( position ); + self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_bad" ); + zombies = quantum_bomb_get_cached_closest_zombies( position ); + for ( i = 0; i < zombies.size; i++ ) + { + fast_sprint = "sprint5"; + if ( RandomInt( 100 ) < 50 ) + { + fast_sprint = "sprint6"; + } + zombie = zombies[i]; + if ( isdefined( zombie.fastSprintFunc ) ) + { + fast_sprint = zombie [[ zombie.fastSprintFunc ]](); + } + else if ( is_true( zombie.in_low_gravity ) ) + { + if ( !zombie.has_legs ) + { + fast_sprint = "crawl_low_g_super_sprint"; + } + else + { + fast_sprint = "low_g_super_sprint"; + } + } + else + { + if ( !zombie.has_legs ) + { + fast_sprint = "crawl_super_sprint"; + } + } + if ( zombie.isdog || !isdefined( level.scr_anim[ zombie.animname ][ fast_sprint ] ) ) + { + continue; + } + zombie.zombie_move_speed = "sprint"; + zombie set_run_anim( fast_sprint ); + zombie.run_combatanim = level.scr_anim[ zombie.animname ][ fast_sprint ]; + zombie.needs_run_update = true; + } +} +quantum_bomb_zombie_fling_result( position ) +{ + PlayFX( level._effect["zombie_fling_result"], position ); + self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_good" ); + range = 300; + range_squared = range * range; + zombies = quantum_bomb_get_cached_closest_zombies( position ); + for ( i = 0; i < zombies.size; i++ ) + { + zombie = zombies[i]; + if( !IsDefined( zombie ) || !IsAlive( zombie ) ) + { + continue; + } + test_origin = zombie.origin + (0, 0, 40); + test_origin_squared = DistanceSquared( position, test_origin ); + if ( test_origin_squared > range_squared ) + { + break; + } + dist_mult = (range_squared - test_origin_squared) / range_squared; + fling_vec = VectorNormalize( test_origin - position ); + fling_vec = (fling_vec[0], fling_vec[1], abs( fling_vec[2] )); + fling_vec = vector_scale( fling_vec, 100 + 100 * dist_mult ); + zombie quantum_bomb_fling_zombie( self, fling_vec ); + if ( i && !(i % 10) ) + { + wait_network_frame(); + wait_network_frame(); + wait_network_frame(); + } + } +} +quantum_bomb_fling_zombie( player, fling_vec ) +{ + if( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + self DoDamage( self.health + 666, player.origin, player ); + if ( self.health <= 0 ) + { + self StartRagdoll(); + self LaunchRagdoll( fling_vec ); + } +} +quantum_bomb_zombie_add_to_total_validation( position ) +{ + if ( level.zombie_total ) + { + return false; + } + zombies = quantum_bomb_get_cached_closest_zombies( position ); + return (zombies.size < level.zombie_ai_limit); +} +quantum_bomb_zombie_add_to_total_result( position ) +{ + quantum_bomb_play_mystery_effect( position ); + self thread maps\_zombiemode_audio::create_and_play_dialog( "kill", "quant_bad" ); + level.zombie_total += level.zombie_ai_limit; +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_weap_tesla.gsc b/BO1/PC/ZM/maps/_zombiemode_weap_tesla.gsc new file mode 100644 index 0000000..a0ccf59 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_weap_tesla.gsc @@ -0,0 +1,413 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_net; +#using_animtree( "generic_human" ); +init() +{ + if ( !maps\_zombiemode_weapons::is_weapon_included( "tesla_gun_zm" ) ) + { + return; + } + level._effect["tesla_bolt"] = loadfx( "maps/zombie/fx_zombie_tesla_bolt_secondary" ); + level._effect["tesla_shock"] = loadfx( "maps/zombie/fx_zombie_tesla_shock" ); + level._effect["tesla_shock_secondary"] = loadfx( "maps/zombie/fx_zombie_tesla_shock_secondary" ); + level._effect["tesla_viewmodel_rail"] = loadfx( "maps/zombie/fx_zombie_tesla_rail_view" ); + level._effect["tesla_viewmodel_tube"] = loadfx( "maps/zombie/fx_zombie_tesla_tube_view" ); + level._effect["tesla_viewmodel_tube2"] = loadfx( "maps/zombie/fx_zombie_tesla_tube_view2" ); + level._effect["tesla_viewmodel_tube3"] = loadfx( "maps/zombie/fx_zombie_tesla_tube_view3" ); + level._effect["tesla_viewmodel_rail_upgraded"] = loadfx( "maps/zombie/fx_zombie_tesla_rail_view_ug" ); + level._effect["tesla_viewmodel_tube_upgraded"] = loadfx( "maps/zombie/fx_zombie_tesla_tube_view_ug" ); + level._effect["tesla_viewmodel_tube2_upgraded"] = loadfx( "maps/zombie/fx_zombie_tesla_tube_view2_ug" ); + level._effect["tesla_viewmodel_tube3_upgraded"] = loadfx( "maps/zombie/fx_zombie_tesla_tube_view3_ug" ); + level._effect["tesla_shock_eyes"] = loadfx( "maps/zombie/fx_zombie_tesla_shock_eyes" ); + precacheshellshock( "electrocution" ); + set_zombie_var( "tesla_max_arcs", 5 ); + set_zombie_var( "tesla_max_enemies_killed", 20 ); + set_zombie_var( "tesla_radius_start", 300 ); + set_zombie_var( "tesla_radius_decay", 20 ); + set_zombie_var( "tesla_head_gib_chance", 50 ); + set_zombie_var( "tesla_arc_travel_time", 0.5, true ); + set_zombie_var( "tesla_kills_for_powerup", 15 ); + set_zombie_var( "tesla_min_fx_distance", 128 ); + set_zombie_var( "tesla_network_death_choke",4 ); + level thread on_player_connect(); +} +tesla_damage_init( hit_location, hit_origin, player ) +{ + player endon( "disconnect" ); + if ( IsDefined( player.tesla_enemies_hit ) && player.tesla_enemies_hit > 0 ) + { + debug_print( "TESLA: Player: '" + player.playername + "' currently processing tesla damage" ); + return; + } + if( IsDefined( self.zombie_tesla_hit ) && self.zombie_tesla_hit ) + { + return; + } + debug_print( "TESLA: Player: '" + player.playername + "' hit with the tesla gun" ); + player.tesla_enemies = undefined; + player.tesla_enemies_hit = 1; + player.tesla_powerup_dropped = false; + player.tesla_arc_count = 0; + self tesla_arc_damage( self, player, 1 ); + if( player.tesla_enemies_hit >= 4) + { + player thread tesla_killstreak_sound(); + } + player.tesla_enemies_hit = 0; +} +tesla_arc_damage( source_enemy, player, arc_num ) +{ + player endon( "disconnect" ); + debug_print( "TESLA: Evaulating arc damage for arc: " + arc_num + " Current enemies hit: " + player.tesla_enemies_hit ); + tesla_flag_hit( self, true ); + wait_network_frame(); + radius_decay = level.zombie_vars["tesla_radius_decay"] * arc_num; + enemies = tesla_get_enemies_in_area( self GetTagOrigin( "j_head" ), level.zombie_vars["tesla_radius_start"] - radius_decay, player ); + tesla_flag_hit( enemies, true ); + self thread tesla_do_damage( source_enemy, arc_num, player ); + debug_print( "TESLA: " + enemies.size + " enemies hit during arc: " + arc_num ); + for( i = 0; i < enemies.size; i++ ) + { + if( enemies[i] == self ) + { + continue; + } + if ( tesla_end_arc_damage( arc_num + 1, player.tesla_enemies_hit ) ) + { + tesla_flag_hit( enemies[i], false ); + continue; + } + player.tesla_enemies_hit++; + enemies[i] tesla_arc_damage( self, player, arc_num + 1 ); + } +} +tesla_end_arc_damage( arc_num, enemies_hit_num ) +{ + if ( arc_num >= level.zombie_vars["tesla_max_arcs"] ) + { + debug_print( "TESLA: Ending arcing. Max arcs hit" ); + return true; + } + if ( enemies_hit_num >= level.zombie_vars["tesla_max_enemies_killed"] ) + { + debug_print( "TESLA: Ending arcing. Max enemies killed" ); + return true; + } + radius_decay = level.zombie_vars["tesla_radius_decay"] * arc_num; + if ( level.zombie_vars["tesla_radius_start"] - radius_decay <= 0 ) + { + debug_print( "TESLA: Ending arcing. Radius is less or equal to zero" ); + return true; + } + return false; +} +tesla_get_enemies_in_area( origin, distance, player ) +{ + distance_squared = distance * distance; + enemies = []; + if ( !IsDefined( player.tesla_enemies ) ) + { + player.tesla_enemies = GetAiSpeciesArray( "axis", "all" ); + player.tesla_enemies = get_array_of_closest( origin, player.tesla_enemies ); + } + zombies = player.tesla_enemies; + if ( IsDefined( zombies ) ) + { + for ( i = 0; i < zombies.size; i++ ) + { + if ( !IsDefined( zombies[i] ) ) + { + continue; + } + test_origin = zombies[i] GetTagOrigin( "j_head" ); + if ( IsDefined( zombies[i].zombie_tesla_hit ) && zombies[i].zombie_tesla_hit == true ) + { + continue; + } + if ( is_magic_bullet_shield_enabled( zombies[i] ) ) + { + continue; + } + if ( DistanceSquared( origin, test_origin ) > distance_squared ) + { + continue; + } + if ( !BulletTracePassed( origin, test_origin, false, undefined ) ) + { + continue; + } + enemies[enemies.size] = zombies[i]; + } + } + return enemies; +} +tesla_flag_hit( enemy, hit ) +{ + if( IsArray( enemy ) ) + { + for( i = 0; i < enemy.size; i++ ) + { + enemy[i].zombie_tesla_hit = hit; + } + } + else + { + enemy.zombie_tesla_hit = hit; + } +} +tesla_do_damage( source_enemy, arc_num, player ) +{ + player endon( "disconnect" ); + if ( arc_num > 1 ) + { + wait( RandomFloat( 0.2, 0.6 ) * arc_num ); + } + if( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + if ( !self.isdog ) + { + if( self.has_legs ) + { + self.deathanim = random( level._zombie_tesla_death[self.animname] ); + } + else + { + self.deathanim = random( level._zombie_tesla_crawl_death[self.animname] ); + } + } + else + { + self.a.nodeath = undefined; + } + if( source_enemy != self ) + { + if ( player.tesla_arc_count > 3 ) + { + wait_network_frame(); + player.tesla_arc_count = 0; + } + player.tesla_arc_count++; + source_enemy tesla_play_arc_fx( self ); + } + while ( player.tesla_network_death_choke > level.zombie_vars["tesla_network_death_choke"] ) + { + debug_print( "TESLA: Choking Tesla Damage. Dead enemies this network frame: " + player.tesla_network_death_choke ); + wait( 0.05 ); + } + if( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + player.tesla_network_death_choke++; + self.tesla_death = true; + self tesla_play_death_fx( arc_num ); + origin = source_enemy.origin; + if ( source_enemy == self || !IsDefined( origin ) ) + { + origin = player.origin; + } + if( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + if ( IsDefined( self.tesla_damage_func ) ) + { + self [[ self.tesla_damage_func ]]( origin, player ); + } + else + { + self DoDamage( self.health + 666, origin, player ); + } + player maps\_zombiemode_score::player_add_points( "death", "", "" ); +} +tesla_play_death_fx( arc_num ) +{ + tag = "J_SpineUpper"; + fx = "tesla_shock"; + if ( self.isdog ) + { + tag = "J_Spine1"; + } + if ( arc_num > 1 ) + { + fx = "tesla_shock_secondary"; + } + network_safe_play_fx_on_tag( "tesla_death_fx", 2, level._effect[fx], self, tag ); + self playsound( "wpn_imp_tesla" ); + if ( IsDefined( self.tesla_head_gib_func ) ) + { + [[ self.tesla_head_gib_func ]](); + } +} +tesla_play_arc_fx( target ) +{ + if ( !IsDefined( self ) || !IsDefined( target ) ) + { + wait( level.zombie_vars["tesla_arc_travel_time"] ); + return; + } + tag = "J_SpineUpper"; + if ( self.isdog ) + { + tag = "J_Spine1"; + } + target_tag = "J_SpineUpper"; + if ( target.isdog ) + { + target_tag = "J_Spine1"; + } + origin = self GetTagOrigin( tag ); + target_origin = target GetTagOrigin( target_tag ); + distance_squared = level.zombie_vars["tesla_min_fx_distance"] * level.zombie_vars["tesla_min_fx_distance"]; + if ( DistanceSquared( origin, target_origin ) < distance_squared ) + { + debug_print( "TESLA: Not playing arcing FX. Enemies too close." ); + return; + } + fxOrg = Spawn( "script_model", origin ); + fxOrg SetModel( "tag_origin" ); + fx = PlayFxOnTag( level._effect["tesla_bolt"], fxOrg, "tag_origin" ); + playsoundatposition( "wpn_tesla_bounce", fxOrg.origin ); + fxOrg MoveTo( target_origin, level.zombie_vars["tesla_arc_travel_time"] ); + fxOrg waittill( "movedone" ); + fxOrg delete(); +} +tesla_debug_arc( origin, distance ) +{ +} +is_tesla_damage( mod ) +{ + return ( ( IsDefined( self.damageweapon ) && (self.damageweapon == "tesla_gun_zm" || self.damageweapon == "tesla_gun_upgraded_zm" ) ) && ( mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" ) ); +} +enemy_killed_by_tesla() +{ + return ( IsDefined( self.tesla_death ) && self.tesla_death == true ); +} +on_player_connect() +{ + for( ;; ) + { + level waittill( "connecting", player ); + player thread tesla_sound_thread(); + player thread tesla_pvp_thread(); + player thread tesla_network_choke(); + } +} +tesla_sound_thread() +{ + self endon( "disconnect" ); + self waittill( "spawned_player" ); + for( ;; ) + { + result = self waittill_any_return( "grenade_fire", "death", "player_downed", "weapon_change", "grenade_pullback" ); + if ( !IsDefined( result ) ) + { + continue; + } + if( ( result == "weapon_change" || result == "grenade_fire" ) && (self GetCurrentWeapon() == "tesla_gun_zm" || self GetCurrentWeapon() == "tesla_gun_upgraded_zm") ) + { + self PlayLoopSound( "wpn_tesla_idle", 0.25 ); + } + else + { + self notify ("weap_away"); + self StopLoopSound(0.25); + } + } +} +tesla_engine_sweets() +{ + self endon( "disconnect" ); + self endon ("weap_away"); + while(1) + { + wait(randomintrange(7,15)); + self play_tesla_sound ("wpn_tesla_sweeps_idle"); + } +} +tesla_pvp_thread() +{ + self endon( "disconnect" ); + self endon( "death" ); + self waittill( "spawned_player" ); + for( ;; ) + { + self waittill( "weapon_pvp_attack", attacker, weapon, damage, mod ); + if( self maps\_laststand::player_is_in_laststand() ) + { + continue; + } + if ( weapon != "tesla_gun_zm" && weapon != "tesla_gun_upgraded_zm" ) + { + continue; + } + if ( mod != "MOD_PROJECTILE" && mod != "MOD_PROJECTILE_SPLASH" ) + { + continue; + } + if ( self == attacker ) + { + damage = int( self.maxhealth * .25 ); + if ( damage < 25 ) + { + damage = 25; + } + if ( self.health - damage < 1 ) + { + self.health = 1; + } + else + { + self.health -= damage; + } + } + self setelectrified( 1.0 ); + self shellshock( "electrocution", 1.0 ); + self playsound( "wpn_tesla_bounce" ); + } +} +play_tesla_sound(emotion) +{ + self endon( "disconnect" ); + if(!IsDefined (level.one_emo_at_a_time)) + { + level.one_emo_at_a_time = 0; + level.var_counter = 0; + } + if(level.one_emo_at_a_time == 0) + { + level.var_counter ++; + level.one_emo_at_a_time = 1; + org = spawn("script_origin", self.origin); + org LinkTo(self); + org playsound (emotion, "sound_complete"+ "_"+level.var_counter); + org waittill("sound_complete"+ "_"+level.var_counter); + org delete(); + level.one_emo_at_a_time = 0; + } +} +tesla_killstreak_sound() +{ + self endon( "disconnect" ); + self maps\_zombiemode_audio::create_and_play_dialog( "kill", "tesla" ); + wait(3.5); + level clientNotify ("TGH"); +} +tesla_network_choke() +{ + self endon( "disconnect" ); + self endon( "death" ); + self waittill( "spawned_player" ); + self.tesla_network_death_choke = 0; + for ( ;; ) + { + wait_network_frame(); + wait_network_frame(); + self.tesla_network_death_choke = 0; + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_weap_thundergun.gsc b/BO1/PC/ZM/maps/_zombiemode_weap_thundergun.gsc new file mode 100644 index 0000000..3d58285 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_weap_thundergun.gsc @@ -0,0 +1,270 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_net; +#using_animtree( "generic_human" ); +init() +{ + if( !maps\_zombiemode_weapons::is_weapon_included( "thundergun_zm" ) ) + { + return; + } + level._effect["thundergun_viewmodel_power_cell1"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view1"); + level._effect["thundergun_viewmodel_power_cell2"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view2"); + level._effect["thundergun_viewmodel_power_cell3"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view3"); + level._effect["thundergun_viewmodel_steam"] = loadfx("weapon/thunder_gun/fx_thundergun_steam_view"); + level._effect["thundergun_viewmodel_power_cell1_upgraded"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view1"); + level._effect["thundergun_viewmodel_power_cell2_upgraded"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view2"); + level._effect["thundergun_viewmodel_power_cell3_upgraded"] = loadfx("weapon/thunder_gun/fx_thundergun_power_cell_view3"); + level._effect["thundergun_viewmodel_steam_upgraded"] = loadfx("weapon/thunder_gun/fx_thundergun_steam_view"); + level._effect["thundergun_knockdown_ground"] = loadfx( "weapon/thunder_gun/fx_thundergun_knockback_ground" ); + level._effect["thundergun_smoke_cloud"] = loadfx( "weapon/thunder_gun/fx_thundergun_smoke_cloud" ); + set_zombie_var( "thundergun_cylinder_radius", 180 ); + set_zombie_var( "thundergun_fling_range", 480 ); + set_zombie_var( "thundergun_gib_range", 900 ); + set_zombie_var( "thundergun_gib_damage", 75 ); + set_zombie_var( "thundergun_knockdown_range", 1200 ); + set_zombie_var( "thundergun_knockdown_damage", 15 ); + level.thundergun_gib_refs = []; + level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "guts"; + level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "right_arm"; + level.thundergun_gib_refs[level.thundergun_gib_refs.size] = "left_arm"; + level thread thundergun_on_player_connect(); +} +thundergun_on_player_connect() +{ + for( ;; ) + { + level waittill( "connecting", player ); + player thread wait_for_thundergun_fired(); + } +} +wait_for_thundergun_fired() +{ + self endon( "disconnect" ); + self waittill( "spawned_player" ); + for( ;; ) + { + self waittill( "weapon_fired" ); + currentweapon = self GetCurrentWeapon(); + if( ( currentweapon == "thundergun_zm" ) || ( currentweapon == "thundergun_upgraded_zm" ) ) + { + self thread thundergun_fired(); + view_pos = self GetTagOrigin( "tag_flash" ) - self GetPlayerViewHeight(); + view_angles = self GetTagAngles( "tag_flash" ); + playfx( level._effect["thundergun_smoke_cloud"], view_pos, AnglesToForward( view_angles ), AnglesToUp( view_angles ) ); + } + } +} +thundergun_fired() +{ + PhysicsExplosionCylinder( self.origin, 600, 240, 1 ); + if ( !IsDefined( level.thundergun_knockdown_enemies ) ) + { + level.thundergun_knockdown_enemies = []; + level.thundergun_knockdown_gib = []; + level.thundergun_fling_enemies = []; + level.thundergun_fling_vecs = []; + } + self thundergun_get_enemies_in_range(); + for ( i = 0; i < level.thundergun_fling_enemies.size; i++ ) + { + level.thundergun_fling_enemies[i] thread thundergun_fling_zombie( self, level.thundergun_fling_vecs[i], i ); + } + for ( i = 0; i < level.thundergun_knockdown_enemies.size; i++ ) + { + level.thundergun_knockdown_enemies[i] thread thundergun_knockdown_zombie( self, level.thundergun_knockdown_gib[i] ); + } + level.thundergun_knockdown_enemies = []; + level.thundergun_knockdown_gib = []; + level.thundergun_fling_enemies = []; + level.thundergun_fling_vecs = []; +} +thundergun_get_enemies_in_range() +{ + view_pos = self GetWeaponMuzzlePoint(); + zombies = get_array_of_closest( view_pos, GetAiSpeciesArray( "axis", "all" ), undefined, undefined, level.zombie_vars["thundergun_knockdown_range"] ); + if ( !isDefined( zombies ) ) + { + return; + } + knockdown_range_squared = level.zombie_vars["thundergun_knockdown_range"] * level.zombie_vars["thundergun_knockdown_range"]; + gib_range_squared = level.zombie_vars["thundergun_gib_range"] * level.zombie_vars["thundergun_gib_range"]; + fling_range_squared = level.zombie_vars["thundergun_fling_range"] * level.zombie_vars["thundergun_fling_range"]; + cylinder_radius_squared = level.zombie_vars["thundergun_cylinder_radius"] * level.zombie_vars["thundergun_cylinder_radius"]; + forward_view_angles = self GetWeaponForwardDir(); + end_pos = view_pos + vector_scale( forward_view_angles, level.zombie_vars["thundergun_knockdown_range"] ); + for ( i = 0; i < zombies.size; i++ ) + { + if ( !IsDefined( zombies[i] ) || !IsAlive( zombies[i] ) ) + { + continue; + } + test_origin = zombies[i] getcentroid(); + test_range_squared = DistanceSquared( view_pos, test_origin ); + if ( test_range_squared > knockdown_range_squared ) + { + zombies[i] thundergun_debug_print( "range", (1, 0, 0) ); + return; + } + normal = VectorNormalize( test_origin - view_pos ); + dot = VectorDot( forward_view_angles, normal ); + if ( 0 > dot ) + { + zombies[i] thundergun_debug_print( "dot", (1, 0, 0) ); + continue; + } + radial_origin = PointOnSegmentNearestToPoint( view_pos, end_pos, test_origin ); + if ( DistanceSquared( test_origin, radial_origin ) > cylinder_radius_squared ) + { + zombies[i] thundergun_debug_print( "cylinder", (1, 0, 0) ); + continue; + } + if ( 0 == zombies[i] DamageConeTrace( view_pos, self ) ) + { + zombies[i] thundergun_debug_print( "cone", (1, 0, 0) ); + continue; + } + if ( test_range_squared < fling_range_squared ) + { + level.thundergun_fling_enemies[level.thundergun_fling_enemies.size] = zombies[i]; + dist_mult = (fling_range_squared - test_range_squared) / fling_range_squared; + fling_vec = VectorNormalize( test_origin - view_pos ); + if ( 5000 < test_range_squared ) + { + fling_vec = fling_vec + VectorNormalize( test_origin - radial_origin ); + } + fling_vec = (fling_vec[0], fling_vec[1], abs( fling_vec[2] )); + fling_vec = vector_scale( fling_vec, 100 + 100 * dist_mult ); + level.thundergun_fling_vecs[level.thundergun_fling_vecs.size] = fling_vec; + zombies[i] thread setup_thundergun_vox( self, true, false, false ); + } + else if ( test_range_squared < gib_range_squared ) + { + level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i]; + level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] = true; + zombies[i] thread setup_thundergun_vox( self, false, true, false ); + } + else + { + level.thundergun_knockdown_enemies[level.thundergun_knockdown_enemies.size] = zombies[i]; + level.thundergun_knockdown_gib[level.thundergun_knockdown_gib.size] = false; + zombies[i] thread setup_thundergun_vox( self, false, false, true ); + } + } +} +thundergun_debug_print( msg, color ) +{ +} +thundergun_fling_zombie( player, fling_vec, index ) +{ + if( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + if ( IsDefined( self.thundergun_fling_func ) ) + { + self [[ self.thundergun_fling_func ]]( player ); + return; + } + self DoDamage( self.health + 666, player.origin, player ); + if ( self.health <= 0 ) + { + points = 10; + if ( !index ) + { + points = maps\_zombiemode_score::get_zombie_death_player_points(); + } + else if ( 1 == index ) + { + points = 30; + } + player maps\_zombiemode_score::player_add_points( "thundergun_fling", points ); + self StartRagdoll(); + self LaunchRagdoll( fling_vec ); + self.thundergun_death = true; + } +} +thundergun_knockdown_zombie( player, gib ) +{ + self endon( "death" ); + playsoundatposition ("vox_thundergun_forcehit", self.origin); + if( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + if ( IsDefined( self.thundergun_knockdown_func ) ) + { + self [[ self.thundergun_knockdown_func ]]( player, gib ); + } + else + { + self DoDamage( level.zombie_vars["thundergun_knockdown_damage"], player.origin, player ); + } + if ( gib ) + { + self.a.gib_ref = random( level.thundergun_gib_refs ); + self thread animscripts\zombie_death::do_gib(); + } + self.thundergun_handle_pain_notetracks = ::handle_thundergun_pain_notetracks; + self DoDamage( level.zombie_vars["thundergun_knockdown_damage"], player.origin, player ); +} +handle_thundergun_pain_notetracks( note ) +{ + if ( note == "zombie_knockdown_ground_impact" ) + { + playfx( level._effect["thundergun_knockdown_ground"], self.origin, AnglesToForward( self.angles ), AnglesToUp( self.angles ) ); + self playsound( "fly_thundergun_forcehit" ); + } +} +is_thundergun_damage() +{ + return IsDefined( self.damageweapon ) && (self.damageweapon == "thundergun_zm" || self.damageweapon == "thundergun_upgraded_zm"); +} +enemy_killed_by_thundergun() +{ + return ( IsDefined( self.thundergun_death ) && self.thundergun_death == true ); +} +thundergun_sound_thread() +{ + self endon( "disconnect" ); + self waittill( "spawned_player" ); + for( ;; ) + { + result = self waittill_any_return( "grenade_fire", "death", "player_downed", "weapon_change", "grenade_pullback" ); + if ( !IsDefined( result ) ) + { + continue; + } + if( ( result == "weapon_change" || result == "grenade_fire" ) && self GetCurrentWeapon() == "thundergun_zm" ) + { + self PlayLoopSound( "tesla_idle", 0.25 ); + } + else + { + self notify ("weap_away"); + self StopLoopSound(0.25); + } + } +} +setup_thundergun_vox( player, fling, gib, knockdown ) +{ + if( !IsDefined( self ) || !IsAlive( self ) ) + { + return; + } + if( !fling && ( gib || knockdown ) ) + { + if( 25 > RandomIntRange( 1, 100 ) ) + { + } + } + if( fling ) + { + if( 30 > RandomIntRange( 1, 100 ) ) + { + player maps\_zombiemode_audio::create_and_play_dialog( "kill", "thundergun" ); + } + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_weapon_box.gsc b/BO1/PC/ZM/maps/_zombiemode_weapon_box.gsc new file mode 100644 index 0000000..0e00174 Binary files /dev/null and b/BO1/PC/ZM/maps/_zombiemode_weapon_box.gsc differ diff --git a/BO1/PC/ZM/maps/_zombiemode_weapons.gsc b/BO1/PC/ZM/maps/_zombiemode_weapons.gsc new file mode 100644 index 0000000..179404e --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_weapons.gsc @@ -0,0 +1,2293 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_audio; +init() +{ + init_weapons(); + init_weapon_upgrade(); + init_weapon_toggle(); + init_pay_turret(); + treasure_chest_init(); + level thread add_limited_tesla_gun(); + PreCacheShader( "minimap_icon_mystery_box" ); + PrecacheShader( "specialty_instakill_zombies" ); + PrecacheShader( "specialty_firesale_zombies" ); + level._zombiemode_check_firesale_loc_valid_func = ::default_check_firesale_loc_valid_func; +} +default_check_firesale_loc_valid_func() +{ + return true; +} +add_zombie_weapon( weapon_name, upgrade_name, hint, cost, weaponVO, weaponVOresp, ammo_cost ) +{ + if( IsDefined( level.zombie_include_weapons ) && !IsDefined( level.zombie_include_weapons[weapon_name] ) ) + { + return; + } + table = "mp/zombiemode.csv"; + table_cost = TableLookUp( table, 0, weapon_name, 1 ); + table_ammo_cost = TableLookUp( table, 0, weapon_name, 2 ); + if( IsDefined( table_cost ) && table_cost != "" ) + { + cost = round_up_to_ten( int( table_cost ) ); + } + if( IsDefined( table_ammo_cost ) && table_ammo_cost != "" ) + { + ammo_cost = round_up_to_ten( int( table_ammo_cost ) ); + } + PrecacheString( hint ); + struct = SpawnStruct(); + if( !IsDefined( level.zombie_weapons ) ) + { + level.zombie_weapons = []; + } + struct.weapon_name = weapon_name; + struct.upgrade_name = upgrade_name; + struct.weapon_classname = "weapon_" + weapon_name; + struct.hint = hint; + struct.cost = cost; + struct.vox = weaponVO; + struct.vox_response = weaponVOresp; + struct.is_in_box = level.zombie_include_weapons[weapon_name]; + if( !IsDefined( ammo_cost ) ) + { + ammo_cost = round_up_to_ten( int( cost * 0.5 ) ); + } + struct.ammo_cost = ammo_cost; + level.zombie_weapons[weapon_name] = struct; +} +default_weighting_func() +{ + return 1; +} +default_tesla_weighting_func() +{ + num_to_add = 1; + if( isDefined( level.pulls_since_last_tesla_gun ) ) + { + if( isDefined(level.player_drops_tesla_gun) && level.player_drops_tesla_gun == true ) + { + num_to_add += int(.2 * level.zombie_include_weapons.size); + } + if( !isDefined(level.player_seen_tesla_gun) || level.player_seen_tesla_gun == false ) + { + if( level.round_number > 10 ) + { + num_to_add += int(.2 * level.zombie_include_weapons.size); + } + else if( level.round_number > 5 ) + { + num_to_add += int(.15 * level.zombie_include_weapons.size); + } + } + } + return num_to_add; +} +default_1st_move_weighting_func() +{ + if( level.chest_moves > 0 ) + { + num_to_add = 1; + return num_to_add; + } + else + { + return 0; + } +} +default_upgrade_weapon_weighting_func() +{ + if ( level.chest_moves > 1 ) + { + return 1; + } + else + { + return 0; + } +} +default_cymbal_monkey_weighting_func() +{ + players = get_players(); + count = 0; + for( i = 0; i < players.size; i++ ) + { + if( players[i] has_weapon_or_upgrade( "zombie_cymbal_monkey" ) ) + { + count++; + } + } + if ( count > 0 ) + { + return 1; + } + else + { + if( level.round_number < 10 ) + { + return 3; + } + else + { + return 5; + } + } +} +is_weapon_included( weapon_name ) +{ + if( !IsDefined( level.zombie_weapons ) ) + { + return false; + } + return IsDefined( level.zombie_weapons[weapon_name] ); +} +include_zombie_weapon( weapon_name, in_box, collector, weighting_func ) +{ + if( !IsDefined( level.zombie_include_weapons ) ) + { + level.zombie_include_weapons = []; + level.collector_achievement_weapons = []; + } + if( !isDefined( in_box ) ) + { + in_box = true; + } + if( isDefined( collector ) && collector ) + { + level.collector_achievement_weapons = array_add( level.collector_achievement_weapons, weapon_name ); + } + level.zombie_include_weapons[weapon_name] = in_box; + PrecacheItem( weapon_name ); + if( !isDefined( weighting_func ) ) + { + level.weapon_weighting_funcs[weapon_name] = maps\_zombiemode_weapons::default_weighting_func; + } + else + { + level.weapon_weighting_funcs[weapon_name] = weighting_func; + } +} +init_weapons() +{ + add_zombie_weapon( "m1911_zm", "m1911_upgraded_zm", &"ZOMBIE_WEAPON_M1911", 50, "pistol", "", undefined ); + add_zombie_weapon( "python_zm", "python_upgraded_zm", &"ZOMBIE_WEAPON_PYTHON", 2200, "pistol", "", undefined ); + add_zombie_weapon( "cz75_zm", "cz75_upgraded_zm", &"ZOMBIE_WEAPON_CZ75", 50, "pistol", "", undefined ); + add_zombie_weapon( "ak74u_zm", "ak74u_upgraded_zm", &"ZOMBIE_WEAPON_AK74U", 1200, "smg", "", undefined ); + add_zombie_weapon( "mp5k_zm", "mp5k_upgraded_zm", &"ZOMBIE_WEAPON_MP5K", 1000, "smg", "", undefined ); + add_zombie_weapon( "mp40_zm", "mp40_upgraded_zm", &"ZOMBIE_WEAPON_MP40", 1000, "smg", "", undefined ); + add_zombie_weapon( "mpl_zm", "mpl_upgraded_zm", &"ZOMBIE_WEAPON_MPL", 1000, "smg", "", undefined ); + add_zombie_weapon( "pm63_zm", "pm63_upgraded_zm", &"ZOMBIE_WEAPON_PM63", 1000, "smg", "", undefined ); + add_zombie_weapon( "spectre_zm", "spectre_upgraded_zm", &"ZOMBIE_WEAPON_SPECTRE", 50, "smg", "", undefined ); + add_zombie_weapon( "cz75dw_zm", "cz75dw_upgraded_zm", &"ZOMBIE_WEAPON_CZ75DW", 50, "dualwield", "", undefined ); + add_zombie_weapon( "ithaca_zm", "ithaca_upgraded_zm", &"ZOMBIE_WEAPON_ITHACA", 1500, "shotgun", "", undefined ); + add_zombie_weapon( "spas_zm", "spas_upgraded_zm", &"ZOMBIE_WEAPON_SPAS", 2000, "shotgun", "", undefined ); + add_zombie_weapon( "rottweil72_zm", "rottweil72_upgraded_zm", &"ZOMBIE_WEAPON_ROTTWEIL72", 500, "shotgun", "", undefined ); + add_zombie_weapon( "hs10_zm", "hs10_upgraded_zm", &"ZOMBIE_WEAPON_HS10", 50, "shotgun", "", undefined ); + add_zombie_weapon( "m14_zm", "m14_upgraded_zm", &"ZOMBIE_WEAPON_M14", 500, "rifle", "", undefined ); + add_zombie_weapon( "m16_zm", "m16_gl_upgraded_zm", &"ZOMBIE_WEAPON_M16", 1200, "burstrifle", "", undefined ); + add_zombie_weapon( "g11_lps_zm", "g11_lps_upgraded_zm", &"ZOMBIE_WEAPON_G11", 900, "burstrifle", "", undefined ); + add_zombie_weapon( "famas_zm", "famas_upgraded_zm", &"ZOMBIE_WEAPON_FAMAS", 50, "burstrifle", "", undefined ); + add_zombie_weapon( "aug_acog_zm", "aug_acog_mk_upgraded_zm", &"ZOMBIE_WEAPON_AUG", 1200, "assault", "", undefined ); + add_zombie_weapon( "galil_zm", "galil_upgraded_zm", &"ZOMBIE_WEAPON_GALIL", 100, "assault", "", undefined ); + add_zombie_weapon( "commando_zm", "commando_upgraded_zm", &"ZOMBIE_WEAPON_COMMANDO", 100, "assault", "", undefined ); + add_zombie_weapon( "fnfal_zm", "fnfal_upgraded_zm", &"ZOMBIE_WEAPON_FNFAL", 100, "burstrifle", "", undefined ); + add_zombie_weapon( "dragunov_zm", "dragunov_upgraded_zm", &"ZOMBIE_WEAPON_DRAGUNOV", 2500, "sniper", "", undefined ); + add_zombie_weapon( "l96a1_zm", "l96a1_upgraded_zm", &"ZOMBIE_WEAPON_L96A1", 50, "sniper", "", undefined ); + add_zombie_weapon( "rpk_zm", "rpk_upgraded_zm", &"ZOMBIE_WEAPON_RPK", 4000, "mg", "", undefined ); + add_zombie_weapon( "hk21_zm", "hk21_upgraded_zm", &"ZOMBIE_WEAPON_HK21", 50, "mg", "", undefined ); + add_zombie_weapon( "frag_grenade_zm", undefined, &"ZOMBIE_WEAPON_FRAG_GRENADE", 250, "grenade", "", undefined ); + add_zombie_weapon( "sticky_grenade_zm", undefined, &"ZOMBIE_WEAPON_STICKY_GRENADE", 250, "grenade", "", undefined ); + add_zombie_weapon( "claymore_zm", undefined, &"ZOMBIE_WEAPON_CLAYMORE", 1000, "grenade", "", undefined ); + add_zombie_weapon( "m72_law_zm", "m72_law_upgraded_zm", &"ZOMBIE_WEAPON_M72_LAW", 2000, "launcher", "", undefined ); + add_zombie_weapon( "china_lake_zm", "china_lake_upgraded_zm", &"ZOMBIE_WEAPON_CHINA_LAKE", 2000, "launcher", "", undefined ); + add_zombie_weapon( "zombie_cymbal_monkey", undefined, &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "monkey", "", undefined ); + add_zombie_weapon( "ray_gun_zm", "ray_gun_upgraded_zm", &"ZOMBIE_WEAPON_RAYGUN", 10000, "raygun", "", undefined ); + add_zombie_weapon( "tesla_gun_zm", "tesla_gun_upgraded_zm", &"ZOMBIE_WEAPON_TESLA", 10, "tesla", "", undefined ); + add_zombie_weapon( "thundergun_zm", "thundergun_upgraded_zm", &"ZOMBIE_WEAPON_THUNDERGUN", 10, "thunder", "", undefined ); + add_zombie_weapon( "crossbow_explosive_zm", "crossbow_explosive_upgraded_zm", &"ZOMBIE_WEAPON_CROSSBOW_EXPOLOSIVE", 10, "crossbow", "", undefined ); + add_zombie_weapon( "knife_ballistic_zm", "knife_ballistic_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "bowie", "", undefined ); + add_zombie_weapon( "knife_ballistic_bowie_zm", "knife_ballistic_bowie_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "bowie", "", undefined ); + add_zombie_weapon( "knife_ballistic_sickle_zm", "knife_ballistic_sickle_upgraded_zm", &"ZOMBIE_WEAPON_KNIFE_BALLISTIC", 10, "sickle", "", undefined ); + add_zombie_weapon( "freezegun_zm", "freezegun_upgraded_zm", &"ZOMBIE_WEAPON_FREEZEGUN", 10, "freezegun", "", undefined ); + add_zombie_weapon( "zombie_black_hole_bomb", undefined, &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "gersh", "", undefined ); + add_zombie_weapon( "zombie_nesting_dolls", undefined, &"ZOMBIE_WEAPON_NESTING_DOLLS", 2000, "dolls", "", undefined ); + if(IsDefined(level._zombie_custom_add_weapons)) + { + [[level._zombie_custom_add_weapons]](); + } + Precachemodel("zombie_teddybear"); +} +add_limited_tesla_gun() +{ + weapon_spawns = GetEntArray( "weapon_upgrade", "targetname" ); + for( i = 0; i < weapon_spawns.size; i++ ) + { + hint_string = weapon_spawns[i].zombie_weapon_upgrade; + if(hint_string == "tesla_gun_zm") + { + weapon_spawns[i] waittill("trigger"); + weapon_spawns[i] disable_trigger(); + break; + } + } +} +add_limited_weapon( weapon_name, amount ) +{ + if( !IsDefined( level.limited_weapons ) ) + { + level.limited_weapons = []; + } + level.limited_weapons[weapon_name] = amount; +} +init_pay_turret() +{ + pay_turrets = []; + pay_turrets = GetEntArray( "pay_turret", "targetname" ); + for( i = 0; i < pay_turrets.size; i++ ) + { + cost = level.pay_turret_cost; + if( !isDefined( cost ) ) + { + cost = 1000; + } + pay_turrets[i] SetHintString( &"ZOMBIE_PAY_TURRET", cost ); + pay_turrets[i] SetCursorHint( "HINT_NOICON" ); + pay_turrets[i] UseTriggerRequireLookAt(); + pay_turrets[i] thread pay_turret_think( cost ); + } +} +init_weapon_upgrade() +{ + weapon_spawns = []; + weapon_spawns = GetEntArray( "weapon_upgrade", "targetname" ); + for( i = 0; i < weapon_spawns.size; i++ ) + { + hint_string = get_weapon_hint( weapon_spawns[i].zombie_weapon_upgrade ); + cost = get_weapon_cost( weapon_spawns[i].zombie_weapon_upgrade ); + weapon_spawns[i] SetHintString( hint_string, cost ); + weapon_spawns[i] setCursorHint( "HINT_NOICON" ); + weapon_spawns[i] UseTriggerRequireLookAt(); + weapon_spawns[i] thread weapon_spawn_think(); + model = getent( weapon_spawns[i].target, "targetname" ); + model useweaponhidetags( weapon_spawns[i].zombie_weapon_upgrade ); + model hide(); + } +} +init_weapon_toggle() +{ + if ( !isdefined( level.magic_box_weapon_toggle_init_callback ) ) + { + return; + } + level.zombie_weapon_toggles = []; + level.zombie_weapon_toggle_max_active_count = 0; + level.zombie_weapon_toggle_active_count = 0; + PrecacheString( &"ZOMBIE_WEAPON_TOGGLE_DISABLED" ); + PrecacheString( &"ZOMBIE_WEAPON_TOGGLE_ACTIVATE" ); + PrecacheString( &"ZOMBIE_WEAPON_TOGGLE_DEACTIVATE" ); + PrecacheString( &"ZOMBIE_WEAPON_TOGGLE_ACQUIRED" ); + level.zombie_weapon_toggle_disabled_hint = &"ZOMBIE_WEAPON_TOGGLE_DISABLED"; + level.zombie_weapon_toggle_activate_hint = &"ZOMBIE_WEAPON_TOGGLE_ACTIVATE"; + level.zombie_weapon_toggle_deactivate_hint = &"ZOMBIE_WEAPON_TOGGLE_DEACTIVATE"; + level.zombie_weapon_toggle_acquired_hint = &"ZOMBIE_WEAPON_TOGGLE_ACQUIRED"; + PrecacheModel( "zombie_zapper_cagelight" ); + PrecacheModel( "zombie_zapper_cagelight_green" ); + PrecacheModel( "zombie_zapper_cagelight_red" ); + PrecacheModel( "zombie_zapper_cagelight_on" ); + level.zombie_weapon_toggle_disabled_light = "zombie_zapper_cagelight"; + level.zombie_weapon_toggle_active_light = "zombie_zapper_cagelight_green"; + level.zombie_weapon_toggle_inactive_light = "zombie_zapper_cagelight_red"; + level.zombie_weapon_toggle_acquired_light = "zombie_zapper_cagelight_on"; + weapon_toggle_ents = []; + weapon_toggle_ents = GetEntArray( "magic_box_weapon_toggle", "targetname" ); + for ( i = 0; i < weapon_toggle_ents.size; i++ ) + { + struct = SpawnStruct(); + struct.trigger = weapon_toggle_ents[i]; + struct.weapon_name = struct.trigger.script_string; + struct.upgrade_name = level.zombie_weapons[struct.trigger.script_string].upgrade_name; + struct.enabled = false; + struct.active = false; + struct.acquired = false; + target_array = []; + target_array = GetEntArray( struct.trigger.target, "targetname" ); + for ( j = 0; j < target_array.size; j++ ) + { + switch ( target_array[j].script_string ) + { + case "light": + struct.light = target_array[j]; + struct.light setmodel( level.zombie_weapon_toggle_disabled_light ); + break; + case "weapon": + struct.weapon_model = target_array[j]; + struct.weapon_model hide(); + break; + } + } + struct.trigger SetHintString( level.zombie_weapon_toggle_disabled_hint ); + struct.trigger setCursorHint( "HINT_NOICON" ); + struct.trigger UseTriggerRequireLookAt(); + struct thread weapon_toggle_think(); + level.zombie_weapon_toggles[struct.weapon_name] = struct; + } + level thread [[level.magic_box_weapon_toggle_init_callback]](); +} +get_weapon_toggle( weapon_name ) +{ + if ( !isdefined( level.zombie_weapon_toggles ) ) + { + return undefined; + } + if ( isdefined( level.zombie_weapon_toggles[weapon_name] ) ) + { + return level.zombie_weapon_toggles[weapon_name]; + } + keys = GetArrayKeys( level.zombie_weapon_toggles ); + for ( i = 0; i < keys.size; i++ ) + { + if ( weapon_name == level.zombie_weapon_toggles[keys[i]].upgrade_name ) + { + return level.zombie_weapon_toggles[keys[i]]; + } + } + return undefined; +} +is_weapon_toggle( weapon_name ) +{ + return isdefined( get_weapon_toggle( weapon_name ) ); +} +disable_weapon_toggle( weapon_name ) +{ + toggle = get_weapon_toggle( weapon_name ); + if ( !isdefined( toggle ) ) + { + return; + } + if ( toggle.active ) + { + level.zombie_weapon_toggle_active_count--; + } + toggle.enabled = false; + toggle.active = false; + toggle.light setmodel( level.zombie_weapon_toggle_disabled_light ); + toggle.weapon_model hide(); + toggle.trigger SetHintString( level.zombie_weapon_toggle_disabled_hint ); +} +enable_weapon_toggle( weapon_name ) +{ + toggle = get_weapon_toggle( weapon_name ); + if ( !isdefined( toggle ) ) + { + return; + } + toggle.enabled = true; + toggle.weapon_model show(); + toggle.weapon_model useweaponhidetags( weapon_name ); + deactivate_weapon_toggle( weapon_name ); +} +activate_weapon_toggle( weapon_name, trig_for_vox ) +{ + if ( level.zombie_weapon_toggle_active_count >= level.zombie_weapon_toggle_max_active_count ) + { + if( IsDefined( trig_for_vox ) ) + { + trig_for_vox thread maps\_zombiemode_audio::weapon_toggle_vox( "max" ); + } + return; + } + toggle = get_weapon_toggle( weapon_name ); + if ( !isdefined( toggle ) ) + { + return; + } + if( IsDefined( trig_for_vox ) ) + { + trig_for_vox thread maps\_zombiemode_audio::weapon_toggle_vox( "activate", weapon_name ); + } + level.zombie_weapon_toggle_active_count++; + toggle.active = true; + toggle.light setmodel( level.zombie_weapon_toggle_active_light ); + toggle.trigger SetHintString( level.zombie_weapon_toggle_deactivate_hint ); +} +deactivate_weapon_toggle( weapon_name, trig_for_vox ) +{ + toggle = get_weapon_toggle( weapon_name ); + if ( !isdefined( toggle ) ) + { + return; + } + if( IsDefined( trig_for_vox ) ) + { + trig_for_vox thread maps\_zombiemode_audio::weapon_toggle_vox( "deactivate", weapon_name ); + } + if ( toggle.active ) + { + level.zombie_weapon_toggle_active_count--; + } + toggle.active = false; + toggle.light setmodel( level.zombie_weapon_toggle_inactive_light ); + toggle.trigger SetHintString( level.zombie_weapon_toggle_activate_hint ); +} +acquire_weapon_toggle( weapon_name, player ) +{ + toggle = get_weapon_toggle( weapon_name ); + if ( !isdefined( toggle ) ) + { + return; + } + if ( !toggle.active || toggle.acquired ) + { + return; + } + toggle.acquired = true; + toggle.light setmodel( level.zombie_weapon_toggle_acquired_light ); + toggle.trigger SetHintString( level.zombie_weapon_toggle_acquired_hint ); + toggle thread unacquire_weapon_toggle_on_death_or_disconnect_thread( player ); +} +unacquire_weapon_toggle_on_death_or_disconnect_thread( player ) +{ + self notify( "end_unacquire_weapon_thread" ); + self endon( "end_unacquire_weapon_thread" ); + player waittill_any( "spawned_spectator", "disconnect" ); + unacquire_weapon_toggle( self.weapon_name ); +} +unacquire_weapon_toggle( weapon_name ) +{ + toggle = get_weapon_toggle( weapon_name ); + if ( !isdefined( toggle ) ) + { + return; + } + if ( !toggle.active || !toggle.acquired ) + { + return; + } + toggle.acquired = false; + toggle.light setmodel( level.zombie_weapon_toggle_active_light ); + toggle.trigger SetHintString( level.zombie_weapon_toggle_deactivate_hint ); + toggle notify( "end_unacquire_weapon_thread" ); +} +weapon_toggle_think() +{ + for( ;; ) + { + self.trigger waittill( "trigger", player ); + if( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0.5 ); + continue; + } + if ( !self.enabled || self.acquired ) + { + self.trigger thread maps\_zombiemode_audio::weapon_toggle_vox( "max" ); + } + else if ( !self.active ) + { + activate_weapon_toggle( self.weapon_name, self.trigger ); + } + else + { + deactivate_weapon_toggle( self.weapon_name, self.trigger ); + } + } +} +init_weapon_cabinet() +{ + weapon_cabs = GetEntArray( "weapon_cabinet_use", "targetname" ); + for( i = 0; i < weapon_cabs.size; i++ ) + { + weapon_cabs[i] SetHintString( &"ZOMBIE_CABINET_OPEN_1500" ); + weapon_cabs[i] setCursorHint( "HINT_NOICON" ); + weapon_cabs[i] UseTriggerRequireLookAt(); + } +} +get_weapon_hint( weapon_name ) +{ + AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." ); + return level.zombie_weapons[weapon_name].hint; +} +get_weapon_cost( weapon_name ) +{ + AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." ); + return level.zombie_weapons[weapon_name].cost; +} +get_ammo_cost( weapon_name ) +{ + AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." ); + return level.zombie_weapons[weapon_name].ammo_cost; +} +get_is_in_box( weapon_name ) +{ + AssertEx( IsDefined( level.zombie_weapons[weapon_name] ), weapon_name + " was not included or is not part of the zombie weapon list." ); + return level.zombie_weapons[weapon_name].is_in_box; +} +is_weapon_upgraded( weaponname ) +{ + if( !isdefined( weaponname ) || weaponname == "" ) + { + return false; + } + weaponname = ToLower( weaponname ); + ziw_keys = GetArrayKeys( level.zombie_weapons ); + for ( i=0; i 1) + { + flag_set("moving_chest_enabled"); + level.chests = array_randomize(level.chests); + init_starting_chest_location(); + } + else + { + level.chest_index = 0; + } + array_thread( level.chests, ::treasure_chest_think ); +} +init_starting_chest_location() +{ + level.chest_index = 0; + start_chest_found = false; + for( i = 0; i < level.chests.size; i++ ) + { + if( isdefined( level.random_pandora_box_start ) && level.random_pandora_box_start == true ) + { + if ( start_chest_found || (IsDefined( level.chests[i].start_exclude ) && level.chests[i].start_exclude == 1) ) + { + level.chests[i] hide_chest(); + } + else + { + level.chest_index = i; + level.chests[level.chest_index] hide_rubble(); + level.chests[level.chest_index].hidden = false; + start_chest_found = true; + } + } + else + { + if ( start_chest_found || !IsDefined(level.chests[i].script_noteworthy ) || ( !IsSubStr( level.chests[i].script_noteworthy, "start_chest" ) ) ) + { + level.chests[i] hide_chest(); + } + else + { + level.chest_index = i; + level.chests[level.chest_index] hide_rubble(); + level.chests[level.chest_index].hidden = false; + start_chest_found = true; + } + } + } + if( !isDefined( level.pandora_show_func ) ) + { + level.pandora_show_func = ::default_pandora_show_func; + } + level.chests[level.chest_index] thread [[ level.pandora_show_func ]](); +} +hide_rubble() +{ + rubble = getentarray( self.script_noteworthy + "_rubble", "script_noteworthy" ); + if ( IsDefined( rubble ) ) + { + for ( x = 0; x < rubble.size; x++ ) + { + rubble[x] hide(); + } + } + else + { + println( "^3Warning: No rubble found for magic box" ); + } +} +show_rubble() +{ + if ( IsDefined( self.chest_rubble ) ) + { + for ( x = 0; x < self.chest_rubble.size; x++ ) + { + self.chest_rubble[x] show(); + } + } + else + { + println( "^3Warning: No rubble found for magic box" ); + } +} +set_treasure_chest_cost( cost ) +{ + level.zombie_treasure_chest_cost = cost; +} +get_chest_pieces() +{ + self.chest_lid = GetEnt(self.target, "targetname"); + self.chest_origin = GetEnt(self.chest_lid.target, "targetname"); + self.chest_box = GetEnt(self.chest_origin.target, "targetname"); + self.chest_rubble = []; + rubble = GetEntArray( self.script_noteworthy + "_rubble", "script_noteworthy" ); + for ( i=0; i= self.zombie_cost ) + { + user maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); + user_cost = self.zombie_cost; + self.chest_user = user; + break; + } + else if ( user.score < self.zombie_cost ) + { + user maps\_zombiemode_audio::create_and_play_dialog( "general", "no_money", undefined, 2 ); + continue; + } + wait 0.05; + } + flag_set("chest_has_been_used"); + self._box_open = true; + self._box_opened_by_fire_sale = false; + if ( is_true( level.zombie_vars["zombie_powerup_fire_sale_on"] ) && !IsDefined(self.auto_open) && self [[level._zombiemode_check_firesale_loc_valid_func]]()) + { + self._box_opened_by_fire_sale = true; + } + self.chest_lid thread treasure_chest_lid_open(); + self.timedOut = false; + self.weapon_out = true; + self.chest_origin thread treasure_chest_weapon_spawn( self, user ); + self.chest_origin thread treasure_chest_glowfx(); + self disable_trigger(); + self.chest_origin waittill( "randomization_done" ); + if (flag("moving_chest_now") && !self._box_opened_by_fire_sale && IsDefined(user_cost)) + { + user maps\_zombiemode_score::add_to_player_score( user_cost, false ); + } + if (flag("moving_chest_now") && !level.zombie_vars["zombie_powerup_fire_sale_on"]) + { + self thread treasure_chest_move( self.chest_user ); + } + else + { + self.grab_weapon_hint = true; + self.chest_user = user; + self sethintstring( &"ZOMBIE_TRADE_WEAPONS" ); + self setCursorHint( "HINT_NOICON" ); + self thread decide_hide_show_hint( "weapon_grabbed"); + self enable_trigger(); + self thread treasure_chest_timeout(); + while( 1 ) + { + self waittill( "trigger", grabber ); + self.weapon_out = undefined; + if( IsDefined( grabber.is_drinking ) && grabber is_drinking() ) + { + wait( 0.1 ); + continue; + } + if ( grabber == user && user GetCurrentWeapon() == "none" ) + { + wait( 0.1 ); + continue; + } + if(grabber != level && (IsDefined(self.box_rerespun) && self.box_rerespun)) + { + user = grabber; + } + if( grabber == user || grabber == level ) + { + self.box_rerespun = undefined; + current_weapon = "none"; + if(is_player_valid(user)) + { + current_weapon = user GetCurrentWeapon(); + } + if( grabber == user && is_player_valid( user ) && !user is_drinking() && !is_placeable_mine( current_weapon ) && !is_equipment( current_weapon ) && "syrette_sp" != current_weapon ) + { + bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type magic_accept", + user.playername, user.score, level.team_pool[ user.team_num ].score, level.round_number, self.zombie_cost, self.chest_origin.weapon_string, self.origin ); + self notify( "user_grabbed_weapon" ); + user thread treasure_chest_give_weapon( self.chest_origin.weapon_string ); + break; + } + else if( grabber == level ) + { + unacquire_weapon_toggle( self.chest_origin.weapon_string ); + self.timedOut = true; + if(is_player_valid(user)) + { + bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type magic_reject", + user.playername, user.score, level.team_pool[ user.team_num ].score, level.round_number, self.zombie_cost, self.chest_origin.weapon_string, self.origin ); + } + break; + } + } + wait 0.05; + } + self.grab_weapon_hint = false; + self.chest_origin notify( "weapon_grabbed" ); + if ( !is_true( self._box_opened_by_fire_sale ) ) + { + level.chest_accessed += 1; + } + if( level.chest_moves > 0 && isDefined(level.pulls_since_last_ray_gun) ) + { + level.pulls_since_last_ray_gun += 1; + } + if( isDefined(level.pulls_since_last_tesla_gun) ) + { + level.pulls_since_last_tesla_gun += 1; + } + self disable_trigger(); + self.chest_lid thread treasure_chest_lid_close( self.timedOut ); + wait 3; + if ( (is_true( level.zombie_vars["zombie_powerup_fire_sale_on"] ) && self [[level._zombiemode_check_firesale_loc_valid_func]]()) || self == level.chests[level.chest_index] ) + { + self enable_trigger(); + self setvisibletoall(); + } + } + self._box_open = false; + self._box_opened_by_fire_sale = false; + self.chest_user = undefined; + self notify( "chest_accessed" ); + self thread treasure_chest_think(); +} +decide_hide_show_chest_hint( endon_notify ) +{ + if( isDefined( endon_notify ) ) + { + self endon( endon_notify ); + } + while( true ) + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if ( (IsDefined(self.chest_user) && players[i] != self.chest_user ) || + !players[i] can_buy_weapon() ) + { + self SetInvisibleToPlayer( players[i], true ); + } + else + { + self SetInvisibleToPlayer( players[i], false ); + } + } + wait( 0.1 ); + } +} +weapon_show_hint_choke() +{ + level._weapon_show_hint_choke = 0; + while(1) + { + wait(0.05); + level._weapon_show_hint_choke = 0; + } +} +decide_hide_show_hint( endon_notify ) +{ + if( isDefined( endon_notify ) ) + { + self endon( endon_notify ); + } + if(!IsDefined(level._weapon_show_hint_choke)) + { + level thread weapon_show_hint_choke(); + } + use_choke = false; + if(IsDefined(level._use_choke_weapon_hints) && level._use_choke_weapon_hints == 1) + { + use_choke = true; + } + while( true ) + { + last_update = GetTime(); + if(IsDefined(self.chest_user) && !IsDefined(self.box_rerespun)) + { + if( is_placeable_mine( self.chest_user GetCurrentWeapon() ) || self.chest_user hacker_active()) + { + self SetInvisibleToPlayer( self.chest_user); + } + else + { + self SetVisibleToPlayer( self.chest_user ); + } + } + else + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + if( players[i] can_buy_weapon()) + { + self SetInvisibleToPlayer( players[i], false ); + } + else + { + self SetInvisibleToPlayer( players[i], true ); + } + } + } + if(use_choke) + { + while((level._weapon_show_hint_choke > 4) && (GetTime() < (last_update + 150))) + { + wait 0.05; + } + } + else + { + wait(0.1); + } + level._weapon_show_hint_choke ++; + } +} +can_buy_weapon() +{ + if( IsDefined( self.is_drinking ) && self is_drinking() ) + { + return false; + } + if(self hacker_active()) + { + return false; + } + current_weapon = self GetCurrentWeapon(); + if( is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) ) + { + return false; + } + if( self in_revive_trigger() ) + { + return false; + } + if( current_weapon == "none" ) + { + return false; + } + return true; +} +default_box_move_logic() +{ + index = -1; + for ( i=0; i= level.chests.size) + { + temp_chest_name = level.chests[level.chest_index - 1].script_noteworthy; + level.chest_index = 0; + level.chests = array_randomize(level.chests); + if (temp_chest_name == level.chests[level.chest_index].script_noteworthy) + { + level.chest_index++; + } + } +} +treasure_chest_move( player_vox ) +{ + level waittill("weapon_fly_away_start"); + players = get_players(); + array_thread(players, ::play_crazi_sound); + level waittill("weapon_fly_away_end"); + self.chest_lid thread treasure_chest_lid_close(false); + self setvisibletoall(); + self hide_chest(); + fake_pieces = []; + fake_pieces[0] = spawn("script_model",self.chest_lid.origin); + fake_pieces[0].angles = self.chest_lid.angles; + fake_pieces[0] setmodel(self.chest_lid.model); + fake_pieces[1] = spawn("script_model",self.chest_box.origin); + fake_pieces[1].angles = self.chest_box.angles; + fake_pieces[1] setmodel(self.chest_box.model); + anchor = spawn("script_origin",fake_pieces[0].origin); + soundpoint = spawn("script_origin", self.chest_origin.origin); + anchor playsound("zmb_box_move"); + for(i=0;i 0 && direction[1] > 0)) + { + direction = (direction[0], direction[1] * -1, 0); + } + else if(direction[0] < 0) + { + direction = (direction[0] * -1, direction[1], 0); + } + anchor Vibrate( direction, 10, 0.5, 5); + } + anchor waittill("movedone"); + playfx(level._effect["poltergeist"], self.chest_origin.origin); + playsoundatposition ("zmb_box_poof", soundpoint.origin); + for(i=0;i 0) + { + wait(0.1); + } + } + else + { + post_selection_wait_duration += 5; + } + level.verify_chest = false; + if(IsDefined(level._zombiemode_custom_box_move_logic)) + { + [[level._zombiemode_custom_box_move_logic]](); + } + else + { + default_box_move_logic(); + } + if(IsDefined(level.chests[level.chest_index].box_hacks["summon_box"])) + { + level.chests[level.chest_index] [[level.chests[level.chest_index].box_hacks["summon_box"]]](false); + } + wait(post_selection_wait_duration); + playfx(level._effect["poltergeist"], level.chests[level.chest_index].chest_origin.origin); + level.chests[level.chest_index] show_chest(); + level.chests[level.chest_index] hide_rubble(); + flag_clear("moving_chest_now"); + self.chest_origin.chest_moving = false; +} +fire_sale_fix() +{ + if( !isdefined ( level.zombie_vars["zombie_powerup_fire_sale_on"] ) ) + { + return; + } + if( level.zombie_vars["zombie_powerup_fire_sale_on"] ) + { + self.old_cost = 950; + self thread show_chest(); + self thread hide_rubble(); + self.zombie_cost = 10; + self set_hint_string( self , "powerup_fire_sale_cost" ); + wait_network_frame(); + level waittill( "fire_sale_off" ); + while(is_true(self._box_open )) + { + wait(.1); + } + playfx(level._effect["poltergeist"], self.origin); + self playsound ( "zmb_box_poof_land" ); + self playsound( "zmb_couch_slam" ); + self thread hide_chest(); + self thread show_rubble(); + self.zombie_cost = self.old_cost; + self set_hint_string( self , "default_treasure_chest_" + self.zombie_cost ); + } +} +check_for_desirable_chest_location() +{ + if( !isdefined( level.desirable_chest_location ) ) + return level.chest_index; + if( level.chests[level.chest_index].script_noteworthy == level.desirable_chest_location ) + { + level.desirable_chest_location = undefined; + return level.chest_index; + } + for(i = 0 ; i < level.chests.size; i++ ) + { + if( level.chests[i].script_noteworthy == level.desirable_chest_location ) + { + level.desirable_chest_location = undefined; + return i; + } + } + level.desirable_chest_location = undefined; + return level.chest_index; +} +rotateroll_box() +{ + angles = 40; + angles2 = 0; + while(isdefined(self)) + { + self RotateRoll(angles + angles2, 0.5); + wait(0.7); + angles2 = 40; + self RotateRoll(angles * -2, 0.5); + wait(0.7); + } +} +verify_chest_is_open() +{ + for (i = 0; i < level.open_chest_location.size; i++) + { + if(isdefined(level.open_chest_location[i])) + { + if(level.open_chest_location[i] == level.chests[level.chest_index].script_noteworthy) + { + level.verify_chest = true; + return; + } + } + } + level.verify_chest = false; +} +treasure_chest_timeout() +{ + self endon( "user_grabbed_weapon" ); + self.chest_origin endon( "box_hacked_respin" ); + self.chest_origin endon( "box_hacked_rerespin" ); + wait( 12 ); + self notify( "trigger", level ); +} +treasure_chest_lid_open() +{ + openRoll = 105; + openTime = 0.5; + self RotateRoll( 105, openTime, ( openTime * 0.5 ) ); + play_sound_at_pos( "open_chest", self.origin ); + play_sound_at_pos( "music_chest", self.origin ); +} +treasure_chest_lid_close( timedOut ) +{ + closeRoll = -105; + closeTime = 0.5; + self RotateRoll( closeRoll, closeTime, ( closeTime * 0.5 ) ); + play_sound_at_pos( "close_chest", self.origin ); + self notify("lid_closed"); +} +treasure_chest_ChooseRandomWeapon( player ) +{ + keys = GetArrayKeys( level.zombie_weapons ); + return keys[RandomInt( keys.size )]; +} +treasure_chest_ChooseWeightedRandomWeapon( player ) +{ + keys = GetArrayKeys( level.zombie_weapons ); + toggle_weapons_in_use = 0; + filtered = []; + for( i = 0; i < keys.size; i++ ) + { + if( !get_is_in_box( keys[i] ) ) + { + continue; + } + if( isdefined( player ) && is_player_valid(player) && player has_weapon_or_upgrade( keys[i] ) ) + { + if ( is_weapon_toggle( keys[i] ) ) + { + toggle_weapons_in_use++; + } + continue; + } + if( !IsDefined( keys[i] ) ) + { + continue; + } + num_entries = [[ level.weapon_weighting_funcs[keys[i]] ]](); + for( j = 0; j < num_entries; j++ ) + { + filtered[filtered.size] = keys[i]; + } + } + if( IsDefined( level.limited_weapons ) ) + { + keys2 = GetArrayKeys( level.limited_weapons ); + players = get_players(); + pap_triggers = GetEntArray("zombie_vending_upgrade", "targetname"); + for( q = 0; q < keys2.size; q++ ) + { + count = 0; + for( i = 0; i < players.size; i++ ) + { + if( players[i] has_weapon_or_upgrade( keys2[q] ) ) + { + count++; + } + } + for ( k=0; k= level.limited_weapons[keys2[q]] ) + { + filtered = array_remove( filtered, keys2[q] ); + } + } + } + if ( IsDefined( level.zombie_weapon_toggles ) ) + { + keys2 = GetArrayKeys( level.zombie_weapon_toggles ); + for( q = 0; q < keys2.size; q++ ) + { + if ( level.zombie_weapon_toggles[keys2[q]].active ) + { + if ( toggle_weapons_in_use < level.zombie_weapon_toggle_max_active_count ) + { + continue; + } + } + filtered = array_remove( filtered, keys2[q] ); + } + } + filtered = array_randomize( filtered ); + return filtered[RandomInt( filtered.size )]; +} +weapon_is_dual_wield(name) +{ + switch(name) + { + case "cz75dw_zm": + case "cz75dw_upgraded_zm": + case "m1911_upgraded_zm": + case "hs10_upgraded_zm": + case "pm63_upgraded_zm": + case "microwavegundw_zm": + case "microwavegundw_upgraded_zm": + return true; + default: + return false; + } +} +get_left_hand_weapon_model_name( name ) +{ + switch ( name ) + { + case "microwavegundw_zm": + return GetWeaponModel( "microwavegunlh_zm" ); + case "microwavegundw_upgraded_zm": + return GetWeaponModel( "microwavegunlh_upgraded_zm" ); + default: + return GetWeaponModel( name ); + } +} +clean_up_hacked_box() +{ + self waittill("box_hacked_respin"); + self endon("box_spin_done"); + if(IsDefined(self.weapon_model)) + { + self.weapon_model Delete(); + self.weapon_model = undefined; + } + if(IsDefined(self.weapon_model_dw)) + { + self.weapon_model_dw Delete(); + self.weapon_model_dw = undefined; + } +} +treasure_chest_weapon_spawn( chest, player, respin ) +{ + self endon("box_hacked_respin"); + self thread clean_up_hacked_box(); + assert(IsDefined(player)); + self.weapon_string = undefined; + modelname = undefined; + rand = undefined; + number_cycles = 40; + chest.chest_box setclientflag(level._ZOMBIE_SCRIPTMOVER_FLAG_BOX_RANDOM); + for( i = 0; i < number_cycles; i++ ) + { + if( i < 20 ) + { + wait( 0.05 ); + } + else if( i < 30 ) + { + wait( 0.1 ); + } + else if( i < 35 ) + { + wait( 0.2 ); + } + else if( i < 38 ) + { + wait( 0.3 ); + } + if( i + 1 < number_cycles ) + { + rand = treasure_chest_ChooseRandomWeapon( player ); + } + else + { + rand = treasure_chest_ChooseWeightedRandomWeapon( player ); + } + } + self.weapon_string = rand; + chest.chest_box clearclientflag(level._ZOMBIE_SCRIPTMOVER_FLAG_BOX_RANDOM); + wait_network_frame(); + floatHeight = 40; + self.model_dw = undefined; + self.weapon_model = spawn( "script_model", self.origin + ( 0, 0, floatHeight)); + self.weapon_model.angles = self.angles +( 0, 90, 0 ); + modelname = GetWeaponModel( rand ); + self.weapon_model setmodel( modelname ); + self.weapon_model useweaponhidetags( rand ); + if ( weapon_is_dual_wield(rand)) + { + self.weapon_model_dw = spawn( "script_model", self.weapon_model.origin - ( 3, 3, 3 ) ); + self.weapon_model_dw.angles = self.angles +( 0, 90, 0 ); + self.weapon_model_dw setmodel( get_left_hand_weapon_model_name( rand ) ); + self.weapon_model_dw useweaponhidetags( rand ); + } + if( (GetDvar( #"magic_chest_movable") == "1") && !is_true( chest._box_opened_by_fire_sale ) && !(is_true( level.zombie_vars["zombie_powerup_fire_sale_on"] ) && self [[level._zombiemode_check_firesale_loc_valid_func]]()) ) + { + random = Randomint(100); + if( !isdefined( level.chest_min_move_usage ) ) + { + level.chest_min_move_usage = 4; + } + if( level.chest_accessed < level.chest_min_move_usage ) + { + chance_of_joker = -1; + } + else + { + chance_of_joker = level.chest_accessed + 20; + if ( level.chest_moves == 0 && level.chest_accessed >= 8 ) + { + chance_of_joker = 100; + } + if( level.chest_accessed >= 4 && level.chest_accessed < 8 ) + { + if( random < 15 ) + { + chance_of_joker = 100; + } + else + { + chance_of_joker = -1; + } + } + if ( level.chest_moves > 0 ) + { + if( level.chest_accessed >= 8 && level.chest_accessed < 13 ) + { + if( random < 30 ) + { + chance_of_joker = 100; + } + else + { + chance_of_joker = -1; + } + } + if( level.chest_accessed >= 13 ) + { + if( random < 50 ) + { + chance_of_joker = 100; + } + else + { + chance_of_joker = -1; + } + } + } + } + if(IsDefined(chest.no_fly_away)) + { + chance_of_joker = -1; + } + if(IsDefined(level._zombiemode_chest_joker_chance_mutator_func)) + { + chance_of_joker = [[level._zombiemode_chest_joker_chance_mutator_func]](chance_of_joker); + } + if ( chance_of_joker > random ) + { + self.weapon_string = undefined; + self.weapon_model SetModel("zombie_teddybear"); + self.weapon_model.angles = self.angles; + if(IsDefined(self.weapon_model_dw)) + { + self.weapon_model_dw Delete(); + self.weapon_model_dw = undefined; + } + self.chest_moving = true; + flag_set("moving_chest_now"); + level.chest_accessed = 0; + level.chest_moves++; + } + } + self notify( "randomization_done" ); + if (flag("moving_chest_now") && !(level.zombie_vars["zombie_powerup_fire_sale_on"] && self [[level._zombiemode_check_firesale_loc_valid_func]]())) + { + wait .5; + level notify("weapon_fly_away_start"); + wait 2; + self.weapon_model MoveZ(500, 4, 3); + if(IsDefined(self.weapon_model_dw)) + { + self.weapon_model_dw MoveZ(500,4,3); + } + self.weapon_model waittill("movedone"); + self.weapon_model delete(); + if(IsDefined(self.weapon_model_dw)) + { + self.weapon_model_dw Delete(); + self.weapon_model_dw = undefined; + } + self notify( "box_moving" ); + level notify("weapon_fly_away_end"); + } + else + { + acquire_weapon_toggle( rand, player ); + if( rand == "tesla_gun_zm" || rand == "ray_gun_zm" ) + { + if( rand == "ray_gun_zm" ) + { + level.pulls_since_last_ray_gun = 0; + } + if( rand == "tesla_gun_zm" ) + { + level.pulls_since_last_tesla_gun = 0; + level.player_seen_tesla_gun = true; + } + } + if(!IsDefined(respin)) + { + if(IsDefined(chest.box_hacks["respin"])) + { + self [[chest.box_hacks["respin"]]](chest, player); + } + } + else + { + if(IsDefined(chest.box_hacks["respin_respin"])) + { + self [[chest.box_hacks["respin_respin"]]](chest, player); + } + } + self.weapon_model thread timer_til_despawn(floatHeight); + if(IsDefined(self.weapon_model_dw)) + { + self.weapon_model_dw thread timer_til_despawn(floatHeight); + } + self waittill( "weapon_grabbed" ); + if( !chest.timedOut ) + { + if(IsDefined(self.weapon_model)) + { + self.weapon_model Delete(); + } + if(IsDefined(self.weapon_model_dw)) + { + self.weapon_model_dw Delete(); + } + } + } + self.weapon_string = undefined; + self notify("box_spin_done"); +} +chest_get_min_usage() +{ + min_usage = 4; + return( min_usage ); +} +chest_get_max_usage() +{ + max_usage = 6; + players = get_players(); + if( level.chest_moves == 0 ) + { + if( players.size == 1 ) + { + max_usage = 3; + } + else if( players.size == 2 ) + { + max_usage = 4; + } + else if( players.size == 3 ) + { + max_usage = 5; + } + else + { + max_usage = 6; + } + } + else + { + if( players.size == 1 ) + { + max_usage = 4; + } + else if( players.size == 2 ) + { + max_usage = 4; + } + else if( players.size == 3 ) + { + max_usage = 5; + } + else + { + max_usage = 7; + } + } + return( max_usage ); +} +timer_til_despawn(floatHeight) +{ + self endon("kill_weapon_movement"); + putBackTime = 12; + self MoveTo( self.origin - ( 0, 0, floatHeight ), putBackTime, ( putBackTime * 0.5 ) ); + wait( putBackTime ); + if(isdefined(self)) + { + self Delete(); + } +} +treasure_chest_glowfx() +{ + fxObj = spawn( "script_model", self.origin +( 0, 0, 0 ) ); + fxobj setmodel( "tag_origin" ); + fxobj.angles = self.angles +( 90, 0, 0 ); + playfxontag( level._effect["chest_light"], fxObj, "tag_origin" ); + self waittill_any( "weapon_grabbed", "box_moving" ); + fxobj delete(); +} +treasure_chest_give_weapon( weapon_string ) +{ + self.last_box_weapon = GetTime(); + primaryWeapons = self GetWeaponsListPrimaries(); + current_weapon = undefined; + weapon_limit = 2; + if( self HasWeapon( weapon_string ) ) + { + if ( issubstr( weapon_string, "knife_ballistic_" ) ) + { + self notify( "zmb_lost_knife" ); + } + self GiveStartAmmo( weapon_string ); + self SwitchToWeapon( weapon_string ); + return; + } + if ( self HasPerk( "specialty_additionalprimaryweapon" ) ) + { + weapon_limit = 3; + } + if( primaryWeapons.size >= weapon_limit ) + { + current_weapon = self getCurrentWeapon(); + if ( is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) ) + { + current_weapon = undefined; + } + if( isdefined( current_weapon ) ) + { + if( !is_offhand_weapon( weapon_string ) ) + { + if( current_weapon == "tesla_gun_zm" ) + { + level.player_drops_tesla_gun = true; + } + if ( issubstr( current_weapon, "knife_ballistic_" ) ) + { + self notify( "zmb_lost_knife" ); + } + self TakeWeapon( current_weapon ); + unacquire_weapon_toggle( current_weapon ); + if ( current_weapon == "m1911_zm" ) + { + self.last_pistol_swap = GetTime(); + } + } + } + } + self play_sound_on_ent( "purchase" ); + if( IsDefined( level.zombiemode_offhand_weapon_give_override ) ) + { + self [[ level.zombiemode_offhand_weapon_give_override ]]( weapon_string ); + } + if( weapon_string == "zombie_cymbal_monkey" ) + { + self maps\_zombiemode_weap_cymbal_monkey::player_give_cymbal_monkey(); + self play_weapon_vo(weapon_string); + return; + } + else if ( weapon_string == "knife_ballistic_zm" && self HasWeapon( "bowie_knife_zm" ) ) + { + weapon_string = "knife_ballistic_bowie_zm"; + } + else if ( weapon_string == "knife_ballistic_zm" && self HasWeapon( "sickle_knife_zm" ) ) + { + weapon_string = "knife_ballistic_sickle_zm"; + } + if (weapon_string == "ray_gun_zm") + { + playsoundatposition ("mus_raygun_stinger", (0,0,0)); + } + self GiveWeapon( weapon_string, 0 ); + self GiveStartAmmo( weapon_string ); + self SwitchToWeapon( weapon_string ); + self play_weapon_vo(weapon_string); +} +pay_turret_think( cost ) +{ + if( !isDefined( self.target ) ) + { + return; + } + turret = GetEnt( self.target, "targetname" ); + if( !isDefined( turret ) ) + { + return; + } + turret makeTurretUnusable(); + zone_name = turret get_current_zone(); + if ( !IsDefined( zone_name ) ) + { + zone_name = ""; + } + while( true ) + { + self waittill( "trigger", player ); + if( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0.5 ); + continue; + } + if( player in_revive_trigger() ) + { + wait( 0.1 ); + continue; + } + if( player is_drinking() ) + { + wait(0.1); + continue; + } + if( player.score >= cost ) + { + player maps\_zombiemode_score::minus_to_player_score( cost ); + bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type turret", player.playername, player.score, level.team_pool[ player.team_num ].score, level.round_number, cost, zone_name, self.origin ); + turret makeTurretUsable(); + turret UseBy( player ); + self disable_trigger(); + player maps\_zombiemode_audio::create_and_play_dialog( "weapon_pickup", "mg" ); + player.curr_pay_turret = turret; + turret thread watch_for_laststand( player ); + turret thread watch_for_fake_death( player ); + if( isDefined( level.turret_timer ) ) + { + turret thread watch_for_timeout( player, level.turret_timer ); + } + while( isDefined( turret getTurretOwner() ) && turret getTurretOwner() == player ) + { + wait( 0.05 ); + } + turret notify( "stop watching" ); + player.curr_pay_turret = undefined; + turret makeTurretUnusable(); + self enable_trigger(); + } + else + { + play_sound_on_ent( "no_purchase" ); + player maps\_zombiemode_audio::create_and_play_dialog( "general", "no_money", undefined, 0 ); + } + } +} +watch_for_laststand( player ) +{ + self endon( "stop watching" ); + while( !player maps\_laststand::player_is_in_laststand() ) + { + if( isDefined( level.intermission ) && level.intermission ) + { + intermission = true; + } + wait( 0.05 ); + } + if( isDefined( self getTurretOwner() ) && self getTurretOwner() == player ) + { + self UseBy( player ); + } +} +watch_for_fake_death( player ) +{ + self endon( "stop watching" ); + player waittill( "fake_death" ); + if( isDefined( self getTurretOwner() ) && self getTurretOwner() == player ) + { + self UseBy( player ); + } +} +watch_for_timeout( player, time ) +{ + self endon( "stop watching" ); + self thread cancel_timer_on_end( player ); + wait( time ); + if( isDefined( self getTurretOwner() ) && self getTurretOwner() == player ) + { + self UseBy( player ); + } +} +cancel_timer_on_end( player ) +{ + self waittill( "stop watching" ); + player notify( "stop watching" ); +} +weapon_cabinet_door_open( left_or_right ) +{ + if( left_or_right == "left" ) + { + self rotateyaw( 120, 0.3, 0.2, 0.1 ); + } + else if( left_or_right == "right" ) + { + self rotateyaw( -120, 0.3, 0.2, 0.1 ); + } +} +check_collector_achievement( bought_weapon ) +{ + if ( !isdefined( self.bought_weapons ) ) + { + self.bought_weapons = []; + self.bought_weapons = array_add( self.bought_weapons, bought_weapon ); + } + else if ( !is_in_array( self.bought_weapons, bought_weapon ) ) + { + self.bought_weapons = array_add( self.bought_weapons, bought_weapon ); + } + else + { + return; + } + for( i = 0; i < level.collector_achievement_weapons.size; i++ ) + { + if ( !is_in_array( self.bought_weapons, level.collector_achievement_weapons[i] ) ) + { + return; + } + } + self giveachievement_wrapper( "SP_ZOM_COLLECTOR" ); +} +weapon_set_first_time_hint( cost, ammo_cost ) +{ + if ( isDefined( level.has_pack_a_punch ) && !level.has_pack_a_punch ) + { + self SetHintString( &"ZOMBIE_WEAPONCOSTAMMO", cost, ammo_cost ); + } + else + { + self SetHintString( &"ZOMBIE_WEAPONCOSTAMMO_UPGRADE", cost, ammo_cost ); + } +} +weapon_spawn_think() +{ + cost = get_weapon_cost( self.zombie_weapon_upgrade ); + ammo_cost = get_ammo_cost( self.zombie_weapon_upgrade ); + is_grenade = (WeaponType( self.zombie_weapon_upgrade ) == "grenade"); + self thread decide_hide_show_hint(); + self.first_time_triggered = false; + for( ;; ) + { + self waittill( "trigger", player ); + if( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0.5 ); + continue; + } + if( !player can_buy_weapon() ) + { + wait( 0.1 ); + continue; + } + if( player has_powerup_weapon() ) + { + wait( 0.1 ); + continue; + } + player_has_weapon = player has_weapon_or_upgrade( self.zombie_weapon_upgrade ); + if( !player_has_weapon ) + { + if( player.score >= cost ) + { + if( self.first_time_triggered == false ) + { + model = getent( self.target, "targetname" ); + model thread weapon_show( player ); + self.first_time_triggered = true; + if(!is_grenade) + { + self weapon_set_first_time_hint( cost, ammo_cost ); + } + } + player maps\_zombiemode_score::minus_to_player_score( cost ); + bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type weapon", + player.playername, player.score, level.team_pool[ player.team_num ].score, level.round_number, cost, self.zombie_weapon_upgrade, self.origin ); + if ( is_lethal_grenade( self.zombie_weapon_upgrade ) ) + { + player takeweapon( player get_player_lethal_grenade() ); + player set_player_lethal_grenade( self.zombie_weapon_upgrade ); + } + player weapon_give( self.zombie_weapon_upgrade ); + player check_collector_achievement( self.zombie_weapon_upgrade ); + } + else + { + play_sound_on_ent( "no_purchase" ); + player maps\_zombiemode_audio::create_and_play_dialog( "general", "no_money", undefined, 1 ); + } + } + else + { + if(IsDefined(self.hacked) && self.hacked) + { + if ( !player has_upgrade( self.zombie_weapon_upgrade ) ) + { + ammo_cost = 4500; + } + else + { + ammo_cost = get_ammo_cost( self.zombie_weapon_upgrade ); + } + } + else + { + if ( player has_upgrade( self.zombie_weapon_upgrade ) ) + { + ammo_cost = 4500; + } + else + { + ammo_cost = get_ammo_cost( self.zombie_weapon_upgrade ); + } + } + if( player.score >= ammo_cost ) + { + if( self.first_time_triggered == false ) + { + model = getent( self.target, "targetname" ); + model thread weapon_show( player ); + self.first_time_triggered = true; + if(!is_grenade) + { + self weapon_set_first_time_hint( cost, get_ammo_cost( self.zombie_weapon_upgrade ) ); + } + } + player check_collector_achievement( self.zombie_weapon_upgrade ); + if( player has_upgrade( self.zombie_weapon_upgrade ) ) + { + ammo_given = player ammo_give( level.zombie_weapons[ self.zombie_weapon_upgrade ].upgrade_name ); + } + else + { + ammo_given = player ammo_give( self.zombie_weapon_upgrade ); + } + if( ammo_given ) + { + player maps\_zombiemode_score::minus_to_player_score( ammo_cost ); + bbPrint( "zombie_uses: playername %s playerscore %d teamscore %d round %d cost %d name %s x %f y %f z %f type ammo", + player.playername, player.score, level.team_pool[ player.team_num ].score, level.round_number, ammo_cost, self.zombie_weapon_upgrade, self.origin ); + } + } + else + { + play_sound_on_ent( "no_purchase" ); + player maps\_zombiemode_audio::create_and_play_dialog( "general", "no_money", undefined, 0 ); + } + } + } +} +weapon_show( player ) +{ + player_angles = VectorToAngles( player.origin - self.origin ); + player_yaw = player_angles[1]; + weapon_yaw = self.angles[1]; + if ( isdefined( self.script_int ) ) + { + weapon_yaw -= self.script_int; + } + yaw_diff = AngleClamp180( player_yaw - weapon_yaw ); + if( yaw_diff > 0 ) + { + yaw = weapon_yaw - 90; + } + else + { + yaw = weapon_yaw + 90; + } + self.og_origin = self.origin; + self.origin = self.origin +( AnglesToForward( ( 0, yaw, 0 ) ) * 8 ); + wait( 0.05 ); + self Show(); + play_sound_at_pos( "weapon_show", self.origin, self ); + time = 1; + self MoveTo( self.og_origin, time ); +} +get_pack_a_punch_weapon_options( weapon ) +{ + if ( !isDefined( self.pack_a_punch_weapon_options ) ) + { + self.pack_a_punch_weapon_options = []; + } + if ( !is_weapon_upgraded( weapon ) ) + { + return self CalcWeaponOptions( 0 ); + } + if ( isDefined( self.pack_a_punch_weapon_options[weapon] ) ) + { + return self.pack_a_punch_weapon_options[weapon]; + } + smiley_face_reticle_index = 21; + camo_index = 15; + lens_index = randomIntRange( 0, 6 ); + reticle_index = randomIntRange( 0, smiley_face_reticle_index ); + reticle_color_index = randomIntRange( 0, 6 ); + if ( "famas_upgraded_zm" == weapon ) + { + reticle_index = smiley_face_reticle_index; + } + scary_eyes_reticle_index = 8; + purple_reticle_color_index = 3; + if ( reticle_index == scary_eyes_reticle_index ) + { + reticle_color_index = purple_reticle_color_index; + } + letter_a_reticle_index = 2; + pink_reticle_color_index = 6; + if ( reticle_index == letter_a_reticle_index ) + { + reticle_color_index = pink_reticle_color_index; + } + letter_e_reticle_index = 7; + green_reticle_color_index = 1; + if ( reticle_index == letter_e_reticle_index ) + { + reticle_color_index = green_reticle_color_index; + } + self.pack_a_punch_weapon_options[weapon] = self CalcWeaponOptions( camo_index, lens_index, reticle_index, reticle_color_index ); + return self.pack_a_punch_weapon_options[weapon]; +} +weapon_give( weapon, is_upgrade ) +{ + primaryWeapons = self GetWeaponsListPrimaries(); + current_weapon = undefined; + weapon_limit = 2; + if( !IsDefined( is_upgrade ) ) + { + is_upgrade = false; + } + if ( self HasPerk( "specialty_additionalprimaryweapon" ) ) + { + weapon_limit = 3; + } + if( primaryWeapons.size >= weapon_limit ) + { + current_weapon = self getCurrentWeapon(); + if ( is_placeable_mine( current_weapon ) || is_equipment( current_weapon ) ) + { + current_weapon = undefined; + } + if( isdefined( current_weapon ) ) + { + if( !is_offhand_weapon( weapon ) ) + { + if ( issubstr( current_weapon, "knife_ballistic_" ) ) + { + self notify( "zmb_lost_knife" ); + } + self TakeWeapon( current_weapon ); + unacquire_weapon_toggle( current_weapon ); + if ( current_weapon == "m1911_zm" ) + { + self.last_pistol_swap = GetTime(); + } + } + } + } + if( IsDefined( level.zombiemode_offhand_weapon_give_override ) ) + { + if( self [[ level.zombiemode_offhand_weapon_give_override ]]( weapon ) ) + { + return; + } + } + if( weapon == "zombie_cymbal_monkey" ) + { + self maps\_zombiemode_weap_cymbal_monkey::player_give_cymbal_monkey(); + self play_weapon_vo( weapon ); + return; + } + self play_sound_on_ent( "purchase" ); + if ( !is_weapon_upgraded( weapon ) ) + { + self GiveWeapon( weapon ); + } + else + { + self GiveWeapon( weapon, 0, self get_pack_a_punch_weapon_options( weapon ) ); + } + acquire_weapon_toggle( weapon, self ); + self GiveStartAmmo( weapon ); + self SwitchToWeapon( weapon ); + self play_weapon_vo(weapon); +} +play_weapon_vo(weapon) +{ + if ( isDefined( level._audio_custom_weapon_check ) ) + { + type = self [[ level._audio_custom_weapon_check ]]( weapon ); + } + else + { + type = self weapon_type_check(weapon); + } + self maps\_zombiemode_audio::create_and_play_dialog( "weapon_pickup", type ); +} +weapon_type_check(weapon) +{ + if( !IsDefined( self.entity_num ) ) + return "crappy"; + switch(self.entity_num) + { + case 0: + if( weapon == "m16_zm" ) + return "favorite"; + else if( weapon == "rottweil72_upgraded_zm" ) + return "favorite_upgrade"; + break; + case 1: + if( weapon == "fnfal_zm" ) + return "favorite"; + else if( weapon == "hk21_upgraded_zm" ) + return "favorite_upgrade"; + break; + case 2: + if( weapon == "china_lake_zm" ) + return "favorite"; + else if( weapon == "thundergun_upgraded_zm" ) + return "favorite_upgrade"; + break; + case 3: + if( weapon == "mp40_zm" ) + return "favorite"; + else if( weapon == "crossbow_explosive_upgraded_zm" ) + return "favorite_upgrade"; + break; + } + if( IsSubStr( weapon, "upgraded" ) ) + return "upgrade"; + else + return level.zombie_weapons[weapon].vox; +} +get_player_index(player) +{ + assert( IsPlayer( player ) ); + assert( IsDefined( player.entity_num ) ); + return player.entity_num; +} +ammo_give( weapon ) +{ + give_ammo = false; + if( !is_offhand_weapon( weapon ) ) + { + if( isdefined( weapon ) ) + { + stockMax = 0; + stockMax = WeaponStartAmmo( weapon ); + clipCount = self GetWeaponAmmoClip( weapon ); + currStock = self GetAmmoCount( weapon ); + if( ( currStock - clipcount ) >= stockMax ) + { + give_ammo = false; + } + else + { + give_ammo = true; + } + } + } + else + { + if( self has_weapon_or_upgrade( weapon ) ) + { + if( self getammocount( weapon ) < WeaponMaxAmmo( weapon ) ) + { + give_ammo = true; + } + } + } + if( give_ammo ) + { + self play_sound_on_ent( "purchase" ); + self GiveStartAmmo( weapon ); + return true; + } + if( !give_ammo ) + { + return false; + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombiemode_zone_manager.gsc b/BO1/PC/ZM/maps/_zombiemode_zone_manager.gsc new file mode 100644 index 0000000..a5934f4 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombiemode_zone_manager.gsc @@ -0,0 +1,488 @@ +#include common_scripts\utility; +#include maps\_utility; +init() +{ + flag_init( "zones_initialized" ); + level.zones = []; + level.zone_flags = []; + if ( !IsDefined( level.create_spawner_list_func ) ) + { + level.create_spawner_list_func = ::create_spawner_list; + } +} +zone_is_enabled( zone_name ) +{ + if ( !IsDefined(level.zones) || + !IsDefined(level.zones[ zone_name ]) || + !level.zones[ zone_name ].is_enabled ) + { + return false; + } + return true; +} +get_players_in_zone( zone_name ) +{ + if ( !zone_is_enabled( zone_name ) ) + { + return false; + } + zone = level.zones[ zone_name ]; + num_in_zone = 0; + players = get_players(); + for (i = 0; i < zone.volumes.size; i++) + { + for (j = 0; j < players.size; j++) + { + if ( players[j] IsTouching(zone.volumes[i]) ) + num_in_zone++; + } + } + return num_in_zone; +} +player_in_zone( zone_name ) +{ + if ( !zone_is_enabled( zone_name ) ) + { + return false; + } + zone = level.zones[ zone_name ]; + players = get_players(); + for (i = 0; i < zone.volumes.size; i++) + { + for (j = 0; j < players.size; j++) + { + if ( players[j] IsTouching(zone.volumes[i]) && !(players[j].sessionstate == "spectator")) + return true; + } + } + return false; +} +deactivate_initial_barrier_goals() +{ + special_goals = GetStructArray("exterior_goal", "targetname"); + for (i = 0; i < special_goals.size; i++) + { + if (IsDefined(special_goals[i].script_noteworthy)) + { + special_goals[i].is_active = false; + special_goals[i] trigger_off(); + } + } +} +zone_init( zone_name ) +{ + if ( IsDefined( level.zones[ zone_name ] ) ) + { + return; + } + level.zones[ zone_name ] = SpawnStruct(); + zone = level.zones[ zone_name ]; + zone.is_enabled = false; + zone.is_occupied = false; + zone.is_active = false; + zone.adjacent_zones = []; + zone.volumes = []; + volumes = GetEntArray( zone_name, "targetname" ); + for ( i=0; i zone.num_spawners ) + { + while(zone.spawners.size > zone.num_spawners) + { + i = RandomIntRange(0, zone.spawners.size); + zone.spawners = array_remove(zone.spawners, zone.spawners[i]); + } + } + } + for(x=0;x= 4 ) + { + rand = 1; + } + } + self.run_index = rand; + self set_run_anim( "sprint"+rand ); + self.run_combatanim = level.scr_anim["ape_zombie"]["sprint"+rand]; + self.crouchRunAnim = level.scr_anim["ape_zombie"]["sprint"+rand]; + self.crouchrun_combatanim = level.scr_anim["ape_zombie"]["sprint"+rand]; + rand_f = randomFloatRange( 2, 3 ); + wait( rand_f ); + } + } + else + { + self.zombie_move_speed = "walk"; + self set_run_anim( "walk1" ); + self.run_combatanim = level.scr_anim["ape_zombie"]["walk1"]; + self.crouchRunAnim = level.scr_anim["ape_zombie"]["walk1"]; + self.crouchrun_combatanim = level.scr_anim["ape_zombie"]["walk1"]; + } + self.needs_run_update = true; + wait( 0.05 ); + } +} +ape_move_to_drop(drop_origin,waitflag) +{ + self endon( "death" ); + self endon( "drop_me"); + while( 1 ) + { + self forceteleport(drop_origin); + wait 0.05; + } +} +ape_think() +{ + self endon( "death" ); + spawnOrigin = self.origin; + self thread ape_move_to_drop( self.origin + (0,0,1000), "ape_drop_go" ); + self.run_index = -1; + self.ignoreall = true; + self.pathEnemyFightDist = 64; + self.meleeAttackDist = 64; + self.pissedOff = 0; + self.maxsightdistsqrd = 96 * 96; + VisionSetNaked( "huey_city", 1 ); + maps\createart\zombietron_art::do_single_lightning(); + Playfx( level._effect["ape_lightning_spawn"], spawnOrigin ); + playsoundatposition( "zmb_ape_prespawn", spawnOrigin ); + wait( .5 ); + Playfx( level._effect["ape_lightning_spawn"], spawnOrigin ); + wait( .5 ); + Playfx( level._effect["ape_lightning_spawn"], spawnOrigin ); + playsoundatposition( "zmb_ape_prespawn", spawnOrigin ); + wait( 1.5 ); + self notify("drop_me"); + self forceteleport(spawnOrigin); + playsoundatposition( "zmb_ape_bolt", spawnOrigin ); + Earthquake( 0.5, 0.75, spawnOrigin, 1000); + PlayRumbleOnPosition("explosion_generic", spawnOrigin); + playsoundatposition( "zmb_ape_spawn", spawnOrigin ); + time = getAnimLength( %ai_zombie_simianaut_chest_beat ); + self SetFlaggedAnimKnobAllRestart( "chestbeat_anim", %ai_zombie_simianaut_chest_beat, %body, 1, .1, 1 ); + time = time / 2.0; + self maps\_zombietron_utility::waittill_notify_timeout("damage",time); + self.ignoreall = false; + self thread maps\_zombietron_spawner::find_flesh(); + self thread set_ape_run_cycle(); + self.is_activated = true; + flag_set("boss_is_spawned"); + PlayFxOnTag( level._effect["boss"], self, "tag_origin" ); + while( true ) + { + specialAttackChance = 10; + if ( isDefined(self.favoriteenemy) ) + { + if ( isDefined(self.favoriteenemy.tank) ) + { + specialAttackChance += 15; + } + if ( RandomInt(100) < specialAttackChance ) + { + self notify("stop_find_flesh"); + self notify("killanimscript"); + time = getAnimLength( %ai_zombie_simianaut_taunt ); + self SetFlaggedAnimKnobAllRestart( "chestbeat_anim", %ai_zombie_simianaut_taunt, %body, 1, .1, 1 ); + wait time; + self ClearAnim( %ai_zombie_simianaut_taunt, 0.2 ); + self PlaySound( "zmb_speed_boost_activate" ); + Earthquake( 0.5, 0.75, self.origin, 1000); + PlayRumbleOnPosition("explosion_generic", self.origin); + curdir = anglesToForward(self.angles); + trigger = Spawn( "trigger_radius", self.origin, level.SPAWNFLAG_TRIGGER_AI_AXIS, 65, 50 ); + trigger EnableLinkTo(); + trigger LinkTo( self, "", curdir * 50 ); + trigger thread maps\_zombietron_pickups::shield_trigger_think( self ); + self move_to_position_over_time(self.favoriteenemy.origin,500); + trigger Delete(); + self notify("killanimscript"); + self thread maps\_zombietron_spawner::find_flesh(); + self thread animscripts\zombie_move::moveAgain(); + continue; + } + if (isDefineD(self.favoriteenemy.heli)) + { + specialAttackChance += 45; + } + if (RandomInt(100) < specialAttackChance) + { + self notify("stop_find_flesh"); + self notify("killanimscript"); + time = getAnimLength( %ai_zombie_simianaut_chest_beat ); + self SetFlaggedAnimKnobAllRestart( "chestbeat_anim", %ai_zombie_simianaut_chest_beat, %body, 1, .1, 1 ); + time = time / 2.0; + wait time; + self ClearAnim( %ai_zombie_simianaut_chest_beat, 0.2 ); + Earthquake( 0.5, 0.75, self.origin, 1000); + PlayRumbleOnPosition("explosion_generic", self.origin); + self PlaySound( "evt_turret_takeoff" ); + PlayFxOnTag( level._effect["boss_takeoff"], self, "tag_origin" ); + height = 800; + timeMS = height/1000 * 3000; + trigger = Spawn( "trigger_radius", self.origin, level.SPAWNFLAG_TRIGGER_AI_AXIS, 65, 50 ); + trigger EnableLinkTo(); + trigger LinkTo( self ); + trigger thread maps\_zombietron_pickups::shield_trigger_think( self ); + self move_to_position_over_time(self.favoriteenemy.origin,timeMS,height); + self PlaySound( "zmb_simianaut_groundpound" ); + PlayRumbleOnPosition("explosion_generic", self.origin); + PlayFxOnTag( level._effect["boss_groundhit"], self, "tag_origin" ); + self notify("killanimscript"); + trigger Delete(); + self thread maps\_zombietron_spawner::find_flesh(); + time = getAnimLength( %ai_zombie_simianaut_chest_beat ); + self SetFlaggedAnimKnobAllRestart( "chestbeat_anim", %ai_zombie_simianaut_chest_beat, %body, 1, .1, 1 ); + time = time / 2.0; + wait time; + self ClearAnim( %ai_zombie_simianaut_chest_beat, 0.2 ); + self thread animscripts\zombie_move::moveAgain(); + continue; + } + } + else + { + players = GetPlayers(); + self.favoriteenemy = players[RandomInt(players.size)]; + } + wait( 1 ); + } +} +move_to_position_over_time(destination,timeMS,elevationDelta) +{ + self endon("death"); + frames = timeMS / 50; + delta = (destination - self.origin)/frames; + stopTime = GetTime() + timeMS; + if (isDefined(elevationDelta) ) + { + deltaZ = elevationDelta / ( frames / 2 ); + stopTimeUp = GetTime() + (timeMS/2); + while ( 1 ) + { + time = GetTime(); + if ( time > stopTime ) + { + break; + } + if ( time < stopTimeUp ) + { + deltaPlus = delta + (0,0,deltaZ); + } + else + { + deltaPlus = delta - (0,0,deltaZ); + } + newSpot = self.origin + deltaPlus; + if ( newSpot[2] < destination[2] ) + { + newSpot = (newSpot[0],newSpot[1],destination[2]); + if (isAi(self)) + { + self forceTeleport(newSpot); + } + else + { + self.origin = newSpot; + } + return; + } + if (isAi(self)) + { + self forceTeleport(newSpot); + } + else + { + self.origin = newSpot; + } + wait 0.05; + } + } + else + { + while ( GetTime() 128*128 ) + { + ape OrientMode( "face motion" ); + } + else + { + ape OrientMode( "face point", player.origin ); + } + wait 0.05; + if( distanceSquared( ape.origin, destination ) < 32*32 ) + { + break; + } + } + ape thread maps\_anim::anim_single(ape, "chest_beat"); + wait 2.3; + ape anim_stopanimscripted(0.15); + if ( isDefined(boss_battle) ) + { + } + numTargets = RandomIntRange(2,4); + ape thread ape_KillOnProximity(); + while(numTargets) + { + pickupsItems = GetEntArray("a_pickup_item","script_noteworthy"); + if( pickupsItems.size == 0 ) + { + break; + } + targetPickup = pickupsItems[RandomInt(pickupsItems.size)]; + if (isDefined(targetPickup)) + { + exit_spawn_point = get_closest_to(targetPickup.origin,exit_points); + ape thread ape_you_greedy_mf(exit_spawn_point.origin); + ape SetGoalPos( targetPickup.origin ); + ape waittill_notify_timeout("goal",3); + } + else + { + break; + } + numTargets--; + } + ape SetGoalPos( exit_spawn_point.origin ); + ape waittill("goal"); + level notify("ape_exited"); + wait 1; + assertex(!isDefined(ape),"ape not deleted"); +} +ape_taunt_player() +{ + level.scr_anim["ape_zombie"]["chest_beat"] = %ai_zombie_simianaut_chest_beat; + lastRound = 0; + while(1) + { + level waittill("APE_TAUNT_GO"); + if ( level.arenas[level.current_arena] == "prison" ) + { + continue; + } + if ( level.arenas[level.current_arena] == "rooftop" ) + { + continue; + } + if ( level.arenas[level.current_arena] == "island" ) + { + continue; + } + if ( level.epic_boss_battle == true ) + { + percentMod = 100; + } + else + { + percentMod = level.zombie_vars["boss_taunt_percent_per_level"] + (level.round_number - lastRound)*level.zombie_vars["boss_taunt_percent_per_level"]; + } + if (RandomInt(100)1) + { + player = players[RandomInt(players.size)]; + } + else + { + player = players[0]; + } + best_Loc = player get_closest_to_me(run_locations); + if (!isDefined(best_Loc)) + { + continue; + } + level thread ape_taunt_go(best_Loc.origin, player, level.epic_boss_battle); + } + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombietron_ai_dog.gsc b/BO1/PC/ZM/maps/_zombietron_ai_dog.gsc new file mode 100644 index 0000000..2260683 Binary files /dev/null and b/BO1/PC/ZM/maps/_zombietron_ai_dog.gsc differ diff --git a/BO1/PC/ZM/maps/_zombietron_ai_engineer.gsc b/BO1/PC/ZM/maps/_zombietron_ai_engineer.gsc new file mode 100644 index 0000000..ede1e1a Binary files /dev/null and b/BO1/PC/ZM/maps/_zombietron_ai_engineer.gsc differ diff --git a/BO1/PC/ZM/maps/_zombietron_ai_quad.gsc b/BO1/PC/ZM/maps/_zombietron_ai_quad.gsc new file mode 100644 index 0000000..758176a --- /dev/null +++ b/BO1/PC/ZM/maps/_zombietron_ai_quad.gsc @@ -0,0 +1,384 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombietron_utility; +wait_for_leap() +{ + while ( 1 ) + { + wait( 5 ); + self.custom_attack = true; + wait( .5 ); + self.custom_attack = false; + } +} +#using_animtree( "generic_human" ); +quad_prespawn() +{ + self.animname = "quad_zombie"; + self.custom_idle_setup = maps\_zombietron_ai_quad::quad_zombie_idle_setup; + self.a.idleAnimOverrideArray = []; + self.a.idleAnimOverrideArray["stand"] = []; + self.a.idleAnimOverrideArray["stand"] = []; + self.a.idleAnimOverrideArray["stand"][0][0] = %ai_zombie_quad_idle; + self.a.idleAnimOverrideWeights["stand"][0][0] = 10; + self.a.idleAnimOverrideArray["stand"][0][1] = %ai_zombie_quad_idle_2; + self.a.idleAnimOverrideWeights["stand"][0][1] = 10; + self maps\_zombietron_spawner::zombie_spawn_init( "quad_zombie" ); + self setTeamForEntity( "axis" ); + self playsound( "zmb_quad_spawn" ); + self thread quad_vox(); + self thread quad_close(); + self set_default_attack_properties(); + self thread maps\_zombietron_ai_quad::quad_zombie_think(); + self.moveplaybackrate = 1.3; + self.is_quad = true; +} +quad_zombie_idle_setup() +{ + self.a.array["turn_left_45"] = %exposed_tracking_turn45L; + self.a.array["turn_left_90"] = %exposed_tracking_turn90L; + self.a.array["turn_left_135"] = %exposed_tracking_turn135L; + self.a.array["turn_left_180"] = %exposed_tracking_turn180L; + self.a.array["turn_right_45"] = %exposed_tracking_turn45R; + self.a.array["turn_right_90"] = %exposed_tracking_turn90R; + self.a.array["turn_right_135"] = %exposed_tracking_turn135R; + self.a.array["turn_right_180"] = %exposed_tracking_turn180L; + self.a.array["exposed_idle"] = array( %ai_zombie_quad_idle, %ai_zombie_quad_idle_2 ); + self.a.array["straight_level"] = %ai_zombie_quad_idle; + self.a.array["stand_2_crouch"] = %ai_zombie_shot_leg_right_2_crawl; +} +init_quad_zombie_anims() +{ + level.scr_anim["quad_zombie"]["death1"] = %ai_zombie_quad_death; + level.scr_anim["quad_zombie"]["death2"] = %ai_zombie_quad_death_2; + level.scr_anim["quad_zombie"]["death3"] = %ai_zombie_quad_death_3; + level.scr_anim["quad_zombie"]["death4"] = %ai_zombie_quad_death_4; + level.scr_anim["quad_zombie"]["walk1"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["walk2"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["walk3"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["walk4"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["walk5"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["walk6"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["walk7"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["walk8"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["run1"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["run2"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["run3"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["run4"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["run5"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["run6"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["sprint1"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["sprint2"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["sprint3"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["sprint4"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["crawl1"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["crawl2"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["crawl3"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["crawl4"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["crawl5"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["crawl6"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a; + level.scr_anim["quad_zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b; + level.scr_anim["quad_zombie"]["crawl_sprint1"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["crawl_sprint2"] = %ai_zombie_quad_crawl_sprint_3; + level.scr_anim["quad_zombie"]["crawl_sprint3"] = %ai_zombie_quad_crawl_sprint_3; + if( !isDefined( level._zombie_melee ) ) + { + level._zombie_melee = []; + } + if( !isDefined( level._zombie_walk_melee ) ) + { + level._zombie_walk_melee = []; + } + if( !isDefined( level._zombie_run_melee ) ) + { + level._zombie_run_melee = []; + } + level._zombie_melee["quad_zombie"] = []; + level._zombie_walk_melee["quad_zombie"] = []; + level._zombie_run_melee["quad_zombie"] = []; + level._zombie_melee["quad_zombie"][0] = %ai_zombie_quad_attack; + level._zombie_melee["quad_zombie"][1] = %ai_zombie_quad_attack_2; + level._zombie_melee["quad_zombie"][2] = %ai_zombie_quad_attack_3; + level._zombie_melee["quad_zombie"][3] = %ai_zombie_quad_attack_4; + level._zombie_melee["quad_zombie"][4] = %ai_zombie_quad_attack_5; + level._zombie_melee["quad_zombie"][5] = %ai_zombie_quad_attack_6; + level._zombie_melee["quad_zombie"][6] = %ai_zombie_quad_attack_double; + level._zombie_melee["quad_zombie"][7] = %ai_zombie_quad_attack_double_2; + level._zombie_melee["quad_zombie"][8] = %ai_zombie_quad_attack_double_3; + level._zombie_melee["quad_zombie"][9] = %ai_zombie_quad_attack_double_4; + level._zombie_melee["quad_zombie"][10] = %ai_zombie_quad_attack_double_5; + level._zombie_melee["quad_zombie"][11] = %ai_zombie_quad_attack_double_6; + if( isDefined( level.quad_zombie_anim_override ) ) + { + [[ level.quad_zombie_anim_override ]](); + } + if( !isDefined( level._zombie_melee_crawl ) ) + { + level._zombie_melee_crawl = []; + } + level._zombie_melee_crawl["quad_zombie"] = []; + level._zombie_melee_crawl["quad_zombie"][0] = %ai_zombie_attack_crawl; + level._zombie_melee_crawl["quad_zombie"][1] = %ai_zombie_attack_crawl_lunge; + if( !isDefined( level._zombie_stumpy_melee ) ) + { + level._zombie_stumpy_melee = []; + } + level._zombie_stumpy_melee["quad_zombie"] = []; + level._zombie_stumpy_melee["quad_zombie"][0] = %ai_zombie_walk_on_hands_shot_a; + level._zombie_stumpy_melee["quad_zombie"][1] = %ai_zombie_walk_on_hands_shot_b; + if( !isDefined( level._zombie_tesla_death ) ) + { + level._zombie_tesla_death = []; + } + level._zombie_tesla_death["quad_zombie"] = []; + level._zombie_tesla_death["quad_zombie"][0] = %ai_zombie_quad_death_tesla; + level._zombie_tesla_death["quad_zombie"][1] = %ai_zombie_quad_death_tesla_2; + level._zombie_tesla_death["quad_zombie"][2] = %ai_zombie_quad_death_tesla_3; + level._zombie_tesla_death["quad_zombie"][3] = %ai_zombie_quad_death_tesla_4; + if( !isDefined( level._zombie_tesla_crawl_death ) ) + { + level._zombie_tesla_crawl_death = []; + } + level._zombie_tesla_crawl_death["quad_zombie"] = []; + level._zombie_tesla_crawl_death["quad_zombie"][0] = %ai_zombie_tesla_crawl_death_a; + level._zombie_tesla_crawl_death["quad_zombie"][1] = %ai_zombie_tesla_crawl_death_b; + if( !isDefined( level._zombie_deaths ) ) + { + level._zombie_deaths = []; + } + level._zombie_deaths["quad_zombie"] = []; + level._zombie_deaths["quad_zombie"][0] = %ai_zombie_quad_death; + level._zombie_deaths["quad_zombie"][1] = %ai_zombie_quad_death_2; + level._zombie_deaths["quad_zombie"][2] = %ai_zombie_quad_death_3; + level._zombie_deaths["quad_zombie"][3] = %ai_zombie_quad_death_4; + level._zombie_deaths["quad_zombie"][4] = %ai_zombie_quad_death_5; + level._zombie_deaths["quad_zombie"][5] = %ai_zombie_quad_death_6; + if( !isDefined( level._zombie_rise_anims ) ) + { + level._zombie_rise_anims = []; + } + level._zombie_rise_anims["quad_zombie"] = []; + level._zombie_rise_anims["quad_zombie"][1]["walk"][0] = %ai_zombie_quad_traverse_ground_crawlfast; + level._zombie_rise_anims["quad_zombie"][1]["run"][0] = %ai_zombie_quad_traverse_ground_crawlfast; + level._zombie_rise_anims["quad_zombie"][1]["sprint"][0] = %ai_zombie_quad_traverse_ground_crawlfast; + level._zombie_rise_anims["quad_zombie"][2]["walk"][0] = %ai_zombie_quad_traverse_ground_crawlfast; + if( !isDefined( level._zombie_rise_death_anims ) ) + { + level._zombie_rise_death_anims = []; + } + level._zombie_rise_death_anims["quad_zombie"] = []; + level._zombie_rise_death_anims["quad_zombie"][1]["in"][0] = %ai_zombie_traverse_ground_v1_deathinside; + level._zombie_rise_death_anims["quad_zombie"][1]["in"][1] = %ai_zombie_traverse_ground_v1_deathinside_alt; + level._zombie_rise_death_anims["quad_zombie"][1]["out"][0] = %ai_zombie_traverse_ground_v1_deathoutside; + level._zombie_rise_death_anims["quad_zombie"][1]["out"][1] = %ai_zombie_traverse_ground_v1_deathoutside_alt; + level._zombie_rise_death_anims["quad_zombie"][2]["in"][0] = %ai_zombie_traverse_ground_v2_death_low; + level._zombie_rise_death_anims["quad_zombie"][2]["in"][1] = %ai_zombie_traverse_ground_v2_death_low_alt; + level._zombie_rise_death_anims["quad_zombie"][2]["out"][0] = %ai_zombie_traverse_ground_v2_death_high; + level._zombie_rise_death_anims["quad_zombie"][2]["out"][1] = %ai_zombie_traverse_ground_v2_death_high_alt; + if( !isDefined( level._zombie_run_taunt ) ) + { + level._zombie_run_taunt = []; + } + if( !isDefined( level._zombie_board_taunt ) ) + { + level._zombie_board_taunt = []; + } + level._zombie_run_taunt["quad_zombie"] = []; + level._zombie_board_taunt["quad_zombie"] = []; + level._zombie_board_taunt["quad_zombie"][0] = %ai_zombie_quad_taunt; + level._zombie_board_taunt["quad_zombie"][1] = %ai_zombie_quad_taunt_2; + level._zombie_board_taunt["quad_zombie"][2] = %ai_zombie_quad_taunt_3; + level._zombie_board_taunt["quad_zombie"][3] = %ai_zombie_quad_taunt_4; + level._zombie_board_taunt["quad_zombie"][4] = %ai_zombie_quad_taunt_5; + level._zombie_board_taunt["quad_zombie"][5] = %ai_zombie_quad_taunt_6; +} +quad_vox() +{ + self endon( "death" ); + wait( 5 ); + quad_wait = 5; + while(1) + { + players = getplayers(); + for(i=0;i 1200 * 1200) + { + self playsound( "zmb_quad_amb" ); + quad_wait = 7; + } + else if(DistanceSquared(self.origin, players[i].origin) > 200 * 200) + { + self playsound( "zmb_quad_vox" ); + quad_wait = 5; + } + else if(DistanceSquared(self.origin, players[i].origin) < 150 * 150) + { + wait(.05); + } + } + wait randomfloatrange( 1, quad_wait ); + } +} +quad_close() +{ + self endon( "death" ); + while(1) + { + players = getplayers(); + for(i=0;i min_dist && dist < max_dist ) + { + self set_leap_attack_properties(); + } + else + { + self set_default_attack_properties(); + } + } +} +quad_zombie_think() +{ + self endon( "death" ); + self.specialAttack = maps\_zombietron_ai_quad::TryLeap; + self.state = "waiting"; + self.isAttacking = false; + self.nextSpecial = GetTime(); + for (;;) + { + switch ( self.state ) + { + case "waiting": + check_wait(); + break; + case "leaping": + break; + } + wait_network_frame(); + } +} +trackCollision() +{ + self endon( "death" ); + self endon( "stop_coll" ); + while ( 1 ) + { + check = self GetHitEntType(); + if ( check != "none" ) + { + self thread quad_stop_leap(); + self notify( "stop_leap" ); + self notify( "stop_coll" ); + } + wait_network_frame(); + } +} +quad_finish_leap() +{ + self endon( "death" ); + self.state = "waiting"; + self.isAttacking = false; + self.nextSpecial = GetTime() + 2000; + self animMode("none"); + self.syncedMeleeTarget = undefined; + self OrientMode("face enemy"); +} +quad_stop_leap() +{ + self endon( "death" ); + self SetFlaggedAnimKnobAllRestart("attack",%ai_zombie_quad_attack_leap_loop_out, %body, 1, .1, self.moveplaybackrate); + self animscripts\zombie_shared::DoNoteTracks( "attack" ); + self quad_finish_leap(); +} +quad_leap_attack() +{ + self endon( "death" ); + self endon( "stop_leap" ); + self.state = "leaping"; + self.isAttacking = true; + if( IsDefined( self.enemy ) ) + { + self.syncedMeleeTarget = self.enemy; + angles = VectorToAngles( self.enemy.origin - self.origin ); + self OrientMode( "face angle", angles[1] ); + } + self set_default_attack_properties(); + self.goalradius = 4; + self animMode("nogravity"); + self notify( "stop_coll" ); + self SetFlaggedAnimKnobAllRestart("attack",%ai_zombie_quad_attack_leap_loop, %body, 1, .1, self.moveplaybackrate); + time = getAnimLength( %ai_zombie_quad_attack_leap_loop ); + wait time; + self SetFlaggedAnimKnobAllRestart("attack",%ai_zombie_quad_attack_leap_attack, %body, 1, .1, self.moveplaybackrate); + time = getAnimLength( %ai_zombie_quad_attack_leap_attack ); + wait time; + self OrientMode("face enemy"); + wait 1; + quad_finish_leap(); +} +TryLeap() +{ + if ( self.state == "leaping" ) + { + return true; + } + if ( !IsDefined( self.enemy ) ) + { + return false; + } + if ( DistanceSquared( self.origin, self.enemy.origin ) > 512*512 ) + { + return false; + } + if ( self.a.pose == "prone" ) + { + return false; + } + if ( !self.can_leap ) + { + return false; + } + self thread maps\_zombietron_ai_quad::quad_leap_attack(); + self notify( "special_attack" ); + return true; +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombietron_challenges.gsc b/BO1/PC/ZM/maps/_zombietron_challenges.gsc new file mode 100644 index 0000000..d93d72e --- /dev/null +++ b/BO1/PC/ZM/maps/_zombietron_challenges.gsc @@ -0,0 +1,392 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombietron_utility; +main() +{ + init_sounds(); + if (!isDefined(level.challenge_round_t1)) + { + level.challenge_round_t1 = NewHudElem( self ); + level.challenge_round_t2 = NewHudElem( self ); + level.challenge_round_t1.alignX = "center"; + level.challenge_round_t1.alignY = "middle"; + level.challenge_round_t1.horzAlign = "center"; + level.challenge_round_t1.vertAlign = "middle"; + level.challenge_round_t1.y -= 10; + level.challenge_round_t1.foreground = true; + level.challenge_round_t1.fontScale = 3; + level.challenge_round_t1.color = ( 1.0, 0.0, 0.0 ); + level.challenge_round_t1.hidewheninmenu = true; + level.challenge_round_t2.alignX = "center"; + level.challenge_round_t2.alignY = "middle"; + level.challenge_round_t2.horzAlign = "center"; + level.challenge_round_t2.vertAlign = "middle"; + level.challenge_round_t2.y += 20; + level.challenge_round_t2.foreground = true; + level.challenge_round_t2.fontScale = 2; + level.challenge_round_t2.color = ( 1.0, 0.0, 0.0 ); + level.challenge_round_t2.hidewheninmenu = true; + } + level.RandomMiniBosses = []; + if ( isDefined(level.ChallengeEvents) ) + { + for(i=0;iignite ) + { + PlayFxOnTag( level._effect["barrel_ignite_fire"], self, "tag_origin" ); + self PlayLoopSound( "exp_tron_barrel_fire" ); + } + if ( curTime>fire ) + { + PlayFxOnTag( level._effect["barrel_top_fire"], self, "tag_origin" ); + } + wait 0.2; + curTime = GetTime(); + } + self notify("damage"); +} +barrel_bomb_think() +{ + self thread barrel_blow_think(RandomIntRange(6,12)); + self setcandamage( true ); + self EnableaimAssist(); + self.team = "axis"; + self.is_zombie = true; + self waittill( "damage" ); + PlayFx(level._effect["barrel_explode"],self.origin,(0,1,0)); + physicsExplosionSphere( self.origin, 128, 64, 2 ); + RadiusDamage( self.origin + ( 0, 0, 20 ), 128, 7000, 5000, self, "MOD_PROJECTILE_SPLASH" ); + playRumbleOnPosition( "grenade_rumble", self.origin ); + playsoundatposition( "exp_tron_barrel", self.origin ); + self Delete(); +} +barrel_burst(which) +{ + self endon ("exit_taken"); + if ( flag(which) ) + return; + flag_set(which); + barrelSpawns = []; + if (which == "barrel_burst1") + { + barrelSpawns = GetEntArray("barrel_drop_1","targetname"); + } + else + { + barrelSpawns = GetEntArray("barrel_drop_2","targetname"); + } + if (maps\_zombietron_challenges::is_this_a_challenge_round(level.round_number )) + { + number = RandomInt(barrelSpawns.size); + waitTime = RandomFloatRange(number,20); + } + else + { + number = RandomInt(2); + waitTime = RandomFloatRange(30,60); + } + while(number) + { + level ok_to_spawn( 0.5 ); + spawn_point = barrelSpawns[RandomInt(barrelSpawns.size)]; + barrel = Spawn( "script_model", spawn_point.origin); + barrel SetModel( level.red_barrel_model ); + if ( which == "barrel_burst1") + { + barrel.angles = (0,90,90); + } + else + { + barrel.angles = (0,0,90); + } + barrel SetScale(1.0); + barrel thread barrel_bomb_think(); + barrel PhysicsLaunch( barrel.origin, (0,0,1) ); + wait RandomFloatRange(1,3); + number--; + } + wait waitTime; + flag_clear(which); +} +barrel_dropper() +{ + self endon ("exit_taken"); + btrig1 = getEnt("barrel_drop_1_trig","targetname"); + btrig2 = getEnt("barrel_drop_2_trig","targetname"); + flag_clear("barrel_burst1"); + flag_clear("barrel_burst2"); + while(1) + { + players = GetPlayers(); + for (i=0;i0) + { + zombies = GetAISpeciesArray( "axis", "all" ); + level.zombie_count = zombies.size; + wait 1; + } +} +round_spawning() +{ + level notify("round_spawning_starting"); + level.round_start_time = GetTime(); + level.round_end_time = undefined; + if ( level.epic_boss_battle == true ) + { + flag_wait("boss_intro_done"); + } + if ( level.RandomMiniBosses.size > 0 ) + { + level thread mini_boss_spawn_think(); + } + spawn_set = level.arenas[level.current_arena] + "_spawner"; + level.current_spawners = level.spawners[spawn_set]; + assertex(isDefined(level.current_spawners),"No Spawenrs set up for zombietron environment."); + flag_set("round_is_active"); + level thread round_zombie_counter(8); + for( wave = 0; wave < level.spawn_sequence.size; wave++ ) + { + if ( flag("all_players_dead") ) + { + break; + } + if ( flag("boss_is_spawned") ) + { + if ( flag("boss_is_dead") ) + { + break; + } + else + { + if ( wave == level.spawn_sequence.size - 1) + { + wave -= RandomIntRange(4,10); + if ( wave < 0 ) wave = 0; + } + } + } + if ( isDefined(level.desiredRound) ) + { + break; + } + level.current_wave = level.spawn_sequence[wave]; + thread wave_spawn( level.current_wave ); + wait level.current_wave.time_till_next_group; + } + flag_clear("round_is_active"); + level notify("round_spawning_done"); + level.round_end_time = GetTime(); + wait 1; + zombies = GetAISpeciesArray( "axis", "all" ); + array_thread(zombies,maps\_zombietron_spawner::zombie_killer_failsafe); +} +get_all_the_map_spawners_on_side(side) +{ + spawners = []; + for (i=0;i max ) + { + waves = max; + } + for( i = 0; i < waves; i++ ) + { + level.spawn_sequence[i] = create_spawn_group( i ); + } +} +player_basic_needs() +{ + players=GetPlayers(); + for(i=0;i= level.arenas.size ) + { + level.current_arena = 0; + level.arena_laps++; + } + if ( level.current_arena == arena_findIndexByName("temple") ) + { + maps\_zombietron_scenes::hide_temple_props( "none" ); + } +} +end_of_round_cleanup() +{ + if ( level.arenas[level.current_arena] == "prison" ) + { + players = GetPlayers(); + for(i=0;i= level.desiredRound) + { + level.desiredRound = undefined; + } + level notify( "change_music_state" ); + fade_in(); + } + } +} +end_game() +{ + level waittill ( "end_the_game" ); + wait 2; + level.survived_msg FadeOverTime( 1 ); + level.msg_t3 FadeOverTime( 1 ); + level.survived_msg.alpha = 0; + level.msg_t3.alpha = 0; + wait 1; + fade_out(); + players = get_players(); + for(i=0;i 0 || isDefined(self.stolen_life) ) + { + player_respawn(); + return; + } + wait .2; + } +} +life_link(source,dest) +{ + self endon("disconnect"); + level endon( "end_the_game" ); + orb = Spawn( "script_model", self.origin + (0,0,50) ); + orb SetModel("tag_origin"); + PlayFxOnTag( level._effect["life_force"], orb, "tag_origin" ); + orb thread destroy_me_on_player_notify(source,"disconnect"); + orb thread destroy_me_on_player_notify(dest,"disconnect"); + orb thread destroy_me_on_player_notify(source,"end_life_link"); + while(isDefined(orb)) + { + orb moveto( dest.origin, 0.2, 0, 0 ); + wait 0.2; + if(isDefined(orb)) + { + orb.origin = source.origin; + } + } +} +steal_life_cooldown(time) +{ + self endon("disconnect"); + level endon( "end_the_game" ); + self.stealing = 1; + wait time; + self.stealing = undefined; +} +steal_life_from(source,dest) +{ + self endon("disconnect"); + level endon( "end_the_game" ); + if ( !isDefined(source) || source.lives < 1 ) + return; + if ( isDefined(source.stealing) ) + return; + if ( isDefined(dest.stealing) ) + return; + source thread steal_life_cooldown(10); + dest thread steal_life_cooldown(level.zombie_vars["auto_respawn_timeout"]+5); + source thread life_link(source,dest); + wait 1; + source.lives--; + if (source.lives < 0 ) + { + source.lives = 0; + } + origin = source.origin; + pickup = Spawn( "script_model", origin ); + pickup.angles = source.angles; + pickup SetModel( level.extra_life_model ); + PlayFxOnTag( level._effect[source.light_playFX], pickup, "tag_origin" ); + source thread maps\_zombietron_pickups::turn_shield_on(true); + pickup moveto( dest.origin, 1, 0, 0 ); + pickup PlayLoopSound( "zmb_pickup_life_shimmer" ); + pickup waittill( "movedone" ); + pickup Delete(); + dest.stolen_life = true; + source maps\_zombietron_score::update_hud(); + reward = undefined; + model = undefined; + number = 1; + while( !isDefined(reward) || maps\_zombietron_pickups::can_spawn_pickup( reward ) == false ) + { + i = RandomInt(level.reward_pickups.size); + reward = level.reward_pickups[i]; + switch(reward) + { + case "booster": + model = level.booster_model; + number = 4; + break; + case "bomb": + model = level.bomb_model; + number = 3; + break; + case "heli": + model = level.heli_pickup_model; + number = 1; + break; + case "tank": + model = level.tank_pickup_model; + number = 1; + break; + } + wait 0.05; + } + while(number>0) + { + level thread maps\_zombietron_pickups::directed_pickup_award_to(source,reward,model); + number--; + wait 0.3; + } + source notify("end_life_link"); +} +player_automatic_respawn() +{ + self endon("disconnect"); + level endon( "end_the_game" ); + original_time = level.zombie_vars["auto_respawn_timeout"]; + time_left = original_time; + while(!isAlive(self) && time_left>0 ) + { + wait 0.05; + time_left -= 0.05; + self.headshots = Int( (time_left / original_time) * 1000 ); + } + if (!isAlive(self)) + { + self player_respawn_now(); + } + self.headshots = 0; +} +player_steal_life() +{ + self endon("disconnect"); + level endon( "end_the_game" ); + self thread player_respawn_if_extra_life(); + self thread player_automatic_respawn(); + while(self.lives == 0 && !isDefined(self.stolen_life ) && !level.gameEnded ) + { + wait 1; + if ( isDefined(self.next_life_steal) && GetTime() < self.next_life_steal ) + { + continue; + } + players = GetPlayers(); + richestPlayer = undefined; + biggestLives = 0; + for (i=0;i biggestLives ) + { + biggestLives = players[i].lives; + richestPlayer = players[i]; + } + } + if ( isDefined(richestPlayer) ) + { + level thread steal_life_from(richestPlayer,self); + return; + } + } +} +player_respawn_now() +{ + self maps\_zombietron_score::update_hud(); + self PlaySound( "zmb_player_respawn" ); + PlayFx( level._effect["respawn"], self.origin, AnglesToForward(self.angles) ); + RadiusDamage( self.origin, 200, 10000, 10000, self ); + self Spawn( self.origin, (0,0,0) ); + self thread maps\_zombietron_pickups::turn_shield_on(); + self SetPlayerCollision( 1 ); + self TakeAllWeapons(); + self GiveWeapon( self.default_weap ); + self switchToWeapon( self.default_weap ); + self.headshots = 0; + self DisableWeaponCycling(); + self AllowJump( false ); + self AllowCrouch( false ); + self AllowSprint( false ); + self SetStance("stand"); + self notify("player_respawned"); +} +player_respawn() +{ + wait 2; + if ( self.lives < 1 && !isDefined(self.stolen_life) ) + return; + if( level.gameEnded ) + return; + if ( !isDefined(self.stolen_life) ) + { + self.lives--; + if ( self.lives < 0 ) + { + self.lives = 0; + } + } + else + { + self.stolen_life = undefined; + } + self player_respawn_now(); +} +exit_cleanup() +{ + level waittill( "exit_taken" ); + wait .05; + self notify( "trigger" ); +} +make_exit_magical( trigger ) +{ + level endon("exit_taken"); + trigger waittill( "trigger" ); + level.lastmagical_exit_taken = level.round_number; + level.magical_exit_taken = true; + chance = level.zombie_vars["armory_chance"]; + if ( level.round_number>=20 && !isDefined(level.lastmagical_armory) ) + { + chance = 100; + } + if ( level.round_number > 4 && RandomInt(100) < chance ) + { + level.magical_exit_armory = 1; + level.lastmagical_armory = level.round_number; + } +} +is_exit_open(label) +{ + exit_triggers = get_environment_exits(); + for ( i = 0; i< exit_triggers.size;i++ ) + { + if ( !isDefined(label) && isDefined(exit_triggers[i].exit_open) ) + { + return true; + } + else + if ( exit_triggers[i].script_parameters == label && isDefined(exit_triggers[i].exit_open) ) + { + return true; + } + } + return false; +} +open_exit( trigger, objective_id ) +{ + blocker = GetEnt( trigger.target, "targetname" ); + blocker.origin -= (0,0,500); + trigger.exit_open = true; + trigger thread exit_cleanup(); + objective_add( objective_id, "active", &"EXIT", trigger.origin ); + objective_set3d( objective_id, true, "default","*" ); + objective_current( objective_id ); + trigger waittill( "trigger" ); + trigger.exit_open = undefined; + blocker.origin += (0,0,500); + objective_delete( objective_id ); + wait 0.1; + level notify( "exit_taken", trigger ); +} +open_exits(specific) +{ + level.teleporter_spawned = true; + exit_triggers = get_environment_exits(); + if( exit_triggers.size != 4 ) + { + fade_out(); + level.teleporter_spawned = false; + return; + } + level.survived_msg.hidewheninmenu = true; + level.survived_msg.alpha = 0; + if ( level.magical_exit_taken ) + { + if ( isDefineD(level.magical_exit_armory) ) + { + level.survived_msg SetText( &"ZOMBIETRON_ARMORY"); + } + else + { + level.survived_msg SetText( &"ZOMBIETRON_BONUS"); + } + } + else + { + if (level.round_number-1 > 0 ) + { + level.survived_msg SetText( &"ZOMBIETRON_ROUND_COMPLETE", level.round_number-1 ); + } + } + level.survived_msg FadeOverTime( 1 ); + level.survived_msg.alpha = 1; + if ( isDefined(specific) ) + { + num_exits = 1; + the_specific_exit = []; + for ( i = 0; i< exit_triggers.size;i++ ) + { + if (exit_triggers[i].script_parameters == specific ) + { + the_specific_exit[the_specific_exit.size] = exit_triggers[i]; + } + } + exit_triggers = the_specific_exit; + } + else + { + exit_triggers = randomize_array( exit_triggers ); + num_exits = 1 + randomInt( 3 ); + } + if( level.arena_round_number == level.zombie_vars["zombie_arena_rounds"]) + { + num_exits = 1; + } + level.msg_t3.alpha = 0; + magic_exit = undefined; + if ( level.round_number - level.lastmagical_exit_taken > 2) + { + if ( num_exits > 1 ) + { + magic_exit = RandomInt(num_exits); + } + } + opened_exits = 0; + for( i = 0; i < num_exits; i++ ) + { + if( exit_triggers[i].script_parameters == level.previous_exit_taken ) + { + if ( isDefined(magic_exit) && magic_exit == i ) + { + magic_exit++; + } + i++; + } + if ( isDefined(magic_exit) && i == magic_exit ) + { + level thread make_exit_magical( exit_triggers[i] ); + magic_exit = undefined; + } + level thread open_exit( exit_triggers[i], i ); + opened_exits ++; + PlaySoundAtPosition( "zmb_exit_open", exit_triggers[i].origin ); + wait .2; + } + if (opened_exits > 1) + { + level.msg_t3 SetText( &"ZOMBIETRON_PICK_A_PATH" ); + level.msg_t3 FadeOverTime( 1 ); + level.msg_t3.alpha = 1; + } + flag_set("exits_open"); + level waittill( "exit_taken", exit_trigger ); + flag_clear("exits_open"); + fade_out(); + level.survived_msg FadeOverTime( 1 ); + level.msg_t3 FadeOverTime( 1 ); + level.survived_msg.alpha = 0; + level.msg_t3.alpha = 0; + level notify( "exit_taken_fadeout"); + PlaySoundAtPosition( "zmb_exit_taken", exit_trigger.origin ); + wait 1.7; + level.previous_exit_taken = exit_trigger.script_parameters; + level.teleporter_spawned = false; +} +Rotate() +{ + self endon( "death" ); + while( 1 ) + { + self rotateTo( self.angles + (0, 180, 0), 4 ); + wait 4; + } +} +spawn_teleporter(boss_battle) +{ + level.teleporter_spawned = true; + location = maps\_zombietron_pickups::get_random_pickup_location(); + if( !IsDefined( location ) ) + { + return; + } + level.survived_msg SetText( &"ZOMBIETRON_ROUND_COMPLETE", level.round_number-1 ); + level.msg_t3 SetText( &"ZOMBIETRON_TELEPORTER" ); + level.survived_msg FadeOverTime( 1 ); + level.msg_t3 FadeOverTime( 1 ); + level.survived_msg.alpha = 1; + level.msg_t3.alpha = 1; + above = location.origin + (0,0,10); + below = location.origin + (0,0,-500); + hitp = PlayerPhysicsTrace(above, below); + dest_point = (location.origin[0], location.origin[1], hitp[2]); + start_point = dest_point + (0,0,-50); + teleporter = Spawn( "script_model", start_point ); + teleporter SetModel( "zombie_teleporter_pad" ); + lights = []; + if ( isDefined(level.is_nighttime) ) + { + next = lights.size; + lights[next] = Spawn("script_model", start_point ); + lights[next] SetModel("tag_origin"); + lights[next] thread fake_linkto(teleporter,(0,0,50)); + playfxontag(level._effect["white_light"], lights[next],"tag_origin"); + next = lights.size; + lights[next] = Spawn("script_model", start_point ); + lights[next] SetModel("tag_origin"); + lights[next] thread fake_linkto(teleporter,(0,72,50)); + playfxontag(level._effect["coconut"], lights[next],"tag_origin"); + next = lights.size; + lights[next] = Spawn("script_model", start_point ); + lights[next] SetModel("tag_origin"); + lights[next] thread fake_linkto(teleporter,(72,0,50)); + playfxontag(level._effect["coconut"], lights[next],"tag_origin"); + next = lights.size; + lights[next] = Spawn("script_model", start_point ); + lights[next] SetModel("tag_origin"); + lights[next] thread fake_linkto(teleporter,(0,-72,50)); + playfxontag(level._effect["coconut"], lights[next],"tag_origin"); + next = lights.size; + lights[next] = Spawn("script_model", start_point ); + lights[next] SetModel("tag_origin"); + lights[next] thread fake_linkto(teleporter,(-72,0,50)); + playfxontag(level._effect["coconut"], lights[next],"tag_origin"); + } + teleporter MoveTo( dest_point + (0,0,5), 3, 0, 0 ); + teleporter thread Rotate(); + physicsExplosionSphere( start_point, 200, 128, 4 ); + teleporter waittill( "movedone" ); + physicsExplosionSphere( start_point, 200, 128, 3 ); + playsoundatposition( "zmb_teleporter_spawn", teleporter.origin ); + trigger = spawn( "trigger_radius", location.origin + (0,0,-100), 0, 20, 200 ); + trigger PlayLoopSound( "zmb_teleporter_loop", .5 ); + trigger waittill( "trigger", player ); + PlayRumbleOnPosition("artillery_rumble", location.origin); + trigger StopLoopSound( .5 ); + PlaySoundAtPosition( "zmb_teleporter_tele_out", (0,0,0) ); + level.survived_msg FadeOverTime( 1 ); + level.msg_t3 FadeOverTime( 1 ); + level.survived_msg.alpha = 0; + level.msg_t3.alpha = 0; + if (boss_battle) + { + wait 1; + level maps\_zombietron_spawner::the_big_boss_defeated("ape_zombie"); + level notify("victory_movie_go"); + level waittill("victory_movie_done"); + } + fade_out(); + trigger Delete(); + teleporter Delete(); + if ( isDefined(lights) ) + { + for (i=0;i 0 ), "capacitors are missing!" ); + for( i = 0; i < capacitors.size; i++ ) + { + playfx( level._effect[ "capacitor_light" ], capacitors[ i ].origin ); + } +} +remove_ignore_attacker() +{ + self notify( "new_ignore_attacker" ); + self endon( "new_ignore_attacker" ); + self endon( "disconnect" ); + if( !isDefined( level.ignore_enemy_timer ) ) + { + level.ignore_enemy_timer = 0.4; + } + wait( level.ignore_enemy_timer ); + self.ignoreAttacker = undefined; +} +init_function_overrides() +{ + level.custom_introscreen = ::zombie_intro_screen; + level.reset_clientdvars = ::onPlayerConnect_clientDvars; + level.overridePlayerKilled = ::player_killed_override; + level.overridePlayerDamage = ::player_damage_override; + level.overrideActorDamage = ::actor_damage_override; + level.melee_miss_func = ::zombiemode_melee_miss; + level.callbackPlayerKilled = ::Callback_PlayerKilledZT; +} +initZombieLeaderboardData() +{ + level.zombieLeaderboardStatVariable["zombietron"]["highestwave"] = "zombietron_highestwave"; + level.zombieLeaderboardStatVariable["zombietron"]["timeinwave"] = "zombietron_timeinwave"; + level.zombieLeaderboardStatVariable["zombietron"]["totalpoints"] = "zombietron_totalpoints"; + level.zombieLeaderboardNumber["zombietron"]["waves"] = 3; + level.zombieLeaderboardNumber["zombietron"]["points"] = 4; +} +zombie_intro_screen( string1, string2, string3, string4, string5 ) +{ + flag_wait( "all_players_connected" ); + wait( 1 ); + setmusicstate( "SPLASH_SCREEN" ); + wait (0.2); +} +onPlayerConnect_clientDvars() +{ + self SetClientDvars( "cg_deadChatWithDead", "1", + "cg_deadChatWithTeam", "1", + "cg_deadHearTeamLiving", "1", + "cg_deadHearAllLiving", "1", + "cg_everyoneHearsEveryone", "1", + "compass", "0", + "hud_showStance", "0", + "ammoCounterHide", "1", + "miniscoreboardhide", "1", + "ui_hud_hardcore", "0", + "player_topDownCamMode", "3", + "ai_corpseCount", "14", + "waypointOffscreenPointerHeight", "30", + "waypointOffscreenPointerWidth", "70", + "cg_drawSpectatorMessages", "0", + "sm_sunSampleSizeNear", ".57", + "playerPushAmount", "1" ); + self SetDepthOfField( 0, 0, 512, 4000, 4, 0 ); + self setClientDvars( "aim_lockon_pitch_strength", 0.0,"player_topDownCamOffset", (0, -15, 650),"player_TopDownCamAngles", (75,0,0),"cg_fov", 65 ); +} +player_killed_override() +{ + level waittill( "forever" ); +} +player_damage_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + if ( isDefined(self.shield_is_on) ) + { + self ClearDamageIndicator(); + return 0; + } + if( isDefined( eAttacker ) ) + { + if( isDefined( self.ignoreAttacker ) && self.ignoreAttacker == eAttacker ) + { + return 0; + } + if( (isDefined( eAttacker.is_zombie ) && eAttacker.is_zombie) ) + { + self.ignoreAttacker = eAttacker; + self thread remove_ignore_attacker(); + if ( !isdefined( eAttacker.meleeDamage ) ) + { + iDamage = 45; + } + else if ( isdefined( eAttacker.custom_damage_func ) ) + { + iDamage = eAttacker [[ eAttacker.custom_damage_func ]](); + } + else + { + iDamage = eAttacker.meleeDamage; + } + } + eAttacker notify( "hit_player" ); + } + finalDamage = iDamage; + if( sMeansOfDeath == "MOD_PROJECTILE" || sMeansOfDeath == "MOD_RIFLE_BULLET" || sMeansOfDeath == "MOD_PROJECTILE_SPLASH" || sMeansOfDeath == "MOD_GRENADE" || sMeansOfDeath == "MOD_GRENADE_SPLASH" || sMeansOfDeath == "MOD_BURNED" ) + { + if ( !(sMeansOfDeath == "MOD_PROJECTILE_SPLASH" && isDefined(eAttacker.is_zombie)) ) + { + self ClearDamageIndicator(); + return 0; + } + } + if( iDamage < self.health ) + { + if ( IsDefined( eAttacker ) ) + { + eAttacker.sound_damage_player = self; + } + return finalDamage; + } + return finalDamage; +} +actor_damage_override( inflictor, attacker, damage, flags, meansofdeath, weapon, vpoint, vdir, sHitLoc, modelIndex, psOffsetTime ) +{ + if( !isdefined( self) || !isdefined( attacker ) ) + return damage; + if ( !isplayer( attacker ) && !isplayer( self ) ) + return damage; + if( !isdefined( damage ) || !isdefined( meansofdeath ) ) + return damage; + if( meansofdeath == "" ) + return damage; + final_damage = damage; + if ( IsDefined( self.actor_damage_func ) ) + { + final_damage = [[ self.actor_damage_func ]]( weapon, final_damage ); + } + if( attacker.classname == "script_vehicle" && isDefined( attacker.owner ) ) + attacker = attacker.owner; + return int( final_damage ); +} +zombiemode_melee_miss() +{ + if( isDefined( self.enemy.curr_pay_turret ) ) + { + self.enemy doDamage( GetDvarInt( #"ai_meleeDamage" ), self.origin, self, undefined, "melee", "none" ); + } +} +Callback_PlayerKilledZT( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration ) +{ + self PlaySound( "zmb_player_death" ); + self notify("player_died"); + self.headshots = 0; + self SetPlayerCollision( 0 ); + self maps\_zombietron_score::update_multiplier_bar( 0 ); + if ( isDefined(level.round_end_time) && level.round_start_time < level.round_end_time ) + { + self.zombification_time = level.round_end_time - level.round_start_time; + } + else + { + self.zombification_time = GetTime() - level.round_start_time; + } + if( self.lives == 0 ) + { + players = get_players(); + count = 0; + for( i = 0; i < players.size; i++ ) + { + if( !isAlive(players[i]) && players[i].lives == 0 && !isDefined(players[i].stolen_life) ) + { + count++; + } + } + if( count == players.size ) + { + level notify( "end_the_game" ); + } + else + { + self thread player_steal_life(); + } + } + else + { + self thread player_respawn(); + } +} +get_environment_exits() +{ + return level.arena_exits[level.current_arena]; +} +setup_exits() +{ + level.arena_exits = []; + for( i = 0; i < level.arenas.size; i++ ) + { + arena = level.arenas[i]; + level.arena_exits[i] = GetEntArray( arena + "_exit", "script_noteworthy" ); + } +} +detect_and_change_music_states() +{ + wait_for_all_players(); + setmusicstate( level.arenas[level.current_arena] ); + last_arena = level.current_arena; + while(1) + { + level waittill( "change_music_state" ); + if( level.magical_exit_taken && last_arena != 96 ) + { + setmusicstate( "bonus" ); + last_arena = 96; + continue; + } + else if( level.music_state_fate_round ) + { + setmusicstate( "fate" ); + level.music_state_fate_round = false; + last_arena = 97; + continue; + } + else if( maps\_zombietron_challenges::is_this_a_challenge_round(level.round_number) ) + { + if( level.round_number == 40 ) + { + setmusicstate( "boss" ); + last_arena = 98; + } + else + { + setmusicstate( "challenge" ); + last_arena = 99; + } + continue; + } + else if( level.current_arena != last_arena ) + { + last_arena = level.current_arena; + setmusicstate( level.arenas[level.current_arena] ); + last_music_state = level.arenas[level.current_arena]; + continue; + } + } +} +zombietron_upload_highscore() +{ + playersRank = 1; + if( level.players_playing == 1 ) + playersRank = 4; + else if( level.players_playing == 2 ) + playersRank = 3; + else if( level.players_playing == 3 ) + playersRank = 2; + map_name = GetDvar( #"mapname" ); + if ( !isZombieLeaderboardAvailable( map_name, "waves" ) || !isZombieLeaderboardAvailable( map_name, "points" ) ) + return; + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + pre_highest_wave = players[i] playerZombieStatGet( map_name, "highestwave" ); + pre_time_in_wave = players[i] playerZombieStatGet( map_name, "timeinwave" ); + new_highest_wave = level.round_number + "" + playersRank; + new_highest_wave = int( new_highest_wave ); + if( new_highest_wave >= pre_highest_wave ) + { + if( players[i].zombification_time == 0 ) + { + players[i].zombification_time = GetTime() - level.round_start_time; + } + player_survival_time = players[i].zombification_time; + player_survival_time = int( player_survival_time/1000 ); + if( new_highest_wave > pre_highest_wave || player_survival_time > pre_time_in_wave ) + { + rankNumber = makeRankNumber( level.round_number, playersRank, player_survival_time ); + leaderboard_number = getZombieLeaderboardNumber( map_name, "waves" ); + players[i] UploadScore( leaderboard_number, int(rankNumber), level.round_number, player_survival_time, level.players_playing ); + players[i] playerZombieStatSet( map_name, "highestwave", new_highest_wave ); + players[i] playerZombieStatSet( map_name, "timeinwave", player_survival_time ); + } + } + pre_total_points = players[i] playerZombieStatGet( map_name, "totalpoints" ); + if( players[i].score > pre_total_points ) + { + leaderboard_number = getZombieLeaderboardNumber( map_name, "points" ); + players[i] UploadScore( leaderboard_number, players[i].score, players[i].kills, level.players_playing ); + players[i] playerZombieStatSet( map_name, "totalpoints", players[i].score ); + } + } +} +isZombieLeaderboardAvailable( map, type ) +{ + if ( !isDefined( level.zombieLeaderboardNumber[map] ) ) + return 0; + if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) ) + return 0; + return 1; +} +getZombieLeaderboardNumber( map, type ) +{ + if ( !isDefined( level.zombieLeaderboardNumber[map][type] ) ) + assertMsg( "Unknown leaderboard number for map " + map + "and type " + type ); + return level.zombieLeaderboardNumber[map][type]; +} +getZombieStatVariable( map, variable ) +{ + if ( !isDefined( level.zombieLeaderboardStatVariable[map][variable] ) ) + assertMsg( "Unknown stat variable " + variable + " for map " + map ); + return level.zombieLeaderboardStatVariable[map][variable]; +} +playerZombieStatGet( map, variable ) +{ + stat_variable = getZombieStatVariable( map, variable ); + result = self zombieStatGet( stat_variable ); + if (!isDefined(result)) + { + result = 0; + } + return result; +} +playerZombieStatSet( map, variable, value ) +{ + if (!isDefined(value) ) + { + value = 0; + } + stat_variable = getZombieStatVariable( map, variable ); + self zombieStatSet( stat_variable, value ); +} +zombietron_set_new_zombie_stats() +{ + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + total_kills = players[i] zombieStatGet( "zombie_kills" ) + players[i].stats["kills"]; + total_points = players[i] zombieStatGet( "zombie_points" ) + players[i].stats["score"]; + total_rounds = players[i] zombieStatGet( "zombie_rounds" ) + (level.round_number - 1); + players[i] zombieStatSet( "zombie_kills", total_kills ); + players[i] zombieStatSet( "zombie_points", total_points ); + players[i] zombieStatSet( "zombie_rounds", total_rounds ); + } +} +makeRankNumber( wave, players, time ) +{ + if( time > 86400 ) + time = 86400; + padding = ""; + if ( 10 > time ) + padding += "0000"; + else if( 100 > time ) + padding += "000"; + else if( 1000 > time ) + padding += "00"; + else if( 10000 > time ) + padding += "0"; + rank = wave + "" + players + padding + time; + return rank; +} +zombieStatGet( dataName ) +{ + if( level.systemLink ) + { + return 0; + } + if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size ) + { + return 0; + } + return ( self getdstat( "PlayerStatsList", dataName ) ); +} +zombieStatSet( dataName, value ) +{ + if( level.systemLink ) + { + return; + } + if ( GetDvarInt( #"splitscreen_playerCount" ) == GetPlayers().size ) + { + return; + } + if (!isDefined(value) ) + { + value = 0; + } + self setdstat( "PlayerStatsList", dataName, value ); +} + + + + + + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombietron_pickups.gsc b/BO1/PC/ZM/maps/_zombietron_pickups.gsc new file mode 100644 index 0000000..031ab03 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombietron_pickups.gsc @@ -0,0 +1,2523 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombietron_utility; +init() +{ + PrecacheItem( "m2_flamethrower_zt" ); + PrecacheItem( "ray_gun_zt" ); + PrecacheItem( "m60_zt" ); + PrecacheItem( "minigun_zt" ); + PrecacheItem( "spas_zt" ); + PrecacheItem( "china_lake_zt" ); + PrecacheItem( "rpg_zt" ); + PrecacheVehicle( "heli_mini_zt" ); + map_vehicles_cleanup(); + level.prize_models = []; + level.prize_models[level.prize_models.size] = "zombietron_gold_brick"; + level.prize_models[level.prize_models.size] = "zombietron_gold_bricks"; + level.prize_models[level.prize_models.size] = "zombietron_gold_coin"; + level.prize_models[level.prize_models.size] = "zombietron_silver_brick"; + level.prize_models[level.prize_models.size] = "zombietron_silver_bricks"; + level.prize_models[level.prize_models.size] = "zombietron_silver_coin"; + level.prize_models[level.prize_models.size] = "zombie_z_money_icon"; + level.uber_prize_models = []; + level.uber_prize_models[level.uber_prize_models.size] = "zombietron_ruby"; + level.uber_prize_models[level.uber_prize_models.size] = "zombietron_sapphire"; + level.uber_prize_models[level.uber_prize_models.size] = "zombietron_diamond"; + for( i = 0; i < level.prize_models.size; i++ ) + { + PrecacheModel( level.prize_models[i] ); + } + for( i = 0; i < level.uber_prize_models.size; i++ ) + { + PrecacheModel( level.uber_prize_models[i] ); + } + level.mine_model = "p_glo_electrical_insulator01"; + PrecacheModel( level.mine_model ); + level.extra_life_model = "c_usa_blackops_body1_fb"; + PrecacheModel( level.extra_life_model ); + level.speed_model = "p_rus_boots"; + PrecacheModel( level.speed_model ); + level.tank_pickup_model = "t5_veh_tank_t55_mini_static"; + PrecacheModel( level.tank_pickup_model ); + level.heli_pickup_model = "t5_veh_helo_hind_mini"; + PrecacheModel( level.heli_pickup_model ); + level.spinning_blocker_model = "p_glo_barrel_metal_blue"; + PrecacheModel( level.spinning_blocker_model ); + level.tesla_blocker_model = "zombietron_electric_ball"; + PrecacheModel( level.tesla_blocker_model ); + level.stun_blocker_model = "zombie_teddybear"; + PrecacheModel( level.stun_blocker_model ); + level.double_shot_model = "anim_chicken"; + PrecacheModel( level.double_shot_model ); + level.bomb_model = "zombie_bomb"; + PrecacheModel( level.bomb_model ); + level.booster_model = "zombietron_lightning_bolt"; + PrecacheModel( level.booster_model ); + level.mini_turret_model = "zombie_auto_turret"; + PrecacheModel( level.mini_turret_model ); + level.monkey_model = "weapon_zombie_monkey_bomb_zt"; + PreCacheModel ( level.monkey_model ); + level.cow_model = "anim_asian_water_buffalo"; + PreCacheModel ( level.cow_model ); + level.red_barrel_model = "global_explosive_barrel"; + PreCacheModel ( level.red_barrel_model ); + level.head_model = "char_ger_ansel_head"; + PreCacheModel ( level.head_model ); + level.pickup_last_weapon = undefined; + level.pickup_last_shield = undefined; + level.pickup_types = []; + level.pickup_weapons = []; + level.pickup_types[level.pickup_types.size] = "m2_flamethrower_zt"; + level.pickup_types[level.pickup_types.size] = "minigun_zt"; + level.pickup_types[level.pickup_types.size] = "spas_zt"; + level.pickup_types[level.pickup_types.size] = "china_lake_zt"; + level.pickup_types[level.pickup_types.size] = "rpg_zt"; + level.pickup_types[level.pickup_types.size] = "ray_gun_zt"; + level.pickup_types[level.pickup_types.size] = "bomb"; + level.pickup_types[level.pickup_types.size] = "speed"; + level.pickup_types[level.pickup_types.size] = "booster"; + level.pickup_types[level.pickup_types.size] = "tank"; + level.pickup_types[level.pickup_types.size] = "mini_turret"; + level.pickup_types[level.pickup_types.size] = "mini_turret"; + level.pickup_types[level.pickup_types.size] = "mini_turret"; + level.pickup_types[level.pickup_types.size] = "monkey"; + level.pickup_types[level.pickup_types.size] = "spinning_blockers"; + level.pickup_types[level.pickup_types.size] = "tesla_blockers"; + level.pickup_types[level.pickup_types.size] = "stun_blockers"; + level.pickup_types[level.pickup_types.size] = "double_shot"; + level.pickup_types[level.pickup_types.size] = "double_shot"; + level.pickup_types[level.pickup_types.size] = "double_shot"; + level.pickup_types[level.pickup_types.size] = "heli"; + level.avail_pickups = []; + level.pickup_mutual_exlusive = []; + level.pickup_mutual_exlusion_list = []; + level.pickup_mutual_exlusion_list[level.pickup_mutual_exlusion_list.size] = "tank"; + level.pickup_mutual_exlusion_list[level.pickup_mutual_exlusion_list.size] = "heli"; + level.pickup_mutual_exlusion_list[level.pickup_mutual_exlusion_list.size] = "tesla_blockers"; + level.pickup_mutual_exlusion_list[level.pickup_mutual_exlusion_list.size] = "stun_blockers"; + level.pickup_mutual_exlusion_list[level.pickup_mutual_exlusion_list.size] = "spinning_blockers"; + for(i=0;i 0 ) + { + while( !flag("round_is_active") ) + { + wait 5; + } + wait 5; + waittime -= 5; + } + players = get_players(); + lives = 0; + for( i = 0; i < players.size; i++ ) + { + lives += players[i].lives; + } + waittime = lives * 10; + while( waittime > 0 ) + { + while( !flag("round_is_active") ) + { + wait 5; + } + wait 5; + waittime -= 5; + } + if ( flag("all_players_dead") ) + { + continue; + } + spawn_point = get_random_pickup_location(); + if( isDefined( spawn_point ) ) + { + type = "extra_life"; + origin = spawn_point.origin; + pickup = Spawn( "script_model", origin ); + pickup.script_noteworthy = "a_pickup_item"; + yaw = RandomInt( 360 ); + pickup.angles = ( 0, yaw, 0 ); + pickup SetModel( level.extra_life_model ); + trigger = spawn( "trigger_radius", origin, 0, 30, 128 ); + pickup setclientflag(level._ZT_SCRIPTMOVER_CF_POWERUP); + pickup.type = type; + pickup thread wait_for_pickup( type, trigger ); + pickup thread powerup_timeout( trigger ); + pickup thread powerup_wobble( trigger ); + pickup.trigger= trigger; + } + } +} +pickup_spawner() +{ + stall = false; + while( 1 ) + { + if ( !stall ) + { + wait RandomFloatRange( 10, 15 ); + } + stall = false; + while( !flag("round_is_active") ) + { + wait 1; + stall = true; + } + if ( stall ) + { + continue; + } + if ( flag("all_players_dead") ) + { + continue; + } + spawn_random_pickup(); + } +} +prize_spawner() +{ + stall = false; + while( 1 ) + { + if (!stall) + { + wait RandomFloatRange( 10, 20 ); + } + stall = false; + while( !flag("round_is_active") ) + { + wait 1; + stall = true; + } + if (stall) + { + continue; + } + if ( flag("all_players_dead") ) + { + continue; + } + spawn_prize_glob(); + } +} +spawn_treasures(spawn_point,count, radOverride,timeout) +{ + level endon("stop_spawning_pickups"); + if (!isDefined(spawn_point)) + { + return; + } + type = "money"; + for( i = 0; i < count; i++ ) + { + radius = 85; + if( IsDefined( radOverride ) ) + { + radius = radOverride; + } + origin = spawn_point + ( RandomIntRange( 0-radius, radius ), RandomIntRange( 0-radius, radius ), 24 ); + if ( RandomFloat(100) 5 ) scale = 5; + pickup setscale(scale); + wait_network_frame(); + if (!isDefined(pickup) ) + { + return; + } + trigger = spawn( "trigger_radius", spawn_point, 0, 40, 128 ); + pickup thread wait_for_pickup( type, trigger ); + pickup thread powerup_timeout( trigger, level.zombie_vars["powerup_uber_timeout"] ); + pickup.trigger= trigger; + return pickup; +} +spawn_uber_prizes(increments,spawn_point,popUp,popVec) +{ + quarterBar = level.zombie_vars["max_prize_inc_range"] / 4; + while(increments>0) + { + if (increments >= quarterBar) + { + pickup = spawn_uber_prize(quarterBar,spawn_point); + increments -= quarterBar; + } + else + { + pickup = spawn_uber_prize(increments,spawn_point); + increments = 0; + } + if ( isDefined(pickup) ) + { + if ( isDefined(popUp) ) + { + pickup.trigger EnableLinkTo(); + pickup.trigger LinkTo( pickup ); + pickup thread powerup_popup(pickup.trigger,popVec); + } + else + { + pickup thread powerup_wobble( pickup.trigger); + } + wait_network_frame(); + } + } +} +powerup_popup(trigger,popVec) +{ + trigger trigger_off(); + if ( !isDefined(popVec) ) + { + target_point = self.origin + (RandomFloatRange(-4,4),RandomFloatRange(-4,4),20); + } + else + { + target_point = self.origin + popVec; + } + vel = target_point - self.origin; + self.origin += 4*vel; + vel = vel * RandomFloatRange(25,40); + self PhysicsLaunch( self.origin, vel ); + wait 3; + if (isDefined(trigger)) + { + trigger trigger_on(); + } +} +get_random_pickup_type() +{ + if ( level.avail_pickups.size < (level.pickup_types.size/4) ) + { + level.avail_pickups = randomize_array(level.pickup_types); + } + pu = level.avail_pickups [ 0 ]; + level.avail_pickups = array_remove(level.avail_pickups,pu); + return pu; +} +get_random_pickup_location(ignore) +{ + spawn_locations = []; + pickupTarget = level.arenas[level.current_arena] + "_pickup"; + spawn_locations = GetStructArray( pickupTarget, "targetname" ); + if( spawn_locations.size == 0 ) + { + return undefined; + } + spawn_point = spawn_locations[ RandomInt( spawn_locations.size ) ]; + if (isDefined(ignore)) + { + attempts = 5; + while(attempts) + { + attempts--; + if ( spawn_point == ignore ) + { + spawn_point = spawn_locations[ RandomInt( spawn_locations.size ) ]; + continue; + } + else + { + break; + } + } + } + return spawn_point; +} +spawn_random_pickup() +{ + spawn_point = get_random_pickup_location(); + if( isDefined( spawn_point ) ) + { + while( 1 ) + { + type = get_random_pickup_type(); + if( can_spawn_pickup( type ) ) + { + radius = 75; + if( IsDefined( spawn_point.radius ) ) + { + radius = spawn_point.radius; + } + origin = spawn_point.origin + ( RandomIntRange( 0-radius, radius ), RandomIntRange( 0-radius, radius ), 0 ); + spawn_pickup( type, origin ); + break; + } + wait_network_frame(); + } + } +} +spawn_random_weapon_pickup() +{ + spawn_point = get_random_pickup_location(); + if( isDefined( spawn_point ) ) + { + while( 1 ) + { + type = get_random_pickup_type(); + if( can_spawn_pickup( type ) ) + { + radius = 75; + if( IsDefined( spawn_point.radius ) ) + { + radius = spawn_point.radius; + } + origin = spawn_point.origin + ( RandomIntRange( 0-radius, radius ), RandomIntRange( 0-radius, radius ), 0 ); + spawn_pickup( type, origin ); + break; + } + wait_network_frame(); + } + } +} +spawn_specific_pickup(type) +{ + spawn_point = get_random_pickup_location(); + if( isDefined( spawn_point ) ) + { + if( can_spawn_pickup( type ) ) + { + radius = 75; + if( IsDefined( spawn_point.radius ) ) + { + radius = spawn_point.radius; + } + origin = spawn_point.origin + ( RandomIntRange( 0-radius, radius ), RandomIntRange( 0-radius, radius ), 0 ); + spawn_pickup( type, origin ); + } + } +} +is_type_exclusive(type) +{ + for(i=0;i 0 ) + { + return false; + } + } + } + return true; +} +spawn_pickup( type, origin ) +{ + if (!isDefined(type)) + { + return; + } + origin += (0,0,32); + pickup = Spawn( "script_model", origin ); + pickup.script_noteworthy = "a_pickup_item"; + pickup.angles = ( 0, 0, 70 ); + pickup.type = type; + trigger = undefined; + model = GetWeaponModel( type, 0 ); + if( model != "" ) + { + pickup SetModel( model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128); + trigger.isWeapon = true; + switch(type) + { + case "m2_flamethrower_zt": + pickup setscale(2.5); + break; + case "minigun_zt": + pickup setscale(2); + break; + case "spas_zt": + pickup setscale(2.5); + break; + case "china_lake_zt": + pickup setscale(2.5); + break; + case "rpg_zt": + pickup setscale(2); + break; + case "ray_gun_zt": + pickup setscale(4); + break; + default: + pickup setscale(2); + break; + } + } + else if( type == "speed" ) + { + pickup SetModel( level.speed_model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128 ); + pickup setscale(3); + pickup.angles = ( 0, 0, -20 ); + } + else if( type == "tank" ) + { + level.pickup_mutual_exlusive["tank"] = 1; + pickup SetModel( level.tank_pickup_model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128 ); + pickup.angles = ( 0, 0, 0 ); + } + else if( type == "heli" ) + { + level.pickup_mutual_exlusive["heli"] = 1; + pickup SetModel( level.heli_pickup_model ); + pickup.origin += (0,0,35); + trigger = spawn( "trigger_radius", origin, 0, 40, 128); + pickup.angles = ( 0, 0, 0 ); + } + else if( type == "spinning_blockers" ) + { + level.pickup_mutual_exlusive["spinning_blockers"] = 1; + pickup SetModel( level.spinning_blocker_model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128 ); + pickup.angles = ( 0, 0, 10 ); + } + else if( type == "tesla_blockers" ) + { + level.pickup_mutual_exlusive["tesla_blockers"] = 1; + pickup SetModel( level.tesla_blocker_model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128 ); + pickup setscale(1.5); + pickup.angles = ( 0, 0, 10 ); + } + else if( type == "stun_blockers" ) + { + level.pickup_mutual_exlusive["stun_blockers"] = 1; + pickup SetModel( level.stun_blocker_model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128 ); + pickup setscale(2.5); + pickup.angles = ( -70, 0, 0 ); + } + else if( type == "double_shot" ) + { + pickup thread double_shot_wait_for_pickup_audio(); + pickup SetModel( level.double_shot_model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128 ); + pickup setscale(3.0); + pickup.angles = ( 0, 0, 0 ); + } + else if( type == "bomb" ) + { + pickup SetModel( level.bomb_model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128 ); + } + else if( type == "booster" ) + { + pickup SetModel( level.booster_model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128 ); + pickup setscale(1.75); + pickup.angles = ( 0, 0, 0 ); + } + else if ( type == "mini_turret" ) + { + pickup SetModel( level.mini_turret_model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128 ); + pickup.angles = ( 0, 0, 0 ); + } + else if ( type == "monkey" ) + { + pickup SetModel( level.monkey_model ); + trigger = spawn( "trigger_radius", origin, 0, 40, 128 ); + pickup.angles = ( -70, 0, 0 ); + } + else if ( type == "extra_life" ) + { + pickup SetModel( level.extra_life_model ); + trigger = spawn( "trigger_radius", origin, 0, 30, 128 ); + } + else + { + ASSERTMSG( "No spawn fucntion for zombietron pickup type " + type ); + } + if ( pickup special_pickup_idle(type) == false ) + { + pickup thread powerup_rotate( trigger ); + } + pickup thread wait_for_pickup( type, trigger ); + pickup thread powerup_timeout( trigger ); + pickup.trigger= trigger; + pickup setclientflag(level._ZT_SCRIPTMOVER_CF_POWERUP); + return pickup; +} +special_pickup_idle(type) +{ + if (type=="double_shot") + { + self thread chicken_idle(); + return true; + } + return false; +} +move_pickup_to_score( type, player ) +{ + x = 1000; + y = 1500; + z = 300; + if( level.flipped ) + { + x = 0 - x; + y = 0 - y; + } + end_pt = player.origin; + if( player.entity_num == 0 ) + { + } + else if( player.entity_num == 1 ) + { + y = 0 - y; + } + else if( player.entity_num == 2 ) + { + x = 0 - x; + } + else if( player.entity_num == 3 ) + { + y = 0 - y; + x = 0 - x; + } + end_pt += (x, y, z); + self notify("picked_up"); + self moveto( end_pt, 1.4, 0, 0 ); + self waittill( "movedone" ); +} +wait_for_pickup( type, trigger ) +{ + wait .4; + trigger waittill( "trigger", player ); + if( IsDefined(player) ) + { + if( isDefined(trigger.isWeapon) ) + { + player.special_weapon = type; + player GiveWeapon( player.special_weapon ); + player SwitchToWeapon( player.special_weapon ); + player thread weapon_pickup_update(); + } + else if ( type == "money" ) + { + if ( !isDefined(self.points) ) + { + player maps\_zombietron_score::player_add_points( level.zombie_vars["prize_points"] ); + } + else + { + player maps\_zombietron_score::player_add_points( self.points ); + } + if ( !isDefined(self.increments) ) + { + player maps\_zombietron_score::update_multiplier_bar( player.pointBarInc ); + } + else + { + player maps\_zombietron_score::update_multiplier_bar( self.increments ); + } + self move_pickup_to_score( type, player ); + } + else if ( type == "extra_life" || type == "extra_life_directed" ) + { + if ( type == "extra_life" ) + { + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + player = players[i]; + player.lives++; + if ( player.lives > level.zombie_vars["max_lives"] ) + { + player.lives = level.zombie_vars["max_lives"]; + } + if (!isAlive(player)) + { + player maps\_zombietron_main::player_respawn(); + } + player maps\_zombietron_score::update_hud(); + } + } + else + { + player.lives++; + if ( player.lives > level.zombie_vars["max_lives"] ) + { + player.lives = level.zombie_vars["max_lives"]; + } + if (!isAlive(player)) + { + player maps\_zombietron_main::player_respawn(); + } + player maps\_zombietron_score::update_hud(); + } + self move_pickup_to_score( type, player ); + } + else if ( type == "speed" ) + { + player thread speed_pickup_update(); + } + else if ( type == "tank" ) + { + if ( isDefined(player.tank) || isDefined(player.heli) ) + { + self thread wait_for_pickup( type, trigger ); + return; + } + player thread tank_pickup_update( self ); + } + else if ( type == "heli" ) + { + if ( isDefined(player.tank) || isDefined(player.heli) ) + { + self thread wait_for_pickup( type, trigger ); + return; + } + player thread heli_pickup_update( self ); + } + else if ( type == "spinning_blockers" ) + { + player thread spinning_blockers_update(); + } + else if ( type == "tesla_blockers" ) + { + player thread tesla_blockers_update(); + } + else if ( type == "stun_blockers" ) + { + player thread stun_blockers_update(); + } + else if ( type == "double_shot" ) + { + player thread double_shot_update(); + } + else if ( type == "mini_turret" ) + { + level thread turret_pickup_update(player); + } + else if ( type == "bomb" ) + { + player.bombs++; + if ( player.bombs > level.zombie_vars["max_bombs"] ) + { + player.bombs = level.zombie_vars["max_bombs"]; + } + player maps\_zombietron_score::update_hud(); + self move_pickup_to_score( type, player ); + } + else if ( type == "booster" ) + { + player.boosters++; + if ( player.boosters > level.zombie_vars["max_boost"] ) + { + player.boosters = level.zombie_vars["max_boost"]; + } + player maps\_zombietron_score::update_hud(); + self move_pickup_to_score( type, player ); + } + else if ( type == "monkey" ) + { + level thread monkey_update(player,self.origin); + } + } + self clearclientflag(level._ZT_SCRIPTMOVER_CF_POWERUP); + self notify("picked_up"); + if (is_type_exclusive(type)) + { + level.pickup_mutual_exlusive[type] = 0; + } + if (isDefined(trigger) ) + { + trigger delete(); + } + if (isDefined(self)) + { + self Hide(); + } + wait_network_frame(); + if (isDefined(self)) + { + self delete(); + } +} +weapon_pickup_update() +{ + self notify( "new_weapon_pickup" ); + self endon( "new_weapon_pickup" ); + self endon( "death" ); + self endon ("disconnect"); + time_left = level.zombie_vars["pickup_time"]; + if ( isDefined(self.fate_fortune) ) + { + time_left *= level.zombie_vars["fate_fortune_drop_mod"]; + } + original_time = time_left; + while( time_left > 0 ) + { + wait 0.05; + if( self IsFiring() ) + { + time_left -= 0.05; + } + else + { + time_left -= 0.01; + } + self.headshots = Int( (time_left / original_time) * 1000 ); + } + self.headshots = 0; + self TakeAllWeapons(); + self GiveWeapon( self.default_weap ); + self switchToWeapon( self.default_weap ); + self.special_weapon = undefined; +} +spinning_blockers_damage_trigger( player ) +{ + player endon( "new_spinners_pickup" ); + while( 1 ) + { + self waittill( "trigger", guy ); + if ( !isDefined(guy.boss) || guy.boss == false ) + { + guy PlaySound( "zmb_pwup_barrel_impact" ); + guy DoDamage( guy.health + 1, player.origin, player, undefined, "MOD_CRUSH" ); + guy StartRagdoll( 1 ); + player PlayRumbleOnEntity( "slide_rumble"); + } + } +} +spinning_blockers_timeout( org ) +{ + self endon( "new_spinners_pickup" ); + self PlayLoopSound( "zmb_pwup_barrel_loop", .5 ); + time = level.zombie_vars["barrel_time"]; + if ( isDefined(self.fate_fortune) ) + { + time *= level.zombie_vars["fate_fortune_drop_mod"]; + } + while( time > 0 ) + { + wait 0.05; + time -= 0.05; + } + self StopLoopSound( .5 ); + self PlaySound( "zmb_pwup_barrel_end" ); + self notify( "new_spinners_pickup" ); +} +spinning_blockers_cleanup( org ) +{ + self waittill_any( "new_spinners_pickup","disconnect","player_died"); + self notify("new_spinners_pickup"); + org.trigger1 Delete(); + org.trigger2 Delete(); + org.barrel1 Unlink(); + org.barrel2 Unlink(); + vel = org.barrel1.origin - self.origin; + vel *= 10; + org.barrel1 PhysicsLaunch( org.barrel1.origin, vel ); + vel = org.barrel2.origin - self.origin; + vel *= 10; + org.barrel2 PhysicsLaunch( org.barrel2.origin, vel ); + org.barrel1 PlaySound( "zmb_pwup_barrel_fall_0" ); + org.barrel2 PlaySound( "zmb_pwup_barrel_fall_1" ); + wait 5; + org.barrel1 Delete(); + org.barrel2 Delete(); + org Delete(); + self.spinning_blockers = undefined; +} +spinning_blockers_update() +{ + self notify( "new_spinners_pickup" ); + self endon( "new_spinners_pickup" ); + self.spinning_blockers = true; + org = Spawn( "script_model", self.origin ); + org SetModel( "tag_origin" ); + barrel = Spawn( "script_model", self.origin ); + barrel SetModel( level.spinning_blocker_model ); + barrel SetPlayerCollision( 0 ); + barrel LinkTo( org, "tag_origin", (0, 80, 0) ); + trigger = spawn( "trigger_radius", barrel.origin, level.SPAWNFLAG_TRIGGER_AI_AXIS , 40, 50 ); + trigger EnableLinkTo(); + trigger LinkTo( barrel ); + trigger thread spinning_blockers_damage_trigger( self ); + org.barrel1 = barrel; + org.trigger1 = trigger; + org LinkTo( self ); + barrel = Spawn( "script_model", self.origin ); + barrel SetModel( level.spinning_blocker_model ); + barrel SetPlayerCollision( 0 ); + barrel LinkTo( org, "tag_origin", (0, -80, 0) ); + trigger = spawn( "trigger_radius", barrel.origin, level.SPAWNFLAG_TRIGGER_AI_AXIS , 40, 50 ); + trigger EnableLinkTo(); + trigger LinkTo( barrel ); + trigger thread spinning_blockers_damage_trigger( self ); + org.barrel2 = barrel; + org.trigger2 = trigger; + self thread spinning_blockers_timeout( org ); + self thread spinning_blockers_cleanup( org ); + while( 1 ) + { + org rotateTo( org.angles + (0, 180, 0), 0.9 ); + wait 0.9; + } +} +tesla_blockers_damage_trigger( player ) +{ + player endon( "new_tesla_pickup" ); + player endon( "disconnect"); + while(1) + { + self waittill( "trigger", guy ); + if ( maps\_zombietron_weapon::tesla_ok_to_discharge(player) ) + { + if ( isDefined(guy.damagedby) && guy.damagedby == "tesla") + { + continue; + } + else + { + guy.damagedby = "tesla"; + PlayFxOnTag( level._effect["tesla_contact"], guy, "j_head" ); + guy DoDamage( 1, player.origin, player, undefined, "MOD_UNKNOWN" ); + self.triggered = true; + break; + } + } + } +} +tesla_blockers_timeout( org ) +{ + self endon( "new_tesla_pickup" ); + self PlayLoopSound( "zmb_pwup_coco_loop" ); + time = level.zombie_vars["tesla_time"]; + if ( isDefined(self.fate_fortune) ) + { + time *= level.zombie_vars["fate_fortune_drop_mod"]; + } + time = time*1000 + GetTime(); + while( GetTime()< time ) + { + wait 0.05; + } + self StopLoopSound( .5 ); + self PlaySound( "zmb_pwup_coco_end" ); + self notify( "new_tesla_pickup" ); +} +tesla_blockers_cleanup( org ) +{ + self waittill_any( "new_tesla_pickup","disconnect","player_died"); + self notify( "new_tesla_pickup" ); + for(i=0;i 0 ) + { + rotate180Time = 1.0; + orb rotateTo( orb.angles + (0, 180, 0), rotate180Time ); + localRotateTime = rotate180Time; + while ( localRotateTime > 0 ) + { + self double_shot_fire( orb, weapon ); + wait fireTime; + localRotateTime -= fireTime; + } + spinOutTime -= rotate180Time; + } + orb PlaySound( "zmb_dblshot_end" ); + forward = ( orb.origin + ( 0, 0, 1 ) ) - orb.origin; + playfx ( level._effect["chicken_done"], orb.origin, forward ); + forward = ( orb.origin + ( 0, 1, 0 ) ) - orb.origin; + playfx ( level._effect["chicken_done"], orb.origin, forward ); + forward = ( orb.origin + ( 1, 0, 0 ) ) - orb.origin; + playfx ( level._effect["chicken_done"], orb.origin, forward ); + wait_network_frame(); + orb Delete(); +} +double_shot_exit_watcher(orb) +{ + self endon("disconnect"); + orb endon("spinning_out"); + while(1) + { + self waittill ("move_to_start"); + for( i = 0; i < orb.follow_points.size; i++ ) + { + orb.follow_points[i] = self.origin; + } + } +} +double_shot_chicken_time_add(orb) +{ + self endon("disconnect"); + orb endon("spinning_out"); + while(isDefined(orb)) + { + self waittill("another_chicken"); + time = level.zombie_vars["double_shot_time"]; + if ( isDefined(self.fate_fortune) ) + { + time *= level.zombie_vars["fate_fortune_drop_mod"]; + } + orb.timeout = time*1000 + GetTime(); + } +} +double_shot_update() +{ + self endon("disconnect"); + orb = Spawn( "script_model", self.origin + (0,0,50) ); + orb SetModel( level.double_shot_model ); + orb endon("spinning_out"); + self thread double_shot_disconnect_watch( orb, true ); + orb.follow_points = []; + num_follow_points = 5; + for( i = 0; i < num_follow_points; i++ ) + { + orb.follow_points[i] = self.origin; + } + if( IsDefined( self.double_shot_orb ) ) + { + self.double_shot_orb.follow_ent = orb; + } + if( IsDefined(self.fate_shot_orb) ) + { + orb.follow_ent = self.fate_shot_orb; + } + else + { + orb.follow_ent = self; + } + self.double_shot_orb = orb; + self thread double_shot_exit_watcher(orb); + self thread double_shot_fire_loop( orb ); + self thread double_shot_audio_loop( orb ); + self thread double_shot_audio_death( orb ); + orb thread chicken_active_idle(); + self notify("another_chicken"); + time = level.zombie_vars["double_shot_time"]; + if ( isDefined(self.fate) && (isDefined(self.fate_fortune) || self.fate=="friendship") ) + { + time *= level.zombie_vars["fate_fortune_drop_mod"]; + } + orb.timeout = time*1000 + GetTime(); + follow_index = 0; + next_index = follow_index + 1; + while( GetTime()< orb.timeout && isDefined(orb) ) + { + if( IsPlayer( self ) ) + { + orb.angles = self GetPlayerAngles(); + } + else + { + orb.angles = self.angles; + } + if( Distance2dSquared( orb.follow_ent.origin, orb.follow_points[follow_index] ) > 4*4 ) + { + follow_pt = orb.follow_ent.origin; + if( IsPlayer( orb.follow_ent ) ) + { + follow_pt = follow_pt + (0,0,50); + if( IsDefined(self.fate_shot_orb) ) + { + orb.follow_ent = self.fate_shot_orb; + } + } + orb.follow_points[next_index] = follow_pt; + follow_index = next_index; + next_index++; + next_index = next_index % num_follow_points; + orb moveTo( orb.follow_points[next_index], 0.15, 0, 0 ); + } + wait_network_frame(); + } + if( isDefined(self.double_shot_orb) && self.double_shot_orb == orb ) + { + self.double_shot_orb = undefined; + } + orb notify("spin_out", self getcurrentweapon() ); +} +fated_double_shot_update(model) +{ + self endon("disconnect"); + orb = Spawn( "script_model", self.origin + (0,0,50) ); + if ( isDefined(model) ) + { + orb SetModel( model ); + } + else + { + orb SetModel( level.double_shot_model ); + } + orb.follow_points = []; + num_follow_points = 5; + orb PlaySound( "zmb_dblshot_spawn" ); + for( i = 0; i < num_follow_points; i++ ) + { + orb.follow_points[i] = self.origin; + } + self.fate_shot_orb = orb; + orb.follow_ent = self; + self thread double_shot_fire_loop( orb ); + self thread double_shot_disconnect_watch(orb); + self thread double_shot_audio_loop( orb ); + orb thread fated_active_idle(); + follow_index = 0; + next_index = follow_index + 1; + while( 1 ) + { + orb.angles = self.angles; + if( Distance2dSquared( orb.follow_ent.origin, orb.follow_points[follow_index] ) > 6*6 ) + { + follow_pt = orb.follow_ent.origin; + if( IsPlayer( orb.follow_ent ) ) + { + follow_pt = follow_pt + (0,0,50); + } + orb.follow_points[next_index] = follow_pt; + follow_index = next_index; + next_index++; + next_index = next_index % num_follow_points; + orb moveTo( orb.follow_points[next_index], 0.2, 0, 0 ); + } + wait 0.05; + } +} +heli_rocket_loop( mini_heli ) +{ + mini_heli endon( "death" ); + mini_heli DisableGunnerFiring( 0, true ); + weapon = "hind_rockets_zt"; + fire_tags = []; + fire_tags[0] = "tag_rocket1"; + fire_tags[1] = "tag_rocket3"; + fire_tags[2] = "tag_rocket2"; + fire_tags[3] = "tag_rocket4"; + fire_index = 0; + while( 1 ) + { + driver = mini_heli GetSeatOccupant( 0 ); + if( IsDefined(driver) && driver AttackButtonPressed() ) + { + fire_tag = fire_tags[fire_index]; + origin = mini_heli GetTagOrigin( fire_tag ); + angles = mini_heli GetTagAngles( "tag_flash_gunner1" ); + endpt = origin + AnglesToForward( angles ) * 500; + MagicBullet( weapon, origin, endpt, driver ); + fire_time = WeaponFireTime( weapon ); + wait fire_time; + fire_index++; + fire_index = fire_index % 4; + } + wait .05; + } +} +pop_off_head() +{ + self setclientflag(level._ZT_ACTOR_CF_KILLED_BY_HELI); +} +heli_trigger_think( player ) +{ + self endon( "death" ); + while( 1 ) + { + self waittill( "trigger", guy ); + if( !IsDefined(guy.launched) && !IsPlayer(guy) ) + { + if ( !isDefined(guy.boss) || guy.boss == false ) + { + guy.a.gib_ref = "head"; + guy.a.gib_vel = ( 0, 0, 3500 ); + guy DoDamage( guy.health + 1, guy.origin + (0,0,-25), player, undefined, "explosive", "head" ); + if (isDefined(guy.is_dog)) + { + continue; + } + guy SetPlayerCollision( 0 ); + if ( ok_to_gib() && !isDefined(guy.is_quad) && !isDefined(guy.is_dog) ) + { + guy pop_off_head(); + } + guy StartRagdoll( 1 ); + guy.launched = true; + } + } + } +} +heli_zombie_poi(player) +{ + players = GetPlayers(); + index = 0; + for (i=0;i min_dist_squared ) + { + self.aborted_tank = true; + self notify( "tank_abort" ); + } + wait .25; + } +} +tank_pickup_update( pickup ) +{ + self EnableInvulnerability(); + origin = push_origin_out( pickup.origin, 30 ); + tank = SpawnVehicle( "t5_veh_tank_t55_mini", "player_tank", "tank_t55_mini", origin, self.angles ); + tank.health = 100000; + tank MakeVehicleUsable(); + tank UseBy( self ); + tank MakeVehicleUnusable(); + tank.takedamage = false; + self.tank = tank; + tank.player = self; + tank maps\_vehicle::turret_attack_think(); + PlayFxOnTag( level._effect[self.light_playFX], tank, "tag_origin" ); + time_left = level.zombie_vars["tank_alive_time"]; + if ( isDefined(self.fate_fortune) ) + { + time_left *= level.zombie_vars["fate_fortune_drop_mod"]; + } + self notify("veh_activated"); + tank thread veh_chicken_watcher(); + self thread tank_outofworld_watcher(); + self waittill_any_or_timeout( time_left, "disconnect", "tank_abort" ); + self notify( "veh_done" ); + self.tank = undefined; + if( self.usingvehicle ) + { + tank MakeVehicleUsable(); + tank UseBy( self ); + } + tank Delete(); + if( IsDefined(self.aborted_tank) ) + { + self.aborted_tank = undefined; + origin = maps\_zombietron_main::get_player_spawn_point(); + above = origin + (0,0,100); + below = origin + (0,0,-100); + hitp = PlayerPhysicsTrace( above, below ); + self SetOrigin( hitp ); + } + PlayFx( level._effect["respawn"], self.origin, AnglesToForward(self.angles) ); + self RadiusDamage( self.origin, 200, 10000, 10000, self ); + self DisableInvulnerability(); + self turn_shield_on( true ); +} +speed_pickup_cleanup() +{ + self waittill_any("new_speed_pickup","disconnect","player_died"); + self SetMoveSpeedScale( self.default_movespeed ); + self StopLoopSound( .5 ); + self PlaySound( "zmb_pwup_speed_end" ); +} +speed_pickup_update() +{ + self notify( "new_speed_pickup" ); + self endon( "new_speed_pickup" ); + self endon( "disconnect"); + self thread speed_pickup_cleanup(); + wait 0.05; + self PlayLoopSound( "zmb_pwup_speed_loop" ); + self SetMoveSpeedScale( level.zombie_vars["player_speed"] ); + PlayFxOnTag( level._effect["character_fire_death_sm"], self, "tag_origin" ); + time_left = level.zombie_vars["player_speed_time"]; + if ( isDefined(self.fate_fortune) ) + { + time_left *= level.zombie_vars["fate_fortune_drop_mod"]; + } + wait(time_left); + self StopLoopSound( .5 ); + self PlaySound( "zmb_pwup_speed_end" ); + self SetMoveSpeedScale( self.default_movespeed ); +} +powerup_wobble( trigger ) +{ + trigger endon ("trigger"); + while (isdefined(self)) + { + waittime = randomfloatrange(2.5, 5); + yaw = RandomInt( 360 ); + if( yaw > 300 ) + { + yaw = 300; + } + else if( yaw < 60 ) + { + yaw = 60; + } + yaw = self.angles[1] + yaw; + self rotateto ((-20 + randomint(40), yaw, -90 + randomint(180)), waittime, waittime * 0.5, waittime * 0.5); + wait randomfloat (waittime - 0.1); + } +} +powerup_rotate( trigger ) +{ + trigger endon ("trigger"); + if (isdefined(self)) + { + playfxontag (level._effect["powerup_on_red"], self, "tag_origin"); + } + dir = 180; + if ( RandomInt(100)>50) + { + dir = -180; + } + time = RandomFloatRange(3,7); + while (isdefined(self)) + { + self rotateTo( self.angles + (0, dir, 0), time ); + wait time; + } +} +powerup_timeout( trigger, timeout ) +{ + trigger endon ("trigger"); + if ( !isDefined(timeout) ) + { + wait level.zombie_vars["powerup_timeout"]; + } + else + { + wait timeout; + } + for (i = 0; i < 40; i++) + { + if ( !isDefined(self) ) + { + break; + } + if (i % 2) + { + self hide(); + } + else + { + self show(); + } + if (i < 15) + { + wait 0.5; + wait_network_frame(); + } + else if (i < 25) + { + wait 0.25; + wait_network_frame(); + } + else + { + wait 0.1; + wait_network_frame(); + } + } + if ( isDefined(trigger) ) + { + trigger notify( "trigger" ); + } + if ( isDefined(self) ) + { + self delete(); + } +} +get_random_mine_location() +{ + spawn_locations = []; + hazardTarget = level.arenas[level.current_arena] + "_hazard"; + spawn_locations = GetStructArray( hazardTarget, "targetname" ); + if( spawn_locations.size == 0 ) + { + return undefined; + } + spawn_point = spawn_locations[ RandomInt( spawn_locations.size ) ]; + return spawn_point; +} +wait_for_mine_pickup( trigger ) +{ + self endon( "death" ); + while( 1 ) + { + trigger waittill( "trigger", guy ); + if( IsDefined(guy) && IsDefined(self.active) && self.active ) + { + if ( !(isDefined(guy.tank) || isDefined(guy.boss)) ) + { + guy PlaySound( "zmb_hazard_hit" ); + guy DoDamage( guy.health + 500, self.origin ); + } + PlayFxOnTag( level._effect["tesla_contact"], guy, "j_head" ); + wait .05; + } + } +} +mine_off_on_loop() +{ + self endon( "death" ); + self setclientflag(level._ZT_SCRIPTMOVER_CF_ELEC_TRAP); + wait 0.5; + self clearclientflag(level._ZT_SCRIPTMOVER_CF_ELEC_TRAP); + wait 10; + self thread wait_for_mine_pickup( self.trigger ); + while( 1 ) + { + self setclientflag(level._ZT_SCRIPTMOVER_CF_ELEC_TRAP); + wait 1.2; + self.active = true; + wait RandomFloatRange( 4, 10 ); + self clearclientflag(level._ZT_SCRIPTMOVER_CF_ELEC_TRAP); + self.active = false; + wait RandomFloatRange( 3, 6 ); + } +} +delete_sound_ent_on_death( ent ) +{ + self waittill( "death" ); + ent Delete(); +} +AdjustMineOrigin( origin ) +{ + min_dist = 24; + min_dist_squared = min_dist * min_dist; + pushed = true; + max_tries = 3; + while( pushed && max_tries > 0 ) + { + max_tries--; + pushed = false; + for( i = 0; i < level.mines.size; i++ ) + { + mine = level.mines[i]; + if( IsDefined( mine ) ) + { + dist_squared = DistanceSquared( origin, mine.origin ); + if( dist_squared < min_dist_squared ) + { + dir = origin - mine.origin; + dir = VectorNormalize( dir ); + origin = origin + dir * min_dist; + pushed = true; + } + } + } + } + return origin; +} +clear_mines() +{ + if( !IsDefined( level.mines ) ) + { + level.mines = []; + } + for( i = 0; i < level.mines.size; i++ ) + { + if( IsDefined( level.mines[i] ) ) + { + level.mines[i].trigger Delete(); + if( IsDefined( level.mines[i].fx ) ) + { + level.mines[i].fx Delete(); + } + if( IsDefined( level.mines[i].fx2 ) ) + { + level.mines[i].fx2 Delete(); + } + level.mines[i] Delete(); + } + } + level.mines = []; +} +spawn_mines() +{ + clear_mines(); + count = 1 + RandomInt( 2 + Int((level.round_number-4) / 3) ); + for( i = 0; i < count; i++ ) + { + spawn_point = get_random_mine_location(); + if ( !isDefined(spawn_point) ) + { + return; + } + radius = 85; + if( IsDefined( spawn_point.radius ) ) + { + radius = spawn_point.radius; + } + origin = spawn_point.origin + ( RandomIntRange( 0-radius, radius ), RandomIntRange( 0-radius, radius ), 0 ); + origin = AdjustMineOrigin( origin ); + pickup = Spawn( "script_model", origin ); + pickup SetModel( level.mine_model ); + pickup.trigger = Spawn( "trigger_radius", origin, level.SPAWNFLAG_TRIGGER_AI_AXIS, 20, 50 ); + pickup thread mine_off_on_loop(); + level.mines[i] = pickup; + } +} +shield_debug() +{ + self endon("death"); + while(1) + { + drawcylinder( self.origin, 65, 50 ); + wait 0.05; + } +} +shield_trigger_think( player ) +{ + self endon( "death" ); + self endon( "disconnect"); + while( 1 ) + { + self waittill( "trigger", guy ); + if ( !isDefined(guy) ) + continue; + if ( IsPlayer(guy) ) + continue; + if (IsDefined(guy.launched) ) + continue; + if (isDefined(guy.boss) ) + continue; + if (!IsSentient(guy) ) + continue; + if ( isDefined(player.rhino_deaths) ) + { + player.rhino_deaths++; + } + guy SetPlayerCollision( 0 ); + guy DoDamage( guy.health + 1, player.origin, player, undefined, "explosive" ); + guy StartRagdoll( 1 ); + guy LaunchRagdoll( (0,0,220) ); + guy.launched = true; + guy PlaySound( "zmb_ragdoll_launched" ); + player PlayRumbleOnEntity( "slide_rumble"); + } +} +shield_flag_on(onOff) +{ + if ( onOff ) + self.shield_is_on = 1; + else + self.shield_is_on = undefined; +} +turn_shield_on( short_shield ) +{ + shield_flag_on(1); + self EnableInvulnerability(); + wait 0.05; + trigger = Spawn( "trigger_radius", self.origin, level.SPAWNFLAG_TRIGGER_AI_AXIS, 65, 50 ); + trigger EnableLinkTo(); + trigger LinkTo( self ); + trigger thread shield_trigger_think( self ); + if( !IsDefined( short_shield ) || !short_shield ) + { + if( !IsDefined( self.tank ) && !IsDefined( self.heli ) ) + { + trigger PlaySound( "zmb_player_shield_full" ); + PlayFxOnTag( level._effect["shield"], self, "tag_origin" ); + } + wait 2.9; + if( !IsDefined( self.tank ) && !IsDefined( self.heli ) ) + { + PlayFxOnTag( level._effect["shield"], self, "tag_origin" ); + } + wait 2.7; + } + if( !IsDefined( self.tank ) && !IsDefined( self.heli ) ) + { + trigger PlaySound( "zmb_player_shield_half" ); + PlayFxOnTag( level._effect["shield_gone"], self, "tag_origin" ); + } + wait 3; + trigger Delete(); + shield_flag_on(0); + if( !IsDefined( self.tank ) && !IsDefined( self.heli ) ) + { + self PlaySound( "zmb_player_shield_end" ); + self DisableInvulnerability(); + } +} +update_drop_booster() +{ + self notify("update_drop_booster"); + self endon ("update_drop_booster"); + while( 1 ) + { + wait 0.05; + if ( IsAlive(self) && !level.in_intermission && !isDefined(self.tank) && !isDefined(self.heli) && self jumpButtonPressed() ) + { + if( isDefined(self.boosters) && self.boosters > 0 ) + { + self.rhino_deaths = 0; + self PlaySound( "zmb_speed_boost_activate" ); + self.boosters--; + self maps\_zombietron_score::update_hud(); + self EnableInvulnerability(); + curdir = anglesToForward( (0,0,0) ); + trigger = Spawn( "trigger_radius", self.origin, level.SPAWNFLAG_TRIGGER_AI_AXIS, 85, 50 ); + trigger EnableLinkTo(); + trigger LinkTo( self, "tag_origin", curdir * 200, self.angles ); + trigger thread shield_trigger_think( self ); + trigger2 = Spawn( "trigger_radius", self.origin, level.SPAWNFLAG_TRIGGER_AI_AXIS, 85, 50 ); + trigger2 EnableLinkTo(); + trigger2 LinkTo( self, "tag_origin", curdir * 50, self.angles ); + trigger2 thread shield_trigger_think( self ); + curdir = anglesToForward( self.angles ); + endTime = GetTime() + 600; + boost_vector = curdir * 2000; + boost_vector += (0,0,200); + self SetVelocity(boost_vector); + boost_vector -= (0,0,200); + while (GetTime() < endTime ) + { + self SetVelocity(boost_vector); + self PlayRumbleOnEntity( "slide_rumble"); + wait 0.05; + } + if ( self.rhino_deaths >= 20 ) + { + self giveachievement_wrapper( "SP_ZOM_CHICKENS" ); + } + self.rhino_deaths = undefined; + trigger Delete(); + trigger2 Delete(); + if( !IsDefined( self.tank ) && !IsDefined( self.heli ) ) + { + self DisableInvulnerability(); + } + } + } + } +} +update_drop_bomb() +{ + self notify("update_drop_bomb"); + self endon ("update_drop_bomb"); + while( 1 ) + { + if( IsAlive(self) && !level.in_intermission && self fragButtonPressed() ) + { + if( isDefined(self.bombs) && self.bombs > 0 ) + { + self EnableInvulnerability(); + self.bombs--; + self maps\_zombietron_score::update_hud(); + player_org = self.origin; + origin = player_org + (20,0,800); + self setclientflag( level._ZT_PLAYER_CF_START_SMART_BOMB ); + ClearAllCorpses(); + wait .3; + physicsExplosionSphere( player_org, 800, 128, 3 ); + playRumbleOnPosition( "artillery_rumble", self.origin ); + wait_network_frame(); + zombies = GetAISpeciesArray( "axis", "all" ); + zombies = get_array_of_closest(player_org, zombies); + num_per_loop = zombies.size / 4; + num = 0; + for(i = 0; i < zombies.size; i ++) + { + guy = zombies[i]; + if(IsDefined(guy)) + { + if ( isDefined(guy.boss) ) + { + continue; + } + guy setclientflag( level._ZT_ACTOR_CF_LAUNCH_AND_BURN ); + guy DoDamage(guy.health + 1, player_org, self, undefined, "explosive"); + guy StartRagdoll(1); + guy.launched = true; + } + num++; + if(num >= num_per_loop) + { + wait_network_frame(); + num = 0; + } + } + wait .1; + wait_network_frame(); + wait .3; + wait_network_frame(); + self clearclientflag( level._ZT_PLAYER_CF_START_SMART_BOMB ); + if( !IsDefined( self.tank ) && !IsDefined( self.heli ) ) + { + self DisableInvulnerability(); + } + } + } + wait 0.05; + } +} +turret_init() +{ + level.mini_turret_orgs = []; + level.mini_turrets = GetEntArray("mini_turret","script_noteworthy"); + for (i=0;i 1 ) + { + mini_turret.fx = SpawnFx( level._effect[player.light_playFX], mini_turret.origin,(1,0,0),(0,0,1)); + if ( isDefined(mini_turret.fx) ) + { + triggerFx( mini_turret.fx ); + } + } + mini_turret SetTurretOwner(player); + mini_turret thread maps\_mgturret::burst_fire_unmanned(); + mini_turret thread turret_timeout(); + mini_turret waittill("turret_time_to_go"); + if ( isDefined(mini_turret.fx) ) + { + mini_turret.fx Delete(); + mini_turret.fx = undefined; + } + mini_turret notify ("turret_deactivated"); + mini_turret SetMode( "auto_ai" ); + mini_turret notify( "stop_burst_fire_unmanned" ); + mini_turret PlaySound( "evt_turret_takeoff" ); + PlayFxOnTag( level._effect["mini_turret_takeoff"], mini_turret, "tag_origin" ); + mini_turret.org moveTo( dropTarget, 1, 0, 0 ); + wait 1; + mini_turret.org moveTo( mini_turret.original_location,1, 0, 0 ); + mini_turret.deployed = false; +} +#using_animtree( "zombie_cymbal_monkey" ); +monkey_update(player,origin) +{ + hitp = PlayerPhysicsTrace(origin + (0,0,72), origin + (0,0,-500)); + origin = (origin[0],origin[1],hitp[2]); + mark = origin + (0,0,12); + monkey = spawn( "script_model", origin ); + monkey SetModel( level.monkey_model ); + monkey UseAnimTree( #animtree ); + monkey SetAnim( %o_monkey_bomb ); + monkey.angles = (0,RandomInt(360),0); + PlayFxOnTag( level._effect["monkey_glow"], monkey, "origin_animate_jnt" ); + level.active_monkeys[level.active_monkeys.size] = monkey; + fx = undefined; + if (GetPlayers().size > 1 ) + { + fx = SpawnFx( level._effect[player.light_playFX], monkey.origin + (0,0,-12),(1,0,0),(0,0,1) ); + } + if ( isDefined(fx) ) + { + triggerFx( fx ); + } + wait level.zombie_vars["monkey_fuse_time"]; + if ( isDefined(fx) ) + { + fx Delete(); + } + level.active_monkeys = array_remove( level.active_monkeys, monkey ); + monkey PlaySound( "zmb_monkey_explo" ); + PlayFx( level._effect["monkey_explode"], mark, (1,0,0) ); + player RadiusDamage(monkey.origin, level.zombie_vars["monkey_attract_dist"], 15000, 15000, player, "MOD_EXPLOSIVE"); + PhysicsExplosionSphere(monkey.origin, level.zombie_vars["monkey_attract_dist"], level.zombie_vars["monkey_attract_dist"], 1); + earthquake(0.3, 1.0, monkey.origin, 100); + PlayRumbleOnPosition("artillery_rumble", origin); + monkey ClearAnim( %o_monkey_bomb, 0.2 ); + wait 0.2; + monkey Delete(); +} +#using_animtree ("critter"); +chicken_idle() +{ + self UseAnimTree( #animtree ); + curAnim = %a_chicken_react_up_down; + lastAnim = %a_chicken_idle_peck; + playfxontag (level._effect["powerup_on_red"], self, "tag_origin"); + while(isDefined(self)) + { + if ( curAnim == lastAnim ) + { + self ClearAnim( lastAnim, 0.2 ); + } + self SetAnim( curAnim ); + wait (RandomIntRange(2,4)); + lastAnim = curAnim; + switch(RandomInt(4)) + { + case 0: + curAnim = %a_chicken_idle_peck; + break; + case 1: + curAnim = %a_chicken_react_a; + break; + case 2: + curAnim = %a_chicken_idle_a; + break; + case 3: + curAnim = %a_chicken_react_to_front; + break; + } + } +} +chicken_death_idle() +{ + self endon( "death" ); + self UseAnimTree( #animtree ); + time = getAnimLength( %a_chicken_react_up_down ); + while(isDefined(self)) + { + self SetAnim(%a_chicken_react_up_down); + wait time; + self ClearAnim(%a_chicken_react_up_down,0); + } +} +chicken_active_idle() +{ + self endon( "death" ); + self endon( "spinning_out"); + self UseAnimTree( #animtree ); + time = getAnimLength( %a_chicken_react_to_front_notrans ); + while(isDefined(self)) + { + self SetAnim(%a_chicken_react_to_front_notrans); + wait time; + self ClearAnim(%a_chicken_react_to_front_notrans,0); + } +} +fated_active_idle() +{ + self UseAnimTree(#animtree); + self SetAnim(%fxanim_zombies_crow_fly_anim); +} +delete_sound_ent( ent, wait_string ) +{ + self waittill_any( wait_string, "disconnect" ); + if( IsDefined( ent ) ) + { + ent Delete(); + } +} +double_shot_wait_for_pickup_audio() +{ + self endon( "picked_up" ); + self endon("death"); + while(isDefined(self)) + { + self PlaySound( "zmb_dblshot_squawk", "sounddone" ); + self waittill( "sounddone" ); + wait( RandomFloatRange(2,5)); + } +} +double_shot_audio_loop( orb ) +{ + orb endon( "spinning_out" ); + orb endon ("death"); + while(isDefined(orb)) + { + rand = RandomIntRange(0,100); + if( rand > 30 ) + { + orb PlaySound( "zmb_dblshot_wingflap" ); + } + if( rand > 70 ) + { + orb PlaySound( "zmb_dblshot_squawk" ); + } + wait(RandomFloatRange(1,3)); + } +} +double_shot_audio_death( orb ) +{ + self endon( "disconnect" ); + orb endon( "death" ); + orb waittill( "spinning_out" ); + while(isDefined(orb)) + { + orb PlaySound( "zmb_dblshot_death" ); + orb PlaySound( "zmb_dblshot_wingflap" ); + wait(RandomFloatRange(.5,1)); + } +} +spawn_treasure(numGlobs) +{ + level endon("stop_spawning_pickups"); + while(numGlobs) + { + thread maps\_zombietron_pickups::spawn_prize_glob(); + wait (RandomFloatRange(0.1,0.8)); + numGlobs--; + } +} +spawn_bonus_room() +{ + weaps = RandomIntRange(level.zombie_vars["zombie_treasure_weapon_drops_min"],level.zombie_vars["zombie_treasure_weapon_drops_max"]); + while(weaps) + { + maps\_zombietron_pickups::spawn_random_weapon_pickup(); + weaps--; + } + maps\_zombietron_pickups::spawn_random_pickup(); + level thread spawn_treasure(level.zombie_vars["zombie_treasure_boss"]); +} +spawn_armory() +{ + numplayers = GetPlayers().size; + for(i=0;i<4;i++) + { + spawn_random_weapon_pickup(); + wait 0.2; + spawn_specific_pickup("bomb"); + wait 0.2; + spawn_specific_pickup("booster"); + wait 0.2; + } + if ( numplayers > 1 ) + numChickens = 1; + else + numChickens = 4; + while(numChickens) + { + numChickens--; + spawn_specific_pickup("double_shot"); + wait 0.2; + } + while (numplayers) + { + spawn_random_pickup(); + wait 0.2; + numplayers--; + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombietron_scenes.gsc b/BO1/PC/ZM/maps/_zombietron_scenes.gsc new file mode 100644 index 0000000..d6a1197 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombietron_scenes.gsc @@ -0,0 +1,912 @@ +#include maps\_anim; +#include maps\_utility; +#include common_scripts\utility; +#include maps\_music; +#include maps\_zombietron_utility; +#include maps\_busing; +#using_animtree("generic_human"); +actor_idle() +{ + self.animname = "actor"; + level endon("introduction_complete"); + while(isDefined(self)) + { + switch(RandomInt(3)) + { + case 0: + level.scr_anim["actor"]["idle"] = %ai_civ_gen_casual_stand_idle; + break; + case 1: + level.scr_anim["actor"]["idle"] = %ai_civ_gen_casual_stand_idle_twitch_01; + break; + case 2: + level.scr_anim["actor"]["idle"] = %ai_civ_gen_casual_stand_idle_twitch_02; + break; + } + self maps\_anim::anim_single(self, "idle"); + } +} +ape_intro_exit(origin) +{ + self thread maps\_zombietron_ai_ape::ape_shielder(); + self SetGoalPos( origin ); + self waittill("goal"); + level notify("ape_exited"); +} +tutorial_exit_watch(trigger) +{ + level waittill_any("exit_taken"); + level.abort_tutorial = true; + trigger notify("trigger"); +} +game_tutorial_render_instructions(curPage,lastPage,instruction1,instruction2,instruction3,p1,p2,p3) +{ + instruct1 = undefined; + instruct2 = undefined; + instruct3 = undefined; + title = NewHudElem( level ); + title.alignX = "center"; + title.alignY = "middle"; + title.horzAlign = "center"; + title.vertAlign = "middle"; + title.foreground = true; + title.fontScale = 3; + title.y -= 130; + title.color = ( 1.0, 0.84, 0.0 ); + title.alpha = 0; + title SetText( &"ZOMBIETRON_TITLE" ); + title FadeOverTime( 1 ); + title.alpha = 1; + title.hidewheninmenu = true; + level thread assassinateHudElem(title,"exit_taken"); + subtitle = NewHudElem( level ); + subtitle.alignX = "center"; + subtitle.alignY = "middle"; + subtitle.horzAlign = "center"; + subtitle.vertAlign = "middle"; + subtitle.foreground = true; + subtitle.fontScale = 1; + subtitle.y -= 110; + subtitle.color = ( 1.0, 0.84, 0.0 ); + subtitle.alpha = 0; + subtitle SetText( &"ZOMBIETRON_PAGE",curPage,lastPage ); + subtitle FadeOverTime( 1 ); + subtitle.alpha = 1; + subtitle.hidewheninmenu = true; + level thread assassinateHudElem(subtitle,"exit_taken"); + if ( isDefineD(instruction1) ) + { + instruct1 = NewHudElem( level ); + instruct1.alignX = "center"; + instruct1.alignY = "middle"; + instruct1.horzAlign = "center"; + instruct1.vertAlign = "middle"; + instruct1.foreground = true; + instruct1.fontScale = 1.5; + instruct1.y -= 90; + instruct1.color = ( 1.0, 0.84, 0.0 ); + instruct1.alpha = 0; + if ( isDefined(p1) ) + instruct1 SetText( instruction1,p1 ); + else + instruct1 SetText( instruction1); + instruct1 FadeOverTime( 1 ); + instruct1.alpha = 1; + instruct1.hidewheninmenu = true; + level thread assassinateHudElem(instruct1,"exit_taken"); + } + if (isDefined(instruction2) ) + { + instruct2 = NewHudElem( level ); + instruct2.alignX = "center"; + instruct2.alignY = "middle"; + instruct2.horzAlign = "center"; + instruct2.vertAlign = "middle"; + instruct2.foreground = true; + instruct2.fontScale = 1.5; + instruct2.y -= 60; + instruct2.color = ( 1.0, 0.84, 0.0 ); + instruct2.alpha = 0; + if ( isDefined(p2) ) + instruct2 SetText( instruction2,p2 ); + else + instruct2 SetText( instruction2); + instruct2 FadeOverTime( 2 ); + instruct2.alpha = 1; + instruct2.hidewheninmenu = true; + level thread assassinateHudElem(instruct2,"exit_taken"); + } + if (isDefined(instruction3) ) + { + instruct3 = NewHudElem( level ); + instruct3.alignX = "center"; + instruct3.alignY = "middle"; + instruct3.horzAlign = "center"; + instruct3.vertAlign = "middle"; + instruct3.foreground = true; + instruct3.fontScale = 1.5; + instruct3.y -= 30; + instruct3.color = ( 1.0, 0.84, 0.0 ); + instruct3.alpha = 0; + if ( isDefined(p3) ) + instruct3 SetText( instruction3,p3 ); + else + instruct3 SetText( instruction3); + instruct3 FadeOverTime( 3 ); + instruct3.alpha = 1; + instruct3.hidewheninmenu = true; + level thread assassinateHudElem(instruct3,"exit_taken"); + } + nextPage = undefined; + if (curPage != lastPage) + { + nextPage = NewHudElem( level ); + nextPage.alignX = "center"; + nextPage.alignY = "middle"; + nextPage.horzAlign = "center"; + nextPage.vertAlign = "middle"; + nextPage.foreground = true; + nextPage.fontScale = 1.5; + nextPage.y += 30; + nextPage.color = ( 1.0, 0.84, 0.0 ); + nextPage.alpha = 0; + nextPage SetText( &"ZOMBIETRON_NEXT_PAGE"); + nextPage FadeOverTime( 3 ); + nextPage.alpha = 1; + nextPage.hidewheninmenu = true; + level thread assassinateHudElem(nextPage,"exit_taken"); + } + level waittill_any("exit_taken","next_page"); + title FadeOverTime(1); + title.alpha = 0; + subtitle FadeOverTime(1); + subtitle.alpha = 0; + nextPage FadeOverTime(1); + nextPage.alpha = 0; + if ( isDefined(instruct1) ) + { + instruct1 FadeOverTime(1); + instruct1.alpha = 0; + } + if ( isDefined(instruct2) ) + { + instruct2 FadeOverTime(1); + instruct2.alpha = 0; + } + if ( isDefined(instruct3) ) + { + instruct3 FadeOverTime(1); + instruct3.alpha = 0; + } + wait 1; + DestroyHudElem(title); + DestroyHudElem(subtitle); + DestroyHudElem(nextPage); + DestroyHudElem(instruct1); + DestroyHudElem(instruct2); + DestroyHudElem(instruct3); +} +game_skipPage_watcher() +{ + level endon("exit_taken"); + player = GetPlayers()[0]; + while(1) + { + if ( player UseButtonPressed() ) + { + level notify("next_page"); + wait 1; + } + wait 0.05; + } +} +loc_random_offset(loc) +{ + loc += ( RandomFloatRange(-64,64),RandomFloatRange(-64,64),0); + return loc; +} +game_tutorial_go() +{ + level endon("exit_taken"); + level thread game_skipPage_watcher(); + level game_tutorial_render_instructions(1,8,&"ZOMBIETRON_INSTRUCTION1",&"ZOMBIETRON_INSTRUCTION2",&"ZOMBIETRON_INSTRUCTION3"); + level game_tutorial_render_instructions(2,8,&"ZOMBIETRON_INSTRUCTION4",&"ZOMBIETRON_INSTRUCTION5"); + level game_tutorial_render_instructions(3,8,&"ZOMBIETRON_INSTRUCTION6",&"ZOMBIETRON_INSTRUCTION7"); + loc = loc_random_offset(maps\_zombietron_pickups::get_random_pickup_location().origin); + maps\_zombietron_pickups::spawn_pickup( "bomb", loc ); + loc = loc_random_offset(maps\_zombietron_pickups::get_random_pickup_location().origin); + maps\_zombietron_pickups::spawn_pickup( "bomb", loc ); + loc = loc_random_offset(maps\_zombietron_pickups::get_random_pickup_location().origin); + maps\_zombietron_pickups::spawn_pickup( "bomb", loc ); + level game_tutorial_render_instructions(4,8,&"ZOMBIETRON_INSTRUCTION8"); + maps\_zombietron_pickups::clear_all_pickups(); + loc = loc_random_offset(maps\_zombietron_pickups::get_random_pickup_location().origin); + maps\_zombietron_pickups::spawn_pickup( "booster", loc ); + loc = loc_random_offset(maps\_zombietron_pickups::get_random_pickup_location().origin); + maps\_zombietron_pickups::spawn_pickup( "booster", loc ); + loc = loc_random_offset(maps\_zombietron_pickups::get_random_pickup_location().origin); + maps\_zombietron_pickups::spawn_pickup( "booster", loc ); + level game_tutorial_render_instructions(5,8,&"ZOMBIETRON_INSTRUCTION9"); + maps\_zombietron_pickups::clear_all_pickups(); + level thread maps\_zombietron_pickups::spawn_treasure(level.zombie_vars["zombie_treasure_boss"]); + level game_tutorial_render_instructions(6,8,&"ZOMBIETRON_INSTRUCTION10",&"ZOMBIETRON_INSTRUCTION11",undefined,undefined,level.zombie_vars["extra_life_at_every"]); + level game_tutorial_render_instructions(7,8,&"ZOMBIETRON_INSTRUCTION12"); + level game_tutorial_render_instructions(8,8,&"ZOMBIETRON_INSTRUCTION13"); +} +begin_game_tutorial() +{ + title1 = NewHudElem( level ); + title1.alignX = "center"; + title1.alignY = "middle"; + title1.horzAlign = "center"; + title1.vertAlign = "middle"; + title1.foreground = true; + title1.fontScale = 3; + title1.y -= 70; + title1.color = ( 1.0, 0.84, 0.0 ); + title1.alpha = 0; + title1 SetText( &"ZOMBIETRON_TUTORIAL1"); + title1.hidewheninmenu = true; + title2 = NewHudElem( level ); + title2.alignX = "center"; + title2.alignY = "middle"; + title2.horzAlign = "center"; + title2.vertAlign = "middle"; + title2.foreground = true; + title2.y -= 40; + title2.fontScale = 2; + title2.color = ( 1.0, 0.84, 0.0 ); + title2.alpha = 0; + title2 SetText( &"ZOMBIETRON_TUTORIAL2"); + title2.hidewheninmenu = true; + title1 FadeOverTime( 1 ); + title2 FadeOverTime( 2 ); + title1.alpha = 1; + title2.alpha = 1; + location = maps\_zombietron_pickups::get_random_pickup_location(); + above = location.origin + (0,0,100); + below = location.origin + (0,0,-500); + trace = bullettrace(above, below, false, undefined); + dest_point = (location.origin[0],location.origin[1],trace["position"][2]); + teleporter = Spawn( "script_model", dest_point); + teleporter SetModel( "zombie_teleporter_pad" ); + playsoundatposition( "zmb_teleporter_spawn", teleporter.origin ); + trigger = spawn( "trigger_radius", location.origin, 0, 10, 50 ); + objective_add( 2, "active", &"ZOMBIETRON_TUTORIAL3", trigger.origin ); + Objective_String( 2, &"ZOMBIETRON_TUTORIAL3" ); + objective_set3d( 2, true, "default",&"ZOMBIETRON_TUTORIAL3"); + objective_current( 2 ); + level thread tutorial_exit_watch(trigger); + trigger waittill_any( "trigger" ); + objective_delete( 2 ); + title1 FadeOverTime( 1 ); + title2 FadeOverTime( 1 ); + title1.alpha = 0; + title2.alpha = 0; + wait 1; + DestroyHudElem(title1); + DestroyHudElem(title2); + teleporter Delete(); + if ( !isDefined(level.abort_tutorial) ) + { + level thread game_tutorial_go(); + } +} +end_game_introduction(player) +{ + level waittill("end_the_intro"); + player thread maps\_zombietron_pickups::update_drop_bomb(); + player thread maps\_zombietron_pickups::update_drop_booster(); + exit = GetEnt("ape_spawn_point","script_noteworthy"); + ape = GetEnt("the_ape","script_noteworthy"); + if (!isDefined(ape)) + { + ape = simple_spawn_single( "ape_taunt", maps\_zombietron_ai_ape::ape_prespawn ); + ape.script_noteworthy = "the_ape"; + ape.takedamage = false; + ape thread maps\_zombietron_ai_ape::ape_you_greedy_mf(exit.origin); + ape thread maps\_zombietron_ai_ape::ape_taunt_deleter(); + spot = GetEnt("ape_intro_spot","script_noteworthy"); + ape forceTeleport(spot.origin,spot.angles); + level thread maps\_zombietron_pickups::spawn_treasures(spot.origin,5 + RandomInt( 5 ) ); + level waittill( "fade_in_complete"); + level.scr_anim["ape_zombie"]["chest_beat"] = %ai_zombie_simianaut_chest_beat; + ape thread maps\_anim::anim_single(ape, "chest_beat"); + wait 1; + ape anim_stopanimscripted(0.15); + ape set_run_anim( "sprint3" ); + ape.run_combatanim = level.scr_anim["ape_zombie"]["sprint3"]; + ape.crouchRunAnim = level.scr_anim["ape_zombie"]["sprint3"]; + ape.crouchrun_combatanim = level.scr_anim["ape_zombie"]["sprint3"]; + ape.goalradius = 32; + } + ape thread ape_intro_exit(exit.origin); + wait 2; + if (!isDefined(level.abort_scene)) + { + level thread begin_game_tutorial(); + maps\_zombietron_main::open_exits("top"); + } + maps\_zombietron_pickups::clear_all_pickups(); + player maps\_zombietron_main::player_reset_score(); + maps\_zombietron_main::move_players_to_start(); + wait 1; + fade_in(); + level notify("introduction_complete"); +} +introduction_abort_watcher() +{ + level endon("end_the_intro"); + level.skip_msg = NewHudElem( level ); + level.skip_msg.alignX = "center"; + level.skip_msg.alignY = "middle"; + level.skip_msg.horzAlign = "right"; + level.skip_msg.vertAlign = "bottom"; + level.skip_msg.foreground = true; + level.skip_msg.fontScale = 1; + level.skip_msg.x -= 70; + level.skip_msg.color = ( 1.0, 1.0, 1.0 ); + level.skip_msg.alpha = 1; + level.skip_msg SetText( &"ZOMBIETRON_SKIP_SCENE"); + level.skip_msg.hidewheninmenu = true; + while(1) + { + if ( self UseButtonPressed() ) + { + princess = GetEnt("princess","script_noteworthy"); + princess startragdoll(); + princess launchragdoll( (0,0,200) ); + maps\_zombietron_pickups::clear_all_pickups(); + level.abort_scene = true; + level notify("bubbles_off"); + level notify("end_the_intro"); + return; + } + wait 0.05; + } +} +game_introduction(player) +{ + level endon("end_the_intro"); + wait 0.1; + level notify("end_the_intro"); +} +begin_game_introduction(player) +{ + player.lives = 1; + player.bombs = 0; + player.boosters = 0; + player maps\_zombietron_score::update_multiplier_bar( 0 ); + player maps\_zombietron_score::update_hud(); + level thread game_introduction(player); + level thread end_game_introduction(player); + level waittill("introduction_complete"); +} +hide_temple_props( hide ) +{ + if (hide == "none" ) + { + statue_heads = GetEntArray("temple_head","targetname"); + if (isDefined(statue_heads)) + { + for( i = 0; i < statue_heads.size; i++ ) + { + statue_heads[i] Show(); + statue_heads[i] SetScale(3.0); + } + } + podium = GetEnt("temple_podium_first_place","targetname"); + if (isDefined(podium)) + { + podium Hide(); + if (!isDefined(podium.old_origin)) + { + podium.old_origin = podium.origin; + podium.origin += (0,0,-500); + } + } + podium = GetEnt("temple_podium_second_place","targetname"); + if (isDefined(podium)) + { + podium Hide(); + if (!isDefined(podium.old_origin)) + { + podium.old_origin = podium.origin; + podium.origin += (0,0,-500); + } + } + podium = GetEnt("temple_podium_third_place","targetname"); + if (isDefined(podium)) + { + podium Hide(); + if (!isDefined(podium.old_origin)) + { + podium.old_origin = podium.origin; + podium.origin += (0,0,-500); + } + } + podium = GetEnt("temple_podium_last_place","targetname"); + if (isDefined(podium)) + { + podium Hide(); + if (!isDefined(podium.old_origin)) + { + podium.old_origin = podium.origin; + podium.origin += (0,0,-500); + } + } + } + else + if (hide == "end" ) + { + statue_heads = GetEntArray("temple_head","targetname"); + if (isDefined(statue_heads)) + { + for( i = 0; i < statue_heads.size; i++ ) + { + statue_heads[i] Hide(); + } + } + podium = GetEnt("temple_podium_first_place","targetname"); + if (isDefined(podium)) + { + podium Show(); if (isDefined(podium.old_origin)) + { + podium.origin = podium.old_origin; + podium.old_origin = undefined; + } + } + podium = GetEnt("temple_podium_second_place","targetname"); + if (isDefined(podium)) + { + podium Show(); + if (isDefined(podium.old_origin)) + { + podium.origin = podium.old_origin; + podium.old_origin = undefined; + } + } + podium = GetEnt("temple_podium_third_place","targetname"); + if (isDefined(podium)) + { + podium Show(); + if (isDefined(podium.old_origin)) + { + podium.origin = podium.old_origin; + podium.old_origin = undefined; + } + } + podium = GetEnt("temple_podium_last_place","targetname"); + if (isDefined(podium)) + { + podium Show(); + if (isDefined(podium.old_origin)) + { + podium.origin = podium.old_origin; + podium.old_origin = undefined; + } + } + } +} +actor_end_bubbles(place) +{ + level endon("summary_complete"); + level waittill("summary_ready"); + originX = 340; + originY = 110; + switch(place) + { + case 0: + originX = 340; + originY = 110; + break; + case 1: + originX = 450; + originY = 170; + break; + case 2: + originX = 210; + originY = 180; + break; + case 3: + originX = 100; + originY = 220; + break; + } + level thread bubble_message( &"ZOMBIETRON_NAME", originX, originY, 2, self.ent ); + wait 2.5; + switch(place) + { + case 0: + if ( GetPlayers().size > 1 ) + { + level thread bubble_message( &"ZOMBIETRON_BUBBLE_WINNER", originX, originY, 1.5 ); + self PlaySound( "zmb_1st_vox_00" ); + wait 2; + level thread bubble_message( &"ZOMBIETRON_1ST", originX, originY, 6, self.score ); + self PlaySound( "zmb_1st_vox_01" ); + } + else + { + level thread bubble_message( &"ZOMBIETRON_BUBBLE_DEAD", originX, originY, 1.5 ); + self PlaySound( "zmb_1st_vox_00" ); + wait 2; + level thread bubble_message( &"ZOMBIETRON_SCORE", originX, originY, 6, self.score ); + self PlaySound( "zmb_1st_vox_01" ); + } + wait 7; + level thread bubble_message( &"ZOMBIETRON_BUBBLE_OHYEAH", originX, originY, 8 ); + self PlaySound( "zmb_1st_vox_02" ); + wait 13; + level thread bubble_message( &"ZOMBIETRON_BUBBLE_WHAT", originX, originY, 2 ); + self PlaySound( "zmb_1st_vox_03" ); + wait 2; + break; + case 1: + wait 1; + level thread bubble_message( &"ZOMBIETRON_BUBBLE_NOTBAD", originX, originY, 1.5 ); + self PlaySound( "zmb_2nd_vox_00" ); + wait 2; + level thread bubble_message( &"ZOMBIETRON_2ND", originX, originY, 6, self.score ); + self PlaySound( "zmb_2nd_vox_01" ); + wait 7; + level thread bubble_message( &"ZOMBIETRON_BUBBLE_BIGMONEY", originX, originY, 1.5 ); + self PlaySound( "zmb_2nd_vox_02" ); + wait 2; + break; + case 2: + wait 2; + level thread bubble_message( &"ZOMBIETRON_BUBBLE_NEXTTIME", originX, originY, 1.5 ); + self PlaySound( "zmb_3rd_vox_00" ); + wait 2; + level thread bubble_message( &"ZOMBIETRON_3RD", originX, originY, 6, self.score ); + self PlaySound( "zmb_3rd_vox_01" ); + wait 9; + level thread bubble_message( &"ZOMBIETRON_BUBBLE_BIGPRIZES", originX, originY, 1.5 ); + self PlaySound( "zmb_3rd_vox_02" ); + wait 2; + break; + case 3: + wait 3; + level thread bubble_message( &"ZOMBIETRON_BUBBLE_FCUK", originX, originY, 1.5 ); + self PlaySound( "zmb_4th_vox_00" ); + wait 2; + level thread bubble_message( &"ZOMBIETRON_4TH", originX, originY, 6, self.score ); + self PlaySound( "zmb_4th_vox_01" ); + break; + } +} +actor_end_idle(place) +{ + self.animname = "actor"; + level endon("summary_complete"); + if ( place == 0 ) + { + } + while(isDefined(self)) + { + switch(RandomInt(3)) + { + case 0: + level.scr_anim["actor"]["idle"] = %ai_civ_gen_casual_stand_idle; + break; + case 1: + level.scr_anim["actor"]["idle"] = %ai_civ_gen_casual_stand_idle_twitch_01; + break; + case 2: + level.scr_anim["actor"]["idle"] = %ai_civ_gen_casual_stand_idle_twitch_02; + break; + } + self maps\_anim::anim_single(self, "idle"); + } +} +end_of_game_summary_begin() +{ + level endon("end_the_summary"); + zombies = GetAISpeciesArray( "axis", "all" ); + for(i=0;i 180 ) camera_angles -= (360,0,0); + if ( camera_angles[1] > 180 ) camera_angles -= (0,360,0); + if ( camera_angles[2] > 180 ) camera_angles -= (0,0,360); + if ( camera_angles[0] < -180 ) camera_angles += (360,0,0);; + if ( camera_angles[1] < -180 ) camera_angles += (0,360,0);; + if ( camera_angles[2] < -180 ) camera_angles += (0,0,360);; + offset = camPos - dudes[0].origin; + for (i = 0; i < players.size; i++) + { + players[i] setClientDvars( "player_topDownCamOffset", offset,"player_TopDownCamAngles", camera_angles ); + } + playsoundatposition( "zmb_fate_spawn", (0,0,0) ); + level thread summary_abort_watcher(); + fade_in(); + level notify("summary_ready"); + wait 7; + prizePoint = dudes[0].origin + (0,0,400); + playsoundatposition( "zmb_prize_shower", (0,0,0) ); + level thread maps\_zombietron_pickups::spawn_uber_prizes(20*level.zombie_vars["max_prize_inc_range"],prizePoint,true,(0,0,20)); + level thread maps\_zombietron_pickups::spawn_treasures(dudes[0].origin,4, 24, true ); + wait 10; + apeSpot = GetEnt("temple_ape_spot","targetname"); + Playfx( level._effect["ape_lightning_spawn"], apeSpot.origin ); + playsoundatposition( "zmb_ape_prespawn", apeSpot.origin ); + wait( .5 ); + playsoundatposition( "zmb_ape_spawn", apeSpot.origin ); + Playfx( level._effect["ape_lightning_spawn"], apeSpot.origin ); + wait( .5 ); + PlayFX( level._effect["ape_lightning_spawn"], apeSpot.origin ); + ape = simple_spawn_single( "ape_taunt", maps\_zombietron_ai_ape::ape_prespawn ); + wait( 1.5 ); + ape.script_noteworthy= "the_ape"; + ape forceTeleport(apeSpot.origin,apeSpot.angles); + ape.takedamage = false; + playsoundatposition( "zmb_ape_spawn", apeSpot.origin ); + playsoundatposition( "zmb_ape_bolt", apeSpot.origin ); + Earthquake( 0.5, 0.75, apeSpot.origin , 1000); + level.scr_anim["ape_zombie"]["chest_beat"] = %ai_zombie_simianaut_chest_beat; + ape thread maps\_anim::anim_single(ape, "chest_beat"); + wait 1; + level thread bubble_message( &"ZOMBIETRON_BUBBLE_IMBACK", 320, 60, 1.5 ); + wait 1.3; + ape anim_stopanimscripted(0.15); + level.scr_anim["ape_zombie"]["chest_beat"] = %ai_zombie_simianaut_chest_beat; + ape thread maps\_anim::anim_single(ape, "chest_beat"); + wait 2.3; + ape anim_stopanimscripted(0.15); + Earthquake( 0.5, 0.75, ape.origin, 1000); + PlayFxOnTag( level._effect["boss_takeoff"], ape, "tag_origin" ); + ape PlaySound( "evt_turret_takeoff" ); + height = 800; + timeMS = height/1000 * 3000; + target = dudes[0]; + ape maps\_zombietron_ai_ape::move_to_position_over_time(target.origin,timeMS,height); + target PlaySound( "zmb_1st_vox_04" ); + ape PlaySound( "evt_turret_land" ); + target startragdoll(); + target launchragdoll( (0,0,200) ); + PlayRumbleOnPosition("explosion_generic", ape.origin); + PlayFxOnTag( level._effect["boss_groundhit"], ape, "tag_origin" ); + level.scr_anim["ape_zombie"]["chest_beat"] = %ai_zombie_simianaut_chest_beat; + ape thread maps\_anim::anim_single(ape, "chest_beat"); + wait 1; + level thread bubble_message( &"ZOMBIETRON_BUBBLE_TREASURE", 350, 120, 1.5 ); + ape thread ape_you_greedy_mf( ape.origin + (0,0,500)); + wait 1.7; + ape anim_stopanimscripted(0.15); + level.scr_anim["ape_zombie"]["chest_beat"] = %ai_zombie_simianaut_taunt; + ape thread maps\_anim::anim_single(ape, "chest_beat"); + wait 2.9; + level thread bubble_message( &"ZOMBIETRON_BUBBLE_HAHADOH", 350, 120, 1 ); + wait 1.1; + PlayFxOnTag( level._effect["boss_takeoff"], ape, "tag_origin" ); + ape PlaySound( "evt_turret_takeoff" ); + height = 800; + timeMS = height/1000 * 3000; + ape thread maps\_zombietron_ai_ape::move_to_position_over_time(ape.origin,timeMS,height); + wait 1.5; + level notify("end_the_summary"); +} +ape_you_greedy_mf(exit) +{ + self endon("end_the_summary"); + self endon("death"); + pickupsItems = GetEntArray("a_pickup_item","script_noteworthy"); + for (i=0;i 1 ) + { + level.skip_msg SetText( &"ZOMBIETRON_WINNER_SKIP"); + } + else + { + level.skip_msg SetText( &"ZOMBIETRON_SKIP_SCENE"); + } + while(1) + { + if ( isDefined(winner) && winner UseButtonPressed() ) + { + maps\_zombietron_pickups::clear_all_pickups(); + level notify("bubbles_off"); + level notify("end_the_summary"); + level notify("stop_spawning_pickups"); + return; + } + wait 0.05; + } +} +bubble_message( text, x, y, time, param ) +{ + font_size = 2; + bubblehud = create_simple_hud(); + bubblehud.foreground = true; + bubblehud.sort = 20; + bubblehud.x = x; + bubblehud.y = y; + bubblehud.fontScale = font_size; + bubblehud.alignX = "center"; + bubblehud.alignY = "middle"; + bubblehud.color = ( 0.0, 0.0, 0.0 ); + if ( isDefined(param) ) + { + bubblehud SetText( text, param ); + } + else + { + bubblehud SetText( text ); + } + bubblehud.hidewheninmenu = true; + width = bubblehud GetTextWidth() + 22; + bubblehudbackground = create_simple_hud(); + bubblehudbackground.foreground = true; + bubblehudbackground.sort = 10; + bubblehudbackground.x = x; + bubblehudbackground.y = y + 2; + bubblehudbackground.alignX = "center"; + bubblehudbackground.alignY = "middle"; + bubblehudbackground.color = ( 0.9, 0.9, 0.9 ); + bubblehudbackground SetShader( "text_box", width, 40 ); + bubblehudbackground.hidewheninmenu = true; + level thread assassinateHudElem(bubblehud,"bubbles_off"); + level thread assassinateHudElem(bubblehudbackground,"bubbles_off"); + wait time; + destroyHudElem( bubblehud ); + destroyHudElem( bubblehudbackground ); +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/_zombietron_score.gsc b/BO1/PC/ZM/maps/_zombietron_score.gsc new file mode 100644 index 0000000..35d7630 Binary files /dev/null and b/BO1/PC/ZM/maps/_zombietron_score.gsc differ diff --git a/BO1/PC/ZM/maps/_zombietron_utility.gsc b/BO1/PC/ZM/maps/_zombietron_utility.gsc new file mode 100644 index 0000000..7d32203 --- /dev/null +++ b/BO1/PC/ZM/maps/_zombietron_utility.gsc @@ -0,0 +1,671 @@ +#include maps\_utility; +#include common_scripts\utility; +get_camera_launch_direction() +{ + pos = GetDvarVector( "player_topDownCamCenterPos" ) + GetDvarVector( "player_topDownCamOffset" ); + return VectorNormalize( pos - self.origin ); +} +fake_linkto(entity, offset) +{ + while (isDefined(self) && isDefined(entity)) + { + self.origin = entity.origin; + if (isDefined(offset) ) + { + self.origin += offset; + } + wait 0.05; + } +} +ok_to_gib() +{ + if ( !is_mature() ) + { + return false; + } + if ( is_german_build() ) + { + return false; + } + return true; +} +randomize_array( array ) +{ + for( i = 0; i < array.size; i++ ) + { + j = RandomInt( array.size ); + temp = array[i]; + array[i] = array[j]; + array[j] = temp; + } + return array; +} +assassinateHudElem(hudelm,note) +{ + level waittill(note); + destroyHudElem( hudelm ); +} +destroyHudElem( hudElem ) +{ + if( isDefined( hudElem ) ) + hudElem destroy(); +} +sort_by_score(array) +{ + sorted = []; + rightsize = array.size; + while(sorted.size < rightsize) + { + highest = array[0]; + for (i=0; i < array.size; i++) + { + if ( array[i].score > highest.score) + { + highest = array[i]; + } + } + sorted = array_add(sorted, highest); + array = array_remove(array, highest); + } + return sorted; +} +spawn_zombie( spawner, target_name, nofailsafe ) +{ + if( !isdefined( spawner ) ) + { + return undefined; + } + spawner.script_moveoverride = true; + if( IsDefined( spawner.script_forcespawn ) && spawner.script_forcespawn ) + { + guy = spawner StalingradSpawn(); + } + else + { + guy = spawner DoSpawn(); + } + spawner.count = 666; + if( !spawn_failed( guy ) ) + { + if( IsDefined( target_name ) ) + { + guy.targetname = target_name; + } + if (!isDefined(nofailsafe) ) + { + guy thread maps\_zombietron_spawner::zombie_killer_failsafe(); + } + guy.original_location = guy.origin; + return guy; + } + return undefined; +} +get_closest_valid_player( origin, ignore_player ) +{ + valid_player_found = false; + players = get_players(); + if( IsDefined( ignore_player ) ) + { + for(i = 0; i < ignore_player.size; i++ ) + { + if( IsDefined( ignore_player[i] ) ) + { + players = array_remove( players, ignore_player[i] ); + } + } + } + while( !valid_player_found ) + { + player = GetClosest( origin, players ); + if( !isdefined( player ) ) + { + return undefined; + } + if( !is_player_valid( player, true ) ) + { + players = array_remove( players, player ); + continue; + } + return player; + } +} +is_player_valid( player, checkIgnoreMeFlag ) +{ + if( !IsDefined( player ) ) + { + return false; + } + if( !IsAlive( player ) ) + { + return false; + } + if( !IsPlayer( player ) ) + { + return false; + } + if( player.sessionstate == "spectator" ) + { + return false; + } + if( player.sessionstate == "intermission" ) + { + return false; + } + if( player maps\_laststand::player_is_in_laststand() ) + { + return false; + } + if ( player isnotarget() ) + { + return false; + } + if( isdefined(checkIgnoreMeFlag) && player.ignoreme ) + { + return false; + } + return true; +} +get_number_of_valid_players() +{ + players = get_players(); + num_player_valid = 0; + for( i = 0 ; i < players.size; i++ ) + { + if( is_player_valid( players[i] ) ) + num_player_valid += 1; + } + return num_player_valid; +} +add_sound( ref, alias ) +{ + if( !IsDefined( level.zombie_sounds ) ) + { + level.zombie_sounds = []; + } + level.zombie_sounds[ref] = alias; +} +create_simple_hud( client ) +{ + if( IsDefined( client ) ) + { + hud = NewClientHudElem( client ); + } + else + { + hud = NewHudElem(); + } + level.hudelem_count++; + hud.foreground = true; + hud.sort = 1; + hud.hidewheninmenu = false; + return hud; +} +destroy_hud() +{ + level.hudelem_count--; + self Destroy(); +} +deleteMe_in_n_seconds(secs) +{ + wait secs; + if ( isDefined(self) ) + { + self Delete(); + } +} +is_headshot( sWeapon, sHitLoc, sMeansOfDeath ) +{ + return (sHitLoc == "head" || sHitLoc == "helmet") && sMeansOfDeath != "MOD_MELEE" && sMeansOfDeath != "MOD_BAYONET" && sMeansOfDeath != "MOD_IMPACT"; +} +destroy_me_on_player_notify(player,note) +{ + self endon("death"); + player waittill(note); + if (isDefined(self)) + { + self Delete(); + } +} +ghetto_linkto(ent) +{ + self endon("ghetto_unlink"); + while(1) + { + self.origin = ent.origin; + wait 0.05; + } +} +kill_me() +{ + self DoDamage(self.health + 100, self.origin); +} +wait_until_first_player() +{ + players = get_players(); + while(players.size==0) + { + wait 0.05; + players = get_players(); + } +} +waittill_timeout(note,timeout) +{ + self endon(note); + wait timeout; + self notify(note); +} +waittill_notify_timeout(note,timeout) +{ + self thread waittill_timeout(note,timeout); + self waittill(note); +} +notify_timeout(note,timeout) +{ + self endon("death"); + wait timeout; + self notify(note); +} +kill_all_the_mfn_zombies(seconds) +{ + level endon("round_spawning_starting"); + if (isDefined(seconds)) + { + wait seconds; + } + zombies = GetAISpeciesArray( "axis", "all" ); + array_thread(zombies,::kill_me); +} +waittill_all_zombies_dead() +{ + zombies = GetAISpeciesArray( "axis", "all" ); + while( zombies.size > 0 || flag("round_is_active") ) + { + wait 1; + zombies = GetAISpeciesArray( "axis", "all" ); + if ( isDefined(level.desiredRound) ) + { + array_thread(zombies,::kill_me); + } + } +} +wait_anim_length(animation, blend) +{ + len = GetAnimLength(animation) - blend; + if (len > 0) + { + wait len; + } +} +ammo() +{ + wait 2; + self endon("disconnect"); + while(1) + { + wait .5; + weaponsList = self GetWeaponsListPrimaries(); + for( idx = 0; idx < weaponsList.size; idx++ ) + self SetWeaponAmmoClip( weaponsList[idx], 100 ); + } +} +setup_smashtv_loadout() +{ + wait 1; + self TakeAllWeapons(); + self GiveWeapon( self.default_weap ); + self switchToWeapon( self.default_weap ); + self.headshots = 0; +} +IsExplosiveDamage( damage_mod ) +{ + if( damage_mod == "MOD_GRENADE" || + damage_mod == "MOD_GRENADE_SPLASH" || + damage_mod == "MOD_PROJECTILE" || + damage_mod == "MOD_PROJECTILE_SPLASH" || + damage_mod == "MOD_EXPLOSIVE" ) + { + return true; + } + return false; +} +is_tesla_damage( mod ) +{ + return ( IsDefined( self.damageweapon ) && (self.damageweapon == "tesla_gun_zt") && + ( mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" ) ); +} +string_to_float( string ) +{ + floatParts = strTok( string, "." ); + if ( floatParts.size == 1 ) + return int(floatParts[0]); + whole = int(floatParts[0]); + decimal = 0; + for ( i=floatParts[1].size-1; i>=0; i-- ) + { + decimal = decimal/10 + int(floatParts[1][i])/10; + } + if ( whole >= 0 ) + return (whole + decimal); + else + return (whole - decimal); +} +set_zombie_var( var, value, is_float, column ) +{ + if ( !IsDefined( is_float ) ) + { + is_float = false; + } + if ( !IsDefined(column) ) + { + column = 1; + } + table = "mp/zombiemode_zt.csv"; + table_value = TableLookUp( table, 0, var, column ); + if ( IsDefined( table_value ) && table_value != "" ) + { + if( is_float ) + { + value = float( table_value ); + } + else + { + value = int( table_value ); + } + } + level.zombie_vars[var] = value; + return value; +} +get_table_var( table, var_name, value, is_float, column ) +{ + if ( !IsDefined(table) ) + { + table = "mp/zombiemode_zt.csv"; + } + if ( !IsDefined(is_float) ) + { + is_float = false; + } + if ( !IsDefined(column) ) + { + column = 1; + } + table_value = TableLookUp( table, 0, var_name, column ); + if ( IsDefined( table_value ) && table_value != "" ) + { + if( is_float ) + { + value = string_to_float( table_value ); + } + else + { + value = int( table_value ); + } + } + return value; +} +drawcylinder( pos, rad, height ) +{ + self endon("stop_cylinder"); +} +_disableInvulnerability() +{ + self DisableInvulnerability(); +} +_enableInvulnerability() +{ + self EnableInvulnerability(); +} +is_arena_boss_available() +{ + spawner_set = level.arenas[level.current_arena] + "_spawner"; + if ( level.spawners[spawner_set]["boss"].size > 0 ) + { + return true; + } + else + { + return false; + } +} +fade_out(time) +{ + if (!isDefined(time)) + { + time = 1; + } + if( !IsDefined(level.introblack) ) + { + level.introblack = NewHudElem(); + level.introblack.x = 0; + level.introblack.y = 0; + level.introblack.horzAlign = "fullscreen"; + level.introblack.vertAlign = "fullscreen"; + level.introblack.foreground = true; + level.introblack SetShader( "black", 640, 480 ); + level.introblack.alpha = 0; + wait .05; + } + level.introblack FadeOverTime( time ); + level.introblack.alpha = 1; + players = get_players(); + for(i = 0; i < players.size; i++) + { + players[i] freezecontrols(true); + } + wait time; +} +fade_in( hold_black_time ) +{ + if( !IsDefined(level.introblack) ) + { + level.introblack = NewHudElem(); + level.introblack.x = 0; + level.introblack.y = 0; + level.introblack.horzAlign = "fullscreen"; + level.introblack.vertAlign = "fullscreen"; + level.introblack.foreground = true; + level.introblack SetShader( "black", 640, 480 ); + level.introblack.alpha = 1; + wait .05; + } + level.introblack.alpha = 1; + if( IsDefined( hold_black_time ) ) + wait hold_black_time; + else + wait .2; + level.introblack FadeOverTime( 1.5 ); + level.introblack.alpha = 0; + wait 1.5; + players = get_players(); + for(i = 0; i < players.size; i++) + { + players[i] freezecontrols(false); + } + level notify("fade_in_complete"); +} +plot_circle_fortime(radius,time,color) +{ + if(!isdefined(color)) + { + color = (0,1,0); + } + hangtime = .05; + circleres = 16; + hemires = circleres/2; + circleinc = 360/circleres; + circleres++; + plotpoints = []; + rad = 0; + plotpoints = []; + rad = 0.000; + timer = gettime()+(time*1000); + while(gettime() 0) + { + return; + } + level.player_out_of_playable_area_monitor = true; + level.player_out_of_playable_area_monitor_callback = ::zombie_coast_player_out_of_playable_area_monitor_callback; + level.zombie_anim_override = maps\zombie_coast::anim_override_func; + level.player_intersection_tracker_override = ::zombie_coast_player_intersection_tracker_override; + maps\_zombiemode::register_player_damage_callback( ::zombie_coast_player_damage_level_override ); + level._func_humangun_check = ::func_humangun_check; + level.check_for_alternate_poi = ::check_for_alternate_poi; + level.pay_turret_cost = 850; + level.plankB_cost = 1000; + level.random_pandora_box_start = true; + level.zombie_coast_visionset = "zombie_coast"; + level thread maps\zombie_coast_cave_slide::cave_slide_anim_init(); + level thread maps\_callbacksetup::SetupCallbacks(); + level.dog_spawn_func = maps\_zombiemode_ai_dogs::dog_spawn_factory_logic; + maps\zombie_coast_flinger::main(); + level.dogs_enabled = false; + level.custom_ai_type = []; + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_director::init ); + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_faller::faller_init ); + maps\zombie_coast_ai_director::init(); + maps\zombie_coast_lighthouse::init(); + maps\zombie_coast_water::init(); + maps\zombie_coast_eggs::init(); + level.door_dialog_function = maps\_zombiemode::play_door_dialog; + include_weapons(); + include_powerups(); + level.use_zombie_heroes = true; + level.zombiemode_using_marathon_perk = true; + level.zombiemode_using_divetonuke_perk = true; + level.zombiemode_using_deadshot_perk = true; + level.use_freezegun_features = true; + level.uses_tesla_powerup = true; + level.zombiemode_precache_player_model_override = ::coast_precache_custom_models; + level.zombiemode_give_player_model_override = ::coast_custom_third_person_override; + level.zombiemode_player_set_viewmodel_override = ::coast_custom_viewmodel_override; + level.register_offhand_weapons_for_level_defaults_override = ::coast_offhand_weapon_overrride; + level.zombiemode_offhand_weapon_give_override = ::coast_offhand_weapon_give_override; + level.max_perks = 5; + level.max_solo_lives = 3; + level.revive_solo_fx_func = ::coast_revive_solo_fx; + maps\_zombiemode::main(); + maps\_sticky_grenade::init(); + maps\_zombiemode_weap_sickle::init(); + maps\_zombiemode_weap_humangun::init(); + maps\_zombiemode_weap_sniper_explosive::init(); + maps\_zombiemode_weap_nesting_dolls::init(); + level thread maps\_zombiemode::register_sidequest( "ZOMBIE_COAST_EGG_SOLO", 43, "ZOMBIE_COAST_EGG_COOP", 44 ); + level.director_should_drop_special_powerup = ::coast_director_should_drop_special_powerup; + battlechatter_off("allies"); + battlechatter_off("axis"); + level.zone_manager_init_func = ::coast_zone_init; + init_zones[0] = "beach_zone"; + level thread maps\_zombiemode_zone_manager::manage_zones( init_zones ); + level thread stairs_blocker_buyable(); + level thread electric_switch(); + level thread electric_door_function(); + level thread maps\_zombiemode_auto_turret::init(); + level thread maps\zombie_coast_achievement::init(); + level thread maps\zombie_coast_ai_director::coast_director_start(); + level thread coast_fade_in_notify(); + level thread maps\zombie_coast_cave_slide::zombie_cave_slide_init(); + maps\_zombiemode_player_zipline::main(); + level thread setup_water_physics(); + level thread setup_zcoast_water(); + level thread maps\zombie_coast_distance_tracking::zombie_tracking_init(); + SetSavedDvar( "zombiemode_path_minz_bias", 17 ); + maps\zombie_coast_flinger::init_flinger(); + init_sounds(); + level thread maps\zombie_coast_amb::main(); + level thread coast_power_on_lighthouse_react(); + level thread coast_spawn_init_delay(); + level thread maps\zombie_coast_fx:: manage_blizzard(); + if(GetDvarInt( #"zombie_unlock_all") > 0) + { + level thread zombie_unlock_all(); + } + level thread maps\zombie_coast_ffotd::main_end(); + level thread check_to_set_play_outro_movie(); +} +check_to_set_play_outro_movie() +{ + flag_wait( "all_players_connected" ); + if ( !level.onlineGame && !level.systemlink ) + { + SetDvar("ui_playCoastOutroMovie", 1); + } +} +zombie_coast_player_out_of_playable_area_monitor_callback() +{ + if ( is_true( self._being_flung ) || is_true( self.is_ziplining ) ) + { + return false; + } + return true; +} +zombie_unlock_all() +{ + flag_wait( "begin_spawning" ); + players = GetPlayers(); + flag_set( "power_on" ); + zombie_doors = GetEntArray( "zombie_door", "targetname" ); + for ( i = 0; i < zombie_doors.size; i++ ) + { + zombie_doors[i] notify("trigger", players[0]); + } + zombie_debris = GetEntArray( "zombie_debris", "targetname" ); + for ( i = 0; i < zombie_debris.size; i++ ) + { + zombie_debris[i] notify("trigger", players[0]); + } +} +custom_add_weapons() +{ + maps\_zombiemode_weapons::add_zombie_weapon( "humangun_zm", "humangun_upgraded_zm", &"ZOMBIE_WEAPON_HUMANGUN", 10, "human", "", undefined ); + maps\_zombiemode_weapons::add_zombie_weapon( "sniper_explosive_zm", "sniper_explosive_upgraded_zm", &"ZOMBIE_WEAPON_SNIPER_EXPLOSIVE", 2500, "ubersniper", "", undefined ); +} +coast_spawn_init_delay(director) +{ + flag_wait( "begin_spawning" ); + flag_clear( "spawn_zombies"); + director_zomb = undefined; + while(!IsDefined(director_zomb)) + { + zombs = GetAIArray ("axis"); + for ( i = 0; i < zombs.size; i++ ) + { + if(IsDefined(zombs[i].animname) && zombs[i].animname == "director_zombie") + { + director_zomb = zombs[i]; + } + } + wait_network_frame(); + } + director_zomb waittill_notify_or_timeout( "director_spawn_zombies", 30 ); + flag_set( "spawn_zombies"); +} +#using_animtree( "generic_human" ); +anim_override_func() +{ + level.scr_anim["zombie"]["walk3"] = %ai_zombie_walk_v2; + level.scr_anim["zombie"]["run6"] = %ai_zombie_run_v2; +} +coast_zone_init() +{ + flag_init( "always_on" ); + flag_set( "always_on" ); + add_adjacent_zone( "start_zone", "lighthouse1_zone", "lighthouse_enter" ); + add_zone_flags( "lighthouse_enter", "start_beach_group" ); + add_adjacent_zone( "start_cave_zone", "lighthouse1_zone", "lighthouse_lagoon_enter" ); + add_adjacent_zone( "start_cave_zone", "rear_lagoon_zone", "lighthouse_lagoon_enter" ); + add_zone_flags( "lighthouse_lagoon_enter", "start_beach_group" ); + add_adjacent_zone( "start_zone", "start_beach_zone", "start_beach_group" ); + add_adjacent_zone( "start_beach_zone", "start_cave_zone", "start_beach_group", true ); + add_adjacent_zone( "start_zone", "shipfront_bottom_zone", "enter_shipfront_bottom" ); + add_zone_flags( "enter_shipfront_bottom", "start_beach_group" ); + add_adjacent_zone( "shipfront_bottom_zone", "shipfront_near_zone", "enter_shipfront_bottom" ); + add_adjacent_zone( "shipfront_bottom_zone", "shipfront_near_zone", "plankA_enter" ); + add_adjacent_zone( "shipfront_near_zone", "shipfront_far_zone", "shipfront_far_enter" ); + add_adjacent_zone( "shipfront_near_zone", "shipfront_2_beach_zone", "enter_shipfront_bottom" ); + add_adjacent_zone( "shipfront_near_zone", "shipfront_2_beach_zone", "plankA_enter" ); + add_adjacent_zone( "beach_zone", "shipfront_2_beach_zone", "", true ); + add_adjacent_zone( "shipfront_storage_zone", "shipfront_far_zone", "shipfront_deck_storage" ); + add_adjacent_zone( "shipfront_bottom_zone", "shipfront_storage_zone", "shipfront_bottom_storage" ); + add_adjacent_zone( "shipfront_near_zone", "shipback_near_zone", "plankA_enter" ); + add_adjacent_zone( "shipback_near_zone", "shipback_far_zone", "shipback_far_enter" ); + add_adjacent_zone( "shipback_near_zone", "shipback_near2_zone", "shipback_level2_enter" ); + add_adjacent_zone( "shipback_near2_zone", "shipback_level3_zone", "ship_house3" ); + add_adjacent_zone( "residence1_zone", "residence_roof_zone", "residence_beach_group" ); + add_adjacent_zone( "residence_roof_zone", "beach_zone2", "residence_beach_group" ); + add_adjacent_zone( "beach_zone2", "beach_zone", "side_beach_debris" ); + add_zone_flags( "side_beach_debris", "residence_beach_group" ); + add_adjacent_zone( "shipback_near_zone", "beach_zone", "plankB_enter" ); + add_adjacent_zone( "residence_roof_zone", "lighthouse2_zone", "balcony_enter" ); + add_zone_flags( "balcony_enter", "residence_beach_group" ); + add_adjacent_zone( "residence1_zone", "lighthouse1_zone", "res_2_lighthouse1" ); + add_zone_flags( "res_2_lighthouse1", "residence_beach_group" ); + add_adjacent_zone( "start_zone", "residence1_zone", "lighthouse_residence_front" ); + add_zone_flags( "lighthouse_residence_front", "residence_beach_group" ); + add_zone_flags( "lighthouse_residence_front", "start_beach_group" ); + add_adjacent_zone( "lighthouse1_zone", "lighthouse2_zone", "lighthouse2_enter" ); + add_adjacent_zone( "catwalk_zone", "lighthouse2_zone", "catwalk_enter" ); +} +include_weapons() +{ + include_weapon( "frag_grenade_zm", false ); + include_weapon( "sticky_grenade_zm", false, true ); + include_weapon( "claymore_zm", false, true ); + include_weapon( "m1911_zm", false ); + include_weapon( "m1911_upgraded_zm", false ); + include_weapon( "python_zm" ); + include_weapon( "python_upgraded_zm", false ); + include_weapon( "cz75_zm" ); + include_weapon( "cz75_upgraded_zm", false ); + include_weapon( "m14_zm", false, true ); + include_weapon( "m14_upgraded_zm", false ); + include_weapon( "m16_zm", false, true ); + include_weapon( "m16_gl_upgraded_zm", false ); + include_weapon( "g11_lps_zm" ); + include_weapon( "g11_lps_upgraded_zm", false ); + include_weapon( "famas_zm" ); + include_weapon( "famas_upgraded_zm", false ); + include_weapon( "ak74u_zm", false, true ); + include_weapon( "ak74u_upgraded_zm", false ); + include_weapon( "mp5k_zm", false, true ); + include_weapon( "mp5k_upgraded_zm", false ); + include_weapon( "mpl_zm", false, true ); + include_weapon( "mpl_upgraded_zm", false ); + include_weapon( "pm63_zm", false, true ); + include_weapon( "pm63_upgraded_zm", false ); + include_weapon( "spectre_zm" ); + include_weapon( "spectre_upgraded_zm", false ); + include_weapon( "mp40_zm", false ); + include_weapon( "mp40_upgraded_zm", false ); + include_weapon( "cz75dw_zm" ); + include_weapon( "cz75dw_upgraded_zm", false ); + include_weapon( "ithaca_zm", false, true ); + include_weapon( "ithaca_upgraded_zm", false ); + include_weapon( "rottweil72_zm", false, true ); + include_weapon( "rottweil72_upgraded_zm", false ); + include_weapon( "spas_zm" ); + include_weapon( "spas_upgraded_zm", false ); + include_weapon( "hs10_zm" ); + include_weapon( "hs10_upgraded_zm", false ); + include_weapon( "aug_acog_zm" ); + include_weapon( "aug_acog_mk_upgraded_zm", false ); + include_weapon( "galil_zm" ); + include_weapon( "galil_upgraded_zm", false ); + include_weapon( "commando_zm" ); + include_weapon( "commando_upgraded_zm", false ); + include_weapon( "fnfal_zm" ); + include_weapon( "fnfal_upgraded_zm", false ); + include_weapon( "dragunov_zm" ); + include_weapon( "dragunov_upgraded_zm", false ); + include_weapon( "l96a1_zm" ); + include_weapon( "l96a1_upgraded_zm", false ); + include_weapon( "rpk_zm" ); + include_weapon( "rpk_upgraded_zm", false ); + include_weapon( "hk21_zm" ); + include_weapon( "hk21_upgraded_zm", false ); + include_weapon( "m72_law_zm" ); + include_weapon( "m72_law_upgraded_zm", false ); + include_weapon( "china_lake_zm" ); + include_weapon( "china_lake_upgraded_zm", false ); + include_weapon( "ray_gun_zm" ); + include_weapon( "ray_gun_upgraded_zm", false ); + include_weapon( "crossbow_explosive_zm" ); + include_weapon( "crossbow_explosive_upgraded_zm", false ); + include_weapon( "humangun_zm", true, false ); + include_weapon( "humangun_upgraded_zm", false ); + include_weapon( "sniper_explosive_zm", true ); + include_weapon( "sniper_explosive_upgraded_zm", false ); + include_weapon( "zombie_nesting_dolls", true, false ); + include_weapon( "knife_ballistic_zm", true ); + include_weapon( "knife_ballistic_upgraded_zm", false ); + include_weapon( "knife_ballistic_sickle_zm", false ); + include_weapon( "knife_ballistic_sickle_upgraded_zm", false ); + level._uses_retrievable_ballisitic_knives = true; + maps\_zombiemode_weapons::add_limited_weapon( "m1911_zm", 0 ); + maps\_zombiemode_weapons::add_limited_weapon( "humangun_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "sniper_explosive_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "crossbow_explosive_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "knife_ballistic_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "zombie_nesting_dolls", 1 ); + precacheItem( "explosive_bolt_zm" ); + precacheItem( "explosive_bolt_upgraded_zm" ); + precacheItem( "sniper_explosive_bolt_zm" ); + precacheItem( "sniper_explosive_bolt_upgraded_zm" ); + level.collector_achievement_weapons = array_add( level.collector_achievement_weapons, "sickle_knife_zm" ); +} +coast_director_should_drop_special_powerup() +{ + return maps\_zombiemode::is_sidequest_previously_completed(); +} +coast_offhand_weapon_overrride() +{ + register_lethal_grenade_for_level( "frag_grenade_zm" ); + register_lethal_grenade_for_level( "sticky_grenade_zm" ); + level.zombie_lethal_grenade_player_init = "frag_grenade_zm"; + register_tactical_grenade_for_level( "zombie_nesting_dolls" ); + level.zombie_tactical_grenade_player_init = undefined; + register_placeable_mine_for_level( "claymore_zm" ); + level.zombie_placeable_mine_player_init = undefined; + register_melee_weapon_for_level( "knife_zm" ); + register_melee_weapon_for_level( "sickle_knife_zm" ); + level.zombie_melee_weapon_player_init = "knife_zm"; +} +coast_offhand_weapon_give_override( str_weapon ) +{ + self endon( "death" ); + if( is_tactical_grenade( str_weapon ) && IsDefined( self get_player_tactical_grenade() ) && !self is_player_tactical_grenade( str_weapon ) ) + { + self SetWeaponAmmoClip( self get_player_tactical_grenade(), 0 ); + self TakeWeapon( self get_player_tactical_grenade() ); + } + if( str_weapon == "zombie_nesting_dolls" ) + { + self maps\_zombiemode_weap_nesting_dolls::player_give_nesting_dolls(); + return true; + } + return false; +} +zombie_coast_player_intersection_tracker_override( other_player ) +{ + if ( is_true( self._being_flung ) || is_true( self.is_ziplining ) ) + { + return true; + } + if ( is_true( other_player._being_flung ) || is_true( other_player.is_ziplining ) ) + { + return true; + } + return false; +} +zombie_coast_player_damage_level_override( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime ) +{ + if ( is_true( self._being_flung ) || is_true( self.is_ziplining ) ) + { + return 0; + } + return -1; +} +include_powerups() +{ + include_powerup( "nuke" ); + include_powerup( "insta_kill" ); + include_powerup( "double_points" ); + include_powerup( "full_ammo" ); + include_powerup( "carpenter" ); + include_powerup( "fire_sale" ); + PreCacheItem( "minigun_zm" ); + include_powerup( "minigun" ); + PreCacheItem( "tesla_gun_zm" ); + include_powerup( "tesla" ); + include_powerup( "free_perk" ); +} +init_sounds() +{ + maps\_zombiemode_utility::add_sound( "break_stone", "break_stone" ); + maps\_zombiemode_utility::add_sound( "lighthouse_double_door", "zmb_lighthouse_double_door" ); + maps\_zombiemode_utility::add_sound( "ship_door", "zmb_ship_door" ); + maps\_zombiemode_utility::add_sound( "ship_container_door", "zmb_ship_container_door" ); +} +electric_switch() +{ + trig = getent("use_elec_switch","targetname"); + trig sethintstring(&"ZOMBIE_ELECTRIC_SWITCH"); + trig setcursorhint( "HINT_NOICON" ); + level thread wait_for_power(); + trig waittill("trigger",user); + trig delete(); + flag_set( "power_on" ); + Objective_State(8,"done"); +} +wait_for_power() +{ + master_switch = getent("elec_switch","targetname"); + master_switch notsolid(); + flag_wait( "power_on" ); + master_switch rotateroll(-90,.3); + master_switch playsound("zmb_switch_flip"); + level notify("revive_on"); + wait_network_frame(); + level notify("juggernog_on"); + wait_network_frame(); + level notify("sleight_on"); + wait_network_frame(); + level notify("doubletap_on"); + wait_network_frame(); + level notify("divetonuke_on"); + wait_network_frame(); + level notify("marathon_on"); + wait_network_frame(); + level notify("deadshot_on"); + wait_network_frame(); + level notify("Pack_A_Punch_on" ); + wait_network_frame(); + level notify("electric_door"); + clientnotify("ZPO"); + master_switch waittill("rotatedone"); + playfx(level._effect["switch_sparks"] ,getstruct("elec_switch_fx","targetname").origin); + master_switch playsound("zmb_turn_on"); +} +electric_door_function() +{ + door_trigs = getentarray( "electric_door", "script_noteworthy" ); + array_thread( door_trigs, ::set_door_unusable ); + array_thread( door_trigs, ::play_door_dialog ); + level waittill( "electric_door" ); + array_thread( door_trigs, ::trigger_off ); + thread open_electric_doors( door_trigs ); +} +set_door_unusable() +{ + self sethintstring(&"ZOMBIE_NEED_POWER"); + self UseTriggerRequireLookAt(); +} +open_electric_doors( door_trigs ) +{ + time = 1; + for(i=0;i 70*70) + { + timer =0; + continue; + } + while(dist < 70*70 && timer < 3) + { + wait(0.5); + timer++; + } + if(dist > 70*70 && timer >= 3) + { + self playsound("door_deny"); + players[i] thread do_player_vo("vox_start", 5); + wait(3); + self notify ("warning_dialog"); + } + } + } +} +check_plankB( from, forward ) +{ + trigger = getent( from, "targetname" ); + trigger sethintstring( &"ZOMBIE_BUILD_BRIDGE" ); + trigger setcursorhint( "HINT_NOICON" ); + trigger endon( "plankB_done" ); + user = undefined; + done = false; + while ( !done ) + { + trigger waittill( "trigger", user ); + if ( is_player_valid( user ) && user.score >= level.plankB_cost ) + { + user maps\_zombiemode_score::minus_to_player_score( level.plankB_cost ); + other = getent( trigger.target, "targetname" ); + other notify( "plankB_done" ); + other delete(); + trigger delete(); + clip = getent( "plankB_clip", "targetname" ); + clip connectpaths(); + clip delete(); + if ( forward == true ) + { + for ( i = 1; i <= 4; i++ ) + { + bridge = getent( "residence2ship_walk" + i, "targetname" ); + bridge show(); + wait( 0.5 ); + } + } + else + { + for ( i = 4; i >= 1; i-- ) + { + bridge = getent( "residence2ship_walk" + i, "targetname" ); + bridge show(); + wait( 0.5 ); + } + } + done = true; + flag_set( "plankB_enter" ); + } + wait( .05 ); + } +} +wait_for_respawn() +{ + zone_name = self.script_noteworthy; + if ( isDefined( level.zones[ zone_name ] ) ) + { + while ( !level.zones[ zone_name ].is_enabled ) + { + wait( 0.5 ); + } + self.locked = false; + } +} +stairs_blocker_buyable() +{ + trigger = getentarray("buyable_stairs", "targetname"); + for ( i = 0; i < trigger.size; i++ ) + { + trigger[i] thread stairs_init(); + } +} +stairs_init() +{ + cost = 1000; + if( IsDefined( self.zombie_cost ) ) + { + cost = self.zombie_cost; + } + self set_hint_string( self, "default_buy_debris_" + cost ); + self SetCursorHint( "HINT_NOICON" ); + if( isdefined (self.script_flag) && !IsDefined( level.flag[self.script_flag] ) ) + { + flag_init( self.script_flag ); + } + self UseTriggerRequireLookAt(); + clip = undefined; + debris = undefined; + planks = getentarray( self.target, "targetname" ); + for( i = 0; i < planks.size; i++ ) + { + if( IsDefined( planks[i].script_noteworthy ) ) + { + if( planks[i].script_noteworthy == "clip") + { + clip = planks[i]; + planks = array_remove(planks, clip); + i--; + continue; + } + else if( planks[i].script_noteworthy == "debris_blocker" ) + { + debris = planks[i]; + planks = array_remove(planks, debris); + i--; + continue; + } + else + { + } + } + } + wait_network_frame(); + self thread stairs_think(planks, debris, clip); +} +stairs_think(planks, debris, clip) +{ + while( 1 ) + { + self waittill( "trigger", who ); + if( !who UseButtonPressed() ) + { + continue; + } + if( who in_revive_trigger() ) + { + continue; + } + if( is_player_valid( who ) ) + { + if( who.score >= self.zombie_cost ) + { + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); + bbPrint( "zombie_uses: playername %s playerscore %d round %d cost %d name %s x %f y %f z %f type debris", who.playername, who.score, level.round_number, self.zombie_cost, self.target, self.origin ); + if( IsDefined( self.script_flag ) ) + { + flag_set( self.script_flag ); + } + play_sound_at_pos( "purchase", self.origin ); + level notify ("junk purchased"); + level.stairs_pieces = 0; + self set_hint_string( self, "" ); + if( IsDefined( debris.script_linkTo ) ) + { + debris_struct = getstruct( debris.script_linkTo, "script_linkname" ); + if( IsDefined( debris_struct )) + { + debris thread special_debris_move(debris_struct); + } + } + if(IsDefined(clip)) + { + clip moveto(clip.origin + (0, 0, -1000), 0.1); + wait(0.1); + clip connectpaths(); + clip delete(); + } + self delete(); + } + else + { + play_sound_at_pos( "no_purchase", self.origin ); + } + } + } +} +stairs_move( struct, planks, trigger ) +{ + self script_delay(); + self notsolid(); + selfpos = self.origin; + selfang = self.angles; + self moveto(struct.origin, 0.1); + wait(randomfloatrange(1.0, 10.0)); + self show(); + self play_sound_on_ent( "debris_move" ); + playsoundatposition ("lightning_l", self.origin); + if( IsDefined( self.script_firefx ) ) + { + PlayFX( level._effect[self.script_firefx], self.origin ); + } + if( IsDefined( self.script_noteworthy ) ) + { + if( self.script_noteworthy == "jiggle" ) + { + num = RandomIntRange( 3, 5 ); + og_angles = self.angles; + for( i = 0; i < num; i++ ) + { + angles = og_angles + ( -5 + RandomFloat( 10 ), -5 + RandomFloat( 10 ), -5 + RandomFloat( 10 ) ); + time = RandomFloatRange( 0.1, 0.4 ); + self Rotateto( angles, time ); + wait( time - 0.05 ); + } + } + } + time = 0.5; + if( IsDefined( self.script_transition_time ) ) + { + time = self.script_transition_time; + } + self MoveTo( selfpos, time, time * 0.5 ); + self RotateTo( selfang, time * 0.75 ); + self waittill( "movedone" ); + level.stairs_pieces++; + if(level.stairs_pieces >= planks.size) + { + trigger notify("stairs_complete"); + } + if( IsDefined( self.script_fxid ) ) + { + PlayFX( level._effect[self.script_fxid], self.origin ); + playsoundatposition("zombie_spawn", self.origin); + } +} +special_debris_move( struct ) +{ + self script_delay(); + self notsolid(); + self play_sound_on_ent( "debris_move" ); + playsoundatposition ("lightning_l", self.origin); + if( IsDefined( self.script_firefx ) ) + { + PlayFX( level._effect[self.script_firefx], self.origin ); + } + num = RandomIntRange( 3, 5 ); + og_angles = self.angles; + for( i = 0; i < num; i++ ) + { + angles = og_angles + ( -5 + RandomFloat( 10 ), -5 + RandomFloat( 10 ), -5 + RandomFloat( 10 ) ); + time = RandomFloatRange( 0.1, 0.4 ); + self Rotateto( angles, time ); + wait( time - 0.05 ); + } + time = 0.5; + self MoveTo( struct.origin, time, time * 0.5 ); + self RotateTo( struct.angles, time * 0.75 ); + self waittill( "movedone" ); + if( IsDefined( self.script_fxid ) ) + { + PlayFX( level._effect[self.script_fxid], self.origin ); + playsoundatposition("zombie_spawn", self.origin); + } + self Delete(); +} +coast_precache_custom_models() +{ + mptype\player_t5_zm_coast::precache(); +} +coast_custom_third_person_override( entity_num ) +{ + if( IsDefined( self.zm_random_char ) ) + { + entity_num = self.zm_random_char; + } + switch( entity_num ) + { + case 0: + character\c_zom_sarah_michelle_gellar_player::main(); + break; + case 1: + character\c_zom_robert_englund_player::main(); + break; + case 2: + character\c_zom_danny_trejo_player::main(); + break; + case 3: + character\c_zom_michael_rooker_player::main(); + break; + } +} +coast_custom_viewmodel_override( entity_num ) +{ + switch( self.entity_num ) + { + case 0: + self SetViewModel( "viewmodel_zom_gellar_arms" ); + break; + case 1: + self SetViewModel( "viewmodel_zom_englund_arms" ); + break; + case 2: + self SetViewModel( "viewmodel_zom_trejo_arms" ); + break; + case 3: + self SetViewModel( "viewmodel_zom_rooker_arms" ); + break; + } +} +setup_water_physics() +{ + flag_wait( "all_players_connected" ); + players = GetPlayers(); + for (i = 0; i < players.size; i++) + { + players[i] SetClientDvars("phys_buoyancy",1); + } +} +setup_zcoast_water() +{ + SetDvar( "r_waterWaveAngle", "0 45 90 180" ); + SetDvar( "r_waterWaveWavelength", "350 150 450 650" ); + SetDvar( "r_waterWaveAmplitude", "6 4 8 2" ); + SetDvar( "r_waterWavePhase", "0 0 0 0" ); + SetDvar( "r_waterWaveSteepness", "0.25 0.25 0.25 0.25" ); + SetDvar( "r_waterWaveSpeed", "1 0.5 1 0.5" ); +} +coast_fade_in_notify() +{ + level waittill( "fade_in_complete" ); + wait_network_frame(); + level ClientNotify( "ZID" ); +} +coast_power_on_lighthouse_react() +{ + flag_wait( "power_on" ); + exploder( 301 ); +} +rock_wall_barricade() +{ + rock_wall = getstruct("special_rock_wall", "script_noteworthy"); + boards = GetEntArray(rock_wall.target, "targetname"); + rock = undefined; + for (i = 0; i < boards.size; i++) + { + if(IsDefined(boards[i].target)) + { + rock = GetEnt(boards[i].target, "targetname"); + if(IsDefined(rock)) + { + rock LinkTo(boards[i]); + } + } + } +} +coast_revive_solo_fx() +{ + vending_triggers = getentarray( "zombie_vending", "targetname" ); + for ( i = 0; i < vending_triggers.size; i++ ) + { + if ( vending_triggers[i].script_noteworthy == "specialty_quickrevive" ) + { + vending_triggers[i] delete(); + break; + } + } +} +func_humangun_check() +{ + self notify("stop_melee_watch"); + if ( is_true( self.electrified ) ) + { + maps\_zombiemode_ai_director::zombie_clear_electric_buff(); + } +} +check_for_alternate_poi() +{ + if(!is_true(self.following_human_zombie) && !is_true(self.following_player_zipline)) + { + return false; + } + return true; +} +#using_animtree("fxanim_props_dlc3"); +init_fx_anims() +{ + level.fxanims = []; + level.fxanims["hook_anim"] = %fxanim_zom_ship_crane01_hook_anim; + level.fxanims["boat_anim"] = %fxanim_zom_ship_lifeboat_anim; +} +zombie_coast_poi_positioning_func(origin, forward) +{ + return maps\_zombiemode_server_throttle::server_safe_ground_trace_ignore_water( "poi_trace", 10, self.origin + forward + ( 0, 0, 10 ) ); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_coast_achievement.gsc b/BO1/PC/ZM/maps/zombie_coast_achievement.gsc new file mode 100644 index 0000000..6a8d5fb Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_coast_achievement.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_coast_ai_director.gsc b/BO1/PC/ZM/maps/zombie_coast_ai_director.gsc new file mode 100644 index 0000000..b3c3dd6 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_coast_ai_director.gsc @@ -0,0 +1,535 @@ + +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#using_animtree( "generic_human" ); +init() +{ + PreCacheRumble( "damage_heavy" ); + level.max_director_zombies = 0; + level.director_zombie_min_health = 7500; + level.director_zombie_spawn_heuristic = ::coast_spawn_heuristic; + level.director_init_done = ::coast_director_init; + level.director_zombie_enter_level = ::coast_director_enter_level; + level.director_reenter_level = ::coast_director_reenter_level; + level.director_exit_level = ::coast_director_exit_level; + level.director_find_exit = ::coast_director_find_exit; + level.scr_anim[ "director_zombie" ][ "slide" ] = %ai_zombie_boss_caveslide_traverse_coast; + level.scr_anim[ "director_zombie" ][ "zipline_traverse_lighthouse" ] = %ai_zombie_boss_zipline_traverse_lighthouse; + level.scr_anim[ "director_zombie" ][ "zipline_traverse_ship" ] = %ai_zombie_boss_zipline_traverse_ship; + level._effect[ "director_water_burst" ] = loadfx( "maps/zombie/fx_zmb_coast_director_water_burst" ); + level._effect[ "director_water_burst_sm" ] = loadfx( "maps/zombie/fx_zmb_coast_director_water_burst_sm" ); + level._effect[ "director_water_trail" ] = loadfx( "maps/zombie/fx_zmb_coast_director_water_trail" ); + level._effect[ "director_glow_docile" ] = loadfx( "maps/zombie/fx_zmb_director_glow_docile" ); + level thread coast_director_fx(); +} +FIX_bad_dog_location() +{ + locations = getstructarray( "shipback_near_zone_spawners_dog" ); + bad_org = ( -1800.2, -1613, 344.1 ); + new_org = ( -1792.2, -1581, 344.1 ); + for ( i = 0; i < locations.size; i++ ) + { + if ( locations[i].origin == bad_org ) + { + locations[i].origin = new_org; + return; + } + } +} +coast_director_fx() +{ + level waittill( "fade_introblack" ); + level thread FIX_bad_dog_location(); + exploder( 900 ); +} +coast_spawn_heuristic( spawner ) +{ + if( isDefined( spawner.last_spawn_time ) && (GetTime() - spawner.last_spawn_time < 30000) ) + { + return -1; + } + if( !isDefined( spawner.script_noteworthy ) ) + { + return -1; + } + if( !isDefined( level.zones ) || !isDefined( level.zones[ spawner.script_noteworthy ] ) || !level.zones[ spawner.script_noteworthy ].is_enabled ) + { + return -1; + } + score = 0; + players = get_players(); + score = int( distanceSquared( spawner.origin, players[0].origin ) ); + for( i = 1; i < players.size; i++ ) + { + player_score = int( distanceSquared( spawner.origin, players[i].origin ) ); + if ( player_score < score ) + { + score = player_score; + } + } + return score; +} +coast_director_start() +{ + level waittill("fade_in_complete"); + wait( 6.0 ); + level.max_director_zombies = 1; +} +coast_director_init() +{ + self endon( "death" ); + if( IsDefined( level._audio_director_vox ) ) + { + self [[ level._audio_director_vox ]](); + } + self.in_water = true; + self.zombie_entered_water = ::coast_director_entered_water; + self.zombie_exited_water = ::coast_director_exited_water; + self thread maps\zombie_coast_water::zombie_water_out(); + self.zombie_sliding = ::coast_director_sliding; + self.choose_run = ::coast_director_choose_run; + self.find_exit_point = ::coast_director_find_exit_point; + self thread coast_director_failsafe(); +} +coast_director_entered_water( trigger ) +{ + self endon( "death" ); + self.water_trigger = trigger; + if ( is_true( self.is_sliding ) ) + { + self.is_sliding = undefined; + } + self notify( "disable_activation" ); + self thread maps\_zombiemode_ai_director::director_calmed(); + self thread check_for_close_players(); +} +coast_director_exited_water() +{ + self endon( "death" ); + if ( !is_true( self.defeated ) ) + { + self thread maps\_zombiemode_ai_director::director_zombie_check_for_activation(); + } + else + { + if ( !isDefined( self.water_trigger.target ) ) + { + self.is_activated = true; + } + } + self.water_trigger = undefined; +} +coast_director_enter_level() +{ + self endon( "death" ); + self coast_director_water_rise( self.angles, self.origin ); +} +coast_director_water_rise_fx( angles, fx_pos, anim_time ) +{ + self endon( "death" ); + ENTER_DIST = 295; + offset = fx_pos[2]; + if ( isDefined( self.water_trigger ) ) + { + point = getstruct( self.water_trigger.target, "targetname" ); + offset = point.origin[2]; + } + org = ( fx_pos[0], fx_pos[1], offset ); + level thread coast_director_water_on_screen(); + Playfx( level._effect["director_water_burst"], org ); + trail = Spawn( "script_model", org ); + trail.angles = angles; + trail SetModel( "tag_origin" ); + playfxontag( level._effect["director_water_trail"], trail, "tag_origin" ); + forward = VectorNormalize( AnglesToForward( angles ) ); + end = org + vector_scale( forward, ENTER_DIST ); + trail moveto( end, anim_time ); + trail waittill( "movedone" ); + trail delete(); +} +coast_director_water_on_screen() +{ + wait( 0.5 ); + players = GetPlayers(); + for( i = 0; i < players.size; i++ ) + { + if( is_true( players[i]._in_coast_water ) ) + { + players[i] SetWaterSheeting( 1, 7.0 ); + } + else + { + players[i] thread coast_director_water_drops_on_screen(); + } + wait_network_frame(); + } +} +coast_director_water_drops_on_screen() +{ + self endon( "disconnect" ); + self SetWaterDrops( 50 ); + wait( 10.0 ); + self SetWaterDrops( 0 ); +} +coast_director_water_rise( angles, origin ) +{ + self endon( "death" ); + ENTER_HEIGHT = 82; + ENTER_DIST = 295; + emerge_anim = %ai_zombie_boss_emerge_from_water; + time = getAnimLength( emerge_anim ); + forward = VectorNormalize( AnglesToForward( angles ) ); + fx_pos = origin - vector_scale( forward, ENTER_DIST ); + offset = fx_pos[2]; + if ( isDefined( self.water_trigger ) ) + { + point = getstruct( self.water_trigger.target, "targetname" ); + offset = point.origin[2]; + } + org = ( fx_pos[0], fx_pos[1], offset ); + Playfx( level._effect["director_glow_docile"], org ); + wait( 1 ); + playsoundatposition( "zmb_director_bubble_effect", fx_pos ); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] PlayRumbleOnEntity( "explosion_generic" ); + } + water_pos = origin - ( 0, 0, ENTER_HEIGHT ); + water_pos -= vector_scale( forward, ENTER_DIST ); + so = spawn( "script_origin", self.origin ); + so.angles = self.angles; + self linkto( so ); + so.origin = water_pos; + so rotateto( angles, 0.1 ); + so waittill( "rotatedone" ); + self unlink(); + so delete(); + self thread coast_director_water_rise_fx( self.angles, fx_pos, time ); + self Show(); + self thread coast_director_delay_weapon(); + self SetPlayerCollision( 1 ); + self PlaySound("zmb_director_exit_water" ); + level notify( "director_emerging_audio" ); + self animscripted( "emerge_anim", self.origin, self.angles, emerge_anim, "normal", %body, 1, 0.1 ); + wait( time ); + self.goalradius = 90; + self.on_break = undefined; +} +coast_director_delay_weapon() +{ + self endon( "death" ); + if ( is_true( self.has_weapon ) ) + { + self maps\_zombiemode_ai_director::director_flip_light_flag(); + return; + } + wait( 0.25 ); + self maps\_zombiemode_ai_director::director_add_weapon(); + self.has_weapon = true; +} +coast_director_get_reentry_point() +{ + location = []; + for ( i = 0; i < level.water.size; i++ ) + { + if ( isDefined( level.water[i].target ) ) + { + point = getstruct( level.water[i].target, "targetname" ); + zone_enabled = check_point_in_active_zone( point.origin ); + if ( zone_enabled ) + { + location = array_add( location, point ); + } + } + } + location = array_randomize( location ); + return location[0]; +} +coast_director_reenter_level() +{ + self endon( "death" ); + point = coast_director_get_reentry_point(); + angles = point.angles + ( 0, 180, 0 ); + self coast_director_water_rise( angles, point.origin ); +} +coast_director_exit_level( exit, calm ) +{ + self endon( "death" ); + self endon( "stop_exit" ); + ENTER_HEIGHT = 82; + self.exit = exit; + self.calm = calm; + self.on_break = true; + if ( is_true( calm ) ) + { + self.is_activated = false; + self notify( "director_calmed" ); + } + else + { + self.is_activated = true; + } + self.goalradius = 32; + self SetGoalPos( exit.origin ); + self waittill( "goal" ); + self OrientMode( "face angle", exit.angles[1] ); + time = 0; + while ( 1 ) + { + diff = abs( self.exit.angles[1] - self.angles[1] ); + if ( diff < 5 ) + { + maps\_zombiemode_ai_director::director_print( "facing exit" ); + break; + } + time += 0.1; + if ( time >= 1 ) + { + maps\_zombiemode_ai_director::director_print( "facing timeout" ); + break; + } + wait( 0.1 ); + } + return_anim = %ai_zombie_boss_return_to_water; + time = getAnimLength( return_anim ); + playsoundatposition( "zmb_director_bubble_effect", exit.origin ); + self thread coast_director_exit_fx( time ); + self PlaySound("zmb_director_enter_water" ); + self animscripted( "return_anim", self.origin, self.angles, return_anim, "normal", %body, 1, 0.1 ); + wait( time ); + self OrientMode( "face default" ); + self SetPlayerCollision( 0 ); + self clearclientflag( level._ZOMBIE_ACTOR_FLAG_DIRECTOR_DEATH ); + players = getplayers(); + rand = RandomIntRange(0,players.size); + players[rand] thread maps\_zombiemode_audio::create_and_play_dialog( "director", "exit" ); + so = spawn( "script_origin", self.origin ); + so.angles = self.angles; + self linkto( so ); + so.origin = self.origin - ( 0, 0, 120 ); + wait_network_frame(); + self unlink(); + so delete(); + self.is_activated = false; + self hide(); + self SetGoalPos( self.origin ); + self.exit = undefined; + self.calm = undefined; +} +coast_director_exit_fx( anim_time ) +{ + self endon( "death" ); + EXIT_DIST = 295; + PlayRumbleOnPosition( "explosion_generic", self.origin ); + Playfx( level._effect["rise_burst_water"], self.origin ); + trail = Spawn( "script_model", self.origin ); + trail.angles = self.angles; + trail SetModel( "tag_origin" ); + playfxontag( level._effect["director_water_trail"], trail, "tag_origin" ); + forward = VectorNormalize( AnglesToForward( self.angles ) ); + end = self.origin + vector_scale( forward, EXIT_DIST ); + trail moveto( end, anim_time ); + trail waittill( "movedone" ); + trail delete(); +} +coast_director_find_exit() +{ + location = undefined; + dist = 1000000; + for ( i = 0; i < level.water.size; i++ ) + { + if ( isDefined( level.water[i].target ) ) + { + point = getstruct( level.water[i].target, "targetname" ); + zone_enabled = check_point_in_active_zone( point.origin ); + if ( zone_enabled ) + { + exit_dist = Distance( self.origin, point.origin ); + if ( exit_dist < dist ) + { + dist = exit_dist; + location = point; + } + } + } + } + return location; +} +coast_director_sliding( slide_node ) +{ + self endon( "death" ); + if ( is_true( self.is_sliding ) ) + { + return; + } + if ( isDefined( self.exit ) ) + { + self notify( "stop_exit" ); + } + self.is_sliding = true; + self.is_traversing = true; + self notify("zombie_start_traverse"); + self thread maps\zombie_coast_cave_slide::play_zombie_slide_looper(); + self notify( "disable_activation" ); + self notify( "disable_buff" ); + self notify( "director_run_change" ); + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self.ignoreall = true; + self.goalradius = 32; + self SetGoalPos( slide_node.origin ); + while(Distance(self.origin, slide_node.origin) > self.goalradius) + { + wait(0.01); + } + self.goalradius = 90; + maps\_zombiemode_ai_director::director_zombie_update_next_groundhit(); + self.is_sliding = undefined; + self.is_traversing = false; + self notify("zombie_end_traverse"); + self thread coast_director_delay_transition( 3 ); + if ( isDefined( self.exit ) ) + { + self thread coast_director_exit_level( self.exit, self.calm ); + } + else + { + self.following_player = false; + } +} +coast_director_delay_transition( time ) +{ + self.ignore_transition = true; + wait( time ); + self.ignore_transition = undefined; +} +coast_director_choose_run() +{ + if ( is_true( self.is_sliding ) ) + { + self set_run_anim( "slide" ); + self.run_combatanim = level.scr_anim["director_zombie"]["slide"]; + self.crouchRunAnim = level.scr_anim["director_zombie"]["slide"]; + self.crouchrun_combatanim = level.scr_anim["director_zombie"]["slide"]; + self.needs_run_update = true; + return true; + } + return false; +} +check_for_close_players() +{ + players = GetPlayers(); + for(i=0;i= 10 ) + { + so = spawn( "script_origin", self.origin ); + so.angles = self.angles; + self linkto( so ); + point = coast_director_get_reentry_point(); + so.origin = point.origin; + wait_network_frame(); + self unlink(); + so delete(); + self.failsafe = 0; + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] playlocalsound( "zmb_laugh_child" ); + } + } + } +} + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_coast_amb.gsc b/BO1/PC/ZM/maps/zombie_coast_amb.gsc new file mode 100644 index 0000000..f65daac --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_coast_amb.gsc @@ -0,0 +1,565 @@ +#include common_scripts\utility; +#include maps\_utility; +main() +{ + level._audio_custom_weapon_check = ::weapon_type_check_custom; + level._audio_custom_response_line = ::setup_response_line_custom; + level._audio_director_vox = ::director_vox_init; + level._audio_director_vox_play = ::do_director_playvox; + level.AUDIO_last_d = undefined; + level.AUDIO_current_character = undefined; + level.door_trig = GetEnt( "trig_start_voices", "targetname" ); + level.skit_vox_override = false; + level thread power_clangs(); + level thread radio_easter_eggs(); + level thread setup_music_egg(); +} +power_clangs() +{ + wait(5); + flag_wait( "power_on" ); + clangs = getstructarray("amb_power_clang", "targetname"); + if( !IsDefined( clangs ) ) + return; + for (i=0; i < clangs.size; i++) + { + playsoundatposition ("zmb_circuit", clangs[i].origin); + wait ( RandomFloatrange( 0.25, 0.7 )); + } +} +weapon_type_check_custom(weapon) +{ + if( !IsDefined( self.entity_num ) ) + return "crappy"; + switch(self.entity_num) + { + case 0: + if( weapon == "spectre_zm" ) + return "favorite"; + else if( weapon == "spectre_upgraded_zm" ) + return "favorite_upgrade"; + break; + case 1: + if( weapon == "rpk_zm" ) + return "favorite"; + else if( weapon == "rpk_upgraded_zm" ) + return "favorite_upgrade"; + break; + case 2: + if( weapon == "ak74u_zm" ) + return "favorite"; + else if( weapon == "ak74u_upgraded_zm" ) + return "favorite_upgrade"; + break; + case 3: + if( weapon == "ithaca_zm" ) + return "favorite"; + else if( weapon == "ithaca_upgraded_zm" ) + return "favorite_upgrade"; + break; + } + if( IsSubStr( weapon, "upgraded" ) ) + return "upgrade"; + else + return level.zombie_weapons[weapon].vox; +} +setup_response_line_custom( player, index, category, type ) +{ + Sarah = 0; + Englund = 1; + Rooker = 3; + Trejo = 2; + switch( player.entity_num ) + { + case 0: + level maps\_zombiemode_audio::setup_hero_rival( player, Trejo, Rooker, category, type ); + break; + case 1: + level maps\_zombiemode_audio::setup_hero_rival( player, Rooker, Trejo, category, type ); + break; + case 2: + level maps\_zombiemode_audio::setup_hero_rival( player, Sarah, Englund, category, type ); + break; + case 3: + level maps\_zombiemode_audio::setup_hero_rival( player, Englund, Sarah, category, type ); + break; + } + return; +} +director_vox_init() +{ + self thread director_intro_vox(); +} +director_vox_futz() +{ + self endon( "death" ); + level endon( "director_submerging_audio" ); + while( !is_true( self.defeated ) ) + { + level clientNotify( "dclm" ); + self waittill( "director_activated" ); + level clientNotify( "dmad" ); + self waittill( "director_calmed" ); + } +} +director_intro_vox() +{ + self endon( "death" ); + level endon( "end_game" ); + while(1) + { + level waittill( "audio_begin_director_vox" ); + wait(RandomFloatRange(1,3) ); + self create_and_play_director_vox( "start", 0 ); + wait(2); + self create_and_play_director_vox( "start", 1 ); + wait(2); + self create_and_play_director_vox( "start", 2 ); + self thread director_ambient_vox(); + self thread wait_for_anger(); + self thread wait_for_calm(); + self thread init_director_behind_vox(); + self thread wait_for_submerge(); + } +} +wait_for_submerge() +{ + self endon( "death" ); + level waittill( "director_submerging_audio" ); + wait(9); + self create_and_play_director_vox( "lucid" ); +} +wait_for_anger() +{ + self endon( "death" ); + level endon( "director_submerging_audio" ); + level endon( "end_game" ); + while( !is_true( self.defeated ) ) + { + self waittill( "director_activated" ); + self thread director_angry_vox(); + } +} +wait_for_calm() +{ + self endon( "death" ); + level endon( "director_submerging_audio" ); + level endon( "end_game" ); + while( !is_true( self.defeated ) ) + { + self waittill( "director_calmed" ); + if( IsDefined( self.damageweapon ) && ( self.damageweapon == "humangun_upgraded_zm" || self.damageweapon == "humangun_zm" ) ) + { + self create_and_play_director_vox( "human" ); + } + else + { + self create_and_play_director_vox( "water" ); + } + self thread director_ambient_vox(); + } +} +director_ambient_vox() +{ + self notify( "director_ambient_vox" ); + self endon( "death" ); + self endon( "director_activated" ); + self endon( "director_ambient_vox" ); + level endon( "director_submerging_audio" ); + level endon( "end_game" ); + while( !is_true( self.defeated ) ) + { + wait( RandomIntRange( 25, 70 ) ); + players = getplayers(); + for(i=0;i 95) && abs( z_diff ) < 50 ) + { + if( IsDefined( level._audio_director_vox_play ) ) + { + if( director.is_activated ) + director thread [[ level._audio_director_vox_play ]]( "vox_director_slam" ); + else + director thread [[ level._audio_director_vox_play ]]( "vox_director_behind_you" ); + } + } + } + } +} +create_and_play_director_vox( type, force_variant ) +{ + waittime = .25; + alias = "vox_romero_" + type; + if( !IsDefined ( self.sound_dialog ) ) + { + self.sound_dialog = []; + self.sound_dialog_available = []; + } + if ( !IsDefined ( self.sound_dialog[ alias ] ) ) + { + num_variants = maps\_zombiemode_spawner::get_number_variants( alias ); + if( num_variants <= 0 ) + { + return; + } + for( i = 0; i < num_variants; i++ ) + { + self.sound_dialog[ alias ][ i ] = i; + } + self.sound_dialog_available[ alias ] = []; + } + if ( self.sound_dialog_available[ alias ].size <= 0 ) + { + self.sound_dialog_available[ alias ] = self.sound_dialog[ alias ]; + } + variation = random( self.sound_dialog_available[ alias ] ); + self.sound_dialog_available[ alias ] = array_remove( self.sound_dialog_available[ alias ], variation ); + if( IsDefined( force_variant ) ) + { + variation = force_variant; + } + sound_to_play = alias + "_" + variation; + self thread do_director_playvox( sound_to_play, waittime ); +} +do_director_playvox( sound_to_play, waittime, override ) +{ + if( !IsDefined( level.director_is_speaking ) ) + { + level.director_is_speaking = 0; + } + if( !IsDefined( waittime ) ) + { + waittime = .25; + } + if( level.director_is_speaking != 1 || is_true( override ) ) + { + level.director_is_speaking = 1; + self playsound( sound_to_play, "sound_done" + sound_to_play ); + self waittill( "sound_done" + sound_to_play ); + wait( waittime ); + level.director_is_speaking = 0; + } +} +radio_easter_eggs() +{ + wait(3); + teststruct = getstruct( "radio_egg_0", "targetname" ); + if( !IsDefined( teststruct ) ) + { + return; + } + for(i=0;i<5;i++) + { + ent[i] = getstruct( "radio_egg_" + i, "targetname" ); + ent[i] thread activate_radio_egg( i ); + } +} +activate_radio_egg( num ) +{ + radio_trig = Spawn( "trigger_radius", self.origin - (0,0,200), 0, 75, 400 ); + radio_trig.completed = false; + while(1) + { + radio_trig waittill( "trigger", who ); + while( who IsTouching( radio_trig ) ) + { + if( who UseButtonPressed() ) + { + radio_trig.completed = true; + break; + } + wait(.05); + } + if( radio_trig.completed == true ) + break; + } + radio_trig Delete(); + playsoundatposition( "vox_radio_egg_" + num, self.origin ); +} +setup_music_egg() +{ + wait(3); + level.meteor_counter = 0; + level.music_override = false; + array_thread( getstructarray( "mus_easteregg", "targetname" ), ::music_egg ); +} +music_egg() +{ + if( !isdefined( self ) ) + { + return; + } + temp_ent = Spawn( "script_origin", self.origin ); + temp_ent PlayLoopSound( "zmb_meteor_loop" ); + player = self music_egg_wait(); + temp_ent StopLoopSound( 1 ); + player PlaySound( "zmb_meteor_activate" ); + player maps\_zombiemode_audio::create_and_play_dialog( "eggs", "meteors", undefined, level.meteor_counter ); + level.meteor_counter = level.meteor_counter + 1; + if( level.meteor_counter == 3 ) + { + level thread play_music_egg( player ); + } + wait(1.5); + temp_ent Delete(); +} +music_egg_wait() +{ + music_egg_trig = Spawn( "trigger_radius", self.origin - (0,0,200), 0, 50, 400 ); + music_egg_trig.completed = false; + while(1) + { + music_egg_trig waittill( "trigger", who ); + while( who IsTouching( music_egg_trig ) ) + { + if( who UseButtonPressed() ) + { + music_egg_trig.completed = true; + break; + } + wait(.05); + } + if( music_egg_trig.completed == true ) + break; + } + music_egg_trig Delete(); + return who; +} +play_music_egg( player ) +{ + level.music_override = true; + level thread maps\_zombiemode_audio::change_zombie_music( "egg" ); + wait(4); + if( IsDefined( player ) ) + { + player maps\_zombiemode_audio::create_and_play_dialog( "eggs", "music_activate" ); + } + wait(420); + level.music_override = false; + if( level.music_round_override == false ) + level thread maps\_zombiemode_audio::change_zombie_music( "wave_loop" ); +} +skit_start_reminder( ent ) +{ + while( !flag( "fuse_fun_start" ) ) + { + rand = RandomIntRange( 0, 3 ); + ent PlaySound( "vox_chr_" + rand + "_egg_response_0" ); + wait(RandomIntRange( 10, 35 )); + } +} +play_characters_skits_etc( player, ent, a, b, c, d ) +{ + if( !IsDefined( level.door_knock_vox_occurring ) ) + { + level.door_knock_vox_occurring = false; + } + if( is_true( level.door_knock_vox_occurring ) ) + { + while( level.door_knock_vox_occurring ) + { + wait(.5); + } + } + if( !level.door_knock_vox_occurring ) + { + level.door_knock_vox_occurring = true; + level.skit_vox_override = true; + if( IsDefined( a ) && IsDefined( player ) ) + { + if( IsDefined( level.door_trig ) && player IsTouching( level.door_trig ) ) + { + player play_sound_on_ent_and_wait( "coast_response", a, true, "sound_done" + "egg_response_" + a ); + } + } + if( IsDefined( b ) && IsDefined( player ) ) + { + if( IsDefined( level.door_trig ) && player IsTouching( level.door_trig ) ) + { + ent PlaySound( "vox_egg_skit_" + b, "sounddone_skit" ); + ent waittill( "sounddone_skit" ); + } + } + if( IsDefined( c ) && IsDefined( player ) ) + { + if( IsDefined( level.door_trig ) && player IsTouching( level.door_trig ) ) + { + player play_sound_on_ent_and_wait( "coast_response", c, true, "sound_done" + "egg_response_" + c ); + } + } + level.skit_vox_override = false; + if( IsDefined( d ) ) + { + char = get_character( d ); + if( !IsDefined( char ) ) + { + level.door_knock_vox_occurring = false; + return; + } + ent PlaySound( "vox_chr_" + char + "_egg_response_" + d, "sounddone_oneliner" ); + ent waittill( "sounddone_oneliner" ); + } + level.door_knock_vox_occurring = false; + } +} +play_sound_on_ent_and_wait( str_soundalias, str_force_variant, bool_override, str_waittill ) +{ + self create_and_play_dialog_egg( "eggs", "coast_response", undefined, str_force_variant, bool_override ); +} +create_and_play_dialog_egg( category, type, response, force_variant, override ) +{ + waittime = .25; + if( !IsDefined( level.plr_vox[category][type] ) ) + { + return; + } + if( self maps\_laststand::player_is_in_laststand() && ( type != "revive_down" || type != "revive_up" ) ) + { + return; + } + alias_suffix = level.plr_vox[category][type]; + if( IsDefined( response ) ) + alias_suffix = response + alias_suffix; + index = maps\_zombiemode_weapons::get_player_index(self); + prefix = level.plr_vox["prefix"] + index + "_"; + if( !IsDefined ( self.sound_dialog ) ) + { + self.sound_dialog = []; + self.sound_dialog_available = []; + } + if ( !IsDefined ( self.sound_dialog[ alias_suffix ] ) ) + { + num_variants = maps\_zombiemode_spawner::get_number_variants( prefix + alias_suffix ); + if( num_variants <= 0 ) + { + return; + } + for( i = 0; i < num_variants; i++ ) + { + self.sound_dialog[ alias_suffix ][ i ] = i; + } + self.sound_dialog_available[ alias_suffix ] = []; + } + if ( self.sound_dialog_available[ alias_suffix ].size <= 0 ) + { + self.sound_dialog_available[ alias_suffix ] = self.sound_dialog[ alias_suffix ]; + } + variation = random( self.sound_dialog_available[ alias_suffix ] ); + self.sound_dialog_available[ alias_suffix ] = array_remove( self.sound_dialog_available[ alias_suffix ], variation ); + if( IsDefined( force_variant ) ) + { + variation = force_variant; + } + if( !IsDefined( override ) ) + { + override = false; + } + sound_to_play = alias_suffix + "_" + variation; + self do_player_playvox_egg( prefix, index, sound_to_play, waittime, category, type, override ); +} +do_player_playvox_egg( prefix, index, sound_to_play, waittime, category, type, override ) +{ + players = getplayers(); + if( !IsDefined( level.player_is_speaking ) ) + { + level.player_is_speaking = 0; + } + if( is_true(level.skit_vox_override) && !override ) + return; + if( level.player_is_speaking != 1 ) + { + level.player_is_speaking = 1; + self playsound( prefix + sound_to_play, "sound_done" + sound_to_play ); + self waittill( "sound_done" + sound_to_play ); + wait( waittime ); + level.player_is_speaking = 0; + } +} +get_character( current_d ) +{ + if( !IsDefined( level.AUDIO_last_d ) ) + { + level.AUDIO_last_d = 80; + } + if( !IsDefined( level.AUDIO_current_character ) ) + { + level.AUDIO_current_character = 0; + } + if( current_d != level.AUDIO_last_d ) + { + level.AUDIO_last_d = current_d; + level.AUDIO_current_character = 0; + return level.AUDIO_current_character; + } + else + { + level.AUDIO_current_character++; + if( level.AUDIO_current_character >= 3 ) + { + return undefined; + } + return level.AUDIO_current_character; + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_coast_distance_tracking.gsc b/BO1/PC/ZM/maps/zombie_coast_distance_tracking.gsc new file mode 100644 index 0000000..05cf6b5 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_coast_distance_tracking.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_coast_eggs.gsc b/BO1/PC/ZM/maps/zombie_coast_eggs.gsc new file mode 100644 index 0000000..729047e --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_coast_eggs.gsc @@ -0,0 +1,1558 @@ +#include animscripts\zombie_utility; +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\_ambientpackage; +#include maps\_music; +#include maps\_busing; +#include maps\_zombiemode_audio; +init() +{ + level c_flags(); + level c_anims(); + level mic_test(); + level thread c_overseer(); +} +c_flags() +{ + flag_init( "ffs" ); + flag_init( "ffd" ); + flag_init( "hgs" ); + flag_init( "hg0" ); + flag_init( "hg1" ); + flag_init( "hg2" ); + flag_init( "hg3" ); + flag_init( "hgd" ); + flag_init( "bs" ); + flag_init( "bd" ); + flag_init( "ke" ); + flag_init( "aca" ); + flag_init( "shs" ); + flag_init( "sr" ); + flag_init( "bp" ); + flag_init( "mcs" ); + flag_init( "hn" ); + flag_init( "mm" ); + flag_init( "ss" ); + flag_init( "re" ); + flag_init( "sa" ); + flag_init( "s_s" ); + flag_init( "sdm" ); + flag_init( "dmf" ); +} +#using_animtree ( "generic_human" ); +c_anims() +{ + level.scr_anim[ "dancer" ][ "breakdown" ] = %ai_zombie_flinger_flail; + level.scr_anim[ "dancer" ][ "spin" ] = %ai_zombie_dying_back_idle; +} +beat_break( str_anim ) +{ + self endon( "death" ); + self endon( "switch" ); + self.ignoreall = true; + self.ignoreme = true; + while( IsDefined( self ) && IsAlive( self ) ) + { + dance_anim = str_anim; + self SetFlaggedAnimKnobAllRestart( "dance_anim", dance_anim, %body, 1, .1, 1 ); + animscripts\traverse\zombie_shared::wait_anim_length( dance_anim, .02 ); + } +} +mic_test() +{ + PreCacheModel( "p_zom_vril_device" ); + PreCacheModel( "p_zom_vodka_bottle" ); + PreCacheModel( "p_zom_fuse" ); + PreCacheModel( "p_zom_ice_chunk_03" ); + PreCacheModel( "p_zom_minisub" ); + PreCacheShader( "zom_hud_icon_fuse" ); + PreCacheShader( "zom_hud_icon_bottle" ); + PreCacheShader( "zom_hud_icon_vril" ); +} +summon_the_shamans() +{ + level.beginning = getstruct( "cheaters_never_prosper", "targetname" ); + rough_note = StrTok( level.beginning.script_parameters, " " ); + balance = StrTok( level.beginning.script_noteworthy, " " ); + level.trials = StrTok( level.beginning.script_waittill, " " ); + level.contact = StrTok( level.beginning.script_string, " " ); + level.mermaid = []; + level.together_again = []; + for( i = 0; i < rough_note.size; i++ ) + { + temp = Int( rough_note[i] ); + level.mermaid = add_to_array( level.mermaid, temp, false ); + } + for( i = 0; i < balance.size; i++ ) + { + temp = Int( balance[i] ); + level.together_again = add_to_array( level.together_again, temp, false ); + } + that_one = GetEnt( "trig_mine", "targetname" ); + that_one SetCursorHint( "HINT_NOICON" ); + that_one SetHintString( "" ); +} +c_overseer() +{ + wait( 0.2 ); + flag_wait( "all_players_connected" ); + players = GetPlayers(); + if( players.size > 1 ) + { + level._e_group = true; + } + else + { + level._e_group = false; + } + level summon_the_shamans(); + level thread knock_on_door(); + level thread engage(); + level thread noisemakers(); + level thread rotary_styles(); + players = GetPlayers(); + level thread cancer(); + level thread aries(); + level thread pisces(); + level thread leo(); + level thread capricorn(); + if( level._e_group ) + { + level thread virgo(); + level thread denlo(); + level thread libra(); + } +} +knock_on_door() +{ + level endon( "scrambled" ); + knock_trig = GetEnt( "e_gargoyle", "targetname" ); + if( !IsDefined( knock_trig ) ) + { + return; + } + flag_wait( "power_on" ); + pneumatic_tube = GetEnt( "trig_deliver", "targetname" ); + pneumatic_tube PlayLoopSound( "zmb_whooooosh_loop", 2 ); + level.egg_sound_ent = GetEnt( "ent_loop_door_sounds", "targetname" ); + knock_trig PlaySound( "zmb_haxorz_suxorz" ); + level gargoyle_speaks( knock_trig ); + while( 1 ) + { + knock_trig waittill( "damage", i_amt, e_inflictor, vec_direction, vec_point, mod_type ); + if( level.door_knock_vox_occurring ) + { + wait( 1.0 ); + continue; + } + if( is_player_valid( e_inflictor ) && mod_type == level.trials[2] ) + { + if( !flag( "ffs" ) ) + { + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, 1, 0, undefined ); + flag_set( "ffs" ); + wait( 1.0 ); + continue; + } + if( flag( "ffs" ) && !flag( "ffd" ) && !IsDefined( e_inflictor._fuse_acquired ) ) + { + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 1 ); + wait( 1.0 ); + continue; + } + else if( flag( "ffs" ) && !flag( "ffd" ) && IsDefined( e_inflictor._fuse_acquired ) && e_inflictor._fuse_acquired == 1 ) + { + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 1 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgs" ) && !flag( "hgd" ) ) + { + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 2 ); + wait( 1.0 ); + continue; + } + if( level._e_group ) + { + if( flag( "ffd" ) && flag( "hgd" ) && !flag( "bs" ) ) + { + flag_set( "bs" ); + level.egg_sound_ent StopLoopSound( 1.5 ); + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, 4, 3, 5, undefined ); + level.egg_sound_ent PlayLoopSound( "zmb_fantastical_worlds_loop", 1.5 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "bs" ) && !flag( "bd" ) && !is_true( e_inflictor._bottle_acquired ) ) + { + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 3 ); + wait( 1.0 ); + continue; + } + else if( flag( "ffd" ) && flag( "hgd" ) && flag( "bs" ) && !flag( "bd" ) && is_true( e_inflictor._bottle_acquired ) ) + { + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 4 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "bd" ) && !flag( "ke" ) ) + { + flag_set( "ke" ); + level.egg_sound_ent StopLoopSound( 1.5 ); + level thread delayed_song_loop(); + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, 8, 4, 9, undefined ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "bd" ) && !flag( "aca" ) ) + { + level.egg_sound_ent StopLoopSound( 1 ); + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 5 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "bd" ) && flag( "aca" ) && !flag( "mcs" ) ) + { + level.egg_sound_ent StopLoopSound( 1.5 ); + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 6 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "bd" ) && flag( "aca" ) + && flag( "mcs" ) && !flag( "mm" ) ) + { + level.egg_sound_ent StopLoopSound( 1.5 ); + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 7 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "bd" ) && flag( "aca" ) + && flag( "mcs" ) && flag( "mm" ) && !flag( "s_s" ) ) + { + level.egg_sound_ent StopLoopSound( 1.5 ); + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 8 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "bd" ) && flag( "aca" ) + && flag( "mcs" ) && flag( "mm" ) && flag( "s_s" ) && !flag( "sdm" ) ) + { + level.egg_sound_ent StopLoopSound( 1.5 ); + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, 13, 5, 14, undefined ); + level.egg_sound_ent PlayLoopSound( "zmb_fantastical_worlds_loop", 1.5 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "bd" ) && flag( "aca" ) + && flag( "mcs" ) && flag( "mm" ) && flag( "s_s" ) && flag( "sdm" ) + && !flag( "dmf" ) ) + { + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 9 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "bd" ) && flag( "aca" ) + && flag( "mcs" ) && flag( "mm" ) && flag( "s_s" ) && flag( "dmf" ) ) + { + level.egg_sound_ent StopLoopSound( 1.5 ); + wait( 1.0 ); + continue; + return; + } + } + else + { + if( flag( "ffd" ) && flag( "hgd" ) && !flag( "aca" ) ) + { + level.egg_sound_ent StopLoopSound( 1.5 ); + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, 4, "3b", 9, undefined ); + flag_set( "aca" ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "aca" ) && !flag( "mcs" ) ) + { + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 3 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "mcs" ) && !flag( "ss" ) ) + { + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 8 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "mcs" ) && flag( "s_s" ) + && flag( "sdm" ) && !flag( "dmf" ) ) + { + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, undefined, undefined, undefined, 9 ); + wait( 1.0 ); + continue; + } + if( flag( "ffd" ) && flag( "hgd" ) && flag( "mcs" ) && flag( "s_s" ) + && flag( "dmf" ) ) + { + wait( 1.0 ); + continue; + return; + } + } + } + } +} +force_wait_for_forcefield_looper() +{ + wait(21.5); + flag_set( "hgs" ); + level.egg_sound_ent PlayLoopSound( "zmb_wizzybizzy_home_loop", 1.5 ); +} +delayed_song_loop() +{ + wait(27); + level.egg_sound_ent PlayLoopSound( "vox_egg_skit_song", 1 ); +} +gargoyle_speaks( knock_trig ) +{ + trig = GetEnt( "trig_start_voices", "targetname" ); + listener = undefined; + if( !IsDefined( trig ) ) + { + return; + } + trig.spoken_word = 0; + speak_limit = 3; + level._end_door_intro = false; + chr = 0; + level thread gargoyle_watch_early_door_hit(); + while( !level._end_door_intro ) + { + trig waittill( "trigger", listener ); + if( is_player_valid( listener ) ) + { + if( chr >= 3 ) + { + chr = 0; + } + knock_trig PlaySound( "vox_chr_" + chr + "_egg_response_0", "sounddone_introvox" ); + knock_trig waittill( "sounddone_introvox" ); + wait( 1.0 ); + trig.spoken_word++; + chr++; + if( trig.spoken_word >= speak_limit ) + { + level notify( "stop_watching_early_knock" ); + while(1) + { + knock_trig waittill( "trigger", knocker ); + if( is_player_valid( knocker ) ) + { + level._end_door_intro = true; + break; + } + wait(.05); + } + } + } + } + level notify( "stop_watching_early_knock" ); + level maps\zombie_coast_amb::play_characters_skits_etc( listener, knock_trig, undefined, 1, 0, undefined ); + flag_set( "ffs" ); +} +gargoyle_watch_early_door_hit() +{ + level endon( "stop_watching_early_knock" ); + knock_trig = GetEnt( "e_gargoyle", "targetname" ); + hit = false; + while( !hit ) + { + knock_trig waittill( "trigger", impatient_player ); + if( is_player_valid( impatient_player ) ) + { + level._end_door_intro = true; + } + } +} +engage() +{ + ship_wheel = GetEnt( "sm_ship_wheel", "targetname" ); + wheel_turn_right = GetEnt( "t_rotate_wheel_right", "targetname" ); + wheel_turn_left = GetEnt( "t_rotate_wheel_left", "targetname" ); + ship_wheel.spot = 0; + wheel_turn_right thread press_the_button( 1 ); + wheel_turn_left thread press_the_button( 0 ); + right_lever_trigger = GetEnt( "trig_eot_right_switch", "targetname" ); + left_lever_trigger = GetEnt( "trig_eot_left_switch", "targetname" ); + right_lever = GetEnt( right_lever_trigger.target, "targetname" ); + right_lever.spot = 0; + left_lever = GetEnt( left_lever_trigger.target, "targetname" ); + left_lever.spot = 0; + right_lever_trigger thread egg_drop_soup(); + left_lever_trigger thread egg_drop_soup(); + level thread eyes_on_the_wall( ship_wheel, right_lever, left_lever ); +} +press_the_button( i_direction ) +{ + level endon( "shs" ); + self UseTriggerRequireLookAt(); + self SetHintString( "" ); + wheel = GetEnt( self.target, "targetname" ); + flag_wait( "power_on" ); + while( !flag( "shs" ) ) + { + self waittill( "trigger" ); + if( i_direction == 0 ) + { + wheel RotateRoll( 60, 0.2, 0, 0 ); + wheel PlaySound( "zmb_galactic_rose" ); + wheel waittill( "rotatedone" ); + wheel.spot = wheel.spot - 1; + if( wheel.spot < 0 ) + { + wheel.spot = 5; + } + } + else + { + wheel RotateRoll( -60, 0.2, 0, 0 ); + wheel PlaySound( "zmb_galactic_rose" ); + wheel waittill( "rotatedone" ); + wheel.spot = wheel.spot + 1; + if( wheel.spot > 5 ) + { + wheel.spot = 0; + } + } + } +} +egg_drop_soup() +{ + level endon( "shs" ); + self UseTriggerRequireLookAt(); + self SetHintString( "" ); + lever = GetEnt( self.target, "targetname" ); + flag_wait( "power_on" ); + while( !flag( "shs" ) ) + { + self waittill( "trigger" ); + if( lever.spot == 4 ) + { + lever RotateRoll( -100, 0.2 ); + lever.spot = 0; + lever PlaySound( "zmb_transatlantic_rose" ); + lever waittill( "rotatedone" ); + } + else + { + lever RotateRoll( 25, 0.2 ); + lever.spot = lever.spot + 1; + lever PlaySound( "zmb_transatlantic_rose" ); + lever waittill( "rotatedone" ); + } + } +} +cancer() +{ + level thread coast_egg_fuse_controller(); + level thread coast_egg_fuse_box_think(); +} +coast_egg_fuse_box_think() +{ + fuse_box_trigger = GetEnt( "trig_fuse_replace", "targetname" ); + fuse_box = GetEnt( "ent_fuse_box", "targetname" ); + if( !IsDefined( fuse_box_trigger ) ) + { + return; + } + fuse_box_trigger SetCursorHint( "HINT_NOICON" ); + fuse_box_trigger SetHintString( "" ); + fuse_box_trigger UseTriggerRequireLookAt(); + flag_wait( "ffs" ); + while( !flag( "ffd" ) ) + { + fuse_box_trigger waittill( "trigger", who ); + if( IsDefined( who._fuse_acquired ) && who._fuse_acquired == 1 ) + { + who._fuse_acquired = undefined; + if( IsDefined( fuse_box ) ) + { + spawn_spot = fuse_box GetTagOrigin( "tag_fuse" ); + if( IsDefined( spawn_spot ) ) + { + fuse_attached = Spawn( "script_model", spawn_spot ); + fuse_attached.angles = fuse_box GetTagAngles( "tag_fuse" ); + fuse_attached SetModel( "p_zom_fuse" ); + fuse_attached PlaySound( "zmb_winepull" ); + level.egg_sound_ent PlaySound( "zmb_craziness_supreme" ); + exploder( 780 ); + } + } + who thread coast_remove_eggs_hud(); + fuse_placed = true; + flag_set( "ffd" ); + level thread coast_egg_fuse_starts_holy( who ); + } + else + { + wait( 0.1 ); + } + } +} +coast_egg_fuse_controller() +{ + fuse_array = getstructarray( "struct_ep", "targetname" ); + fuse_delivered = undefined; + fuse_array = array_randomize( fuse_array ); + flag_wait( "ffs" ); + while( !flag( "ffd" ) ) + { + for( i = 0; i < fuse_array.size; i++ ) + { + fuse_array[i].object = Spawn( "script_model", fuse_array[i].origin ); + fuse_array[i].object.angles = fuse_array[i].angles; + fuse_array[i].object SetModel( fuse_array[i].script_parameters ); + fuse_array[i].object.starter = GetEnt( fuse_array[i].target, "targetname" ); + fuse_array[i].object.starter UseTriggerRequireLookAt(); + fuse_array[i].object.starter SetCursorHint( "HINT_NOICON" ); + fuse_array[i].object.starter EnableLinkTo(); + fuse_array[i].object.starter LinkTo( fuse_array[i].object ); + fuse_array[i].object coast_egg_fuse_think(); + fuse_delivered = coast_egg_fuse_lost( "fuse_lost", "ffd" ); + if( IsDefined( fuse_delivered ) && is_true( fuse_delivered ) ) + { + return; + } + } + wait( 1.0 ); + } + for( i = 0; i < fuse_array.size; i++ ) + { + if( !IsDefined( fuse_array[i].object.starter ) ) + { + fuse_array[i].object.starter = GetEnt( fuse_array[i].target, "targetname" ); + } + fuse_array[i].starter Delete(); + if( IsDefined( fuse_array[i].object ) ) + { + fuse_array[i].object Delete(); + } + } + array_delete( fuse_array ); +} +coast_egg_fuse_lost( str_endon, str_waittill ) +{ + level endon( str_endon ); + level waittill( str_waittill ); + return true; +} +coast_egg_fuse_think() +{ + fuse_found = false; + while( !fuse_found ) + { + self.starter waittill( "trigger", who ); + if( IsDefined( who ) && is_player_valid( who ) ) + { + who._fuse_acquired = 1; + who PlaySound( "zmb_grabit_wontyou" ); + who maps\_zombiemode_audio::create_and_play_dialog( "eggs", "coast_response", undefined, 1 ); + who thread coast_eggs_hud( "zom_hud_icon_fuse", "ffd" ); + who thread coast_egg_clear_fuse_on_death(); + fuse_found = true; + } + } + self trigger_off(); + self Hide(); +} +coast_egg_clear_fuse_on_death() +{ + self endon( "disconnect" ); + level endon( "ffd" ); + level thread coast_egg_clear_fuse_on_disconnect( self ); + self waittill_any( "death", "_zombie_game_over", "spawned_spectator" ); + if( IsDefined( self ) ) + { + self._fuse_acquired = undefined; + } + level notify( "fuse_lost" ); +} +coast_egg_clear_fuse_on_disconnect( ent_ply ) +{ + level endon( "ffd" ); + level endon( "fuse_lost" ); + ent_ply endon( "death" ); + ent_ply waittill( "disconnect" ); + level notify( "fuse_lost" ); +} +coast_egg_fuse_starts_holy( ent_player ) +{ + knock_trig = GetEnt( "e_gargoyle", "targetname" ); + players = GetPlayers(); + level thread force_wait_for_forcefield_looper(); + level maps\zombie_coast_amb::play_characters_skits_etc( ent_player, knock_trig, 2, 2, 3, undefined ); +} +aries() +{ + flag_wait( "hgs" ); + enta_made_the_shot_trigger = GetEntArray( "trig_holy_g_damage", "targetname" ); + metal_door = GetEnt( "ent_metal_door", "targetname" ); + if( !IsDefined( enta_made_the_shot_trigger ) ) + { + return; + } + exploder( 770 ); + for( i = 0; i < enta_made_the_shot_trigger.size; i++ ) + { + if( level flag_exists( "hg" + i ) ) + { + enta_made_the_shot_trigger[i] thread coast_egg_power_source_react( "hg" + i ); + } + else + { + PrintLn( "***************************** more triggers than flags set up! *********************************************" ); + } + } + level thread coast_egg_holy_grenade_watcher(); + flag_wait( "hgd" ); + stop_exploder( 770 ); +} +coast_egg_power_source_react( str_flag ) +{ + rtg = getstruct( self.target, "targetname" ); + field = undefined; + if( IsDefined( rtg ) ) + { + field = Spawn( "script_model", rtg.origin ); + field.angles = rtg.angles; + field SetModel( "tag_origin" ); + field PlayLoopSound( "zmb_wizzybizzy_loop", 1 ); + PlayFXOnTag( level._effect[ "rtg_field" ], field, "tag_origin" ); + } + self._source_damaged = false; + while( !self._source_damaged ) + { + self waittill( "damage", i_amount, e_attacker, v_direction, vec_position, i_dmg_type, str_model_name, str_tagname ); + if( is_player_valid( e_attacker ) && ( i_dmg_type == level.trials[0] || i_dmg_type == level.trials[1] ) ) + { + flag_set( str_flag ); + self._source_damaged = true; + field StopLoopSound( .1 ); + field PlaySound( "zmb_wizzybizzy_explo" ); + } + } + if( IsDefined( field ) ) + { + field Delete(); + } + self trigger_off(); + self Delete(); +} +coast_egg_holy_grenade_watcher() +{ + flag_wait_all( "hg0", "hg1", "hg2", "hg3" ); + flag_set( "hgd" ); +} +virgo() +{ + enta_egg_ice_break_trigger = GetEntArray( "trig_egg_break_ice", "targetname" ); + ice_blocks = GetEntArray( "ent_bartender", "targetname" ); + holsters = getstructarray( "struct_that_thing", "targetname" ); + if( !IsDefined( enta_egg_ice_break_trigger ) ) + { + return; + } + if( !IsDefined( ice_blocks ) ) + { + return; + } + if( !IsDefined( holsters ) ) + { + return; + } + holsters = array_randomize( holsters ); + flag_wait( "bs" ); + level thread coast_egg_bottle_delivered(); + level thread coast_egg_bartender( holsters ); +} +coast_egg_bartender( structs ) +{ + level endon( "bd" ); + while( !flag( "bd" ) ) + { + for( i = 0; i < structs.size; i++ ) + { + wait( 0.1 ); + another = structs[i] coast_egg_bottle_think(); + if( IsDefined( another ) && another ) + { + level waittill_either( "butterfingers", "bd" ); + } + } + wait( 0.1 ); + structs = array_randomize( structs ); + } +} +coast_egg_bottle_think() +{ + level endon( "bd" ); + second_spot = getstruct( self.target, "targetname" ); + dropper = undefined; + e_ice_block = Spawn( "script_model", self.origin ); + e_ice_block.angles = self.angles; + e_ice_block SetModel( "p_zom_ice_chunk_03" ); + e_bottle = Spawn( "script_model", second_spot.origin ); + e_bottle.angles = second_spot.angles; + e_bottle SetModel( "p_zom_vodka_bottle" ); + e_icebreaker = Spawn( "trigger_damage", self.origin, 0, 11, 13 ); + e_catch_trig = Spawn( "trigger_radius", e_bottle.origin, 0, 10, 10 ); + e_inflictor = undefined; + Assert( IsDefined( e_icebreaker ) ); + Assert( IsDefined( e_bottle ) ); + Assert( IsDefined( e_catch_trig ) ); + e_catch_trig EnableLinkTo(); + e_catch_trig LinkTo( e_bottle ); + e_icebreaker EnableLinkTo(); + e_icebreaker LinkTo( e_ice_block ); + bottle_end = e_bottle.origin + ( 0, 0, -500 ); + ice_solid = true; + while( ice_solid ) + { + e_icebreaker waittill( "damage", i_amt, e_inflictor, vec_direction, vec_point, mod_type ); + if( is_player_valid( e_inflictor ) && mod_type == level.trials[2] ) + { + ice_solid = false; + } + } + e_ice_block Delete(); + e_icebreaker Delete(); + end_point = PhysicsTrace( e_bottle.origin, bottle_end ); + e_bottle NotSolid(); + e_bottle MoveTo( end_point, 1.4, 0.2, 0 ); + player_caught = e_bottle coast_egg_bottle_caught( e_catch_trig ); + level notify( "stop_egg_debug" ); + if( IsDefined( player_caught ) && is_player_valid( player_caught ) ) + { + player_caught PlaySound( "zmb_worf_speed" ); + player_caught maps\_zombiemode_audio::create_and_play_dialog( "eggs", "coast_response", undefined, 7 ); + player_caught._bottle_acquired = 1; + player_caught thread coast_egg_clear_bottle_on_death(); + player_caught thread coast_eggs_hud( "zom_hud_icon_bottle", "bd" ); + e_catch_trig Unlink(); + e_catch_trig Delete(); + e_bottle Hide(); + e_bottle Delete(); + return true; + } + else + { + if( IsDefined( e_inflictor ) ) + { + e_inflictor maps\_zombiemode_audio::create_and_play_dialog( "eggs", "coast_response", undefined, 6 ); + } + e_bottle PlaySound( "zmb_worf_speed_fail" ); + e_catch_trig Unlink(); + e_catch_trig Delete(); + e_bottle Hide(); + e_bottle Delete(); + return false; + } +} +coast_egg_bottle_caught( e_trigger ) +{ + self endon( "movedone" ); + while( IsDefined( e_trigger ) ) + { + e_trigger waittill( "trigger", who ); + if( is_player_valid( who ) ) + { + return who; + } + } +} +coast_egg_clear_bottle_on_death() +{ + self endon( "disconnect" ); + level endon( "bd" ); + level thread coast_egg_clear_bottle_on_disconnect( self ); + self waittill_any( "death", "_zombie_game_over", "spawned_spectator" ); + if( IsDefined( self ) ) + { + self._bottle_acquired = undefined; + } + level notify( "butterfingers" ); +} +coast_egg_clear_bottle_on_disconnect( ent_ply ) +{ + level endon( "bd" ); + level endon( "butterfingers" ); + ent_ply endon( "death" ); + ent_ply waittill( "disconnect" ); + level notify( "butterfingers" ); +} +coast_egg_bottle_delivered() +{ + e_delivery_trigger = GetEnt( "trig_deliver", "targetname" ); + delivery_tube = GetEnt( e_delivery_trigger.target, "targetname" ); + if( !IsDefined( e_delivery_trigger ) ) + { + return; + } + e_delivery_trigger SetHintString( "" ); + while( IsDefined( e_delivery_trigger ) ) + { + e_delivery_trigger waittill( "trigger", who ); + if( IsDefined( who._bottle_acquired ) && who._bottle_acquired == 1 ) + { + who thread coast_remove_eggs_hud(); + who._bottle_acquired = 0; + if( IsDefined( delivery_tube ) ) + { + spawn_point = delivery_tube GetTagOrigin( "tag_tube" ); + device = Spawn( "script_model", spawn_point ); + device.angles = delivery_tube GetTagAngles( "tag_tube" ); + device SetModel( "p_zom_vodka_bottle" ); + device PlaySound( "zmb_whooooosh" ); + device MoveZ( 40, 1.0 ); + device waittill( "movedone" ); + device Delete(); + } + break; + } + } + flag_set( "bd" ); +} +coast_egg_bottle_cleanup() +{ + e_bottle = GetEnt( self.target, "targetname" ); + if( IsDefined( e_bottle ) ) + { + e_bottle Delete(); + } + self Delete(); +} +denlo() +{ + radios = GetEntArray( "hello_world", "targetname" ); + for( i = 0; i < radios.size; i++ ) + { + radios[i] SetCursorHint( "HINT_NOICON" ); + radios[i] SetHintString( "" ); + radios[i] UseTriggerRequireLookAt(); + radios[i] thread coast_egg_art_critic_message(); + } +} +coast_egg_art_critic_message() +{ + level endon( "aca" ); + if( !IsDefined( self.script_special ) ) + { + return; + } + if( !IsDefined( self.script_string ) ) + { + return; + } + flag_wait( "power_on" ); + while( !flag( "aca" ) ) + { + self waittill( "trigger", dj ); + if( is_player_valid( dj ) ) + { + if( !flag( "ke" ) ) + { + self PlaySound( "zmb_radio_morse_static" ); + wait( 0.1 ); + } + if( flag( "ke" ) ) + { + self PlaySound( self.script_string ); + if( !IsDefined( level._reach ) ) + { + level._reach = []; + } + heard = level call_out( self.script_parameters ); + if( IsDefined( heard ) && heard ) + { + flag_set( "aca" ); + } + } + } + } +} +call_out( str_message ) +{ + level endon( "aca" ); + level._reach = add_to_array( level._reach, str_message ); + if( level._reach.size == level.contact.size ) + { + for( i = 0; i < level.contact.size; i++ ) + { + if( level._reach[i] != level.contact[i] ) + { + level._reach = undefined; + return false; + } + } + return true; + } +} +pisces() +{ + flag_wait( "aca" ); + level._serenade = []; + ClientNotify( "lmc" ); + level thread metal_horse(); + flag_wait( "bp" ); + flag_set( "mcs" ); +} +eyes_on_the_wall( spinner, starboard, port ) +{ + Assert( IsDefined( spinner.spot ) ); + Assert( IsDefined( starboard.spot ) ); + Assert( IsDefined( port.spot ) ); + flag_wait( "aca" ); + while( 1 ) + { + if( spinner.spot == level.mermaid[0] && starboard.spot == level.mermaid[2] && port.spot == level.mermaid[1] ) + { + playsoundatposition( "zmb_ship_horn_poweron", (-694, -990, 1025 ) ); + flag_set( "shs" ); + ClientNotify( "slc" ); + return; + } + wait( 0.1 ); + } +} +metal_horse() +{ + horse_struct = getstruct( "struct_thunder", "targetname" ); + flag_wait( "shs" ); + wait( 2.0 ); + horse = Spawn( "script_model", horse_struct.origin ); + horse.angles = horse_struct.angles; + horse SetModel( "p_zom_minisub" ); + horse NotSolid(); + horse PlaySound( "zmb_forward_march" ); + horse MoveZ( 325, 5.0 ); + horse waittill( "movedone" ); + flag_set( "sr" ); + if( level._e_group ) + { + while( !flag( "bp" ) ) + { + for( i = 0; i < level.mermaid.size; i++ ) + { + sound = "zmb_sub_tone_" + level.mermaid[i]; + horse PlaySound( sound ); + wait( 2.0 ); + } + song = coast_egg_fuse_lost( "can_not_sing", "bp" ); + if( is_true( song ) ) + { + break; + } + else + { + horse MoveZ( -325, 5.0 ); + horse waittill( "movedone" ); + flag_clear( "sr" ); + level waittill( "between_round_over" ); + wait( 5.0 ); + horse PlaySound( "zmb_forward_march" ); + horse MoveZ( 325, 10.0 ); + horse waittill( "movedone" ); + flag_set( "sr" ); + } + } + } + else + { + for( i = 0; i < level.mermaid.size; i++ ) + { + sound = "zmb_sub_tone_" + level.mermaid[i]; + horse PlaySound( sound ); + wait( 2.0 ); + } + flag_set( "bp" ); + flag_set( "ss" ); + } + exploder( 750 ); + if( !level._e_group ) + { + exploder( 755 ); + } + flag_wait( "re" ); + stop_exploder( 750 ); + horse MoveZ( -325, 2.0 ); + horse waittill( "movedone" ); + horse Delete(); +} +noisemakers() +{ + enta_sound_beacon_triggers = GetEntArray( "trig_use_sound_beacon", "targetname" ); + array_thread( enta_sound_beacon_triggers, ::coast_egg_musical_chairs_beach_beacon_used ); +} +coast_egg_musical_chairs_beach_beacon_used() +{ + self UseTriggerRequireLookAt(); + self SetHintString( "" ); + while( 1 ) + { + self waittill( "trigger", who ); + if( is_player_valid( who ) ) + { + if( flag( "power_on" ) ) + { + sound = "zmb_sub_tone_" + self.script_int; + self PlaySound( sound ); + } + if( flag( "sr" ) ) + { + if( !IsDefined( level._serenade ) ) + { + level._serenade = []; + } + level._serenade[ level._serenade.size ] = self.script_int; + if( level._serenade.size == level.mermaid.size ) + { + if( coast_egg_musical_check() ) + { + flag_set( "bp" ); + } + else + { + level notify( "can_not_sing" ); + level._serenade = undefined; + level._serenade = []; + } + } + } + } + } +} +coast_egg_musical_check() +{ + Assert( IsDefined( level._serenade ) ); + Assert( IsDefined( level.mermaid ) ); + for( i = 0; i < level.mermaid.size; i++ ) + { + if( level._serenade[i] != level.mermaid[i] ) + { + return false; + } + } + return true; +} +libra() +{ + flag_wait( "mcs" ); + flag_set( "hn" ); + flag_wait( "mm" ); + flag_set( "ss" ); +} +rotary_styles() +{ + enta_harmony_triggers = GetEntArray( "trig_pure_harmony", "targetname" ); + if( !IsDefined( enta_harmony_triggers ) ) + { + return; + } + level._dials = []; + level._dials[0] = -1; + level._dials[1] = -1; + level._dials[2] = -1; + level._dials[3] = -1; + for( i = 0; i < enta_harmony_triggers.size; i++ ) + { + rand = RandomInt( 9 ); + enta_harmony_triggers[i] coast_egg_dial_setup( rand ); + } + for( i = 0; i < enta_harmony_triggers.size; i++ ) + { + enta_harmony_triggers[i] thread coast_egg_dial_think(); + } +} +coast_egg_dial_setup( int_start_spot ) +{ + dial = GetEnt( self.target, "targetname" ); + dial.pos = 0; + dial ent_flag_init( "rotating" ); + level._dials[self.script_special] = dial; + if( IsDefined( int_start_spot ) ) + { + for( i = 0; i < int_start_spot; i++ ) + { + if( dial.pos == int_start_spot ) + { + return; + } + level coast_egg_dial_rotate( dial ); + } + } +} +coast_egg_dial_think() +{ + dial = GetEnt( self.target, "targetname" ); + partners = self.script_vector; + self SetHintString( "" ); + self SetCursorHint( "HINT_NOICON" ); + flag_wait( "power_on" ); + sound = "zmb_harmonizer_tone_" + dial.pos; + dial PlayLoopSound( sound ); + while( 1 ) + { + self waittill( "trigger", who ); + if( is_player_valid( who ) ) + { + level coast_egg_dial_rotate( dial ); + if( GetDvarInt( #"scr_coast_egg_debug" ) ) + { + } + else + { + other_dials = GetEntArray( self.targetname, "targetname" ); + for( i = 0; i < other_dials.size; i++ ) + { + if( other_dials[i].script_special == partners[0] ) + { + partner_dial = GetEnt( other_dials[i].target, "targetname" ); + if( IsDefined( partner_dial ) ) + { + level coast_egg_dial_rotate( partner_dial ); + } + else + { + } + } + else if( other_dials[i].script_special == partners[1] ) + { + partner_dial = GetEnt( other_dials[i].target, "targetname" ); + if( IsDefined( partner_dial ) ) + { + level coast_egg_dial_rotate( partner_dial ); + } + else + { + } + } + else if( other_dials[i].script_special == partners[2] ) + { + partner_dial = GetEnt( other_dials[i].target, "targetname" ); + if( IsDefined( partner_dial ) ) + { + level coast_egg_dial_rotate( partner_dial ); + } + else + { + } + } + } + } + if( flag( "hn" ) ) + { + if( coast_egg_dials_in_harmony() ) + { + flag_set( "mm" ); + exploder( 755 ); + } + } + } + } +} +coast_egg_dial_rotate( ent_dial ) +{ + if( !IsDefined( ent_dial.pos ) ) + { + ent_dial.pos = 0; + } + while( ent_dial ent_flag( "rotating" ) ) + { + wait( 0.1 ); + } + ent_dial ent_flag_set( "rotating" ); + ent_dial RotatePitch( 36, 0.2 ); + ent_dial waittill( "rotatedone" ); + ent_dial.pos++; + if( ent_dial.pos > 9 ) + { + ent_dial.pos = 0; + } + sound = "zmb_harmonizer_tone_" + ent_dial.pos; + if( flag( "power_on" ) ) + { + ent_dial PlayLoopSound( sound ); + } + ent_dial ent_flag_clear( "rotating" ); +} +coast_egg_dials_in_harmony() +{ + Assert( IsDefined( level._dials ) ); + Assert( IsDefined( level.together_again ) ); + match = true; + for( i = 0; i < level.together_again.size; i++ ) + { + if( level._dials[i].pos != level.together_again[i] ) + { + match = false; + } + } + return match; +} +leo() +{ + flag_wait( "ss" ); + level thread coast_egg_sacrifice_spot_start(); + level thread coast_egg_device_delivered(); + flag_wait( "re" ); + flag_wait( "s_s" ); +} +coast_egg_sacrifice_spot_start() +{ + level._humangun_escape_override = getstruct( "struct_sacrifice_grabbed_by_light", "targetname" ); + middle_of_the_light = getstruct( "struct_middle_of_light", "targetname" ); + top_of_the_house = getstruct( "struct_top_of_the_house", "targetname" ); + trig_reached_light = GetEnt( "trig_human_into_the_light", "targetname" ); + trig_gotcha = GetEnt( "trig_mine", "targetname" ); + reward = undefined; + light_mover = undefined; + who = undefined; + move_dist = undefined; + fx_spot = undefined; + if( !IsDefined( level._humangun_escape_override ) ) + { + return; + } + trig_reached_light PlaySound( "zmb_varoooooom" ); + trig_reached_light PlayLoopSound( "zmb_varoooooom_loop", 3 ); + while( !flag( "re" ) ) + { + while( !flag( "sa" ) ) + { + trig_reached_light waittill( "trigger", who ); + if( IsDefined( who ) && IsAlive( who ) && !IsPlayer( who ) && who.animname == "human_zombie" ) + { + light_mover = Spawn( "script_model", who.origin ); + light_mover.angles = who.angles; + light_mover SetModel( "tag_origin" ); + who LinkTo( light_mover ); + who.animname = "dancer"; + who thread beat_break( %ai_zombie_flinger_flail ); + light_mover thread watch_for_death( who ); + light_mover thread rotate_while_moving(); + who.ignoreme = true; + who disable_pain(); + who._lighthouse_owned = true; + who thread magic_bullet_shield(); + level._zombie_human_array = array_remove( level._zombie_human_array, who ); + who.humangun_zombie_1st_hit_was_upgraded = undefined; + level._humangun_escape_override = undefined; + who thread rising_watch( light_mover ); + light_mover MoveTo( middle_of_the_light.origin, 2.0 ); + light_mover waittill_notify_or_timeout( "movedone", 2.0 ); + if( IsDefined( who ) && IsAlive( who ) ) + { + flag_set( "sa" ); + } + if( !IsDefined( light_mover ) ) + { + continue; + } + } + } + if( IsDefined( light_mover ) ) + { + move_dist = top_of_the_house.origin[2] - middle_of_the_light.origin[2]; + light_mover MoveZ( move_dist, 25 ); + light_mover waittill_notify_or_timeout( "movedone", 25.0 ); + if( !IsDefined( light_mover ) ) + { + continue; + } + light_mover notify( "completed" ); + fx_spot = Spawn( "script_model", light_mover.origin + ( 0, 0, -60 ) ); + fx_spot SetModel( "tag_origin" ); + fx_spot PlaySound( "zmb_northern_lights" ); + PlayFXOnTag( level._effect[ "fx_zmb_coast_sacrifice_flash" ], fx_spot, "tag_origin" ); + fx_spot thread rotate_while_moving(); + } + if( IsDefined( who ) ) + { + if( is_true( who._light_accept ) ) + { + reward = Spawn( "script_model", light_mover.origin ); + reward.angles = light_mover.angles; + reward SetModel( "p_zom_vril_device" ); + reward PlayLoopSound( "zmb_shimmer_sweetly_loop" ); + } + who._lighthouse_owned = undefined; + who thread stop_magic_bullet_shield(); + who Unlink(); + who Hide(); + who DoDamage( who.health + 10, who.origin ); + } + if( IsDefined( light_mover ) ) + { + if( IsDefined( reward ) ) + { + reward LinkTo( light_mover ); + back_down = ( move_dist - 45 ) * -1; + light_mover thread rotate_while_moving(); + light_mover MoveZ( back_down, 5.0 ); + light_mover waittill( "movedone" ); + grabbed = false; + while( !grabbed ) + { + trig_gotcha waittill( "trigger", grabber ); + if( is_player_valid( grabber ) ) + { + level thread device_return_from_death( reward.origin ); + grabber thread device_replace_on_death(); + fx_spot notify( "completed" ); + light_mover notify( "completed" ); + fx_spot Delete(); + reward StopLoopSound( .1 ); + reward PlaySound( "zmb_tingling_sensation" ); + grabber thread coast_eggs_hud( "zom_hud_icon_vril", "s_s" ); + reward Unlink(); + reward Delete(); + grabber._has_device = true; + grabber maps\_zombiemode_audio::create_and_play_dialog( "eggs", "coast_response", undefined, 12 ); + grabbed = true; + level._humangun_escape_override = undefined; + flag_set( "re" ); + stop_exploder( 755 ); + } + } + } + else + { + level._humangun_escape_override = getstruct( "struct_sacrifice_grabbed_by_light", "targetname" ); + flag_clear( "sa" ); + } + light_mover Delete(); + } + wait( 0.1 ); + } +} +device_return_from_death( vec_spot ) +{ + level endon( "s_s" ); + trig_gotcha = GetEnt( "trig_mine", "targetname" ); + while( !flag( "s_s" ) ) + { + level waittill( "device_lost" ); + device = Spawn( "script_model", vec_spot ); + device thread rotate_while_moving(); + device SetModel( "p_zom_vril_device" ); + device PlayLoopSound( "zmb_shimmer_sweetly_loop" ); + grabbed = false; + while( !grabbed ) + { + trig_gotcha waittill( "trigger", who ); + if( is_player_valid( who ) ) + { + device notify( "completed" ); + device StopLoopSound( .1 ); + device PlaySound( "zmb_tingling_sensation" ); + who thread coast_eggs_hud( "zom_hud_icon_vril", "s_s" ); + device Delete(); + who._has_device = true; + who maps\_zombiemode_audio::create_and_play_dialog( "eggs", "coast_response", undefined, 12 ); + grabbed = true; + } + } + } +} +watch_for_death( ent_guy ) +{ + self endon( "completed" ); + ent_guy waittill( "death" ); + if( IsDefined( ent_guy ) ) + { + ent_guy Unlink(); + } + flag_clear( "sa" ); + level._humangun_escape_override = getstruct( "struct_sacrifice_grabbed_by_light", "targetname" ); + self Delete(); +} +rotate_while_moving() +{ + self endon( "completed" ); + while( IsDefined( self ) ) + { + self RotateYaw( 360, 4.0 ); + self waittill( "rotatedone" ); + } +} +device_replace_on_death() +{ + self endon( "disconnect" ); + level endon( "s_s" ); + level thread lost_salvation( self ); + self waittill_any( "death", "_zombie_game_over", "spawned_spectator" ); + if( IsDefined( self ) ) + { + self._has_device = undefined; + } + level notify( "device_lost" ); +} +lost_salvation( ent_ply ) +{ + level endon( "s_s" ); + ent_ply endon( "death" ); + ent_ply waittill( "disconnect" ); + level notify( "device_lost" ); +} +rising_watch( org_mover ) +{ + self endon( "death" ); + org_mover endon( "completed" ); + players = GetPlayers(); + self.essance = 5000 * players.size; + while( self.essance > 0 ) + { + self waittill( "damage", i_amount, e_inflictor ); + self.essance = self.essance - i_amount; + } + self notify( "switch" ); + self thread beat_break( %ai_zombie_dying_back_idle ); + self notify( "lighthouse_owned" ); + self._light_accept = true; +} +coast_egg_device_delivered() +{ + delivery_trig = GetEnt( "trig_deliver", "targetname" ); + delivery_tube = GetEnt( delivery_trig.target, "targetname" ); + knock_trig = GetEnt( "e_gargoyle", "targetname" ); + if( !IsDefined( delivery_trig ) ) + { + return; + } + flag_wait( "re" ); + delivered = false; + while( !delivered ) + { + delivery_trig waittill( "trigger", shorts_man ); + if( is_player_valid( shorts_man ) && IsDefined( shorts_man._has_device ) && shorts_man._has_device == true ) + { + delivered = true; + shorts_man._has_device = false; + shorts_man thread coast_remove_eggs_hud(); + if( IsDefined( delivery_tube ) ) + { + spawn_point = delivery_tube GetTagOrigin( "tag_tube" ); + device = Spawn( "script_model", spawn_point ); + device.angles = delivery_tube GetTagAngles( "tag_tube" ); + device SetModel( "p_zom_vril_device" ); + device PlaySound( "zmb_whooooosh" ); + device MoveZ( 40, 1.0 ); + device waittill( "movedone" ); + device Delete(); + } + flag_set( "s_s" ); + level.egg_sound_ent StopLoopSound( 1.5 ); + level maps\zombie_coast_amb::play_characters_skits_etc( shorts_man, knock_trig, 13, 5, 14, undefined ); + level.egg_sound_ent PlayLoopSound( "zmb_fantastical_worlds_loop", 1.5 ); + flag_set( "sdm" ); + } + } +} +capricorn() +{ + trig_hit = GetEnt( "trig_fix_tv", "targetname" ); + fuse_box = GetEnt( "ent_fuse_box", "targetname" ); + knock_trig = GetEnt( "e_gargoyle", "targetname" ); + fixed = false; + if( !IsDefined( trig_hit ) ) + { + return; + } + flag_wait( "sdm" ); + level thread coast_egg_broken_spark( fuse_box ); + while( !fixed ) + { + trig_hit waittill( "damage", i_amount, e_inflictor, v_direction, v_point, mod_type ); + if( is_player_valid( e_inflictor ) && mod_type == level.trials[2] ) + { + fuse_box PlaySound( "zmb_wizzybizzy_explo" ); + level.egg_sound_ent PlaySound( "zmb_craziness_supreme" ); + level notify( "stop_spark" ); + level maps\zombie_coast_amb::play_characters_skits_etc( e_inflictor, knock_trig, 15, 6, undefined, undefined ); + fixed = true; + } + } + flag_set( "dmf" ); + level notify( "scrambled" ); + level notify( "coast_easter_egg_achieved" ); + level thread consequences_will_never_be_the_same(); +} +coast_egg_broken_spark( fuse_box ) +{ + level endon( "stop_spark" ); + while( IsDefined( self ) ) + { + exploder( 780 ); + fuse_box PlaySound( "zmb_jumping_jacks" ); + wait( RandomFloatRange( 0.5, 1.2 ) ); + } +} +consequences_will_never_be_the_same() +{ + struct = getstruct( "consequence", "targetname" ); + if( IsDefined( struct ) ) + { + level thread maps\_zombiemode_powerups::specific_powerup_drop( "tesla", struct.origin ); + } +} +coast_eggs_hud( str_shader, str_endon ) +{ + self.eggHud = create_simple_hud( self ); + self.eggHud.foreground = true; + self.eggHud.sort = 2; + self.eggHud.hidewheninmenu = false; + self.eggHud.alignX = "center"; + self.eggHud.alignY = "bottom"; + self.eggHud.horzAlign = "user_right"; + self.eggHud.vertAlign = "user_bottom"; + self.eggHud.x = -225; + self.eggHud.y = 0; + self.eggHud.alpha = 1; + self.eggHud setshader( str_shader, 32, 32 ); + self thread coast_eggs_hud_remove_on_death( str_endon ); +} +coast_remove_eggs_hud() +{ + self endon( "death" ); + if( IsDefined( self.eggHud ) ) + { + self.eggHud Destroy(); + } +} +coast_eggs_hud_remove_on_death( str_endon ) +{ + level endon( str_endon ); + self waittill_any( "death", "_zombie_game_over", "spawned_spectator" ); + self thread coast_remove_eggs_hud(); +} +coast_egg_debug_print3d( str_text ) +{ + self endon( "stop_egg_debug" ); + self endon( "death" ); + while( IsDefined( self ) ) + { + Print3d( self.origin, str_text, ( 0.9, 0.9, 0.9 ), 1, 1, 10 ); + wait( 0.5 ); + } +} +coast_egg_play_anim( str_anim, str_notify, str_endon ) +{ + self endon( str_endon ); + self endon( "death" ); + while( IsDefined( self ) && IsAlive( self ) ) + { + time = getAnimLength( str_anim ); + self animscripted( str_notify, self.origin, self.angles, str_anim ); + wait( time ); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_coast_environmental.gsc b/BO1/PC/ZM/maps/zombie_coast_environmental.gsc new file mode 100644 index 0000000..303fe2b Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_coast_environmental.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_coast_ffotd.gsc b/BO1/PC/ZM/maps/zombie_coast_ffotd.gsc new file mode 100644 index 0000000..4ffe02a Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_coast_ffotd.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_coast_flinger.gsc b/BO1/PC/ZM/maps/zombie_coast_flinger.gsc new file mode 100644 index 0000000..258fb6a --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_coast_flinger.gsc @@ -0,0 +1,482 @@ + +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#using_animtree ( "zombie_coast" ); +main() +{ + level.flinger_anims = []; + level.flinger_anims["player_fling_stand_crouch"] = %pb_rifle_stand_flinger_flail; + level.flinger_anims["player_fling_prone"] = %pb_rifle_prone_flinger_flail; + level.flinger_animtree = #animtree; +} +init_flinger() +{ + flag_wait("all_players_spawned"); + blocker = getent("flipper_pathblock","targetname"); + blocker connectpaths(); + blocker trigger_off(); + gate = getent("flinger_player_gate","targetname"); + gate notsolid(); + level thread start_flinger_in_open_position(); + level thread flinger_think(); +} +start_flinger_in_open_position() +{ + blocker = getent("flipper_pathblock","targetname"); + gate = getent("flinger_player_gate","targetname"); + flinger_trig = getent("flinger_activate","targetname"); + flinger_trig.flipper = getent("flipper","targetname"); + flinger_trig.flipper_closed_struct = getstruct("flipper_closed","targetname"); + flinger_trig.flipper_open_struct = getstruct("flipper_open","targetname"); + flinger_trig.flipper_anchor = spawn("script_origin",flinger_trig.flipper_closed_struct.origin); + flinger_trig.flipper_anchor.angles = flinger_trig.flipper_closed_struct.angles; + flinger_trig.flipper linkto(flinger_trig.flipper_anchor); + angles_dif = flinger_trig.flipper_open_struct.angles - flinger_trig.flipper_closed_struct.angles; + flinger_trig.flipper_anchor rotatepitch(angles_dif[0] ,.2); + flag_wait("power_on"); + flag_wait("residence_beach_group"); + wait_for_flinger_area_to_be_clear(); + blocker trigger_on(); + blocker disconnectpaths(); + blocker trigger_off(); + flinger_trig.flipper PlaySound( "zmb_flinger_close" ); + angles_dif = flinger_trig.flipper_closed_struct.angles - flinger_trig.flipper_open_struct.angles; + flinger_trig.flipper_anchor rotatepitch(angles_dif[0] ,.2); + wait(.3); + flinger_trig.flipper unlink(); + flinger_trig.flipper_anchor delete(); + blocker trigger_on(); + blocker connectpaths(); + blocker trigger_off(); + level notify("flinger_in_place"); +} +flinger_think() +{ + flag_wait("power_on"); + flag_wait("residence_beach_group"); + level waittill("flinger_in_place"); + flinger_trig = getent("flinger_activate","targetname"); + flinger_poi = getent(flinger_trig.target,"targetname"); + flinger_poi create_zombie_point_of_interest( undefined, 30, 0, false ); + flinger_poi thread create_zombie_point_of_interest_attractor_positions( 4, 45 ); + while(1) + { + flinger_trig waittill("trigger",who); + if( !IsDefined( who ) ) + { + continue; + } + if(isDefined(who.sessionstate) && is_true(who.sessionstate == "spectator")) + { + continue; + } + flinger_trig.flipper = getent("flipper","targetname"); + flinger_trig.flipper PlaySound( "zmb_flinger_activate" ); + flinger_trig.flipper thread play_delayed_activate_sound(); + wait(2); + flinger_trig flinger_fling(); + if(isDefined(who)) + { + who._triggered_flinger = false; + } + } +} +play_delayed_activate_sound() +{ + wait(1.9); + self PlaySound( "zmb_flinger_activate" ); +} +flinger_fling() +{ + players_reviving = true; + while(players_reviving) + { + reviving = 0; + players = get_players(); + for(i = 0; i < players.size; i++) + { + if(!isDefined(players[i].revivetrigger)) + { + continue; + } + if(is_true(players[i].revivetrigger.beingRevived )) + { + reviving = 1; + } + } + if(!reviving) + { + players_reviving = false; + } + wait(.5); + } + blocker = getent("flipper_pathblock","targetname"); + gate = getent("flinger_player_gate","targetname"); + self.flipper_closed_struct = getstruct("flipper_closed","targetname"); + self.flipper_open_struct = getstruct("flipper_open","targetname"); + self.flipper_anchor = spawn("script_origin",self.flipper_closed_struct.origin); + self.flipper_anchor.angles = self.flipper_closed_struct.angles; + self.flipper linkto(self.flipper_anchor); + angles_dif = self.flipper_open_struct.angles - self.flipper_closed_struct.angles; + self.flipper_anchor rotatepitch(angles_dif[0] ,.2); + self.flipper PlaySound( "zmb_flinger_fling_add" ); + self.zombies_flinged = false; + level thread player_launch(self,gate); + PlayFX(level._effect["large_ceiling_dust"],self.flipper.origin + (100,0, 0) ); + self thread flipper_second_dust(); + do_flipper_corpse_cleanup(self); + zombs = GetAIArray(); + for ( i = 0; i < zombs.size; i++ ) + { + if ( zombs[i] istouching(self) ) + { + if(isdefined(zombs[i].animname) && zombs[i].animname == "director_zombie") + { + zombs[i] thread boss_launch(self); + } + else + { + zombs[i] thread fling_zombie(getstruct("fling_angles","script_noteworthy").angles ); + self.zombies_flinged = true; + } + } + } + wait( 2 ); + wait_for_flinger_area_to_be_clear(); + blocker trigger_on(); + blocker disconnectpaths(); + blocker trigger_off(); + self.flipper PlaySound( "zmb_flinger_close" ); + self.zombies_flinged = false; + angles_dif = self.flipper_closed_struct.angles - self.flipper_open_struct.angles; + self.flipper_anchor rotatepitch(angles_dif[0] ,.2); + self notify ("trap_done"); + do_flipper_corpse_cleanup(self); + self.flipper_anchor waittill("rotatedone"); + self.flipper unlink(); + self.flipper_anchor delete(); + blocker trigger_on(); + blocker connectpaths(); + blocker trigger_off(); +} +wait_for_flinger_area_to_be_clear() +{ + area = getent("flinger_check_clear","targetname"); + if(!isDefined(area)) + { + return; + } + area_clear = false; + while(!area_clear) + { + touching = false; + ai = getaiarray(); + players = get_players(); + for(i=0;i 0 ) + { + self SwitchToWeapon( primaryWeapons[0] ); + } + } + } + self maps\_zombiemode_audio::create_and_play_dialog( "catapult", "self" ); + self._being_flung = true; + self hide(); + self Allowstand(true); + self allowcrouch(true); + self allowprone(true); + self PlayLoopSound( "zmb_player_flinger_airrush", .25 ); + if(!is_true( self.has_powerup_weapon)) + { + weap = self getcurrentweapon(); + if(is_placeable_mine(weap) || self isswitchingweapons() ) + { + primaryWeapons = self GetWeaponsListPrimaries(); + if( IsDefined( primaryWeapons ) && primaryWeapons.size > 0 ) + { + self SwitchToWeapon( primaryWeapons[0] ); + } + } + } + if(!self maps\_laststand::player_is_in_laststand()) + { + self increment_is_drinking(); + } + wait_network_frame(); + org1 = spawn ("script_origin", self.origin + (0,0,20) ); + self PlayerLinkTo ( org1 ); + org1 Fake_PhysicsLaunch ( launch_spot.origin, randomintrange(890,920)); + self thread unlink_later(org1 ); + all_players_flung = true; + for(x = 0; x < players.size; x++) + { + if(!is_true(players[x]._being_flung)) + { + all_players_flung = false; + } + } + if(all_players_flung) + { + flinger_trig = getent("flinger_activate","targetname"); + flinger_poi = getent(flinger_trig.target,"targetname"); + flinger_poi activate_zombie_point_of_interest(); + flinger_poi thread wait_for_flung_players_to_land(); + } +} +wait_for_flung_players_to_land() +{ + players_landed = false; + while(!players_landed) + { + players = get_players(); + for(i=0;i level.water_zombie_percent_min ) + { + level.water_zombie_percent -= level.water_zombie_percent_dec; + if ( level.water_zombie_percent <= level.water_zombie_percent_min ) + { + level.water_zombie_percent = level.water_zombie_percent_min; + break; + } + } + } +} +zombie_check_riser() +{ + self endon( "death" ); + if ( isDefined( self.script_string ) && self.script_string == "riser" ) + { + self waittill( "risen" ); + } + self thread zombie_water_out(); +} +zombie_water_out() +{ + self endon( "death" ); + while ( 1 ) + { + for ( i = 0; i < level.water.size; i++ ) + { + if ( self isTouching( level.water[i] ) ) + { + self zombie_entered_water( level.water[i] ); + return; + } + } + wait_network_frame(); + } +} +zombie_entered_water( trigger ) +{ + self endon( "death" ); + self.in_water = true; + if ( isDefined( self.zombie_entered_water ) ) + { + self thread [[ self.zombie_entered_water ]]( trigger ); + } + else + { + self zombie_water_move_slow(); + } + self thread zombie_water_in(); +} +zombie_water_move_slow() +{ + if ( is_true( self.speed_buff ) ) + { + var = randomintrange( 1, 5 ); + self set_run_anim( "sprint" + var ); + self.run_combatanim = level.scr_anim[ self.animname ][ "sprint" + var ]; + } + else + { + switch( self.zombie_move_speed ) + { + case "walk": + break; + case "run": + var = randomintrange( 1, 9 ); + self set_run_anim( "walk" + var ); + self.run_combatanim = level.scr_anim[ self.animname ][ "walk" + var ]; + break; + case "sprint": + var = randomintrange( 1, 7 ); + self set_run_anim( "run" + var ); + self.run_combatanim = level.scr_anim[ self.animname ][ "run" + var ]; + break; + } + } + self.needs_run_update = true; +} +zombie_water_in() +{ + self endon( "death" ); + while ( 1 ) + { + in_water = false; + for ( i = 0; i < level.water.size; i++ ) + { + if ( self isTouching( level.water[i] ) ) + { + self thread water_damage_zombie(); + in_water = true; + break; + } + } + if ( !in_water ) + { + self zombie_exited_water(); + return; + } + wait_network_frame(); + } +} +zombie_exited_water() +{ + self endon( "death" ); + self.in_water = false; + self.is_freezing = undefined; + if ( isDefined( self.zombie_exited_water ) ) + { + self thread [[ self.zombie_exited_water ]](); + } + else + { + self zombie_water_move_normal(); + } + self thread zombie_water_out(); +} +zombie_water_move_normal() +{ + if ( is_true( self.speed_buff ) ) + { + fast_sprint = "sprint5"; + if ( RandomInt( 100 ) < 50 ) + { + fast_sprint = "sprint6"; + } + self set_run_anim( fast_sprint ); + self.run_combatanim = level.scr_anim[ self.animname ][ fast_sprint ]; + } + else + { + switch( self.zombie_move_speed ) + { + case "walk": + var = randomintrange( 1, 9 ); + self set_run_anim( "walk" + var ); + self.run_combatanim = level.scr_anim[ self.animname ][ "walk" + var ]; + break; + case "run": + var = randomintrange( 1, 7 ); + self set_run_anim( "run" + var ); + self.run_combatanim = level.scr_anim[ self.animname ][ "run" + var ]; + break; + case "sprint": + var = randomintrange( 1, 5 ); + self set_run_anim( "sprint" + var ); + self.run_combatanim = level.scr_anim[ self.animname ][ "sprint" + var ]; + break; + } + } + self.needs_run_update = true; +} +check_water() +{ + for ( i = 0; i < level.water.size; i++ ) + { + level.water[i] thread water_trigger(); + level.water[i] thread wade_trigger(); + } +} +check_player_freeze() +{ + level waittill( "all_players_connected" ); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] thread water_watch_freeze(); + } +} +water_trigger() +{ + self endon( "death" ); + while ( 1 ) + { + self waittill( "trigger", who ); + if ( IsPlayer( who ) && who.sessionstate != "spectator") + { + self thread trigger_thread( who, ::water_player_in, ::water_player_out ); + } + } +} +update_hud_elem(player) +{ + player endon("disconnect"); + player endon("death"); + while(1) + { + wait(0.1); + player notify("update_frost_state"); + } +} +water_debug_hud_elem_thread(player) +{ + player endon("disconnect"); + player endon("death"); + self thread update_hud_elem(player); + while(1) + { + if(IsDefined(player._in_coast_water)) + { + self SetValue(player._in_coast_water); + PrintLn("player " + player GetEntityNumber() + " updates hud"); + } + player waittill("update_frost_state"); + } +} +water_player_in( e_player, endon_condition ) +{ + if( !IsDefined( e_player._in_coast_water ) || e_player._in_coast_water == 0) + { + e_player._in_coast_water = 0; + e_player thread water_watch_player_frost_state(); + } + e_player._in_coast_water++; +} +water_player_out( e_player ) +{ + if(e_player._in_coast_water > 0) + { + e_player._in_coast_water--; + } +} +water_watch_player_frost_state() +{ + self endon( "death" ); + self endon( "disconnect" ); + self endon( "spawned_spectator" ); + frost = 0; + self ClearClientFlag( level._CF_PLAYER_WATER_FROST ); + self thread play_cold_dialog_while_inwater(); + while( IsDefined( self ) && IsAlive( self ) ) + { + if( frost ) + { + if( IsDefined( self._in_coast_water ) && self._in_coast_water < 1 ) + { + self notify( "frost_reset_off" ); + self ClearClientFlag( level._CF_PLAYER_WATER_FROST ); + frost = 0; + return; + } + } + else + { + if( IsDefined( self._in_coast_water ) && self._in_coast_water > 0 ) + { + self SetClientFlag( level._CF_PLAYER_WATER_FROST ); + frost = 1; + } + } + self wait_to_update_frost_state(); + } +} +wait_to_update_frost_state() +{ + self endon("disconnect"); + self endon("update_frost_state"); + wait(0.1); +} +water_frost_bleed_out_reset() +{ + self SetClientFlag( level._CF_PLAYER_WATER_FROST_REMOVE ); + wait_network_frame(); + self._in_coast_water = 0; + self notify("update_frost_state"); + wait_network_frame(); + self ClearClientFlag( level._CF_PLAYER_WATER_FROST_REMOVE ); + wait_network_frame(); + wait_network_frame(); +} +water_damage_zombie() +{ + self endon( "death" ); + if ( is_true( self.ignore_water_damage ) ) + { + return; + } + players = getplayers(); + if( !isDefined( self.is_freezing ) ) + { + self.is_freezing = 1; + wait( 3 ); + if ( isDefined( self.is_freezing ) ) + { + freeze_health = level.zombie_health * level.water_zombie_percent; + if ( self.health <= freeze_health ) + { + self.water_damage = true; + if ( players.size > 0 ) + { + self dodamage( freeze_health, self.origin, players[0] ); + } + else + { + self dodamage( freeze_health, self.origin ); + } + } + self.is_freezing = undefined; + } + } +} +wade_trigger() +{ + while(1) + { + self waittill( "trigger", who ); + if ( isplayer( who ) && ( !IsDefined( who._wading_active ) || !who._wading_active ) ) + { + who thread wade_audio( self ); + } + } +} +wade_audio( trigger ) +{ + self endon( "death" ); + self endon( "disconnect" ); + if( !IsDefined( self._wading_active ) || !self._wading_active ) + { + self._wading_active = true; + self.is_wading = true; + ent1 = Spawn( "script_origin", self.origin ); + ent2 = Spawn( "script_origin", self.origin ); + ent1 LinkTo( self ); + ent2 LinkTo( self ); + self thread monitor_player_movement(); + while( self IsTouching( trigger ) ) + { + if( self.is_wading ) + { + ent2 StopLoopSound( 1 ); + ent1 PlayLoopSound( "zmb_wade", 1 ); + } + else + { + ent1 StopLoopSound( 1 ); + ent2 PlayLoopSound( "zmb_wade_idle", 1 ); + } + wait(.1); + } + self._wading_active = false; + ent1 StopLoopSound( 1 ); + ent2 StopLoopSound( 1 ); + wait(1); + ent1 Delete(); + ent2 Delete(); + } +} +monitor_player_movement() +{ + self endon( "disconnect" ); + self endon( "death" ); + while( self._wading_active ) + { + org_1 = self.origin; + wait(.1); + org_2 = self.origin; + distancemoved = distanceSquared( org_1, org_2 ); + if(distancemoved > 2*2) + { + self.is_wading = true; + } + else + { + self.is_wading = false; + } + } +} +play_cold_dialog_while_inwater() +{ + self notify( "audio_coldwater_dupe" ); + self endon( "audio_coldwater_dupe" ); + self endon( "disconnect" ); + self endon( "death" ); + self endon( "spawned_spectator" ); + self endon( "joined_spectators" ); + wait(RandomIntRange(2,5)); + while( IsDefined( self._in_coast_water ) && self._in_coast_water > 0 ) + { + while( is_true( self.is_frozen ) ) + { + wait(1); + } + rand = RandomIntRange(0,101); + if( !IsAlive( self ) || ( IsDefined( self.sessionstate ) && is_true( self.sessionstate == "spectator" ) ) ) + { + return; + } + if( rand >= 25 ) + { + self maps\_zombiemode_audio::create_and_play_dialog( "general", "water_damage" ); + } + wait(RandomIntRange(15,30)); + } +} +water_watch_freeze() +{ + self endon( "death" ); + self endon( "disconnect" ); + self notify("water_watch_freeze_start"); + self endon("water_watch_freeze_start"); + time_in_water = 0; + time_to_freeze = 30000; + if ( is_true( level.debug_water ) ) + { + time_to_freeze = 3000; + } + startTime = GetTime(); + nextTime = GetTime(); + while ( 1 ) + { + if ( isDefined( self._in_coast_water ) ) + { + diff = nextTime - startTime; + if ( self._in_coast_water > 0 ) + { + time_in_water += diff; + if ( time_in_water > time_to_freeze ) + { + self PlayLoopSound("zmb_ice_effect_loop" , 2); + self thread water_player_freeze(); + return; + } + } + else + { + if ( time_in_water > 0 ) + { + time_in_water -= diff; + if ( time_in_water < 0 ) + { + self StopLoopSound(2); + time_in_water = 0; + } + } + } + } + startTime = GetTime(); + wait(0.1); + nextTime = GetTime(); + } +} +water_player_freeze() +{ + self endon( "death" ); + self endon( "disconnect" ); + self.is_frozen = true; + self EnableInvulnerability(); + self FreezeControls( true ); + self StopLoopSound(2); + ice_trigger = spawn( "trigger_damage", self.origin, 0, 15, 72 ); + ice_trigger enablelinkto(); + ice_trigger linkto( self ); + self.ice_trigger = ice_trigger; + self SetClientFlag( level._CF_PLAYER_WATER_FREEZE ); + self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "water_frozen" ); + self thread water_player_free( ice_trigger ); +} +water_player_free( ice_trigger ) +{ + self endon( "death" ); + self endon( "disconnect" ); + ice_trigger waittill( "damage" ); + self PlaySound("zmb_ice_shatter"); + self.is_frozen = false; + self DisableInvulnerability(); + self FreezeControls( false ); + if ( isDefined( self.ice_trigger ) ) + { + self.ice_trigger delete(); + self.ice_trigger = undefined; + } + self ClearClientFlag( level._CF_PLAYER_WATER_FREEZE ); + self thread water_watch_freeze(); +} + + + + + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_cod5_asylum.gsc b/BO1/PC/ZM/maps/zombie_cod5_asylum.gsc new file mode 100644 index 0000000..04a5643 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_cod5_asylum.gsc @@ -0,0 +1,1289 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_zone_manager; +#include maps\_music; +#using_animtree("generic_human"); +main() +{ + maps\zombie_cod5_asylum_fx::main(); + PreCacheModel( "viewmodel_usa_pow_arms" ); + PreCacheModel( "viewmodel_rus_prisoner_arms" ); + PreCacheModel( "viewmodel_vtn_nva_standard_arms" ); + PreCacheModel( "viewmodel_usa_hazmat_arms" ); + PreCacheModel( "zombie_asylum_chair_nogore" ); + PreCacheModel( "zombie_power_lever_handle" ); + level thread maps\_callbacksetup::SetupCallbacks(); + level.dogs_enabled = false; + level.zones = []; + precacheshellshock("electrocution"); + level.door_dialog_function = maps\_zombiemode::play_door_dialog; + level.custom_zombie_vox = ::setup_custom_vox; + precachemodel("tag_origin"); + precachemodel("zombie_zapper_power_box"); + precachemodel("zombie_zapper_power_box_on"); + precachemodel("zombie_zapper_cagelight_red"); + precachemodel("zombie_zapper_cagelight_green"); + precachemodel("lights_tinhatlamp_off"); + precachemodel("lights_tinhatlamp_on"); + precachemodel("lights_indlight_on"); + precachemodel("lights_indlight"); + level.valve_hint_north = (&"WAW_ZOMBIE_BUTTON_NORTH_FLAMES"); + level.valve_hint_south = (&"WAW_ZOMBIE_BUTTON_NORTH_FLAMES"); + precachestring(level.valve_hint_north); + precachestring(level.valve_hint_south); + precachestring(&"WAW_ZOMBIE_BETTY_ALREADY_PURCHASED"); + precachestring(&"WAW_ZOMBIE_BETTY_HOWTO"); + precachestring(&"WAW_ZOMBIE_FLAMES_UNAVAILABLE"); + precachestring(&"WAW_ZOMBIE_USE_AUTO_TURRET"); + precachestring(&"WAW_ZOMBIE_ELECTRIC_SWITCH"); + precachestring(&"WAW_ZOMBIE_INTRO_ASYLUM_LEVEL_BERLIN"); + precachestring(&"WAW_ZOMBIE_INTRO_ASYLUM_LEVEL_HIMMLER"); + precachestring(&"WAW_ZOMBIE_INTRO_ASYLUM_LEVEL_SEPTEMBER"); + include_weapons(); + include_powerups(); + if(getdvar("light_mode") != "") + { + return; + } + level._effect["zombie_grain"] = LoadFx( "misc/fx_zombie_grain_cloud" ); + maps\_waw_zombiemode_radio::init(); + level.Player_Spawn_func = ::spawn_point_override; + level.zombiemode_precache_player_model_override = ::precache_player_model_override; + level.zombiemode_give_player_model_override = ::give_player_model_override; + level.zombiemode_player_set_viewmodel_override = ::player_set_viewmodel_override; + level.register_offhand_weapons_for_level_defaults_override = ::register_offhand_weapons_for_level_defaults_override; + level.use_zombie_heroes = true; + maps\_zombiemode::main(); + level.zone_manager_init_func = ::asylum_zone_init; + init_zones[0] = "west_downstairs_zone"; + init_zones[1] = "west2_downstairs_zone"; + level thread maps\_zombiemode_zone_manager::manage_zones( init_zones ); + level.burning_zombies = []; + level.electrocuted_zombies = []; + init_sounds(); + level thread master_electric_switch(); + init_zombie_asylum(); + level thread intro_screen(); + level thread toilet_useage(); + level thread chair_useage(); + level thread magic_box_light(); + level thread mature_settings_changes(); + maps\_zombiemode_betty::init(); + level.zombie_visionset = "zombie_asylum"; + maps\createart\zombie_cod5_asylum_art::main(); + level.has_pack_a_punch = false; +} +asylum_zone_init() +{ + flag_init( "always_on" ); + flag_set( "always_on" ); + add_adjacent_zone( "west_downstairs_zone", "west2_downstairs_zone", "power_on" ); + add_adjacent_zone( "west2_downstairs_zone", "north_downstairs_zone", "north_door1" ); + add_adjacent_zone( "north_downstairs_zone", "north_upstairs_zone", "north_upstairs_blocker" ); + add_adjacent_zone( "north_upstairs_zone", "north2_upstairs_zone", "upstairs_north_door1" ); + add_adjacent_zone( "north2_upstairs_zone", "kitchen_upstairs_zone", "upstairs_north_door2" ); + add_adjacent_zone( "kitchen_upstairs_zone", "power_upstairs_zone", "magic_box_north" ); + add_adjacent_zone( "west_downstairs_zone", "south_upstairs_zone", "south_upstairs_blocker" ); + add_adjacent_zone( "south_upstairs_zone", "south2_upstairs_zone", "south_access_1" ); + add_adjacent_zone( "south2_upstairs_zone", "power_upstairs_zone", "magic_box_south" ); +} +precache_player_model_override() +{ + mptype\player_t5_zm_theater::precache(); +} +give_player_model_override( entity_num ) +{ + if( IsDefined( self.zm_random_char ) ) + { + entity_num = self.zm_random_char; + } + switch( entity_num ) + { + case 0: + character\c_usa_dempsey_zt::main(); + break; + case 1: + character\c_rus_nikolai_zt::main(); + break; + case 2: + character\c_jap_takeo_zt::main(); + break; + case 3: + character\c_ger_richtofen_zt::main(); + break; + } +} +player_set_viewmodel_override( entity_num ) +{ + switch( self.entity_num ) + { + case 0: + self SetViewModel( "viewmodel_usa_pow_arms" ); + break; + case 1: + self SetViewModel( "viewmodel_rus_prisoner_arms" ); + break; + case 2: + self SetViewModel( "viewmodel_vtn_nva_standard_arms" ); + break; + case 3: + self SetViewModel( "viewmodel_usa_hazmat_arms" ); + break; + } +} +register_offhand_weapons_for_level_defaults_override() +{ + register_lethal_grenade_for_level( "stielhandgranate" ); + level.zombie_lethal_grenade_player_init = "stielhandgranate"; + register_tactical_grenade_for_level( "zombie_cymbal_monkey" ); + level.zombie_tactical_grenade_player_init = undefined; + register_placeable_mine_for_level( "mine_bouncing_betty" ); + level.zombie_placeable_mine_player_init = undefined; + register_melee_weapon_for_level( "knife_zm" ); + level.zombie_melee_weapon_player_init = "knife_zm"; +} +player_zombie_awareness() +{ + self endon("disconnect"); + self endon("death"); + while(1) + { + wait(1); + zombie = get_closest_ai(self.origin,"axis"); + if(!isDefined(zombie) || !isDefined(zombie.zombie_move_speed) ) + { + continue; + } + dist = 200; + switch(zombie.zombie_move_speed) + { + case "walk": dist = 200;break; + case "run": dist = 250; break; + case "sprint": dist = 275;break; + } + if(distance2d(zombie.origin,self.origin) < dist) + { + yaw = self animscripts\zombie_utility::GetYawToSpot(zombie.origin ); + if(yaw < -95 || yaw > 95) + { + zombie playsound ("behind_vocals"); + } + } + } +} +intro_screen() +{ + flag_wait( "all_players_connected" ); + wait(2); + level.intro_hud = []; + for(i = 0; i < 3; i++) + { + level.intro_hud[i] = newHudElem(); + level.intro_hud[i].x = 0; + level.intro_hud[i].y = 0; + level.intro_hud[i].alignX = "left"; + level.intro_hud[i].alignY = "bottom"; + level.intro_hud[i].horzAlign = "left"; + level.intro_hud[i].vertAlign = "bottom"; + level.intro_hud[i].foreground = true; + if ( level.splitscreen && !level.hidef ) + { + level.intro_hud[i].fontScale = 2.75; + } + else + { + level.intro_hud[i].fontScale = 1.75; + } + level.intro_hud[i].alpha = 0.0; + level.intro_hud[i].color = (1, 1, 1); + level.intro_hud[i].inuse = false; + } + level.intro_hud[0].y = -110; + level.intro_hud[1].y = -90; + level.intro_hud[2].y = -70; + level.intro_hud[0] settext(&"WAW_ZOMBIE_INTRO_ASYLUM_LEVEL_BERLIN"); + level.intro_hud[1] settext(&"WAW_ZOMBIE_INTRO_ASYLUM_LEVEL_HIMMLER"); + level.intro_hud[2] settext(&"WAW_ZOMBIE_INTRO_ASYLUM_LEVEL_SEPTEMBER"); + for(i = 0 ; i < 3; i++) + { + level.intro_hud[i] FadeOverTime( 1.5 ); + level.intro_hud[i].alpha = 1; + wait(1.5); + } + wait(1.5); + for(i = 0 ; i < 3; i++) + { + level.intro_hud[i] FadeOverTime( 1.5 ); + level.intro_hud[i].alpha = 0; + wait(1.5); + } + for(i = 0 ; i < 3; i++) + { + level.intro_hud[i] destroy(); + } + level thread magic_box_limit_location_init(); +} +play_pa_system() +{ + clientnotify("switch_flipped_generator"); + speakerA = getstruct("loudspeaker", "targetname"); + playsoundatposition("alarm", speakerA.origin); + level thread play_comp_sounds(); + generator_arc = getent("generator_arc", "targetname"); + generator_arc playloopsound("gen_arc_loop"); + wait(4.0); + generator = getent("generator_origin", "targetname"); + generator playloopsound("generator_loop"); + wait(8.0); + playsoundatposition ("amb_pa_system", speakerA.origin); +} +play_comp_sounds() +{ + computer = getent("comp", "targetname"); + computer playsound ("comp_start"); + wait(6); + computer playloopsound("comp_loop"); +} +init_zombie_asylum() +{ + level.magic_box_uses = 1; + flag_init("both_doors_opened"); + flag_init("electric_switch_used"); + flag_set("spawn_point_override"); + level thread init_elec_trap_trigs(); + level thread init_lights(); + water_trigs = getentarray("waterfall","targetname"); + array_thread(water_trigs,::watersheet_on_trigger); +} +init_lights() +{ + tinhats = []; + arms = []; + ents = getentarray("elect_light_model","targetname"); + for(i=0;i 70*70) + { + timer = 0; + continue; + } + if(dist < 70*70 && timer < 3) + { + wait(0.5); + timer ++; + } + if(dist < 70*70 && timer == 3) + { + wait(3); + self notify ("warning_dialog"); + } + } + } +} +hint_string( string ) +{ + self SetHintString( string ); + self SetCursorHint( "HINT_NOICON" ); +} +electric_trap_think() +{ + self.is_available = undefined; + self.zombie_cost = 1000; + self.in_use = 0; + self sethintstring( &"ZOMBIE_NEED_POWER" ); + self SetCursorHint( "HINT_NOICON" ); + flag_wait( "power_on" ); + while(1) + { + self sethintstring( &"ZOMBIE_BUTTON_BUY_TRAP", self.zombie_cost ); + self waittill("trigger",who); + if( who in_revive_trigger() ) + { + continue; + } + if(!isDefined(self.is_available)) + { + continue; + } + if( is_player_valid( who ) ) + { + if( who.score >= self.zombie_cost ) + { + if(!self.in_use) + { + self.in_use = 1; + play_sound_at_pos( "purchase", who.origin ); + self thread electric_trap_move_switch(self); + self waittill("switch_activated"); + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); + self sethintstring( &"ZOMBIE_TRAP_ACTIVE" ); + self.zombie_dmg_trig = getent(self.target,"targetname"); + self.zombie_dmg_trig trigger_on(); + self thread activate_electric_trap(); + self waittill("elec_done"); + clientnotify(self.script_string +"off"); + if(isDefined(self.fx_org)) + { + self.fx_org delete(); + } + if(isDefined(self.zapper_fx_org)) + { + self.zapper_fx_org delete(); + } + if(isDefined(self.zapper_fx_switch_org)) + { + self.zapper_fx_switch_org delete(); + } + self.zombie_dmg_trig trigger_off(); + self sethintstring( &"ZOMBIE_TRAP_COOLDOWN" ); + wait(25); + speakerA = getstruct("loudspeaker", "targetname"); + playsoundatposition("warning", speakera.origin); + self notify("available"); + self.in_use = 0; + } + } + } + } +} +electric_trap_move_switch(parent) +{ + tswitch = getent(parent.script_linkto,"script_linkname"); + if(tswitch.script_linkname == "4") + { + north_zapper_light_red(); + tswitch rotatepitch(-180,.5); + tswitch playsound("amb_sparks_l_b"); + tswitch waittill("rotatedone"); + self notify("switch_activated"); + self waittill("available"); + tswitch rotatepitch(180,.5); + north_zapper_light_green(); + } + else + { + south_zapper_light_red(); + tswitch rotatepitch(180,.5); + tswitch playsound("amb_sparks_l_b"); + tswitch waittill("rotatedone"); + self notify("switch_activated"); + self waittill("available"); + tswitch rotatepitch(-180,.5); + south_zapper_light_green(); + } +} +activate_electric_trap() +{ + if(isDefined(self.script_string) && self.script_string == "north") + { + machine = getent("zap_machine_north","targetname"); + machine setmodel("zombie_zapper_power_box_on"); + clientnotify("north"); + } + else + { + machine = getent("zap_machine_south","targetname"); + machine setmodel("zombie_zapper_power_box_on"); + clientnotify("south"); + } + clientnotify(self.target); + fire_points = getstructarray(self.target,"targetname"); + for(i=0;i 90 && level.burning_zombies.size < 6) + { + level.burning_zombies[level.burning_zombies.size] = self; + self thread zombie_flame_watch(); + self playsound("zmb_ignite"); + self thread animscripts\zombie_death::flame_death_fx(); + wait(randomfloat(1.25)); + } + else + { + refs[0] = "guts"; + refs[1] = "right_arm"; + refs[2] = "left_arm"; + refs[3] = "right_leg"; + refs[4] = "left_leg"; + refs[5] = "no_legs"; + refs[6] = "head"; + self.a.gib_ref = refs[randomint(refs.size)]; + playsoundatposition("zmb_zombie_arc", self.origin); + if(randomint(100) > 40 ) + { + self thread electroctute_death_fx(); + self thread play_elec_vocals(); + } + wait(randomfloat(1.25)); + self playsound("zmb_zombie_arc"); + } + self dodamage(self.health + 666, self.origin); +} +zombie_flame_watch() +{ + self waittill("death"); + self stoploopsound(); + level.burning_zombies = array_remove_nokeys(level.burning_zombies,self); +} +spawn_point_override() +{ + flag_wait( "all_players_connected" ); + players = get_players(); + north_structs = getstructarray("north_spawn","script_noteworthy"); + south_structs = getstructarray("south_spawn","script_noteworthy"); + side1 = north_structs; + side2 = south_structs; + if(randomint(100)>50) + { + side1 = south_structs; + side2 = north_structs; + } + for( i = 0; i < players.size; i++ ) + { + if(i<2) + { + players[i] setorigin( side1[i].origin ); + players[i] setplayerangles( side1[i].angles ); + players[i].respawn_point = side1[i]; + players[i].spawn_side = side1[i].script_noteworthy; + players[i].spectator_respawn = side1[i]; + } + else + { + players[i] setorigin( side2[i].origin); + players[i] setplayerangles( side2[i].angles); + players[i].respawn_point = side2[i]; + players[i].spawn_side = side2[i].script_noteworthy; + players[i].spectator_respawn = side2[i]; + } + } +} +disable_bump_trigger(triggername) +{ + triggers = GetEntArray( "audio_bump_trigger", "targetname"); + if(IsDefined (triggers)) + { + for(i=0;i= level.teleport_cost && !level.is_cooldown ) + { + for ( i = 0; i < level.teleporter_pad_trig.size; i++ ) + { + level.teleporter_pad_trig[i] teleport_trigger_invisible( true ); + } + user maps\_zombiemode_score::minus_to_player_score( level.teleport_cost ); + self player_teleporting( index ); + } + } +} +player_teleporting( index ) +{ + time_since_last_teleport = GetTime() - level.teleport_time; + teleport_pad_start_exploder( index ); + exploder( 105 ); + ClientNotify( "tpw" + index ); + self thread teleport_pad_player_fx( level.teleport_delay ); + self thread teleport_2d_audio(); + self thread teleport_nuke( 20, 300); + wait( level.teleport_delay ); + self notify( "fx_done" ); + teleport_pad_end_exploder( index ); + self teleport_players(); + ClientNotify( "tpc" + index ); + if ( level.is_cooldown == false ) + { + thread pad_manager(); + } + wait( 2.0 ); + ss = getstruct( "teleporter_powerup", "targetname" ); + if ( IsDefined( ss ) ) + { + ss thread maps\_zombiemode_powerups::special_powerup_drop(ss.origin); + } + if ( time_since_last_teleport < 60000 && level.active_links == 3 && level.round_number > 20 ) + { + dog_spawners = GetEntArray( "special_dog_spawner", "targetname" ); + maps\_zombiemode_ai_dogs::special_dog_spawn( undefined, 4 ); + thread play_sound_2d( "sam_nospawn" ); + } + level.teleport_time = GetTime(); +} +teleport_pad_start_exploder( index ) +{ + switch ( index ) + { + case 0: + exploder( 202 ); + break; + case 1: + exploder( 302 ); + break; + case 2: + exploder( 402 ); + break; + } +} +teleport_pad_end_exploder( index ) +{ + switch ( index ) + { + case 0: + exploder( 201 ); + break; + case 1: + exploder( 301 ); + break; + case 2: + exploder( 401 ); + break; + } +} +teleport_trigger_invisible( enable ) +{ + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + self SetInvisibleToPlayer( players[i], enable ); + } + } +} +player_is_near_pad( player ) +{ + radius = 88; + scale_factor = 2; + dist = Distance2D( player.origin, self.origin ); + dist_touching = radius * scale_factor; + if ( dist < dist_touching ) + { + return true; + } + return false; +} +teleport_pad_player_fx( delay ) +{ + self endon( "fx_done" ); + while ( 1 ) + { + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + if ( self player_is_near_pad( players[i] ) ) + { + players[i] SetTransported( delay ); + } + else + { + players[i] SetTransported( 0 ); + } + } + } + wait ( .05 ); + } +} +teleport_players() +{ + player_radius = 16; + players = getplayers(); + core_pos = []; + occupied = []; + image_room = []; + players_touching = []; + player_idx = 0; + prone_offset = (0, 0, 49); + crouch_offset = (0, 0, 20); + stand_offset = (0, 0, 0); + for ( i = 0; i < 4; i++ ) + { + core_pos[i] = getent( "origin_teleport_player_" + i, "targetname" ); + occupied[i] = false; + image_room[i] = getent( "teleport_room_" + i, "targetname" ); + if ( isdefined( players[i] ) ) + { + players[i] settransported( 0 ); + if ( self player_is_near_pad( players[i] ) ) + { + players_touching[player_idx] = i; + player_idx++; + if ( isdefined( image_room[i] ) ) + { + players[i] disableOffhandWeapons(); + players[i] disableweapons(); + if( players[i] getstance() == "prone" ) + { + desired_origin = image_room[i].origin + prone_offset; + } + else if( players[i] getstance() == "crouch" ) + { + desired_origin = image_room[i].origin + crouch_offset; + } + else + { + desired_origin = image_room[i].origin + stand_offset; + } + players[i].teleport_origin = spawn( "script_origin", players[i].origin ); + players[i].teleport_origin.angles = players[i].angles; + players[i] linkto( players[i].teleport_origin ); + players[i].teleport_origin.origin = desired_origin; + players[i] FreezeControls( true ); + wait_network_frame(); + if( IsDefined( players[i] ) ) + { + setClientSysState( "levelNotify", "black_box_start", players[i] ); + players[i].teleport_origin.angles = image_room[i].angles; + } + } + } + } + } + wait( 2 ); + core = GetEnt( "trigger_teleport_core", "targetname" ); + core thread teleport_nuke( undefined, 300); + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + for ( j = 0; j < 4; j++ ) + { + if ( !occupied[j] ) + { + dist = Distance2D( core_pos[j].origin, players[i].origin ); + if ( dist < player_radius ) + { + occupied[j] = true; + } + } + } + setClientSysState( "levelNotify", "black_box_end", players[i] ); + } + } + wait_network_frame(); + for ( i = 0; i < players_touching.size; i++ ) + { + player_idx = players_touching[i]; + player = players[player_idx]; + if ( !IsDefined( player ) ) + { + continue; + } + slot = i; + start = 0; + while ( occupied[slot] && start < 4 ) + { + start++; + slot++; + if ( slot >= 4 ) + { + slot = 0; + } + } + occupied[slot] = true; + pos_name = "origin_teleport_player_" + slot; + teleport_core_pos = getent( pos_name, "targetname" ); + player unlink(); + assert( IsDefined( player.teleport_origin ) ); + player.teleport_origin delete(); + player.teleport_origin = undefined; + player enableweapons(); + player enableoffhandweapons(); + player setorigin( core_pos[slot].origin ); + player setplayerangles( core_pos[slot].angles ); + player FreezeControls( false ); + player thread teleport_aftereffects(); + vox_rand = randomintrange(1,100); + if( vox_rand <= 2 ) + { + } + else + { + } + } + exploder( 106 ); +} +teleport_core_hint_update() +{ + self setcursorhint( "HINT_NOICON" ); + while ( 1 ) + { + if ( !flag( "power_on" ) ) + { + self sethintstring( &"WAW_ZOMBIE_FLAMES_UNAVAILABLE" ); + } + else if ( teleport_pads_are_active() ) + { + self sethintstring( &"WAW_ZOMBIE_LINK_TPAD" ); + } + else if ( level.active_links == 0 ) + { + self sethintstring( &"WAW_ZOMBIE_INACTIVE_TPAD" ); + } + else + { + self sethintstring( "" ); + } + wait( .05 ); + } +} +teleport_core_think() +{ + trigger = getent( "trigger_teleport_core", "targetname" ); + if ( isdefined( trigger ) ) + { + trigger thread teleport_core_hint_update(); + flag_wait( "power_on" ); + while ( 1 ) + { + if ( teleport_pads_are_active() ) + { + cheat = false; + if ( !cheat ) + { + trigger waittill( "trigger" ); + } + for ( i = 0; i < level.teleport.size; i++ ) + { + if ( isdefined( level.teleport[i] ) ) + { + if ( level.teleport[i] == "timer_on" ) + { + level.teleport[i] = "active"; + level.active_links++; + flag_set( "teleporter_pad_link_"+level.active_links ); + ClientNotify( "scd" + i ); + teleport_core_start_exploder( i ); + if ( level.active_links == 3 ) + { + exploder( 101 ); + ClientNotify( "pap1" ); + teleporter_vo( "linkall", trigger ); + Earthquake( 0.3, 2.0, trigger.origin, 3700 ); + } + pad = "trigger_teleport_pad_" + i; + trigger_pad = getent( pad, "targetname" ); + trigger_pad stop_countdown(); + ClientNotify( "TRs" ); + level.active_timer = -1; + } + } + } + } + wait( .05 ); + } + } +} +stop_countdown() +{ + self notify( "stop_countdown" ); + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + players[i] notify( "stop_countdown" ); + } +} +teleport_pads_are_active() +{ + if ( isdefined( level.teleport ) ) + { + for ( i = 0; i < level.teleport.size; i++ ) + { + if ( isdefined( level.teleport[i] ) ) + { + if ( level.teleport[i] == "timer_on" ) + { + return true; + } + } + } + } + return false; +} +teleport_core_start_exploder( index ) +{ + switch ( index ) + { + case 0: + exploder( 102 ); + break; + case 1: + exploder( 103 ); + break; + case 2: + exploder( 104 ); + break; + } +} +teleport_2d_audio() +{ + self endon( "fx_done" ); + while ( 1 ) + { + players = getplayers(); + wait(1.7); + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + if ( self player_is_near_pad( players[i] ) ) + { + setClientSysState("levelNotify", "t2d", players[i]); + } + } + } + } +} +teleport_nuke( max_zombies, range ) +{ + zombies = getaispeciesarray("axis"); + zombies = get_array_of_closest( self.origin, zombies, undefined, max_zombies, range ); + for (i = 0; i < zombies.size; i++) + { + wait (randomfloatrange(0.2, 0.3)); + if( !IsDefined( zombies[i] ) ) + { + continue; + } + if( is_magic_bullet_shield_enabled( zombies[i] ) ) + { + continue; + } + if( !( zombies[i].isdog ) ) + { + zombies[i] maps\_zombiemode_spawner::zombie_head_gib(); + } + zombies[i] dodamage( 10000, zombies[i].origin ); + playsoundatposition( "nuked", zombies[i].origin ); + } +} +teleporter_vo( tele_vo_type, location ) +{ + if( !isdefined( location )) + { + self thread teleporter_vo_play( tele_vo_type, 2 ); + } + else + { + players = get_players(); + for (i = 0; i < players.size; i++) + { + if (distance (players[i].origin, location.origin) < 64) + { + switch ( tele_vo_type ) + { + case "linkall": + players[i] thread teleporter_vo_play( "tele_linkall" ); + break; + case "countdown": + players[i] thread teleporter_vo_play( "tele_count", 3 ); + break; + } + } + } + } +} +teleporter_vo_play( vox_type, pre_wait ) +{ + if(!isdefined( pre_wait )) + { + pre_wait = 0; + } + wait(pre_wait); + self maps\_zombiemode_audio::create_and_play_dialog( "level", vox_type ); +} +play_tele_help_vox() +{ + level endon( "tele_help_end" ); + while(1) + { + self waittill("trigger", who); + if( flag( "power_on" ) ) + { + who thread teleporter_vo_play( "tele_help" ); + level notify( "tele_help_end" ); + } + while(IsDefined (who) && (who) IsTouching (self)) + { + wait(0.1); + } + } +} +play_packa_see_vox() +{ + wait(10); + if( !flag( "teleporter_pad_link_3" ) ) + { + self waittill("trigger", who); + who thread teleporter_vo_play( "perk_packa_see" ); + } +} +teleporter_wire_wait( index ) +{ + targ = getstruct( "pad_"+index+"_wire" ,"targetname"); + if ( !IsDefined( targ ) ) + { + return; + } + while(isDefined(targ)) + { + if(isDefined(targ.target)) + { + target = getstruct(targ.target,"targetname"); + wait( 0.1 ); + targ = target; + } + else + { + break; + } + } +} +teleport_aftereffects() +{ + if( GetDvar( "factoryAftereffectOverride" ) == "-1" ) + { + self thread [[ level.teleport_ae_funcs[RandomInt(level.teleport_ae_funcs.size)] ]](); + } + else + { + self thread [[ level.teleport_ae_funcs[int(GetDvar( "factoryAftereffectOverride" ))] ]](); + } +} +teleport_aftereffect_shellshock() +{ + println( "*** Explosion Aftereffect***\n" ); + self shellshock( "explosion", 4 ); +} +teleport_aftereffect_shellshock_electric() +{ + println( "***Electric Aftereffect***\n" ); + self shellshock( "electrocution", 4 ); +} +teleport_aftereffect_fov() +{ + setClientSysState( "levelNotify", "tae", self ); +} +teleport_aftereffect_bw_vision( localClientNum ) +{ + setClientSysState( "levelNotify", "tae", self ); +} +teleport_aftereffect_red_vision( localClientNum ) +{ + setClientSysState( "levelNotify", "tae", self ); +} +teleport_aftereffect_flashy_vision( localClientNum ) +{ + setClientSysState( "levelNotify", "tae", self ); +} +teleport_aftereffect_flare_vision( localClientNum ) +{ + setClientSysState( "levelNotify", "tae", self ); +} +packa_door_reminder() +{ + while( !flag( "teleporter_pad_link_3" ) ) + { + rand = randomintrange(4,16); + self playsound( "packa_door_hitch" ); + wait(rand); + } +} +dog_blocker_clip() +{ + collision = spawn("script_model", (-106, -2294, 216)); + collision setmodel("collision_wall_128x128x10"); + collision.angles = (0, 37.2, 0); + collision Hide(); + collision = spawn("script_model", (-1208, -439, 363)); + collision setmodel("collision_wall_128x128x10"); + collision.angles = (0, 0, 0); + collision Hide(); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_cod5_prototype.gsc b/BO1/PC/ZM/maps/zombie_cod5_prototype.gsc new file mode 100644 index 0000000..e113364 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_cod5_prototype.gsc @@ -0,0 +1,603 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_zone_manager; +main() +{ + maps\zombie_cod5_prototype_fx::main(); + PreCacheModel( "viewmodel_usa_pow_arms" ); + PreCacheModel( "viewmodel_rus_prisoner_arms" ); + PreCacheModel( "viewmodel_vtn_nva_standard_arms" ); + PreCacheModel( "viewmodel_usa_hazmat_arms" ); + level thread maps\_callbacksetup::SetupCallbacks(); + level.startInvulnerableTime = GetDvarInt( "player_deathInvulnerableTime" ); + include_weapons(); + include_powerups(); + level.zones = []; + level._effect["zombie_grain"] = LoadFx( "misc/fx_zombie_grain_cloud" ); + maps\_waw_zombiemode_radio::init(); + level.zombiemode_precache_player_model_override = ::precache_player_model_override; + level.zombiemode_give_player_model_override = ::give_player_model_override; + level.zombiemode_player_set_viewmodel_override = ::player_set_viewmodel_override; + level.register_offhand_weapons_for_level_defaults_override = ::register_offhand_weapons_for_level_defaults_override; + level.use_zombie_heroes = true; + flag_init( "_start_zm_pistol_rank" ); + SetDvar( "magic_chest_movable", "0" ); + maps\_zombiemode::main(); + level.zone_manager_init_func = ::prototype_zone_init; + init_zones[0] = "start_zone"; + level thread maps\_zombiemode_zone_manager::manage_zones( init_zones ); + init_sounds(); + thread above_couches_death(); + thread above_roof_death(); + thread below_ground_death(); + level.zombie_visionset = "zombie_prototype"; + maps\createart\zombie_cod5_prototype_art::main(); + level thread check_solo_game(); + level thread setup_weapon_cabinet(); + level thread maps\_interactive_objects::main(); + level thread prototype_eggs(); + level thread time_to_play(); + level thread pistol_rank_setup(); + level.has_pack_a_punch = false; +} +precache_player_model_override() +{ + mptype\player_t5_zm_theater::precache(); +} +give_player_model_override( entity_num ) +{ + if( IsDefined( self.zm_random_char ) ) + { + entity_num = self.zm_random_char; + } + switch( entity_num ) + { + case 0: + character\c_usa_dempsey_zt::main(); + break; + case 1: + character\c_rus_nikolai_zt::main(); + break; + case 2: + character\c_jap_takeo_zt::main(); + break; + case 3: + character\c_ger_richtofen_zt::main(); + break; + } +} +player_set_viewmodel_override( entity_num ) +{ + switch( self.entity_num ) + { + case 0: + self SetViewModel( "viewmodel_usa_pow_arms" ); + break; + case 1: + self SetViewModel( "viewmodel_rus_prisoner_arms" ); + break; + case 2: + self SetViewModel( "viewmodel_vtn_nva_standard_arms" ); + break; + case 3: + self SetViewModel( "viewmodel_usa_hazmat_arms" ); + break; + } +} +register_offhand_weapons_for_level_defaults_override() +{ + register_lethal_grenade_for_level( "stielhandgranate" ); + level.zombie_lethal_grenade_player_init = "stielhandgranate"; + register_tactical_grenade_for_level( "zombie_cymbal_monkey" ); + level.zombie_tactical_grenade_player_init = undefined; + register_placeable_mine_for_level( "mine_bouncing_betty" ); + level.zombie_placeable_mine_player_init = undefined; + register_melee_weapon_for_level( "knife_zm" ); + level.zombie_melee_weapon_player_init = "knife_zm"; +} +setup_weapon_cabinet() +{ + weapon_cabs = GetEntArray( "weapon_cabinet_use", "targetname" ); + for( i = 0; i < weapon_cabs.size; i++ ) + { + weapon_cabs[i] SetHintString( &"ZOMBIE_CABINET_OPEN_1500" ); + weapon_cabs[i] setCursorHint( "HINT_NOICON" ); + weapon_cabs[i] UseTriggerRequireLookAt(); + } + array_thread( weapon_cabs, ::weapon_cabinet_think ); +} +weapon_cabinet_think() +{ + weapons = getentarray( "cabinet_weapon", "targetname" ); + doors = getentarray( self.target, "targetname" ); + for( i = 0; i < doors.size; i++ ) + { + doors[i] NotSolid(); + } + self.has_been_used_once = false; + self thread maps\_zombiemode_weapons::decide_hide_show_hint(); + while( 1 ) + { + self waittill( "trigger", player ); + if( !player maps\_zombiemode_weapons::can_buy_weapon() ) + { + wait( 0.1 ); + continue; + } + cost = 1500; + if( self.has_been_used_once ) + { + cost = maps\_zombiemode_weapons::get_weapon_cost( self.zombie_weapon_upgrade ); + } + else + { + if( IsDefined( self.zombie_cost ) ) + { + cost = self.zombie_cost; + } + } + ammo_cost = maps\_zombiemode_weapons::get_ammo_cost( self.zombie_weapon_upgrade ); + if( !is_player_valid( player ) ) + { + player thread ignore_triggers( 0.5 ); + continue; + } + if( self.has_been_used_once ) + { + player_has_weapon = player maps\_zombiemode_weapons::has_weapon_or_upgrade( self.zombie_weapon_upgrade ); + if( !player_has_weapon ) + { + if( player.score >= cost ) + { + self play_sound_on_ent( "purchase" ); + player maps\_zombiemode_score::minus_to_player_score( cost ); + player maps\_zombiemode_weapons::weapon_give( self.zombie_weapon_upgrade ); + player maps\_zombiemode_weapons::check_collector_achievement( self.zombie_weapon_upgrade ); + } + else + { + play_sound_on_ent( "no_purchase" ); + player maps\_zombiemode_audio::create_and_play_dialog( "general", "no_money" ); + } + } + else if ( player.score >= ammo_cost ) + { + ammo_given = player maps\_zombiemode_weapons::ammo_give( self.zombie_weapon_upgrade ); + if( ammo_given ) + { + self play_sound_on_ent( "purchase" ); + player maps\_zombiemode_score::minus_to_player_score( ammo_cost ); + } + } + else + { + play_sound_on_ent( "no_purchase" ); + player maps\_zombiemode_audio::create_and_play_dialog( "general", "no_money" ); + } + } + else if( player.score >= cost ) + { + self.has_been_used_once = true; + self play_sound_on_ent( "purchase" ); + self SetHintString( &"WAW_ZOMBIE_WEAPONCOSTAMMO", cost, ammo_cost ); + self setCursorHint( "HINT_NOICON" ); + player maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); + doors = getentarray( self.target, "targetname" ); + for( i = 0; i < doors.size; i++ ) + { + if( doors[i].model == "dest_test_cabinet_ldoor_dmg0" ) + { + doors[i] thread weapon_cabinet_door_open( "left" ); + } + else if( doors[i].model == "dest_test_cabinet_rdoor_dmg0" ) + { + doors[i] thread weapon_cabinet_door_open( "right" ); + } + } + player_has_weapon = player maps\_zombiemode_weapons::has_weapon_or_upgrade( self.zombie_weapon_upgrade ); + if( !player_has_weapon ) + { + player maps\_zombiemode_weapons::weapon_give( self.zombie_weapon_upgrade ); + player maps\_zombiemode_weapons::check_collector_achievement( self.zombie_weapon_upgrade ); + } + else + { + if( player maps\_zombiemode_weapons::has_upgrade( self.zombie_weapon_upgrade ) ) + { + player maps\_zombiemode_weapons::ammo_give( self.zombie_weapon_upgrade+"_upgraded" ); + } + else + { + player maps\_zombiemode_weapons::ammo_give( self.zombie_weapon_upgrade ); + } + } + } + else + { + play_sound_on_ent( "no_purchase" ); + player maps\_zombiemode_audio::create_and_play_dialog( "general", "no_money" ); + } + } +} +weapon_cabinet_door_open( left_or_right ) +{ + if( left_or_right == "left" ) + { + self rotateyaw( 120, 0.3, 0.2, 0.1 ); + } + else if( left_or_right == "right" ) + { + self rotateyaw( -120, 0.3, 0.2, 0.1 ); + } +} +bad_area_fixes() +{ + thread disable_stances_in_zones(); +} +disable_stances_in_zones() +{ + players = get_players(); + for (i = 0; i < players.size; i++) + { + players[i] thread fix_hax(); + players[i] thread fix_couch_stuckspot(); + players[i] thread out_of_bounds_watcher(); + } +} +fix_hax() +{ + self endon("disconnect"); + self endon("death"); + check = 15; + check1 = 10; + while(1) + { + wait(.5); + if( distance2d(self.origin,( 101, -100, 40)) < check ) + { + self setorigin ( (101, -90, self.origin[2])); + } + else if( distance2d(self.origin, ( 816, 645, 12) ) < check ) + { + self setorigin ( (816, 666, self.origin[2]) ); + } + else if( distance2d( self.origin, (376, 643, 184) ) < check ) + { + self setorigin( (376, 665, self.origin[2]) ); + } + else if(distance2d(self.origin,(519 ,765, 155)) < check1) + { + self setorigin( (516, 793,self.origin[2]) ); + } + else if( distance2d(self.origin,(315 ,346, 79)) no_prone_zones.size) + { + array_check = no_prone_and_crouch_zones.size; + } + else + { + array_check = no_prone_zones.size; + } + for(i = 0; i < array_check; i++) + { + if (isdefined(no_prone_and_crouch_zones[i]) && + self is_within_volume(no_prone_and_crouch_zones[i]["min"][0], no_prone_and_crouch_zones[i]["max"][0], + no_prone_and_crouch_zones[i]["min"][1], no_prone_and_crouch_zones[i]["max"][1], + no_prone_and_crouch_zones[i]["min"][2], no_prone_and_crouch_zones[i]["max"][2])) + { + self allowprone(false); + self allowcrouch(false); + break; + } + else if (isdefined(no_prone_zones[i]) && + self is_within_volume(no_prone_zones[i]["min"][0], no_prone_zones[i]["max"][0], + no_prone_zones[i]["min"][1], no_prone_zones[i]["max"][1], + no_prone_zones[i]["min"][2], no_prone_zones[i]["max"][2])) + { + self allowprone(false); + break; + } + else + { + self allowprone(true); + self allowcrouch(true); + } + } + wait 0.05; + } +} +is_within_volume(min_x, max_x, min_y, max_y, min_z, max_z) +{ + if (self.origin[0] > max_x || self.origin[0] < min_x) + { + return false; + } + else if (self.origin[1] > max_y || self.origin[1] < min_y) + { + return false; + } + else if (self.origin[2] > max_z || self.origin[2] < min_z) + { + return false; + } + return true; +} +init_sounds() +{ + maps\_zombiemode_utility::add_sound( "break_stone", "break_stone" ); +} +include_weapons() +{ + include_weapon("python_zm"); + include_weapon("cz75_zm"); + include_weapon("g11_lps_zm"); + include_weapon("famas_zm"); + include_weapon("spectre_zm"); + include_weapon("cz75dw_zm"); + include_weapon("spas_zm"); + include_weapon("hs10_zm"); + include_weapon("aug_acog_zm"); + include_weapon("galil_zm"); + include_weapon("commando_zm"); + include_weapon("fnfal_zm"); + include_weapon("dragunov_zm"); + include_weapon("l96a1_zm"); + include_weapon("rpk_zm"); + include_weapon("hk21_zm"); + include_weapon("m72_law_zm"); + include_weapon("china_lake_zm"); + include_weapon("zombie_cymbal_monkey"); + include_weapon("ray_gun_zm"); + include_weapon("crossbow_explosive_zm"); + include_weapon("knife_ballistic_zm"); + include_weapon( "zombie_m1carbine", false, true ); + include_weapon( "zombie_thompson", false, true ); + include_weapon( "zombie_kar98k", false, true ); + include_weapon( "kar98k_scoped_zombie", false, true ); + include_weapon( "stielhandgranate", false, true ); + include_weapon( "zombie_doublebarrel", false, true ); + include_weapon( "zombie_doublebarrel_sawed", false, true ); + include_weapon( "zombie_shotgun", false, true ); + include_weapon( "zombie_bar", false, true ); + include_weapon( "zombie_cymbal_monkey"); + include_weapon( "ray_gun_zm" ); + include_weapon( "thundergun_zm" ); + include_weapon( "m1911_upgraded_zm", false ); + level._uses_retrievable_ballisitic_knives = true; + maps\_zombiemode_weapons::add_limited_weapon( "m1911_zm", 0 ); + maps\_zombiemode_weapons::add_limited_weapon( "thundergun_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "crossbow_explosive_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "knife_ballistic_zm", 1 ); + precacheItem( "explosive_bolt_zm" ); + precacheItem( "explosive_bolt_upgraded_zm" ); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_kar98k", "zombie_kar98k_upgraded", &"WAW_ZOMBIE_WEAPON_KAR98K_200", 200, "rifle"); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_type99_rifle", "", &"WAW_ZOMBIE_WEAPON_TYPE99_200", 200, "rifle" ); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_gewehr43", "zombie_gewehr43_upgraded", &"WAW_ZOMBIE_WEAPON_GEWEHR43_600", 600, "rifle" ); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_m1carbine","zombie_m1carbine_upgraded", &"WAW_ZOMBIE_WEAPON_M1CARBINE_600", 600, "rifle" ); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_m1garand", "zombie_m1garand_upgraded" , &"WAW_ZOMBIE_WEAPON_M1GARAND_600", 600, "rifle" ); + maps\_zombiemode_weapons::add_zombie_weapon( "stielhandgranate", "", &"WAW_ZOMBIE_WEAPON_STIELHANDGRANATE_250", 250, "grenade", "", 250 ); + maps\_zombiemode_weapons::add_zombie_weapon( "mine_bouncing_betty", "", &"WAW_ZOMBIE_WEAPON_SATCHEL_2000", 2000 ); + maps\_zombiemode_weapons::add_zombie_weapon( "kar98k_scoped_zombie", "", &"WAW_ZOMBIE_WEAPON_KAR98K_S_750", 750, "sniper"); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_stg44", "zombie_stg44_upgraded", &"WAW_ZOMBIE_WEAPON_STG44_1200", 1200, "mg" ); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_thompson", "zombie_thompson_upgraded", &"WAW_ZOMBIE_WEAPON_THOMPSON_1200", 1200, "mg" ); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_type100_smg", "zombie_type100_smg_upgraded", &"WAW_ZOMBIE_WEAPON_TYPE100_1000", 1000, "mg" ); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_fg42", "zombie_fg42_upgraded", &"WAW_ZOMBIE_WEAPON_FG42_1500", 1500, "mg" ); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_doublebarrel", "zombie_doublebarrel_upgraded", &"WAW_ZOMBIE_WEAPON_DOUBLEBARREL_1200", 1200, "shotgun"); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_doublebarrel_sawed", "", &"WAW_ZOMBIE_WEAPON_DOUBLEBARREL_SAWED_1200", 1200, "shotgun"); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_shotgun", "zombie_shotgun_upgraded", &"WAW_ZOMBIE_WEAPON_SHOTGUN_1500", 1500, "shotgun"); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_bar", "zombie_bar_upgraded", &"WAW_ZOMBIE_WEAPON_BAR_1800", 1800, "mg" ); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_bar_bipod", "", &"WAW_ZOMBIE_WEAPON_BAR_BIPOD_2500", 2500, "mg" ); +} +include_powerups() +{ + include_powerup( "nuke" ); + include_powerup( "insta_kill" ); + include_powerup( "double_points" ); + include_powerup( "full_ammo" ); + include_powerup( "carpenter" ); +} +above_couches_death() +{ + level endon ("junk purchased"); + while (1) + { + wait 0.2; + players = get_players(); + for (i = 0; i < players.size; i++) + { + if (players[i].origin[2] > 145) + { + setsaveddvar("player_deathInvulnerableTime", 0); + players[i] DoDamage( players[i].health + 1000, players[i].origin, undefined, undefined, "riflebullet" ); + setsaveddvar("player_deathInvulnerableTime", level.startInvulnerableTime); + } + } + } +} +above_roof_death() +{ + while (1) + { + wait 0.2; + players = get_players(); + for (i = 0; i < players.size; i++) + { + if (players[i].origin[2] > 235) + { + setsaveddvar("player_deathInvulnerableTime", 0); + players[i] DoDamage( players[i].health + 1000, players[i].origin, undefined, undefined, "riflebullet" ); + setsaveddvar("player_deathInvulnerableTime", level.startInvulnerableTime); + } + } + } +} +below_ground_death() +{ + while (1) + { + wait 0.2; + players = get_players(); + for (i = 0; i < players.size; i++) + { + if (players[i].origin[2] < -11) + { + setsaveddvar("player_deathInvulnerableTime", 0); + players[i] DoDamage( players[i].health + 1000, players[i].origin, undefined, undefined, "riflebullet" ); + setsaveddvar("player_deathInvulnerableTime", level.startInvulnerableTime); + } + } + } +} +out_of_bounds_watcher() +{ + self endon ("disconnect"); + outside_of_map = []; + outside_of_map[0]["min"] = (361, 591, -11); + outside_of_map[0]["max"] = (1068, 1031, 235); + outside_of_map[1]["min"] = (-288, 591, -11); + outside_of_map[1]["max"] = (361, 1160, 235); + outside_of_map[2]["min"] = (-272, 120, -11); + outside_of_map[2]["max"] = (370, 591, 235); + outside_of_map[3]["min"] = (-272, -912, -11); + outside_of_map[3]["max"] = (273, 120, 235); + while (1) + { + array_check = outside_of_map.size; + kill_player = true; + for(i = 0; i < array_check; i++) + { + if (self is_within_volume( outside_of_map[i]["min"][0], outside_of_map[i]["max"][0], + outside_of_map[i]["min"][1], outside_of_map[i]["max"][1], + outside_of_map[i]["min"][2], outside_of_map[i]["max"][2])) + { + kill_player = false; + } + } + if (kill_player) + { + setsaveddvar("player_deathInvulnerableTime", 0); + self DoDamage( self.health + 1000, self.origin, undefined, undefined, "riflebullet" ); + setsaveddvar("player_deathInvulnerableTime", level.startInvulnerableTime); + } + wait 0.2; + } +} +check_solo_game() +{ + flag_wait( "all_players_connected" ); + players = GetPlayers(); + if ( players.size == 1 ) + { + flag_set( "solo_game" ); + level.solo_lives_given = 0; + players[0].lives = 0; + } +} +prototype_zone_init() +{ + flag_init( "always_on" ); + flag_set( "always_on" ); + add_adjacent_zone( "start_zone", "box_zone", "start_2_box" ); + add_adjacent_zone( "start_zone", "upstairs_zone", "start_2_upstairs" ); + add_adjacent_zone( "box_zone", "upstairs_zone", "box_2_upstairs" ); +} +prototype_eggs() +{ + trigs = getentarray ("evt_egg_killme", "targetname"); + for(i=0;i 1 ) + { + PlayFxOnTag(level._effect["zombie_perk_start"], machines[j], "tag_origin" ); + playsoundatposition("rando_perk", machines[j].origin); + } + else + { + PlayFxOnTag(level._effect["zombie_perk_4th"], machines[j], "tag_origin" ); + playsoundatposition("rando_perk", machines[j].origin); + } + true_model = machines[j].model; + machines[j] setmodel(true_model); + machines[j] show(); + floatHeight = 40; + level thread play_sound_2D("perk_lottery"); + machines[j] moveto( origin +( 0, 0, floatHeight ), 5, 3, 0.5 ); + tag_fx = Spawn( "script_model", machines[j].origin + (0,0,40)); + tag_fx SetModel( "tag_origin" ); + tag_fx LinkTo(machines[j]); + modelindex = 0; + machines[j] Vibrate( machines[j].angles, 2, 1, 4); + for( i = 0; i < 30; i++) + { + wait(0.15); + if(level.vending_model_info.size > 1) + { + while(!isdefined(level.vending_model_info[modelindex])) + { + modelindex++; + if(modelindex == 4) + { + modelindex = 0; + } + } + modelname = level.vending_model_info[modelindex]; + machines[j] setmodel( modelname ); + PlayFxOnTag(level._effect["zombie_perk_flash"], tag_fx, "tag_origin" ); + modelindex++; + if(modelindex == 4) + { + modelindex = 0; + } + } + } + modelname = true_model; + machines[j] setmodel( modelname ); + machines[j] moveto( origin, 0.3, 0.3, 0 ); + PlayFxOnTag(level._effect["zombie_perk_end"], machines[j], "tag_origin" ); + playsoundatposition ("perks_rattle", machines[j].origin); + maps\zombie_cod5_sumpf_perks::activate_vending_machine(true_model, origin, machines[j]); + for(i = 0; i < machines.size; i++) + { + if(isdefined(level.vending_model_info[i])) + { + if(level.vending_model_info[i] == true_model) + { + level.vending_model_info[i] = undefined; + break; + } + } + } +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_cod5_sumpf_trap_perk_electric.gsc b/BO1/PC/ZM/maps/zombie_cod5_sumpf_trap_perk_electric.gsc new file mode 100644 index 0000000..d6aa504 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_cod5_sumpf_trap_perk_electric.gsc @@ -0,0 +1,352 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +init_elec_trap_trigs() +{ + trap_trigs = getentarray("elec_trap_trig","targetname"); + if ( level.mutators["mutator_noTraps"] ) + { + maps\_zombiemode_traps::disable_traps(trap_trigs); + return; + } + for (i = 0; i < trap_trigs.size; i++) + { + trap_trigs[i] thread electric_trap_think(); + trap_trigs[i] thread electric_trap_dialog(); + wait_network_frame(); + } +} +electric_trap_dialog() +{ + self endon ("warning_dialog"); + level endon("switch_flipped"); + timer =0; + while(1) + { + wait(0.5); + players = get_players(); + for(i = 0; i < players.size; i++) + { + dist = distancesquared(players[i].origin, self.origin ); + if(dist > 70*70) + { + timer = 0; + continue; + } + if(dist < 70*70 && timer < 3) + { + wait(0.5); + timer ++; + } + if(dist < 70*70 && timer == 3) + { + wait(3); + self notify ("warning_dialog"); + } + } + } +} +electric_trap_think() +{ + self sethintstring(&"WAW_ZOMBIE_BUTTON_NORTH_FLAMES"); + self setCursorHint( "HINT_NOICON" ); + self.is_available = true; + self.zombie_cost = 1000; + self.in_use = 0; + level thread maps\zombie_cod5_sumpf::turnLightGreen(self.script_string); + while(1) + { + self waittill("trigger",who); + if( who in_revive_trigger() ) + { + continue; + } + if(!isDefined(self.is_available)) + { + continue; + } + if( is_player_valid( who ) ) + { + if( who.score >= self.zombie_cost ) + { + if(!self.in_use) + { + self.in_use = 1; + play_sound_at_pos( "purchase", who.origin ); + who maps\_zombiemode_audio::create_and_play_dialog("level", "trap_barrel"); + self thread electric_trap_move_switch(self); + self waittill("switch_activated"); + who maps\_zombiemode_score::minus_to_player_score( self.zombie_cost ); + self trigger_off(); + level thread maps\zombie_cod5_sumpf::turnLightRed(self.script_string); + self.zombie_dmg_trig = getent(self.target,"targetname"); + self.zombie_dmg_trig trigger_on(); + self thread activate_electric_trap(who); + self waittill("elec_done"); + clientnotify(self.script_string +"off"); + if(isDefined(self.fx_org)) + { + self.fx_org delete(); + } + if(isDefined(self.zapper_fx_org)) + { + self.zapper_fx_org delete(); + } + if(isDefined(self.zapper_fx_switch_org)) + { + self.zapper_fx_switch_org delete(); + } + self.zombie_dmg_trig trigger_off(); + wait(90); + self trigger_on(); + level thread maps\zombie_cod5_sumpf::turnLightGreen(self.script_string); + pa_system = getent("speaker_by_log", "targetname"); + playsoundatposition("warning", pa_system.origin); + self notify("available"); + self.in_use = 0; + } + } + } + } +} +electric_trap_move_switch(parent) +{ + tswitch = getent(parent.script_linkto,"script_linkname"); + if(tswitch.script_linkname == "110") + { + tswitch rotatepitch(180,.5); + tswitch playsound("amb_sparks_l_b"); + tswitch waittill("rotatedone"); + self notify("switch_activated"); + self waittill("available"); + tswitch rotatepitch(-180,.5); + } + else if(tswitch.script_linkname == "111") + { + tswitch rotatepitch(180,.5); + tswitch playsound("amb_sparks_l_b"); + tswitch waittill("rotatedone"); + self notify("switch_activated"); + self waittill("available"); + tswitch rotatepitch(-180,.5); + } + else if(tswitch.script_linkname == "112") + { + tswitch rotatepitch(180,.5); + tswitch playsound("amb_sparks_l_b"); + tswitch waittill("rotatedone"); + self notify("switch_activated"); + self waittill("available"); + tswitch rotatepitch(-180,.5); + } + else if(tswitch.script_linkname == "113") + { + tswitch rotatepitch(180,.5); + tswitch playsound("amb_sparks_l_b"); + tswitch waittill("rotatedone"); + self notify("switch_activated"); + self waittill("available"); + tswitch rotatepitch(-180,.5); + } +} +activate_electric_trap(who) +{ + clientnotify(self.target); + fire_points = getstructarray(self.target,"targetname"); + for(i=0;i 90 && level.burning_zombies.size < 6) + { + level.burning_zombies[level.burning_zombies.size] = self; + self thread zombie_flame_watch(); + self playsound("ignite"); + self thread animscripts\zombie_death::flame_death_fx(); + wait(randomfloat(1.25)); + } + else + { + refs[0] = "guts"; + refs[1] = "right_arm"; + refs[2] = "left_arm"; + refs[3] = "right_leg"; + refs[4] = "left_leg"; + refs[5] = "no_legs"; + refs[6] = "head"; + self.a.gib_ref = refs[randomint(refs.size)]; + playsoundatposition("zmb_zombie_arc", self.origin); + if(randomint(100) > 40 ) + { + if(!flag("dog_round")) + { + self thread electroctute_death_fx(); + } + self thread play_elec_vocals(); + } + wait(randomfloat(1.25)); + self playsound("zmb_zombie_arc"); + } + self dodamage(self.health + 666, self.origin); +} +zombie_flame_watch() +{ + self waittill("death"); + self stoploopsound(); + level.burning_zombies = array_remove_nokeys(level.burning_zombies,self); +} +electroctute_death_fx() +{ + self endon( "death" ); + if (isdefined(self.is_electrocuted) && self.is_electrocuted ) + { + return; + } + self.is_electrocuted = true; + self thread electrocute_timeout(); + if(self.team == "axis") + { + level.bcOnFireTime = gettime(); + level.bcOnFireOrg = self.origin; + } + tagArray = []; + tagArray[0] = "J_Elbow_LE"; + tagArray[1] = "J_Elbow_RI"; + tagArray[2] = "J_Knee_RI"; + tagArray[3] = "J_Knee_LE"; + tagArray = array_randomize( tagArray ); + if( isDefined(tagArray[0] ) ) + { + PlayFxOnTag( level._effect["elec_md"], self, tagArray[0] ); + } + self playsound ("zmb_elec_jib_zombie"); + wait 1; + self playsound ("zmb_elec_jib_zombie"); + tagArray[0] = "J_Wrist_RI"; + tagArray[1] = "J_Wrist_LE"; + if( !IsDefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" ) + { + tagArray[2] = "J_Ankle_RI"; + tagArray[3] = "J_Ankle_LE"; + } + tagArray = array_randomize( tagArray ); + if( isDefined(tagArray[0] ) ) + { + PlayFxOnTag( level._effect["elec_sm"], self, tagArray[0] ); + } + if( isDefined(tagArray[1] ) ) + { + PlayFxOnTag( level._effect["elec_sm"], self, tagArray[1] ); + } +} +electrocute_timeout() +{ + self endon ("death"); + self playloopsound("amb_fire_manager_0"); + wait 12; + self stoploopsound(); + if (isdefined(self) && isalive(self)) + { + self.is_electrocuted = false; + self notify ("stop_flame_damage"); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_cod5_sumpf_zipline.gsc b/BO1/PC/ZM/maps/zombie_cod5_sumpf_zipline.gsc new file mode 100644 index 0000000..c746bc0 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_cod5_sumpf_zipline.gsc @@ -0,0 +1,615 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +initZipline () +{ + zipBuyTrigger = getentarray("zipline_buy_trigger", "targetname"); + nonstatictrig = undefined; + statictrig = undefined; + level.direction = undefined; + level.znodes = []; + level.zrnodes = []; + level.zipinuse = false; + level thread zombie_dog_collision(); + for (i=0; i= self.zombie_cost) + { + if(!level.zipinuse) + { + if (IsDefined(self.script_noteworthy) && self.script_noteworthy == "nonstatic" && who IsTouching(self.volume) || + IsDefined(self.script_noteworthy) && self.script_noteworthy == "static") + { + level.zipinuse = true; + for (i=0; i 0 && downedplayers.size > 0) + { + for(i=0; i 0) + { + center = (0,0,0); + for (i = 0; i < attachspot.size; i++) + { + center += attachspot[i] GetOrigin(); + } + center /= attachspot.size; + PhysicsExplosionSphere(center, 128, 64, 2); + } + self.handle notify ("stopmonitorsolid"); + self.handle notsolid(); + self.handle unlink(); + if ((!(IsDefined(level.direction)))) + self.handle rotateto((0, -19.6, -65), 0.5); + else + self.handle rotateto((0, -19.6, 65), 0.5); + self.handle waittill ("rotatedone"); + self.handle thread objectSolid(); + self.handle LinkTo(self.zip); + self.zipDamageTrigger thread zipDamage(self); + self.zipActive = true; + self thread spinZipPulleys(); + if ((!(IsDefined(level.direction)))) + { + self.aiblocker solid(); + self.aiblocker disconnectpaths(); + for( i = 0; i < (self.riders).size; i++ ) + { + self.riders[i] thread maps\_zombiemode::store_crumb((11216, 2883, -648)); + } + curnode = self.spline; + level.zrnodes[(((level.znodes).size) - 1)] = curnode; + my_time = .3; + for(i=0;i<((level.znodes).size - 1);i++) + { + curnode = getent(curnode.target, "targetname"); + level.zrnodes[((((level.znodes).size) - (i+2)))] = curnode; + self.zip moveto (curnode.origin, my_time); + if (i == 3) + { + self.canshock = true; + } + if (i == 23) + { + self.canshock = false; + } + if (i > ((level.znodes).size * .666)) + { + my_time = my_time + .017; + } + else if (i < ((level.znodes).size * .333)) + { + my_time = my_time - .017; + } + wait(my_time - .022); + } + self.zip waittill ("movedone"); + level notify("machine_done"); + level.direction = "back"; + } + else + { + for( i = 0; i < (self.riders).size; i++ ) + { + self.riders[i] thread maps\_zombiemode::store_crumb((10750, 1516, -501)); + } + my_time = .3; + for(i=1;i<((level.zrnodes).size);i++) + { + curnode = level.zrnodes[i]; + self.zip moveto (curnode.origin, my_time); + if (i == 4) + { + self.canshock = true; + } + if (i == 23) + { + self.canshock = false; + } + if (i > ((level.znodes).size * .666)) + { + my_time = my_time + .017; + } + else if (i < ((level.znodes).size * .333)) + { + my_time = my_time - .017; + } + wait(my_time - .022); + } + self.zip waittill ("movedone"); + self.aiblocker connectpaths(); + self.aiblocker notsolid(); + level.direction = undefined; + } + for(i=0; i < (self.tempclip).size; i++) + { + if ((!(IsDefined(level.direction))) && IsDefined((self.tempclip[i]).script_noteworthy) && (self.tempclip[i]).script_noteworthy == "zip_base") + self.tempclip[i] solid(); + else + self.tempclip[i] thread objectSolid(); + } + level notify("machine_off"); + self playsound("platform_bang"); + self.zipActive = false; + wait(0.1); + for (i=0; i < (self.riders).size; i++) + { + self.riders[i] unlink(); + self.riders[i] stop_magic_bullet_shield(); + self.riders[i] thread maps\_zombiemode::store_crumb(self.origin); + self.riders[i].on_zipline = false; + self.riders[i] allowcrouch (true); + self.riders[i] allowprone (true); + } + self.handle unlink(); + self.handle rotateto((0, -19.6, 0), 0.5); + self.handle waittill ("rotatedone"); + self.handle thread objectSolid(); + self.handle LinkTo(self.zip); + self player_collision_fix(); + self notify ("zipDone"); +} +zipDamage (parent) +{ + while(1) + { + self waittill("trigger",ent); + if (parent.zipActive == true && IsDefined (ent) && IsAlive(ent)) + { + if(isplayer(ent) ) + { + ent thread playerZipDamage(parent); + } + else + { + ent thread zombieZipDamage(); + } + } + } +} +playerZipDamage(parent) +{ + self endon("death"); + self endon("disconnect"); + players = get_players(); + for(i=0; i < (parent.riders).size; i++) + { + if (self == parent.riders[i]) + { + return; + } + } + if( !isDefined(self.zipshock) && !self maps\_laststand::player_is_in_laststand() && parent.canshock == true) + { + self.zipshock = 1; + self shellshock("death", 3); + wait(2); + self.zipshock = undefined; + } +} +zombieZipDamage() +{ + self endon("death"); + if ( self.isdog ) + self.a.nodeath = true; + else + self StartRagdoll(); + self dodamage(self.health + 600, self.origin); +} +objectSolid() +{ + self endon("stopmonitorsolid"); + while( 1 ) + { + players = get_players(); + player_touching = false; + for( i = 0; i < players.size; i++ ) + { + if( players[i] IsTouching( self ) ) + { + player_touching = true; + break; + } + } + if( !player_touching ) + { + self Solid(); + return; + } + wait( 0.5 ); + } +} +spinZipPulleys() +{ + pulleys = getentarray("zip_pulley", "targetname"); + for(i=0; i < pulleys.size; i++) + { + pulleys[i] rotateyaw (1800, 4.8); + } +} +player_collision_fix() +{ + assert( IsDefined( self ) ); + assert( IsDefined( self.tempclip ) ); + if ( IsDefined( level.direction ) ) + { + return; + } + base = undefined; + for( i = 0; i < self.tempclip.size; i++ ) + { + clip = self.tempclip[i]; + if ( IsDefined( clip.script_noteworthy ) && clip.script_noteworthy == "zip_base" ) + { + base = clip; + break; + } + } + assert( IsDefined( base ) ); + z = base.origin[2]; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + player = players[i]; + if ( !is_player_valid( player ) ) + { + continue; + } + if ( !player IsTouching( base ) ) + { + continue; + } + if ( player.origin[2] < z ) + { + offset = z + 6; + origin = ( player.origin[0], player.origin[1], offset ); + player SetOrigin( origin ); + } + } +} +zombie_dog_collision() +{ + collision = GetEntArray("zombie_dog_clip","targetname"); + while(true) + { + for ( i = 0; i < collision.size; i++ ) + { + collision[i] MoveZ(1000, 0.1); + collision[i] ConnectPaths(); + } + flag_wait("dog_round"); + for ( i = 0; i < collision.size; i++ ) + { + collision[i] MoveZ(-1000, 0.1); + collision[i] DisconnectPaths(); + } + level waittill("between_round_over"); + wait(0.1); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_cosmodrome_achievement.gsc b/BO1/PC/ZM/maps/zombie_cosmodrome_achievement.gsc new file mode 100644 index 0000000..e89cc0d Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_cosmodrome_achievement.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_cosmodrome_ai_monkey.gsc b/BO1/PC/ZM/maps/zombie_cosmodrome_ai_monkey.gsc new file mode 100644 index 0000000..bbbccfe Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_cosmodrome_ai_monkey.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_cosmodrome_amb.gsc b/BO1/PC/ZM/maps/zombie_cosmodrome_amb.gsc new file mode 100644 index 0000000..f854c89 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_cosmodrome_amb.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_cosmodrome_eggs.gsc b/BO1/PC/ZM/maps/zombie_cosmodrome_eggs.gsc new file mode 100644 index 0000000..73c95e3 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_cosmodrome_eggs.gsc @@ -0,0 +1,639 @@ +#include animscripts\zombie_utility; +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\_ambientpackage; +#include maps\_music; +#include maps\_busing; +#include maps\_zombiemode_audio; +init() +{ + PreCacheModel( "p_glo_electrical_transformer" ); + PreCacheModel( "p_zom_monitor_csm_screen_on" ); + PreCacheModel( "p_zom_monitor_csm_screen_logo" ); + PreCacheModel( "p_rus_electric_switch_stop" ); + PreCacheModel( "p_rus_clock_lrg" ); + flag_init( "target_teleported" ); + flag_init( "rerouted_power" ); + flag_init( "switches_synced" ); + flag_init( "pressure_sustained" ); + flag_init( "passkey_confirmed" ); + flag_init( "weapons_combined" ); + level.casimir_lights = []; + level.lander_letters[ "a" ] = GetEnt( "letter_a", "targetname" ); + level.lander_letters[ "e" ] = GetEnt( "letter_e", "targetname" ); + level.lander_letters[ "h" ] = GetEnt( "letter_h", "targetname" ); + level.lander_letters[ "i" ] = GetEnt( "letter_i", "targetname" ); + level.lander_letters[ "l" ] = GetEnt( "letter_l", "targetname" ); + level.lander_letters[ "m" ] = GetEnt( "letter_m", "targetname" ); + level.lander_letters[ "n" ] = GetEnt( "letter_n", "targetname" ); + level.lander_letters[ "r" ] = GetEnt( "letter_r", "targetname" ); + level.lander_letters[ "s" ] = GetEnt( "letter_s", "targetname" ); + level.lander_letters[ "t" ] = GetEnt( "letter_t", "targetname" ); + level.lander_letters[ "u" ] = GetEnt( "letter_u", "targetname" ); + level.lander_letters[ "y" ] = GetEnt( "letter_y", "targetname" ); + keys = GetArrayKeys( level.lander_letters ); + for ( i=0; i= 90000 ) + { + doll_hit = true; + } + else if ( attacker GetCurrentWeapon() == "crossbow_explosive_upgraded_zm" ) + { + crossbow_hit = true; + } + } + if ( ray_gun_hit && doll_hit && flag( "thundergun_hit" ) ) + { + flag_set( "weapons_combined" ); + level thread soul_release( self, trig.origin ); + return; + } + } + } +} +thundergun_check( model, trig, weapon_combo_spot ) +{ + model endon( "death" ); + while (1) + { + self waittill( "weapon_fired" ); + if ( self GetCurrentWeapon() == "thundergun_upgraded_zm" ) + { + if ( DistanceSquared( self.origin, weapon_combo_spot.origin ) < 90000 ) + { + vector_to_spot = VectorNormalize( weapon_combo_spot.origin - self GetWeaponMuzzlePoint() ); + vector_player_facing = self GetWeaponForwardDir(); + angle_diff = acos( VectorDot( vector_to_spot, vector_player_facing ) ); + if ( angle_diff <= 10 ) + { + flag_set( "thundergun_hit" ); + RadiusDamage( trig.origin, 5, 1, 1, self ); + } + } + } + } +} +kill_trig_on_death( trig ) +{ + self waittill( "death" ); + trig delete(); + if( flag( "thundergun_hit" ) && !flag( "weapons_combined" ) ) + { + level thread play_egg_vox( "vox_ann_egg6p1_success", "vox_gersh_egg6_fail2", 7 ); + } + else if( !flag( "weapons_combined" ) ) + { + level thread play_egg_vox( undefined, "vox_gersh_egg6_fail1", 6 ); + } + flag_clear( "thundergun_hit" ); +} +soul_release( model, origin ) +{ + soul = Spawn( "script_model", origin ); + soul SetModel( "tag_origin" ); + soul PlayLoopSound( "zmb_egg_soul" ); + fx = PlayFXOnTag( level._effect["gersh_spark"], soul, "tag_origin" ); + time = 20; + model waittill( "death" ); + level thread play_egg_vox( "vox_ann_egg6_success", "vox_gersh_egg6_success", 9 ); + level thread wait_for_gersh_vox(); + soul MoveZ( 2500, time, time - 1 ); + wait( time ); + soul Delete(); + wait(2); + level thread samantha_is_angry(); +} +wait_for_gersh_vox() +{ + wait(12.5); + players = GetPlayers(); + for ( i=0; i0;i--) + { + level thread maps\zombie_cosmodrome_amb::play_cosmo_announcer_vox( "vox_ann_launch_countdown_" + i, true, true ); + wait(1); + if(i == 4) + { + level.claw_arm_r MoveTo(level.claw_retract_r_pos, 4.0); + level.claw_arm_l MoveTo(level.claw_retract_l_pos, 4.0); + } + } + rocket_liftoff(); +} +rocket_liftoff() +{ + rocket_pieces = getentarray( level.rocket.target, "targetname" ); + for ( i = 0; i < rocket_pieces.size; i++ ) + { + rocket_pieces[i] linkto( level.rocket ); + } + level endon("rocket_dmg"); + rocket_base = getent("rocket_base_engine","script_noteworthy"); + stop_exploder(5601); + exploder(5701); + rocket_base setclientflag(0); + level thread launch_rumble_and_quake(); + wait(1); + level thread maps\zombie_cosmodrome_amb::play_cosmo_announcer_vox( "vox_ann_engines_firing", true ); + level.rocket setforcenocull(); + level.rocket moveto(level.rocket.origin + (0,0,50000),50,45); + wait(5); + maps\zombie_cosmodrome_traps::claw_detach( level.claw_arm_l, "claw_l" ); + maps\zombie_cosmodrome_traps::claw_detach( level.claw_arm_r, "claw_r" ); + level thread rocket_monitor_for_damage(); + wait(5); + flag_set("launch_complete"); + level thread maps\zombie_cosmodrome_amb::play_cosmo_announcer_vox( "vox_ann_after_launch" ); + wait(20); + level notify("stop_rumble"); + level.rocket waittill("movedone"); + rocket_pieces = getentarray(level.rocket.target, "targetname"); + for ( i = 0; i < rocket_pieces.size; i++ ) + { + rocket_pieces[i] delete(); + } + level.rocket delete(); +} +launch_rumble_and_quake() +{ + level endon("stop_rumble"); + level endon("stop_rumble_dmg"); + while(isDefined(level.rocket)) + { + players = get_players(); + players_in_range = []; + for(i=0;i 0 ) + { + time = degrees / 360 * step; + for ( i=0; i 6 ) + { + level waittill( "between_round_over" ); + } + else if( malfunction_for_round == 1 ) + { + level waittill( "between_round_over" ); + level waittill( "between_round_over" ); + } + wait( RandomIntRange( 24, 90 ) ); + rotation_amount = RandomIntRange( 3, 7 ) * 360; + wait_time = RandomIntRange( 4, 7 ); + level centrifuge_spin_warning( centrifuge_model ); + centrifuge_model SetClientFlag( level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_RUMBLE ); + centrifuge_model RotateYaw( rotation_amount, wait_time, 1.0, 2.0 ); + centrifuge_damage_trigger thread centrifuge_damage(); + wait( 3.0 ); + slow_down_moment = wait_time - 3; + if( slow_down_moment < 0 ) + { + slow_down_moment = Abs( slow_down_moment ); + } + centrifuge_model stoploopsound (4); + centrifuge_model playsound ("zmb_cent_end"); + wait( slow_down_moment ); + centrifuge_model waittill( "rotatedone" ); + centrifuge_damage_trigger notify( "trap_done" ); + centrifuge_model PlaySound( "zmb_cent_lockdown" ); + centrifuge_model ClearClientFlag( level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_LIGHTS ); + centrifuge_model ClearClientFlag( level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_RUMBLE ); + } +} +centrifuge_spin_warning( ent_centrifuge_model ) +{ + ent_centrifuge_model SetClientFlag( level._SCRIPTMOVER_COSMODROME_CLIENT_FLAG_CENTRIFUGE_LIGHTS ); + ent_centrifuge_model playsound ( "zmb_cent_alarm" ); + ent_centrifuge_model PlaySound( "vox_ann_centrifuge_spins_1" ); + wait( 1.0 ); + ent_centrifuge_model playsound ( "zmb_cent_start" ); + wait( 2.0 ); + ent_centrifuge_model playloopsound ("zmb_cent_mach_loop", .6); + wait( 1.0 ); +} +centrifuge_damage() +{ + self endon( "trap_done" ); + self._trap_type = self.script_noteworthy; + players = getplayers(); + while(1) + { + self waittill( "trigger", ent ); + if( isplayer(ent) && ent.health > 1 ) + { + if ( ent GetStance() == "stand" ) + { + if(players.size == 1) + { + ent dodamage( 50, ent.origin+(0,0,20) ); + ent SetStance( "crouch" ); + } + else + { + ent dodamage( 125, ent.origin+(0,0,20) ); + ent SetStance( "crouch" ); + } + } + } + else + { + if(!isDefined(ent.marked_for_death)) + { + ent.marked_for_death = true; + ent thread maps\_zombiemode_traps::zombie_trap_death( self, randomint(100) ); + ent PlaySound( "zmb_cent_zombie_gib" ); + } + } + } +} +centrifuge_spinning_edge_sounds() +{ + if( !IsDefined( self.target ) ) + { + return; + } + self LinkTo( GetEnt( self.target, "targetname" ) ); + while( true ) + { + flag_wait( "fuge_spining" ); + self PlayLoopSound( "zmb_cent_close_loop", .5 ); + flag_wait( "fuge_slowdown" ); + self StopLoopSound( 2 ); + wait( 0.05 ); + } +} +kill_counter() +{ + players = GetPlayers(); + for (i=0; i steps_per_stage * stage_num ) + { + stage_num++; + } + if ( num_stages - stage_num == 0 ) + { + ones = self._kill_count % 10; + } + else + { + ones = i % 10; + } + self.counter_1s set_counter( ones ); + if ( IsDefined( self.counter_10s ) ) + { + if ( num_stages - stage_num <= 1 ) + { + tens = int( self._kill_count / 10 ); + } + else + { + tens = i % 10; + } + self.counter_10s set_counter( tens ); + } + if ( IsDefined( self.counter_100s ) ) + { + if ( num_stages - stage_num <= 1 ) + { + hundreds = int( self._kill_count / 100 ); + } + else + { + hundreds = i % 10; + } + self.counter_100s set_counter( hundreds ); + } + level.kill_counter_hud SetValue( hundreds*100 + tens*10 + ones ); + wait (0.1); + } + self thread kill_counter_update(); + self waittill( "kill_counter_end" ); + level.kill_counter_hud FadeOverTime( 1.0 ); + level.kill_counter_hud.alpha = 0; + wait(1.0); + level.kill_counter_hud destroy_hud(); +} +kill_counter_update() +{ + self endon( "kill_counter_end" ); + if ( !IsDefined( level.kill_counter_hud ) ) + { + return; + } + while ( 1 ) + { + if ( IsDefined( self.counter_10s ) ) + { + self.counter_1s set_counter( self._kill_count % 10 ); + } + if ( IsDefined( self.counter_10s ) ) + { + self.counter_10s set_counter( int( self._kill_count / 10 ) ); + } + if ( IsDefined( self.counter_100s ) ) + { + self.counter_100s set_counter( int( self._kill_count / 100 ) ); + } + level.kill_counter_hud SetValue( self._kill_count ); + level waittill( "zom_kill" ); + } +} +spinner_add_award( start_angle, end_angle, prize ) +{ + index = level.spinner_awards.size; + level.spinner_awards[ index ] = SpawnStruct(); + level.spinner_awards[ index ].name = prize; + level.spinner_awards[ index ].start_angle = start_angle; + level.spinner_awards[ index ].end_angle = end_angle; +} +rocket_arm_sounds() +{ + level.rocket_lifter playsound( "evt_rocket_set_main" ); + wait(13.8); + level.rocket_lifter playsound( "evt_rocket_set_impact" ); +} +door_firetrap_init() +{ + flag_init("base_door_opened"); + door_trap = undefined; + traps = GetEntArray( "zombie_trap", "targetname" ); + for( i = 0; i < traps.size; i++ ) + { + if(IsDefined(traps[i].script_string) && traps[i].script_string == "f2") + { + door_trap = traps[i]; + door_trap trap_set_string( &"ZOMBIE_NEED_POWER" ); + } + } + flag_wait("power_on"); + if(!flag("base_entry_2_north_path")) + { + door_trap trap_set_string( &"ZOMBIE_COSMODROME_DOOR_CLOSED" ); + } + flag_wait("base_entry_2_north_path"); + flag_set("base_door_opened"); +} +unlink_rocket_pieces() +{ + claw_detach( level.claw_arm_l, "claw_l" ); + claw_detach( level.claw_arm_r, "claw_r" ); + rocket_pieces = getentarray( level.rocket.target, "targetname" ); + for ( i = 0; i < rocket_pieces.size; i++ ) + { + rocket_pieces[i] unlink(); + } + lifter_pieces = GetEntArray( level.rocket_lifter.target, "targetname" ); + for ( i = 0; i < lifter_pieces.size; i++ ) + { + lifter_pieces[i] unlink(); + } + level.rocket_lifter_clamps = GetEntArray( "lifter_clamp", "targetname" ); + for ( i = 0; i < level.rocket_lifter_clamps.size; i++ ) + { + level.rocket_lifter_clamps[i] unlink(); + } +} +link_rocket_pieces() +{ + claw_attach( level.claw_arm_l, "claw_l" ); + level.claw_arm_r = GetEnt( "claw_r_arm", "targetname" ); + claw_attach( level.claw_arm_r, "claw_r" ); + rocket_pieces = getentarray( level.rocket.target, "targetname" ); + for ( i = 0; i < rocket_pieces.size; i++ ) + { + rocket_pieces[i] linkto( level.rocket ); + } + lifter_pieces = GetEntArray( level.rocket_lifter.target, "targetname" ); + for ( i = 0; i < lifter_pieces.size; i++ ) + { + lifter_pieces[i] linkto( level.rocket_lifter ); + } + level.rocket_lifter_clamps = GetEntArray( "lifter_clamp", "targetname" ); + for ( i = 0; i < level.rocket_lifter_clamps.size; i++ ) + { + level.rocket_lifter_clamps[i] linkto( level.rocket_lifter_arm ); + } +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_moon.gsc b/BO1/PC/ZM/maps/zombie_moon.gsc new file mode 100644 index 0000000..d59759b --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_moon.gsc @@ -0,0 +1,1540 @@ + +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_zone_manager; +#include maps\zombie_moon_utility; +#include maps\zombie_moon_wasteland; +#include maps\zombie_moon_teleporter; +main() +{ + level._num_overriden_models = 0; + level._use_choke_weapon_hints = 1; + level._use_choke_blockers = 1; + level._use_extra_blackhole_anims = ::init_extra_blackhole_anims; + level._special_blackhole_bomb_structs = ::blackhole_bomb_area_check; + level._limited_equipment = []; + level._limited_equipment[level._limited_equipment.size] = "equip_hacker_zm"; + level._override_blackhole_destination_logic = ::get_blackholebomb_destination_point; + level._blackhole_bomb_valid_area_check = ::blackhole_bomb_in_invalid_area; + level.quantum_bomb_prevent_player_getting_teleported = ::quantum_bomb_prevent_player_getting_teleported_override; + level._no_water_risers = 1; + level.use_clientside_board_fx = 1; + level.riser_fx_on_client = 1; + level.risers_use_low_gravity_fx = 1; + level thread maps\zombie_moon_ffotd::main_start(); + maps\_zombiemode_weap_quantum_bomb::init_registration(); + maps\zombie_moon_fx::main(); + maps\zombie_moon_amb::main(); + precache_items(); + if(GetDvarInt( #"artist") > 0) + { + return; + } + init_strings(); + init_clientflags(); + level.player_out_of_playable_area_monitor = true; + level.player_out_of_playable_area_monitor_callback = ::zombie_moon_player_out_of_playable_area_monitor_callback; + level thread moon_create_life_trigs(); + level.zombie_anim_override = maps\zombie_moon::anim_override_func; + level.traps = []; + level.round_think_func = ::moon_round_think_func; + level.random_pandora_box_start = true; + level.door_dialog_function = maps\_zombiemode::play_door_dialog; + level._zombie_custom_add_weapons = ::custom_add_weapons; + level thread maps\_callbacksetup::SetupCallbacks(); + level.quad_move_speed = 35; + level.quad_explode = true; + level.dogs_enabled = true; + level.dog_spawn_func = maps\_zombiemode_ai_dogs::dog_spawn_factory_logic; + level.custom_ai_type = []; + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_astro::init ); + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_quad::init ); + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_dogs::init ); + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_faller::faller_init ); + level thread hacker_location_random_init(); + include_weapons(); + include_powerups(); + include_equipment_for_level(); + maps\_zombiemode_equip_gasmask::init(); + maps\_zombiemode_equip_hacker::init(); + precachemodel( "viewmodel_zom_pressure_suit_arms" ); + precachemodel( "c_zom_moon_pressure_suit_body_player" ); + precachemodel( "c_zom_moon_pressure_suit_helm" ); + precachemodel( "c_rus_nikolai_dlc5_head_psuit" ); + level.zombiemode_gasmask_reset_player_model = ::gasmask_reset_player_model; + level.zombiemode_gasmask_reset_player_viewmodel = ::gasmask_reset_player_set_viewmodel; + level.zombiemode_gasmask_change_player_headmodel = ::gasmask_change_player_headmodel; + level.zombiemode_gasmask_set_player_model = ::gasmask_set_player_model; + level.zombiemode_gasmask_set_player_viewmodel = ::gasmask_set_player_viewmodel; + level.zombiemode_precache_player_model_override = ::precache_player_model_override; + level.zombiemode_give_player_model_override = ::give_player_model_override; + level.zombiemode_player_set_viewmodel_override = ::player_set_viewmodel_override; + level.register_offhand_weapons_for_level_defaults_override = ::moon_offhand_weapon_overrride; + level.zombiemode_offhand_weapon_give_override = ::offhand_weapon_give_override; + level.use_zombie_heroes = true; + level.zombiemode_using_marathon_perk = true; + level.zombiemode_using_divetonuke_perk = true; + level.zombiemode_using_deadshot_perk = true; + level.zombiemode_using_additionalprimaryweapon_perk = true; + level.moon_startmap = true; + level._zombiemode_blocker_trigger_extra_thread = ::hacker_hides_blocker_trigger_thread; + level.zombiemode_sidequest_init = ::moon_sidequest_of_awesome; + maps\_zombiemode::main(); + level thread maps\_zombiemode::register_sidequest( "COTD", "ZOMBIE_COAST_EGG_SOLO", 43, "ZOMBIE_COAST_EGG_COOP", 44 ); + level thread maps\_zombiemode::register_sidequest( "EOA", undefined, undefined, "ZOMBIE_TEMPLE_SIDEQUEST", undefined ); + level thread maps\_zombiemode::register_sidequest( "MOON", undefined, undefined, "ZOMBIE_MOON_SIDEQUEST_TOTAL", undefined ); + maps\_sticky_grenade::init(); + maps\_zombiemode_weap_black_hole_bomb::init(); + maps\_zombiemode_weap_microwavegun::init(); + maps\_zombiemode_weap_quantum_bomb::init(); + level.zone_manager_init_func = ::moon_zone_init; + init_zones[0] = "bridge_zone"; + init_zones[1] = "nml_zone"; + level thread maps\_zombiemode_zone_manager::manage_zones( init_zones ); + level maps\zombie_moon_digger::digger_init_flags(); + level thread maps\zombie_moon_achievement::init(); + level thread electric_switch(); + level thread electric_switch(); + level thread maps\zombie_moon_distance_tracking::zombie_tracking_init(); + init_no_mans_land(); + level thread teleporter_check_for_endgame(); + level thread teleporter_function( "generator_teleporter" ); + level thread teleporter_function( "nml_teleporter" ); + level thread vision_set_init(); + level thread init_zombie_airlocks(); + level thread setup_water_physics(); + set_zombie_var( "zombie_intermission_time", 15 ); + set_zombie_var( "zombie_between_round_time", 10 ); + setsaveddvar( "r_zombieDisableSlideEffect", "1" ); + level thread maps\zombie_moon_digger::digger_init(); + level thread maps\zombie_moon_ai_astro::init(); + level thread maps\zombie_moon_ai_quad::init(); + maps\zombie_moon_gravity::init(); + maps\zombie_moon_jump_pad::init(); + level thread maps\zombie_moon_gravity::zombie_moon_update_player_gravity(); + level thread maps\zombie_moon_gravity::zombie_moon_update_player_float(); + level thread maps\zombie_moon_sq::start_moon_sidequest(); + level thread init_hackables(); + level.custom_intermission = ::moon_intermission; + level thread no_mans_land_power(); + level thread cliff_fall_death(); + level thread setup_fields(); + level thread maps\zombie_moon_ffotd::main_end(); + level thread wait_for_end_game(); + level.tunnel_6_destroyed = GetEnt("tunnel_6_destroyed","targetname"); + level.tunnel_6_destroyed Hide(); + level.tunnel_11_destroyed = GetEnt("tunnel_11_destroyed","targetname"); + level.tunnel_11_destroyed Hide(); + level.perk_lost_func = ::moon_perk_lost; + level._black_hole_bomb_poi_override = ::moon_black_hole_bomb_poi; + level.check_valid_spawn_override = ::moon_respawn_override; + level._zombiemode_post_respawn_callback = ::moon_post_respawn_callback; + level thread end_game_vision_and_fog_fix(); + level._poi_override = ::moon_bhb_poi_control; + level._override_quad_explosion = ::override_quad_explosion; + level.zombie_speed_up = ::moon_speed_up; + level.ai_astro_explode = ::moon_push_zombies_when_astro_explodes; +} +moon_push_zombies_when_astro_explodes( position ) +{ + level.quantum_bomb_cached_closest_zombies = undefined; + self thread maps\_zombiemode_weap_quantum_bomb::quantum_bomb_zombie_fling_result( position ); +} +moon_post_respawn_callback() +{ + self clearclientflag(level._CF_PLAYER_GASMASK_OVERLAY); + if(flag("enter_nml")) + { + self setclientflag(level._CLIENTFLAG_PLAYER_SKY_TRANSITION); + } + else + { + self clearclientflag(level._CLIENTFLAG_PLAYER_SKY_TRANSITION); + } + if( !maps\_zombiemode_equipment::limited_equipment_in_use("equip_hacker_zm") ) + { + self maps\_zombiemode_equipment::set_equipment_invisibility_to_player( "equip_hacker_zm", false ); + } +} +setup_fields() +{ + flag_wait("power_on"); + exploder(140); +} +no_mans_land_power() +{ + level thread turn_area51_perks_on(); + level notify("Pack_A_Punch_on" ); +} +turn_area51_perks_on() +{ + machine = getentarray("vending_sleight", "targetname"); + for( i = 0; i < machine.size; i++ ) + { + machine[i] setmodel("zombie_vending_sleight_on"); + } + level notify( "specialty_fastreload_power_on" ); + machine2 = getentarray("vending_jugg", "targetname"); + for( i = 0; i < machine2.size; i++ ) + { + machine2[i] setmodel("zombie_vending_jugg_on"); + machine2[i] playsound("zmb_perks_power_on"); + } + level notify( "specialty_armorvest_power_on" ); +} +init_hackables() +{ + level thread maps\_zombiemode_hackables_wallbuys::hack_wallbuys(); + level thread maps\_zombiemode_hackables_perks::hack_perks(); + level thread maps\_zombiemode_hackables_packapunch::hack_packapunch(); + level thread maps\_zombiemode_hackables_boards::hack_boards(); + level thread maps\_zombiemode_hackables_doors::hack_doors("zombie_airlock_buy", maps\zombie_moon_utility::moon_door_opened); + level thread maps\_zombiemode_hackables_doors::hack_doors(); + level thread maps\_zombiemode_hackables_powerups::hack_powerups(); + level thread maps\_zombiemode_hackables_box::box_hacks(); + level thread packapunch_hack_think(); + level thread pack_gate_poi_init(); +} +hacker_hides_blocker_trigger_thread() +{ + self endon("death"); + maps\_zombiemode_equip_hacker::hide_hint_when_hackers_active(); +} +zombie_moon_player_out_of_playable_area_monitor_callback() +{ + if(is_true(self._padded)) + { + return false; + } + return true; +} +moon_create_life_trigs() +{ +} +packapunch_hack_think() +{ + flag_init("packapunch_hacked"); + time = 30; + pack_gates = GetEntArray("zombieland_gate","targetname"); + for ( i = 0; i < pack_gates.size; i++ ) + { + pack_gates[i].startpos = pack_gates[i].origin; + } + while(1) + { + level waittill("packapunch_hacked"); + flag_clear("packapunch_hacked"); + array_thread(pack_gates,::pack_gate_activate); + level thread pack_gate_poi_activate(time); + wait(time); + flag_set("packapunch_hacked"); + maps\_zombiemode_equip_hacker::register_pooled_hackable_struct(level._pack_hack_struct, maps\_zombiemode_hackables_packapunch::packapunch_hack); + } +} +pack_gate_poi_init() +{ + pack_zombieland_poi = GetEntArray("zombieland_poi","targetname"); + for ( i = 0; i < pack_zombieland_poi.size; i++ ) + { + pack_zombieland_poi[i] create_zombie_point_of_interest( undefined, 30, 0, false ); + pack_zombieland_poi[i] thread create_zombie_point_of_interest_attractor_positions( 4, 45 ); + } +} +pack_gate_poi_activate(time) +{ + pack_enclosure = GetEnt("pack_enclosure","targetname"); + pack_zombieland_poi = GetEntArray("zombieland_poi","targetname"); + players = get_players(); + num_players_inside = 0; + for( i=0; i 500 ) + maxreward = 500; + level.zombie_vars["rebuild_barrier_cap_per_round"] = maxreward; + level.pro_tips_start_time = GetTime(); + level.zombie_last_run_time = GetTime(); + level thread maps\_zombiemode_audio::change_zombie_music( "round_start" ); + if(level.moon_startmap == true) + { + level.moon_startmap = false; + level thread maps\_zombiemode::play_level_start_vox_delayed(); + wait(3); + } + else + { + maps\_zombiemode::chalk_one_up(); + } + maps\_zombiemode_powerups::powerup_round_start(); + players = get_players(); + array_thread( players, maps\_zombiemode_blockers::rebuild_barrier_reward_reset ); + if(!flag("teleporter_used") || level.first_round == true) + { + level thread maps\_zombiemode::award_grenades_for_survivors(); + } + bbPrint( "zombie_rounds: round %d player_count %d", level.round_number, players.size ); + level.round_start_time = GetTime(); + level thread [[level.round_spawn_func]](); + level notify( "start_of_round" ); + if(flag("teleporter_used")) + { + flag_clear("teleporter_used"); + if ( level.prev_round_zombies != 0) + { + level.zombie_total = level.prev_round_zombies; + } + } + [[level.round_wait_func]](); + level.first_round = false; + level notify( "end_of_round" ); + flag_set("between_rounds"); + UploadStats(); + if(!flag("teleporter_used")) + { + level thread maps\_zombiemode_audio::change_zombie_music( "round_end" ); + if ( 1 != players.size ) + { + level thread maps\_zombiemode::spectators_respawn(); + } + } + level maps\_zombiemode::chalk_round_over(); + timer = level.zombie_vars["zombie_spawn_delay"]; + if ( timer > 0.08 ) + { + level.zombie_vars["zombie_spawn_delay"] = timer * 0.95; + } + else if ( timer < 0.08 ) + { + level.zombie_vars["zombie_spawn_delay"] = 0.08; + } + level.zombie_move_speed = level.round_number * level.zombie_vars["zombie_move_speed_multiplier"]; + if(flag("teleporter_used")) + { + if ( level.prev_round_zombies != 0 && !flag("enter_nml") ) + { + level.round_number = level.nml_last_round; + } + } + else + { + level.round_number++; + } + level notify( "between_round_over" ); + flag_clear("between_rounds"); + } +} +moon_zone_init() +{ + flag_init( "always_on" ); + flag_set( "always_on" ); + add_adjacent_zone( "airlock_bridge_zone", "bridge_zone", "receiving_exit" ); + add_adjacent_zone( "airlock_bridge_zone", "water_zone", "receiving_exit" ); + add_adjacent_zone( "bridge_zone", "water_zone", "receiving_exit" ); + add_adjacent_zone( "airlock_west_zone", "water_zone", "catacombs_west" ); + add_adjacent_zone( "airlock_west_zone", "cata_left_start_zone", "catacombs_west" ); + add_adjacent_zone( "water_zone", "cata_left_start_zone", "catacombs_west" ); + add_adjacent_zone( "cata_left_start_zone", "cata_left_middle_zone", "tunnel_6_door1" ); + add_adjacent_zone( "airlock_east_zone", "water_zone", "catacombs_east" ); + add_adjacent_zone( "airlock_east_zone", "cata_right_start_zone", "catacombs_east" ); + add_adjacent_zone( "cata_right_start_zone", "water_zone", "catacombs_east" ); + add_adjacent_zone( "airlock_east2_zone", "generator_zone", "catacombs_east4" ); + add_adjacent_zone( "airlock_east2_zone", "cata_right_end_zone", "catacombs_east4" ); + add_adjacent_zone( "airlock_west2_zone", "cata_left_middle_zone", "catacombs_west4" ); + add_adjacent_zone( "airlock_west2_zone", "generator_zone", "catacombs_west4" ); + add_adjacent_zone( "cata_right_start_zone", "cata_right_middle_zone", "tunnel_11_door1" ); + add_adjacent_zone( "cata_right_middle_zone", "cata_right_end_zone", "tunnel_11_door2" ); + add_adjacent_zone( "airlock_generator_zone", "generator_zone", "generator_exit_east" ); + add_adjacent_zone( "airlock_generator_zone", "generator_exit_east_zone", "generator_exit_east" ); + add_adjacent_zone( "airlock_digsite_zone", "enter_forest_east_zone", "exit_dig_east" ); + add_adjacent_zone( "airlock_digsite_zone", "tower_zone_east", "exit_dig_east" ); + add_zone_flags( "exit_dig_east", "digsite_group" ); + add_adjacent_zone( "airlock_biodome_zone", "forest_zone", "forest_enter_digsite" ); + add_adjacent_zone( "airlock_biodome_zone", "tower_zone_east2", "forest_enter_digsite" ); + add_adjacent_zone( "forest_zone", "tower_zone_east2", "forest_enter_digsite" ); + add_zone_flags( "forest_enter_digsite", "digsite_group" ); + add_adjacent_zone( "tower_zone_east", "tower_zone_east2", "digsite_group" ); + add_adjacent_zone( "airlock_labs_2_biodome", "enter_forest_east_zone", "enter_forest_east" ); + add_adjacent_zone( "airlock_labs_2_biodome", "forest_zone", "enter_forest_east" ); + add_adjacent_zone( "enter_forest_east_zone", "generator_exit_east_zone", "dig_enter_east" ); +} +init_strings() +{ + PrecacheString( &"ZOMBIE_PARIS_TRANSPORTER_WAITING" ); + PrecacheString( &"ZOMBIE_PARIS_TRANSPORTER_ACTIVATED" ); + PrecacheString( &"ZOMBIE_PARIS_TRANSPORTER_ABORTED" ); +} +#using_animtree( "generic_human" ); +anim_override_func() +{ + level.scr_anim["zombie"]["walk3"] = %ai_zombie_walk_v2; + level.scr_anim["zombie"]["run6"] = %ai_zombie_run_v2; +} +include_weapons() +{ + include_weapon( "frag_grenade_zm", false ); + include_weapon( "sticky_grenade_zm", false ); + include_weapon( "claymore_zm", false ); + include_weapon( "m1911_zm", false ); + include_weapon( "m1911_upgraded_zm", false ); + include_weapon( "python_zm" ); + include_weapon( "python_upgraded_zm", false ); + include_weapon( "cz75_zm" ); + include_weapon( "cz75_upgraded_zm", false ); + include_weapon( "m14_zm", false, true ); + include_weapon( "m14_upgraded_zm", false ); + include_weapon( "m16_zm", false, true ); + include_weapon( "m16_gl_upgraded_zm", false ); + include_weapon( "g11_lps_zm" ); + include_weapon( "g11_lps_upgraded_zm", false ); + include_weapon( "famas_zm" ); + include_weapon( "famas_upgraded_zm", false ); + include_weapon( "ak74u_zm", false, true ); + include_weapon( "ak74u_upgraded_zm", false ); + include_weapon( "mp5k_zm", false, true ); + include_weapon( "mp5k_upgraded_zm", false ); + include_weapon( "mp40_zm", false ); + include_weapon( "mp40_upgraded_zm", false ); + include_weapon( "mpl_zm", false, true ); + include_weapon( "mpl_upgraded_zm", false ); + include_weapon( "pm63_zm", false, true ); + include_weapon( "pm63_upgraded_zm", false ); + include_weapon( "spectre_zm" ); + include_weapon( "spectre_upgraded_zm", false ); + include_weapon( "cz75dw_zm" ); + include_weapon( "cz75dw_upgraded_zm", false ); + include_weapon( "ithaca_zm", false, true ); + include_weapon( "ithaca_upgraded_zm", false ); + include_weapon( "rottweil72_zm", false, true ); + include_weapon( "rottweil72_upgraded_zm", false ); + include_weapon( "spas_zm" ); + include_weapon( "spas_upgraded_zm", false ); + include_weapon( "hs10_zm" ); + include_weapon( "hs10_upgraded_zm", false ); + include_weapon( "aug_acog_zm" ); + include_weapon( "aug_acog_mk_upgraded_zm", false ); + include_weapon( "galil_zm" ); + include_weapon( "galil_upgraded_zm", false ); + include_weapon( "commando_zm" ); + include_weapon( "commando_upgraded_zm", false ); + include_weapon( "fnfal_zm" ); + include_weapon( "fnfal_upgraded_zm", false ); + include_weapon( "dragunov_zm" ); + include_weapon( "dragunov_upgraded_zm", false ); + include_weapon( "l96a1_zm" ); + include_weapon( "l96a1_upgraded_zm", false ); + include_weapon( "rpk_zm" ); + include_weapon( "rpk_upgraded_zm", false ); + include_weapon( "hk21_zm" ); + include_weapon( "hk21_upgraded_zm", false ); + include_weapon( "m72_law_zm" ); + include_weapon( "m72_law_upgraded_zm", false ); + include_weapon( "china_lake_zm" ); + include_weapon( "china_lake_upgraded_zm", false ); + include_weapon( "knife_ballistic_zm", true ); + include_weapon( "knife_ballistic_upgraded_zm", false ); + include_weapon( "knife_ballistic_bowie_zm", false ); + include_weapon( "knife_ballistic_bowie_upgraded_zm", false ); + level._uses_retrievable_ballisitic_knives = true; + include_weapon( "zombie_black_hole_bomb" ); + include_weapon( "ray_gun_zm" ); + include_weapon( "ray_gun_upgraded_zm", false ); + include_weapon( "zombie_quantum_bomb" ); + include_weapon( "microwavegundw_zm" ); + include_weapon( "microwavegundw_upgraded_zm", false ); + maps\_zombiemode_weapons::add_limited_weapon( "m1911_zm", 0 ); + maps\_zombiemode_weapons::add_limited_weapon( "knife_ballistic_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "microwavegundw_zm", 1 ); + level.collector_achievement_weapons = array_add( level.collector_achievement_weapons, "bowie_knife_zm" ); +} +precache_player_model_override() +{ + mptype\player_t5_zm_moon::precache(); +} +give_player_model_override( entity_num ) +{ + if(!IsDefined(level._override_num_chars_connected)) + { + level._override_num_chars_connected = 0; + } + else + { + level._override_num_chars_connected ++; + } + if( IsDefined( self.zm_random_char ) ) + { + entity_num = self.zm_random_char; + self.entity_num = entity_num; + } + else if(level._override_num_chars_connected == (GetNumExpectedPlayers() -1 ) ) + { + self.zm_random_char = 3; + self.entity_num = 3; + entity_num = 3; + } + else + { + self.zm_random_char = level._override_num_chars_connected; + self.entity_num = level._override_num_chars_connected; + entity_num = level._override_num_chars_connected; + } + switch( entity_num ) + { + case 0: + character\c_usa_dempsey_dlc5::main(); + break; + case 1: + character\c_rus_nikolai_dlc5::main(); + break; + case 2: + character\c_jap_takeo_dlc5::main(); + break; + case 3: + character\c_ger_richtofen_dlc5::main(); + break; + } + level._num_overriden_models ++; +} +player_set_viewmodel_override( entity_num ) +{ + if(isDefined(self.zm_random_char)) + { + entity_num = self.zm_random_char; + } + else + { + entity_num = self.entity_num; + } + switch( entity_num ) + { + case 0: + self SetViewModel( "viewmodel_usa_pow_arms" ); + break; + case 1: + self SetViewModel( "viewmodel_rus_prisoner_arms" ); + break; + case 2: + self SetViewModel( "viewmodel_vtn_nva_standard_arms" ); + break; + case 3: + self SetViewModel( "viewmodel_usa_hazmat_arms" ); + break; + } +} +gasmask_get_head_model( entity_num, gasmask_active ) +{ + if ( gasmask_active ) + { + return "c_zom_moon_pressure_suit_helm"; + } + switch ( entity_num ) + { + case 0: + return "c_usa_dempsey_dlc5_head"; + case 1: + return "c_rus_nikolai_dlc5_head_psuit"; + case 2: + return "c_jap_takeo_dlc5_head"; + case 3: + return "c_ger_richtofen_dlc5_head"; + } +} +gasmask_change_player_headmodel( entity_num, gasmask_active ) +{ + self Detach( self.headModel, "" ); + self.headModel = gasmask_get_head_model( entity_num, gasmask_active ); + self Attach( self.headModel, "", true ); +} +gasmask_set_player_model( entity_num ) +{ + player_is_nikolai = false; + if ( 1 == entity_num ) + { + player_is_nikolai = true; + self Detach( self.headModel, "" ); + } + self setModel( "c_zom_moon_pressure_suit_body_player" ); + if ( player_is_nikolai ) + { + self.headModel = gasmask_get_head_model( entity_num, false ); + self Attach( self.headModel, "", true ); + } +} +gasmask_set_player_viewmodel( entity_num ) +{ + self SetViewModel( "viewmodel_zom_pressure_suit_arms" ); + self clientnotify( "gmsk" ); +} +gasmask_reset_player_model( entity_num ) +{ + if( IsDefined( self.zm_random_char ) ) + { + entity_num = self.zm_random_char; + } + self Detach(self.headModel, ""); + switch( entity_num ) + { + case 0: + character\c_usa_dempsey_dlc5::main(); + break; + case 1: + character\c_rus_nikolai_dlc5::main(); + break; + case 2: + character\c_jap_takeo_dlc5::main(); + break; + case 3: + character\c_ger_richtofen_dlc5::main(); + break; + } +} +gasmask_reset_player_set_viewmodel( entity_num ) +{ + if( IsDefined( self.zm_random_char ) ) + { + entity_num = self.zm_random_char; + } + switch( self.entity_num ) + { + case 0: + self SetViewModel( "viewmodel_usa_pow_arms" ); + self clientnotify( "gmsk" ); + break; + case 1: + self SetViewModel( "viewmodel_rus_prisoner_arms" ); + self clientnotify( "gmsk" ); + break; + case 2: + self SetViewModel( "viewmodel_vtn_nva_standard_arms" ); + self clientnotify( "gmsk" ); + break; + case 3: + self SetViewModel( "viewmodel_usa_hazmat_arms" ); + self clientnotify( "gmsk" ); + break; + } +} +moon_offhand_weapon_overrride() +{ + register_lethal_grenade_for_level( "frag_grenade_zm" ); + register_lethal_grenade_for_level( "sticky_grenade_zm" ); + level.zombie_lethal_grenade_player_init = "frag_grenade_zm"; + register_tactical_grenade_for_level( "zombie_black_hole_bomb" ); + level.zombie_tactical_grenade_player_init = undefined; + register_tactical_grenade_for_level( "zombie_quantum_bomb" ); + register_placeable_mine_for_level( "claymore_zm" ); + level.zombie_placeable_mine_player_init = undefined; + register_melee_weapon_for_level( "knife_zm" ); + register_melee_weapon_for_level( "bowie_knife_zm" ); + level.zombie_melee_weapon_player_init = "knife_zm"; + register_equipment_for_level( "equip_gasmask_zm" ); + register_equipment_for_level( "equip_hacker_zm" ); + level.zombie_equipment_player_init = undefined; +} +offhand_weapon_give_override( str_weapon ) +{ + self endon( "death" ); + if( is_tactical_grenade( str_weapon ) && IsDefined( self get_player_tactical_grenade() ) && !self is_player_tactical_grenade( str_weapon ) ) + { + self SetWeaponAmmoClip( self get_player_tactical_grenade(), 0 ); + self TakeWeapon( self get_player_tactical_grenade() ); + } + if( str_weapon == "zombie_black_hole_bomb" ) + { + self maps\_zombiemode_weap_black_hole_bomb::player_give_black_hole_bomb(); + return true; + } + if( str_weapon == "zombie_quantum_bomb" ) + { + self maps\_zombiemode_weap_quantum_bomb::player_give_quantum_bomb(); + return true; + } + return false; +} +include_powerups() +{ + include_powerup( "nuke" ); + include_powerup( "insta_kill" ); + include_powerup( "double_points" ); + include_powerup( "full_ammo" ); + include_powerup( "carpenter" ); + include_powerup( "fire_sale" ); + PreCacheItem( "minigun_zm" ); + include_powerup( "minigun" ); + include_powerup( "free_perk" ); + include_powerup( "random_weapon" ); + include_powerup( "bonus_points_player" ); + include_powerup( "bonus_points_team" ); + include_powerup( "lose_points_team" ); + include_powerup( "lose_perk" ); + include_powerup( "empty_clip" ); +} +include_equipment_for_level() +{ + include_equipment( "equip_gasmask_zm" ); + include_equipment( "equip_hacker_zm" ); +} +init_sounds() +{ + maps\_zombiemode_utility::add_sound( "break_stone", "break_stone" ); +} +electric_switch() +{ + trig = getent("use_elec_switch","targetname"); + trig sethintstring(&"ZOMBIE_ELECTRIC_SWITCH"); + trig setcursorhint( "HINT_NOICON" ); + level thread wait_for_power(); + trig thread maps\_zombiemode_perks::vending_machine_trigger_think(); + trig waittill("trigger",user); + if(IsDefined(trig)) + { + trig delete(); + } + flag_set( "power_on" ); + Objective_State(8,"done"); + user thread delayed_poweron_vox(); +} +delayed_poweron_vox() +{ + self endon( "death" ); + self endon( "disconnect" ); + wait(11.5); + if( isdefined( self ) ) + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "poweron" ); + } +} +wait_for_power() +{ + master_switch = getent("elec_switch","targetname"); + master_switch notsolid(); + flag_wait( "power_on" ); + master_switch rotateroll(-90,.3); + master_switch playsound("zmb_switch_flip"); + level notify("revive_on"); + wait_network_frame(); + level notify("doubletap_on"); + wait_network_frame(); + level notify("divetonuke_on"); + wait_network_frame(); + level notify("marathon_on"); + wait_network_frame(); + level notify("deadshot_on"); + wait_network_frame(); + level notify("additionalprimaryweapon_on"); + wait_network_frame(); + level notify("electric_door"); + clientnotify("ZPO"); + master_switch waittill("rotatedone"); + playfx(level._effect["switch_sparks"] ,getstruct("elec_switch_fx","targetname").origin); + master_switch playsound("zmb_turn_on"); +} +moon_devgui( cmd ) +{ +} +custom_add_weapons() +{ + maps\_zombiemode_weapons::add_zombie_weapon( "microwavegundw_zm", "microwavegundw_upgraded_zm", &"ZOMBIE_WEAPON_MICROWAVEGUN_DW", 10, "microwave", "", undefined ); + maps\_zombiemode_weapons::add_zombie_weapon( "zombie_quantum_bomb", undefined, &"ZOMBIE_WEAPON_SATCHEL_2000", 2000, "quantum", "", undefined ); +} +moon_zombie_death_response() +{ + self StartRagdoll(); + rag_x = RandomIntRange( -50, 50 ); + rag_y = RandomIntRange( -50, 50 ); + rag_z = RandomIntRange( 25, 45 ); + force_min = 75; + force_max = 100; + if ( self.damagemod == "MOD_MELEE" ) + { + force_min = 40; + force_max = 50; + rag_z = 15; + } + else if ( self.damageweapon == "m1911_zm" ) + { + force_min = 60; + force_max = 75; + rag_z = 20; + } + else if ( self.damageweapon == "ithaca_zm" || self.damageweapon == "ithaca_upgraded_zm" || + self.damageweapon == "rottweil72_zm" || self.damageweapon == "rottweil72_upgraded_zm" || + self.damageweapon == "spas_zm" || self.damageweapon == "spas_upgraded_zm" || + self.damageweapon == "hs10_zm" || self.damageweapon == "hs10_upgraded_zm" ) + { + force_min = 100; + force_max = 150; + } + scale = RandomIntRange( force_min, force_max ); + rag_x = self.damagedir[0] * scale; + rag_y = self.damagedir[1] * scale; + dir = ( rag_x, rag_y, rag_z ); + self LaunchRagdoll( dir ); + return false; +} +setup_water_physics() +{ + flag_wait( "all_players_connected" ); + players = GetPlayers(); + for (i = 0; i < players.size; i++) + { + players[i] SetClientDvars("phys_buoyancy",1); + } +} +cliff_fall_death() +{ + trig = GetEnt("cliff_fall_death", "targetname"); + if(IsDefined(trig)) + { + while(true) + { + trig waittill("trigger", who); + if(!is_true(who.insta_killed)) + { + who thread insta_kill_player(); + } + } + } +} +insta_kill_player() +{ + self endon("disconnect"); + if(is_true(self.insta_killed)) + { + return; + } + if(is_player_killable(self)) + { + self.insta_killed = true; + in_last_stand = false; + if( self maps\_laststand::player_is_in_laststand() ) + { + in_last_stand = true; + } + if(flag("solo_game")) + { + if(isDefined(self.lives) && self.lives > 0) + { + self.waiting_to_revive = true; + if(flag("both_tunnels_breached")) + { + point = moon_digger_respawn(self); + if(!isDefined(point)) + { + points = getstruct("bridge_zone","script_noteworthy"); + spawn_points = getstructarray(points.target,"targetname"); + num = self getentitynumber(); + point = spawn_points[num]; + } + } + else + { + points = getstruct("bridge_zone","script_noteworthy"); + spawn_points = getstructarray(points.target,"targetname"); + num = self getentitynumber(); + point = spawn_points[num]; + } + self dodamage(self.health + 1000,(0,0,0)); + wait(1.5); + self setorigin(point.origin + (0,0,20)); + self.angles = point.angles; + if(in_last_stand) + { + flag_set("instant_revive"); + wait_network_frame(); + flag_clear("instant_revive"); + } + else + { + self thread maps\_laststand::auto_revive( self ); + self.waiting_to_revive = false; + self.solo_respawn = 0; + self.lives = 0; + } + } + else + { + self dodamage(self.health + 1000,(0,0,0)); + } + } + else + { + self dodamage(self.health + 1000,(0,0,0)); + wait_network_frame(); + self.bleedout_time = 0; + } + self.insta_killed = false; + } +} +moon_respawn_override(player) +{ + if(flag("both_tunnels_breached")) + { + point = moon_digger_respawn(player); + if(isDefined(point)) + { + self notify( "one_giant_leap" ); + return point.origin; + } + } + else + { + return undefined; + } + return undefined; +} +is_player_killable( player, checkIgnoreMeFlag ) +{ + if( !IsDefined( player ) ) + { + return false; + } + if( !IsAlive( player ) ) + { + return false; + } + if( !IsPlayer( player ) ) + { + return false; + } + if( player.sessionstate == "spectator" ) + { + return false; + } + if( player.sessionstate == "intermission" ) + { + return false; + } + if ( player isnotarget() ) + { + return false; + } + if( isdefined(checkIgnoreMeFlag) && player.ignoreme ) + { + return false; + } + return true; +} +moon_digger_respawn(revivee) +{ + spawn_points = getstructarray( "player_respawn_point", "targetname" ); + if( level.zones[ "airlock_west2_zone" ].is_enabled ) + { + for ( i = 0; i < spawn_points.size; i++ ) + { + if ( spawn_points[i].script_noteworthy == "airlock_west2_zone" ) + { + spawn_array = getstructarray( spawn_points[i].target, "targetname" ); + for ( j = 0; j < spawn_array.size; j++ ) + { + if ( spawn_array[j].script_int == ( revivee.entity_num + 1 ) ) + { + return spawn_array[j]; + } + } + return spawn_array[0]; + } + } + } + else if( level.zones[ "airlock_east2_zone" ].is_enabled ) + { + for ( i = 0; i < spawn_points.size; i++ ) + { + if ( spawn_points[i].script_noteworthy == "airlock_east2_zone" ) + { + spawn_array = getstructarray( spawn_points[i].target, "targetname" ); + for ( j = 0; j < spawn_array.size; j++ ) + { + if ( spawn_array[j].script_int == ( revivee.entity_num + 1 ) ) + { + return spawn_array[j]; + } + } + return spawn_array[0]; + } + } + } + return undefined; +} +moon_reset_respawn_overide() +{ + level waittill( "between_round_over" ); + level.check_valid_spawn_override = undefined; +} +init_extra_blackhole_anims() +{ + level.scr_anim["quad_zombie"]["slow_pull_1"] = %ai_zombie_quad_blackhole_crawl_slow_v1; + level.scr_anim["quad_zombie"]["slow_pull_2"] = %ai_zombie_quad_blackhole_crawl_slow_v2; + level.scr_anim["quad_zombie"]["slow_pull_3"] = %ai_zombie_quad_blackhole_crawl_slow_v1; + level.scr_anim["quad_zombie"]["fast_pull_1"] = %ai_zombie_quad_blackhole_crawl_fast_v1; + level.scr_anim["quad_zombie"]["fast_pull_2"] = %ai_zombie_quad_blackhole_crawl_fast_v2; + level.scr_anim["quad_zombie"]["fast_pull_3"] = %ai_zombie_quad_blackhole_crawl_fast_v2; + level.scr_anim["quad_zombie"]["black_hole_death_1"] = %ai_zombie_quad_blackhole_death_v1; + level.scr_anim["quad_zombie"]["black_hole_death_2"] = %ai_zombie_quad_blackhole_death_v2; + level.scr_anim["quad_zombie"]["black_hole_death_3"] = %ai_zombie_quad_blackhole_death_v2; + level.scr_anim[ "quad_zombie" ][ "attracted_death_1" ] = %ai_zombie_quad_blackhole_death_preburst_v1; + level.scr_anim[ "quad_zombie" ][ "attracted_death_2" ] = %ai_zombie_quad_blackhole_death_preburst_v2; + level.scr_anim[ "quad_zombie" ][ "attracted_death_3" ] = %ai_zombie_quad_blackhole_death_preburst_v1; + level.scr_anim[ "quad_zombie" ][ "attracted_death_4" ] = %ai_zombie_quad_blackhole_death_preburst_v2; + level.scr_anim["quad_zombie"]["crawler_slow_pull_1"] = %ai_zombie_quad_blackhole_crawl_slow_v1; + level.scr_anim["quad_zombie"]["crawler_slow_pull_2"] = %ai_zombie_quad_blackhole_crawl_slow_v2; + level.scr_anim["quad_zombie"]["crawler_fast_pull_1"] = %ai_zombie_quad_blackhole_crawl_fast_v1; + level.scr_anim["quad_zombie"]["crawler_fast_pull_2"] = %ai_zombie_quad_blackhole_crawl_fast_v2; + level.scr_anim["quad_zombie"]["crawler_fast_pull_3"] = %ai_zombie_quad_blackhole_crawl_fast_v2; + level.scr_anim["quad_zombie"]["crawler_black_hole_death_1"] =%ai_zombie_quad_blackhole_death_v1; + level.scr_anim["quad_zombie"]["crawler_black_hole_death_2"] =%ai_zombie_quad_blackhole_death_v2; + level.scr_anim["quad_zombie"]["crawler_black_hole_death_3"] =%ai_zombie_quad_blackhole_death_v2; +} +blackhole_bomb_area_check() +{ + black_hole_teleport_structs = undefined; + org = spawn("script_origin",(0,0,0)); + if(flag("enter_nml")) + { + black_hole_teleport_structs = getstructarray("struct_black_hole_teleport_nml","targetname"); + } + else if(flag("both_tunnels_blocked")) + { + black_hole_teleport_structs = getstructarray("struct_black_hole_teleport","targetname"); + all_players_trapped = false; + final_structs = black_hole_teleport_structs; + discarded_zones = []; + all_players = get_players(); + all_zones = getentarray("player_volume","script_noteworthy"); + players_touching = 0; + for(x=0;x= 90 ) + { + digger_activate(); + last_active_round = level.round_number; + first_digger_activated = true; + } + rnd = 0; + while(!first_digger_activated) + { + level waittill( "between_round_over" ); + if(level flag_exists( "teleporter_used" ) && flag( "teleporter_used" ) ) + { + continue; + } + if( randomint(100) >= 90 || rnd > 2) + { + digger_activate(); + last_active_round = level.round_number; + first_digger_activated = true; + } + rnd++; + } + while(1) + { + level waittill( "between_round_over" ); + if(level flag_exists( "teleporter_used" ) && flag( "teleporter_used" ) ) + { + continue; + } + if(flag("digger_moving")) + { + continue; + } + if(level.round_number < 10) + { + min_activation_time = 3; + max_activation_time = 8; + } + else + { + min_activation_time = 2; + max_activation_time = 8; + } + diff = abs(level.round_number - last_active_round); + if( diff >= min_activation_time && diff < max_activation_time) + { + if( randomint(100) >= 80 ) + { + digger_activate(); + last_active_round = level.round_number; + } + } + else if(diff >= max_activation_time) + { + digger_activate(); + last_active_round = level.round_number; + } + } +} +digger_activate(force_digger) +{ + if( isDefined(force_digger)) + { + flag_set("start_" + force_digger + "_digger"); + level thread send_clientnotify( force_digger, false ); + level thread play_digger_start_vox( force_digger ); + wait(1); + level notify(force_digger + "_vox_timer_stop"); + level thread play_timer_vox( force_digger ); + return; + } + non_active = []; + for(i=0;i 0) + { + digger_to_activate = random(non_active); + flag_set("start_" + digger_to_activate + "_digger"); + level thread send_clientnotify( digger_to_activate, false ); + level thread play_digger_start_vox( digger_to_activate ); + wait(1); + level thread play_timer_vox( digger_to_activate ); + } +} +play_digger_start_vox( digger_name ) +{ + level thread maps\zombie_moon_amb::play_mooncomp_vox( "vox_mcomp_digger_start_", digger_name ); + wait(7); + if( !is_true( level.on_the_moon ) ) + return; + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "digger", "incoming" ); +} +send_clientnotify( digger_name, pause ) +{ + switch( digger_name ) + { + case "hangar": + if( !pause ) + clientnotify( "Dz3" ); + else + clientnotify( "Dz3e" ); + break; + case "teleporter": + if( !pause ) + clientnotify( "Dz2" ); + else + clientnotify( "Dz2e" ); + break; + case "biodome": + if( !pause ) + clientnotify( "Dz5" ); + else + clientnotify( "Dz5e" ); + break; + } +} +digger_think_move() +{ + targets = getentarray(self.target,"targetname"); + if(targets[0].model == "p_zom_digger_body") + { + tracks = targets[0]; + arm = targets[1]; + } + else + { + arm = targets[0]; + tracks = targets[1]; + } + blade_center = GetEnt(arm.target, "targetname"); + blade = GetEnt(blade_center.target,"targetname"); + blade LinkTo(blade_center); + blade_center LinkTo( arm ); + arm LinkTo( self ); + self linkto(tracks); + tracks clearclientflag(level._CLIENTFLAG_SCRIPTMOVER_DIGGER_MOVING_EARTHQUAKE_RUMBLE); + arm clearclientflag(level._CLIENTFLAG_SCRIPTMOVER_DIGGER_ARM_FX); + switch(tracks.target) + { + case "hangar_vehicle_path": + self.digger_name = "hangar"; + self.down_angle = -45; + self.up_angle = 45; + self.zones = array("cata_right_start_zone","cata_right_middle_zone","cata_right_end_zone"); + break; + case "digger_path_teleporter": + self.digger_name = "teleporter"; + self.down_angle = -52; + self.up_angle = 52; + self.zones = array("cata_left_middle_zone","cata_left_start_zone"); + self.arm_lowered = false; + break; + case "digger_path_biodome": + self.digger_name = "biodome"; + self.down_angle = -20; + self.up_angle = 20; + self.zones = array("forest_zone"); + break; + } + self.hacked_flag = self.digger_name + "_digger_hacked"; + self.start_flag = "start_" + self.digger_name + "_digger"; + self.arm_lowered = false; + tracks digger_follow_path(self,undefined,arm); + self endon(self.digger_name + "_digger_hacked"); + self stoploopsound( 2 ); + self playsound( "evt_dig_move_stop" ); + self unlink(); + level.arm_move_speed = 11; + level.blade_spin_speed = 80; + level.blade_spin_up_time = 1; + body_turn = RandomIntRange(-1,1); + body_turn_speed = max(1, abs(body_turn))* .3; + arm Unlink(self); + arm.og_angles = arm.angles; + self thread digger_arm_logic(arm,blade_center,tracks); + self thread wait_for_digger_hack_digging(arm,blade_center,tracks); + self thread wait_for_digger_hack_moving(arm,blade_center,tracks); +} +wait_for_digger_hack_digging(arm,blade_center,tracks) +{ + self endon("stop_monitor"); + self waittill("digger_arm_raised"); + blade_center LinkTo( arm ); + arm LinkTo( self ); + self linkto(tracks); + tracks digger_follow_path(self,true,arm); + flag_clear(self.hacked_flag); + flag_clear(self.start_flag); + self thread digger_think_move(); +} +wait_for_digger_hack_moving(arm,blade_center,tracks) +{ + self endon("arm_lower"); + while(1) + { + level waittill("digger_hacked",digger_name); + if(digger_name == self.digger_name) + { + flag_clear(self.hacked_flag); + flag_clear(self.start_flag); + self notify("stop_monitor"); + self thread digger_think_move(); + break; + } + } +} +digger_arm_breach_logic( arm,blade_center,tracks ) +{ + self endon( self.hacked_flag ); + wait(8); + if(flag(self.hacked_flag)) + { + return; + } + level notify("digger_arm_smash",self.digger_name,self.zones); + switch(self.digger_name) + { + case "hangar": + exploder(101); + flag_set("hangar_breached"); + flag_set("hangar_blocked"); + if(isDefined(level.tunnel_11_destroyed)) + { + level.tunnel_11_destroyed show(); + } + clientnotify("sl1"); + clientnotify("sl7"); + level.zones["cata_right_start_zone"].adjacent_zones["cata_right_middle_zone"].is_connected = false; + level.zones["cata_right_middle_zone"].adjacent_zones["cata_right_start_zone"].is_connected = false; + break; + case "teleporter": + exploder(111); + flag_set("teleporter_breached"); + flag_set("teleporter_blocked"); + if(isDefined(level.tunnel_6_destroyed)) + { + level.tunnel_6_destroyed show(); + } + clientnotify("sl2"); + clientnotify("sl3"); + level.zones["airlock_west2_zone"].adjacent_zones["cata_left_middle_zone"].is_connected = false; + level.zones["cata_left_middle_zone"].adjacent_zones["airlock_west2_zone"].is_connected = false; + break; + case "biodome": + break; + } + if(flag("hangar_breached") && flag("teleporter_breached") ) + { + flag_set("both_tunnels_breached"); + } + if(flag("teleporter_blocked") && flag("hangar_blocked")) + { + flag_set("both_tunnels_blocked"); + } + else + { + flag_clear("both_tunnels_blocked"); + } + arm waittill ("rotatedone"); + arm playsound( "evt_dig_arm_stop" ); + blade_center UnLink(arm); + switch( self.digger_name ) + { + case "hangar": + blade_center playloopsound( "evt_dig_wheel_loop1", 1 ); + break; + case "teleporter": + blade_center playloopsound( "evt_dig_wheel_loop1", 1 ); + break; + case "biodome": + blade_center playloopsound( "evt_dig_wheel_loop2", 1 ); + break; + } + blade_center setclientflag(level._CLIENTFLAG_SCRIPTMOVER_DIGGER_DIGGING_EARTHQUAKE_RUMBLE); + blade_center RotatePitch(720, 5, level.blade_spin_up_time, level.blade_spin_up_time); + smokeAngles = ( 0, arm.angles[1]+180, arm.angles[2] ); + forward = anglesToForward( smokeAngles ); + wait(2); + self.arm_moving = undefined; +} +digger_arm_logic(arm,blade_center,tracks) +{ + arm setclientflag(level._CLIENTFLAG_SCRIPTMOVER_DIGGER_ARM_FX); + tracks setclientflag(level._CLIENTFLAG_SCRIPTMOVER_DIGGER_MOVING_EARTHQUAKE_RUMBLE); + if(!flag(self.hacked_flag)) + { + if(!is_true(self.arm_lowered)) + { + self notify("arm_lower"); + self.arm_lowered = true; + self.arm_moving = true; + arm Unlink(self); + arm playsound( "evt_dig_arm_move" ); + arm RotatePitch( self.down_angle, level.arm_move_speed, level.arm_move_speed/4, level.arm_move_speed/4); + self thread digger_arm_breach_logic( arm, blade_center, tracks ); + } + while(!flag(self.hacked_flag)) + { + blade_center RotatePitch(360, 3 ); + wait(3); + } + } + while( is_true(self.arm_moving) && !flag(self.hacked_flag) ) + { + wait(.1); + } + if(is_true(self.arm_lowered)) + { + self.arm_moving = true; + self.arm_lowered = false; + blade_center stoploopsound (2); + blade_center clearclientflag(level._CLIENTFLAG_SCRIPTMOVER_DIGGER_DIGGING_EARTHQUAKE_RUMBLE); + blade_center LinkTo(arm); + arm playsound( "evt_dig_arm_move" ); + arm RotatePitch(self.up_angle, level.arm_move_speed, level.arm_move_speed/4, level.arm_move_speed/4 ); + wait(2); + level notify("digger_arm_lift",self.digger_name); + switch(self.digger_name) + { + case "hangar": + stop_exploder(101); + if(flag("tunnel_11_door1")) + { + level.zones["cata_right_start_zone"].adjacent_zones["cata_right_middle_zone"].is_connected = true; + level.zones["cata_right_middle_zone"].adjacent_zones["cata_right_start_zone"].is_connected = true; + } + flag_clear("hangar_blocked"); + flag_clear("both_tunnels_blocked"); + break; + case "teleporter": + stop_exploder(111); + if(flag("catacombs_west4")) + { + level.zones["airlock_west2_zone"].adjacent_zones["cata_left_middle_zone"].is_connected = true; + level.zones["cata_left_middle_zone"].adjacent_zones["airlock_west2_zone"].is_connected = true; + } + flag_clear("teleporter_blocked"); + flag_clear("both_tunnels_blocked"); + break; + } + arm waittill ("rotatedone"); + arm LinkTo( self ); + arm playsound( "evt_dig_arm_stop" ); + self.arm_moving = undefined; + } + self notify("digger_arm_raised"); +} +digger_think_panel(blocker_name,trig_name,start_flag,hacked_flag,blocker_func,digger_name) +{ + if(isDefined(blocker_name)) + { + dmg_trig = getent("digger_" + digger_name + "_dmg","targetname"); + blocker = getent(blocker_name,"targetname"); + level thread [[blocker_func]](blocker,digger_name,dmg_trig); + } + if(!isDefined(blocker_name) && isDefined(blocker_func)) + { + level thread [[blocker_func]](digger_name); + } + trig = getent(trig_name,"targetname"); + struct = SpawnStruct(); + struct.origin = trig.origin - (0,0,12); + struct.script_int = -1000; + struct.script_float = 5; + struct.digger_name = digger_name; + struct.hacked_flag = hacked_flag; + struct.start_flag = start_flag; + struct.custom_debug_color = (255,0,0); + struct.radius = 64; + struct.height = 64; + struct.custom_string = &"ZOMBIE_MOON_DISABLE_DIGGER"; + struct.no_bullet_trace = true; + struct.no_sight_check = true; + trig UseTriggerRequireLookAt(); + trig setcursorhint( "HINT_NOICON" ); + trig thread maps\_zombiemode_equip_hacker::hide_hint_when_hackers_active(); + trig SetHintString(&"ZOMBIE_MOON_NO_HACK"); + trig thread set_hint_on_digger_trig(start_flag,hacked_flag,struct); +} +set_hint_on_digger_trig(start_flag,hacked_flag,struct) +{ + while(1) + { + if(!flag(start_flag)) + { + maps\_zombiemode_equip_hacker::deregister_hackable_struct(struct); + self sethintstring(&"ZOMBIE_MOON_NO_HACK"); + } + while(!flag(start_flag)) + { + wait .05; + } + if(flag(start_flag) && !flag(hacked_flag)) + { + maps\_zombiemode_equip_hacker::register_pooled_hackable_struct(struct, ::digger_hack_func, ::digger_hack_qualifer); + self sethintstring(&"ZOMBIE_MOON_SYSTEM_ONLINE"); + switch(struct.digger_name) + { + case "hangar":level clientnotify("HCA");break; + case "teleporter": level clientnotify("TCA");break; + case "biodome":level clientnotify("BCA");break; + } + } + while(!flag(hacked_flag)) + { + wait .05; + } + if(flag(hacked_flag)) + { + maps\_zombiemode_equip_hacker::deregister_hackable_struct(struct); + self sethintstring(&"ZOMBIE_MOON_NO_HACK"); + switch(struct.digger_name) + { + case "hangar":level clientnotify("HCO");break; + case "teleporter": level clientnotify("TCO");break; + case "biodome":level clientnotify("BCO");break; + } + } + flag_waitopen(hacked_flag); + wait(.05); + } +} +digger_hack_func(hacker) +{ + level thread send_clientnotify( self.digger_name, true ); + hacker thread maps\_zombiemode_audio::create_and_play_dialog( "digger", "hacked" ); + level thread delayed_computer_hacked_vox( self.digger_name ); + flag_set(self.hacked_flag); + level notify(self.digger_name + "_vox_timer_stop"); + while(1) + { + level waittill("digger_reached_end",digger_name); + if(digger_name == self.digger_name) + { + break; + } + } + level notify("digger_hacked",self.digger_name ); +} +delayed_computer_hacked_vox( digger ) +{ + wait(4); + level thread maps\zombie_moon_amb::play_mooncomp_vox( "vox_mcomp_digger_hacked_", digger ); +} +digger_hack_qualifer(player) +{ + if(!flag(self.hacked_flag)) + { + return true; + } + return false; +} +digger_think_biodome(digger_name) +{ + while(1) + { + level waittill("digger_arm_smash",name,zones); + if(name == digger_name) + { + flag_set("biodome_breached"); + level thread biodome_breach_fx(); + for(i=0;i0 ) + { + curr_time = GetTime(); + time_used = (curr_time - digger_start_time)/1000.0; + time_left = (level.diggers_global_time - time_used); + if( time_left <= 180.0 && !played180sec) + { + level thread maps\zombie_moon_amb::play_mooncomp_vox( "vox_mcomp_digger_start_", digger_name ); + played180sec = true; + } + if( time_left <= 120.0 && !played120sec) + { + level thread maps\zombie_moon_amb::play_mooncomp_vox( "vox_mcomp_digger_start_", digger_name ); + played120sec = true; + } + if( time_left <= 60.0 && !played60sec) + { + level thread maps\zombie_moon_amb::play_mooncomp_vox( "vox_mcomp_digger_time_60_", digger_name ); + played60sec = true; + } + if( time_left <= 30.0 && !played30sec ) + { + level thread maps\zombie_moon_amb::play_mooncomp_vox( "vox_mcomp_digger_time_30_", digger_name ); + played30sec = true; + } + wait( 1.0 ); + } +} +get_correct_times( digger ) +{ + level endon( "digger_arm_smash" ); + for(i=0;i<500;i++) + { + iprintlnbold( i ); + wait(1); + } +} +waitfor_smash() +{ + while(1) + { + level waittill( "digger_arm_smash", digger, zones ); + level thread play_delayed_breach_vox( digger ); + level thread switch_ambient_packages( digger ); + level thread player_breach_vox( zones ); + } +} +switch_ambient_packages( digger ) +{ + switch( digger ) + { + case "hangar": + clientnotify( "Az3b" ); + level.audio_zones_breached["3b"] = true; + flag_wait( "tunnel_11_door1" ); + clientnotify( "Az3a" ); + level.audio_zones_breached["3a"] = true; + flag_wait( "tunnel_11_door2" ); + clientnotify( "Az3c" ); + level.audio_zones_breached["3c"] = true; + break; + case "teleporter": + clientnotify( "Az2b" ); + level.audio_zones_breached["2b"] = true; + flag_wait( "tunnel_6_door1" ); + clientnotify( "Az2a" ); + level.audio_zones_breached["2a"] = true; + break; + case "biodome": + clientnotify( "Az5" ); + level.audio_zones_breached["5"] = true; + break; + } +} +play_delayed_breach_vox( digger ) +{ + if( !level.on_the_moon ) + return; + playsoundatposition( "evt_breach_alarm", (0,0,0) ); + wait(1.5); + if( !level.on_the_moon ) + return; + playsoundatposition( "evt_breach_alarm", (0,0,0) ); + wait(1.5); + if( !level.on_the_moon ) + return; + playsoundatposition( "evt_breach_alarm", (0,0,0) ); + wait(2); + level thread maps\zombie_moon_amb::play_mooncomp_vox( "vox_mcomp_digger_breach_", digger ); +} +player_breach_vox( zones ) +{ + players = get_players(); + for(i=0;i 0.95 ) + { + last_node = current_node; + current_node = next_node; + if(direction == "fwd") + { + next_node = current_node.next_node; + self thread digger_follow_path_recalc_speed( current_node ); + continue; + } + else + { + next_node = current_node.previous_node; + self thread digger_follow_path_recalc_speed( current_node ); + continue; + } + } + } + } + fraction = d1 / ( d1 + d2 ); + speed = current_node.speed + ( next_node.speed - current_node.speed ) * fraction; + speed = (speed * .5) * level.digger_speed_multiplier; + look_ahead = current_node.lookahead + ( next_node.lookahead - current_node.lookahead ) * fraction; + look_dist = current_node.lookahead * speed; + node_length = Length( next_node.origin - current_node.origin ); + dist = ( fraction * node_length ) + look_dist; + look_pos = ( 0, 0, 0 ); + if ( dist > node_length ) + { + delta = dist - node_length; + look_pos = next_node.origin + next_node_dir * delta; + } + else + { + look_pos = self.origin + curr_node_dir * dist; + } + look_dir = VectorNormalize( look_pos - self.origin ); + if(direction == "fwd") + { + velocity = look_dir * self.digger_speed * level.digger_speed_multiplier; + } + else + { + velocity = look_dir * speed; + } + self.origin = self.origin + velocity * 0.05; + look_ahead = current_node.lookahead + ( next_node.lookahead - current_node.lookahead ) * fraction; + self.angles = current_node.angles + (next_node.angles - current_node.angles ) * fraction; + wait( 0.05 ); + } + if(body.digger_name == "hangar") + { + stop_exploder(102); + } + else if(body.digger_name == "teleporter") + { + stop_exploder (112); + } + self clearclientflag(level._CLIENTFLAG_SCRIPTMOVER_DIGGER_MOVING_EARTHQUAKE_RUMBLE); + arm clearclientflag(level._CLIENTFLAG_SCRIPTMOVER_DIGGER_ARM_FX); + flag_clear("digger_moving"); + level notify("digger_reached_end",body.digger_name); + self notify("path_end"); +} +quantum_bomb_remove_digger_validation( position ) +{ + if ( !flag( "both_tunnels_breached" ) ) + { + return false; + } + range_squared = 600 * 600; + hangar_blocker = getent( "digger_hangar_blocker","targetname" ); + if ( DistanceSquared( hangar_blocker.origin, position ) < range_squared ) + { + return true; + } + teleporter_blocker = getent( "digger_teleporter_blocker","targetname" ); + if ( DistanceSquared( teleporter_blocker.origin, position ) < range_squared ) + { + return true; + } + return false; +} +quantum_bomb_remove_digger_result( position ) +{ + range_squared = 600 * 600; + hangar_blocker = getent( "digger_hangar_blocker","targetname" ); + if ( DistanceSquared( hangar_blocker.origin, position ) < range_squared ) + { + flag_set( "hangar_digger_hacked" ); + [[level.quantum_bomb_play_area_effect_func]]( position ); + } + teleporter_blocker = getent( "digger_teleporter_blocker","targetname" ); + if ( DistanceSquared( teleporter_blocker.origin, position ) < range_squared ) + { + flag_set( "teleporter_digger_hacked" ); + [[level.quantum_bomb_play_area_effect_func]]( position ); + } +} + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_moon_distance_tracking.gsc b/BO1/PC/ZM/maps/zombie_moon_distance_tracking.gsc new file mode 100644 index 0000000..599171d Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_moon_distance_tracking.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_moon_ffotd.gsc b/BO1/PC/ZM/maps/zombie_moon_ffotd.gsc new file mode 100644 index 0000000..c498977 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_moon_ffotd.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_moon_fx.gsc b/BO1/PC/ZM/maps/zombie_moon_fx.gsc new file mode 100644 index 0000000..b5d80dc Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_moon_fx.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_moon_gravity.gsc b/BO1/PC/ZM/maps/zombie_moon_gravity.gsc new file mode 100644 index 0000000..d97baec --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_moon_gravity.gsc @@ -0,0 +1,873 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include animscripts\zombie_Utility; +#using_animtree( "generic_human" ); +init() +{ + level.zombie_init_done = ::zombie_moon_init_done; + level thread init_low_gravity_anims(); + level thread init_low_gravity_fx(); + maps\_zombiemode_spawner::register_zombie_death_animscript_callback( ::gravity_zombie_death_response ); + level._ZOMBIE_ACTOR_FLAG_LOW_GRAVITY = 0; + level thread check_player_gravity(); + level thread update_zombie_locomotion(); + level thread update_low_gravity_fx(); + level thread update_zombie_gravity_transition(); + level thread watch_player_grenades(); +} +init_low_gravity_anims() +{ + level.scr_anim["zombie"]["walk_moon1"] = %ai_zombie_walk_moon_v1; + level.num_anim["zombie"]["walk"] = 1; + level.scr_anim["zombie"]["run_moon1"] = %ai_zombie_run_moon_v1; + level.scr_anim["zombie"]["run_moon2"] = %ai_zombie_run_moon_v2; + level.scr_anim["zombie"]["run_moon3"] = %ai_zombie_run_moon_v3; + level.scr_anim["zombie"]["run_moon4"] = %ai_zombie_run_moon_v4; + level.num_anim["zombie"]["run"] = 4; + level.scr_anim["zombie"]["sprint_moon1"] = %ai_zombie_sprint_moon_v1; + level.scr_anim["zombie"]["sprint_moon2"] = %ai_zombie_sprint_moon_v2; + level.scr_anim["zombie"]["sprint_moon3"] = %ai_zombie_sprint_moon_v3; + level.scr_anim["zombie"]["sprint_moon4"] = %ai_zombie_sprint_moon_v4; + level.num_anim["zombie"]["sprint"] = 4; + level.scr_anim["zombie"]["crawl_moon1"] = %ai_zombie_crawl_moon_v1; + level.scr_anim["zombie"]["crawl_moon2"] = %ai_zombie_crawl_moon_v2; + level.scr_anim["zombie"]["crawl_moon3"] = %ai_zombie_crawl_moon_v3; + level.num_anim["zombie"]["crawl"] = 3; + level.scr_anim["quad_zombie"]["walk_moon1"] = %ai_zombie_quad_crawl_moon; + level.scr_anim["quad_zombie"]["walk_moon2"] = %ai_zombie_quad_crawl_moon_01; + level.num_anim["quad_zombie"]["walk"] = 2; + level.scr_anim["quad_zombie"]["run_moon1"] = %ai_zombie_quad_crawl_run_moon; + level.scr_anim["quad_zombie"]["run_moon2"] = %ai_zombie_quad_crawl_run_moon_2; + level.scr_anim["quad_zombie"]["run_moon3"] = %ai_zombie_quad_crawl_run_moon_3; + level.scr_anim["quad_zombie"]["run_moon4"] = %ai_zombie_quad_crawl_run_moon_4; + level.scr_anim["quad_zombie"]["run_moon5"] = %ai_zombie_quad_crawl_run_moon_5; + level.num_anim["quad_zombie"]["run"] = 5; + level.scr_anim["quad_zombie"]["sprint_moon1"] = %ai_zombie_quad_crawl_sprint_moon; + level.scr_anim["quad_zombie"]["sprint_moon2"] = %ai_zombie_quad_crawl_sprint_moon_2; + level.scr_anim["quad_zombie"]["sprint_moon3"] = %ai_zombie_quad_crawl_sprint_moon_3; + level.num_anim["quad_zombie"]["sprint"] = 3; +} +init_low_gravity_fx() +{ + keys = GetArrayKeys( level.zones ); + for ( i = 0; i < level.zones.size; i++ ) + { + if ( keys[i] == "nml_zone" ) + { + continue; + } + ZeroGravityVolumeOn( keys[i] ); + } +} +gravity_trigger() +{ + while ( 1 ) + { + self waittill( "trigger", who ); + if ( !isplayer( who ) ) + { + self thread trigger_thread( who, ::gravity_zombie_in, ::gravity_zombie_out ); + } + else + { + self thread trigger_thread( who, ::gravity_player_in, ::gravity_player_out ); + } + } +} +gravity_zombie_in( ent, endon_condition ) +{ + if ( !isdefined( ent.in_low_gravity ) ) + { + ent.in_low_gravity = 0; + } + ent.in_low_gravity++; + ent SetClientFlag( level._ZOMBIE_ACTOR_FLAG_LOW_GRAVITY ); +} +gravity_zombie_out( ent ) +{ + if ( ent.in_low_gravity > 0 ) + { + ent.in_low_gravity--; + if ( ent.in_low_gravity == 0 ) + { + ent ClearClientFlag( level._ZOMBIE_ACTOR_FLAG_LOW_GRAVITY ); + } + } +} +gravity_player_in( ent, endon_condition ) +{ + ent setplayergravity( 136 ); +} +gravity_player_out( ent ) +{ + ent clearplayergravity(); +} +gravity_zombie_update( low_gravity, force_update ) +{ + if ( !isdefined( self.animname ) ) + { + return; + } + if ( is_true( self.ignore_gravity ) ) + { + return; + } + if ( !is_true( self.completed_emerging_into_playable_area ) ) + { + return; + } + if ( isdefined( self.in_low_gravity ) && self.in_low_gravity == low_gravity && !is_true( force_update ) ) + { + return; + } + self.in_low_gravity = low_gravity; + if ( low_gravity ) + { + self SetClientFlag( level._ZOMBIE_ACTOR_FLAG_LOW_GRAVITY ); + self thread zombie_low_gravity_locomotion(); + self.script_noteworthy = "moon_gravity"; + } + else + { + self.nogravity = undefined; + self.script_noteworthy = undefined; + self AnimMode( "none" ); + wait_network_frame(); + if ( isdefined( self ) ) + { + self ClearClientFlag( level._ZOMBIE_ACTOR_FLAG_LOW_GRAVITY ); + self thread reset_zombie_anim(); + } + } +} +gravity_zombie_death_response() +{ + if ( !isdefined( self.in_low_gravity ) || self.in_low_gravity == 0 ) + { + return false; + } + self StartRagdoll(); + rag_x = RandomIntRange( -50, 50 ); + rag_y = RandomIntRange( -50, 50 ); + rag_z = RandomIntRange( 25, 45 ); + force_min = 75; + force_max = 100; + if ( self.damagemod == "MOD_MELEE" ) + { + force_min = 40; + force_max = 50; + rag_z = 15; + } + else if ( self.damageweapon == "m1911_zm" ) + { + force_min = 60; + force_max = 75; + rag_z = 20; + } + else if ( self.damageweapon == "ithaca_zm" || self.damageweapon == "ithaca_upgraded_zm" || + self.damageweapon == "rottweil72_zm" || self.damageweapon == "rottweil72_upgraded_zm" || + self.damageweapon == "spas_zm" || self.damageweapon == "spas_upgraded_zm" || + self.damageweapon == "hs10_zm" || self.damageweapon == "hs10_upgraded_zm" ) + { + force_min = 100; + force_max = 150; + } + scale = RandomIntRange( force_min, force_max ); + rag_x = self.damagedir[0] * scale; + rag_y = self.damagedir[1] * scale; + dir = ( rag_x, rag_y, rag_z ); + self LaunchRagdoll( dir ); + return false; +} +zombie_moon_is_low_gravity_zone( zone_name ) +{ + zone = getentarray( zone_name, "targetname" ); + if ( isdefined( zone[0].script_string ) && zone[0].script_string == "lowgravity" ) + { + return true; + } + return false; +} +zombie_moon_check_zone() +{ + self endon( "death" ); + wait_network_frame(); + if ( !isdefined( self ) ) + { + return; + } + if ( is_true( self.ignore_gravity ) ) + { + return; + } + if ( self.zone_name == "nml_zone_spawners" || self.zone_name == "nml_area1_spawners" || self.zone_name == "nml_area2_spawners" ) + { + return; + } + if ( !is_true( self.completed_emerging_into_playable_area ) ) + { + self waittill( "completed_emerging_into_playable_area" ); + } + if ( is_true( level.on_the_moon ) && ( !flag( "power_on" ) || zombie_moon_is_low_gravity_zone( self.zone_name ) ) ) + { + self gravity_zombie_update( 1 ); + } + else + { + self gravity_zombie_update( 0 ); + } +} +zombie_moon_init_done() +{ + self.crawl_anim_override = ::zombie_moon_crawl_anim_override; + self thread zombie_moon_check_zone(); + self thread zombie_watch_nogravity(); + self thread zombie_watch_run_notetracks(); +} +zombie_low_gravity_locomotion() +{ + self endon( "death" ); + gravity_str = undefined; + if ( !self.has_legs ) + { + max = level.num_anim[self.animname]["crawl"] + 1; + rand = randomIntRange( 1, max ); + gravity_str = "crawl_moon" + rand; + } + else if ( self.zombie_move_speed == "walk" || self.zombie_move_speed == "run" || self.zombie_move_speed == "sprint" ) + { + max = level.num_anim[self.animname][self.zombie_move_speed] + 1; + rand = randomIntRange( 1, max ); + gravity_str = self.zombie_move_speed + "_moon" + rand; + } + if ( isdefined( gravity_str ) ) + { + gravity_anim = level.scr_anim[self.animname][gravity_str]; + self set_run_anim( gravity_str ); + self.run_combatanim = gravity_anim; + self.crouchRunAnim = gravity_anim; + self.crouchrun_combatanim = gravity_anim; + self.needs_run_update = true; + } +} +zombie_watch_nogravity() +{ + self endon( "death" ); + _OFF_GROUND_MAX = 32; + while ( 1 ) + { + if ( is_true( self.nogravity ) ) + { + ground = self groundpos( self.origin ); + dist = self.origin[2] - ground[2]; + if ( dist > _OFF_GROUND_MAX ) + { + self AnimMode( "none" ); + wait_network_frame(); + self.nogravity = undefined; + } + } + wait( 0.2 ); + } +} +zombie_watch_run_notetracks() +{ + self endon( "death" ); + while ( 1 ) + { + self waittill( "runanim", note ); + if ( !isdefined( self.script_noteworthy ) || self.script_noteworthy != "moon_gravity" ) + { + continue; + } + if ( note == "gravity off" ) + { + self AnimMode( "nogravity" ); + self.nogravity = true; + } + else if ( note == "gravity code" ) + { + self AnimMode( "none" ); + self.nogravity = undefined; + } + } +} +reset_zombie_anim() +{ + self endon( "death" ); + theanim = undefined; + if( self.has_legs ) + { + if(IsDefined(self.preslide_death)) + { + self.deathanim = self.preslide_death; + } + switch(self.zombie_move_speed) + { + case "walk": + theanim = "walk" + randomintrange(1, 8); + break; + case "run": + theanim = "run" + randomintrange(1, 6); + break; + case "sprint": + theanim = "sprint" + randomintrange(1, 4); + break; + } + } + else + { + legless_walk_anims = []; + legless_walk_anims = add_to_array( legless_walk_anims, "crawl1", false ); + legless_walk_anims = add_to_array( legless_walk_anims, "crawl5", false ); + legless_walk_anims = add_to_array( legless_walk_anims, "crawl_hand_1", false ); + legless_walk_anims = add_to_array( legless_walk_anims, "crawl_hand_2", false ); + rand_walk_anim = RandomInt( legless_walk_anims.size ); + legless_sprint_anims = []; + legless_sprint_anims = add_to_array( legless_sprint_anims, "crawl2", false ); + legless_sprint_anims = add_to_array( legless_sprint_anims, "crawl3", false ); + legless_sprint_anims = add_to_array( legless_sprint_anims, "crawl_sprint1", false ); + rand_sprint_anim = RandomInt( legless_sprint_anims.size ); + switch(self.zombie_move_speed) + { + case "walk": + theanim = legless_walk_anims[ rand_walk_anim ]; + break; + case "run": + theanim = "crawl4"; + break; + case "sprint": + theanim = legless_sprint_anims[ rand_sprint_anim ]; + break; + default: + theanim = "crawl4"; + break; + } + } + if ( isDefined(level.scr_anim[self.animname][theanim]) ) + { + self clear_run_anim(); + wait_network_frame(); + self set_run_anim( theanim ); + self.run_combatanim = level.scr_anim[self.animname][theanim]; + self.walk_combatanim = level.scr_anim[self.animname][theanim]; + self.crouchRunAnim = level.scr_anim[self.animname][theanim]; + self.crouchrun_combatanim = level.scr_anim[self.animname][theanim]; + self.needs_run_update = true; + return; + } + else + { + self thread reset_zombie_anim(); + } +} +zombie_moon_update_player_gravity() +{ + flag_wait( "all_players_connected" ); + LOW_G = 136; + player_zones = getentarray( "player_volume", "script_noteworthy" ); + while ( 1 ) + { + players = getplayers(); + for ( i = 0; i < player_zones.size; i++ ) + { + volume = player_zones[i]; + zone = undefined; + if ( isdefined( volume.targetname ) ) + { + zone = level.zones[ volume.targetname ]; + } + if ( isdefined( zone ) && is_true( zone.is_enabled ) ) + { + for ( j = 0; j < players.size; j++ ) + { + player = players[j]; + if ( is_player_valid( player ) && player istouching( volume ) ) + { + if ( is_true( level.on_the_moon ) && !flag( "power_on" ) ) + { + player setplayergravity( LOW_G ); + player.in_low_gravity = true; + } + else if ( isdefined( volume.script_string ) && volume.script_string == "lowgravity" ) + { + player setplayergravity( LOW_G ); + player.in_low_gravity = true; + } + else + { + player clearplayergravity(); + player.in_low_gravity = false; + } + } + } + } + } + wait_network_frame(); + } +} +zombie_moon_update_player_float() +{ + flag_wait( "all_players_connected" ); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] thread zombie_moon_player_float(); + } +} +zombie_moon_player_float() +{ + self endon( "death" ); + self endon( "disconnect" ); + boost_chance = 40; + while ( 1 ) + { + if ( is_player_valid( self ) && is_true( self.in_low_gravity ) && self IsOnGround() && self IsSprinting() ) + { + boost = RandomInt( 100 ); + if ( boost < boost_chance ) + { + time = RandomFloatRange( 0.75, 1.25 ); + wait( time ); + if ( is_true( self.in_low_gravity ) && self IsOnGround() && self IsSprinting() ) + { + self SetOrigin( self.origin + ( 0, 0, 1 ) ); + player_velocity = self GetVelocity(); + boost_velocity = player_velocity + ( 0, 0, 100 ); + self SetVelocity( boost_velocity ); + if( randomintrange( 0, 100 ) <= 15 ) + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "general", "moonjump" ); + } + boost_chance = 40; + wait( 2 ); + } + else + { + boost_chance += 10; + } + } + else + { + wait( 2 ); + } + } + wait_network_frame(); + } +} +check_player_gravity() +{ + flag_wait( "all_players_connected" ); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] thread low_gravity_watch(); + } +} +low_gravity_watch() +{ + self endon( "death" ); + self endon( "disconnect" ); + self notify("low_gravity_watch_start"); + self endon("low_gravity_watch_start"); + self.airless_vox_in_progess = false; + time_in_low_gravity = 0; + time_to_death = 0; + time_to_death_default = 15000; + time_to_death_jug = 17000; + time_til_damage = 0; + blur_level = 0; + blur_level_max = 7; + blur_occur = []; + blur_occur[0] = 1000; + blur_occur[1] = 1250; + blur_occur[2] = 1250; + blur_occur[3] = 1500; + blur_occur[4] = 1500; + blur_occur[5] = 1750; + blur_occur[6] = 2250; + blur_occur[7] = 2500; + blur_intensity = []; + blur_intensity[0] = 1; + blur_intensity[1] = 2; + blur_intensity[2] = 3; + blur_intensity[3] = 5; + blur_intensity[4] = 7; + blur_intensity[5] = 8; + blur_intensity[6] = 9; + blur_intensity[7] = 10; + blur_duration = []; + blur_duration[0] = 0.2; + blur_duration[1] = 0.25; + blur_duration[2] = 0.25; + blur_duration[3] = 0.5; + blur_duration[4] = 0.5; + blur_duration[5] = 0.75; + blur_duration[6] = 0.75; + blur_duration[7] = 1; + if ( is_true( level.debug_low_gravity ) ) + { + time_to_death = 3000; + } + startTime = GetTime(); + nextTime = GetTime(); + while ( 1 ) + { + diff = nextTime - startTime; + if ( IsGodMode( self ) ) + { + time_in_low_gravity = 0; + blur_level = 0; + wait( 1 ); + continue; + } + if ( !is_player_valid( self ) || !is_true( level.on_the_moon ) ) + { + time_in_low_gravity = 0; + blur_level = 0; + wait_network_frame(); + continue; + } + if ( ( !flag( "power_on" ) || is_true( self.in_low_gravity ) ) && !self maps\_zombiemode_equip_gasmask::gasmask_active() ) + { + self thread airless_vox_without_repeat(); + time_til_damage += diff; + time_in_low_gravity += diff; + if ( self HasPerk( "specialty_armorvest" ) ) + { + time_to_death = time_to_death_jug; + } + else + { + time_to_death = time_to_death_default; + } + if ( time_in_low_gravity > time_to_death ) + { + self playsoundtoplayer( "evt_suffocate_whump", self ); + self DoDamage( self.health * 10, self.origin ); + self SetBlur( 0, 0.1 ); + } + else if ( blur_level < blur_occur.size && time_til_damage > blur_occur[ blur_level ] ) + { + self setclientflag(level._CLIENTFLAG_PLAYER_GASP_RUMBLE); + self playsoundtoplayer( "evt_suffocate_whump", self ); + self SetBlur( blur_intensity[ blur_level ], 0.1 ); + self thread remove_blur( blur_duration[ blur_level ] ); + blur_level++; + if ( blur_level > blur_level_max ) + { + blur_level = blur_level_max; + } + time_til_damage = 0; + } + } + else + { + if ( time_in_low_gravity > 0 ) + { + time_in_low_gravity = 0; + time_til_damage = 0; + blur_level = 0; + } + } + startTime = GetTime(); + wait(0.1); + nextTime = GetTime(); + } +} +remove_blur( time ) +{ + self endon( "disconnect" ); + wait( time ); + self SetBlur( 0, 0.1 ); + self clearclientflag(level._CLIENTFLAG_PLAYER_GASP_RUMBLE); +} +airless_vox_without_repeat() +{ + self endon( "death" ); + self endon( "disconnect" ); + entity_num = self GetEntityNumber(); + if( isdefined( self.zm_random_char ) ) + { + entity_num = self.zm_random_char; + } + if( entity_num == 3 && is_true( level.player_4_vox_override ) ) + { + entity_num = 4; + } + if( !self.airless_vox_in_progess ) + { + self.airless_vox_in_progess = true; + wait(2); + if( isdefined( self ) && is_true( self.in_low_gravity ) ) + { + level.player_is_speaking = 1; + self playsoundtoplayer( "vox_plr_" + entity_num + "_location_airless_" + randomintrange(0,5), self ); + wait(10); + level.player_is_speaking = 0; + } + wait(.1); + self.airless_vox_in_progess = false; + } +} +update_zombie_locomotion() +{ + flag_wait( "power_on" ); + player_zones = getentarray( "player_volume", "script_noteworthy" ); + zombies = GetAIArray( "axis" ); + for ( i = 0; i < player_zones.size; i++ ) + { + volume = player_zones[i]; + zone = undefined; + if ( isdefined( volume.targetname ) ) + { + zone = level.zones[ volume.targetname ]; + } + if ( isdefined( zone ) && is_true( zone.is_enabled ) ) + { + if ( isdefined( volume.script_string ) && volume.script_string == "gravity" ) + { + for ( j = 0; j < zombies.size; j++ ) + { + zombie = zombies[j]; + if ( zombie istouching( volume ) ) + { + zombie gravity_zombie_update( 0 ); + } + } + } + } + } +} +update_low_gravity_fx() +{ + flag_wait( "power_on" ); + keys = GetArrayKeys( level.zones ); + for ( i = 0; i < level.zones.size; i++ ) + { + if ( keys[i] == "nml_zone" ) + { + continue; + } + volume = level.zones[ keys[i] ].volumes[0]; + if ( isdefined( volume.script_string ) && volume.script_string == "gravity" ) + { + ZeroGravityVolumeOff( keys[i] ); + } + } +} +watch_player_grenades() +{ + flag_wait( "all_players_connected" ); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] thread player_throw_grenade(); + } +} +player_throw_grenade() +{ + self endon( "disconnect" ); + while ( 1 ) + { + self waittill( "grenade_fire", grenade, weapName ); + grenade thread watch_grenade_gravity(); + } +} +watch_grenade_gravity() +{ + self endon( "death" ); + self endon( "explode" ); + player_zones = getentarray( "player_volume", "script_noteworthy" ); + while ( 1 ) + { + if ( is_true( level.on_the_moon ) && !flag( "power_on" ) ) + { + if( isdefined( self ) && isalive( self ) ) + { + self.script_noteworthy = "moon_gravity"; + self SetEntGravityTrajectory( 1 ); + } + wait( 0.25 ); + continue; + } + for ( i = 0; i < player_zones.size; i++ ) + { + volume = player_zones[i]; + zone = undefined; + if ( isdefined( volume.targetname ) ) + { + zone = level.zones[ volume.targetname ]; + } + if ( isdefined( zone ) && is_true( zone.is_enabled ) ) + { + if ( isdefined( volume.script_string ) && volume.script_string == "lowgravity" ) + { + if ( isdefined( self ) && isalive( self ) && self istouching( volume ) ) + { + if ( volume.script_string == "lowgravity" ) + { + self.script_noteworthy = "moon_gravity"; + self SetEntGravityTrajectory( 1 ); + } + else if ( volume.script_string == "gravity" ) + { + self.script_noteworthy = undefined; + self SetEntGravityTrajectory( 0 ); + } + } + } + } + } + wait( 0.25 ); + } +} +update_zombie_gravity_transition() +{ + airlock_doors = GetEntArray("zombie_door_airlock", "script_noteworthy"); + for( i = 0; i < airlock_doors.size; i++ ) + { + airlock_doors[i] thread zombie_airlock_think(); + } +} +zombie_airlock_think() +{ + while ( 1 ) + { + self waittill( "trigger", who ); + if ( isplayer( who ) ) + { + continue; + } + if ( !flag( "power_on" ) ) + { + continue; + } + if ( isdefined( self.script_parameters ) ) + { + zone = getentarray( self.script_parameters, "targetname" ); + in_airlock = false; + for ( i = 0; i < zone.size; i++ ) + { + if ( who istouching( zone[i] ) ) + { + who maps\zombie_moon_gravity::gravity_zombie_update( 0 ); + in_airlock = true; + break; + } + } + if ( in_airlock ) + { + continue; + } + } + if(self.script_string == "inside") + { + if(IsDefined(self.doors[0].script_noteworthy)) + { + _zones = getentarray(self.doors[0].script_noteworthy,"targetname"); + if(_zones[0].script_string == "lowgravity" ) + { + who maps\zombie_moon_gravity::gravity_zombie_update( 1 ); + self.script_string = "outside"; + } + else + { + who maps\zombie_moon_gravity::gravity_zombie_update( 0 ); + } + } + else + { + who maps\zombie_moon_gravity::gravity_zombie_update( 0 ); + } + } + else + { + who maps\zombie_moon_gravity::gravity_zombie_update( 1 ); + } + } +} +zone_breached( zone_name ) +{ + zones = getentarray( zone_name, "targetname" ); + zombies = GetAIArray( "axis" ); + throttle = 0; + for ( i = 0; i < zombies.size; i++ ) + { + zombie = zombies[i]; + if ( isdefined( zombie ) ) + { + for ( j = 0; j < zones.size; j++ ) + { + if ( zombie istouching( zones[j] ) ) + { + zombie gravity_zombie_update( 1 ); + throttle++; + } + } + } + if ( throttle && !(throttle % 10) ) + { + wait_network_frame(); + wait_network_frame(); + wait_network_frame(); + } + } +} +zombie_moon_crawl_anim_override() +{ + player_volumes = getentarray( "player_volume", "script_noteworthy" ); + if ( !is_true( level.on_the_moon ) ) + { + return; + } + if ( !flag( "power_on" ) ) + { + self gravity_zombie_update( 1, true ); + } + else + { + for ( i = 0; i < player_volumes.size; i++ ) + { + volume = player_volumes[i]; + zone = undefined; + if ( isdefined( volume.targetname ) ) + { + zone = level.zones[ volume.targetname ]; + } + if ( isdefined( zone ) && is_true( zone.is_enabled ) ) + { + if ( self istouching( volume ) ) + { + if ( isdefined( volume.script_string ) && volume.script_string == "lowgravity" ) + { + self gravity_zombie_update( 1, true ); + } + } + } + } + } +} + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_moon_jump_pad.gsc b/BO1/PC/ZM/maps/zombie_moon_jump_pad.gsc new file mode 100644 index 0000000..740cddf --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_moon_jump_pad.gsc @@ -0,0 +1,646 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#using_animtree( "generic_human" ); +init() +{ + level._uses_jump_pads = true; + level.scr_anim["zombie"]["low_g_super_sprint"] = %ai_zombie_supersprint_lowg; + level.scr_anim["zombie"]["crawl_super_sprint"] = %ai_zombie_crawl_supersprint; + level.scr_anim["zombie"]["crawl_low_g_super_sprint"] = %ai_zombie_crawl_supersprint_lowg; + level.scr_anim["quad_zombie"]["super_sprint"] = %ai_zombie_quad_supersprint; + level.scr_anim["quad_zombie"]["low_g_super_sprint"] = %ai_zombie_quad_supersprint_lowg; + level maps\_zombiemode_jump_pad::init(); + level moon_jump_pad_overrides(); + level thread moon_biodome_temptation_init(); + level thread moon_jump_pads_low_gravity(); + level thread moon_jump_pads_malfunctions(); + level thread moon_jump_pad_cushion_sound_init(); +} +moon_jump_pad_overrides() +{ + level._jump_pad_override[ "biodome_logic" ] = ::moon_jump_pad_progression_end; + level._jump_pad_override[ "low_grav" ] = ::moon_low_gravity_velocity; + level._jump_pad_override[ "moon_vertical_jump" ] = ::moon_vertical_jump; + level._jump_pad_poi_start_override = ::moon_zombie_run_change; + flag_init( "pad_allow_anim_change" ); + level._jump_pad_anim_change = []; + flag_set( "pad_allow_anim_change" ); + level thread jump_pad_throttle_anim_changes(); +} +moon_jump_pad_progression_end( ent_player ) +{ + if ( IsDefined( self.start.script_string ) ) + { + ent_player.script_string = self.start.script_string; + } + if ( IsDefined( ent_player.script_string ) ) + { + end_spot_array = self.destination; + end_spot_array = array_randomize( end_spot_array ); + for ( i = 0; i < end_spot_array.size; i++ ) + { + if ( IsDefined( end_spot_array[i].script_string ) && end_spot_array[i].script_string == ent_player.script_string ) + { + end_point = end_spot_array[i]; + if ( RandomInt( 100 ) < 5 && !level._pad_powerup && IsDefined( end_point.script_parameters ) ) + { + temptation_array = level._biodome_tempt_arrays[ end_point.script_parameters ]; + if( IsDefined( temptation_array ) ) + { + } + } + return end_point; + } + } + } +} +moon_low_gravity_velocity( ent_start_point, struct_end_point ) +{ + end_point = struct_end_point; + start_point = ent_start_point; + z_velocity = undefined; + z_dist = undefined; + fling_this_way = undefined; + world_gravity = GetDvarInt( "bg_gravity" ); + gravity_pulls = 13.3 * -1; + top_velocity_sq = 900 * 900; + forward_scaling = 1.0; + end_spot = struct_end_point.origin; + if( !is_true( self.script_airspeed ) ) + { + rand_end = ( RandomFloat( 0.1, 1.2 ), RandomFloat( 0.1, 1.2 ), 0 ); + rand_scale = RandomInt( 100 ); + rand_spot = vector_scale( rand_end, rand_scale ); + end_spot = struct_end_point.origin + rand_spot; + } + pad_dist = Distance( start_point.origin, end_spot ); + z_dist = end_spot[2] - start_point.origin[2]; + jump_velocity = end_spot - start_point.origin; + if( z_dist > 40 && z_dist < 135 ) + { + z_dist *= 0.05; + forward_scaling = 0.8; + } + else if( z_dist >= 135 ) + { + z_dist *= 0.2; + forward_scaling = 0.7; + } + else if( z_dist < 0 ) + { + z_dist *= 0.1; + forward_scaling = 0.95; + } + z_velocity = 0.75 * z_dist * world_gravity; + if( z_velocity < 0 ) + { + z_velocity *= -1; + } + if( z_dist < 0 ) + { + z_dist *= -1; + } + jump_time = Sqrt( 2 * pad_dist / world_gravity ); + jump_time_2 = Sqrt( z_dist / world_gravity ); + jump_time = jump_time + jump_time_2; + if( jump_time < 0 ) + { + jump_time *= -1; + } + x = jump_velocity[0] * forward_scaling / jump_time; + y = jump_velocity[1] * forward_scaling / jump_time; + z = z_velocity / jump_time; + fling_this_way = ( x, y, z ); + jump_info = []; + jump_info[0] = fling_this_way; + jump_info[1] = jump_time; + return jump_info; +} +moon_vertical_jump( ent_start_point, struct_end_point ) +{ + end_point = struct_end_point; + start_point = ent_start_point; + z_velocity = undefined; + z_dist = undefined; + fling_this_way = undefined; + world_gravity = GetDvarInt( "bg_gravity" ); + gravity_pulls = 13.3 * -1; + top_velocity_sq = 900 * 900; + forward_scaling = 0.9; + end_random_scale = ( RandomFloatRange( -1, 1 ), RandomFloatRange( -1, 1 ), 0 ); + vel_random = ( RandomIntRange( 2, 6 ), RandomIntRange( 2, 6 ), 0 ); + pad_dist = Distance( start_point.origin, end_point.origin ); + jump_velocity = end_point.origin - start_point.origin; + z_dist = end_point.origin[2] - start_point.origin[2]; + z_dist *= 1.5; + z_velocity = 2 * z_dist * world_gravity; + if( z_velocity < 0 ) + { + z_velocity *= -1; + } + if( z_dist < 0 ) + { + z_dist *= -1; + } + jump_time = Sqrt( 2 * pad_dist / world_gravity ); + jump_time_2 = Sqrt( 2 * z_dist / world_gravity ); + jump_time = jump_time + jump_time_2; + if( jump_time < 0 ) + { + jump_time *= -1; + } + x = jump_velocity[0] * forward_scaling / jump_time; + y = jump_velocity[1] * forward_scaling / jump_time; + z = z_velocity / jump_time; + fling_vel = ( x, y, z ) + vel_random; + fling_this_way = ( x, y, z ); + jump_info = []; + jump_info[0] = fling_this_way; + jump_info[1] = jump_time; + return jump_info; +} +moon_biodome_temptation_init() +{ + level._biodome_tempt_arrays = []; + level._biodome_tempt_arrays[ "struct_tempt_left_medium_start" ] = getstructarray( "struct_tempt_left_medium_start", "targetname" ); + level._biodome_tempt_arrays[ "struct_tempt_right_medium_start" ] = getstructarray( "struct_tempt_right_medium_start", "targetname" ); + level._biodome_tempt_arrays[ "struct_tempt_left_tall" ] = getstructarray( "struct_tempt_left_tall", "targetname" ); + level._biodome_tempt_arrays[ "struct_tempt_middle_tall" ] = getstructarray( "struct_tempt_middle_tall", "targetname" ); + level._biodome_tempt_arrays[ "struct_tempt_right_tall" ] = getstructarray( "struct_tempt_right_tall", "targetname" ); + level._biodome_tempt_arrays[ "struct_tempt_left_medium_end" ] = getstructarray( "struct_tempt_left_medium_end", "targetname" ); + level._biodome_tempt_arrays[ "struct_tempt_right_medium_end" ] = getstructarray( "struct_tempt_right_medium_end", "targetname" ); + level._pad_powerup = false; + flag_wait( "all_players_connected" ); + level thread moon_biodome_random_pad_temptation(); +} +moon_biodome_random_pad_temptation() +{ + level endon( "end_game" ); + structs = getstructarray( "struct_biodome_temptation", "script_noteworthy" ); + while( true ) + { + rand = RandomInt( structs.size ); + if( IsDefined( level._biodome_tempt_arrays[ structs[ rand ].targetname ] ) ) + { + tempt_array = level._biodome_tempt_arrays[ structs[ rand ].targetname ]; + tempt_array = array_randomize( tempt_array ); + if( isDefined( level.zones[ "forest_zone" ] ) && is_true( level.zones[ "forest_zone" ].is_enabled ) && !level._pad_powerup ) + { + level thread moon_biodome_powerup_temptation( tempt_array ); + } + } + wait( RandomIntRange( 60, 180 ) ); + } +} +moon_biodome_powerup_temptation( struct_array ) +{ + powerup = Spawn( "script_model", struct_array[0].origin ); + level thread moon_biodome_temptation_active( powerup ); + powerup endon( "powerup_grabbed" ); + powerup endon( "powerup_timedout" ); + temptation_array = array( "fire_sale", "insta_kill", "nuke", "double_points", "carpenter" ); + temptation_index = 0; + spot_index = 0; + first_time = true; + struct = undefined; + rotation = 0; + temptation_array = array_randomize( temptation_array ); + while( IsDefined( powerup ) ) + { + if( temptation_array[ temptation_index ] == "fire_sale" && + ( level.zombie_vars["zombie_powerup_fire_sale_on"] == true || level.chest_moves == 0 ) ) + { + temptation_index++; + if( temptation_index >= temptation_array.size ) + { + temptation_index = 0; + } + powerup maps\_zombiemode_powerups::powerup_setup( temptation_array[ temptation_index ] ); + } + else + { + powerup maps\_zombiemode_powerups::powerup_setup( temptation_array[ temptation_index ] ); + } + if( first_time ) + { + powerup thread maps\_zombiemode_powerups::powerup_timeout(); + powerup thread maps\_zombiemode_powerups::powerup_wobble(); + powerup thread maps\_zombiemode_powerups::powerup_grab(); + first_time = false; + } + powerup.origin = struct_array[ spot_index ].origin; + if( rotation == 0 ) + { + wait( 15.0 ); + rotation++; + } + else if( rotation == 1 ) + { + wait( 7.5 ); + rotation++; + } + else if( rotation == 2 ) + { + wait( 2.5 ); + rotation++; + } + else + { + wait( 1.5 ); + rotation++; + } + temptation_index++; + if( temptation_index >= temptation_array.size ) + { + temptation_index = 0; + } + spot_index++; + if( spot_index >= struct_array.size ) + { + spot_index = 0; + } + } +} +moon_biodome_temptation_active( ent_powerup ) +{ + level._pad_powerup = true; + while( IsDefined( ent_powerup ) ) + { + wait( 0.1 ); + } + level._pad_powerup = false; +} +moon_jump_pads_low_gravity() +{ + level endon( "end_game" ); + biodome_pads = GetEntArray( "biodome_pads", "script_noteworthy" ); + biodome_compromised = false; + while( !biodome_compromised ) + { + level waittill( "digger_arm_smash", digger, zone ); + if( digger == "biodome" && IsArray( zone ) && zone[0] == "forest_zone" ) + { + biodome_compromised = true; + } + } + for( i = 0; i < biodome_pads.size; i++ ) + { + biodome_pads[i].script_string = "low_grav"; + } +} +moon_jump_pads_malfunctions() +{ + level endon( "end_game" ); + jump_pad_triggers = GetEntArray( "trig_jump_pad", "targetname" ); + flag_wait( "all_players_connected" ); + wait( 2.0 ); + level._dome_malfunction_pads = []; + for( i = 0; i < jump_pad_triggers.size; i++ ) + { + pad = jump_pad_triggers[i]; + if( IsDefined( pad.script_label ) ) + { + if( pad.script_label == "pad_labs_low" ) + { + level._dome_malfunction_pads = add_to_array( level._dome_malfunction_pads, pad, false ); + } + else if( pad.script_label == "pad_magic_box_low" ) + { + level._dome_malfunction_pads = add_to_array( level._dome_malfunction_pads, pad, false ); + } + else if( pad.script_label == "pad_teleporter_low" ) + { + level._dome_malfunction_pads = add_to_array( level._dome_malfunction_pads, pad, false ); + } + } + } + flag_wait( "power_on" ); + for( i = 0; i < level._dome_malfunction_pads.size; i++ ) + { + level._dome_malfunction_pads[i] thread moon_pad_malfunction_think(); + } +} +moon_pad_malfunction_think() +{ + level endon( "end_game" ); + pad_hook = Spawn( "script_model", self.origin ); + pad_hook SetModel( "tag_origin" ); + while( IsDefined( self ) ) + { + wait( RandomIntRange( 30, 60 ) ); + pad_hook playsound( "zmb_turret_down" ); + pad_hook SetClientFlag( level._CLIENTFLAG_SCRIPTMOVER_DOME_MALFUNCTION_PAD ); + wait_network_frame(); + self trigger_off(); + wait( RandomIntRange( 10, 30 ) ); + pad_hook playsound( "zmb_turret_startup" ); + pad_hook ClearClientFlag( level._CLIENTFLAG_SCRIPTMOVER_DOME_MALFUNCTION_PAD ); + wait_network_frame(); + self trigger_on(); + } +} +moon_zombie_run_change( ent_poi ) +{ + self endon( "death" ); + if( is_true( self._pad_chase ) ) + { + return; + } + if( IsDefined( self.animname ) && self.animname == "astro_zombie" ) + { + return; + } + if( IsDefined( self.script_string ) && self.script_string == "riser" ) + { + while( is_true( self.in_the_ground ) ) + { + wait( 0.05 ); + } + } + if( !IsDefined( self.ent_flag ) || !IsDefined( self.ent_flag["pad_anim_change"] ) ) + { + self ent_flag_init( "pad_anim_change" ); + } + self._pre_pad_run = self jump_pad_store_movement_anim(); + self._pad_chase = 1; + low_grav = 0; + chase_anim = undefined; + flag_wait( "pad_allow_anim_change" ); + level._jump_pad_anim_change = add_to_array( level._jump_pad_anim_change, self, false ); + self ent_flag_wait( "pad_anim_change" ); + curr_zone = self get_current_zone(); + if( !IsDefined( curr_zone ) && IsDefined( self.zone_name ) ) + { + curr_zone = self.zone_name; + } + if( IsDefined( curr_zone )&& IsDefined( level.zones[curr_zone].volumes[0].script_string ) + && level.zones[curr_zone].volumes[0].script_string == "lowgravity" ) + { + low_grav = 1; + } + if( self.animname == "zombie" ) + { + if( self.has_legs ) + { + if( low_grav ) + { + chase_anim = "low_g_super_sprint"; + } + else + { + chase_anim = "sprint6"; + } + } + else + { + if( low_grav ) + { + chase_anim = "crawl_low_g_super_sprint"; + } + else + { + chase_anim = "crawl_super_sprint"; + } + } + } + else if( self.animname == "quad_zombie" ) + { + if( low_grav ) + { + chase_anim = "low_g_super_sprint"; + } + else + { + chase_anim = "super_sprint"; + } + } + else if( self.animname == "astro_zombie" ) + { + } + self moon_jump_pad_run_switch( chase_anim ); + self thread moon_stop_running_to_catch(); +} +jump_pad_store_movement_anim() +{ + self endon( "death" ); + current_anim = self.run_combatanim; + anim_keys = GetArrayKeys( level.scr_anim[self.animname] ); + for( j = 0; j < anim_keys.size; j++ ) + { + if( level.scr_anim[ self.animname ][ anim_keys[j] ] == current_anim ) + { + return anim_keys[j]; + } + } +} +moon_stop_running_to_catch() +{ + self endon( "death" ); + if( !is_true( self._pad_chase ) ) + { + return; + } + if( IsDefined( self.animname ) && self.animname == "astro_zombie" ) + { + return; + } + while( is_true( self._pad_follow ) ) + { + wait( 0.05 ); + } + flag_wait( "pad_allow_anim_change" ); + level._jump_pad_anim_change = add_to_array( level._jump_pad_anim_change, self, false ); + self ent_flag_wait( "pad_anim_change" ); + low_grav = 0; + curr_zone = self get_current_zone(); + if( IsDefined( curr_zone )&& IsDefined( level.zones[curr_zone].volumes[0].script_string ) + && level.zones[curr_zone].volumes[0].script_string == "lowgravity" ) + { + low_grav = 1; + } + anim_set = undefined; + switch(self.zombie_move_speed) + { + case "walk": + if( low_grav ) + { + if( self.has_legs ) + { + var = RandomIntRange( 1, level.num_anim[self.animname]["walk"] + 1 ); + anim_set = "walk_moon" + var; + break; + } + else + { + var = RandomIntRange( 1, level.num_anim[self.animname]["crawl"] + 1 ); + anim_set = "crawl_moon" + var; + break; + } + } + else + { + if( self.has_legs ) + { + var = RandomIntRange( 1, 9 ); + anim_set = "walk" + var; + break; + } + else + { + var = RandomIntRange( 1, 7 ); + anim_set = "crawl" + var; + break; + } + } + case "run": + if( low_grav ) + { + if( self.has_legs ) + { + var = RandomIntRange( 1, level.num_anim[self.animname]["run"] + 1 ) ; + anim_set = "run_moon" + var; + break; + } + else + { + var = RandomIntRange( 1, level.num_anim[self.animname]["crawl"] + 1 ); + anim_set = "crawl_moon" + var; + break; + } + } + else + { + if( self.has_legs ) + { + var = RandomIntRange( 1, 7 ); + anim_set = "run" + var; + break; + } + else + { + var = RandomIntRange( 1, 3 ); + anim_set = "crawl_hand_" + var; + break; + } + } + case "sprint": + if( low_grav ) + { + if( self.has_legs ) + { + var = RandomIntRange( 1, level.num_anim[self.animname]["sprint"] + 1 ); + anim_set = "sprint_moon" + var; + break; + } + else + { + var = RandomIntRange( 1, level.num_anim[self.animname]["crawl"] + 1 ); + anim_set = "crawl_moon" + var; + break; + } + } + else + { + if( self.has_legs ) + { + var = RandomIntRange( 1, 5 ); + anim_set = "sprint" + var; + break; + } + else + { + var = RandomIntRange( 1, 4 ); + anim_set = "crawl_sprint" + var; + break; + } + } + } + self moon_jump_pad_run_switch( anim_set ); + self._pad_chase = 0; +} +jump_pad_throttle_anim_changes() +{ + if( !IsDefined( level._jump_pad_anim_change ) ) + { + level._jump_pad_anim_change = []; + } + int_max_num_zombies_per_frame = 7; + array_zombies_allowed_to_switch = []; + while( IsDefined( level._jump_pad_anim_change ) ) + { + if( level._jump_pad_anim_change.size == 0 ) + { + wait( 0.1 ); + continue; + } + array_zombies_allowed_to_switch = level._jump_pad_anim_change; + for( i = 0; i < array_zombies_allowed_to_switch.size; i++ ) + { + if( !IsAlive( array_zombies_allowed_to_switch[i] ) ) + { + continue; + } + array_zombies_allowed_to_switch[i] ent_flag_set( "pad_anim_change" ); + if( i >= int_max_num_zombies_per_frame ) + { + break; + } + } + flag_clear( "pad_allow_anim_change" ); + wait( 0.05 ); + for( i = 0; i < array_zombies_allowed_to_switch.size; i++ ) + { + zmb = array_zombies_allowed_to_switch[i]; + if( !IsAlive( zmb ) || !IsDefined( zmb ) ) + { + continue; + } + if( zmb ent_flag( "pad_anim_change" ) ) + { + level._jump_pad_anim_change = array_remove( level._jump_pad_anim_change, zmb ); + zmb ent_flag_clear( "pad_anim_change" ); + } + } + level._jump_pad_anim_change = array_removedead( level._jump_pad_anim_change ); + level._jump_pad_anim_change = array_removeundefined( level._jump_pad_anim_change ); + flag_set( "pad_allow_anim_change" ); + wait( 0.1 ); + } +} +moon_jump_pad_run_switch( str_anim_key ) +{ + self endon( "death" ); + self.a.runBlendTime = 0.9; + self clear_run_anim(); + self.needs_run_update = true; + self set_run_anim( str_anim_key ); + self.run_combatanim = level.scr_anim[self.animname][str_anim_key]; + self.crouchRunAnim = level.scr_anim[self.animname][str_anim_key]; + self.crouchrun_combatanim = level.scr_anim[self.animname][str_anim_key]; +} +moon_jump_pad_cushion_sound_init() +{ + flag_wait( "all_players_connected" ); + cushion_sound_triggers = GetEntArray( "trig_cushion_sound", "targetname" ); + if( !IsDefined( cushion_sound_triggers ) || cushion_sound_triggers.size == 0 ) + { + return; + } + for( i = 0; i < cushion_sound_triggers.size; i++ ) + { + cushion_sound_triggers[i] thread moon_jump_pad_cushion_play_sound(); + } +} +moon_jump_pad_cushion_play_sound() +{ + while( IsDefined( self ) ) + { + self waittill( "trigger", who ); + if( IsPlayer( who ) && is_true( who._padded ) ) + { + self PlaySound( "evt_jump_pad_land" ); + } + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_moon_sq.gsc b/BO1/PC/ZM/maps/zombie_moon_sq.gsc new file mode 100644 index 0000000..c5fd75a --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_moon_sq.gsc @@ -0,0 +1,444 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_sidequests; +init() +{ + PreCacheModel("p_zom_moon_py_collector_fill"); + PreCacheModel("p_zom_moon_py_collector"); + PreCacheModel("p_zom_moon_py_capacitor"); + PreCacheModel("p_glo_data_recorder01_static_reel"); + ss_buttons = GetEntArray("sq_ss_button", "targetname"); + for(i = 0; i < ss_buttons.size; i ++) + { + ss_buttons[i] UseTriggerRequireLookAt(); + ss_buttons[i] SetHintString(""); + ss_buttons[i] SetCursorHint("HINT_NOICON"); + } + flag_init("first_tanks_charged"); + flag_init("second_tanks_charged"); + flag_init("first_tanks_drained"); + flag_init("second_tanks_drained"); + flag_init("c_built"); + flag_init("vg_charged"); + flag_init("switch_done"); + flag_init("be2"); + flag_init("ss1"); + flag_init("soul_swap_done"); + declare_sidequest("sq", ::init_sidequest, ::sidequest_logic, ::complete_sidequest, ::generic_stage_start, ::generic_stage_complete); + declare_sidequest_icon( "sq", "vril", "zom_hud_icon_vril"); + declare_sidequest_icon( "sq", "anti115", "zom_hud_icon_meteor" ); + declare_sidequest_icon( "sq", "generator", "hud_icon_vril_combo" ); + declare_sidequest_icon( "sq", "cgenerator", "hud_icon_vril_combo_select" ); + declare_sidequest_icon( "sq", "wire", "hud_icon_wire" ); + declare_sidequest_icon( "sq", "datalog", "zom_icon_theater_reel"); + maps\zombie_moon_sq_ss::init_1(); + maps\zombie_moon_sq_ss::init_2(); + maps\zombie_moon_sq_osc::init(); + maps\zombie_moon_sq_sc::init(); + maps\zombie_moon_sq_sc::init_2(); + declare_sidequest("tanks", undefined, undefined, undefined, undefined, undefined); + maps\zombie_moon_sq_ctt::init_1(); + maps\zombie_moon_sq_ctt::init_2(); + declare_sidequest("ctvg", undefined, undefined, undefined, undefined, undefined); + maps\zombie_moon_sq_ctvg::init(); + declare_sidequest("be", undefined, undefined, undefined, undefined, undefined); + maps\zombie_moon_sq_be::init(); + precache_sidequest_assets(); +} +reward() +{ + level notify("moon_sidequest_achieved"); + players = get_players(); + array_thread(players, ::give_perk_reward); +} +watch_for_respawn() +{ + self endon("disconnect"); + while(1) + { + self waittill_either( "spawned_player", "player_revived" ); + waittillframeend; + self SetMaxHealth( level.zombie_vars["zombie_perk_juggernaut_health"] ); + } +} +give_perk_reward() +{ + if(IsDefined(self._retain_perks)) + { + return; + } + if(!IsDefined(level._sq_perk_array)) + { + level._sq_perk_array = []; + machines = GetEntArray( "zombie_vending", "targetname" ); + for(i = 0; i < machines.size; i ++) + { + level._sq_perk_array[level._sq_perk_array.size] = machines[i].script_noteworthy; + } + } + for(i = 0; i < level._sq_perk_array.size; i ++) + { + if(!self HasPerk(level._sq_perk_array[i])) + { + self playsound( "evt_sq_bag_gain_perks" ); + self maps\_zombiemode_perks::give_perk(level._sq_perk_array[i]); + wait(0.25); + } + } + self._retain_perks = true; + self thread watch_for_respawn(); +} +start_moon_sidequest() +{ + flag_wait( "all_players_spawned" ); + while(level._num_overriden_models < (GetNumExpectedPlayers())) + { + wait(0.1); + } + sidequest_start("sq"); +} +init_sidequest() +{ + players = get_players(); + level._all_previous_done = false; + level._zombiemode_sidequest_icon_offset = -32; + for(i = 0; i < players.size; i ++) + { + entnum = players[i] GetEntityNumber(); + PrintLn("**** entnum " + entnum); + if( IsDefined( players[i].zm_random_char ) ) + { + entnum = players[i].zm_random_char; + } + if((entnum == 3)) + { + devmode = 0; + if(devmode) + { + players[i] add_sidequest_icon("sq", "generator"); + level._all_previous_done = true; + } + else + { + if(level.onlineGame) + { + if(maps\_zombiemode::is_sidequest_previously_completed("COTD") && maps\_zombiemode::is_sidequest_previously_completed("EOA")) + { + players[i] add_sidequest_icon("sq", "generator"); + level._all_previous_done = true; + break; + } + else if(maps\_zombiemode::is_sidequest_previously_completed("COTD")) + { + players[i] add_sidequest_icon("sq", "vril"); + break; + } + else if(maps\_zombiemode::is_sidequest_previously_completed("EOA")) + { + players[i] add_sidequest_icon("sq", "anti115"); + break; + } + } + } + } + } + level thread tanks(); + level thread cassimir(); + level thread be(); + level thread maps\zombie_moon_sq_datalogs::init(); + if( 1 == GetDvarInt(#"scr_debug_launch")) + { + level thread rocket_test(); + } + level thread rocket_raise(); +} +rocket_test() +{ + flag_wait("power_on"); + wait(5); + level notify("rl"); + wait(2); + level notify("rl"); + wait(2); + level notify("rl"); + level thread do_launch(); +} +rocket_raise(player_num) +{ + rockets = GetEntArray("vista_rocket","targetname"); + array_thread(rockets, ::nml_show_hide); + for(i = 0; i < rockets.size; i ++) + { + level waittill("rl"); + level clientnotify("R_R"); + rockets[i] playsound( "evt_rocket_move_up" ); + s = getstruct(rockets[i].target, "targetname"); + rockets[i] MoveTo(s.origin ,4); + rockets[i] RotateTo( (0,0,0), 4); + } + level waittill("rl"); + array_thread(rockets, ::launch); +} +nml_show_hide() +{ + level endon("intermission"); + self endon("death"); + while(1) + { + flag_wait("enter_nml"); + self Hide(); + flag_waitopen("enter_nml"); + self Show(); + } +} +launch() +{ + level clientnotify("R_L"); + wait(RandomFloatRange(0.1,1)); + self playsound( "evt_rocket_launch" ); + if(!IsDefined(level._n_rockets)) + { + level._n_rockets = 0; + } + self.rocket_num = level._n_rockets; + level._n_rockets ++; + PrintLn("Rocket " + self.rocket_num + " launching!"); + PrintLn("Rocket " + self.rocket_num + " target : " + self.target); + s = getstruct(self.target, "targetname"); + PrintLn("Rocket " + self.rocket_num + " target's target : " + s.target); + if(IsDefined(s.target)) + { + start = GetVehicleNode(s.target, "targetname"); + if(!IsDefined(start)) + { + return; + } + origin_animate = Spawn( "script_model", start.origin ); + origin_animate SetModel( "tag_origin_animate" ); + self LinkTo( origin_animate, "origin_animate_jnt", ( 0, 0, 0 ), ( 0, 0, 0 ) ); + PlayFXOnTag( level._effect["rocket_booster"], self, "tag_origin" ); + vehicle = SpawnVehicle( "tag_origin", "rocket_mover", "misc_freefall", start.origin, start.angles ); + origin_animate LinkTo( vehicle ); + vehicle maps\_vehicle::getonpath( start ); + vehicle thread maps\_vehicle::gopath(); + vehicle waittill("reached_end_node"); + self Unlink(); + self delete(); + vehicle Delete(); + origin_animate Delete(); + } +} +sidequest_logic() +{ + level thread sq_flatcard_logic(); + flag_wait("power_on"); + stage_start("sq", "ss1"); + flag_wait("ss1"); + stage_start("sq", "osc"); + level waittill("sq_osc_over"); + flag_wait("complete_be_1"); + wait(4.0); + stage_start("sq", "sc"); + level waittill("sq_sc_over"); + flag_wait("vg_charged"); + stage_start("sq", "sc2"); + level waittill("sq_sc2_over"); + wait(5.0); + level thread maxis_story_vox(); + level waittill("sq_ss2_over"); + flag_wait("be2"); + level thread do_launch(); +} +do_launch() +{ + play_sound_2d( "vox_xcomp_quest_step8_4" ); + wait(10); + level notify("rl"); + wait(30); + play_sound_2d( "vox_xcomp_quest_step8_5" ); + wait(30); + play_sound_2d( "evt_earth_explode" ); + clientnotify("dte"); + wait_network_frame(); + wait_network_frame(); + exploder( 2012 ); + wait(2); + level clientnotify("SDE"); + level._dte_done = true; + level notify("moon_sidequest_big_bang_achieved"); + play_sound_2d( "vox_xcomp_quest_laugh" ); + level thread play_end_lines_in_order(); + reward(); +} +play_end_lines_in_order() +{ + level.skit_vox_override = true; + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 7, true ); + wait(12); + player = get_specific_player( 0 ); + if( isdefined( player ) ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 9, true ); + wait(5); + } + player = get_specific_player( 1 ); + if( isdefined( player ) ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 9, true ); + wait(5); + } + player = get_specific_player( 2 ); + if( isdefined( player ) ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 9, true ); + wait(5); + } + player = get_specific_player( 3 ); + if( isdefined( player ) ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 9, true ); + wait(5); + } + player = get_specific_player( 3 ); + if( isdefined( player ) ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 10, true ); + } + level.skit_vox_override = false; +} +get_specific_player( num ) +{ + players = get_players(); + for(i = 0; i < players.size; i ++) + { + ent_num = players[i] GetEntityNumber(); + if(IsDefined(players[i].zm_random_char)) + { + ent_num = players[i].zm_random_char; + } + if(ent_num == num) + { + return players[i]; + } + } + return undefined; +} +maxis_story_vox() +{ + s = getstruct("sq_vg_final", "targetname"); + level.skit_vox_override = true; + play_sound_in_space("vox_plr_3_quest_step6_9", s.origin); + wait(2.3); + play_sound_in_space("vox_plr_3_quest_step6_11", s.origin); + wait(10.5); + play_sound_in_space("vox_xcomp_quest_step6_14", s.origin); + level.skit_vox_override = false; + stage_start("sq", "ss2"); +} +be() +{ + stage_start("be", "stage_one"); + level waittill("sq_sc2_over"); + wait(2.0); + stage_start("be", "stage_two"); +} +tanks() +{ + flag_wait("complete_be_1"); + wait(4.0); + stage_start("tanks", "ctt1"); + level waittill("sq_sc_over"); + flag_wait("vg_charged"); + stage_start("tanks", "ctt2"); +} +cassimir() +{ + stage_start("ctvg", "build"); + level waittill("ctvg_build_over"); + wait(5.0); + stage_start("ctvg", "charge"); +} +cheat_complete_stage() +{ + level endon("reset_sundial"); + while(1) + { + if(GetDvar("cheat_sq") != "") + { + if(IsDefined(level._last_stage_started )) + { + SetDvar("cheat_sq", ""); + stage_completed("sq", level._last_stage_started); + } + } + wait(0.1); + } +} +generic_stage_start() +{ + level._stage_active = true; +} +generic_stage_complete() +{ + level._stage_active = false; +} +complete_sidequest() +{ + level thread sidequest_done(); +} +sidequest_done() +{ +} +get_variant_from_entity_num( player_number ) +{ + if(!IsDefined(player_number)) + { + player_number = 0; + } + post_fix = "a"; + switch(player_number) + { + case 0: + post_fix = "a"; + break; + case 1: + post_fix = "b"; + break; + case 2: + post_fix = "c"; + break; + case 3: + post_fix = "d"; + break; + } + return post_fix; +} +sq_flatcard_logic() +{ + nml_set = false; + while( true ) + { + if( flag( "enter_nml" ) && !nml_set ) + { + if(!IsDefined(level._dte_done)) + { + level clientnotify("H_E"); + } + SetSavedDvar("r_zombieDisableEarthEffect", 1); + nml_set = true; + } + else if( !flag( "enter_nml" ) && nml_set ) + { + if(!IsDefined(level._dte_done)) + { + level clientnotify("S_E"); + } + SetSavedDvar("r_zombieDisableEarthEffect", 0); + nml_set = false; + } + wait( 0.1 ); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_moon_sq_be.gsc b/BO1/PC/ZM/maps/zombie_moon_sq_be.gsc new file mode 100644 index 0000000..722e7db --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_moon_sq_be.gsc @@ -0,0 +1,504 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_sidequests; +#include maps\_vehicle; +#using_animtree( "fxanim_props_dlc5" ); +init() +{ + PreCacheModel( "p_zom_moon_black_egg" ); + PrecacheVehicle("misc_freefall"); + level.scr_anim[ "_be_" ][ "to_the_right" ][ 0 ] = %fxanim_zom_ztem_crystal_small_anim; + level.scr_anim[ "_be_" ][ "to_the_left" ][ 0 ] = %fxanim_zom_ztem_crystal_small_anim; + level.motivational_struct = getstruct( "struct_motivation", "targetname" ); + Assert( IsDefined( level.motivational_struct.name ) ); + if( !IsDefined( level.motivational_struct ) ) + { + PrintLn( "$$$$ No structs, reBSP $$$$" ); + return; + } + level._be_start = StrTok( level.motivational_struct.script_parameters, "," ); + for( i = 0; i < level._be_start.size; i++ ) + { + flag_init( level._be_start[ i ] ); + } + level._be_complete = StrTok( level.motivational_struct.script_flag, "," ); + for( j = 0; j < level._be_complete.size; j++ ) + { + flag_init( level._be_complete[ j ] ); + } + level.motivational_array = StrTok( level.motivational_struct.script_string, "," ); + level._sliding_doors = GetEntArray( "zombie_door_airlock", "script_noteworthy" ); + level._sliding_doors = array_merge(level._sliding_doors, GetEntArray("zombie_door", "targetname")); + level._my_speed = 12; + declare_sidequest_stage("be", "stage_one", ::init_stage_1, ::stage_logic_1, ::exit_stage_1); + declare_sidequest_stage("be", "stage_two", ::init_stage_2, ::stage_logic_2, ::exit_stage_2); +} +init_stage_2() +{ +} +stage_logic_2() +{ + org = level._be.origin; + angles = level._be.angles; + exploder(405); + level._be playsound( "evt_be_insert" ); + level._be StopAnimScripted(); + level._be Unlink(); + level._be DontInterpolate(); + level._be.origin = org; + level._be.angles = angles; + level._be thread wait_for_close_player(); + if(IsDefined(level._be_vehicle)) + { + level._be_vehicle Delete(); + } + if(IsDefined(level._be_origin_animate)) + { + level._be_origin_animate StopAnimScripted(); + level._be_origin_animate Delete(); + } + maps\_zombiemode_weap_quantum_bomb::quantum_bomb_register_result( "be2", undefined, 100, ::be2_validation ); + level._be_pos = level._be.origin; + level waittill("be2_validation"); + maps\_zombiemode_weap_quantum_bomb::quantum_bomb_deregister_result("be2"); + s = getstruct("be2_pos", "targetname"); + level._be DontInterpolate(); + level._be.origin = s.origin; + level.teleport_target_trigger = Spawn( "trigger_radius", s.origin + (0,0,-70), 0, 125, 100 ); + level.black_hole_bomb_loc_check_func = ::bhb_teleport_loc_check; + level waittill("be2_tp_done"); + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 2 ); + level.black_hole_bomb_loc_check_func = undefined; + level._be Delete(); + level._be = undefined; + stage_completed("be", "stage_two"); +} +wait_for_close_player() +{ + level endon("be2_validation"); + self endon( "death" ); + wait(25); + while(1) + { + players = get_players(); + for(i=0;i= dist ) + { + continue; + } + dist = newdist; + index = i; + } + return index; +} +moon_be_anim_swap( int_anim ) +{ + self endon( "death" ); + self._be_model StopAnimScripted(); + if( int_anim == 0 ) + { + self._be_org_anim thread maps\_anim::anim_loop_aligned( self._be_model, "to_the_left", "tag_origin_animate_jnt" ); + } + else + { + self._be_org_anim thread maps\_anim::anim_loop_aligned( self._be_model, "to_the_right", "tag_origin_animate_jnt" ); + } +} +moon_be_stop_anim() +{ + self endon( "death" ); + self._be_model StopAnimScripted(); +} +moon_be_resume_anim() +{ + self endon( "death" ); + self endon( "be_stage_one_over" ); + rand = RandomInt( 1 ); + if( rand ) + { + self._be_org_anim thread maps\_anim::anim_loop_aligned( self._be_model, "to_the_left", "tag_origin_animate_jnt" ); + } + else + { + self._be_org_anim thread maps\_anim::anim_loop_aligned( self._be_model, "to_the_right", "tag_origin_animate_jnt" ); + } +} +waittill_player_is_close() +{ + while(1) + { + players = get_players(); + for(i=0;i 4 ) + { + num -= 4; + } + self thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest2", undefined, num ); +} +play_vox_on_closest_player( num ) +{ + player = get_closest_player( level._be.origin ); + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest2", undefined, num ); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_moon_sq_ctvg.gsc b/BO1/PC/ZM/maps/zombie_moon_sq_ctvg.gsc new file mode 100644 index 0000000..375832f --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_moon_sq_ctvg.gsc @@ -0,0 +1,487 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_sidequests; +init() +{ + flag_init("w_placed"); + flag_init("vg_placed"); + flag_init("cvg_picked_up"); + declare_sidequest_stage("ctvg", "build", ::build_init, ::build_stage_logic, ::build_exit_stage); + declare_stage_asset_from_struct("ctvg", "build", "sq_cassimir_plates", ::plate_thread); + declare_sidequest_stage("ctvg", "charge", ::charge_init, ::charge_stage_logic, ::charge_exit_stage); + PreCacheModel("p_zom_moon_vril_complete"); + PreCacheModel("zombie_magic_box_wire"); +} +plate_thread() +{ + level waittill("stage_1"); + target = self.target; + while(IsDefined(target)) + { + struct = getstruct(target, "targetname"); + time = struct.script_float; + if(!IsDefined(time)) + { + time = 1.0; + } + self moveto(struct.origin, time, time/10); + self RotateTo(struct.angles, time, time/10); + self waittill("movedone"); + playsoundatposition( "evt_clank", self.origin ); + target = struct.target; + } + level notify("stage_1_done"); +} +build_init() +{ +} +plates() +{ + plates = GetEntArray("sq_cassimir_plates", "targetname"); + trig = Spawn("trigger_damage", ((plates[0].origin + plates[1].origin) / 2) - (0,0,100), 0, 64, 120); + while(1) + { + trig waittill( "damage", amount, attacker, direction, point, dmg_type, modelName, tagName ); + if( isplayer( attacker ) && ( dmg_type == "MOD_PROJECTILE" || dmg_type == "MOD_PROJECTILE_SPLASH" + || dmg_type == "MOD_EXPLOSIVE" || dmg_type == "MOD_EXPLOSIVE_SPLASH" + || dmg_type == "MOD_GRENADE" || dmg_type == "MOD_GRENADE_SPLASH" ) ) + { + attacker thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest5", undefined, randomintrange(0,2), true ); + break; + } + } + trig Delete(); + level notify("stage_1"); + level waittill("stage_1_done"); + level.teleport_target_trigger = Spawn( "trigger_radius", plates[0].origin + (0,0,-70), 0, 125, 100 ); + level.black_hole_bomb_loc_check_func = ::bhb_teleport_loc_check; + level waittill("ctvg_tp_done"); + level.black_hole_bomb_loc_check_func = undefined; + level waittill( "restart_round" ); + targs = getstructarray("sq_ctvg_tp2", "targetname"); + for(i = 0; i < plates.size; i ++) + { + plates[i] DontInterpolate(); + plates[i].origin = targs[i].origin; + plates[i].angles = targs[i].angles; + } + maps\_zombiemode_weap_quantum_bomb::quantum_bomb_register_result( "ctvg", ::dud_func, 100, ::ctvg_validation ); + level._ctvg_pos = targs[0].origin; + level waittill("ctvg_validation"); + maps\_zombiemode_weap_quantum_bomb::quantum_bomb_deregister_result("ctvg"); + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest5", undefined, randomintrange(4,6), true ); + for(i = 0; i < plates.size; i ++) + { + plates[i] Hide(); + } + clientnotify("cp"); + flag_set("c_built"); +} +wire_qualifier() +{ + if(IsDefined(self._has_wire) && self._has_wire) + { + return true; + } + return false; +} +monitor_wire_disconnect() +{ + level endon("w_placed"); + self waittill("disconnect"); + level notify("wire_restart"); + level thread wire(); +} +wire() +{ + level endon("wire_restart"); + wires = getstructarray("sq_wire_pos", "targetname"); + wires = array_randomize(wires); + wire_struct = wires[0]; + wire = Spawn("script_model", wire_struct.origin); + if(IsDefined(wire_struct.angles)) + { + wire.angles = wire_struct.angles; + } + wire SetModel("zombie_magic_box_wire"); + wire thread fake_use("pickedup_wire"); + wire waittill("pickedup_wire", who); + who thread monitor_wire_disconnect(); + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest5", undefined, 7, true ); + who playsound( "evt_grab_wire" ); + who._has_wire = true; + wire Delete(); + who add_sidequest_icon("sq", "wire"); + flag_wait("c_built"); + wire_struct = getstruct("sq_wire_final", "targetname"); + wire_struct thread fake_use("placed_wire", ::wire_qualifier); + wire_struct waittill("placed_wire", who); + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest5", undefined, 8, true ); + who playsound( "evt_casimir_charge" ); + who playsound( "evt_sq_rbs_light_on" ); + who._has_wire = undefined; + who remove_sidequest_icon("sq", "wire"); + clientnotify("wp"); + flag_set("w_placed"); +} +dud_func( position ) +{ +} +vg_qualifier() +{ + num = self GetEntityNumber(); + if(IsDefined(self.zm_random_char)) + { + num = self.zm_random_char; + } + return( (num == 3) && level._all_previous_done); +} +vg() +{ + flag_wait("w_placed"); + flag_wait("power_on"); + vg_struct = getstruct("sq_charge_vg_pos", "targetname"); + vg_struct thread fake_use("vg_placed", ::vg_qualifier); + vg_struct waittill("vg_placed", who); + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest5", undefined, 9, true ); + level.vg_struct_sound = spawn( "script_origin", vg_struct.origin ); + level.vg_struct_sound playsound( "evt_vril_connect" ); + level.vg_struct_sound playloopsound( "evt_vril_loop_lvl1", 1 ); + who remove_sidequest_icon("sq", "generator"); + clientnotify("vg"); + flag_set("vg_placed"); +} +build_stage_logic() +{ + level thread plates(); + level thread wire(); + level thread vg(); + flag_wait("c_built"); + flag_wait("w_placed"); + flag_wait("vg_placed"); + stage_completed("ctvg", "build"); +} +ctvg_validation( position ) +{ + if(DistanceSquared(level._ctvg_pos, position) < (128 * 128)) + { + level notify("ctvg_validation"); + } + return false; +} +delete_soon() +{ + wait(4.5); + self Delete(); +} +bhb_teleport_loc_check( grenade, model, info ) +{ + if( IsDefined( level.teleport_target_trigger ) && grenade IsTouching( level.teleport_target_trigger ) ) + { + plates = GetEntArray("sq_cassimir_plates", "targetname"); + spot = Spawn("script_model", plates[0].origin); + spot SetModel("tag_origin"); + spot SetClientFlag( level._SCRIPTMOVER_CLIENT_FLAG_BLACKHOLE ); + spot thread delete_soon(); + grenade thread maps\_zombiemode_weap_black_hole_bomb::do_black_hole_bomb_sound( plates[0], info ); + level thread teleport_target( grenade, plates ); + return true; + } + return false; +} +teleport_target( grenade, models ) +{ + level.teleport_target_trigger Delete(); + level.teleport_target_trigger = undefined; + wait( 1.0 ); + time = 3.0; + for(i = 0; i < models.size; i ++) + { + models[i] MoveTo( grenade.origin + (0,0,50), time, time - 0.05 ); + } + wait( time ); + teleport_targets = getstructarray( "sq_ctvg_tp", "targetname" ); + for(i = 0; i < models.size; i ++) + { + models[i] Hide(); + } + playsoundatposition( "zmb_gersh_teleporter_out", grenade.origin + (0,0,50) ); + wait( 0.5 ); + for(i = 0; i < models.size; i ++) + { + models[i] DontInterpolate(); + models[i].angles = teleport_targets[i].angles; + models[i].origin = teleport_targets[i].origin; + models[i] StopLoopSound( 1 ); + } + wait( 0.5 ); + for(i = 0; i < models.size; i ++) + { + models[i] Show(); + } + PlayFXOnTag( level._effect[ "black_hole_bomb_event_horizon" ], models[0], "tag_origin" ); + models[0] PlaySound( "zmb_gersh_teleporter_go" ); + models[0] playsound( "evt_clank" ); + wait( 2.0 ); + level notify("ctvg_tp_done"); +} +build_exit_stage(success) +{ +} +build_charge_stage(num_presses, lines) +{ + stage = SpawnStruct(); + stage.num_presses = num_presses; + stage.lines = []; + for(i = 0; i < lines.size; i += 2) + { + l = SpawnStruct(); + l.who = lines[i]; + l.what = lines[i + 1]; + stage.lines[stage.lines.size] = l; + } + return stage; +} +speak_charge_lines(lines) +{ + level.skit_vox_override = true; + for(i = 0; i < lines.size; i ++) + { + l = lines[i]; + sound_ent = undefined; + switch(l.who) + { + case "rictofen": + players = get_players(); + for(j = 0; j < players.size; j ++) + { + ent_num = players[j] GetEntityNumber(); + if(IsDefined(players[j].zm_random_char)) + { + ent_num = players[j].zm_random_char; + } + if(ent_num == 3) + { + sound_ent = players[j]; + break; + } + } + break; + case "maxis": + case "computer": + sound_ent = level._charge_sound_ent; + break; + } + if(l.what == "vox_mcomp_quest_step5_15" || l.what == "vox_mcomp_quest_step5_26") + { + level._charge_terminal SetModel("p_zom_moon_magic_box_com_green"); + } + else if(l.what == "vox_xcomp_quest_step5_16") + { + level._charge_terminal SetModel("p_zom_moon_magic_box_com_red"); + } + if( is_player_valid( sound_ent ) && sound_ent maps\_zombiemode_equipment::is_equipment_active("equip_gasmask_zm") ) + { + sound_ent PlaySound(l.what + "_f", "line_spoken" ); + } + else + { + sound_ent PlaySound(l.what, "line_spoken"); + } + sound_ent waittill("line_spoken"); + } + level._charge_sound_ent StopLoopSound(); + level.skit_vox_override = false; +} +charge_init() +{ + level._charge_stages = array( build_charge_stage(1, array ( "rictofen", "vox_plr_3_quest_step5_12" )), + build_charge_stage(15, array( "computer", "vox_mcomp_quest_step5_13", + "rictofen", "vox_plr_3_quest_step5_14")), + build_charge_stage(15, array( "computer", "vox_mcomp_quest_step5_15", + "maxis", "vox_xcomp_quest_step5_16", + "rictofen", "vox_plr_3_quest_step5_17")), + build_charge_stage(10, array( "maxis", "vox_xcomp_quest_step5_18", + "rictofen", "vox_plr_3_quest_step5_19")), + build_charge_stage(15, array( "maxis", "vox_xcomp_quest_step5_20", + "rictofen", "vox_plr_3_quest_step5_21", + "maxis", "vox_xcomp_quest_step5_22", + "rictofen", "vox_plr_3_quest_step5_23")), + build_charge_stage(10, array( "maxis", "vox_xcomp_quest_step5_24", + "rictofen", "vox_plr_3_quest_step5_25", + "computer", "vox_mcomp_quest_step5_26"))); + sound_struct = getstruct("sq_charge_terminal", "targetname"); + level._charge_sound_ent = Spawn("script_origin", sound_struct.origin); + level._charge_terminal = GetEnt("sq_ctvg_terminal", "targetname"); + level._charge_terminal SetModel("p_zom_moon_magic_box_com_red"); +} +bucket_qualifier() +{ + ent_num = self GetEntityNumber(); + if(IsDefined(self.zm_random_char)) + { + ent_num = self.zm_random_char; + } + if(ent_num == 3) + { + return true; + } + return false; +} +wrong_press_qualifier() +{ + ent_num = self GetEntityNumber(); + if(IsDefined(self.zm_random_char)) + { + ent_num = self.zm_random_char; + } + if(ent_num != 3) + { + return true; + } + return false; +} +typing_sound_thread() +{ + level endon("kill_typing_thread"); + level._charge_sound_ent PlayLoopSound("evt_typing_loop"); + typing = true; + level._typing_time = GetTime(); + while(1) + { + if(typing) + { + if((GetTime() - level._typing_time) > 250) + { + typing = false; + level._charge_sound_ent StopLoopSound(); + } + } + else + { + if((GetTime() - level._typing_time) < 100) + { + typing = true; + level._charge_sound_ent PlayLoopSound("evt_typing_loop"); + } + } + wait(0.1); + } +} +do_bucket_fill(target) +{ + presses = 0; + players = get_players(); + richtofen = undefined; + level thread typing_sound_thread(); + for(i = 0; i < players.size; i ++) + { + player = players[i]; + ent_num = player GetEntityNumber(); + if(IsDefined(player.zm_random_char)) + { + ent_num = player.zm_random_char; + } + if(ent_num == 3) + { + richtofen = players[i]; + break; + } + } + while(presses < target) + { + level._charge_sound_ent thread maps\_zombiemode_sidequests::fake_use("press", ::bucket_qualifier); + level._charge_sound_ent waittill("press"); + presses ++; + level._typing_time = GetTime(); + while(IsDefined(richtofen) && richtofen UseButtonPressed()) + { + wait 0.05; + } + } + level notify("kill_typing_thread"); +} +wrong_presser_thread() +{ + level endon("kill_press_monitor"); + while(1) + { + if(IsDefined(level._charge_sound_ent)) + { + level._charge_sound_ent thread maps\_zombiemode_sidequests::fake_use("wrong_press", ::wrong_press_qualifier); + level._charge_sound_ent waittill("wrong_press", who); + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest5", undefined, 11, true ); + } + wait(1.0); + } +} +wrong_collector() +{ + level endon("collected"); + while(1) + { + self thread maps\_zombiemode_sidequests::fake_use("wrong_collector", ::wrong_press_qualifier); + self waittill("wrong_collector", who); + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest5", undefined, 27, true ); + wait(1.0); + } +} +charge_stage_logic() +{ + stage_index = 0; + level thread wrong_presser_thread(); + level thread prevent_other_vox_while_here(); + while(stage_index < level._charge_stages.size) + { + stage = level._charge_stages[stage_index]; + do_bucket_fill(stage.num_presses); + speak_charge_lines(stage.lines); + stage_index ++; + } + clientnotify("vg"); + level.vg_struct_sound playsound( "evt_extra_charge" ); + level.vg_struct_sound playloopsound( "evt_vril_loop_lvl2", 1 ); + level thread start_player_vox_again(); + vg = getstruct("sq_charge_vg_pos", "targetname"); + level notify("kill_press_monitor"); + vg thread wrong_collector(); + vg thread maps\_zombiemode_sidequests::fake_use("collect", ::bucket_qualifier); + vg waittill("collect", who); + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest5", undefined, 27, true ); + who playsound( "evt_vril_remove" ); + level.vg_struct_sound delete(); + level.vg_struct_sound = undefined; + clientnotify("vg"); + who add_sidequest_icon("sq","cgenerator"); + level notify("collected"); + stage_completed("ctvg", "charge"); +} +charge_exit_stage(success) +{ + level._charge_sound_ent Delete(); + level._charge_sound_ent = undefined; + flag_set("vg_charged"); +} +prevent_other_vox_while_here() +{ + level endon( "start_player_vox_again" ); + while(1) + { + while( level.zones["bridge_zone"].is_occupied ) + { + level.skit_vox_override = true; + wait(1); + } + level.skit_vox_override = false; + wait(1); + } +} +start_player_vox_again() +{ + level notify( "start_player_vox_again" ); + wait(1); + level.skit_vox_override = false; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_moon_sq_datalogs.gsc b/BO1/PC/ZM/maps/zombie_moon_sq_datalogs.gsc new file mode 100644 index 0000000..47e3eac Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_moon_sq_datalogs.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_moon_sq_osc.gsc b/BO1/PC/ZM/maps/zombie_moon_sq_osc.gsc new file mode 100644 index 0000000..b5ad53c --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_moon_sq_osc.gsc @@ -0,0 +1,486 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_sidequests; +init() +{ + PreCacheModel( "rus_sq_button_red_single_long" ); + PreCacheModel( "p_zom_moon_py_glyph_dial_cap" ); + PreCacheModel( "p_zom_moon_button_console_lid" ); + level._osc_rb_jolie_spots = []; + level._osc_rbs = getstructarray( "struct_osc_button", "targetname" ); + if( !IsDefined( level._osc_rbs ) ) + { + PrintLn( "$$$$ missing _osc_rbs, need bsp $$$$" ); + wait( 1.0 ); + return; + } + level._osc_struct = getstruct( "struct_sq_osc", "targetname" ); + if( !IsDefined( level._osc_struct ) ) + { + PrintLn( "$$$$ missing _osc_struct, need bsp $$$$" ); + wait( 1.0 ); + return; + } + level._osc_flags = StrTok( level._osc_struct.script_flag, "," ); + if( !IsDefined( level._osc_flags ) ) + { + PrintLn( "$$$$ fail define on osc flags $$$$" ); + wait( 1.0 ); + return; + } + for( j = 0; j < level._osc_flags.size; j++ ) + { + if( !IsDefined( level.flag[ level._osc_flags[ j ] ] ) ) + { + flag_init( level._osc_flags[ j ] ); + } + } + level._jolie_greet_array = array( level._osc_flags[4], level._osc_flags[5], level._osc_flags[6], level._osc_flags[7] ); + level._osc_st = getstructarray( "struct_osc_st", "targetname" ); + for( k = 0; k < level._osc_st.size; k++ ) + { + level._osc_st[k].focus = SpawnStruct(); + level._osc_st[k].focus.origin = level._osc_st[k].origin; + level._osc_st[k].focus.radius = 48; + level._osc_st[k].focus.height = 48; + level._osc_st[k].focus.script_float = 5; + level._osc_st[k].focus.script_int = 0; + level._osc_st[k].focus._light_spot = getstruct( level._osc_st[k].target, "targetname" ); + } + level._osc_min_dist = level._osc_struct.script_wait_min; + level._osc_max_dist = level._osc_struct.script_wait_max; + level._osc_rbs_dist_range = level._osc_max_dist - level._osc_min_dist; + level._osc_release = 0; + level._osc_check = undefined; + if( GetDvarInt( "jolie_greet_debug" ) ) + { + level._osc_trial_time = GetDvarInt( "jolie_greet_time" ); + } + else + { + if( !IsDefined( level._osc_struct.script_int ) ) + { + PrintLn( "$$$$ Missing level._osc_struct.script_int $$$$" ); + wait( 1.0 ); + return; + } + level._osc_trial_time = level._osc_struct.script_int; + } + level._osc_cap_spot = getstruct( "struct_cover", "targetname" ); + level._osc_cap = Spawn( "script_model", level._osc_cap_spot.origin ); + level._osc_cap.angles = level._osc_cap_spot.angles; + level._osc_cap SetModel( "p_zom_moon_py_glyph_dial_cap" ); + level._osc_terms = 0; + level thread osc_button_cover_setup(); + declare_sidequest_stage("sq", "osc", ::init_stage, ::stage_logic, ::exit_stage); +} +osc_button_cover_setup() +{ + flag_wait( "all_players_connected" ); + for( i = 0; i < level._osc_rbs.size; i++ ) + { + osc_target = getstruct( level._osc_rbs[i].target, "targetname" ); + level._osc_rbs[i].cover = Spawn( "script_model", osc_target.origin ); + level._osc_rbs[i].cover.angles = osc_target.angles; + level._osc_rbs[i].cover SetModel( "p_zom_moon_button_console_lid" ); + level._osc_rbs[i].cover_close = level._osc_rbs[i].cover.angles; + level._osc_rbs[i].cover RotateRoll( -90, 0.05 ); + level._osc_rbs[i].cover waittill( "rotatedone" ); + level._osc_rbs[i].cover_open = level._osc_rbs[i].cover.angles; + level._osc_rbs[i].cover.angles = level._osc_rbs[i].cover_close; + level._osc_rbs[i].jolie = SpawnStruct(); + level._osc_rbs[i].jolie.origin = level._osc_rbs[i].origin; + level._osc_rbs[i].jolie.radius = 48; + level._osc_rbs[i].jolie.height = 48; + level._osc_rbs[i].jolie.script_float = 4; + level._osc_rbs[i].jolie.script_int = 500; + level._osc_rbs[i].jolie.no_sight_check = 1; + level._osc_rbs[i].jolie.no_bullet_trace = 1; + level._osc_rb_jolie_spots = add_to_array( level._osc_rb_jolie_spots, level._osc_rbs[i].jolie, false ); + } + level._osc_rbs_totalrot = level._osc_rbs[0].cover_close - level._osc_rbs[0].cover_open; +} +exit_stage(success) +{ +} +stage_logic() +{ + level waittill("release_complete"); + stage_completed("sq", "osc"); +} +init_stage() +{ + level thread moon_jolie_greet(); + level thread moon_rb_dist_think(); + level thread moon_open_access(); + level thread moon_keyhole(); +} +moon_rb_dist_think() +{ + level endon( "end_game" ); + level endon( level._osc_flags[ 1 ] ); + level endon( "stop_dist_think" ); + level._lid_close_sound = 0; + int_close = 0; + dist_struct = getstruct( "struct_rb_dist_check", "targetname" ); + while( !flag( level._osc_flags[ 1 ] ) ) + { + level._osc_check = get_closest_player( dist_struct.origin ); + int_distance = Distance2D( level._osc_check.origin, dist_struct.origin ); + if( int_distance > level._osc_max_dist ) + { + int_distance = level._osc_max_dist; + } + else if( int_distance < level._osc_min_dist ) + { + int_distance = level._osc_min_dist; + } + scale = ( int_distance - level._osc_min_dist ) / level._osc_rbs_dist_range; + rotation_offset = level._osc_rbs_totalrot * scale; + for( i = 0; i < level._osc_rbs.size; i++ ) + { + level._osc_rbs[i].cover.angles = level._osc_rbs[i].cover_close - rotation_offset; + if( level._osc_rbs[i].cover.angles == level._osc_rbs[i].cover_close + && level._lid_close_sound == 0 ) + { + level._lid_close_sound = 1; + level._osc_rbs[i].cover thread rb_cover_sound(); + } + } + wait( 0.05 ); + level._osc_check = undefined; + } +} +rb_cover_sound() +{ + for( i = 0; i < level._osc_rbs.size; i++ ) + { + level._osc_rbs[i].cover playsound( "evt_sq_rbs_close" ); + level._osc_rbs[i].cover playsound( "vox_mcomp_quest_step3_0", "sounddone" ); + } + level._osc_rbs[0].cover waittill( "sounddone" ); + level thread play_rb_cover_player_vox( self ); + wait( 30 ); + level._lid_close_sound = 0; +} +play_rb_cover_player_vox( ent ) +{ + level notify( "prevent_dupe_rb_cover_vox" ); + level endon( "prevent_dupe_rb_cover_vox" ); + wait(.5); + player = get_closest_player( ent.origin ); + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest3", undefined, 0 ); +} +moon_jolie_greet() +{ + if( !IsDefined( level._osc_rb_jolie_spots ) || level._osc_rb_jolie_spots.size == 0 ) + { + PrintLn( "$$$$ Missing jolie spots $$$$" ); + wait( 1.0 ); + return; + } + while( !flag( level._osc_flags[ 1 ] ) ) + { + for( i = 0; i < level._osc_rb_jolie_spots.size; i++ ) + { + maps\_zombiemode_equip_hacker::register_pooled_hackable_struct( level._osc_rb_jolie_spots[i], ::moon_jolie_access ); + } + if( !IsDefined( level._osc_flags[2] ) || !IsDefined( level._osc_flags[3] ) ) + { + PrintLn( "$$$$ missing flags for jolie_greet $$$$" ); + wait( 1.0 ); + return; + } + flag_wait_any( level._osc_flags[2], level._osc_flags[3] ); + if( flag( level._osc_flags[2] ) ) + { + if( flag( level._osc_flags[2] ) ) + { + flag_clear( level._osc_flags[2] ); + } + else if( flag( level._osc_flags[3] ) ) + { + flag_clear( level._osc_flags[3] ); + } + for( j = 0; j < level._osc_st.size; j++ ) + { + maps\_zombiemode_equip_hacker::deregister_hackable_struct( level._osc_st[j].focus ); + if( IsDefined( level._osc_st[j].focus._light ) ) + { + level._osc_st[j].focus._light Delete(); + } + if( IsDefined( level._osc_st[j].focus.script_flag ) ) + { + flag_clear( level._osc_st[j].focus.script_flag ); + level._osc_st[j].focus.script_flag = ""; + } + } + } + else if( flag( level._osc_flags[3] ) ) + { + flag_set( level._osc_flags[1] ); + level notify( "stop_dist_think" ); + for( l = 0; l < level._osc_rbs.size; l++ ) + { + level._osc_rbs[l].cover.angles = level._osc_rbs[l].cover_open; + } + for( m = 0; m < level._osc_st.size; m++ ) + { + if( IsDefined( level._osc_st[m].focus._light ) ) + { + level._osc_st[m].focus._light Delete(); + } + level._osc_st[m].focus.script_flag = ""; + maps\_zombiemode_equip_hacker::deregister_hackable_struct( level._osc_st[m].focus ); + } + if( flag( level._osc_flags[2] ) ) + { + flag_clear( level._osc_flags[2] ); + } + else if( flag( level._osc_flags[3] ) ) + { + flag_clear( level._osc_flags[3] ); + } + } + } +} +moon_jolie_access( ent_hacker ) +{ + level thread play_moon_jolie_access_vox( ent_hacker ); + level._lid_close_sound = 1; + for( i = 0; i < level._osc_rb_jolie_spots.size; i++ ) + { + maps\_zombiemode_equip_hacker::deregister_hackable_struct( level._osc_rb_jolie_spots[i] ); + } + level._osc_terms = 0; + random_array = level._osc_st; + random_array = array_randomize( random_array ); + for( j = 0; j < 4; j++ ) + { + PrintLn("*** register hackable terminal hackable."); + random_array[j].focus._light = Spawn( "script_model", random_array[j].focus._light_spot.origin ); + random_array[j].focus._light.angles = random_array[j].focus._light_spot.angles; + random_array[j].focus._light SetModel( "zombie_trap_switch_light_on_green" ); + PlayFXOnTag( level._effect["terminal_ready"], random_array[j].focus._light, "tag_origin" ); + random_array[j].focus._light playsound( "evt_sq_rbs_light_on" ); + random_array[j].focus._light playloopsound( "evt_sq_rbs_light_loop", 1 ); + maps\_zombiemode_equip_hacker::register_pooled_hackable_struct( random_array[j].focus, ::moon_jolie_work ); + } + level thread moon_good_jolie(); + level thread moon_bad_jolie(); + array_thread( random_array, ::moon_jolie_timer_vox ); +} +moon_jolie_work( ent_hacker ) +{ + level._osc_terms++; + if( IsDefined( self._light ) ) + { + self._light playsound( "evt_sq_rbs_light_off" ); + self._light Delete(); + } + if( level._osc_terms < 4 ) + { + ent_hacker thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest3", undefined, randomintrange(10,12) ); + } + else + { + self thread play_moon_pass_vox( ent_hacker ); + } + maps\_zombiemode_equip_hacker::deregister_hackable_struct( self ); +} +moon_good_jolie() +{ + level endon( "jolie_fail" ); + level endon( "jolie_pass" ); + level endon( level._osc_flags[ 1 ] ); + while( level._osc_terms < 4 ) + { + PrintLn("**** osc terms : " + level._osc_terms); + wait( 0.1 ); + } + flag_set( level._osc_flags[3] ); + level notify( "jolie_pass" ); +} +moon_bad_jolie() +{ + level endon( "jolie_fail" ); + level endon( "jolie_pass" ); + level endon( level._osc_flags[ 1 ] ); + wait( level._osc_trial_time ); + flag_set( level._osc_flags[2] ); + level notify( "jolie_fail" ); + level thread comp_fail_vox(); +} +moon_jolie_timer_vox() +{ + level endon( "jolie_fail" ); + level endon( "jolie_pass" ); + level endon( level._osc_flags[ 1 ] ); + for(i=level._osc_trial_time;i>0;i--) + { + playon = self.focus._light; + if( !isdefined( playon ) ) + { + return; + } + if( i == 50 ) + { + playon playsound( "vox_mcomp_quest_step3_2" ); + } + if( i == 40 ) + { + playon playsound( "vox_mcomp_quest_step3_3" ); + } + if( i == 30 ) + { + playon playsound( "vox_mcomp_quest_step3_4" ); + } + if( i == 20 ) + { + playon playsound( "vox_mcomp_quest_step3_5" ); + } + if( i == 10 ) + { + playon playsound( "vox_mcomp_quest_step3_6" ); + } + if( i == 5 ) + { + playon playsound( "vox_mcomp_quest_step3_7" ); + } + wait(1); + } +} +moon_open_access() +{ + button_triggers = []; + flag_wait( level._osc_flags[ 1 ] ); + for( i = 0; i < level._osc_rbs.size; i++ ) + { + trig = Spawn( "trigger_radius_use", level._osc_rbs[i].origin, 0, 48, 32 ); + trig.radius = 48; + trig SetCursorHint( "HINT_NOICON" ); + trig._hit_already = 0; + trig thread moon_hit_reaction(); + button_triggers = add_to_array( button_triggers, trig, false ); + trig = undefined; + } + level thread moon_access_granted( button_triggers.size ); + while( !flag( level._osc_flags[9] ) ) + { + flag_wait( level._osc_flags[8] ); + if( !IsDefined( level._osc_struct.script_float ) ) + { + PrintLn( "$$$$ need script_float on _osc_struct $$$$" ); + wait( 1.0 ); + return; + } + if( GetDvarInt( "osc_access_time" ) > 0 ) + { + wait( GetDvarInt( "osc_access_time" ) ); + } + else + { + wait( level._osc_struct.script_float ); + } + if( !flag( level._osc_flags[9] ) ) + { + level._osc_release = 0; + for( k = 0; k < button_triggers.size; k++ ) + { + button_triggers[k]._hit_already = 0; + if( IsDefined( button_triggers[k]._active ) ) + { + button_triggers[k]._active Delete(); + } + } + flag_clear( level._osc_flags[8] ); + } + } +} +moon_access_granted( int_hits ) +{ + level endon( "end_game" ); + flag_wait( level._osc_flags[1] ); + while( !flag( level._osc_flags[9] ) ) + { + if( level._osc_release == int_hits ) + { + flag_set( level._osc_flags[9] ); + for( l = 0; l < level._osc_rbs.size; l++ ) + { + level._osc_rbs[l].cover.angles = level._osc_rbs[l].cover_close; + } + } + wait( 0.1 ); + } +} +moon_hit_reaction() +{ + level endon( "end_game" ); + level endon( level._osc_flags[9] ); + while( !flag( level._osc_flags[9] ) ) + { + self waittill( "trigger", who ); + if( self._hit_already ) + { + wait( 0.1 ); + continue; + } + if( is_player_valid( who ) ) + { + flag_set( level._osc_flags[8] ); + self playsound( "evt_sq_rbs_button" ); + self._active = Spawn( "script_model", self.origin ); + self._active SetModel( "tag_origin" ); + PlayFXOnTag( level._effect["osc_button_glow"], self._active, "tag_origin" ); + self._hit_already = 1; + level._osc_release++; + } + } +} +moon_keyhole() +{ + flag_wait( level._osc_flags[9] ); + level._osc_cap RotateRoll( 180, 1.0 ); + level._osc_cap waittill( "rotatedone" ); + flag_set( level._osc_flags[10] ); +} +hacker_debug( msg, color ) +{ +} +play_moon_jolie_access_vox( who ) +{ + for( i = 0; i < level._osc_rbs.size; i++ ) + { + level._osc_rbs[i].cover playsound( "vox_mcomp_quest_step3_1", "rbs_sounddone" ); + } + level._osc_rbs[0].cover waittill( "rbs_sounddone" ); + if( isdefined( who ) ) + { + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest3", undefined, 9 ); + } +} +play_moon_pass_vox( who ) +{ + playsoundatposition( "vox_mcomp_quest_step5_26", self.origin ); + for( i = 0; i < level._osc_rbs.size; i++ ) + { + level._osc_rbs[i].cover playsound( "vox_mcomp_quest_step5_26", "rbs_sounddone" ); + } + level._osc_rbs[0].cover waittill( "rbs_sounddone" ); + if( isdefined( who ) ) + { + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest3", undefined, 12 ); + } +} +comp_fail_vox() +{ + for( i = 0; i < level._osc_rbs.size; i++ ) + { + level._osc_rbs[i].cover playsound( "vox_mcomp_quest_step5_8", "rbs_sounddone" ); + } + level._osc_rbs[0].cover waittill( "rbs_sounddone" ); + level._lid_close_sound = 0; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_moon_sq_sc.gsc b/BO1/PC/ZM/maps/zombie_moon_sq_sc.gsc new file mode 100644 index 0000000..e110b55 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_moon_sq_sc.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_moon_sq_ss.gsc b/BO1/PC/ZM/maps/zombie_moon_sq_ss.gsc new file mode 100644 index 0000000..5d2865f --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_moon_sq_ss.gsc @@ -0,0 +1,561 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_sidequests; +ss_debug() +{ +} +init_1() +{ + flag_init("displays_active"); + flag_init("wait_for_hack"); + PreCacheModel("p_zom_moon_magic_box_com_red"); + PreCacheModel("p_zom_moon_magic_box_com_green"); + PreCacheModel("p_zom_moon_magic_box_com_blue"); + PreCacheModel("p_zom_moon_magic_box_com_yellow"); + declare_sidequest_stage("sq", "ss1", ::init_stage_1, ::stage_logic, ::exit_stage_1); + buttons = GetEntArray("sq_ss_button", "targetname"); + for(i = 0; i < buttons.size; i ++) + { + ent = GetEnt(buttons[i].target, "targetname"); + buttons[i].terminal_model = ent; + } + level._ss_buttons = buttons; +} +init_2() +{ + declare_sidequest_stage("sq", "ss2", ::init_stage_2, ::stage_logic, ::exit_stage_2); +} +init_stage_1() +{ + flag_clear("wait_for_hack"); + level._ss_stage = 1; +} +init_stage_2() +{ + level._ss_stage = 2; +} +ss2_hack(hacker) +{ + flag_clear("wait_for_hack"); +} +stage_logic() +{ + buttons = level._ss_buttons; + array_thread(buttons, ::sq_ss_button_thread); + if(IsDefined(level._ss_hacks)) + { + for(i = 0; i < level._ss_hacks.size; i ++) + { + maps\_zombiemode_equip_hacker::deregister_hackable_struct(level._ss_hacks[i]); + } + } + if(level._ss_stage == 1) + { + do_ss1_logic(); + } + else + { + do_ss2_logic(); + } + stage_completed("sq", "ss"+level._ss_stage); +} +do_ss1_logic() +{ + ss_logic(6, 1); +} +do_ss2_logic() +{ + level.ss_comp_vox_count = 0; + ss_logic(6, 3); + wait(2); + level notify("rl"); + ss_logic(7, 4); + wait(2); + level notify("rl"); + ss_logic(8, 5); + wait(2); + level notify("rl"); +} +generate_sequence(seq_length) +{ + seq = []; + for(i = 0; i < seq_length; i ++) + { + seq[seq.size] = RandomIntRange(0,4); + } + last = -1; + num_reps = 0; + for(i = 0; i < seq_length; i ++) + { + if(seq[i] == last) + { + num_reps ++; + if(num_reps >= 2) + { + while(seq[i] == last) + { + seq[i] = RandomIntRange(0,4); + } + num_reps = 0; + last = seq[i]; + } + } + else + { + last = seq[i]; + num_reps = 0; + } + } + if( 1 == GetDvarInt(#"scr_debug_ss")) + { + for(i = 0; i < seq.size; i ++) + { + seq[i] = 0; + } + } + return(seq); +} +kill_debug() +{ +} +exit_stage_1(success) +{ + kill_debug(); + flag_set("ss1"); + array_thread(level._ss_buttons, ::sq_ss_button_dud_thread); +} +exit_stage_2(success) +{ + kill_debug(); +} +sq_ss_button_dud_thread() +{ + self endon("ss_kill_button_thread"); + self thread sq_ss_button_thread(true); +} +sq_ss_button_debug() +{ + level endon("ss_kill_button_thread"); + level endon("sq_ss1_over"); + level endon("sq_ss2_over"); + while(1) + { + Print3d(self.origin + (0,0,12), self.script_int, (0,255,0), 1); + wait(0.1); + } +} +do_attract() +{ + flag_set("displays_active"); + buttons = level._ss_buttons; + for(i = 0; i < buttons.size; i ++) + { + ent = buttons[i].terminal_model; + ent SetModel("p_zom_moon_magic_box_com"); + } + for(i = 0; i < buttons.size; i ++) + { + button = undefined; + for(j = 0; j < buttons.size; j ++) + { + if(buttons[j].script_int == i) + { + button = buttons[j]; + } + } + if(IsDefined(button)) + { + ent = button.terminal_model; + model = get_console_model(button.script_int); + ent SetModel(model); + ent playsound(color_sound_selector(button.script_int)); + wait(0.6); + ent SetModel("p_zom_moon_magic_box_com"); + } + } + level thread do_ss_start_vox( level._ss_stage ); + for(i = buttons.size - 1; i >= 0; i --) + { + button = undefined; + for(j = 0; j < buttons.size; j ++) + { + if(buttons[j].script_int == i) + { + button = buttons[j]; + } + } + if(IsDefined(button)) + { + ent = button.terminal_model; + model = get_console_model(button.script_int); + ent SetModel(model); + ent playsound(color_sound_selector(button.script_int)); + wait(0.6); + ent SetModel("p_zom_moon_magic_box_com"); + } + } + wait(0.5); + flag_clear("displays_active"); +} +sq_ss_button_thread(dud) +{ + level endon("sq_ss1_over"); + level endon("sq_ss2_over"); + if(!IsDefined(dud)) + { + self notify("ss_kill_button_thread"); + } + pos = self.origin; + pressed = self.origin - (AnglesToRight(self.angles) * 0.25); + targ_model = self.terminal_model; + while(1) + { + self waittill("trigger"); + if(!flag("displays_active")) + { + if(!IsDefined(dud)) + { + if(IsDefined(level._ss_user_seq)) + { + level._ss_user_seq[level._ss_user_seq.size] = self.script_int; + } + } + model = get_console_model(self.script_int); + targ_model playsound(color_sound_selector(self.script_int)); + targ_model SetModel(model); + } + wait(0.3); + targ_model SetModel("p_zom_moon_magic_box_com"); + } +} +get_console_model(num) +{ + model = "p_zom_moon_magic_box_com"; + switch(num) + { + case 0: + model = "p_zom_moon_magic_box_com_red"; + break; + case 1: + model = "p_zom_moon_magic_box_com_green"; + break; + case 2: + model = "p_zom_moon_magic_box_com_blue"; + break; + case 3: + model = "p_zom_moon_magic_box_com_yellow"; + break; + } + return model; +} +ss_logic(seq_length, seq_start_length) +{ + seq = generate_sequence(seq_length); + level._ss_user_seq = []; + level._ss_sequence_matched = false; + fails = 0; + while(!level._ss_sequence_matched) + { + wait(0.5); + self thread ss_logic_internal(seq, seq_length, seq_start_length); + self waittill_either("ss_won", "ss_failed"); + if(level._ss_sequence_matched) + { + display_success(seq); + } + else + { + display_fail(); + fails ++; + if(fails == 4) + { + seq = generate_sequence(seq_length); + fails = 0; + } + } + } +} +ss_logic_internal(seq, seq_length, seq_start_length) +{ + self endon("ss_won"); + self endon("ss_failed"); + do_attract(); + pos = seq_start_length; + buttons = level._ss_buttons; + for( i = pos; i <= seq_length; i ++) + { + level._ss_user_seq = []; + display_seq(buttons, seq, i); + wait(1.0); + validate_input(seq, i); + wait(1.0); + } + level._ss_sequence_matched = true; + self notify("ss_won"); +} +user_input_timeout(len) +{ + self endon("correct_input"); + self endon("ss_failed"); + self endon("ss_won"); + wait(len * 4); + self notify("ss_failed"); +} +validate_input(sequence, len) +{ + self thread user_input_timeout(len); + while(level._ss_user_seq.size < len) + { + for(i = 0; i < level._ss_user_seq.size; i ++) + { + if(level._ss_user_seq[i] != sequence[i]) + { + self notify("ss_failed"); + } + } + wait(0.05); + } + for(i = 0; i < level._ss_user_seq.size; i ++) + { + if(level._ss_user_seq[i] != sequence[i]) + { + self notify("ss_failed"); + } + } + level._ss_user_seq = []; + self notify("correct_input"); +} +display_fail() +{ + flag_set("displays_active"); + buttons = level._ss_buttons; + level thread do_ss_failure_vox( level._ss_stage ); + all_screens_black = false; + while(!all_screens_black) + { + all_screens_black = true; + for(i = 0; i < buttons.size; i ++) + { + ent = buttons[i].terminal_model; + if(ent.model != "p_zom_moon_magic_box_com") + { + all_screens_black = false; + break; + } + } + wait(0.1); + } + level thread Play_Sound_In_Space("evt_ss_wrong",( -1006.3, 294.2, -93.7)); + for(i = 0; i < 5; i ++) + { + for(j = 0; j < buttons.size; j ++) + { + ent = buttons[j].terminal_model; + ent SetModel("p_zom_moon_magic_box_com_red"); + } + wait(0.2); + for(j = 0; j < buttons.size; j ++) + { + ent = buttons[j].terminal_model; + ent SetModel("p_zom_moon_magic_box_com"); + } + wait(0.05); + } + flag_clear("displays_active"); +} +play_win_seq(seq) +{ + for(i = 0; i < seq.size; i ++) + { + level thread Play_Sound_In_Space(color_sound_selector(seq[i]),( -1006.3, 294.2, -93.7)); + wait(0.2); + } +} +display_success(seq) +{ + flag_set("displays_active"); + buttons = level._ss_buttons; + level thread do_ss_success_vox( level._ss_stage ); + all_screens_black = false; + while(!all_screens_black) + { + all_screens_black = true; + for(i = 0; i < buttons.size; i ++) + { + ent = buttons[i].terminal_model; + if(ent.model != "p_zom_moon_magic_box_com") + { + all_screens_black = false; + break; + } + } + wait(0.1); + } + level thread play_win_seq(seq); + for(i = 0; i < 5; i ++) + { + for(j = 0; j < buttons.size; j ++) + { + ent = buttons[j].terminal_model; + ent SetModel("p_zom_moon_magic_box_com_green"); + } + wait(0.2); + for(j = 0; j < buttons.size; j ++) + { + ent = buttons[j].terminal_model; + ent SetModel("p_zom_moon_magic_box_com"); + } + wait(0.05); + } + flag_clear("displays_active"); +} +display_seq(buttons, seq, index) +{ + flag_set("displays_active"); + for(i = 0; i < index; i ++) + { + print_duration = 1; + wait_duration = 0.4; + if(i < (index - 1)) + { + print_duration /= 2; + wait_duration /= 2; + } + for(j = 0; j < buttons.size; j ++) + { + ent = buttons[j].terminal_model; + model = get_console_model(seq[i]); + level thread Play_Sound_In_Space(color_sound_selector(seq[i]),( -1006.3, 294.2, -93.7)); + ent SetModel(model); + } + wait(print_duration); + for(j = 0; j < buttons.size; j ++) + { + ent = buttons[j].terminal_model; + ent SetModel("p_zom_moon_magic_box_com"); + } + wait(wait_duration); + } + flag_clear("displays_active"); +} +color_sound_selector(index) +{ + switch(index) + { + case 0: + return "evt_ss_e"; + case 1: + return "evt_ss_d"; + case 2: + return "evt_ss_c"; + case 3: + return "evt_ss_lo_g"; + } +} +do_ss_start_vox(stage) +{ + playon = level._ss_buttons[1].terminal_model; + if( stage == 1 ) + { + player = is_player_close_enough( playon ); + if( isdefined( player ) ) + { + playon playsound( "vox_mcomp_quest_step1_0", "mcomp_done0" ); + playon waittill( "mcomp_done0" ); + if( isdefined( player ) ) + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest1", undefined, 0 ); + } + } + else + { + if( level.ss_comp_vox_count == 0 ) + { + playon playsound( "vox_mcomp_quest_step7_0", "mcomp_done1" ); + } + } +} +do_ss_failure_vox(stage) +{ + playon = level._ss_buttons[1].terminal_model; + if( stage == 1 ) + { + player = is_player_close_enough( playon ); + if( isdefined( player ) ) + { + playon playsound( "vox_mcomp_quest_step1_1", "mcomp_done2" ); + playon waittill( "mcomp_done2" ); + if( isdefined( player ) ) + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest1", undefined, 1 ); + } + } + else + { + player = is_player_close_enough( playon ); + if( isdefined( player ) ) + { + switch( level.ss_comp_vox_count ) + { + case 0: + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest1", undefined, 1 ); + break; + case 1: + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest7", undefined, 1 ); + break; + case 2: + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest7", undefined, 3 ); + break; + } + } + } +} +do_ss_success_vox(stage) +{ + playon = level._ss_buttons[1].terminal_model; + if( stage == 1 ) + { + player = is_player_close_enough( playon ); + if( isdefined( player ) ) + { + playon playsound( "vox_mcomp_quest_step1_2", "mcomp_done3" ); + playon waittill( "mcomp_done3" ); + if( isdefined( player ) ) + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest1", undefined, 2 ); + } + } + else + { + switch( level.ss_comp_vox_count ) + { + case 0: + playon playsound( "vox_mcomp_quest_step7_2", "mcomp_done4" ); + level.ss_comp_vox_count++; + break; + case 1: + playon playsound( "vox_mcomp_hack_success", "mcomp_done5" ); + level.ss_comp_vox_count++; + break; + case 2: + playon playsound( "vox_mcomp_quest_step7_4", "mcomp_done6" ); + playon waittill( "mcomp_done6" ); + if( !flag("be2") ) + { + playon playsound( "vox_xcomp_quest_step7_5", "xcomp_done7" ); + } + break; + } + } +} +is_player_close_enough( org ) +{ + players = get_players(); + for(i=0;i= time0 ) + { + zapper_light_green( level.teleporter_lights[0], "targetname" ); + lights_mode++; + } + break; + case 1: + if( time >= time1 ) + { + zapper_light_green( level.teleporter_lights[1], "targetname" ); + lights_mode++; + } + break; + case 2: + if( time >= time2 ) + { + zapper_light_green( level.teleporter_lights[2], "targetname" ); + lights_mode++; + } + break; + case 3: + if( time >= time3 ) + { + zapper_light_green( level.teleporter_lights[3], "targetname" ); + lights_mode++; + teleporter_to_nml_gate_move( 1 ); + } + break; + default: + wait( 0.1 ); + break; + } + wait( 1 ); + } +} +teleporter_exit_nml_think() +{ + wait( 3 ); + level thread teleporter_exit_nml_gate_move( 0 ); + while( 1 ) + { + flag_wait( "enter_nml" ); + if(level.on_the_moon == false) + { + wait(20); + } + else + { + wait( level.teleporter_exit_nml_powerdown_time ); + } + level thread teleporter_exit_nml_gate_move( 1 ); + while(flag("enter_nml")) + { + wait(1); + } + level thread teleporter_exit_nml_gate_move( 0 ); + } +} +teleporter_exit_nml_gate_move( open_it ) +{ + if( (level.teleporter_exit_nml_gate_open && open_it) || (!level.teleporter_exit_nml_gate_open && !open_it) ) + { + return; + } + level.teleporter_exit_nml_gate_open = open_it; + gate_height = level.teleporter_exit_nml_gate_height; + gate2_height = level.teleporter_exit_nml_gate2_height; + if( !open_it ) + { + gate_height *= -1.0; + gate2_height *= -1.0; + } + time = level.teleporter_gate_move_time; + accel = time / 6.0; + ent = level.teleporter_exit_nml_gate_ent; + ent PlaySound( "amb_teleporter_gate_start" ); + ent playloopsound( "amb_teleporter_gate_loop", .5 ); + ent2 = level.teleporter_exit_nml_gate2_ent; + pos2 = ( ent2.origin[0], ent2.origin[1], ent2.origin[2]-gate2_height ); + ent2 moveto ( pos2, time, accel, accel ); + pos = ( ent.origin[0], ent.origin[1], ent.origin[2]-gate_height ); + ent moveto ( pos, time, accel, accel ); + ent thread play_stopmoving_sounds(); + if( open_it ) + { + ent connectpaths(); + } + else + { + wait( level.teleporter_gate_move_time ); + ent disconnectpaths(); + } +} +play_stopmoving_sounds() +{ + self waittill( "movedone" ); + self stoploopsound( .5 ); + self playsound( "amb_teleporter_gate_stop" ); +} + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_moon_wasteland.gsc b/BO1/PC/ZM/maps/zombie_moon_wasteland.gsc new file mode 100644 index 0000000..dce6807 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_moon_wasteland.gsc @@ -0,0 +1,869 @@ + +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\zombie_moon_teleporter; +#using_animtree( "generic_human" ); +init_supersprint_anims() +{ + level.scr_anim["zombie"]["sprint5"] = %ai_zombie_fast_sprint_01; + level.scr_anim["zombie"]["sprint6"] = %ai_zombie_fast_sprint_02; +} +init_no_mans_land() +{ + flag_init("enter_nml"); + flag_init("teleporter_used"); + flag_init("start_supersprint"); + level.on_the_moon = false; + level.ever_been_on_the_moon = false; + level.initial_spawn = true; + level.nml_didteleport = false; + level.nml_dog_health = 100; + init_teleporter_message(); + level thread init_supersprint_anims(); + maps\_zombiemode_zone_manager::zone_init( "nml_zone" ); + SetSavedDvar( "r_skyTransition", 1 ); + teleporter_to_nml_init(); + ent = getent( "nml_dogs_volume", "targetname" ); + ent thread check_players_in_nml_dogs_volume(); + level.num_nml_dog_targets = 0; + get_perk_machine_ents(); + level.last_perk_index = -1; + level thread zombie_moon_start_init(); + level.NML_REACTION_INTERVAL = 2000; + level.NML_MIN_REACTION_DIST_SQ = 32*32; + level.NML_MAX_REACTION_DIST_SQ = 2400*2400; +} +zombie_moon_start_init() +{ + flag_wait( "begin_spawning" ); + level thread nml_dogs_init(); + teleporter = getent( "generator_teleporter", "targetname" ); + teleporter_ending( teleporter, 0 ); +} +nml_dogs_init() +{ + level.nml_dogs_enabled = false; + wait(30); + level.nml_dogs_enabled = true; +} +nml_setup_round_spawner() +{ + if(IsDefined(level.round_number)) + { + if(flag("between_rounds")) + { + level.nml_last_round = level.round_number + 1; + } + else + { + level.nml_last_round = level.round_number; + } + } + else + { + level.nml_last_round = 1; + } + level.round_spawn_func = ::nml_round_manager; + Init_Moon_NML_Round( level.nml_last_round ); +} +num_players_touching_volume( volume ) +{ + players = get_players(); + num_players_inside = 0; + for( i=0; i= max_zombies ) + { + zombies = GetAiSpeciesArray( "axis", "all" ); + wait( 0.5 ); + } + switch( mode ) + { + case "normal_spawning": + if(level.initial_spawn == true) + { + spawn_a_zombie( 10, "nml_zone_spawners", 0.01 ); + } + else + { + ai = spawn_a_zombie( max_zombies, "nml_zone_spawners", 0.01 ); + if( isdefined (ai) ) + { + ai.zombie_move_speed = "sprint"; + if(flag("start_supersprint")) + { + theanim = "sprint" + randomintrange(1, 6); + } + else + { + theanim = "sprint" + randomintrange(1, 4); + } + if( IsDefined( ai.pre_black_hole_bomb_run_combatanim ) ) + { + ai.pre_black_hole_bomb_run_combatanim = theanim; + } + else + { + ai set_run_anim( theanim ); + ai.run_combatanim = level.scr_anim[ai.animname][theanim]; + ai.walk_combatanim = level.scr_anim[ai.animname][theanim]; + ai.crouchRunAnim = level.scr_anim[ai.animname][theanim]; + ai.crouchrun_combatanim = level.scr_anim[ai.animname][theanim]; + ai.needs_run_update = true; + } + } + } + if( current_time > next_round_time ) + { + next_round_time = current_time + prepare_attack_time; + mode = "preparing_spawn_wave"; + level thread screen_shake_manager( next_round_time ); + } + break; + case "preparing_spawn_wave": + zombies = GetAiSpeciesArray( "axis" ); + for( i=0; i < zombies.size; i++ ) + { + if( zombies[i].has_legs && zombies[i].animname == "zombie") + { + zombies[i].zombie_move_speed = "sprint"; + if(flag("start_supersprint")) + { + theanim = "sprint" + randomintrange(1, 6); + } + else + { + theanim = "sprint" + randomintrange(1, 4); + } + level.initial_spawn = false; + level notify( "start_nml_ramp" ); + if( IsDefined( zombies[i].pre_black_hole_bomb_run_combatanim ) ) + { + zombies[i].pre_black_hole_bomb_run_combatanim = theanim; + } + else + { + zombies[i] set_run_anim( theanim ); + zombies[i].run_combatanim = level.scr_anim[zombies[i].animname][theanim]; + zombies[i].walk_combatanim = level.scr_anim[zombies[i].animname][theanim]; + zombies[i].crouchRunAnim = level.scr_anim[zombies[i].animname][theanim]; + zombies[i].crouchrun_combatanim = level.scr_anim[zombies[i].animname][theanim]; + zombies[i].needs_run_update = true; + } + } + } + if( current_time > next_round_time ) + { + level notify( "nml_attack_wave" ); + mode = "spawn_wave_active"; + if( area == 1 ) + { + area = 2; + level thread nml_wave_attack( max_zombies, "nml_area2_spawners" ); + } + else + { + area = 1; + level thread nml_wave_attack( max_zombies, "nml_area1_spawners" ); + } + next_round_time = current_time + wave_attack_time; + } + wait_override = 0.1; + break; + case "spawn_wave_active": + if( current_time < next_round_time ) + { + if( randomfloatrange(0, 1) < 0.05 ) + { + ai = spawn_a_zombie( max_zombies, "nml_zone_spawners", 0.01 ); + if( isdefined (ai) ) + { + ai.ignore_gravity = true; + ai.zombie_move_speed = "sprint"; + if(flag("start_supersprint")) + { + theanim = "sprint" + randomintrange(1, 6); + } + else + { + theanim = "sprint" + randomintrange(1, 4); + } + if( IsDefined( ai.pre_black_hole_bomb_run_combatanim ) ) + { + ai.pre_black_hole_bomb_run_combatanim = theanim; + } + else + { + ai set_run_anim( theanim ); + ai.run_combatanim = level.scr_anim[ai.animname][theanim]; + ai.walk_combatanim = level.scr_anim[ai.animname][theanim]; + ai.crouchRunAnim = level.scr_anim[ai.animname][theanim]; + ai.crouchrun_combatanim = level.scr_anim[ai.animname][theanim]; + ai.needs_run_update = true; + } + } + } + } + else + { + level notify("wave_attack_finished"); + mode = "wave_finished_cooldown"; + next_round_time = current_time + cooldown_time; + } + break; + case "wave_finished_cooldown": + if( current_time > next_round_time ) + { + next_round_time = current_time + next_attack_time; + mode = "normal_spawning"; + } + wait_override = 0.01; + break; + } + num_dog_targets = 0; + if( (current_time - level.nml_start_time) > dog_round_start_time ) + { + skip_dogs = 0; + players = get_players(); + if( players.size <= 1 ) + { + dt = current_time - dog_can_spawn_time; + if( dt < 0 ) + { + skip_dogs = 1; + } + else + { + dog_can_spawn_time = current_time + randomfloatrange(dog_difficulty_min_time, dog_difficulty_max_time); + } + } + if( mode == "preparing_spawn_wave" ) + { + skip_dogs = 1; + } + if( !skip_dogs && level.nml_dogs_enabled == true) + { + num_dog_targets = level.num_nml_dog_targets; + if( num_dog_targets ) + { + dogs = getaispeciesarray( "axis", "dog" ); + num_dog_targets *= 2; + if( dogs.size < num_dog_targets ) + { + ai = maps\_zombiemode_ai_dogs::special_dog_spawn(); + zombie_dogs = GetAISpeciesArray("axis","zombie_dog"); + if(IsDefined(zombie_dogs)) + { + for( i=0; i= max_zombies ) + { + return( undefined ); + } + zombie_spawners = getentarray( spawner_zone_name, "targetname" ); + spawn_point = zombie_spawners[RandomInt( zombie_spawners.size )]; + ai = spawn_zombie( spawn_point ); + if( IsDefined( ai ) ) + { + ai thread maps\_zombiemode::round_spawn_failsafe(); + ai.zone_name = spawner_zone_name; + if ( is_true( level.mp_side_step ) ) + { + ai.shouldSideStepFunc = ::nml_shouldSideStep; + ai.sideStepAnims = []; + ai.sideStepAnims["step_left"] = array( %ai_zombie_MP_sidestep_left_a, %ai_zombie_MP_sidestep_left_b ); + ai.sideStepAnims["step_right"] = array( %ai_zombie_MP_sidestep_right_a, %ai_zombie_MP_sidestep_right_b ); + } + } + wait( wait_delay ); + wait_network_frame(); + return( ai ); +} +screen_shake_manager( next_round_time ) +{ + level endon( "nml_attack_wave" ); + level endon("restart_round"); + time = 0; + while( time < next_round_time ) + { + level thread attack_wave_screen_shake(); + wait_time = randomfloatrange(0.25, 0.35); + wait( wait_time ); + time = gettime(); + } +} +attack_wave_screen_shake() +{ + num_valid = 0; + players = get_players(); + pos = ( 0, 0, 0 ); + for( i=0; i 1 ) + { + perk_index = 0; + } + } + while( perk_index == level.last_perk_index ) + { + perk_index = randomintrange( 0, 2 ); + } + level.last_perk_index = perk_index; + perk_machine_show_selected( perk_index, false ); + } +} +perk_arrive_fx( pos ) +{ + wait( 0.15 ); + Playfx( level._effect["lightning_dog_spawn"], pos ); + playsoundatposition( "zmb_hellhound_spawn", pos ); + playsoundatposition( "zmb_hellhound_bolt", pos ); + wait( 1.1 ); + Playfx( level._effect["lightning_dog_spawn"], pos ); + playsoundatposition( "zmb_hellhound_spawn", pos ); + playsoundatposition( "zmb_hellhound_bolt", pos ); +} +nml_round_never_ends() +{ + wait( 2 ); + level endon( "restart_round" ); + while( flag("enter_nml") ) + { + zombies = GetAiSpeciesArray( "axis", "all" ); + if( zombies.size >= 2 ) + { + level.zombie_total = 100; + return; + } + wait( 1 ); + } +} +nml_side_stepping_zombies() +{ + level.mp_side_step = false; + level waittill( "nml_attack_wave" ); + level.mp_side_step = true; +} +nml_ramp_up_zombies() +{ + self endon( "stop_ramp" ); + level waittill( "start_nml_ramp" ); + level.nml_timer = level.nml_last_round; + while(flag("enter_nml")) + { + if ( !level.on_the_moon ) + { + level.nml_timer++; + thread play_sound_2d( "evt_nomans_warning" ); + zombies = GetAISpeciesArray("axis", "zombie"); + for( i=0; i= 4 && level.nml_timer < 6) + { + level.nml_dog_health = 400; + } + else if( level.nml_timer >= 6 && level.nml_timer < 15 ) + { + level.nml_dog_health = 800; + } + else if( level.nml_timer >= 15 && level.nml_timer < 30 ) + { + level.nml_dog_health = 1200; + } + else if(level.nml_timer >= 30) + { + level.nml_dog_health = 1600; + } +} +nml_shouldSideStep() +{ + if ( self nml_canSideStep() ) + { + return "step"; + } + return "none"; +} +nml_canSideStep() +{ + if( GetTime() - self.a.lastSideStepTime < level.NML_REACTION_INTERVAL ) + return false; + if( !IsDefined(self.enemy) ) + return false; + if( self.a.pose != "stand" ) + return false; + distSqFromEnemy = DistanceSquared(self.origin, self.enemy.origin); + if( distSqFromEnemy < level.NML_MIN_REACTION_DIST_SQ ) + { + return false; + } + if( distSqFromEnemy > level.NML_MAX_REACTION_DIST_SQ ) + { + return false; + } + if( !IsDefined(self.pathgoalpos) || DistanceSquared(self.origin, self.pathgoalpos) < level.NML_MIN_REACTION_DIST_SQ ) + { + return false; + } + if( abs(self GetMotionAngle()) > 15 ) + { + return false; + } + return true; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_pentagon.gsc b/BO1/PC/ZM/maps/zombie_pentagon.gsc new file mode 100644 index 0000000..42798fe --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_pentagon.gsc @@ -0,0 +1,562 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_zone_manager; +#include maps\zombie_pentagon_teleporter; +main() +{ + maps\zombie_pentagon_fx::main(); + maps\zombie_pentagon_amb::main(); + maps\zombie_pentagon_anim::main(); + level pentagon_precache(); + PrecacheShader( "zom_icon_trap_switch_handle" ); + level.dogs_enabled = false; + level.random_pandora_box_start = false; + level thread maps\_callbacksetup::SetupCallbacks(); + level.quad_move_speed = 35; + level.quad_explode = true; + level.dog_spawn_func = maps\_zombiemode_ai_dogs::dog_spawn_factory_logic; + level.exit_level_func = ::pentagon_exit_level; + level.custom_ai_type = []; + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_dogs::init ); + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_quad::init ); + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_thief::init ); + level.door_dialog_function = maps\_zombiemode::play_door_dialog; + include_weapons(); + include_powerups(); + level.use_zombie_heroes = true; + level.disable_protips = 1; + level.delete_when_in_createfx = ::delete_in_createfx; + maps\_zombiemode::main(); + level maps\zombie_pentagon_magic_box::magic_box_init(); + battlechatter_off("allies"); + battlechatter_off("axis"); + maps\_compass::setupMiniMap("menu_map_zombie_pentagon"); + level.zone_manager_init_func = ::pentagon_zone_init; + init_zones[0] = "conference_level1"; + level thread maps\_zombiemode_zone_manager::manage_zones( init_zones ); + level.random_spawners = true; + level maps\zombie_pentagon_traps::init_traps(); + level thread maps\_zombiemode_auto_turret::init(); + level thread maps\zombie_pentagon_elevators::init(); + level thread electric_switch(); + level thread enable_zone_elevators_init(); + level thread maps\zombie_pentagon_teleporter::pentagon_packapunch_init(); + level thread maps\zombie_pentagon_teleporter::pack_door_init(); + level thread maps\zombie_pentagon_teleporter::teleporter_power_cable(); + level thread vision_set_init(); + level thread laststand_bleedout_init(); + level thread lab_shutters_init(); + level thread pentagon_brush_lights_init(); + level.bonfire_init_func = ::pentagon_bonfire_init; + init_sounds(); + init_pentagon_client_flags(); + level thread play_starting_vox(); +} +init_pentagon_client_flags() +{ + level.ZOMBIE_PENTAGON_PLAYER_PORTALFX = 5; + level.ZOMBIE_PENTAGON_PLAYER_PORTALFX_COOL = 6; +} +delete_in_createfx() +{ + if ( GetDvar( #"createfx" ) != "" ) + { + exterior_goals = getstructarray( "exterior_goal", "targetname" ); + for( i = 0; i < exterior_goals.size; i++ ) + { + if( !IsDefined( exterior_goals[i].target ) ) + { + continue; + } + targets = GetEntArray( exterior_goals[i].target, "targetname" ); + for( j = 0; j < targets.size; j++ ) + { + if( IsDefined( targets[j].script_parameters ) && targets[j].script_parameters == "repair_board" ) + { + unbroken_section = GetEnt( targets[j].target,"targetname" ); + if ( IsDefined( unbroken_section ) ) + { + unbroken_section self_delete(); + } + } + targets[j] self_delete(); + } + } + return; + } +} +pentagon_zone_init() +{ + flag_init( "always_on" ); + flag_set( "always_on" ); + add_adjacent_zone( "conference_level1", "hallway_level1", "conf1_hall1" ); + add_adjacent_zone( "hallway3_level1", "hallway_level1", "conf1_hall1" ); + add_adjacent_zone( "conference_level2", "war_room_zone_south", "war_room_entry", true ); + add_adjacent_zone( "conference_level2", "war_room_zone_north", "war_room_special", true ); + add_adjacent_zone( "war_room_zone_top", "war_room_zone_south", "war_room_stair" ); + add_adjacent_zone( "war_room_zone_top", "war_room_zone_north", "war_room_stair" ); + add_adjacent_zone( "war_room_zone_south", "war_room_zone_north", "war_room_stair" ); + add_adjacent_zone( "war_room_zone_south", "war_room_zone_north", "war_room_west" ); + add_adjacent_zone( "war_room_zone_north", "war_room_zone_elevator", "war_room_elevator" ); + add_adjacent_zone( "labs_elevator", "labs_hallway1", "labs_enabled" ); + add_adjacent_zone( "labs_hallway1", "labs_hallway2", "labs_enabled" ); + add_adjacent_zone( "labs_hallway2", "labs_zone1", "lab1_level3" ); + add_adjacent_zone( "labs_hallway1", "labs_zone2", "lab2_level3" ); + add_adjacent_zone( "labs_hallway2", "labs_zone2", "lab2_level3" ); + add_adjacent_zone( "labs_hallway1", "labs_zone3", "lab3_level3" ); + level.zones["conference_level1"].num_spawners = 4; + level.zones["hallway_level1"].num_spawners = 4; +} +enable_zone_elevators_init() +{ + elev_zone_trig = GetEnt( "elevator1_down_riders", "targetname" ); + elev_zone_trig thread maps\zombie_pentagon_teleporter::enable_zone_portals(); + elev_zone_trig2 = GetEnt( "elevator2_down_riders", "targetname" ); + elev_zone_trig2 thread maps\zombie_pentagon_teleporter::enable_zone_portals(); +} +include_weapons() +{ + include_weapon( "frag_grenade_zm", false, true ); + include_weapon( "claymore_zm", false, true ); + include_weapon( "m1911_zm", false ); + include_weapon( "m1911_upgraded_zm", false ); + include_weapon( "python_zm" ); + include_weapon( "python_upgraded_zm", false ); + include_weapon( "cz75_zm" ); + include_weapon( "cz75_upgraded_zm", false ); + include_weapon( "m14_zm", false, true ); + include_weapon( "m14_upgraded_zm", false ); + include_weapon( "m16_zm", false, true ); + include_weapon( "m16_gl_upgraded_zm", false ); + include_weapon( "g11_lps_zm" ); + include_weapon( "g11_lps_upgraded_zm", false ); + include_weapon( "famas_zm" ); + include_weapon( "famas_upgraded_zm", false ); + include_weapon( "ak74u_zm", false, true ); + include_weapon( "ak74u_upgraded_zm", false ); + include_weapon( "mp5k_zm", false, true ); + include_weapon( "mp5k_upgraded_zm", false ); + include_weapon( "mpl_zm", false, true ); + include_weapon( "mpl_upgraded_zm", false ); + include_weapon( "pm63_zm", false, true ); + include_weapon( "pm63_upgraded_zm", false ); + include_weapon( "spectre_zm" ); + include_weapon( "spectre_upgraded_zm", false ); + include_weapon( "cz75dw_zm" ); + include_weapon( "cz75dw_upgraded_zm", false ); + include_weapon( "ithaca_zm", false, true ); + include_weapon( "ithaca_upgraded_zm", false ); + include_weapon( "rottweil72_zm", false, true ); + include_weapon( "rottweil72_upgraded_zm", false ); + include_weapon( "spas_zm" ); + include_weapon( "spas_upgraded_zm", false ); + include_weapon( "hs10_zm" ); + include_weapon( "hs10_upgraded_zm", false ); + include_weapon( "aug_acog_zm" ); + include_weapon( "aug_acog_mk_upgraded_zm", false ); + include_weapon( "galil_zm" ); + include_weapon( "galil_upgraded_zm", false ); + include_weapon( "commando_zm" ); + include_weapon( "commando_upgraded_zm", false ); + include_weapon( "fnfal_zm" ); + include_weapon( "fnfal_upgraded_zm", false ); + include_weapon( "dragunov_zm" ); + include_weapon( "dragunov_upgraded_zm", false ); + include_weapon( "l96a1_zm" ); + include_weapon( "l96a1_upgraded_zm", false ); + include_weapon( "rpk_zm" ); + include_weapon( "rpk_upgraded_zm", false ); + include_weapon( "hk21_zm" ); + include_weapon( "hk21_upgraded_zm", false ); + include_weapon( "m72_law_zm" ); + include_weapon( "m72_law_upgraded_zm", false ); + include_weapon( "china_lake_zm" ); + include_weapon( "china_lake_upgraded_zm", false ); + include_weapon( "zombie_cymbal_monkey" ); + include_weapon( "ray_gun_zm" ); + include_weapon( "ray_gun_upgraded_zm", false ); + include_weapon( "freezegun_zm" ); + include_weapon( "freezegun_upgraded_zm", false ); + include_weapon( "crossbow_explosive_zm" ); + include_weapon( "crossbow_explosive_upgraded_zm", false ); + include_weapon( "knife_ballistic_zm", true ); + include_weapon( "knife_ballistic_upgraded_zm", false ); + include_weapon( "knife_ballistic_bowie_zm", false ); + include_weapon( "knife_ballistic_bowie_upgraded_zm", false ); + level._uses_retrievable_ballisitic_knives = true; + maps\_zombiemode_weapons::add_limited_weapon( "m1911_zm", 0 ); + maps\_zombiemode_weapons::add_limited_weapon( "freezegun_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "crossbow_explosive_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "knife_ballistic_zm", 1 ); + precacheItem( "explosive_bolt_zm" ); + precacheItem( "explosive_bolt_upgraded_zm" ); + level.collector_achievement_weapons = array_add( level.collector_achievement_weapons, "bowie_knife_zm" ); +} +include_powerups() +{ + include_powerup( "nuke" ); + include_powerup( "insta_kill" ); + include_powerup( "double_points" ); + include_powerup( "full_ammo" ); + include_powerup( "carpenter" ); + include_powerup( "fire_sale" ); + include_powerup( "bonfire_sale" ); + PreCacheItem( "minigun_zm" ); + include_powerup( "minigun" ); +} +electric_switch() +{ + trig = getent("use_elec_switch","targetname"); + trig sethintstring(&"ZOMBIE_ELECTRIC_SWITCH"); + trig setcursorhint( "HINT_NOICON" ); + level thread wait_for_power(); + trig waittill("trigger",user); + trig delete(); + flag_set( "power_on" ); + Objective_State(8,"done"); +} +wait_for_power() +{ + master_switch = getent("elec_switch","targetname"); + master_switch notsolid(); + flag_wait( "power_on" ); + exploder(3500); + stop_exploder(2000); + exploder(2001); + level thread regular_portal_fx_on(); + level thread maps\zombie_pentagon::change_pentagon_vision(); + master_switch rotateroll(-90,.3); + master_switch playsound("zmb_switch_flip"); + level notify("revive_on"); + level notify("juggernog_on"); + level notify("sleight_on"); + level notify("doubletap_on"); + level notify("Pack_A_Punch_on" ); + clientnotify("ZPO"); + maps\zombie_pentagon_teleporter::teleporter_init(); + master_switch waittill("rotatedone"); + playfx(level._effect["switch_sparks"] ,getstruct("elec_switch_fx","targetname").origin); + master_switch playsound("zmb_turn_on"); + level thread maps\zombie_pentagon_amb::play_pentagon_announcer_vox( "zmb_vox_pentann_poweron" ); +} +init_sounds() +{ + maps\_zombiemode_utility::add_sound( "wood_door_fall", "zmb_wooden_door_fall" ); + maps\_zombiemode_utility::add_sound( "window_grate", "zmb_window_grate_slide" ); + maps\_zombiemode_utility::add_sound( "lab_door", "zmb_lab_door_slide" ); + maps\_zombiemode_utility::add_sound( "lab_door_swing", "zmb_door_wood_open" ); +} +quad_traverse_death_fx() +{ + self endon("quad_end_traverse_anim"); + self waittill( "death" ); + playfx(level._effect["quad_grnd_dust_spwnr"], self.origin); +} +zombie_pathing_init() +{ + cleanup_trig = GetEntArray( "zombie_movement_cleanup", "targetname" ); + for ( i = 0; i < cleanup_trig.size; i++ ) + { + cleanup_trig[i] thread zombie_pathing_cleanup(); + } +} +zombie_pathing_cleanup() +{ + while(true) + { + self waittill("trigger", who); + if(IsDefined(who.animname) && who.animname == "thief_zombie") + { + continue; + } + else if(who.team == "axis") + { + level.zombie_total++; + who DoDamage(who.health + 100, who.origin); + } + } +} +vision_set_init() +{ + level waittill( "start_of_round" ); + exploder(2000); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] VisionSetNaked("zombie_pentagon", 0.5); + } +} +change_pentagon_vision() +{ + if(flag("thief_round")) + { + return; + } + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[i].floor = maps\_zombiemode_ai_thief::thief_check_floor( players[i] ); + setClientSysState( "levelNotify", "vis" + players[i].floor, players[i] ); + wait_network_frame(); + } +} +laststand_bleedout_init() +{ + flag_wait( "all_players_connected" ); + players = get_players(); + if(players.size > 1) + { + for ( i = 0; i < players.size; i++ ) + { + players[i] thread wait_for_laststand_notify(); + players[i] thread bleedout_listener(); + } + } +} +wait_for_laststand_notify() +{ + self endon("disconnect"); + while(true) + { + num_on_floor = 0; + num_floor_laststand = 0; + self waittill( "player_downed" ); + while(self maps\_laststand::player_is_in_laststand()) + { + self.floor = maps\_zombiemode_ai_thief::thief_check_floor( self ); + current_floor = self.floor; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[i].floor = maps\_zombiemode_ai_thief::thief_check_floor( players[i] ); + if(players[i].floor == current_floor) + { + num_on_floor++; + if(players[i] maps\_laststand::player_is_in_laststand()) + { + num_floor_laststand++; + } + } + } + wait_network_frame(); + if(players.size > 1 && num_on_floor == num_floor_laststand) + { + self thread maps\zombie_pentagon_elevators::laststand_elev_zombies_away(); + } + wait(5); + } + } +} +bleedout_listener() +{ + while(true) + { + self waittill( "spawned_spectator" ); + wait(2); + level thread check_if_empty_floors(); + wait(1); + } +} +pentagon_bonfire_init() +{ + if(flag("defcon_active") && level.defcon_activated == false) + { + return; + } + else if(flag("defcon_active") && level.defcon_activated == true) + { + level.defcon_countdown_time = 30; + level.defcon_level = 5; + return; + } + current_defcon_level = level.defcon_level; + punch_switches = GetEntArray("punch_switch","targetname"); + signs = GetEntArray("defcon_sign", "targetname"); + pack_door_slam = GetEnt("slam_pack_door","targetname"); + flag_set("bonfire_reset"); + level.defcon_level = 1; + level notify("pack_room_reset"); + wait(0.1); + if(IsDefined(punch_switches)) + { + for ( i = 0; i < punch_switches.size; i++ ) + { + punch_switches[i] notify( "trigger" ); + wait( 0.5 ); + } + } + if(level.zones["conference_level2"].is_occupied) + { + wait(1); + level thread start_defcon_countdown(); + } + level waittill( "bonfire_sale_off" ); + if( level.defcon_activated == true || level.zones["conference_level2"].is_occupied) + { + return; + } + else + { + flag_clear("defcon_active"); + level thread regular_portal_fx_on(); + level.defcon_level = 1; + level notify("pack_room_reset"); + level thread defcon_sign_lights(); + } + flag_clear("bonfire_reset"); +} +lab_shutters_init() +{ + shutters = GetEntArray("lab_shutter","script_noteworthy"); + if(IsDefined(shutters)) + { + for ( i = 0; i < shutters.size; i++ ) + { + shutters[i] thread lab_shutters_think(); + } + } +} +lab_shutters_think() +{ + door_pos = self.origin; + time = 1; + scale = 1; + if(IsDefined(self.script_flag) && !flag(self.script_flag)) + { + flag_wait(self.script_flag); + if(flag("thief_round")) + { + while(flag("thief_round")) + { + wait(0.5); + } + } + if(isDefined(self.script_vector)) + { + vector = vector_scale( self.script_vector, scale ); + thief_vector = vector_scale( self.script_vector, .2 ); + while(true) + { + self MoveTo( door_pos + vector, time, time * 0.25, time * 0.25 ); + self thread maps\_zombiemode_blockers::door_solid_thread(); + flag_wait("thief_round"); + self MoveTo( door_pos + thief_vector, time, time * 0.25, time * 0.25 ); + self thread maps\_zombiemode_blockers::door_solid_thread(); + while(flag("thief_round")) + { + wait(0.5); + } + } + } + } +} +play_starting_vox() +{ + flag_wait( "all_players_connected" ); + level thread maps\zombie_pentagon_amb::play_pentagon_announcer_vox( "zmb_vox_pentann_levelstart" ); +} +pentagon_brush_lights_init() +{ + sbrush_office_ceiling_lights_off = GetEntArray( "sbrushmodel_interior_office_lights", "targetname" ); + if( IsDefined( sbrush_office_ceiling_lights_off ) && sbrush_office_ceiling_lights_off.size > 0 ) + { + array_thread( sbrush_office_ceiling_lights_off, ::pentagon_brush_lights ); + } +} +pentagon_brush_lights() +{ + if( !IsDefined( self.target ) ) + { + return; + } + self.off_version = GetEnt( self.target, "targetname" ); + self.off_version Hide(); + flag_wait( "power_on" ); + self Hide(); + self.off_version Show(); +} +pentagon_precache() +{ + PreCacheModel("zombie_zapper_cagelight_red"); + precachemodel("zombie_zapper_cagelight_green"); + PreCacheShellShock( "electrocution" ); + PreCacheModel( "viewmodel_usa_pow_arms" ); + PreCacheModel( "zombie_trap_switch" ); + PreCacheModel( "zombie_trap_switch_light" ); + PreCacheModel( "zombie_trap_switch_light_on_green" ); + PreCacheModel( "zombie_trap_switch_light_on_red" ); + PreCacheModel( "zombie_trap_switch_handle" ); + PreCacheModel( "p_zom_monitor_screen_fsale1" ); + PreCacheModel( "p_zom_monitor_screen_fsale2" ); + PreCacheModel( "p_zom_monitor_screen_labs0" ); + PreCacheModel( "p_zom_monitor_screen_labs1" ); + PreCacheModel( "p_zom_monitor_screen_labs2" ); + PreCacheModel( "p_zom_monitor_screen_labs3" ); + PreCacheModel( "p_zom_monitor_screen_lobby0" ); + PreCacheModel( "p_zom_monitor_screen_lobby1" ); + PreCacheModel( "p_zom_monitor_screen_lobby2" ); + PreCacheModel( "p_zom_monitor_screen_logo" ); + PreCacheModel( "p_zom_monitor_screen_off" ); + PreCacheModel( "p_zom_monitor_screen_on" ); + PreCacheModel( "p_zom_monitor_screen_warroom0" ); + PreCacheModel( "p_zom_monitor_screen_warroom1" ); + PreCacheModel( "p_pent_light_ceiling" ); + PreCacheModel( "p_pent_light_tinhat_off" ); + PreCacheModel( "p_rus_rb_lab_warning_light_01" ); + PreCacheModel( "p_rus_rb_lab_warning_light_01_off" ); + PreCacheModel( "p_rus_rb_lab_light_core_on" ); + PreCacheModel( "p_rus_rb_lab_light_core_off" ); + PreCacheModel( "p_zom_pent_defcon_sign_02" ); + PreCacheModel( "p_zom_pent_defcon_sign_03" ); + PreCacheModel( "p_zom_pent_defcon_sign_04" ); + PreCacheModel( "p_zom_pent_defcon_sign_05" ); +} +pentagon_exit_level() +{ + zombies = GetAiArray( "axis" ); + for ( i = 0; i < zombies.size; i++ ) + { + if ( zombies[i].animname == "thief_zombie" ) + { + continue; + } + else + { + zombies[i] thread pentagon_find_exit_point(); + } + } +} +pentagon_find_exit_point() +{ + self endon( "death" ); + player = getplayers()[0]; + dist_zombie = 0; + dist_player = 0; + dest = 0; + away = VectorNormalize( self.origin - player.origin ); + endPos = self.origin + vector_scale( away, 600 ); + locs = array_randomize( level.enemy_dog_locations ); + for ( i = 0; i < locs.size; i++ ) + { + dist_zombie = DistanceSquared( locs[i].origin, endPos ); + dist_player = DistanceSquared( locs[i].origin, player.origin ); + if ( dist_zombie < dist_player ) + { + dest = i; + break; + } + } + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self setgoalpos( locs[dest].origin ); + while ( 1 ) + { + if ( !flag( "wait_and_revive" ) ) + { + break; + } + wait_network_frame(); + } + self thread maps\_zombiemode_spawner::find_flesh(); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_pentagon_amb.gsc b/BO1/PC/ZM/maps/zombie_pentagon_amb.gsc new file mode 100644 index 0000000..ff0c046 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_pentagon_amb.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_pentagon_elevators.gsc b/BO1/PC/ZM/maps/zombie_pentagon_elevators.gsc new file mode 100644 index 0000000..06257eb --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_pentagon_elevators.gsc @@ -0,0 +1,1025 @@ +#include animscripts\zombie_utility; +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\zombie_pentagon_teleporter; +init() +{ + flag_init("defcon_active"); + flag_init("no_pack_room_spawning"); + flag_init("open_pack_hideaway"); + flag_init( "labs_enabled" ); + flag_init("bonfire_reset"); + flag_init("elevator_grounded"); + flag_init( "war_room_start" ); + flag_init("no_warroom_elevator_spawning"); + flag_init("no_labs_elevator_spawning"); + elevator1 = getent( "elevator1", "targetname" ); + elevator2 = getent( "elevator2", "targetname" ); + elevator1.cost = 250; + elevator1.station = "elevator1_up"; + elevator1.called = false; + elevator1.active = false; + elevator1.travel_up = elevator1.origin; + elevator1.travel_down = elevator1.origin - (0, 0, 201); + elevator2.cost = 250; + elevator2.station = "elevator2_up"; + elevator2.called = false; + elevator2.active = false; + elevator2.travel_up = elevator2.origin; + elevator2.travel_down = elevator2.origin - (0, 0, 320); + elevator1 link_pieces(); + elevator1 init_elevator1_doors(); + elevator1 init_buy(); + elevator1 init_call_boxes(); + elevator2 link_pieces(); + elevator2 init_elevator2_doors(); + elevator2 init_buy(); + elevator2 init_call_boxes(); + wait_network_frame(); + elevator1 enable_callboxes(); + elevator1 block_elev_doors( false ); + elevator1 open_elev_doors(); + elevator2 enable_callboxes(); + elevator2 block_elev_doors( false ); + elevator2 open_elev_doors(); + elevator2 PlayLoopSound( "mus_elevator_muzak" ); + elevator1 thread elevator1_3d_audio(); + elevator2 thread elevator2_3d_audio(); +} +link_pieces() +{ + pieces = GetEntArray( self.target, "targetname" ); + for ( i = 0; i < pieces.size; i++ ) + { + if(IsDefined(pieces[i].classname) && pieces[i].classname == "trigger_use" || pieces[i].classname == "trigger_multiple") + { + pieces[i] EnableLinkTo(); + } + pieces[i] LinkTo( self ); + } +} +init_call_boxes() +{ + trigger = GetEntArray( self.targetname + "_call_box", "targetname" ); + for ( i = 0; i < trigger.size; i++ ) + { + trigger[i] thread call_box_think(self); + } +} +call_box_think(elevator) +{ + self setcursorhint( "HINT_NOICON" ); + self SetHintString( &"ZOMBIE_PENTAGON_CALL_ELEVATOR" ); + PreCacheString(&"ZOMBIE_PENTAGON_ELEV_BLOCKED"); + while ( 1 ) + { + who = undefined; + self waittill( "trigger", who ); + CleanupSpawnedDynEnts(); + elev_clear = is_elevator_clear(elevator); + if(!elev_clear) + { + play_sound_at_pos( "no_purchase", self.origin ); + self SetHintString( &"ZOMBIE_PENTAGON_ELEV_BLOCKED" ); + wait(1.0); + self SetHintString( &"ZOMBIE_PENTAGON_CALL_ELEVATOR" ); + } + else if(flag("thief_round")) + { + play_sound_at_pos( "no_purchase", self.origin ); + self SetHintString( &"ZOMBIE_PENTAGON_PACK_ROOM_DOOR" ); + wait(1.0); + self SetHintString( &"ZOMBIE_PENTAGON_CALL_ELEVATOR" ); + } + else if(elevator.active == true || !who can_buy_elevator()) + { + play_sound_at_pos( "no_purchase", self.origin ); + } + else + { + if( elevator.station != self.script_noteworthy) + { + call_destination = self.script_noteworthy; + elevator.called = true; + elevator.active = true; + elevator disable_callboxes(); + elevator disable_elevator_buys(); + self thread elevator_move_to(elevator); + } + } + wait( .05 ); + } +} +is_elevator_clear(elevator) +{ + elevator_door_safety = GetEntArray(elevator.targetname + "_safety","script_noteworthy"); + players = get_players(); + if(IsDefined(elevator_door_safety)) + { + for ( i = 0; i < elevator_door_safety.size; i++ ) + { + for ( j = 0; j < players.size; j++ ) + { + if(players[j] IsTouching(elevator_door_safety[i])) + return false; + } + } + } + return true; +} +block_elev_doors_internal( block, suffix ) +{ + elevator_door_safety_clip = GetEntArray( self.targetname + suffix, "script_noteworthy" ); + if ( IsDefined( elevator_door_safety_clip ) ) + { + for ( i = 0; i < elevator_door_safety_clip.size; i++ ) + { + if ( block ) + { + elevator_door_safety_clip[i] Solid(); + } + else + { + elevator_door_safety_clip[i] NotSolid(); + } + } + } +} +block_elev_doors( block ) +{ + block_elev_doors_internal( block, "_safety_top" ); + block_elev_doors_internal( block, "_safety_bottom" ); +} +elevator_hint_text(msg) +{ + self endon( "death" ); + self endon( "disconnect" ); + text = NewClientHudElem( self ); + text.alignX = "center"; + text.alignY = "middle"; + text.horzAlign = "user_center"; + text.vertAlign = "user_bottom"; + text.foreground = true; + text.font = "default"; + text.fontScale = 1.8; + text.alpha = 0; + text.color = ( 1.0, 1.0, 1.0 ); + text SetText( msg ); + text.y = -113; + if( IsSplitScreen() ) + { + text.y = -137; + } + text FadeOverTime( 0.1 ); + text.alpha = 1; + wait(2.0); + text FadeOverTime( 0.1 ); + text.alpha = 0; +} +init_buy() +{ + trigger = GetEnt( self.targetname + "_buy", "script_noteworthy" ); + trigger thread elevator_buy_think(self); +} +elevator_buy_think(elevator) +{ + self setcursorhint( "HINT_NOICON" ); + self UseTriggerRequireLookAt(); + self SetHintString( &"ZOMBIE_PENTAGON_USE_ELEVATOR", elevator.cost ); + while ( 1 ) + { + who = undefined; + self waittill( "trigger", who ); + CleanupSpawnedDynEnts(); + elev_clear = is_elevator_clear(elevator); + if(!elev_clear) + { + play_sound_at_pos( "no_purchase", self.origin ); + self SetHintString( &"ZOMBIE_PENTAGON_ELEV_BLOCKED" ); + wait(1.0); + self SetHintString( &"ZOMBIE_PENTAGON_USE_ELEVATOR", elevator.cost ); + } + else if(flag("thief_round")) + { + play_sound_at_pos( "no_purchase", self.origin ); + self SetHintString( &"ZOMBIE_PENTAGON_PACK_ROOM_DOOR" ); + wait(1.0); + self SetHintString( &"ZOMBIE_PENTAGON_USE_ELEVATOR", elevator.cost ); + } + else if ( is_player_valid( who ) && who.score >= elevator.cost && who can_buy_elevator()) + { + elevator.active = true; + who maps\_zombiemode_score::minus_to_player_score( elevator.cost ); + play_sound_at_pos( "purchase", self.origin ); + elevator disable_callboxes(); + elevator disable_elevator_buys(); + call_box_array = GetEntArray( elevator.station, "script_noteworthy" ); + call_box = call_box_array[0]; + if(call_box.script_noteworthy == elevator.targetname + "_up") + { + call_box.destination = elevator.targetname + "_down"; + } + else + { + call_box.destination = elevator.targetname + "_up"; + } + self elevator_move_to(elevator); + } + else + { + play_sound_at_pos( "no_purchase", self.origin ); + who maps\_zombiemode_audio::create_and_play_dialog( "general", "no_money", undefined, 1 ); + } + wait( .05 ); + } +} +can_buy_elevator() +{ + if( self in_revive_trigger() ) + { + return false; + } + return true; +} +disable_callboxes() +{ + call_boxes = GetEntArray( self.targetname + "_call_box", "targetname" ); + for ( j = 0; j < call_boxes.size; j++ ) + { + call_boxes[j] trigger_off(); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + call_boxes[j] SetInvisibleToPlayer(players[i]); + } + } +} +disable_elevator_buys() +{ + elevator_buy = GetEnt( self.targetname + "_buy", "script_noteworthy" ); + elevator_buy setcursorhint( "HINT_NOICON" ); + elevator_buy SetHintString( "" ); + elevator_buy trigger_off(); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + elevator_buy SetInvisibleToPlayer(players[i]); + } +} +enable_elevator_buys() +{ + elevator_buy = GetEnt( self.targetname + "_buy", "script_noteworthy" ); + elevator_buy setcursorhint( "HINT_NOICON" ); + elevator_buy SetHintString( &"ZOMBIE_PENTAGON_USE_ELEVATOR", self.cost ); + elevator_buy trigger_on(); + elevator_buy SetVisibleToAll(); +} +enable_callboxes() +{ + call_boxes = getentarray( self.targetname + "_call_box", "targetname" ); + for ( j = 0; j < call_boxes.size; j++ ) + { + if ( call_boxes[j].script_noteworthy != self.station ) + { + call_boxes[j] trigger_on(); + call_boxes[j] sethintstring( &"ZOMBIE_PENTAGON_CALL_ELEVATOR" ); + call_boxes[j] SetVisibleToAll(); + } + else + { + call_boxes[j] sethintstring( "" ); + } + } +} +elevator_move_to(elevator) +{ + players = getplayers(); + elevator close_elev_doors(); + flag_clear("spawn_zombies"); + level waittill("doors_finished_moving"); + elevator block_elev_doors( false ); + elevator notify( "start_3d_audio" ); + elevator thread elev_clean_up_corpses(); + if(elevator.station == elevator.targetname + "_up") + { + elevator thread move_zombies_elevator(false); + if(elevator.targetname == "elevator1") + { + elevator thread zombie_elevator_closets(false); + } + elevator MoveTo( elevator.travel_down, 5.0); + elevator waittill( "movedone" ); + elevator.station = elevator.targetname + "_down"; + level thread maps\zombie_pentagon::change_pentagon_vision(); + if(elevator.targetname == "elevator1" && !flag("labs_enabled")) + { + flag_set( "labs_enabled" ); + } + else if( elevator.targetname == "elevator2" && !flag( "war_room_start" ) ) + { + flag_set( "war_room_start" ); + } + } + else + { + elevator thread move_zombies_elevator(true); + if(elevator.targetname == "elevator1") + { + elevator thread zombie_elevator_closets(true); + } + elevator MoveTo( elevator.travel_up, 5.0); + elevator waittill( "movedone" ); + elevator.station = elevator.targetname + "_up"; + level thread maps\zombie_pentagon::change_pentagon_vision(); + } + if( elevator.targetname == "elevator2" ) + { + clientnotify( "ele1e" ); + if(elevator.station == elevator.targetname + "_up") + { + elevator PlaySound( "zmb_vox_pentann_level_1" ); + } + else if(elevator.station == elevator.targetname + "_down") + { + elevator PlaySound( "zmb_vox_pentann_level_2" ); + } + } + else if( elevator.targetname == "elevator1" ) + { + clientnotify( "ele2e" ); + if(elevator.station == elevator.targetname + "_up") + { + elevator PlaySound( "zmb_vox_pentann_level_2" ); + } + else if(elevator.station == elevator.targetname + "_down") + { + elevator PlaySound( "zmb_vox_pentann_level_3" ); + } + } + flag_set("elevator_grounded"); + flag_set("spawn_zombies"); + elevator open_elev_doors(); + wait(0.1); + elevator.called = false; + elevator.active = false; + elevator enable_elevator_buys(); + elevator enable_callboxes(); + wait(2.0); + level thread check_if_empty_floors(); +} +zombie_elevator_closets(going_up) +{ + if(!IsDefined(going_up)) + { + return; + } + if(going_up == true) + { + special_spawn = GetEntArray("elevator1_down_spawncloset", "targetname"); + flag_set("no_labs_elevator_spawning"); + flag_clear("no_warroom_elevator_spawning"); + maps\_zombiemode_zone_manager::reinit_zone_spawners(); + } + else + { + special_spawn = GetEntArray("elevator1_up_spawncloset", "targetname"); + flag_set("no_warroom_elevator_spawning"); + flag_clear("no_labs_elevator_spawning"); + maps\_zombiemode_zone_manager::reinit_zone_spawners(); + } + if(IsDefined(special_spawn)) + { + for (i = 0; i < special_spawn.size; i++) + { + special_spawn[i] thread elevator_closet_cleanup(); + } + } +} +elevator_closet_cleanup() +{ + zombies = GetAIArray("axis"); + if(!IsDefined(zombies)) + { + return; + } + for (i = 0; i < zombies.size; i++) + { + if(zombies[i] IsTouching(self)) + { + level.zombie_total++; + zombies[i] DoDamage(zombies[i].health + 100, zombies[i].origin); + } + } +} +move_zombies_elevator(going_up) +{ + if(!IsDefined(going_up)) + { + return; + } + check_trig = undefined; + downed_player = undefined; + current_floor = 1; + next_floor = 2; + num_in_elev = 0; + num_current_floor = 0; + num_next_floor = 0; + num_floor_laststand = 0; + pos_num = 0; + pos_num_hidden = 0; + floor_height = 0; + self.elevator_players = []; + players = getplayers(); + in_elevator = GetEnt(self.targetname + "_zombie_cleanup", "targetname"); + if(going_up == true) + { + check_trig = GetEnt(self.targetname + "_down_riders", "targetname"); + } + else + { + check_trig = GetEnt(self.targetname + "_up_riders", "targetname"); + } + for ( i = 0; i < players.size; i++ ) + { + players[i].floor = maps\_zombiemode_ai_thief::thief_check_floor( players[i] ); + if(players[i] IsTouching(check_trig)) + { + current_floor = players[i].floor; + num_in_elev++; + players[i].end_portal = undefined; + self.elevator_players = array_add(self.elevator_players, players[i]); + if( self.targetname == "elevator2" ) + { + setClientSysState( "levelNotify", "ele1", players[i] ); + } + else if ( self.targetname == "elevator1" ) + { + setClientSysState( "levelNotify", "ele2", players[i] ); + } + } + } + if(IsDefined(current_floor) && going_up == false) + { + next_floor = current_floor + 1; + } + else if(IsDefined(current_floor) && going_up == true) + { + next_floor = current_floor - 1; + } + for ( i = 0; i < players.size; i++ ) + { + if(IsDefined(current_floor) && players[i].floor == current_floor) + { + num_current_floor++; + } + if(IsDefined(next_floor) && players[i].floor == next_floor) + { + num_next_floor++; + } + if(IsDefined(current_floor) && players[i].floor == current_floor && (players[i] maps\_laststand::player_is_in_laststand() + || players[i].sessionstate == "spectator") && !players[i] IsTouching(check_trig)) + { + if(!IsDefined(downed_player)) + { + downed_player = players[i]; + } + num_floor_laststand++; + } + } + wait_network_frame(); + if(players.size > 1 && num_floor_laststand > 0 + && num_in_elev == (num_current_floor - num_floor_laststand)) + { + downed_player thread laststand_elev_zombies_away(current_floor, next_floor); + return; + } + if(num_in_elev != num_current_floor) + { + return; + } + if(num_next_floor > 0 ) + { + pos_num = 6; + } + if(players.size == 1) + { + if(level.round_number <= 5) + { + pos_num = 6; + } + else if(level.round_number > 5 && level.round_number < 10) + { + pos_num = 5; + } + else if(level.round_number >= 10) + { + pos_num = 3; + } + } + zombies = GetAIArray("axis"); + if(!IsDefined(zombies)) + { + return; + } + for (i = 0; i < zombies.size; i++) + { + zombies[i].floor = maps\_zombiemode_ai_thief::thief_check_floor( zombies[i] ); + if(IsDefined(current_floor) && zombies[i].floor != current_floor) + { + continue; + } + else if(IsDefined(zombies[i].animname) && zombies[i].animname == "thief_zombie") + { + continue; + } + else if(zombies[i] IsTouching(in_elevator)) + { + continue; + } + else if(IsDefined(zombies[i].teleporting) && zombies[i].teleporting == true) + { + continue; + } + else if(zombies[i].ignoreall == true) + { + if(zombies[i].health == level.zombie_health || zombies[i].animname == "quad_zombie") + { + level.zombie_total++; + if(IsDefined(zombies[i].fx_quad_trail)) + { + zombies[i].fx_quad_trail Delete(); + } + zombies[i] maps\_zombiemode_spawner::reset_attack_spot(); + zombies[i] notify("zombie_delete"); + zombies[i] Delete(); + } + else + { + zombies[i] thread zombies_elev_teleport_hidden(self, RandomIntRange(0,6), going_up); + } + } + else + { + if(pos_num <= 5 ) + { + zombies[i] thread zombies_elev_teleport(self, pos_num, going_up); + pos_num++; + } + else if(pos_num_hidden <=5 && zombies[i].animname != "quad_zombie") + { + if(zombies[i].health == level.zombie_health) + { + level.zombie_total++; + zombies[i] maps\_zombiemode_spawner::reset_attack_spot(); + zombies[i] notify("zombie_delete"); + zombies[i] Delete(); + } + else + { + zombies[i] thread zombies_elev_teleport_hidden(self, pos_num_hidden, going_up); + pos_num_hidden++; + } + } + else + { + if(IsDefined(current_floor) && current_floor == 1 && flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_top); + } + else if(IsDefined(current_floor) && current_floor == 2 && flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_mid); + } + else if(IsDefined(current_floor) && current_floor == 3 && flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_power); + } + else + { + move_speed = undefined; + if(IsDefined(self.zombie_move_speed)) + { + move_speed = self.zombie_move_speed; + } + PlayFX(level._effect["transporter_start"], zombies[i].origin); + if(zombies[i].health == level.zombie_health) + { + level.zombie_total++; + if(IsDefined(zombies[i].fx_quad_trail)) + { + zombies[i].fx_quad_trail Delete(); + } + zombies[i] maps\_zombiemode_spawner::reset_attack_spot(); + zombies[i] notify("zombie_delete"); + zombies[i] Delete(); + } + else + { + zombies[i] thread cleanup_unoccupied_floor(move_speed,current_floor,next_floor); + } + } + } + } + } +} +laststand_elev_zombies_away(current_floor,next_floor) +{ + zombies = GetAIArray("axis"); + if(!IsDefined(zombies)) + { + return; + } + for (i = 0; i < zombies.size; i++) + { + if(IsDefined(zombies[i].animname) && zombies[i].animname == "thief_zombie") + { + continue; + } + move_speed = undefined; + if(IsDefined(zombies[i].zombie_move_speed)) + { + move_speed = zombies[i].zombie_move_speed; + } + zombies[i].floor = maps\_zombiemode_ai_thief::thief_check_floor( zombies[i] ); + if(IsDefined(zombies[i].floor) && zombies[i].floor == self.floor) + { + if(zombies[i].floor == 1 && flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_top); + } + else if(zombies[i].floor == 2 && flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_mid); + } + else if(zombies[i].floor == 3 && flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_power); + } + else + { + PlayFX(level._effect["transporter_start"], zombies[i].origin); + if(zombies[i].health == level.zombie_health) + { + level.zombie_total++; + if(IsDefined(zombies[i].fx_quad_trail)) + { + zombies[i].fx_quad_trail Delete(); + } + zombies[i] maps\_zombiemode_spawner::reset_attack_spot(); + zombies[i] notify("zombie_delete"); + zombies[i] Delete(); + } + else + { + zombies[i] thread cleanup_unoccupied_floor(move_speed, current_floor, next_floor); + } + } + } + } +} +zombies_elev_teleport(elevator, pos_num, going_up) +{ + self endon( "death" ); + teleport_pos = []; + if(going_up == true) + { + teleport_pos = getstructarray(elevator.targetname + "_up_zombie", "targetname"); + } + else + { + teleport_pos = getstructarray(elevator.targetname + "_down_zombie", "targetname"); + } + if(IsDefined(teleport_pos[pos_num])) + { + self forceteleport(teleport_pos[pos_num].origin,teleport_pos[pos_num].angles); + } +} +zombies_elev_teleport_hidden(elevator, pos_num, going_up) +{ + self endon( "death" ); + teleport_pos = []; + if(going_up == true) + { + teleport_pos = getstructarray(elevator.targetname + "_up_hidden", "targetname"); + } + else + { + teleport_pos = getstructarray(elevator.targetname + "_down_hidden", "targetname"); + } + if(IsDefined(teleport_pos[pos_num])) + { + self forceteleport(teleport_pos[pos_num].origin + (RandomFloatRange(0,22), RandomFloatRange(0,22), 0),teleport_pos[pos_num].angles); + wait(1); + if(IsDefined(self)) + { + self.ignoreall = true; + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + if(IsDefined(self.target)) + { + self.target = undefined; + } + wait_network_frame(); + self thread maps\_zombiemode_spawner::zombie_think(); + } + } +} +elev_clean_up_corpses() +{ + corpse_trig = GetEnt(self.targetname + "_zombie_cleanup", "targetname"); + corpses = GetCorpseArray(); + if(IsDefined(corpses)) + { + for ( i = 0; i < corpses.size; i++ ) + { + if(corpses[i] istouching(corpse_trig)) + { + corpses[i] thread elev_remove_corpses(); + } + } + } +} +elev_remove_corpses() +{ + PlayFX(level._effect["dog_gib"], self.origin); + self Delete(); +} +init_elevator1_doors() +{ + self.doors_up = GetEntArray("elevator1_doors_up", "script_noteworthy" ); + for ( i = 0; i < self.doors_up.size; i++ ) + { + self.doors_up[i].startpos = self.doors_up[i].origin; + } + self.doors_down = GetEntArray( "elevator1_doors_down", "script_noteworthy" ); + for ( j = 0; j < self.doors_down.size; j++ ) + { + self.doors_down[j].startpos = self.doors_down[j].origin; + } + self.doors_outer_down = GetEntArray("elevator1_outerdoors_down", "script_noteworthy"); + for ( k = 0; k < self.doors_outer_down.size; k++ ) + { + self.doors_outer_down[k].startpos = self.doors_outer_down[k].origin; + } + self.doors_outer_up = GetEntArray("elevator1_outerdoors_up", "script_noteworthy"); + for ( l = 0; l < self.doors_outer_up.size; l++ ) + { + self.doors_outer_up[l].startpos = self.doors_outer_up[l].origin; + } +} +init_elevator2_doors() +{ + self.doors = GetEntArray("elevator2_doors", "script_noteworthy" ); + for ( i = 0; i < self.doors.size; i++ ) + { + self.doors[i].startpos = self.doors[i].origin; + } + self.doors_outer_down = GetEntArray("elevator2_outerdoors_down", "script_noteworthy"); + for ( k = 0; k < self.doors_outer_down.size; k++ ) + { + self.doors_outer_down[k].startpos = self.doors_outer_down[k].origin; + } + self.doors_outer_up = GetEntArray("elevator2_outerdoors_up", "script_noteworthy"); + for ( l = 0; l < self.doors_outer_up.size; l++ ) + { + self.doors_outer_up[l].startpos = self.doors_outer_up[l].origin; + } +} +close_elev_doors() +{ + self block_elev_doors( true ); + for(i = 0; i < self.doors_outer_down.size; i++) + { + self.doors_outer_down[i] thread relink_elev_doors(self.doors_outer_down[i].startpos, self, false); + } + for(j = 0; j < self.doors_outer_up.size; j++) + { + self.doors_outer_up[j] thread relink_elev_doors(self.doors_outer_up[j].startpos, self, false); + } + if(IsDefined(self.doors_down)) + { + for ( k = 0; k < self.doors_down.size; k++ ) + { + newpos3 = (self.doors_down[k].startpos[0], self.doors_down[k].startpos[1], self.doors_down[k].origin[2]); + self.doors_down[k] thread relink_elev_doors(newpos3, self, true); + playsoundatposition( "evt_elevator_freight_door_close", newpos3 ); + } + } + if(IsDefined(self.doors_up)) + { + for ( l = 0; l < self.doors_up.size; l++ ) + { + newpos4 = (self.doors_up[l].startpos[0], self.doors_up[l].startpos[1], self.doors_up[l].origin[2]); + self.doors_up[l] thread relink_elev_doors(newpos4, self, true); + playsoundatposition( "evt_elevator_freight_door_close", newpos4 ); + } + } + if(IsDefined(self.doors)) + { + for ( m = 0; m < self.doors.size; m++ ) + { + if(self.station == self.targetname + "_up") + { + newpos5 = (self.doors[m].startpos); + } + else + { + newpos5 = (self.doors[m].startpos[0], self.doors[m].startpos[1], self.doors[m].origin[2]); + } + self.doors[m] thread relink_elev_doors(newpos5, self, true); + playsoundatposition( "evt_elevator_office_door_close", newpos5 ); + } + } +} +open_elev_doors() +{ + if(IsDefined(self.elevator_players)) + { + check_trig = undefined; + if(self.station == self.targetname + "_down") + { + check_trig = GetEnt(self.targetname + "_down_riders", "targetname"); + } + else + { + check_trig = GetEnt(self.targetname + "_up_riders", "targetname"); + } + for ( i = 0; i < self.elevator_players.size; i++ ) + { + if(!self.elevator_players[i] IsTouching(check_trig)) + { + self.elevator_players[i] SetOrigin( self.origin + (RandomFloatRange(-32,32), RandomFloatRange(-32,32), 10 )); + self.elevator_players[i] playsound( "zmb_laugh_child" ); + } + self.elevator_players = array_remove(self.elevator_players, self.elevator_players[i]); + } + } + if(self.station == self.targetname + "_down") + { + for(j = 0; j < self.doors_outer_down.size; j++) + { + newpos1 = self.doors_outer_down[j].startpos + self.doors_outer_down[j].script_vector; + self.doors_outer_down[j] thread relink_elev_doors(newpos1, self, false); + } + if(IsDefined(self.doors_up)) + { + for ( i = 0; i < self.doors_up.size; i++ ) + { + pos2 = self.doors_up[i].startpos + self.doors_up[i].script_vector; + newpos2 = (pos2[0], pos2[1], self.doors_up[i].origin[2]); + self.doors_up[i] thread relink_elev_doors(newpos2, self, true); + playsoundatposition( "evt_elevator_freight_door_open", newpos2 ); + } + } + if(IsDefined(self.doors_down)) + { + for ( i = 0; i < self.doors_down.size; i++ ) + { + pos1 = self.doors_down[i].startpos + self.doors_down[i].script_vector; + newpos = (pos1[0], pos1[1], self.doors_down[i].origin[2]); + self.doors_down[i] thread relink_elev_doors(newpos, self, true); + playsoundatposition( "evt_elevator_freight_door_open", newpos ); + } + } + if(IsDefined(self.doors)) + { + for ( m = 0; m < self.doors.size; m++ ) + { + pos2 = self.doors[m].startpos + self.doors[m].script_vector; + if(self.station == self.targetname + "_up") + { + newpos2 = (pos2[0], pos2[1], self.doors[m].startpos[2]); + } + else + { + newpos2 = (pos2[0], pos2[1], self.doors[m].origin[2]); + } + self.doors[m] thread relink_elev_doors(newpos2, self, true); + playsoundatposition( "evt_elevator_office_door_open_1", newpos2 ); + } + } + } + else + { + for(j = 0; j < self.doors_outer_up.size; j++) + { + newpos1 = self.doors_outer_up[j].startpos + self.doors_outer_up[j].script_vector; + self.doors_outer_up[j] thread relink_elev_doors(newpos1, self, false); + } + if(IsDefined(self.doors_up)) + { + for ( i = 0; i < self.doors_up.size; i++ ) + { + pos2 = self.doors_up[i].startpos + self.doors_up[i].script_vector; + newpos2 = (pos2[0], pos2[1], self.doors_up[i].origin[2]); + self.doors_up[i] thread relink_elev_doors(newpos2, self, true); + playsoundatposition( "evt_elevator_freight_door_open", newpos2 ); + } + } + if(IsDefined(self.doors_down)) + { + for ( k = 0; k < self.doors_down.size; k++ ) + { + pos4 = self.doors_down[k].startpos + self.doors_down[k].script_vector; + newpos4 = (pos4[0], pos4[1], self.doors_down[k].origin[2]); + self.doors_down[k] thread relink_elev_doors(newpos4, self, true); + playsoundatposition( "evt_elevator_freight_door_open", newpos4 ); + } + } + if(IsDefined(self.doors)) + { + for ( m = 0; m < self.doors.size; m++ ) + { + pos3 = self.doors[m].startpos + self.doors[m].script_vector; + newpos3 = (pos3[0], pos3[1], self.doors[m].origin[2]); + self.doors[m] thread relink_elev_doors(newpos3, self, true); + playsoundatposition( "evt_elevator_office_door_open_1", newpos3 ); + } + } + } +} +relink_elev_doors(pos, elev, linked) +{ + self Unlink(); + self moveto(pos, 1.0); + self waittill("movedone"); + if(linked) + { + self LinkTo(elev); + } + level notify("doors_finished_moving"); + if(self.classname == "script_model") + { + return; + } + if(self.origin[0] == self.startpos[0]) + { + self DisconnectPaths(); + } + else + { + self ConnectPaths(); + } +} +redirect_zombies( destination ) +{ + players = get_players(); + num_players = 0; + for ( i = 0; i < players.size; i++ ) + { + if(players[i] IsTouching(self)) + num_players++; + } + if(!num_players == players.size) + { + return; + } + wait( 2.0 ); + location = GetNode( destination, "targetname" ); + if ( IsDefined( location ) ) + { + poi = Spawn( "script_origin", location.origin ); + poi create_zombie_point_of_interest( undefined, 25, 0, true ); + flag_wait("elevator_grounded"); + poi deactivate_zombie_point_of_interest(); + poi delete(); + } +} +unlock_players() +{ + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i] unlink(); + players[i] allowcrouch( true ); + players[i] allowprone( true ); + players[i] disableinvulnerability(); + players[i] thread maps\_zombiemode::store_crumb( players[i].origin ); + } +} +elevator1_3d_audio() +{ + while(1) + { + self waittill( "start_3d_audio" ); + ent = Spawn( "script_origin", self.origin + (0,0,30) ); + ent LinkTo( self ); + ent PlayLoopSound( "evt_elevator_freight_run_3d" ); + self waittill( "movedone" ); + ent Delete(); + } +} +elevator2_3d_audio() +{ + while(1) + { + self waittill( "start_3d_audio" ); + ent = Spawn( "script_origin", self.origin + (0,0,30) ); + ent LinkTo( self ); + ent PlayLoopSound( "evt_elevator_office_run_3d" ); + self waittill( "movedone" ); + ent Delete(); + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_pentagon_fx.gsc b/BO1/PC/ZM/maps/zombie_pentagon_fx.gsc new file mode 100644 index 0000000..8929d99 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_pentagon_fx.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_pentagon_magic_box.gsc b/BO1/PC/ZM/maps/zombie_pentagon_magic_box.gsc new file mode 100644 index 0000000..cd2aa23 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_pentagon_magic_box.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_pentagon_teleporter.gsc b/BO1/PC/ZM/maps/zombie_pentagon_teleporter.gsc new file mode 100644 index 0000000..63b99dd --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_pentagon_teleporter.gsc @@ -0,0 +1,1320 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_zone_manager; +teleporter_init() +{ + level.teleport_ae_funcs = []; + SetDvar( "pentagonAftereffectOverride", "-1" ); + thread teleport_pad_init(); + thread enable_zone_portals_init(); + thread open_portal_rooms(); + thread pack_hideaway_init(); + poi1 = GetEnt("pack_room_poi1", "targetname"); + poi2 = GetEnt("pack_room_poi2", "targetname"); + poi1 create_zombie_point_of_interest( undefined, 30, 0, false ); + poi1 thread create_zombie_point_of_interest_attractor_positions( 4, 45 ); + poi2 create_zombie_point_of_interest( undefined, 30, 0, false ); + poi2 thread create_zombie_point_of_interest_attractor_positions( 4, 45 ); +} +teleport_pad_init() +{ + level.portal_trig = GetEntArray( "portal_trigs", "targetname" ); + for ( i = 0; i < level.portal_trig.size; i++ ) + { + level.portal_trig[i].active = true; + level.portal_trig[i].portal_used =[]; + level.portal_trig[i] thread player_teleporting(); + } +} +pack_hideaway_init() +{ + hideaway = GetEnt("pack_hideaway","targetname"); + parts = GetEntArray(hideaway.target, "targetname"); + level.punch_trigger = GetEnt( "zombie_vending_upgrade", "targetname" ); + level.punch_machine = GetEnt( level.punch_trigger.target, "targetname" ); + level.punch_sign = GetEnt( level.punch_machine.target, "targetname" ); + level.punch_sign LinkTo( level.punch_machine ); + if(IsDefined(level.punch_trigger)) + { + level.punch_trigger EnableLinkTo(); + level.punch_trigger LinkTo(hideaway); + } + if(IsDefined(level.punch_machine)) + { + level.punch_machine LinkTo(hideaway); + } + pack_audio_trig = GetEnt( "pack_audio_trig", "script_noteworthy" ); + pack_audio_trig EnableLinkTo(); + pack_audio_trig LinkTo(hideaway); + if(IsDefined(parts)) + { + for ( i = 0; i < parts.size; i++ ) + { + parts[i] LinkTo(hideaway); + } + } + while(true) + { + flag_wait("open_pack_hideaway"); + hideaway NotSolid(); + hideaway RotateYaw(180, 2.5); + hideaway PlaySound( "evt_packapunch_revolve_start" ); + hideaway PlayLoopSound( "evt_packapunch_revolve_loop" ); + hideaway waittill("rotatedone"); + level.punch_trigger SetVisibleToAll(); + level.punch_trigger trigger_on(); + hideaway StopLoopSound( 1 ); + hideaway PlaySound( "evt_packapunch_revolve_end" ); + level.punch_sign Unlink(); + wait(40); + if(flag("pack_machine_in_use")) + { + while(flag("pack_machine_in_use")) + { + wait(0.1); + } + } + level.punch_sign LinkTo( level.punch_machine ); + level.punch_trigger trigger_off(); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + level.punch_trigger SetInvisibleToPlayer(players[i]); + } + hideaway RotateYaw(180, 2.5); + hideaway PlaySound( "evt_packapunch_revolve_start" ); + hideaway PlayLoopSound( "evt_packapunch_revolve_loop" ); + flag_clear("open_pack_hideaway"); + wait_network_frame(); + hideaway waittill("rotatedone"); + hideaway StopLoopSound( 1 ); + hideaway PlaySound( "evt_packapunch_revolve_end" ); + } +} +pack_door_init() +{ + trigger = GetEnt("pack_room_door","targetname"); + doors = GetEntArray(trigger.target, "targetname"); + pack_door_slam = GetEnt("slam_pack_door","targetname"); + pack_door_open = false; + while(true) + { + trigger sethintstring( &"ZOMBIE_PENTAGON_PACK_ROOM_DOOR" ); + trigger setcursorhint( "HINT_NOICON" ); + level waittill("defcon_reset"); + players = get_players(); + if(level.zones["conference_level2"].is_occupied) + { + if(level.zones["war_room_zone_south"].is_enabled && !flag("bonfire_reset")) + { + trigger sethintstring( "" ); + for ( i = 0; i < doors.size; i++ ) + { + doors[i].start_angles = doors[i].angles; + if(isDefined(doors[i].script_angles)) + { + doors[i] NotSolid(); + doors[i] RotateTo( doors[i].script_angles, 1.0 ); + play_sound_at_pos( "door_rotate_open", doors[i].origin ); + doors[i] thread pack_door_solid_thread(); + } + } + pack_door_open = true; + } + while(!is_packroom_clear()) + { + if(flag("bonfire_reset")) + { + break; + } + wait(0.1); + } + if( pack_door_open == true) + { + for ( i = 0; i < doors.size; i++ ) + { + if(isDefined(doors[i].script_angles)) + { + doors[i] NotSolid(); + doors[i] RotateTo( doors[i].start_angles, 0.25 ); + play_sound_at_pos( "door_rotate_open", doors[i].origin ); + doors[i] thread pack_door_solid_thread(); + } + } + } + } + if(flag("bonfire_reset")) + { + flag_clear("bonfire_reset"); + } + else + { + level notify("pack_room_reset"); + } + wait_network_frame(); + } +} +is_packroom_clear() +{ + pack_door_slam = GetEnt("slam_pack_door","targetname"); + pack_room_trig = GetEnt("pack_room_trigger", "targetname"); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + if(players[i] IsTouching(pack_door_slam)) + { + return false; + } + } + if(level.zones["conference_level2"].is_occupied) + { + return false; + } + else if(flag("thief_round")) + { + zombies = GetAIArray("axis"); + for (i = 0; i < zombies.size; i++) + { + if(IsDefined(zombies[i].animname) && zombies[i].animname == "thief_zombie" + && zombies[i] IsTouching(pack_room_trig)) + { + return false; + } + if(IsDefined(zombies[i].animname) && zombies[i].animname == "thief_zombie" + && zombies[i] IsTouching(pack_door_slam)) + { + return false; + } + } + } + return true; +} +pack_door_solid_thread() +{ + self waittill( "rotatedone" ); + self.door_moving = undefined; + while( 1 ) + { + players = get_players(); + player_touching = false; + for( i = 0; i < players.size; i++ ) + { + if( players[i] IsTouching( self ) ) + { + player_touching = true; + break; + } + } + if( !player_touching ) + { + self Solid(); + if(self.angles != self.start_angles) + { + self ConnectPaths(); + } + else + { + self DisconnectPaths(); + } + return; + } + wait( 1 ); + } +} +clear_zombies_in_packroom() +{ + pack_room_trig = GetEnt("pack_room_trigger", "targetname"); + if(flag("thief_round")) + { + return; + } + zombies = GetAIArray("axis"); + if(!IsDefined(zombies)) + { + return; + } + for (i = 0; i < zombies.size; i++) + { + if ( zombies[i] IsTouching(pack_room_trig) ) + { + if(zombies[i].ignoreall == true ) + { + level.zombie_total++; + if(IsDefined(zombies[i].fx_quad_trail)) + { + zombies[i].fx_quad_trail Delete(); + } + zombies[i] maps\_zombiemode_spawner::reset_attack_spot(); + zombies[i] notify("zombie_delete"); + zombies[i] Delete(); + } + else + { + zombies[i] thread send_zombies_out(level.portal_pack); + } + } + } +} +player_teleporting() +{ + user = undefined; + while(true) + { + self waittill( "trigger", user ); + player_used = false; + if(IsDefined(self.portal_used)) + { + for (i = 0; i < self.portal_used.size; i++) + { + if(self.portal_used[i] == user) + { + player_used = true; + } + } + } + wait_network_frame(); + if(player_used == true) + { + continue; + } + else if ( is_player_valid( user ) || user maps\_laststand::player_is_in_laststand()) + { + self thread Teleport_Player(user); + } + } +} +cooldown_portal_timer(player) +{ + self.portal_used = array_add(self.portal_used, player); + time = 0; + while(!flag("defcon_active") && time < 20 ) + { + wait(1); + time++; + } + self.portal_used = array_remove(self.portal_used, player); +} +teleport_player(user) +{ + prone_offset = (0, 0, 49); + crouch_offset = (0, 0, 20); + stand_offset = (0, 0, 0); + destination = undefined; + dest_trig = 0; + if(IsDefined(user.teleporting) && user.teleporting == true) + { + return; + } + user.teleporting = true; + user FreezeControls( true ); + user disableOffhandWeapons(); + user disableweapons(); + if(flag("defcon_active") && self.script_noteworthy != "conference_level2") + { + for ( i = 0; i < level.portal_trig.size; i++ ) + { + if(IsDefined(level.portal_trig[i].script_noteworthy) && level.portal_trig[i].script_noteworthy == "conference_level2") + { + dest_trig = i; + user thread start_defcon_countdown(); + self thread defcon_pack_poi(); + } + } + } + else + { + dest_trig = find_portal_destination(self); + if(!IsDefined(dest_trig)) + { + while(!IsDefined(dest_trig)) + { + dest_trig = find_portal_destination(self); + break; + wait_network_frame(); + } + } + self thread no_zombie_left_behind(level.portal_trig[dest_trig], user); + } + player_destination = getstructarray(level.portal_trig[dest_trig].target, "targetname"); + if(IsDefined(player_destination)) + { + for ( i = 0; i < player_destination.size; i++ ) + { + if(IsDefined(player_destination[i].script_noteworthy) && player_destination[i].script_noteworthy == "player_pos") + { + destination = player_destination[i]; + } + } + } + if(!IsDefined(destination)) + { + destination = groundpos(level.portal_trig[dest_trig].origin); + } + level.portal_trig[dest_trig] thread cooldown_portal_timer(user); + if( user getstance() == "prone" ) + { + desired_origin = destination.origin + prone_offset; + } + else if( user getstance() == "crouch" ) + { + desired_origin = destination.origin + crouch_offset; + } + else + { + desired_origin = destination.origin + stand_offset; + } + wait_network_frame(); + PlayFX(level._effect["transporter_start"], user.origin); + playsoundatposition( "evt_teleporter_out", user.origin ); + user SetOrigin( desired_origin ); + user SetPlayerAngles( destination.angles ); + PlayFX(level._effect["transporter_beam"], user.origin); + playsoundatposition( "evt_teleporter_go", user.origin ); + wait(0.5); + user enableweapons(); + user enableoffhandweapons(); + user FreezeControls( false ); + user.teleporting = false; + level thread check_if_empty_floors(); + setClientSysState( "levelNotify", "cool_fx", user ); + setClientSysState( "levelNotify", "ae1", user ); + wait( 1.25 ); + if(flag("thief_round")) + { + setClientSysState( "levelNotify", "vis4", user ); + return; + } + else + { + user.floor = maps\_zombiemode_ai_thief::thief_check_floor( user ); + setClientSysState( "levelNotify", "vis" + user.floor, user ); + } +} +find_portal_destination(orig_trig) +{ + if(IsDefined(orig_trig.thief_override)) + { + return orig_trig.thief_override; + } + if(IsDefined(orig_trig.script_string) && orig_trig.script_string == "power_room_portal") + { + loc = []; + for (i = 0; i < level.portal_trig.size; i++) + { + if(level.portal_trig[i].script_noteworthy == "war_room_zone_north") + { + loc[0] = i; + } + else if(level.portal_trig[i].script_noteworthy == "conference_level1") + { + loc[1] = i; + } + } + dest_trig = loc[RandomIntRange(0,2)]; + return dest_trig; + } + else + { + dest_trig = RandomIntRange(0,level.portal_trig.size); + assertex(IsDefined(level.portal_trig[dest_trig].script_noteworthy),"portals need a script_noteworthy"); + if(level.portal_trig[dest_trig] == orig_trig || level.portal_trig[dest_trig].script_noteworthy == "conference_level2" + || !level.zones[level.portal_trig[dest_trig].script_noteworthy].is_enabled) + { + portals = level.portal_trig; + for( i = 0; i < level.portal_trig.size; i ++) + { + level.portal_trig[i].index = i; + if(level.portal_trig[i] == orig_trig || level.portal_trig[i].script_noteworthy == "conference_level2" + || !level.zones[level.portal_trig[i].script_noteworthy].is_enabled) + { + portals = array_remove( portals, level.portal_trig[i] ); + } + } + rand = RandomIntRange(0, portals.size); + dest_trig = portals[rand].index; + } + return dest_trig; + } +} +delete_zombie_noone_looking(how_close, verticle_only, need_to_see) +{ + self endon( "death" ); + if(!IsDefined(how_close)) + { + how_close = 500; + } + if(!IsDefined(verticle_only)) + { + verticle_only = true; + } + if(!IsDefined(need_to_see)) + { + need_to_see = true; + } + self.inview = 0; + self.player_close = 0; + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + can_be_seen = self player_can_see_me(players[i]); + if(can_be_seen) + { + self.inview++; + } + else + { + if(verticle_only) + { + closest = abs(self.origin[2] - players[i].origin[2]); + if(closest < how_close) + { + self.player_close++; + } + } + else + { + closest = Distance(self.origin, players[i].origin); + if(closest < how_close) + { + self.player_close++; + } + } + } + } + wait_network_frame(); + if(self.inview == 0 && self.player_close == 0 || need_to_see == false && self.player_close == 0) + { + if(IsDefined(self.teleporting) && self.teleporting == true) + { + return; + } + else + { + if(IsDefined(self.animname) && self.animname == "thief_zombie") + { + return; + } + else + { + if(IsDefined(self.animname) && self.animname == "quad_zombie") + { + level.zombie_total++; + if(IsDefined(self.fx_quad_trail)) + { + self.fx_quad_trail Delete(); + } + self notify("zombie_delete"); + self Delete(); + } + else + { + level.zombie_total++; + self maps\_zombiemode_spawner::reset_attack_spot(); + self notify("zombie_delete"); + self Delete(); + } + } + } + } +} +player_can_see_me( player ) +{ + playerAngles = player getplayerangles(); + playerForwardVec = AnglesToForward( playerAngles ); + playerUnitForwardVec = VectorNormalize( playerForwardVec ); + banzaiPos = self.origin; + playerPos = player GetOrigin(); + playerToBanzaiVec = banzaiPos - playerPos; + playerToBanzaiUnitVec = VectorNormalize( playerToBanzaiVec ); + forwardDotBanzai = VectorDot( playerUnitForwardVec, playerToBanzaiUnitVec ); + angleFromCenter = ACos( forwardDotBanzai ); + playerFOV = GetDvarFloat( #"cg_fov" ); + banzaiVsPlayerFOVBuffer = GetDvarFloat( #"g_banzai_player_fov_buffer" ); + if ( banzaiVsPlayerFOVBuffer <= 0 ) + { + banzaiVsPlayerFOVBuffer = 0.2; + } + playerCanSeeMe = ( angleFromCenter <= ( playerFOV * 0.5 * ( 1 - banzaiVsPlayerFOVBuffer ) ) ); + return playerCanSeeMe; +} +open_portal_rooms() +{ + yellow_conf_screen = GetEnt("yellow_conf_screen", "targetname"); + power_room_screen = GetEnt("power_room_screen", "targetname"); + jfk_room_screen = GetEnt("jfk_room_screen", "targetname"); + war_room_screen_north = GetEnt("war_room_screen_north", "targetname"); + war_room_screen_ramp = GetEnt("war_room_screen_ramp", "targetname"); + flag_wait( "power_on" ); + yellow_conf_screen PlaySound( "evt_teleporter_door_short" ); + yellow_conf_screen MoveZ(116, 1.5); + yellow_conf_screen ConnectPaths(); + power_room_screen PlaySound( "evt_teleporter_door_short" ); + power_room_screen MoveZ(116, 1.5); + power_room_screen ConnectPaths(); + jfk_room_screen PlaySound( "evt_teleporter_door_long" ); + jfk_room_screen MoveZ(150, 2.0); + jfk_room_screen ConnectPaths(); + war_room_screen_north PlaySound( "evt_teleporter_door_short" ); + level thread war_room_portal_door(); + war_room_screen_north MoveZ(-122, 1.5); + war_room_screen_ramp MoveY(46, 1.5); + war_room_screen_ramp waittill("movedone"); + war_room_screen_north ConnectPaths(); +} +war_room_portal_door() +{ + war_room_screen_south = GetEnt("war_room_screen_south", "targetname"); + war_room_screen_south PlaySound( "evt_teleporter_door_short" ); + war_room_screen_south MoveZ(-120, 1.5); + war_room_screen_south waittill("movedone"); + war_room_screen_south ConnectPaths(); +} +enable_zone_portals_init() +{ + portal_zone_trig = GetEntArray( "portal_zone_trigs", "targetname" ); + for ( i = 0; i < portal_zone_trig.size; i++ ) + { + portal_zone_trig[i] thread enable_zone_portals(); + } +} +enable_zone_portals() +{ + self waittill( "trigger", user ); + if ( ( user maps\_laststand::player_is_in_laststand() || is_player_valid( user ) ) && + IsDefined(self.script_noteworthy) ) + { + level thread maps\_zombiemode_zone_manager::enable_zone(self.script_noteworthy); + } +} +no_zombie_left_behind(portal_trig, targeted_player) +{ + portal_enter = undefined; + teleporting_zombies = 0; + portal_entered = getstructarray(self.target, "targetname"); + for ( i = 0; i < portal_entered.size; i++ ) + { + if(IsDefined(portal_entered[i].script_noteworthy) && portal_entered[i].script_noteworthy == "zombie_pos") + { + portal_enter = portal_entered[i]; + } + } + if(!IsDefined(portal_enter)) + { + return; + } + zombies = GetAIArray("axis"); + if(IsDefined(zombies)) + { + for( i = 0; i < zombies.size; i++ ) + { + if(IsDefined(zombies[i].animname) && zombies[i].animname == "thief_zombie") + { + continue; + } + else if(IsDefined(self.script_noteworthy) && self.script_noteworthy == "conference_level2" && !level.zones[ "conference_level2" ].is_occupied + && IsDefined(zombies[i].favoriteenemy) && zombies[i].favoriteenemy == targeted_player) + { + zombies[i].teleporting = true; + zombies[i] thread zombie_through_portal(portal_enter, portal_trig, targeted_player); + } + else if(Distance(zombies[i].origin, portal_enter.origin) < 500 && IsDefined(zombies[i].favoriteenemy) && zombies[i].favoriteenemy == targeted_player) + { + zombies[i].teleporting = true; + zombies[i] thread zombie_through_portal(portal_enter, portal_trig, targeted_player); + teleporting_zombies++; + } + } + } +} +zombie_through_portal(portal_enter, portal_exit, targeted_player) +{ + self endon( "death" ); + self endon( "damage" ); + wait_network_frame(); + if(Distance(self.origin, targeted_player.origin) < 500) + { + self.teleporting = false; + return; + } + move_speed = undefined; + if(IsDefined(self.zombie_move_speed)) + { + move_speed = self.zombie_move_speed; + } + self.ignoreall = true; + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self SetGoalPos(portal_enter.origin); + self.timed_out = false; + self thread teleportation_timed_out(); + while(Distance(self.origin, portal_enter.origin) > self.goalradius && self.timed_out == false) + { + wait(0.1); + } + if ( isDefined( self.pre_teleport_func ) ) + { + self [[ self.pre_teleport_func ]](); + } + PlayFX(level._effect["transporter_start"], self.origin); + playsoundatposition( "evt_teleporter_out", portal_enter.origin ); + final_destination = getstructarray(portal_exit.target, "targetname"); + for ( i = 0; i < final_destination.size; i++ ) + { + if(IsDefined(final_destination[i].script_noteworthy) && final_destination[i].script_noteworthy == "zombie_pos") + { + portal_exit = final_destination[i]; + } + } + self forceteleport(portal_exit.origin + (AnglesToForward(portal_exit.angles) * RandomFloatRange(0,64)),portal_exit.angles); + PlayFX(level._effect["transporter_beam"], portal_exit.origin); + playsoundatposition( "evt_teleporter_go", portal_exit.origin ); + self.teleporting = false; + self.ignoreall = false; + self thread maps\_zombiemode_spawner::find_flesh(); + if(IsDefined(move_speed)) + { + self.zombie_move_speed = move_speed; + } + if ( isDefined( self.post_teleport_func ) ) + { + self [[ self.post_teleport_func ]](); + } +} +pentagon_packapunch_init() +{ + level.defcon_level = 1; + level.defcon_activated = false; + level.ignore_spawner_func = ::pentagon_ignore_spawner; + level thread defcon_sign_lights(); + punch_switches = GetEntArray("punch_switch","targetname"); + if(IsDefined(punch_switches)) + { + for ( i = 0; i < punch_switches.size; i++ ) + { + punch_switches[i] thread defcon_sign_setup(); + } + } +} +defcon_sign_setup() +{ + self SetHintString( &"ZOMBIE_NEED_POWER" ); + self setcursorhint( "HINT_NOICON" ); + flag_wait("power_on"); + self.lights = GetEntArray(self.target, "targetname"); + if(IsDefined(self.lights)) + { + for ( j = 0; j < self.lights.size; j++ ) + { + if(IsDefined(self.lights[j].script_noteworthy) && self.lights[j].script_noteworthy == "defcon_bulb") + { + self.lights[j] SetModel("zombie_trap_switch_light_on_green"); + } + } + } + while(true) + { + self SetHintString( &"ZOMBIE_PENTAGON_DEFCON_SWITCH" ); + self waittill( "trigger", user ); + self SetHintString( "" ); + if(IsDefined(self.lights)) + { + for ( j = 0; j < self.lights.size; j++ ) + { + if(IsDefined(self.lights[j].script_noteworthy) && self.lights[j].script_noteworthy == "defcon_bulb") + { + self.lights[j] SetModel("zombie_trap_switch_light_on_red"); + } + if(IsDefined(self.lights[j].script_noteworthy) && self.lights[j].script_noteworthy == "defcon_handle") + { + self.lights[j] rotatepitch( -180, .5 ); + self.lights[j] playsound( "zmb_defcon_switch" ); + } + } + } + if(level.defcon_level != 4) + { + level.defcon_level++; + if( level.zombie_vars["zombie_powerup_bonfire_sale_on"] == false ) + { + level thread maps\zombie_pentagon_amb::play_pentagon_announcer_vox( "zmb_vox_pentann_defcon", level.defcon_level ); + } + level thread defcon_sign_lights(); + } + else + { + level.defcon_level = 5; + if( level.zombie_vars["zombie_powerup_bonfire_sale_on"] == false || !flag("bonfire_reset")) + { + level thread maps\zombie_pentagon_amb::play_pentagon_announcer_vox( "zmb_vox_pentann_defcon", level.defcon_level ); + } + level thread defcon_sign_lights(); + flag_set("defcon_active"); + if( level.zombie_vars["zombie_powerup_bonfire_sale_on"] == false || !flag("bonfire_reset")) + { + level thread play_defcon5_alarms(); + } + level thread pack_portal_fx_on(); + } + level waittill("pack_room_reset"); + if(!flag("bonfire_reset")) + { + level thread maps\zombie_pentagon_amb::play_pentagon_announcer_vox( "zmb_vox_pentann_defcon_reset" ); + } + if(IsDefined(self.lights)) + { + for ( j = 0; j < self.lights.size; j++ ) + { + if(IsDefined(self.lights[j].script_noteworthy) && self.lights[j].script_noteworthy == "defcon_bulb") + { + self.lights[j] SetModel("zombie_trap_switch_light_on_green"); + } + if(IsDefined(self.lights[j].script_noteworthy) && self.lights[j].script_noteworthy == "defcon_handle") + { + self.lights[j] rotatepitch( 180, .5 ); + self.lights[j] playsound( "zmb_defcon_switch" ); + } + } + } + } +} +pack_portal_fx_on() +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[i] ClearClientFlag(level.ZOMBIE_PENTAGON_PLAYER_PORTALFX); + } +} +regular_portal_fx_on() +{ + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[i] SetClientFlag(level.ZOMBIE_PENTAGON_PLAYER_PORTALFX); + } +} +defcon_sign_lights() +{ + defcon_signs = GetEntArray("defcon_sign", "targetname"); + defcon[1] = "p_zom_pent_defcon_sign_01"; + defcon[2] = "p_zom_pent_defcon_sign_02"; + defcon[3] = "p_zom_pent_defcon_sign_03"; + defcon[4] = "p_zom_pent_defcon_sign_04"; + defcon[5] = "p_zom_pent_defcon_sign_05"; + if(IsDefined(defcon_signs)) + { + for ( i = 0; i < defcon_signs.size; i++ ) + { + if(IsDefined(level.defcon_level)) + { + defcon_signs[i] SetModel(defcon[level.defcon_level]); + } + else + { + defcon_signs[i] SetModel(defcon[1]); + } + } + } +} +start_defcon_countdown() +{ + if(level.defcon_activated) + { + return; + } + if(level.zones["war_room_zone_south"].is_enabled) + { + if(!flag("war_room_entry")) + { + flag_set("war_room_entry"); + } + } + else + { + if(!flag("war_room_special")) + { + flag_set("war_room_special"); + } + } + level thread special_pack_time_spawning(); + level thread special_pack_cleanup(); + flag_set("open_pack_hideaway"); + level.defcon_activated = true; + level.defcon_countdown_time = 30; + while(level.defcon_level > 1) + { + wait(level.defcon_countdown_time /4); + level.defcon_level--; + level thread defcon_sign_lights(); + } + level.defcon_level = 1; + flag_clear("defcon_active"); + level.defcon_activated = false; + level thread regular_portal_fx_on(); + flag_clear("bonfire_reset"); + level notify("defcon_reset"); +} +special_pack_time_spawning() +{ + flag_set("no_pack_room_spawning"); + maps\_zombiemode_zone_manager::reinit_zone_spawners(); + while(level.defcon_level >= 3) + { + wait(0.1); + } + flag_clear("no_pack_room_spawning"); + maps\_zombiemode_zone_manager::reinit_zone_spawners(); +} +special_pack_cleanup() +{ + while(flag("defcon_active")) + { + wait(1); + } + if( level.zones["conference_level2"].is_occupied) + { + while( level.zones["conference_level2"].is_occupied) + { + wait(1); + } + } + level thread clear_zombies_in_packroom(); +} +defcon_pack_poi() +{ + zone_name = "conference_level2"; + players = get_players(); + poi1 = GetEnt("pack_room_poi1", "targetname"); + poi2 = GetEnt("pack_room_poi2", "targetname"); + wait(0.5); + num_players = maps\_zombiemode_zone_manager::get_players_in_zone( zone_name ); + if(num_players == players.size) + { + if(level.zones["war_room_zone_south"].is_enabled) + { + poi1 activate_zombie_point_of_interest(); + } + else + { + poi2 activate_zombie_point_of_interest(); + } + } + else + { + return; + } + while(num_players >= players.size && flag("defcon_active")) + { + num_players = maps\_zombiemode_zone_manager::get_players_in_zone( zone_name ); + wait (0.1); + } + poi1 deactivate_zombie_point_of_interest(); + poi2 deactivate_zombie_point_of_interest(); +} +check_if_empty_floors() +{ + num_floor1 = 0; + num_floor2 = 0; + num_floor3 = 0; + num_floor1_laststand = 0; + num_floor2_laststand = 0; + num_floor3_laststand = 0; + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + players[i].floor = maps\_zombiemode_ai_thief::thief_check_floor( players[i] ); + if(players[i].floor == 1) + { + num_floor1++; + if(players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator") + { + num_floor1_laststand++; + } + } + else if(players[i].floor == 2 ) + { + num_floor2++; + if(players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator") + { + num_floor2_laststand++; + } + } + else if(players[i].floor == 3) + { + num_floor3++; + if(players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator") + { + num_floor3_laststand++; + } + } + } + zombies = GetAIArray("axis"); + if(!IsDefined(zombies)) + { + return; + } + for (i = 0; i < zombies.size; i++) + { + zombies[i].floor = maps\_zombiemode_ai_thief::thief_check_floor( zombies[i] ); + if(IsDefined(zombies[i].animname) && zombies[i].animname == "thief_zombie") + { + continue; + } + else if(IsDefined(zombies[i].teleporting) && zombies[i].teleporting == true) + { + continue; + } + else if(IsDefined(zombies[i].floor) && zombies[i].floor == 1) + { + if(num_floor1 == num_floor1_laststand && players.size > 1 && flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_top); + } + else if(num_floor1 == num_floor1_laststand && players.size > 1 && !flag("power_on")) + { + PlayFX(level._effect["transporter_start"], zombies[i].origin); + zombies[i] thread cleanup_unoccupied_floor(); + } + else if(num_floor1 == 0) + { + if(flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_top); + } + else + { + zombies[i] thread cleanup_unoccupied_floor(); + } + } + else + { + continue; + } + } + else if(IsDefined(zombies[i].floor) && zombies[i].floor == 2) + { + if(num_floor2 == num_floor2_laststand && players.size > 1 && flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_mid); + } + else if(num_floor2 == num_floor2_laststand && players.size > 1 && !flag("power_on")) + { + PlayFX(level._effect["transporter_start"], zombies[i].origin); + zombies[i] thread cleanup_unoccupied_floor(); + } + else if(num_floor2 == 0) + { + if(flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_mid); + } + else + { + zombies[i] thread cleanup_unoccupied_floor(); + } + } + else + { + continue; + } + } + else if(IsDefined(zombies[i].floor) && zombies[i].floor == 3) + { + if(num_floor3 == num_floor3_laststand && players.size > 1 && flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_power); + } + else if(num_floor3 == num_floor3_laststand && players.size > 1 && !flag("power_on")) + { + PlayFX(level._effect["transporter_start"], zombies[i].origin); + zombies[i] thread cleanup_unoccupied_floor(); + } + else if(num_floor3 == 0) + { + if(flag("power_on")) + { + zombies[i] thread send_zombies_out(level.portal_power); + } + else + { + zombies[i] thread cleanup_unoccupied_floor(); + } + } + else + { + continue; + } + } + else + { + level.zombie_total++; + zombies[i] DoDamage(zombies[i].health + 100, zombies[i].origin); + } + } +} +send_zombies_out(portal) +{ + self endon("death"); + move_speed = undefined; + if(IsDefined(self.zombie_move_speed)) + { + move_speed = self.zombie_move_speed; + } + self.ignoreall = true; + self.teleporting = true; + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self SetGoalPos(portal.origin); + self.timed_out = false; + self thread teleportation_timed_out(); + while(Distance(self.origin, portal.origin) > self.goalradius && self.timed_out == false) + { + wait(0.1); + } + PlayFX(level._effect["transporter_start"], self.origin); + playsoundatposition( "evt_teleporter_out", self.origin ); + if(portal == level.portal_pack) + { + self forceteleport(level.portal_mid.origin + (AnglesToForward(level.portal_mid.angles) * RandomFloatRange(0,32)),level.portal_mid.angles); + PlayFX(level._effect["transporter_beam"], level.portal_top.origin); + playsoundatposition( "evt_teleporter_go", level.portal_top.origin); + self thread cleanup_unoccupied_floor(move_speed); + } + else + { + self thread cleanup_unoccupied_floor(move_speed); + } +} +teleportation_timed_out() +{ + time = 0; + while(IsDefined(self) && !self.timed_out && time < 20 ) + { + wait(1); + time++; + } + if(IsDefined(self)) + { + self.timed_out = true; + } +} +cleanup_unoccupied_floor(move_speed,current_floor,next_floor) +{ + self endon( "death" ); + self notify("teleporting"); + self.floor = maps\_zombiemode_ai_thief::thief_check_floor( self ); + self maps\_zombiemode_spawner::reset_attack_spot(); + if(IsDefined(self.animname) && self.animname == "thief_zombie") + { + return; + } + num_floor1 = 0; + num_floor2 = 0; + num_floor3 = 0; + num_floor1_laststand = 0; + num_floor2_laststand = 0; + num_floor3_laststand = 0; + pos_num = 0; + teleport_pos = []; + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[i].floor = maps\_zombiemode_ai_thief::thief_check_floor( players[i] ); + if(players[i].floor == 1) + { + num_floor1++; + if(players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator") + { + num_floor1_laststand++; + } + } + else if(players[i].floor == 2) + { + num_floor2++; + if(players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator") + { + num_floor2_laststand++; + } + } + else if(players[i].floor == 3) + { + num_floor3++; + if(players[i] maps\_laststand::player_is_in_laststand() || players[i].sessionstate == "spectator") + { + num_floor3_laststand++; + } + } + } + if(flag("power_on")) + { + if(num_floor3 > 0 && num_floor3 != num_floor3_laststand && self.floor != 3) + { + num = RandomIntRange(0, level.portal_bottom.size); + self forceteleport(level.portal_bottom[num].origin + (AnglesToForward(level.portal_bottom[num].angles) * RandomFloatRange(0,32)),level.portal_bottom[num].angles); + PlayFX(level._effect["transporter_beam"], level.portal_bottom[num].origin); + playsoundatposition( "evt_teleporter_go", level.portal_bottom[num].origin); + } + else if(num_floor2 > 0 && num_floor2 != num_floor2_laststand && self.floor != 2) + { + self forceteleport(level.portal_mid.origin + (AnglesToForward(level.portal_mid.angles) * RandomFloatRange(0,32)),level.portal_mid.angles); + PlayFX(level._effect["transporter_beam"], level.portal_mid.origin); + playsoundatposition( "evt_teleporter_go", level.portal_mid.origin); + } + else if(num_floor1 > 0 && num_floor1 != num_floor1_laststand && self.floor != 1) + { + self forceteleport(level.portal_top.origin + (AnglesToForward(level.portal_top.angles) * RandomFloatRange(0,32)),level.portal_top.angles); + PlayFX(level._effect["transporter_beam"], level.portal_top.origin); + playsoundatposition( "evt_teleporter_go", level.portal_top.origin); + } + self.teleporting = false; + self.ignoreall = false; + self thread maps\_zombiemode_spawner::find_flesh(); + if(IsDefined(move_speed)) + { + self.zombie_move_speed = move_speed; + } + } + else + { + self.teleporting = false; + if(!IsDefined(self.animname) || self.animname != "quad_zombie") + { + if(self.health == level.zombie_health) + { + level.zombie_total++; + if(IsDefined(self.fx_quad_trail)) + { + self.fx_quad_trail Delete(); + } + self maps\_zombiemode_spawner::reset_attack_spot(); + self notify("zombie_delete"); + self Delete(); + } + else if(IsDefined(next_floor) && IsDefined(current_floor)) + { + if(next_floor == 3 && current_floor == 2) + { + teleport_pos = getstructarray("elevator1_down_hidden", "targetname"); + } + else if(next_floor == 2 && current_floor == 3) + { + teleport_pos = getstructarray("elevator1_up_hidden", "targetname"); + } + else if(next_floor == 2 && current_floor == 1) + { + teleport_pos = getstructarray("elevator2_down_hidden", "targetname"); + } + else if(next_floor == 1 && current_floor == 2) + { + teleport_pos = getstructarray("elevator2_up_hidden", "targetname"); + } + } + else + { + if(num_floor3 > 0 && num_floor3 != num_floor3_laststand && self.floor != 3) + { + teleport_pos = getstructarray("elevator1_down_hidden", "targetname"); + } + else if(num_floor2 > 0 && num_floor2 != num_floor2_laststand && self.floor != 2) + { + teleport_pos = getstructarray("elevator2_down_hidden", "targetname"); + } + else if(num_floor1 > 0 && num_floor1 != num_floor1_laststand && self.floor != 1) + { + teleport_pos = getstructarray("elevator2_up_hidden", "targetname"); + } + else + { + return; + } + } + if(IsDefined(teleport_pos)) + { + pos_num = RandomIntRange(0,teleport_pos.size); + self forceteleport(teleport_pos[pos_num].origin + (RandomFloatRange(0,22), RandomFloatRange(0,22), 0),teleport_pos[pos_num].angles); + } + wait(1); + if(IsDefined(self)) + { + self.ignoreall = true; + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + wait_network_frame(); + if(IsDefined(self.target)) + { + self.target = undefined; + } + self thread maps\_zombiemode_spawner::zombie_think(); + } + } + else if(IsDefined(self.animname) && self.animname == "quad_zombie") + { + level.zombie_total++; + if(IsDefined(self.fx_quad_trail)) + { + self.fx_quad_trail Delete(); + } + self notify("zombie_delete"); + self Delete(); + } + else + { + level.zombie_total++; + self maps\_zombiemode_spawner::reset_attack_spot(); + self notify("zombie_delete"); + self Delete(); + } + } +} +teleporter_power_cable() +{ + cable_on = GetEnt("teleporter_link_cable_on","targetname"); + cable_off = GetEnt("teleporter_link_cable_off","targetname"); + cable_on Hide(); + flag_wait( "power_on" ); + cable_off Hide(); + cable_on Show(); +} +pentagon_ignore_spawner( spawner ) +{ + if ( flag( "no_pack_room_spawning" ) ) + { + if (spawner.targetname == "conference_level2_spawners" ) + { + return true; + } + } + if ( flag( "no_warroom_elevator_spawning" ) ) + { + if (spawner.targetname == "war_room_zone_elevator_spawners" ) + { + return true; + } + } + if ( flag( "no_labs_elevator_spawning" ) ) + { + if (spawner.targetname == "labs_elevator_spawners" ) + { + return true; + } + } + return false; +} +play_defcon5_alarms() +{ + structs = getstructarray( "defcon_alarms", "targetname" ); + sound_ent = []; + for(i=0;i 1) + { + level.zombie_powerup_array = array_add(level.zombie_powerup_array, "nuke"); + level.zombie_powerup_array = array_add(level.zombie_powerup_array, "fire_sale"); + break; + } + wait (1); + } +} +init_weapons_locker() +{ + trigger = getEnt("weapons_locker", "targetname"); + trigger SetCursorHint( "HINT_NOICON" ); + wallModel = getEnt(trigger.target, "targetname"); + trigger thread triggerWeaponsLockerWatch(wallModel); +} +setup_water_physics() +{ + flag_wait( "all_players_connected" ); + players = GetPlayers(); + for (i = 0; i < players.size; i++) + { + players[i] SetClientDvars("phys_buoyancy",1); + } +} +mergeSort(current_list, less_than) +{ + if (current_list.size <= 1) + { + return current_list; + } + left = []; + right = []; + middle = current_list.size / 2; + for (x = 0; x < middle; x++) + { + left = add_to_array(left, current_list[x]); + } + for (; x < current_list.size; x++) + { + right = add_to_array(right, current_list[x]); + } + left = mergeSort(left, less_than); + right = mergeSort(right, less_than); + result = merge(left, right, less_than); + return result; +} +merge(left, right, less_than) +{ + result = []; + li = 0; + ri = 0; + while ( li < left.size && ri < right.size ) + { + if ( [[less_than]](left[li], right[ri]) ) + { + result[result.size] = left[li]; + li++; + } + else + { + result[result.size] = right[ri]; + ri++; + } + } + while ( li < left.size ) + { + result[result.size] = left[li]; + li++; + } + while ( ri < right.size ) + { + result[result.size] = right[ri]; + ri++; + } + return result; +} +double_door_fx() +{ + flag_wait( "cave01_to_cave02" ); + door_ents = getentarray( "cave01_to_cave02_door", "targetname" ); + doors_x = 0; + doors_y = 0; + doors_z = 0; + for( i=0;i dist_far) + { + dest = i; + dist_far = dist_player; + } + if( ( dist_zombie < dist_player ) && ( dist_player > min_distance_squared ) ) + { + dest = i; + break; + } + } + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self setgoalpos( locs[dest].origin ); + while ( 1 ) + { + if ( !flag( "wait_and_revive" ) ) + { + break; + } + wait_network_frame(); + } + self thread maps\_zombiemode_spawner::find_flesh(); +} +temple_offhand_weapon_overrride() +{ + register_lethal_grenade_for_level( "frag_grenade_zm" ); + register_lethal_grenade_for_level( "sticky_grenade_zm" ); + level.zombie_lethal_grenade_player_init = "frag_grenade_zm"; + register_tactical_grenade_for_level( "zombie_cymbal_monkey" ); + level.zombie_tactical_grenade_player_init = undefined; + register_placeable_mine_for_level( "claymore_zm" ); + level.zombie_placeable_mine_player_init = undefined; + register_melee_weapon_for_level( "knife_zm" ); + register_melee_weapon_for_level( "bowie_knife_zm" ); + level.zombie_melee_weapon_player_init = "knife_zm"; +} +temple_shrink_ray_model_mapping_func() +{ + level.shrink_models["c_viet_zombie_female"] = "c_viet_zombie_female_mini"; + level.shrink_models["c_viet_zombie_female_head"] = "c_viet_zombie_female_head_mini"; + level.shrink_models["c_viet_zombie_nva1_body"] = "c_viet_zombie_nva1_body_m"; + level.shrink_models["c_viet_zombie_nva1_head1"] = "c_viet_zombie_nva1_head_m"; + level.shrink_models["c_viet_zombie_napalm"] = "c_viet_zombie_napalm_m"; + level.shrink_models["c_viet_zombie_napalm_head"] = "c_viet_zombie_napalm_head_m"; + level.shrink_models["c_viet_zombie_sonic_body"] = "c_viet_zombie_sonic_body_m"; + level.shrink_models["c_viet_zombie_sonic_head"] = "c_viet_zombie_sonic_head_m"; + level.shrink_models["c_viet_zombie_nva_body_alt"] = "c_viet_zombie_nva_body_alt_m"; + level.shrink_models["c_viet_zombie_female_alt"] = "c_viet_zombie_female_mini_alt"; + level.shrink_models["c_viet_zombie_vc_grunt_head"] = "c_viet_zombie_vc_grunt_head_m"; + level.shrink_models["c_viet_zombie_vc_grunt"] = "c_viet_zombie_vc_grunt_m"; + level.shrink_models["c_viet_zombie_sonic_bandanna"] = "c_viet_zombie_sonic_bandanna_m"; + level.shrink_models["c_viet_zombie_nva1_gasmask"] = "c_viet_zombie_nva1_gasmask_m"; + level.shrink_models["c_viet_zombie_female_g_barmsoff"] = "c_viet_zombie_female_g_barmsoff_mini"; + level.shrink_models["c_viet_zombie_female_g_headoff"] = "c_viet_zombie_female_g_headoff_mini"; + level.shrink_models["c_viet_zombie_female_g_legsoff"] = "c_viet_zombie_female_g_legsoff_mini"; + level.shrink_models["c_viet_zombie_female_g_llegoff"] = "c_viet_zombie_female_g_llegoff_mini"; + level.shrink_models["c_viet_zombie_female_g_lowclean"] = "c_viet_zombie_female_g_lowclean_mini"; + level.shrink_models["c_viet_zombie_female_g_rarmoff"] = "c_viet_zombie_female_g_rarmoff_mini"; + level.shrink_models["c_viet_zombie_female_g_rlegoff"] = "c_viet_zombie_female_g_rlegoff_mini"; + level.shrink_models["c_viet_zombie_female_g_upclean"] = "c_viet_zombie_female_g_upclean_mini"; + level.shrink_models["c_viet_zombie_female_g_larmoff"] = "c_viet_zombie_female_g_larmoff_mini"; + level.shrink_models["c_viet_zombie_female_g_barmsoff_alt"] = "c_viet_zombie_female_g_barmsoff_alt_mini"; + level.shrink_models["c_viet_zombie_female_g_legsoff_alt"] = "c_viet_zombie_female_g_legsoff_alt_mini"; + level.shrink_models["c_viet_zombie_female_g_llegoff_alt"] = "c_viet_zombie_female_g_llegoff_alt_mini"; + level.shrink_models["c_viet_zombie_female_g_lowclean_alt"] = "c_viet_zombie_female_g_lowclean_alt_mini"; + level.shrink_models["c_viet_zombie_female_g_rarmoff_alt"] = "c_viet_zombie_female_g_rarmoff_alt_mini"; + level.shrink_models["c_viet_zombie_female_g_rlegoff_alt"] = "c_viet_zombie_female_g_rlegoff_alt_mini"; + level.shrink_models["c_viet_zombie_female_g_upclean_alt"] = "c_viet_zombie_female_g_upclean_alt_mini"; + level.shrink_models["c_viet_zombie_female_g_larmoff_alt"] = "c_viet_zombie_female_g_larmoff_alt_mini"; + level.shrink_models["c_viet_zombie_nva1_g_barmsoff"] = "c_viet_zombie_nva1_g_barmsoff_m"; + level.shrink_models["c_viet_zombie_nva1_g_headoff"] = "c_viet_zombie_nva1_g_headoff_m"; + level.shrink_models["c_viet_zombie_nva1_g_legsoff"] = "c_viet_zombie_nva1_g_legsoff_m"; + level.shrink_models["c_viet_zombie_nva1_g_llegoff"] = "c_viet_zombie_nva1_g_llegoff_m"; + level.shrink_models["c_viet_zombie_nva1_g_lowclean"] = "c_viet_zombie_nva1_g_lowclean_m"; + level.shrink_models["c_viet_zombie_nva1_g_rarmoff"] = "c_viet_zombie_nva1_g_rarmoff_m"; + level.shrink_models["c_viet_zombie_nva1_g_rlegoff"] = "c_viet_zombie_nva1_g_rlegoff_m"; + level.shrink_models["c_viet_zombie_nva1_g_upclean"] = "c_viet_zombie_nva1_g_upclean_m"; + level.shrink_models["c_viet_zombie_nva1_g_larmoff"] = "c_viet_zombie_nva1_g_larmoff_m"; + level.shrink_models["c_viet_zombie_nva1_g_barmsoff_alt"] = "c_viet_zombie_nva1_g_barmsoff_alt_m"; + level.shrink_models["c_viet_zombie_nva1_g_legsoff_alt"] = "c_viet_zombie_nva1_g_legsoff_alt_m"; + level.shrink_models["c_viet_zombie_nva1_g_llegoff_alt"] = "c_viet_zombie_nva1_g_llegoff_alt_m"; + level.shrink_models["c_viet_zombie_nva1_g_lowclean_alt"] = "c_viet_zombie_nva1_g_lowclean_alt_m"; + level.shrink_models["c_viet_zombie_nva1_g_rarmoff_alt"] = "c_viet_zombie_nva1_g_rarmoff_alt_m"; + level.shrink_models["c_viet_zombie_nva1_g_rlegoff_alt"] = "c_viet_zombie_nva1_g_rlegoff_alt_m"; + level.shrink_models["c_viet_zombie_nva1_g_upclean_alt"] = "c_viet_zombie_nva1_g_upclean_alt_m"; + level.shrink_models["c_viet_zombie_nva1_g_larmoff_alt"] = "c_viet_zombie_nva1_g_larmoff_alt_m"; + level.shrink_models["c_viet_zombie_vc_grunt_g_barmsoff"] = "c_viet_zombie_vc_grunt_g_barmsoff_m"; + level.shrink_models["c_viet_zombie_vc_grunt_g_headoff"] = "c_viet_zombie_vc_grunt_g_headoff_m"; + level.shrink_models["c_viet_zombie_vc_grunt_g_legsoff"] = "c_viet_zombie_vc_grunt_g_legsoff_m"; + level.shrink_models["c_viet_zombie_vc_grunt_g_llegoff"] = "c_viet_zombie_vc_grunt_g_llegoff_m"; + level.shrink_models["c_viet_zombie_vc_grunt_g_lowclean"] = "c_viet_zombie_vc_grunt_g_lowclean_m"; + level.shrink_models["c_viet_zombie_vc_grunt_g_rarmoff"] = "c_viet_zombie_vc_grunt_g_rarmoff_m"; + level.shrink_models["c_viet_zombie_vc_grunt_g_rlegoff"] = "c_viet_zombie_vc_grunt_g_rlegoff_m"; + level.shrink_models["c_viet_zombie_vc_grunt_g_upclean"] = "c_viet_zombie_vc_grunt_g_upclean_m"; + level.shrink_models["c_viet_zombie_vc_grunt_g_larmoff"] = "c_viet_zombie_vc_grunt_g_larmoff_m"; +} +check_if_should_avoid_poi() +{ + if(is_true(self.sliding)) + { + return true; + } + else + { + return false; + } +} +zombiemode_cross_bow_fired_temple(grenade, weaponName, parent, player) +{ + if(!isDefined(level.cross_bow_bolts)) + { + level.cross_bow_bolts = []; + } + level.cross_bow_bolts[level.cross_bow_bolts.size] = grenade; + level.cross_bow_bolts = array_removeUndefined(level.cross_bow_bolts); +} +zombie_temple_player_intersection_tracker_override( other_player ) +{ + if ( is_true( self.riding_geyser ) ) + { + return true; + } + if ( is_true( other_player.riding_geyser ) ) + { + return true; + } + return false; +} +zombie_temple_player_out_of_playable_area_monitor_callback() +{ + if ( is_true( self.on_slide ) ) + { + return false; + } + if ( is_true( self.riding_geyser ) ) + { + return false; + } + if ( is_true( self.is_on_minecart ) ) + { + return false; + } + return true; +} +temple_death_screen_cleanup() +{ + self ClearClientFlag( level._CF_PLAYER_MAZE_FLOOR_RUMBLE ); + wait_network_frame(); + wait_network_frame(); + self SetBlur( 0, 0.1 ); +} +temple_check_valid_spawn( revivee ) +{ + spawn_points = getstructarray( "player_respawn_point", "targetname" ); + zkeys = GetArrayKeys( level.zones ); + for ( z = 0; z < zkeys.size; z++ ) + { + zone_str = zkeys[z]; + if ( level.zones[ zone_str ].is_occupied ) + { + for ( i = 0; i < spawn_points.size; i++ ) + { + if ( spawn_points[i].script_noteworthy == zone_str ) + { + spawn_array = getstructarray( spawn_points[i].target, "targetname" ); + for ( j = 0; j < spawn_array.size; j++ ) + { + if ( spawn_array[j].script_int == ( revivee.entity_num + 1 ) ) + { + return spawn_array[j].origin; + } + } + return spawn_array[0].origin; + } + } + } + } + return undefined; +} +temple_revive_solo_fx() +{ + vending_triggers = getentarray( "zombie_vending", "targetname" ); + for ( i = 0; i < vending_triggers.size; i++ ) + { + if ( vending_triggers[i].script_noteworthy == "specialty_quickrevive" ) + { + vending_triggers[i] delete(); + break; + } + } +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_temple_achievement.gsc b/BO1/PC/ZM/maps/zombie_temple_achievement.gsc new file mode 100644 index 0000000..0b0f1c8 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_temple_achievement.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_temple_ai_monkey.gsc b/BO1/PC/ZM/maps/zombie_temple_ai_monkey.gsc new file mode 100644 index 0000000..732ddf5 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_temple_ai_monkey.gsc @@ -0,0 +1,1526 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#using_animtree("generic_human"); +init() +{ + maps\_zombiemode_ai_monkey::init_monkey_zombie_anims(); + precache_ambient_monkey_anims(); + level._effect["monkey_death"] = loadfx("maps/zombie/fx_zmb_monkey_death"); + level._effect["monkey_spawn"] = loadfx("maps/zombie/fx_zombie_ape_spawn_dust"); + level._effect["monkey_eye_glow"] = LoadFx( "maps/zombie/fx_zmb_monkey_eyes" ); + level._effect["monkey_gib"] = LoadFx( "maps/zombie_temple/fx_ztem_zombie_mini_squish" ); + level._effect["monkey_gib_no_gore"] = LoadFX("maps/zombie_temple/fx_ztem_monkey_shrink"); + level._effect["monkey_launch"] = loadfx("weapon/grenade/fx_trail_rpg"); + level.scr_anim[ "monkey_zombie" ][ "slide" ] = %ai_zombie_monkey_slide_traverse; + level.monkey_zombie_spawners = GetEntArray( "monkey_zombie_spawner", "targetname" ); + array_thread( level.monkey_zombie_spawners, ::add_spawn_function, maps\_zombiemode_ai_monkey::monkey_prespawn ); + PrecacheRumble("explosion_generic"); + level.nextMonkeyStealRound = 1; + level.monkey_zombie_health = level.zombie_vars["zombie_health_start"]; + level.stealer_monkey_spawns = GetStructArray("stealer_monkey_spawn", "targetname"); + level.stealer_monkey_exits = GetStructArray("stealer_monkey_exit", "targetname"); + if ( GetDvar("monkey_steal_debug") == "" ) + { + SetDvar("monkey_steal_debug","0"); + } + level thread _setup_zone_info(); + level thread _watch_for_powerups(); + monkey_ambient_init(); + level thread monkey_grenade_watcher_temple(); +} +monkey_grenade_watcher_temple() +{ + wait_for_all_players(); + level thread maps\_zombiemode_ai_monkey::monkey_grenade_watcher(); +} +monkey_templeThink(spawner) +{ + self thread _monkey_TempleThinkInternal(spawner); +} +monkey_GetMonkeySpawnLocation(minDist, checkVisible, skipStartArea) +{ + visitedZones = []; + needToVisit = []; + startZone = self _ent_GetZoneName(); + needToVisit[0] = startZone; + zoneCounter = 0; + while(needToVisit.size>0) + { + zoneCounter++; + visitName = needToVisit[0]; + zone = level.zones[visitName]; + if(isdefined(zone.barriers) && (!skipStartArea || startZone!=visitName)) + { + barriers = array_randomize_knuth(zone.barriers); + for(i=0;i0 ) + { + valid_barriers = array_combine(valid_barriers, barriers); + } + } + } + return valid_barriers; +} +printText(text, red) +{ + level endon("stopPrints"); + if( !isDefined(level.printOffsets) ) + { + level.printOffsets = []; + } + originStr = "(" + self.origin[0]+","+self.origin[1]+","+self.origin[2] + ")"; + if( !isDefined(level.printOffsets[originStr]) ) + { + level.printOffsets[originStr] = (0,0,0); + } + else + { + level.printOffsets[originStr] += (0,0,20); + } + offset = ( 0, 0, 45 ) + level.printOffsets[originStr]; + color = (0,1,0); + if(is_true(red)) + { + color = (1,0,0); + } + while(1) + { + print3d( ( self.origin + offset ), text, color, 0.85 ); + wait .05; + } +} +printTextStop() +{ + level notify("stopPrints"); + level.printOffsets = []; +} +_get_non_visible_barriers(barriers) +{ + returnBarriers = []; + if(isdefined(barriers)) + { + players = get_players(); + for(i=0;i0) + { + playExitAnim = true; + randStruct = random(level.stealer_monkey_exits); + location = randStruct.origin; + angles = randStruct.angles; + } + else + { + valid_escapes = self ent_GatherValidBarriers(); + maxDist = 0.0; + bestBarrier = undefined; + for ( i = 0; i < valid_escapes.size; i++ ) + { + dist2 = DistanceSquared(self.origin, valid_escapes[i].origin); + if ( dist2 > maxDist ) + { + maxDist = dist2; + bestBarrier = valid_escapes[i]; + } + } + location = getBarrierAttackLocation(bestBarrier); + } + self.goalradius = 8; + self SetGoalPos( location ); + self waittill( "goal" ); + self notify( "escape_goal" ); + if(playExitAnim) + { + if(!isDefined(angles)) + { + angles = (0,0,0); + } + escapeAnim = %ai_zombie_monkey_pap_escape; + self animscripted("monkey_steal_exit", location, angles, escapeAnim); + wait( GetAnimLength( escapeAnim ) ); + } + hasPowerUp = IsDefined(self.powerup); + if ( hasPowerUp ) + { + level notify("monkey_powerup_escape"); + } + level thread escape_monkey_counter(hasPowerUp); + self _monkey_remove(); +} +escape_monkey_counter(hasPowerUp) +{ + if(!isDefined(level.monkey_escape_count)) + { + level.monkey_escape_count = 0; + level.monkey_escape_with_powerup_count = 0; + } + level.monkey_escape_count++; + if(hasPowerUp) + { + level.monkey_escape_with_powerup_count++; + } + if(level.monkey_escape_with_powerup_count%5 == 0) + { + level thread launch_monkey(); + } +} +launch_monkey() +{ + effectEnt = Spawn("script_model", (-24, 1448, 1000)); + if(isDefined(effectEnt)) + { + effectEnt endon("death"); + effectEnt SetModel("tag_origin"); + effectEnt.angles = (90,0,0); + PlayFXOnTag(level._effect["monkey_launch"], effectEnt, "tag_origin" ); + launchTime = 6; + effectEnt MoveTo(effectEnt.origin + (0,0,2500), launchTime, 3); + wait launchTime; + effectEnt Delete(); + } +} +_monkey_CheckPlayableArea() +{ + self endon("death"); + canDamage = true; + areas = getentarray("player_volume","script_noteworthy"); + while ( true ) + { + inArea = false; + for ( i = 0; i < areas.size && !inArea; i++ ) + { + inArea = self IsTouching(areas[i]); + } + if ( canDamage && !inArea ) + { + println("monkey no damage"); + canDamage = false; + self magic_bullet_shield(); + } + else if ( !canDamage && inArea ) + { + println("monkey damage"); + canDamage = true; + self stop_magic_bullet_shield(); + } + wait(0.2); + } +} +_monkey_timeout() +{ + self endon("death"); + if(!isDefined(self.endTime)) + { + self.endTime = GetTime() + 60000; + } + while(self.endTime>GetTime()) + { + wait .5; + } + self _monkey_remove(); +} +_monkey_add_time() +{ + self.endTime = GetTime() + 60000; +} +_monkey_zombieTempleEscapeDeathCallback() +{ + self.grenadeAmmo = 0; + playsoundatposition("zmb_stealer_death", self.origin); + self thread maps\_zombiemode_spawner::zombie_eye_glow_stop(); + if( isdefined( self.attacker ) && isPlayer( self.attacker ) ) + { + self.attacker maps\_zombiemode_audio::create_and_play_dialog( "kill", "thief" ); + isFavoriteEnemy = isDefined(self.favoriteenemy) && self.favoriteenemy == self.attacker; + noMeleeHits = !isdefined(self.melee_count) || self.melee_count==0; + if( is_true(self.attacking_player) && noMeleeHits && isFavoriteEnemy ) + { + self.attacker maps\_zombiemode_score::player_add_points( "thundergun_fling", 500, (0,0,0), false ); + } + } + if(isDefined(self.attacker) && isPlayer(self.attacker)) + { + self.attacker maps\_zombiemode_score::player_add_points( "damage" ); + } + if ( IsDefined(self.powerup) ) + { + self _monkey_dropStolenPowerUp(); + } + if( "rottweil72_upgraded_zm" == self.damageweapon && "MOD_RIFLE_BULLET" == self.damagemod ) + { + self thread _monkey_temple_dragons_breath_flame_death_fx(); + } + if(is_true(self.do_gib_death)) + { + self thread _monkey_gib(); + self delayThread(0.05, ::self_delete); + } + return false; +} +_monkey_temple_dragons_breath_flame_death_fx() +{ + if ( self.isdog ) + { + return; + } + if( !IsDefined( level._effect ) || !IsDefined( level._effect["character_fire_death_sm"] ) ) + { + return; + } + PlayFxOnTag( level._effect["character_fire_death_sm"], self, "J_SpineLower" ); + tagArray = []; + if( !IsDefined( self.a.gib_ref ) || self.a.gib_ref != "left_arm" ) + { + tagArray[tagArray.size] = "J_Elbow_LE"; + tagArray[tagArray.size] = "J_Wrist_LE"; + } + if( !IsDefined( self.a.gib_ref ) || self.a.gib_ref != "right_arm" ) + { + tagArray[tagArray.size] = "J_Elbow_RI"; + tagArray[tagArray.size] = "J_Wrist_RI"; + } + if( !IsDefined( self.a.gib_ref ) || (self.a.gib_ref != "no_legs" && self.a.gib_ref != "left_leg") ) + { + tagArray[tagArray.size] = "J_Knee_LE"; + tagArray[tagArray.size] = "J_Ankle_LE"; + } + if( !IsDefined( self.a.gib_ref ) || (self.a.gib_ref != "no_legs" && self.a.gib_ref != "right_leg") ) + { + tagArray[tagArray.size] = "J_Knee_RI"; + tagArray[tagArray.size] = "J_Ankle_RI"; + } + tagArray = array_randomize( tagArray ); + PlayFxOnTag( level._effect["character_fire_death_sm"], self, tagArray[0] ); +} +_monkey_dropStolenPowerUp() +{ + returnPowerUp = self.powerup; + if( isdefined(self.powerup)) + { + self notify("powerup_dropped"); + self.powerup notify("stop_randomize"); + if( isDefined(self.powerup.fx_red) ) + { + self.powerup.fx_red delayThread( 0.1, ::self_delete ); + self.powerup.fx_red = undefined; + } + self.powerup.claimed = false; + level notify("powerup_dropped", self.powerup); + origin = self.origin; + if(is_true(self.is_traversing)) + { + origin = groundpos( self.origin + (0,0,10) ); + } + origin = origin + (0,0,40); + self.powerup Unlink(); + self.powerup.origin = origin; + self.powerup thread maps\_zombiemode_powerups::powerup_timeout(); + self.powerup thread maps\_zombiemode_powerups::powerup_wobble(); + self.powerup thread maps\_zombiemode_powerups::powerup_grab(); + self.powerup = undefined; + } + return returnPowerUp; +} +_monkey_remove(playFX) +{ + self notify("remove"); + if(!isdefined(playFX)) + { + playFX = true; + } + if ( IsDefined(self.powerup) ) + { + if( isdefined(self.powerup.fx_red) ) + { + self.powerup.fx_red Delete(); + self.powerup.fx_red = undefined; + } + self.powerup Delete(); + } + self thread maps\_zombiemode_spawner::zombie_eye_glow_stop(); + self Delete(); +} +_getConnectedZoneNames(zoneName, params) +{ + if ( !IsDefined(params.tested) ) + { + params.tested = []; + } + ret = []; + if ( !IsDefined(params.tested[zoneName]) ) + { + ret[0] = zoneName; + params.tested[zoneName] = true; + zone = level.zones[zoneName]; + azKeys = GetArrayKeys( zone.adjacent_zones ); + for ( i=0; i < azKeys.size; i++ ) + { + name = azKeys[i]; + adjZone = zone.adjacent_zones[name]; + globalZone = level.zones[name]; + if ( adjZone.is_connected && globalZone.is_enabled ) + { + zoneNames = _getConnectedZoneNames(name, params); + ret = array_combine(ret, zoneNames); + } + } + } + return ret; +} +_powerup_Randomize(monkey) +{ + self endon("stop_randomize"); + monkey endon("remove"); + powerup_cycle = array("carpenter","fire_sale","nuke","double_points","insta_kill"); + powerup_cycle = array_randomize_knuth(powerup_cycle); + powerup_cycle[powerup_cycle.size] = "full_ammo"; + if(level.chest_moves < 1) + { + powerup_cycle = array_remove_nokeys(powerup_cycle, "fire_sale"); + } + if(level.round_number<=1) + { + powerup_cycle = array_remove_nokeys(powerup_cycle, "nuke"); + } + currentPowerUp = undefined; + keys = GetArrayKeys( level.zombie_powerups ); + for(i=0;i= powerup_cycle.size ) + { + index = 0; + } + self maps\_zombiemode_powerups::powerup_setup( powerupName ); + monkey _monkey_BindPowerup(self); + if(powerupName=="free_perk") + { + wait .25; + } + else + { + wait 1; + } + } +} +array_randomize_knuth(array) +{ + n = array.size; + while ( n > 0 ) + { + index = RandomInt(n); + n = n - 1; + temp = array[index]; + array[index] = array[n]; + array[n] = temp; + } + return array; +} +_monkey_BindPowerup(powerup) +{ + powerup Unlink(); + powerup.angles = self.angles; + powerup.origin = self.origin; + offset = (0,0,40.0); + angles = (0,0,0); + powerup LinkTo(self, "tag_origin", offset, angles); +} +_monkey_gib() +{ + if(is_mature()) + { + playfx(level._effect["monkey_gib"], self.origin); + } + else + { + playfx( level._effect["monkey_gib_no_gore"], self.origin ); + } + self Hide(); +} +_monkey_TempleFling( player ) +{ + self.do_gib_death = true; + self DoDamage( self.health + 666, self.origin, player); +} +_monkey_TempleSliding( slide_node ) +{ + self endon( "death" ); + level endon( "intermission" ); + if ( is_true( self.sliding ) ) + { + return; + } + self notify("end_monkey_steal"); + self.is_traversing = true; + self notify("zombie_start_traverse"); + self thread maps\zombie_temple_waterslide::zombie_slide_watch(); + self thread maps\zombie_temple_waterslide::play_zombie_slide_looper(); + self.sliding = true; + self.ignoreall = true; + self thread set_monkey_slide_anim(); + self SetGoalNode(slide_node); + check_dist_squared = 60*60; + while(Distancesquared(self.origin, slide_node.origin) > check_dist_squared ) + { + wait(0.01); + } + self thread monkey_zombie_choose_sprint_temple(); + self notify("water_slide_exit"); + self.sliding = false; + self.is_traversing = false; + self notify("zombie_end_traverse"); + self thread _monkey_StealPowerup(); +} +set_monkey_slide_anim() +{ + self set_run_anim( "slide" ); + self.run_combatanim = level.scr_anim["monkey_zombie"]["slide"]; + self.crouchRunAnim = level.scr_anim["monkey_zombie"]["slide"]; + self.crouchrun_combatanim = level.scr_anim["monkey_zombie"]["slide"]; + self.needs_run_update = true; +} +#using_animtree( "critter" ); +precache_ambient_monkey_anims() +{ + level.scr_anim[ "monkey" ][ "calm_idle" ][0] = %ai_zombie_monkey_calm_idle_03; + level.scr_anim[ "monkey" ][ "excited" ][0] = %a_monkey_freaked_01; + level.scr_animtree[ "monkey" ] = #animtree; + level.scr_anim[ "monkey" ][ "shot_death" ][0] = %a_monkey_shot_death; +} +monkey_ambient_init() +{ + flag_init("monkey_ambient_excited"); + monkey_ambient_level_set_next_sound(); + level.ambient_monkey_locations = GetStructArray( "monkey_ambient", "targetname" ); + level thread monkey_crowd_noise(); + level thread monkey_ambient_drops_add_array(); + level thread monkey_ambient_drops_remove_array(); + level thread manage_ambient_monkeys(4); +} +monkey_crowd_noise() +{ + origin1 = GetEnt("evt_monkey_crowd01_origin","targetname"); + origin2 = GetEnt("evt_monkey_crowd02_origin","targetname"); + if(!isDefined(origin1) || !isDefined(origin2)) + { + return; + } + while(1) + { + flag_wait("monkey_ambient_excited"); + origin1 playloopsound("evt_monkey_crowd01",2); + origin2 playloopsound("evt_monkey_crowd02",2); + while(flag("monkey_ambient_excited")) + { + wait .1; + } + origin1 stoploopsound(3); + origin2 stoploopsound(3); + } +} +manage_ambient_monkeys(max_monkeys) +{ + checkZone = "temple_start_zone"; + level.active_monkeys = []; + playerInZone = false; + hackToFixStart = true; + while ( true ) + { + if(!hackToFixStart) + { + wait_network_frame(); + } + if ( zone_is_active(checkZone) || hackToFixStart ) + { + if ( level.active_monkeys.size == 0 && !playerInZone ) + { + level.ambient_monkey_locations = array_randomize_knuth(level.ambient_monkey_locations); + for ( i = 0; i < max_monkeys; i++ ) + { + level.ambient_monkey_locations[i] monkey_ambient_spawn(); + if(!hackToFixStart) + { + wait_network_frame(); + } + wait_network_frame(); + } + } + if(hackToFixStart) + { + while(!zone_is_active(checkZone)) + { + wait .1; + } + } + hackToFixStart = false; + playerInZone = true; + } + else + { + playerInZone = false; + array_thread( level.active_monkeys, ::cleanup_monkey ); + } + } +} +zone_is_active( zone_name ) +{ + if ( !IsDefined(level.zones) || + !IsDefined(level.zones[ zone_name ]) || + !level.zones[ zone_name ].is_active ) + { + return false; + } + return true; +} +cleanup_monkey() +{ + self.location.monkey = undefined; + self notify( "monkey_cleanup" ); + level.active_monkeys = array_remove(level.active_monkeys, self); + self.anim_spot Delete(); + self Delete(); +} +monkey_ambient_spawn() +{ + self.monkey = Spawn( "script_model", self.origin ); + self.monkey.angles = self.angles; + self.monkey SetModel( "c_zombie_monkey" ); + self.monkey.animname = "monkey"; + self.monkey UseAnimTree( #animtree ); + self.monkey setCanDamage(true); + self.health = 9999; + maps\_zombiemode_weap_shrink_ray::add_shrinkable_object(self.monkey); + self.monkey.location = self; + self.monkey.anim_spot = Spawn("script_model", self.origin); + self.monkey.anim_spot.angles = self.angles; + self.monkey.anim_spot SetModel("tag_origin"); + level.active_monkeys = array_add(level.active_monkeys, self.monkey); + self.monkey monkey_ambient_set_next_sound(); + self.monkey thread monkey_ambient_noise(); + self.monkey thread monkey_ambient_watch_for_power_up(); + self.monkey thread monkey_ambient_wait_to_be_shot(); + self.monkey thread monkey_ambient_idle(); + self.monkey thread monkey_ambient_shrink(); +} +monkey_ambient_idle() +{ + self.anim_spot notify("monkey_stop_loop"); + self.anim_spot thread maps\_anim::anim_loop_aligned( self, "calm_idle", "tag_origin", "monkey_stop_loop" ); + self SetAnimTime( level.scr_anim[ "monkey" ][ "calm_idle"][0], RandomFloat( 0.99 ) ); +} +monkey_ambient_wait_to_be_shot() +{ + self endon("monkey_cleanup"); + self waittill( "damage", damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags ); + if(isdefined(level.cross_bow_bolts)) + { + level.cross_bow_bolts = array_removeUndefined(level.cross_bow_bolts); + for(i=0;i=0; i--) + { + monkey = level.active_monkeys[i]; + monkey thread _monkey_gib(); + monkey thread cleanup_monkey(); + } +} +#using_animtree( "generic_human" ); +_monkey_zombie_grenade_watcher() +{ + self endon( "death" ); + grenade_respond_dist_sq = 120 * 120; + while ( 1 ) + { + if ( is_true( self.monkey_grenade ) ) + { + wait_network_frame(); + continue; + } + if ( level.monkey_grenades.size > 0 ) + { + for ( i = 0; i < level.monkey_grenades.size; i++ ) + { + grenade = level.monkey_grenades[i]; + if ( !isdefined( grenade ) || isdefined( grenade.monkey ) ) + { + wait_network_frame(); + continue; + } + if(isDefined(self.powerup)) + { + wait_network_frame(); + continue; + } + grenade_dist_sq = DistanceSquared( self.origin, grenade.origin ); + if ( grenade_dist_sq <= grenade_respond_dist_sq ) + { + grenade.monkey = self; + self.monkey_grenade = grenade; + self monkey_zombie_grenade_response(); + break; + } + } + } + wait_network_frame(); + } +} +monkey_zombie_grenade_response() +{ + self endon( "death" ); + self notify("end_monkey_steal"); + self monkey_zombie_grenade_pickup(); + self thread _monkey_StealPowerup(); +} +monkey_zombie_grenade_pickup() +{ + self endon( "death" ); + pickup_dist_sq = 32*32; + picked_up = false; + while ( isdefined( self.monkey_grenade ) ) + { + self SetGoalPos( self.monkey_grenade.origin ); + grenade_dist_sq = DistanceSquared( self.origin, self.monkey_grenade.origin ); + if ( grenade_dist_sq <= pickup_dist_sq ) + { + self.monkey_thrower = self.monkey_grenade.thrower; + self.monkey_grenade delete(); + self.monkey_grenade = undefined; + picked_up = true; + } + wait_network_frame(); + } + if ( picked_up ) + { + while ( 1 ) + { + self SetGoalPos( self.monkey_thrower.origin ); + target_dir = self.monkey_thrower.origin - self.origin; + monkey_dir = AnglesToForward( self.angles ); + dot = VectorDot( VectorNormalize( target_dir ), VectorNormalize( monkey_dir ) ); + if ( dot >= 0.5 ) + { + break; + } + wait_network_frame(); + } + self thread monkey_zombie_grenade_throw( self.monkey_thrower ); + self waittill( "throw_done" ); + } +} +monkey_zombie_grenade_throw_watcher( target, animname ) +{ + self endon( "death" ); + self waittillmatch( animname, "grenade_throw" ); + throw_angle = RandomIntRange( 20, 30 ); + dir = VectorToAngles( target.origin - self.origin ); + dir = ( dir[0] - throw_angle, dir[1], dir[2] ); + dir = AnglesToForward( dir ); + velocity = dir * 550; + fuse = RandomFloatRange( 1, 2 ); + hand_pos = self GetTagOrigin( "J_Thumb_RI_1"); + grenade_type = target get_player_lethal_grenade(); + self MagicGrenadeType( grenade_type, hand_pos, velocity, fuse ); +} +monkey_zombie_grenade_throw( target ) +{ + self endon( "death" ); + throw_anim = []; + forward = VectorNormalize( AnglesToForward( self.angles ) ); + end_pos = self.origin + vector_scale( forward, 96 ); + if ( BulletTracePassed( self.origin, end_pos, false, undefined ) ) + { + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_run_01; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_run_02; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_run_03; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_run_04; + } + else + { + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_still_01; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_still_02; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_still_03; + throw_anim[ throw_anim.size ] = %ai_zombie_monkey_grenade_throw_back_still_04; + } + throw_back_anim = throw_anim[ RandomInt( throw_anim.size ) ]; + self animscripted( "throw_back_anim", self.origin, self.angles, throw_back_anim ); + self thread monkey_zombie_grenade_throw_watcher( target, "throw_back_anim" ); + animscripts\traverse\zombie_shared::wait_anim_length( throw_back_anim, .02 ); + self notify( "throw_done" ); +} +monkey_attack_player() +{ + self endon("death"); + self.attack_player = true; + self.attacking_player = true; + players = getplayers(); + self.ignore_player = []; + player = undefined; + if(isDefined(self.player_stole_power_up) && is_player_valid(self.player_stole_power_up)) + { + player = self.player_stole_power_up; + } + if( isDefined( player ) ) + { + self.favoriteenemy = player; + self thread monkey_obvious_vox(); + self _monkey_add_time(); + self thread monkey_pathing(); + self thread monkey_attack_player_wait_wrapper(self.favoriteenemy); + self waittill("end_monkey_attacks"); + } +} +monkey_attack_player_wait_wrapper(player) +{ + self monkey_attack_player_wait(player); + self monkey_stop_attck_player(); +} +monkey_attack_player_wait(player) +{ + self endon( "death" ); + self endon("end_monkey_steal"); + attackTimeEnd = GetTime() + 20000; + while(attackTimeEnd>GetTime()) + { + if(!is_player_valid(player)) + { + break; + } + if(isdefined(self.melee_count) && self.melee_count>=1) + { + break; + } + wait .1; + } +} +monkey_stop_attck_player() +{ + self notify("end_monkey_attacks"); + self.ignoreall = true; + if(IsAlive(self)) + { + self.favoriteenemy = undefined; + self.attacking_player = false; + } +} +monkey_pathing() +{ + self endon( "death" ); + self endon("end_monkey_attacks"); + self.ignoreall = false; + self.pathEnemyFightDist = 64; + self.meleeAttackDist = 64; + while ( IsDefined( self.favoriteenemy) ) + { + self.goalradius = 32; + self OrientMode( "face default" ); + self SetGoalPos( self.favoriteenemy.origin ); + wait_network_frame(); + } +} +monkey_temple_custom_damage( player ) +{ + self endon( "death" ); + damage = self.meleeDamage; + if(!isDefined(self.melee_count)) + { + self.melee_count = 0; + } + self.melee_count++; + if(isDefined(player) && player.score>0) + { + pointsToSteal = int(min(player.score, 50)); + player maps\_zombiemode_score::minus_to_player_score( pointsToSteal ); + } + return damage; +} +monkey_obvious_vox() +{ + self endon( "death" ); + self endon( "end_monkey_attacks" ); + while(1) + { + self playsound( "zmb_stealer_attack" ); + wait(randomfloatrange(2,4)); + } +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_temple_amb.gsc b/BO1/PC/ZM/maps/zombie_temple_amb.gsc new file mode 100644 index 0000000..debbbd1 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_temple_amb.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_temple_debug.gsc b/BO1/PC/ZM/maps/zombie_temple_debug.gsc new file mode 100644 index 0000000..295552e Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_temple_debug.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_temple_elevators.gsc b/BO1/PC/ZM/maps/zombie_temple_elevators.gsc new file mode 100644 index 0000000..fc94a3b --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_temple_elevators.gsc @@ -0,0 +1,411 @@ +#include animscripts\zombie_utility; +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\zombie_temple; +#include maps\zombie_temple_pack_a_punch; +init_elevator() +{ + init_geyser_anims(); + flag_wait( "all_players_connected" ); + init_temple_geyser(); +} +init_temple_geyser() +{ + level.geysers = getEntArray("temple_geyser", "targetname"); + for(i=0; i 0 ) + { + currentGeyser = random(geysers); + currentGeyser thread geyser_start(); + } + level waittill("between_round_over"); + } +} +geyser_start() +{ + self.geyser_active = false; + self thread geyser_watch_for_player(); +} +geyser_watch_for_zombies() +{ + self endon("geyser_end"); + while(1) + { + self waittill("trigger", who); + if( !self.geyser_active ) + { + continue; + } + if(isAI(who)) + { + who zombie_geyser_kill(); + } + } +} +geyser_watch_for_player() +{ + self endon("geyser_end"); + level endon( "intermission" ); + level endon("fake_death"); + while(1) + { + self waittill("trigger", who); + if(!isPlayer(who)) + { + continue; + } + if(who.sessionstate == "spectator") + { + continue; + } + if( !self.geyser_active ) + { + if(who.origin[2] - self.bottom.origin[2] > 70) + { + continue; + } + } + if( self.geyser_active ) + { + who thread player_geyser_move(self); + continue; + } + self playsound("evt_geyser_buildup"); + startTime = GetTime(); + players = get_players(); + while(1) + { + playersTouching = []; + for(i=0; i 1800 ) + { + self thread geyser_activate(playersTouching); + break; + } + wait .1; + } + } +} +geyser_activate(playersTouching) +{ + self geyser_erupt(playersTouching); + wait 5; +} +geyser_erupt(playersTouching) +{ + self.geyser_active=true; + if ( isdefined( self.trigger_dust ) ) + { + self.trigger_dust thread geyser_trigger_dust_activate(); + } + self thread geyser_fx(); + if( isdefined( self.line_emitter ) ) + { + clientnotify( "ge" + self.line_emitter ); + } + for(i=0;i 0 ) + { + self SetVelocity( vel + ( 0, 175, 0 ) ); + } + else + { + self SetVelocity( vel + ( 0, -175, 0 ) ); + } + wait( 0.1 ); + self.riding_geyser = false; +} +player_geyser_move_wait(waitTime) +{ + self endon("death"); + self endon( "player_downed" ); + wait waitTime; +} +geyser_erupt_old(playersTouching) +{ + self.geyser_active=true; + self thread geyser_fx(); + moveUpTime = .5; + moveDownTime = .1; + moveDist = 500; + lift = getEnt("geyser_lift", "targetname"); + wait .1; + start_origin = self.lift.origin; + start_angles = self.lift.angles; + for ( i = 0; i < playersTouching.size; i++ ) + { + playersTouching[i] StartCameraTween(0.1); + playersTouching[i] SetPlayerAngles(self.bottom.angles); + } + self.lift movez(moveDist, moveUpTime, .1, .3); + wait moveUpTime; + bounceTime = .3; + bounceDist = 20; + for(i=0; i<2; i++) + { + self.lift movez(bounceDist, bounceTime, bounceTime/2, bounceTime/2); + wait bounceTime; + self.lift movez(-1 * bounceDist, bounceTime, bounceTime/2, bounceTime/2); + wait bounceTime; + } + self.lift movez(-250, 3, .2, .2); + wait 3; + self.lift notSolid(); + self.lift.angles = start_angles; + self.lift.origin = start_origin; + wait .1; + self.lift Solid(); + wait 5; + self notify("stop_geyser_fx"); + self.geyser_active = false; +} +geyser_fx() +{ + self thread geyser_earthquake(); + fxObj = spawnFX(level._effect["fx_ztem_geyser"], self.bottom.origin ); + TriggerFX(fxObj); + self waittill("stop_geyser_fx"); + wait 5; + fxObj Delete(); +} +geyser_earthquake() +{ + self endon("stop_geyser_fx"); + while(1) + { + Earthquake( 0.2, 0.1, self.origin, 100 ); + wait .1; + } +} +zombie_geyser_kill() +{ + self StartRagdoll(); + self launchragdoll((0,0,1) * 300); + wait_network_frame(); + self dodamage(self.health + 666, self.origin); +} +geyser_blocker_think(blocker) +{ + switch ( self.script_noteworthy ) + { + case "start_geyser": + flag_wait_any("cave02_to_cave_water","cave_water_to_power","cave_water_to_waterfall"); + exploder(8); + geyser_sounds( "geyser02", "evt_water_spout02", "evt_geyser_amb", 1.0 ); + break; + case "minecart_geyser": + flag_wait_any("start_to_pressure", "pressure_to_cave01"); + flag_wait_any("cave01_to_cave02", "pressure_to_cave01"); + exploder(9); + geyser_sounds( "geyser01", "evt_water_spout01", "evt_geyser_amb", 1.0 ); + default: + break; + } + blocker thread geyser_blocker_remove(); + self thread geyser_start(); + self.enabled = true; + level notify("geyser_enabled", self); +} +geyser_sounds( struct_name, sfx_start, sfx_loop, sfx_loop_delay ) +{ + sound_struct = getstruct( struct_name, "targetname" ); + if( IsDefined( sound_struct ) ) + { + level thread play_sound_in_space( sfx_start, sound_struct.origin ); + if( IsDefined( sfx_loop_delay ) && sfx_loop_delay > 0.0 ) + { + wait( sfx_loop_delay ); + } + ambient_ent = Spawn( "script_origin", ( 0, 0, 1 ) ); + if( IsDefined( ambient_ent ) ) + { + ambient_ent.origin = sound_struct.origin; + ambient_ent thread play_loop_sound_on_entity( sfx_loop ); + } + } +} +geyser_blocker_remove() +{ + clip = GetEnt(self.target, "targetname"); + clip Delete(); + struct = spawnstruct(); + struct.origin = self.origin + (0,0,500); + struct.angles = self.angles + (0,180,0); + self.script_noteworthy = "jiggle"; + self.script_firefx = "poltergeist"; + self.script_fxid = "large_ceiling_dust"; + self maps\_zombiemode_blockers::debris_move( struct ); +} +geyser_trigger_dust_activate() +{ + self trigger_on(); + wait( 3 ); + self trigger_off(); +} +geyser_trigger_dust_think() +{ + while(1) + { + self waittill( "trigger", player ); + if ( isdefined( player ) && isdefined( player.geyser_dust_time ) && player.geyser_dust_time > gettime() ) + { + playfx( level._effect["player_land_dust"], player.origin ); + player playsound( "fly_bodyfall_large_dirt" ); + player.geyser_dust_time = 0; + } + } +} +#using_animtree ( "zombie_coast" ); +init_geyser_anims() +{ + level.geyser_anims = []; + level.geyser_anims["player_geyser_stand_crouch"] = %pb_rifle_stand_flinger_flail; + level.geyser_anims["player_geyser_prone"] = %pb_rifle_prone_flinger_flail; + level.geyser_animtree = #animtree; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_temple_ffotd.gsc b/BO1/PC/ZM/maps/zombie_temple_ffotd.gsc new file mode 100644 index 0000000..68b2ee6 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_temple_ffotd.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_temple_magic_box.gsc b/BO1/PC/ZM/maps/zombie_temple_magic_box.gsc new file mode 100644 index 0000000..a5c4627 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_temple_magic_box.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_temple_powerups.gsc b/BO1/PC/ZM/maps/zombie_temple_powerups.gsc new file mode 100644 index 0000000..873c76f Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_temple_powerups.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_temple_spawning.gsc b/BO1/PC/ZM/maps/zombie_temple_spawning.gsc new file mode 100644 index 0000000..e121803 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_temple_spawning.gsc @@ -0,0 +1,627 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_utility_raven; +#include maps\_zombiemode; +temple_init_zone_spawn_locations() +{ + level.main_spawner = GetEnt("main_zombie_spawner", "targetname"); + AssertEX(IsDefined(level.main_spawner), "No spawner defined for map"); + zkeys = GetArrayKeys(level.zones); + for ( z = 0; z < zkeys.size; z++ ) + { + zoneName = zkeys[z]; + zone = level.zones[ zoneName ]; + zone.spawn_locations = []; + spawn_locations = GetStructArray( zone.volumes[0].target, "targetname" ); + for (i = 0; i < spawn_locations.size; i++) + { + loc = spawn_locations[i]; + loc.zone_name = zoneName; + loc.is_enabled = true; + zone.spawn_locations[zone.spawn_locations.size] = loc; + } + } +} +temple_ignore_spawner( spawner ) +{ + if( spawner.classname == "actor_zombie_smoker" ) + { + return true; + } + return false; +} +temple_manage_zones(zkeys) +{ + player_on_waterslide = false; + players = GetPlayers(); + for ( i = 0; i < players.size && !player_on_waterslide; i++ ) + { + player_on_waterslide = IsDefined(players[i].is_on_waterslide) && players[i].is_on_waterslide; + } + if ( player_on_waterslide ) + { + caves1_zone = level.zones["caves1_zone"]; + if ( IsDefined(caves1_zone) && caves1_zone.is_enabled ) + { + caves1_zone.is_active = true; + caves1_zone.is_occupied = true; + } + } + if ( IsDefined(level.minecart_force_zone_active) && level.minecart_force_zone_active ) + { + waterfall_zone = level.zones["waterfall_lower_zone"]; + if ( IsDefined(waterfall_zone) ) + { + waterfall_zone.is_active = true; + waterfall_zone.is_occupied = true; + } + } +} +temple_create_spawner_list( zkeys ) +{ + temple_manage_zones(zkeys); + level.enemy_spawns = []; + level.enemy_spawn_locations = []; + level.enemy_dog_locations = []; + level.zombie_rise_spawners = []; + level.zombie_fall_spawners = []; + level.monkey_spawns = []; + for( z=0; z 0 ) + { + level.monkey_spawns[level.monkey_spawns.size] = spawner; + } + } + } + } + } +} +temple_round_prestart() +{ + if ( GetDvarInt( #"zombie_fall_test") ) + { + level.round_spawn_func = maps\_zombiemode_ai_faller::round_spawning_fall_test; + } + wait(2); +} +temple_round_spawning() +{ + level endon( "intermission" ); + level endon( "end_of_round" ); + level endon( "restart_round" ); + if( level.intermission ) + { + return; + } + ai_calculate_health( level.round_number ); + count = 0; + players = get_players(); + for( i = 0; i < players.size; i++ ) + { + players[i].zombification_time = 0; + } + max = level.zombie_vars["zombie_max_ai"]; + multiplier = level.round_number / 5; + if( multiplier < 1 ) + { + multiplier = 1; + } + if( level.round_number >= 10 ) + { + multiplier *= level.round_number * 0.15; + } + player_num = get_players().size; + if( player_num == 1 ) + { + max += int( ( 0.5 * level.zombie_vars["zombie_ai_per_player"] ) * multiplier ); + } + else + { + max += int( ( ( player_num - 1 ) * level.zombie_vars["zombie_ai_per_player"] ) * multiplier ); + } + if( !isDefined( level.max_zombie_func ) ) + { + level.max_zombie_func = ::default_max_zombie_func; + } + if ( !(IsDefined( level.kill_counter_hud ) && level.zombie_total > 0) ) + { + level.zombie_total = [[ level.max_zombie_func ]]( max ); + } + if ( level.round_number < 10 ) + { + level thread zombie_speed_up_temple(); + } + mixed_spawns = 0; + _update_napalm_variables(); + _update_monkey_variables(); + _update_sonic_variables(); + level.special_zombie_spawned_this_round = false; + old_spawn = undefined; + while( 1 ) + { + while( get_enemy_count() > 31 || level.zombie_total <= 0 ) + { + wait( 0.1 ); + } + if ( !flag("spawn_zombies" ) ) + { + flag_wait( "spawn_zombies" ); + } + if ( level.enemy_spawn_locations.size < 1 || !IsDefined(level.main_spawner) ) + { + ASSERTMSG( "No active spawners in the map. Check to see if the zone is active and if it's pointing to spawners." ); + return; + } + spawn_point = level.enemy_spawn_locations[RandomInt(level.enemy_spawn_locations.size)]; + if( !IsDefined( old_spawn ) ) + { + old_spawn = spawn_point; + } + else if( Spawn_point == old_spawn ) + { + spawn_point = level.enemy_spawn_locations[RandomInt( level.enemy_spawn_locations.size )]; + } + old_spawn = spawn_point; + ai = _try_spawn_napalm(spawn_point); + if ( !IsDefined(ai) ) + { + ai = _try_spawn_monkey(); + } + if ( !IsDefined(ai) ) + { + ai = _try_spawn_sonic(spawn_point); + } + if ( !IsDefined(ai) ) + { + ai = _try_spawn_zombie(spawn_point); + } + if( IsDefined( ai ) ) + { + level.zombie_total--; + ai thread round_spawn_failsafe(); + count++; + } + wait( level.zombie_vars["zombie_spawn_delay"] ); + wait_network_frame(); + } +} +_setup_spawner(spawn_point) +{ + level.main_spawner.script_string = spawn_point.script_string; +} +zombie_speed_up_temple() +{ + if( level.round_number <= 3 ) + { + return; + } + level endon( "intermission" ); + level endon( "end_of_round" ); + level endon( "restart_round" ); + while ( level.zombie_total > 4 ) + { + wait( 2.0 ); + } + num_zombies = get_enemy_count(); + while( num_zombies > 3 ) + { + wait( 2.0 ); + num_zombies = get_enemy_count(); + } + zombies = GetAiSpeciesArray( "axis", "all" ); + while( zombies.size > 0 ) + { + if( zombies.size == 1 && is_true(zombies[0].has_legs) ) + { + if ( !zombies[0] maps\zombie_temple_traps::zombie_on_mud() ) + { + var = randomintrange(1, 4); + zombies[0] set_run_anim( "sprint" + var ); + zombies[0].run_combatanim = level.scr_anim[zombies[0].animname]["sprint" + var]; + zombies[0].zombie_move_speed = "sprint"; + } + } + wait(0.5); + zombies = GetAiSpeciesArray( "axis", "all" ); + } +} +temple_round_wait() +{ + wait( 1 ); + while( get_enemy_count() || level.zombie_total > 0 || level.intermission ) + { + if( flag( "end_round_wait" ) ) + { + return; + } + wait( 1.0 ); + } +} +enemies_still_alive() +{ + enemies = []; + enemies = GetAiSpeciesArray( "axis", "all" ); + for( i = 0; i < enemies.size; i++ ) + { + if( isDefined( enemies[i].animname ) && enemies[i].animname != "monkey_zombie" ) + { + return true; + } + } + return false; +} +_update_napalm_variables() +{ + level.zombiesLeftBeforeNapalmSpawn = RandomIntRange(int(level.zombie_total*0.25), int(level.zombie_total*0.75)); +} +_try_spawn_napalm(spawn_point) +{ + if( !IsDefined(level.napalmZombiesEnabled) || level.napalmZombiesEnabled == false || level.napalm_zombie_spawners.size == 0 ) + { + return undefined; + } + if(isDefined(level.napalmZombieCount) && level.napalmZombieCount>0) + { + return undefined; + } + if(level.special_zombie_spawned_this_round) + { + return undefined; + } + ai = undefined; + if ( _can_spawn_napalm() ) + { + spawner = level.napalm_zombie_spawners[0]; + spawnpoint = _get_special_spawn_point(); + if ( !IsDefined(spawnpoint) ) + { + return undefined; + } + spawnOrigin = spawnpoint.origin; + if(isDefined(spawnOrigin)) + { + spawner.target = ""; + spawner.script_string = "zombie_chaser"; + spawner.origin = spawnOrigin; + } + else + { + spawnOrigin = spawn_point.origin; + spawner.target = spawn_point.target; + } + ai = spawn_zombie( spawner ); + spawner.script_string = undefined; + spawner.count = 100; + spawner.last_spawn_time = GetTime(); + if ( !spawn_failed(ai) ) + { + ai ForceTeleport(spawnOrigin, spawn_point.angles); + level.special_zombie_spawned_this_round = true; + } + } + return ai; +} +_get_non_visible_spawn_point() +{ + players = get_players(); + player = random(players); + barriers = player maps\zombie_temple_ai_monkey::ent_GatherValidBarriers(undefined, false, true); + for(i=0;i level.round_number) && !forceSpawn ) + { + return false; + } + spawnPoint = _get_special_spawn_point(); + if ( !IsDefined(spawnPoint) ) + { + return false; + } + if(forceSpawn) + { + return true; + } + return level.zombie_total < level.zombiesLeftBeforeNapalmSpawn; +} +_update_monkey_variables() +{ + level.monkeysSpawnedThisRound = 0; + level.zombiesLeftBeforeMonkeySpawn = RandomIntRange(int(level.zombie_total*0.75), level.zombie_total); + level.monkey_zombie_health = level.zombie_health; +} +_try_spawn_monkey() +{ + if ( !IsDefined(level.monkey_spawns) || level.monkey_spawns.size == 0 ) + { + return undefined; + } + ai = undefined; + if ( _can_spawn_monkey() ) + { + spawner = level.monkey_spawns[RandomInt(level.monkey_spawns.size)]; + ai = spawner StalingradSpawn(); + if ( !spawn_failed(ai) ) + { + ai maps\zombie_temple_ai_monkey::monkey_TempleThink(spawner); + level.monkeysSpawnedThisRound++; + } + } + return ai; +} +_can_spawn_monkey() +{ + return false; +} +_update_sonic_variables() +{ + level.zombiesLeftBeforeSonicSpawn = RandomIntRange(int(level.zombie_total*0.25), int(level.zombie_total*0.75)); +} +_try_spawn_sonic(spawn_point) +{ + if( !IsDefined(level.sonicZombiesEnabled) || level.sonicZombiesEnabled == false || level.sonic_zombie_spawners.size == 0 ) + { + return undefined; + } + if(isDefined(level.sonicZombieCount) && level.sonicZombieCount>0) + { + return undefined; + } + if(level.special_zombie_spawned_this_round) + { + return undefined; + } + ai = undefined; + if ( _can_spawn_sonic() ) + { + spawner = level.sonic_zombie_spawners[0]; + spawnpoint = _get_special_spawn_point(); + if ( !IsDefined(spawnpoint) ) + { + return undefined; + } + spawnOrigin = spawnpoint.origin; + if(isDefined(spawnOrigin)) + { + spawner.target = ""; + spawner.script_string = "zombie_chaser"; + spawner.origin = spawnOrigin; + } + else + { + spawnOrigin = spawn_point.origin; + spawner.target = spawn_point.target; + } + ai = spawn_zombie( spawner ); + spawner.script_string = undefined; + spawner.count = 100; + spawner.last_spawn_time = GetTime(); + if ( !spawn_failed(ai) ) + { + ai ForceTeleport(spawnOrigin, spawn_point.angles); + level.special_zombie_spawned_this_round = true; + } + } + return ai; +} +_can_spawn_sonic() +{ + if ( GetDvarInt("zombiemode_debug_sonic") != 0 ) + { + return true; + } + if ( level.nextSonicSpawnRound > level.round_number ) + { + return false; + } + return level.zombie_total < level.zombiesLeftBeforeSonicSpawn; +} +_try_spawn_zombie(spawn_point) +{ + level.main_spawner.script_string = spawn_point.script_string; + level.main_spawner.target = spawn_point.target; + level.main_spawner.zone_name = spawn_point.zone_name; + ai = spawn_zombie( level.main_spawner ); + level.main_spawner.count = 100; + level.main_spawner.last_spawn_time = GetTime(); + if ( !spawn_failed(ai) ) + { + ai ForceTeleport(spawn_point.origin, spawn_point.angles); + } + return ai; +} +zombie_tracking_init() +{ + flag_wait( "all_players_connected" ); + while(true) + { + zombies = GetAIArray("axis"); + if(!IsDefined(zombies)) + { + break; + } + else + { + for (i = 0; i < zombies.size; i++) + { + zombies[i] thread delete_zombie_noone_looking(1500); + } + } + wait(10); + } +} +delete_zombie_noone_looking(how_close) +{ + self endon( "death" ); + if(!IsDefined(how_close)) + { + how_close = 1000; + } + self.inview = 0; + self.player_close = 0; + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + if(players[i].sessionstate == "spectator") + { + continue; + } + can_be_seen = self player_can_see_me(players[i]); + if(can_be_seen) + { + self.inview++; + } + else + { + dist = Distance(self.origin, players[i].origin); + if(dist < how_close) + { + self.player_close++; + } + } + } + wait_network_frame(); + if(self.inview == 0 && self.player_close == 0 ) + { + if(!IsDefined(self.animname) || (IsDefined(self.animname) && self.animname != "zombie")) + { + return; + } + if(IsDefined(self.electrified) && self.electrified == true) + { + return; + } + if( self.health != level.zombie_health ) + { + return; + } + else + { + if(IsDefined(self.in_the_ground) && self.in_the_ground == true) + { + return; + } + if(IsDefined(self.in_the_ceiling) && self.in_the_ceiling == true) + { + return; + } + level.zombie_total++; + self maps\_zombiemode_spawner::reset_attack_spot(); + self notify("zombie_delete"); + self Delete(); + } + } +} +player_can_see_me( player ) +{ + playerAngles = player getplayerangles(); + playerForwardVec = AnglesToForward( playerAngles ); + playerUnitForwardVec = VectorNormalize( playerForwardVec ); + banzaiPos = self.origin; + playerPos = player GetOrigin(); + playerToBanzaiVec = banzaiPos - playerPos; + playerToBanzaiUnitVec = VectorNormalize( playerToBanzaiVec ); + forwardDotBanzai = VectorDot( playerUnitForwardVec, playerToBanzaiUnitVec ); + angleFromCenter = ACos( forwardDotBanzai ); + playerFOV = GetDvarFloat( #"cg_fov" ); + banzaiVsPlayerFOVBuffer = GetDvarFloat( #"g_banzai_player_fov_buffer" ); + if ( banzaiVsPlayerFOVBuffer <= 0 ) + { + banzaiVsPlayerFOVBuffer = 0.2; + } + playerCanSeeMe = ( angleFromCenter <= ( playerFOV * 0.5 * ( 1 - banzaiVsPlayerFOVBuffer ) ) ); + return playerCanSeeMe; +} + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_temple_sq.gsc b/BO1/PC/ZM/maps/zombie_temple_sq.gsc new file mode 100644 index 0000000..d9a5eff --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_temple_sq.gsc @@ -0,0 +1,1108 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_sidequests; +init() +{ + PreCacheModel("p_ztem_skeleton"); + PreCacheModel("p_ztem_meteorite_small"); + PreCacheModel("p_ztem_meteorite"); + flag_init("pap_override"); + flag_init("radio_9_played"); + flag_init("gongs_resonating"); + flag_init("trap_destroyed"); + flag_init("radio_7_played"); + flag_init("meteorite_shrunk"); + flag_init("doing_bounce_around"); + level._crystal_bounce_paths = []; + level._crystal_bounce_paths[1] = array(2,4,3,5,6, "R"); + level._crystal_bounce_paths[2] = array(1,2,3,4,1, "R"); + level._crystal_bounce_paths[3] = array(4,3,1,3,5, "R"); + level._crystal_bounce_paths[4] = array(1,3,2,6,5, "R"); + level._crystal_bounce_paths[5] = array(6,5,6,1,3,5, "R"); + level._crystal_bounce_paths[6] = array(5,6,1,4,2,1,3, "M"); + PreCacheModel("p_ztem_crystal_and_holder"); + PreCacheModel("p_ztem_crystal_holder"); + PreCacheModel("p_ztem_dynamite"); + PreCacheModel("p_ztem_temple_wall_broken"); + PreCacheModel("p_ztem_temple_wall_solid"); + maps\zombie_temple_sq_brock::init(); + maps\zombie_temple_sq_skits::init_skits(); + declare_sidequest("sq", ::init_sidequest, undefined, ::complete_sidequest, ::generic_stage_start, ::generic_stage_complete); + declare_sidequest_asset("sq", "sq_sundial", ::sundial_monitor); + declare_sidequest_asset("sq", "sq_sundial_button", ::sundial_button); + declare_sidequest_asset("sq", "sq_ptt_dial", ::ptt_dial_handler); + declare_sidequest_asset("sq", "sq_bttp2_dial", ::bttp2_dial_handler); + declare_sidequest_asset("sq", "sq_spiketrap"); + declare_sidequest_asset_from_struct("sq", "sq_crystals", ::crystal_handler); + declare_sidequest_asset("sq", "sq_gong", ::gong_handler, ::gong_trigger_handler); + declare_sidequest_icon("sq", "vril", "zom_hud_icon_vril"); + declare_sidequest_icon( "sq", "dynamite", "zom_hud_icon_dynamite" ); + declare_sidequest_icon( "sq", "anti115", "zom_hud_icon_meteor" ); + maps\zombie_temple_sq_oafc::init(); + maps\zombie_temple_sq_dgcwf::init(); + maps\zombie_temple_sq_lgs::init(); + maps\zombie_temple_sq_ptt::init(); + maps\zombie_temple_sq_std::init(); + maps\zombie_temple_sq_bttp::init(); + maps\zombie_temple_sq_bttp2::init(); + maps\zombie_temple_sq_bag::init(); + level._num_gongs = 0; + randomize_gongs(); + precache_sidequest_assets(); + trig = GetEnt("sq_dgcwf_trig", "targetname"); + trig trigger_off(); + level thread gong_watcher(); + level._sq_perk_array = array("specialty_armorvest","specialty_quickrevive","specialty_fastreload","specialty_rof","specialty_longersprint","specialty_flakjacket","specialty_deadshot"); + if ( isdefined( level.zombie_additionalprimaryweapon_machine_origin ) ) + { + level._sq_perk_array = array_add( level._sq_perk_array, "specialty_additionalprimaryweapon" ); + } +} +randomize_gongs() +{ + gongs = GetEntArray("sq_gong", "targetname"); + gongs = array_randomize(gongs); + for(i = 0; i < gongs.size; i ++) + { + if(i < 4) + { + gongs[i].right_gong = true; + } + else + { + gongs[i].right_gong = false; + } + } +} +watch_for_respawn() +{ + self endon("disconnect"); + while(1) + { + self waittill_either( "spawned_player", "player_revived" ); + waittillframeend; + self SetMaxHealth( level.zombie_vars["zombie_perk_juggernaut_health"] ); + } +} +reward() +{ + level notify("temple_sidequest_achieved"); + self add_sidequest_icon("sq", "anti115"); + for(i = 0; i < level._sq_perk_array.size; i ++) + { + if(!self HasPerk(level._sq_perk_array[i])) + { + self playsound( "evt_sq_bag_gain_perks" ); + self maps\_zombiemode_perks::give_perk(level._sq_perk_array[i]); + wait(0.25); + } + } + self._retain_perks = true; + self thread watch_for_respawn(); +} +raise_all_crystals() +{ + while(0 == GetDvarInt(#"scr_raise_crystals")) + { + wait(0.1); + } + level notify("raise_crystal_1"); + level notify("raise_crystal_2"); + level notify("raise_crystal_3"); + level notify("raise_crystal_4"); + level notify("raise_crystal_5"); + level notify("raise_crystal_6"); +} +gong_watcher() +{ + if(IsDefined(level._gong_watcher_running)) + { + return; + } + level._gong_watcher_running = true; + level thread watch_for_gongs_gone_bad(); + while(1) + { + flag_wait("gongs_resonating"); + for(i = 0; i < level._raised_crystals.size; i ++) + { + if(level._raised_crystals[i]) + { + exploder(500 + i + 1); + wait_network_frame(); + } + } + while(flag("gongs_resonating")) + { + wait(0.1); + } + for(i = 0; i < level._raised_crystals.size; i ++) + { + stop_exploder(500 + i + 1); + wait_network_frame(); + } + } +} +watch_for_gongs_gone_bad() +{ + while(1) + { + level waittill("wrong_gong"); + for(i = 0; i < level._raised_crystals.size; i ++) + { + if(level._raised_crystals[i]) + { + exploder(510 + i + 1); + wait_network_frame(); + } + } + wait 1.0; + flag_clear("gongs_resonating"); + wait 6; + for(i = 0; i < level._raised_crystals.size; i ++) + { + stop_exploder(510 + i + 1); + wait_network_frame(); + } + } +} +force_eclipse_watcher() +{ + while(1) + { + while(0 == GetDvarInt(#"scr_force_eclipse")) + { + wait(0.1); + } + back_to_the_eclipse(); + reveal_meteor(); + while(1 == GetDvarInt(#"scr_force_eclipse")) + { + wait(0.1); + } + back_to_the_future(); + hide_meteor(); + } +} +gong_trigger_handler() +{ + while(1) + { + self waittill("damage", amount, attacker, dir, point, mod); + if(isplayer( attacker ) && mod == "MOD_MELEE") + { + self.owner_ent notify("triggered", attacker); + } + } +} +gong_handler() +{ + self thread maps\zombie_temple_sq_bag::dud_gong_handler(); +} +ptt_dial_handler() +{ + self thread maps\zombie_temple_sq_ptt::dud_dial_handler(); +} +bttp2_dial_handler() +{ + self thread maps\zombie_temple_sq_bttp2::dud_dial_handler(); +} +start_temple_sidequest() +{ + hide_meteor(); + flag_wait("all_players_connected"); + sidequest_start("sq"); +} +restart_sundial_monitor() +{ + level endon("kill_sundial_monitor"); + level waittill("reset_sundial"); + wait(0.1); + self thread sundial_monitor(); +} +spin_dial(duration, multiplier) +{ + if(!IsDefined(duration)) + { + duration = 2.0; + } + if(!IsDefined(multiplier)) + { + multiplier = 1.3; + } + spin_time = 0.1; + while(spin_time < duration) + { + self playloopsound( "evt_sq_gen_sundial_spin", .5 ); + self RotatePitch( 180, spin_time ); + wait(spin_time * 0.95); + spin_time *= multiplier; + } + self stoploopsound( 2 ); +} +short_dial_spin() +{ + spin_dial(1.0, 1.6); +} +sundial_monitor() +{ + level endon("reset_sundial"); + level endon( "end_game" ); + self.dont_rethread = true; + self thread restart_sundial_monitor(); + if(!IsDefined(self.original_pos)) + { + self.original_pos = self.origin - AnglesToUp(self.angles); + self.off_pos = self.original_pos - (AnglesToUp(self.angles) * 34); + } + self.origin = self.off_pos; + level._sundial_buttons_pressed = 0; + level._stage_active = false; + level._sundial_active = false; + flag_wait("power_on"); + level notify("kill_buttons"); + wait(0.05); + buttons = GetEntArray("sq_sundial_button", "targetname"); + array_thread(buttons, ::sundial_button); + while(1) + { + while(level._sundial_buttons_pressed < 4) + { + wait(0.1); + } + level._sundial_active = true; + self playsound( "evt_sq_gen_transition_start" ); + self playsound( "evt_sq_gen_sundial_emerge" ); + self moveto(self.original_pos, 0.25); + self waittill("movedone"); + self thread spin_dial(); + wait(0.5); + stage = sidequest_start_next_stage("sq"); + level notify("stage_starting"); + amount = 34/4; + level waittill("timed_stage_75_percent"); + self playsound( "evt_sq_gen_sundial_timer" ); + self moveto(self.origin - (AnglesToUp(self.angles) * amount), 1); + self thread short_dial_spin(); + level waittill("timed_stage_50_percent"); + self playsound( "evt_sq_gen_sundial_timer" ); + self moveto(self.origin - (AnglesToUp(self.angles) * amount), 1); + self thread short_dial_spin(); + level waittill("timed_stage_25_percent"); + self playsound( "evt_sq_gen_sundial_timer" ); + self moveto(self.origin - (AnglesToUp(self.angles) * amount), 1); + self thread short_dial_spin(); + level waittill("timed_stage_10_seconds_to_go"); + self thread play_one_second_increments(); + self moveto(self.origin - (AnglesToUp(self.angles) * amount), 10); + self thread spin_dial(); + self waittill("movedone"); + level._sundial_active = false; + wait(0.1); + } +} +play_one_second_increments() +{ + level endon("sidequest_sq_complete"); + level endon("reset_sundial"); + while( level._sundial_active == true ) + { + self playsound( "evt_sq_gen_sundial_timer" ); + wait(1); + } +} +sundial_button_already_pressed_by(who, buttons) +{ + for(i = 0; i < buttons.size; i ++) + { + if(IsDefined(buttons[i].triggering_player) && buttons[i].triggering_player == who) + { + return true; + } + } + return false; +} +sundial_button() +{ + level endon("stage_starting"); + level endon("kill_buttons"); + if(!IsDefined(self.dont_rethread)) + { + self.dont_rethread = true; + self.on_pos = self.origin - AnglesToUp(self.angles); + self.off_pos = self.on_pos - (AnglesToUp(self.angles) * 5.5); + self moveto(self.off_pos,0.01); + } + if(IsDefined(self.trigger)) + { + self.trigger Delete(); + self.trigger = undefined; + } + self.triggering_player = undefined; + flag_wait("power_on"); + self moveto(self.on_pos, 0.25); + self waittill("movedone"); + buttons = GetEntArray("sq_sundial_button", "targetname"); + offset = (AnglesToForward(self.angles) * 5) - (0,0,16); + self.trigger = Spawn( "trigger_radius_use", self.on_pos + offset, 0, 48, 32 ); + self.trigger SetCursorHint( "HINT_NOICON" ); + self.trigger.radius = 48; + while(1) + { + self.trigger waittill("trigger", who); + if(sundial_button_already_pressed_by(who, buttons)) + { + continue; + } + if(!level._stage_active && level._buttons_can_reset) + { + self.triggering_player = who; + level._sundial_buttons_pressed ++; + self playsound( "evt_sq_gen_button" ); + self moveto(self.off_pos, 0.25); + delay = 1; + wait(delay); + while(level._sundial_active) + { + wait(0.1); + } + self.triggering_player = undefined; + self moveto(self.on_pos, 0.25); + if(level._sundial_buttons_pressed > 0) + { + level._sundial_buttons_pressed --; + } + } + } +} +#using_animtree("fxanim_props_dlc4"); +init_gongs() +{ + gongs = GetEntArray("sq_gong", "targetname"); + gongs = array_randomize(gongs); + for(i = 0; i < gongs.size; i ++) + { + gongs[i] UseAnimTree(#animtree); + name = "gong" + i; + gongs[i].animname = name; + level.scr_anim[name]["ring"] = %viewmodel_fxanim_zom_ztem_gong_anim; + } +} +init_sidequest() +{ + level._buttons_can_reset = true; + if(!IsDefined(level._sidequest_firsttime)) + { + back_to_the_future(); + level._sidequest_firsttime = false; + } + players = get_players(); + for(i = 0; i < players.size; i ++) + { + entnum = players[i] GetEntityNumber(); + if( IsDefined( players[i].zm_random_char ) ) + { + entnum = players[i].zm_random_char; + } + if((entnum == 3) && maps\_zombiemode::is_sidequest_previously_completed("COTD")) + { + players[i] add_sidequest_icon("sq", "vril"); + break; + } + } + maps\zombie_temple_sq_brock::create_radio(1); + init_gongs(); + wall = GetEnt("sq_wall", "targetname"); + wall SetModel("p_ztem_temple_wall_solid"); + crystals = GetEntArray("sq_crystals", "targetname"); + level._raised_crystals = []; + for(i = 0; i < crystals.size; i ++) + { + level._raised_crystals[i] = 0; + } + trap = GetEnt("sq_spiketrap", "targetname"); + trap Show(); + flag_clear("radio_4_played"); + flag_clear("radio_7_played"); + flag_clear("radio_9_played"); + flag_clear("meteorite_shrunk"); + meteorite = GetEnt("sq_meteorite", "targetname"); + meteorite SetModel("p_ztem_meteorite"); + meteorite Hide(); + if(!IsDefined(meteorite.original_origin)) + { + meteorite.original_origin = meteorite.origin; + meteorite.original_angles = meteorite.angles; + } + meteorite.origin = meteorite.original_origin; + meteorite.angles = meteorite.original_angles; + anti115 = GetEnt("sq_anti_115", "targetname"); + anti115 Show(); + level thread pap_watcher(); +} +pap_watcher() +{ + level notify("only_one_pap_watcher"); + level endon("only_one_pap_watcher"); + while(1) + { + flag_wait("pap_override"); + while(flag("pack_machine_in_use")) + { + wait(0.1); + } + level thread pack_a_punch_hide(); + while(flag("pap_override")) + { + wait(0.1); + } + level thread pack_a_punch_show(); + } +} +cheat_complete_stage() +{ + level endon("reset_sundial"); + while(1) + { + if(GetDvar("cheat_sq") != "") + { + if(IsDefined(level._last_stage_started )) + { + SetDvar("cheat_sq", ""); + stage_completed("sq", level._last_stage_started); + } + } + wait(0.1); + } +} +generic_stage_start() +{ + level._stage_active = true; + back_to_the_eclipse(); + reveal_meteor(); +} +generic_stage_complete() +{ + level notify("reset_sundial"); + level._stage_active = false; + back_to_the_future(); + hide_meteor(); +} +complete_sidequest() +{ + level notify("kill_sundial_monitor"); + level notify("reset_sundial"); + level notify("kill_buttons"); + level thread sidequest_done(); +} +spin_115() +{ + self endon("picked_up"); + while(1) + { + self RotateYaw(180,0.4); + wait(0.4); + } +} +sidequest_done() +{ + wall = GetEnt("sq_wall", "targetname"); + wall SetModel("p_ztem_temple_wall_broken"); + wall NotSolid(); + anti115 = GetEnt("sq_anti_115", "targetname"); + anti115 thread spin_115(); + anti115 PlayLoopSound( "zmb_meteor_loop" ); + exploder(520); + trigger = Spawn( "trigger_radius_use", anti115.origin, 0, 32, 72 ); + trigger SetCursorHint( "HINT_NOICON" ); + trigger.radius = 48; + trigger.height = 72; + while(1) + { + trigger waittill("trigger", who); + if( IsPlayer(who) && !IsDefined(who._has_anti115)) + { + who._has_anti115 = true; + who PlaySound( "zmb_meteor_activate" ); + who thread reward(); + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 7 ); + who thread delayed_loser_response(); + break; + } + else if(IsPlayer(who)) + { + who playsound( "zmb_no_cha_ching" ); + } + } + trigger Delete(); + anti115 stoploopsound( 1 ); + anti115 notify("picked_up"); + level notify("picked_up"); + anti115 Hide(); + stop_exploder(520); + players_far = 0; + players = get_players(); + while(players_far < players.size) + { + players_far = 0; + for(i = 0; i < players.size; i ++) + { + if(distance2dsquared(players[i].origin, wall.origin) > 360 * 360) + { + players_far ++; + } + } + wait(0.1); + players = get_players(); + } + flag_clear("pap_override"); + level thread reset_sidequest(); +} +delayed_loser_response() +{ + wait(5); + losers = get_players(); + losers = array_remove( losers, self ); + if( losers.size >= 1 ) + { + losers[randomintrange(0,losers.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 8 ); + } +} +reset_sidequest() +{ + sidequest = level._zombie_sidequests["sq"]; + if(sidequest.num_reps >= 3) + { + return; + } + sidequest.num_reps ++; + flag_wait("radio_9_played"); + while(flag("doing_bounce_around")) + { + wait(0.1); + } + stage_names = GetArrayKeys(sidequest.stages); + for(i = 0; i < stage_names.size; i ++) + { + sidequest.stages[stage_names[i]].completed = false; + } + sidequest.last_completed_stage = -1; + sidequest.active_stage = -1; + flag_clear("radio_7_played"); + flag_clear("radio_9_played"); + flag_clear("trap_destroyed"); + randomize_gongs(); + crystals = GetEntArray("sq_crystals", "targetname"); + for(i = 0; i < crystals.size; i ++) + { + if(IsDefined(crystals[i].trigger)) + { + crystals[i].trigger Delete(); + crystals[i] Delete(); + } + } + dynamite = GetEnt("dynamite", "targetname"); + dynamite Delete(); + buttons = GetEntArray("sq_sundial_button", "targetname"); + for(i = 0; i < buttons.size; i ++) + { + if(IsDefined(buttons[i].trigger)) + { + buttons[i].trigger Delete(); + buttons[i].trigger = undefined; + } + } + start_temple_sidequest(); + dial = GetEnt("sq_sundial", "targetname"); + dial thread sundial_monitor(); +} +back_to_the_eclipse() +{ + clientnotify("ec"); +} +back_to_the_future() +{ + clientnotify("db"); +} +reveal_meteor() +{ + ent = GetEnt("sq_meteorite", "targetname"); + if(IsDefined(ent)) + { + ent Show(); + exploder(518); + } +} +hide_meteor() +{ + ent = GetEnt("sq_meteorite", "targetname"); + if(IsDefined(ent)) + { + ent Hide(); + stop_exploder(518); + } +} +spawn_skel() +{ + if(!IsDefined(level._sq_skel)) + { + ent = GetEnt("sq_spiketrap", "targetname"); + if(IsDefined(ent)) + { + sb = Spawn("script_model", ent.origin); + sb.angles = ent.angles; + sb SetModel("p_ztem_skeleton"); + level._sq_skel = sb; + } + } +} +remove_skel() +{ + if(IsDefined(level._sq_skel)) + { + level._sq_skel Delete(); + level._sq_skel = undefined; + } +} +reset_dynamite() +{ + dynamite = GetEnt("dynamite", "targetname"); + dynamite.angles = dynamite.original_angles; + dynamite.origin = dynamite.original_origin; + dynamite Unlink(); + dynamite LinkTo(dynamite.owner_ent, "", dynamite.origin - dynamite.owner_ent.origin, dynamite.angles - dynamite.owner_ent.angles); + dynamite.dropped = undefined; + dynamite Show(); +} +delay_kill_loop_sound_and_delete() +{ + self stoploopsound( .5 ); + wait(0.5); + self Delete(); +} +crystal_handler() +{ + if(IsDefined(self.trigger)) + { + maps\_zombiemode_weap_shrink_ray::remove_shrinkable_object(self.trigger); + self.trigger thread delay_kill_loop_sound_and_delete(); + self.trigger = undefined; + } + if(IsDefined(self.script_noteworthy) && self.script_noteworthy == "dynamite" && !IsDefined(self.dynamite)) + { + dyn_pos = getstruct(self.target, "targetname"); + dynamite = Spawn("script_model", dyn_pos.origin); + dynamite.angles = dyn_pos.angles; + dynamite SetModel("p_ztem_dynamite"); + dynamite.targetname = "dynamite"; + dynamite.target = dyn_pos.target; + dynamite.original_origin = dynamite.origin; + dynamite.original_angles = dynamite.angles; + dynamite.owner_ent = self; + dynamite LinkTo(self, "", dynamite.origin - self.origin, dynamite.angles - self.angles); + self.dynamite = dynamite; + } + if(!IsDefined(self.original_origin)) + { + self.original_origin = self.origin; + } + self DontInterpolate(); + self.origin = self.original_origin - (0,0,154); + self Hide(); + level waittill("raise_crystal_" + self.script_int, actual_stage); + if ( actual_stage ) + { + level notify( "suspend_timer" ); + } + self Show(); + self playsound( "evt_sq_gen_crystal_start" ); + self playloopsound( "evt_sq_gen_crystal_loop", 2 ); + self moveto(self.origin + (0,0,154), 4.0, 0.8, 0.4); + self waittill("movedone"); + self stoploopsound( 1 ); + self playsound( "evt_sq_gen_crystal_end" ); + level notify("raised_crystal_" + self.script_int); + if(IsDefined(self.script_noteworthy) && self.script_noteworthy == "empty_holder") + { + if(IsDefined(actual_stage) && actual_stage) + { + level waittill("crystal_dropped"); + } + self SetModel("p_ztem_crystal_and_holder"); + } + trigger = Spawn( "trigger_damage", self.origin + (0,0,134), 0, 32, 32 ); + trigger.radius = 32; + trigger.height = 32; + trigger thread crystal_trigger_thread(); + trigger.owner_ent = self; + maps\_zombiemode_weap_shrink_ray::add_shrinkable_object(trigger); + self.trigger = trigger; + self thread play_loopsound_while_resonating(); + self thread force_stoploopsound_end(); + level._raised_crystals[self.script_int - 1] = 1; +} +play_loopsound_while_resonating() +{ + self.trigger endon( "death" ); + while(1) + { + flag_wait("gongs_resonating"); + self playloopsound( "evt_sq_bag_crystal_loop", 2 ); + while(flag("gongs_resonating")) + { + wait(0.1); + } + self stoploopsound( .5 ); + } +} +get_crystal_from_script_int(num) +{ + sq = GetEntArray("sq_crystals", "targetname"); + for(i = 0; i < sq.size; i ++) + { + if(sq[i].script_int == num) + { + return sq[i]; + } + } +} +is_crystal_raised(i) +{ + if(IsDefined(level._raised_crystals[i - 1]) && level._raised_crystals[i - 1] == 1) + { + return 1; + } + return 0; +} +bounce_from_a_to_b(a,b,hotsauce) +{ + if(hotsauce) + { + a setclientflag(level._CF_SCRIPTMOVER_CLIENT_FLAG_HOTSAUCE_START); + } + else + { + a setclientflag(level._CF_SCRIPTMOVER_CLIENT_FLAG_WEAKSAUCE_START); + } + b setclientflag(level._CF_SCRIPTMOVER_CLIENT_FLAG_SAUCE_END); + wait_network_frame(); + wait_network_frame(); + wait_network_frame(); + if(IsDefined(a)) + { + a clearclientflag(level._CF_SCRIPTMOVER_CLIENT_FLAG_HOTSAUCE_START); + a clearclientflag(level._CF_SCRIPTMOVER_CLIENT_FLAG_WEAKSAUCE_START); + } + if(IsDefined(b)) + { + b clearclientflag(level._CF_SCRIPTMOVER_CLIENT_FLAG_SAUCE_END); + } +} +do_bounce_off(start, hotsauce) +{ + if(!IsDefined(level._bounce_off_ent)) + { + level._bounce_off_ent = Spawn("script_model", (0,0,0) ); + level._bounce_off_ent SetModel("p_ztem_glyphs_00"); + level._bounce_off_ent Hide(); + } + yaw = randomFloat( 360 ); + r = randomFloatRange( 100, 200); + amntx = cos( yaw ) * r; + amnty = sin( yaw ) * r; + level._bounce_off_ent.origin = start.origin + (amntx, amnty, RandomInt(60)); + level thread bounce_from_a_to_b(start, level._bounce_off_ent, hotsauce); +} +shrink_time() +{ + wait 1.0; + clientnotify( "mts" ); + self playsound( "evt_sq_bag_shrink_meteor" ); + exploder(519); + wait(0.1); + stop_exploder(518); + self Hide(); + wait 0.25; + flag_set("meteorite_shrunk"); + level thread shut_off_all_looping_sounds(); + self playsound( "evt_sq_bag_silence" ); + self playsound( "evt_sq_bag_meteor_fall" ); + self moveto(self.origin - (0,0,120), 2.0, 0.5); + self waittill("movedone"); + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 4 ); +} +crystal_shrink_logic(hotsauce) +{ + level._crystal_shrink_logic_running = true; + flag_set("doing_bounce_around"); + bounce_path = level._crystal_bounce_paths[self.script_int]; + start = self; + end = undefined; + if(IsDefined(bounce_path)) + { + for(i = 0; i < bounce_path.size; i ++) + { + if(string(bounce_path[i]) == "M") + { + if(sidequest_stage_active("sq", "BaG") && !flag("meteorite_shrunk")) + { + ent = GetEnt("sq_meteorite", "targetname"); + if(hotsauce) + { + start playsound( "evt_sq_bag_crystal_bounce_correct" ); + exploder(509); + ent thread shrink_time(); + } + else + { + start playsound( "evt_sq_bag_crystal_bounce_fail" ); + exploder(529); + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 3 ); + } + } + else + { + start playsound( "evt_sq_bag_crystal_bounce_fail" ); + exploder(529); + } + } + else if(string(bounce_path[i]) == "R") + { + start playsound( "evt_sq_bag_crystal_bounce_fail" ); + do_bounce_off(start, hotsauce); + break; + } + else if(is_crystal_raised(bounce_path[i])) + { + end = get_crystal_from_script_int(bounce_path[i]); + start playsound( "evt_sq_bag_crystal_bounce_correct" ); + level thread bounce_from_a_to_b(start, end, hotsauce); + start = end; + } + else + { + start playsound( "evt_sq_bag_crystal_bounce_fail" ); + do_bounce_off(start, hotsauce); + break; + } + wait(0.5); + end playsound( "evt_sq_bag_crystal_hit_" + i ); + if(hotsauce && IsDefined(end) && IsDefined(end.dynamite) && !IsDefined(end.dynamite.dropped) && sidequest_stage_active("sq", "BaG")) + { + end.dynamite thread maps\zombie_temple_sq_bag::fire_in_the_hole(); + } + end playsound( "evt_sq_bag_crystal_charge" ); + if(hotsauce) + { + exploder(end.script_int + 520); + } + else + { + exploder(end.script_int + 530); + } + wait(0.5); + } + } + level._crystal_shrink_logic_running = undefined; + flag_clear("doing_bounce_around"); +} +crystal_shrink_thread() +{ + self endon("death"); + while(1) + { + self waittill("shrunk", hotsauce); + if(!flag("gongs_resonating")) + { + hotsauce = false; + } + if(!IsDefined(level._crystal_shrink_logic_running)) + { + self.owner_ent thread crystal_shrink_logic(hotsauce); + } + } +} +crystal_trigger_thread() +{ + self endon("death"); + self thread crystal_shrink_thread(); + while(1) + { + self waittill("damage", amount, attacker, dir, point, type); + } +} +pack_a_punch_hide() +{ + if(!IsDefined(level._pap_hidden)) + { + level._pap_hidden = 0; + pap_machine_trig = getent("zombie_vending_upgrade","targetname"); + pap_machine_trig enablelinkto(); + } + if(level._pap_hidden) + { + return; + } + level._pap_hidden = 1; + pap_clip = getent("zombie_vending_upgrade_clip","targetname"); + pap_clip notsolid(); + pap_clip ConnectPaths(); + pap_machine_trig = getent("zombie_vending_upgrade","targetname"); + pap_pieces = getentarray(pap_machine_trig.target,"targetname"); + pap_jingle_struct = getstruct("pack_jingle_struct","script_noteworthy"); + if(!IsDefined(pap_jingle_struct.original_origin)) + { + pap_jingle_struct.original_origin = pap_jingle_struct.origin; + pap_machine_trig.original_origin = pap_machine_trig.origin; + } + link_ent = spawn("script_origin",pap_machine_trig.origin); + link_ent.angles = pap_jingle_struct.angles; + pap_machine_trig linkto(link_ent); + level._original_pap_spot = pap_machine_trig.origin; + pap_clip linkto(link_ent); + for(i=0;i= 0) + { + level._num_gongs --; + } + gongs[i] stoploopsound( .5 ); + } + } + gongs[i].ringing = false; + } + level notify( "force_stoploopsound_end" ); + level notify("kill_resonate"); +} +force_stoploopsound_end() +{ + self.trigger endon( "death" ); + level waittill( "force_stoploopsound_end" ); + self stoploopsound( .5 ); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_temple_sq_bag.gsc b/BO1/PC/ZM/maps/zombie_temple_sq_bag.gsc new file mode 100644 index 0000000..a7bafa2 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_temple_sq_bag.gsc @@ -0,0 +1,512 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_sidequests; +init() +{ + flag_init("given_dynamite"); + flag_init("dynamite_chat"); + declare_sidequest_stage("sq", "BaG", ::init_stage, ::stage_logic, ::exit_stage); + set_stage_time_limit("sq", "BaG", 5 * 60); +} +bag_debug() +{ + if(IsDefined(level._debug_bag)) + { + return; + } + if(!IsDefined(level._debug_bag)) + { + level._debug_bag = true; + level._hud_gongs = NewDebugHudElem(); + level._hud_gongs.location = 0; + level._hud_gongs.alignX = "left"; + level._hud_gongs.alignY = "middle"; + level._hud_gongs.foreground = 1; + level._hud_gongs.fontScale = 1.3; + level._hud_gongs.sort = 20; + level._hud_gongs.x = 10; + level._hud_gongs.y = 240; + level._hud_gongs.og_scale = 1; + level._hud_gongs.color = (255,255,255); + level._hud_gongs.alpha = 1; + level._hud_gongs_label = NewDebugHudElem(); + level._hud_gongs_label.location = 0; + level._hud_gongs_label.alignX = "right"; + level._hud_gongs_label.alignY = "middle"; + level._hud_gongs_label.foreground = 1; + level._hud_gongs_label.fontScale = 1.3; + level._hud_gongs_label.sort = 20; + level._hud_gongs_label.x = 0; + level._hud_gongs_label.y = 240; + level._hud_gongs_label.og_scale = 1; + level._hud_gongs_label.color = (255, 255,255); + level._hud_gongs_label.alpha = 1; + level._hud_gongs_label SetText("Gongs: "); + level._ringing = NewDebugHudElem(); + level._ringing.location = 0; + level._ringing.alignX = "left"; + level._ringing.alignY = "middle"; + level._ringing.foreground = 1; + level._ringing.fontScale = 1.3; + level._ringing.sort = 20; + level._ringing.x = 10; + level._ringing.y = 270; + level._ringing.og_scale = 1; + level._ringing.color = (255,255,255); + level._ringing.alpha = 1; + level._ringing_label = NewDebugHudElem(); + level._ringing_label.location = 0; + level._ringing_label.alignX = "right"; + level._ringing_label.alignY = "middle"; + level._ringing_label.foreground = 1; + level._ringing_label.fontScale = 1.3; + level._ringing_label.sort = 20; + level._ringing_label.x = 0; + level._ringing_label.y = 270; + level._ringing_label.og_scale = 1; + level._ringing_label.color = (255, 255,255); + level._ringing_label.alpha = 1; + level._ringing_label SetText("Ringing: "); + level._resonating = NewDebugHudElem(); + level._resonating.location = 0; + level._resonating.alignX = "left"; + level._resonating.alignY = "middle"; + level._resonating.foreground = 1; + level._resonating.fontScale = 1.3; + level._resonating.sort = 20; + level._resonating.x = 10; + level._resonating.y = 300; + level._resonating.og_scale = 1; + level._resonating.color = (255,255,255); + level._resonating.alpha = 1; + level._resonating_label = NewDebugHudElem(); + level._resonating_label.location = 0; + level._resonating_label.alignX = "right"; + level._resonating_label.alignY = "middle"; + level._resonating_label.foreground = 1; + level._resonating_label.fontScale = 1.3; + level._resonating_label.sort = 20; + level._resonating_label.x = 0; + level._resonating_label.y = 300; + level._resonating_label.og_scale = 1; + level._resonating_label.color = (255, 255,255); + level._resonating_label.alpha = 1; + level._resonating_label SetText("Rezanating: "); + } + gongs = GetEntArray("sq_gong", "targetname"); + while(1) + { + if(IsDefined(level._num_gongs)) + { + level._hud_gongs SetValue(level._num_gongs); + } + else + { + level.selected_tile1 SetValue("-1"); + } + gong_text = ""; + for(i = 0; i < gongs.size; i ++) + { + if(IsDefined(gongs[i].ringing) && gongs[i].ringing) + { + gong_text += "x"; + } + else + { + gong_text += "o"; + } + } + level._ringing SetText(gong_text); + if(flag("gongs_resonating")) + { + level._resonating_label SetText("Yes"); + } + else + { + level._resonating_label SetText("No"); + } + wait(0.05); + } +} +init_stage() +{ + maps\zombie_temple_sq_brock::delete_radio(); + level notify("bag_start"); + flag_clear("given_dynamite"); + flag_clear("dynamite_chat"); + gongs = GetEntArray("sq_gong", "targetname"); + array_thread(gongs, ::gong_handler); + level thread give_me_the_boom_stick(); + maps\zombie_temple_sq::reset_dynamite(); + level thread delayed_start_skit(); +} +delayed_start_skit() +{ + wait(.5); + level thread maps\zombie_temple_sq_skits::start_skit("tt8"); +} +dynamite_debug() +{ + self endon("caught"); + while(1) + { + Print3d(self.origin, "+", (0,255,0), 2); + wait(0.1); + } +} +fire_in_the_hole() +{ + self endon("caught"); + self.dropped = true; + self Unlink(); + dest = getstruct(self.target, "targetname"); + level.catch_trig = Spawn( "trigger_radius", self.origin, 0, 24, 10 ); + level.catch_trig EnableLinkTo(); + level.catch_trig LinkTo( self ); + level.catch_trig.owner_ent = self; + level.catch_trig thread butter_fingers(); + self NotSolid(); + self MoveTo( dest.origin, 1.4, 0.2, 0 ); + self waittill("movedone"); + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 5 ); + playsoundatposition( "evt_sq_bag_dynamite_explosion", dest.origin ); + level.catch_trig notify("boom"); + level.catch_trig Delete(); + level.catch_trig = undefined; + stage_failed("sq", "BaG"); +} +butter_fingers() +{ + self endon("boom"); + self endon("death"); + while(1) + { + self waittill("trigger", who); + if(IsDefined(who) && is_player_valid(who)) + { + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 6 ); + who playsound( "evt_sq_bag_dynamite_catch" ); + who._has_dynamite = true; + self.owner_ent notify("caught"); + self.owner_ent Hide(); + who add_sidequest_icon("sq", "dynamite"); + self Delete(); + break; + } + } +} +give_me_the_boom_stick() +{ + level endon("sq_BaG_over"); + wall = GetEnt("sq_wall", "targetname"); + wall Solid(); + flag_wait("meteorite_shrunk"); + player_close = false; + player = undefined; + while(!player_close) + { + players = get_players(); + for(i = 0; i < players.size; i ++) + { + if(distance2dsquared(players[i].origin, wall.origin) < 240 * 240) + { + player_close = true; + player = players[i]; + break; + } + } + wait(0.1); + } + level bag_story_vox_pt1( player ); + flag_set("dynamite_chat"); + level._give_trig = Spawn("trigger_radius_use", wall.origin, 0, 56, 72); + level._give_trig SetCursorHint( "HINT_NOICON" ); + level._give_trig.radius = 48; + level._give_trig.height = 72; + not_given = true; + while(not_given) + { + level._give_trig waittill("trigger", who); + if(IsPlayer(who) && is_player_valid(who) && IsDefined(who._has_dynamite) && who._has_dynamite) + { + who._has_dynamite = undefined; + who remove_sidequest_icon("sq", "dynamite"); + not_given = false; + } + } + level notify("suspend_timer"); + level._give_trig Delete(); + level._give_trig = undefined; + level bag_story_vox_pt2(); + players_far = 0; + players = get_players(); + while(players_far < players.size) + { + players_far = 0; + for(i = 0; i < players.size; i ++) + { + if(distance2dsquared(players[i].origin, wall.origin) > 360 * 360) + { + players_far ++; + } + } + wait(0.1); + players = get_players(); + } + flag_set("given_dynamite"); +} +stage_logic() +{ + flag_wait("meteorite_shrunk"); + flag_set("pap_override"); + flag_wait("dynamite_chat"); + flag_wait("given_dynamite"); + wait(5.0); + stage_completed("sq", "BaG"); +} +exit_stage(success) +{ + if(success) + { + maps\zombie_temple_sq_brock::create_radio(9, maps\zombie_temple_sq_brock::radio9_override); + level._buttons_can_reset = false; + } + else + { + maps\zombie_temple_sq_brock::create_radio(8); + flag_clear("meteorite_shrunk"); + ent = GetEnt("sq_meteorite", "targetname"); + ent.origin = ent.original_origin; + ent.angles = ent.original_angles; + ent SetModel("p_ztem_meteorite"); + maps\zombie_temple_sq::reset_dynamite(); + flag_clear("pap_override"); + level thread maps\zombie_temple_sq_skits::fail_skit(); + } + if(IsDefined(level.catch_trig)) + { + level.catch_trig Delete(); + level.catch_trig = undefined; + } + players = get_players(); + for(i = 0; i < players.size; i ++) + { + if(IsDefined(players[i]._has_dynamite)) + { + players[i]._has_dynamite = undefined; + players[i] remove_sidequest_icon("sq", "dynamite"); + } + } + if(IsDefined(level._give_trig)) + { + level._give_trig Delete(); + } + gongs = GetEntArray("sq_gong", "targetname"); + array_thread(gongs, ::dud_gong_handler); + if( isdefined( level._bag_sound_ent ) ) + { + level._bag_sound_ent delete(); + level._bag_sound_ent = undefined; + } + level.skit_vox_override = false; +} +resonate_runner() +{ + if(!IsDefined(level._resonate_time) || level._resonate_time == 0) + { + level._resonate_time = 60; + } + else + { + level._resonate_time += 60; + return; + } + level endon("wrong_gong"); + flag_set("gongs_resonating"); + while(level._resonate_time) + { + level._resonate_time --; + wait(1.0); + } + flag_clear("gongs_resonating"); +} +gong_resonate( player ) +{ + level endon("kill_resonate"); + self.ringing = true; + if( is_true( self.right_gong ) ) + { + self playloopsound( "evt_sq_bag_gong_correct_loop_" + level._num_gongs, 5 ); + } + else + { + self playsound( "evt_sq_bag_gong_incorrect" ); + } + if(level._num_gongs == 4) + { + level thread resonate_runner(); + } + if( isdefined( player ) && isPlayer( player ) ) + { + if( self.right_gong && level._num_gongs == 1 ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 1 ); + } + else if( self.right_gong && flag("gongs_resonating") ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 2 ); + } + else if( !self.right_gong ) + { + player thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest8", undefined, 0 ); + } + } + if(self.right_gong == false) + { + level notify("wrong_gong"); + level._resonate_time = 0; + gongs = GetEntArray("sq_gong", "targetname"); + for(i = 0; i < gongs.size; i ++) + { + if(gongs[i].right_gong) + { + if(gongs[i].ringing) + { + if(level._num_gongs >= 0) + { + level._num_gongs --; + } + gongs[i] stoploopsound( 5 ); + } + } + gongs[i].ringing = false; + } + level notify("kill_resonate"); + } + wait(60); + if(self.right_gong && level._num_gongs >= 0) + { + level._num_gongs --; + } + self.ringing = false; + self stoploopsound( 5 ); +} +gong_goes_bong(in_stage, player) +{ + if(self.right_gong && level._num_gongs < 4) + { + level._num_gongs ++; + } + self thread gong_resonate( player ); +} +gong_handler() +{ + level endon("sq_BaG_over"); + if(!IsDefined(self.ringing)) + { + self.ringing = false; + } + self thread debug_gong(); + while(1) + { + self waittill("triggered", who); + if(!self.ringing) + { + self playsound( "evt_sq_bag_gong_hit" ); + self gong_goes_bong(true, who); + } + } +} +debug_gong() +{ + level endon("bag_start"); + level endon("sq_BaG_over"); + while(1) + { + if(!self.ringing && self.right_gong) + { + Print3d(self.origin + (0,0,64), "+", (0,255,0), 1); + } + wait(0.1); + } +} +gong_wobble() +{ + if(IsDefined(self.wobble_threaded)) + { + return; + } + self.wobble_threaded = true; + while(1) + { + self waittill("triggered"); + self playsound( "evt_sq_bag_gong_hit" ); + self maps\_anim::anim_single(self, "ring"); + } +} +dud_gong_handler() +{ + level endon("bag_start"); + self thread gong_wobble(); + if(!IsDefined(self.ringing)) + { + self.ringing = false; + } + self thread debug_gong(); + while(1) + { + self waittill("triggered"); + if(!self.ringing) + { + self gong_goes_bong(false); + } + } +} +bag_story_vox_pt1( player ) +{ + level endon("sq_StD_over"); + struct = getstruct( "sq_location_bag", "targetname" ); + if( !isdefined( struct ) ) + { + return; + } + level._bag_sound_ent = spawn( "script_origin", struct.origin ); + level._bag_sound_ent playsound( "vox_egg_story_5_0", "sounddone" ); + level._bag_sound_ent waittill( "sounddone" ); + level._bag_sound_ent playsound( "vox_egg_story_5_1", "sounddone" ); + level._bag_sound_ent waittill( "sounddone" ); + level._bag_sound_ent playsound( "vox_egg_story_5_2", "sounddone" ); + level._bag_sound_ent waittill( "sounddone" ); + if( isdefined( player ) ) + { + level.skit_vox_override = true; + player playsound( "vox_egg_story_5_3" + maps\zombie_temple_sq::get_variant_from_entity_num( player GetEntityNumber() ), "vox_egg_sounddone" ); + player waittill( "vox_egg_sounddone" ); + level.skit_vox_override = false; + } + level._bag_sound_ent playsound( "vox_egg_story_5_4", "sounddone" ); + level._bag_sound_ent waittill( "sounddone" ); + level._bag_sound_ent playsound( "vox_egg_story_5_5", "sounddone" ); + level._bag_sound_ent waittill( "sounddone" ); + level._bag_sound_ent delete(); + level._bag_sound_ent = undefined; +} +bag_story_vox_pt2() +{ + level endon("sq_StD_over"); + struct = getstruct( "sq_location_bag", "targetname" ); + if( !isdefined( struct ) ) + { + return; + } + level._bag_sound_ent = spawn( "script_origin", struct.origin ); + level._bag_sound_ent playsound( "vox_egg_story_5_7", "sounddone" ); + level._bag_sound_ent waittill( "sounddone" ); + level._bag_sound_ent playsound( "vox_egg_story_5_8", "sounddone" ); + level._bag_sound_ent waittill( "sounddone" ); + level._bag_sound_ent delete(); + level._bag_sound_ent = undefined; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_temple_sq_brock.gsc b/BO1/PC/ZM/maps/zombie_temple_sq_brock.gsc new file mode 100644 index 0000000..2c7513e Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_temple_sq_brock.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_temple_sq_dgcwf.gsc b/BO1/PC/ZM/maps/zombie_temple_sq_dgcwf.gsc new file mode 100644 index 0000000..6a37d92 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_temple_sq_dgcwf.gsc @@ -0,0 +1,320 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_sidequests; +init() +{ + flag_init("dgcwf_on_plate"); + flag_init("dgcwf_sw1_pressed"); + flag_init("dgcwf_plot_vo_done"); + level._on_plate = 0; + declare_sidequest_stage("sq", "DgCWf", ::init_stage, ::stage_logic, ::exit_stage); + set_stage_time_limit("sq", "DgCWf", 5 * 60); + declare_stage_asset_from_struct("sq", "DgCWf", "sq_dgcwf_sw1", ::sw1_thread, ::sw1_press); + declare_stage_asset("sq", "DgCWf", "sq_dgcwf_trig", ::plate_trigger); +} +plate_counter() +{ + self endon("death"); + while(1) + { + if(level._on_plate >= 3 && !flag("dgcwf_on_plate")) + { + flag_set("dgcwf_on_plate"); + } + else + { + if(flag("dgcwf_on_plate") && level._on_plate < 3) + { + flag_clear("dgcwf_on_plate"); + } + } + wait(0.05); + } +} +plate_debug() +{ + level endon("sq_DgCWf_over"); + if(!IsDefined(level._debug_plate)) + { + level._debug_plate = true; + level.on_plate_val = NewDebugHudElem(); + level.on_plate_val.location = 0; + level.on_plate_val.alignX = "left"; + level.on_plate_val.alignY = "middle"; + level.on_plate_val.foreground = 1; + level.on_plate_val.fontScale = 1.3; + level.on_plate_val.sort = 20; + level.on_plate_val.x = 10; + level.on_plate_val.y = 240; + level.on_plate_val.og_scale = 1; + level.on_plate_val.color = (255,255,255); + level.on_plate_val.alpha = 1; + level.on_plate_text = NewDebugHudElem(); + level.on_plate_text.location = 0; + level.on_plate_text.alignX = "right"; + level.on_plate_text.alignY = "middle"; + level.on_plate_text.foreground = 1; + level.on_plate_text.fontScale = 1.3; + level.on_plate_text.sort = 20; + level.on_plate_text.x = 0; + level.on_plate_text.y = 240; + level.on_plate_text.og_scale = 1; + level.on_plate_text.color = (255, 255,255); + level.on_plate_text.alpha = 1; + level.on_plate_text SetText("Plate : "); + } + while(1) + { + if(IsDefined(level._on_plate)) + { + level.on_plate_val SetValue(level._on_plate); + } + wait(0.1); + } +} +restart_plate_mon(trig) +{ + trig endon("death"); + level endon("sq_DgCWf_over"); + self waittill("spawned_player"); + self thread plate_monitor(trig); +} +plate_monitor(trig) +{ + self endon("disconnect"); + trig endon("death"); + level endon("sq_DgCWf_over"); + while(1) + { + while(!self IsTouching(trig)) + { + wait(0.1); + } + if(level._on_plate < 4) + { + level._on_plate ++; + } + trig playsound( "evt_sq_dgcwf_plate_" + level._on_plate ); + if( level._on_plate <= 2 && !flag( "dgcwf_sw1_pressed" ) ) + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest2", undefined, 0 ); + } + else + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest2", undefined, 1 ); + } + while(self IsTouching(trig) && self.sessionstate != "spectator") + { + wait(0.05); + } + if(level._on_plate >= 0) + { + level._on_plate --; + } + if(self.sessionstate == "spectator") + { + self thread restart_plate_mon(trig); + return; + } + if( level._on_plate < 3 && !flag( "dgcwf_sw1_pressed" ) ) + { + self thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest2", undefined, 2 ); + } + } +} +plate_trigger() +{ + self endon("death"); + self thread play_success_audio(); + self thread begin_dgcwf_vox(); + self playloopsound( "evt_sq_dgcwf_waterthrash_loop", 2 ); + if(get_players().size == 1) + { + flag_set("dgcwf_on_plate"); + return; + } + self thread plate_counter(); + players = get_players(); + for(i = 0; i < players.size; i ++) + { + players[i] thread plate_monitor(self); + } +} +begin_dgcwf_vox() +{ + self endon("death"); + while(1) + { + self waittill( "trigger", who ); + if( isPlayer(who) ) + { + self stoploopsound( 1 ); + who thread dgcwf_story_vox(); + return; + } + wait(0.05); + } +} +sw1_press() +{ + self endon("death"); + while(1) + { + self waittill("trigger", who ); + who thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest2", undefined, 3 ); + self.owner_ent.pressed = true; + } +} +sw1_thread() +{ + self endon("death"); + self.on_pos = self.origin; + self.off_pos = self.on_pos - (AnglesToRight(self.angles) * 36); + self.origin = self.off_pos; + self.trigger trigger_off(); + self.pressed = false; + while(1) + { + if(flag("dgcwf_on_plate")) + { + self.pressed = false; + self moveto(self.on_pos, 0.25); + self playsound( "evt_sq_dgcwf_lever_kachunk" ); + self waittill("movedone"); + self.trigger trigger_on(); + while(flag("dgcwf_on_plate")) + { + if(self.pressed) + { + self playsound( "evt_sq_dgcwf_lever_success" ); + self RotateRoll(75, 0.15); + self.trigger trigger_off(); + flag_set("dgcwf_sw1_pressed"); + return; + } + wait(0.05); + } + } + else + { + self.pressed = false; + self.trigger trigger_off(); + self playsound( "evt_sq_dgcwf_lever_dechunk" ); + self moveto(self.off_pos, 0.25); + self waittill("movedone"); + while(!flag("dgcwf_on_plate")) + { + wait(0.05); + } + } + wait(0.05); + } +} +init_stage() +{ + level._on_plate = 0; + if(get_players().size > 1) + { + flag_clear("dgcwf_on_plate"); + } + flag_clear("dgcwf_sw1_pressed"); + flag_clear("dgcwf_plot_vo_done"); + trig = GetEnt("sq_dgcwf_trig", "targetname"); + trig trigger_on(); + maps\zombie_temple_sq_brock::delete_radio(); + level thread delayed_start_skit(); +} +delayed_start_skit() +{ + wait(.5); + level thread maps\zombie_temple_sq_skits::start_skit("tt2"); +} +stage_logic() +{ + level endon("sq_DgCWf_over"); + flag_wait("dgcwf_on_plate"); + flag_wait("dgcwf_sw1_pressed"); + level notify( "suspend_timer" ); + level notify("raise_crystal_1"); + level notify("raise_crystal_2", true); + level thread slightly_delayed_player_response(); + level waittill("raised_crystal_2"); + flag_wait("dgcwf_plot_vo_done"); + wait(5); + level thread stage_completed("sq", "DgCWf"); +} +slightly_delayed_player_response() +{ + wait(2.5); + players = get_players(); + players[randomintrange(0,players.size)] thread maps\_zombiemode_audio::create_and_play_dialog( "eggs", "quest2", undefined, 4 ); +} +play_success_audio() +{ + level endon("sq_DgCWf_over"); + flag_wait("dgcwf_on_plate"); + flag_wait("dgcwf_sw1_pressed"); + self playsound( "evt_sq_dgcwf_gears" ); +} +exit_stage(success) +{ + if(IsDefined(level._debug_plate)) + { + level._debug_plate = undefined; + level.on_plate_val Destroy(); + level.on_plate_val = undefined; + level.on_plate_text Destroy(); + level.on_plate_text = undefined; + } + trig = GetEnt("sq_dgcwf_trig", "targetname"); + trig trigger_off(); + if(success) + { + maps\zombie_temple_sq_brock::create_radio(3); + } + else + { + maps\zombie_temple_sq_brock::create_radio(2, maps\zombie_temple_sq_brock::radio2_override); + level thread maps\zombie_temple_sq_skits::fail_skit(); + } + level.skit_vox_override = false; + if( isdefined( level._dgcwf_sound_ent ) ) + { + level._dgcwf_sound_ent delete(); + level._dgcwf_sound_ent = undefined; + } +} +dgcwf_story_vox() +{ + level endon("sq_DgCWf_over"); + struct = getstruct( "sq_location_dgcwf", "targetname" ); + if( !isdefined( struct ) ) + { + return; + } + level._dgcwf_sound_ent = spawn( "script_origin", struct.origin ); + if( isdefined( self ) ) + { + level.skit_vox_override = true; + self playsound( "vox_egg_story_2_0" + maps\zombie_temple_sq::get_variant_from_entity_num( self GetEntityNumber() ), "vox_egg_sounddone" ); + self waittill( "vox_egg_sounddone" ); + level.skit_vox_override = false; + } + level._dgcwf_sound_ent playsound( "vox_egg_story_2_1", "sounddone" ); + level._dgcwf_sound_ent waittill( "sounddone" ); + if( isdefined( self ) ) + { + level.skit_vox_override = true; + self playsound( "vox_egg_story_2_2" + maps\zombie_temple_sq::get_variant_from_entity_num( self GetEntityNumber() ), "vox_egg_sounddone" ); + self waittill( "vox_egg_sounddone" ); + level.skit_vox_override = false; + } + flag_wait("dgcwf_sw1_pressed"); + level._dgcwf_sound_ent playsound( "vox_egg_story_2_3", "sounddone" ); + level._dgcwf_sound_ent waittill( "sounddone" ); + flag_set("dgcwf_plot_vo_done"); + level._dgcwf_sound_ent delete(); + level._dgcwf_sound_ent = undefined; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_temple_sq_lgs.gsc b/BO1/PC/ZM/maps/zombie_temple_sq_lgs.gsc new file mode 100644 index 0000000..117cb83 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_temple_sq_lgs.gsc @@ -0,0 +1,335 @@ + +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_sidequests; +#using_animtree("fxanim_props_dlc4"); +init() +{ + PrecacheVehicle("misc_freefall"); + PreCacheModel("p_ztem_glyphs_00"); + PreCacheModel("fxanim_zom_ztem_crystal_small_mod"); + PreCacheModel("p_ztem_crystal"); + flag_init("meteor_impact"); + level.scr_anim["crystal"]["spin"][0] = %fxanim_zom_ztem_crystal_small_anim; + declare_sidequest_stage("sq", "LGS", ::init_stage, ::stage_logic, ::exit_stage); + set_stage_time_limit("sq", "LGS", 5 * 60); + declare_stage_asset_from_struct("sq", "LGS", "sq_lgs_crystal", ::lgs_crystal); +} +init_stage() +{ + maps\zombie_temple_sq_brock::delete_radio(); + flag_clear("meteor_impact"); + level thread lgs_intro(); +} +lgs_intro() +{ + exploder(600); + wait(4.0); + level thread play_intro_audio(); + exploder(601); + level thread maps\zombie_temple_sq_skits::start_skit("tt3"); + level thread play_nikolai_farting(); + wait(2.0); + wait(1.5); + Earthquake(1, 0.8, get_players()[0].origin, 200); + wait(1.0); + flag_set("meteor_impact"); +} +play_nikolai_farting() +{ + level endon( "sq_LGS_over" ); + wait(2); + players = get_players(); + for(i=0;i 720 * 720) + { + break; + } + wait(0.1); + } + level notify("skit_interupt"); + speaker = get_players()[0]; + if(IsDefined(level._last_skit_line_speaker)) + { + speaker = level._last_skit_line_speaker; + } + if(IsDefined(speaker.speaking_line) && speaker.speaking_line) + { + while(speaker.speaking_line) + { + wait(0.2); + } + } + character = speaker GetEntityNumber(); + if(IsDefined(speaker.zm_random_char)) + { + character = speaker.zm_random_char; + } + num = 5; + if(character == 3) + { + num = 8; + } + snd = "vox_plr_" + character + "_safety_" + RandomIntRange(0, num); + speaker PlaySound(snd, "line_done"); + speaker waittill("line_done"); + level.skit_vox_override = 0; +} +do_skit_line(script_line) +{ + players = get_players(); + speaking_player = players[0]; + for(i = 0; i < players.size; i ++) + { + if(IsDefined(players[i].zm_random_char)) + { + if(players[i].zm_random_char == script_line.character) + { + speaking_player = players[i]; + break; + } + } + else + { + if(players[i] GetEntityNumber() == script_line.character) + { + speaking_player = players[i]; + break; + } + } + } + speaking_player.speaking_line = true; + level._last_skit_line_speaker = speaking_player; + speaking_player PlaySound(script_line.vo, "line_done"); + speaking_player waittill("line_done"); + speaking_player.speaking_line = false; + level notify("line_spoken"); +} +start_skit(skit_name, group) +{ + level endon("skit_interupt"); + script = level._skit_data[skit_name]; + level.skit_vox_override = 1; + level thread skit_interupt(undefined, group); + for(i = 0; i < script.size; i ++) + { + if(i == script.size - 1) + { + level notify("start_skit_done"); + } + level thread do_skit_line(script[i]); + level waittill("line_spoken"); + } + level.skit_vox_override = 0; +} +fail_skit(first_time) +{ + fail_skits = undefined; + if(IsDefined(first_time) && first_time) + { + fail_skits = array(level._skit_data["fail1"]); + } + else + { + fail_skits = array(level._skit_data["fail2"], level._skit_data["fail3"], level._skit_data["fail4"]); + } + players = get_players(); + player_index = 0; + proposed_group = undefined; + while(player_index != players.size) + { + proposed_group = []; + for(i = 0; i < players.size; i ++) + { + if(i == player_index) + { + continue; + } + if(distance2dsquared(players[player_index].origin, players[i].origin) < 360 * 360) + { + proposed_group[proposed_group.size] = players[i]; + } + } + player_index ++; + if(proposed_group.size > 0) + { + break; + } + } + level.skit_vox_override = 1; + skit = fail_skits[RandomIntRange(0, fail_skits.size)]; + if(proposed_group.size > 0) + { + pos = (0,0,0); + for(i = 0; i < proposed_group.size; i ++) + { + pos += proposed_group[i].origin; + } + pos /= proposed_group.size; + level endon("skit_interupt"); + level thread skit_interupt(pos, proposed_group); + for(i = 0; i < proposed_group.size; i ++) + { + level thread do_skit_line(skit[proposed_group[i] GetEntityNumber()]); + level waittill("line_spoken"); + } + } + else + { + player = players[RandomIntRange(0, players.size)]; + level thread do_skit_line(skit[player GetEntityNumber()]); + level waittill("line_spoken"); + } + level.skit_vox_override = 0; +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_temple_sq_std.gsc b/BO1/PC/ZM/maps/zombie_temple_sq_std.gsc new file mode 100644 index 0000000..2028079 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_temple_sq_std.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_temple_traps.gsc b/BO1/PC/ZM/maps/zombie_temple_traps.gsc new file mode 100644 index 0000000..eb2d70c --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_temple_traps.gsc @@ -0,0 +1,1326 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +init_temple_traps() +{ + level thread spear_trap_init(); + level thread waterfall_trap_init(); + level thread init_maze_trap(); +} +trigger_wait_for_power() +{ + self sethintstring( &"ZOMBIE_NEED_POWER" ); + self SetCursorHint("HINT_NOICON"); + self.in_use = 0; + flag_wait( "power_on" ); +} +spear_trap_init() +{ + spearTraps = GetEntArray("spear_trap", "targetname"); + for(i=0; iGetTime()) + { + if(!is_true(self.has_legs)) + { + break; + } + wait .05; + } + while(level._num_ai_released > 2) + { + PrintLn("Spear Trap : Choke"); + wait(0.05); + } + self stopanimscripted(.5); + level._num_ai_released ++; +} +_fake_red() +{ + prompt = NewClientHudElem(self); + prompt.alignX = "left"; + prompt.x = 0; + prompt.y = 0; + prompt.alignX = "left"; + prompt.alignY = "top"; + prompt.horzAlign = "fullscreen"; + prompt.vertAlign = "fullscreen"; + fadeTime = 1.0; + prompt.color = ( 0.2, 0, 0 ); + prompt.alpha = 0.7; + prompt FadeOverTime(fadeTime); + prompt.alpha = 0; + prompt.shader = "white"; + prompt setShader( "white", 640, 480 ); + wait(fadeTime); + prompt Destroy(); +} +spear_trap_is_character_touching(char) +{ + return self isTouching(char); +} +spear_activate(delay) +{ + wait delay; + if(isDefined(self.clip)) + { + self.clip solid(); + self.clip setclientflag(level._CF_SCRIPTMOVER_CLIENT_FLAG_SPIKES); + } + wait(2); + if(isDefined(self.clip)) + { + self.clip notsolid(); + self.clip clearclientflag(level._CF_SCRIPTMOVER_CLIENT_FLAG_SPIKES); + } + wait .2; +} +spear_kill(magnitude) +{ + self StartRagdoll(); + self launchragdoll((0, 0, 50)); + wait_network_frame(); + self.a.gib_ref = "head"; + self dodamage(self.health + 666, self.origin); +} +temple_trap_move_switch() +{ + trap_switch = undefined; + for(i=0; i 6.0 ) + { + remainingTime = activeTime-6.0; + } + while( remainingTime > 0.0 ) + { + Earthquake( 0.14, activeTime, origin, 400 ); + wait( 1.0 ); + remainingTime -= 1.0; + } +} +waterfall_trap_on() +{ + soundStruct = getStruct("waterfall_trap_origin", "targetname"); + if(isDefined(soundStruct)) + { + playsoundatposition("evt_waterfall_trap", soundStruct.origin); + } + level notify("waterfall"); + clientnotify("WF"); + exploder(21); + stop_exploder(20); +} +waterfall_trap_off() +{ + exploder(20); +} +waterfall_trap_damage() +{ + self endon("trap_off"); + fwd = AnglesToForward(self.angles); + zombies_knocked_down = []; + while(1) + { + self waittill("trigger", who); + if(isPlayer(who)) + { + if(isDefined(self.script_string) && self.script_string == "hurt_player") + { + who dodamage(20, self.origin); + wait 1.0; + } + else + { + who thread waterfall_trap_player(fwd,5.45); + } + } + if( isDefined(who.animname) && who.animname == "monkey_zombie") + { + who thread waterfall_trap_monkey(randomintrange(30,80),fwd); + } + else + { + if(!ent_in_array(who,zombies_knocked_down)) + { + zombies_knocked_down[zombies_knocked_down.size] = who; + wait_network_frame(); + who thread zombie_waterfall_knockdown(); + } + } + } +} +waterfall_trap_player(fwd,time) +{ + wait(1); + vel = self GetVelocity(); + self SetVelocity(vel + fwd * 60.0); + self PlayRumbleOnEntity("slide_rumble"); +} +waterfall_trap_monkey(magnitude, dir) +{ + wait(1); + self StartRagdoll(); + self launchragdoll(dir * magnitude); + wait_network_frame(); + self dodamage(self.health + 666, self.origin); +} +ent_in_array(ent,_array) +{ + for(i=0;i<_array.size;i++) + { + if(_array[i] == ent) + { + return true; + } + } + return false; +} +init_maze_trap() +{ + level.mazeCells = []; + level.mazeFloors = []; + level.mazeWalls = []; + level.mazePath = []; + level.startCells = []; + level.pathPlayers = []; + level.pathActive = false; + level thread init_client_maze_trap(); + mazeClip = getEnt("maze_path_clip", "targetname"); + if(isDefined(mazeClip)) + { + mazeClip delete(); + } + init_maze_paths(); + mazeTriggers = getEntArray("maze_trigger", "targetname"); + for(i=0;i 0; + if(self.isActive == active) + { + return; + } + if(active && isDefined(self.moveUpSound)) + { + self playSound(self.moveUpSound); + } + if(!active && isDefined(self.moveDownSound)) + { + self playSound(self.moveDownSound); + } + goalPos = (self.origin[0], self.origin[1], self.activeHeight); + if(!active) + { + goalPos = (goalPos[0], goalPos[1], goalPos[2] - self.moveDist); + } + moveTime = self.moveUpTime; + if(!active) + { + moveTime = self.moveDownTime; + } + if(self.isMoving) + { + currentZ = self.origin[2]; + goalZ = goalPos[2]; + ratio = Abs(goalZ-currentZ)/Abs(self.moveDist); + moveTime *= ratio; + } + self notify("stop_maze_mover"); + self.isActive = active; + if(self.clipOnly) + { + if(active) + { + self Solid(); + self disconnectPaths(); + self setclientflag(level._CF_SCRIPTMOVER_CLIENT_FLAG_MAZE_WALL); + } + else + { + self NotSolid(); + self connectPaths(); + self clearclientflag(level._CF_SCRIPTMOVER_CLIENT_FLAG_MAZE_WALL); + } + } + else + { + self thread _maze_mover_move(goalPos, moveTime); + } +} +_maze_mover_move(goal, time) +{ + self endon("stop_maze_mover"); + self.isMoving = true; + if(time==0) + { + time = .01; + } + self moveto(goal, time); + self waittill("movedone"); + self.isMoving = false; + if(self.isActive) + { + _maze_mover_play_fx(self.script_fxid, self.fx_active_offset); + } + else + { + _maze_mover_play_fx(self.script_fxid2, self.fx_active2_offset); + } + if(self.pathBlocker) + { + if( self.isActive ) + { + self disconnectpaths(); + } + else + { + self connectpaths(); + } + } +} +_maze_mover_play_fx(fx_name, offset) +{ + if ( IsDefined( fx_name ) ) + { + vFwd = AnglesToForward(self.angles); + org = self.origin; + if ( isdefined( offset ) ) + { + org += offset; + } + PlayFX( fx_name, org, vFwd, (0,0,1) ); + } +} +maze_cell_watch() +{ + level endon("fake_death"); + while(1) + { + self.trigger waittill("trigger", who); + if(self.trigger.pathCount > 0) + { + if ( isplayer( who ) ) + { + if(who is_player_maze_slow()) + { + continue; + } + if(who.sessionstate == "spectator") + { + continue; + } + self thread maze_cell_player_enter(who); + } + else if ( isdefined( who.animname ) && who.animname == "zombie" ) + { + self.trigger thread zombie_normal_trigger_exit( who ); + } + } + else + { + if ( isplayer( who ) ) + { + if(who is_player_on_path()) + { + continue; + } + if(who.sessionstate == "spectator") + { + continue; + } + self.trigger thread watch_slow_trigger_exit(who); + } + else if ( isdefined( who.animname ) && who.animname == "zombie" ) + { + self.trigger thread zombie_slow_trigger_exit( who ); + } + } + } +} +zombie_mud_move_slow() +{ + switch( self.zombie_move_speed ) + { + case "run": + var = randomintrange( 1, 9 ); + self set_run_anim( "walk" + var ); + self.run_combatanim = level.scr_anim[ self.animname ][ "walk" + var ]; + break; + case "sprint": + var = randomintrange( 1, 7 ); + self set_run_anim( "run" + var ); + self.run_combatanim = level.scr_anim[ self.animname ][ "run" + var ]; + break; + } + self.needs_run_update = true; +} +zombie_mud_move_normal() +{ + switch( self.zombie_move_speed ) + { + case "run": + var = randomintrange( 1, 7 ); + self set_run_anim( "run" + var ); + self.run_combatanim = level.scr_anim[ self.animname ][ "run" + var ]; + break; + case "sprint": + var = randomintrange( 1, 5 ); + self set_run_anim( "sprint" + var ); + self.run_combatanim = level.scr_anim[ self.animname ][ "sprint" + var ]; + break; + } + self.needs_run_update = true; +} +zombie_slow_trigger_exit( zombie ) +{ + zombie endon( "death" ); + if ( isdefined( zombie.mud_triggers ) ) + { + if ( is_in_array( zombie.mud_triggers, self ) ) + { + return; + } + } + else + { + zombie.mud_triggers = []; + } + if ( !zombie zombie_on_mud() ) + { + zombie zombie_mud_move_slow(); + } + zombie.mud_triggers[ zombie.mud_triggers.size ] = self; + while ( self.pathCount == 0 && zombie isTouching( self ) ) + { + wait( 0.1 ); + } + zombie.mud_triggers = array_remove( zombie.mud_triggers, self ); + if ( !zombie zombie_on_mud() && !zombie zombie_on_path() ) + { + zombie zombie_mud_move_normal(); + } +} +zombie_on_path() +{ + return ( isdefined( self.path_triggers ) && self.path_triggers.size > 0 ); +} +zombie_on_mud() +{ + return ( isdefined( self.mud_triggers ) && self.mud_triggers.size > 0 ); +} +zombie_normal_trigger_exit( zombie ) +{ + zombie endon( "death" ); + if ( isdefined( zombie.path_triggers ) ) + { + if ( is_in_array( zombie.path_triggers, self ) ) + { + return; + } + } + else + { + zombie.path_triggers = []; + } + if ( !zombie zombie_on_path() ) + { + zombie zombie_mud_move_normal(); + } + zombie.path_triggers[ zombie.path_triggers.size ] = self; + while ( self.pathCount != 0 && zombie isTouching( self ) ) + { + wait( 0.1 ); + } + zombie.path_triggers = array_remove( zombie.path_triggers, self ); +} +is_player_on_path() +{ + return isDefined(self.mazePathCells) && self.mazePathCells.size>0; +} +is_player_maze_slow() +{ + return isDefined(self.mazeSlowTrigger) && self.mazeSlowTrigger.size>0; +} +maze_cell_player_enter(player) +{ + if(isDefined(player.mazePathCells)) + { + if( is_in_array(player.mazePathCells, self)) + { + return; + } + } + else + { + player.mazePathCells = []; + } + if(!is_in_array(level.pathPlayers,player)) + { + level.pathPlayers[level.pathPlayers.size] = player; + } + player.mazePathCells[player.mazePathCells.size] = self; + if(!level.pathActive) + { + self maze_start_path(); + } + { + on_maze_cell_enter(); + } + self path_trigger_wait(player); + isPlayerValid = isDefined(player); + if(isPlayerValid) + { + player.mazePathCells = array_remove(player.mazePathCells, self); + } + else + { + } + if(!isPlayerValid || !player is_player_on_path()) + { + level.pathPlayers = remove_undefined_from_array(level.pathPlayers); + if(isPlayerValid) + { + level.pathPlayers = array_remove(level.pathPlayers, player); + } + { + if(level.pathPlayers.size == 0) + { + maze_end_path(); + } + } + } + { + on_maze_cell_exit(); + } +} +path_trigger_wait(player) +{ + player endon("disconnect"); + player endon("fake_death"); + player endon("death"); + level endon("maze_timer_end"); + while(self.trigger.pathCount != 0 && player isTouching(self.trigger) && player.sessionstate != "spectator") + { + wait .1; + } +} +on_maze_cell_enter() +{ + current = self; + previous = current cell_get_previous(); + next = current cell_get_next(); + raise_floor(previous); + raise_floor(current); + raise_floor(next); + activate_walls(previous); + activate_walls(current); + activate_walls(next); +} +on_maze_cell_exit() +{ + current = self; + previous = current cell_get_previous(); + next = current cell_get_next(); + lower_floor(previous); + lower_floor(current); + lower_floor(next); + lower_walls(previous); + lower_walls(current); + lower_walls(next); +} +watch_slow_trigger_exit(player) +{ + player endon("death"); + player endon("fake_death"); + player endon("disconnect"); + player allowJump(false); + if(isDefined(player.mazeSlowTrigger)) + { + if( is_in_array(player.mazeSlowTrigger, self)) + { + return; + } + } + else + { + player.mazeSlowTrigger = []; + } + if(!player is_player_maze_slow()) + { + player allowSprint(false); + player allowProne(false); + player SetMoveSpeedScale( 0.35 ); + player clientnotify( "sle" ); + } + player.mazeSlowTrigger[player.mazeSlowTrigger.size] = self; + while(self.pathCount == 0 && player isTouching(self)) + { + wait .1; + } + player.mazeSlowTrigger = array_remove(player.mazeSlowTrigger, self); + if(!player is_player_maze_slow()) + { + player allowJump(true); + player allowSprint(true); + player allowProne(true); + player SetMoveSpeedScale( 1.0 ); + player clientnotify( "sll" ); + } +} +lower_walls(cell) +{ + if(!isDefined(cell)) + { + return; + } + for(i=0;iGetTime()) + { + for(i=0;i40) + { + continue; + } + } + if(isDefined(level.mazePathLastStart) && isDefined(level.mazePathLastEnd)) + { + if(level.mazePathLastStart == path[0] && level.mazePathLastEnd == path[path.size-1]) + { + continue; + } + } + if(startIndex == path[0]) + { + returnIndex = index; + break; + } + } + return returnIndex; +} +cell_get_next() +{ + index = self.pathIndex; + if(index < level.mazePath.size - 1) + { + return level.mazePath[index+1]; + } + return undefined; +} +cell_get_previous() +{ + index = self.pathIndex; + if(index > 0) + { + return level.mazePath[index-1]; + } + return undefined; +} +zombie_waterfall_knockdown() +{ + self endon("death"); + self.lander_knockdown = 1; + wait(1.25); + if ( IsDefined( self.thundergun_knockdown_func ) ) + { + self[[ self.thundergun_knockdown_func ]]( self, false ); + } +} +override_thundergun_damage_func(player,gib) +{ + dmg_point = getstruct("waterfall_dmg_point","script_noteworthy"); + self.thundergun_handle_pain_notetracks = ::handle_knockdown_pain_notetracks; + self DoDamage( 1, dmg_point.origin ); +} +handle_knockdown_pain_notetracks( note ) +{ +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_temple_triggers.gsc b/BO1/PC/ZM/maps/zombie_temple_triggers.gsc new file mode 100644 index 0000000..7a8397b --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_temple_triggers.gsc @@ -0,0 +1,478 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_utility_raven; +main() +{ + level thread init_code_triggers(); + level thread init_corpse_triggers(); + level thread init_water_drop_triggers(); + level thread init_slow_trigger(); + level thread init_code_structs(); +} +init_code_triggers() +{ + triggers = getEntArray("code_trigger", "targetname"); + array_thread(triggers, ::trigger_code); +} +trigger_code() +{ + code = self.script_noteworthy; + if(!isDefined(code)) + { + code = "DPAD_UP DPAD_UP DPAD_DOWN DPAD_DOWN DPAD_LEFT DPAD_RIGHT DPAD_LEFT DPAD_RIGHT BUTTON_B BUTTON_A"; + } + if(!isDefined(self.script_string)) + { + self.script_string = "cash"; + } + self.players = []; + while(1) + { + self waittill("trigger", who); + if(is_in_array(self.players, who)) + { + continue; + } + who thread watch_for_code_touching_trigger(code, self); + } +} +watch_for_code_touching_trigger(code, trigger) +{ + trigger.players = array_add(trigger.players, self); + self thread watch_for_code(code); + self thread touching_trigger(trigger); + returnNotify = self waittill_any_return("code_correct", "stopped_touching_trigger", "death"); + self notify("code_trigger_end"); + if(returnNotify == "code_correct") + { + trigger code_trigger_activated(self); + } + else + { + trigger.players = array_remove(trigger.players, self); + } +} +code_trigger_activated(who) +{ + switch( self.script_string ) + { + case "cash": + who maps\_zombiemode_score::add_to_player_score(100); + break; + default: + } +} +touching_trigger(trigger) +{ + self endon("code_trigger_end"); + while(self isTouching(trigger)) + { + wait .1; + } + self notify("stopped_touching_trigger"); +} +watch_for_code(code) +{ + self endon("code_trigger_end"); + codes = strTok(code, " "); + while(1) + { + for(i=0; i self.script_float) + { + wait .05; + delta = GetTime() - prevTime; + player.moveSpeedScale -= (delta/1000) * self.inturp_rate; + prevTime = GetTime(); + player SetMoveSpeedScale( player.moveSpeedScale ); + } + player.moveSpeedScale = self.script_float; + player allowJump(false); + player allowSprint(false); + player SetMoveSpeedScale( self.script_float ); + player setvelocity((0,0,0)); + } +} +trigger_unslow_ent( player ) +{ + player endon("enter_slowTrigger"); + if ( IsDefined( player ) ) + { + prevTime = GetTime(); + while(player.moveSpeedScale < 1.0) + { + wait .05; + delta = GetTime() - prevTime; + player.moveSpeedScale += (delta/1000) * self.inturp_rate; + prevTime = GetTime(); + player SetMoveSpeedScale( player.moveSpeedScale ); + } + player.moveSpeedScale = 1.0; + player allowJump(true); + player allowSprint(true); + player SetMoveSpeedScale( 1.0 ); + } +} +init_corpse_triggers() +{ +} +trigger_corpse() +{ + if(!isDefined(self.script_string)) + { + self.script_string = ""; + } + while(1) + { + box(self.origin, self.mins, self.maxs, 0, (1, 0.0, 0.0)); + corpses = getcorpsearray(); + for(i=0;i0) + { + return 50; + } + else + { + return 0; + } +} +init_code_structs() +{ + structs = getStructArray("code_struct", "targetname"); + array_thread(structs, ::structs_code); +} +structs_code() +{ + code = self.script_noteworthy; + if(!isDefined(code)) + { + code = "DPAD_UP DPAD_DOWN DPAD_LEFT DPAD_RIGHT BUTTON_B BUTTON_A"; + } + self.codes = strTok(code, " "); + if(!isDefined(self.script_string)) + { + self.script_string = "cash"; + } + self.reward = self.script_string; + if(!isDefined(self.radius)) + { + self.radius = 32; + } + self.radiusSq = self.radius * self.radius; + playersInRadius = []; + while(1) + { + players = get_players(); + for(i=playersInRadius.size-1;i>=0;i--) + { + player = playersInRadius[i]; + if(!self is_player_in_radius(player)) + { + if(isDefined(player)) + { + playersInRadius = array_remove(playersInRadius,player); + self notify("end_code_struct"); + } + else + { + playersInRadius = array_removeUndefined(playersInRadius); + } + } + players = array_remove(players, player); + } + for(i=0;i30) + { + return false; + } + if(distance2dsquared(self.origin, player.origin)>self.radiusSq) + { + return false; + } + return true; +} +intermission_rumble_clean_up() +{ + self endon( "irt" ); + level waittill( "intermission" ); + self ClearClientFlag( level._CF_PLAYER_MAZE_FLOOR_RUMBLE ); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_temple_waterslide.gsc b/BO1/PC/ZM/maps/zombie_temple_waterslide.gsc new file mode 100644 index 0000000..0de8ec3 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_temple_waterslide.gsc @@ -0,0 +1,441 @@ + +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_utility_raven; +precache_assets() +{ + level._effect["fx_slide_wake"] = LoadFX("bio/player/fx_player_water_swim_wake"); + level._effect["fx_slide_splash"] = LoadFX("bio/player/fx_player_water_splash"); + level._effect["fx_slide_splash_2"] = LoadFX("env/water/fx_water_splash_fountain_lg"); + level._effect["fx_slide_splash_3"] = LoadFX("maps/pow/fx_pow_cave_water_splash"); + level._effect["fx_slide_water_fall"] = LoadFX("maps/pow/fx_pow_cave_water_fall"); +} +waterslide_main() +{ + flag_init("waterslide_open"); + zombie_cave_slide_init(); + if ( GetDvar("waterslide_debug") == "" ) + { + SetDvar("waterslide_debug", "0"); + } + messageTrigger = GetEnt("waterslide_message_trigger", "targetname"); + if(isDefined(messageTrigger)) + { + messageTrigger setcursorhint( "HINT_NOICON" ); + } + cheat = false; + if ( !cheat ) + { + if(isDefined(messageTrigger)) + { + messageTrigger SetHintString( &"ZOMBIE_NEED_POWER" ); + } + flag_wait("power_on"); + if(isDefined(messageTrigger)) + { + messageTrigger SetHintString( &"ZOMBIE_TEMPLE_DESTINATION_NOT_OPEN" ); + } + flag_wait_any("cave01_to_cave02", "pressure_to_cave01"); + } + flag_set("waterslide_open"); + if(isDefined(messageTrigger)) + { + messageTrigger SetHintString( "" ); + } + waterSlideBlocker = getEnt("water_slide_blocker", "targetname"); + if( isDefined(waterSlideBlocker) ) + { + waterSlideBlocker ConnectPaths(); + waterSlideBlocker movez(128,1); + } + level notify( "slide_open" ); +} +zombie_cave_slide_init() +{ + flag_init( "slide_anim_change_allowed" ); + level.zombies_slide_anim_change = []; + level thread slide_anim_change_throttle(); + flag_set( "slide_anim_change_allowed" ); + slide_trigs = GetEntArray("zombie_cave_slide","targetname"); + array_thread(slide_trigs,::slide_trig_watch); + level thread slide_player_enter_watch(); + level thread slide_player_exit_watch(); + level thread zombie_caveslide_anim_failsafe(); +} +zombie_caveslide_anim_failsafe() +{ + trig = getent("zombie_cave_slide_failsafe","targetname"); + if(isDefined(trig)) + { + while(1) + { + trig waittill("trigger",who); + if(is_true(who.sliding)) + { + who.sliding = false; + who thread reset_zombie_anim(); + } + } + } +} +slide_trig_watch() +{ + slide_node = GetNode(self.target, "targetname"); + if(!IsDefined(slide_node)) + { + return; + } + self trigger_off(); + level waittill( "slide_open" ); + self trigger_on(); + while(true) + { + self waittill("trigger", who); + if(who.animname == "zombie" || who.animname == "sonic_zombie" || who.animname == "napalm_zombie") + { + if(IsDefined(who.sliding) && who.sliding == true) + { + continue; + } + else + { + who thread zombie_sliding(slide_node); + } + } + else if ( isDefined( who.zombie_sliding ) ) + { + who thread [[ who.zombie_sliding ]]( slide_node ); + } + } +} +#using_animtree( "generic_human" ); +cave_slide_anim_init() +{ + level.scr_anim["zombie"]["fast_pull_4"] = %ai_zombie_caveslide_traverse; + level.scr_anim["napalm_zombie"]["fast_pull_4"] = %ai_zombie_caveslide_traverse; + level.scr_anim["sonic_zombie"]["fast_pull_4"] = %ai_zombie_caveslide_traverse; + level.scr_anim[ "zombie" ][ "attracted_death_1" ] = %ai_zombie_blackhole_death_preburst_v1; + level.scr_anim[ "zombie" ][ "attracted_death_2" ] = %ai_zombie_blackhole_death_preburst_v2; + level.scr_anim[ "zombie" ][ "attracted_death_3" ] = %ai_zombie_blackhole_death_preburst_v3; + level.scr_anim[ "zombie" ][ "attracted_death_4" ] = %ai_zombie_blackhole_death_preburst_v4; + level.scr_anim[ "napalm_zombie" ][ "attracted_death_1" ] = %ai_zombie_blackhole_death_preburst_v1; + level.scr_anim[ "napalm_zombie" ][ "attracted_death_2" ] = %ai_zombie_blackhole_death_preburst_v2; + level.scr_anim[ "napalm_zombie" ][ "attracted_death_3" ] = %ai_zombie_blackhole_death_preburst_v3; + level.scr_anim[ "napalm_zombie" ][ "attracted_death_4" ] = %ai_zombie_blackhole_death_preburst_v4; + level.scr_anim[ "sonic_zombie" ][ "attracted_death_1" ] = %ai_zombie_blackhole_death_preburst_v1; + level.scr_anim[ "sonic_zombie" ][ "attracted_death_2" ] = %ai_zombie_blackhole_death_preburst_v2; + level.scr_anim[ "sonic_zombie" ][ "attracted_death_3" ] = %ai_zombie_blackhole_death_preburst_v3; + level.scr_anim[ "sonic_zombie" ][ "attracted_death_4" ] = %ai_zombie_blackhole_death_preburst_v4; +} +zombie_sliding(slide_node) +{ + self endon( "death" ); + level endon( "intermission" ); + if( !IsDefined( self.cave_slide_flag_init ) ) + { + self ent_flag_init( "slide_anim_change" ); + self.cave_slide_flag_init = 1; + } + self.is_traversing = true; + self notify("zombie_start_traverse"); + self thread zombie_slide_watch(); + self thread play_zombie_slide_looper(); + self.sliding = true; + self.ignoreall = true; + self thread gibbed_while_sliding(); + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self thread set_zombie_slide_anim(); + self SetGoalNode(slide_node); + check_dist_squared = 60*60; + while(Distancesquared(self.origin, slide_node.origin) > check_dist_squared ) + { + wait(0.01); + } + self thread reset_zombie_anim(); + self notify("water_slide_exit"); + self.sliding = false; + self.is_traversing = false; + self notify("zombie_end_traverse"); + self.ignoreall = false; + self thread maps\_zombiemode_spawner::find_flesh(); +} +play_zombie_slide_looper() +{ + self endon( "death" ); + level endon( "intermission" ); + self PlayLoopSound( "fly_dtp_slide_loop_npc_snow", .5 ); + self waittill_any( "zombie_end_traverse", "death" ); + self StopLoopSound( .5 ); +} +set_zombie_slide_anim() +{ + self endon( "death" ); + rand = RandomIntRange( 1, 4 ); + level.zombies_slide_anim_change = add_to_array( level.zombies_slide_anim_change, self, false ); + self ent_flag_wait( "slide_anim_change" ); + self clear_run_anim(); + if( self.has_legs ) + { + self._had_legs = true; + self.preslide_death = self.deathanim; + self.deathanim = death_while_sliding(); + self set_run_anim( "fast_pull_4"); + self.run_combatanim = level.scr_anim[self.animname]["fast_pull_4"]; + self.crouchRunAnim = level.scr_anim[self.animname]["fast_pull_4"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["fast_pull_4"]; + self.needs_run_update = true; + } + else + { + self._had_legs = false; + self set_run_anim( "fast_pull_4"); + self.run_combatanim = level.scr_anim[self.animname]["fast_pull_4"]; + self.crouchRunAnim = level.scr_anim[self.animname]["fast_pull_4"]; + self.crouchrun_combatanim = level.scr_anim[self.animname]["fast_pull_4"]; + self.needs_run_update = true; + } +} +reset_zombie_anim() +{ + self endon( "death" ); + level.zombies_slide_anim_change = add_to_array( level.zombies_slide_anim_change, self, false ); + self ent_flag_wait( "slide_anim_change" ); + theanim = undefined; + if( self.has_legs ) + { + if(IsDefined(self.preslide_death)) + { + self.deathanim = self.preslide_death; + } + switch(self.zombie_move_speed) + { + case "walk": + theanim = "walk" + randomintrange(1, 8); + break; + case "run": + theanim = "run" + randomintrange(1, 6); + break; + case "sprint": + theanim = "sprint" + randomintrange(1, 4); + break; + } + } + else + { + legless_walk_anims = []; + legless_walk_anims = add_to_array( legless_walk_anims, "crawl1", false ); + legless_walk_anims = add_to_array( legless_walk_anims, "crawl5", false ); + legless_walk_anims = add_to_array( legless_walk_anims, "crawl_hand_1", false ); + legless_walk_anims = add_to_array( legless_walk_anims, "crawl_hand_2", false ); + rand_walk_anim = RandomInt( legless_walk_anims.size ); + legless_sprint_anims = []; + legless_sprint_anims = add_to_array( legless_sprint_anims, "crawl2", false ); + legless_sprint_anims = add_to_array( legless_sprint_anims, "crawl3", false ); + legless_sprint_anims = add_to_array( legless_sprint_anims, "crawl_sprint1", false ); + rand_sprint_anim = RandomInt( legless_sprint_anims.size ); + switch(self.zombie_move_speed) + { + case "walk": + theanim = legless_walk_anims[ rand_walk_anim ]; + break; + case "run": + theanim = "crawl4"; + break; + case "sprint": + theanim = legless_sprint_anims[ rand_sprint_anim ]; + break; + default: + theanim = "crawl4"; + break; + } + } + if ( isDefined(level.scr_anim[self.animname][theanim]) ) + { + self clear_run_anim(); + wait_network_frame(); + self set_run_anim( theanim ); + self.run_combatanim = level.scr_anim[self.animname][theanim]; + self.walk_combatanim = level.scr_anim[self.animname][theanim]; + self.crouchRunAnim = level.scr_anim[self.animname][theanim]; + self.crouchrun_combatanim = level.scr_anim[self.animname][theanim]; + self.needs_run_update = true; + return; + } + else + { + self thread reset_zombie_anim(); + } +} +death_while_sliding() +{ + self endon( "death" ); + if(self.animname == "sonic_zombie" || self.animname == "napalm_zombie") + { + return self.deathanim; + } + death_animation = undefined; + rand = RandomIntRange( 1, 5 ); + if( self.has_legs ) + { + death_animation = level.scr_anim[ self.animname ][ "attracted_death_" + rand ]; + } + return death_animation; +} +gibbed_while_sliding() +{ + self endon("death"); + if(self.animname == "sonic_zombie" || self.animname == "napalm_zombie") + { + return ; + } + if(!self.has_legs) + { + return; + } + while(self.sliding) + { + if( !self.has_legs && self._had_legs == true) + { + self thread set_zombie_slide_anim(); + return; + } + wait(0.1); + } +} +slide_anim_change_throttle() +{ + if( !IsDefined( level.zombies_slide_anim_change ) ) + { + level.zombies_slide_anim_change = []; + } + int_max_num_zombies_per_frame = 7; + array_zombies_allowed_to_switch = []; + while( IsDefined( level.zombies_slide_anim_change ) ) + { + if( level.zombies_slide_anim_change.size == 0 ) + { + wait( 0.1 ); + continue; + } + array_zombies_allowed_to_switch = level.zombies_slide_anim_change; + for( i = 0; i < array_zombies_allowed_to_switch.size; i++ ) + { + if( IsDefined( array_zombies_allowed_to_switch[i] ) && + IsAlive( array_zombies_allowed_to_switch[i] ) ) + { + array_zombies_allowed_to_switch[i] ent_flag_set( "slide_anim_change" ); + } + if( i >= int_max_num_zombies_per_frame ) + { + break; + } + } + flag_clear( "slide_anim_change_allowed" ); + for( i = 0; i < array_zombies_allowed_to_switch.size; i++ ) + { + if( array_zombies_allowed_to_switch[i] ent_flag( "slide_anim_change" ) ) + { + level.zombies_slide_anim_change = array_remove( level.zombies_slide_anim_change, array_zombies_allowed_to_switch[i] ); + } + } + level.zombies_slide_anim_change = array_removedead( level.zombies_slide_anim_change ); + level.zombies_slide_anim_change = array_removeundefined( level.zombies_slide_anim_change ); + flag_set( "slide_anim_change_allowed" ); + wait_network_frame(); + wait( 0.1 ); + } +} +slide_player_enter_watch() +{ + level endon("fake_death"); + trig = GetEnt("cave_slide_force_crouch", "targetname"); + while(true) + { + trig waittill("trigger", who); + if(isDefined(who) && isPlayer(who) && who.sessionstate != "spectator" && !is_true(who.on_slide) ) + { + who.on_slide = true; + who thread player_slide_watch(); + who thread maps\_zombiemode_audio::create_and_play_dialog( "general", "slide" ); + } + } +} +slide_player_exit_watch() +{ + trig = GetEnt("cave_slide_force_stand", "targetname"); + while(true) + { + trig waittill("trigger", who); + if(isDefined(who) && isPlayer(who) && who.sessionstate != "spectator" && is_true(who.on_slide) ) + { + who.on_slide=false; + who notify("water_slide_exit"); + } + } +} +player_slide_watch() +{ + self thread on_player_enter_slide(); + self thread player_slide_fake_death_watch(); + self waittill_any("water_slide_exit", "death", "disconnect"); + if ( isdefined( self ) ) + { + self thread on_player_exit_slide(); + } +} +player_slide_fake_death_watch() +{ + self endon("death"); + self endon("disconnect"); + self endon("water_slide_exit"); + self waittill("fake_death"); + self allowstand(true); + self AllowProne(true); +} +on_player_enter_slide() +{ + self endon("death"); + self endon("disconnect"); + self endon("water_slide_exit"); + self thread play_loop_sound_on_entity("evt_slideloop"); + while(self maps\_laststand::player_is_in_laststand() ) + { + wait .1; + } + while(is_true(self.divetoprone)) + { + wait(.1); + } + self AllowStand(false); + self AllowProne(false); + self SetStance("crouch"); +} +on_player_exit_slide() +{ + self endon( "death" ); + self endon( "disconnect" ); + self AllowStand(true); + self AllowProne(true); + if(!self maps\_laststand::player_is_in_laststand() ) + { + self SetStance("stand"); + } + self thread stop_loop_sound_on_entity("evt_slideloop"); +} +zombie_slide_watch() +{ + self thread on_zombie_enter_slide(); + self waittill_any("water_slide_exit", "death"); + self thread on_zombie_exit_slide(); +} +on_zombie_enter_slide() +{ + self thread play_loop_sound_on_entity("evt_slideloop"); +} +on_zombie_exit_slide() +{ + self thread stop_loop_sound_on_entity("evt_slideloop"); +} + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_theater.gsc b/BO1/PC/ZM/maps/zombie_theater.gsc new file mode 100644 index 0000000..8e7c7a2 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_theater.gsc @@ -0,0 +1,438 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +#include maps\_zombiemode_zone_manager; +#include maps\zombie_theater_magic_box; +#include maps\zombie_theater_movie_screen; +#include maps\zombie_theater_quad; +#include maps\zombie_theater_teleporter; +main() +{ + maps\zombie_theater_fx::main(); + maps\zombie_theater_amb::main(); + PreCacheModel("zombie_zapper_cagelight_red"); + precachemodel("zombie_zapper_cagelight_green"); + precacheShader("ac130_overlay_grain"); + precacheshellshock( "electrocution" ); + PreCacheModel( "zombie_theater_reelcase_obj" ); + PreCacheShader( "zom_icon_theater_reel" ); + PreCacheModel( "viewmodel_usa_pow_arms" ); + PreCacheModel( "viewmodel_rus_prisoner_arms" ); + PreCacheModel( "viewmodel_vtn_nva_standard_arms" ); + PreCacheModel( "viewmodel_usa_hazmat_arms" ); + PreCacheModel("zombie_zapper_cagelight_on"); + precachemodel("zombie_zapper_cagelight"); + PreCacheModel("lights_hang_single"); + precachemodel("lights_hang_single_on_nonflkr"); + precachemodel("zombie_theater_chandelier1arm_off"); + precachemodel("zombie_theater_chandelier1arm_on"); + precachemodel("zombie_theater_chandelier1_off"); + precachemodel("zombie_theater_chandelier1_on"); + if(GetDvarInt( #"artist") > 0) + { + return; + } + level.dogs_enabled = true; + level.random_pandora_box_start = true; + level.zombie_anim_override = maps\zombie_theater::anim_override_func; + curtain_anim_init(); + level thread maps\_callbacksetup::SetupCallbacks(); + level.quad_move_speed = 35; + level.quad_traverse_death_fx = maps\zombie_theater_quad::quad_traverse_death_fx; + level.quad_explode = true; + level.dog_spawn_func = maps\_zombiemode_ai_dogs::dog_spawn_factory_logic; + level.exit_level_func = ::theater_exit_level; + level.custom_ai_type = []; + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_quad::init ); + level.custom_ai_type = array_add( level.custom_ai_type, maps\_zombiemode_ai_dogs::init ); + level.door_dialog_function = maps\_zombiemode::play_door_dialog; + level.first_round_spawn_func = true; + include_weapons(); + include_powerups(); + level.use_zombie_heroes = true; + level.disable_protips = 1; + maps\_zombiemode::main(); + battlechatter_off("allies"); + battlechatter_off("axis"); + maps\_zombiemode_ai_dogs::enable_dog_rounds(); + init_zombie_theater(); + maps\_compass::setupMiniMap("menu_map_zombie_theater"); + level.ignore_spawner_func = ::theater_ignore_spawner; + level.zone_manager_init_func = ::theater_zone_init; + init_zones[0] = "foyer_zone"; + init_zones[1] = "foyer2_zone"; + level thread maps\_zombiemode_zone_manager::manage_zones( init_zones ); + level thread maps\_zombiemode_auto_turret::init(); + level thread set_rope_collision(); + level.extracam_screen = GetEnt("theater_extracam_screen", "targetname"); + level.extracam_screen Hide(); + clientnotify("camera_stop"); + init_sounds(); + level thread add_powerups_after_round_1(); + visionsetnaked( "zombie_theater", 0 ); + chandelier = getentarray("theater_chandelier","targetname"); + array_thread( chandelier, ::theater_chandelier_model_scale ); + maps\zombie_theater_teleporter::teleport_pad_hide_use(); +} +#using_animtree( "generic_human" ); +anim_override_func() +{ + level.scr_anim["zombie"]["walk7"] = %ai_zombie_walk_v8; +} +#using_animtree( "zombie_theater" ); +curtain_anim_init() +{ + level.scr_anim["curtains_move"] = %o_zombie_theatre_curtain; +} +theater_playanim( animname ) +{ + self UseAnimTree(#animtree); + self animscripted(animname + "_done", self.origin, self.angles, level.scr_anim[animname],"normal", undefined, 2.0 ); +} +include_weapons() +{ + include_weapon( "frag_grenade_zm", false, true ); + include_weapon( "claymore_zm", false, true ); + include_weapon( "m1911_zm", false ); + include_weapon( "m1911_upgraded_zm", false ); + include_weapon( "python_zm" ); + include_weapon( "python_upgraded_zm", false ); + include_weapon( "cz75_zm" ); + include_weapon( "cz75_upgraded_zm", false ); + include_weapon( "m14_zm", false, true ); + include_weapon( "m14_upgraded_zm", false ); + include_weapon( "m16_zm", false, true ); + include_weapon( "m16_gl_upgraded_zm", false ); + include_weapon( "g11_lps_zm" ); + include_weapon( "g11_lps_upgraded_zm", false ); + include_weapon( "famas_zm" ); + include_weapon( "famas_upgraded_zm", false ); + include_weapon( "ak74u_zm", false, true ); + include_weapon( "ak74u_upgraded_zm", false ); + include_weapon( "mp5k_zm", false, true ); + include_weapon( "mp5k_upgraded_zm", false ); + include_weapon( "mp40_zm", false, true ); + include_weapon( "mp40_upgraded_zm", false ); + include_weapon( "mpl_zm", false, true ); + include_weapon( "mpl_upgraded_zm", false ); + include_weapon( "pm63_zm", false, true ); + include_weapon( "pm63_upgraded_zm", false ); + include_weapon( "spectre_zm" ); + include_weapon( "spectre_upgraded_zm", false ); + include_weapon( "cz75dw_zm" ); + include_weapon( "cz75dw_upgraded_zm", false ); + include_weapon( "ithaca_zm", false, true ); + include_weapon( "ithaca_upgraded_zm", false ); + include_weapon( "rottweil72_zm", false, true ); + include_weapon( "rottweil72_upgraded_zm", false ); + include_weapon( "spas_zm" ); + include_weapon( "spas_upgraded_zm", false ); + include_weapon( "hs10_zm" ); + include_weapon( "hs10_upgraded_zm", false ); + include_weapon( "aug_acog_zm" ); + include_weapon( "aug_acog_mk_upgraded_zm", false ); + include_weapon( "galil_zm" ); + include_weapon( "galil_upgraded_zm", false ); + include_weapon( "commando_zm" ); + include_weapon( "commando_upgraded_zm", false ); + include_weapon( "fnfal_zm" ); + include_weapon( "fnfal_upgraded_zm", false ); + include_weapon( "dragunov_zm" ); + include_weapon( "dragunov_upgraded_zm", false ); + include_weapon( "l96a1_zm" ); + include_weapon( "l96a1_upgraded_zm", false ); + include_weapon( "rpk_zm" ); + include_weapon( "rpk_upgraded_zm", false ); + include_weapon( "hk21_zm" ); + include_weapon( "hk21_upgraded_zm", false ); + include_weapon( "m72_law_zm" ); + include_weapon( "m72_law_upgraded_zm", false ); + include_weapon( "china_lake_zm" ); + include_weapon( "china_lake_upgraded_zm", false ); + include_weapon( "zombie_cymbal_monkey" ); + include_weapon( "ray_gun_zm" ); + include_weapon( "ray_gun_upgraded_zm", false ); + include_weapon( "thundergun_zm", true ); + include_weapon( "thundergun_upgraded_zm", false ); + include_weapon( "crossbow_explosive_zm" ); + include_weapon( "crossbow_explosive_upgraded_zm", false ); + include_weapon( "knife_ballistic_zm", true ); + include_weapon( "knife_ballistic_upgraded_zm", false ); + include_weapon( "knife_ballistic_bowie_zm", false ); + include_weapon( "knife_ballistic_bowie_upgraded_zm", false ); + level._uses_retrievable_ballisitic_knives = true; + maps\_zombiemode_weapons::add_limited_weapon( "m1911_zm", 0 ); + maps\_zombiemode_weapons::add_limited_weapon( "thundergun_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "crossbow_explosive_zm", 1 ); + maps\_zombiemode_weapons::add_limited_weapon( "knife_ballistic_zm", 1 ); + precacheItem( "explosive_bolt_zm" ); + precacheItem( "explosive_bolt_upgraded_zm" ); + level.collector_achievement_weapons = array_add( level.collector_achievement_weapons, "bowie_knife_zm" ); +} +include_powerups() +{ + include_powerup( "nuke" ); + include_powerup( "insta_kill" ); + include_powerup( "double_points" ); + include_powerup( "full_ammo" ); + include_powerup( "carpenter" ); + include_powerup( "fire_sale" ); +} +add_powerups_after_round_1() +{ + level.zombie_powerup_array = array_remove (level.zombie_powerup_array, "nuke"); + level.zombie_powerup_array = array_remove (level.zombie_powerup_array, "fire_sale"); + while (1) + { + if (level.round_number > 1) + { + level.zombie_powerup_array = array_add(level.zombie_powerup_array, "nuke"); + level.zombie_powerup_array = array_add(level.zombie_powerup_array, "fire_sale"); + break; + } + wait (1); + } +} +init_zombie_theater() +{ + flag_init( "curtains_done" ); + flag_init( "lobby_occupied" ); + flag_init( "dining_occupied" ); + flag_init( "special_quad_round" ); + level thread electric_switch(); + thread maps\zombie_theater_magic_box::magic_box_init(); + level thread maps\zombie_theater_movie_screen::initMovieScreen(); + thread maps\zombie_theater_quad::init_roofs(); + level thread teleporter_intro(); +} +teleporter_intro() +{ + flag_wait( "all_players_spawned" ); + wait( 0.25 ); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + players[i] SetTransported( 2 ); + } + playsoundatposition( "evt_beam_fx_2d", (0,0,0) ); + playsoundatposition( "evt_pad_cooldown_2d", (0,0,0) ); +} +electric_switch() +{ + trig = getent("use_elec_switch","targetname"); + trig sethintstring(&"ZOMBIE_ELECTRIC_SWITCH"); + trig setcursorhint( "HINT_NOICON" ); + level thread wait_for_power(); + trig waittill("trigger",user); + trig delete(); + flag_set( "power_on" ); + Objective_State(8,"done"); +} +wait_for_power() +{ + master_switch = getent("elec_switch","targetname"); + master_switch notsolid(); + flag_wait( "power_on" ); + master_switch rotateroll(-90,.3); + master_switch playsound("zmb_switch_flip"); + clientnotify( "ZPO" ); + master_switch waittill("rotatedone"); + playfx(level._effect["switch_sparks"] ,getstruct("elec_switch_fx","targetname").origin); + master_switch playsound("zmb_turn_on"); + maps\zombie_theater_teleporter::teleporter_init(); + wait_network_frame(); + level notify("revive_on"); + wait_network_frame(); + level notify("juggernog_on"); + wait_network_frame(); + level notify("sleight_on"); + wait_network_frame(); + level notify("doubletap_on"); + wait_network_frame(); + level notify("Pack_A_Punch_on" ); + wait_network_frame(); + players = get_players(); + level.quads_per_round = 4 * players.size; + level notify("quad_round_can_end"); + level.delay_spawners = undefined; + level thread quad_wave_init(); +} +init_sounds() +{ + maps\_zombiemode_utility::add_sound( "wooden_door", "zmb_door_wood_open" ); + maps\_zombiemode_utility::add_sound( "fence_door", "zmb_door_fence_open" ); +} +theater_zone_init() +{ + flag_init( "always_on" ); + flag_set( "always_on" ); + add_adjacent_zone( "foyer_zone", "foyer2_zone", "always_on" ); + add_adjacent_zone( "foyer_zone", "vip_zone", "magic_box_foyer1" ); + add_adjacent_zone( "foyer2_zone", "crematorium_zone", "magic_box_crematorium1" ); + add_adjacent_zone( "foyer_zone", "crematorium_zone", "magic_box_crematorium1" ); + add_adjacent_zone( "vip_zone", "dining_zone", "vip_to_dining" ); + add_adjacent_zone( "crematorium_zone", "alleyway_zone", "magic_box_alleyway1" ); + add_adjacent_zone( "dining_zone", "dressing_zone", "dining_to_dressing" ); + add_adjacent_zone( "dressing_zone", "stage_zone", "magic_box_dressing1" ); + add_adjacent_zone( "stage_zone", "west_balcony_zone", "magic_box_west_balcony2" ); + add_adjacent_zone( "theater_zone", "foyer2_zone", "power_on" ); + add_adjacent_zone( "theater_zone", "stage_zone", "power_on" ); + add_adjacent_zone( "west_balcony_zone", "alleyway_zone", "magic_box_west_balcony1" ); +} +theater_ignore_spawner( spawner ) +{ + if ( !flag( "curtains_done" ) ) + { + if ( spawner.script_noteworthy == "quad_zombie_spawner" ) + { + return true; + } + } + if ( flag( "special_quad_round" ) ) + { + if ( spawner.script_noteworthy != "quad_zombie_spawner" ) + { + return true; + } + } + if ( !flag( "lobby_occupied" ) ) + { + if ( spawner.script_noteworthy == "quad_zombie_spawner" && spawner.targetname == "foyer_zone_spawners" ) + { + return true; + } + } + if ( !flag( "dining_occupied" ) ) + { + if ( spawner.script_noteworthy == "quad_zombie_spawner" && spawner.targetname == "zombie_spawner_dining" ) + { + return true; + } + } + return false; +} +quad_wave_init() +{ + level thread time_for_quad_wave("foyer_zone"); + level thread time_for_quad_wave("theater_zone"); + level thread time_for_quad_wave("stage_zone"); + level thread time_for_quad_wave("dining_zone"); + level waittill( "end_of_round" ); + flag_clear( "special_quad_round" ); +} +time_for_quad_wave(zone_name) +{ + if(!IsDefined(zone_name)) + { + return; + } + zone = level.zones[ zone_name ]; + level waittill( "between_round_over" ); + if ( IsDefined( level.next_dog_round ) && level.next_dog_round == level.round_number ) + { + level thread time_for_quad_wave(zone_name); + return; + } + max = level.zombie_vars["zombie_max_ai"]; + multiplier = level.round_number / 5; + if( multiplier < 1 ) + { + multiplier = 1; + } + if( level.round_number >= 10 ) + { + multiplier *= level.round_number * 0.15; + } + player_num = get_players().size; + if( player_num == 1 ) + { + max += int( ( 0.5 * level.zombie_vars["zombie_ai_per_player"] ) * multiplier ); + } + else + { + max += int( ( ( player_num - 1 ) * level.zombie_vars["zombie_ai_per_player"] ) * multiplier ); + } + chance = 100; + max_zombies = [[ level.max_zombie_func ]]( max ); + current_round = level.round_number; + if((level.round_number % 3 == 0) && chance >= RandomInt(100)) + { + if(zone.is_occupied) + { + flag_set( "special_quad_round" ); + maps\_zombiemode_zone_manager::reinit_zone_spawners(); + while( level.zombie_total < max_zombies /2 && current_round == level.round_number ) + { + wait(0.1); + } + flag_clear( "special_quad_round" ); + maps\_zombiemode_zone_manager::reinit_zone_spawners(); + } + } + level thread time_for_quad_wave(zone_name); +} +theater_chandelier_model_scale() +{ + flag_wait( "power_on" ); + if( self.model == "zombie_theater_chandelier1arm_off") + { + self SetModel("zombie_theater_chandelier1arm_on"); + } + else if( self.model == "zombie_theater_chandelier1_off") + { + self SetModel("zombie_theater_chandelier1_on"); + } +} +set_rope_collision() +{ + techrope = getentarray("techrope01", "targetname"); + if(isdefined(techrope)) + { + for( i = 0; i < techrope.size; i++ ) + { + ropesetflag( techrope[i], "collide", 1 ); + ropesetflag( techrope[i], "no_lod", 1 ); + } + } +} +theater_exit_level() +{ + zombies = GetAiArray( "axis" ); + for ( i = 0; i < zombies.size; i++ ) + { + zombies[i] thread theater_find_exit_point(); + } +} +theater_find_exit_point() +{ + self endon( "death" ); + player = getplayers()[0]; + dist_zombie = 0; + dist_player = 0; + dest = 0; + away = VectorNormalize( self.origin - player.origin ); + endPos = self.origin + vector_scale( away, 600 ); + locs = array_randomize( level.enemy_dog_locations ); + for ( i = 0; i < locs.size; i++ ) + { + dist_zombie = DistanceSquared( locs[i].origin, endPos ); + dist_player = DistanceSquared( locs[i].origin, player.origin ); + if ( dist_zombie < dist_player ) + { + dest = i; + break; + } + } + self notify( "stop_find_flesh" ); + self notify( "zombie_acquire_enemy" ); + self setgoalpos( locs[dest].origin ); + while ( 1 ) + { + if ( !flag( "wait_and_revive" ) ) + { + break; + } + wait_network_frame(); + } + self thread maps\_zombiemode_spawner::find_flesh(); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_theater_ffotd.gsc b/BO1/PC/ZM/maps/zombie_theater_ffotd.gsc new file mode 100644 index 0000000..f977a65 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_theater_ffotd.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_theater_magic_box.gsc b/BO1/PC/ZM/maps/zombie_theater_magic_box.gsc new file mode 100644 index 0000000..467eb59 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_theater_magic_box.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_theater_movie_screen.gsc b/BO1/PC/ZM/maps/zombie_theater_movie_screen.gsc new file mode 100644 index 0000000..2ff05b8 Binary files /dev/null and b/BO1/PC/ZM/maps/zombie_theater_movie_screen.gsc differ diff --git a/BO1/PC/ZM/maps/zombie_theater_quad.gsc b/BO1/PC/ZM/maps/zombie_theater_quad.gsc new file mode 100644 index 0000000..67cacd3 --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_theater_quad.gsc @@ -0,0 +1,349 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +init_roofs() +{ + flag_wait( "curtains_done" ); + level thread quad_stage_roof_break(); + level thread quad_lobby_roof_break(); + level thread quad_dining_roof_break(); + level thread quad_roof_fx(); +} +quad_roof_crumble_fx() +{ + quad_crumble_triggers = GetEntArray("quad_roof_crumble_fx_trigger", "targetname"); + array_thread(quad_crumble_triggers, ::quad_roof_crumble_fx_play); +} +quad_roof_crumble_fx_play() +{ + play_quad_first_sounds(); + roof_parts = getEntArray(self.target, "targetname"); + if(isDefined(roof_parts)) + { + for(i=0; i level.quads_per_round) + { + break; + } + } + spawned = 0; + second_spawners = []; + switch(level.quad_round_name) + { + case "initial_round": + second_spawners = GetEntArray("initial_first_round_quad_spawner_second_wave","targetname"); + break; + case "theater_round": + second_spawners = GetEntArray("theater_round_quad_spawner_second_wave","targetname"); + break; + default: + ASSERTMSG( "No round specified for second quad wave." ); + return; + } + if( second_spawners.size < 1 ) + { + ASSERTMSG( "No second quad spawners in spawner array." ); + return; + } + while(1) + { + manage_zombie_spawn_delay( timer ); + spawn_a_quad_zombie(second_spawners); + wait(0.2); + spawned++; + if (spawned > level.quads_per_round * 2) + { + break; + } + } + level.zombie_vars["zombie_spawn_delay"] = previous_spawn_delay; + level.zombie_health = level.zombie_vars["zombie_health_start"]; + level.zombie_total = 0; + level.round_spawn_func = maps\_zombiemode::round_spawning; + level thread [[level.round_spawn_func]](); + wait(2); + level notify("quad_round_can_end"); + level.delay_spawners = undefined; +} +manage_zombie_spawn_delay( start_timer ) +{ + if(GetTime() - start_timer < 15000 ) + { + level.zombie_vars["zombie_spawn_delay"] = RandomInt(30,45); + } + else if(GetTime() - start_timer < 25000 ) + { + level.zombie_vars["zombie_spawn_delay"] = RandomInt(15,30); + } + else if(GetTime() - start_timer < 35000 ) + { + level.zombie_vars["zombie_spawn_delay"] = RandomInt(10,15); + } + else if(GetTime() - start_timer < 50000 ) + { + level.zombie_vars["zombie_spawn_delay"] = RandomInt(5,10); + } +} +quad_lobby_roof_break() +{ + zone = level.zones[ "foyer_zone" ]; + while ( 1 ) + { + if ( zone.is_occupied ) + { + flag_set( "lobby_occupied" ); + break; + } + wait_network_frame(); + } + quad_stage_roof_break_single( 5 ); + wait( .4 ); + quad_stage_roof_break_single( 6 ); + wait( 2 ); + quad_stage_roof_break_single( 7 ); + wait( 1 ); + quad_stage_roof_break_single( 8 ); + maps\_zombiemode_zone_manager::reinit_zone_spawners(); +} +quad_dining_roof_break() +{ + trigger = getent( "dining_first_floor", "targetname" ); + trigger waittill( "trigger" ); + flag_set( "dining_occupied" ); + quad_stage_roof_break_single( 9 ); + wait( 1 ); + quad_stage_roof_break_single( 10 ); + maps\_zombiemode_zone_manager::reinit_zone_spawners(); +} +quad_stage_roof_break() +{ + level thread play_quad_start_vo(); + quad_stage_roof_break_single( 1 ); + wait( 2 ); + quad_stage_roof_break_single( 3 ); + wait( .33 ); + quad_stage_roof_break_single( 2 ); + wait( 1 ); + quad_stage_roof_break_single( 0 ); + wait( .45 ); + quad_stage_roof_break_single( 4 ); + wait( .33 ); + quad_stage_roof_break_single( 15 ); + wait( .4 ); + quad_stage_roof_break_single( 11 ); + wait( .45 ); + quad_stage_roof_break_single( 12 ); + wait( .3 ); + quad_stage_roof_break_single( 13 ); + wait( .35 ); + quad_stage_roof_break_single( 14 ); + maps\_zombiemode_zone_manager::reinit_zone_spawners(); +} +quad_stage_roof_break_single( index ) +{ + trigger = getent( "quad_roof_crumble_fx_origin_" + index, "target" ); + trigger thread quad_roof_crumble_fx_play(); +} +play_quad_start_vo() +{ + wait(3); + players = getplayers(); + player = players[RandomIntRange(0,players.size)]; + player maps\_zombiemode_audio::create_and_play_dialog( "general", "quad_spawn" ); +} + + + \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombie_theater_teleporter.gsc b/BO1/PC/ZM/maps/zombie_theater_teleporter.gsc new file mode 100644 index 0000000..94651cd --- /dev/null +++ b/BO1/PC/ZM/maps/zombie_theater_teleporter.gsc @@ -0,0 +1,781 @@ +#include common_scripts\utility; +#include maps\_utility; +#include maps\_zombiemode_utility; +teleporter_init() +{ + level.teleport = []; + level.teleport_delay = 1.8; + level.teleport_cost = 0; + level.teleport_ae_funcs = []; + level.eeroomsinuse = undefined; + level.second_hand = GetEnt("zom_clock_second_hand", "targetname"); + level.second_hand_angles = level.second_hand.angles; + level.zombieTheaterTeleporterSeekLogicFunc = maps\zombie_theater_teleporter::zombieTheaterTeleporterSeekLogic; + flag_init( "teleporter_linked" ); + flag_init( "core_linked" ); + SetDvar( "theaterAftereffectOverride", "-1" ); + poi1 = getent("teleporter_poi1", "targetname"); + poi2 = getent("teleporter_poi2", "targetname"); + players = getplayers(); + if(players.size > 1) + { + poi1 create_zombie_point_of_interest( undefined, 30, 0, false ); + poi2 create_zombie_point_of_interest( 256, 15, 0, false ); + } + else + { + poi1 create_zombie_point_of_interest( undefined, 35, 100, false ); + poi2 create_zombie_point_of_interest( 256, 10, 0, false ); + } + poi1 thread create_zombie_point_of_interest_attractor_positions( 4, 45 ); + poi2 thread create_zombie_point_of_interest_attractor_positions( 4, 45 ); + thread teleport_core_think( 0 ); + thread teleport_link_think(); + thread teleport_pad_think(); + thread theater_fly_me_to_the_moon_init(); + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + setClientSysState( "levelNotify", "pack_clock_start", players[i] ); + } + if( !IsSplitscreen() ) + { + level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\zombie_theater_teleporter::teleport_aftereffect_fov; + } + level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\zombie_theater_teleporter::teleport_aftereffect_shellshock; + level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\zombie_theater_teleporter::teleport_aftereffect_shellshock_electric; + level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\zombie_theater_teleporter::teleport_aftereffect_bw_vision; + level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\zombie_theater_teleporter::teleport_aftereffect_red_vision; + level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\zombie_theater_teleporter::teleport_aftereffect_flashy_vision; + level.teleport_ae_funcs[level.teleport_ae_funcs.size] = maps\zombie_theater_teleporter::teleport_aftereffect_flare_vision; +} +teleport_core_think( index ) +{ + trigger_name = "trigger_teleport_pad_" + index; + active = false; + user = undefined; + trigger = getent( trigger_name, "targetname" ); + trigger setcursorhint( "HINT_NOICON" ); + teleport_start_exploder(0); + trigger sethintstring( "" ); + trigger maps\zombie_theater_magic_box::turnLightRed("teleporter_indicator_light1", true ); + if ( isdefined( trigger ) ) + { + while ( !active ) + { + flag_wait( "teleporter_linked" ); + trigger maps\zombie_theater_magic_box::turnLightGreen("teleporter_indicator_light1", true ); + trigger sethintstring( &"ZOMBIE_THEATER_USE_TELEPORTER" ); + trigger waittill( "trigger", user ); + if ( is_player_valid( user ) && user.score >= level.teleport_cost ) + { + active = true; + trigger maps\zombie_theater_magic_box::turnLightRed("teleporter_indicator_light1", true ); + trigger sethintstring( "" ); + user maps\_zombiemode_score::minus_to_player_score( level.teleport_cost ); + trigger player_teleporting (index); + if(IsDefined(level.link_cable_on) && IsDefined(level.link_cable_off)) + { + level.link_cable_on Hide(); + level.link_cable_off Show(); + } + trigger sethintstring( &"ZOMBIE_TELEPORT_COOLDOWN" ); + wait (90); + active = false; + flag_clear( "teleporter_linked" ); + flag_clear( "core_linked" ); + trigger maps\zombie_theater_magic_box::turnLightGreen("teleporter_indicator_light1", true ); + } + } + } +} +teleport_link_think() +{ + trigger_name = "trigger_teleport_pad_0"; + core = getent( trigger_name, "targetname" ); + user = undefined; + while ( 1 ) + { + if ( !flag( "core_linked" ) ) + { + core sethintstring( &"ZOMBIE_THEATER_LINK_CORE" ); + core waittill( "trigger", user ); + core PlaySound( "evt_teleporter_activate_start" ); + flag_set( "core_linked" ); + core sethintstring( "" ); + pad = getent( core.target, "targetname" ); + pad sethintstring( &"ZOMBIE_THEATER_LINK_PAD" ); + } + wait_network_frame(); + } +} +teleport_pad_hide_use() +{ + trigger_name = "trigger_teleport_pad_0"; + core = getent( trigger_name, "targetname" ); + pad = getent( core.target, "targetname" ); + pad setcursorhint( "HINT_NOICON" ); + level.link_cable_off = GetEnt("teleporter_link_cable_off","targetname"); + level.link_cable_on = GetEnt("teleporter_link_cable_on","targetname"); + if(IsDefined(level.link_cable_on)) + { + level.link_cable_on Hide(); + } + pad SetHintString( &"ZOMBIE_NEED_POWER" ); + flag_wait( "power_on" ); + pad SetHintString( &"ZOMBIE_THEATER_START_CORE" ); +} +teleport_pad_think() +{ + trigger_name = "trigger_teleport_pad_0"; + core = getent( trigger_name, "targetname" ); + pad = getent( core.target, "targetname" ); + user = undefined; + while ( 1 ) + { + if ( !flag( "teleporter_linked" ) && flag( "core_linked" ) ) + { + pad waittill( "trigger", user ); + pad sethintstring( "" ); + pad PlaySound( "evt_teleporter_activate_finish" ); + flag_set( "teleporter_linked" ); + if(IsDefined(level.link_cable_on) && IsDefined(level.link_cable_off)) + { + level.link_cable_off Hide(); + level.link_cable_on Show(); + } + } + wait_network_frame(); + } +} +teleport_start_exploder( index ) +{ + switch ( index ) + { + case 0: + exploder( 102 ); + break; + } +} +player_teleporting( index ) +{ + players_in_proj_room = []; + teleport_pad_start_exploder( index ); + self thread teleport_pad_player_fx(undefined ); + self thread teleport_2d_audio(); + self thread teleport_nuke( undefined, 300); + wait( level.teleport_delay ); + self notify( "fx_done" ); + self thread teleport_pad_end_exploder(0); + players_in_proj_room = self teleport_players(players_in_proj_room, "projroom"); + if (!IsDefined(players_in_proj_room) || (IsDefined(players_in_proj_room) && players_in_proj_room.size < 1)) + return; + wait(30); + level.extracam_screen Hide(); + clientnotify("camera_stop"); + if ( randomint( 100 ) > 24 && !IsDefined( level.eeroomsinuse ) ) + { + loc = "eerooms"; + level.eeroomsinuse = true; + if( RandomInt( 100 ) > 65 ) + { + level thread eeroom_powerup_drop(); + } + } + else + { + loc = "theater"; + exploder (301); + } + self thread teleport_pad_player_fx( players_in_proj_room ); + self thread teleport_2d_audio_specialroom_start( players_in_proj_room ); + wait( level.teleport_delay ); + self notify( "fx_done" ); + self thread teleport_2d_audio_specialroom_go( players_in_proj_room ); + self teleport_players(players_in_proj_room, loc); + if (IsDefined(loc) && loc == "eerooms") + { + loc = "theater"; + wait( 4 ); + self thread teleport_2d_audio_specialroom_start( players_in_proj_room ); + exploder (301); + self thread teleport_pad_player_fx( players_in_proj_room ); + wait( level.teleport_delay ); + self notify( "fx_done" ); + self thread teleport_2d_audio_specialroom_go( players_in_proj_room ); + self teleport_players(players_in_proj_room, loc); + } +} +teleport_pad_start_exploder( index ) +{ + switch ( index ) + { + case 0: + exploder( 202 ); + break; + } +} +teleport_pad_end_exploder( index ) +{ + switch ( index ) + { + case 0: + exploder( 201 ); + break; + } +} +teleport_trigger_invisible( enable ) +{ + players = getplayers(); + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + self SetInvisibleToPlayer( players[i], enable ); + } + } +} +player_is_near_pad( player) +{ + if ( player IsTouching (self) ) + { + return true; + } + return false; +} +teleport_pad_player_fx( players ) +{ + self endon( "fx_done" ); + inprojroom = false; + if (!IsDefined(players)) + players = getplayers(); + else + inprojroom = true; + while ( 1 ) + { + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + if ( self player_is_near_pad( players[i] ) || inprojroom) + { + players[i] SetTransported( level.teleport_delay ); + } + else + { + players[i] SetTransported( 0 ); + } + } + } + wait ( .05 ); + } +} +teleport_players(players_in_proj_room, loc) +{ + player_radius = 16; + dest_room = []; + all_players = get_players(); + slot = undefined; + start = undefined; + if (loc == "projroom") + players = all_players; + else + players = players_in_proj_room; + dest_room = get_array_spots("teleport_room_", dest_room); + initialize_occupied_flag(dest_room); + check_for_occupied_spots(dest_room, all_players, player_radius); + prone_offset = (0, 0, 49); + crouch_offset = (0, 0, 20); + stand_offset = (0, 0, 0); + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + if ( loc == "projroom" && (self player_is_near_pad( players[i]) == false)) + continue; + else if ( loc == "projroom" && self player_is_near_pad( players[i]) ) + players_in_proj_room = array_add(players_in_proj_room, players[i]); + slot = i; + start = 0; + while ( dest_room[slot].occupied && start < 4 ) + { + start++; + slot++; + if ( slot >= 4 ) + { + slot = 0; + } + } + dest_room[slot].occupied = true; + players[i].inteleportation = true; + players[i] disableOffhandWeapons(); + players[i] disableweapons(); + if( players[i] getstance() == "prone" ) + { + desired_origin = dest_room[i].origin + prone_offset; + } + else if( players[i] getstance() == "crouch" ) + { + desired_origin = dest_room[i].origin + crouch_offset; + } + else + { + desired_origin = dest_room[i].origin + stand_offset; + } + players[i].teleport_origin = spawn( "script_origin", players[i].origin ); + players[i].teleport_origin.angles = players[i].angles; + players[i] linkto( players[i].teleport_origin ); + players[i].teleport_origin.origin = desired_origin; + players[i] FreezeControls( true ); + wait_network_frame(); + setClientSysState( "levelNotify", "black_box_start", players[i] ); + players[i].teleport_origin.angles = dest_room[i].angles; + } + } + if (!IsDefined(players_in_proj_room) || (IsDefined(players_in_proj_room) && players_in_proj_room.size < 1)) + return; + wait(2); + array_removeUndefined(players_in_proj_room); + dest_room = []; + if (loc == "projroom") + { + dest_room = get_array_spots("projroom_teleport_player", dest_room); + } + else if (loc == "eerooms") + { + level.eeroomsinuse = true; + dest_room = get_array_spots("ee_teleport_player", dest_room); + } + else if (loc == "theater") + { + if (IsDefined(self.target)) + { + ent = getent(self.target, "targetname"); + self thread teleport_nuke( undefined, 20); + } + dest_room = get_array_spots("theater_teleport_player", dest_room); + } + initialize_occupied_flag(dest_room); + check_for_occupied_spots(dest_room, all_players, player_radius); + for ( i = 0; i < players_in_proj_room.size; i++ ) + { + slot = randomintrange(0, 4); + start = 0; + while ( dest_room[slot].occupied && start < 4 ) + { + start++; + slot++; + if ( slot >= 4 ) + { + slot = 0; + } + } + if(!isDefined(players_in_proj_room[i])) + { + continue; + } + dest_room[slot].occupied = true; + setClientSysState( "levelNotify", "black_box_end", players_in_proj_room[i] ); + assert( IsDefined( players_in_proj_room[i].teleport_origin ) ); + players_in_proj_room[i].teleport_origin delete(); + players_in_proj_room[i].teleport_origin = undefined; + players_in_proj_room[i] setorigin( dest_room[slot].origin ); + players_in_proj_room[i] setplayerangles( dest_room[slot].angles ); + if (loc != "eerooms") + { + players_in_proj_room[i] enableweapons(); + players_in_proj_room[i] enableoffhandweapons(); + players_in_proj_room[i] FreezeControls( false ); + } + else + { + players_in_proj_room[i] FreezeControls( false ); + } + setClientSysState("levelNotify", "t2bfx", players_in_proj_room[i]); + players_in_proj_room[i] teleport_aftereffects(); + if (loc == "projroom") + { + level.second_hand thread start_wall_clock(); + thread extra_cam_startup(); + } + else if (loc == "theater") + players_in_proj_room[i].inteleportation = false; + } + if (loc == "projroom") + { + return players_in_proj_room; + } + else if (loc == "theater") + { + level.eeroomsinuse = undefined; + exploder (302); + } +} +extra_cam_startup() +{ + wait(2.0); + level.extracam_screen Show(); + players = get_players(); + for ( i = 0; i < players.size; i++ ) + { + setClientSysState( "levelNotify", "camera_start", players[i] ); + } +} +get_array_spots(sname, spots) +{ + for (i = 0; i < 4; i++) + { + spots[i] = getent(sname + i, "targetname"); + } + return spots; +} +initialize_occupied_flag(spots) +{ + for ( i = 0; i < spots.size; i++ ) + { + spots[i].occupied = false; + } +} +check_for_occupied_spots(dest, players, player_radius) +{ + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + for ( j = 0; j < dest.size; j++ ) + { + if ( !dest[j].occupied ) + { + dist = Distance2D( dest[j].origin, players[i].origin ); + if ( dist < player_radius ) + { + dest[j].occupied = true; + } + } + } + } + } +} +teleport_2d_audio() +{ + self endon( "fx_done" ); + clientnotify( "tpa" ); + players = getplayers(); + wait(1.7); + for ( i = 0; i < players.size; i++ ) + { + if ( isdefined( players[i] ) ) + { + if ( self player_is_near_pad( players[i] ) ) + { + setClientSysState("levelNotify", "t2d", players[i]); + } + } + } +} +teleport_2d_audio_nopad( player ) +{ + self endon( "fx_done" ); + for ( i = 0; i < player.size; i++ ) + { + if ( isdefined( player[i] ) ) + { + setClientSysState("levelNotify", "t2dn", player[i]); + } + } +} +teleport_2d_audio_specialroom_start( player ) +{ + self endon( "fx_done" ); + for ( i = 0; i < player.size; i++ ) + { + if ( isdefined( player[i] ) ) + { + setClientSysState("levelNotify", "tss", player[i]); + } + } +} +teleport_2d_audio_specialroom_go( player ) +{ + self endon( "fx_done" ); + for ( i = 0; i < player.size; i++ ) + { + if ( isdefined( player[i] ) ) + { + setClientSysState("levelNotify", "tsg", player[i]); + } + } +} +teleport_nuke( max_zombies, range ) +{ + zombies = getaispeciesarray("axis"); + zombies = get_array_of_closest( self.origin, zombies, undefined, max_zombies, range ); + for (i = 0; i < zombies.size; i++) + { + wait (randomfloatrange(0.2, 0.3)); + if( !IsDefined( zombies[i] ) ) + { + continue; + } + if( isDefined( zombies[i].animname ) && + ( zombies[i].animname != "boss_zombie" && zombies[i].animname != "ape_zombie" && zombies[i].animname != "zombie_dog" ) && + zombies[i].health < 5000) + { + zombies[i] maps\_zombiemode_spawner::zombie_head_gib(); + } + zombies[i] dodamage( zombies[i].health + 100, zombies[i].origin ); + playsoundatposition( "nuked", zombies[i].origin ); + } +} +teleporter_vo_play( vox_type, pre_wait ) +{ + if(!isdefined( pre_wait )) + { + pre_wait = 0; + } + index = maps\_zombiemode_weapons::get_player_index(self); + plr = "plr_" + index + "_"; + wait(pre_wait); + self maps\_zombiemode_audio::create_and_play_dialog( plr, vox_type, 0.25 ); +} +teleport_aftereffects() +{ + if( GetDvar( #"theaterAftereffectOverride" ) == "-1" ) + { + self thread [[ level.teleport_ae_funcs[RandomInt(level.teleport_ae_funcs.size)] ]](); + } + else + { + self thread [[ level.teleport_ae_funcs[int(GetDvar( #"theaterAftereffectOverride" ))] ]](); + } +} +teleport_aftereffect_shellshock() +{ + println( "*** Explosion Aftereffect***\n" ); + self shellshock( "explosion", 3 ); +} +teleport_aftereffect_shellshock_electric() +{ + println( "***Electric Aftereffect***\n" ); + self shellshock( "electrocution", 3 ); +} +teleport_aftereffect_fov() +{ + setClientSysState( "levelNotify", "teleport_ae_start", self ); +} +teleport_aftereffect_bw_vision( localClientNum ) +{ + setClientSysState( "levelNotify", "teleport_ae_start", self ); +} +teleport_aftereffect_red_vision( localClientNum ) +{ + setClientSysState( "levelNotify", "teleport_ae_start", self ); +} +teleport_aftereffect_flashy_vision( localClientNum ) +{ + setClientSysState( "levelNotify", "teleport_ae_start", self ); +} +teleport_aftereffect_flare_vision( localClientNum ) +{ + setClientSysState( "levelNotify", "teleport_ae_start", self ); +} +zombieTheaterTeleporterSeekLogic() +{ + inteleportcount = 0; + nonteleportinvalidcount = 0; + poi1 = getent("teleporter_poi1", "targetname"); + poi2 = getent("teleporter_poi2", "targetname"); + players = getplayers(); + for(i=0; i < players.size; i++) + { + if (IsDefined(players[i].inteleportation) && players[i].inteleportation == true) + inteleportcount++; + if (!is_player_valid( players[i]) && (!IsDefined(players[i].inteleportation) || players[i].inteleportation == false)) + nonteleportinvalidcount++; + } + if (inteleportcount > 0 && (inteleportcount == players.size || (inteleportcount + nonteleportinvalidcount == players.size))) + { + if (!poi1.poi_active && !poi2.poi_active) + { + poi1 activate_zombie_point_of_interest(); + poi2 activate_zombie_point_of_interest(); + } + } + else if (inteleportcount != players.size) + { + if (poi1.poi_active && poi2.poi_active) + { + if(isDefined(poi1.attractor_array)) + { + poi1 deactivate_zombie_point_of_interest(); + } + if(isDefined(poi2.attractor_array)) + { + poi2 deactivate_zombie_point_of_interest(); + } + } + if (inteleportcount > 0) + { + for(i=0; i < players.size; i++) + { + if ((IsDefined(players[i].inteleportation) && players[i].inteleportation == true)) + self.ignore_player = array_add(self.ignore_player, players[i]); + } + } + } +} +zombies_goto_position(position) +{ + self endon( "death" ); + self endon( "bad_path" ); + orig_radius = self.goalradius; + self.ignoreall = true; + self.goalradius = 128; + self SetGoalPos(position.origin + (RandomFloatRange(-40,40), RandomFloatRange(-40,40), 0)); + self waittill( "goal" ); + self.ignoreall = false; + self.goalradius = orig_radius; + self OrientMode( "face point", level.extracam_screen.origin ); +} +start_wall_clock() +{ + self RotatePitch( 180, 0.05 ); + self waittill( "rotatedone" ); + clocktime = 0; + while(clocktime !=30) + { + self RotatePitch( 6, 0.1 ); + wait(1); + clocktime++; + } + wait(5.0); + self RotateTo( level.second_hand_angles, 0.05 ); +} +movie_graveyard_return() +{ + trigger = getent("teleporter_exit_graveyard", "targetname"); + trigger setcursorhint( "HINT_NOICON" ); + trigger sethintstring( &"ZOMBIE_USE_TELEPORTER" , level.teleport_cost); + if ( isdefined( trigger ) ) + { + while ( 1 ) + { + trigger waittill( "trigger", user ); + trigger sethintstring( "" ); + level notify("return_from_graveyard"); + wait (60); + trigger sethintstring( &"ZOMBIE_USE_TELEPORTER", level.teleport_cost ); + } + } +} +film_grain_init() +{ + grain = newClientHudElem( self ); + grain.x = 0; + grain.y = 0; + grain.alignX = "left"; + grain.alignY = "top"; + grain.horzAlign = "fullscreen"; + grain.vertAlign = "fullscreen"; + grain.foreground = true; + grain setshader ("ac130_overlay_grain", 640, 480); + grain.alpha = 0.5; + VisionSetNaked( "cheat_bw", 0.5 ); + level waittill("return_from_graveyard"); + VisionSetNaked( "default", 0 ); + grain Destroy(); +} +eeroom_powerup_drop() +{ + struct_array = getstructarray( "struct_random_powerup_post_teleport", "targetname" ); + powerup_array = []; + powerup_array[ powerup_array.size ] = "nuke"; + powerup_array[ powerup_array.size ] = "insta_kill"; + powerup_array[ powerup_array.size ] = "double_points"; + powerup_array[ powerup_array.size ] = "carpenter"; + powerup_array[ powerup_array.size ] = "fire_sale"; + powerup_array[ powerup_array.size ] = "full_ammo"; + powerup_array[ powerup_array.size ] = "minigun"; + struct_array = array_randomize( struct_array ); + powerup_array = array_randomize( powerup_array ); + level thread maps\_zombiemode_powerups::specific_powerup_drop( powerup_array[0], struct_array[0].origin ); +} +theater_fly_me_to_the_moon_init() +{ + funny_trigger = GetEnt( "trigger_jump", "targetname" ); + to_the_moon_alice_trigger = GetEnt( "trigger_fly_me_to_the_moon", "targetname" ); + funny_trigger thread theater_player_jumps(); + to_the_moon_alice_trigger thread theater_fly_me_to_the_moon(); +} +theater_player_jumps() +{ + while( IsDefined( self ) ) + { + self waittill( "trigger", who ); + if( !IsDefined( who._moon_jumps ) ) + { + who._moon_jumps = 0; + } + self trigger_thread( who, ::theater_moon_jumps, ::theater_moon_jumps_clear ); + } +} +theater_moon_jumps( guy, str_endon ) +{ + self endon( str_endon ); + while( true ) + { + if( guy JumpButtonPressed() ) + { + guy._moon_jumps = guy._moon_jumps + 1; + wait( 0.9 ); + } + wait( 0.1 ); + } +} +theater_moon_jumps_clear( guy ) +{ + if( guy._moon_jumps < 5 ) + { + guy._moon_jumps = 0; + } +} +theater_fly_me_to_the_moon() +{ + self SetHintString( "" ); + self SetCursorHint( "HINT_NOICON" ); + while( IsDefined( self ) ) + { + self waittill( "trigger", who ); + if( !IsDefined( who._moon_jumps ) + || who._moon_jumps < 5 ) + { + wait( 0.1 ); + continue; + } + if( IsDefined( who._moon_jumps ) && who._moon_jumps >= 5 ) + { + level theater_moon_jump_go(); + who._moon_jumps = 0; + } + } +} +theater_moon_jump_go() +{ + ship = GetEnt( "model_zombie_rocket", "targetname" ); + blast_off_fx = level._effect["fx_mp_pipe_steam"]; + ship_base_origin = ship.origin; + ship.fx_spot = Spawn( "script_model", ship.origin + ( 0, 0, -19 ) ); + ship.fx_spot SetModel( "tag_origin" ); + ship.fx_spot.angles = ( 90, 0, 0 ); + ship.fx_spot LinkTo( ship ); + wait( 0.1 ); + PlayFXOnTag( blast_off_fx, ship.fx_spot, "tag_origin" ); + ship MoveZ( 120, 3.0, 0.7, 0 ); + ship waittill( "movedone" ); + ship.fx_spot Unlink(); + ship.fx_spot Delete(); + ship Hide(); + ship MoveTo( ship_base_origin, 0.1 ); + ship waittill( "movedone" ); + ship Show(); +} \ No newline at end of file diff --git a/BO1/PC/ZM/maps/zombietron.gsc b/BO1/PC/ZM/maps/zombietron.gsc new file mode 100644 index 0000000..895cbf0 --- /dev/null +++ b/BO1/PC/ZM/maps/zombietron.gsc @@ -0,0 +1,432 @@ +#include maps\_utility; +#include common_scripts\utility; +#include maps\_zombietron_utility; +main() +{ + maps\zombietron_fx::main(); + level._ZOMBIE_GIB_PIECE_INDEX_ALL = 0; + level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_ARM = 1; + level._ZOMBIE_GIB_PIECE_INDEX_LEFT_ARM = 2; + level._ZOMBIE_GIB_PIECE_INDEX_RIGHT_LEG = 3; + level._ZOMBIE_GIB_PIECE_INDEX_LEFT_LEG = 4; + level._ZOMBIE_GIB_PIECE_INDEX_HEAD = 5; + level._ZOMBIE_GIB_PIECE_INDEX_GUTS = 6; + precache_shaders(); + precache_models(); + init_dvars(); + init_strings(); + init_levelvars(); + init_animscripts(); + init_sounds(); + init_shellshocks(); + init_flags(); + init_fx(); + level thread zombie_devgui_think(); + maps\_zombietron_challenges::main(); + maps\_zombietron_main::main(); + maps\createart\zombietron_art::main(); + setDvar( "scr_expDeathMayMoveCheck", "off" ); +} +onPlayerConnect() +{ + self notify("onPlayerConnect"); + self endon ("onPlayerConnect"); + for( ;; ) + { + level waittill( "connecting", player ); + player.entity_num = player GetEntityNumber(); + player thread onPlayerSpawned(); + player thread onPlayerDisconnect(); + player thread maps\_zombietron_pickups::update_drop_bomb(); + player thread maps\_zombietron_pickups::update_drop_booster(); + player.stats["kills"] = 0; + player.stats["score"] = 0; + } +} +cheat_Callback_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, modelIndex, psOffsetTime) +{ + return 0; +} +onPlayerDisconnect() +{ + self waittill( "disconnect" ); +} +onPlayerSpawned() +{ + self endon( "disconnect" ); + for( ;; ) + { + self waittill( "spawned_player" ); + wait 1; + self SetDepthOfField( 0, 0, 512, 4000, 4, 0 ); + self SetPlayerCollision( 1 ); + self maps\_zombietron_main::player_reset_score(); + self.default_movespeed = 1; + self.score_total = self.score; + self.old_score = self.score; + self.team_num = 0; + self.default_weap = "m60_zt"; + self TakeAllWeapons(); + self.next_extra_life = level.zombie_vars["extra_life_at_every"]; + self.pointBarInc = level.zombie_vars["prize_increment"]; + self maps\_zombietron_score::update_hud(); + self setTeamForEntity( "allies" ); + self DisableWeaponCycling(); + self AllowJump( false ); + self AllowCrouch( false ); + self AllowSprint( false ); + self SetStance("stand"); + self.dog_damage_func = maps\_zombietron_ai_dog::dog_player_damage; + self maps\_zombietron_score::update_multiplier_bar( 0 ); + self SetClientDvars ( "cg_objectiveIndicatorFarFadeDist", "120000", + "cg_objectiveIndicatornearFadeDist", "0", + "ik_enable", 0, + "cg_drawCrosshair", 0, + "bg_legYawTolerance", 0 ); + self setClientDvars( "aim_lockon_pitch_strength", 0.0, "hud_drawHUD","1","cl_scoreDraw","1" ); + SetSavedDvar("phys_maxFloatTime",10000); + level.xenon = ( GetDvar( #"xenonGame" ) == "true" ); + if ( !isDefined(level.xenon) ) + { + level.xenon = false; + } + self TakeAllWeapons(); + self GiveWeapon( self.default_weap ); + self switchToWeapon( self.default_weap ); + self SetSpawnWeapon( self.default_weap ); + self thread setup_smashtv_loadout(); + self thread ammo(); + if( !isDefined(self.initialized) || self.initialized == false ) + { + self.initialized = true; + playtag = "player" + (self.entity_num+1) + "_light"; + self.light_playFX = playtag; + PlayFxOnTag( level._effect[playtag], self, "tag_origin" ); + self thread breadcrumb_point_thread( 30, 0.5 ); + } + } +} +precache_shaders() +{ + PreCacheShader("cinematic"); + PrecacheShader( "zom_icon_community_pot" ); + PrecacheShader( "zom_icon_community_pot_strip" ); + PrecacheShader( "zom_icon_player_life" ); + PrecacheShader( "zom_pack_a_punch_battery_icon" ); + PrecacheShader( "text_box" ); +} +precache_models() +{ + precachemodel( "char_ger_zombieeye" ); + PrecacheModel( "zombie_z_money_icon" ); + PrecacheModel( "anim_chicken" ); + PrecacheModel( "zombie_teleporter_pad" ); + PrecacheModel( "c_usa_blackops_body3_fb"); + PrecacheModel( "c_usa_blackops_body3_fb_zt"); + PrecacheModel( "c_zom_blue_guy_fb_zt"); + PrecacheModel( "c_zom_red_guy_fb_zt"); + PrecacheModel( "c_zom_yellow_guy_fb_zt"); + PrecacheModel( "c_zom_blue_guy_fb"); + PrecacheModel( "c_zom_red_guy_fb"); + PrecacheModel( "c_zom_yellow_guy_fb"); +} +init_shellshocks() +{ + level.player_killed_shellshock = "zombie_death"; + PrecacheShellshock( level.player_killed_shellshock ); +} +init_strings() +{ +} +init_sounds() +{ + add_sound( "end_of_round", "mus_zmb_round_over" ); + add_sound( "end_of_game", "mus_zmb_game_over" ); + add_sound( "chalk_one_up", "mus_zmb_chalk" ); + add_sound( "purchase", "zmb_cha_ching" ); + add_sound( "no_purchase", "zmb_no_cha_ching" ); + add_sound( "playerzombie_usebutton_sound", "zmb_zombie_vocals_attack" ); + add_sound( "playerzombie_attackbutton_sound", "zmb_zombie_vocals_attack" ); + add_sound( "playerzombie_adsbutton_sound", "zmb_zombie_vocals_attack" ); + add_sound( "zombie_head_gib", "zmb_zombie_head_gib" ); + add_sound( "door_slide_open", "zmb_door_slide_open" ); + add_sound( "door_rotate_open", "zmb_door_slide_open" ); +} +init_levelvars() +{ + level.dogshit = 0; + level.is_zombie_level = true; + level.in_intermission = false; + level.round_number = 1; + level.arena_round_number = 1; + level.zombie_total = 0; + level.total_zombies_killed = 0; + level.total_boss_killed = 0; + level.hudelem_count = 0; + level.teleporter_spawned = false; + level.flipped = false; + level.epic_boss_battle = false; + level.lastmagical_exit_taken = 0; + level.lastmagical_armory = undefined; + level.magical_exit_taken = false; + level.fates_have_been_chosen = false; + level.active_monkeys = []; + level.active_heli = []; + level.heli_height = 55; + level.music_state_fate_round = false; + level.victory_movie = "zmb_tron_victory"; + level.raining = false; + flag_init("boss_intro_done"); + flag_init("boss_spawn_go"); + flag_init("boss_is_spawned"); + flag_init("boss_is_dead"); + flag_init("round_is_active"); + flag_init("all_players_dead"); + flag_init("exits_open"); + flag_init("barrel_burst1"); + flag_init("barrel_burst2"); + level.previous_exit_taken = "right"; + maps\_zombietron_main::arena_initialize(); + set_zombie_var( "zombie_move_speed",30 ); + set_zombie_var( "zombie_health",1000 ); + set_zombie_var( "zombie_arena_rounds",4 ); + set_zombie_var( "player_speed", 1.5 ); + set_zombie_var( "tank_alive_time", 20 ); + set_zombie_var( "heli_alive_time", 20 ); + set_zombie_var( "mini_turret_time", 30 ); + set_zombie_var( "mini_turret_min_round", 4 ); + set_zombie_var( "player_speed_time", 10 ); + set_zombie_var( "double_shot_time", 40 ); + set_zombie_var( "double_shot_upgrade", 3 ); + set_zombie_var( "barrel_time", 20 ); + set_zombie_var( "tesla_time", 40 ); + set_zombie_var( "stun_time", 20 ); + set_zombie_var( "stun_effect_time", 8 ); + set_zombie_var( "pickup_time", 10 ); + set_zombie_var( "zombie_health_inc", 150); + set_zombie_var( "zombie_speed_inc", 5); + set_zombie_var( "zombie_treasure_regular", 3); + set_zombie_var( "zombie_treasure_weapon_drops_max", 3); + set_zombie_var( "zombie_treasure_weapon_drops_min", 1); + set_zombie_var( "zombie_treasure_boss", 25); + set_zombie_var( "zombie_points_regular", 100); + set_zombie_var( "zombie_points_boss", 30000); + set_zombie_var( "ape_zombie_health", 500000 ); + set_zombie_var( "mini_boss_health", 10000 ); + set_zombie_var( "mini_boss_interval_min", 5 ); + set_zombie_var( "mini_boss_interval_max", 10 ); + set_zombie_var( "mini_boss_spawn_percentage", 30 ); + set_zombie_var( "dog_fire_trail_percent", 50); + set_zombie_var( "fate_level_min", 13); + set_zombie_var( "fate_level_max", 15); + set_zombie_var( "fate_level_chance", 30); + set_zombie_var( "fate_fortune_drop_mod", 2); + set_zombie_var( "fate_wait", 30); + set_zombie_var( "max_lives", 9 ); + set_zombie_var( "max_bombs", 9 ); + set_zombie_var( "max_boost", 9 ); + set_zombie_var( "max_multiplier", 9 ); + set_zombie_var( "prize_increment", 20 ); + set_zombie_var( "max_prize_inc_range", 512 ); + set_zombie_var( "prize_points", 125 ); + set_zombie_var( "rare_price_percentage", 1 ); + set_zombie_var( "min_extra_life_spawn_time", 240 ); + set_zombie_var( "max_extra_life_spawn_time", 540 ); + set_zombie_var( "monkey_fuse_time", 10 ); + set_zombie_var( "monkey_attract_dist", 300 ); + set_zombie_var( "extra_life_at_every", 200000 ); + set_zombie_var( "boss_taunt_percent_per_level", 10 ); + set_zombie_var( "powerup_timeout", 12 ); + set_zombie_var( "powerup_uber_timeout", 24 ); + set_zombie_var( "sacred_cow_chance", 5 ); + set_zombie_var( "moss_martyrdom_chance", 20 ); + set_zombie_var( "armory_chance", 20 ); + set_zombie_var( "zombie_max_waves", 30 ); + set_zombie_var( "auto_respawn_timeout", 60 ); + level.zombie_health = level.zombie_vars["zombie_health"]; + level.zombie_move_speed = level.zombie_vars["zombie_move_speed"]; + level.default_ai_limit = 32; + SetAILimit( level.default_ai_limit ); + if ( GetDvar( #"zombie_dog_animset" ) == "" ) + { + SetDvar( "zombie_dog_animset", "zombie" ); + } +} +init_dvars() +{ + setSavedDvar( "fire_world_damage", "0" ); + setSavedDvar( "fire_world_damage_rate", "0" ); + setSavedDvar( "fire_world_damage_duration", "0" ); + SetSavedDvar( "sv_restrictedtempents", "1"); +} +init_flags() +{ +} +init_fx() +{ + maps\_zombietron_ai_ape::precache_ape_fx(); + maps\_zombietron_ai_dog::precache_dog_fx(); + maps\_zombietron_ai_engineer::precache_engineer_fx(); +} +#using_animtree( "generic_human" ); +init_standard_zombie_anims() +{ + level.scr_anim["zombie"]["death1"] = %ai_zombie_death_v1; + level.scr_anim["zombie"]["death2"] = %ai_zombie_death_v2; + level.scr_anim["zombie"]["death3"] = %ai_zombie_crawl_death_v1; + level.scr_anim["zombie"]["death4"] = %ai_zombie_crawl_death_v2; + level.scr_anim["zombie"]["walk1"] = %ai_zombie_walk_v1; + level.scr_anim["zombie"]["walk2"] = %ai_zombie_walk_v2; + level.scr_anim["zombie"]["walk3"] = %ai_zombie_walk_v3; + level.scr_anim["zombie"]["walk4"] = %ai_zombie_walk_v4; + level.scr_anim["zombie"]["walk5"] = %ai_zombie_walk_v6; + level.scr_anim["zombie"]["walk6"] = %ai_zombie_walk_v7; + level.scr_anim["zombie"]["walk7"] = %ai_zombie_walk_v8; + level.scr_anim["zombie"]["walk8"] = %ai_zombie_walk_v9; + level.scr_anim["zombie"]["run1"] = %ai_zombie_walk_fast_v1; + level.scr_anim["zombie"]["run2"] = %ai_zombie_walk_fast_v2; + level.scr_anim["zombie"]["run3"] = %ai_zombie_walk_fast_v3; + level.scr_anim["zombie"]["run4"] = %ai_zombie_run_v2; + level.scr_anim["zombie"]["run5"] = %ai_zombie_run_v4; + level.scr_anim["zombie"]["run6"] = %ai_zombie_run_v3; + level.scr_anim["zombie"]["sprint1"] = %ai_zombie_sprint_v1; + level.scr_anim["zombie"]["sprint2"] = %ai_zombie_sprint_v2; + level.scr_anim["zombie"]["sprint3"] = %ai_zombie_sprint_v1; + level.scr_anim["zombie"]["sprint4"] = %ai_zombie_sprint_v2; + level.scr_anim["zombie"]["crawl1"] = %ai_zombie_crawl; + level.scr_anim["zombie"]["crawl2"] = %ai_zombie_crawl_v1; + level.scr_anim["zombie"]["crawl3"] = %ai_zombie_crawl_v2; + level.scr_anim["zombie"]["crawl4"] = %ai_zombie_crawl_v3; + level.scr_anim["zombie"]["crawl5"] = %ai_zombie_crawl_v4; + level.scr_anim["zombie"]["crawl6"] = %ai_zombie_crawl_v5; + level.scr_anim["zombie"]["crawl_hand_1"] = %ai_zombie_walk_on_hands_a; + level.scr_anim["zombie"]["crawl_hand_2"] = %ai_zombie_walk_on_hands_b; + level.scr_anim["zombie"]["crawl_sprint1"] = %ai_zombie_crawl_sprint; + level.scr_anim["zombie"]["crawl_sprint2"] = %ai_zombie_crawl_sprint_1; + level.scr_anim["zombie"]["crawl_sprint3"] = %ai_zombie_crawl_sprint_2; + if( !isDefined( level._zombie_melee ) ) + { + level._zombie_melee = []; + } + if( !isDefined( level._zombie_walk_melee ) ) + { + level._zombie_walk_melee = []; + } + if( !isDefined( level._zombie_run_melee ) ) + { + level._zombie_run_melee = []; + } + level._zombie_melee["zombie"] = []; + level._zombie_walk_melee["zombie"] = []; + level._zombie_run_melee["zombie"] = []; + level._zombie_melee["zombie"][0] = %ai_zombie_attack_v2; + level._zombie_melee["zombie"][1] = %ai_zombie_attack_v4; + level._zombie_melee["zombie"][2] = %ai_zombie_attack_v6; + level._zombie_melee["zombie"][3] = %ai_zombie_attack_v1; + level._zombie_melee["zombie"][4] = %ai_zombie_attack_forward_v1; + level._zombie_melee["zombie"][5] = %ai_zombie_attack_forward_v2; + level._zombie_run_melee["zombie"][0] = %ai_zombie_run_attack_v1; + level._zombie_run_melee["zombie"][1] = %ai_zombie_run_attack_v2; + level._zombie_run_melee["zombie"][2] = %ai_zombie_run_attack_v3; + if( isDefined( level.zombie_anim_override ) ) + { + [[ level.zombie_anim_override ]](); + } + level._zombie_walk_melee["zombie"][0] = %ai_zombie_walk_attack_v1; + level._zombie_walk_melee["zombie"][1] = %ai_zombie_walk_attack_v2; + level._zombie_walk_melee["zombie"][2] = %ai_zombie_walk_attack_v3; + level._zombie_walk_melee["zombie"][3] = %ai_zombie_walk_attack_v4; + if( !isDefined( level._zombie_melee_crawl ) ) + { + level._zombie_melee_crawl = []; + } + level._zombie_melee_crawl["zombie"] = []; + level._zombie_melee_crawl["zombie"][0] = %ai_zombie_attack_crawl; + level._zombie_melee_crawl["zombie"][1] = %ai_zombie_attack_crawl_lunge; + if( !isDefined( level._zombie_stumpy_melee ) ) + { + level._zombie_stumpy_melee = []; + } + level._zombie_stumpy_melee["zombie"] = []; + level._zombie_stumpy_melee["zombie"][0] = %ai_zombie_walk_on_hands_shot_a; + level._zombie_stumpy_melee["zombie"][1] = %ai_zombie_walk_on_hands_shot_b; + if( !isDefined( level._zombie_deaths ) ) + { + level._zombie_deaths = []; + } + level._zombie_deaths["zombie"] = []; + level._zombie_deaths["zombie"][0] = %ch_dazed_a_death; + level._zombie_deaths["zombie"][1] = %ch_dazed_b_death; + level._zombie_deaths["zombie"][2] = %ch_dazed_c_death; + level._zombie_deaths["zombie"][3] = %ch_dazed_d_death; + if( !isDefined( level._zombie_rise_anims ) ) + { + level._zombie_rise_anims = []; + } + level._zombie_rise_anims["zombie"] = []; + level._zombie_rise_anims["zombie"][1]["walk"][0] = %ai_zombie_traverse_ground_v1_walk; + level._zombie_rise_anims["zombie"][1]["run"][0] = %ai_zombie_traverse_ground_v1_run; + level._zombie_rise_anims["zombie"][1]["sprint"][0] = %ai_zombie_traverse_ground_climbout_fast; + level._zombie_rise_anims["zombie"][2]["walk"][0] = %ai_zombie_traverse_ground_v2_walk_altA; + if( !isDefined( level._zombie_rise_death_anims ) ) + { + level._zombie_rise_death_anims = []; + } + level._zombie_rise_death_anims["zombie"] = []; + level._zombie_rise_death_anims["zombie"][1]["in"][0] = %ai_zombie_traverse_ground_v1_deathinside; + level._zombie_rise_death_anims["zombie"][1]["in"][1] = %ai_zombie_traverse_ground_v1_deathinside_alt; + level._zombie_rise_death_anims["zombie"][1]["out"][0] = %ai_zombie_traverse_ground_v1_deathoutside; + level._zombie_rise_death_anims["zombie"][1]["out"][1] = %ai_zombie_traverse_ground_v1_deathoutside_alt; + level._zombie_rise_death_anims["zombie"][2]["in"][0] = %ai_zombie_traverse_ground_v2_death_low; + level._zombie_rise_death_anims["zombie"][2]["in"][1] = %ai_zombie_traverse_ground_v2_death_low_alt; + level._zombie_rise_death_anims["zombie"][2]["out"][0] = %ai_zombie_traverse_ground_v2_death_high; + level._zombie_rise_death_anims["zombie"][2]["out"][1] = %ai_zombie_traverse_ground_v2_death_high_alt; + if( !isDefined( level._zombie_run_taunt ) ) + { + level._zombie_run_taunt = []; + } + level._zombie_run_taunt["zombie"] = []; +} +init_animscripts() +{ + animscripts\zombie_init::firstInit(); + animscripts\zombie_dog_init::initDogAnimations(); + anim.idleAnimArray ["stand"] = []; + anim.idleAnimWeights ["stand"] = []; + anim.idleAnimArray ["stand"][0][0] = %ai_zombie_idle_v1_delta; + anim.idleAnimWeights ["stand"][0][0] = 10; + anim.idleAnimArray ["crouch"] = []; + anim.idleAnimWeights ["crouch"] = []; + anim.idleAnimArray ["crouch"][0][0] = %ai_zombie_idle_crawl_delta; + anim.idleAnimWeights ["crouch"][0][0] = 10; + init_standard_zombie_anims(); + maps\_zombietron_ai_ape::init_ape_zombie_anims(); + maps\_zombietron_ai_quad::init_quad_zombie_anims(); + maps\_zombietron_ai_engineer::init_engineer_zombie_anims(); +} +force_game_controller_bindings() +{ + level.dogshit ++; + level.dogshit = level.dogshit & 7; + players = GetPlayers(); + for(i=0;i +// { +// +// { +// [DEFAULT / [], ...] +// { +// [sound ] +// [sound ] +// ... +// } +// } +// } +// +// legend: +// +// : relaxed, alert, combat +// +// : idle, idlecr, idleprone, +// walk, walkbk, walkcr, walkcrbk, walkprone, walkpronebk. +// run, runbk, runcr, runcrbk, +// straferight, strafeleft, turnright, turnleft +// +// : playerAnimType, weaponclass, position, enemy_weapon, underwater, mounted, movestatus, underhand, leaning, weapon_position, perk, cac +// +// : +// +// playerAnimType: +// position: behind, infront, right, left +// enemy_weapon: +// underwater: +// mounted: mg42 +// movestatus: +// underhand: +// leaning: right, left +// weaponclass: rifle, sniper, smg, mg, pistol, grenade, rocketlauncher, flamethrower, turret, non-player +// weapon_position: hip, ads +// direction: not, left, right - will never be left or right while moving backward +// perk: laststand, grenadedeath +// attachment: bayonet +// cac: +// +// NOTES: +// - The player walks when they are ADS, so they can not ADS while running. +// + +ANIMATIONS + +STATE COMBAT +{ + idle + { +//#FOR_ALL_VEHICLES +// vehicle_name %vehicle_name, vehicle_seat_to gunner1 +// { +// both %vehicle_name + Gunner_aim turretanim +// } +//#END_FOR_ALL_VEHICLES + vehicle_name sitting_jeep, vehicle_seat_to driver + { + both sitting_jeepgunner_aim turretanim + } + + vehicle_name huey, vehicle_seat_to driver + { + both sitting_jeepgunner_aim turretanim + } +// vehicle_name huey, vehicle_seat_to gunner1 +// { +// both hueygunner1_aim turretanim +// } +// vehicle_name huey, vehicle_seat_to gunner2 +// { +// both hueygunner2_aim turretanim +// } + vehicle_name huey, vehicle_seat_to passenger1 + { + both hueypassenger1_aim turretanim + } + vehicle_name huey, vehicle_seat_to passenger2 + { + both hueypassenger2_aim turretanim + } + vehicle_name huey, vehicle_seat_to passenger3 + { + both hueypassenger3_aim turretanim + } + vehicle_name huey, vehicle_seat_to passenger4 + { + both hueypassenger4_aim turretanim + } + vehicle_name huey, vehicle_seat_to passenger5 + { + both hueypassenger5_aim turretanim + } + vehicle_name huey, vehicle_seat_to passenger6 + { + both hueypassenger6_aim turretanim + } + + vehicle_name pbr, vehicle_seat_to driver + { + both pbrdriver turretanim + } + //vehicle_name pbr, vehicle_seat_to gunner1 + //{ + // both pbrgunner1_aim turretanim + //} + //vehicle_name pbr, vehicle_seat_to gunner2 + //{ + // both pbrgunner2_aim turretanim + //} + //vehicle_name pbr, vehicle_seat_to gunner3 + //{ + // both pbrgunner1_aim turretanim + //} + //vehicle_name pbr, vehicle_seat_to gunner4 + //{ + // both pbrgunner2_aim turretanim + //} + + mounted mg42, stance prone + { + both proneSAWgunner_aim turretanim + } + mounted mg42, stance crouch + { + both crouchSAWgunner_aim turretanim + } + mounted mg42 + { + both standSAWgunner_aim turretanim + } + // LASTSTAND + perk laststand, stance prone + { + both pb_laststand_idle + } + perk laststand, stance crouch + { + both pb_laststand_idle + } + perk laststand + { + both pb_laststand_idle + } + // REMOTE CONTROL + playerAnimType remotecontrol, stance prone + { + both pb_rc_prone_idle + } + playerAnimType remotecontrol, stance crouch + { + both pb_rc_crouch_idle + } + playerAnimType remotecontrol + { + both pb_rc_stand_idle + } + // RADIO + playerAnimType radio, stance prone + { + both p_handheldradio_prone_idle + } + playerAnimType radio, stance crouch + { + both p_handheldradio_crouch_idle + } + playerAnimType radio + { + both p_handheldradio_idle + } + // REVIVER + playerAnimType reviver, stance prone + { + torso p_prone_revive_reviving + } + playerAnimType reviver, stance crouch + { + torso p_crouch_revive_reviving + } + playerAnimType reviver + { + torso p_revive_reviving + } + // HATCHET + playerAnimType hatchet, stance prone + { + both pb_tomahawk_prone_idle + } + playerAnimType hatchet, stance crouch + { + both pb_tomahawk_crouch_idle + } + playerAnimType hatchet + { + both pb_tomahawk_stand_idle + } + // NONE + playerAnimType none, stance prone + { + both pb_prone_bombplant + } + playerAnimType none, stance crouch + { + both pb_crouch_bombplant + } + playerAnimType none + { + both pb_stand_bombplant + } + // BRIEFCASE BOMB + playerAnimType briefcase, stance prone + { + both pb_prone_bombplant + } + playerAnimType briefcase, stance crouch + { + both pb_crouch_bombplant + } + playerAnimType briefcase + { + both pb_stand_bombplant + } + // MINIGUN + playerAnimType minigun, stance crouch + { + both pb_minigun_crouch_idle + } + playerAnimType minigun + { + both pb_minigun_stand_idle + } + // HOLD + playerAnimType hold, stance prone + { + both pb_prone_hold + } + playerAnimType hold, stance crouch + { + both pb_crouch_hold_idle + } + playerAnimType hold + { + both pb_hold_idle + } + // CREATE A CLASS + playerAnimType dualwield, cac + { + both pb_dw_stand_cac_idle + } + playerAnimType ballisticknife, cac + { + both pb_b_knife_cac_idle + } + weaponclass mg, cac + { + both pb_lmg_stand_cac_idle + } + weaponclass spread, cac + { + both pb_shot_stand_cac_idle + } + playerAnimType m203, cac // China lake + { + both pb_shot_stand_cac_idle + } + weaponclass smg, cac + { + both pb_uzi_stand_cac_idle + } + playerAnimType sniper AND rearclipsniper, cac + { + both pb_sniper_stand_cac_idle + } + weaponclass rifle, cac + { + both pb_rifle_stand_cac_idle + } + weaponclass pistol, cac + { + both pb_pistol_stand_cac_idle + } + weaponclass rocketlauncher, cac + { + both pb_rpg_stand_cac_idle + } + //BALLISTIC KNIFE + playerAnimType ballisticknife, stance prone + { + both pb_b_knife_prone_idle + } + playerAnimType ballisticknife, stance crouch + { + both pb_b_knife_crouch_idle + } + playerAnimType ballisticknife + { + both pb_b_knife_stand_idle + } + // DUALWIELD + playerAnimType dualwield, stance prone + { + both pb_prone_dw_idle_v1 + } + playerAnimType dualwield, stance crouch + { + both pb_crouch_dw_idle_v1 + } + playerAnimType dualwield + { + both pb_dw_botharms_idle_v1 + } + // PISTOL + weaponclass pistol, weapon_position ads, stance prone + { + both pb_prone_aim_ads_pistol + } + weaponclass pistol, stance prone + { + both pb_prone_aim_pistol + } + weaponclass pistol, weapon_position ads, stance crouch + { + both pb_crouch_ads_pistol + } + weaponclass pistol, stance crouch + { + both pb_crouch_alert_pistol + } + weaponclass pistol, weapon_position ads + { + both pb_stand_ads_pistol + } + weaponclass pistol + { + both pb_stand_alert_pistol + } + // RPG + weaponclass rocketlauncher, stance prone + { + both pb_prone_aim_RPG + } + weaponclass rocketlauncher, weapon_position ads, stance crouch + { + both pb_crouch_ads_RPG + } + weaponclass rocketlauncher, stance crouch + { + both pb_crouch_alert_RPG + } + weaponclass rocketlauncher, weapon_position ads + { + both pb_stand_ads_RPG + } + weaponclass rocketlauncher + { + both pb_stand_alert_RPG + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly, stance prone + { + both pb_grenade_prone_idle grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, stance crouch + { + both pb_grenade_crouch_idle grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_stand_idle grenadeAnim + } + // DEFAULT + weapon_position ads, stance prone + { + both pb_prone_aim_ads + } + stance prone + { + both pb_prone_aim + } + weapon_position ads, stance crouch + { + both pb_crouch_ads + } + stance crouch // two handed rifle type weapon + { + both pb_crouch_alert + } + weapon_position ads + { + both pb_stand_ads + } + default // two handed rifle type weapon + { + both pb_stand_alert + } + } + +// STUMBLE + stumble + { + // HOLD + playerAnimType hold, direction left + { + both pb_hold_stumble_left + } + playerAnimType hold, direction right + { + both pb_hold_stumble_right + } + playerAnimType hold, direction backward + { + both pb_hold_stumble_back + } + playerAnimType hold, direction forward + { + both pb_hold_stumble_forward + } + // DUAL WIELD + playerAnimType dualwield AND ballisticknife, direction left + { + both pb_dw_stumble_left + } + playerAnimType dualwield AND ballisticknife, direction right + { + both pb_dw_stumble_right + } + playerAnimType dualwield AND ballisticknife, direction backward + { + both pb_dw_stumble_back + } + playerAnimType dualwield AND ballisticknife, direction forward + { + both pb_dw_stumble_forward + } + // PISTOL + weaponclass pistol, direction left + { + both pb_stumble_pistol_left + } + weaponclass pistol, direction right + { + both pb_stumble_pistol_right + } + weaponclass pistol, direction backward + { + both pb_stumble_pistol_back + } + weaponclass pistol, direction forward + { + both pb_stumble_pistol_forward + } + // GRENADE + weaponclass grenade, direction left, playerAnimType grenadeonly + { + both pb_stumble_grenade_left grenadeAnim + } + weaponclass grenade, direction right, playerAnimType grenadeonly + { + both pb_stumble_grenade_right grenadeAnim + } + weaponclass grenade, direction backward, playerAnimType grenadeonly + { + both pb_stumble_grenade_back grenadeAnim + } + weaponclass grenade, direction forward, playerAnimType grenadeonly + { + both pb_stumble_grenade_forward grenadeAnim + } + // DEFAULT + direction left + { + both pb_stumble_left + } + direction right + { + both pb_stumble_right + } + direction backward + { + both pb_stumble_back + } + default + { + both pb_stumble_forward + } + } + +// STUMBLE WALK + stumble_walk + { + // HOLD + playerAnimType hold, direction left + { + both pb_hold_stumble_walk_left + } + playerAnimType hold, direction right + { + both pb_hold_stumble_walk_right + } + playerAnimType hold, direction backward + { + both pb_hold_stumble_walk_back + } + playerAnimType hold, direction forward + { + both pb_hold_stumble_walk_forward + } + // DUAL WIELD + playerAnimType dualwield AND ballisticknife, direction left + { + both pb_dw_stumble_walk_left + } + playerAnimType dualwield AND ballisticknife, direction right + { + both pb_dw_stumble_walk_right + } + playerAnimType dualwield AND ballisticknife, direction backward + { + both pb_dw_stumble_walk_back + } + playerAnimType dualwield AND ballisticknife, direction forward + { + both pb_dw_stumble_walk_forward + } + // PISTOL, GRENADE + weaponclass pistol AND grenade, direction left, playerAnimType grenadeonly + { + both pb_stumble_pistol_walk_left + } + weaponclass pistol AND grenade, direction right, playerAnimType grenadeonly + { + both pb_stumble_pistol_walk_right + } + weaponclass pistol AND grenade, direction backward, playerAnimType grenadeonly + { + both pb_stumble_pistol_walk_back + } + weaponclass pistol AND grenade, direction forward, playerAnimType grenadeonly + { + both pb_stumble_pistol_walk_forward + } + // DEFAULT + direction left + { + both pb_stumble_walk_left + } + direction right + { + both pb_stumble_walk_right + } + direction backward + { + both pb_stumble_walk_back + } + default + { + both pb_stumble_walk_forward + } + } + + +// STUMBLE SPRINT + stumble_sprint + { + // DEFAULT + default + { + both pb_stumble_forward + } + } + + shuffle + { + direction forward + { + both pb_rifle_stand_shuffle_f + } + direction backward, + { + both pb_rifle_stand_shuffle_b + } + direction left + { + both pb_rifle_stand_shuffle_l + } + direction right + { + both pb_rifle_stand_shuffle_r + } + } + + walk + { + // LASTSTAND + perk laststand, direction forward + { + both pb_laststand_crawl_forward + } + perk laststand, direction backward + { + both pb_laststand_crawl_back + } + perk laststand, direction right + { + both pb_laststand_crawl_right + } + perk laststand, direction left + { + both pb_laststand_crawl_left + } + // NONE + // Crouch + playerAnimType none, stance crouch + { + both pb_crouch_walk_forward_unarmed + } + // Stand + playerAnimType none + { + both pb_stand_shoot_walk_forward_unarmed + } + // HOLD + // Prone + playerAnimType hold, direction left, stance prone + { + both pb_prone_crawl_left_hold + } + playerAnimType hold, direction right, stance prone + { + both pb_prone_crawl_right_hold + } + playerAnimType hold, direction backward, stance prone + { + both pb_prone_crawl_back_hold + } + playerAnimType hold, stance prone + { + both pb_prone_crawl_hold + } + // Stand + playerAnimType hold, direction left + { + both pb_hold_run_left + } + playerAnimType hold, direction right + { + both pb_hold_run_right + } + playerAnimType hold, direction backward + { + both pb_hold_run_back + } + playerAnimType hold + { + both pb_hold_run + } + // DUALWIELD + // Prone + playerAnimType dualwield AND ballisticknife, direction left, stance prone + { + both pb_prone_dw_crawl_left + } + playerAnimType dualwield AND ballisticknife, direction right, stance prone + { + both pb_prone_dw_crawl_right + } + playerAnimType dualwield AND ballisticknife, direction backward, stance prone + { + both pb_prone_dw_crawl_back + } + playerAnimType dualwield AND ballisticknife, stance prone + { + both pb_prone_dw_crawl_forward + } + // Stand + playerAnimType dualwield, direction left + { + both pb_dw_walk_left + } + playerAnimType dualwield, direction right + { + both pb_dw_walk_right + } + playerAnimType dualwield, direction backward + { + both pb_dw_walk_back + } + playerAnimType dualwield + { + both pb_dw_walk_forward + } + // BALLISTIC KNIFE + playerAnimType ballisticknife, direction left + { + both pb_b_knife_walk_left + } + playerAnimType ballisticknife, direction right + { + both pb_b_knife_walk_right + } + playerAnimType ballisticknife, direction backward + { + both pb_b_knife_walk_back + } + playerAnimType ballisticknife + { + both pb_b_knife_walk_forward + } + // MINIGUN + // Stand + playerAnimType minigun, direction left + { + both pb_minigun_stand_walk_left + } + playerAnimType minigun, direction right + { + both pb_minigun_stand_walk_right + } + playerAnimType minigun, direction backward + { + both pb_minigun_stand_walk_back + } + playerAnimType minigun + { + both pb_minigun_stand_walk + } + // RPG + // Prone + weaponclass rocketlauncher, direction left, stance prone + { + both pb_rpg_prone_crawl_left + } + weaponclass rocketlauncher, direction right, stance prone + { + both pb_rpg_prone_crawl_right + } + weaponclass rocketlauncher, direction backward, stance prone + { + both pb_rpg_prone_crawl_backward + } + weaponclass rocketlauncher, stance prone + { + both pb_rpg_prone_crawl_forward + } + // Crouch + weaponclass rocketlauncher, direction left, stance crouch + { + both pb_crouch_walk_left_RPG + } + weaponclass rocketlauncher, direction right, stance crouch + { + both pb_crouch_walk_right_RPG + } + weaponclass rocketlauncher, direction backward, stance crouch + { + both pb_crouch_walk_back_RPG + } + weaponclass rocketlauncher, stance crouch + { + both pb_crouch_walk_forward_RPG + } + // Stand + weaponclass rocketlauncher, direction left + { + both pb_walk_left_RPG_ads + } + weaponclass rocketlauncher, direction right + { + both pb_walk_right_RPG_ads + } + weaponclass rocketlauncher, direction backward + { + both pb_walk_back_RPG_ads + } + weaponclass rocketlauncher + { + both pb_walk_forward_RPG_ads + } + // PISTOL + // Prone + weaponclass pistol, direction left, stance prone + { + both pb_prone_pistol_crawl_left + } + weaponclass pistol, direction right, stance prone + { + both pb_prone_pistol_crawl_right + } + weaponclass pistol, direction backward, stance prone + { + both pb_prone_crawl_pistol_back + } + weaponclass pistol, stance prone + { + both pb_prone_crawl_pistol + } + // Crouch + weaponclass pistol, direction left, playerAnimType grenadeonly, stance crouch + { + both pb_crouch_walk_left_pistol + } + weaponclass pistol, direction right, playerAnimType grenadeonly, stance crouch + { + both pb_crouch_walk_right_pistol + } + weaponclass pistol, direction backward, playerAnimType grenadeonly, stance crouch + { + both pb_crouch_walk_back_pistol + } + weaponclass pistol, playerAnimType grenadeonly, stance crouch + { + both pb_crouch_walk_forward_pistol + } + // Stand + weaponclass pistol, direction left + { + both pb_combatwalk_left_loop_pistol + } + weaponclass pistol, direction right + { + both pb_combatwalk_right_loop_pistol + } + weaponclass pistol, direction backward + { + both pb_combatwalk_back_loop_pistol + } + weaponclass pistol + { + both pb_combatwalk_forward_loop_pistol + } + // GRENADE + // Prone + weaponclass grenade, direction left, playerAnimType grenadeonly, stance prone + { + both pb_prone_grenade_crawl_left grenadeAnim + } + weaponclass grenade, direction right, playerAnimType grenadeonly, stance prone + { + both pb_prone_grenade_crawl_right grenadeAnim + } + weaponclass grenade, direction backward, playerAnimType grenadeonly, stance prone + { + both pb_prone_grenade_crawl_back grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, stance prone + { + both pb_prone_grenade_crawl grenadeAnim + } + // Stand + weaponclass grenade, direction left, playerAnimType grenadeonly + { + both pb_combatrun_left_loop_grenade grenadeAnim + } + weaponclass grenade, direction right, playerAnimType grenadeonly + { + both pb_combatrun_right_loop_grenade grenadeAnim + } + weaponclass grenade, direction backward, playerAnimType grenadeonly + { + both pb_combatrun_back_loop_grenade grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly + { + both pb_combatrun_forward_loop_stickgrenade grenadeAnim + } + // DEFAULT + // Prone + direction left, stance prone + { + both pb_prone_crawl_left + } + direction right, stance prone + { + both pb_prone_crawl_right + } + direction backward, stance prone + { + both pb_prone_crawl_back + } + direction forward, stance prone + { + both pb_prone_crawl + } + // Crouch + direction left, stance crouch + { + both pb_crouch_shoot_run_left + } + direction right, stance crouch + { + both pb_crouch_shoot_run_right + } + direction backward, stance crouch + { + both pb_crouch_shoot_run_back + } + direction forward, stance crouch // two handed rifle type weapon + { + both pb_crouch_shoot_run_forward + } + // Stand + direction left + { + both pb_stand_shoot_walk_left + } + direction right + { + both pb_stand_shoot_walk_right + } + direction backward + { + both pb_stand_shoot_walk_back + } + default // two handed rifle type weapon + { + both pb_stand_shoot_walk_forward + } + } + + sprint + { + // NONE + playerAnimType none + { + both pb_sprint blendOutTime 200 + } + // HOLD + playerAnimType hold + { + both pb_sprint_hold blendOutTime 200 + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife + { + both pb_dw_sprint blendOutTime 200 + } + // RPG + weaponclass rocketlauncher + { + both pb_sprint_RPG blendOutTime 200 + } + // PISTOL + weaponclass pistol + { + both pb_sprint_pistol blendOutTime 200 + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_sprint blendOutTime 200 + } + default + { + both pb_sprint blendOutTime 200 + } + } + + swim + { + // DEFAULT + movestatus stationary + { + both p_swim_tread + } + direction left + { + both p_swim_left + } + direction right + { + both p_swim_right + } + direction backward + { + both p_swim_tread + } + default + { + both p_swim_forward + } + } + + run + { + // LASTSTAND + perk laststand, direction forward + { + both pb_laststand_crawl_forward + } + perk laststand, direction backward + { + both pb_laststand_crawl_back + } + perk laststand, direction right + { + both pb_laststand_crawl_right + } + perk laststand, direction left + { + both pb_laststand_crawl_left + } + // NONE + // Crouch + playerAnimType none, direction backward, stance crouch + { + both pb_crouch_run_back_grenade + } + playerAnimType none, stance crouch + { + both pb_crouch_run_forward_grenade + } + // Stand + playerAnimType none, direction backward + { + both pb_combatrun_back_loop_grenade + } + playerAnimType none + { + both pb_pistol_run_fast + } + // HOLD + // Crouch + playerAnimType hold, direction left, stance crouch + { + both pb_crouch_hold_run_left + } + playerAnimType hold, direction right, stance crouch + { + both pb_crouch_hold_run_right + } + playerAnimType hold, direction backward, stance crouch + { + both pb_crouch_hold_run_back + } + playerAnimType hold, stance crouch + { + both pb_crouch_hold_run + } + // Stand + playerAnimType hold, direction left + { + both pb_hold_run_left + } + playerAnimType hold, direction right + { + both pb_hold_run_right + } + playerAnimType hold, direction backward + { + both pb_hold_run_back + } + playerAnimType hold + { + both pb_hold_run + } + // DUALWIELD + // Crouch + playerAnimType dualwield, direction left, stance crouch + { + both pb_crouch_dw_run_left + } + playerAnimType dualwield, direction right, stance crouch + { + both pb_crouch_dw_run_right + } + playerAnimType dualwield, direction backward, stance crouch + { + both pb_crouch_dw_run_back + } + playerAnimType dualwield, stance crouch + { + both pb_crouch_dw_run_forward + } + // Stand + playerAnimType dualwield, direction left + { + both pb_dw_run_left + } + playerAnimType dualwield, direction right + { + both pb_dw_run_right + } + playerAnimType dualwield, direction backward + { + both pb_dw_run_back + } + playerAnimType dualwield, slope up + { + both pb_dw_stand_run_slopeup + } + playerAnimType dualwield, slope down + { + both pb_dw_stand_run_slopedown + } + playerAnimType dualwield + { + both pb_dw_run_forward + } + // BALLISTIC KNIFE + // Crouch + playerAnimType ballisticknife, direction left, stance crouch + { + both pb_b_knife_crouch_run_left + } + playerAnimType ballisticknife, direction right, stance crouch + { + both pb_b_knife_crouch_run_right + } + playerAnimType ballisticknife, direction backward, stance crouch + { + both pb_b_knife_crouch_run_back + } + playerAnimType ballisticknife, stance crouch + { + both pb_b_knife_crouch_run_forward + } + // Stand + playerAnimType ballisticknife, direction left + { + both pb_b_knife_run_left + } + playerAnimType ballisticknife, direction right + { + both pb_b_knife_run_right + } + playerAnimType ballisticknife, direction backward + { + both pb_b_knife_run_back + } + playerAnimType ballisticknife + { + both pb_b_knife_run_forward + } + // MINIGUN + // Crouch + playerAnimType minigun, direction left, stance crouch + { + both pb_minigun_crouch_run_left + } + playerAnimType minigun, direction right, stance crouch + { + both pb_minigun_crouch_run_right + } + playerAnimType minigun, direction backward, stance crouch + { + both pb_minigun_crouch_run_back + } + playerAnimType minigun, stance crouch + { + both pb_minigun_crouch_run_forward + } + // Stand + playerAnimType minigun, direction left + { + both pb_minigun_stand_run_left + } + playerAnimType minigun, direction right + { + both pb_minigun_stand_run_right + } + playerAnimType minigun, direction backward + { + both pb_minigun_stand_run_back + } + playerAnimType minigun + { + both pb_minigun_stand_run + } + // RPG + // Crouch + weaponclass rocketlauncher, direction left, stance crouch + { + both pb_crouch_run_left_RPG + } + weaponclass rocketlauncher, direction right, stance crouch + { + both pb_crouch_run_right_RPG + } + weaponclass rocketlauncher, direction backward, stance crouch + { + both pb_crouch_run_back_RPG + } + weaponclass rocketlauncher, stance crouch + { + both pb_crouch_run_forward_RPG + } + // Stand + weaponclass rocketlauncher, direction left + { + both pb_combatrun_left_RPG + } + weaponclass rocketlauncher, direction right + { + both pb_combatrun_right_RPG + } + weaponclass rocketlauncher, direction backward + { + both pb_combatrun_back_RPG + } + weaponclass rocketlauncher + { + both pb_combatrun_forward_RPG + } + // PISTOL + // Crouch + weaponclass pistol, direction left, stance crouch + { + both pb_crouch_run_left_pistol + } + weaponclass pistol, direction right, stance crouch + { + both pb_crouch_run_right_pistol + } + weaponclass pistol, direction backward, stance crouch + { + both pb_crouch_run_back_pistol + } + weaponclass pistol, stance crouch + { + both pb_crouch_run_forward_pistol + } + // Stand + weaponclass pistol, direction left + { + both pb_combatrun_left_loop_pistol + } + weaponclass pistol, direction right + { + both pb_combatrun_right_loop_pistol + } + weaponclass pistol, direction backward + { + both pb_combatrun_back_loop_pistol + } + weaponclass pistol, slope up + { + both pb_pistol_stand_run_slopeup + } + weaponclass pistol, slope down + { + both pb_pistol_stand_run_slopedown + } + weaponclass pistol + { + both pb_pistol_run_fast + } + // GRENADE + // Crouch + weaponclass grenade, direction left, playerAnimType grenadeonly, stance crouch + { + both pb_crouch_run_left_grenade grenadeAnim + } + weaponclass grenade, direction right, playerAnimType grenadeonly, stance crouch + { + both pb_crouch_run_right_grenade grenadeAnim + } + weaponclass grenade, direction backward, playerAnimType grenadeonly, stance crouch + { + both pb_crouch_run_back_grenade grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, stance crouch + { + both pb_crouch_run_forward_grenade grenadeAnim + } + // Stand + weaponclass grenade, direction left, playerAnimType grenadeonly + { + both pb_combatrun_left_loop_grenade grenadeAnim + } + weaponclass grenade, direction right, playerAnimType grenadeonly + { + both pb_combatrun_right_loop_grenade grenadeAnim + } + weaponclass grenade, direction backward, playerAnimType grenadeonly + { + both pb_combatrun_back_loop_grenade grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly + { + both pb_combatrun_forward_loop_stickgrenade grenadeAnim + } + // DEFAULT + // Crouch + direction left, stance crouch + { + both pb_crouch_run_left + } + direction right, stance crouch + { + both pb_crouch_run_right + } + direction backward, stance crouch + { + both pb_crouch_run_back + } + stance crouch + { + both pb_crouch_run_forward + } + // Stand + direction left + { + both pb_combatrun_left_loop + } + direction right + { + both pb_combatrun_right_loop + } + direction backward + { + both pb_combatrun_back_loop + } + slope up + { + both pb_rifle_stand_run_slopeup + } + slope down + { + both pb_rifle_stand_run_slopedown + } + default + { + both pb_combatrun_forward_loop + } + } + + climbup + { + // DEFAULT + default + { + // Can't play the chicken dance here as a temp because it has no movement speed + both pb_climbup + } + } + climbdown + { + // DEFAULT + default + { + // Can't play the chicken dance here as a temp because it has no movement speed + both pb_climbdown + } + } + + turnright + { + // LAST STAND + perk laststand + { + both pb_laststand_turn_r90 + } + // NONE + playerAnimType briefcase, stance prone + { + both pb_briefcase_prone_turn_r90 + } + playerAnimType briefcase, stance crouch + { + both pb_briefcase_crouch_turn_r90 + } + playerAnimType briefcase + { + both pb_briefcase_stand_turn_r90 + } + // HOLD + playerAnimType hold, stance prone + { + both pb_hold_prone_turn_90right + } + playerAnimType hold, stance crouch + { + both pb_hold_crouchturn_90right + } + playerAnimType hold + { + both pb_hold_turn_90right + } + // RADIO + playerAnimType radio, stance prone + { + both p_handheldradio_prone_idle + } + playerAnimType radio, stance crouch + { + both p_handheldradio_crouch_idle + } + playerAnimType radio + { + both p_handheldradio_idle + } + // REMOTE CONTROL + playerAnimType remotecontrol, stance prone + { + both pb_rc_prone_idle + } + playerAnimType remotecontrol, stance crouch + { + both pb_rc_crouch_idle + } + playerAnimType remotecontrol + { + both pb_rc_stand_idle + } + // DUAL WIELD + playerAnimType dualwield AND ballisticknife, stance prone + { + both pb_dw_prone_turn_90right + } + playerAnimType dualwield AND ballisticknife, stance crouch + { + both pb_dw_crouchturn_90right + } + playerAnimType dualwield AND ballisticknife + { + both pb_dw_turn_90right + } + // MINIGUN + playerAnimType minigun, stance crouch + { + both pb_minigun_crouch_turn_90right + } + playerAnimType minigun + { + both pb_minigun_stand_turn_90right + } + // RPG + weaponclass rocketlauncher, stance prone + { + both pb_rpg_prone_turn90R + } + weaponclass rocketlauncher, stance crouch + { + both pb_rpg_crouch_turn90R + } + weaponclass rocketlauncher + { + both pb_rpg_stand_turn90R + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly, stance prone + { + both pb_grenade_prone_turn_90right grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, stance crouch + { + both pb_grenade_crouchturn_90right grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_turn_90right grenadeAnim + } + // PISTOL + weaponclass pistol, stance prone + { + both pb_pistol_prone_turn_90right + } + weaponclass pistol, stance crouch + { + both pb_pistol_crouchturn_90right + } + weaponclass pistol + { + both pb_pistol_turn_90right + } + // DEFAULT + stance prone + { + both pb_prone_turn_90right + } + stance crouch + { + both pb_crouchturn_90right + } + default + { + both pb_turn_90right + } + } + turnleft + { + // LAST STAND + perk laststand + { + both pb_laststand_turn_l90 + } + // NONE + playerAnimType briefcase, stance prone + { + both pb_briefcase_prone_turn_l90 + } + playerAnimType briefcase, stance crouch + { + both pb_briefcase_crouch_turn_l90 + } + playerAnimType briefcase + { + both pb_briefcase_stand_turn_l90 + } + // HOLD + playerAnimType hold, stance prone + { + both pb_hold_prone_turn_90left + } + playerAnimType hold, stance crouch + { + both pb_hold_crouchturn_90left + } + playerAnimType hold + { + both pb_hold_turn_90left + } + // RADIO + playerAnimType radio, stance prone + { + both p_handheldradio_prone_idle + } + playerAnimType radio, stance crouch + { + both p_handheldradio_crouch_idle + } + playerAnimType radio + { + both p_handheldradio_idle + } + // REMOTE CONTROL + playerAnimType remotecontrol, stance prone + { + both pb_rc_prone_idle + } + playerAnimType remotecontrol, stance crouch + { + both pb_rc_crouch_idle + } + playerAnimType remotecontrol + { + both pb_rc_stand_idle + } + // DUAL WIELD + playerAnimType dualwield AND ballisticknife, stance prone + { + both pb_dw_prone_turn_90left + } + playerAnimType dualwield AND ballisticknife, stance crouch + { + both pb_dw_crouchturn_90left + } + playerAnimType dualwield AND ballisticknife + { + both pb_dw_turn_90left + } + // MINIGUN + playerAnimType minigun, stance crouch + { + both pb_minigun_crouch_turn_90left + } + playerAnimType minigun + { + both pb_minigun_stand_turn_90left + } + // RPG + weaponclass rocketlauncher, stance prone + { + both pb_rpg_prone_turn90L + } + weaponclass rocketlauncher, stance crouch + { + both pb_rpg_crouch_turn90L + } + weaponclass rocketlauncher + { + both pb_rpg_stand_turn90L + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly, stance prone + { + both pb_grenade_prone_turn_90left grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, stance crouch + { + both pb_grenade_crouchturn_90left grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_turn_90left grenadeAnim + } + // PISTOL + weaponclass pistol, stance prone + { + both pb_pistol_prone_turn_90left + } + weaponclass pistol, stance crouch + { + both pb_pistol_crouchturn_90left + } + weaponclass pistol + { + both pb_pistol_turn_90left + } + // DEFAULT + stance prone + { + both pb_prone_turn_90left + } + stance crouch + { + both pb_crouchturn_90left + } + default + { + both pb_turn_90left + } + } + + //========== + // PI - DAY : Mantle animations + mantle_up_57 + { + // DEFAULT + default + { + both mp_mantle_up_57 + } + } + mantle_up_51 + { + // DEFAULT + default + { + both mp_mantle_up_51 + } + } + mantle_up_45 + { + // DEFAULT + default + { + both mp_mantle_up_45 + } + } + mantle_up_39 + { + // DEFAULT + default + { + both mp_mantle_up_39 + } + } + mantle_up_33 + { + // DEFAULT + default + { + both mp_mantle_up_33 + } + } + mantle_up_27 + { + // DEFAULT + default + { + legs mp_mantle_up_27 + } + } + mantle_up_21 + { + // DEFAULT + default + { + legs mp_mantle_up_21 + } + } + mantle_over_high + { + // DEFAULT + default + { + both mp_mantle_over_high + } + } + mantle_over_mid + { + // DEFAULT + default + { + both mp_mantle_over_mid + } + } + mantle_over_low + { + // DEFAULT + default + { + legs mp_mantle_over_low + } + } + + dtp_move + { + // HOLD + playerAnimType hold + { + both pb_hold_dive_prone animrate 1 + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife + { + both pb_dw_dive_prone animrate 1 + } + // PISTOL + weaponclass pistol + { + both pb_dive_prone_pistol animrate 1 + } + // RPG + weaponclass rocketlauncher + { + both pb_rpg_dive_prone + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly + { + both pb_dive_prone_pistol animrate 1 + } + // DEFAULT + default + { + both pb_dive_prone animrate 1 + } + } + + slide_move + { + // DEFAULT + direction left + { + both pb_terrain_slide + } + direction right + { + both pb_terrain_slide + } + default + { + both pb_terrain_slide + } + } + +} + +//========================================================================== +// EVENTS +// +// format: +// +// +// { +// [DEFAULT / [], ...] +// { +// [sound ] +// [sound ] +// ... +// } +// } +// +// legend: +// +// : pain, death, fireweapon, jump, jumpbk, land, dropweapon, +// raiseweapon, reload, crouch_to_prone, shellshock +// prone_to_crouch, meleeattack +// +// NOTE: for gameplay anims (weapons firing, reload, etc) that show no legs movement +// only the torso should animation from here, leave the legs doing what their +// locomotive anims want them to do +// + +EVENTS + +fireweapon +{ + vehicle_name huey + { + // Ignore the fireweapon event while on a turret + } + // MG42 + mounted mg42 + { + // Ignore the fireweapon event while on a turret + } + // LASTSTAND + perk laststand + { + torso pt_laststand_fire + } + // REVIVER + playerAnimType reviver + { + torso p_revive_reviving + } + // DUAL WIELD + playerAnimType dualwield, movestatus moving + { + // play no animations to prevent blend problems + } + playerAnimType dualwield, stance prone + { + torso pt_prone_dw_botharms_fire + } + playerAnimType dualwield, stance crouch + { + torso pt_crouch_dw_botharms_fire + } + playerAnimType dualwield + { + torso pt_dw_botharms_fire + } + // HOLD + playerAnimType hold, stance prone + { + torso pt_hold_prone_throw + } + playerAnimType hold + { + torso pt_hold_throw + } + // SNIPER - NEEDS INVESTIGATION! + playerAnimType sniper AND rearclipsniper, stance prone, weapon_position ads + { + torso pt_prone_ads_shoot_auto + } + playerAnimType sniper AND rearclipsniper, stance prone + { + torso pt_rifle_fire_prone + } + playerAnimType sniper AND rearclipsniper, movestatus moving + { + // Play no special firing animation + } + playerAnimType sniper AND rearclipsniper, stance crouch, weapon_position ads + { + torso pt_crouch_shoot_ads + } + playerAnimType sniper AND rearclipsniper, stance crouch + { + torso pt_crouch_shoot + } + playerAnimType sniper AND rearclipsniper, weapon_position ads + { + torso pt_rifle_fire_ads + } + playerAnimType sniper AND rearclipsniper + { + torso pt_rifle_fire + } + // CHINA LAKE + playerAnimType m203, stance prone + { + torso pt_prone_shoot_auto + } + playerAnimType m203 + { + torso pt_stand_shoot_shotgun + } + // NOPUMP + playerAnimType nopump, stance prone + { + torso pt_prone_shoot + } + playerAnimType nopump, movestatus moving + { + // No special animation + } + playerAnimType nopump, stance crouch, weapon_position ads + { + torso pt_crouch_shoot_ads + } + playerAnimType nopump, stance crouch + { + torso pt_crouch_shoot + } + playerAnimType nopump, weapon_position ads + { + torso pt_stand_shoot_ads + } + playerAnimType nopump + { + torso pt_stand_shoot + } + //BALLISTIC KNIFE + playerAnimType ballisticknife, stance prone + { + torso pt_b_knife_prone_fire + } + playerAnimType ballisticknife, stance crouch + { + torso pt_b_knife_crouch_fire + } + playerAnimType ballisticknife + { + torso pt_b_knife_stand_fire + } + // HATCHET + playerAnimType hatchet, stance prone + { + torso pt_tomahawk_prone_throw + } + playerAnimType hatchet, stance crouch + { + torso pt_tomahawk_crouch_throw + } + playerAnimType hatchet + { + torso pt_tomahawk_stand_throw + } + // OTHER + weaponclass spread, stance prone + { + torso pt_prone_shoot_auto + } + weaponclass spread + { + torso pt_stand_shoot_shotgun + } + // MINIGUN + playerAnimType minigun, movestatus moving + { + // Play no special firing animation + } + playerAnimType minigun, stance crouch + { + torso pt_minigun_crouch_fire blendTime 200 + } + playerAnimType minigun + { + torso pt_minigun_stand_fire blendTime 200 + } + // PISTOLS + weaponclass pistol, stance prone, weapon_position ads + { + torso pt_prone_ads_shoot_pistol + } + weaponclass pistol, stance prone + { + torso pt_prone_shoot_pistol + } + weaponclass pistol, movestatus moving + { + // Play no special firing animation + } + weaponclass pistol, stance crouch, weapon_position ads + { + torso pt_crouch_shoot_ads_pistol + } + weaponclass pistol, stance crouch + { + torso pt_crouch_shoot_pistol + } + weaponclass pistol, weapon_position ads + { + torso pt_stand_shoot_ads_pistol + } + weaponclass pistol + { + torso pt_stand_shoot_pistol + } + // MG, SMG + weaponclass autofire, stance prone, weapon_position ads + { + torso pt_prone_ads_shoot_auto blendTime 200 duration 150 + } + weaponclass autofire, stance prone + { + torso pt_prone_shoot_auto blendTime 200 duration 150 + } + weaponclass autofire, movestatus moving + { + // Play no special firing animation + } + weaponclass autofire, stance crouch, weapon_position ads + { + torso pt_crouch_shoot_auto_ads blendTime 200 duration 150 + } + weaponclass autofire, stance crouch + { + torso pt_crouch_shoot_auto blendTime 200 duration 150 + } + weaponclass autofire, weapon_position ads + { + torso pt_stand_shoot_auto_ads blendTime 200 duration 150 + } + weaponclass autofire + { + torso pt_stand_shoot_auto duration 150 + } + // RPG (assume ads since you can't fire these from the hip) + weaponclass rocketlauncher, movestatus moving + { + // Play no special firing animation + } + weaponclass rocketlauncher, stance prone + { + torso pt_prone_shoot_RPG + } + weaponclass rocketlauncher, stance crouch + { + torso pt_stand_shoot_RPG + } + weaponclass rocketlauncher + { + torso pt_stand_shoot_RPG + } + // GRENADE + weaponclass grenade, stance prone, playerAnimType grenadeonly // All prone + { + torso pt_prone_grenade_throw grenadeAnim blendTime 133 + } + weaponclass grenade, stance crouch, playerAnimType grenadeonly // Crouch, moving + { + torso pt_crouch_grenade_throw grenadeAnim blendTime 133 + } + weaponclass grenade, playerAnimType grenadeonly // Stand, moving + { + torso pt_grenade_stand_throw blendtime 133 grenadeAnim weaponTimeScale + } + // DEFAULT + stance prone, weapon_position ads + { + torso pt_prone_ads_shoot + } + stance prone + { + torso pt_prone_shoot + } + movestatus moving + { + // Play no special firing animation + } + stance crouch, weapon_position ads + { + torso pt_crouch_shoot_ads + } + stance crouch + { + torso pt_crouch_shoot + } + weapon_position ads + { + torso pt_stand_shoot_ads + } + default + { + torso pt_stand_shoot + } +} + + +prone_to_crouch +{ + // NONE + nextPlayerAnimType briefcase + { + both pb_briefcase_prone2crouch allowMovementInterrupt + } + // HOLD + nextPlayerAnimType hold, movestatus moving, direction backward + { + both pb_hold_prone2crouch allowMovementInterrupt + } + nextPlayerAnimType hold, movestatus moving + { + both pb_hold_prone2crouchrun duration 626 blendouttime 33 + } + nextPlayerAnimType hold + { + both pb_hold_prone2crouch allowMovementInterrupt + } + // DUALWIELD + nextPlayerAnimType dualwield AND ballisticknife, movestatus moving, direction backward + { + both pb_dw_prone2crouch allowMovementInterrupt + } + nextPlayerAnimType dualwield AND ballisticknife, movestatus moving + { + both pb_dw_prone2crouchrun duration 626 blendouttime 33 + } + nextPlayerAnimType dualwield AND ballisticknife + { + both pb_dw_prone2crouch allowMovementInterrupt + } + // RPG + nextWeaponclass rocketlauncher, movestatus stationary + { + both pb_rpg_prone2crouch allowMovementInterrupt + } + // GRENADE + nextWeaponclass grenade, playerAnimType grenadeonly, movestatus moving, direction backward + { + both pb_grenade_prone2crouch allowMovementInterrupt + } + nextWeaponclass grenade, playerAnimType grenadeonly , movestatus moving + { + both pb_grenade_prone2crouchrun duration 626 blendouttime 33 + } + nextWeaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_prone2crouch allowMovementInterrupt + } + // PISTOL + nextWeaponclass pistol, movestatus moving, direction backward + { + both pb_prone2crouch_pistol allowMovementInterrupt + } + nextWeaponclass pistol, movestatus moving + { + both pb_prone2crouchrun_pistol duration 626 blendouttime 33 + } + nextWeaponclass pistol + { + both pb_prone2crouch_pistol allowMovementInterrupt + } + // RIFLE + nextWeaponclass rifle, movestatus moving, direction backward + { + both pb_prone2crouchrun_back duration 700 blendouttime 67 + } + nextWeaponclass rifle, movestatus moving, direction right + { + both pb_prone2crouchrun_right duration 667 blendouttime 67 + } + nextWeaponclass rifle, movestatus moving, direction left + { + both pb_prone2crouchrun_left duration 467 blendouttime 67 + } + nextWeaponclass rifle, movestatus moving + { + both pb_prone2crouchrun duration 600 blendouttime 170 + } + nextWeaponclass rifle + { + both pb_prone2crouch allowMovementInterrupt + } + // HOLD + playerAnimType hold, movestatus moving, direction backward + { + both pb_hold_prone2crouch allowMovementInterrupt + } + playerAnimType hold, movestatus moving + { + both pb_hold_prone2crouchrun duration 626 blendouttime 33 + } + playerAnimType hold + { + both pb_hold_prone2crouch allowMovementInterrupt + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife, movestatus moving, direction backward + { + both pb_dw_prone2crouch allowMovementInterrupt + } + playerAnimType dualwield AND ballisticknife, movestatus moving + { + both pb_dw_prone2crouchrun duration 626 blendouttime 33 + } + playerAnimType dualwield AND ballisticknife + { + both pb_dw_prone2crouch allowMovementInterrupt + } + // RPG + weaponclass rocketlauncher, movestatus stationary + { + both pb_rpg_prone2crouch allowMovementInterrupt + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly, movestatus moving, direction backward + { + both pb_grenade_prone2crouch allowMovementInterrupt + } + weaponclass grenade, playerAnimType grenadeonly , movestatus moving + { + both pb_grenade_prone2crouchrun duration 626 blendouttime 33 + } + weaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_prone2crouch allowMovementInterrupt + } + // PISTOL + weaponclass pistol, movestatus moving, direction backward + { + both pb_prone2crouch_pistol allowMovementInterrupt + } + weaponclass pistol, movestatus moving + { + both pb_prone2crouchrun_pistol duration 626 blendouttime 33 + } + weaponclass pistol + { + both pb_prone2crouch_pistol allowMovementInterrupt + } + // DEFAULT + movestatus moving, direction backward + { + both pb_prone2crouchrun_back duration 700 blendouttime 67 + } + movestatus moving, direction right + { + both pb_prone2crouchrun_right duration 667 blendouttime 67 + } + movestatus moving, direction left + { + both pb_prone2crouchrun_left duration 467 blendouttime 67 + } + movestatus moving + { + both pb_prone2crouchrun duration 600 blendouttime 170 + } + default + { + both pb_prone2crouch allowMovementInterrupt + } +} + +prone_to_stand +{ + // HOLD + nextPlayerAnimType hold, movestatus moving + { + both pb_hold_prone2sprint blendouttime 33 + } + nextPlayerAnimType hold + { + both pb_hold_prone2stand allowMovementInterrupt + } + // DUALWIELD + nextPlayerAnimType dualwield AND ballisticknife, movestatus moving + { + both pb_dw_prone2sprint blendouttime 33 + } + nextPlayerAnimType dualwield AND ballisticknife + { + both pb_dw_prone2stand allowMovementInterrupt + } + // GRENADE + nextWeaponclass grenade, playerAnimType grenadeonly, movestatus moving + { + both pb_grenade_prone2sprint blendouttime 33 + } + nextWeaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_prone2stand allowMovementInterrupt + } + // PISTOL + nextWeaponclass pistol, movestatus moving + { + both pb_prone2sprint_pistol blendouttime 33 + } + nextWeaponclass pistol + { + both pb_prone2stand_pistol allowMovementInterrupt + } + // RIFLE + nextWeaponclass rifle, movestatus moving + { + both pb_prone2sprint blendouttime 33 + } + nextWeaponclass rifle + { + both pb_prone2stand allowMovementInterrupt + } + + // HOLD + playerAnimType hold, movestatus moving + { + both pb_hold_prone2sprint blendouttime 33 + } + playerAnimType hold + { + both pb_hold_prone2stand allowMovementInterrupt + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife, movestatus moving + { + both pb_dw_prone2sprint blendouttime 33 + } + playerAnimType dualwield AND ballisticknife + { + both pb_dw_prone2stand allowMovementInterrupt + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly, movestatus moving + { + both pb_grenade_prone2sprint blendouttime 33 + } + weaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_prone2stand allowMovementInterrupt + } + // PISTOL + weaponclass pistol, movestatus moving + { + both pb_prone2sprint_pistol blendouttime 33 + } + weaponclass pistol + { + both pb_prone2stand_pistol allowMovementInterrupt + } + // DEFAULT + movestatus moving + { + both pb_prone2sprint blendouttime 33 + } + default + { + both pb_prone2stand allowMovementInterrupt + } +} + +prone_to_sprint +{ + // HOLD + nextPlayerAnimType hold + { + both pb_hold_prone2sprint blendouttime 33 + } + // DUALWIELD + nextPlayerAnimType dualwield AND ballisticknife + { + both pb_dw_prone2sprint blendouttime 33 + } + // GRENADE + nextWeaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_prone2sprint blendouttime 33 + } + // PISTOL + nextWeaponclass pistol + { + both pb_prone2sprint_pistol blendouttime 33 + } + // RIFLE + nextWeaponclass rifle + { + both pb_prone2sprint blendouttime 33 + } + + // HOLD + playerAnimType hold + { + both pb_hold_prone2sprint blendouttime 33 + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife + { + both pb_dw_prone2sprint blendouttime 33 + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_prone2sprint blendouttime 33 + } + // PISTOL + weaponclass pistol + { + both pb_prone2sprint_pistol blendouttime 33 + } + // DEFAULT + default + { + both pb_prone2sprint blendouttime 33 + } +} + +crouch_to_prone +{ + // NONE + nextPlayerAnimType briefcase + { + both pb_briefcase_crouch2prone + } + // HOLD + nextPlayerAnimType hold + { + both pb_hold_crouch2prone + } + // DUAL WIELD + nextPlayerAnimType dualwield AND ballisticknife + { + both pb_dw_crouch2prone + } + // RPG + nextWeaponclass rocketlauncher + { + both pb_rpg_crouch2prone + } + // GRENADE + nextWeaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_crouch2prone + } + // PISTOL + nextWeaponclass pistol + { + both pb_crouch2prone_pistol + } + // DEFAULT + nextWeaponclass rifle + { + both pb_crouch2prone + } + + // HOLD + playerAnimType hold + { + both pb_hold_crouch2prone + } + // DUAL WIELD + playerAnimType dualwield AND ballisticknife + { + both pb_dw_crouch2prone + } + // RPG + weaponclass rocketlauncher + { + both pb_rpg_crouch2prone + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly + { + both pb_grenade_crouch2prone + } + // PISTOL + weaponclass pistol + { + both pb_crouch2prone_pistol + } + // DEFAULT + default + { + both pb_crouch2prone + } +} + +crouch_to_stand +{ + // HOLD + playerAnimType hold, movestatus moving + { + // Play no animation, just blend + } + playerAnimType hold + { + both pb_hold_crouch2stand + } + // DUAL WIELD + playerAnimType dualwield AND ballisticknife, movestatus moving + { + // Play no animation, just blend + } + playerAnimType dualwield AND ballisticknife + { + both pb_dw_crouch2stand + } + // PISTOL + weaponclass pistol, movestatus moving + { + // Play no animation, just blend + } + weaponclass pistol + { + both pb_pistol_crouch2stand + } + // DEFAULT + movestatus moving + { + // Play no animation, just blend + } + default + { + both pb_rifle_crouch2stand + } +} + +stand_to_crouch +{ + // HOLD + playerAnimType hold, movestatus moving + { + // Play no animation, just blend + } + playerAnimType hold + { + both pb_hold_stand2crouch + } + // DUAL WIELD + playerAnimType dualwield AND ballisticknife, movestatus moving + { + // Play no animation, just blend + } + playerAnimType dualwield AND ballisticknife + { + both pb_dw_stand2crouch + } + // PISTOL + weaponclass pistol, movestatus moving + { + // Play no animation, just blend + } + weaponclass pistol + { + both pb_pistol_stand2crouch + } + // DEFAULT + movestatus moving + { + // Play no animation, just blend + } + default + { + both pb_rifle_stand2crouch + } +} + +stand_to_laststand +{ + default + { + both pb_stand2laststand + } +} + +crouch_to_laststand +{ + default + { + both pb_crouch2laststand + } +} + +prone_to_laststand +{ + default + { + both pb_prone2laststand + } +} + +laststand_to_stand +{ + default + { + both pb_laststand2stand blendOutTime 200 + } +} + +laststand_to_crouch +{ + default + { + both pb_laststand2crouch + } +} + +laststand_to_prone +{ + default + { + both pb_laststand2prone + } +} + +meleeattack +{ + // PISTOL, GRENADE + weaponclass pistol AND grenade, stance prone, playerAnimType grenadeonly + { + torso pt_melee_prone_pistol + } + weaponclass pistol AND grenade + { + torso pt_melee_pistol_1 duration 400 + torso pt_melee_pistol_2 duration 350 + torso pt_melee_pistol_3 duration 550 + torso pt_melee_pistol_4 duration 400 + } + // DEFAULT + stance prone + { + torso pt_melee_prone + } + stance crouch + { + torso pt_melee_crouch_left2left + torso pt_melee_crouch_left2right + torso pt_melee_crouch_right2left + } + default + { + torso pt_melee_right2right_1 duration 400 + torso pt_melee_right2right_2 duration 400 + torso pt_melee_right2left duration 300 + torso pt_melee_left2left_1 duration 400 + torso pt_melee_left2right duration 300 + } +} + +knife_melee +{ + // LASTSTAND + perk laststand + { + torso p_revive_down_melee_swipe + } + // HOLD + // *** LDS - NEED TO ADD PRONE ANIMS FOR HOLD WEAPONS + playerAnimType hold, stance prone + { + torso pt_hold_melee_prone + } + playerAnimType hold + { + torso pt_melee_hold_1 + } + // BALLISTIC KNIFE + playerAnimType ballisticknife, stance prone + { + torso pt_b_knife_prone_melee + } + playerAnimType ballisticknife, stance crouch + { + torso pt_b_knife_crouch_melee + } + playerAnimType ballisticknife + { + torso pt_b_knife_stand_melee + } + // DUALWIELD + playerAnimType dualwield, stance prone + { + torso pt_dw_prone_melee + } + playerAnimType dualwield + { + torso pt_dw_stand_melee_swipe blendTime 17 blendOutTime 17 + } + // RPG + weaponclass rocketlauncher, stance prone + { + torso p_knife_prone_bazooka_swipe + } + weaponclass rocketlauncher, stance crouch + { + torso p_knife_crouch_bazooka_swipe + } + weaponclass rocketlauncher + { + torso p_knife_stand_bazooka_swipe + } + // PISTOL + weaponclass pistol, stance prone + { + torso p_knife_prone_pistol_swipe + } + weaponclass pistol, stance crouch + { + torso p_knife_crouch_pistol_swipe + } + weaponclass pistol + { + torso p_knife_stand_pistol_swipe + } + // DEFAULT + stance prone + { + torso p_knife_prone_rifle_swipe + } + stance crouch + { + torso p_knife_crouch_rifle_swipe + } + default + { + torso p_knife_stand_rifle_swipe + } +} + +knife_melee_charge +{ + // HOLD + playerAnimType hold, stance prone + { + torso pt_hold_melee_prone + } + playerAnimType hold + { + torso pt_melee_hold_2 + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife, stance prone + { + torso pt_dw_prone_melee + } + playerAnimType dualwield AND ballisticknife + { + torso pt_dw_stand_melee_stick + } + // RPG + weaponclass rocketlauncher, stance prone + { + torso p_knife_prone_bazooka + } + weaponclass rocketlauncher, stance crouch + { + torso p_knife_crouch_bazooka + } + weaponclass rocketlauncher + { + torso p_knife_stand_bazooka + } + // PISTOL + weaponclass pistol, stance prone + { + torso p_knife_prone_pistol + } + weaponclass pistol, stance crouch + { + torso p_knife_crouch_pistol + } + weaponclass pistol + { + torso p_knife_stand_pistol + } + // DEFAULT + stance prone + { + torso p_knife_prone_rifle + } + stance crouch + { + torso p_knife_crouch_rifle + } + default + { + torso p_knife_stand_rifle + } +} + +dropweapon +{ + // HOLD + stance prone, playerAnimType hold + { + torso pt_satchel_prone_putaway weaponTimeScale + } + playerAnimType hold + { + torso pt_satchel_stand_putaway weaponTimeScale + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife, stance prone + { + torso pt_prone_dw_putaway weaponTimeScale + } + playerAnimType dualwield AND ballisticknife, stance crouch + { + torso pt_crouch_dw_putaway weaponTimeScale + } + playerAnimType dualwield AND ballisticknife + { + torso pt_dw_full_putaway weaponTimeScale + } + // BRIEFCASE BOMB + playerAnimType briefcase, stance prone + { + torso pt_rc_prone_putaway weaponTimeScale + } + playerAnimType briefcase, stance crouch + { + torso pt_rc_crouch_putaway weaponTimeScale + } + playerAnimType briefcase + { + torso pt_rc_stand_putaway weaponTimeScale + } + // MINIGUN + playerAnimType minigun, stance crouch + { + torso pt_minigun_crouch_putaway weaponTimeScale + } + playerAnimType minigun + { + torso pt_minigun_stand_putaway weaponTimeScale + } + // REMOTE CONTROL + playerAnimType remotecontrol, stance prone + { + torso pt_rc_prone_putaway weaponTimeScale + } + playerAnimType remotecontrol, stance crouch + { + torso pt_rc_crouch_putaway weaponTimeScale + } + playerAnimType remotecontrol + { + torso pt_rc_stand_putaway weaponTimeScale + } + // RADIO + playerAnimType radio, stance prone + { + torso pt_radio_prone_putaway weaponTimeScale blendOutTime 48 + } + playerAnimType radio, stance crouch + { + torso pt_radio_crouch_putaway weaponTimeScale blendOutTime 48 + } + playerAnimType radio + { + torso pt_radio_stand_putaway weaponTimeScale blendOutTime 48 + } + // RPG + weaponclass rocketlauncher, stance prone + { + torso pt_rpg_prone_putaway weaponTimeScale + } + weaponclass rocketlauncher + { + torso pt_rpg_stand_putaway weaponTimeScale + } + // PISTOL + weaponclass pistol, stance prone + { + torso pt_pistol_prone_putaway weaponTimeScale + } + weaponclass pistol, stance crouch + { + torso pt_pistol_crouch_putaway weaponTimeScale + } + weaponclass pistol + { + torso pt_pistol_stand_putaway weaponTimeScale + } + // DEFAULT + stance prone + { + torso pt_rifle_prone_putaway weaponTimeScale + } + stance crouch + { + torso pt_rifle_crouch_putaway weaponTimeScale + } + default + { + torso pt_rifle_stand_putaway weaponTimeScale + } +} + +raiseweapon +{ + // HOLD + playerAnimType hold, stance prone + { + torso pt_satchel_prone_raise weaponTimeScale blendTime 125 + } + playerAnimType hold + { + torso pt_satchel_stand_raise weaponTimeScale blendTime 125 + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife, stance prone + { + torso pt_prone_dw_raise weaponTimeScale + } + playerAnimType dualwield AND ballisticknife, stance crouch + { + torso pt_crouch_dw_raise weaponTimeScale + } + playerAnimType dualwield AND ballisticknife + { + torso pt_dw_full_pullout weaponTimeScale + } + // BRIEFCASE BOMB + playerAnimType briefcase, stance prone + { + } + playerAnimType briefcase, stance crouch + { + } + playerAnimType briefcase + { + } + // REVIVER + playerAnimType reviver + { + // No animation + } + // MINIGUN + playerAnimType minigun, stance crouch + { + torso pt_minigun_crouch_raise weaponTimeScale + } + playerAnimType minigun + { + torso pt_minigun_stand_raise weaponTimeScale + } + // REMOTE CONTROL + playerAnimType remotecontrol, stance prone + { + torso pt_rc_prone_raise weaponTimeScale + } + playerAnimType remotecontrol, stance crouch + { + torso pt_rc_crouch_raise weaponTimeScale + } + playerAnimType remotecontrol + { + torso pt_rc_stand_raise weaponTimeScale + } + // RADIO + playerAnimType radio, stance prone + { + torso pt_radio_prone_raise weaponTimeScale blendTime 48 + } + playerAnimType radio, stance crouch + { + torso pt_radio_crouch_raise weaponTimeScale blendTime 48 + } + playerAnimType radio + { + torso pt_radio_stand_raise weaponTimeScale blendTime 48 + } + // HATCHET + playerAnimType hatchet, stance prone + { + torso pt_tomahawk_prone_pullout + } + playerAnimType hatchet, stance crouch + { + torso pt_tomahawk_crouch_pullout + } + playerAnimType hatchet + { + torso pt_tomahawk_stand_pullout + } + // RPG + weaponclass rocketlauncher, stance prone + { + torso pt_rpg_prone_raise weaponTimeScale + } + weaponclass rocketlauncher + { + torso pt_rpg_stand_raise weaponTimeScale + } + // PISTOL + weaponclass pistol, stance prone + { + torso pt_pistol_prone_raise weaponTimeScale + } + weaponclass pistol, stance crouch + { + torso pt_pistol_crouch_raise weaponTimeScale + } + weaponclass pistol + { + torso pt_pistol_stand_raise weaponTimeScale + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly, stance prone + { + torso pt_grenade_prone_prime grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, stance crouch + { + torso pt_grenade_crouch_prime grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly + { + torso pt_grenade_stand_prime + } + // DEFAULT + stance prone + { + torso pt_rifle_prone_raise weaponTimeScale + } + stance crouch + { + torso pt_rifle_crouch_raise weaponTimeScale + } + default + { + torso pt_rifle_stand_raise weaponTimeScale + } +} + +reload +{ + // LASTSTAND + perk laststand + { + torso pt_laststand_reload + } + // BALLISTIC KNIFE + playerAnimType ballisticknife, stance prone + { + torso pt_b_knife_prone_reload + } + playerAnimType ballisticknife, stance crouch + { + torso pt_b_knife_crouch_reload + } + playerAnimType ballisticknife + { + torso pt_b_knife_stand_reload + } + // GRIMREAPER + playerAnimType grimreaper, stance prone + { + torso pt_m202_prone_reload + } + playerAnimType grimreaper, stance crouch + { + torso pt_m202_crouch_reload + } + playerAnimType grimreaper + { + torso pt_m202_stand_reload + } + // DUALWIELD + playerAnimType dualwield, stance prone + { + torso pt_prone_dw_botharms_reload + } + playerAnimType dualwield, stance crouch + { + torso pt_crouch_dw_botharms_reload + } + playerAnimType dualwield + { + torso pt_dw_botharms_reload + } + // CROSSBOW + playerAnimType crossbow, stance prone + { + torso pt_crossbow_prone_reload + } + playerAnimType crossbow, stance crouch + { + torso pt_crossbow_crouch_reload + } + playerAnimType crossbow + { + torso pt_crossbow_stand_reload + } + // MINIGUN + playerAnimType minigun, stance crouch + { + torso pt_minigun_crouch_reload + } + playerAnimType minigun + { + torso pt_minigun_stand_reload + } + // CHINA LAKE + playerAnimType m203, stance prone + { + torso pt_shot_prone_reload + } + playerAnimType m203, stance crouch + { + torso pt_shot_crouch_reload + } + playerAnimType m203 + { + torso pt_shot_stand_reload + } + // REARCLIP + playerAnimType rearclip AND rearclipsniper, stance prone + { + torso pt_rifle_prone_reload_rearclip + } + playerAnimType rearclip AND rearclipsniper, stance crouch + { + torso pt_rifle_crouch_reload_rearclip + } + playerAnimType rearclip AND rearclipsniper + { + torso pt_rifle_stand_reload_rearclip + } + // LMG + playerAnimType beltfed, stance prone + { + torso pt_lmg_prone_reload + } + playerAnimType beltfed, stance crouch + { + torso pt_lmg_crouch_reload + } + playerAnimType beltfed + { + torso pt_lmg_stand_reload + } + // G11 + playerAnimType g11, stance prone + { + torso pt_g11_prone_reload + } + playerAnimType g11, stance crouch + { + torso pt_g11_crouch_reload + } + playerAnimType g11 + { + torso pt_g11_stand_reload + } + // SMG + weaponclass smg, stance prone + { + torso pt_reload_prone_auto + } + weaponclass smg, movestatus stationary, stance crouch + { + torso pt_reload_stand_auto_mp40 + } + weaponclass smg, stance crouch + { + torso pt_reload_crouchwalk + } + weaponclass smg + { + torso pt_reload_stand_auto_mp40 + } + // MG + weaponclass mg, stance prone + { + torso pt_reload_prone_auto + } + weaponclass mg, movestatus stationary, stance crouch + { + torso pt_reload_crouch_rifle + } + weaponclass mg, stance crouch + { + torso pt_reload_crouchwalk + } + weaponclass mg + { + torso pt_reload_stand_auto + } + // PISTOL + weaponclass pistol, movestatus stationary, stance crouch + { + torso pt_reload_crouch_pistol + } + weaponclass pistol, stance crouch + { + torso pt_reload_crouchwalk_pistol + } + weaponclass pistol, stance prone + { + torso pt_reload_prone_pistol + } + weaponclass pistol + { + torso pt_reload_stand_pistol + } + // SPREAD + weaponclass spread, stance prone + { + torso pt_shot_prone_reload + } + weaponclass spread, stance crouch + { + torso pt_shot_crouch_reload + } + weaponclass spread + { + torso pt_shot_stand_reload + } + // RPG + weaponclass rocketlauncher, stance prone + { + torso pt_reload_prone_RPG + } + weaponclass rocketlauncher + { + torso pt_reload_stand_RPG + } + // DEFAULT + stance prone + { + torso pt_reload_prone_auto + } + movestatus stationary, stance crouch + { + torso pt_reload_crouch_rifle + } + stance crouch + { + torso pt_reload_crouch_rifle + } + default + { + torso pt_reload_stand_rifle + } +} + +jump +{ + // NONE + playerAnimType none, direction backward + { + legs pb_standjump_takeoff duration 5 blendtime 100 + } + playerAnimType none, movestatus moving + { + legs pb_runjump_takeoff duration 5 blendtime 100 + } + playerAnimType none + { + legs pb_standjump_takeoff duration 5 blendtime 100 + } + // HOLD + playerAnimType hold, direction backward + { + legs pb_standjump_takeoff_satchel duration 5 blendtime 100 + } + playerAnimType hold + { + legs pb_standjump_takeoff_satchel duration 5 blendtime 100 + } + // DUAL WIELD + playerAnimType dualwield AND ballisticknife, direction backward + { + legs pb_dw_standjump_takeoff duration 5 blendtime 100 + } + playerAnimType dualwield AND ballisticknife + { + legs pb_dw_standjump_takeoff duration 5 blendtime 100 + } + // MINIGUN + playerAnimType minigun, direction backward + { + legs pb_minigun_standjump_takeoff duration 5 blendtime 100 + } + playerAnimType minigun, movestatus moving + { + legs pb_minigun_runjump_takeoff duration 5 blendtime 100 + } + playerAnimType minigun + { + legs pb_minigun_standjump_takeoff duration 5 blendtime 100 + } + // RPG + weaponclass rocketlauncher, direction backward + { + legs pb_rpg_standjump_takeoff duration 5 blendtime 100 + } + weaponclass rocketlauncher, movestatus run + { + legs pb_rpg_runjump_takeoff duration 5 blendtime 100 + } + weaponclass rocketlauncher + { + legs pb_rpg_standjump_takeoff duration 5 blendtime 100 + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly, direction backward + { + legs pb_grenade_standjump_takeoff duration 5 blendtime 100 grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, movestatus run + { + legs pb_grenade_runjump_takeoff duration 5 blendtime 100 grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly + { + legs pb_grenade_standjump_takeoff duration 5 blendtime 100 grenadeAnim + } + // PISTOL + weaponclass pistol, direction backward + { + legs pb_standjump_takeoff_pistol duration 5 blendtime 100 + } + weaponclass pistol, movestatus run + { + legs pb_runjump_takeoff_pistol duration 5 blendtime 100 + } + weaponclass pistol + { + legs pb_standjump_takeoff_pistol duration 5 blendtime 100 + } + // RPG + weaponclass rocketlauncher, direction backward + { + legs pb_standjump_takeoff duration 5 blendtime 100 + } + weaponclass rocketlauncher, movestatus run + { + legs pb_runjump_takeoff duration 5 blendtime 100 + } + weaponclass rocketlauncher + { + legs pb_standjump_takeoff duration 5 blendtime 100 + } + // DEFAULT + direction backward + { + legs pb_standjump_takeoff duration 5 blendtime 100 + } + movestatus run + { + legs pb_runjump_takeoff duration 5 blendtime 100 + } + default + { + legs pb_standjump_takeoff duration 5 blendtime 100 + } +} + +land +{ + // HOLD + playerAnimType hold + { + legs pb_standjump_land_satchel duration 100 blendtime 5 + } + // DUAL WIELD + playerAnimType dualwield AND ballisticknife + { + legs pb_dw_standjump_land duration 100 blendtime 50 + } + // MINIGUN + playerAnimType minigun, movestatus run + { + legs pb_minigun_runjump_land duration 100 blendtime 50 + } + playerAnimType minigun + { + legs pb_minigun_standjump_land duration 100 blendtime 50 + } + // RPG + weaponclass rocketlauncher, movestatus run + { + legs pb_rpg_runjump_land duration 100 blendtime 50 + } + weaponclass rocketlauncher + { + legs pb_rpg_standjump_land duration 100 blendtime 50 + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly, movestatus run + { + legs pb_grenade_runjump_land duration 100 blendtime 5 grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly + { + legs pb_grenade_standjump_land duration 100 blendtime 50 grenadeAnim + } + // PISTOL + weaponclass pistol, movestatus run + { + legs pb_runjump_land_pistol duration 100 blendtime 5 + } + weaponclass pistol, playerAnimType grenadeonly + { + legs pb_standjump_land_pistol duration 100 blendtime 50 + } + // DEFAULT + movestatus run + { + legs pb_runjump_land duration 100 blendtime 5 + } + default + { + legs pb_standjump_land duration 100 blendtime 50 + } +} + +shellshock +{ + // LASTSTAND + perk laststand + { + // No animation + } + // RADIO + playerAnimType radio + { + // No animation + } + // MINIGUN + playerAnimType minigun + { + // No animation + } + // HOLD + playerAnimType hold, stance prone + { + torso pb_hold_prone_shellshock blendtime 50 + } + playerAnimType hold, stance crouch + { + torso pb_crouch_shellshock_hold blendtime 50 + } + playerAnimType hold + { + torso pb_stand_shellshock_hold blendtime 50 + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife, stance prone + { + torso pb_dw_prone_shellshock blendtime 50 + } + playerAnimType dualwield AND ballisticknife, stance crouch + { + torso pb_dw_crouch_shellshock blendtime 50 + } + playerAnimType dualwield AND ballisticknife + { + torso pb_dw_stand_shellshock blendtime 50 + } + // DEFAULT + stance prone + { + torso pb_rifle_prone_shellshock blendtime 50 + } + stance crouch + { + torso pb_crouch_shellshock blendtime 50 + } + default + { + torso pb_stand_shellshock blendtime 50 + } +} + +// FLINCHING +flinch +{ + // LASTSTAND + perk laststand + { + // No flinch, since this causes issues in the transition + } + // VEHICLE + vehicle_name huey, dmgdirection right + { + // under development + } + vehicle_name huey, dmgdirection left + { + // under development + } + vehicle_name huey, dmgdirection back + { + // under development + } + vehicle_name huey, dmgdirection front + { + // under development + } + // MINIGUN + playerAnimType minigun + { + // No animation + } + // RADIO + playerAnimType radio + { + // No animation + } + // BRIEFCASE + playerAnimType briefcase + { + // No animation + } + // HOLD + // Prone + playerAnimType hold, dmgdirection right, stance prone + { + torso pt_hold_prone_flinch_right + } + playerAnimType hold, dmgdirection left, stance prone + { + torso pt_hold_prone_flinch_left + } + playerAnimType hold, dmgdirection back, stance prone + { + torso pt_hold_prone_flinch_back + } + playerAnimType hold, dmgdirection front, stance prone + { + torso pt_hold_prone_flinch_forward + } + // Crouch + playerAnimType hold, dmgdirection right, stance crouch + { + torso pt_hold_crouch_flinch_right + } + playerAnimType hold, dmgdirection left, stance crouch + { + torso pt_hold_crouch_flinch_left + } + playerAnimType hold, dmgdirection back, stance crouch + { + torso pt_hold_crouch_flinch_back + } + playerAnimType hold, dmgdirection front, stance crouch + { + torso pt_hold_crouch_flinch_back + } + // Stand + playerAnimType hold, dmgdirection right + { + torso pt_hold_stand_flinch_right + } + playerAnimType hold, dmgdirection left + { + torso pt_hold_stand_flinch_left + } + playerAnimType hold, dmgdirection back + { + torso pt_hold_stand_flinch_back + } + playerAnimType hold, dmgdirection front + { + torso pt_hold_stand_flinch_forward + } + // DUAL WIELD + // Prone + playerAnimType dualwield AND ballisticknife, dmgdirection right, stance prone + { + torso pt_dw_prone_flinch_right + } + playerAnimType dualwield AND ballisticknife, dmgdirection left, stance prone + { + torso pt_dw_prone_flinch_left + } + playerAnimType dualwield AND ballisticknife, dmgdirection back, stance prone + { + torso pt_dw_prone_flinch_back + } + playerAnimType dualwield AND ballisticknife, dmgdirection front, stance prone + { + torso pt_dw_prone_flinch_forward + } + // Crouch + playerAnimType dualwield AND ballisticknife, dmgdirection right, stance crouch + { + torso pt_dw_crouch_flinch_right + } + playerAnimType dualwield AND ballisticknife, dmgdirection left, stance crouch + { + torso pt_dw_crouch_flinch_left + } + playerAnimType dualwield AND ballisticknife, dmgdirection back, stance crouch + { + torso pt_dw_crouch_flinch_back + } + playerAnimType dualwield AND ballisticknife, dmgdirection front, stance crouch + { + torso pt_dw_crouch_flinch_back + } + // Stand + playerAnimType dualwield AND ballisticknife, dmgdirection right + { + torso pt_dw_stand_flinch_right + } + playerAnimType dualwield AND ballisticknife, dmgdirection left + { + torso pt_dw_stand_flinch_left + } + playerAnimType dualwield AND ballisticknife, dmgdirection back + { + torso pt_dw_stand_flinch_back + } + playerAnimType dualwield AND ballisticknife, dmgdirection front + { + torso pt_dw_stand_flinch_forward + } + // REMOTE CONTROL + // Prone + playerAnimType remotecontrol, dmgdirection left, stance prone + { + torso pt_rc_prone_flinch_left + } + playerAnimType remotecontrol, dmgdirection right, stance prone + { + torso pt_rc_prone_flinch_right + } + playerAnimType remotecontrol, dmgdirection front, stance prone + { + torso pt_rc_prone_flinch_forward + } + playerAnimType remotecontrol, dmgdirection back, stance prone + { + torso pt_rc_prone_flinch_back + } + // Crouch + playerAnimType remotecontrol, dmgdirection front, stance crouch + { + torso pt_rc_crouch_flinch_forward + } + playerAnimType remotecontrol, dmgdirection back, stance crouch + { + torso pt_rc_crouch_flinch_back + } + playerAnimType remotecontrol, dmgdirection left, stance crouch + { + torso pt_rc_crouch_flinch_left + } + playerAnimType remotecontrol, dmgdirection right, stance crouch + { + torso pt_rc_crouch_flinch_right + } + // Stand + playerAnimType remotecontrol, dmgdirection front + { + torso pt_rc_stand_flinch_forward + } + playerAnimType remotecontrol, dmgdirection back + { + torso pt_rc_stand_flinch_back + } + playerAnimType remotecontrol, dmgdirection left + { + torso pt_rc_stand_flinch_left + } + playerAnimType remotecontrol, dmgdirection right + { + torso pt_rc_stand_flinch_right + } + // GRENADE + // Prone + weaponclass grenade, playerAnimType grenadeonly, dmgdirection right, stance prone + { + torso pt_prone_flinch_grenade_right grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, dmgdirection left, stance prone + { + torso pt_prone_flinch_grenade_left grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, dmgdirection back, stance prone + { + torso pt_prone_flinch_grenade_back grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, dmgdirection front, stance prone + { + torso pt_prone_flinch_grenade_forward grenadeAnim + } + // Crouch + weaponclass grenade, playerAnimType grenadeonly, dmgdirection right, stance crouch + { + torso pt_crouch_flinch_grenade_right grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, dmgdirection left, stance crouch + { + torso pt_crouch_flinch_grenade_left grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, dmgdirection back, stance crouch + { + torso pt_crouch_flinch_grenade_back grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, dmgdirection front, stance crouch + { + torso pt_crouch_flinch_grenade_back grenadeAnim + } + // Stand + weaponclass grenade, playerAnimType grenadeonly, dmgdirection right + { + torso pt_stand_flinch_grenade_right grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, dmgdirection left + { + torso pt_stand_flinch_grenade_left grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, dmgdirection back + { + torso pt_stand_flinch_grenade_back grenadeAnim + } + weaponclass grenade, playerAnimType grenadeonly, dmgdirection front + { + torso pt_stand_flinch_grenade_forward grenadeAnim + } + // PISTOL + // Prone + weaponclass pistol, dmgdirection right, stance prone + { + torso pt_prone_flinch_pistol_right + } + weaponclass pistol, dmgdirection left, stance prone + { + torso pt_prone_flinch_pistol_left + } + weaponclass pistol, dmgdirection back, stance prone + { + torso pt_prone_flinch_pistol_back + } + weaponclass pistol, dmgdirection front, stance prone + { + torso pt_prone_flinch_pistol_forward + } + // Crouch + weaponclass pistol, dmgdirection right, stance crouch + { + torso pt_crouch_flinch_pistol_right + } + weaponclass pistol, dmgdirection left, stance crouch + { + torso pt_crouch_flinch_pistol_left + } + weaponclass pistol, dmgdirection back, stance crouch + { + torso pt_crouch_flinch_pistol_back + } + weaponclass pistol, dmgdirection front, stance crouch + { + torso pt_crouch_flinch_pistol_back + } + // Stand + weaponclass pistol, dmgdirection right + { + torso pt_stand_flinch_pistol_right + } + weaponclass pistol, dmgdirection left + { + torso pt_stand_flinch_pistol_left + } + weaponclass pistol, dmgdirection back + { + torso pt_stand_flinch_pistol_back + } + weaponclass pistol, dmgdirection front + { + torso pt_stand_flinch_pistol_forward + } + // DEFAULT + // Prone + dmgdirection right, stance prone + { + torso pt_prone_flinch_right + } + dmgdirection left, stance prone + { + torso pt_prone_flinch_left + } + dmgdirection back, stance prone + { + torso pt_prone_flinch_back + } + dmgdirection front, stance prone + { + torso pt_prone_flinch_back + } + // Crouch + dmgdirection right, stance crouch + { + torso pt_crouch_flinch_right + } + dmgdirection left, stance crouch + { + torso pt_crouch_flinch_left + } + dmgdirection back, stance crouch + { + torso pt_crouch_flinch_back + } + dmgdirection front, stance crouch + { + torso pt_crouch_flinch_back + } + // Stand + dmgdirection right + { + torso pt_stand_flinch_right + } + dmgdirection left + { + torso pt_stand_flinch_left + } + dmgdirection back + { + torso pt_stand_flinch_back + } + dmgdirection front + { + torso pt_stand_flinch_forward + } +} + +DEATH +{ + // LASTSTAND + perk laststand, dmgType suicide + { + both pb_laststand_suicide_death + } + perk laststand + { + both pb_laststand_death + } + // MARTYRDOM + perk grenadedeath, stance prone + { + both pb_prone_martyrdom_death + } + perk grenadedeath, stance crouch + { + both pb_crouch_martyrdom_death + } + perk grenadedeath + { + both pb_stand_martyrdom_death + } + stance prone + { + both pb_prone_death_quickdeath + } + // GAS + dmgType gas, stance crouch + { + both pb_crouch_death_fetal + both pb_crouch_death_falltohands + } + dmgType gas + { + both pb_stand_death_head_collapse + both pb_stand_death_neckdeath_thrash + } + // EXPLOSIVE + dmgType explosive, dmgDirection front + { + both pb_death_flyback + both pb_death_flatonback + both pb_death_flyback_far + both pb_death_armslegsforward + both pb_death_armslegsforward_b + both pb_death_upontoback + } + dmgType explosive, dmgDirection back + { + both pb_death_forwardtoface + both pb_death_faceplant + } + dmgType explosive, dmgDirection left + { + both pb_death_legsout_right + both pb_death_jackiespin_right + } + dmgType explosive, dmgDirection right + { + both pb_death_legsout_left + both pb_death_jackiespin_left + } + dmgType explosive + { + both pb_death_jackiespin_inplace + both pb_death_jackiespin_vertical + } + // DEFAULT + movestatus run, stance crouch + { + both pb_crouchrun_death_drop + both pb_crouchrun_death_crumple + } + stance crouch + { + both pb_crouch_death_headshot_front + both pb_crouch_death_clutchchest + both pb_crouch_death_flip + both pb_crouch_death_fetal + both pb_crouch_death_falltohands + } + movestatus run, direction backward + { + both pb_death_run_back + } + movestatus run, direction left + { + both pb_death_run_left + } + movestatus run, direction right + { + both pb_death_run_right + } + movestatus run + { + both pb_death_run_forward_crumple + both pb_death_run_onfront + both pb_death_run_stumble + } + default + { + both pb_stand_death_neckdeath + both pb_stand_death_headchest_topple + both pb_stand_death_frontspin + both pb_stand_death_nervedeath + both pb_stand_death_legs + both pb_stand_death_lowerback + both pb_stand_death_head_collapse + both pb_stand_death_neckdeath_thrash + } +} + +dtp_takeoff +{ + // HOLD + playerAnimType hold + { + both pb_hold_dive_prone animrate 1 + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife + { + both pb_dw_dive_prone animrate 1 + } + // PISTOL + weaponclass pistol + { + both pb_dive_prone_pistol animrate 1 + } + // RPG + weaponclass rocketlauncher + { + both pb_rpg_dive_prone animrate 1 + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly + { + both pb_dive_prone_pistol animrate 1 + } + // DEFAULT + default + { + both pb_dive_prone animrate 1 + } +} + +dtp_land +{ + // DUALWIELD + playerAnimType dualwield AND ballisticknife + { + both pb_dw_dive_prone_land animrate 1 + } + // HOLD + playerAnimType hold + { + both pb_hold_dive_prone_land animrate 1 + } + // PISTOL + weaponclass pistol + { + both pb_pistol_dive_prone_land animrate 1 + } + // RPG + weaponclass rocketlauncher + { + both pb_rpg_dive_prone_land animrate 1 + } + // GRENADE + weaponclass grenade, playerAnimType grenadeonly + { + both pb_pistol_dive_prone_land animrate 1 + } + // DEFAULT + default + { + both pb_dive_prone_land animrate 1 blendtime 133 + } +} + +laststand_suicide +{ + default + { + both pb_laststand_suicide + } +} + +flared +{ + // LASTSTAND + perk laststand + { + // No animation + } + // MINIGUN + playerAnimType minigun + { + // No animation + } + // RADIO + playerAnimType radio + { + // No animation + } + // HOLD + playerAnimType hold, stance prone + { + //torso pb_hold_prone_flare_loop + } + playerAnimType hold, stance crouch + { + torso pb_hold_crouch_flare_loop + } + playerAnimType hold + { + torso pb_hold_stand_flare_loop + } + // DUALWIELD + playerAnimType dualwield AND ballisticknife, stance prone + { + //torso pb_dw_prone_flare_loop + } + playerAnimType dualwield AND ballisticknife, stance crouch + { + torso pb_dw_crouch_flare_loop + } + playerAnimType dualwield AND ballisticknife + { + torso pb_dw_stand_flare_loop + } + // DEFAULT + stance prone + { + //torso pb_rifle_prone_flare_loop + } + stance crouch + { + torso pb_rifle_crouch_flare_loop + } + default + { + torso pb_rifle_stand_flare_loop + } +} + +prime_grenade +{ + playerAnimType reviver + { + // No animation + } + playerAnimType hold + { + // No animation, since these don't have a pin + } + playerAnimType hatchet + { + // No animation, since these don't have a pin + } + stance prone + { + torso pt_grenade_prone_prime grenadeAnim + } + stance crouch + { + torso pt_grenade_crouch_prime grenadeAnim + } + default + { + torso pt_grenade_stand_prime + } +} + +scriptevent +{ + // DEFAULT + event breach_shoulder + { + both pb_breach_shoulder + } + event breach_slide + { + both pb_breach_slide + } + event breach_lift + { + both pb_breach_lift + } +} + +forceload +{ + head + pf_casual_idle + pf_alert_idle + pf_firing + pf_melee + pf_pain + pf_death +// pb_huey_minigun_aim +// pb_huey_minigun_aim_down +// pb_huey_minigun_aim_up +// pb_huey_gunner_aim_60left_level +// pb_huey_gunner_aim_60right_level +// pb_huey_gunner_aim_60down_60left +// pb_huey_gunner_aim_60down_60right +// pb_huey_gunner_aim_60up_60left +// pb_huey_gunner_aim_60up_60right + fake_gunner_aim +} \ No newline at end of file diff --git a/BO1/PC/ZM/mp/playeranimtypes.txt b/BO1/PC/ZM/mp/playeranimtypes.txt new file mode 100644 index 0000000..edafbfe --- /dev/null +++ b/BO1/PC/ZM/mp/playeranimtypes.txt @@ -0,0 +1,21 @@ +none +default +other +sniper +m203 +hold +briefcase +reviver +radio +dualwield +remotecontrol +crossbow +minigun +beltfed +g11 +rearclip +rearclipsniper +ballisticknife +nopump +hatchet +grimreaper \ No newline at end of file diff --git a/BO1/PC/ZM/mp/zm_challenges_reset.cfg b/BO1/PC/ZM/mp/zm_challenges_reset.cfg new file mode 100644 index 0000000..cd84e55 --- /dev/null +++ b/BO1/PC/ZM/mp/zm_challenges_reset.cfg @@ -0,0 +1,5 @@ + +statset 2910 0 +statset 2911 0 +statset 910 0 +statset 911 0 diff --git a/BO1/PC/ZM/mp/zm_protips_reset.cfg b/BO1/PC/ZM/mp/zm_protips_reset.cfg new file mode 100644 index 0000000..d2663a1 --- /dev/null +++ b/BO1/PC/ZM/mp/zm_protips_reset.cfg @@ -0,0 +1,13 @@ + +statset 1450 0 +statset 1451 0 +statset 1452 0 +statset 1453 0 +statset 1454 0 +statset 1455 0 +statset 1456 0 +statset 1457 0 +statset 1458 0 +statset 1459 0 +statset 1460 0 +statset 1461 0 \ No newline at end of file diff --git a/BO1/PC/ZM/mptype/player_t5_zm.gsc b/BO1/PC/ZM/mptype/player_t5_zm.gsc new file mode 100644 index 0000000..d4ab506 Binary files /dev/null and b/BO1/PC/ZM/mptype/player_t5_zm.gsc differ diff --git a/BO1/PC/ZM/mptype/player_t5_zm_coast.gsc b/BO1/PC/ZM/mptype/player_t5_zm_coast.gsc new file mode 100644 index 0000000..8e6c9ee Binary files /dev/null and b/BO1/PC/ZM/mptype/player_t5_zm_coast.gsc differ diff --git a/BO1/PC/ZM/mptype/player_t5_zm_cosmodrome.gsc b/BO1/PC/ZM/mptype/player_t5_zm_cosmodrome.gsc new file mode 100644 index 0000000..3d035a4 Binary files /dev/null and b/BO1/PC/ZM/mptype/player_t5_zm_cosmodrome.gsc differ diff --git a/BO1/PC/ZM/mptype/player_t5_zm_pentagon.gsc b/BO1/PC/ZM/mptype/player_t5_zm_pentagon.gsc new file mode 100644 index 0000000..e38f4ce Binary files /dev/null and b/BO1/PC/ZM/mptype/player_t5_zm_pentagon.gsc differ diff --git a/BO1/PC/ZM/mptype/player_t5_zm_theater.gsc b/BO1/PC/ZM/mptype/player_t5_zm_theater.gsc new file mode 100644 index 0000000..895b010 Binary files /dev/null and b/BO1/PC/ZM/mptype/player_t5_zm_theater.gsc differ diff --git a/BO1/PC/ZM/mptype/player_t5_zt.gsc b/BO1/PC/ZM/mptype/player_t5_zt.gsc new file mode 100644 index 0000000..b631702 Binary files /dev/null and b/BO1/PC/ZM/mptype/player_t5_zt.gsc differ diff --git a/BO1/PC/ZM/patch b/BO1/PC/ZM/patch new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/radiant/clientkeys.txt b/BO1/PC/ZM/radiant/clientkeys.txt new file mode 100644 index 0000000..3c6639c --- /dev/null +++ b/BO1/PC/ZM/radiant/clientkeys.txt @@ -0,0 +1,472 @@ +// syntax: +// float floatVar +// int intVar +// string stringVar + +// COD7 NOTE: Any additions, ADD TO BOTTOM!!! + +vector origin +vector angles +int export +int spawnflags +int radius +int speed +string target +string targetname +string groupname +string name + +int script_noenemyinfo // setting to 1 makes a guy spawn with no enemy info + +float script_wait // Script will wait this long between actions +float script_wait_min // Minimum wait time between actions +float script_wait_max // Maximum wait time between actions +float script_wait_add // Additive delay is the # of seconds extra added between actions + +float script_delay // Action will be delayed for this long before triggering +float script_delay_min // Minimum delay before action is triggered +float script_delay_max // Maximum delay before action is triggered + +float script_burst +float script_burst_min // Put on an mg turret, min time of a burst +float script_burst_max // Put on an mg turret, max time of a burst + +float script_reuse +float script_reuse_min // Minimum time before a new AI will use this turret. +float script_reuse_max // Maximum time before a new AI will use this turret. + +float delay +float script_suppression // Suppression wait for this AI +float height +float script_falldirection // Used to specify the direction a treeburst tree trunk falls towards +float script_timeout +float script_accuracy // Set this on AI to have them spawn with a modified accuracy + +int script_cheap // makes vehicles lose some functionality but be far fewer variables +int script_pacifist +int script_ignoreme // If this setting exists on a spawner this guy will have his .ignoreme set to true +int script_ignore_suppression // sets .ignoreSuppression to true if its set. +int script_ignoreall // sets .ignoreall to true if its set. + + +int script_repeat // # of times an effect in an exploder will repeat +int script_fxstart // Identifies effects so they can be turned on by grouping with a trigger +int script_fxstop // Identifies effects so they can be turned off by grouping with a trigger +int script_damage // Damage of radius damage on an exploder +float script_firefxdelay // repetition rate on a firefx for exploders +float script_firefxtimeout // Amount of time before a looping effect fades out +string script_firefx // Fx to play infinitely from a used exploder +string script_presound // To play sounds on exploders before the explosion, for pathfinder only +string script_ender // Stop a looping effect +string script_firefxsound // Looping sound for an exploder firefx +string script_trailfx // Specifies the trailfx to be used on the entity. +string script_trailfxtag // Specifies the trailfx tag to play off of +float script_trailfxdelay // Specifies the trailfx repeat delay +string script_trailfxsound // Specifies the trailfx sound to play +float script_trailfxtimeout // Specifies the trailfxtimeout +string script_ent_trailfxsound // Specifies the sound to play in conjunction with the trailfx + +vector script_angles // generic angles storage +int script_delete +int script_increment +int script_patroller +int script_offtime // Number of milliseconds before guys get off a flak when you hit the off-trigger, defaults to 20000 +int script_offradius // Guys get off a flak if a player gets this close to a flak after hitting the off-trigger, default 350 +string script_autosavename +int script_autosave +int count +int script_timer // Timeout for friendly_chat +int script_delayed_playerseek +int script_triggered_playerseek //group a trigger and an ai with this and he the grouped ai will do playerseek behaviour when the trigger is hit +int script_playerseek +int script_seekgoal +int script_start +int script_radius // Sets an AI's starting goal radius. On an exploder this sets the radius damage's radius. +int script_followmin +int script_followmax +int script_startinghealth +int script_fallback +int script_grenades +int script_fightdist // Spawners will spawn with this pathEnemyFightDist +int script_maxdist // Spawners will spawn with this pathEnemyLookAhead +int script_moveoverride // Spawners with this will go to their (targetted) node before fighting. + +int script_killspawner // When you go through a trigger with this on it, any spawners that have the same # will be deleted. +int script_emptyspawner // When you go through a trigger with this on it, any spawners that have the same # will have their count set to 0. + +int script_vehiclenodegroup //used for getting an array of vehicle nodes +int script_mg42auto // When you hit this trigger any grouped mg42s will go into auto mode and clear target. +int script_requires_player +int script_sightrange +int script_fallback_group // Makes stray spawned guys part of bigger falling back movements. +int script_vehiclegroup // links a vehicle to its spawners +int script_vehicle_selfremove // vehicle will delete itself when it reaches the end of its path +int script_exploder // Grouping things that explode +int script_prefab_exploder // Override an exploder since exploders in prefabs get unique'd. +int script_balcony // current mechanism for flagging an actor to test for balcony death +int script_mgturret // Group AI with a node that targets an mg42 and the AI will keep the gun in use. +int script_plane // Specifies which plane set this is, so they can all be started together. +int script_explode // Tells a plane to explode with this exploder. +int dontdropweapon // If set, the AI will not drop a weapon when he dies +int dontdrawoncompass // If set, the AI will not be drawn on the player's compass. Only matters for friendlies +int script_usemg42 // If set to false, a friendly will not use be told by friendly_mg42 triggers to use an mg42. +int script_stoptoshoot // used for tanks, setting this to greater than zero will make a tank stop before firing it's main cannon +int script_startingposition // used for riders of vehicles to manually designate riding postions (also used for walkers) +int script_turretmg +int script_forcegrenade // Set to 1 to enable AI to throw as many grenades as they want rather than extremely rarely. +int script_goalvolume // groups guys so they use a goalvolume +int script_stack // for walls where friendlies hang out +int script_nofriendlywave // disables tracking of this ai for friendly_wave's +int script_forcegoal // forces an AI to use the goal radius of the node they target, rather than switch to 2000 (for flood_and_secure spawners) +int script_disconnectpaths // makes exploder script_brushes connectpaths when hidden and disconnect when shown. could be used to disable cover nodes. +int script_nowall // make AI play a special set of corner animations that dont require a wall +int script_longdeath // set to 0 disable long death animations like lying on the ground and shooting +int script_displaceable // makes an AI able to change his goal radius from animscript. +int script_grenadespeed // used for setting magic grenade launch speeds on script origins +int script_maxspawn // used on flood spawn trigger to regulate the max number of ai +int script_breach_id // used on a door to force a special type of breach. +int script_battlechatter +int script_trigger_group // used to disable a group of triggers when one gets hit. + +int script_airspeed // used in checks for setting speed on helicopter path origins or nodes +int script_yawspeed // used in checks for setting yaw speed on helicopter path origins or nodes +int script_forceyaw // used in checks for a target or goal yaw on helicopter path origins or nodes +int script_cleartargetyaw // used in checks to reset a target yaw on helicopter path origins or nodes +int script_accel // used in checks to change the acceleration on helicopter path origins or nodes +int script_decel // used in checks to change the deceleration on helicopter path origins or nodes +int script_engage // used in checks to fire weapons on helicopter path origins or nodes +int script_engageDelay // used in checks to delay weapons firing on helicopter path origins or nodes +int script_hoverwait // used in checks to set hovering times on helicopter path origins or nodes +int script_pilottalk // used in checks to trigger dialogue on helicopter path origins or nodes +string script_attackPattern // used in checks to control weapons firing on helicopter path origins or nodes + +string script_objective +string script_friendname +string script_noteworthy // Used to get a string for scripted sequences mainly. +string script_parameters // generic string used for similar purpose as script_noteworthy +string script_triggername // Z: used for elevators in the dam +string script_fxcommand // What to do with the effect +string script_fxid // The id of the effect to do +string weaponinfo +string script_hidden // the thing which is hidden and appears later (mortars) +string vehicletype +string script_personality // This guy will use this personality type +string script_squadname // squad (spawner cluster) identifier +string script_nodestate // generic identifier for nodes +string script_assaultnode // generic identifier for nodes +string script_team // how to know which team a tank is on (needed to free up target/targetname for radiant linkability) +string script_mortargroup // to group mortars with their triggers +string ambient // String index of the level.ambient_track to play on this trigger. +string script_gameobjectname // Used in multiplayer to add/remove entities based on gametype. +string script_gametype_dm // Preston: Used in multiplayer to add/remove entities based on gametype. +string script_gametype_tdm // Preston: Used in multiplayer to add/remove entities based on gametype. +string script_gametype_ctf // Preston: Used in multiplayer to add/remove entities based on gametype. +string script_gametype_hq // Preston: Used in multiplayer to add/remove entities based on gametype. +string script_gametype_sd // Preston: Used in multiplayer to add/remove entities based on gametype. +string script_mapsize_08 // Preston: Used in multiplayer to add/remove entities based on the set mapsize. +string script_mapsize_16 // Preston: Used in multiplayer to add/remove entities based on the set mapsize. +string script_mapsize_32 // Preston: Used in multiplayer to add/remove entities based on the set mapsize. +string script_mapsize_64 // Preston: Used in multiplayer to add/remove entities based on the set mapsize. +string script_sound // Plays level.scr_sound ["string"] +string script_animation // If defined, patrollers will play a random pause animation at this node. + +string script_destructable_area // used to let destructable walls block off areas of the map (affects spawning, for instance) + +string script_earthquake // References level.earthquake variables to do an earthquake +string script_followmode +string script_skilloverride +string script_bctrigger +int script_bcdialog //set to 0 on a spawner/ai when you want to turn off battlechatter forever on that individual +string script_aigroup +string script_objective_active // used with flood_and_Secure and "friendlychain"s to only be active if this objective +string script_objective_inactive // is active +string script_threatbiasgroup // adds spawned ai to this threatbiasgroup + +string script_squad // Group spawners/ai so they share enemy information + +string script_area // used by battlechatter system +string script_location // used by battlechatter system +string script_landmark // used by battlechatter system + +string script_flag_true // This entity should not activate unless at least one of the flags in this string is true +string script_flag_false // This entity should not activate unless all the flags in this string are false +string script_flag // the flag that gets enabled/disabled by targetname flag_set and flag_unset +string script_flag_set // helis using helipath will set this flag when they reach this point +string script_flag_wait // helis using helipath will wait at this point until this flag is set +string script_flag_clear // clears the flag when it hits this spot +string script_color_allies // groups allied AI with nodes/triggers of that color +string script_color_axis // groups axis AI with nodes/triggers of that color +string script_forcecolor // forces an AI to use all nodes of this color + +string script_linkName // Works with script_linkTo +string script_linkTo // A compound string that is a list of script_linkname'd entities that this entity links to. +string script_wtf + +string script_stance // General purpose string identifier useful for stance related scripting + +string script_namenumber // General purpose string identifier that used to be in this file that I use frequently + +// destructable stuff +int script_accumulate // damage that must accumulate for destruction to occur +int script_threshold // min damage that has any effect + +// ambient stuff +string script_ambientpackage // declare the ambient package associated with this trigger +string script_ambientroom // declare the room associated with this trigger +int script_ambientpriority // declare the ambient priority associated with this trigger + +// vehicle stuff +int script_turret +int script_gatetrigger // vehicles will wait at vehicle nodes with this untill the trigger is hit. +int script_VehicleSpawngroup // spawns associated vehicles and their aigroups (as still designated by script_vehiclegroup on the vehicles and the ai's) +int script_VehicleStartMove // initiates associated vehicles movement on its path, note that if no script_vehicleStart nodes or triggers exist then the vehicle will stay and wait for the level script to initiate it's movement stacking this with script_VehicleSpawngroup will make spawn and go right away. +int script_vehicleGroupDelete // Deletes associated vehicles and their aigroups (as still designated by script_vehiclegroup on the vehicles and the ai's) +int script_physicsjolt //toggle tanks shaking physics as it drives by. +string script_unload // tells the vehicle to unload this group of guys + +int script_deathroll //turns on and off deathroll for vehicles crossing paths +string script_crashtype //designates a crashpath +string script_crashtypeoverride //override the type of crash a vehicle will do when it dies values are "tank", "mobile" +int script_nomg //makes machineguns not spawn at all on a tank. used for big tank battles where they aren't necessary on all the tanks. +int script_badplace //no badplaces on tanks. for tanks that won't be near ai. on big tank battles. +float script_dronelag //amount of timed space between drones following vehicle paths +int script_fireondrones //toggles machineguns firing on drones behavior + +int script_vehicleride +int script_vehiclewalk +int script_unloadmgguy // set this on the halftrack to make the mg guy unload. +int script_keepdriver // set this on the vehicle to make the vehilce driver not unload. + +int script_vehicledetour +int script_avoidvehicles //setting to 0 on a tank will make it not do collision avoidance stuff +int script_avoidplayer // setting to 1 will cause the tank to perform collision avoidance on the player +float script_playerconeradius // used optionally with script_avoidplayer if you want a cone radius other than 200. +string script_vehicledetourtype //describing how a vehicledetour node works, first non default type being "scriptswitch" which will let the script notify the path to become a switch node. Useful in situations where a tank will fight in circles and then procede on whatever script condition. +float script_attackspeed +int script_unloaddelay //make a vehicle delay this long before unloading at the end of a path. < 1 means never unload // nate we should remove this or make it work on all of the unloads. +int script_cobratarget //set to 1 to create a target for this entity on pilotcobra missions +string script_targettype //"air" or "ground" - used for helicopter pilot levels +float script_targetoffset_z //offset from model where missiles should aim - used for helicopter pilot levels +int script_wingman + +string script_turningdir // set this to the direction of the anim set you want a vehicle to use. "right","hard_right","left","hard_left","forward" +int script_bombmode_original +int script_bombmode_single +int script_bombmode_dual +string script_label +int script_flakaicount //for setting the amount of ai to spawn on a flak +string script_tankgroup // used to add a tankgroup to vehicles. +float script_chance //chance that an exploder will explode, checked every 4 seconds or whatever script_delay is on the trigger. + +int script_forcespawn // Used to forcespawn (aka stalingradspawn) an AI. +int script_allowdeath +float script_death +float script_death_min +float script_death_max +int script_drones_min +int script_drones_max +int script_looping +int script_trace +int script_spawn_here // for camper_spawner + +string script_vehicleaianim //this will be a radiant drop down list that tells the ai on the vehicle which animations to play + +int script_health // bringing it back! + +int script_stopnode //tells helicopters to stop at a node. +string script_turret_share // shares turret spots for portable mgs +string script_turret_ambush // shares turret spots for portable mgs +int script_dont_link_turret +string ambience_inner +string ambience_outer +int script_mg_angle //this gives option to start the machinegun at an angle +int script_deathchain +int script_nohealth // makes the guy not drop health + +// destructible object +string destructible_type //identifier + +vector script_bg_offset // I'm using this in cobrapilot to move the background pieces into place +int script_flashbangs //set this to > 0 to give an AI flashbangs instead of frag grenades. + +float script_dot // used on targetname trigger_lookat triggers to change the fov +int script_drone //setting to 1 makes the spawner a script drone +int squadnum + +string script_hint // put on trigger_hint + +int script_anglevehicle + +// when all the ai and spawners with the same string die +// (or their count depletes to zero), a flag with this string +// gets set +string script_deathflag + +string script_delay_goto_goalmin //z: an AI will spawn, but not run to his goal for a random amount of time +string script_delay_goto_goalmax //z: an AI will spawn, but not run to his goal for a random amount of time + +int script_random_killspawner //group a trigger with some spawners +int script_randomspawn //use with a script_random_killspawner - script will randomly spawn one of the groups +int script_killspawner_group + +int script_wheeldirection // 1 goes forward 0 goes backwards. +int script_light_toggle // set to 1 on vehicle enables vehicles ability to turn on and off lights. +string script_vehicle_lights_on // set to a group of lights to turn them on +string script_vehicle_lights_off // set to a group of lights to turn them off +int script_fixednode // can force .fixednode on an AI +float fixednodesaferadius // the safe radius + +string spawner_id //using this for jeepride, guh, grunt, blarg! -nate +int script_vehicledetourgroup // use this for telling a detour node to only detour vehicles in matching groups +int script_vehicletriggergroup // a more generic grouping. I'm using this so that paths can be shared easier. setting this on a node with other vehicle trigger functions will only effect vehicles in the matching group. + +string script_ghettotag + +// CoD5 Additions +//----------------------------------------------------------------- + +// Generic/Misc Keys: +//------------------- + +int script_int // Generic INT for anyone to use +float script_float // Generic FLOAT for anyone to use +vector script_vector // Generic VECTOR for anyone to use +string script_string // Generic STRING for anyone to use +string script_notify // Sends out the specified notify to the level when the trigger is triggered + +int script_color_auto_disable // Determines if a color trigger will not automatically be toggled off +int script_percent // Fallback uses this to determine the "percent" of AI that will fall back when the trigger is hit. + +// Feature Specific Keys: +//----------------------- + +// Commentary (MikeD) +string script_commentary // Used with level.commentary[script_commentary] + +// Spiderhole (ChrisP) +int script_spiderhole // set on a spawner to make it a spiderhole guy +int script_spiderhole_charge // set the chance to charge at the player ( 0 - 100) +string script_spiderhole_anim // set the animation used to emerge from the spiderhole + +// Planes (SRS 05/02/07) +int script_numbombs // used to give a plane an initial number of bombs. +int script_dropbombs // used for vehiclenodes, to tell a plane to drop X bombs +float script_dropbombs_delay // used to set a delay (secs) for the script_numbombs bomb dropping. +float script_dropbombs_delaytrace // used to delay the start of bomb ground traces for X secs (in case it has to pass thru a collidable surface). + +// SCRTIPER_MOD: JesseS (05/08/07) script_flak88 added +int script_flak88 // used for spawning and setting up flak88s +int script_vehicleattackgroup // used for attacking vehiclespawngroups. +float script_vehicleattackgroupwait // used for setting a delay before attacking a vehiclespawngroup with script_vehicleattackgroup. +int script_nonmovingvehicle // replaces script_flak88 to define nonmoving vehicles in order to prevent vehicle script errors + +// SRS (3/25/08): added key to allow specifying combat_getout anims on vehicle AI spawners +int script_combat_getout // used in _vehicle_aianim.gsc + +// MikeD (9/5/2007): Exposed functionality for spawners to respawn in _colors +int script_no_respawn // Disables the AI from being put on the _colors::replace_on_death thread. + +// MikeD (11/2/2007): Interactive Objects, pass self in for being the attacker +int script_selfisattacker + +// JamesS (1/3/2008): added destructibledef accessible by script +string destructibledef + +// SCRIPTER_MOD: JesseS (1/11/2008): +int script_nodropweapon // Used in _spawner to disallow weapon drop on enemies. Ask a lead before using! + +// MikeD (1/13/2008) +int script_banzai // Dynamic Bonzai Attack for AI. Set on the spawners. +int script_banzai_spawn // Bonzai Attack for AI once they spawn in. Set on the spawners. + +// MikeD (1/17/2008): Tank Mantle support +int script_nomantle // If set, disables mantling for the tank, even discards setting up the variables/fx/animations for the tank. + +// SCRIPTER_MOD: JesseS (3/24/2008): Fog trigger support +// SCRIPTER_MOD: GavinL (4/15/2010): copied over the server fog support kvps +int script_start_dist // The distance, in world units, at which the fog begins. +int script_halfway_dist // The distance at which the scene will be 50% fogged. +int script_halfway_height // The height at which the scene will be 50% fogged. +int script_base_height // The ground-level Z position at which the fog will start from. +vector script_color // The color components of the fog as a value between 0.0 and 1.0; also the first color of a dynamic light +float script_color_scale // The scale of the color components because the largest value for color is 1 +float script_transition_time // transition time in seconds +string script_vision // vision file name to transition to +float script_vision_time // vision file time to transition to +vector script_sun_color // The sun color +vector script_sun_direction // The sun direction +int script_sun_start_ang // The start angle for the sun +int script_sun_stop_ang // The stop angle of the sun +float script_max_fog_opacity // The maximum fog opacity + +// Bloodlust 20 may 2008: +// MP Dynamic Lights support +vector script_color2 // The second color of a dynamic light to switch between it and script_color + +// MikeD (4/11/2008): Added MG42 "animated" object support +string script_animent // Specifies the targetname of the animated object when the MG42 fires +string script_animname // Specifies the animname of the animated object + +// JasonE (4/10/2008) +string twar_owner // team which owns this flag initially +string twar_owner_home // the home flag for the specified team, is this flag is taken by the opposing team the game is over +string twar_axis_dependants // semi-colon seperated list of flags required before capturing this flag (property of script/origin flag_descriptor object) +string twar_allies_dependants // semi-colon seperated list of flags required before capturing this flag (property of script/origin flag_descriptor object) +string classname // used for client side destructables, which convert script_brushmodel info into script structs. +int lightpriority // clientside lights +float intensity // clientside lights +vector _color // clientside lights +string def // clientside lights +float exponent // clientside lights +float fov_inner // clientside lights +float fov_outer // clientside lights +int pl // clientside lights +float script_intensity_min +float script_intensity_max +int clientside // Clientside spawn stuff. +string model // clientside exploders. +vector script_light2_color // clientside lights +float script_light2_intensity // clientside lights +float script_light2_radius // clientside lights +float script_light2_inner_fov // clientside lights +float script_light2_outer_fov // clientside lights +int script_light2_exponent // clientside lights +string script_mixer_event // clientside lights +float script_mixer_ltr_ramp // clientside lights +float script_mixer_rtl_ramp // clientside lights +string script_light2_targetname // clientside lights +float script_light2_intensity_min // clientside lights +float script_light2_intensity_max // clientside lights +float script_light2_delay_min // clientside lights +float script_light2_delay_max // clientside lights +int script_light_onetime // clientside lights +string script_light_label // clientside lights +string script_light_model // clientside lights +string script_light_on_model // clientside lights +string script_light_off_model // clientside lights +string script_light_on_spin_model +string script_light_off_spin_model +string script_light_spin_fx +string script_light_spin_tag +int script_prefab_id +float script_mixer_robot_min // clientside lights +float script_mixer_robot_max // clientside lights +string script_light_sound // clientside lights +string script_light2_sound // clientside lights +string script_sound2 // Plays level.scr_sound ["string"] +float script_light2_burst_min // clientside lights +float script_light2_burst_max // clientside lights +float script_light_rotate_yaw // clientside lights +float script_burst_time // clientside lights +float script_light2_burst_time // clientside lights +float script_fade_duration // clientside lights +float script_light2_fade_duration // clientside lights +float script_burst_intensity // clientside lights +float script_light2_burst_intensity // clientside lights +string script_light_type // clientside lights +string script_light_fx // clientside lights +string script_light2_fx // clientside lights +vector script_light_fx_offset // clientside lights +int script_light_no_range_check // clientside lights + + diff --git a/BO1/PC/ZM/radiant/keys.txt b/BO1/PC/ZM/radiant/keys.txt new file mode 100644 index 0000000..f69d31f --- /dev/null +++ b/BO1/PC/ZM/radiant/keys.txt @@ -0,0 +1,500 @@ +// syntax: +// float floatVar +// int intVar +// string stringVar + +// COD7 NOTE: Any additions, ADD TO BOTTOM!!! +// COD7 NOTE: Check with your lead before making any modifications to this file! + +vector origin +vector angles +int export +int spawnflags +int radius +int speed +string target +string targetname +string groupname +string name +int count // how many times a spawner can be spawned from +int dontdrawoncompass // If set, the AI will not be drawn on the player's compass. Only matters for friendlies +float delay + +int script_noenemyinfo // setting to 1 makes a guy spawn with no enemy info + +float script_wait // Script will wait this long between actions +float script_wait_min // Minimum wait time between actions +float script_wait_max // Maximum wait time between actions +float script_wait_add // Additive delay is the # of seconds extra added between actions + +string script_waittill // General key of a notify to wait for + +float script_delay // Action will be delayed for this long before triggering +float script_delay_min // Minimum delay before action is triggered +float script_delay_max // Maximum delay before action is triggered + +float script_burst +float script_burst_min // Put on an mg turret, min time of a burst +float script_burst_max // Put on an mg turret, max time of a burst + +float script_suppression // Suppression wait for this AI +float height +float script_timeout +float script_accuracy // Set this on AI to have them spawn with a modified accuracy + +int script_cheap // makes vehicles lose some functionality but be far fewer variables +int script_pacifist // makes an ai be a pacifist (sets their .pacifist = true) +int script_ignoreme // If this setting exists on a spawner this guy will have his .ignoreme set to true and will be ignored by other ai. +int script_ignore_suppression // sets .ignoreSuppression to true if its set. actors will not be suppressed by gun fire. +int script_ignoreall // sets .ignoreall to true if its set. makes actors ignore all suppression/damage/danger. +int script_disable_bleeder // sets .a.canbleed to false if set to 1 +int script_disable_reviver // sets .a.canrevive to false if set to 1 + +int script_repeat // # of times an effect in an exploder will repeat +int script_fxstart // Identifies effects so they can be turned on by grouping with a trigger +int script_fxstop // Identifies effects so they can be turned off by grouping with a trigger +int script_damage // Damage of radius damage on an exploder +float script_firefxdelay // repetition rate on a firefx for exploders +float script_firefxtimeout // Amount of time before a looping effect fades out +string script_firefx // Fx to play infinitely from a used exploder +string script_presound // To play sounds on exploders before the explosion, for pathfinder only +string script_ender // Stop a looping effect +string script_firefxsound // Looping sound for an exploder firefx +string script_trailfx // Specifies the trailfx to be used on the entity. +string script_trailfxtag // Specifies the trailfx tag to play off of +float script_trailfxdelay // Specifies the trailfx repeat delay +string script_trailfxsound // Specifies the trailfx sound to play +float script_trailfxtimeout // Specifies the trailfxtimeout +string script_ent_trailfxsound // Specifies the sound to play in conjunction with the trailfx + +vector script_angles // generic angles storage +int script_delete +int script_patroller // used to set up a spawner for patrolling through _patrol +string script_patrol_walk_anim // patrol walk override +string script_autosavename +int script_autosave +float script_timer // Timeout for friendly_chat or general time value +int script_start +int script_radius // Sets an AI's starting goal radius. On an exploder this sets the radius damage's radius. +int script_fallback // For fallback retreat behavior +int script_grenades // sets a spawner's .grenadeammo, which is the # of grenades an actor starts with when spawned +int script_fightdist // Spawners will spawn with this pathEnemyFightDist +int script_maxdist // Spawners will spawn with this pathEnemyLookAhead +int script_moveoverride // Spawners with this will go to their (targetted) node before fighting. + +int script_killspawner // When you go through a trigger with this on it, any spawners that have the same # will be deleted. +int script_emptyspawner // When you go through a trigger with this on it, any spawners that have the same # will have their count set to 0. + +int script_mg42auto // When you hit this trigger any grouped mg42s will go into auto mode and clear target. +int script_requires_player +int script_sightrange +int script_fallback_group // Makes stray spawned guys part of bigger falling back movements. + +int script_vehicle_selfremove // vehicle will delete itself when it reaches the end of its path +int script_exploder // Grouping things that explode +int script_exploder_server // Sets the exploder to be on the server side +int script_prefab_exploder // Override an exploder since exploders in prefabs get unique'd. + +int script_usemg42 // If set to false, a friendly will not use be told by friendly_mg42 triggers to use an mg42. + +int script_startingposition // used for riders of vehicles to manually designate riding postions (also used for walkers) +int script_turretmg +int script_forcegrenade // Set to 1 to enable AI to throw as many grenades as they want rather than extremely rarely. +int script_goalvolume // groups guys so they use a goalvolume +int script_disconnectpaths // makes exploder script_brushes connectpaths when hidden and disconnect when shown. could be used to disable cover nodes. + +int script_longdeath // set to 0 disable long death animations like lying on the ground and shooting +int script_battlechatter +int script_trigger_group // used to disable a group of triggers when one gets hit. + +int script_airspeed // used in checks for setting speed on helicopter path origins or nodes +int script_accel // used in checks to change the acceleration on helicopter path origins or nodes +int script_decel // used in checks to change the deceleration on helicopter path origins or nodes + +string script_friendname +string script_noteworthy // Used to get a string for scripted sequences mainly. +string script_parameters // generic string used for similar purpose as script_noteworthy +string script_fxcommand // What to do with the effect +string script_fxid // The id of the effect to do +string weaponinfo +string script_hidden // the thing which is hidden and appears later (mortars) +string vehicletype +string script_squadname // squad (spawner cluster) identifier +string script_team // how to know which team a tank is on (needed to free up target/targetname for radiant linkability) +string ambient // String index of the level.ambient_track to play on this trigger. +string script_gameobjectname // Used in multiplayer to add/remove entities based on gametype. +string script_gametype_dm // Preston: Used in multiplayer to add/remove entities based on gametype. +string script_gametype_tdm // Preston: Used in multiplayer to add/remove entities based on gametype. +string script_gametype_ctf // Preston: Used in multiplayer to add/remove entities based on gametype. +string script_gametype_hq // Preston: Used in multiplayer to add/remove entities based on gametype. +string script_gametype_sd // Preston: Used in multiplayer to add/remove entities based on gametype. +string script_mapsize_08 // Preston: Used in multiplayer to add/remove entities based on the set mapsize. +string script_mapsize_16 // Preston: Used in multiplayer to add/remove entities based on the set mapsize. +string script_mapsize_32 // Preston: Used in multiplayer to add/remove entities based on the set mapsize. +string script_mapsize_64 // Preston: Used in multiplayer to add/remove entities based on the set mapsize. +string script_sound // Plays level.scr_sound ["string"] +string script_animation // If defined, patrollers will play a random pause animation at this node. + +string script_destructable_area // used to let destructable walls block off areas of the map (affects spawning, for instance) + +string script_earthquake // References level.earthquake variables to do an earthquake +string script_skilloverride // used in setting the difficult of mg turrets. see _mgturret.gsc +string script_aigroup // specifies an aigroup for a spawner +string script_threatbiasgroup // adds spawned ai to this threatbiasgroup + +string script_bctrigger // for use with battlechatter triggers +int script_bcdialog // set to 0 on a spawner/ai when you want to turn off battlechatter forever on that individual +string script_area // used by battlechatter system +string script_location // used by battlechatter system +string script_landmark // used by battlechatter system + +string script_flag_true // This entity should not activate unless at least one of the flags in this string is true +string script_flag_false // This entity should not activate unless all the flags in this string are false +string script_flag // the flag that gets enabled/disabled by targetname flag_set and flag_unset +string script_flag_set // this flag will be set when this trigger is used +string script_flag_wait // helis using helipath will wait at this point until this flag is set +string script_flag_clear // clears the flag when it hits this spot +string script_color_allies // groups allied AI with nodes/triggers of that color +string script_color_axis // groups axis AI with nodes/triggers of that color +string script_forcecolor // forces an AI to use all nodes of this color + +// SUMEET ( 7/12/2010 ) +string script_ent_flag_set // flag will be set by a node if set on it while going to the node +string script_ent_flag_clear // flag will be cleared by a node if set on it while going to the node + +string script_linkName // Works with script_linkTo +string script_linkTo // A compound string that is a list of script_linkname'd entities that this entity links to. + +// destructable stuff +int script_accumulate // damage that must accumulate for destruction to occur +int script_threshold // min damage that has any effect + +// ambient stuff +string script_ambientpackage // declare the ambient package associated with this trigger +string script_ambientroom // declare the room associated with this trigger +int script_ambientpriority // declare the ambient priority associated with this trigger + +// vehicle stuff +int script_turret +int script_gatetrigger // vehicles will wait at vehicle nodes with this untill the trigger is hit. +int script_VehicleSpawngroup // spawns associated vehicles and their aigroups (as still designated by script_vehiclegroup on the vehicles and the ai's) +int script_VehicleStartMove // initiates associated vehicles movement on its path, note that if no script_vehicleStart nodes or triggers exist then the vehicle will stay and wait for the level script to initiate it's movement stacking this with script_VehicleSpawngroup will make spawn and go right away. +int script_vehicleGroupDelete // Deletes associated vehicles and their aigroups (as still designated by script_vehiclegroup on the vehicles and the ai's) +int script_physicsjolt // toggle tanks shaking physics as it drives by. +string script_unload // tells the vehicle to unload this group of guys examples are "all", "passengers", and "rear_passengers" + +int script_deathroll // turns on and off deathroll for vehicles crossing paths +string script_crashtype // designates a crashpath +string script_crashtypeoverride // override the type of crash a vehicle will do when it dies values are "tank", "mobile" +int script_nomg // makes machineguns not spawn at all on a tank. used for big tank battles where they aren't necessary on all the tanks. +int script_badplace // no badplaces on tanks. for tanks that won't be near ai. on big tank battles. +int script_fireondrones // toggles machineguns firing on drones behavior + +string script_followmode // refers to the style in which ai are set to follow a vehicle. +int script_vehiclewalk // groups spawners with a vehcile they're set to follow on foot +int script_vehicleride // groups spawners with a vehicle they're set to ride +int script_unloadmgguy // set this on the halftrack to make the mg guy unload. +int script_keepdriver // set this on the vehicle to make the vehilce driver not unload. + +int script_vehicledetour +float script_playerconeradius // used optionally with script_avoidplayer if you want a cone radius other than 200. +int script_unloaddelay // make a vehicle delay this long before unloading at the end of a path. < 1 means never unload // nate we should remove this or make it work on all of the unloads. +int script_cobratarget // set to 1 to create a target for this entity on pilotcobra missions +string script_targettype // "air" or "ground" - used for helicopter pilot levels +float script_targetoffset_z // offset from model where missiles should aim - used for helicopter pilot levels +int script_wingman + +string script_turningdir // set this to the direction of the anim set you want a vehicle to use. "right","hard_right","left","hard_left","forward" +int script_bombmode_original +int script_bombmode_single +int script_bombmode_dual +string script_label // used in audio, gametypes scripts +string script_tankgroup // used to add a tankgroup to vehicles. +float script_chance // chance that an exploder will explode, checked every 4 seconds or whatever script_delay is on the trigger. + +int script_forcespawn // Used to forcespawn (aka stalingradspawn) an AI. +int script_allowdeath // allow an AI to be killed during an animation +float script_death // set on a drone path point. Drone will die in this many seconds. Set to 0 on second to last script_struct in chain to ensure death. +float script_death_min // Drone will die between min-max seconds. +float script_death_max // Drone will die between min-max seconds. +int script_drones_min // Sets the minimum number of drones to spawn. +int script_drones_max // Sets the maximum number of drones to spawn. +int script_looping // Setting to "1" has same functionality as setting script_noteworthy/"looping". +int script_trace // If set to "1", drones will not spawn in unless the player is looking away from the spawn points. +int script_spawn_here // for camper_spawner +int script_special //general purpose KVP;Use as you wish; +string script_vehicleaianim // this will be a radiant drop down list that tells the ai on the vehicle which animations to play + +int script_health // for setting the health of windows in _interactive_objects +int script_startinghealth // sets a spawner or vehicle's health right when it's spawned in + +int script_stopnode // tells helicopters to stop at a node. +string script_turret_share // shares turret spots for portable mgs +string script_turret_ambush // shares turret spots for portable mgs +int script_dont_link_turret +int script_mg_angle // this gives option to start the machinegun at an angle +int script_deathchain + +string destructible_type // identifier for destructibles + +float script_dot // used on targetname trigger_lookat triggers to change the fov +int script_drone // setting to 1 makes the spawner a script drone + +string script_hint // put on trigger_hint + +int script_anglevehicle // checked in _vehicle, but doesn't seem of any use... + +string script_deathflag // when all the ai and spawners with the same string die (or their count depletes to zero), a flag with this string gets set + +int script_wheeldirection // 1 goes forward 0 goes backwards. + +int script_lights_on // set to 1 on vehicle or vehicle node to turn on lights +int script_sirens_on // set to 1 on vehicle or vehicle node to turn on sirens + +int script_fixednode // can force .fixednode on an AI +float fixednodesaferadius // the safe radius + +string spawner_id // using this for jeepride, guh, grunt, blarg! -nate +int script_vehicledetourgroup // use this for telling a detour node to only detour vehicles in matching groups +int script_vehicletriggergroup // a more generic grouping. I'm using this so that paths can be shared easier. setting this on a node with other vehicle trigger functions will only effect vehicles in the matching group. + +int script_growl // makes a dog growl as he runs, instead of barking +int script_index // can be used generically as an index for whatever reason + +int script_dontshootwhilemoving // sets .dontshootwhilemoving on actor. presumably keeps them from shooting while they're moving +int script_goalyaw // set to true to set the goal yaw +float script_physics // used for exploder_chunk to use physics throw + +int script_stealth_dontseek // dont set your goalpos to the enemy's goalpos on combat +int script_stealth // if defined, then this AI is put into stealth mode + +int script_force_count // set to true on spawner - flood spawner will not increment this spawners count if the player didnt see the guy die + +int script_ammo_clip // weapon placed in radiant - this many rounds in the clip - must be used with script_ammo_extra +int script_ammo_extra // weapon placed in radiant - this many rounds outside the clip - must be used with script_ammo_clip + +int script_godmode // makes a vehicle be god mode + +int script_bulletshield // used to apply toggleable bullet shields to vehicles that have them enabled. + +int script_deathflag_longdeath // set to on and script_deathflag guys will notify on death OR longpaindeath + +int script_char_index // overwrite the character index +int script_char_group // indicate this guy is a member of a group of same chars +string script_rumble // rumble file to play on an exploder + +float script_volumeramp // time to ramp in a vehicles engine noise. +int script_volume // set to 1 if you want to control the vehicle's volume in your script rather than have it lerp automatically +int script_onlyidle +float script_volumeup // on a vehicle node this makes the vehicle go to max volume over this much time +float script_volumedown // on a vehicle node this makes the vehicle go to no sound over this much time + +float script_duration +string script_soundalias // play this soundalias on exploders + +float script_savetrigger_timer // used to set minimum required times on autosave triggers in timed missions + +int script_disablereact // disables reaction behavior on this AI +int script_disablepain // disables pain when set +int script_disableturns // disables turn locomotion when set +int script_playerseek // if set then this AI will seek the player +int script_enable_cqbwalk // enables cqb if set +int script_disable_cqbwalk // disables cqb if set +float script_turnrate // override for the default turnrate (ai_turnrate dvar). Degrees per second (360 = one complete turn) + +int script_enable_heat // enables heat if set +int script_disable_heat // disables heat if set + +int script_sprint // enables/disables cqb or regular sprint if set +int script_walk // enables/disables cqb or regular walk if set + +// CoD5 Additions +//----------------------------------------------------------------- + +// Generic/Misc Keys: +//------------------- + +int script_int // Generic INT for anyone to use +float script_float // Generic FLOAT for anyone to use +vector script_vector // Generic VECTOR for anyone to use +string script_string // Generic STRING for anyone to use +string script_notify // Sends out the specified notify to the level when the trigger is triggered + +int script_color_auto_disable // Determines if a color trigger will not automatically be toggled off +int script_percent // Fallback uses this to determine the "percent" of AI that will fall back when the trigger is hit. + +// Feature Specific Keys: +//----------------------- + +// Spiderhole (ChrisP) +int script_spiderhole // set on a spawner to make it a spiderhole guy +int script_spiderhole_charge // set the chance to charge at the player ( 0 - 100) +string script_spiderhole_anim // set the animation used to emerge from the spiderhole + +// Planes (SRS 05/02/07) +int script_numbombs // used to give a plane an initial number of bombs. +int script_dropbombs // used for vehiclenodes, to tell a plane to drop X bombs +float script_dropbombs_delay // used to set a delay (secs) for the script_numbombs bomb dropping. +float script_dropbombs_delaytrace // used to delay the start of bomb ground traces for X secs (in case it has to pass thru a collidable surface). + +// SCRTIPER_MOD: JesseS (05/08/07) script_flak88 added +int script_vehicleattackgroup // used for attacking vehiclespawngroups. +float script_vehicleattackgroupwait // used for setting a delay before attacking a vehiclespawngroup with script_vehicleattackgroup. +int script_nonmovingvehicle // replaces script_flak88 to define nonmoving vehicles in order to prevent vehicle script errors + +// SRS (3/25/08): added key to allow specifying combat_getout anims on vehicle AI spawners +int script_combat_getout // used in _vehicle_aianim.gsc + +//Sumeet ( 05/30/08 ) : added key to allow specifying combat_idle anims on vehicle spawners +int script_combat_idle // used in _vehicle_aianim.gsc + +// MikeD (9/5/2007): Exposed functionality for spawners to respawn in _colors +int script_no_respawn // Disables the AI from being put on the _colors::replace_on_death thread. + +// MikeD (11/2/2007): Interactive Objects, pass self in for being the attacker +int script_selfisattacker + +// JamesS (1/3/2008): added destructibledef accessible by script +string destructibledef + +string script_dropweapon +int script_nodropweapon +int script_nodropsecondaryweapon +int script_nodropsidearm + +// MikeD (1/13/2008) +int script_banzai // Dynamic Bonzai Attack for AI. Set on the spawners. +int script_banzai_spawn // Bonzai Attack for AI once they spawn in. Set on the spawners. + +// SCRIPTER_MOD: JesseS (3/24/2008): Fog trigger support +int script_start_dist // The distance, in world units, at which the fog begins. +int script_halfway_dist // The distance at which the scene will be 50% fogged. +int script_halfway_height // The height at which the scene will be 50% fogged. +int script_base_height // The ground-level Z position at which the fog will start from. +vector script_color // The color components of the fog as a value between 0.0 and 1.0; also the first color of a dynamic light +float script_color_scale // The scale of the color components because the largest value for color is 1 +float script_transition_time // transition time in seconds +string script_vision // vision file name to transition to +float script_vision_time // vision file time to transition to +vector script_sun_color // The sun color +vector script_sun_direction // The sun direction +int script_sun_start_ang // The start angle for the sun +int script_sun_stop_ang // The stop angle of the sun +float script_max_fog_opacity // The maximum fog opacity + + +// MikeD (4/6/2008): Added some Light vars +float script_intensity_min +float script_intensity_max + +// MikeD (4/11/2008): Added MG42 "animated" object support +string script_animent // Specifies the targetname of the animated object when the MG42 fires +string script_animname // Specifies the animname of the animated object + +// JasonE (4/10/2008) +string twar_owner // team which owns this flag initially +string twar_owner_home // the home flag for the specified team, is this flag is taken by the opposing team the game is over +string twar_axis_dependants // semi-colon seperated list of flags required before capturing this flag (property of script/origin flag_descriptor object) +string twar_allies_dependants // semi-colon seperated list of flags required before capturing this flag (property of script/origin flag_descriptor object) + +// NathanM (6/24/2008) +float script_score // base score for an influencer in the new unified spawning system +string script_score_curve // shape of score falloff for an influencer in the new unified spawning system + +// MikeD (6/24/2008): Coop specific +int script_player_min // This is right now used for weapons that are placed in the world the number specified is the number of players required to keep this weapon in the world +int script_player_chance // This is used to determine the "percent" the player will be chosen as a target for Banzai attacks + +// Austin (6/29/08): Nazi Zombie Game Mode +string zombie_weapon_upgrade // weapon to be given to the player if they have the points to purchase it +int zombie_cost // the point cost to perform this action / purchase this weapon + +int start_exclude // set to 1 to exclude this magicbox from the set of random start positions + +// NathanM (10-JULY-2008) +string script_shape // shape of unified spawning system static influencer. can be "sphere" or "cylinder" + +// StefanS (07/10/2008) +string script_twar_flag // the associated twar flag's script name (flag1, flag2, etc.) + +// CCheng (7/16/2008) +int script_max_banzai_distance // the limit of how far banzai guys will look for a target +int script_banzai_attack_chance // the chance banzai chargers will go into the banzai melee rather than the regular melee + +// Jesse (8/12/08) +int script_count_lock // if set to anything, locks the count to whatever the scripter set in radiant (for preventing co-op scaling) + +// DSL (9/01/08) +int script_nochoke // if set to true on a flood spawner, that spawner will remain unchoked. +int script_choke // if set to true on a trigger spawner, that spawner will be choked. + +// Sumeet J ( 2/12/2010 ) +int script_norambo // if set to 1 on node then AI will not perform rambo behavior at this node. +int script_forcerambo // if set to 1 then AI will always do rambo from this cover node. + +// Sumeet J ( 6/3/2010 ) +int script_disable_idle_strafe // if set then disable exposed idlestrafing and aim awareness + +// CoD7 Additions +//----------------------------------------------------------------- + +//Sumeet J / Brian B - New Spawn Manager keys. +//----------------------------------------------------------------- +// Following values are defined as strings because they allow ranges + +string sm_active_count // Total bumber of AI that can be active from this spawner, defaults to number of spawners in the spawn manager. Supports min and max seperated by space. +string sm_group_size // The number of AI that can spawn from a spawner at once. Default = 1. Supports min and max seperated by space. +string sm_spawner_count // The number of spawners that spawn manager will randomly select from the full set of the available spawners, defaults to number of spawners in the spawn manager. Supports min and max seperated by space. +string sm_count // Total number of AI that can be spawned from this spawn manager. Default = infinity. Supports min and max seperated by space. + +string sm_kill // Used for killing the spawn manager, set on the trigger +int sm_die // Used for killing the spawn manager, set on the spawn manager and compared against the trigger sm_kill + +string script_spawner_targets // used by spawn manager for assigning spawner targets to spawners, independent of spawn manager +string script_next_spawn_manager // used by spawn manager, enables next spawn manager, when this spawn manager is killed + + +// Sumeet - Color manager system - in the works +//---------------------------------------------------------------- +string cm_flag // if set waits for the flag to advance the colors +int cm_dont_kill // if set then it would not kill the associated guys in ai group +int cm_kill_delay // if set then it will wait and then start killing the AI group +int cm_delete // if set then the color manager trigger will be deleted once done + + +//SMcCaul / JPark / Old Spawn Manager keys, these will be deleted once all maps use new spawn manager +//----------------------------------------------------------------- +float script_spawn_delay //script_float +int script_spawn_active_count +int script_spawn_active_count_min //script_int +int script_spawn_active_count_max //script_int +int script_spawn_group_size //script_cheap +int script_selected_spawner_count +int count_min +int count_max + +// Contextual Melee +string script_contextual_melee + +// Spec Ops - JamesS +int script_specialops + +int script_hero // if set, makes this AI a hero character ( calls make_hero ) function in the script. + +// AlexP 2/13/10 +string script_hidingdoor_action // indicates a specific action you want the AI to perform when the behavior kicks off +int script_hidingdoor_starts_open // if set to 1 on spawner, the door will start in the open state when the behavior kicks off +int script_hidingdoor_ends_closed // if set to 1 on spawner, the door will close when the behavior ends +string script_hidingdoor_model // override for default door or window model + +int drivepath // if specified on a vehicle it will try to drive the path and should look more natural without hand tweaking (helicopters and physics vehicles only) + +int script_dont_look // When set to 1, friendlies idling at this cover node won't look at the player. + +int script_forcegoal // Force an AI to ignore whatever else is going on and just get to the current goal position + +int script_rusher // make an AI a rusher when he spawns + +string script_forcegib // Set to cause forcegib on the AI. String is gib reference for gib parts + +string script_tag // generic tag specification. used for vehicle riders. \ No newline at end of file diff --git a/BO1/PC/ZM/ragdoll.cfg b/BO1/PC/ZM/ragdoll.cfg new file mode 100644 index 0000000..0567d09 --- /dev/null +++ b/BO1/PC/ZM/ragdoll.cfg @@ -0,0 +1,144 @@ +ragdoll_clear 0 +ragdoll_bone 0 j_mainroot j_neck 5.0 0.5 3.0 0.3 -1 0 capsule 1.0 +ragdoll_bone 0 j_neck j_head 3.5 0.5 0.3 0.3 0 0 capsule 1.0 +ragdoll_bone 0 j_shoulder_le j_elbow_le 2.5 0.5 0.6 0.3 0 0 capsule 1.0 +ragdoll_bone 0 j_elbow_le j_wrist_le 2.5 0.5 0.45 0.3 2 0 capsule 1.0 +ragdoll_bone 0 j_shoulder_ri j_elbow_ri 2.5 0.5 0.6 0.3 0 1 capsule 1.0 +ragdoll_bone 0 j_elbow_ri j_wrist_ri 2.5 0.5 0.45 0.3 4 1 capsule 1.0 +ragdoll_bone 0 j_hip_le j_knee_le 3.0 0.5 0.8 0.3 0 0 capsule 1.0 +ragdoll_bone 0 j_knee_le j_ankle_le 2.8 0.5 0.6 0.3 6 0 capsule 1.0 +ragdoll_bone 0 j_hip_ri j_knee_ri 3.0 0.5 0.8 0.3 0 1 capsule 1.0 +ragdoll_bone 0 j_knee_ri j_ankle_ri 2.8 0.5 0.6 0.3 8 1 capsule 1.0 +ragdoll_selfpair 0 0 3 +ragdoll_selfpair 0 0 5 +ragdoll_selfpair 0 0 7 +ragdoll_selfpair 0 0 9 +ragdoll_selfpair 0 3 7 +ragdoll_selfpair 0 3 9 +ragdoll_selfpair 0 5 7 +ragdoll_selfpair 0 5 9 +ragdoll_selfpair 0 3 6 +ragdoll_selfpair 0 3 8 +ragdoll_selfpair 0 5 6 +ragdoll_selfpair 0 5 8 +ragdoll_selfpair 0 1 3 +ragdoll_selfpair 0 1 5 +ragdoll_selfpair 0 3 5 +ragdoll_selfpair 0 7 9 +ragdoll_selfpair 0 8 6 +ragdoll_joint 0 1 swivel +ragdoll_joint 0 2 swivel +ragdoll_joint 0 3 hinge +ragdoll_joint 0 4 swivel +ragdoll_joint 0 5 hinge +ragdoll_joint 0 6 swivel +ragdoll_joint 0 7 hinge +ragdoll_joint 0 8 swivel +ragdoll_joint 0 9 hinge +ragdoll_limit 0 0 x 60.0 -50.0 50.0 +ragdoll_limit 0 0 y 60.0 -45.0 45.0 +ragdoll_limit 0 0 z 60.0 -20.0 30.0 +ragdoll_limit 0 1 x 80.0 -90.0 90.0 +ragdoll_limit 0 1 y 100.0 -45.0 20.0 +ragdoll_limit 0 1 z 100.0 0.0 95.0 +ragdoll_limit 0 3 x 80.0 -90.0 90.0 +ragdoll_limit 0 3 y 100.0 -45.0 20.0 +ragdoll_limit 0 3 z 100.0 0.0 95.0 +ragdoll_limit 0 2 z 60.0 -120.0 -5.0 +ragdoll_limit 0 4 z 60.0 -120.0 -5.0 +ragdoll_limit 0 5 x 80.0 -30.0 30.0 +ragdoll_limit 0 5 y 100.0 -25.0 25.0 +ragdoll_limit 0 5 z 200.0 0.0 50.0 +ragdoll_limit 0 7 x 80.0 -30.0 30.0 +ragdoll_limit 0 7 y 100.0 -25.0 25.0 +ragdoll_limit 0 7 z 200.0 0.0 50.0 +ragdoll_limit 0 6 z 100.0 -140.0 2.0 +ragdoll_limit 0 8 z 100.0 -140.0 2.0 +ragdoll_clear 1 +ragdoll_bone 1 j_mainroot j_spinelower 4.5 0.5 20.0 0.7 -1 0 capsule 1.1 +ragdoll_bone 1 j_spinelower j_spineupper 4.5 0.5 20.0 0.7 0 0 capsule 1.3 +ragdoll_bone 1 j_spineupper j_neck 4.5 0.5 20.0 0.7 1 0 capsule 1.05 +ragdoll_bone 1 j_neck j_head 3.6 0.5 5.0 0.9 2 0 capsule 0.75 +ragdoll_bone 1 j_shoulder_le j_elbow_le 2.8 0.5 8.0 0.7 2 0 capsule 1.01 +ragdoll_bone 1 j_elbow_le j_wrist_le 2.2 0.5 6.8 0.7 4 0 capsule 1.0 +ragdoll_bone 1 j_shoulder_ri j_elbow_ri 2.8 0.5 8.0 0.7 2 1 capsule 1.01 +ragdoll_bone 1 j_elbow_ri j_wrist_ri 2.2 0.5 6.8 0.7 6 1 capsule 1.0 +ragdoll_bone 1 j_hip_le j_knee_le 3.4 0.5 12.0 0.7 0 0 capsule .96 +ragdoll_bone 1 j_knee_le j_ankle_le 3.1 0.5 10.0 0.7 8 0 capsule 1.02 +ragdoll_bone 1 j_hip_ri j_knee_ri 3.4 0.5 12.0 0.7 0 1 capsule .97 +ragdoll_bone 1 j_knee_ri j_ankle_ri 3.1 0.5 10.0 0.7 10 1 capsule 1.02 +ragdoll_selfpair 1 0 4 +ragdoll_selfpair 1 1 4 +ragdoll_selfpair 1 2 4 +ragdoll_selfpair 1 8 4 +ragdoll_selfpair 1 9 4 +ragdoll_selfpair 1 11 4 +ragdoll_selfpair 1 0 5 +ragdoll_selfpair 1 1 5 +ragdoll_selfpair 1 2 5 +ragdoll_selfpair 1 3 5 +ragdoll_selfpair 1 7 5 +ragdoll_selfpair 1 8 5 +ragdoll_selfpair 1 9 5 +ragdoll_selfpair 1 10 5 +ragdoll_selfpair 1 11 5 +ragdoll_selfpair 1 0 6 +ragdoll_selfpair 1 1 6 +ragdoll_selfpair 1 2 6 +ragdoll_selfpair 1 8 6 +ragdoll_selfpair 1 9 6 +ragdoll_selfpair 1 10 6 +ragdoll_selfpair 1 0 7 +ragdoll_selfpair 1 1 7 +ragdoll_selfpair 1 2 7 +ragdoll_selfpair 1 3 7 +ragdoll_selfpair 1 8 7 +ragdoll_selfpair 1 9 7 +ragdoll_selfpair 1 10 7 +ragdoll_selfpair 1 11 7 +ragdoll_selfpair 1 10 8 +ragdoll_selfpair 1 11 8 +ragdoll_selfpair 1 10 9 +ragdoll_selfpair 1 11 9 +ragdoll_joint 1 1 hinge +ragdoll_joint 1 2 hinge +ragdoll_joint 1 3 swivel +ragdoll_joint 1 4 swivel +ragdoll_joint 1 5 hinge +ragdoll_joint 1 6 swivel +ragdoll_joint 1 7 hinge +ragdoll_joint 1 8 swivel +ragdoll_joint 1 9 hinge +ragdoll_joint 1 10 swivel +ragdoll_joint 1 11 hinge +ragdoll_limit 1 0 z 100.0 -6.0 6.0 +ragdoll_limit 1 1 z 100.0 -6.0 6.0 +ragdoll_limit 1 2 x 50.0 -30.0 30.0 +ragdoll_limit 1 2 y 50.0 -30.0 30.0 +ragdoll_limit 1 2 z 50.0 -10.0 30.0 +ragdoll_limit 1 3 x 95.0 -104.0 100.0 +ragdoll_limit 1 3 y 95.0 -90.0 35.0 +ragdoll_limit 1 3 z 95.0 -110.0 16.0 +ragdoll_limit 1 5 x 95.0 -100.0 104.0 +ragdoll_limit 1 5 y 95.0 -35.0 90.0 +ragdoll_limit 1 5 z 95.0 -110.0 16.0 +ragdoll_limit 1 4 z 60.0 -100.0 2.0 +ragdoll_limit 1 6 z 60.0 -100.0 2.0 +ragdoll_limit 1 7 x 90.0 -45.0 45.0 +ragdoll_limit 1 7 y 100.0 -30.0 30.0 +ragdoll_limit 1 7 z 120.0 -4.0 100.0 +ragdoll_limit 1 9 x 90.0 -45.0 45.0 +ragdoll_limit 1 9 y 100.0 -30.0 30.0 +ragdoll_limit 1 9 z 120.0 -4.0 100.0 +ragdoll_limit 1 8 z 110.0 -120.0 3.5 +ragdoll_limit 1 10 z 110.0 -120.0 3.5 +ragdoll_baselerp_bone 1 j_head 2000 +ragdoll_baselerp_bone 1 j_wrist_le 1000 +ragdoll_baselerp_bone 1 j_wrist_ri 1000 +ragdoll_baselerp_bone 1 j_ankle_le 1000 +ragdoll_baselerp_bone 1 j_ankle_ri 1000 + + + + + diff --git a/BO1/PC/ZM/reenumeratecontent.cfg b/BO1/PC/ZM/reenumeratecontent.cfg new file mode 100644 index 0000000..139597f --- /dev/null +++ b/BO1/PC/ZM/reenumeratecontent.cfg @@ -0,0 +1,2 @@ + + diff --git a/BO1/PC/ZM/reset_bindings_sp.cfg b/BO1/PC/ZM/reset_bindings_sp.cfg new file mode 100644 index 0000000..e86598e --- /dev/null +++ b/BO1/PC/ZM/reset_bindings_sp.cfg @@ -0,0 +1,14 @@ +unbindall +unbind BUTTON_BACK +unbind BUTTON_START +bind BUTTON_START "pause" +bind BUTTON_BACK "devgui" +unbind APAD_UP +unbind APAD_DOWN +unbind APAD_LEFT +unbind APAD_RIGHT +unbind2 APAD_UP +unbind2 APAD_DOWN +unbind2 APAD_LEFT +unbind2 APAD_RIGHT +execcontrollerbindings diff --git a/BO1/PC/ZM/rumble/artillery_rumble b/BO1/PC/ZM/rumble/artillery_rumble new file mode 100644 index 0000000..0d4a4af --- /dev/null +++ b/BO1/PC/ZM/rumble/artillery_rumble @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\artillery_rumble_l.rmb\highRumbleFile\artillery_rumble_h.rmb\duration\1\range\800\fadeWithDistance\0\broadcast\1 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/artillery_rumble_h.rmb b/BO1/PC/ZM/rumble/artillery_rumble_h.rmb new file mode 100644 index 0000000..d6f4675 --- /dev/null +++ b/BO1/PC/ZM/rumble/artillery_rumble_h.rmb @@ -0,0 +1,6 @@ +RUMBLEGRAPHFILE + +3 +0.0000 0.7400 +0.1050 0.5400 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/artillery_rumble_l.rmb b/BO1/PC/ZM/rumble/artillery_rumble_l.rmb new file mode 100644 index 0000000..0e834de --- /dev/null +++ b/BO1/PC/ZM/rumble/artillery_rumble_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.1250 1.0000 +0.4300 0.4800 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/assault_fire b/BO1/PC/ZM/rumble/assault_fire new file mode 100644 index 0000000..a105605 --- /dev/null +++ b/BO1/PC/ZM/rumble/assault_fire @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\assault_fire_l.rmb\highRumbleFile\assault_fire_h.rmb\duration\0.5\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/assault_fire_h.rmb b/BO1/PC/ZM/rumble/assault_fire_h.rmb new file mode 100644 index 0000000..86a8bc0 --- /dev/null +++ b/BO1/PC/ZM/rumble/assault_fire_h.rmb @@ -0,0 +1,10 @@ +RUMBLEGRAPHFILE + +7 +0.0000 0.5259 +0.1303 0.4762 +0.2821 0.3148 +0.4742 0.1540 +0.6613 0.0590 +0.8340 0.0150 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/assault_fire_l.rmb b/BO1/PC/ZM/rumble/assault_fire_l.rmb new file mode 100644 index 0000000..c362b60 --- /dev/null +++ b/BO1/PC/ZM/rumble/assault_fire_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.3991 1.0000 +0.4041 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/barrel_explosion b/BO1/PC/ZM/rumble/barrel_explosion new file mode 100644 index 0000000..333738a --- /dev/null +++ b/BO1/PC/ZM/rumble/barrel_explosion @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\barrel_explosion_l.rmb\highRumbleFile\barrel_explosion_h.rmb\duration\0.3\range\256\fadeWithDistance\0\broadcast\1 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/barrel_explosion_h.rmb b/BO1/PC/ZM/rumble/barrel_explosion_h.rmb new file mode 100644 index 0000000..b183e3e --- /dev/null +++ b/BO1/PC/ZM/rumble/barrel_explosion_h.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.2076 0.8350 +0.6354 0.1906 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/barrel_explosion_l.rmb b/BO1/PC/ZM/rumble/barrel_explosion_l.rmb new file mode 100644 index 0000000..8b68c2a --- /dev/null +++ b/BO1/PC/ZM/rumble/barrel_explosion_l.rmb @@ -0,0 +1,8 @@ +RUMBLEGRAPHFILE + +5 +0.0000 0.5210 +0.1375 0.3460 +0.3784 0.1084 +0.7289 0.0598 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/damage_heavy b/BO1/PC/ZM/rumble/damage_heavy new file mode 100644 index 0000000..df4f6a9 --- /dev/null +++ b/BO1/PC/ZM/rumble/damage_heavy @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\damage_heavy_l.rmb\highRumbleFile\damage_heavy_h.rmb\duration\0.3\range\1\fadeWithDistance\0\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/damage_heavy_h.rmb b/BO1/PC/ZM/rumble/damage_heavy_h.rmb new file mode 100644 index 0000000..7d6c768 --- /dev/null +++ b/BO1/PC/ZM/rumble/damage_heavy_h.rmb @@ -0,0 +1,6 @@ +RUMBLEGRAPHFILE + +3 +0.0000 0.5000 +0.1050 0.3000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/damage_heavy_l.rmb b/BO1/PC/ZM/rumble/damage_heavy_l.rmb new file mode 100644 index 0000000..0cf655e --- /dev/null +++ b/BO1/PC/ZM/rumble/damage_heavy_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.1250 1.0000 +0.4300 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/damage_light b/BO1/PC/ZM/rumble/damage_light new file mode 100644 index 0000000..f55350e --- /dev/null +++ b/BO1/PC/ZM/rumble/damage_light @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\damage_light_l.rmb\highRumbleFile\damage_light_h.rmb\duration\0.3\range\1\fadeWithDistance\0\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/damage_light_h.rmb b/BO1/PC/ZM/rumble/damage_light_h.rmb new file mode 100644 index 0000000..7d6c768 --- /dev/null +++ b/BO1/PC/ZM/rumble/damage_light_h.rmb @@ -0,0 +1,6 @@ +RUMBLEGRAPHFILE + +3 +0.0000 0.5000 +0.1050 0.3000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/damage_light_l.rmb b/BO1/PC/ZM/rumble/damage_light_l.rmb new file mode 100644 index 0000000..0cf655e --- /dev/null +++ b/BO1/PC/ZM/rumble/damage_light_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.1250 1.0000 +0.4300 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/defaultweapon_fire b/BO1/PC/ZM/rumble/defaultweapon_fire new file mode 100644 index 0000000..e168877 --- /dev/null +++ b/BO1/PC/ZM/rumble/defaultweapon_fire @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\defaultweapon_fire_l.rmb\highRumbleFile\defaultweapon_fire_h.rmb\duration\0.5\range\1\fadeWithDistance\0\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/defaultweapon_fire_h.rmb b/BO1/PC/ZM/rumble/defaultweapon_fire_h.rmb new file mode 100644 index 0000000..1cac346 --- /dev/null +++ b/BO1/PC/ZM/rumble/defaultweapon_fire_h.rmb @@ -0,0 +1,10 @@ +RUMBLEGRAPHFILE + +7 +0.0000 0.4701 +0.1342 0.3639 +0.2868 0.2627 +0.4736 0.1698 +0.6719 0.0826 +0.8317 0.0307 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/defaultweapon_fire_l.rmb b/BO1/PC/ZM/rumble/defaultweapon_fire_l.rmb new file mode 100644 index 0000000..fe8782a --- /dev/null +++ b/BO1/PC/ZM/rumble/defaultweapon_fire_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.1866 1.0000 +0.2241 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/defaultweapon_melee b/BO1/PC/ZM/rumble/defaultweapon_melee new file mode 100644 index 0000000..fc950a9 --- /dev/null +++ b/BO1/PC/ZM/rumble/defaultweapon_melee @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\defaultweapon_melee_l.rmb\highRumbleFile\defaultweapon_melee_h.rmb\duration\0.5\range\1\fadeWithDistance\0\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/defaultweapon_melee_h.rmb b/BO1/PC/ZM/rumble/defaultweapon_melee_h.rmb new file mode 100644 index 0000000..a7d0265 --- /dev/null +++ b/BO1/PC/ZM/rumble/defaultweapon_melee_h.rmb @@ -0,0 +1,8 @@ +RUMBLEGRAPHFILE + +5 +0.0000 1.0000 +0.0571 1.0000 +0.1701 0.3556 +0.3075 0.0000 +1.0000 0.0001 diff --git a/BO1/PC/ZM/rumble/defaultweapon_melee_l.rmb b/BO1/PC/ZM/rumble/defaultweapon_melee_l.rmb new file mode 100644 index 0000000..3cda1af --- /dev/null +++ b/BO1/PC/ZM/rumble/defaultweapon_melee_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.0746 1.0000 +0.1603 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/dtp_rumble b/BO1/PC/ZM/rumble/dtp_rumble new file mode 100644 index 0000000..46415f3 --- /dev/null +++ b/BO1/PC/ZM/rumble/dtp_rumble @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\artillery_rumble_l.rmb\highRumbleFile\artillery_rumble_h.rmb\duration\1\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/explosion_generic b/BO1/PC/ZM/rumble/explosion_generic new file mode 100644 index 0000000..0f4d547 --- /dev/null +++ b/BO1/PC/ZM/rumble/explosion_generic @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\explosion_generic_l.rmb\highRumbleFile\explosion_generic_h.rmb\duration\1\range\1000\fadeWithDistance\1\broadcast\1 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/explosion_generic_h.rmb b/BO1/PC/ZM/rumble/explosion_generic_h.rmb new file mode 100644 index 0000000..d80c902 --- /dev/null +++ b/BO1/PC/ZM/rumble/explosion_generic_h.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.2027 0.6656 +0.5587 0.1719 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/explosion_generic_l.rmb b/BO1/PC/ZM/rumble/explosion_generic_l.rmb new file mode 100644 index 0000000..8bd66f1 --- /dev/null +++ b/BO1/PC/ZM/rumble/explosion_generic_l.rmb @@ -0,0 +1,8 @@ +RUMBLEGRAPHFILE + +5 +0.0000 1.0000 +0.1371 0.8922 +0.3784 0.2862 +0.7289 0.0598 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/flamethrower b/BO1/PC/ZM/rumble/flamethrower new file mode 100644 index 0000000..9a07e8f --- /dev/null +++ b/BO1/PC/ZM/rumble/flamethrower @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\flamethrower_l.rmb\highRumbleFile\flamethrower_h.rmb\duration\0.5\range\750\fadeWithDistance\0\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/flamethrower_h.rmb b/BO1/PC/ZM/rumble/flamethrower_h.rmb new file mode 100644 index 0000000..5ab3bde --- /dev/null +++ b/BO1/PC/ZM/rumble/flamethrower_h.rmb @@ -0,0 +1,5 @@ +RUMBLEGRAPHFILE + +2 +0.0000 0.2399 +1.0000 0.2397 diff --git a/BO1/PC/ZM/rumble/flamethrower_l.rmb b/BO1/PC/ZM/rumble/flamethrower_l.rmb new file mode 100644 index 0000000..14836ae --- /dev/null +++ b/BO1/PC/ZM/rumble/flamethrower_l.rmb @@ -0,0 +1,5 @@ +RUMBLEGRAPHFILE + +2 +0.0000 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/grenade_rumble b/BO1/PC/ZM/rumble/grenade_rumble new file mode 100644 index 0000000..6fcf8d8 --- /dev/null +++ b/BO1/PC/ZM/rumble/grenade_rumble @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\grenade_rumble_l.rmb\highRumbleFile\grenade_rumble_h.rmb\duration\1\range\400\fadeWithDistance\0\broadcast\1 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/grenade_rumble_h.rmb b/BO1/PC/ZM/rumble/grenade_rumble_h.rmb new file mode 100644 index 0000000..7d6c768 --- /dev/null +++ b/BO1/PC/ZM/rumble/grenade_rumble_h.rmb @@ -0,0 +1,6 @@ +RUMBLEGRAPHFILE + +3 +0.0000 0.5000 +0.1050 0.3000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/grenade_rumble_l.rmb b/BO1/PC/ZM/rumble/grenade_rumble_l.rmb new file mode 100644 index 0000000..0cf655e --- /dev/null +++ b/BO1/PC/ZM/rumble/grenade_rumble_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.1250 1.0000 +0.4300 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/heavygun_fire b/BO1/PC/ZM/rumble/heavygun_fire new file mode 100644 index 0000000..aa57053 --- /dev/null +++ b/BO1/PC/ZM/rumble/heavygun_fire @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\heavygun_fire_l.rmb\highRumbleFile\heavygun_fire_h.rmb\duration\0.5\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/heavygun_fire_h.rmb b/BO1/PC/ZM/rumble/heavygun_fire_h.rmb new file mode 100644 index 0000000..128ac56 --- /dev/null +++ b/BO1/PC/ZM/rumble/heavygun_fire_h.rmb @@ -0,0 +1,10 @@ +RUMBLEGRAPHFILE + +7 +0.0000 0.4109 +0.1192 0.3717 +0.2806 0.2431 +0.4579 0.1533 +0.6595 0.0449 +0.8328 0.0152 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/heavygun_fire_l.rmb b/BO1/PC/ZM/rumble/heavygun_fire_l.rmb new file mode 100644 index 0000000..2afbfdc --- /dev/null +++ b/BO1/PC/ZM/rumble/heavygun_fire_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.3200 1.0000 +0.3250 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/melee_garrote b/BO1/PC/ZM/rumble/melee_garrote new file mode 100644 index 0000000..338dedd --- /dev/null +++ b/BO1/PC/ZM/rumble/melee_garrote @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\melee_garrote_l.rmb\highRumbleFile\melee_garrote_h.rmb\duration\6\range\1\fadeWithDistance\0\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/melee_garrote_h.rmb b/BO1/PC/ZM/rumble/melee_garrote_h.rmb new file mode 100644 index 0000000..1ed43d7 --- /dev/null +++ b/BO1/PC/ZM/rumble/melee_garrote_h.rmb @@ -0,0 +1,17 @@ +RUMBLEGRAPHFILE + +14 +0.0000 0.0000 +0.1645 1.0000 +0.1695 0.0000 +0.2995 1.0000 +0.3045 0.0000 +0.3963 0.7040 +0.4368 0.0000 +0.5133 0.4910 +0.5603 0.0000 +0.6013 0.2650 +0.6408 0.0000 +0.6951 0.1640 +0.7371 0.0000 +1.0000 0.0000 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/melee_garrote_l.rmb b/BO1/PC/ZM/rumble/melee_garrote_l.rmb new file mode 100644 index 0000000..cfdde37 --- /dev/null +++ b/BO1/PC/ZM/rumble/melee_garrote_l.rmb @@ -0,0 +1,8 @@ +RUMBLEGRAPHFILE + +5 +0.0000 0.1650 +0.1931 0.8780 +0.3348 0.5470 +0.6663 0.1050 +1.0000 0.0000 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/pistol_fire b/BO1/PC/ZM/rumble/pistol_fire new file mode 100644 index 0000000..54438ff --- /dev/null +++ b/BO1/PC/ZM/rumble/pistol_fire @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\pistol_fire_l.rmb\highRumbleFile\pistol_fire_h.rmb\duration\0.5\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/pistol_fire_h.rmb b/BO1/PC/ZM/rumble/pistol_fire_h.rmb new file mode 100644 index 0000000..a47bad0 --- /dev/null +++ b/BO1/PC/ZM/rumble/pistol_fire_h.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 0.1711 +0.2317 0.0917 +0.6083 0.0215 +1.0000 0.0018 diff --git a/BO1/PC/ZM/rumble/pistol_fire_l.rmb b/BO1/PC/ZM/rumble/pistol_fire_l.rmb new file mode 100644 index 0000000..d9bc17d --- /dev/null +++ b/BO1/PC/ZM/rumble/pistol_fire_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 0.6395 +0.4607 0.6125 +0.4801 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/pullout_small b/BO1/PC/ZM/rumble/pullout_small new file mode 100644 index 0000000..2239f20 --- /dev/null +++ b/BO1/PC/ZM/rumble/pullout_small @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\reload_small_l.rmb\highRumbleFile\reload_small_h.rmb\duration\0.25\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/reload_clipin b/BO1/PC/ZM/rumble/reload_clipin new file mode 100644 index 0000000..a5d7a5a --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_clipin @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\reload_small_l.rmb\highRumbleFile\reload_small_h.rmb\duration\0.3\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/reload_clipout b/BO1/PC/ZM/rumble/reload_clipout new file mode 100644 index 0000000..a5d7a5a --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_clipout @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\reload_small_l.rmb\highRumbleFile\reload_small_h.rmb\duration\0.3\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/reload_large b/BO1/PC/ZM/rumble/reload_large new file mode 100644 index 0000000..7481970 --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_large @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\reload_large_l.rmb\highRumbleFile\reload_large_h.rmb\duration\0.3\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/reload_large_h.rmb b/BO1/PC/ZM/rumble/reload_large_h.rmb new file mode 100644 index 0000000..7d6c768 --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_large_h.rmb @@ -0,0 +1,6 @@ +RUMBLEGRAPHFILE + +3 +0.0000 0.5000 +0.1050 0.3000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/reload_large_l.rmb b/BO1/PC/ZM/rumble/reload_large_l.rmb new file mode 100644 index 0000000..0cf655e --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_large_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.1250 1.0000 +0.4300 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/reload_medium b/BO1/PC/ZM/rumble/reload_medium new file mode 100644 index 0000000..479fc8d --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_medium @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\reload_medium_l.rmb\highRumbleFile\reload_medium_h.rmb\duration\0.3\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/reload_medium_h.rmb b/BO1/PC/ZM/rumble/reload_medium_h.rmb new file mode 100644 index 0000000..7d6c768 --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_medium_h.rmb @@ -0,0 +1,6 @@ +RUMBLEGRAPHFILE + +3 +0.0000 0.5000 +0.1050 0.3000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/reload_medium_l.rmb b/BO1/PC/ZM/rumble/reload_medium_l.rmb new file mode 100644 index 0000000..0cf655e --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_medium_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.1250 1.0000 +0.4300 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/reload_rechamber b/BO1/PC/ZM/rumble/reload_rechamber new file mode 100644 index 0000000..a5d7a5a --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_rechamber @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\reload_small_l.rmb\highRumbleFile\reload_small_h.rmb\duration\0.3\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/reload_small b/BO1/PC/ZM/rumble/reload_small new file mode 100644 index 0000000..a5d7a5a --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_small @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\reload_small_l.rmb\highRumbleFile\reload_small_h.rmb\duration\0.3\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/reload_small_h.rmb b/BO1/PC/ZM/rumble/reload_small_h.rmb new file mode 100644 index 0000000..970255e --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_small_h.rmb @@ -0,0 +1,6 @@ +RUMBLEGRAPHFILE + +3 +0.0000 0.3675 +0.2782 0.2040 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/reload_small_l.rmb b/BO1/PC/ZM/rumble/reload_small_l.rmb new file mode 100644 index 0000000..7c745ff --- /dev/null +++ b/BO1/PC/ZM/rumble/reload_small_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 0.2800 +0.1250 0.4000 +0.4300 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/shotgun_fire b/BO1/PC/ZM/rumble/shotgun_fire new file mode 100644 index 0000000..70b1e35 --- /dev/null +++ b/BO1/PC/ZM/rumble/shotgun_fire @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\shotgun_fire_l.rmb\highRumbleFile\shotgun_fire_h.rmb\duration\0.5\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/shotgun_fire_h.rmb b/BO1/PC/ZM/rumble/shotgun_fire_h.rmb new file mode 100644 index 0000000..13866ac --- /dev/null +++ b/BO1/PC/ZM/rumble/shotgun_fire_h.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 0.1641 +0.2265 0.1314 +0.6077 0.0270 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/shotgun_fire_l.rmb b/BO1/PC/ZM/rumble/shotgun_fire_l.rmb new file mode 100644 index 0000000..3e30032 --- /dev/null +++ b/BO1/PC/ZM/rumble/shotgun_fire_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.3851 1.0000 +0.5701 0.1200 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/slide_rumble b/BO1/PC/ZM/rumble/slide_rumble new file mode 100644 index 0000000..84196a2 --- /dev/null +++ b/BO1/PC/ZM/rumble/slide_rumble @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\artillery_rumble_l.rmb\highRumbleFile\artillery_rumble_l.rmb\duration\100\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/smg_fire b/BO1/PC/ZM/rumble/smg_fire new file mode 100644 index 0000000..dbdce4a --- /dev/null +++ b/BO1/PC/ZM/rumble/smg_fire @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\smg_fire_l.rmb\highRumbleFile\smg_fire_h.rmb\duration\0.5\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/smg_fire_h.rmb b/BO1/PC/ZM/rumble/smg_fire_h.rmb new file mode 100644 index 0000000..5c166b9 --- /dev/null +++ b/BO1/PC/ZM/rumble/smg_fire_h.rmb @@ -0,0 +1,8 @@ +RUMBLEGRAPHFILE + +5 +0.0000 0.4800 +0.2300 0.3600 +0.5460 0.0999 +0.8061 0.0064 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/smg_fire_l.rmb b/BO1/PC/ZM/rumble/smg_fire_l.rmb new file mode 100644 index 0000000..f5d7104 --- /dev/null +++ b/BO1/PC/ZM/rumble/smg_fire_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 0.4830 +0.1365 0.4703 +0.1447 0.0000 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/smg_fire_light b/BO1/PC/ZM/rumble/smg_fire_light new file mode 100644 index 0000000..2441162 --- /dev/null +++ b/BO1/PC/ZM/rumble/smg_fire_light @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\smg_fire_light_l.rmb\highRumbleFile\smg_fire_light_h.rmb\duration\0.2\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/smg_fire_light_h.rmb b/BO1/PC/ZM/rumble/smg_fire_light_h.rmb new file mode 100644 index 0000000..ee0f582 --- /dev/null +++ b/BO1/PC/ZM/rumble/smg_fire_light_h.rmb @@ -0,0 +1,8 @@ +RUMBLEGRAPHFILE + +5 +0.0000 0.1558 +0.2131 0.1415 +0.5460 0.0999 +0.8061 0.0064 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/smg_fire_light_l.rmb b/BO1/PC/ZM/rumble/smg_fire_light_l.rmb new file mode 100644 index 0000000..cbf78b0 --- /dev/null +++ b/BO1/PC/ZM/rumble/smg_fire_light_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 0.1110 +0.1365 0.1108 +0.1415 0.0001 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/sniper_fire b/BO1/PC/ZM/rumble/sniper_fire new file mode 100644 index 0000000..70b1e35 --- /dev/null +++ b/BO1/PC/ZM/rumble/sniper_fire @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\shotgun_fire_l.rmb\highRumbleFile\shotgun_fire_h.rmb\duration\0.5\range\1\fadeWithDistance\1\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/tank_fire b/BO1/PC/ZM/rumble/tank_fire new file mode 100644 index 0000000..c209e4e --- /dev/null +++ b/BO1/PC/ZM/rumble/tank_fire @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\tank_fire_sp_l.rmb\highRumbleFile\tank_fire_sp_h.rmb\duration\0.3\range\500\fadeWithDistance\1\broadcast\1 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/tank_fire_sp_h.rmb b/BO1/PC/ZM/rumble/tank_fire_sp_h.rmb new file mode 100644 index 0000000..6d6649e --- /dev/null +++ b/BO1/PC/ZM/rumble/tank_fire_sp_h.rmb @@ -0,0 +1,10 @@ +RUMBLEGRAPHFILE + +7 +0.0000 0.7060 +0.1329 0.5108 +0.2909 0.3658 +0.4720 0.2646 +0.6727 0.1771 +0.8331 0.0928 +1.0000 0.0416 diff --git a/BO1/PC/ZM/rumble/tank_fire_sp_l.rmb b/BO1/PC/ZM/rumble/tank_fire_sp_l.rmb new file mode 100644 index 0000000..8614784 --- /dev/null +++ b/BO1/PC/ZM/rumble/tank_fire_sp_l.rmb @@ -0,0 +1,7 @@ +RUMBLEGRAPHFILE + +4 +0.0000 1.0000 +0.3223 1.0000 +0.4639 0.0002 +1.0000 0.0000 diff --git a/BO1/PC/ZM/rumble/tank_rumble b/BO1/PC/ZM/rumble/tank_rumble new file mode 100644 index 0000000..89756b9 --- /dev/null +++ b/BO1/PC/ZM/rumble/tank_rumble @@ -0,0 +1 @@ +RUMBLE\lowRumbleFile\tank_rumble_l.rmb\highRumbleFile\tank_rumble_h.rmb\duration\1\range\750\fadeWithDistance\0\broadcast\0 \ No newline at end of file diff --git a/BO1/PC/ZM/rumble/tank_rumble_h.rmb b/BO1/PC/ZM/rumble/tank_rumble_h.rmb new file mode 100644 index 0000000..8e95f84 --- /dev/null +++ b/BO1/PC/ZM/rumble/tank_rumble_h.rmb @@ -0,0 +1,5 @@ +RUMBLEGRAPHFILE + +2 +0.0000 0.1208 +1.0000 0.1246 diff --git a/BO1/PC/ZM/rumble/tank_rumble_l.rmb b/BO1/PC/ZM/rumble/tank_rumble_l.rmb new file mode 100644 index 0000000..157b849 --- /dev/null +++ b/BO1/PC/ZM/rumble/tank_rumble_l.rmb @@ -0,0 +1,5 @@ +RUMBLEGRAPHFILE + +2 +0.0000 0.1095 +1.0000 0.1032 diff --git a/BO1/PC/ZM/savedata/icon0.png b/BO1/PC/ZM/savedata/icon0.png new file mode 100644 index 0000000..dd4f84b Binary files /dev/null and b/BO1/PC/ZM/savedata/icon0.png differ diff --git a/BO1/PC/ZM/shock/chaplincheat.shock b/BO1/PC/ZM/shock/chaplincheat.shock new file mode 100644 index 0000000..491ba90 --- /dev/null +++ b/BO1/PC/ZM/shock/chaplincheat.shock @@ -0,0 +1,37 @@ +bg_shock_screenType "none" +bg_shock_screenBlurBlendTime "0.001" +bg_shock_screenBlurBlendFadeTime "0.001" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod "0.75" +bg_shock_viewKickRadius "0" +bg_shock_viewKickFadeTime "0.001" + +bg_shock_sound "1" +bg_shock_soundLoop "null" +bg_shock_soundLoopSilent "null" +bg_shock_soundEnd "null" +bg_shock_soundEndAbort "null" +bg_shock_soundFadeInTime "0" +bg_shock_soundFadeOutTime "0" +bg_shock_soundLoopFadeTime "1" +bg_shock_soundLoopEndDelay "-0.5" +bg_shock_soundRoomType "generic" +bg_shock_soundDryLevel "1.0" +bg_shock_soundWetLevel "0.50" +bg_shock_soundModEndDelay "-.25" +bg_shock_soundSnapshot "default" + +bg_shock_lookControl "0" +bg_shock_lookControl_maxpitchspeed "0" +bg_shock_lookControl_maxyawspeed "0" +bg_shock_lookControl_mousesensitivityscale "0" +bg_shock_lookControl_fadeTime "0.001" + +bg_shock_movement "1.0" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/death.shock b/BO1/PC/ZM/shock/death.shock new file mode 100644 index 0000000..319719a --- /dev/null +++ b/BO1/PC/ZM/shock/death.shock @@ -0,0 +1,38 @@ +bg_shock_screenType "blurred" +bg_shock_screenBlurBlendTime "0.4" +bg_shock_screenBlurBlendFadeTime "1" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod ".75" +bg_shock_viewKickRadius ".05" +bg_shock_viewKickFadeTime "0.5" + +bg_shock_sound "1" +bg_shock_soundLoop "" +bg_shock_soundLoopSilent "" +bg_shock_soundEnd "" +bg_shock_soundEndAbort "" +bg_shock_soundFadeInTime "0.5" +bg_shock_soundFadeOutTime "0.25" +bg_shock_soundLoopFadeTime "0.1" +bg_shock_soundLoopEndDelay "0.1" +bg_shock_soundRoomType "shock_death" +bg_shock_soundDryLevel "0.5" +bg_shock_soundWetLevel "1.0" +bg_shock_soundModEndDelay "-.75" +bg_shock_soundSnapshot "default" + + +bg_shock_lookControl "1" +bg_shock_lookControl_maxpitchspeed "45" +bg_shock_lookControl_maxyawspeed "45" +bg_shock_lookControl_mousesensitivityscale "0.5" +bg_shock_lookControl_fadeTime "2" + +bg_shock_movement "0.4" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/default.shock b/BO1/PC/ZM/shock/default.shock new file mode 100644 index 0000000..60c6d98 --- /dev/null +++ b/BO1/PC/ZM/shock/default.shock @@ -0,0 +1,38 @@ +bg_shock_screenType "blurred" +bg_shock_screenBlurBlendTime "0.4" +bg_shock_screenBlurBlendFadeTime "1" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod ".75" +bg_shock_viewKickRadius ".05" +bg_shock_viewKickFadeTime "3" + +bg_shock_sound "0" +bg_shock_soundLoop "shellshock_loop" +bg_shock_soundLoopSilent "shellshock_loop_silent" +bg_shock_soundEnd "shellshock_end" +bg_shock_soundEndAbort "shellshock_end_abort" +bg_shock_soundFadeInTime ".25" +bg_shock_soundFadeOutTime "2.5" +bg_shock_soundLoopFadeTime "2" +bg_shock_soundLoopEndDelay "-1.5" +bg_shock_soundRoomType "underwater" +bg_shock_soundDryLevel "1.0" +bg_shock_soundWetLevel "0.50" +bg_shock_soundModEndDelay "-.75" +bg_shock_soundSnapshot "default" + + +bg_shock_lookControl "1" +bg_shock_lookControl_maxpitchspeed "45" +bg_shock_lookControl_maxyawspeed "45" +bg_shock_lookControl_mousesensitivityscale "0.5" +bg_shock_lookControl_fadeTime "2" + +bg_shock_movement "0.4" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/dog_bite.shock b/BO1/PC/ZM/shock/dog_bite.shock new file mode 100644 index 0000000..f538eff --- /dev/null +++ b/BO1/PC/ZM/shock/dog_bite.shock @@ -0,0 +1,37 @@ +bg_shock_screenType "blurred" +bg_shock_screenBlurBlendTime "0.001" +bg_shock_screenBlurBlendFadeTime "0.001" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod "1.5" +bg_shock_viewKickRadius "0.5" +bg_shock_viewKickFadeTime ".5" + +bg_shock_sound "0" +bg_shock_soundLoop "shellshock_loop" +bg_shock_soundLoopSilent "shellshock_loop_silent" +bg_shock_soundEnd "shellshock_end" +bg_shock_soundEndAbort "shellshock_end_abort" +bg_shock_soundFadeInTime ".25" +bg_shock_soundFadeOutTime "2.5" +bg_shock_soundLoopFadeTime "2" +bg_shock_soundLoopEndDelay "-1.5" +bg_shock_soundRoomType "generic" +bg_shock_soundDryLevel "1.0" +bg_shock_soundWetLevel "0.50" +bg_shock_soundModEndDelay "-.75" +bg_shock_soundSnapshot "default" + +bg_shock_lookControl "0" +bg_shock_lookControl_maxpitchspeed "45" +bg_shock_lookControl_maxyawspeed "45" +bg_shock_lookControl_mousesensitivityscale "0.2" +bg_shock_lookControl_fadeTime "1" + +bg_shock_movement "0.4" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/electrocution.shock b/BO1/PC/ZM/shock/electrocution.shock new file mode 100644 index 0000000..4abc6ba --- /dev/null +++ b/BO1/PC/ZM/shock/electrocution.shock @@ -0,0 +1,37 @@ +bg_shock_screenType "blurred" +bg_shock_screenBlurBlendTime "0.4" +bg_shock_screenBlurBlendFadeTime "1" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod ".75" +bg_shock_viewKickRadius ".05" +bg_shock_viewKickFadeTime "3" + +bg_shock_sound "1" +bg_shock_soundLoop "shellshock_loop" +bg_shock_soundLoopSilent "shellshock_loop_silent" +bg_shock_soundEnd "shellshock_end" +bg_shock_soundEndAbort "shellshock_end_abort" +bg_shock_soundFadeInTime ".25" +bg_shock_soundFadeOutTime "2.5" +bg_shock_soundLoopFadeTime "2" +bg_shock_soundLoopEndDelay "-1.5" +bg_shock_soundRoomType "frontend_elec" +bg_shock_soundDryLevel "1.0" +bg_shock_soundWetLevel "0.50" +bg_shock_soundModEndDelay "-.75" +bg_shock_soundSnapshot "default" + +bg_shock_lookControl "1" +bg_shock_lookControl_maxpitchspeed "90" +bg_shock_lookControl_maxyawspeed "90" +bg_shock_lookControl_mousesensitivityscale "0.5" +bg_shock_lookControl_fadeTime "2" + +bg_shock_movement "0.4" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/explosion.shock b/BO1/PC/ZM/shock/explosion.shock new file mode 100644 index 0000000..c37c3a4 --- /dev/null +++ b/BO1/PC/ZM/shock/explosion.shock @@ -0,0 +1,39 @@ +bg_shock_screenType "blurred" +bg_shock_screenBlurBlendTime "1" +bg_shock_screenBlurBlendFadeTime "0.5" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod ".75" +bg_shock_viewKickRadius ".05" +bg_shock_viewKickFadeTime "3" + +bg_shock_sound "1" +bg_shock_soundLoop "chr_tinitus_loop" +bg_shock_soundLoopSilent "" +bg_shock_soundEnd "" +bg_shock_soundEndAbort "" +bg_shock_soundFadeInTime "0.1" +bg_shock_soundFadeOutTime "2" +bg_shock_soundLoopFadeTime "0.1" +bg_shock_soundLoopEndDelay "2" +bg_shock_soundRoomType "hangar" +bg_shock_soundDryLevel "0.5" +bg_shock_soundWetLevel "1" +bg_shock_soundModEndDelay "0.0" +bg_shock_soundSnapshot "explosion_shock" + + + +bg_shock_lookControl "0" +bg_shock_lookControl_maxpitchspeed "35" +bg_shock_lookControl_maxyawspeed "35" +bg_shock_lookControl_mousesensitivityscale "0.1" +bg_shock_lookControl_fadeTime "0.001" + +bg_shock_movement "1.0" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/flashbang.shock b/BO1/PC/ZM/shock/flashbang.shock new file mode 100644 index 0000000..4e67ba1 --- /dev/null +++ b/BO1/PC/ZM/shock/flashbang.shock @@ -0,0 +1,37 @@ +bg_shock_screenType "flashed" +bg_shock_screenBlurBlendTime "0.4" +bg_shock_screenBlurBlendFadeTime "1" +bg_shock_screenFlashWhiteFadeTime "3.5" +bg_shock_screenFlashShotFadeTime "1.0" + +bg_shock_viewKickPeriod ".75" +bg_shock_viewKickRadius ".05" +bg_shock_viewKickFadeTime "3" + +bg_shock_sound "1" +bg_shock_soundLoop "chr_flashbang_tinnitus_loop" +bg_shock_soundLoopSilent "" +bg_shock_soundEnd "" +bg_shock_soundEndAbort "" +bg_shock_soundFadeInTime ".25" +bg_shock_soundFadeOutTime "1.0" +bg_shock_soundLoopFadeTime "1.5" +bg_shock_soundLoopEndDelay "-1.5" +bg_shock_soundRoomType "shock_flashbang" +bg_shock_soundDryLevel "0.5" +bg_shock_soundWetLevel "1" +bg_shock_soundModEndDelay "0.1" +bg_shock_soundSnapshot "flashbang" + +bg_shock_lookControl "0" +bg_shock_lookControl_maxpitchspeed "90" +bg_shock_lookControl_maxyawspeed "90" +bg_shock_lookControl_mousesensitivityscale "0.5" +bg_shock_lookControl_fadeTime "2" + +bg_shock_movement "1.0" +bg_shock_animation "1" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/hold_breath.shock b/BO1/PC/ZM/shock/hold_breath.shock new file mode 100644 index 0000000..9a60395 --- /dev/null +++ b/BO1/PC/ZM/shock/hold_breath.shock @@ -0,0 +1,38 @@ +bg_shock_screenType "blurred" +bg_shock_screenBlurBlendTime "0.001" +bg_shock_screenBlurBlendFadeTime "0.001" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod "0.75" +bg_shock_viewKickRadius "0" +bg_shock_viewKickFadeTime "0.001" + +bg_shock_sound "1" +bg_shock_soundLoop "" +bg_shock_soundLoopSilent "" +bg_shock_soundEnd "" +bg_shock_soundEndAbort "" +bg_shock_soundFadeInTime ".25" +bg_shock_soundFadeOutTime "2.5" +bg_shock_soundLoopFadeTime "2" +bg_shock_soundLoopEndDelay "-1.5" +bg_shock_soundRoomType "generic" +bg_shock_soundDryLevel "1.0" +bg_shock_soundWetLevel "0.50" +bg_shock_soundModEndDelay "-.75" +bg_shock_soundSnapshot "default" + + +bg_shock_lookControl "0" +bg_shock_lookControl_maxpitchspeed "0" +bg_shock_lookControl_maxyawspeed "0" +bg_shock_lookControl_mousesensitivityscale "0" +bg_shock_lookControl_fadeTime "0.001" + +bg_shock_movement "0.4" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/level_end.shock b/BO1/PC/ZM/shock/level_end.shock new file mode 100644 index 0000000..36047d1 --- /dev/null +++ b/BO1/PC/ZM/shock/level_end.shock @@ -0,0 +1,39 @@ +bg_shock_screenType "none" +bg_shock_screenBlurBlendTime "1" +bg_shock_screenBlurBlendFadeTime "1" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod ".75" +bg_shock_viewKickRadius ".05" +bg_shock_viewKickFadeTime "3" + +bg_shock_sound "1" +bg_shock_soundLoop "" +bg_shock_soundLoopSilent "" +bg_shock_soundEnd "" +bg_shock_soundEndAbort "" +bg_shock_soundFadeInTime "0.5" +bg_shock_soundFadeOutTime "1.5" +bg_shock_soundLoopFadeTime "0.25" +bg_shock_soundLoopEndDelay "0.25" +bg_shock_soundRoomType "ber1" +bg_shock_soundDryLevel "0.0" +bg_shock_soundWetLevel "0.0" +bg_shock_soundModEndDelay "0.0" +bg_shock_soundSnapshot "default" + + + +bg_shock_lookControl "0" +bg_shock_lookControl_maxpitchspeed "0" +bg_shock_lookControl_maxyawspeed "0" +bg_shock_lookControl_mousesensitivityscale "0" +bg_shock_lookControl_fadeTime "0.001" + +bg_shock_movement "1.0" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/pain.shock b/BO1/PC/ZM/shock/pain.shock new file mode 100644 index 0000000..dbcf236 --- /dev/null +++ b/BO1/PC/ZM/shock/pain.shock @@ -0,0 +1,37 @@ +bg_shock_screenType "none" +bg_shock_screenBlurBlendTime "0.001" +bg_shock_screenBlurBlendFadeTime "0.001" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod "0.0" +bg_shock_viewKickRadius "0" +bg_shock_viewKickFadeTime "0.001" + +bg_shock_sound "0" +bg_shock_soundLoop "shellshock_loop" +bg_shock_soundLoopSilent "shellshock_loop_silent" +bg_shock_soundEnd "shellshock_end" +bg_shock_soundEndAbort "shellshock_end_abort" +bg_shock_soundFadeInTime ".25" +bg_shock_soundFadeOutTime "0.25" +bg_shock_soundLoopFadeTime "2" +bg_shock_soundLoopEndDelay "-1.5" +bg_shock_soundRoomType "generic" +bg_shock_soundDryLevel "1.0" +bg_shock_soundWetLevel "1.0" +bg_shock_soundModEndDelay "-.75" +bg_shock_soundSnapshot "default" + +bg_shock_lookControl "0" +bg_shock_lookControl_maxpitchspeed "0" +bg_shock_lookControl_maxyawspeed "0" +bg_shock_lookControl_mousesensitivityscale "0" +bg_shock_lookControl_fadeTime "0.001" + +bg_shock_movement "1.0" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/tank_mantle.shock b/BO1/PC/ZM/shock/tank_mantle.shock new file mode 100644 index 0000000..5d2dc19 --- /dev/null +++ b/BO1/PC/ZM/shock/tank_mantle.shock @@ -0,0 +1,39 @@ +bg_shock_screenType "none" +bg_shock_screenBlurBlendTime "1" +bg_shock_screenBlurBlendFadeTime "1" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod ".75" +bg_shock_viewKickRadius ".05" +bg_shock_viewKickFadeTime "3" + +bg_shock_sound "1" +bg_shock_soundLoop "" +bg_shock_soundLoopSilent "" +bg_shock_soundEnd "" +bg_shock_soundEndAbort "" +bg_shock_soundFadeInTime "0.5" +bg_shock_soundFadeOutTime "1.5" +bg_shock_soundLoopFadeTime "0.25" +bg_shock_soundLoopEndDelay "2.5" +bg_shock_soundRoomType "PLATE" +bg_shock_soundDryLevel "1.0" +bg_shock_soundWetLevel "1.0" +bg_shock_soundModEndDelay "0.0" +bg_shock_soundSnapshot "default" + + + +bg_shock_lookControl "1" +bg_shock_lookControl_maxpitchspeed "35" +bg_shock_lookControl_maxyawspeed "35" +bg_shock_lookControl_mousesensitivityscale "0.1" +bg_shock_lookControl_fadeTime "0.001" + +bg_shock_movement "1.0" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/tankblast.shock b/BO1/PC/ZM/shock/tankblast.shock new file mode 100644 index 0000000..385c18f --- /dev/null +++ b/BO1/PC/ZM/shock/tankblast.shock @@ -0,0 +1,36 @@ +bg_shock_screenType "blurred" +bg_shock_screenBlurBlendTime "0.05" +bg_shock_screenBlurBlendFadeTime "0.1" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod ".5" +bg_shock_viewKickRadius ".65" +bg_shock_viewKickFadeTime "6" + +bg_shock_sound "1" +bg_shock_soundLoop "" +bg_shock_soundLoopSilent "" +bg_shock_soundEnd "" +bg_shock_soundEndAbort "" +bg_shock_soundFadeInTime "0.25" +bg_shock_soundFadeOutTime "2.5" +bg_shock_soundLoopFadeTime "3" +bg_shock_soundLoopEndDelay "-1.5" +bg_shock_soundRoomType "ber1" +bg_shock_soundDryLevel "1" +bg_shock_soundWetLevel "1" +bg_shock_soundModEndDelay "0" +bg_shock_soundSnapshot "default" +bg_shock_lookControl "0" +bg_shock_lookControl_maxpitchspeed "0" +bg_shock_lookControl_maxyawspeed "0" +bg_shock_lookControl_mousesensitivityscale "0" +bg_shock_lookControl_fadeTime "0.001" + +bg_shock_movement "1.0" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/victoryscreen.shock b/BO1/PC/ZM/shock/victoryscreen.shock new file mode 100644 index 0000000..ce69399 --- /dev/null +++ b/BO1/PC/ZM/shock/victoryscreen.shock @@ -0,0 +1,37 @@ +bg_shock_screenType "blurred" +bg_shock_screenBlurBlendTime "0.001" +bg_shock_screenBlurBlendFadeTime "0.001" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod "0.75" +bg_shock_viewKickRadius "0" +bg_shock_viewKickFadeTime "0.001" + +bg_shock_sound "0" +bg_shock_soundLoop "shellshock_loop" +bg_shock_soundLoopSilent "shellshock_loop_silent" +bg_shock_soundEnd "shellshock_end" +bg_shock_soundEndAbort "shellshock_end_abort" +bg_shock_soundFadeInTime ".25" +bg_shock_soundFadeOutTime "25" +bg_shock_soundLoopFadeTime "2" +bg_shock_soundLoopEndDelay "-1.5" +bg_shock_soundRoomType "GENERIC" +bg_shock_soundDryLevel "1.0" +bg_shock_soundWetLevel "0.00" +bg_shock_soundModEndDelay "-.75" +bg_shock_soundSnapshot "default" + +bg_shock_lookControl "0" +bg_shock_lookControl_maxpitchspeed "0" +bg_shock_lookControl_maxyawspeed "0" +bg_shock_lookControl_mousesensitivityscale "0" +bg_shock_lookControl_fadeTime "0.001" + +bg_shock_movement "0.4" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/shock/zombie_death.shock b/BO1/PC/ZM/shock/zombie_death.shock new file mode 100644 index 0000000..9fd993f --- /dev/null +++ b/BO1/PC/ZM/shock/zombie_death.shock @@ -0,0 +1,39 @@ +bg_shock_screenType "blurred" +bg_shock_screenBlurBlendTime "0.4" +bg_shock_screenBlurBlendFadeTime "1" +bg_shock_screenFlashWhiteFadeTime "0" +bg_shock_screenFlashShotFadeTime "0" + +bg_shock_viewKickPeriod ".75" +bg_shock_viewKickRadius ".05" +bg_shock_viewKickFadeTime "0.5" + +bg_shock_sound "1" +bg_shock_soundLoop "" +bg_shock_soundLoopSilent "" +bg_shock_soundEnd "" +bg_shock_soundEndAbort "" +bg_shock_soundFadeInTime "0.5" +bg_shock_soundFadeOutTime "0.25" +bg_shock_soundLoopFadeTime "0.1" +bg_shock_soundLoopEndDelay "0.1" +bg_shock_soundRoomType "underwater" +bg_shock_soundDryLevel "1.0" +bg_shock_soundWetLevel "1.0" +bg_shock_soundModEndDelay "-.75" +bg_shock_soundSnapshot "default" + + + +bg_shock_lookControl "1" +bg_shock_lookControl_maxpitchspeed "45" +bg_shock_lookControl_maxyawspeed "45" +bg_shock_lookControl_mousesensitivityscale "0.5" +bg_shock_lookControl_fadeTime "2" + +bg_shock_movement "0.4" +bg_shock_animation "0" + +bg_shock_visionset_name "" +bg_shock_visionset_inTime "0" +bg_shock_visionset_outTime "0" \ No newline at end of file diff --git a/BO1/PC/ZM/sun/zombie_moon.sun b/BO1/PC/ZM/sun/zombie_moon.sun new file mode 100644 index 0000000..2ed6eef --- /dev/null +++ b/BO1/PC/ZM/sun/zombie_moon.sun @@ -0,0 +1,25 @@ +r_sunsprite_shader "sun_flare_icbm" +r_sunflare_shader "sun_flare" +r_sunsprite_size "14" +r_sun_fx_position "-24.18 28 0" + +r_sunflare_min_size "300" +r_sunflare_max_size "290" +r_sunflare_min_angle "90" +r_sunflare_max_angle "35" +r_sunflare_max_alpha "1" +r_sunflare_fadein "0.15" +r_sunflare_fadeout "0.15" + +r_sunblind_min_angle "30" +r_sunblind_max_angle "5" +r_sunblind_max_darken "0" +r_sunblind_fadein "0.25" +r_sunblind_fadeout "0.25" + +r_sunglare_min_angle "45" +r_sunglare_max_angle "35" +r_sunglare_max_lighten "0" +r_sunglare_fadein "0.5" +r_sunglare_fadeout "0.5" + diff --git a/BO1/PC/ZM/sun/zombie_temple.sun b/BO1/PC/ZM/sun/zombie_temple.sun new file mode 100644 index 0000000..e62243b --- /dev/null +++ b/BO1/PC/ZM/sun/zombie_temple.sun @@ -0,0 +1,25 @@ +r_sunsprite_shader "sun_wmd" +r_sunflare_shader "sun_wmd" +r_sunsprite_size "16" +r_sun_fx_position "-40 -173 0" + +r_sunflare_min_size "300" +r_sunflare_max_size "450" +r_sunflare_min_angle "38" +r_sunflare_max_angle "15" +r_sunflare_max_alpha "0.75" +r_sunflare_fadein "0.15" +r_sunflare_fadeout "0.15" + +r_sunblind_min_angle "30" +r_sunblind_max_angle "5" +r_sunblind_max_darken "0" +r_sunblind_fadein "0.25" +r_sunblind_fadeout "0.25" + +r_sunglare_min_angle "38" +r_sunglare_max_angle "39" +r_sunglare_max_lighten ".0" +r_sunglare_fadein "0.5" +r_sunglare_fadeout "0.5" + diff --git a/BO1/PC/ZM/sun/zombie_theater.sun b/BO1/PC/ZM/sun/zombie_theater.sun new file mode 100644 index 0000000..333f402 --- /dev/null +++ b/BO1/PC/ZM/sun/zombie_theater.sun @@ -0,0 +1,24 @@ +r_sr_sunsprite_shader "sun_flare" +r_sunflare_shader "sun_flare" +r_sunsprite_size "16" +r_sun_fx_position "224 100 0" + +r_sunflare_min_size "275" +r_sunflare_max_size "375" +r_sunflare_min_angle "45" +r_sunflare_max_angle "35" +r_sunflare_max_alpha "0.83" +r_sunflare_fadein "0.15" +r_sunflare_fadeout "0.15" + +r_sunblind_min_angle "30" +r_sunblind_max_angle "5" +r_sunblind_max_darken "0" +r_sunblind_fadein "0.25" +r_sunblind_fadeout "0.25" + +r_sunglare_min_angle "45" +r_sunglare_max_angle "35" +r_sunglare_max_lighten "0" +r_sunglare_fadein "0.5" +r_sunglare_fadeout "0.5" diff --git a/BO1/PC/ZM/thumbstick_default.cfg b/BO1/PC/ZM/thumbstick_default.cfg new file mode 100644 index 0000000..4a99246 --- /dev/null +++ b/BO1/PC/ZM/thumbstick_default.cfg @@ -0,0 +1,6 @@ + +set gpad_sticksConfig "thumbstick_default" +bindaxis A_LSTICK_X VA_SIDE MAP_SQUARED +bindaxis A_LSTICK_Y VA_FORWARD MAP_SQUARED +bindaxis A_RSTICK_X VA_YAW MAP_LINEAR +bindaxis A_RSTICK_Y VA_PITCH MAP_LINEAR diff --git a/BO1/PC/ZM/thumbstick_legacy.cfg b/BO1/PC/ZM/thumbstick_legacy.cfg new file mode 100644 index 0000000..8fe8c6a --- /dev/null +++ b/BO1/PC/ZM/thumbstick_legacy.cfg @@ -0,0 +1,6 @@ + +set gpad_sticksConfig "thumbstick_legacy" +bindaxis A_LSTICK_X VA_YAW MAP_LINEAR +bindaxis A_LSTICK_Y VA_FORWARD MAP_SQUARED +bindaxis A_RSTICK_X VA_SIDE MAP_SQUARED +bindaxis A_RSTICK_Y VA_PITCH MAP_LINEAR diff --git a/BO1/PC/ZM/thumbstick_legacysouthpaw.cfg b/BO1/PC/ZM/thumbstick_legacysouthpaw.cfg new file mode 100644 index 0000000..e773034 --- /dev/null +++ b/BO1/PC/ZM/thumbstick_legacysouthpaw.cfg @@ -0,0 +1,6 @@ + +set gpad_sticksConfig "thumbstick_legacysouthpaw" +bindaxis A_RSTICK_X VA_YAW MAP_LINEAR +bindaxis A_RSTICK_Y VA_FORWARD MAP_SQUARED +bindaxis A_LSTICK_X VA_SIDE MAP_SQUARED +bindaxis A_LSTICK_Y VA_PITCH MAP_LINEAR diff --git a/BO1/PC/ZM/thumbstick_southpaw.cfg b/BO1/PC/ZM/thumbstick_southpaw.cfg new file mode 100644 index 0000000..089e601 --- /dev/null +++ b/BO1/PC/ZM/thumbstick_southpaw.cfg @@ -0,0 +1,6 @@ + +set gpad_sticksConfig "thumbstick_southpaw" +bindaxis A_RSTICK_X VA_SIDE MAP_SQUARED +bindaxis A_RSTICK_Y VA_FORWARD MAP_SQUARED +bindaxis A_LSTICK_X VA_YAW MAP_LINEAR +bindaxis A_LSTICK_Y VA_PITCH MAP_LINEAR diff --git a/BO1/PC/ZM/vehicle/heli_hind_steer.graph b/BO1/PC/ZM/vehicle/heli_hind_steer.graph new file mode 100644 index 0000000..7a50220 --- /dev/null +++ b/BO1/PC/ZM/vehicle/heli_hind_steer.graph @@ -0,0 +1,8 @@ +GRAPH_FLOAT_FILE + +5 +0.0000 0.0000 +0.2926 0.1052 +0.5759 0.2671 +0.8610 0.6230 +1.0000 1.0000 diff --git a/BO1/PC/ZM/vehicles/defaultvehicle b/BO1/PC/ZM/vehicles/defaultvehicle new file mode 100644 index 0000000..ddd89d1 --- /dev/null +++ b/BO1/PC/ZM/vehicles/defaultvehicle @@ -0,0 +1 @@ +VEHICLEFILE\type\tank\cameraMode\chase\boostMode\burst\remoteControl\0\thirdPersonDriver\0\autoRecenterOnAccel\1\cameraAlwaysAutoCenter\0\cameraFOV\0\thirdPersonCameraRange\300\thirdPersonCameraHeight\100\thirdPersonCameraHeightMin\100\thirdPersonCameraPitch\0\thirdPersonCameraPitchMin\0\thirdPersonCameraMinPitchClamp\45\thirdPersonCameraMaxPitchClamp\70\cameraAutoCenterLerpRate\4\cameraAutoCenterMaxLerpRate\1\thirdPersonCameraSpringDistance\0\thirdPersonCameraSpringTime\1\thirdPersonCameraHandbrakeTurnRateInc\0\killcamDist\300\killcamZDist\50\killcamMinDist\100\killcamZTargetOffset\0\killcamFOV\65\killcamCollision\1\killcamNearBlur\6\killcamNearBlurStart\0\killcamNearBlurEnd\100\killcamFarBlur\1.8\killcamFarBlurStart\100\killcamFarBlurEnd\100\steerWheels\0\texureScroll\1\quadBarrel\0\bulletDamage\1\armorPiercingDamage\1\grenadeDamage\1\projectileDamage\1\projectileSplashDamage\1\heavyExplosiveDamage\1\texureScrollScale\5.5\wheelRotRate\0\extraWheelRotScale\1\maxSpeed\15\accel\12.55\rotRate\60\rotAccel\100\maxBodyPitch\5\maxBodyRoll\5\collisionDamage\200\collisionSpeed\15\boostSpeedIncrease\1\boostAccelMultiplier\1\boostInterval\0\boostDuration\2\boostFrictionMultiplier\1\boostContinuousRegenCooldown\1\boostContinuousRegenAmount\1\suspensionTravel\7\enterRadiusDriver\80\enterRadiusGunner1\80\enterRadiusGunner2\80\enterRadiusGunner3\80\enterRadiusGunner4\80\heliCollisionScalar\1\viewPitchOffset\0\viewInfluence\0\tiltSpeedPitch\1.2\tiltSpeedRoll\1.2\tiltFromVelocityPitch\1\tiltFromVelocityRoll\1\tiltFromAccelerationPitch\2\tiltFromAccelerationRoll\2\tiltFromDecelerationPitch\2\tiltFromDecelerationRoll\2\tracerOffsetForward\0\tracerOffsetUp\0\turretWeapon\default_vehicle_weapon\turretHorizSpanLeft\180\turretHorizSpanRight\180\turretVertSpanUp\30\turretVertSpanDown\15\turretRotRate\30\turretClampPlayerView\0\turretTag1\\turretTag2\\turretTag3\\turretTag4\\gunnerWeapon\\gunnerWeapon1\\gunnerWeapon2\\gunnerWeapon3\\gunnerRotRate\0\passenger1HorizSpanLeft\180\passenger1HorizSpanRight\180\passenger1VertSpanUp\180\passenger1VertSpanDown\180\passenger2HorizSpanLeft\180\passenger2HorizSpanRight\180\passenger2VertSpanUp\180\passenger2VertSpanDown\180\passenger3HorizSpanLeft\180\passenger3HorizSpanRight\180\passenger3VertSpanUp\180\passenger3VertSpanDown\180\passenger4HorizSpanLeft\180\passenger4HorizSpanRight\180\passenger4VertSpanUp\180\passenger4VertSpanDown\180\passenger5HorizSpanLeft\180\passenger5HorizSpanRight\180\passenger5VertSpanUp\180\passenger5VertSpanDown\180\passenger6HorizSpanLeft\180\passenger6HorizSpanRight\180\passenger6VertSpanUp\180\passenger6VertSpanDown\180\lowIdleSnd\\lowIdleSndPlyr\\highIdleSnd\\lowEngineSnd\\highEngineSnd\\turretSpinSnd\\turretStopSnd\\engineModLoopSnd\\engineModLoopSndPlyr\\engineModLoopLoadSnd\\engineModLoopLoadSndPlyr\\tankBodyDmgLeftSnd\\tankBodyDmgRightSnd\\engineModLoopNaturalRPMs\2000\idleRPMs\1200\idleRPMsMax\1500\gear1MinRPMs\1400\gear1MaxRPMs\2000\gearChangeMPH\8\gear2MinRPMs\1500\gear2MaxRPMs\2400\tankGrindLeftSnd\\tankGrindRightSnd\\tankGrindLeftDmgSnd\\tankGrindRightDmgSnd\\treadGrindAttenuation\0.5\treadDamageLoopHealthRatio\0.5\clacksCurveDamageStart\0.5\clacksCurveDamageEnd\0.7\clacksCurveMaxOmitted\0.7\trackLengthInches\14\tankBoostPerkSnd\\tankBoostPerkSndPlyr\\wheelRoadNoiseSnd\\wheelSlidingSnd\\wheelPeelingOutSnd\\skidSpeedMin\100\skidSpeedMax\600\engineSndSpeed\10\isDrivable\0\numberOfSeats\0\numberOfGunners\0\seatSwitchOrder1\-1\seatSwitchOrder2\-1\seatSwitchOrder3\-1\seatSwitchOrder4\-1\seatSwitchOrder5\-1\seatSwitchOrder6\-1\seatSwitchOrder7\-1\seatSwitchOrder8\-1\seatSwitchOrder9\-1\seatSwitchOrder10\-1\seatSwitchOrder11\-1\driverControlledGunPos\-1\animType\default\animSet\\mantleAngleFront\0\mantleAngleBack\90\mantleAngleLeft\90\mantleAngleRight\90\extraWheelLeft1\\extraWheelRight1\\extraWheelLeft2\\extraWheelRight2\\mod0\\tag0\\mod1\\tag1\\mod2\\tag2\\mod3\\tag3\\dmod0\\dtag0\\dmod1\\dtag1\\dmod2\\dtag2\\dmod3\\dtag3\\worldModel\defaultvehicle\deathModel\defaultvehicle\modelSwapDelay\0\exhaustFx\\oneExhaust\0\rotorMainIdleFx\\rotorMainStartFx\\rotorMainRunningFx\\rotorMainStopFx\\rotorTailIdleFx\\rotorTailStartFx\\rotorTailRunningFx\\rotorTailStopFx\\deathFxName\\deathFxTag\\deathFxSound\\radiusDamageMin\0\radiusDamageMax\0\radiusDamageRadius\0\shootShock\\shootRumble\\deathQuakeScale\0\deathQuakeDuration\0\deathQuakeRadius\0\secTurretType\\secTurretTag\\secTurretModel\\secTurretAiControlled\0\healthDefault\1000\healthMin\500\healthMax\1500\rumbleType\\rumbleScale\0\rumbleDuration\0\rumbleRadius\0\rumbleBaseTime\0\rumbleAdditionalTime\0\team\axis\frontArmor\0\treadFxAsphalt\\treadFxBark\\treadFxBrick\\treadFxCarpet\\treadFxCeramic\\treadFxCloth\\treadFxConcrete\\treadFxDefault\\treadFxDirt\\treadFxFlesh\\treadFxFoliage\\treadFxGlass\\treadFxGrass\\treadFxGravel\\treadFxIce\\treadFxMetal\\treadFxMud\\treadFxPaintedMetal\\treadFxPlaster\\treadFxRock\\treadFxRubber\\treadFxSand\\treadFxSnow\\treadFxWater\\treadFxWood\\addToCompass\0\addToCompassEnemy\0\compassIcon\\gasButton\BUTTON_LTRIG\boostButton\none\reverseBrakeButton\BUTTON_B\handBrakeButton\none\attackButton\BUTTON_RTRIG\attackSecondaryButton\BUTTON_RSHLDR\moveUpButton\none\moveDownButton\none\switchSeatButton\none\specialAbilityButton\none\firePickupButton\none\swapPickupButton\none\dropDeployableButton\none\steerGraph\\accelGraph\\noDirectionalDamage\0\isNitrous\0\isFourWheelSteering\0\nitrous_steer_angle_max\0.6\nitrous_steer_speed\5\nitrous_body_mass\1\nitrous_wheel_radius\15\nitrous_susp_adj\10\nitrous_susp_spring_k\20\nitrous_susp_damp_k\1\nitrous_susp_hard_limit\23\nitrous_susp_min_height\-100\nitrous_tire_damp_hand\10000\nitrous_tire_damp_brake\100\nitrous_tire_damp_coast\10\nitrous_tire_fric_brake\2.3\nitrous_tire_fric_hand_brake\0\nitrous_tire_fric_fwd\2.5\nitrous_tire_fric_side\2.3\max_fric_tilt\0.7\max_fric_tilt_angle\0.1\nitrous_roll_stability\10\nitrous_roll_resistance\100\nitrous_yaw_resistance\0\nitrous_upright_strength\50\nitrous_tilt_fakey\0.25\nitrous_traction_type\TRACTION_TYPE_FRONT\nitrous_peel_out_max_speed\150\nitrous_tire_fric_side_max\0\nitrous_reverse_scale\0.8\nitrous_bbox_min_x\0\nitrous_bbox_min_y\0\nitrous_bbox_min_z\0\nitrous_bbox_max_x\0\nitrous_bbox_max_y\0\nitrous_bbox_max_z\0\nitrous_mass_center_offset_x\0\nitrous_mass_center_offset_y\0\nitrous_mass_center_offset_z\20\nitrous_buoyancybox_min_x\0\nitrous_buoyancybox_min_y\0\nitrous_buoyancybox_min_z\0\nitrous_buoyancybox_max_x\0\nitrous_buoyancybox_max_y\0\nitrous_buoyancybox_max_z\0\nitrous_water_speed_max\123\nitrous_water_accel_max\4\nitrous_water_turn_accel\0.25\nitrous_water_turn_speed_max\0.25\nitrous_boat_speed_rise\10\nitrous_boat_speed_tilt\10\nitrous_boat_motor_offset_x\0\nitrous_boat_motor_offset_y\0\nitrous_boat_motor_offset_z\0\nitrous_boat_side_fric\3\nitrous_boat_forward_fric\0.4\nitrous_boat_vertical_fric\0.5\nitrous_boat_ebrake_power\1.5\autoHandbrakeMinSpeed\12 \ No newline at end of file diff --git a/BO1/PC/ZM/vehicles/defaultvehicle_mp b/BO1/PC/ZM/vehicles/defaultvehicle_mp new file mode 100644 index 0000000..f1cd822 --- /dev/null +++ b/BO1/PC/ZM/vehicles/defaultvehicle_mp @@ -0,0 +1 @@ +VEHICLEFILE\type\4 wheel\cameraMode\first\boostMode\burst\remoteControl\0\thirdPersonDriver\0\autoRecenterOnAccel\1\cameraAlwaysAutoCenter\0\cameraFOV\0\thirdPersonCameraRange\300\thirdPersonCameraHeight\100\thirdPersonCameraHeightMin\100\thirdPersonCameraPitch\0\thirdPersonCameraPitchMin\0\thirdPersonCameraMinPitchClamp\45\thirdPersonCameraMaxPitchClamp\70\cameraAutoCenterLerpRate\4\cameraAutoCenterMaxLerpRate\1\thirdPersonCameraSpringDistance\0\thirdPersonCameraSpringTime\1\thirdPersonCameraHandbrakeTurnRateInc\0\killcamDist\300\killcamZDist\50\killcamMinDist\100\killcamZTargetOffset\0\killcamFOV\65\killcamCollision\1\killcamNearBlur\6\killcamNearBlurStart\0\killcamNearBlurEnd\100\killcamFarBlur\1.8\killcamFarBlurStart\100\killcamFarBlurEnd\100\steerWheels\0\texureScroll\1\quadBarrel\0\bulletDamage\1\armorPiercingDamage\1\grenadeDamage\1\projectileDamage\1\projectileSplashDamage\1\heavyExplosiveDamage\1\texureScrollScale\5.5\wheelRotRate\0\extraWheelRotScale\1\maxSpeed\10\accel\12.55\rotRate\60\rotAccel\100\maxBodyPitch\5\maxBodyRoll\5\collisionDamage\200\collisionSpeed\15\boostSpeedIncrease\1\boostAccelMultiplier\1\boostInterval\0\boostDuration\2\boostFrictionMultiplier\1\boostContinuousRegenCooldown\1\boostContinuousRegenAmount\1\suspensionTravel\7\enterRadiusDriver\80\enterRadiusGunner1\80\enterRadiusGunner2\80\enterRadiusGunner3\60\enterRadiusGunner4\60\heliCollisionScalar\1\viewPitchOffset\0\viewInfluence\0\tiltSpeedPitch\1.2\tiltSpeedRoll\1.2\tiltFromVelocityPitch\1\tiltFromVelocityRoll\1\tiltFromAccelerationPitch\2\tiltFromAccelerationRoll\2\tiltFromDecelerationPitch\2\tiltFromDecelerationRoll\2\tracerOffsetForward\0\tracerOffsetUp\0\turretWeapon\\turretHorizSpanLeft\180\turretHorizSpanRight\180\turretVertSpanUp\30\turretVertSpanDown\15\turretRotRate\30\turretClampPlayerView\0\turretTag1\\turretTag2\\turretTag3\\turretTag4\\gunnerWeapon\\gunnerWeapon1\\gunnerWeapon2\\gunnerWeapon3\\gunnerRotRate\0\passenger1HorizSpanLeft\180\passenger1HorizSpanRight\180\passenger1VertSpanUp\180\passenger1VertSpanDown\180\passenger2HorizSpanLeft\180\passenger2HorizSpanRight\180\passenger2VertSpanUp\180\passenger2VertSpanDown\180\passenger3HorizSpanLeft\180\passenger3HorizSpanRight\180\passenger3VertSpanUp\180\passenger3VertSpanDown\180\passenger4HorizSpanLeft\180\passenger4HorizSpanRight\180\passenger4VertSpanUp\180\passenger4VertSpanDown\180\passenger5HorizSpanLeft\180\passenger5HorizSpanRight\180\passenger5VertSpanUp\180\passenger5VertSpanDown\180\passenger6HorizSpanLeft\180\passenger6HorizSpanRight\180\passenger6VertSpanUp\180\passenger6VertSpanDown\180\lowIdleSnd\\lowIdleSndPlyr\\highIdleSnd\\lowEngineSnd\\highEngineSnd\\turretSpinSnd\\turretStopSnd\\engineModLoopSnd\\engineModLoopSndPlyr\\engineModLoopLoadSnd\\engineModLoopLoadSndPlyr\\tankBodyDmgLeftSnd\\tankBodyDmgRightSnd\\engineModLoopNaturalRPMs\2000\idleRPMs\1200\idleRPMsMax\1500\gear1MinRPMs\1400\gear1MaxRPMs\2000\gearChangeMPH\8\gear2MinRPMs\1500\gear2MaxRPMs\1650\tankGrindLeftSnd\\tankGrindRightSnd\\tankGrindLeftDmgSnd\\tankGrindRightDmgSnd\\treadGrindAttenuation\0.5\treadDamageLoopHealthRatio\0.5\clacksCurveDamageStart\0.5\clacksCurveDamageEnd\0.7\clacksCurveMaxOmitted\0.7\trackLengthInches\14\tankBoostPerkSnd\\tankBoostPerkSndPlyr\\wheelRoadNoiseSnd\\wheelSlidingSnd\\wheelPeelingOutSnd\\skidSpeedMin\100\skidSpeedMax\600\engineSndSpeed\10\isDrivable\1\numberOfSeats\1\numberOfGunners\0\seatSwitchOrder1\-1\seatSwitchOrder2\-1\seatSwitchOrder3\-1\seatSwitchOrder4\-1\seatSwitchOrder5\-1\seatSwitchOrder6\-1\seatSwitchOrder7\-1\seatSwitchOrder8\-1\seatSwitchOrder9\-1\seatSwitchOrder10\-1\seatSwitchOrder11\-1\driverControlledGunPos\-1\animType\default\animSet\\mantleAngleFront\0\mantleAngleBack\90\mantleAngleLeft\90\mantleAngleRight\90\extraWheelLeft1\\extraWheelRight1\\extraWheelLeft2\\extraWheelRight2\\mod0\\tag0\\mod1\\tag1\\mod2\\tag2\\mod3\\tag3\\dmod0\\dtag0\\dmod1\\dtag1\\dmod2\\dtag2\\dmod3\\dtag3\\worldModel\\deathModel\\modelSwapDelay\0\exhaustFx\\oneExhaust\0\rotorMainIdleFx\\rotorMainStartFx\\rotorMainRunningFx\\rotorMainStopFx\\rotorTailIdleFx\\rotorTailStartFx\\rotorTailRunningFx\\rotorTailStopFx\\deathFxName\\deathFxTag\\deathFxSound\\radiusDamageMin\0\radiusDamageMax\0\radiusDamageRadius\0\shootShock\\shootRumble\\deathQuakeScale\0\deathQuakeDuration\0\deathQuakeRadius\0\secTurretType\\secTurretTag\\secTurretModel\\secTurretAiControlled\0\healthDefault\1000\healthMin\500\healthMax\1500\rumbleType\\rumbleScale\0\rumbleDuration\0\rumbleRadius\0\rumbleBaseTime\0\rumbleAdditionalTime\0\team\axis\frontArmor\0\treadFxAsphalt\\treadFxBark\\treadFxBrick\\treadFxCarpet\\treadFxCeramic\\treadFxCloth\\treadFxConcrete\\treadFxDefault\\treadFxDirt\\treadFxFlesh\\treadFxFoliage\\treadFxGlass\\treadFxGrass\\treadFxGravel\\treadFxIce\\treadFxMetal\\treadFxMud\\treadFxPaintedMetal\\treadFxPlaster\\treadFxRock\\treadFxRubber\\treadFxSand\\treadFxSnow\\treadFxWater\\treadFxWood\\addToCompass\1\addToCompassEnemy\1\compassIcon\hud_objective_tank\gasButton\BUTTON_LTRIG\boostButton\none\reverseBrakeButton\BUTTON_B\handBrakeButton\BUTTON_B\attackButton\BUTTON_RTRIG\attackSecondaryButton\BUTTON_RSHLDR\moveUpButton\none\moveDownButton\none\switchSeatButton\none\specialAbilityButton\none\firePickupButton\none\swapPickupButton\none\dropDeployableButton\none\steerGraph\\accelGraph\\noDirectionalDamage\0\isNitrous\1\isFourWheelSteering\0\nitrous_steer_angle_max\0\nitrous_steer_speed\0\nitrous_body_mass\1\nitrous_wheel_radius\1\nitrous_susp_adj\0\nitrous_susp_spring_k\0\nitrous_susp_damp_k\0\nitrous_susp_hard_limit\0\nitrous_susp_min_height\-100\nitrous_tire_damp_hand\0\nitrous_tire_damp_brake\0\nitrous_tire_damp_coast\0\nitrous_tire_fric_brake\0\nitrous_tire_fric_hand_brake\0\nitrous_tire_fric_fwd\0\nitrous_tire_fric_side\0\max_fric_tilt\0.7\max_fric_tilt_angle\0.1\nitrous_roll_stability\0\nitrous_roll_resistance\0\nitrous_yaw_resistance\0\nitrous_upright_strength\0\nitrous_tilt_fakey\0\nitrous_traction_type\TRACTION_TYPE_FRONT\nitrous_peel_out_max_speed\0\nitrous_tire_fric_side_max\0\nitrous_reverse_scale\0\nitrous_bbox_min_x\0\nitrous_bbox_min_y\0\nitrous_bbox_min_z\0\nitrous_bbox_max_x\0\nitrous_bbox_max_y\0\nitrous_bbox_max_z\0\nitrous_mass_center_offset_x\0\nitrous_mass_center_offset_y\0\nitrous_mass_center_offset_z\0\nitrous_buoyancybox_min_x\0\nitrous_buoyancybox_min_y\0\nitrous_buoyancybox_min_z\0\nitrous_buoyancybox_max_x\0\nitrous_buoyancybox_max_y\0\nitrous_buoyancybox_max_z\0\nitrous_water_speed_max\123\nitrous_water_accel_max\4\nitrous_water_turn_accel\0.25\nitrous_water_turn_speed_max\0.25\nitrous_boat_speed_rise\10\nitrous_boat_speed_tilt\10\nitrous_boat_motor_offset_x\0\nitrous_boat_motor_offset_y\0\nitrous_boat_motor_offset_z\0\nitrous_boat_side_fric\3\nitrous_boat_forward_fric\0.4\nitrous_boat_vertical_fric\0.5\nitrous_boat_ebrake_power\1.5\autoHandbrakeMinSpeed\12 \ No newline at end of file diff --git a/BO1/PC/ZM/vehicles/heli_mini_zt b/BO1/PC/ZM/vehicles/heli_mini_zt new file mode 100644 index 0000000..724b2d5 --- /dev/null +++ b/BO1/PC/ZM/vehicles/heli_mini_zt @@ -0,0 +1 @@ +VEHICLEFILE\type\helicopter\cameraMode\chase\boostMode\burst\remoteControl\0\thirdPersonDriver\0\autoRecenterOnAccel\1\cameraAlwaysAutoCenter\0\cameraFOV\0\thirdPersonCameraRange\300\thirdPersonCameraHeight\100\thirdPersonCameraHeightMin\100\thirdPersonCameraPitch\0\thirdPersonCameraPitchMin\0\thirdPersonCameraMinPitchClamp\45\thirdPersonCameraMaxPitchClamp\70\cameraAutoCenterLerpRate\4\cameraAutoCenterMaxLerpRate\1\thirdPersonCameraSpringDistance\0\thirdPersonCameraSpringTime\1\thirdPersonCameraHandbrakeTurnRateInc\0\killcamDist\300\killcamZDist\50\killcamMinDist\100\killcamZTargetOffset\0\killcamFOV\65\killcamCollision\1\killcamNearBlur\6\killcamNearBlurStart\0\killcamNearBlurEnd\100\killcamFarBlur\1.8\killcamFarBlurStart\100\killcamFarBlurEnd\100\steerWheels\0\texureScroll\0\quadBarrel\0\bulletDamage\1\armorPiercingDamage\1\grenadeDamage\1\projectileDamage\1\projectileSplashDamage\1\heavyExplosiveDamage\1\texureScrollScale\0\wheelRotRate\0\extraWheelRotScale\1\maxSpeed\15\accel\25\rotRate\1000\rotAccel\1200\maxBodyPitch\25\maxBodyRoll\45\collisionDamage\50\collisionSpeed\10\boostSpeedIncrease\1\boostAccelMultiplier\1\boostInterval\0\boostDuration\2\boostFrictionMultiplier\1\boostContinuousRegenCooldown\1\boostContinuousRegenAmount\1\suspensionTravel\0\enterRadiusDriver\80\enterRadiusGunner1\80\enterRadiusGunner2\80\enterRadiusGunner3\80\enterRadiusGunner4\80\heliCollisionScalar\1\viewPitchOffset\0\viewInfluence\0\tiltSpeedPitch\1.2\tiltSpeedRoll\1.2\tiltFromVelocityPitch\1\tiltFromVelocityRoll\1\tiltFromAccelerationPitch\2\tiltFromAccelerationRoll\2\tiltFromDecelerationPitch\2\tiltFromDecelerationRoll\2\tracerOffsetForward\0\tracerOffsetUp\0\turretWeapon\hind_minigun_pilot_zt\turretHorizSpanLeft\90\turretHorizSpanRight\90\turretVertSpanUp\45\turretVertSpanDown\45\turretRotRate\180\turretClampPlayerView\0\turretTag1\\turretTag2\\turretTag3\\turretTag4\\gunnerWeapon\hind_rockets_zt\gunnerWeapon1\\gunnerWeapon2\\gunnerWeapon3\\gunnerRotRate\360\passenger1HorizSpanLeft\180\passenger1HorizSpanRight\180\passenger1VertSpanUp\180\passenger1VertSpanDown\180\passenger2HorizSpanLeft\180\passenger2HorizSpanRight\180\passenger2VertSpanUp\180\passenger2VertSpanDown\180\passenger3HorizSpanLeft\180\passenger3HorizSpanRight\180\passenger3VertSpanUp\180\passenger3VertSpanDown\180\passenger4HorizSpanLeft\180\passenger4HorizSpanRight\180\passenger4VertSpanUp\180\passenger4VertSpanDown\180\passenger5HorizSpanLeft\180\passenger5HorizSpanRight\180\passenger5VertSpanUp\180\passenger5VertSpanDown\180\passenger6HorizSpanLeft\180\passenger6HorizSpanRight\180\passenger6VertSpanUp\180\passenger6VertSpanDown\180\lowIdleSnd\\lowIdleSndPlyr\\highIdleSnd\\lowEngineSnd\\highEngineSnd\\turretSpinSnd\\turretStopSnd\\engineModLoopSnd\\engineModLoopSndPlyr\\engineModLoopLoadSnd\\engineModLoopLoadSndPlyr\\tankBodyDmgLeftSnd\\tankBodyDmgRightSnd\\engineModLoopNaturalRPMs\2000\idleRPMs\1200\idleRPMsMax\1500\gear1MinRPMs\1400\gear1MaxRPMs\2000\gearChangeMPH\8\gear2MinRPMs\1500\gear2MaxRPMs\2400\tankGrindLeftSnd\\tankGrindRightSnd\\tankGrindLeftDmgSnd\\tankGrindRightDmgSnd\\treadGrindAttenuation\0.5\treadDamageLoopHealthRatio\0.5\clacksCurveDamageStart\0.5\clacksCurveDamageEnd\0.7\clacksCurveMaxOmitted\0.7\trackLengthInches\14\tankBoostPerkSnd\\tankBoostPerkSndPlyr\\wheelRoadNoiseSnd\\wheelSlidingSnd\\wheelPeelingOutSnd\\skidSpeedMin\100\skidSpeedMax\600\engineSndSpeed\100\isDrivable\1\numberOfSeats\1\numberOfGunners\0\seatSwitchOrder1\-1\seatSwitchOrder2\-1\seatSwitchOrder3\-1\seatSwitchOrder4\-1\seatSwitchOrder5\-1\seatSwitchOrder6\-1\seatSwitchOrder7\-1\seatSwitchOrder8\-1\seatSwitchOrder9\-1\seatSwitchOrder10\-1\seatSwitchOrder11\-1\driverControlledGunPos\0\animType\default\animSet\\mantleAngleFront\0\mantleAngleBack\90\mantleAngleLeft\90\mantleAngleRight\90\extraWheelLeft1\\extraWheelRight1\\extraWheelLeft2\\extraWheelRight2\\mod0\\tag0\\mod1\\tag1\\mod2\\tag2\\mod3\\tag3\\dmod0\\dtag0\\dmod1\\dtag1\\dmod2\\dtag2\\dmod3\\dtag3\\worldModel\t5_veh_helo_hind_mini\deathModel\t5_veh_helo_hind_mini\modelSwapDelay\0\exhaustFx\vehicle/exhaust/fx_exhaust_player_hind\oneExhaust\1\rotorMainIdleFx\vehicle/props/fx_hind_main_blade_full_mini\rotorMainStartFx\vehicle/props/fx_hind_main_blade_full_mini\rotorMainRunningFx\vehicle/props/fx_hind_main_blade_full_mini\rotorMainStopFx\vehicle/props/fx_hind_main_blade_full_mini\rotorTailIdleFx\vehicle/props/fx_hind_small_blade_full_mini\rotorTailStartFx\vehicle/props/fx_hind_small_blade_full_mini\rotorTailRunningFx\vehicle/props/fx_hind_small_blade_full_mini\rotorTailStopFx\vehicle/props/fx_hind_small_blade_full_mini\deathFxName\vehicle/vexplosion/fx_vexplode_huey_exp\deathFxTag\tag_origin\deathFxSound\\radiusDamageMin\0\radiusDamageMax\0\radiusDamageRadius\0\shootShock\tankblast\shootRumble\tank_fire\deathQuakeScale\0.5\deathQuakeDuration\1\deathQuakeRadius\400\secTurretType\\secTurretTag\\secTurretModel\\secTurretAiControlled\0\healthDefault\99999\healthMin\99998\healthMax\99999\rumbleType\tank_rumble\rumbleScale\0\rumbleDuration\0\rumbleRadius\0\rumbleBaseTime\1\rumbleAdditionalTime\1\team\allies\frontArmor\0\treadFxAsphalt\\treadFxBark\\treadFxBrick\\treadFxCarpet\\treadFxCeramic\\treadFxCloth\\treadFxConcrete\\treadFxDefault\\treadFxDirt\\treadFxFlesh\\treadFxFoliage\\treadFxGlass\\treadFxGrass\\treadFxGravel\\treadFxIce\\treadFxMetal\\treadFxMud\\treadFxPaintedMetal\\treadFxPlaster\\treadFxRock\\treadFxRubber\\treadFxSand\\treadFxSnow\\treadFxWater\\treadFxWood\\addToCompass\0\addToCompassEnemy\0\compassIcon\\gasButton\none\boostButton\none\reverseBrakeButton\none\handBrakeButton\none\attackButton\BUTTON_RTRIG\attackSecondaryButton\none\moveUpButton\none\moveDownButton\none\switchSeatButton\none\specialAbilityButton\none\firePickupButton\none\swapPickupButton\none\dropDeployableButton\none\steerGraph\vehicle/heli_hind_steer.graph\accelGraph\\noDirectionalDamage\0\isNitrous\0\isFourWheelSteering\0\nitrous_steer_angle_max\0.6\nitrous_steer_speed\5\nitrous_body_mass\600\nitrous_wheel_radius\15\nitrous_susp_adj\4\nitrous_susp_spring_k\30\nitrous_susp_damp_k\1\nitrous_susp_hard_limit\25\nitrous_susp_min_height\-100\nitrous_tire_damp_hand\10000\nitrous_tire_damp_brake\200\nitrous_tire_damp_coast\25\nitrous_tire_fric_brake\2.3\nitrous_tire_fric_hand_brake\0\nitrous_tire_fric_fwd\1\nitrous_tire_fric_side\1\max_fric_tilt\0.7\max_fric_tilt_angle\0.1\nitrous_roll_stability\10\nitrous_roll_resistance\50\nitrous_yaw_resistance\0\nitrous_upright_strength\50\nitrous_tilt_fakey\0.1\nitrous_traction_type\TRACTION_TYPE_ALL_WD\nitrous_peel_out_max_speed\150\nitrous_tire_fric_side_max\0\nitrous_reverse_scale\0.8\nitrous_bbox_min_x\-60\nitrous_bbox_min_y\-30\nitrous_bbox_min_z\18\nitrous_bbox_max_x\60\nitrous_bbox_max_y\30\nitrous_bbox_max_z\36\nitrous_mass_center_offset_x\0\nitrous_mass_center_offset_y\0\nitrous_mass_center_offset_z\-6\nitrous_buoyancybox_min_x\-60\nitrous_buoyancybox_min_y\-30\nitrous_buoyancybox_min_z\18\nitrous_buoyancybox_max_x\60\nitrous_buoyancybox_max_y\30\nitrous_buoyancybox_max_z\36\nitrous_water_speed_max\600\nitrous_water_accel_max\9.95\nitrous_water_turn_accel\6\nitrous_water_turn_speed_max\4\nitrous_boat_speed_rise\10\nitrous_boat_speed_tilt\10\nitrous_boat_motor_offset_x\0\nitrous_boat_motor_offset_y\0\nitrous_boat_motor_offset_z\0\nitrous_boat_side_fric\3\nitrous_boat_forward_fric\0.4\nitrous_boat_vertical_fric\0.5\nitrous_boat_ebrake_power\1.5\autoHandbrakeMinSpeed\12 \ No newline at end of file diff --git a/BO1/PC/ZM/vehicles/misc_camera b/BO1/PC/ZM/vehicles/misc_camera new file mode 100644 index 0000000..3e4157a --- /dev/null +++ b/BO1/PC/ZM/vehicles/misc_camera @@ -0,0 +1 @@ +VEHICLEFILE\type\plane\cameraMode\chase\boostMode\burst\remoteControl\0\thirdPersonDriver\0\autoRecenterOnAccel\1\cameraAlwaysAutoCenter\0\cameraFOV\0\thirdPersonCameraRange\300\thirdPersonCameraHeight\100\thirdPersonCameraHeightMin\100\thirdPersonCameraPitch\0\thirdPersonCameraPitchMin\0\thirdPersonCameraMinPitchClamp\45\thirdPersonCameraMaxPitchClamp\70\cameraAutoCenterLerpRate\4\cameraAutoCenterMaxLerpRate\1\thirdPersonCameraSpringDistance\0\thirdPersonCameraSpringTime\1\thirdPersonCameraHandbrakeTurnRateInc\0\killcamDist\300\killcamZDist\50\killcamMinDist\100\killcamZTargetOffset\0\killcamFOV\65\killcamCollision\1\killcamNearBlur\6\killcamNearBlurStart\0\killcamNearBlurEnd\100\killcamFarBlur\1.8\killcamFarBlurStart\100\killcamFarBlurEnd\100\steerWheels\0\texureScroll\1\quadBarrel\0\bulletDamage\1\armorPiercingDamage\1\grenadeDamage\1\projectileDamage\1\projectileSplashDamage\1\heavyExplosiveDamage\1\texureScrollScale\5.5\wheelRotRate\0\extraWheelRotScale\1\maxSpeed\15\accel\12.55\rotRate\60\rotAccel\100\maxBodyPitch\5\maxBodyRoll\5\collisionDamage\200\collisionSpeed\15\boostSpeedIncrease\1\boostAccelMultiplier\1\boostInterval\0\boostDuration\2\boostFrictionMultiplier\1\boostContinuousRegenCooldown\1\boostContinuousRegenAmount\1\suspensionTravel\7\enterRadiusDriver\80\enterRadiusGunner1\80\enterRadiusGunner2\80\enterRadiusGunner3\80\enterRadiusGunner4\80\heliCollisionScalar\1\viewPitchOffset\0\viewInfluence\0\tiltSpeedPitch\1.2\tiltSpeedRoll\1.2\tiltFromVelocityPitch\1\tiltFromVelocityRoll\1\tiltFromAccelerationPitch\2\tiltFromAccelerationRoll\2\tiltFromDecelerationPitch\2\tiltFromDecelerationRoll\2\tracerOffsetForward\0\tracerOffsetUp\0\turretWeapon\AGM_114\turretHorizSpanLeft\180\turretHorizSpanRight\180\turretVertSpanUp\30\turretVertSpanDown\15\turretRotRate\30\turretClampPlayerView\0\turretTag1\\turretTag2\\turretTag3\\turretTag4\\gunnerWeapon\\gunnerWeapon1\\gunnerWeapon2\\gunnerWeapon3\\gunnerRotRate\0\passenger1HorizSpanLeft\180\passenger1HorizSpanRight\180\passenger1VertSpanUp\180\passenger1VertSpanDown\180\passenger2HorizSpanLeft\180\passenger2HorizSpanRight\180\passenger2VertSpanUp\180\passenger2VertSpanDown\180\passenger3HorizSpanLeft\180\passenger3HorizSpanRight\180\passenger3VertSpanUp\180\passenger3VertSpanDown\180\passenger4HorizSpanLeft\180\passenger4HorizSpanRight\180\passenger4VertSpanUp\180\passenger4VertSpanDown\180\passenger5HorizSpanLeft\180\passenger5HorizSpanRight\180\passenger5VertSpanUp\180\passenger5VertSpanDown\180\passenger6HorizSpanLeft\180\passenger6HorizSpanRight\180\passenger6VertSpanUp\180\passenger6VertSpanDown\180\lowIdleSnd\blackhawk_idle_low\lowIdleSndPlyr\\highIdleSnd\blackhawk_idle_high\lowEngineSnd\blackhawk_engine_low\highEngineSnd\blackhawk_engine_high\turretSpinSnd\\turretStopSnd\\engineModLoopSnd\\engineModLoopSndPlyr\\engineModLoopLoadSnd\\engineModLoopLoadSndPlyr\\tankBodyDmgLeftSnd\\tankBodyDmgRightSnd\\engineModLoopNaturalRPMs\2000\idleRPMs\1200\idleRPMsMax\1500\gear1MinRPMs\1400\gear1MaxRPMs\2000\gearChangeMPH\8\gear2MinRPMs\1500\gear2MaxRPMs\2400\tankGrindLeftSnd\\tankGrindRightSnd\\tankGrindLeftDmgSnd\\tankGrindRightDmgSnd\\treadGrindAttenuation\0.5\treadDamageLoopHealthRatio\0.5\clacksCurveDamageStart\0.5\clacksCurveDamageEnd\0.7\clacksCurveMaxOmitted\0.7\trackLengthInches\14\tankBoostPerkSnd\\tankBoostPerkSndPlyr\\wheelRoadNoiseSnd\\wheelSlidingSnd\\wheelPeelingOutSnd\\skidSpeedMin\100\skidSpeedMax\600\engineSndSpeed\10\isDrivable\0\numberOfSeats\0\numberOfGunners\0\seatSwitchOrder1\-1\seatSwitchOrder2\-1\seatSwitchOrder3\-1\seatSwitchOrder4\-1\seatSwitchOrder5\-1\seatSwitchOrder6\-1\seatSwitchOrder7\-1\seatSwitchOrder8\-1\seatSwitchOrder9\-1\seatSwitchOrder10\-1\seatSwitchOrder11\-1\driverControlledGunPos\-1\animType\default\animSet\\mantleAngleFront\0\mantleAngleBack\90\mantleAngleLeft\90\mantleAngleRight\90\extraWheelLeft1\\extraWheelRight1\\extraWheelLeft2\\extraWheelRight2\\mod0\\tag0\\mod1\\tag1\\mod2\\tag2\\mod3\\tag3\\dmod0\\dtag0\\dmod1\\dtag1\\dmod2\\dtag2\\dmod3\\dtag3\\worldModel\\deathModel\\modelSwapDelay\0\exhaustFx\\oneExhaust\0\rotorMainIdleFx\\rotorMainStartFx\\rotorMainRunningFx\\rotorMainStopFx\\rotorTailIdleFx\\rotorTailStartFx\\rotorTailRunningFx\\rotorTailStopFx\\deathFxName\\deathFxTag\\deathFxSound\\radiusDamageMin\0\radiusDamageMax\0\radiusDamageRadius\0\shootShock\\shootRumble\\deathQuakeScale\0\deathQuakeDuration\0\deathQuakeRadius\0\secTurretType\\secTurretTag\\secTurretModel\\secTurretAiControlled\0\healthDefault\1000\healthMin\1500\healthMax\1500\rumbleType\\rumbleScale\0\rumbleDuration\0\rumbleRadius\0\rumbleBaseTime\0\rumbleAdditionalTime\0\team\axis\frontArmor\0\treadFxAsphalt\\treadFxBark\\treadFxBrick\\treadFxCarpet\\treadFxCeramic\\treadFxCloth\\treadFxConcrete\\treadFxDefault\\treadFxDirt\\treadFxFlesh\\treadFxFoliage\\treadFxGlass\\treadFxGrass\\treadFxGravel\\treadFxIce\\treadFxMetal\\treadFxMud\\treadFxPaintedMetal\\treadFxPlaster\\treadFxRock\\treadFxRubber\\treadFxSand\\treadFxSnow\\treadFxWater\\treadFxWood\\addToCompass\0\addToCompassEnemy\0\compassIcon\\gasButton\BUTTON_LTRIG\boostButton\none\reverseBrakeButton\BUTTON_B\handBrakeButton\none\attackButton\BUTTON_RTRIG\attackSecondaryButton\BUTTON_RSHLDR\moveUpButton\none\moveDownButton\none\switchSeatButton\none\specialAbilityButton\none\firePickupButton\none\swapPickupButton\none\dropDeployableButton\none\steerGraph\\accelGraph\\noDirectionalDamage\0\isNitrous\0\isFourWheelSteering\0\nitrous_steer_angle_max\0.6\nitrous_steer_speed\5\nitrous_body_mass\1\nitrous_wheel_radius\15\nitrous_susp_adj\10\nitrous_susp_spring_k\20\nitrous_susp_damp_k\1\nitrous_susp_hard_limit\23\nitrous_susp_min_height\-100\nitrous_tire_damp_hand\10000\nitrous_tire_damp_brake\100\nitrous_tire_damp_coast\10\nitrous_tire_fric_brake\2.3\nitrous_tire_fric_hand_brake\0\nitrous_tire_fric_fwd\2.5\nitrous_tire_fric_side\2.3\max_fric_tilt\0.7\max_fric_tilt_angle\0.1\nitrous_roll_stability\10\nitrous_roll_resistance\100\nitrous_yaw_resistance\0\nitrous_upright_strength\50\nitrous_tilt_fakey\0.25\nitrous_traction_type\TRACTION_TYPE_FRONT\nitrous_peel_out_max_speed\150\nitrous_tire_fric_side_max\0\nitrous_reverse_scale\0.8\nitrous_bbox_min_x\0\nitrous_bbox_min_y\0\nitrous_bbox_min_z\0\nitrous_bbox_max_x\0\nitrous_bbox_max_y\0\nitrous_bbox_max_z\0\nitrous_mass_center_offset_x\0\nitrous_mass_center_offset_y\0\nitrous_mass_center_offset_z\20\nitrous_buoyancybox_min_x\0\nitrous_buoyancybox_min_y\0\nitrous_buoyancybox_min_z\0\nitrous_buoyancybox_max_x\0\nitrous_buoyancybox_max_y\0\nitrous_buoyancybox_max_z\0\nitrous_water_speed_max\123\nitrous_water_accel_max\4\nitrous_water_turn_accel\0.25\nitrous_water_turn_speed_max\0.25\nitrous_boat_speed_rise\10\nitrous_boat_speed_tilt\10\nitrous_boat_motor_offset_x\0\nitrous_boat_motor_offset_y\0\nitrous_boat_motor_offset_z\0\nitrous_boat_side_fric\3\nitrous_boat_forward_fric\0.4\nitrous_boat_vertical_fric\0.5\nitrous_boat_ebrake_power\1.5\autoHandbrakeMinSpeed\12 \ No newline at end of file diff --git a/BO1/PC/ZM/vehicles/misc_freefall b/BO1/PC/ZM/vehicles/misc_freefall new file mode 100644 index 0000000..297b66d --- /dev/null +++ b/BO1/PC/ZM/vehicles/misc_freefall @@ -0,0 +1 @@ +VEHICLEFILE\type\plane\cameraMode\chase\boostMode\burst\remoteControl\0\thirdPersonDriver\0\autoRecenterOnAccel\1\cameraAlwaysAutoCenter\0\cameraFOV\0\thirdPersonCameraRange\300\thirdPersonCameraHeight\100\thirdPersonCameraHeightMin\100\thirdPersonCameraPitch\0\thirdPersonCameraPitchMin\0\thirdPersonCameraMinPitchClamp\45\thirdPersonCameraMaxPitchClamp\70\cameraAutoCenterLerpRate\4\cameraAutoCenterMaxLerpRate\1\thirdPersonCameraSpringDistance\0\thirdPersonCameraSpringTime\1\thirdPersonCameraHandbrakeTurnRateInc\0\killcamDist\300\killcamZDist\50\killcamMinDist\100\killcamZTargetOffset\0\killcamFOV\65\killcamCollision\1\killcamNearBlur\6\killcamNearBlurStart\0\killcamNearBlurEnd\100\killcamFarBlur\1.8\killcamFarBlurStart\100\killcamFarBlurEnd\100\steerWheels\0\texureScroll\1\quadBarrel\0\bulletDamage\0\armorPiercingDamage\0\grenadeDamage\0\projectileDamage\0\projectileSplashDamage\0\heavyExplosiveDamage\0\texureScrollScale\5.5\wheelRotRate\0\extraWheelRotScale\1\maxSpeed\150\accel\500\rotRate\60\rotAccel\100\maxBodyPitch\5\maxBodyRoll\5\collisionDamage\200\collisionSpeed\15\boostSpeedIncrease\1\boostAccelMultiplier\1\boostInterval\0\boostDuration\2\boostFrictionMultiplier\1\boostContinuousRegenCooldown\1\boostContinuousRegenAmount\1\suspensionTravel\7\enterRadiusDriver\80\enterRadiusGunner1\80\enterRadiusGunner2\80\enterRadiusGunner3\80\enterRadiusGunner4\80\heliCollisionScalar\1\viewPitchOffset\0\viewInfluence\0\tiltSpeedPitch\1.2\tiltSpeedRoll\1.2\tiltFromVelocityPitch\1\tiltFromVelocityRoll\1\tiltFromAccelerationPitch\2\tiltFromAccelerationRoll\2\tiltFromDecelerationPitch\2\tiltFromDecelerationRoll\2\tracerOffsetForward\0\tracerOffsetUp\0\turretWeapon\\turretHorizSpanLeft\180\turretHorizSpanRight\180\turretVertSpanUp\30\turretVertSpanDown\15\turretRotRate\30\turretClampPlayerView\0\turretTag1\\turretTag2\\turretTag3\\turretTag4\\gunnerWeapon\\gunnerWeapon1\\gunnerWeapon2\\gunnerWeapon3\\gunnerRotRate\0\passenger1HorizSpanLeft\180\passenger1HorizSpanRight\180\passenger1VertSpanUp\180\passenger1VertSpanDown\180\passenger2HorizSpanLeft\180\passenger2HorizSpanRight\180\passenger2VertSpanUp\180\passenger2VertSpanDown\180\passenger3HorizSpanLeft\180\passenger3HorizSpanRight\180\passenger3VertSpanUp\180\passenger3VertSpanDown\180\passenger4HorizSpanLeft\180\passenger4HorizSpanRight\180\passenger4VertSpanUp\180\passenger4VertSpanDown\180\passenger5HorizSpanLeft\180\passenger5HorizSpanRight\180\passenger5VertSpanUp\180\passenger5VertSpanDown\180\passenger6HorizSpanLeft\180\passenger6HorizSpanRight\180\passenger6VertSpanUp\180\passenger6VertSpanDown\180\lowIdleSnd\\lowIdleSndPlyr\\highIdleSnd\\lowEngineSnd\\highEngineSnd\\turretSpinSnd\\turretStopSnd\\engineModLoopSnd\\engineModLoopSndPlyr\\engineModLoopLoadSnd\\engineModLoopLoadSndPlyr\\tankBodyDmgLeftSnd\\tankBodyDmgRightSnd\\engineModLoopNaturalRPMs\2000\idleRPMs\1200\idleRPMsMax\1500\gear1MinRPMs\1400\gear1MaxRPMs\2000\gearChangeMPH\8\gear2MinRPMs\1500\gear2MaxRPMs\2400\tankGrindLeftSnd\\tankGrindRightSnd\\tankGrindLeftDmgSnd\\tankGrindRightDmgSnd\\treadGrindAttenuation\0.5\treadDamageLoopHealthRatio\0.5\clacksCurveDamageStart\0.5\clacksCurveDamageEnd\0.7\clacksCurveMaxOmitted\0.7\trackLengthInches\14\tankBoostPerkSnd\\tankBoostPerkSndPlyr\\wheelRoadNoiseSnd\\wheelSlidingSnd\\wheelPeelingOutSnd\\skidSpeedMin\100\skidSpeedMax\600\engineSndSpeed\3\isDrivable\0\numberOfSeats\0\numberOfGunners\0\seatSwitchOrder1\-1\seatSwitchOrder2\-1\seatSwitchOrder3\-1\seatSwitchOrder4\-1\seatSwitchOrder5\-1\seatSwitchOrder6\-1\seatSwitchOrder7\-1\seatSwitchOrder8\-1\seatSwitchOrder9\-1\seatSwitchOrder10\-1\seatSwitchOrder11\-1\driverControlledGunPos\-1\animType\default\animSet\\mantleAngleFront\0\mantleAngleBack\90\mantleAngleLeft\90\mantleAngleRight\90\extraWheelLeft1\\extraWheelRight1\\extraWheelLeft2\\extraWheelRight2\\mod0\\tag0\\mod1\\tag1\\mod2\\tag2\\mod3\\tag3\\dmod0\\dtag0\\dmod1\\dtag1\\dmod2\\dtag2\\dmod3\\dtag3\\worldModel\tag_origin\deathModel\\modelSwapDelay\0\exhaustFx\\oneExhaust\0\rotorMainIdleFx\\rotorMainStartFx\\rotorMainRunningFx\\rotorMainStopFx\\rotorTailIdleFx\\rotorTailStartFx\\rotorTailRunningFx\\rotorTailStopFx\\deathFxName\\deathFxTag\\deathFxSound\\radiusDamageMin\0\radiusDamageMax\0\radiusDamageRadius\0\shootShock\\shootRumble\\deathQuakeScale\0\deathQuakeDuration\0\deathQuakeRadius\0\secTurretType\\secTurretTag\\secTurretModel\\secTurretAiControlled\0\healthDefault\1000\healthMin\1500\healthMax\1500\rumbleType\\rumbleScale\0\rumbleDuration\0\rumbleRadius\0\rumbleBaseTime\0\rumbleAdditionalTime\0\team\allies\frontArmor\0\treadFxAsphalt\\treadFxBark\\treadFxBrick\\treadFxCarpet\\treadFxCeramic\\treadFxCloth\\treadFxConcrete\\treadFxDefault\\treadFxDirt\\treadFxFlesh\\treadFxFoliage\\treadFxGlass\\treadFxGrass\\treadFxGravel\\treadFxIce\\treadFxMetal\\treadFxMud\\treadFxPaintedMetal\\treadFxPlaster\\treadFxRock\\treadFxRubber\\treadFxSand\\treadFxSnow\\treadFxWater\\treadFxWood\\addToCompass\0\addToCompassEnemy\0\compassIcon\\gasButton\BUTTON_LTRIG\boostButton\none\reverseBrakeButton\BUTTON_B\handBrakeButton\none\attackButton\BUTTON_RTRIG\attackSecondaryButton\BUTTON_RSHLDR\moveUpButton\none\moveDownButton\none\switchSeatButton\none\specialAbilityButton\none\firePickupButton\none\swapPickupButton\none\dropDeployableButton\none\steerGraph\\accelGraph\\noDirectionalDamage\0\isNitrous\0\isFourWheelSteering\0\nitrous_steer_angle_max\0.6\nitrous_steer_speed\5\nitrous_body_mass\1\nitrous_wheel_radius\15\nitrous_susp_adj\10\nitrous_susp_spring_k\20\nitrous_susp_damp_k\1\nitrous_susp_hard_limit\23\nitrous_susp_min_height\-100\nitrous_tire_damp_hand\10000\nitrous_tire_damp_brake\100\nitrous_tire_damp_coast\10\nitrous_tire_fric_brake\2.3\nitrous_tire_fric_hand_brake\0\nitrous_tire_fric_fwd\2.5\nitrous_tire_fric_side\2.3\max_fric_tilt\0.7\max_fric_tilt_angle\0.1\nitrous_roll_stability\10\nitrous_roll_resistance\100\nitrous_yaw_resistance\0\nitrous_upright_strength\50\nitrous_tilt_fakey\0.25\nitrous_traction_type\TRACTION_TYPE_FRONT\nitrous_peel_out_max_speed\150\nitrous_tire_fric_side_max\0\nitrous_reverse_scale\0.8\nitrous_bbox_min_x\0\nitrous_bbox_min_y\0\nitrous_bbox_min_z\0\nitrous_bbox_max_x\0\nitrous_bbox_max_y\0\nitrous_bbox_max_z\0\nitrous_mass_center_offset_x\0\nitrous_mass_center_offset_y\0\nitrous_mass_center_offset_z\20\nitrous_buoyancybox_min_x\0\nitrous_buoyancybox_min_y\0\nitrous_buoyancybox_min_z\0\nitrous_buoyancybox_max_x\0\nitrous_buoyancybox_max_y\0\nitrous_buoyancybox_max_z\0\nitrous_water_speed_max\123\nitrous_water_accel_max\4\nitrous_water_turn_accel\0.25\nitrous_water_turn_speed_max\0.25\nitrous_boat_speed_rise\10\nitrous_boat_speed_tilt\10\nitrous_boat_motor_offset_x\0\nitrous_boat_motor_offset_y\0\nitrous_boat_motor_offset_z\0\nitrous_boat_side_fric\3\nitrous_boat_forward_fric\0.4\nitrous_boat_vertical_fric\0.5\nitrous_boat_ebrake_power\1.5\autoHandbrakeMinSpeed\12 \ No newline at end of file diff --git a/BO1/PC/ZM/vehicles/tank_t55_mini b/BO1/PC/ZM/vehicles/tank_t55_mini new file mode 100644 index 0000000..6ea1879 --- /dev/null +++ b/BO1/PC/ZM/vehicles/tank_t55_mini @@ -0,0 +1 @@ +VEHICLEFILE\type\tank\cameraMode\view\boostMode\burst\remoteControl\0\thirdPersonDriver\1\autoRecenterOnAccel\1\cameraAlwaysAutoCenter\0\cameraFOV\0\thirdPersonCameraRange\300\thirdPersonCameraHeight\100\thirdPersonCameraHeightMin\100\thirdPersonCameraPitch\0\thirdPersonCameraPitchMin\0\thirdPersonCameraMinPitchClamp\45\thirdPersonCameraMaxPitchClamp\70\cameraAutoCenterLerpRate\4\cameraAutoCenterMaxLerpRate\1\thirdPersonCameraSpringDistance\0\thirdPersonCameraSpringTime\1\thirdPersonCameraHandbrakeTurnRateInc\0\killcamDist\300\killcamZDist\50\killcamMinDist\100\killcamZTargetOffset\0\killcamFOV\65\killcamCollision\1\killcamNearBlur\6\killcamNearBlurStart\0\killcamNearBlurEnd\100\killcamFarBlur\1.8\killcamFarBlurStart\100\killcamFarBlurEnd\100\steerWheels\0\texureScroll\1\quadBarrel\0\bulletDamage\0\armorPiercingDamage\0\grenadeDamage\0\projectileDamage\0\projectileSplashDamage\0\heavyExplosiveDamage\0\texureScrollScale\3.5\wheelRotRate\4\extraWheelRotScale\1\maxSpeed\15\accel\3\rotRate\230\rotAccel\5\maxBodyPitch\5\maxBodyRoll\5\collisionDamage\2000\collisionSpeed\3\boostSpeedIncrease\10\boostAccelMultiplier\10\boostInterval\0\boostDuration\2\boostFrictionMultiplier\1\boostContinuousRegenCooldown\1\boostContinuousRegenAmount\1\suspensionTravel\7\enterRadiusDriver\150\enterRadiusGunner1\80\enterRadiusGunner2\80\enterRadiusGunner3\80\enterRadiusGunner4\80\heliCollisionScalar\1\viewPitchOffset\0\viewInfluence\0\tiltSpeedPitch\1.2\tiltSpeedRoll\1.2\tiltFromVelocityPitch\1\tiltFromVelocityRoll\1\tiltFromAccelerationPitch\2\tiltFromAccelerationRoll\2\tiltFromDecelerationPitch\2\tiltFromDecelerationRoll\2\tracerOffsetForward\0\tracerOffsetUp\0\turretWeapon\t55_mini_turret\turretHorizSpanLeft\180\turretHorizSpanRight\180\turretVertSpanUp\30\turretVertSpanDown\8\turretRotRate\300\turretClampPlayerView\0\turretTag1\\turretTag2\\turretTag3\\turretTag4\\gunnerWeapon\t55_mg\gunnerWeapon1\\gunnerWeapon2\\gunnerWeapon3\\gunnerRotRate\10\passenger1HorizSpanLeft\180\passenger1HorizSpanRight\180\passenger1VertSpanUp\180\passenger1VertSpanDown\180\passenger2HorizSpanLeft\180\passenger2HorizSpanRight\180\passenger2VertSpanUp\180\passenger2VertSpanDown\180\passenger3HorizSpanLeft\180\passenger3HorizSpanRight\180\passenger3VertSpanUp\180\passenger3VertSpanDown\180\passenger4HorizSpanLeft\180\passenger4HorizSpanRight\180\passenger4VertSpanUp\180\passenger4VertSpanDown\180\passenger5HorizSpanLeft\180\passenger5HorizSpanRight\180\passenger5VertSpanUp\180\passenger5VertSpanDown\180\passenger6HorizSpanLeft\180\passenger6HorizSpanRight\180\passenger6VertSpanUp\180\passenger6VertSpanDown\180\lowIdleSnd\veh_t55_mini_idle_zt\lowIdleSndPlyr\\highIdleSnd\veh_t55_mini_idle_zt\lowEngineSnd\\highEngineSnd\veh_t55_mini_move_zt\turretSpinSnd\\turretStopSnd\\engineModLoopSnd\\engineModLoopSndPlyr\\engineModLoopLoadSnd\\engineModLoopLoadSndPlyr\\tankBodyDmgLeftSnd\\tankBodyDmgRightSnd\\engineModLoopNaturalRPMs\2000\idleRPMs\1200\idleRPMsMax\1500\gear1MinRPMs\1400\gear1MaxRPMs\2000\gearChangeMPH\8\gear2MinRPMs\1500\gear2MaxRPMs\2400\tankGrindLeftSnd\\tankGrindRightSnd\\tankGrindLeftDmgSnd\\tankGrindRightDmgSnd\\treadGrindAttenuation\0.5\treadDamageLoopHealthRatio\0.5\clacksCurveDamageStart\0.5\clacksCurveDamageEnd\0.7\clacksCurveMaxOmitted\0.7\trackLengthInches\14\tankBoostPerkSnd\\tankBoostPerkSndPlyr\\wheelRoadNoiseSnd\\wheelSlidingSnd\\wheelPeelingOutSnd\\skidSpeedMin\100\skidSpeedMax\600\engineSndSpeed\5\isDrivable\1\numberOfSeats\1\numberOfGunners\1\seatSwitchOrder1\-1\seatSwitchOrder2\-1\seatSwitchOrder3\-1\seatSwitchOrder4\-1\seatSwitchOrder5\-1\seatSwitchOrder6\-1\seatSwitchOrder7\-1\seatSwitchOrder8\-1\seatSwitchOrder9\-1\seatSwitchOrder10\-1\seatSwitchOrder11\-1\driverControlledGunPos\-1\animType\default\animSet\\mantleAngleFront\0\mantleAngleBack\90\mantleAngleLeft\90\mantleAngleRight\90\extraWheelLeft1\left_wheel_01_jnt\extraWheelRight1\right_wheel_01_jnt\extraWheelLeft2\left_wheel_08_jnt\extraWheelRight2\right_wheel_08_jnt\mod0\\tag0\\mod1\\tag1\\mod2\\tag2\\mod3\\tag3\\dmod0\\dtag0\\dmod1\\dtag1\\dmod2\\dtag2\\dmod3\\dtag3\\worldModel\t5_veh_tank_t55_mini\deathModel\t5_veh_tank_t55_mini\modelSwapDelay\0\exhaustFx\vehicle/exhaust/fx_exhaust_tank\oneExhaust\0\rotorMainIdleFx\\rotorMainStartFx\\rotorMainRunningFx\\rotorMainStopFx\\rotorTailIdleFx\\rotorTailStartFx\\rotorTailRunningFx\\rotorTailStopFx\\deathFxName\vehicle/vexplosion/fx_vexp_apc_m113\deathFxTag\tag_origin\deathFxSound\\radiusDamageMin\0\radiusDamageMax\0\radiusDamageRadius\0\shootShock\\shootRumble\tank_fire\deathQuakeScale\0\deathQuakeDuration\0\deathQuakeRadius\0\secTurretType\\secTurretTag\\secTurretModel\\secTurretAiControlled\0\healthDefault\1000\healthMin\1500\healthMax\1500\rumbleType\tank_rumble\rumbleScale\0\rumbleDuration\0\rumbleRadius\0\rumbleBaseTime\0\rumbleAdditionalTime\0\team\allies\frontArmor\0\treadFxAsphalt\vehicle/treadfx/fx_treadfx_dust\treadFxBark\vehicle/treadfx/fx_treadfx_dust\treadFxBrick\vehicle/treadfx/fx_treadfx_dust\treadFxCarpet\vehicle/treadfx/fx_treadfx_dust\treadFxCeramic\vehicle/treadfx/fx_treadfx_dust\treadFxCloth\vehicle/treadfx/fx_treadfx_dust\treadFxConcrete\vehicle/treadfx/fx_treadfx_dust\treadFxDefault\vehicle/treadfx/fx_treadfx_dust\treadFxDirt\vehicle/treadfx/fx_treadfx_dust\treadFxFlesh\vehicle/treadfx/fx_treadfx_dust\treadFxFoliage\vehicle/treadfx/fx_treadfx_dust\treadFxGlass\vehicle/treadfx/fx_treadfx_dust\treadFxGrass\vehicle/treadfx/fx_treadfx_dust\treadFxGravel\vehicle/treadfx/fx_treadfx_dust\treadFxIce\vehicle/treadfx/fx_treadfx_dust\treadFxMetal\vehicle/treadfx/fx_treadfx_dust\treadFxMud\vehicle/treadfx/fx_treadfx_dust\treadFxPaintedMetal\vehicle/treadfx/fx_treadfx_dust\treadFxPlaster\vehicle/treadfx/fx_treadfx_dust\treadFxRock\vehicle/treadfx/fx_treadfx_dust\treadFxRubber\vehicle/treadfx/fx_treadfx_dust\treadFxSand\vehicle/treadfx/fx_treadfx_dust\treadFxSnow\vehicle/treadfx/fx_treadfx_dust\treadFxWater\vehicle/treadfx/fx_treadfx_dust\treadFxWood\vehicle/treadfx/fx_treadfx_dust\addToCompass\0\addToCompassEnemy\0\compassIcon\\gasButton\BUTTON_LTRIG\boostButton\BUTTON_LSTICK\reverseBrakeButton\BUTTON_B\handBrakeButton\none\attackButton\BUTTON_RTRIG\attackSecondaryButton\BUTTON_RSHLDR\moveUpButton\none\moveDownButton\none\switchSeatButton\none\specialAbilityButton\none\firePickupButton\none\swapPickupButton\none\dropDeployableButton\none\steerGraph\\accelGraph\\noDirectionalDamage\0\isNitrous\1\isFourWheelSteering\0\nitrous_steer_angle_max\1.6\nitrous_steer_speed\10\nitrous_body_mass\1000\nitrous_wheel_radius\9\nitrous_susp_adj\9.9\nitrous_susp_spring_k\20.5\nitrous_susp_damp_k\1\nitrous_susp_hard_limit\23\nitrous_susp_min_height\-100\nitrous_tire_damp_hand\10000\nitrous_tire_damp_brake\100\nitrous_tire_damp_coast\50\nitrous_tire_fric_brake\2.3\nitrous_tire_fric_hand_brake\0\nitrous_tire_fric_fwd\1\nitrous_tire_fric_side\1\max_fric_tilt\0.7\max_fric_tilt_angle\0.1\nitrous_roll_stability\10\nitrous_roll_resistance\1\nitrous_yaw_resistance\0\nitrous_upright_strength\100\nitrous_tilt_fakey\0\nitrous_traction_type\TRACTION_TYPE_ALL_WD\nitrous_peel_out_max_speed\50\nitrous_tire_fric_side_max\0\nitrous_reverse_scale\1\nitrous_bbox_min_x\-25\nitrous_bbox_min_y\-20\nitrous_bbox_min_z\20\nitrous_bbox_max_x\35\nitrous_bbox_max_y\20\nitrous_bbox_max_z\0\nitrous_mass_center_offset_x\0\nitrous_mass_center_offset_y\0\nitrous_mass_center_offset_z\0\nitrous_buoyancybox_min_x\0\nitrous_buoyancybox_min_y\0\nitrous_buoyancybox_min_z\0\nitrous_buoyancybox_max_x\0\nitrous_buoyancybox_max_y\0\nitrous_buoyancybox_max_z\0\nitrous_water_speed_max\123\nitrous_water_accel_max\4\nitrous_water_turn_accel\0.25\nitrous_water_turn_speed_max\0.25\nitrous_boat_speed_rise\10\nitrous_boat_speed_tilt\10\nitrous_boat_motor_offset_x\0\nitrous_boat_motor_offset_y\0\nitrous_boat_motor_offset_z\0\nitrous_boat_side_fric\3\nitrous_boat_forward_fric\0.4\nitrous_boat_vertical_fric\0.5\nitrous_boat_ebrake_power\1.5\autoHandbrakeMinSpeed\12 \ No newline at end of file diff --git a/BO1/PC/ZM/video/cin_levels.txt b/BO1/PC/ZM/video/cin_levels.txt new file mode 100644 index 0000000..e95495c --- /dev/null +++ b/BO1/PC/ZM/video/cin_levels.txt @@ -0,0 +1,23 @@ + +// You can specify particular movies to play for particular maps +// by using a line like this per map: +// getmapname strcmp ! if play then +// +// every expression is in postfix notation + + // frontend special cases + // +getmapname frontend strcmp ! // push whether this is frontend +if + ui_skipMainLockout getdvar 1 == + if + so_narrative1_frontend_load play + then + com_introPlayed getdvar 0 == + if + treyarch play + then + spinner play +then // Default case + getmapname _load strcat play + diff --git a/BO1/PC/ZM/video/cin_playlist.txt b/BO1/PC/ZM/video/cin_playlist.txt new file mode 100644 index 0000000..907b41e --- /dev/null +++ b/BO1/PC/ZM/video/cin_playlist.txt @@ -0,0 +1,2 @@ +1 +attract diff --git a/BO1/PC/ZM/viewsensitivity_high.cfg b/BO1/PC/ZM/viewsensitivity_high.cfg new file mode 100644 index 0000000..6cf0011 --- /dev/null +++ b/BO1/PC/ZM/viewsensitivity_high.cfg @@ -0,0 +1 @@ +set input_viewSensitivity 1.8 \ No newline at end of file diff --git a/BO1/PC/ZM/viewsensitivity_low.cfg b/BO1/PC/ZM/viewsensitivity_low.cfg new file mode 100644 index 0000000..834bd93 --- /dev/null +++ b/BO1/PC/ZM/viewsensitivity_low.cfg @@ -0,0 +1 @@ +set input_viewSensitivity 0.6 \ No newline at end of file diff --git a/BO1/PC/ZM/viewsensitivity_med.cfg b/BO1/PC/ZM/viewsensitivity_med.cfg new file mode 100644 index 0000000..e22cd90 --- /dev/null +++ b/BO1/PC/ZM/viewsensitivity_med.cfg @@ -0,0 +1 @@ +set input_viewSensitivity 1 \ No newline at end of file diff --git a/BO1/PC/ZM/viewsensitivity_ultra.cfg b/BO1/PC/ZM/viewsensitivity_ultra.cfg new file mode 100644 index 0000000..3aa641b --- /dev/null +++ b/BO1/PC/ZM/viewsensitivity_ultra.cfg @@ -0,0 +1 @@ +set input_viewSensitivity 4 \ No newline at end of file diff --git a/BO1/PC/ZM/vision/berserker.vision b/BO1/PC/ZM/vision/berserker.vision new file mode 100644 index 0000000..964f321 --- /dev/null +++ b/BO1/PC/ZM/vision/berserker.vision @@ -0,0 +1,39 @@ + + +r_filmEnable "1" +r_filmMidStart "0.5" +r_filmMidEnd "0.5" +r_filmDarkFeather "1" +r_filmLightFeather "1" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 0.53 0.46" +r_filmMidTint "1 0.765 0.58" +r_filmLightTint "1 1 0.7" +r_filmContrast "1.5 1.5 1.5" + + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "1" +r_reviveFX_brightnessEdge "1" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "1" +r_reviveFX_motionblurWeight "1" + +r_reviveFX_contrastCenter "1" +r_reviveFX_brightnessCenter "1" +r_reviveFX_desaturationCenter "1" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/camera_spike_mp.vision b/BO1/PC/ZM/vision/camera_spike_mp.vision new file mode 100644 index 0000000..4fff752 --- /dev/null +++ b/BO1/PC/ZM/vision/camera_spike_mp.vision @@ -0,0 +1,64 @@ + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmBleach "0 0 0" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.1" +r_sCurveLinearStrength "0.5" +r_sCurveLinearAngle "0.125" +r_sCurveToeStrength "0.110" +r_sCurveToeNumerator "0.010" +r_sCurveToeDenominator "0.575" + +r_bloomBlurRadius "1.75" +r_bloomPersistence "0" +r_bloomTintWeights "0.25 0.5 0.25 0.0" +r_bloomColorScale "0.0 0.0 0.0 0.0" +r_bloomTintScale "0.0 0.0 0.0 1.0" +r_bloomCurveBreakpoint "1.0 1.0 1.0 1.0" +r_bloomCurveLoBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoGamma "1.0 1.0 1.0 1.0" +r_bloomCurveLoWhite "1.0 1.0 1.0 1.0" +r_bloomCurveLoRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoRemapWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiGamma "1.0 1.0 1.0 1.0" +r_bloomCurveHiWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiRemapWhite "1.0 1.0 1.0 1.0" +r_bloomExpansionControl "0.5 0.5 0.5 0.5" +r_bloomExpansionWeights "0.0 0.0 0.0 0.0" +r_bloomExpansionSource "0" + +r_bloomStreakXLevels0 "0.25 0.5 0.25 1.0" +r_bloomStreakXLevels1 "0.0 1.0 0.0 1.0" +r_bloomStreakXInnerTint "1.0 1.0 1.0" +r_bloomStreakXOuterTint "1.0 1.0 1.0" +r_bloomStreakXTintControl "0.25 0.5 0.25 1.0" +r_bloomStreakXTint "0.0 0.0 0.0" + +r_bloomStreakYLevels0 "0.25 0.5 0.25 1.0" +r_bloomStreakYLevels1 "0.0 1.0 0.0 1.0" +r_bloomStreakYInnerTint "1.0 1.0 1.0" +r_bloomStreakYOuterTint "1.0 1.0 1.0" +r_bloomStreakYTintControl "0.25 0.5 0.25 1.0" +r_bloomStreakYTint "0.0 0.0 0.0" + + + +r_reviveFX_Enable "0" + + +r_postEmissiveBrightening "0.5" diff --git a/BO1/PC/ZM/vision/cheat_bw.vision b/BO1/PC/ZM/vision/cheat_bw.vision new file mode 100644 index 0000000..f81cb47 --- /dev/null +++ b/BO1/PC/ZM/vision/cheat_bw.vision @@ -0,0 +1,25 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "0 0 0" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/cheat_bw_invert.vision b/BO1/PC/ZM/vision/cheat_bw_invert.vision new file mode 100644 index 0000000..de487ce --- /dev/null +++ b/BO1/PC/ZM/vision/cheat_bw_invert.vision @@ -0,0 +1,25 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/cheat_bw_invert_contrast.vision b/BO1/PC/ZM/vision/cheat_bw_invert_contrast.vision new file mode 100644 index 0000000..de487ce --- /dev/null +++ b/BO1/PC/ZM/vision/cheat_bw_invert_contrast.vision @@ -0,0 +1,25 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/cheat_contrast.vision b/BO1/PC/ZM/vision/cheat_contrast.vision new file mode 100644 index 0000000..320f36c --- /dev/null +++ b/BO1/PC/ZM/vision/cheat_contrast.vision @@ -0,0 +1,17 @@ +r_glow "0" +r_glowRadius0 "7" +r_glowRadius1 "7" +r_glowBloomCutoff "0.99" +r_glowBloomDesaturation "0.65" +r_glowBloomIntensity0 "0.36" +r_glowBloomIntensity1 "0.36" +r_glowSkyBleedIntensity0 "0.29" +r_glowSkyBleedIntensity1 "0.29" + +r_filmEnable "1" +r_filmContrast "3.2" +r_filmBrightness ".5" +r_filmDesaturation "0" +r_filmInvert "0" +r_filmLightTint "1 1 1" +r_filmDarkTint "1 1 1" diff --git a/BO1/PC/ZM/vision/cheat_invert_contrast.vision b/BO1/PC/ZM/vision/cheat_invert_contrast.vision new file mode 100644 index 0000000..0468465 --- /dev/null +++ b/BO1/PC/ZM/vision/cheat_invert_contrast.vision @@ -0,0 +1,17 @@ +r_glow "0" +r_glowRadius0 "7" +r_glowRadius1 "7" +r_glowBloomCutoff "0.99" +r_glowBloomDesaturation "0.65" +r_glowBloomIntensity0 "0.36" +r_glowBloomIntensity1 "0.36" +r_glowSkyBleedIntensity0 "0.29" +r_glowSkyBleedIntensity1 "0.29" + +r_filmEnable "1" +r_filmContrast "3" +r_filmBrightness "1" +r_filmDesaturation "0" +r_filmInvert "1" +r_filmLightTint "1 1 1" +r_filmDarkTint "1 1 1" diff --git a/BO1/PC/ZM/vision/concussion_grenade.vision b/BO1/PC/ZM/vision/concussion_grenade.vision new file mode 100644 index 0000000..1e4e1ed --- /dev/null +++ b/BO1/PC/ZM/vision/concussion_grenade.vision @@ -0,0 +1,44 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmBleach "0 0 0" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "2 2 2" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + +r_bloomBlurRadius "1.75" +r_bloomTintWeights "0.25 0.5 0.25 0.0" +r_bloomColorScale "0.0 0.0 0.0 0.0" +r_bloomTintScale "0.5 0.5 0.5 1.0" +r_bloomCurveBreakpoint "1.0 1.0 1.0 1.0" +r_bloomCurveLoBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoGamma "1.0 1.0 1.0 1.0" +r_bloomCurveLoWhite "1.0 1.0 1.0 1.0" +r_bloomCurveLoRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoRemapWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiGamma "1.0 1.0 1.0 1.0" +r_bloomCurveHiWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiRemapWhite "1.0 1.0 1.0 1.0" +r_bloomExpansionControl "0.5 0.5 0.5 0.5" +r_bloomExpansionWeights "0.0 0.0 0.0 0.0" +r_bloomExpansionSource "0" + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/creek_1.vision b/BO1/PC/ZM/vision/creek_1.vision new file mode 100644 index 0000000..9a121de --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.210500" +r_filmMidEnd "0.315750" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.900000" +r_filmColorTemp "6484.1797 7057.7139 5828.1904" +r_filmSaturation "0.8561 0.8351 0.6596" +r_filmDarkTint "1.1576 1.0101 1.0101" +r_filmMidTint "1.0104 1.0104 0.9639" +r_filmLightTint "1.1151 1.0941 1.0941" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0625 1.0625 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.144731" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.3510 0.3790 0.3790 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.4000 0.4000 0.4000 1.0000" +r_bloomCurveLoGamma "0.6551 0.4817 0.3769 1.0000" +r_bloomCurveHiGamma "1.0022 1.0022 1.0022 1.0000" +r_bloomExpansionControl "0.7853 0.2958 0.5989 0.5232" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.000000" +r_primaryLightTweakSpecularStrength "1.683750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.1263 0.1263 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0000 0.0842 0.0702" + diff --git a/BO1/PC/ZM/vision/creek_1_ambush_path.vision b/BO1/PC/ZM/vision/creek_1_ambush_path.vision new file mode 100644 index 0000000..ae18418 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_ambush_path.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.392969" +r_filmMidEnd "0.614000" +r_filmDarkFeather "0.512250" +r_filmLightFeather "0.800000" +r_filmColorTemp "6975.2593 6975.2593 6484.1797" +r_filmSaturation "0.9122 0.8141 0.7789" +r_filmDarkTint "1.0524 0.9996 0.9996" +r_filmMidTint "1.0734 1.1156 1.0941" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.1087 1.1087 1.1087" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.4070 0.3930 0.3930 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.8316 0.8316 0.8316 1.0000" +r_bloomCurveLoGamma "0.4817 0.5160 0.4125 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.1000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.3684 0.1632 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.578750" +r_primaryLightTweakSpecularStrength "1.859688" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0877 0.0877 0.0877 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0281 0.0702 0.0772" + diff --git a/BO1/PC/ZM/vision/creek_1_dark.vision b/BO1/PC/ZM/vision/creek_1_dark.vision new file mode 100644 index 0000000..7b43787 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_dark.vision @@ -0,0 +1,45 @@ + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmBleach "0 0 0" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.1" +r_sCurveLinearStrength "0.5" +r_sCurveLinearAngle "0.125" +r_sCurveToeStrength "0.110" +r_sCurveToeNumerator "0.010" +r_sCurveToeDenominator "0.575" + +r_bloomBlurRadius "1.75" +r_bloomTintWeights "0.25 0.5 0.25 0.0" +r_bloomColorScale "0.0 0.0 0.0 0.0" +r_bloomTintScale "0.0 0.0 0.0 1.0" +r_bloomCurveBreakpoint "1.0 1.0 1.0 1.0" +r_bloomCurveLoBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoGamma "1.0 1.0 1.0 1.0" +r_bloomCurveLoWhite "1.0 1.0 1.0 1.0" +r_bloomCurveLoRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoRemapWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiGamma "1.0 1.0 1.0 1.0" +r_bloomCurveHiWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiRemapWhite "1.0 1.0 1.0 1.0" +r_bloomExpansionControl "0.5 0.5 0.5 0.5" +r_bloomExpansionWeights "0.0 0.0 0.0 0.0" +r_bloomExpansionSource "0" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/creek_1_helicopter.vision b/BO1/PC/ZM/vision/creek_1_helicopter.vision new file mode 100644 index 0000000..3a538ca --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_helicopter.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.092000" +r_filmMidEnd "0.156000" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.9122 0.7930 0.7088" +r_filmDarkTint "0.6098 0.6098 0.6098" +r_filmMidTint "0.8256 0.8211 0.7266" +r_filmLightTint "1.1136 1.0733 0.9711" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0625 1.0625 1.0000" + +r_sCurveShoulderStrength "0.035094" +r_sCurveLinearStrength "0.368375" +r_sCurveLinearAngle "0.143875" +r_sCurveToeStrength "0.411121" +r_sCurveToeNumerator "0.010516" +r_sCurveToeDenominator "0.193776" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.1684 0.2808 0.3509 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.4000 0.4000 0.4000 1.0000" +r_bloomCurveLoGamma "0.5160 0.5160 0.5160 1.0000" +r_bloomCurveHiGamma "1.0022 1.0022 1.0022 1.0000" +r_bloomExpansionControl "0.7853 0.2958 0.5989 0.5232" +r_bloomExpansionWeights "0.2926 0.1853 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.245625" +r_primaryLightTweakSpecularStrength "1.508750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.2482 0.4983 0.2482 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0351 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/creek_1_helicopter_start.vision b/BO1/PC/ZM/vision/creek_1_helicopter_start.vision new file mode 100644 index 0000000..9e23e9f --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_helicopter_start.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.092000" +r_filmMidEnd "0.156000" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.9122 0.7930 0.7088" +r_filmDarkTint "0.6098 0.6098 0.6098" +r_filmMidTint "0.8256 0.8211 0.7266" +r_filmLightTint "1.1136 1.0733 0.9711" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0625 1.0625 1.0000" + +r_sCurveShoulderStrength "0.035094" +r_sCurveLinearStrength "0.368375" +r_sCurveLinearAngle "0.143875" +r_sCurveToeStrength "0.411121" +r_sCurveToeNumerator "0.010516" +r_sCurveToeDenominator "0.193776" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.4773 0.4773 0.5474 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.4000 0.4000 0.4000 1.0000" +r_bloomCurveLoGamma "0.5160 0.6205 0.5160 1.0000" +r_bloomCurveHiGamma "1.0022 1.0022 1.0022 1.0000" +r_bloomExpansionControl "0.7853 0.2958 0.5989 0.5232" +r_bloomExpansionWeights "0.2042 0.1284 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "3.052500" +r_primaryLightTweakSpecularStrength "3.543750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0561 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/creek_1_helicopter_water.vision b/BO1/PC/ZM/vision/creek_1_helicopter_water.vision new file mode 100644 index 0000000..ca36017 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_helicopter_water.vision @@ -0,0 +1,92 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_edgeColorTemp "6500" +r_reviveFX_edgeSaturation "1.3" +r_reviveFX_edgeScale "0.65 0.65 0.65" +r_reviveFX_edgeContrast "1.62 1.62 1.62" +r_reviveFX_edgeOffset "-0.72 -0.72 -0.72" +r_reviveFX_edgeMaskAdjust "-0.63" +r_reviveFX_edgeAmount "0.56" + +/* + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "2.5" +r_reviveFX_brightnessEdge "0.23" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "6.4" +r_reviveFX_motionblurWeight "1" +r_reviveFX_contrastCenter "1.9" +r_reviveFX_brightnessCenter "0.157" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +*/ + + +r_filmMidStart "0.221000" +r_filmMidEnd "0.294750" +r_filmDarkFeather "0.077188" +r_filmLightFeather "0.500000" +r_filmColorTemp "6074.0957 6401.7251 5582.2861" +r_filmSaturation "0.7088 0.5895 0.6246" +r_filmDarkTint "0.9893 0.9261 0.9053" +r_filmMidTint "1.1571 0.9473 0.8211" +r_filmLightTint "0.9996 0.9473 0.8001" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0104 1.0104 1.0104" + +r_sCurveShoulderStrength "0.256125" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.333948" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.4421 0.4421 0.4421 1.0000" +r_bloomCurveLoGamma "0.6205 0.5843 0.5840 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.4221 0.3200 0.4568" +r_bloomExpansionWeights "0.2169 0.2263 0.1632 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "0.000000" +r_primaryLightTweakSpecularStrength "0.491250" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.0000 0.0000 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/creek_1_helicopter_water_exit.vision b/BO1/PC/ZM/vision/creek_1_helicopter_water_exit.vision new file mode 100644 index 0000000..ca36017 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_helicopter_water_exit.vision @@ -0,0 +1,92 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_edgeColorTemp "6500" +r_reviveFX_edgeSaturation "1.3" +r_reviveFX_edgeScale "0.65 0.65 0.65" +r_reviveFX_edgeContrast "1.62 1.62 1.62" +r_reviveFX_edgeOffset "-0.72 -0.72 -0.72" +r_reviveFX_edgeMaskAdjust "-0.63" +r_reviveFX_edgeAmount "0.56" + +/* + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "2.5" +r_reviveFX_brightnessEdge "0.23" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "6.4" +r_reviveFX_motionblurWeight "1" +r_reviveFX_contrastCenter "1.9" +r_reviveFX_brightnessCenter "0.157" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +*/ + + +r_filmMidStart "0.221000" +r_filmMidEnd "0.294750" +r_filmDarkFeather "0.077188" +r_filmLightFeather "0.500000" +r_filmColorTemp "6074.0957 6401.7251 5582.2861" +r_filmSaturation "0.7088 0.5895 0.6246" +r_filmDarkTint "0.9893 0.9261 0.9053" +r_filmMidTint "1.1571 0.9473 0.8211" +r_filmLightTint "0.9996 0.9473 0.8001" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0104 1.0104 1.0104" + +r_sCurveShoulderStrength "0.256125" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.333948" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.4421 0.4421 0.4421 1.0000" +r_bloomCurveLoGamma "0.6205 0.5843 0.5840 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.4221 0.3200 0.4568" +r_bloomExpansionWeights "0.2169 0.2263 0.1632 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "0.000000" +r_primaryLightTweakSpecularStrength "0.491250" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.0000 0.0000 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/creek_1_interior.vision b/BO1/PC/ZM/vision/creek_1_interior.vision new file mode 100644 index 0000000..c90b9d2 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_interior.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.9684 0.9053 0.8070" +r_filmDarkTint "0.9999 0.9999 0.9999" +r_filmMidTint "0.9999 0.9999 0.9999" +r_filmLightTint "0.9999 0.9999 0.9999" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.245625" +r_primaryLightTweakSpecularStrength "1.508750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.2482 0.4983 0.2482 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0561 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/creek_1_rain.vision b/BO1/PC/ZM/vision/creek_1_rain.vision new file mode 100644 index 0000000..836b9b0 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_rain.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.210500" +r_filmMidEnd "0.315750" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.900000" +r_filmColorTemp "6484.1797 7876.4233 6320.0000" +r_filmSaturation "0.8561 0.8351 0.6596" +r_filmDarkTint "1.1572 1.0101 1.0101" +r_filmMidTint "1.0101 1.0101 0.9638" +r_filmLightTint "1.1151 1.0941 1.0941" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0625 1.0625 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.144700" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.3510 0.4070 0.3790 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.6281 0.6281 0.6281 1.0000" +r_bloomCurveLoGamma "0.5855 0.5509 0.3763 1.0000" +r_bloomCurveHiGamma "1.0022 1.0022 1.0022 1.0000" +r_bloomExpansionControl "0.7853 0.2958 0.5989 0.5232" +r_bloomExpansionWeights "0.2958 0.1000 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.455938" +r_primaryLightTweakSpecularStrength "2.280625" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.1018 0.1018 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0632 0.0632 0.0632" + diff --git a/BO1/PC/ZM/vision/creek_1_tunnel.vision b/BO1/PC/ZM/vision/creek_1_tunnel.vision new file mode 100644 index 0000000..b7a2904 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_tunnel.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.192969" +r_filmMidEnd "0.642094" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.887719" +r_filmColorTemp "6565.9048 6565.9048 6565.9048" +r_filmSaturation "0.9053 0.7789 0.5895" +r_filmDarkTint "0.9474 0.9996 0.9996" +r_filmMidTint "0.9261 0.9893 0.9996" +r_filmLightTint "0.9996 0.9996 0.9262" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.228772" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.2805 0.2525 0.2525 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.6554 0.8634 0.7929 1.0000" +r_bloomCurveHiGamma "1.0022 0.9660 1.0022 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.2011 0.1600 0.1600 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.543750" +r_primaryLightTweakSpecularStrength "1.473750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.1193 0.1193 0.1193 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 0.6421" +r_bloomStreakYTint "0.0772 0.0421 0.0421" + diff --git a/BO1/PC/ZM/vision/creek_1_tunnel_cave_light_end.vision b/BO1/PC/ZM/vision/creek_1_tunnel_cave_light_end.vision new file mode 100644 index 0000000..b08e38d --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_tunnel_cave_light_end.vision @@ -0,0 +1,65 @@ + + +r_filmEnable "1" + +r_sCurveEnable "1" + + +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.515750" +r_filmLightFeather "0.491219" +r_filmColorTemp "6565.9048 6565.9048 6565.9048" +r_filmSaturation "1.4300 1.4300 1.4300" +r_filmDarkTint "0.9683 1.0200 1.0200" +r_filmMidTint "0.9900 0.9900 0.9900" +r_filmLightTint "1.6699 1.6699 1.6628" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.3790 0.4773 0.4353 1.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.7900 0.9600 0.9600 0.9600" +r_bloomCurveLoGamma "0.8980 0.7942 0.7942 0.6693" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.6463 0.1000 1.0000 0.4379" +r_bloomExpansionWeights "0.4126 0.2263 0.2484 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.500000" +r_bloomPersistence "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.3719 0.4236 0.4692 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "0.1895 1.0000 0.7193" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.2386 0.2386 0.2386" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/creek_1_tunnel_cliffhanger.vision b/BO1/PC/ZM/vision/creek_1_tunnel_cliffhanger.vision new file mode 100644 index 0000000..80202f7 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_tunnel_cliffhanger.vision @@ -0,0 +1,83 @@ +/* + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "2.3" +r_reviveFX_brightnessEdge "0.26" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "6.4" +r_reviveFX_motionblurWeight "1" +r_reviveFX_contrastCenter "1.1" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +*/ + +r_filmEnable "1" + +r_sCurveEnable "1" + + +r_filmMidStart "0.287719" +r_filmMidEnd "0.700000" +r_filmDarkFeather "0.700000" +r_filmLightFeather "0.700000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.8913 0.8070 0.6948" +r_filmDarkTint "1.0526 0.9053 0.9999" +r_filmMidTint "0.9684 0.9474 1.0104" +r_filmLightTint "0.9999 0.9999 0.9999" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.164906" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.141203" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.2386 0.2526 0.1825 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.1368 0.1368 0.1368 1.0000" +r_bloomCurveLoGamma "0.5858 1.0717 0.6205 1.0000" +r_bloomCurveHiGamma "1.3480 1.3480 1.3480 1.0000" +r_bloomExpansionControl "0.7032 0.4726 0.5989 0.5232" +r_bloomExpansionWeights "0.1158 0.1000 0.1095 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "3.333437" +r_primaryLightTweakSpecularStrength "1.508750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.1588 0.4088 0.2246 0.4125" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0913 0.0913 0.0913" + diff --git a/BO1/PC/ZM/vision/creek_1_tunnel_collapse.vision b/BO1/PC/ZM/vision/creek_1_tunnel_collapse.vision new file mode 100644 index 0000000..d8ac22a --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_tunnel_collapse.vision @@ -0,0 +1,69 @@ + + + + + + + + +r_filmEnable "1" +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.070000" +r_filmLightFeather "0.040000" +r_filmColorTemp "6565.9048 6565.9048 6565.9048" +r_filmSaturation "1.4300 1.4300 1.4300" +r_filmDarkTint "1.0200 1.0200 1.0200" +r_filmMidTint "0.9900 0.9900 0.9900" +r_filmLightTint "1.6699 1.6699 1.6699" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "1.2000 1.2000 1.2000 1.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.7900 0.9600 0.9600 0.9600" +r_bloomCurveLoGamma "0.6699 0.6699 0.6699 0.6699" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.500000" +r_bloomPersistence "0.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/creek_1_tunnel_enter.vision b/BO1/PC/ZM/vision/creek_1_tunnel_enter.vision new file mode 100644 index 0000000..cafec46 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_tunnel_enter.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.000000" +r_filmLightFeather "0.000000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.6000 0.5052 0.3930" +r_filmDarkTint "0.7579 0.9683 0.9683" +r_filmMidTint "0.9997 0.9997 0.9997" +r_filmLightTint "0.9997 0.9997 0.9997" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.172766" +r_sCurveToeNumerator "0.007016" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1632 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.245625" +r_primaryLightTweakSpecularStrength "1.508750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0877 0.0877 0.0877 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.3298 0.2034 0.0842" + diff --git a/BO1/PC/ZM/vision/creek_1_tunnel_off.vision b/BO1/PC/ZM/vision/creek_1_tunnel_off.vision new file mode 100644 index 0000000..8c0e31b --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_tunnel_off.vision @@ -0,0 +1,43 @@ + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmBleach "0 0 0" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + +r_bloomBlurRadius "1.75" +r_bloomTintWeights "0.25 0.5 0.25 0.0" +r_bloomColorScale "0.0 0.0 0.0 0.0" +r_bloomTintScale "0.0 0.0 0.0 1.0" +r_bloomCurveBreakpoint "1.0 1.0 1.0 1.0" +r_bloomCurveLoBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoGamma "1.0 1.0 1.0 1.0" +r_bloomCurveLoWhite "1.0 1.0 1.0 1.0" +r_bloomCurveLoRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoRemapWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiGamma "1.0 1.0 1.0 1.0" +r_bloomCurveHiWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiRemapWhite "1.0 1.0 1.0 1.0" +r_bloomExpansionControl "0.5 0.5 0.5 0.5" +r_bloomExpansionWeights "0.0 0.0 0.0 0.0" +r_bloomExpansionSource "0" + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/creek_1_village.vision b/BO1/PC/ZM/vision/creek_1_village.vision new file mode 100644 index 0000000..ae18418 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_village.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.392969" +r_filmMidEnd "0.614000" +r_filmDarkFeather "0.512250" +r_filmLightFeather "0.800000" +r_filmColorTemp "6975.2593 6975.2593 6484.1797" +r_filmSaturation "0.9122 0.8141 0.7789" +r_filmDarkTint "1.0524 0.9996 0.9996" +r_filmMidTint "1.0734 1.1156 1.0941" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.1087 1.1087 1.1087" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.4070 0.3930 0.3930 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.8316 0.8316 0.8316 1.0000" +r_bloomCurveLoGamma "0.4817 0.5160 0.4125 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.1000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.3684 0.1632 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.578750" +r_primaryLightTweakSpecularStrength "1.859688" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0877 0.0877 0.0877 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0281 0.0702 0.0772" + diff --git a/BO1/PC/ZM/vision/creek_1_war_room.vision b/BO1/PC/ZM/vision/creek_1_war_room.vision new file mode 100644 index 0000000..19af656 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_war_room.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.112281" +r_filmMidEnd "0.305250" +r_filmDarkFeather "0.700000" +r_filmLightFeather "0.700000" +r_filmColorTemp "6893.5342 6893.5342 6893.5342" +r_filmSaturation "0.8701 0.6596 0.5193" +r_filmDarkTint "0.7369 0.6527 0.6527" +r_filmMidTint "0.9684 1.0104 1.0104" +r_filmLightTint "1.0080 0.9894 1.0738" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0029 1.0029 1.0105" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.144731" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.1474 0.1474 0.1474 0.0000" +r_bloomColorScale "0.2948 0.2948 0.3649 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.6702 0.6702 0.6702 1.0000" +r_bloomCurveLoGamma "0.2388 0.2388 0.2388 1.0000" +r_bloomCurveHiGamma "1.1403 1.1403 1.1403 1.0000" +r_bloomExpansionControl "0.7853 0.2958 0.5989 0.5232" +r_bloomExpansionWeights "0.1947 0.1947 0.1947 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.403438" +r_primaryLightTweakSpecularStrength "1.614063" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0912 0.0912 0.0912 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0000 0.0211 0.0632" + diff --git a/BO1/PC/ZM/vision/creek_1_water.vision b/BO1/PC/ZM/vision/creek_1_water.vision new file mode 100644 index 0000000..ca36017 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1_water.vision @@ -0,0 +1,92 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_edgeColorTemp "6500" +r_reviveFX_edgeSaturation "1.3" +r_reviveFX_edgeScale "0.65 0.65 0.65" +r_reviveFX_edgeContrast "1.62 1.62 1.62" +r_reviveFX_edgeOffset "-0.72 -0.72 -0.72" +r_reviveFX_edgeMaskAdjust "-0.63" +r_reviveFX_edgeAmount "0.56" + +/* + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "2.5" +r_reviveFX_brightnessEdge "0.23" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "6.4" +r_reviveFX_motionblurWeight "1" +r_reviveFX_contrastCenter "1.9" +r_reviveFX_brightnessCenter "0.157" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +*/ + + +r_filmMidStart "0.221000" +r_filmMidEnd "0.294750" +r_filmDarkFeather "0.077188" +r_filmLightFeather "0.500000" +r_filmColorTemp "6074.0957 6401.7251 5582.2861" +r_filmSaturation "0.7088 0.5895 0.6246" +r_filmDarkTint "0.9893 0.9261 0.9053" +r_filmMidTint "1.1571 0.9473 0.8211" +r_filmLightTint "0.9996 0.9473 0.8001" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0104 1.0104 1.0104" + +r_sCurveShoulderStrength "0.256125" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.333948" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.4421 0.4421 0.4421 1.0000" +r_bloomCurveLoGamma "0.6205 0.5843 0.5840 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.4221 0.3200 0.4568" +r_bloomExpansionWeights "0.2169 0.2263 0.1632 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "0.000000" +r_primaryLightTweakSpecularStrength "0.491250" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.0000 0.0000 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/creek_1b.vision b/BO1/PC/ZM/vision/creek_1b.vision new file mode 100644 index 0000000..a388dc9 --- /dev/null +++ b/BO1/PC/ZM/vision/creek_1b.vision @@ -0,0 +1,24 @@ + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/creek_drown.vision b/BO1/PC/ZM/vision/creek_drown.vision new file mode 100644 index 0000000..0d4b44c --- /dev/null +++ b/BO1/PC/ZM/vision/creek_drown.vision @@ -0,0 +1,38 @@ + + +r_filmEnable "0" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "1.6" +r_reviveFX_brightnessEdge "0.3" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "0.01 0.29 0.36" +r_reviveFX_lightTintEdge "0.01 0.29 0.36" +r_reviveFX_blurRadiusEdge "1.5" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "1.2" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/death.vision b/BO1/PC/ZM/vision/death.vision new file mode 100644 index 0000000..b5a924c --- /dev/null +++ b/BO1/PC/ZM/vision/death.vision @@ -0,0 +1,43 @@ + + +r_filmEnable "0" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "1.66" +r_reviveFX_brightnessEdge "0.264" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "0.85 0.95 0.94" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "20.0" +r_reviveFX_motionblurWeight "0.4" +r_reviveFX_contrastCenter "2.2" +r_reviveFX_brightnessCenter ".27" +r_reviveFX_desaturationCenter "0.71" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + + +snd_masterRingmod ".2" +snd_reverbRingmod "0.5" +snd_hiFilter "0" +snd_lowFilter "-20" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/default.vision b/BO1/PC/ZM/vision/default.vision new file mode 100644 index 0000000..3d7971e --- /dev/null +++ b/BO1/PC/ZM/vision/default.vision @@ -0,0 +1,63 @@ + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmBleach "0 0 0" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.1" +r_sCurveLinearStrength "0.5" +r_sCurveLinearAngle "0.125" +r_sCurveToeStrength "0.110" +r_sCurveToeNumerator "0.010" +r_sCurveToeDenominator "0.575" + +r_bloomBlurRadius "1.75" +r_bloomPersistence "0" +r_bloomTintWeights "0.25 0.5 0.25 0.0" +r_bloomColorScale "0.0 0.0 0.0 0.0" +r_bloomTintScale "0.0 0.0 0.0 1.0" +r_bloomCurveBreakpoint "1.0 1.0 1.0 1.0" +r_bloomCurveLoBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoGamma "1.0 1.0 1.0 1.0" +r_bloomCurveLoWhite "1.0 1.0 1.0 1.0" +r_bloomCurveLoRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoRemapWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiGamma "1.0 1.0 1.0 1.0" +r_bloomCurveHiWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiRemapWhite "1.0 1.0 1.0 1.0" +r_bloomExpansionControl "0.5 0.5 0.5 0.5" +r_bloomExpansionWeights "0.0 0.0 0.0 0.0" +r_bloomExpansionSource "0" + +r_bloomStreakXLevels0 "0.25 0.5 0.25 1.0" +r_bloomStreakXLevels1 "0.0 1.0 0.0 1.0" +r_bloomStreakXInnerTint "1.0 1.0 1.0" +r_bloomStreakXOuterTint "1.0 1.0 1.0" +r_bloomStreakXTintControl "0.25 0.5 0.25 1.0" +r_bloomStreakXTint "0.0 0.0 0.0" + +r_bloomStreakYLevels0 "0.25 0.5 0.25 1.0" +r_bloomStreakYLevels1 "0.0 1.0 0.0 1.0" +r_bloomStreakYInnerTint "1.0 1.0 1.0" +r_bloomStreakYOuterTint "1.0 1.0 1.0" +r_bloomStreakYTintControl "0.25 0.5 0.25 1.0" +r_bloomStreakYTint "0.0 0.0 0.0" + +r_primaryLightUseTweaks "1" +r_primaryLightTweakDiffuseStrength "1" +r_primaryLightTweakSpecularStrength "1" + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/default_night.vision b/BO1/PC/ZM/vision/default_night.vision new file mode 100644 index 0000000..de487ce --- /dev/null +++ b/BO1/PC/ZM/vision/default_night.vision @@ -0,0 +1,25 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/drown.vision b/BO1/PC/ZM/vision/drown.vision new file mode 100644 index 0000000..cc570e1 --- /dev/null +++ b/BO1/PC/ZM/vision/drown.vision @@ -0,0 +1,35 @@ +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "1" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge ".7" +r_reviveFX_lightTintEdge "1.67 1.50 0.81" +r_reviveFX_darkTintEdge "0.71 0.72 0.67" +r_reviveFX_blurRadiusEdge "3.5" +r_reviveFX_motionblurWeight "1" +r_reviveFX_contrastCenter ".5" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0.6" +r_reviveFX_lightTintCenter "1.67 1.50 0.81" +r_reviveFX_darkTintCenter "0.71 0.72 0.67" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/flare.vision b/BO1/PC/ZM/vision/flare.vision new file mode 100644 index 0000000..a710289 --- /dev/null +++ b/BO1/PC/ZM/vision/flare.vision @@ -0,0 +1,37 @@ + + +r_filmEnable "1" +r_filmMidStart "0.5" +r_filmMidEnd "0.5" +r_filmDarkFeather "1" +r_filmLightFeather "1" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1.33 0.75 0.8" +r_filmMidTint "1.505 0.65 0.515" +r_filmLightTint "1.68 0.55 0.23" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/flash_grenade.vision b/BO1/PC/ZM/vision/flash_grenade.vision new file mode 100644 index 0000000..8339e77 --- /dev/null +++ b/BO1/PC/ZM/vision/flash_grenade.vision @@ -0,0 +1,44 @@ + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmBleach "0 0 0" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + +r_bloomBlurRadius "1.75" +r_bloomTintWeights "0.25 0.5 0.25 0.0" +r_bloomColorScale "0.0 0.0 0.0 0.0" +r_bloomTintScale "32 32 32 1.0000" +r_bloomCurveBreakpoint "1.0 1.0 1.0 1.0" +r_bloomCurveLoBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoGamma "1.0 1.0 1.0 1.0" +r_bloomCurveLoWhite "1.0 1.0 1.0 1.0" +r_bloomCurveLoRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveLoRemapWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiGamma "1.0 1.0 1.0 1.0" +r_bloomCurveHiWhite "1.0 1.0 1.0 1.0" +r_bloomCurveHiRemapBlack "0.0 0.0 0.0 0.0" +r_bloomCurveHiRemapWhite "1.0 1.0 1.0 1.0" +r_bloomExpansionControl "0.5 0.5 0.5 0.5" +r_bloomExpansionWeights "0.0 0.0 0.0 0.0" +r_bloomExpansionSource "0" + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/flashpoint.vision b/BO1/PC/ZM/vision/flashpoint.vision new file mode 100644 index 0000000..36c4df9 --- /dev/null +++ b/BO1/PC/ZM/vision/flashpoint.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6320.0000 6320.0000 6320.0000" +r_filmSaturation "0.8491 0.7509 0.6667" +r_filmDarkTint "1.0944 0.9996 0.9996" +r_filmMidTint "1.0523 0.9996 0.9996" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.133344" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.141141" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.1404 0.1404 0.1404 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.8246 0.8246 0.8246 1.0000" +r_bloomCurveLoGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.561250" +r_primaryLightTweakSpecularStrength "3.543750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0456 0.0456 0.0456 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0000 0.0421 0.2526" + diff --git a/BO1/PC/ZM/vision/huey_city.vision b/BO1/PC/ZM/vision/huey_city.vision new file mode 100644 index 0000000..6c040db --- /dev/null +++ b/BO1/PC/ZM/vision/huey_city.vision @@ -0,0 +1,25 @@ + + +r_filmEnable "1" +r_filmMidStart "0.272" +r_filmMidEnd "0.324" +r_filmDarkFeather "0.587" +r_filmLightFeather "0.73" +r_filmColorTemp "6599 6924 5430" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "0.88 0.88 0.88"" +r_filmMidTint "1.1374 1.14 1.258" +r_filmLightTint "1.14063 1.14063 1.14063" +r_filmContrast "1.0625 1.0625 1.0625" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/in_country.vision b/BO1/PC/ZM/vision/in_country.vision new file mode 100644 index 0000000..2b7398e --- /dev/null +++ b/BO1/PC/ZM/vision/in_country.vision @@ -0,0 +1,27 @@ + + + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/infrared.vision b/BO1/PC/ZM/vision/infrared.vision new file mode 100644 index 0000000..09e646b --- /dev/null +++ b/BO1/PC/ZM/vision/infrared.vision @@ -0,0 +1,54 @@ +r_postEmissiveBrightening "0.1" + +r_bloomTweaks "1" + +r_filmEnable "1" + +r_sCurveEnable "1" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.800000" +r_filmDarkFeather "0.000000" +r_filmLightFeather "0.000000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.0000 0.0000 0.0000" +r_filmDarkTint "0.1500 0.1500 0.1500" +r_filmMidTint "0.3499 0.3499 0.3499" +r_filmLightTint "0.4999 0.4999 0.4999" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.032000" +r_sCurveLinearStrength "0.074000" +r_sCurveLinearAngle "0.179000" +r_sCurveToeStrength "0.095999" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "1.000000" + +r_bloomTintWeights "0.1500 0.1500 0.1500 0.1500" +r_bloomColorScale "0.0000 0.0000 0.0000 1.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 0.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.5500 0.5500 0.5500 0.5500" +r_bloomCurveHiGamma "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionControl "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + + + + +r_reviveFX_Enable "0" \ No newline at end of file diff --git a/BO1/PC/ZM/vision/infrared_snow.vision b/BO1/PC/ZM/vision/infrared_snow.vision new file mode 100644 index 0000000..ef41073 --- /dev/null +++ b/BO1/PC/ZM/vision/infrared_snow.vision @@ -0,0 +1,72 @@ + +r_postEmissiveBrightening "0.1" + +r_bloomTweaks "1" + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.800000" +r_filmDarkFeather "0.000000" +r_filmLightFeather "0.000000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.0000 0.0000 0.0000" +r_filmDarkTint "1.0948 1.0948 1.0948" +r_filmMidTint "1.0526 1.0526 1.0526" +r_filmLightTint "1.0948 1.0948 1.0948" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0526 1.0526 1.0526" + +r_sCurveShoulderStrength "0.017531" +r_sCurveLinearStrength "0.017531" +r_sCurveLinearAngle "0.031594" +r_sCurveToeStrength "0.540803" +r_sCurveToeNumerator "0.014914" +r_sCurveToeDenominator "1.000000" + +r_bloomTintWeights "0.1860 0.1860 0.1860 0.1439" +r_bloomColorScale "0.0000 0.0000 0.0000 1.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 0.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.5163 0.5163 0.5163 0.5512" +r_bloomCurveHiGamma "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionControl "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.000000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.000000" +r_primaryLightTweakSpecularStrength "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/int_frontend_char_trans.vision b/BO1/PC/ZM/vision/int_frontend_char_trans.vision new file mode 100644 index 0000000..6624bb7 --- /dev/null +++ b/BO1/PC/ZM/vision/int_frontend_char_trans.vision @@ -0,0 +1,66 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.700000" +r_filmDarkFeather "1.000000" +r_filmLightFeather "1.000000" +r_filmColorTemp "5664.0107 5664.0107 5664.0107" +r_filmSaturation "1.0000 0.3509 0.0000" +r_filmDarkTint "0.6737 1.0101 1.0101" +r_filmMidTint "0.9893 1.0523 1.0101" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.094750" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.709010" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.9754 0.9825 0.9754 1.0000" +r_bloomColorScale "3.6772 3.6772 3.6772 0.0000" +r_bloomTintScale "1.9509 3.4665 3.9719 0.1298" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 0.4105" +r_bloomCurveLoGamma "3.0151 3.0151 3.0151 0.9323" +r_bloomCurveHiGamma "0.1000 0.1000 0.1000 3.0497" +r_bloomExpansionControl "0.7789 0.4947 1.0000 0.5705" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 1.0000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "2.564938" +r_bloomPersistence "0.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.7465 0.9965 0.7465 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "2.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.0000 0.0000 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "1.7895 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/interrogation_escape.vision b/BO1/PC/ZM/vision/interrogation_escape.vision new file mode 100644 index 0000000..9f5e1ee --- /dev/null +++ b/BO1/PC/ZM/vision/interrogation_escape.vision @@ -0,0 +1,38 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "1" +r_reviveFX_brightnessEdge "1" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "1" +r_reviveFX_motionblurWeight "1" + +r_reviveFX_contrastCenter "1" +r_reviveFX_brightnessCenter "1" +r_reviveFX_desaturationCenter "1" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/khe_sanh.vision b/BO1/PC/ZM/vision/khe_sanh.vision new file mode 100644 index 0000000..3db495c --- /dev/null +++ b/BO1/PC/ZM/vision/khe_sanh.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.000000" +r_filmLightFeather "0.214000" +r_filmColorTemp "5499.1016 5499.1016 5499.1016" +r_filmSaturation "0.8211 0.7509 0.6737" +r_filmDarkTint "1.1151 1.1151 1.1151" +r_filmMidTint "1.1151 1.1151 1.1164" +r_filmLightTint "1.0733 1.0733 1.0733" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0176 1.0526 1.0176" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.157875" +r_sCurveToeStrength "0.102586" +r_sCurveToeNumerator "0.018422" +r_sCurveToeDenominator "0.670455" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.5403" +r_bloomColorScale "2.3720 2.7649 2.7649 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 0.3474" +r_bloomCurveBreakpoint "0.3719 0.3719 0.3719 1.0000" +r_bloomCurveLoGamma "0.4817 0.4817 0.4817 1.0000" +r_bloomCurveHiGamma "0.5840 0.5840 0.5840 1.0000" +r_bloomExpansionControl "0.2516 0.3337 0.7063 0.4158" +r_bloomExpansionWeights "0.9463 0.9463 0.9463 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.631250" +r_primaryLightTweakSpecularStrength "1.500000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/laststand.vision b/BO1/PC/ZM/vision/laststand.vision new file mode 100644 index 0000000..d16e6b6 --- /dev/null +++ b/BO1/PC/ZM/vision/laststand.vision @@ -0,0 +1,45 @@ +// "0" +//Radius0 "7" +//Radius1 "7" +//BloomCutoff "0.99" +//BloomDesaturation "0.65" +//BloomIntensity0 "0.36" +//BloomIntensity1 "0.36" +//SkyBleedIntensity0 "0.29" +//SkyBleedIntensity1 "0.29" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "1.6" +r_reviveFX_brightnessEdge "0.34" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "0.93 0.94 0.95" +r_reviveFX_lightTintEdge "1 1.03 1.02" +r_reviveFX_blurRadiusEdge "3.5" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "1.76" +r_reviveFX_brightnessCenter "0.234" +r_reviveFX_desaturationCenter "0.845" +r_reviveFX_darkTintCenter "0.978 1.01 0.975" +r_reviveFX_lightTintCenter "1.02 1 0.99" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/low_health.vision b/BO1/PC/ZM/vision/low_health.vision new file mode 100644 index 0000000..958d59e --- /dev/null +++ b/BO1/PC/ZM/vision/low_health.vision @@ -0,0 +1,49 @@ +// "1" +//Radius0 "9.09" +//Radius1 "1.5" +//BloomCutoff "0.25" +//BloomDesaturation "0" +//BloomIntensity0 "1.00" +//BloomIntensity1 "2.0" +//SkyBleedIntensity0 "0.29" +//SkyBleedIntensity1 "0.29" +//RayExpansion "1.15" +//RayIntensity "0.825" + +r_filmEnable "1" +r_filmMidStart "0.317" +r_filmMidEnd "0.144" +r_filmDarkFeather "0.6" +r_filmLightFeather "0.565" +r_filmColorTemp "5485 5462 5469" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "1" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "10" +r_reviveFX_motionblurWeight "1" + +r_reviveFX_contrastCenter "1" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0.5" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/mp_array.vision b/BO1/PC/ZM/vision/mp_array.vision new file mode 100644 index 0000000..b85d7c2 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_array.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.8913 0.7859 0.6807" +r_filmDarkTint "0.9996 0.9996 0.9996" +r_filmMidTint "0.9996 0.9996 0.9996" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.0280 0.0280 0.0280 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "1.0022 1.0022 1.0022 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.1000 0.5000 1.0000" +r_bloomExpansionWeights "0.2610 0.1000 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.420938" +r_primaryLightTweakSpecularStrength "1.333438" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0070 0.0070 0.0070 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.1544 0.4000 0.4000" + diff --git a/BO1/PC/ZM/vision/mp_berlinwall.vision b/BO1/PC/ZM/vision/mp_berlinwall.vision new file mode 100644 index 0000000..e0fd7c0 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_berlinwall.vision @@ -0,0 +1,38 @@ +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1.25 1.25 1.25" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + +r_primaryLightUseTweaks "1" +r_primaryLightTweakDiffuseStrength "1.2" +r_primaryLightTweakSpecularStrength "1.5" \ No newline at end of file diff --git a/BO1/PC/ZM/vision/mp_cairo.vision b/BO1/PC/ZM/vision/mp_cairo.vision new file mode 100644 index 0000000..b66c4e6 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_cairo.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.428000" +r_filmMidEnd "0.645625" +r_filmDarkFeather "0.800000" +r_filmLightFeather "0.800000" +r_filmColorTemp "6565.9048 6484.1797 6484.1797" +r_filmSaturation "0.8491 0.8141 0.5404" +r_filmDarkTint "0.9893 1.0523 0.9261" +r_filmMidTint "1.0104 0.9996 0.9683" +r_filmLightTint "0.9996 0.9996 1.0104" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.141203" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.3370 0.2808 0.2808 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.3775 0.3775 0.3775 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.683750" +r_primaryLightTweakSpecularStrength "0.841875" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0491 0.0491 0.0491 0.6205" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.1053 0.1053 0.2316" + diff --git a/BO1/PC/ZM/vision/mp_cosmodrome.vision b/BO1/PC/ZM/vision/mp_cosmodrome.vision new file mode 100644 index 0000000..5312ad7 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_cosmodrome.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.410500" +r_filmMidEnd "0.680625" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.8561 0.7614 0.6982" +r_filmDarkTint "1.0313 1.0313 1.0313" +r_filmMidTint "1.0101 0.9683 0.9366" +r_filmLightTint "0.9996 0.9996 1.0101" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.143875" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.127155" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.8420 1.0669 1.2490 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.2734 0.2734 0.2734 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5074 0.5000 0.5326 0.1032" +r_bloomExpansionWeights "0.1284 0.1032 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.456250" +r_primaryLightTweakSpecularStrength "1.859688" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0246 0.0246 0.0246 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.1754 0.0561 0.0000" + diff --git a/BO1/PC/ZM/vision/mp_cracked.vision b/BO1/PC/ZM/vision/mp_cracked.vision new file mode 100644 index 0000000..9c3ce2d --- /dev/null +++ b/BO1/PC/ZM/vision/mp_cracked.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.410500" +r_filmMidEnd "0.680625" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.9298 0.8351 0.7088" +r_filmDarkTint "1.0313 1.0313 1.0313" +r_filmMidTint "1.0101 1.0101 0.9366" +r_filmLightTint "0.9996 0.9996 1.0101" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.073688" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.0983 0.0983 0.0983 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.6386 0.6386 0.6386 1.0000" +r_bloomCurveLoGamma "0.3420 0.3420 0.3420 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.4947 0.5000 0.4979 0.1032" +r_bloomExpansionWeights "0.2484 0.3211 0.2768 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.035000" +r_primaryLightTweakSpecularStrength "1.965000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0211 0.0211 0.0211 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.2176 0.0561 0.0000" + diff --git a/BO1/PC/ZM/vision/mp_crisis.vision b/BO1/PC/ZM/vision/mp_crisis.vision new file mode 100644 index 0000000..6fac1a5 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_crisis.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.126281" +r_filmMidEnd "0.249125" +r_filmDarkFeather "0.642094" +r_filmLightFeather "0.652625" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.8491 0.7402 0.6736" +r_filmDarkTint "1.0733 0.9893 0.9893" +r_filmMidTint "0.9683 1.0101 0.9683" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.176262" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.2385 0.2245 0.2243 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.2734 0.2734 0.2734 1.0000" +r_bloomCurveHiGamma "0.1022 0.1000 0.1000 1.0000" +r_bloomExpansionControl "0.5042 0.1000 0.4979 0.1000" +r_bloomExpansionWeights "0.1789 0.1821 0.1789 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.200000" +r_primaryLightTweakSpecularStrength "1.500000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0632 0.1158 0.1158 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "0.0000 0.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.1123 0.0702 0.0632" + diff --git a/BO1/PC/ZM/vision/mp_discovery.vision b/BO1/PC/ZM/vision/mp_discovery.vision new file mode 100644 index 0000000..85609e2 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_discovery.vision @@ -0,0 +1,45 @@ +// "1" +//Radius0 "6.02" +//Radius1 "0" +//BloomCutoff "0.332" +//BloomDesaturation "0" +//BloomIntensity0 "0.98" +//BloomIntensity1 "0" +//SkyBleedIntensity0 "0" +//SkyBleedIntensity1 "0" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/mp_duga.vision b/BO1/PC/ZM/vision/mp_duga.vision new file mode 100644 index 0000000..acbdf76 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_duga.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.245625" +r_filmMidEnd "0.515781" +r_filmDarkFeather "0.800000" +r_filmLightFeather "0.800000" +r_filmColorTemp "6647.6299 6811.0796 6565.9048" +r_filmSaturation "0.9122 0.8632 0.7719" +r_filmDarkTint "1.1790 0.9996 0.9996" +r_filmMidTint "1.0104 1.0316 0.9996" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.161375" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.4490 0.4490 0.4490 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.4125 0.4125 0.4125 1.0000" +r_bloomCurveHiGamma "1.2105 1.2105 1.2105 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.2800 0.2800 0.2800 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.649063" +r_primaryLightTweakSpecularStrength "1.500000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0211 0.0211 0.0211 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.1544 0.0561 0.0000" + diff --git a/BO1/PC/ZM/vision/mp_hanoi.vision b/BO1/PC/ZM/vision/mp_hanoi.vision new file mode 100644 index 0000000..85fe55b --- /dev/null +++ b/BO1/PC/ZM/vision/mp_hanoi.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.266625" +r_filmMidEnd "0.571938" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.887719" +r_filmColorTemp "6647.6299 6647.6299 6647.6299" +r_filmSaturation "0.7930 0.6807 0.5754" +r_filmDarkTint "0.7789 0.9996 0.9996" +r_filmMidTint "0.8843 1.0101 0.9996" +r_filmLightTint "0.9996 0.9996 0.9893" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.141141" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.2104 0.1404 0.1824 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.2734 0.2734 0.3080 1.0000" +r_bloomCurveHiGamma "1.0022 0.9660 1.0022 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.2011 0.1600 0.1600 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.140000" +r_primaryLightTweakSpecularStrength "1.473750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0421 0.0421 0.0421 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 0.6421" +r_bloomStreakYTint "0.1404 0.0702 0.0702" + diff --git a/BO1/PC/ZM/vision/mp_havoc.vision b/BO1/PC/ZM/vision/mp_havoc.vision new file mode 100644 index 0000000..8a07952 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_havoc.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.410500" +r_filmMidEnd "0.536844" +r_filmDarkFeather "0.700000" +r_filmLightFeather "0.700000" +r_filmColorTemp "6320.0000 6320.0000 6320.0000" +r_filmSaturation "0.9895 0.7719 0.7088" +r_filmDarkTint "1.0314 1.0313 1.0313" +r_filmMidTint "1.0523 1.0101 1.0101" +r_filmLightTint "0.9996 0.9996 1.0101" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.2948 0.2948 0.2948 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.3435 0.4125 0.3089 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.4947 0.5000 0.4979 0.1032" +r_bloomExpansionWeights "0.2484 0.3211 0.2768 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.754375" +r_primaryLightTweakSpecularStrength "1.508750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0140 0.0211 0.0140 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0561 0.0913" + diff --git a/BO1/PC/ZM/vision/mp_mountain.vision b/BO1/PC/ZM/vision/mp_mountain.vision new file mode 100644 index 0000000..de8341b --- /dev/null +++ b/BO1/PC/ZM/vision/mp_mountain.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.700000" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6320.0000 6647.6299 6811.0796" +r_filmSaturation "0.8070 0.6526 0.5052" +r_filmDarkTint "0.9891 0.9893 0.9891" +r_filmMidTint "1.0733 1.0733 1.0740" +r_filmLightTint "1.0313 1.0313 1.0313" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.105250" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.127155" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.3228 0.3228 0.3228 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.7240 0.7240 0.7240 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5074 0.5000 0.5326 0.1032" +r_bloomExpansionWeights "0.1347 0.1347 0.1347 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.859688" +r_primaryLightTweakSpecularStrength "1.403438" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0105 0.0105 0.0105 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.2667 0.2737" + diff --git a/BO1/PC/ZM/vision/mp_munich.vision b/BO1/PC/ZM/vision/mp_munich.vision new file mode 100644 index 0000000..bd1179d --- /dev/null +++ b/BO1/PC/ZM/vision/mp_munich.vision @@ -0,0 +1,26 @@ +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + +r_reviveFX_Enable "0" + +r_primaryLightUseTweaks "1" +r_primaryLightTweakDiffuseStrength "1.2" +r_primaryLightTweakSpecularStrength "1.5" \ No newline at end of file diff --git a/BO1/PC/ZM/vision/mp_nuked.vision b/BO1/PC/ZM/vision/mp_nuked.vision new file mode 100644 index 0000000..223e4e8 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_nuked.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.410500" +r_filmMidEnd "0.680625" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.9298 0.8351 0.7088" +r_filmDarkTint "1.0313 1.0313 1.0313" +r_filmMidTint "1.0101 1.0101 0.9366" +r_filmLightTint "0.9996 0.9996 1.0101" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.1404 0.1404 0.1404 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.6386 0.6386 0.6386 1.0000" +r_bloomCurveLoGamma "0.2042 0.2042 0.2042 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.4947 0.5000 0.4979 0.1032" +r_bloomExpansionWeights "0.2484 0.3211 0.2768 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.982500" +r_primaryLightTweakSpecularStrength "1.500000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0211 0.0211 0.0211 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.2176 0.0561 0.0000" + diff --git a/BO1/PC/ZM/vision/mp_nuked2.vision b/BO1/PC/ZM/vision/mp_nuked2.vision new file mode 100644 index 0000000..528517f --- /dev/null +++ b/BO1/PC/ZM/vision/mp_nuked2.vision @@ -0,0 +1,35 @@ +// "0" +//Radius0 "7" +//Radius1 "7" +//BloomCutoff "0.99" +//BloomDesaturation "0.65" +//BloomIntensity0 "0.36" +//BloomIntensity1 "0.36" +//SkyBleedIntensity0 "0.29" +//SkyBleedIntensity1 "0.29" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/mp_radiation.vision b/BO1/PC/ZM/vision/mp_radiation.vision new file mode 100644 index 0000000..8f535ad --- /dev/null +++ b/BO1/PC/ZM/vision/mp_radiation.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.322750" +r_filmMidEnd "0.617500" +r_filmDarkFeather "0.800000" +r_filmLightFeather "0.800000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "1.0034 0.8842 0.6596" +r_filmDarkTint "0.9996 0.9996 0.9996" +r_filmMidTint "0.9996 0.9996 0.9996" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.3930 0.3930 0.3930 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.1000 0.2734 0.4817 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1221 0.1411 0.1411 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.526250" +r_primaryLightTweakSpecularStrength "1.508750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0105 0.0105 0.0105 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0351 0.0351" + diff --git a/BO1/PC/ZM/vision/mp_underwater.vision b/BO1/PC/ZM/vision/mp_underwater.vision new file mode 100644 index 0000000..08beac6 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_underwater.vision @@ -0,0 +1,37 @@ +// "1" +//Radius0 "0" +//Radius1 "0" +//BloomCutoff "0.99" +//BloomDesaturation "0.65" +//BloomIntensity0 "0.36" +//BloomIntensity1 "0.36" +//SkyBleedIntensity0 "0.29" +//SkyBleedIntensity1 "0.29" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + + + + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/mp_vdm_cosmopoc.vision b/BO1/PC/ZM/vision/mp_vdm_cosmopoc.vision new file mode 100644 index 0000000..31519a7 --- /dev/null +++ b/BO1/PC/ZM/vision/mp_vdm_cosmopoc.vision @@ -0,0 +1,33 @@ +// "0" +//Radius0 "7" +//Radius1 "7" +//BloomCutoff "0.99" +//BloomDesaturation "0.65" +//BloomIntensity0 "0.36" +//BloomIntensity1 "0.36" +//SkyBleedIntensity0 "0.29" +//SkyBleedIntensity1 "0.29" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/mpintro.vision b/BO1/PC/ZM/vision/mpintro.vision new file mode 100644 index 0000000..004dd80 --- /dev/null +++ b/BO1/PC/ZM/vision/mpintro.vision @@ -0,0 +1,45 @@ +// "0" +//Radius0 "7" +//Radius1 "7" +//BloomCutoff "0.99" +//BloomDesaturation "0.65" +//BloomIntensity0 "0.36" +//BloomIntensity1 "0.36" +//SkyBleedIntensity0 "0.29" +//SkyBleedIntensity1 "0.29" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "0 0 0" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/mpoutro.vision b/BO1/PC/ZM/vision/mpoutro.vision new file mode 100644 index 0000000..004dd80 --- /dev/null +++ b/BO1/PC/ZM/vision/mpoutro.vision @@ -0,0 +1,45 @@ +// "0" +//Radius0 "7" +//Radius1 "7" +//BloomCutoff "0.99" +//BloomDesaturation "0.65" +//BloomIntensity0 "0.36" +//BloomIntensity1 "0.36" +//SkyBleedIntensity0 "0.29" +//SkyBleedIntensity1 "0.29" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "0 0 0" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/neutral.vision b/BO1/PC/ZM/vision/neutral.vision new file mode 100644 index 0000000..635eb3b --- /dev/null +++ b/BO1/PC/ZM/vision/neutral.vision @@ -0,0 +1,45 @@ +// "0" +//Radius0 "0" +//Radius1 "0" +//BloomCutoff "0" +//BloomDesaturation "0" +//BloomIntensity0 "0" +//BloomIntensity1 "0" +//SkyBleedIntensity0 "0" +//SkyBleedIntensity1 "0" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/pentagon.vision b/BO1/PC/ZM/vision/pentagon.vision new file mode 100644 index 0000000..9ca4d9c --- /dev/null +++ b/BO1/PC/ZM/vision/pentagon.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.287719" +r_filmMidEnd "0.417500" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.887719" +r_filmColorTemp "6565.9048 6565.9048 6565.9048" +r_filmSaturation "0.8282 0.7158 0.6247" +r_filmDarkTint "0.9053 1.0101 0.9996" +r_filmMidTint "1.0736 0.9893 1.0733" +r_filmLightTint "0.9996 0.9996 0.8843" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.122813" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.200800" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.6315 0.6035 0.6035 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.5865 0.5858 0.5515 1.0000" +r_bloomCurveHiGamma "1.0022 0.9663 1.0022 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.2011 0.1600 0.1600 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.000000" +r_primaryLightTweakSpecularStrength "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0421 0.0421 0.0421 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 0.6421" +r_bloomStreakYTint "0.5052 0.3368 0.3368" + diff --git a/BO1/PC/ZM/vision/pow.vision b/BO1/PC/ZM/vision/pow.vision new file mode 100644 index 0000000..c592aaf --- /dev/null +++ b/BO1/PC/ZM/vision/pow.vision @@ -0,0 +1,82 @@ + +r_filmEnable "1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "1" +r_reviveFX_brightnessEdge "1" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "1" +r_reviveFX_motionblurWeight "1" +r_reviveFX_contrastCenter "1" +r_reviveFX_brightnessCenter "1" +r_reviveFX_desaturationCenter "1" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + + + +r_sCurveEnable "1" + + +r_filmMidStart "0.500000" +r_filmMidEnd "0.500000" +r_filmDarkFeather "1.000000" +r_filmLightFeather "1.000000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "1.0000 1.0000 1.0000" +r_filmDarkTint "0.9999 0.5299 0.4599" +r_filmMidTint "0.9999 0.7650 0.5799" +r_filmLightTint "0.9999 0.9999 0.6999" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.5000 1.5000 1.5000" + +r_sCurveShoulderStrength "0.068000" +r_sCurveLinearStrength "0.413000" +r_sCurveLinearAngle "0.093000" +r_sCurveToeStrength "0.116978" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.227992" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.4070 0.3930 0.3930 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.8316 0.8316 0.8316 1.0000" +r_bloomCurveLoGamma "0.4814 0.4471 0.4125 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.1000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.3684 0.1632 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.525938" +r_primaryLightTweakSpecularStrength "1.508750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.1719 0.1719 0.1719 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0281 0.0281 0.0281" + diff --git a/BO1/PC/ZM/vision/quagmire_1.vision b/BO1/PC/ZM/vision/quagmire_1.vision new file mode 100644 index 0000000..3fa94bf --- /dev/null +++ b/BO1/PC/ZM/vision/quagmire_1.vision @@ -0,0 +1,42 @@ +// "1" +//Radius0 "6.3" +//BloomCutoff "0.76" +//BloomDesaturation "0" +//BloomIntensity0 "1.03" +//SkyBleedIntensity0 "0" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/quagmire_2.vision b/BO1/PC/ZM/vision/quagmire_2.vision new file mode 100644 index 0000000..3fa94bf --- /dev/null +++ b/BO1/PC/ZM/vision/quagmire_2.vision @@ -0,0 +1,42 @@ +// "1" +//Radius0 "6.3" +//BloomCutoff "0.76" +//BloomDesaturation "0" +//BloomIntensity0 "1.03" +//SkyBleedIntensity0 "0" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/quagmire_3.vision b/BO1/PC/ZM/vision/quagmire_3.vision new file mode 100644 index 0000000..3fa94bf --- /dev/null +++ b/BO1/PC/ZM/vision/quagmire_3.vision @@ -0,0 +1,42 @@ +// "1" +//Radius0 "6.3" +//BloomCutoff "0.76" +//BloomDesaturation "0" +//BloomIntensity0 "1.03" +//SkyBleedIntensity0 "0" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/quagmire_4.vision b/BO1/PC/ZM/vision/quagmire_4.vision new file mode 100644 index 0000000..3fa94bf --- /dev/null +++ b/BO1/PC/ZM/vision/quagmire_4.vision @@ -0,0 +1,42 @@ +// "1" +//Radius0 "6.3" +//BloomCutoff "0.76" +//BloomDesaturation "0" +//BloomIntensity0 "1.03" +//SkyBleedIntensity0 "0" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/quagmire_default.vision b/BO1/PC/ZM/vision/quagmire_default.vision new file mode 100644 index 0000000..3fa94bf --- /dev/null +++ b/BO1/PC/ZM/vision/quagmire_default.vision @@ -0,0 +1,42 @@ +// "1" +//Radius0 "6.3" +//BloomCutoff "0.76" +//BloomDesaturation "0" +//BloomIntensity0 "1.03" +//SkyBleedIntensity0 "0" + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/rebirth.vision b/BO1/PC/ZM/vision/rebirth.vision new file mode 100644 index 0000000..86ee68c --- /dev/null +++ b/BO1/PC/ZM/vision/rebirth.vision @@ -0,0 +1,90 @@ + +// "0" + +//Radius0 "0" + +//BloomCutoff "0" +//BloomDesaturation "0" +//BloomIntensity0 "0" + +//SkyBleedIntensity0 "0" + +//RayExpansion "0" +//RayIntensity "0" + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + +//TweakRadius0 "5.000000" +//TweakBloomCutoff "0.500000" +//TweakBloomDesaturation "0.000000" +//TweakBloomIntensity0 "1.000000" +//TweakRayExpansion "0.000000" +//TweakRayIntensity "1.000000" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.700000" +r_filmDarkFeather "0.300000" +r_filmLightFeather "0.100000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "1.0000 1.0000 1.0000" +r_filmDarkTint "6.0000 6.0000 6.0000" +r_filmMidTint "0.9997 0.9997 0.9997" +r_filmLightTint "0.9997 0.9997 0.9997" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.455938" +r_primaryLightTweakSpecularStrength "2.280313" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/revive.vision b/BO1/PC/ZM/vision/revive.vision new file mode 100644 index 0000000..9d2a451 --- /dev/null +++ b/BO1/PC/ZM/vision/revive.vision @@ -0,0 +1,37 @@ + + +r_filmEnable "0" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "1.6" +r_reviveFX_brightnessEdge "0.34" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "0.93 0.94 0.95" +r_reviveFX_lightTintEdge "1 1.03 1.02" +r_reviveFX_blurRadiusEdge "3.5" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "1.76" +r_reviveFX_brightnessCenter "0.234" +r_reviveFX_desaturationCenter "0.845" +r_reviveFX_darkTintCenter "0.978 1.01 0.975" +r_reviveFX_lightTintCenter "1.02 1 0.99" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/tvguided_mp.vision b/BO1/PC/ZM/vision/tvguided_mp.vision new file mode 100644 index 0000000..aa230f2 --- /dev/null +++ b/BO1/PC/ZM/vision/tvguided_mp.vision @@ -0,0 +1,67 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.256125" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.000000" +r_filmLightFeather "0.284219" +r_filmColorTemp "6155.0903 6155.8203 6155.8203" +r_filmSaturation "0.0000 0.0000 0.0000" +r_filmDarkTint "0.6947 0.9683 0.9683" +r_filmMidTint "0.9261 1.0734 0.9996" +r_filmLightTint "0.9893 1.2632 0.9261" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.3262 1.3262 1.3262" + +r_sCurveShoulderStrength "0.087719" +r_sCurveLinearStrength "0.796500" +r_sCurveLinearAngle "0.136844" +r_sCurveToeStrength "0.116603" +r_sCurveToeNumerator "0.007891" +r_sCurveToeDenominator "0.081607" + +r_bloomTintWeights "0.3719 0.3719 0.3719 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.1825 0.1825 0.1825 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 0.7684" +r_bloomCurveLoGamma "1.0000 1.0000 1.0000 0.1000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +//TweakRadius0 "5.000000" +//TweakBloomCutoff "0.500000" +//TweakBloomDesaturation "0.000000" +//TweakBloomIntensity0 "1.000000" +//TweakRayExpansion "0.000000" +//TweakRayIntensity "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/tvguided_sp.vision b/BO1/PC/ZM/vision/tvguided_sp.vision new file mode 100644 index 0000000..7eb4811 --- /dev/null +++ b/BO1/PC/ZM/vision/tvguided_sp.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.196500" +r_filmMidEnd "0.635094" +r_filmDarkFeather "0.698250" +r_filmLightFeather "0.712250" +r_filmColorTemp "6238.2749 6238.2749 6238.2749" +r_filmSaturation "0.5263 0.5263 0.5263" +r_filmDarkTint "0.9893 1.2422 1.1790" +r_filmMidTint "0.7789 1.2422 1.2422" +r_filmLightTint "0.9683 1.2422 1.0942" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.3404 1.3404 1.3404" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.239355" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.1368 0.1368 0.1368 0.0000" +r_bloomColorScale "1.0948 1.0948 1.0948 0.0000" +r_bloomTintScale "3.3544 3.3544 3.3544 1.0000" +r_bloomCurveBreakpoint "0.8386 0.8386 0.8386 0.4000" +r_bloomCurveLoGamma "0.1000 0.1000 0.1000 0.3420" +r_bloomCurveHiGamma "1.3486 1.3486 1.3486 1.9040" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "2.487750" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.525938" +r_primaryLightTweakSpecularStrength "1.508750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0105 0.0105 0.0105 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0351 0.0351" + diff --git a/BO1/PC/ZM/vision/underwaterbase.vision b/BO1/PC/ZM/vision/underwaterbase.vision new file mode 100644 index 0000000..0dcfec2 --- /dev/null +++ b/BO1/PC/ZM/vision/underwaterbase.vision @@ -0,0 +1,26 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/underwaterbase_swimming.vision b/BO1/PC/ZM/vision/underwaterbase_swimming.vision new file mode 100644 index 0000000..430065b --- /dev/null +++ b/BO1/PC/ZM/vision/underwaterbase_swimming.vision @@ -0,0 +1,37 @@ + + +r_filmEnable "0" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1.2 1.2 1.2" + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "1.6" +r_reviveFX_brightnessEdge "0.3" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "0.0 0.5 0.75" +r_reviveFX_lightTintEdge "0.0 0.5 0.75" +r_reviveFX_blurRadiusEdge "1.5" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "1.2" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/water.vision b/BO1/PC/ZM/vision/water.vision new file mode 100644 index 0000000..ca36017 --- /dev/null +++ b/BO1/PC/ZM/vision/water.vision @@ -0,0 +1,92 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_edgeColorTemp "6500" +r_reviveFX_edgeSaturation "1.3" +r_reviveFX_edgeScale "0.65 0.65 0.65" +r_reviveFX_edgeContrast "1.62 1.62 1.62" +r_reviveFX_edgeOffset "-0.72 -0.72 -0.72" +r_reviveFX_edgeMaskAdjust "-0.63" +r_reviveFX_edgeAmount "0.56" + +/* + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "2.5" +r_reviveFX_brightnessEdge "0.23" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "6.4" +r_reviveFX_motionblurWeight "1" +r_reviveFX_contrastCenter "1.9" +r_reviveFX_brightnessCenter "0.157" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +*/ + + +r_filmMidStart "0.221000" +r_filmMidEnd "0.294750" +r_filmDarkFeather "0.077188" +r_filmLightFeather "0.500000" +r_filmColorTemp "6074.0957 6401.7251 5582.2861" +r_filmSaturation "0.7088 0.5895 0.6246" +r_filmDarkTint "0.9893 0.9261 0.9053" +r_filmMidTint "1.1571 0.9473 0.8211" +r_filmLightTint "0.9996 0.9473 0.8001" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0104 1.0104 1.0104" + +r_sCurveShoulderStrength "0.256125" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.333948" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.4421 0.4421 0.4421 1.0000" +r_bloomCurveLoGamma "0.6205 0.5843 0.5840 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.4221 0.3200 0.4568" +r_bloomExpansionWeights "0.2169 0.2263 0.1632 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "0.000000" +r_primaryLightTweakSpecularStrength "0.491250" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.0000 0.0000 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/waw_zombie_factory.vision b/BO1/PC/ZM/vision/waw_zombie_factory.vision new file mode 100644 index 0000000..27d521e --- /dev/null +++ b/BO1/PC/ZM/vision/waw_zombie_factory.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.700000" +r_filmDarkFeather "0.700000" +r_filmLightFeather "0.700000" +r_filmColorTemp "7385.3438 7385.3438 7385.3438" +r_filmSaturation "0.8000 0.5192 0.4913" +r_filmDarkTint "0.9261 1.0206 1.0206" +r_filmMidTint "1.0526 1.1154 1.1156" +r_filmLightTint "1.3052 1.3052 1.3052" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.122813" +r_sCurveLinearStrength "0.554375" +r_sCurveLinearAngle "0.105250" +r_sCurveToeStrength "0.102586" +r_sCurveToeNumerator "0.016641" +r_sCurveToeDenominator "0.614386" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "1.2350 1.2630 1.2630 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.6897 0.5840 0.5865 1.0000" +r_bloomCurveHiGamma "1.0022 1.0022 1.0022 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.2011 0.1600 0.1600 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.199375" +r_primaryLightTweakSpecularStrength "1.500000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.4140 0.4140 0.4140 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 0.6421" +r_bloomStreakYTint "0.0421 0.0632 0.0632" + diff --git a/BO1/PC/ZM/vision/wmd.vision b/BO1/PC/ZM/vision/wmd.vision new file mode 100644 index 0000000..42e1f40 --- /dev/null +++ b/BO1/PC/ZM/vision/wmd.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.403500" +r_filmMidEnd "0.700000" +r_filmDarkFeather "0.700000" +r_filmLightFeather "0.700000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.8631 0.7017 0.2456" +r_filmDarkTint "0.9996 0.9996 0.9996" +r_filmMidTint "0.9996 0.9996 0.9996" +r_filmLightTint "1.0101 1.0101 1.0101" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.200000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.077188" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.8000" +r_bloomColorScale "0.3369 0.3369 0.3369 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.2388 0.2388 0.2042 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.4410 0.4410 0.2610 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.000000" +r_primaryLightTweakSpecularStrength "1.894688" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0807 0.0316 0.0807 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "0.2667 0.0000 0.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0772 0.0772 0.1262" + diff --git a/BO1/PC/ZM/vision/wmd_gforce.vision b/BO1/PC/ZM/vision/wmd_gforce.vision new file mode 100644 index 0000000..d8c730f --- /dev/null +++ b/BO1/PC/ZM/vision/wmd_gforce.vision @@ -0,0 +1,66 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.700000" +r_filmDarkFeather "1.000000" +r_filmLightFeather "1.000000" +r_filmColorTemp "5664.0107 5664.0107 5664.0107" +r_filmSaturation "1.0000 0.2456 0.0000" +r_filmDarkTint "0.6737 1.0101 1.0101" +r_filmMidTint "0.9893 1.0523 1.0101" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.094750" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.709010" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "1.0000 0.0842 0.0000 1.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "2.3719 3.2280 3.2280 0.1298" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.1000 0.1000 0.1000 0.5858" +r_bloomCurveHiGamma "0.1000 0.1000 0.1000 9.9900" +r_bloomExpansionControl "0.7032 0.3179 0.4884 0.5926" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 1.0000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "3.000000" +r_bloomPersistence "0.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 0.1614" +r_bloomStreakYTint "0.2035 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/wmd_jumpcut.vision b/BO1/PC/ZM/vision/wmd_jumpcut.vision new file mode 100644 index 0000000..6624bb7 --- /dev/null +++ b/BO1/PC/ZM/vision/wmd_jumpcut.vision @@ -0,0 +1,66 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.700000" +r_filmDarkFeather "1.000000" +r_filmLightFeather "1.000000" +r_filmColorTemp "5664.0107 5664.0107 5664.0107" +r_filmSaturation "1.0000 0.3509 0.0000" +r_filmDarkTint "0.6737 1.0101 1.0101" +r_filmMidTint "0.9893 1.0523 1.0101" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.094750" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.709010" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.9754 0.9825 0.9754 1.0000" +r_bloomColorScale "3.6772 3.6772 3.6772 0.0000" +r_bloomTintScale "1.9509 3.4665 3.9719 0.1298" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 0.4105" +r_bloomCurveLoGamma "3.0151 3.0151 3.0151 0.9323" +r_bloomCurveHiGamma "0.1000 0.1000 0.1000 3.0497" +r_bloomExpansionControl "0.7789 0.4947 1.0000 0.5705" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 1.0000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "2.564938" +r_bloomPersistence "0.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.7465 0.9965 0.7465 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "2.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.0000 0.0000 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "1.7895 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/wmd_pilot.vision b/BO1/PC/ZM/vision/wmd_pilot.vision new file mode 100644 index 0000000..5b7589b --- /dev/null +++ b/BO1/PC/ZM/vision/wmd_pilot.vision @@ -0,0 +1,66 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.700000" +r_filmDarkFeather "1.000000" +r_filmLightFeather "1.000000" +r_filmColorTemp "5664.0107 5664.0107 5664.0107" +r_filmSaturation "0.8702 0.7824 0.6772" +r_filmDarkTint "1.0101 1.0101 1.0101" +r_filmMidTint "1.1152 1.0523 1.0101" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.218314" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.8140 0.8140 0.8140 0.0000" +r_bloomTintScale "0.3790 0.2525 0.2525 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.3420 0.3420 0.3420 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 1.0000 0.5000 0.1000" +r_bloomExpansionWeights "0.2863 0.2863 0.2863 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0070 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/wmd_runway.vision b/BO1/PC/ZM/vision/wmd_runway.vision new file mode 100644 index 0000000..28c181f --- /dev/null +++ b/BO1/PC/ZM/vision/wmd_runway.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.700000" +r_filmDarkFeather "1.000000" +r_filmLightFeather "1.000000" +r_filmColorTemp "5664.0107 5664.0107 5664.0107" +r_filmSaturation "0.8702 0.7824 0.6772" +r_filmDarkTint "1.0101 1.0101 1.0101" +r_filmMidTint "1.1152 1.0523 1.0101" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.218314" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.3228 0.3228 0.3228 0.0000" +r_bloomTintScale "0.3790 0.2525 0.2525 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.3420 0.3420 0.3420 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 1.0000 0.5000 0.1000" +r_bloomExpansionWeights "0.2863 0.2863 0.2863 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.070313" +r_primaryLightTweakSpecularStrength "1.543750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0070 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/wmd_sr71.vision b/BO1/PC/ZM/vision/wmd_sr71.vision new file mode 100644 index 0000000..57a89c0 --- /dev/null +++ b/BO1/PC/ZM/vision/wmd_sr71.vision @@ -0,0 +1,66 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.8491 0.7439 0.6526" +r_filmDarkTint "0.8843 0.9997 0.9997" +r_filmMidTint "0.9997 0.9997 0.9997" +r_filmLightTint "0.9997 0.9997 0.9997" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.2528 0.3930 0.3229 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.4817 0.4817 0.4817 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "1.0000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0246 0.0246 0.0246 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0000 0.0351 0.0351" + diff --git a/BO1/PC/ZM/vision/wmd_sr71cam.vision b/BO1/PC/ZM/vision/wmd_sr71cam.vision new file mode 100644 index 0000000..036380f --- /dev/null +++ b/BO1/PC/ZM/vision/wmd_sr71cam.vision @@ -0,0 +1,82 @@ + +r_filmEnable "1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "1" +r_reviveFX_brightnessEdge "1" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "1" +r_reviveFX_motionblurWeight "1" +r_reviveFX_contrastCenter "1" +r_reviveFX_brightnessCenter "1" +r_reviveFX_desaturationCenter "1" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + + + +r_sCurveEnable "1" + + +r_filmMidStart "0.500000" +r_filmMidEnd "0.500000" +r_filmDarkFeather "0.600000" +r_filmLightFeather "0.600000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "1.0104 0.8351 0.6456" +r_filmDarkTint "1.0101 0.9617 0.8001" +r_filmMidTint "0.8843 0.9683 0.8211" +r_filmLightTint "0.9996 0.9996 0.8211" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.4035 1.4105 1.4035" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.5474 0.4630 0.4630 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.8983 0.7942 0.8634 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.1000 0.4316 0.5011 0.5863" +r_bloomExpansionWeights "0.7695 0.7695 0.7695 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "0.420938" +r_primaryLightTweakSpecularStrength "0.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.0211 0.0211 0.0211 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.8491 0.8491 0.8491 1.0000" +r_bloomStreakXTint "0.0211 0.0211 0.0913" + +r_bloomStreakYLevels0 "0.0456 0.0000 0.0000 1.0371" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.9965 0.9965 0.9965 1.0000" +r_bloomStreakYTint "0.3088 0.2878 0.0000" + diff --git a/BO1/PC/ZM/vision/wmd_takeoff.vision b/BO1/PC/ZM/vision/wmd_takeoff.vision new file mode 100644 index 0000000..5732860 --- /dev/null +++ b/BO1/PC/ZM/vision/wmd_takeoff.vision @@ -0,0 +1,66 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.700000" +r_filmDarkFeather "1.000000" +r_filmLightFeather "1.000000" +r_filmColorTemp "5664.0107 5664.0107 5664.0107" +r_filmSaturation "0.8702 0.7824 0.6772" +r_filmDarkTint "1.0101 1.0101 1.0101" +r_filmMidTint "1.1151 1.0523 1.0101" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.218314" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "4.0000 4.0000 4.0000 0.0000" +r_bloomTintScale "0.3790 0.2525 0.2525 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.3429 0.3429 0.3429 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 1.0000 0.5000 0.1000" +r_bloomExpansionWeights "0.2863 0.2863 0.2863 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.1509 0.6035 0.5512" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 0.6035 0.6000" +r_bloomStreakYTintControl "0.2500 0.3000 0.2500 1.0000" +r_bloomStreakYTint "1.4948 1.4948 1.4948" + diff --git a/BO1/PC/ZM/vision/zombie.vision b/BO1/PC/ZM/vision/zombie.vision new file mode 100644 index 0000000..b40c55b --- /dev/null +++ b/BO1/PC/ZM/vision/zombie.vision @@ -0,0 +1,39 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/zombie_black_hole.vision b/BO1/PC/ZM/vision/zombie_black_hole.vision new file mode 100644 index 0000000..7267d62 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_black_hole.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.424563" +r_filmMidEnd "0.912250" +r_filmDarkFeather "0.368375" +r_filmLightFeather "1.000000" +r_filmColorTemp "8778.3174 9105.9473 7876.4233" +r_filmSaturation "1.3894 1.2421 1.3824" +r_filmDarkTint "1.0532 1.0104 0.9684" +r_filmMidTint "1.7267 1.3896 1.5373" +r_filmLightTint "1.1363 1.1152 1.1363" +r_filmBleach "0.0877 0.0877 0.0877" +r_filmContrast "1.4246 1.4246 1.4246" + +r_sCurveShoulderStrength "0.136844" +r_sCurveLinearStrength "0.207031" +r_sCurveLinearAngle "0.407031" +r_sCurveToeStrength "0.390079" +r_sCurveToeNumerator "0.025438" +r_sCurveToeDenominator "0.249876" + +r_bloomTintWeights "0.2211 0.2211 0.2211 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 0.9860" +r_bloomCurveLoGamma "1.1063 1.1063 1.1063 0.8288" +r_bloomCurveHiGamma "1.2800 1.2800 1.2800 1.5922" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.4821" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.708750" +r_bloomPersistence "0.684219" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.199375" +r_primaryLightTweakSpecularStrength "1.500000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.1193 0.1193 0.1193 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0632 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.3298 0.3298 0.3300 0.7592" +r_bloomStreakYLevels1 "0.7684 0.3754 0.0421 1.0000" +r_bloomStreakYInnerTint "0.5860 0.7088 0.8351" +r_bloomStreakYOuterTint "0.3474 0.0210 0.0246" +r_bloomStreakYTintControl "0.8772 0.8772 0.8772 1.0000" +r_bloomStreakYTint "1.6141 1.6211 1.6211" + diff --git a/BO1/PC/ZM/vision/zombie_coast.vision b/BO1/PC/ZM/vision/zombie_coast.vision new file mode 100644 index 0000000..f13417c --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_coast.vision @@ -0,0 +1,37 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/zombie_coast_2.vision b/BO1/PC/ZM/vision/zombie_coast_2.vision new file mode 100644 index 0000000..de00154 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_coast_2.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.196500" +r_filmMidEnd "0.343875" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.887719" +r_filmColorTemp "6565.9048 6565.9048 6565.9048" +r_filmSaturation "0.7930 0.6807 0.5895" +r_filmDarkTint "0.7789 0.9996 0.9996" +r_filmMidTint "0.9261 0.9893 0.9996" +r_filmLightTint "0.9996 0.9996 0.9053" +r_filmBleach "0.0246 0.0246 0.0246" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.228772" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.2805 0.2525 0.2525 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.6554 0.8634 0.7926 1.0000" +r_bloomCurveHiGamma "1.0022 0.9660 1.0022 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.2011 0.1600 0.1600 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.000000" +r_primaryLightTweakSpecularStrength "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.1193 0.1193 0.1193 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 0.6421" +r_bloomStreakYTint "0.0772 0.0421 0.0421" + diff --git a/BO1/PC/ZM/vision/zombie_coast_lighthouse.vision b/BO1/PC/ZM/vision/zombie_coast_lighthouse.vision new file mode 100644 index 0000000..64de225 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_coast_lighthouse.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.196500" +r_filmMidEnd "0.343875" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.887719" +r_filmColorTemp "6565.9048 6565.9048 6565.9048" +r_filmSaturation "0.7930 0.6807 0.5895" +r_filmDarkTint "0.7789 0.9996 0.9996" +r_filmMidTint "0.9261 0.9893 0.9996" +r_filmLightTint "0.9996 0.9996 0.9053" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.228772" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.2805 0.2525 0.2525 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.6554 0.8634 0.7923 1.0000" +r_bloomCurveHiGamma "1.0022 0.9660 1.0022 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.2011 0.1600 0.1600 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.000000" +r_primaryLightTweakSpecularStrength "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.1193 0.1193 0.1193 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 0.6421" +r_bloomStreakYTint "0.0772 0.0421 0.0421" + diff --git a/BO1/PC/ZM/vision/zombie_coast_poweron.vision b/BO1/PC/ZM/vision/zombie_coast_poweron.vision new file mode 100644 index 0000000..815bf56 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_coast_poweron.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.168375" +r_filmMidEnd "0.161375" +r_filmDarkFeather "0.428000" +r_filmLightFeather "0.526250" +r_filmColorTemp "4435.9473 4599.3965 4435.9473" +r_filmSaturation "0.6316 0.6316 0.6316" +r_filmDarkTint "1.0733 1.0941 1.0941" +r_filmMidTint "0.8843 0.8843 0.8843" +r_filmLightTint "0.9996 0.9683 1.0101" +r_filmBleach "0.0702 0.0702 0.0702" +r_filmContrast "1.5011 1.5017 1.5011" + +r_sCurveShoulderStrength "0.073688" +r_sCurveLinearStrength "0.442094" +r_sCurveLinearAngle "0.066625" +r_sCurveToeStrength "0.148228" +r_sCurveToeNumerator "0.009641" +r_sCurveToeDenominator "0.242852" + +r_bloomTintWeights "0.6175 0.6175 0.6175 0.0000" +r_bloomColorScale "0.6035 0.6035 0.6035 0.0000" +r_bloomTintScale "0.5474 0.5474 0.5474 1.0000" +r_bloomCurveBreakpoint "0.2877 0.2877 0.2877 1.0000" +r_bloomCurveLoGamma "1.5226 1.8697 1.5912 1.3835" +r_bloomCurveHiGamma "1.4188 1.4188 1.4188 1.1406" +r_bloomExpansionControl "0.4946 0.1000 0.4979 0.1032" +r_bloomExpansionWeights "0.3274 0.2674 0.1505 0.3400" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "3.000000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.894688" +r_primaryLightTweakSpecularStrength "1.087500" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0772 0.0772 0.0772 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.1192 0.0491 0.0211" + diff --git a/BO1/PC/ZM/vision/zombie_coast_rovingeye.vision b/BO1/PC/ZM/vision/zombie_coast_rovingeye.vision new file mode 100644 index 0000000..419321d --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_coast_rovingeye.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.168375" +r_filmMidEnd "0.161375" +r_filmDarkFeather "0.428000" +r_filmLightFeather "0.526250" +r_filmColorTemp "4518.4014 4681.1221 4518.4014" +r_filmSaturation "0.6316 0.6316 0.6316" +r_filmDarkTint "0.9266 0.9474 0.9474" +r_filmMidTint "0.9684 0.9684 0.9684" +r_filmLightTint "0.7682 0.7369 0.7787" +r_filmBleach "0.0702 0.0702 0.0702" +r_filmContrast "1.5011 1.5017 1.5011" + +r_sCurveShoulderStrength "0.073688" +r_sCurveLinearStrength "0.442094" +r_sCurveLinearAngle "0.066625" +r_sCurveToeStrength "0.148228" +r_sCurveToeNumerator "0.009641" +r_sCurveToeDenominator "0.242852" + +r_bloomTintWeights "0.0456 0.0456 0.0456 0.0000" +r_bloomColorScale "0.6035 0.6035 0.6035 0.0000" +r_bloomTintScale "0.5474 0.5474 0.5474 1.0000" +r_bloomCurveBreakpoint "0.2877 0.2877 0.2877 1.0000" +r_bloomCurveLoGamma "1.5223 1.8697 1.5909 1.3832" +r_bloomCurveHiGamma "1.4188 1.4188 1.4188 1.1403" +r_bloomExpansionControl "0.4946 0.1000 0.4979 0.1032" +r_bloomExpansionWeights "0.3274 0.2674 0.1505 0.3400" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "3.000000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.894688" +r_primaryLightTweakSpecularStrength "1.087500" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0772 0.0772 0.0772 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.1192 0.0491 0.0211" + diff --git a/BO1/PC/ZM/vision/zombie_cosmodrome.vision b/BO1/PC/ZM/vision/zombie_cosmodrome.vision new file mode 100644 index 0000000..0a7826a --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_cosmodrome.vision @@ -0,0 +1,82 @@ + + + + +r_filmEnable "1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + + + +r_sCurveEnable "1" + + +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "1.0000 1.0000 1.0000" +r_filmDarkTint "0.9999 0.9999 1.0500" +r_filmMidTint "0.9999 0.9999 0.9999" +r_filmLightTint "0.9999 0.9999 0.9999" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.1200 1.1200 1.1200" + +r_sCurveShoulderStrength "0.068000" +r_sCurveLinearStrength "0.413000" +r_sCurveLinearAngle "0.093000" +r_sCurveToeStrength "0.116978" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.227992" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.6316 0.6316 0.6316 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.273687" +r_bloomPersistence "0.000000" + + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.1158 0.1158 0.1158 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0913 0.0913 0.0913" + diff --git a/BO1/PC/ZM/vision/zombie_cosmodrome_begin.vision b/BO1/PC/ZM/vision/zombie_cosmodrome_begin.vision new file mode 100644 index 0000000..1ea150e --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_cosmodrome_begin.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.189469" +r_filmMidEnd "0.396500" +r_filmDarkFeather "0.073688" +r_filmLightFeather "0.361375" +r_filmColorTemp "5418.8359 5418.8359 5418.8359" +r_filmSaturation "1.6211 1.2351 1.6211" +r_filmDarkTint "0.7791 0.8001 0.7791" +r_filmMidTint "0.8421 0.8421 0.8421" +r_filmLightTint "0.9053 0.9473 0.9473" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.1719 1.1789 1.1719" + +r_sCurveShoulderStrength "0.203500" +r_sCurveLinearStrength "0.171937" +r_sCurveLinearAngle "0.136844" +r_sCurveToeStrength "0.001000" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.172766" + +r_bloomTintWeights "0.1053 0.1053 0.1053 0.5403" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.5052 0.5052 0.5052 0.3474" +r_bloomCurveBreakpoint "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveLoGamma "0.1000 0.1000 0.1000 0.8980" +r_bloomCurveHiGamma "0.5840 0.5840 0.5840 1.3820" +r_bloomExpansionControl "0.6716 0.5895 0.7063 0.4158" +r_bloomExpansionWeights "0.7663 0.7663 0.7663 0.3589" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.771875" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.070313" +r_primaryLightTweakSpecularStrength "1.438750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.0842 0.0842 0.0842 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.8491 0.8491 0.8491 1.0000" +r_bloomStreakXTint "0.0211 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0561 0.0561 0.0561 1.0371" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.9965 0.9965 0.9965 1.0000" +r_bloomStreakYTint "0.0281 0.0491 0.0491" + diff --git a/BO1/PC/ZM/vision/zombie_cosmodrome_divetonuke.vision b/BO1/PC/ZM/vision/zombie_cosmodrome_divetonuke.vision new file mode 100644 index 0000000..f64e873 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_cosmodrome_divetonuke.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.189469" +r_filmMidEnd "0.396500" +r_filmDarkFeather "0.073688" +r_filmLightFeather "0.361375" +r_filmColorTemp "5418.8359 5418.8359 5418.8359" +r_filmSaturation "0.6035 0.6035 0.6035" +r_filmDarkTint "0.7791 0.8001 0.7791" +r_filmMidTint "0.8421 0.8421 0.8421" +r_filmLightTint "0.9053 0.9473 0.9473" +r_filmBleach "0.1193 0.1193 0.1193" +r_filmContrast "1.1719 1.1789 1.1719" + +r_sCurveShoulderStrength "0.014031" +r_sCurveLinearStrength "0.000000" +r_sCurveLinearAngle "0.350875" +r_sCurveToeStrength "0.004497" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.263862" + +r_bloomTintWeights "0.0000 0.0000 0.0000 0.5403" +r_bloomColorScale "0.1825 0.1825 0.1825 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 0.3474" +r_bloomCurveBreakpoint "0.0702 0.0702 0.0702 1.0000" +r_bloomCurveLoGamma "0.1000 0.1000 0.1000 0.8980" +r_bloomCurveHiGamma "0.5840 0.5840 0.5840 1.3820" +r_bloomExpansionControl "0.6716 0.5895 0.7063 0.4158" +r_bloomExpansionWeights "0.7663 0.7663 0.7663 0.3589" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.771875" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "9.052187" +r_primaryLightTweakSpecularStrength "4.771563" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.0211 0.0211 0.0211 2.1123" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.8386 0.8386 0.8386 1.0000" +r_bloomStreakXTint "0.2176 0.2176 0.2176" + +r_bloomStreakYLevels0 "0.1053 0.1053 0.1053 1.0371" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "1.0000 1.0000 1.0000 1.0000" +r_bloomStreakYTint "1.3824 1.3824 1.3824" + diff --git a/BO1/PC/ZM/vision/zombie_cosmodrome_monkey.vision b/BO1/PC/ZM/vision/zombie_cosmodrome_monkey.vision new file mode 100644 index 0000000..59fdb40 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_cosmodrome_monkey.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.189469" +r_filmMidEnd "0.396500" +r_filmDarkFeather "0.073688" +r_filmLightFeather "0.361375" +r_filmColorTemp "5009.4814 4845.3018 4926.2969" +r_filmSaturation "1.4878 1.0176 1.0176" +r_filmDarkTint "0.8844 0.9053 0.8844" +r_filmMidTint "1.0314 1.0734 1.0328" +r_filmLightTint "1.3266 1.4106 1.3686" +r_filmBleach "0.0351 0.0351 0.0351" +r_filmContrast "1.5228 1.5228 1.5228" + +r_sCurveShoulderStrength "0.028063" +r_sCurveLinearStrength "0.178875" +r_sCurveLinearAngle "0.242094" +r_sCurveToeStrength "0.001000" +r_sCurveToeNumerator "0.027188" +r_sCurveToeDenominator "0.165679" + +r_bloomTintWeights "0.0000 0.0000 0.0000 0.0000" +r_bloomColorScale "0.1404 0.1404 0.1404 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.9965 0.9965 0.9965 1.0000" +r_bloomCurveLoGamma "1.5922 1.5922 1.5922 0.8980" +r_bloomCurveHiGamma "2.4915 2.5632 2.4915 1.3820" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.3589" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.771875" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.070313" +r_primaryLightTweakSpecularStrength "1.438750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.0842 0.0842 0.0842 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.8491 0.8491 0.8491 1.0000" +r_bloomStreakXTint "0.0211 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0561 0.0561 0.0561 1.0371" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.9965 0.9965 0.9965 1.0000" +r_bloomStreakYTint "0.0281 0.0491 0.0491" + diff --git a/BO1/PC/ZM/vision/zombie_cosmodrome_poweron.vision b/BO1/PC/ZM/vision/zombie_cosmodrome_poweron.vision new file mode 100644 index 0000000..e93b4df --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_cosmodrome_poweron.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.189469" +r_filmMidEnd "0.396500" +r_filmDarkFeather "0.073688" +r_filmLightFeather "0.361375" +r_filmColorTemp "5418.8359 5418.8359 5418.8359" +r_filmSaturation "0.6035 0.6035 0.6035" +r_filmDarkTint "0.7791 0.8001 0.7791" +r_filmMidTint "0.8421 0.8421 0.8421" +r_filmLightTint "0.9054 0.9474 0.9474" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.1719 1.1789 1.1719" + +r_sCurveShoulderStrength "0.126250" +r_sCurveLinearStrength "0.224500" +r_sCurveLinearAngle "0.136844" +r_sCurveToeStrength "0.004497" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.172766" + +r_bloomTintWeights "0.1719 0.1719 0.1719 0.5403" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.2665 0.2665 0.2665 0.3474" +r_bloomCurveBreakpoint "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveLoGamma "0.1000 0.1000 0.1000 0.8980" +r_bloomCurveHiGamma "0.5840 0.5840 0.5840 1.3820" +r_bloomExpansionControl "0.6716 0.5895 0.7063 0.4158" +r_bloomExpansionWeights "0.7663 0.7663 0.7663 0.3589" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.771875" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.070313" +r_primaryLightTweakSpecularStrength "1.438750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.0842 0.0842 0.0842 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.8491 0.8491 0.8491 1.0000" +r_bloomStreakXTint "0.0211 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0561 0.0561 0.0561 1.0371" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.9965 0.9965 0.9965 1.0000" +r_bloomStreakYTint "0.0281 0.0491 0.0491" + diff --git a/BO1/PC/ZM/vision/zombie_cosmodrome_powerup.vision b/BO1/PC/ZM/vision/zombie_cosmodrome_powerup.vision new file mode 100644 index 0000000..316f0af --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_cosmodrome_powerup.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.189469" +r_filmMidEnd "0.396500" +r_filmDarkFeather "0.073688" +r_filmLightFeather "0.361375" +r_filmColorTemp "4927.0264 4927.0264 4927.0264" +r_filmSaturation "0.6035 0.6035 0.6035" +r_filmDarkTint "0.7791 0.8001 0.7791" +r_filmMidTint "0.8421 0.8421 0.8421" +r_filmLightTint "0.9053 0.9473 0.9473" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.1719 1.1789 1.1719" + +r_sCurveShoulderStrength "0.126250" +r_sCurveLinearStrength "0.224500" +r_sCurveLinearAngle "0.136844" +r_sCurveToeStrength "0.004497" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.172766" + +r_bloomTintWeights "0.8316 0.8316 0.8316 0.5403" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "1.2351 1.2351 1.2351 0.3474" +r_bloomCurveBreakpoint "0.0000 0.0000 0.0000 0.2281" +r_bloomCurveLoGamma "0.4125 0.4125 0.4125 0.8980" +r_bloomCurveHiGamma "0.5840 0.5840 0.5840 2.7026" +r_bloomExpansionControl "0.6716 0.5895 0.7063 0.4158" +r_bloomExpansionWeights "0.7663 0.7663 0.7663 1.0000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "3.000000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.070313" +r_primaryLightTweakSpecularStrength "1.438750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.0842 0.0842 0.0842 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.8491 0.8491 0.8491 1.0000" +r_bloomStreakXTint "0.0211 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0561 0.0561 0.0561 1.0371" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.9965 0.9965 0.9965 1.0000" +r_bloomStreakYTint "0.0281 0.0491 0.0491" + diff --git a/BO1/PC/ZM/vision/zombie_death.vision b/BO1/PC/ZM/vision/zombie_death.vision new file mode 100644 index 0000000..f68dc92 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_death.vision @@ -0,0 +1,82 @@ + +r_filmEnable "1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "1" +r_reviveFX_brightnessEdge "1" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "1" +r_reviveFX_motionblurWeight "1" +r_reviveFX_contrastCenter "1" +r_reviveFX_brightnessCenter "1" +r_reviveFX_desaturationCenter "1" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + + + +r_sCurveEnable "1" + + +r_filmMidStart "0.500000" +r_filmMidEnd "0.500000" +r_filmDarkFeather "1.000000" +r_filmLightFeather "1.000000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.8807 0.6456 0.4070" +r_filmDarkTint "0.9996 0.5299 0.4596" +r_filmMidTint "1.2508 0.6167 0.4761" +r_filmLightTint "0.9217 0.9217 0.8544" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.5000 1.5000 1.5000" + +r_sCurveShoulderStrength "0.068000" +r_sCurveLinearStrength "0.413000" +r_sCurveLinearAngle "0.093000" +r_sCurveToeStrength "0.116978" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.227992" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.199375" +r_primaryLightTweakSpecularStrength "1.500000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2105 0.2105 0.2105 0.1000" +r_bloomStreakXLevels1 "0.0000 0.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.2491 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.2526 0.2491 0.2500 0.1000" +r_bloomStreakYLevels1 "0.0000 0.9509 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.6246 0.4070 0.4070" + diff --git a/BO1/PC/ZM/vision/zombie_factory.vision b/BO1/PC/ZM/vision/zombie_factory.vision new file mode 100644 index 0000000..34875ed --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_factory.vision @@ -0,0 +1,68 @@ + +r_sCurveEnable "1" + +r_filmEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.500000" +r_filmMidEnd "0.500000" +r_filmDarkFeather "1.000000" +r_filmLightFeather "1.000000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.6946 0.6246 0.4911" +r_filmDarkTint "0.9587 1.0313 0.9617" +r_filmMidTint "0.9951 1.0526 0.9966" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0316 1.0316 1.0316" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.1123 0.1123 0.1123 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.6897 1.0022 0.8263 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.508750" +r_primaryLightTweakSpecularStrength "1.543750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.1754 0.1754 0.1754 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0351 0.0561" + diff --git a/BO1/PC/ZM/vision/zombie_humangun_upgraded_player_hit.vision b/BO1/PC/ZM/vision/zombie_humangun_upgraded_player_hit.vision new file mode 100644 index 0000000..89a9f83 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_humangun_upgraded_player_hit.vision @@ -0,0 +1,82 @@ + +r_filmEnable "1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + + + +r_sCurveEnable "1" + + +r_filmMidStart "0.161375" +r_filmMidEnd "0.182469" +r_filmDarkFeather "0.547375" +r_filmLightFeather "0.814000" +r_filmColorTemp "3123.9688 3534.0532 3534.0532" +r_filmSaturation "1.5087 1.8035 1.5087" +r_filmDarkTint "2.8839 2.3790 2.5054" +r_filmMidTint "0.9261 0.9473 1.4948" +r_filmLightTint "1.4106 1.1154 0.2948" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "2.0000 2.0000 2.0000" + +r_sCurveShoulderStrength "0.077188" +r_sCurveLinearStrength "0.185969" +r_sCurveLinearAngle "0.024563" +r_sCurveToeStrength "0.144700" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.227992" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.9123" +r_bloomColorScale "0.4210 0.4210 0.4210 1.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.2316 0.2316 0.2316 1.0000" +r_bloomCurveLoGamma "0.6551 0.6551 0.6551 1.0000" +r_bloomCurveHiGamma "4.0560 4.0560 4.0560 1.0000" +r_bloomExpansionControl "0.2800 0.8169 0.7853 0.5105" +r_bloomExpansionWeights "0.4095 0.1000 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.631250" +r_primaryLightTweakSpecularStrength "1.500000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/zombie_last_stand.vision b/BO1/PC/ZM/vision/zombie_last_stand.vision new file mode 100644 index 0000000..97dee2a --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_last_stand.vision @@ -0,0 +1,87 @@ + +r_filmEnable "0" + +r_reviveFX_enable "1" +r_reviveFX_contrastEdge "1.66" +r_reviveFX_brightnessEdge "0.264" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "0.85 0.95 0.94" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "20.0" +r_reviveFX_motionblurWeight "0.4" +r_reviveFX_contrastCenter "2.2" +r_reviveFX_brightnessCenter ".27" +r_reviveFX_desaturationCenter "0.71" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +snd_masterRingmod ".2" +snd_reverbRingmod "0.5" +snd_hiFilter "0" +snd_lowFilter "-20" + + + +r_sCurveEnable "1" + + +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.0000 0.0000 0.0000" +r_filmDarkTint "0.9997 0.9997 0.9997" +r_filmMidTint "0.9997 0.9997 0.9997" +r_filmLightTint "0.9997 0.9997 0.9997" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.2000 1.2000 1.2000" + +r_sCurveShoulderStrength "0.068000" +r_sCurveLinearStrength "0.413000" +r_sCurveLinearAngle "0.093000" +r_sCurveToeStrength "0.116978" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.227992" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.000000" +r_primaryLightTweakSpecularStrength "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/zombie_moonbiodome.vision b/BO1/PC/ZM/vision/zombie_moonbiodome.vision new file mode 100644 index 0000000..8f1a68d --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_moonbiodome.vision @@ -0,0 +1,82 @@ + +r_filmEnable "1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + + + +r_sCurveEnable "1" + + +r_filmMidStart "0.340344" +r_filmMidEnd "0.543875" +r_filmDarkFeather "0.700000" +r_filmLightFeather "0.700000" +r_filmColorTemp "5254.6563 4926.2969 5008.7520" +r_filmSaturation "0.7439 0.6386 0.4281" +r_filmDarkTint "0.9683 1.0734 1.0734" +r_filmMidTint "1.1156 1.2422 1.1889" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0105 1.0105 1.0105" + +r_sCurveShoulderStrength "0.147375" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.204203" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "2.950000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.473750" +r_primaryLightTweakSpecularStrength "1.122813" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.1228 0.0842 0.1228 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 0.5825" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/zombie_mountain.vision b/BO1/PC/ZM/vision/zombie_mountain.vision new file mode 100644 index 0000000..40d3d97 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_mountain.vision @@ -0,0 +1,27 @@ + + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + + +r_reviveFX_Enable "0" diff --git a/BO1/PC/ZM/vision/zombie_neutral.vision b/BO1/PC/ZM/vision/zombie_neutral.vision new file mode 100644 index 0000000..f13417c --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_neutral.vision @@ -0,0 +1,37 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/zombie_pentagon.vision b/BO1/PC/ZM/vision/zombie_pentagon.vision new file mode 100644 index 0000000..4d97645 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_pentagon.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.175375" +r_filmMidEnd "0.319313" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.887719" +r_filmColorTemp "6811.0796 6811.0796 6811.0796" +r_filmSaturation "0.7930 0.6386 0.5895" +r_filmDarkTint "0.7789 1.0314 0.9996" +r_filmMidTint "0.9261 0.9473 0.9996" +r_filmLightTint "0.9996 0.9996 1.0101" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.284219" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.119313" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.4630 0.4630 0.4630 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.5439 0.5439 0.5439 1.0000" +r_bloomCurveLoGamma "0.6551 0.5500 0.4808 1.0000" +r_bloomCurveHiGamma "1.0022 0.9660 1.0022 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.2011 0.1600 0.1600 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.719375" +r_primaryLightTweakSpecularStrength "1.578750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.1193 0.0351 0.1193 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 0.6421" +r_bloomStreakYTint "0.0000 0.0561 0.0491" + diff --git a/BO1/PC/ZM/vision/zombie_pentagon_offices_poweroff.vision b/BO1/PC/ZM/vision/zombie_pentagon_offices_poweroff.vision new file mode 100644 index 0000000..bd49be4 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_pentagon_offices_poweroff.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.119313" +r_filmMidEnd "0.319313" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.649125" +r_filmColorTemp "7139.4390 7139.4390 7139.4390" +r_filmSaturation "0.5052 0.5684 0.3931" +r_filmDarkTint "0.7789 0.9996 0.9996" +r_filmMidTint "0.8843 1.0101 0.9996" +r_filmLightTint "1.2206 1.2206 1.2315" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0104 1.0104 1.0104" + +r_sCurveShoulderStrength "0.126250" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.084219" +r_sCurveToeStrength "0.085135" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.530283" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.3649 0.3369 0.3369 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.6561 0.6561 0.6561 1.0000" +r_bloomCurveLoGamma "0.6551 0.5500 0.4808 1.0000" +r_bloomCurveHiGamma "1.0022 0.9660 1.0022 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.2011 0.1600 0.1600 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.210625" +r_primaryLightTweakSpecularStrength "2.070313" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0877 0.0877 0.0877 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 0.6421" +r_bloomStreakYTint "0.0000 0.0632 0.0842" + diff --git a/BO1/PC/ZM/vision/zombie_pentagon_warroom.vision b/BO1/PC/ZM/vision/zombie_pentagon_warroom.vision new file mode 100644 index 0000000..aae1097 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_pentagon_warroom.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.147375" +r_filmMidEnd "0.364875" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.887719" +r_filmColorTemp "6565.9048 6565.9048 6565.9048" +r_filmSaturation "0.2807 0.6948 0.2176" +r_filmDarkTint "1.0941 0.9996 0.9996" +r_filmMidTint "0.9261 1.0314 0.9893" +r_filmLightTint "0.9996 0.9996 0.9053" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.291219" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.158717" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.4069 0.1684 0.1684 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.7945 1.0717 1.1406 1.0000" +r_bloomCurveHiGamma "1.0022 0.9660 1.0022 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.2011 0.1600 0.1600 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.000000" +r_primaryLightTweakSpecularStrength "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0737 0.0737 0.0737 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 0.6421" +r_bloomStreakYTint "0.1123 0.0421 0.0421" + diff --git a/BO1/PC/ZM/vision/zombie_prototype.vision b/BO1/PC/ZM/vision/zombie_prototype.vision new file mode 100644 index 0000000..84ee900 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_prototype.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.196500" +r_filmMidEnd "0.343875" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.887719" +r_filmColorTemp "6565.9048 6565.9048 6565.9048" +r_filmSaturation "0.6808 0.5684 0.4773" +r_filmDarkTint "0.7789 0.9996 0.9996" +r_filmMidTint "1.0316 1.0104 1.0316" +r_filmLightTint "0.9996 0.9996 0.9053" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.256125" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.113169" +r_sCurveToeNumerator "0.011398" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.2805 0.2525 0.2525 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.6554 0.8634 0.7926 1.0000" +r_bloomCurveHiGamma "1.0022 0.9660 1.0022 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.1000" +r_bloomExpansionWeights "0.2011 0.1600 0.1600 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.508750" +r_primaryLightTweakSpecularStrength "1.578750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.1193 0.1193 0.1193 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 0.6421" +r_bloomStreakYTint "0.0772 0.0421 0.0421" + diff --git a/BO1/PC/ZM/vision/zombie_sumpf.vision b/BO1/PC/ZM/vision/zombie_sumpf.vision new file mode 100644 index 0000000..4a0e745 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_sumpf.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.210500" +r_filmMidEnd "0.315750" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.900000" +r_filmColorTemp "6484.1797 7057.7139 5828.1904" +r_filmSaturation "0.6176 0.5965 0.4211" +r_filmDarkTint "1.0313 1.0101 1.0101" +r_filmMidTint "1.0101 1.0313 0.9638" +r_filmLightTint "1.1151 1.0941 1.0941" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0625 1.0625 1.0000" + +r_sCurveShoulderStrength "0.203500" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.074614" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.1965 0.2245 0.2245 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.4000 0.4000 0.4000 1.0000" +r_bloomCurveLoGamma "0.6551 0.4817 0.3760 1.0000" +r_bloomCurveHiGamma "1.0022 1.0022 1.0022 1.0000" +r_bloomExpansionControl "0.7853 0.2958 0.5989 0.5232" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.333438" +r_primaryLightTweakSpecularStrength "1.368438" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.1263 0.1263 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0000 0.0842 0.0702" + diff --git a/BO1/PC/ZM/vision/zombie_sumpf_dogs.vision b/BO1/PC/ZM/vision/zombie_sumpf_dogs.vision new file mode 100644 index 0000000..ddec86b --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_sumpf_dogs.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.210500" +r_filmMidEnd "0.315750" +r_filmDarkFeather "0.900000" +r_filmLightFeather "0.900000" +r_filmColorTemp "6484.1797 7057.7139 5828.1904" +r_filmSaturation "0.7508 0.7297 0.5543" +r_filmDarkTint "1.1572 1.0101 1.0101" +r_filmMidTint "1.0101 1.0314 0.9638" +r_filmLightTint "1.1151 1.0941 1.0941" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0625 1.0625 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.144700" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.3510 0.3790 0.3790 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.4000 0.4000 0.4000 1.0000" +r_bloomCurveLoGamma "0.6551 0.4817 0.3763 1.0000" +r_bloomCurveHiGamma "1.0022 1.0022 1.0022 1.0000" +r_bloomExpansionControl "0.7853 0.2958 0.5989 0.5232" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.000000" +r_primaryLightTweakSpecularStrength "1.683750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0000 0.1263 0.1263 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0000 0.0842 0.0702" + diff --git a/BO1/PC/ZM/vision/zombie_temple.vision b/BO1/PC/ZM/vision/zombie_temple.vision new file mode 100644 index 0000000..71ada36 --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_temple.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.185969" +r_filmMidEnd "0.308750" +r_filmDarkFeather "1.000000" +r_filmLightFeather "1.000000" +r_filmColorTemp "6074.0957 5745.7358 7712.9736" +r_filmSaturation "0.9122 0.7859 1.0737" +r_filmDarkTint "1.0095 1.0941 1.5996" +r_filmMidTint "1.0523 0.9893 1.0942" +r_filmLightTint "1.3682 1.7263 1.8103" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0388 1.0456 1.0246" + +r_sCurveShoulderStrength "0.129750" +r_sCurveLinearStrength "0.550875" +r_sCurveLinearAngle "0.066625" +r_sCurveToeStrength "0.176262" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.106145" + +r_bloomTintWeights "0.0175 0.0316 0.0000 0.7298" +r_bloomColorScale "0.0000 0.0983 0.1965 0.0000" +r_bloomTintScale "0.4350 0.5334 0.2245 1.0000" +r_bloomCurveBreakpoint "0.1579 0.1614 0.1579 1.0000" +r_bloomCurveLoGamma "0.7942 0.8980 1.1740 1.1060" +r_bloomCurveHiGamma "1.8697 0.9326 0.6205 1.1060" +r_bloomExpansionControl "0.6147 0.6747 0.4000 0.4126" +r_bloomExpansionWeights "0.4379 0.4379 0.4379 0.9211" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "3.000000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.070313" +r_primaryLightTweakSpecularStrength "1.438750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.1053 0.0842 0.0842 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.8491 0.8491 0.8491 1.0000" +r_bloomStreakXTint "0.0421 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0491 0.0561 0.0561 1.0371" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "0.0000 0.0000 0.0000" +r_bloomStreakYTintControl "0.4947 0.4947 0.4947 1.0000" +r_bloomStreakYTint "0.1474 0.0913 0.0491" + diff --git a/BO1/PC/ZM/vision/zombie_temple_eclipse.vision b/BO1/PC/ZM/vision/zombie_temple_eclipse.vision new file mode 100644 index 0000000..a92632e --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_temple_eclipse.vision @@ -0,0 +1,64 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.200000" +r_filmMidEnd "0.143875" +r_filmDarkFeather "0.357906" +r_filmLightFeather "0.445625" +r_filmColorTemp "6975.2593 6729.3545 8613.4082" +r_filmSaturation "0.9122 0.8702 0.7158" +r_filmDarkTint "1.0095 1.0941 1.0948" +r_filmMidTint "0.9894 1.0104 1.1158" +r_filmLightTint "1.1790 1.1790 1.2422" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.1300 1.1367 1.1018" + +r_sCurveShoulderStrength "0.068000" +r_sCurveLinearStrength "0.413000" +r_sCurveLinearAngle "0.093000" +r_sCurveToeStrength "0.116978" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.227992" + +r_bloomTintWeights "0.0385 0.0526 0.0806 0.7298" +r_bloomColorScale "0.0561 0.0561 0.1542 0.0000" +r_bloomTintScale "0.4350 0.5334 0.5614 1.0000" +r_bloomCurveBreakpoint "0.1579 0.1614 0.1579 1.0000" +r_bloomCurveLoGamma "0.7942 0.8980 1.1740 1.1060" +r_bloomCurveHiGamma "1.8697 0.9320 0.6205 1.1060" +r_bloomExpansionControl "0.6147 0.6747 0.4000 0.4126" +r_bloomExpansionWeights "0.4379 0.4379 0.4379 0.9211" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "3.000000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.070313" +r_primaryLightTweakSpecularStrength "1.438750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.1053 0.0842 0.0842 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.8491 0.8491 0.8491 1.0000" +r_bloomStreakXTint "0.0421 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0491 0.0561 0.0561 1.0371" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "0.0000 0.0000 0.0000" +r_bloomStreakYTintControl "0.4947 0.4947 0.4947 1.0000" +r_bloomStreakYTint "0.1474 0.0913 0.0491" + diff --git a/BO1/PC/ZM/vision/zombie_theater.vision b/BO1/PC/ZM/vision/zombie_theater.vision new file mode 100644 index 0000000..5428f3b --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_theater.vision @@ -0,0 +1,82 @@ + +r_filmEnable "1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "1" +r_reviveFX_brightnessEdge "1" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "1" +r_reviveFX_motionblurWeight "1" +r_reviveFX_contrastCenter "1" +r_reviveFX_brightnessCenter "1" +r_reviveFX_desaturationCenter "1" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + + + +r_sCurveEnable "1" + + +r_filmMidStart "0.182469" +r_filmMidEnd "0.463125" +r_filmDarkFeather "0.600000" +r_filmLightFeather "0.600000" +r_filmColorTemp "6401.7251 6484.1797 5992.3706" +r_filmSaturation "0.6737 0.7509 0.6105" +r_filmDarkTint "0.8843 0.9473 1.0106" +r_filmMidTint "1.0101 1.0101 1.0314" +r_filmLightTint "0.9996 0.9996 1.0101" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0176 1.0176 1.0176" + +r_sCurveShoulderStrength "0.157875" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.5190 0.5190 0.5190 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.4947 0.4947 0.4947 1.0000" +r_bloomCurveLoGamma "0.5500 0.6205 0.7942 1.0000" +r_bloomCurveHiGamma "1.0022 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.1000 0.4316 0.5011 0.5863" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "2.070313" +r_primaryLightTweakSpecularStrength "1.438750" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.0842 0.0842 0.0842 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.8491 0.8491 0.8491 1.0000" +r_bloomStreakXTint "0.0211 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0561 0.0561 0.0561 1.0371" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.9965 0.9965 0.9965 1.0000" +r_bloomStreakYTint "0.0281 0.0491 0.0491" + diff --git a/BO1/PC/ZM/vision/zombie_theater_erooms_pentagon.vision b/BO1/PC/ZM/vision/zombie_theater_erooms_pentagon.vision new file mode 100644 index 0000000..fd357de --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_theater_erooms_pentagon.vision @@ -0,0 +1,62 @@ + + +r_filmMidStart "0.259625" +r_filmMidEnd "0.389469" +r_filmDarkFeather "0.700000" +r_filmLightFeather "0.700000" +r_filmColorTemp "6565.9048 6565.9048 6565.9048" +r_filmSaturation "0.8421 0.6456 0.1335" +r_filmDarkTint "0.9473 1.0099 1.0099" +r_filmMidTint "0.9261 1.0941 1.0941" +r_filmLightTint "0.9996 0.9996 0.9053" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0526 1.0526 1.0526" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.5894 0.5614 0.5759 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.7580 0.6205 0.5840 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5768 0.1000 0.5674 0.1000" +r_bloomExpansionWeights "0.1000 0.1000 0.1442 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "1.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.000000" +r_primaryLightTweakSpecularStrength "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0772 0.0772 0.0772 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "0.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.1474 0.2176 0.2176" + diff --git a/BO1/PC/ZM/vision/zombie_turned.vision b/BO1/PC/ZM/vision/zombie_turned.vision new file mode 100644 index 0000000..b40c55b --- /dev/null +++ b/BO1/PC/ZM/vision/zombie_turned.vision @@ -0,0 +1,39 @@ + + +r_filmEnable "1" +r_filmMidStart "0.25" +r_filmMidEnd "0.75" +r_filmDarkFeather "0.5" +r_filmLightFeather "0.5" +r_filmColorTemp "6500 6500 6500" +r_filmHue "0 0 0" +r_filmSaturation "1 1 1" +r_filmDarkTint "1 1 1" +r_filmMidTint "1 1 1" +r_filmLightTint "1 1 1" +r_filmContrast "1 1 1" + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "0" +r_reviveFX_brightnessEdge "0" +r_reviveFX_desaturationEdge "0" +r_reviveFX_darkTintEdge "1 1 1" +r_reviveFX_lightTintEdge "1 1 1" +r_reviveFX_blurRadiusEdge "0" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "0" +r_reviveFX_brightnessCenter "0" +r_reviveFX_desaturationCenter "0" +r_reviveFX_darkTintCenter "1 1 1" +r_reviveFX_lightTintCenter "1 1 1" + + + +r_sCurveEnable "1" +r_sCurveShoulderStrength "0.068" +r_sCurveLinearStrength "0.413" +r_sCurveLinearAngle "0.093" +r_sCurveToeStrength "0.117" +r_sCurveToeNumerator "0.000" +r_sCurveToeDenominator "0.228" + diff --git a/BO1/PC/ZM/vision/zombietron_afternoon_death.vision b/BO1/PC/ZM/vision/zombietron_afternoon_death.vision new file mode 100644 index 0000000..ce8834e --- /dev/null +++ b/BO1/PC/ZM/vision/zombietron_afternoon_death.vision @@ -0,0 +1,93 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "1" + +/* + +r_reviveFX_enable "0" +r_reviveFX_contrastEdge "1.6" +r_reviveFX_brightnessEdge "0.34" +r_reviveFX_desaturationEdge "1" +r_reviveFX_darkTintEdge "0.93 0.94 0.95" +r_reviveFX_lightTintEdge "1 1.03 1.02" +r_reviveFX_blurRadiusEdge "3.5" +r_reviveFX_motionblurWeight "0" +r_reviveFX_contrastCenter "1.76" +r_reviveFX_brightnessCenter "0.234" +r_reviveFX_desaturationCenter "0.845" +r_reviveFX_darkTintCenter "0.978 1.01 0.975" +r_reviveFX_lightTintCenter "1.02 1 0.99" + +*/ + +r_reviveFX_edgeColorTemp "6741" +r_reviveFX_edgeSaturation "1.15" +r_reviveFX_edgeScale "0.88 0.92 0.92" +r_reviveFX_edgeContrast "0 0 0" +r_reviveFX_edgeOffset "-2 -2 -2" +r_reviveFX_edgeMaskAdjust "-0.78" +r_reviveFX_edgeAmount "1" + + +r_filmMidStart "0.400000" +r_filmMidEnd "0.536844" +r_filmDarkFeather "0.392969" +r_filmLightFeather "0.757875" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "1.0000 1.0000 1.0000" +r_filmDarkTint "0.8640 0.6527 0.5561" +r_filmMidTint "1.0230 0.7579 0.5951" +r_filmLightTint "1.8101 1.1366 0.9051" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.105250" +r_sCurveLinearStrength "0.143875" +r_sCurveLinearAngle "0.101750" +r_sCurveToeStrength "0.211321" +r_sCurveToeNumerator "0.007016" +r_sCurveToeDenominator "0.085135" + +r_bloomTintWeights "0.4842 0.4842 0.4842 0.0000" +r_bloomColorScale "0.0843 0.0843 0.0843 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.0737 0.0737 0.0737 1.0000" +r_bloomCurveLoGamma "1.2797 1.2797 1.2797 1.4534" +r_bloomCurveHiGamma "1.0022 1.0022 1.0022 1.0000" +r_bloomExpansionControl "0.2105 1.0000 0.1000 1.0000" +r_bloomExpansionWeights "1.0000 1.0000 1.0000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.7158 0.7158 0.7158 1.8697" +r_bloomStreakXLevels1 "0.8000 0.0000 0.1053 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "0.8281 0.8281 0.8281" +r_bloomStreakXTintControl "0.5088 0.5088 0.5088 1.0000" +r_bloomStreakXTint "0.0702 0.0702 0.0702" + +r_bloomStreakYLevels0 "0.0000 0.0000 0.0000 1.0000" +r_bloomStreakYLevels1 "0.3368 0.1789 0.0561 0.2316" +r_bloomStreakYInnerTint "0.9614 0.6526 0.6000" +r_bloomStreakYOuterTint "0.9789 0.9018 0.8982" +r_bloomStreakYTintControl "0.3228 0.3228 0.3228 1.0000" +r_bloomStreakYTint "0.2667 0.1965 0.1192" + diff --git a/BO1/PC/ZM/vision/zombietron_day.vision b/BO1/PC/ZM/vision/zombietron_day.vision new file mode 100644 index 0000000..f75fd63 --- /dev/null +++ b/BO1/PC/ZM/vision/zombietron_day.vision @@ -0,0 +1,68 @@ + +r_filmEnable "1" + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.250000" +r_filmMidEnd "0.750000" +r_filmDarkFeather "0.500000" +r_filmLightFeather "0.500000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "1.0000 1.0000 1.0000" +r_filmDarkTint "0.9997 0.9997 0.9997" +r_filmMidTint "0.9997 0.9997 0.9997" +r_filmLightTint "0.9997 0.9997 0.9997" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.109985" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.5000 0.2500 0.0000" +r_bloomColorScale "0.0000 0.0000 0.0000 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiGamma "1.0000 1.0000 1.0000 1.0000" +r_bloomExpansionControl "0.5000 0.5000 0.5000 0.5000" +r_bloomExpansionWeights "0.1000 0.1000 0.1000 0.1000" +r_bloomExpansionSource "0.100000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.000000" +r_primaryLightTweakSpecularStrength "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.2500 0.5000 0.2500 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/zombietron_evening_rooftop.vision b/BO1/PC/ZM/vision/zombietron_evening_rooftop.vision new file mode 100644 index 0000000..1bca892 --- /dev/null +++ b/BO1/PC/ZM/vision/zombietron_evening_rooftop.vision @@ -0,0 +1,66 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.300000" +r_filmMidEnd "0.700000" +r_filmDarkFeather "0.100000" +r_filmLightFeather "1.000000" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "1.2842 1.2842 1.2842" +r_filmDarkTint "0.9683 0.9683 0.9683" +r_filmMidTint "0.9683 0.9683 0.9683" +r_filmLightTint "1.3684 1.3684 1.3684" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.052625" +r_sCurveLinearStrength "0.108781" +r_sCurveLinearAngle "0.080688" +r_sCurveToeStrength "0.162245" +r_sCurveToeNumerator "0.015789" +r_sCurveToeDenominator "0.176231" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.3790 0.3790 0.3790 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "0.1158 0.1158 0.1158 1.0000" +r_bloomCurveLoGamma "1.3140 1.3140 1.3140 1.0000" +r_bloomCurveHiGamma "0.9669 0.9669 0.9669 1.0000" +r_bloomExpansionControl "1.0000 0.1000 0.1000 0.1000" +r_bloomExpansionWeights "1.0000 1.0000 1.0000 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/vision/zombietron_morning.vision b/BO1/PC/ZM/vision/zombietron_morning.vision new file mode 100644 index 0000000..17e47c9 --- /dev/null +++ b/BO1/PC/ZM/vision/zombietron_morning.vision @@ -0,0 +1,70 @@ + +r_filmEnable "1" + + + +r_sCurveEnable "1" + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.259625" +r_filmMidEnd "0.147375" +r_filmDarkFeather "0.642094" +r_filmLightFeather "0.652625" +r_filmColorTemp "6499.5029 6499.5029 6499.5029" +r_filmSaturation "0.8491 0.7402 0.6736" +r_filmDarkTint "1.0734 0.9893 0.9893" +r_filmMidTint "0.9683 1.0102 0.9683" +r_filmLightTint "0.9996 0.9996 0.9996" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "1.0000 1.0000 1.0000" + +r_sCurveShoulderStrength "0.100000" +r_sCurveLinearStrength "0.500000" +r_sCurveLinearAngle "0.125000" +r_sCurveToeStrength "0.232331" +r_sCurveToeNumerator "0.010000" +r_sCurveToeDenominator "0.574988" + +r_bloomTintWeights "0.2500 0.2500 0.2500 0.0000" +r_bloomColorScale "0.2385 0.2245 0.2243 0.0000" +r_bloomTintScale "0.0000 0.0000 0.0000 1.0000" +r_bloomCurveBreakpoint "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoGamma "0.2734 0.2734 0.2734 1.0000" +r_bloomCurveHiGamma "0.1022 0.1000 0.1000 1.0000" +r_bloomExpansionControl "0.5042 0.1000 0.4979 0.1000" +r_bloomExpansionWeights "0.1789 0.1821 0.1789 0.1000" +r_bloomExpansionSource "1.000000" +r_bloomBlurRadius "1.750000" +r_bloomPersistence "0.000000" + +r_primaryLightUseTweaks "1.000000" +r_primaryLightTweakDiffuseStrength "1.000000" +r_primaryLightTweakSpecularStrength "1.000000" + + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.0632 0.1158 0.1158 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "0.0000 0.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.1123 0.0702 0.0632" + diff --git a/BO1/PC/ZM/vision/zombietron_morning_island.vision b/BO1/PC/ZM/vision/zombietron_morning_island.vision new file mode 100644 index 0000000..d6a0b64 --- /dev/null +++ b/BO1/PC/ZM/vision/zombietron_morning_island.vision @@ -0,0 +1,59 @@ + +r_reviveFX_Enable "0" + + +r_filmMidStart "0.274000" +r_filmMidEnd "0.246000" +r_filmDarkFeather "0.631594" +r_filmLightFeather "1.000000" +r_filmColorTemp "3779.9578 3779.9578 3779.9578" +r_filmSaturation "1.0000 1.0456 1.0000" +r_filmDarkTint "1.1152 1.0942 1.0101" +r_filmMidTint "1.2206 1.2842 1.0523" +r_filmLightTint "1.0733 2.5052 2.5052" +r_filmBleach "0.0000 0.0000 0.0000" +r_filmContrast "0.6807 0.6807 0.6807" + +r_sCurveShoulderStrength "0.038594" +r_sCurveLinearStrength "0.161406" +r_sCurveLinearAngle "0.014031" +r_sCurveToeStrength "0.176262" +r_sCurveToeNumerator "0.000000" +r_sCurveToeDenominator "0.116665" + +r_bloomTintWeights "0.0842 0.0842 0.0842 1.0000" +r_bloomColorScale "0.3088 0.3088 0.3088 0.0035" +r_bloomTintScale "0.1965 0.1965 0.1965 1.0000" +r_bloomCurveBreakpoint "0.5614 0.5614 0.5614 0.0000" +r_bloomCurveLoGamma "0.1689 0.1689 0.1689 3.5000" +r_bloomCurveHiGamma "1.8005 1.8005 1.8005 0.8980" +r_bloomExpansionControl "0.4126 0.5768 0.1537 0.3368" +r_bloomExpansionWeights "1.0000 1.0000 1.0000 0.2800" +r_bloomExpansionSource "0.996850" +r_bloomBlurRadius "1.856125" +r_bloomPersistence "0.200000" + +r_bloomCurveLoBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveLoRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveLoRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiWhite "1.0000 1.0000 1.0000 1.0000" +r_bloomCurveHiRemapBlack "0.1000 0.1000 0.1000 0.1000" +r_bloomCurveHiRemapWhite "1.0000 1.0000 1.0000 1.0000" +r_filmHue "0.0000 0.0000 0.0000" + +r_bloomStreakXLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakXInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakXOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakXTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakXTint "0.0000 0.0000 0.0000" + +r_bloomStreakYLevels0 "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYLevels1 "0.0000 1.0000 0.0000 1.0000" +r_bloomStreakYInnerTint "1.0000 1.0000 1.0000" +r_bloomStreakYOuterTint "1.0000 1.0000 1.0000" +r_bloomStreakYTintControl "0.3300 0.3300 0.3300 1.0000" +r_bloomStreakYTint "0.0000 0.0000 0.0000" + diff --git a/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_bodyalias.gsc b/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_bodyalias.gsc new file mode 100644 index 0000000..3ad5fe0 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_bodyalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_bodyalias_zt.gsc b/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_bodyalias_zt.gsc new file mode 100644 index 0000000..16f7cc6 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_bodyalias_zt.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_headalias.gsc b/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_headalias.gsc new file mode 100644 index 0000000..d94a1ca Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_headalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_headalias_zt.gsc b/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_headalias_zt.gsc new file mode 100644 index 0000000..bdeec94 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_ger_honorguard_zomb_headalias_zt.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_viet_zombie_nva1_head_alias.gsc b/BO1/PC/ZM/xmodelalias/c_viet_zombie_nva1_head_alias.gsc new file mode 100644 index 0000000..2fd29c0 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_viet_zombie_nva1_head_alias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_body_alias.gsc b/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_body_alias.gsc new file mode 100644 index 0000000..c34f283 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_body_alias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_larmoff_alias.gsc b/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_larmoff_alias.gsc new file mode 100644 index 0000000..8138f3e Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_larmoff_alias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_legsoff_alias.gsc b/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_legsoff_alias.gsc new file mode 100644 index 0000000..cf2fb5d Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_legsoff_alias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_llegoff_alias.gsc b/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_llegoff_alias.gsc new file mode 100644 index 0000000..b161f36 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_llegoff_alias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_rarmoff_alias.gsc b/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_rarmoff_alias.gsc new file mode 100644 index 0000000..c2066e9 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_viet_zombie_vc_g_rarmoff_alias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_zom_cosmo_cosmonaut_headalias.gsc b/BO1/PC/ZM/xmodelalias/c_zom_cosmo_cosmonaut_headalias.gsc new file mode 100644 index 0000000..52b98da Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_zom_cosmo_cosmonaut_headalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_zom_cosmo_headalias.gsc b/BO1/PC/ZM/xmodelalias/c_zom_cosmo_headalias.gsc new file mode 100644 index 0000000..5ee5e00 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_zom_cosmo_headalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_zom_head_alias.gsc b/BO1/PC/ZM/xmodelalias/c_zom_head_alias.gsc new file mode 100644 index 0000000..547ad32 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_zom_head_alias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_zom_moon_tech_caps1_alias.gsc b/BO1/PC/ZM/xmodelalias/c_zom_moon_tech_caps1_alias.gsc new file mode 100644 index 0000000..2a0e671 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_zom_moon_tech_caps1_alias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/c_zom_moon_tech_caps2_alias.gsc b/BO1/PC/ZM/xmodelalias/c_zom_moon_tech_caps2_alias.gsc new file mode 100644 index 0000000..09386c1 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/c_zom_moon_tech_caps2_alias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_larmoffalias.gsc b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_larmoffalias.gsc new file mode 100644 index 0000000..dc990be Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_larmoffalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_legsoffalias.gsc b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_legsoffalias.gsc new file mode 100644 index 0000000..d4c58c8 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_legsoffalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_llegoffalias.gsc b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_llegoffalias.gsc new file mode 100644 index 0000000..30f0598 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_llegoffalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_rarmoffalias.gsc b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_rarmoffalias.gsc new file mode 100644 index 0000000..be13e19 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_rarmoffalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_rlegoffalias.gsc b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_rlegoffalias.gsc new file mode 100644 index 0000000..a6a414b Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_rlegoffalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_torsoalias.gsc b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_torsoalias.gsc new file mode 100644 index 0000000..7d81ada Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/char_ger_hnrgrd_body1_g_torsoalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/char_jap_impinf2_zombieheadalias.gsc b/BO1/PC/ZM/xmodelalias/char_jap_impinf2_zombieheadalias.gsc new file mode 100644 index 0000000..d94a1ca Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/char_jap_impinf2_zombieheadalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/char_jap_impinf_mk_b5z_g_larmoffalias.gsc b/BO1/PC/ZM/xmodelalias/char_jap_impinf_mk_b5z_g_larmoffalias.gsc new file mode 100644 index 0000000..b2e03e2 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/char_jap_impinf_mk_b5z_g_larmoffalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/char_jap_impinf_mk_b5z_g_torsoalias.gsc b/BO1/PC/ZM/xmodelalias/char_jap_impinf_mk_b5z_g_torsoalias.gsc new file mode 100644 index 0000000..0f7d729 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/char_jap_impinf_mk_b5z_g_torsoalias.gsc differ diff --git a/BO1/PC/ZM/xmodelalias/char_jap_impinf_zombiebody5alias.gsc b/BO1/PC/ZM/xmodelalias/char_jap_impinf_zombiebody5alias.gsc new file mode 100644 index 0000000..4214a49 Binary files /dev/null and b/BO1/PC/ZM/xmodelalias/char_jap_impinf_zombiebody5alias.gsc differ diff --git a/BO1/PC/ZM/zombie_coast b/BO1/PC/ZM/zombie_coast new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_coast_load b/BO1/PC/ZM/zombie_coast_load new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_cod5_asylum b/BO1/PC/ZM/zombie_cod5_asylum new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_cod5_asylum_load b/BO1/PC/ZM/zombie_cod5_asylum_load new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_cod5_asylum_patch b/BO1/PC/ZM/zombie_cod5_asylum_patch new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_cod5_factory b/BO1/PC/ZM/zombie_cod5_factory new file mode 100644 index 0000000..cd5f52e --- /dev/null +++ b/BO1/PC/ZM/zombie_cod5_factory @@ -0,0 +1,5 @@ +^1ERROR: Couldn't open techniqueSet 'pimp/techsets/l_sm_b0c0_b1c1n1s1.techset' +^1Cannot create techset 'l_sm_b0c0_b1c1n1s1'. The offending 2-layer combination is: +wc/zombie_factory_notes +wc/glo_dec_blood_smear02_blend +^1 failed loading material '*111_187n' for asset 'sp/frag_grenade_zm' found in source file '../ps3/main_shared/aitype/zombie_dog.csv' diff --git a/BO1/PC/ZM/zombie_cod5_factory_load b/BO1/PC/ZM/zombie_cod5_factory_load new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_cod5_factory_patch b/BO1/PC/ZM/zombie_cod5_factory_patch new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_cod5_prototype b/BO1/PC/ZM/zombie_cod5_prototype new file mode 100644 index 0000000..b1e1161 --- /dev/null +++ b/BO1/PC/ZM/zombie_cod5_prototype @@ -0,0 +1,3 @@ +^1ERROR: No collmap for bone [door_l_jnt_d] but it has a physPreset [veh_car_door_physpreset_mp] in destructible file [dest_opel_blitz] model [dest_opel_blitz_full] piece [1] stage [1] +^1ERROR: No collmap for bone [door_r_jnt_d] but it has a physPreset [veh_car_door_physpreset_mp] in destructible file [dest_opel_blitz] model [dest_opel_blitz_full] piece [2] stage [1] +^1ERROR: No collmap for bone [hood_jnt_d] but it has a physPreset [veh_car_door_physpreset_mp] in destructible file [dest_opel_blitz] model [dest_opel_blitz_full] piece [3] stage [1] diff --git a/BO1/PC/ZM/zombie_cod5_prototype_load b/BO1/PC/ZM/zombie_cod5_prototype_load new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_cod5_sumpf b/BO1/PC/ZM/zombie_cod5_sumpf new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_cod5_sumpf_load b/BO1/PC/ZM/zombie_cod5_sumpf_load new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_cod5_sumpf_patch b/BO1/PC/ZM/zombie_cod5_sumpf_patch new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_cosmodrome_load b/BO1/PC/ZM/zombie_cosmodrome_load new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_moon b/BO1/PC/ZM/zombie_moon new file mode 100644 index 0000000..2b873a7 --- /dev/null +++ b/BO1/PC/ZM/zombie_moon @@ -0,0 +1,3 @@ +^1ERROR: Couldn't find material 'sun_flare_icbm' +^1 failed loading material 'sun_flare_icbm' for asset 'sp/frag_grenade_zm' found in source file '../ps3/main_shared/aitype/zombie_moon_zombie_astronaut.csv' +^1ERROR: zmb_gersh_device has missing occlusion in soundaliases/zones/snapshot/zmb_moon.snapshot.csv diff --git a/BO1/PC/ZM/zombie_moon_load b/BO1/PC/ZM/zombie_moon_load new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_moon_patch b/BO1/PC/ZM/zombie_moon_patch new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_pentagon b/BO1/PC/ZM/zombie_pentagon new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_pentagon_patch b/BO1/PC/ZM/zombie_pentagon_patch new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_temple b/BO1/PC/ZM/zombie_temple new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_temple_load b/BO1/PC/ZM/zombie_temple_load new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombie_theater b/BO1/PC/ZM/zombie_theater new file mode 100644 index 0000000..a51dbfc --- /dev/null +++ b/BO1/PC/ZM/zombie_theater @@ -0,0 +1,2 @@ +^1ERROR: Could not open 'devgui_zombie_theater.cfg' +^1 failed loading 'devgui_zombie_theater.cfg' of type 'rawfile' found in source file '../share/zone_source/zombie_theater.csv' diff --git a/BO1/PC/ZM/zombie_theater_patch b/BO1/PC/ZM/zombie_theater_patch new file mode 100644 index 0000000..e69de29 diff --git a/BO1/PC/ZM/zombietron b/BO1/PC/ZM/zombietron new file mode 100644 index 0000000..1cca46a --- /dev/null +++ b/BO1/PC/ZM/zombietron @@ -0,0 +1,12 @@ +^1Can not create merged weapon weapon_zombie_auto_turret. Too few attachments, must have at least two. +^1 failed loading 'sp/weapon_zombie_auto_turret' of type 'weapon' found in source file '../share/zone_source/zombietron.csv' +^1ERROR: Could not open '../ps3/main_shared/character/zombie_ape.csv' +^1 failed loading 'zombie_ape' of type 'character' found in source file '../share/zone_source/zombietron.csv' +^1ERROR: Could not open '../ps3/main_shared/character/zombie_sergei.csv' +^1 failed loading 'zombie_sergei' of type 'character' found in source file '../share/zone_source/zombietron.csv' +^1ERROR: Could not open '../ps3/main_shared/character/zombie_quad.csv' +^1 failed loading 'zombie_quad' of type 'character' found in source file '../share/zone_source/zombietron.csv' +^1ERROR: Could not open '../ps3/main_shared/character/zombie_dog.csv' +^1 failed loading 'zombie_dog' of type 'character' found in source file '../share/zone_source/zombietron.csv' +^1ERROR: Could not open '../ps3/main_shared/character/zombie_engineer.csv' +^1 failed loading 'zombie_engineer' of type 'character' found in source file '../share/zone_source/zombietron.csv'