mirror of
https://github.com/InfinityLoader/IL-GSC.git
synced 2025-06-07 17:17:50 -05:00
566 lines
15 KiB
Plaintext
566 lines
15 KiB
Plaintext
/*******************************************************************
|
|
* Decompiled By: Bog
|
|
* Decompiled File: maps\mp\_tabun.gsc
|
|
* Game: Call of Duty: Black Ops 2
|
|
* Platform: PC
|
|
* Function Count: 19
|
|
* Decompile Time: 7 ms
|
|
* Timestamp: 10/28/2023 12:11:03 AM
|
|
*******************************************************************/
|
|
|
|
#include common_scripts/utility;
|
|
#include maps/mp/_utility;
|
|
#include maps/mp/gametypes/_battlechatter_mp;
|
|
#include maps/mp/killstreaks/_airsupport;
|
|
#include maps/mp/killstreaks/_dogs;
|
|
|
|
//Function Number: 1
|
|
init()
|
|
{
|
|
level.tabuninitialgasshockduration = weapons_get_dvar_int("scr_tabunInitialGasShockDuration","7");
|
|
level.tabunwalkingasshockduration = weapons_get_dvar_int("scr_tabunWalkInGasShockDuration","4");
|
|
level.tabungasshockradius = weapons_get_dvar_int("scr_tabun_shock_radius","185");
|
|
level.tabungasshockheight = weapons_get_dvar_int("scr_tabun_shock_height","20");
|
|
level.tabungaspoisonradius = weapons_get_dvar_int("scr_tabun_effect_radius","185");
|
|
level.tabungaspoisonheight = weapons_get_dvar_int("scr_tabun_shock_height","20");
|
|
level.tabungasduration = weapons_get_dvar_int("scr_tabunGasDuration","8");
|
|
level.poisonduration = weapons_get_dvar_int("scr_poisonDuration","8");
|
|
level.poisondamage = weapons_get_dvar_int("scr_poisonDamage","13");
|
|
level.poisondamagehardcore = weapons_get_dvar_int("scr_poisonDamageHardcore","5");
|
|
level.fx_tabun_0 = "tabun_tiny_mp";
|
|
level.fx_tabun_1 = "tabun_small_mp";
|
|
level.fx_tabun_2 = "tabun_medium_mp";
|
|
level.fx_tabun_3 = "tabun_large_mp";
|
|
level.fx_tabun_single = "tabun_center_mp";
|
|
precacheitem(level.fx_tabun_0);
|
|
precacheitem(level.fx_tabun_1);
|
|
precacheitem(level.fx_tabun_2);
|
|
precacheitem(level.fx_tabun_3);
|
|
precacheitem(level.fx_tabun_single);
|
|
level.fx_tabun_radius0 = weapons_get_dvar_int("scr_fx_tabun_radius0",55);
|
|
level.fx_tabun_radius1 = weapons_get_dvar_int("scr_fx_tabun_radius1",55);
|
|
level.fx_tabun_radius2 = weapons_get_dvar_int("scr_fx_tabun_radius2",50);
|
|
level.fx_tabun_radius3 = weapons_get_dvar_int("scr_fx_tabun_radius3",25);
|
|
level.sound_tabun_start = "wpn_gas_hiss_start";
|
|
level.sound_tabun_loop = "wpn_gas_hiss_lp";
|
|
level.sound_tabun_stop = "wpn_gas_hiss_end";
|
|
level.sound_shock_tabun_start = "";
|
|
level.sound_shock_tabun_loop = "";
|
|
level.sound_shock_tabun_stop = "";
|
|
/#
|
|
level thread checkdvarupdates();
|
|
#/
|
|
}
|
|
|
|
//Function Number: 2
|
|
checkdvarupdates()
|
|
{
|
|
while(1)
|
|
{
|
|
level.tabungaspoisonradius = weapons_get_dvar_int("scr_tabun_effect_radius",level.tabungaspoisonradius);
|
|
level.tabungaspoisonheight = weapons_get_dvar_int("scr_tabun_shock_height",level.tabungaspoisonheight);
|
|
level.tabungasshockradius = weapons_get_dvar_int("scr_tabun_shock_radius",level.tabungasshockradius);
|
|
level.tabungasshockheight = weapons_get_dvar_int("scr_tabun_shock_height",level.tabungasshockheight);
|
|
level.tabuninitialgasshockduration = weapons_get_dvar_int("scr_tabunInitialGasShockDuration",level.tabuninitialgasshockduration);
|
|
level.tabunwalkingasshockduration = weapons_get_dvar_int("scr_tabunWalkInGasShockDuration",level.tabunwalkingasshockduration);
|
|
level.tabungasduration = weapons_get_dvar_int("scr_tabunGasDuration",level.tabungasduration);
|
|
level.poisonduration = weapons_get_dvar_int("scr_poisonDuration",level.poisonduration);
|
|
level.poisondamage = weapons_get_dvar_int("scr_poisonDamage",level.poisondamage);
|
|
level.poisondamagehardcore = weapons_get_dvar_int("scr_poisonDamageHardcore",level.poisondamagehardcore);
|
|
level.fx_tabun_radius0 = weapons_get_dvar_int("scr_fx_tabun_radius0",level.fx_tabun_radius0);
|
|
level.fx_tabun_radius1 = weapons_get_dvar_int("scr_fx_tabun_radius1",level.fx_tabun_radius1);
|
|
level.fx_tabun_radius2 = weapons_get_dvar_int("scr_fx_tabun_radius2",level.fx_tabun_radius2);
|
|
level.fx_tabun_radius3 = weapons_get_dvar_int("scr_fx_tabun_radius3",level.fx_tabun_radius3);
|
|
wait(1);
|
|
}
|
|
}
|
|
|
|
//Function Number: 3
|
|
watchtabungrenadedetonation(owner)
|
|
{
|
|
self waittill("explode",position,surface);
|
|
if(!IsDefined(level.water_duds) || level.water_duds == 1)
|
|
{
|
|
if(IsDefined(surface) && surface == "water")
|
|
{
|
|
return;
|
|
}
|
|
}
|
|
|
|
if(weapons_get_dvar_int("scr_enable_new_tabun",1))
|
|
{
|
|
generatelocations(position,owner);
|
|
}
|
|
else
|
|
{
|
|
singlelocation(position,owner);
|
|
}
|
|
}
|
|
|
|
//Function Number: 4
|
|
damageeffectarea(owner,position,radius,height,killcament)
|
|
{
|
|
shockeffectarea = spawn("trigger_radius",position,0,radius,height);
|
|
gaseffectarea = spawn("trigger_radius",position,0,radius,height);
|
|
/#
|
|
if(GetDvarInt(#"9CB86F60"))
|
|
{
|
|
level thread drawcylinder(position,radius,height,undefined,"tabun_draw_cylinder_stop");
|
|
}
|
|
#/
|
|
owner thread maps/mp/killstreaks/_dogs::flash_dogs(shockeffectarea);
|
|
owner thread maps/mp/killstreaks/_dogs::flash_dogs(gaseffectarea);
|
|
loopwaittime = 0.5;
|
|
for(durationoftabun = level.tabungasduration;durationoftabun > 0;durationoftabun = durationoftabun - loopwaittime)
|
|
{
|
|
players = get_players();
|
|
for(i = 0;i < players.size;i++)
|
|
{
|
|
if(level.friendlyfire == 0)
|
|
{
|
|
if(players[i] != owner)
|
|
{
|
|
if(!IsDefined(owner) || !IsDefined(owner.team))
|
|
{
|
|
}
|
|
else if(level.teambased && players[i].team == owner.team)
|
|
{
|
|
}
|
|
else if(!IsDefined(players[i].inpoisonarea) || players[i].inpoisonarea == 0)
|
|
{
|
|
if(players[i] istouching(gaseffectarea) && players[i].sessionstate == "playing")
|
|
{
|
|
if(!(players[i] hasperk("specialty_proximityprotection")))
|
|
{
|
|
trace = bullettrace(position,12 + VectorScale((0,0,1)),players[i].origin,0);
|
|
if(trace["fraction"] == 1)
|
|
{
|
|
players[i].lastpoisonedby = owner;
|
|
players[i] thread damageinpoisonarea(shockeffectarea,killcament,trace,position);
|
|
}
|
|
}
|
|
|
|
players[i] thread maps/mp/gametypes/_battlechatter_mp::incomingspecialgrenadetracking("gas");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
wait(loopwaittime);
|
|
}
|
|
|
|
if(level.tabungasduration < level.poisonduration)
|
|
{
|
|
wait(level.poisonduration - level.tabungasduration);
|
|
}
|
|
|
|
shockeffectarea delete();
|
|
gaseffectarea delete();
|
|
/#
|
|
if(GetDvarInt(#"9CB86F60"))
|
|
{
|
|
level notify("tabun_draw_cylinder_stop",players[i]);
|
|
}
|
|
#/
|
|
}
|
|
|
|
//Function Number: 5
|
|
damageinpoisonarea(gaseffectarea,killcament,trace,position)
|
|
{
|
|
self endon("disconnect");
|
|
self endon("death");
|
|
self thread watch_death();
|
|
self.inpoisonarea = 1;
|
|
self startpoisoning();
|
|
tabunshocksound = spawn("script_origin",(0,0,1));
|
|
tabunshocksound thread deleteentonownerdeath(self);
|
|
tabunshocksound.origin = position;
|
|
tabunshocksound playsound(level.sound_shock_tabun_start);
|
|
tabunshocksound playloopsound(level.sound_shock_tabun_loop);
|
|
timer = 0;
|
|
while(trace["fraction"] == 1 && IsDefined(gaseffectarea) && self istouching(gaseffectarea) && self.sessionstate == "playing" && IsDefined(self.lastpoisonedby))
|
|
{
|
|
damage = level.poisondamage;
|
|
if(level.hardcoremode)
|
|
{
|
|
damage = level.poisondamagehardcore;
|
|
}
|
|
|
|
self dodamage(damage,gaseffectarea.origin,self.lastpoisonedby,killcament,"none","MOD_GAS",0,"tabun_gas_mp");
|
|
if(self mayapplyscreeneffect())
|
|
{
|
|
switch(timer)
|
|
{
|
|
case "0":
|
|
self shellshock("tabun_gas_mp",1);
|
|
break;
|
|
|
|
case "1":
|
|
self shellshock("tabun_gas_nokick_mp",1);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
timer++;
|
|
if(timer >= 2)
|
|
{
|
|
timer = 0;
|
|
}
|
|
|
|
self hide_hud();
|
|
}
|
|
|
|
wait(1);
|
|
trace = bullettrace(position,12 + VectorScale((0,0,1)),self.origin,0);
|
|
}
|
|
|
|
tabunshocksound stoploopsound(0.5);
|
|
wait(0.5);
|
|
thread playsoundinspace(level.sound_shock_tabun_stop,position);
|
|
wait(0.5);
|
|
tabunshocksound notify("delete",self);
|
|
tabunshocksound delete();
|
|
self show_hud();
|
|
self stoppoisoning();
|
|
self.inpoisonarea = 0;
|
|
}
|
|
|
|
//Function Number: 6
|
|
deleteentonownerdeath(owner)
|
|
{
|
|
self endon("delete");
|
|
owner waittill("death");
|
|
self delete();
|
|
}
|
|
|
|
//Function Number: 7
|
|
watch_death()
|
|
{
|
|
self waittill("death");
|
|
self show_hud();
|
|
}
|
|
|
|
//Function Number: 8
|
|
hide_hud()
|
|
{
|
|
self setclientuivisibilityflag("hud_visible",0);
|
|
}
|
|
|
|
//Function Number: 9
|
|
show_hud()
|
|
{
|
|
self setclientuivisibilityflag("hud_visible",1);
|
|
}
|
|
|
|
//Function Number: 10
|
|
weapons_get_dvar_int(dvar,def)
|
|
{
|
|
return int(weapons_get_dvar(dvar,def));
|
|
}
|
|
|
|
//Function Number: 11
|
|
weapons_get_dvar(dvar,def)
|
|
{
|
|
if(GetDvar(dvar) != "")
|
|
{
|
|
return GetDvarFloat(dvar);
|
|
}
|
|
else
|
|
{
|
|
setdvar(dvar,def);
|
|
return def;
|
|
}
|
|
}
|
|
|
|
//Function Number: 12
|
|
generatelocations(position,owner)
|
|
{
|
|
onefoot = VectorScale((0,0,1));
|
|
startpos = position + onefoot;
|
|
/#
|
|
level.tabun_debug = getdvarintdefault("scr_tabun_debug",0);
|
|
if(level.tabun_debug)
|
|
{
|
|
black = VectorScale((1,1,1));
|
|
debugstar(startpos,2000,black);
|
|
}
|
|
#/
|
|
spawnalllocs(owner,startpos);
|
|
}
|
|
|
|
//Function Number: 13
|
|
singlelocation(position,owner)
|
|
{
|
|
spawntimedfx(level.fx_tabun_single,position);
|
|
killcament = spawn("script_model",60 + VectorScale((0,0,1)));
|
|
killcament deleteaftertime(15);
|
|
killcament.starttime = GetTime();
|
|
damageeffectarea(owner,position,level.tabungaspoisonradius,level.tabungaspoisonheight,killcament);
|
|
}
|
|
|
|
//Function Number: 14
|
|
hitpos(start,end,color)
|
|
{
|
|
trace = bullettrace(start,end,0,undefined);
|
|
/#
|
|
level.tabun_debug = getdvarintdefault("scr_tabun_debug",0);
|
|
if(level.tabun_debug)
|
|
{
|
|
debugstar(trace["position"],2000,color);
|
|
}
|
|
|
|
thread debug_line(start,trace["position"],color,80);
|
|
#/
|
|
return trace["position"];
|
|
}
|
|
|
|
//Function Number: 15
|
|
spawnalllocs(owner,startpos)
|
|
{
|
|
defaultdistance = weapons_get_dvar_int("scr_defaultDistanceTabun",220);
|
|
cos45 = 0.707;
|
|
negcos45 = -0.707;
|
|
red = (0.9,0.2,0.2);
|
|
blue = (0.2,0.2,0.9);
|
|
green = (0.2,0.9,0.2);
|
|
white = VectorScale((1,1,1));
|
|
north = startpos + (defaultdistance,0,0);
|
|
south = startpos - (defaultdistance,0,0);
|
|
east = startpos + (0,defaultdistance,0);
|
|
west = startpos - (0,defaultdistance,0);
|
|
nw = startpos + (cos45 * defaultdistance,negcos45 * defaultdistance,0);
|
|
ne = startpos + (cos45 * defaultdistance,cos45 * defaultdistance,0);
|
|
sw = startpos + (negcos45 * defaultdistance,negcos45 * defaultdistance,0);
|
|
se = startpos + (negcos45 * defaultdistance,cos45 * defaultdistance,0);
|
|
locations = [];
|
|
locations["color"] = [];
|
|
locations["loc"] = [];
|
|
locations["tracePos"] = [];
|
|
locations["distSqrd"] = [];
|
|
locations["fxtoplay"] = [];
|
|
locations["radius"] = [];
|
|
locations["color"][0] = red;
|
|
locations["color"][1] = red;
|
|
locations["color"][2] = blue;
|
|
locations["color"][3] = blue;
|
|
locations["color"][4] = green;
|
|
locations["color"][5] = green;
|
|
locations["color"][6] = white;
|
|
locations["color"][7] = white;
|
|
locations["point"][0] = north;
|
|
locations["point"][1] = ne;
|
|
locations["point"][2] = east;
|
|
locations["point"][3] = se;
|
|
locations["point"][4] = south;
|
|
locations["point"][5] = sw;
|
|
locations["point"][6] = west;
|
|
locations["point"][7] = nw;
|
|
for(count = 0;count < 8;count++)
|
|
{
|
|
trace = hitpos(startpos,locations["point"][count],locations["color"][count]);
|
|
locations["tracePos"][count] = trace;
|
|
locations["loc"][count] = startpos / 2 + trace / 2;
|
|
locations["loc"][count] = 12 - VectorScale((0,0,1));
|
|
locations["distSqrd"][count] = distancesquared(startpos,trace);
|
|
}
|
|
|
|
centroid = getcentroid(locations);
|
|
killcament = spawn("script_model",60 + VectorScale((0,0,1)));
|
|
killcament deleteaftertime(15);
|
|
killcament.starttime = GetTime();
|
|
center = getcenter(locations);
|
|
for(i = 0;i < 8;i++)
|
|
{
|
|
fxtoplay = setuptabunfx(owner,locations,i);
|
|
switch(fxtoplay)
|
|
{
|
|
case "0":
|
|
locations["fxtoplay"][i] = level.fx_tabun_0;
|
|
locations["radius"][i] = level.fx_tabun_radius0;
|
|
break;
|
|
|
|
case "1":
|
|
locations["fxtoplay"][i] = level.fx_tabun_1;
|
|
locations["radius"][i] = level.fx_tabun_radius1;
|
|
break;
|
|
|
|
case "2":
|
|
locations["fxtoplay"][i] = level.fx_tabun_2;
|
|
locations["radius"][i] = level.fx_tabun_radius2;
|
|
break;
|
|
|
|
case "3":
|
|
locations["fxtoplay"][i] = level.fx_tabun_3;
|
|
locations["radius"][i] = level.fx_tabun_radius3;
|
|
break;
|
|
|
|
default:
|
|
locations["fxtoplay"][i] = undefined;
|
|
locations["radius"][i] = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
singleeffect = 1;
|
|
freepassused = 0;
|
|
for(i = 0;i < 8;i++)
|
|
{
|
|
if(locations["radius"][i] != level.fx_tabun_radius0)
|
|
{
|
|
if(freepassused == 0 && locations["radius"][i] == level.fx_tabun_radius1)
|
|
{
|
|
freepassused = 1;
|
|
}
|
|
else
|
|
{
|
|
singleeffect = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
onefoot = VectorScale((0,0,1));
|
|
startpos = startpos - onefoot;
|
|
thread playtabunsound(startpos);
|
|
if(singleeffect == 1)
|
|
{
|
|
singlelocation(startpos,owner);
|
|
}
|
|
else
|
|
{
|
|
spawntimedfx(level.fx_tabun_3,startpos);
|
|
for(count = 0;count < 8;count++)
|
|
{
|
|
if(IsDefined(locations["fxtoplay"][count]))
|
|
{
|
|
spawntimedfx(locations["fxtoplay"][count],locations["loc"][count]);
|
|
thread damageeffectarea(owner,locations["loc"][count],locations["radius"][count],locations["radius"][count],killcament);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//Function Number: 16
|
|
playtabunsound(position)
|
|
{
|
|
tabunsound = spawn("script_origin",(0,0,1));
|
|
tabunsound.origin = position;
|
|
tabunsound playsound(level.sound_tabun_start);
|
|
tabunsound playloopsound(level.sound_tabun_loop);
|
|
wait(level.tabungasduration);
|
|
thread playsoundinspace(level.sound_tabun_stop,position);
|
|
tabunsound stoploopsound(0.5);
|
|
wait(0.5);
|
|
tabunsound delete();
|
|
}
|
|
|
|
//Function Number: 17
|
|
setuptabunfx(owner,locations,count)
|
|
{
|
|
fxtoplay = undefined;
|
|
previous = count - 1;
|
|
if(previous < 0)
|
|
{
|
|
previous = previous + locations["loc"].size;
|
|
}
|
|
|
|
next = count + 1;
|
|
if(next >= locations["loc"].size)
|
|
{
|
|
next = next - locations["loc"].size;
|
|
}
|
|
|
|
effect0dist = level.fx_tabun_radius0 * level.fx_tabun_radius0;
|
|
effect1dist = level.fx_tabun_radius1 * level.fx_tabun_radius1;
|
|
effect2dist = level.fx_tabun_radius2 * level.fx_tabun_radius2;
|
|
effect3dist = level.fx_tabun_radius3 * level.fx_tabun_radius3;
|
|
effect4dist = level.fx_tabun_radius3;
|
|
fxtoplay = -1;
|
|
if(locations["distSqrd"][count] > effect0dist && locations["distSqrd"][previous] > effect1dist && locations["distSqrd"][next] > effect1dist)
|
|
{
|
|
fxtoplay = 0;
|
|
}
|
|
else if(locations["distSqrd"][count] > effect1dist && locations["distSqrd"][previous] > effect2dist && locations["distSqrd"][next] > effect2dist)
|
|
{
|
|
fxtoplay = 1;
|
|
}
|
|
else if(locations["distSqrd"][count] > effect2dist && locations["distSqrd"][previous] > effect3dist && locations["distSqrd"][next] > effect3dist)
|
|
{
|
|
fxtoplay = 2;
|
|
}
|
|
else if(locations["distSqrd"][count] > effect3dist && locations["distSqrd"][previous] > effect4dist && locations["distSqrd"][next] > effect4dist)
|
|
{
|
|
fxtoplay = 3;
|
|
}
|
|
|
|
return fxtoplay;
|
|
}
|
|
|
|
//Function Number: 18
|
|
getcentroid(locations)
|
|
{
|
|
centroid = (0,0,0);
|
|
for(i = 0;i < locations["loc"].size;i++)
|
|
{
|
|
centroid = centroid + locations["loc"][i] / locations["loc"].size;
|
|
}
|
|
|
|
/#
|
|
level.tabun_debug = getdvarintdefault("scr_tabun_debug",0);
|
|
if(level.tabun_debug)
|
|
{
|
|
purple = (0.9,0.2,0.9);
|
|
debugstar(centroid,2000,purple);
|
|
}
|
|
#/
|
|
return centroid;
|
|
}
|
|
|
|
//Function Number: 19
|
|
getcenter(locations)
|
|
{
|
|
center = (0,0,0);
|
|
curx = locations["tracePos"][0][0];
|
|
cury = locations["tracePos"][0][1];
|
|
minx = curx;
|
|
maxx = curx;
|
|
miny = cury;
|
|
maxy = cury;
|
|
for(i = 1;i < locations["tracePos"].size;i++)
|
|
{
|
|
curx = locations["tracePos"][i][0];
|
|
cury = locations["tracePos"][i][1];
|
|
if(curx > maxx)
|
|
{
|
|
maxx = curx;
|
|
}
|
|
else if(curx < minx)
|
|
{
|
|
minx = curx;
|
|
}
|
|
|
|
if(cury > maxy)
|
|
{
|
|
maxy = cury;
|
|
}
|
|
else if(cury < miny)
|
|
{
|
|
miny = cury;
|
|
}
|
|
}
|
|
|
|
avgx = maxx + minx / 2;
|
|
avgy = maxy + miny / 2;
|
|
center = (avgx,avgy,locations["tracePos"][0][2]);
|
|
/#
|
|
level.tabun_debug = getdvarintdefault("scr_tabun_debug",0);
|
|
if(level.tabun_debug)
|
|
{
|
|
cyan = (0.2,0.9,0.9);
|
|
debugstar(center,2000,cyan);
|
|
}
|
|
#/
|
|
return center;
|
|
} |