foobarbaz

This commit is contained in:
2026-05-10 23:58:54 +02:00
parent ab5ea78957
commit 6faeadc3d5
6 changed files with 98 additions and 1217 deletions

View File

@@ -86,14 +86,6 @@ CodeCallback_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath
iDamage = 50; iDamage = 50;
} }
if(level.state == "ingame" && getDvarInt("show_damage_ui") == 1){ if(level.state == "ingame" && getDvarInt("show_damage_ui") == 1){
if(getDvar("g_gametype") == "gungame_team")
{
if(self.team == eAttacker.team)
{
[[level.callbackPlayerDamage]](eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, timeOffset); // tested?
return;
}
}
// Guard: eAttacker is undefined for world/self damage (falls, barrels, etc.) // Guard: eAttacker is undefined for world/self damage (falls, barrels, etc.)
if(isPlayer(eAttacker) && eAttacker != self) if(isPlayer(eAttacker) && eAttacker != self)
{ {
@@ -185,8 +177,7 @@ CodeCallback_PlayerKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon
self.score = 0; self.score = 0;
if(self.current > 0) if(self.current > 0)
self.current--; self.current--;
if(getDvar("g_gametype") != "gungame_team") self.gungameKills--;
self.gungameKills--;
self thread mod\main::warning(3); self thread mod\main::warning(3);
} }
else if(sMeansOfDeath != "MOD_MELEE" || sWeapon == "riotshield_mp") else if(sMeansOfDeath != "MOD_MELEE" || sWeapon == "riotshield_mp")
@@ -194,48 +185,11 @@ CodeCallback_PlayerKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon
eAttacker playlocalsound("mp_enemy_obj_captured"); eAttacker playlocalsound("mp_enemy_obj_captured");
eAttacker notify("killed_enemy"); eAttacker notify("killed_enemy");
eAttacker.score += 100; eAttacker.score += 100;
if(getDvar("g_gametype") != "gungame_team") // Riot shield kills give extra credit to match gun_kills requirement
{ if(sWeapon == "riotshield_mp")
//iPrintlnBold(getDvar("gunmode")); eAttacker.gungameKills += getDvarInt("gun_kills", 1);
if(getDvar("gunmode") != "Kill Confirmed") else
{ eAttacker.gungameKills++;
if(sWeapon == "riotshield_mp" && getDvar("gunmode") == "Fungame")
eAttacker.gungameKills += getDvarInt("gun_kills", 1);
else
eAttacker.gungameKills++;
}
else
thread mod\main::spawnDogTag(self, eAttacker);
}
else if(eAttacker.team != self)
{
if(eAttacker.team == "allies")
{
level.teamKills["allies"]++;
if(level.teamKills["allies"] >= getRequiredKills())
{
level.teamKills["allies"] = 0;
level.teamKills["allies_weapon"]++;
level notify("upgrade_allies");
thread mod\main::upgradeTeamUI("allies");
thread mod\main::upgradeEnemyWeaponUI("axis");
}
}
else
{
level.teamKills["axis"]++;
if(level.teamKills["axis"] >= eAttacker getRequiredKills())
{
level.teamKills["axis"] = 0;
level.teamKills["axis_weapon"]++;
level notify("upgrade_axis");
thread mod\main::upgradeTeamUI("axis");
thread mod\main::upgradeEnemyWeaponUI("allies");
}
}
eAttacker thread mod\main::scorepopup(100);
eAttacker.streaking++;
}
} }
else{ else{
eAttacker.score += 100; eAttacker.score += 100;
@@ -243,23 +197,6 @@ CodeCallback_PlayerKilled(eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon
self notify("killed_lethal"); self notify("killed_lethal");
[[level.callbackPlayerKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration); [[level.callbackPlayerKilled]](eInflictor, eAttacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, timeOffset, deathAnimDuration);
} }
getRequiredKills()
{
allies = 0;
axis = 0;
foreach(player in level.players)
{
if(player.team == "allies")
allies++;
else if(player.team == "axis")
axis++;
}
if(self.team == "allies")
return allies;
else if(self.team == "axis")
return axis;
return 9999;
}
getRequiredKillsOld() getRequiredKillsOld()
{ {

View File

@@ -55,7 +55,7 @@ onStartGameType()
setObjectiveHintText( "allies", "Be the first who cycled through all guns to win! \n \n Mod made by ^:Santahunter^7!" ); setObjectiveHintText( "allies", "Be the first who cycled through all guns to win! \n \n Mod made by ^:Santahunter^7!" );
setObjectiveHintText( "axis", "Be the first who cycled through all guns to win! \n \n Mod made by ^:Santahunter^7!" ); setObjectiveHintText( "axis", "Be the first who cycled through all guns to win! \n \n Mod made by ^:Santahunter^7!" );
level.killcam = false; level.killcam = true; // enables final killcam at end of game
level.spawnMins = ( 0, 0, 0 ); level.spawnMins = ( 0, 0, 0 );
level.spawnMaxs = ( 0, 0, 0 ); level.spawnMaxs = ( 0, 0, 0 );
maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_dm_spawn" ); maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_dm_spawn" );

View File

@@ -4,14 +4,8 @@
///////////////////// /////////////////////
// //
// Gamemodes: // Gamemode: Fungame (only mode)
// //
// - basic
// - team gungame
// - no streaks
// - snipers only
// - kill confirmed
// - pistol & shotgun only (disabled)
Init() Init()
{ {
@@ -19,109 +13,35 @@ Init()
loadSettings(); loadSettings();
thread mod\weapons::loadWeapons(); thread mod\weapons::loadWeapons();
thread mod\streaks::loadStreaks(); thread mod\streaks::loadStreaks();
thread mod\vote::loadVote(); // does not work
thread onPlayerConnect(); thread onPlayerConnect();
thread deleteSentries(); thread deleteSentries();
thread launchGame(); thread launchGame();
} }
setGamemodes() initializeGametype()
{ {
level.gungamemodes = []; setDvar("gunmode", "Fungame");
level.gungamemodes[level.gungamemodes.size] = "Fungame"; // God of Hellfire addition setDvar("g_gametype", "gungame");
level.gungamemodes[level.gungamemodes.size] = "Classic"; setDvar("gun_kills", 1);
// level.gungamemodes[level.gungamemodes.size] = "Classic"; // raising the chance setDvar("global_health", 60);
// level.gungamemodes[level.gungamemodes.size] = "Classic"; setDvar("speed", 1.5);
// level.gungamemodes[level.gungamemodes.size] = "No Streaks"; setDvar("streaks_online", 1);
// level.gungamemodes[level.gungamemodes.size] = "Snipers only"; setDvar("jump_height", 70);
//level.gungamemodes[level.gungamemodes.size] = "Pistol & Shotguns only"; // works but is it fun? setDvar("amount_weapons", 0); // 0 = full 162-weapon progression
// level.gungamemodes[level.gungamemodes.size] = "Team Gungame"; setDvar("shuffle_weapons", 0); // weapons play in fixed order
// level.gungamemodes[level.gungamemodes.size] = "Kill Confirmed";
}
initializeGametype(type) // called in vote.gsc after first map
{
setDvar("gunmode", type);
setDvar("gun_kills", 1); // Default to 1 kill per weapon
if(type == "Team Gungame")
setDvar("g_gametype", "gungame_team");
else
setDvar("g_gametype", "gungame");
switch(type)
{
case "Classic":
setDvar("global_health", 60);
setDvar("speed", 1.2);
setDvar("streaks_online", 1);
setDvar("jump_height", 60);
setDvar("amount_weapons", 100);
setDvar("shuffle_weapons", 1);
break;
case "No Streaks":
setDvar("global_health", 70);
setDvar("speed", 1.2);
setDvar("streaks_online", 0);
setDvar("jump_height", 70);
break;
case "Snipers only":
setDvar("global_health", 70);
setDvar("speed", 1.2);
setDvar("streaks_online", 1);
setDvar("jump_height", 70);
break;
case "Pistol & Shotguns only":
setDvar("global_health", 70);
setDvar("speed", 1.2);
setDvar("streaks_online", 1);
setDvar("jump_height", 70);
break;
case "Team Gungame":
setDvar("global_health", 70);
setDvar("speed", 1.2);
setDvar("streaks_online", 1);
setDvar("jump_height", 70);
break;
case "Kill Confirmed":
setDvar("global_health", 100);
setDvar("speed", 1);
setDvar("streaks_online", 1);
setDvar("jump_height", 70);
break;
case "Fungame":
setDvar("global_health", 60);
setDvar("speed", 1.5);
setDvar("streaks_online", 1);
setDvar("jump_height", 70);
setDvar("amount_weapons", 0); // 0 = full 162-weapon progression
setDvar("shuffle_weapons", 0); // weapons play in fixed order
setDvar("gun_kills", 1);
break;
default: // not required
setDvar("global_health", 70);
setDvar("speed", 1.2);
setDvar("streaks_online", 1);
setDvar("jump_height", 70);
setDvar("amount_weapons", 100);
break;
}
} }
loadSettings() loadSettings()
{ {
/////////////////////// CUSTOM SETTINGS ///////////////////////////// /////////////////////// CUSTOM SETTINGS /////////////////////////////
//SetDvarIfUninitialized("gunmode", "Classic"); initializeGametype();
SetDvarIfUninitialized("gunmode", "Fungame");
initializeGametype(getDvar("gunmode"));
if(getDvar("g_gametype") == "gungame_team")
setDvar("amount_weapons", int(getDvarInt("amount_weapons")/4));
setDvar("shuffle_weapons", 0);
setDvar("intermission", 15); setDvar("intermission", 15);
SetDvarIfUninitialized("show_damage_ui", 1); SetDvarIfUninitialized("show_damage_ui", 1);
setDvar("gunversion", "1.5 Remaster by ^1Santahunter - Modified by God of Hellfire"); setDvar("gunversion", "1.5 Remaster by ^1Santahunter - Modified by God of Hellfire");
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
setDvar("scr_" + (getDvar("g_gametype")) + "_timelimit", 0); setDvar("scr_gungame_timelimit", 0);
setDvar("scr_" + (getDvar("g_gametype")) + "_scorelimit", 0); setDvar("scr_gungame_scorelimit", 0);
setDvar("ui_allow_teamchange", 0); setDvar("ui_allow_teamchange", 0);
setDvar("scr_game_allowkillcam", 0); setDvar("scr_game_allowkillcam", 1); // needed for final killcam
setDvar("testClients_watchKillcam", 0); setDvar("testClients_watchKillcam", 0);
setDvar("scr_game_hardpoints", 0); setDvar("scr_game_hardpoints", 0);
setDvar("scr_game_graceperiod", 0); setDvar("scr_game_graceperiod", 0);
@@ -143,20 +63,13 @@ loadSettings()
level.state = "prematch"; level.state = "prematch";
level.markerIcon = "ui_host"; level.markerIcon = "ui_host";
level.teamKills = [];
level.teamKills["allies"] = 0;
level.teamKills["axis"] = 0;
level.teamKills["allies_weapon"] = 1;
level.teamKills["axis_weapon"] = 1;
precacheShader(level.markerIcon); precacheShader(level.markerIcon);
setGamemodes();
// Bot Management // Bot Management
setDvar("bots_main", 1); setDvar("bots_main", 1);
setDvar("bots_manage_fill", 10); // total slots: players + bots = 10 setDvar("bots_manage_fill", 10); // total slots: players + bots = 10
setDvar("bots_manage_fill_mode", 0); // mode 0 = count players AND bots setDvar("bots_manage_fill_mode", 0); // mode 0 = count players AND bots
setDvar("bots_manage_fill_kick", 1); // kick a bot when a human pushes count over 10 setDvar("bots_manage_fill_kick", 1); // kick a bot when a human pushes count over 10
// Skill: 2 hard bots (1 per internal team), rest are brain dead
setDvar("bots_skill", 8); setDvar("bots_skill", 8);
setDvar("bots_skill_allies_hard", 1); setDvar("bots_skill_allies_hard", 1);
setDvar("bots_skill_allies_med", 0); setDvar("bots_skill_allies_med", 0);
@@ -164,17 +77,7 @@ loadSettings()
setDvar("bots_skill_axis_med", 0); setDvar("bots_skill_axis_med", 0);
setDvar("bots_play_knife", 0); setDvar("bots_play_knife", 0);
setDvar("bots_main_chat", 0); setDvar("bots_main_chat", 0);
// Suppress engine-level developer prints.
SetDvarIfUninitialized("scr_nuke_enabled", 1);
// Map voting: set to 1 to show custom vote screen at end of game,
// 0 to use the normal leaderboard + server map rotation instead.
SetDvarIfUninitialized("vote_enabled", 0);
// Cache mode flags as level vars — avoids repeated getDvar() in hot per-player loops.
level.isTeamGame = (getDvar("g_gametype") == "gungame_team");
level.isKillConfirmed = (getDvar("gunmode") == "Kill Confirmed");
// Suppress engine-level developer prints (e.g. "Replacing perk X in slot Y with Z").
// These come from native C code and cannot be silenced any other way.
// developer 0 is standard for production servers.
setDvar("developer", 0); setDvar("developer", 0);
} }
deleteSentries() deleteSentries()
@@ -233,7 +136,7 @@ launchGame()
} }
onPlayerConnect() onPlayerConnect()
{ {
level endon("nuke"); level endon("game_over");
while(true) while(true)
{ {
level waittill("connected", player); level waittill("connected", player);
@@ -242,26 +145,32 @@ onPlayerConnect()
} }
onPlayerSpawned() onPlayerSpawned()
{ {
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
self thread firstSpawn(); self thread firstSpawn();
while(true) while(true)
{ {
self waittill("spawned_player"); self waittill("spawned_player");
self thread loadSetup(); self thread loadSetup();
// self thread test();
} }
} }
firstSpawn() firstSpawn()
{ {
self endon("disconnect"); self endon("disconnect");
team = getCorrectTeam(); self.current = 1;
self thread setStartWeapon(team);
self.firstSpawn = true; self.firstSpawn = true;
self.knifeKills = 0; self.knifeKills = 0;
self.gungameKills = 0; self.gungameKills = 0;
self.isJugger = false; self.isJugger = false;
self.streaks = []; self.streaks = [];
// Join team + select class IMMEDIATELY — must happen before any waits
// so the engine has a valid class when it auto-spawns mid-game joiners.
self notify("menuresponse", game["menu_team"], "allies");
wait .05;
self notify("menuresponse", "changeclass", "class1");
wait .05;
self setClientDvar("cg_drawSplatter", 0); self setClientDvar("cg_drawSplatter", 0);
self setClientDvar("cg_drawDamageFlash", 0); self setClientDvar("cg_drawDamageFlash", 0);
self setClientDvar("cg_viewkickscale", 0.1); self setClientDvar("cg_viewkickscale", 0.1);
@@ -269,7 +178,7 @@ firstSpawn()
self setClientDvar("bg_shock_lookControl_mousesensitivityscale", 1); self setClientDvar("bg_shock_lookControl_mousesensitivityscale", 1);
self setClientDvar("bg_shock_movement", 0); self setClientDvar("bg_shock_movement", 0);
self setClientDvar("bg_shock_lookControl", 0); self setClientDvar("bg_shock_lookControl", 0);
self setClientDvar("scr_game_allowkillcam", 0);
if(isDefined(self.hud_damagefeedback)) if(isDefined(self.hud_damagefeedback))
self.hud_damagefeedback.color = (1,0,0); self.hud_damagefeedback.color = (1,0,0);
self.line = self createRectangle("CENTER", "LEFT", 0,-90,300,5,(1,1,0),"line_horizontal",1); self.line = self createRectangle("CENTER", "LEFT", 0,-90,300,5,(1,1,0),"line_horizontal",1);
@@ -283,51 +192,20 @@ firstSpawn()
self thread refillOnFire(); self thread refillOnFire();
self thread watchVersion(); self thread watchVersion();
self thread FPSBoost(); self thread FPSBoost();
if(getDvar("g_gametype") == "gungame_team")
self thread upgradeOnTeamKills();
for(i=1;i<3;i++) for(i=1;i<3;i++)
self setClientDvar("lowAmmoWarningNoAmmoColor" + i, 0, 0, 0, 0); self setClientDvar("lowAmmoWarningNoAmmoColor" + i, 0, 0, 0, 0);
wait .2;
self notify("menuresponse", game["menu_team"], team); // Re-apply perks — the engine's class-load can wipe perk state.
wait .1; self maps\mp\perks\_perks::givePerk("specialty_fastreload");
self notify("menuresponse", "changeclass", "class1");
wait .1;
// Re-apply perks here — the engine's class-load triggered by changeclass above
// can wipe perk state before loadSetup() gets a chance to set them on first spawn.
self maps\mp\perks\_perks::givePerk("specialty_fastreload"); // Sleight of Hand
self maps\mp\perks\_perks::givePerk("specialty_falldamage"); self maps\mp\perks\_perks::givePerk("specialty_falldamage");
self maps\mp\perks\_perks::givePerk("specialty_quickdraw"); self maps\mp\perks\_perks::givePerk("specialty_quickdraw");
self maps\mp\perks\_perks::givePerk("specialty_lightweight"); self maps\mp\perks\_perks::givePerk("specialty_lightweight");
self maps\mp\perks\_perks::givePerk("specialty_marathon"); self maps\mp\perks\_perks::givePerk("specialty_marathon");
self maps\mp\perks\_perks::givePerk("specialty_fastmantle"); // Marathon Pro: faster mantle self maps\mp\perks\_perks::givePerk("specialty_fastmantle");
self setPlayerData("challengeState", "ch_marathon_pro", 2); // unlock Marathon Pro self setPlayerData("challengeState", "ch_marathon_pro", 2);
self.firstSpawn = false; self.firstSpawn = false;
self thread tryCreateMarkerIcons(); self thread tryCreateMarkerIcons();
} }
getCorrectTeam()
{
if(getDvar("g_gametype") != "gungame_team")
return "allies";
allies = 0;
axis = 0;
foreach(player in level.players)
{
if(player.team == "allies")
allies++;
else if(player.team == "axis")
axis++;
}
if(allies >= axis)
return "allies";
return "axis";
}
setStartWeapon(team)
{
if(getDvar("g_gametype") != "gungame_team")
self.current = 1;
else
self.current = level.teamKills[team + "_weapon"];
}
loadSetup() loadSetup()
{ {
self hide(); self hide();
@@ -385,31 +263,11 @@ loadSetup()
self setMoveSpeedScale(0); self setMoveSpeedScale(0);
} }
} }
upgradeOnTeamKills()
{
self endon("disconnect");
while(true)
{
level waittill("upgrade_" + self.team);
wait .3;
enemyTeam = self getEnemyTeam();
self.current = level.teamKills[self.team + "_weapon"];
self thread updateWeapon();
// setText() is safe here: bounded to ~N unique strings where N = weapon count.
// Configstrings are deduplicated, so all players sharing the same weapon# reuse one slot.
self.weaponhud setText("Gun: " + self.current + " / " + (level.gungameList.size) + " / ^3" + level.teamKills[enemyTeam + "_weapon"]);
}
}
getEnemyTeam()
{
if(self.team == "allies")
return "axis";
return "allies";
}
updateWeapon() updateWeapon()
{ {
// Safety: end this thread if the match is over or the player is gone/dead. // Safety: end this thread if the match is over or the player is gone/dead.
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
self endon("death"); self endon("death");
// Exclusivity guard: notifying "updateWeapon" kills any previously running // Exclusivity guard: notifying "updateWeapon" kills any previously running
@@ -423,17 +281,15 @@ updateWeapon()
return; return;
if(self.current > (level.gungameList.size - 1)) if(self.current > (level.gungameList.size - 1))
{ {
self thread tryNuke(); self thread endMatch();
return; return;
} }
//self iPrintlnBold(level.gungameList[self.current]);
weaponName = level.gungameList[self.current]; weaponName = level.gungameList[self.current];
// Guard: skip if the weapon entry is missing, empty, or "none". // Guard: skip if the weapon entry is missing, empty, or "none".
if(!isDefined(weaponName) || weaponName == "none" || weaponName == "") if(!isDefined(weaponName) || weaponName == "none" || weaponName == "")
return; return;
variant = randomInt(9); variant = 0;
if(getDvar("gunmode") == "Fungame") self takeAllWeapons(); // Strip any engine-assigned class weapons (race with spawn)
variant = 0;
if (isSubstr(weaponName, "_akimbo")) if (isSubstr(weaponName, "_akimbo"))
self giveWeapon(weaponName, variant, true); self giveWeapon(weaponName, variant, true);
else else
@@ -477,18 +333,17 @@ updateWeapon()
self setMoveSpeedScale(0); self setMoveSpeedScale(0);
} }
if(isDefined(self.pers["isBot"]) && self.pers["isBot"] && getDvar("gunmode") == "Fungame") if(isDefined(self.pers["isBot"]) && self.pers["isBot"])
{ {
if(level.gungameList[self.current] == "riotshield_mp") if(level.gungameList[self.current] == "riotshield_mp")
{ {
self setClientDvar("bots_play_knife", 1); self setClientDvar("bots_play_knife", 1);
// Bots can't trigger the riot shield melee button, so we simulate it.
self thread watchBotRiotShield(); self thread watchBotRiotShield();
} }
else else
{ {
self setClientDvar("bots_play_knife", 0); self setClientDvar("bots_play_knife", 0);
self notify("botshield"); // shut down any running shield bash thread self notify("botshield");
} }
} }
// NOTE: The old recursive self-call "self updateWeapon()" was removed here. // NOTE: The old recursive self-call "self updateWeapon()" was removed here.
@@ -508,7 +363,7 @@ updateWeapon()
} }
refillOnFire() refillOnFire()
{ {
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
while(true) while(true)
{ {
@@ -520,7 +375,7 @@ refillOnFire()
} }
onKilling() { onKilling() {
self endon("disconnect"); self endon("disconnect");
level endon("nuke"); level endon("game_over");
self.multiplier = 0; self.multiplier = 0;
self.amount = 0; self.amount = 0;
kills = 0; kills = 0;
@@ -570,25 +425,23 @@ onKilling() {
refreshCounter++; refreshCounter++;
self thread scorepopup(100); self thread scorepopup(100);
self.streaking++; self.streaking++;
if(!level.isTeamGame) // cached in loadSettings — avoids getDvar() per kill // Always upgrade weapon on kill (Fungame mode)
if(killsPerWeapon > 1)
{ {
if(killsPerWeapon > 1) if(self.gungameKills % killsPerWeapon == 0)
{
if(self.gungameKills % killsPerWeapon == 0)
{
self.current++;
self thread updateWeapon();
}
killsInGun = (self.gungameKills % killsPerWeapon);
self.weaponhud setText("Gun: " + self.current + " / " + (level.gungameList.size - 1));
self.killhud setValue(killsInGun);
}
else
{ {
self.current++; self.current++;
self thread updateWeapon(); self thread updateWeapon();
self.weaponhud setText("Gun: " + self.current + " / " + (level.gungameList.size - 1));
} }
killsInGun = (self.gungameKills % killsPerWeapon);
self.weaponhud setText("Gun: " + self.current + " / " + (level.gungameList.size - 1));
self.killhud setValue(killsInGun);
}
else
{
self.current++;
self thread updateWeapon();
self.weaponhud setText("Gun: " + self.current + " / " + (level.gungameList.size - 1));
} }
if(self.current >= (level.gungameList.size-5) && !isDefined(self.markerIcon)) if(self.current >= (level.gungameList.size-5) && !isDefined(self.markerIcon))
self thread initCreateMarkerIcon(); self thread initCreateMarkerIcon();
@@ -694,10 +547,7 @@ scorepopup(amount)
self.scoretext.color = color; self.scoretext.color = color;
self.scoretext.glowColor = glowColor; self.scoretext.glowColor = glowColor;
self.scoretext SetPulseFX( 40, 2000, 600 ); self.scoretext SetPulseFX( 40, 2000, 600 );
if(level.isKillConfirmed) // cached in loadSettings — avoids getDvar() per popup self.scoretext setText("Killed!^3");
self.scoretext setText("Upgraded!^3");
else
self.scoretext setText("Killed!^3");
self.scoretext_amount.color = color; self.scoretext_amount.color = color;
self.scoretext_amount.glowColor = glowColor; self.scoretext_amount.glowColor = glowColor;
self.scoretext_amount SetPulseFX( 40, 2000, 600 ); self.scoretext_amount SetPulseFX( 40, 2000, 600 );
@@ -757,40 +607,23 @@ lowerMultitext(multiplier)
} }
wait 4; wait 4;
} }
tryNuke() endMatch()
{ {
// Use level.nukeTriggered as OUR re-entry guard. // Re-entry guard: only one endMatch can run
// DO NOT use level.nukeIncoming here — that flag is owned by the engine's if(isDefined(level.matchEnded) || level.state == "aftermatch")
// _nuke.gsc::tryUseNuke(). Setting it before calling tryUseNuke causes the
// engine to see "nuke already on its way" and abort without firing the nuke.
if(isDefined(level.nukeTriggered) || level.state == "aftermatch")
return; return;
// Set our custom flag and state immediately (atomic — no yield before this). level.matchEnded = true;
level.nukeTriggered = true;
level.state = "aftermatch"; level.state = "aftermatch";
if(getDvarInt("scr_nuke_enabled", 1) == 0)
{
level notify("nuke");
foreach(player in level.players)
player notify("nuke");
thread maps\mp\gametypes\_gamelogic::endGame( self, game["strings"]["score_limit_reached"] ); level notify("game_over");
return;
}
iPrintLnBold("^1NUKE INCOMING!!");
self thread maps\mp\killstreaks\_nuke::tryUseNuke(undefined, false);
level notify("nuke");
foreach(player in level.players) foreach(player in level.players)
{ player notify("game_over");
player hide();
}
if(getDvar("g_gametype") != "gungame_team") self.weaponhud setText("Gun: " + (level.gungameList.size - 1));
self.weaponhud setText("Gun: " + (level.gungameList.size - 1));
// Normal end game screen — _mv.gsc hooks endGame for mapvoting
thread maps\mp\gametypes\_gamelogic::endGame( self, game["strings"]["score_limit_reached"] );
} }
createUI() createUI()
{ {
@@ -912,7 +745,7 @@ enforceSpeed()
{ {
// Calls setMoveSpeedScale every server frame — brute-forces over any engine // Calls setMoveSpeedScale every server frame — brute-forces over any engine
// speed penalty (bullet pain, bg_shock, mantle exit, etc.) with no gaps. // speed penalty (bullet pain, bg_shock, mantle exit, etc.) with no gaps.
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
self endon("death"); self endon("death");
while(true) while(true)
@@ -930,7 +763,7 @@ takeInvalidWeapon()
{ {
self endon("disconnect"); self endon("disconnect");
self endon("death"); self endon("death");
level endon("nuke"); level endon("game_over");
// Skip the first 5 frames so the initial updateWeapon() from loadSetup() has // Skip the first 5 frames so the initial updateWeapon() from loadSetup() has
// time to complete its switchtoweaponimmediate before we start polling. // time to complete its switchtoweaponimmediate before we start polling.
// This prevents a false-positive correction that was causing the 2.5s delay. // This prevents a false-positive correction that was causing the 2.5s delay.
@@ -962,7 +795,7 @@ takeInvalidWeapon()
takeInvalidWeapon2() takeInvalidWeapon2()
{ {
self endon("disconnect"); self endon("disconnect");
level endon("nuke"); level endon("game_over");
counter = 0; counter = 0;
wait 3; wait 3;
while(1) while(1)
@@ -1021,7 +854,7 @@ takeInvalidWeapon2()
} }
ThrowingKnife() ThrowingKnife()
{ {
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
self notify("tk"); self notify("tk");
self endon("tk"); self endon("tk");
@@ -1064,7 +897,7 @@ initCreateMarkerIcon()
self thread createMarkerIcon(player); self thread createMarkerIcon(player);
} }
} }
self waittill_any("disconnect", "nuke"); self waittill_any("disconnect", "game_over");
foreach(icon in self.markerIconsEnemies) foreach(icon in self.markerIconsEnemies)
{ {
if(isDefined(icon)) if(isDefined(icon))
@@ -1138,81 +971,10 @@ createRectangle(align, relative, x, y, width, height, color, shader, sort)
return hud; return hud;
} }
upgradeTeamUI(team)
{
fontElem = newTeamHudElem( team );
fontElem.elemType = "font";
fontElem.font = "default";
fontElem.fontscale = 1.6;
fontElem.baseFontScale = 1.6;
fontElem.glowAlpha = 1;
fontElem.color = (1,1,0);
fontElem.glowColor = (1,0,0);
fontElem.x = 0;
fontElem.y = 0;
fontElem.width = 0;
fontElem.height = int(level.fontHeight * 1.6);
fontElem.xOffset = 0;
fontElem.yOffset = 0;
fontElem.children = [];
fontElem setParent( level.uiParent );
fontElem.hidden = false;
fontElem setText("Weaponupgrade for your team!");
fontElem setPoint("CENTER", "TOP", 0,200);
wait 3;
fontElem fadeOverTime(2);
fontElem.alpha = 0;
wait 2;
fontElem destroy();
}
upgradeEnemyWeaponUI(team)
{
foreach(player in level.players)
{
if(player.team == team)
{
player.weaponhud setText("Weapon: " + player.current + "/" + (level.gungameList.size) + "/^3" + level.teamKills[player getEnemyTeam() + "_weapon"]);
}
}
}
spawnDogTag(victim, attacker)
{
picked = false;
dogtag = spawn("script_model", victim.origin+(0,0,30));
//dogtag setModel("test_sphere_silver");
//playFxOnTag( level.spawnGlow["enemy"], self, "pelvis" );
//playFxOnTag( level.spawnGlow["friendly"], self, "j_head" );
fx = spawnFx(level.dogtag, dogtag.origin);
fx2 = spawnFx(level.dogtag2, dogtag.origin);
triggerFx(fx);
triggerFx(fx2);
while(!isDefined(level.startNuke) && !picked)
{
foreach(player in level.players)
{
if(Distance(player.origin, dogtag.origin) < 75 && isAlive(player))
{
if(player != victim)
player.gungameKills++;
dogtag delete();
fx delete();
fx2 delete();
picked = true;
}
}
wait .1;
}
if(isDefined(fx))
{
fx delete();
fx2 delete();
}
if(!picked)
dogtag delete();
}
FPSBoost() FPSBoost()
{ {
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
self notifyonplayercommand("FPS", "+actionslot 2"); self notifyonplayercommand("FPS", "+actionslot 2");
for(;;) for(;;)
@@ -1223,31 +985,6 @@ FPSBoost()
self setClientDvar("r_fullbright", 0); self setClientDvar("r_fullbright", 0);
} }
} }
test()
{
self notifyOnPlayerCommand("F", "+activate");
self thread test2();
while(true)
{
self waittill("F");
//self thread tryNuke();
// setDvar("g_gametype", "gungame_team");
// map("mp_rust");
self suicide();
}
}
test2()
{
self notifyOnPlayerCommand("G", "+frag");
self thread test2();
while(true)
{
self waittill("G");
setDvar("g_gametype", "gungame");
setDvar("gunmode", "Kill Confirmed");
map("mp_rust");
}
}
watchVersion() watchVersion()
{ {
self endon("disconnect"); self endon("disconnect");
@@ -1265,7 +1002,7 @@ watchVersion()
} }
watchHealthHUD() watchHealthHUD()
{ {
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
self endon("death"); self endon("death");
@@ -1296,7 +1033,7 @@ watchHealthHUD()
watchRegen() watchRegen()
{ {
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
self endon("death"); self endon("death");
@@ -1318,7 +1055,7 @@ watchRegen()
watchDeagleGL() watchDeagleGL()
{ {
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
self endon("death"); // prevent thread accumulation across respawns self endon("death"); // prevent thread accumulation across respawns
while(true) while(true)
@@ -1342,7 +1079,7 @@ watchDeagleGL()
watchHUD() watchHUD()
{ {
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
self endon("death"); // prevent thread accumulation across respawns self endon("death"); // prevent thread accumulation across respawns
while(true) while(true)
@@ -1355,7 +1092,7 @@ watchHUD()
watchM40A3() watchM40A3()
{ {
level endon("nuke"); level endon("game_over");
self endon("disconnect"); self endon("disconnect");
self endon("death"); // prevent thread accumulation across respawns self endon("death"); // prevent thread accumulation across respawns
while(true) while(true)
@@ -1387,7 +1124,7 @@ watchM40A3()
// matching the real shield bash range (~85 units) and cooldown (~0.8s). // matching the real shield bash range (~85 units) and cooldown (~0.8s).
watchBotRiotShield() watchBotRiotShield()
{ {
level endon("nuke"); level endon("game_over");
self endon("death"); self endon("death");
self endon("disconnect"); self endon("disconnect");
// Exclusivity guard: kill any previous instance when weapon changes re-trigger this. // Exclusivity guard: kill any previous instance when weapon changes re-trigger this.

View File

@@ -22,8 +22,7 @@ loadStreaks()
// Pre-cache Jetpack FX at level init (loadfx must NOT be called at runtime). // 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_smoke"] = loadfx("smoke/smoke_trail_white_heli");
level._effect["jetpack_flare"] = loadfx("misc/flares_cobra"); level._effect["jetpack_flare"] = loadfx("misc/flares_cobra");
// Small bullet-impact explosion for the Explosive Bullets streak. // level.explosionfx is loaded by _rank.gsc (helicopter_explosion_secondary_small)
level._effect["bullet_explode"] = loadfx("explosions/grenadeExp_default");
level.streaks3 = []; level.streaks3 = [];
level.streaks6 = []; level.streaks6 = [];
@@ -157,7 +156,7 @@ onKilling()
{ {
self endon("death"); self endon("death");
self endon("disconnect"); self endon("disconnect");
level endon("nuke"); level endon("game_over");
spree = 0; spree = 0;
value = 3; value = 3;
counter = 1; counter = 1;
@@ -277,9 +276,7 @@ Radioactive()
{ {
self endon("disconnect"); self endon("disconnect");
self endon("death"); self endon("death");
level endon("nuke"); level endon("game_over");
// 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["enemy"], self, "pelvis" );
playFxOnTag( level.spawnGlow["friendly"], self, "j_head" ); playFxOnTag( level.spawnGlow["friendly"], self, "j_head" );
while(1) while(1)
@@ -289,8 +286,6 @@ Radioactive()
{ {
if(player == self) if(player == self)
continue; continue;
if(isTeamGame && player.team == self.team)
continue;
if(Distance(player.origin,self.origin) < 120 && isAlive(player)) 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 ); player thread maps\mp\gametypes\_damage::finishPlayerDamageWrapper( self, self, 4, 0, "MOD_EXPLOSIVE", "none", player.origin, player.origin, "none", 0, 0 );
@@ -323,8 +318,8 @@ Explosive()
forward = self getTagOrigin("j_head"); forward = self getTagOrigin("j_head");
end = self thread vector_scal(anglestoforward(self getPlayerAngles()),1000000); end = self thread vector_scal(anglestoforward(self getPlayerAngles()),1000000);
Location = BulletTrace( forward, end, 0, self )[ "position" ]; Location = BulletTrace( forward, end, 0, self )[ "position" ];
playFx(level._effect["bullet_explode"], Location); playFx(level.explosionfx, Location);
RadiusDamage(Location, 50, 30, 20, self ); RadiusDamage(Location, 30, 25, 15, self );
//self RadiusDamage(Location,250,self.explodmg,self.explomindmg,self,"MOD_Explosive","barrel_mp"); //self RadiusDamage(Location,250,self.explodmg,self.explomindmg,self,"MOD_Explosive","barrel_mp");
wait self.explotime; wait self.explotime;
} }
@@ -428,7 +423,7 @@ DeleteIMS2(ims)
// FIX: The original waited on "fuckemp" which was never notified anywhere — // FIX: The original waited on "fuckemp" which was never notified anywhere —
// this created a permanent zombie thread holding the ims entity reference. // 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. // Now we wait for nuke (end of match) and clean up the entity then.
level waittill("nuke"); level waittill("game_over");
if(isDefined(ims)) if(isDefined(ims))
ims delete(); ims delete();
} }
@@ -444,7 +439,7 @@ DeleteIt(block, block2, block3, block4)
} }
DeleteItOnNuke(block, block2, block3, block4) DeleteItOnNuke(block, block2, block3, block4)
{ {
level waittill("nuke"); level waittill("game_over");
if(isDefined(block)) block delete(); if(isDefined(block)) block delete();
if(isDefined(block2)) block2 delete(); if(isDefined(block2)) block2 delete();
if(isDefined(block3)) block3 delete(); if(isDefined(block3)) block3 delete();
@@ -563,8 +558,7 @@ scanPlayer()
{ {
if(player == self) if(player == self)
continue; continue;
if((getDvar("g_gametype") == "gungame_team") && self.team == player.team)
continue;
if(Distance(player.origin,self.origin) <= 1000) if(Distance(player.origin,self.origin) <= 1000)
{ {
go = true; go = true;
@@ -658,7 +652,7 @@ infoText(item)
} }
Juggernaut() Juggernaut()
{ {
level endon("nuke"); level endon("game_over");
self.isJugger = true; self.isJugger = true;
// FIX: Use the custom health system (actual_maxhealth/actual_health) instead of // FIX: Use the custom health system (actual_maxhealth/actual_health) instead of
// the raw engine maxhealth. Setting engine maxhealth directly broke the HUD display // the raw engine maxhealth. Setting engine maxhealth directly broke the HUD display
@@ -685,12 +679,12 @@ destroyJuggOnNuke(juggIcon)
{ {
self endon("death"); self endon("death");
self endon("disconnect"); self endon("disconnect");
level waittill("nuke"); level waittill("game_over");
juggIcon destroy(); juggIcon destroy();
} }
NoReload() NoReload()
{ {
level endon("nuke"); // FIX: was missing — thread survived past match end level endon("game_over"); // FIX: was missing — thread survived past match end
self endon("death"); self endon("death");
self endon("disconnect"); self endon("disconnect");
while(true) while(true)

View File

@@ -1,667 +0,0 @@
#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.elemType = "icon";
hud.width = width;
hud.height = height;
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.elemType = "icon";
hud.width = width;
hud.height = height;
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;
timer.label = &"Time left: ";
timer2.alpha = 0; // subsecond display removed
for(secs = 20; secs > 0; secs--)
{
timer setValue(secs);
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", 0,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] + "]");
// FIX: Rebuild vote text only if it actually changed, and cap total rebuilds.
// Each unique setText() string permanently burns a configstring slot (512 limit).
text = "";
for(i = 0;i < level.maxOptions;i++)
{
text += getDisplayName(level.options[i].map) + " [^3" + level.options[i].gamemode + "^7][" + level.votes[i] + "]\n";
}
if(!isDefined(level._lastVoteText) || level._lastVoteText != text)
{
level.elems setText(text);
level._lastVoteText = 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();
if(isDefined(player.crosshair))
player.crosshair destroy();
}
}

View File

@@ -5,127 +5,7 @@
loadWeapons() loadWeapons()
{ {
level.gungameList = []; loadFungameList();
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";
level.weaponsLoaded = true;
} }
removeIDfromArray(id, weaponList) removeIDfromArray(id, weaponList)
{ {