This commit is contained in:
2026-05-08 19:19:42 +02:00
parent 0e9585de9a
commit 2a51a0e0c2
892 changed files with 0 additions and 2 deletions

1356
mod/main.gsc Executable file

File diff suppressed because it is too large Load Diff

699
mod/streaks.gsc Executable file
View File

@@ -0,0 +1,699 @@
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
loadStreaks()
{
precacheShader("cardicon_helmet_brit_ww2");
precacheShader("cardicon_boot");
precacheShader("cardicon_headshot");
precacheShader("cardicon_ghost_mic");
precacheShader("cardicon_biohazard");
precacheShader("cardicon_juggernaut_2");
precacheShader("cardicon_paratrooper");
precacheShader("cardicon_xray");
precacheShader("dpad_killstreak_sentry");
precacheShader("cardicon_b2");
precacheShader("cardicon_fmj");
precacheShader("cardicon_thebomb");
precacheShader("cardicon_cod4");
precacheShader("cardicon_loadedfinger");
// Pre-cache Jetpack FX at level init (loadfx must NOT be called at runtime).
level._effect["jetpack_smoke"] = loadfx("smoke/smoke_trail_white_heli");
level._effect["jetpack_flare"] = loadfx("misc/flares_cobra");
level.streaks3 = [];
level.streaks6 = [];
level.streaks9 = [];
// add
// - no reload
// - radioactive
level.streaks3[level.streaks3.size] = "No Recoil";
level.streaks3[level.streaks3.size] = "Riotshield";
level.streaks3[level.streaks3.size] = "Speed";
level.streaks3[level.streaks3.size] = "No Reload";
level.streaks6[level.streaks6.size] = "Suicide Bomber";
level.streaks6[level.streaks6.size] = "I.M.S";
level.streaks6[level.streaks6.size] = "Explosive Bullets";
level.streaks6[level.streaks6.size] = "Radioactive";
level.streaks9[level.streaks9.size] = "Juggernaut";
level.streaks9[level.streaks9.size] = "Jetpack";
level.streaks9[level.streaks9.size] = "XRay";
}
getStreak(which)
{
switch(which)
{
case 0:
invalid = true;
streak = undefined;
while(invalid)
{
streak = level.streaks3[randomInt(level.streaks3.size)];
if(!self.isJugger)
invalid = false;
else if(streak != "Speed")
invalid = false;
}
return streak;
case 1:
return level.streaks6[randomInt(level.streaks6.size)];
case 2:
return level.streaks9[randomInt(level.streaks9.size)];
default:
break;
}
}
getStreakIcon(streak)
{
if(streak == "Riotshield")
return "cardicon_helmet_brit_ww2";
if(streak == "Speed")
return "cardicon_boot";
if(streak == "No Recoil")
return "cardicon_headshot";
if(streak == "Suicide Bomber")
return "cardicon_ghost_mic";
if(streak == "Radioactive")
return "cardicon_biohazard"; //cardicon_hazard
if(streak == "Juggernaut")
return "cardicon_juggernaut_2";
if(streak == "Jetpack")
return "cardicon_paratrooper";
if(streak == "XRay")
return "cardicon_xray";
if(streak == "Gl Sentry")
return "dpad_killstreak_sentry";
//return tableLookup( "mp/killstreakTable.csv", 1, "sentry", 14 );
if(streak == "Bomber")
return "cardicon_b2";
if(streak == "Explosive Bullets")
return "cardicon_fmj";
if(streak == "I.M.S")
return "cardicon_thebomb";
if(streak == "Godmode")
return "cardicon_chicken";
if(streak == "No Reload")
return "cardicon_loadedfinger";
return "cardicon_cod4";
}
setStreaks()
{
if(!getDvarInt("streaks_online"))
return;
self.streaks[0] = getStreak(0);
self.streaks[1] = getStreak(1);
self.streaks[2] = getStreak(2);
self thread drawStreaks();
self thread onKilling();
}
drawStreaks()
{
if(isDefined(self.streakIcons[0]))
{
for(i=0;i<3;i++)
{
self.streakIcons[i] destroy();
}
self.streakText destroy();
}
self.streakIcons = [];
for(index = 0;index < 3;index++)
{
self.streakIcons[index] = self createFontString( "objective", 2 );
self.streakIcons[index].foreground = false;
self.streakIcons[index].hideWhenInMenu = true;
self.streakIcons[index].fontScale = 1;
self.streakIcons[index].font = "hudbig";
self.streakIcons[index].alpha = 1;
self.streakIcons[index].glow = 1;
self.streakIcons[index].glowColor = ( 0, 0, 1 );
self.streakIcons[index].glowAlpha = 1;
self.streakIcons[index].color = ( 1.0, 1.0, 1.0 );
self.streakIcons[index] setPoint("RIGHT", "RIGHT", 0, 0-(index *45));
self.streakIcons[index] setShader(getStreakIcon(self.streaks[index]), 40, 40 );
}
self.streakText = self createFontString( "objective", 2 );
self.streakText.foreground = false;
self.streakText.hideWhenInMenu = true;
self.streakText.fontScale = 1;
self.streakText.font = "hudbig";
self.streakText.alpha = 1;
self.streakText.glow = .3;
self.streakText.glowColor = ( 1, 0, 0 );
self.streakText.glowAlpha = 1;
self.streakText.color = ( 1.0, 1.0, 0.0 );
self.streakText setPoint("RIGHT", "RIGHT", -50, 0);
}
onKilling()
{
self endon("death");
self endon("disconnect");
level endon("nuke");
spree = 0;
value = 3;
counter = 1;
self.streakText setValue(value);
while(true)
{
kills = self.kills;
wait .1;
if(kills != self.kills)
{
for(i = kills;i < self.kills;i++)
{
spree++;
value--;
if(spree == 3 || spree == 6 || spree == 9)
{
streak = self giveReward(spree);
self thread doStreakPopup(spree,streak);
if(spree == 9)
spree = 0;
}
if(value == 0)
{
value = 3;
if(counter < 3)
{
y = self.streakText.y - 45;
self.streakText setPoint("RIGHT", "RIGHT", -50, y);
counter++;
}
else
{
self.streakText setPoint("RIGHT", "RIGHT", -50, 100);
counter = 1;
self.streaks[0] = getStreak(0);
self.streaks[1] = getStreak(1);
self.streaks[2] = getStreak(2);
self thread drawStreaks();
}
}
self.streakText setValue(value);
}
}
}
}
doStreakPopup(spree, streak)
{
notifyHello = spawnstruct();
notifyHello.glowColor = (0.0, 0.6, 0.3);
notifyHello.titleText = spree + " Streak";
notifyHello.notifyText = streak;
notifyHello.iconName = getStreakIcon(streak);
notifyHello.hideWhenInMenu = true;
notifyHello.sound = "mp_war_objective_taken";
self thread maps\mp\gametypes\_hud_message::notifyMessage( notifyHello );
}
giveReward(spree)
{
streak = "";
if(spree == 3)
streak = self.streaks[0];
else if(spree == 6)
streak = self.streaks[1];
else if(spree == 9)
streak = self.streaks[2];
self thread giveStreak(streak);
return streak;
}
giveStreak(streak)
{
switch(streak)
{
case "No Recoil":
self player_recoilScaleOn(0);
break;
case "Speed":
self.speed = true;
wait 1;
self maps\mp\perks\_perks::givePerk("specialty_lightweight");
self setMoveSpeedScale(1.6);
self.moveSpeedScaler = 1.6; // keep cached baseline in sync (was: self.setMoveSpeedScale = 1.6 — typo, set entity field not call function)
break;
case "Riotshield":
self AttachShieldModel( "weapon_riot_shield_mp", "tag_shield_back" );
break;
case "Jetpack":
self thread Jetpack();
break;
case "Suicide Bomber":
self thread Suicidebomber();
break;
case "I.M.S":
self thread tryUseIMS();
self thread infoText("I.M.S");
break;
case "Juggernaut":
self thread Juggernaut();
break;
case "XRay":
self thread Wh();
break;
case "Explosive Bullets":
self thread Explosive();
break;
case "No Reload":
self thread NoReload();
break; // FIX: was missing break, causing fall-through into Radioactive every time
case "Radioactive":
self thread Radioactive();
break;
default:
self iPrintlnBold("^1ERROR: Unknown Streak!");
break;
}
}
Radioactive()
{
self endon("disconnect");
self endon("death");
level endon("nuke");
// Cache once \u2014 getDvar() inside the inner foreach would cost ~120 native calls/sec.
isTeamGame = (getDvar("g_gametype") == "gungame_team");
playFxOnTag( level.spawnGlow["enemy"], self, "pelvis" );
playFxOnTag( level.spawnGlow["friendly"], self, "j_head" );
while(1)
{
wait .1;
foreach(player in level.players)
{
if(player == self)
continue;
if(isTeamGame && player.team == self.team)
continue;
if(Distance(player.origin,self.origin) < 120 && isAlive(player))
{
player thread maps\mp\gametypes\_damage::finishPlayerDamageWrapper( self, self, 4, 0, "MOD_EXPLOSIVE", "none", player.origin, player.origin, "none", 0, 0 );
self thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback("");
}
}
}
}
Suicidebomber()
{
self endon("disconnect");
self waittill("death");
Earthquake( 0.4, 0.75, self.origin, 512 );
MagicBullet("ac130_105mm_mp", self.origin+(0,0,20), self.origin, self);
}
Explosive()
{
self endon("disconnect");
self endon("death");
self notify("exploagain");
self endon("exploagain");
self.explodmg = 40;
self.explomindmg = 20;
self.explotime = .1;
for(;;)
{
self waittill("weapon_fired");
class = WeaponClass(self getCurrentWeapon());
self setClassTime(class);
forward = self getTagOrigin("j_head");
end = self thread vector_scal(anglestoforward(self getPlayerAngles()),1000000);
Location = BulletTrace( forward, end, 0, self )[ "position" ];
playFx(level.explosionfx, Location);
RadiusDamage(Location, 50, 30, 20, self );
//self RadiusDamage(Location,250,self.explodmg,self.explomindmg,self,"MOD_Explosive","barrel_mp");
wait self.explotime;
}
}
Jetpack()
{
self endon("death");
self endon("disconnect");
self notify("jetpack");
self endon("jetpack");
self iPrintlnBold("^3Press ^1F ^7to use ^:Jetpack!");
self.jetpack = 80;
self maps\mp\perks\_perks::givePerk("specialty_falldamage");
// Use pre-cached FX handles from loadStreaks() — loadfx() must not be called at runtime.
JETPACKBACK = createPrimaryProgressBar( -275 );
JETPACKBACK.bar.x = 40;
JETPACKBACK.x = 100;
JETPACKTXT = createPrimaryProgressBarText( -275 );
JETPACKTXT.x=100;
if(randomInt(10) < 8)
JETPACKTXT settext("^:Jetpack");
else
{
JETPACKTXT settext("^:Big Jetpack");
self.jetpack = 120;
}
self thread dod(JETPACKBACK.bar,JETPACKBACK,JETPACKTXT);
self attach("projectile_hellfire_missile","tag_stowed_back");
while(true)
{
if(self usebuttonpressed() && self.jetpack>0)
{
self playsound("cobra_helicopter_dying_loop");
self setstance("crouch");
playfx(level._effect["jetpack_smoke"],self gettagorigin("j_spine4"));
playfx(level._effect["jetpack_flare"],self gettagorigin("j_spine4"));
earthquake(.15,.2,self gettagorigin("j_spine4"),50);
self.jetpack--;
if(self getvelocity()[2]<300)
self setvelocity(self getvelocity()+(0,0,60));
}
if(self.jetpack < 80 &&!self usebuttonpressed())
self.jetpack++;
JETPACKBACK updateBar(self.jetpack/80);
JETPACKBACK.bar.color=(1,self.jetpack/80,self.jetpack/80);
wait .05;
}
}
dod(a,b,c)
{
self waittill_any("death", "disconnect", "jetpack");
a destroy();
b destroy();
c destroy();
}
tryUseIMS()
{
self notify("ims2");
self endon("ims2");
self endon("disconnect");
self notifyonplayercommand("IMS", "+actionslot 4");
self waittill("IMS");
ims = spawn("script_model", self.origin);
ims setModel( "sentry_minigun_folded" );
ims.angles = (90,0,0);
ims.imsbombs = 3;
block = spawn("script_model", self.origin+(-40,0,0));
block setModel("com_plasticcase_enemy");
block.angles = (0,0,0);
block Solid();
block2 = spawn("script_model", self.origin+(40,0,0));
block2 setModel("com_plasticcase_enemy");
block2.angles = (0,0,0);
block2 Solid();
block3 = spawn("script_model", self.origin+(0,40,0));
block3 setModel("com_plasticcase_enemy");
block3.angles = (0,90,0);
block3 Solid();
block4 = spawn("script_model", self.origin+(0,-40,0));
block4 setModel("com_plasticcase_enemy");
block4.angles = (0,90,0);
block4 Solid();
self thread BombThem(ims);
self thread DeleteIt(block, block2, block3, block4);
self thread DeleteIMS(ims);
self thread DeleteIMS2(ims);
}
DeleteIMS(ims)
{
self waittill_any("death", "disconnect", "Ims_Dead");
ims delete();
}
DeleteIMS2(ims)
{
// FIX: The original waited on "fuckemp" which was never notified anywhere —
// this created a permanent zombie thread holding the ims entity reference.
// Now we wait for nuke (end of match) and clean up the entity then.
level waittill("nuke");
if(isDefined(ims))
ims delete();
}
DeleteIt(block, block2, block3, block4)
{
self waittill_any("disconnect", "Ims_Dead");
block delete();
block2 delete();
block3 delete();
block4 delete();
}
BombThem(ims)
{
//self endon("death");
self endon("disconnect");
self endon("Ims_Dead");
expos = self.origin;
wait 4;
self iPrintln("I.M.S ready!");
for(;;)
{
foreach(player in level.players)
{
if(player != self)
{
if(Distance(expos, player.origin) <= 300)
{
if(ims.imsbombs > 0)
{
ims.imsbombs--;
self thread Boom(player, expos);
if(ims.imsbombs == 0)
self notify("Ims_Dead");
wait 5;
}
}
}
}
wait 1;
}
}
Boom(player, expos)
{
player playsound ("claymore_activated");
level._effect["bombexplosion"] = loadfx("explosions/tanker_explosion");
PlayFx( level._effect["bombexplosion"], expos );
//RadiusDamage(self.origin,350,500,100,level);
MagicBullet("ac130_105mm_mp", expos, expos+(0,-100,-1000), self);
MagicBullet("ac130_105mm_mp", expos, expos+(100,0, -10), self);
MagicBullet("ac130_105mm_mp", expos, expos+(0,100, -10), self);
MagicBullet("ac130_105mm_mp", expos, expos+(-100,0, -10), self);
MagicBullet("ac130_105mm_mp", expos, expos+(0,-100, -10), self);
PlayRumbleOnPosition( "grenade_rumble", self.origin );
earthquake( 0.4, 0.75, self.origin, 512 );
player playsound("exp_suitcase_bomb_main");
}
vector_scal(vec, scale)
{
vec = (vec[0] * scale, vec[1] * scale, vec[2] * scale);
return vec;
}
setClassTime(class)
{
if(class == "rifle")
{
self.explodmg = 20;
self.explotime = 0;
self.explomindmg = 1;
}
else if(class == "smg")
{
self.explodmg = 20;
self.explotime = 0;
self.explomindmg = 1;
}
else if(class == "spread")
{
self.explodmg = 30;
self.explotime = .5;
self.explomindmg = 10;
}
else //pistol
{
self.explodmg = 40;
self.explotime = 1;
self.explomindmg = 15;
}
}
Wh()
{
self endon("death");
self endon("disconnect");
self thermalVisionFOFOverlayOn();
self iPrintlnBold("^1X-Ray Vision Active!");
wait 30;
self thermalVisionFOFOverlayOff();
self iPrintlnBold("^1X-Ray Vision Expired");
}
destroyGhostHud(hud)
{
self endon("disconnect");
//self endon("ghostCounter_done");
self waittill_any("death", "spawned_player");
hud destroy();
}
scanPlayer()
{
//self endon("disconnect");
//self endon("death");
//self endon("ghostCounter_done");
self.scanPlayer = [];
while(self.recon)
{
foreach(player in level.players)
{
if(player == self)
continue;
if((getDvar("g_gametype") == "gungame_team") && self.team == player.team)
continue;
if(Distance(player.origin,self.origin) <= 1000)
{
go = true;
foreach(scan in self.scanPlayer)
{
if(scan == "" + player.guid)
go = false;
}
if(go)
{
self thread createScanImage(player);
self.scanPlayer[self.scanPlayer.size] = "" + player.guid;
}
}
}
wait .5;
}
self notify("ghostCounter_done");
}
createText(text,size,align,pos,x,y,font)
{
if(!isDefined(font))
hud = self createFontString("default",size);
else
hud = self createFontString(font,size);
hud setPoint(align,pos,x,y);
if(isDefined(text))
hud setText(text);
hud.glowAlpha = 1;
hud.hideWhenInMenu = true;
return hud;
}
createScanImage(player)
{
//self endon("disconnect");
rectpos = spawn("script_model", player getTagOrigin("j_head")+(0,0,-20));
rectpos enableLinkTo();
rectpos linkTo(player);
icon = NewClientHudElem(self);
icon.elemType = "bar";
icon.width = 64;
icon.height = 80;
icon SetShader( "cardicon_headshot", 40, 40 );
icon.color = (1,0,0);
icon.alpha = 0;
icon.x = rectpos.origin[ 0 ];
icon.y = rectpos.origin[ 1 ];
icon.z = rectpos.origin[ 2 ];
icon SetTargetEnt(rectpos);
icon SetWayPoint( true, true );
icon fadeovertime(1);
icon.alpha = 1;
self waittill_any("disconnect","ghostCounter_done");
icon fadeovertime(2);
icon.alpha = 0;
wait 2;
rectpos delete();
icon destroy();
}
Wh_Old()
{
self endon("death");
self endon("disconnect");
self notify("wh");
self endon("wh");
self ThermalVisionFOFOverlayOn();
for(i = 30;i > 0;i--)
{
wait 1;
self iPrintln("Infrared Vision for: " + i);
}
self ThermalVisionFOFOverlayOff();
}
///////////////////////////////////////////////////////////
infoText(item)
{
infotext = self createFontString("hudsmall", 1);
infotext setPoint("CENTER", "CENTER", 0, -50);
infotext.color = (1,1,0);
infotext.glowalpha = .5;
infotext.glowcolor = (1,0,0);
infotext setText("Press [{+actionslot 4}] to use " + item);
//infoText fadeOverTime(2);
//infoText.alpha = 0;
wait 2;
if(isDefined(infoText))
infoText destroy();
}
Juggernaut()
{
level endon("nuke");
self.isJugger = true;
// FIX: Use the custom health system (actual_maxhealth/actual_health) instead of
// the raw engine maxhealth. Setting engine maxhealth directly broke the HUD display
// and regen logic. We multiply the effective HP pool through the custom system.
self.actual_maxhealth = self.maxhp * 5; // 5× base HP (e.g. 300 in Fungame vs normal 60)
self.actual_health = self.actual_maxhealth;
// Speed floor is the mode base (1.5 in Fungame) — no slowdown penalty.
// Juggernaut's balance trade-off is the 5× HP pool only.
juggIcon = newHudElem();
juggIcon.x = self.origin[0];
juggIcon.y = self.origin[1];
juggIcon.z = self.origin[2] + 54;
juggIcon.alpha = .8;
juggIcon.archived = true;
juggIcon setShader("cardicon_juggernaut_2");
juggIcon SetWayPoint( true, true );
juggIcon SetTargetEnt(self);
self thread destroyJuggOnNuke(juggIcon);
self waittill_any("death", "disconnect", "isMarked");
juggicon destroy();
}
destroyJuggOnNuke(juggIcon)
{
self endon("death");
self endon("disconnect");
level waittill("nuke");
juggIcon destroy();
}
NoReload()
{
level endon("nuke"); // FIX: was missing — thread survived past match end
self endon("death");
self endon("disconnect");
while(true)
{
if(self AttackButtonPressed())
{
current = self getCurrentWeapon();
clip = self GetWeaponAmmoClip(current);
stock = self GetWeaponAmmoStock(current);
if(stock > 0)
{
self setWeaponAmmoStock(current, stock-1);
self setWeaponAmmoClip(current, clip+1);
}
waitFrame();
}
else
self waittill("weapon_fired");
}
}

672
mod/vote.gsc Executable file
View File

@@ -0,0 +1,672 @@
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
// =========================================================
// FileName: vote.gsc
// Date: 11.05.2019
//
// Author Of Code: Santahunter
//
// =========================================================
/*
ALPHA
so_killspree_trainer "The Pit"
so_rooftop_contingency "Sniper Fi"
so_killspree_favela "O Cristo Redentor"
so_forest_contingency "Evasion"
so_crossing_so_bridge "Suspension"
BRAVO
so_ac139_co_hunted "Overwatch" (Two-Players Min)
so_killspree_invasion "Body Count"
so_defuse_favela_escape "Bomb Squad"
so_snowrace1_cliffhanger "Race"
so_chopper_invasion "Big Brother" (Two-Players Min) /////////////////// BURGERTOWN
CHARLIE
so_hidden_so_ghillies "Hidden"
so_showers_gulag "Breach & Clear"
so_snowrace2_cliffhanger "Time Trial"
so_defuse_invasion "Homeland Security"
so_intel_boneyard "Snatch & Grab"
DELTA
so_download_arcadia "Wardriving"
so_demo_so_bridge "Wreckage"
so_sabotage_cliffhanger "Acceptable Losses"
so_escape_airport "Terminal"
so_takeover_estate "Estate Takedown"
ECHO
so_assault_oilrig "Wetwork"
so_juggernauts_favela "High Explosive"
so_takeover_oilrig "Armor Piercing"
*/
loadVote()
{
precacheShader("line_horizontal");
precacheShader("hudscoreboardscroll_uparrow");
precacheShader("hudscoreboardscroll_downarrow");
level.maxOptions = 8;
maps();
thread startVote();
}
maps()
{
level.maps = [];
// MW2 Base Maps
level.maps[level.maps.size] = "mp_rust";
level.maps[level.maps.size] = "mp_afghan";
level.maps[level.maps.size] = "mp_terminal";
level.maps[level.maps.size] = "mp_highrise";
//level.maps[level.maps.size] = "mp_derail"; //fuck derail
level.maps[level.maps.size] = "mp_rundown";
level.maps[level.maps.size] = "mp_brecourt"; //Wasteland
level.maps[level.maps.size] = "mp_boneyard"; //Scrapyard
level.maps[level.maps.size] = "mp_quarry";
level.maps[level.maps.size] = "mp_nightshift"; //Skidrow
level.maps[level.maps.size] = "mp_estate";
level.maps[level.maps.size] = "mp_invasion";
level.maps[level.maps.size] = "mp_checkpoint"; //Karachi
level.maps[level.maps.size] = "mp_subbase";
level.maps[level.maps.size] = "mp_favela";
level.maps[level.maps.size] = "mp_underpass";
//level.maps[level.maps.size] = "iw4_credits"; // no
// MW2 DLC Maps
level.maps[level.maps.size] = "mp_complex"; //Bailout Stimulus DLC
level.maps[level.maps.size] = "mp_crash"; //Crash
level.maps[level.maps.size] = "mp_overgrown"; //Overgrown
level.maps[level.maps.size] = "mp_compact"; //Salvage Stimulus DLC
level.maps[level.maps.size] = "mp_storm"; //Storm
level.maps[level.maps.size] = "mp_abandon"; //Carnival
//level.maps[level.maps.size] = "mp_fuel2"; // hell no
level.maps[level.maps.size] = "mp_strike"; //Strike
level.maps[level.maps.size] = "mp_trailerpark"; //Trailerpark
level.maps[level.maps.size] = "mp_vacant"; //Vacant
level.maps[level.maps.size] = "mp_nuked"; //Nuketown
level.maps[level.maps.size] = "mp_cross_fire";
level.maps[level.maps.size] = "mp_bloc";
level.maps[level.maps.size] = "mp_cargoship";
level.maps[level.maps.size] = "mp_killhouse";
level.maps[level.maps.size] = "mp_bog_sh";
level.maps[level.maps.size] = "mp_cargoship_sh";
level.maps[level.maps.size] = "mp_shipment_long";
level.maps[level.maps.size] = "mp_rust_long";
level.maps[level.maps.size] = "mp_firingrange";
level.maps[level.maps.size] = "mp_storm_spring";
level.maps[level.maps.size] = "mp_fav_tropical";
level.maps[level.maps.size] = "mp_estate_tropical";
level.maps[level.maps.size] = "mp_crash_tropical";
level.maps[level.maps.size] = "mp_bloc_sh";
////////////// NOT VANILLA /////////////////////////
//level.maps[level.maps.size] = "af_caves";
//level.maps[level.maps.size] = "af_chase";
//level.maps[level.maps.size] = "airport";
//level.maps[level.maps.size] = "arcadia";
//level.maps[level.maps.size] = "boneyard";
//level.maps[level.maps.size] = "ending";
//level.maps[level.maps.size] = "cliffhanger";
//level.maps[level.maps.size] = "co_hunted";
//level.maps[level.maps.size] = "so_forest_contingency";
//level.maps[level.maps.size] = "dcburning";
//level.maps[level.maps.size] = "dcemp";
//level.maps[level.maps.size] = "estate";
//level.maps[level.maps.size] = "favela";
//level.maps[level.maps.size] = "so_showers_gulag";
level.maps[level.maps.size] = "oilrig";
//level.maps[level.maps.size] = "roadkill";
//level.maps[level.maps.size] = "so_hidden_so_ghillies";
//level.maps[level.maps.size] = "trainer";
/////////////// TAUROS //////////////////////////////
//level.maps[level.maps.size] = "so_chopper_invasion"; // Burgertown // so_killspree_invasion
//level.maps[level.maps.size] = "so_killspree_trainer"; // Startmission // The Pit
/////////////// DRAGONITE //////////////////////////////
//level.maps[level.maps.size] = "so_defuse_favela_escape";
//level.maps[level.maps.size] = "dc_whitehouse";
//level.maps[level.maps.size] = "so_crossing_so_bridge";
level.mapStruct = [];
foreach(map in level.maps)
{
level.mapStruct[level.mapStruct.size] = spawnStruct();
level.mapStruct[level.mapStruct.size-1].mapname = map;
level.mapStruct[level.mapStruct.size-1].displayName = getDisplayName(map);
}
}
getDisplayName(map)
{
if(map == "mp_afghan")
return "Afghan";
if(map == "mp_rust")
return "Rust";
if(map == "mp_terminal")
return "Terminal";
if(map == "mp_highrise")
return "Highrise";
if(map == "mp_derail")
return "Derail";
if(map == "mp_rundown")
return "Rundown";
if(map == "mp_brecourt")
return "Wasteland";
if(map == "mp_boneyard")
return "Scrapyard";
if(map == "mp_quarry")
return "Quarry";
if(map == "mp_estate")
return "Estate";
if(map == "mp_nightshift")
return "Skidrow";
if(map == "mp_invasion")
return "Invasion";
if(map == "mp_checkpoint")
return "Karachi";
if(map == "mp_subbase")
return "Subbase";
if(map == "mp_favela")
return "Favela";
if(map == "mp_underpass")
return "Underpass";
if(map == "iw4_credits")
return "Testmap";
if(map == "mp_abandon")
return "Carnival";
if(map == "mp_fuel2")
return "Fuel";
if(map == "mp_strike")
return "Strike";
if(map == "mp_trailerpark")
return "Trailerpark";
if(map == "mp_vacant")
return "Vacant";
if(map == "mp_complex")
return "Bailout";
if(map == "mp_crash")
return "Crash";
if(map == "mp_overgrown")
return "Overgrown";
if(map == "mp_compact")
return "Salvage";
if(map == "mp_storm")
return "Storm";
if(map == "mp_nuked")
return "Nuketown";
if(map == "mp_cross_fire")
return "Crossfire";
if(map == "mp_cargoship")
return "Cargoship";
if(map == "mp_bloc")
return "Bloc";
if(map == "mp_killhouse")
return "Killhouse";
if(map == "mp_bog_sh")
return "Bog";
if(map == "mp_cargoship_sh")
return "Freighter";
if(map == "mp_shipment_long")
return "Shipment Long";
if(map == "mp_rust_long")
return "Rust Long";
if(map == "mp_firingrange")
return "Firing Range";
if(map == "mp_storm_spring")
return "Chemical Storm";
if(map == "mp_fav_tropical")
return "Tropical Favela";
if(map == "mp_estate_tropical")
return "Tropical Estate";
if(map == "mp_crash_tropical")
return "Tropical Crash";
if(map == "mp_bloc_sh")
return "Ruin City";
if(map == "af_caves")
return "Afghanistan Caves";
if(map == "af_chase")
return "Afghanistan Hunt";
if(map == "airport")
return "Airport";
if(map == "arcadia")
return "Arcadia";
if(map == "boneyard")
return "Airplane Scrapyard";
if(map == "ending")
return "Museum";
if(map == "cliffhanger")
return "Cliffhanger";
if(map == "co_hunted")
return "Hunted";
if(map == "contingency" || map == "so_forest_contingency")
return "Contingency";
if(map == "dcburning")
return "DC Burning";
if(map == "dcemp")
return "DC Dark";
if(map == "estate")
return "Makarovs House";
if(map == "favela")
return "Rojas Favelas";
if(map == "favela_escape" || map == "so_defuse_favela_escape")
{
return "Favels Escape";
}
if(map == "gulag" || map == "so_showers_gulag")
return "Gulag";
if(map == "invasion")
return "School";
if(map == "oilrig")
return "Oilrig";
if(map == "roadkill")
return "School";
if(map == "so_hidden_so_ghillies")
return "Chernobyl";
if(map == "trainer" || map == "so_killspree_trainer")
return "The Pit";
if(map == "so_chopper_invasion" || map == "so_killspree_invasion")
return "Burgertown";
if(map == "dc_whitehouse")
{
return "DC Whitehouse";
}
if(map == "so_crossing_so_bridge")
return "Bridge";
return map;
}
createRectangle(shader,align, relative, x, y, width, height)
{
hud = newHudElem();
hud.sTexType = "bar";
hud.width = width;
hud.height = height;
hud.align = align;
hud.relative = relative;
hud.alpha = 1;
hud.xOffset = 0;
hud.yOffset = 0;
hud.children = [];
hud.sort = 1;
hud setParent(level.uiParent);
hud setShader(shader,width,height);
hud.hidden = false;
hud.HideWhenInMenu = true;
hud setPoint(align,relative,x,y);
return hud;
}
createPlayerRectangle(shader,align, relative, x, y, width, height)
{
hud = newClientHudElem(self);
hud.sTexType = "bar";
hud.width = width;
hud.height = height;
hud.align = align;
hud.relative = relative;
hud.alpha = 1;
hud.xOffset = 0;
hud.yOffset = 0;
hud.children = [];
hud.sort = 1;
hud setParent(level.uiParent);
hud setShader(shader,width,height);
hud.hidden = false;
hud.HideWhenInMenu = true;
hud setPoint(align,relative,x,y);
return hud;
}
///////////////////////////////////////////////////////////////////////
doCountdown(timer,timer2)
{
secs = 20;
milisecs = 10;
while(secs > 0)
{
milisecs--;
if(milisecs == 0)
{
milisecs = 10;
secs--;
}
if(secs == 9)
{
timer2 setPoint("LEFT", "CENTER", 20,90);
}
timer setText("Time left: " + secs);
timer2 setValue(milisecs);
wait .1;
}
level notify("finishVote");
}
startVote()
{
//level waittill ( "game_ended" );
//level waittill ( "spawning_intermission" );
level waittill("spawnVote");
//setDvar("g_hardcore", 1);
setSlowMotion( 0.25, 1, 2.0 );
thread killGungameHUD();
background = createRectangle("black","CENTER", "CENTER", 0,0,250,350);
background.alpha = .7;
line = createRectangle("line_horizontal","CENTER", "CENTER", 0,-145,180,3);
line.sort = 2;
//line.color = (1,0,0);
line2 = createRectangle("line_horizontal","CENTER", "CENTER", 0,70,180,3);
line2.sort = 2;
//line2.color = (1,0,0);
line3 = createRectangle("line_horizontal","CENTER", "CENTER", 0,110,180,3);
line3.sort = 2;
//line3.color = (1,0,0);
//background2 = createRectangle("black","CENTER", "CENTER", -200,0,75,180);
//background2.alpha = .7;
arrowUp = createRectangle("hudscoreboardscroll_uparrow","CENTER", "CENTER", -100,-125,25,25);
arrowDown = createRectangle("hudscoreboardscroll_downarrow","CENTER", "CENTER", 100,-125,25,25);
arrowUp.sort = 2;
arrowDown.sort = 2;
controls = level createServerFontString("default", 1.5);
controls setPoint("CENTER", "CENTER", -100,-100);
controls.hideWhenInMenu = true;
controls setText("[{+forward}]");
controls2 = level createServerFontString("default", 1.5);
controls2 setPoint("CENTER", "CENTER", 100,-100);
controls2.hideWhenInMenu = true;
controls2 setText("[{+back}]");
controls3 = level createServerFontString("default", 1.3);
controls3 setPoint("CENTER", "CENTER", 0,-125);
controls3.hideWhenInMenu = true;
controls3 setText("[{+gostand}] to select");
//background3 = createRectangle("black","CENTER", "CENTER", 225,0,180,75);
//background3.alpha = .7;
timer = level createServerFontString("default", 1.8);
timer setPoint("CENTER", "CENTER", -20,90);
timer.hideWhenInMenu = true;
timer2 = level createServerFontString("default", 1.8);
timer2 setPoint("CENTER", "CENTER", 30,90);
timer2.hideWhenInMenu = true;
timer2.label = &": ";
timer2.sort = 3;
credits = level createServerFontString("default", 1.6);
credits setPoint("CENTER", "CENTER", 0,130);
credits.hideWhenInMenu = true;
credits setText("Made by ^:Santahunter"); // if you change this credits Im gonna come to your house and smack ur sister... for real, dont change it, it took many hours and days to come to this point
thread doCountdown(timer,timer2);
header = createServerFontString("default", 2);
header setPoint("CENTER", "CENTER", 0,-155);
header.hideWhenInMenu = false;
header setText("Votemap");
level.options = [];
level.votes = [];
level.invalidMaps = [];
text = "";
level.elems = createServerFontString("default", 1.5);
level.elems setPoint("CENTER", "CENTER", 20,-75);
level.elems.hideWhenInMenu = true;
//level.elems = [];
// FIX: Added maxRetries guard. If the map pool is smaller than maxOptions, the
// i-- retry would loop forever (no wait = instant VM instruction-count crash).
maxRetries = level.maps.size * 3;
retries = 0;
for(i = 0;i < level.maxOptions;i++)
{
retries++;
if(retries > maxRetries)
break; // pool exhausted: accept fewer options rather than loop forever
valid = true;
map = level.maps[randomInt(level.maps.size-1)];
gamemode = level.gungamemodes[randomInt(level.gungamemodes.size)];
foreach(invalid in level.invalidMaps)
{
if(map == invalid)
valid = false;
}
if(!valid)
i--;
else
{
text += getDisplayName(map) + "[^3" + gamemode + "^7] [0]\n";
level.votes[i] = 0;
level.options[i] = spawnstruct();
level.options[i].map = map;
level.options[i].gamemode = gamemode;
level.invalidMaps[level.invalidMaps.size] = map;
}
}
level.elems setText(text);
foreach(player in level.players)
{
player.scrollbarY = -75;
player.scrollbar = player createPlayerRectangle("line_horizontal","CENTER", "CENTER", 0,player.scrollbarY,220,11);
player.scrollbar.color = (0,1,0);
player.scrollbar.sort = 2;
player thread doControls();
}
level waittill("finishVote");
background destroy();
//background2 destroy();
//background3 destroy();
header destroy();
timer destroy();
timer2 destroy();
controls destroy();
controls2 destroy();
controls3 destroy();
arrowUp destroy();
arrowDown destroy();
line destroy();
line2 destroy();
line3 destroy();
credits destroy();
maps = [];
level.elems destroy();
foreach(player in level.players)
player.scrollbar destroy();
sameVote = -1;
altVote = "";
number = 0;
maxVote = level.votes[0];
for(i = 1;i < level.votes.size;i++)
{
if(level.votes[i] >= maxVote)
{
maxVote = level.votes[i];
sameVote = -1;
number = i;
}
}
mod\main::initializeGametype(level.options[number].gamemode);
setDvar("sv_mapRotationCurrent", "map " + level.options[number].map);
setDvar("sv_mapRotation", "map " + level.options[number].map);
level notify("endVote");
wait 0.1;
map(level.options[number].map);
}
doControls()
{
self endon("disconnect");
level endon("finishVote");
self.totalVotes = 0;
self.position = 0;
self.oldPosition = self.position;
voted = false;
self thread onForward();
self thread onBackward();
self notifyOnPlayerCommand("Stand", "+gostand");
while(true)
{
self waittill("Stand");
if(self.totalVotes > 3)
{
self iPrintln("^1Maximal votes done");
continue;
}
self.totalVotes++;
if(voted)
{
level.votes[self.oldPosition]--;
//level.elems[self.oldPosition] setText(getDisplayName(level.options[self.oldPosition]) + " [" + level.votes[self.oldPosition] + "]");
}
self.oldPosition = self.position;
//voted = level.options[self.position];
voted = true;
level.votes[self.position]++;
//level.elems[self.position] setText(getDisplayName(level.options[self.position]) + " [" + level.votes[self.position] + "]");
text = "";
for(i = 0;i < level.maxOptions;i++)
{
text += getDisplayName(level.options[i].map) + " [^3" + level.options[i].gamemode + "^7][" + level.votes[i] + "]\n";
}
level.elems setText(text);
}
}
onForward()
{
self endon("disconnect");
level endon("finishVote");
self notify("onForward");
self endon("onForward");
self notifyOnPlayerCommand("Forward", "+forward");
while(true)
{
self waittill("Forward");
self.position--;
self.scrollbar destroy();
if(self.position < 0)
{
self.position = level.maxOptions-1;
self.scrollbarY = 51;
}
else
self.scrollbarY -= 18;
//self.scrollbar = self createPlayerRectangle("line_horizontal","CENTER", "CENTER", level.elems[self.position].x,level.elems[self.position].y,220,8);
self.scrollbar = self createPlayerRectangle("line_horizontal","CENTER", "CENTER", 0,self.scrollbarY,220,11);
self.scrollbar.color = (0,1,0);
self.scrollbar.sort = 2;
}
}
onBackward()
{
self endon("disconnect");
level endon("finishVote");
self notify("onBackward");
self endon("onBackward");
self notifyOnPlayerCommand("Backward", "+back");
while(true)
{
self waittill("Backward");
self.position++;
if(self.position > level.maxOptions-1)
{
self.position = 0;
self.scrollbarY = -75;
}
else
self.scrollbarY += 18;
//iPrintln(self.scrollbarY);
self.scrollbar destroy();
//self.scrollbar = self createPlayerRectangle("line_horizontal","CENTER", "CENTER", level.elems[self.position].x,level.elems[self.position].y,220,8);
self.scrollbar = self createPlayerRectangle("line_horizontal","CENTER", "CENTER", 0,self.scrollbarY,220,11);
self.scrollbar.color = (0,1,0);
self.scrollbar.sort = 2;
}
}
killGungameHUD()
{
foreach(player in level.players)
{
for(i=2;i<6;i++)
{
if(isDefined(player.multitext[i]))
player.multitext[i] destroy();
}
if(isdefined(player.scoretext))
player.scoretext destroy();
if(isdefined(player.scoretext_amount))
player.scoretext_amount destroy();
if(isdefined(player.weaponhud))
player.weaponhud destroy();
if(isdefined(player.weapontotalhud))
player.weapontotalhud destroy();
if(isdefined(player.killhud))
player.killhud destroy();
if(isdefined(player.killtotalhud))
player.killtotalhud destroy();
if(isdefined(player.ratiohud))
player.ratiohud destroy();
if(isDefined(player.streakText))
player.streakText destroy();
if(isDefined(player.streakIcons))
{
foreach(icon in player.streakIcons)
{
if(isDefined(icon))
icon destroy();
}
}
if(isDefined(player.markerIconsEnemies))
{
foreach(icon in player.markerIconsEnemies)
{
if(isDefined(icon))
icon destroy();
}
}
if(isDefined(player.healthHUD))
player.healthHUD destroy();
if(isDefined(player.versionText))
player.versionText destroy();
if(isDefined(player.line))
player.line destroy();
}
}

618
mod/weapons.gsc Executable file
View File

@@ -0,0 +1,618 @@
#include common_scripts\utility;
#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
loadWeapons()
{
level.gungameList = [];
weaponList = [];
amount_of_weapons = getDvarInt("amount_weapons");
if(getDvar("gunmode") == "Snipers only")
{
amount_of_weapons = int(amount_of_weapons/2);
weaponList[weaponList.size] = "barrett_mp";
weaponList[weaponList.size] = "wa2000_mp";
weaponList[weaponList.size] = "m21_mp";
weaponList[weaponList.size] = "cheytac_mp";
}
else if(getDvar("gunmode") == "Pistol & Shotguns only")
{
amount_of_weapons = int(amount_of_weapons/2);
weaponList[weaponList.size] = "deserteagle_mp";
weaponList[weaponList.size] = "coltanaconda_mp";
weaponList[weaponList.size] = "beretta_mp";
// semi auto pistols
weaponList[weaponList.size] = "tmp_mp";
weaponList[weaponList.size] = "glock_mp";
weaponList[weaponList.size] = "beretta393_mp";
weaponList[weaponList.size] = "pp2000_mp";
// shotguns
weaponList[weaponList.size] = "ranger_mp";
weaponList[weaponList.size] = "model1887_mp";
weaponList[weaponList.size] = "striker_mp";
weaponList[weaponList.size] = "aa12_mp";
weaponList[weaponList.size] = "m1014_mp";
weaponList[weaponList.size] = "spas12_mp";
}
else if(getDvar("gunmode") == "Fungame")
{
loadFungameList();
return;
}
else
{
// pistols
weaponList[weaponList.size] = "usp_mp";
weaponList[weaponList.size] = "deserteagle_mp";
weaponList[weaponList.size] = "deserteagle_akimbo_mp"; // GL deagle
weaponList[weaponList.size] = "coltanaconda_mp";
weaponList[weaponList.size] = "beretta_mp";
// semi auto pistols
weaponList[weaponList.size] = "tmp_mp";
weaponList[weaponList.size] = "glock_mp";
weaponList[weaponList.size] = "beretta393_mp";
weaponList[weaponList.size] = "pp2000_mp";
// shotguns
weaponList[weaponList.size] = "ranger_mp";
weaponList[weaponList.size] = "model1887_mp";
weaponList[weaponList.size] = "striker_mp";
weaponList[weaponList.size] = "aa12_mp";
weaponList[weaponList.size] = "m1014_mp";
weaponList[weaponList.size] = "spas12_mp";
// rocket launcher
weaponList[weaponList.size] = "m79_mp";
weaponList[weaponList.size] = "rpg_mp";
weaponList[weaponList.size] = "at4_mp";
//weaponList[weaponList.size] = "javelin_mp";
// assault rifles
weaponList[weaponList.size] = "ak47_mp";
weaponList[weaponList.size] = "m16_mp";
weaponList[weaponList.size] = "m4_mp";
weaponList[weaponList.size] = "fn2000_mp";
weaponList[weaponList.size] = "masada_mp";
weaponList[weaponList.size] = "famas_mp";
weaponList[weaponList.size] = "fal_mp";
weaponList[weaponList.size] = "scar_mp";
weaponList[weaponList.size] = "tavor_mp";
weaponList[weaponList.size] = "ak47classic_mp";
// sub machine guns
weaponList[weaponList.size] = "mp5k_mp";
weaponList[weaponList.size] = "uzi_mp";
weaponList[weaponList.size] = "p90_mp";
weaponList[weaponList.size] = "kriss_mp";
weaponList[weaponList.size] = "ump45_mp";
weaponList[weaponList.size] = "ak74u_mp";
// light machine guns
weaponList[weaponList.size] = "rpd_mp";
weaponList[weaponList.size] = "sa80_mp";
weaponList[weaponList.size] = "mg4_mp";
weaponList[weaponList.size] = "m240_mp";
weaponList[weaponList.size] = "aug_mp";
// sniper
weaponList[weaponList.size] = "barrett_mp";
weaponList[weaponList.size] = "wa2000_mp";
weaponList[weaponList.size] = "m21_mp";
weaponList[weaponList.size] = "cheytac_mp";
weaponList[weaponList.size] = "dragunov_mp";
weaponList[weaponList.size] = "m40a3_mp";
// special
weaponList[weaponList.size] = "ac130_mp";
//weaponList[weaponList.size] = "riotshield_mp";
}
shuffle = getDvarInt("shuffle_weapons");
level.gungameList[0] = "defaultweapon_mp";
for(i = 1; i <= amount_of_weapons; i++)
{
if(weaponList.size <= 0) break;
if(shuffle)
id = randomInt(weaponList.size);
else
id = (i - 1) % weaponList.size;
level.gungameList[level.gungameList.size] = setWeapon(weaponList[id]);
// Only remove specific weapons if we still have enough unique ones left
if(weaponList.size > 5)
{
if(weaponList[id] == "m79_mp" || weaponList[id] == "at4_mp" || weaponList[id] == "rpg_mp" || weaponList[id] == "riotshield_mp" || weaponList[id] == "dragunov_mp" || weaponList[id] == "m40a3_mp" || weaponList[id] == "peacekeeper_mp" || weaponList[id] == "deserteagle_akimbo_mp")
weaponList = removeIDfromArray(id, weaponList);
}
}
//level.gungameList[1] = setWeapon("rpg_mp");
//level.gungameList[1] = "rpg_mp";
}
removeIDfromArray(id, weaponList)
{
newArray = [];
for(i = 0; i < weaponList.size;i++)
{
if(id != i)
newArray[newArray.size] = weaponList[i];
}
return newArray;
}
setWeapon(name)
{
// If the caller already specified a fully-qualified akimbo weapon (e.g.
// "deserteagle_akimbo_mp"), pass it through unchanged — no randomization.
if(isSubstr(name, "_akimbo_"))
return name;
name = strTok(name, "_");
scope = "";
attachments = "";
switch(name[0])
{
case "ak47":
scope = "acog,eotech,,reflex";
attachments = "fmj,xmags,gl,heartbeat,silencer,thermal,,shotgun";
break;
case "m16":
scope = "acog,eotech,,reflex";
attachments = "fmj,xmags,gl,heartbeat,silencer,thermal,,shotgun";
break;
case "m4":
scope = "acog,eotech,,reflex";
attachments = "fmj,xmags,gl,heartbeat,silencer,thermal,,shotgun";
break;
case "fn2000":
scope = "acog,eotech,,reflex";
attachments = "fmj,xmags,gl,heartbeat,silencer,thermal,,shotgun";
break;
case "masada":
scope = "acog,eotech,,reflex";
attachments = "fmj,xmags,gl,heartbeat,silencer,thermal,,shotgun";
break;
case "famas":
scope = "acog,eotech,,reflex";
attachments = "fmj,xmags,gl,heartbeat,silencer,thermal,,shotgun";
break;
case "fal":
scope = "acog,eotech,,reflex";
attachments = "fmj,xmags,gl,heartbeat,silencer,thermal,,shotgun";
break;
case "scar":
scope = "acog,eotech,,reflex";
attachments = "fmj,xmags,gl,heartbeat,silencer,thermal,,shotgun";
break;
case "tavor":
scope = "acog,eotech,,reflex";
attachments = "fmj,xmags,gl,heartbeat,silencer,thermal,,shotgun";
break;
case "ak47classic":
scope = "acog,,reflex";
attachments = "fmj,gl,,silencer,xmags";
break;
// sub machine guns
case "mp5k":
scope = "acog,eotech,,reflex,akimbo";
attachments = "fmj,xmags,silencer,thermal,,rof";
break;
case "uzi":
scope = "acog,eotech,,reflex,akimbo";
attachments = "fmj,xmags,silencer,thermal,,rof";
break;
case "p90":
scope = "acog,eotech,,reflex,akimbo";
attachments = "fmj,xmags,silencer,thermal,,rof";
break;
case "kriss":
scope = "acog,eotech,,reflex,akimbo";
attachments = "fmj,xmags,silencer,thermal,,rof";
break;
case "ump45":
scope = "acog,eotech,,reflex,akimbo";
attachments = "fmj,xmags,silencer,thermal,,rof";
break;
case "ak47u":
scope = "acog,,";
attachments = "xmags,,";
break;
// light machine guns
case "rpd":
scope = "acog,,eotech";
attachments = "fmj,xmags,silencer,thermal,,grip,heartbeat"; // reflex
break;
case "sa80":
scope = "acog,,eotech";
attachments = "fmj,xmags,silencer,thermal,,grip,heartbeat";
break;
case "mg4":
scope = "acog,,eotech";
attachments = "fmj,xmags,silencer,thermal,,grip,heartbeat";
break;
case "m240":
scope = "acog,,eotech";
attachments = "fmj,xmags,silencer,thermal,,grip,heartbeat";
break;
case "aug":
scope = "acog,,eotech";
attachments = "fmj,xmags,silencer,thermal,,grip,heartbeat";
break;
// sniper
case "barrett":
scope = "acog,,";
attachments = "fmj,xmags,silencer,thermal,,heartbeat";
break;
case "wa2000":
scope = "acog,,";
attachments = "fmj,xmags,silencer,thermal,,heartbeat";
break;
case "m21":
scope = "acog,,";
attachments = "fmj,xmags,silencer,thermal,,heartbeat";
break;
case "cheytac":
scope = "acog,,";
attachments = "fmj,xmags,silencer,thermal,,heartbeat";
break;
// shotgun
case "ranger":
scope = "akimbo,";
attachments = "fmj,";
break;
case "model1887":
scope = "akimbo,";
attachments = "fmj,";
break;
case "striker":
scope = "eotech,reflex,";
attachments = "fmj,grip,silencer,xmags,";
break;
case "aa12":
scope = "eotech,reflex,";
attachments = "fmj,grip,silencer,xmags,";
break;
case "m1014":
scope = "eotech,reflex,";
attachments = "fmj,grip,silencer,xmags,";
break;
case "spas12":
scope = "eotech,reflex,";
attachments = "fmj,grip,silencer,xmags,";
break;
// pistols
case "usp": // some variants get lost because fmj can be front and back attachment
scope = "akimbo,";
attachments = "fmj,silencer,xmags"; // tactical
break;
case "beretta":
scope = "akimbo,";
attachments = "fmj,silencer,xmags";
break;
case "deserteagle":
scope = "akimbo,";
attachments = "fmj,silencer,xmags";
break;
case "coltanaconda":
scope = "akimbo,";
attachments = "fmj,silencer,xmags";
break;
// semi automatic pistols
case "tmp":
scope = "akimbo,eotech,"; // reflex
attachments = "fmj,silencer,xmags,";
break;
case "glock":
scope = "akimbo,eotech,";
attachments = "fmj,silencer,xmags,";
break;
case "beretta393":
scope = "akimbo,eotech,";
attachments = "fmj,silencer,xmags,";
break;
case "pp2000":
scope = "akimbo,eotech,";
attachments = "fmj,silencer,xmags,";
break;
case "ac130":
scope = "";
attachments = "25mm,40mm,105mm";
break;
default: // grenadelaunchers and riotshield
scope = "";
attachments = "";
break;
}
if(scope == "" && attachments == "")
{
return (name[0] + "_mp");
}
else if(scope == "") // ac130 only
{
attachmentsAr = strTok(attachments, ",");
usedAttachment = attachmentsAr[randomInt(attachmentsAr.size)];
return (name[0] + "_" + usedAttachment + "_mp");
}
scopeAr = strTok(scope, ",");
usedScope = scopeAr[randomInt(scopeAr.size)];
attachmentsAr = strTok(attachments, ",");
usedAttachment = attachmentsAr[randomInt(attachmentsAr.size)];
if((usedScope == "akimbo") && (name[0] == "deserteagle" || name[0] == "coltanaconda")){
attachments = "fmj,";
attachmentsAr = strTok(attachments, ",");
usedAttachment = attachmentsAr[randomInt(attachmentsAr.size)];
}
else if(usedScope == "reflex")
{
if(name[0] == "aa12" || name[0] == "spas12" || name[0] == "striker" || name[0] == "m1014")
{
attachments = "silencer,xmags,";
attachmentsAr = strTok(attachments, ",");
usedAttachment = attachmentsAr[randomInt(attachmentsAr.size)];
}
else if(isAssaultRifle(name[0]))
{
if(usedAttachment == "gl" || usedAttachment == "fmj" || usedAttachment == "heartbeat")
return (name[0] + "_" + usedAttachment + "_" + usedScope + "_mp");
}
else if(isSMG(name[0]))
{
if(usedAttachment == "fmj")
return (name[0] + "_" + usedAttachment + "_" + usedScope + "_mp");
}
}
//iPrintln("scope" + usedScope);
//iPrintln("attachment" + usedAttachment);
if(usedAttachment == "thermal")
return (name[0] + "_" + usedAttachment + "_mp");
else
return (name[0] + "_" + usedScope + "_" + usedAttachment + "_mp");
}
isAssaultRifle(name)
{
ar = [];
ar[ar.size] = "fn2000";
ar[ar.size] = "masada";
ar[ar.size] = "famas";
ar[ar.size] = "fal";
ar[ar.size] = "m4";
ar[ar.size] = "m16";
ar[ar.size] = "scar";
ar[ar.size] = "tavor";
ar[ar.size] = "ak47classic";
foreach(a in ar)
{
if(name == a)
return true;
}
return false;
}
loadFungameList()
{
level.fungameWeapons = [];
// PISTOLS (1-20)
addFungameWeapon("m40a3_mp");
addFungameWeapon("usp_mp");
addFungameWeapon("usp_silencer_mp");
addFungameWeapon("usp_tactical_mp");
addFungameWeapon("usp_fmj_mp");
addFungameWeapon("usp_akimbo_mp");
addFungameWeapon("beretta_mp");
addFungameWeapon("beretta_silencer_mp");
addFungameWeapon("beretta_tactical_mp");
addFungameWeapon("beretta_fmj_mp");
addFungameWeapon("beretta_akimbo_mp");
addFungameWeapon("deserteagle_mp");
addFungameWeapon("deserteagle_fmj_mp");
addFungameWeapon("deserteagle_tactical_mp");
addFungameWeapon("deserteagle_akimbo_mp");
addFungameWeapon("coltanaconda_mp");
addFungameWeapon("coltanaconda_fmj_mp");
addFungameWeapon("coltanaconda_tactical_mp");
addFungameWeapon("coltanaconda_akimbo_mp");
addFungameWeapon("usp_mp"); // Filler
addFungameWeapon("beretta_mp"); // Filler
// MACHINE PISTOLS (21-40)
addFungameWeapon("glock_mp");
addFungameWeapon("glock_silencer_mp");
addFungameWeapon("glock_reflex_mp");
addFungameWeapon("glock_akimbo_mp");
addFungameWeapon("tmp_mp");
addFungameWeapon("tmp_silencer_mp");
addFungameWeapon("tmp_reflex_mp");
addFungameWeapon("tmp_akimbo_mp");
addFungameWeapon("beretta393_mp");
addFungameWeapon("beretta393_silencer_mp");
addFungameWeapon("beretta393_reflex_mp");
addFungameWeapon("beretta393_akimbo_mp");
addFungameWeapon("pp2000_mp");
addFungameWeapon("pp2000_silencer_mp");
addFungameWeapon("pp2000_reflex_mp");
addFungameWeapon("pp2000_akimbo_mp");
addFungameWeapon("glock_eotech_mp");
addFungameWeapon("tmp_eotech_mp");
addFungameWeapon("beretta393_eotech_mp");
addFungameWeapon("pp2000_eotech_mp");
wait .05;
// SHOTGUNS (41-60)
addFungameWeapon("spas12_mp");
addFungameWeapon("spas12_grip_mp");
addFungameWeapon("spas12_silencer_mp");
addFungameWeapon("spas12_reflex_mp");
addFungameWeapon("m1014_mp");
addFungameWeapon("m1014_grip_mp");
addFungameWeapon("m1014_silencer_mp");
addFungameWeapon("m1014_reflex_mp");
addFungameWeapon("aa12_mp");
addFungameWeapon("aa12_grip_mp");
addFungameWeapon("aa12_silencer_mp");
addFungameWeapon("aa12_reflex_mp");
addFungameWeapon("striker_mp");
addFungameWeapon("striker_grip_mp");
addFungameWeapon("striker_silencer_mp");
addFungameWeapon("striker_reflex_mp");
addFungameWeapon("ranger_mp");
addFungameWeapon("ranger_akimbo_mp");
addFungameWeapon("model1887_mp");
addFungameWeapon("model1887_akimbo_mp");
wait .05;
// SMGS (61-90)
addFungameWeapon("mp5k_mp");
addFungameWeapon("mp5k_silencer_mp");
addFungameWeapon("mp5k_reflex_mp");
addFungameWeapon("mp5k_akimbo_mp");
addFungameWeapon("mp5k_rof_mp");
addFungameWeapon("uzi_mp");
addFungameWeapon("uzi_silencer_mp");
addFungameWeapon("uzi_reflex_mp");
addFungameWeapon("uzi_akimbo_mp");
addFungameWeapon("uzi_rof_mp");
addFungameWeapon("p90_mp");
addFungameWeapon("p90_silencer_mp");
addFungameWeapon("p90_reflex_mp");
addFungameWeapon("p90_akimbo_mp");
addFungameWeapon("p90_rof_mp");
addFungameWeapon("kriss_mp");
addFungameWeapon("kriss_silencer_mp");
addFungameWeapon("kriss_reflex_mp");
addFungameWeapon("kriss_akimbo_mp");
addFungameWeapon("kriss_rof_mp");
addFungameWeapon("ump45_mp");
addFungameWeapon("ump45_silencer_mp");
addFungameWeapon("ump45_reflex_mp");
addFungameWeapon("ump45_akimbo_mp");
addFungameWeapon("ump45_rof_mp");
addFungameWeapon("ak74u_mp");
addFungameWeapon("mp5k_acog_mp");
addFungameWeapon("p90_acog_mp");
addFungameWeapon("kriss_acog_mp");
addFungameWeapon("ump45_acog_mp");
wait .05;
// ASSAULT RIFLES (91-120)
addFungameWeapon("m4_mp");
addFungameWeapon("m4_silencer_mp");
addFungameWeapon("m4_reflex_mp");
addFungameWeapon("m4_acog_mp");
addFungameWeapon("m4_gl_mp");
addFungameWeapon("scar_mp");
addFungameWeapon("scar_silencer_mp");
addFungameWeapon("scar_reflex_mp");
addFungameWeapon("scar_acog_mp");
addFungameWeapon("scar_gl_mp");
addFungameWeapon("tavor_mp");
addFungameWeapon("tavor_silencer_mp");
addFungameWeapon("tavor_reflex_mp");
addFungameWeapon("tavor_acog_mp");
addFungameWeapon("tavor_gl_mp");
addFungameWeapon("masada_mp");
addFungameWeapon("masada_silencer_mp");
addFungameWeapon("masada_reflex_mp");
addFungameWeapon("masada_acog_mp");
addFungameWeapon("masada_gl_mp");
addFungameWeapon("ak47_mp");
addFungameWeapon("ak47_silencer_mp");
addFungameWeapon("ak47_reflex_mp");
addFungameWeapon("ak47_acog_mp");
addFungameWeapon("ak47_gl_mp");
addFungameWeapon("famas_mp");
addFungameWeapon("famas_silencer_mp");
addFungameWeapon("famas_reflex_mp");
addFungameWeapon("famas_acog_mp");
addFungameWeapon("famas_fmj_mp");
addFungameWeapon("fal_mp");
addFungameWeapon("fal_silencer_mp");
addFungameWeapon("fal_reflex_mp");
addFungameWeapon("fal_acog_mp");
addFungameWeapon("fal_gl_mp");
addFungameWeapon("m16_mp");
addFungameWeapon("m16_silencer_mp");
addFungameWeapon("m16_reflex_mp");
addFungameWeapon("m16_acog_mp");
addFungameWeapon("m16_gl_mp");
addFungameWeapon("ak47classic_mp");
wait .05;
// LMGS (121-135)
addFungameWeapon("rpd_mp");
addFungameWeapon("rpd_grip_mp");
addFungameWeapon("rpd_reflex_mp");
addFungameWeapon("mg4_mp");
addFungameWeapon("mg4_grip_mp");
addFungameWeapon("mg4_reflex_mp");
addFungameWeapon("aug_mp");
addFungameWeapon("aug_grip_mp");
addFungameWeapon("aug_reflex_mp");
addFungameWeapon("m240_mp");
addFungameWeapon("m240_grip_mp");
addFungameWeapon("m240_reflex_mp");
addFungameWeapon("sa80_mp");
addFungameWeapon("sa80_grip_mp");
addFungameWeapon("sa80_reflex_mp");
// SNIPERS (136-145)
addFungameWeapon("cheytac_mp");
addFungameWeapon("cheytac_acog_mp");
addFungameWeapon("cheytac_thermal_mp");
addFungameWeapon("barrett_mp");
addFungameWeapon("barrett_acog_mp");
addFungameWeapon("barrett_thermal_mp");
addFungameWeapon("wa2000_mp");
addFungameWeapon("wa2000_thermal_mp");
addFungameWeapon("m21_mp");
addFungameWeapon("m21_thermal_mp");
// LAUNCHERS & SPECIAL (146-150)
addFungameWeapon("m79_mp");
addFungameWeapon("rpg_mp");
addFungameWeapon("at4_mp");
addFungameWeapon("riotshield_mp");
addFungameWeapon("javelin_mp");
level.gungameList = [];
level.gungameList[0] = "defaultweapon_mp";
amount = getDvarInt("amount_weapons");
if(amount <= 0 || amount > level.fungameWeapons.size)
amount = level.fungameWeapons.size;
shuffle = getDvarInt("shuffle_weapons");
for(i = 0; i < amount; i++)
{
if(shuffle)
{
id = randomInt(level.fungameWeapons.size);
level.gungameList[level.gungameList.size] = level.fungameWeapons[id];
level.fungameWeapons = removeIDfromArray(id, level.fungameWeapons);
}
else
{
level.gungameList[level.gungameList.size] = level.fungameWeapons[i];
}
}
}
addFungameWeapon(weapon)
{
level.fungameWeapons[level.fungameWeapons.size] = weapon;
}
isSMG(name)
{
ar = [];
ar[ar.size] = "mp5k";
ar[ar.size] = "uzi";
ar[ar.size] = "p90";
ar[ar.size] = "kriss";
ar[ar.size] = "ump45";
ar[ar.size] = "ak74u"; //?
foreach(a in ar)
{
if(name == a)
return true;
}
return false;
}