commit 3432eeacd683630ff13c6ede004a99c09911bfc1 Author: Kibi Kelburton Date: Tue May 5 17:34:27 2026 +0200 init fungun diff --git a/gunfun/.gitignore b/gunfun/.gitignore new file mode 100644 index 0000000..09c8d20 --- /dev/null +++ b/gunfun/.gitignore @@ -0,0 +1,4 @@ +*.log* +maps/ +scriptdata/ +demos/ \ No newline at end of file diff --git a/gunfun/mod/api.gsc b/gunfun/mod/api.gsc new file mode 100755 index 0000000..ec17d71 --- /dev/null +++ b/gunfun/mod/api.gsc @@ -0,0 +1,75 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; + +// For sending data, you use - as split character and for response I use | as split character +// all-10 => top 10 guids split by | + +Init() +{ + if(true) // unfinished script + return; + //level.api = "http://178.63.44.165:80831/"; + level.api = ""; + level.chatCommands = []; + level.chatCommands[level.chatCommands.size] = "register"; + level.chatCommands[level.chatCommands.size] = "increment"; + level.chatCommands[level.chatCommands.size] = "all"; + level.chatCommands[level.chatCommands.size] = "read"; + thread onSay(); + thread onPlayerConnect(); +} +onPlayerConnect() +{ + while(true) + { + level waittill("connected", player); + player thread tryCallApi("register"); + } +} +onSay() +{ + while(true) + { + level waittill("say", string, player); + iprintlnBold(string + " " + player.name); + player thread checkString(string); + } +} +checkString(string) +{ + if(string[0] != "!" && string[0] != "-") + return; + string = GetSubStr(string,1); //GetSubStr( , , ) + iPrintln(string); + cmd = strTok(string, " "); + foreach(chat in level.chatCommands) + { + if(chat == cmd[0]) + self callApi(chat); + } +} +callApi(string) +{ + list = httpGet(level.api + ""); + list waittill("done", success, data); + if(!success) + return "error"; + iPrintln("^2green"); + return data; +} +tryCallApi(parameter) +{ + data = self callApi("!" + parameter + "-" + self.guid); + if(!isDefined(data)) + self iPrintlnBold(parameter + " was successful"); + else if(data == "error") + self iPrintlnBold("^1error calling the api"); + else + { + wait 2; + ar = strTok(data, "|"); + foreach(a in ar) + self iPrintlnBold(a); + } +} diff --git a/gunfun/mod/main.gsc b/gunfun/mod/main.gsc new file mode 100755 index 0000000..c20b361 --- /dev/null +++ b/gunfun/mod/main.gsc @@ -0,0 +1,991 @@ +#include common_scripts\utility; +#include maps\mp\_utility; +#include maps\mp\gametypes\_hud_util; + +///////////////////// +// +// Gamemodes: +// +// - basic +// - team gungame +// - no streaks +// - snipers only +// - kill confirmed +// - pistol & shotgun only (disabled) + +Init() +{ + loadSettings(); + thread mod\weapons::loadWeapons(); + thread mod\streaks::loadStreaks(); + thread mod\vote::loadVote(); // does not work + thread onPlayerConnect(); + thread deleteSentries(); + thread launchGame(); +} +setGamemodes() +{ + level.gungamemodes = []; + level.gungamemodes[level.gungamemodes.size] = "Fungame"; // God of Hellfire addition + level.gungamemodes[level.gungamemodes.size] = "Classic"; + // level.gungamemodes[level.gungamemodes.size] = "Classic"; // raising the chance + // level.gungamemodes[level.gungamemodes.size] = "Classic"; + // level.gungamemodes[level.gungamemodes.size] = "No Streaks"; + // level.gungamemodes[level.gungamemodes.size] = "Snipers only"; + //level.gungamemodes[level.gungamemodes.size] = "Pistol & Shotguns only"; // works but is it fun? + // level.gungamemodes[level.gungamemodes.size] = "Team Gungame"; + // level.gungamemodes[level.gungamemodes.size] = "Kill Confirmed"; +} +initializeGametype(type) // called in vote.gsc after first map +{ + setDvar("gunmode", type); + 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", 0.5); + setDvar("amount_weapons", 150); + 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() +{ + /////////////////////// CUSTOM SETTINGS ///////////////////////////// + //SetDvarIfUninitialized("gunmode", "Classic"); + 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); + SetDvarIfUninitialized("show_damage_ui", 1); + setDvar("gunversion", "1.4 Remaster by ^1Santahunter - Modified by God of Hellfire"); + ///////////////////////////////////////////////////////////////////// + setDvar("scr_" + (getDvar("g_gametype")) + "_timelimit", 0); + setDvar("scr_" + (getDvar("g_gametype")) + "_scorelimit", 0); + setDvar("ui_allow_teamchange", 0); + setDvar("testClients_watchKillcam", 0); + setDvar("scr_game_hardpoints", 0); + setDvar("scr_game_graceperiod", 0); + setDvar("scr_game_matchstarttime", 0); + setDvar("scr_game_playerwaittime", 0); + setDvar("g_hardcore", 0); + + level.state = "prematch"; + 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); + setGamemodes(); + + // Bot Management + setDvar("bots_main", 1); + setDvar("bots_manage_fill", 8); + setDvar("bots_skill", 3); +} +deleteSentries() +{ + turret = GetEntArray("misc_turret","classname"); + for(i=0;i 0;i--) + { + value changeFontScaleOverTime(1); + value.fontScale = 0.5; + value setValue(i); + wait 1; + value.fontScale = 1.75; + foreach(player in level.players) + { + player playLocalSound("ui_mp_suitcasebomb_timer"); + } + } + level.state = "ingame"; + value setValue(0); + foreach(player in level.players) + { + player enableWeapons(); + player visionSetNakedForPlayer(getDvar("mapname"), 2); + player setMoveSpeedScale(1.25); + } + + setDvar("jump_height", 60); + hud destroy(); + value destroy(); + //player freezeControls(false); +} +onPlayerConnect() +{ + while(true) + { + level waittill("connected", player); + player thread onPlayerSpawned(); + } +} +onPlayerSpawned() +{ + self endon("disconnect"); + self thread firstSpawn(); + while(true) + { + self waittill("spawned_player"); + self thread loadSetup(); + // self thread test(); + } +} +firstSpawn() +{ + self endon("disconnect"); + team = getCorrectTeam(); + self thread setStartWeapon(team); + self.firstSpawn = true; + self.knifeKills = 0; + self.gungameKills = 0; + self.streaks = []; + self setClientDvar("cg_drawSplatter", 1); + self.hud_damagefeedback.color = (1,0,0); + self.line = self createRectangle("CENTER", "LEFT", 0,-90,300,5,(1,1,0),"line_horizontal",1); + self thread onKilling(); + self thread createUI(); + self thread refillOnFire(); + self thread watchVersion(); + self thread FPSBoost(); + if(getDvar("g_gametype") == "gungame_team") + self thread upgradeOnTeamKills(); + for(i=1;i<3;i++) + self setClientDvar("lowAmmoWarningNoAmmoColor" + i, 0, 0, 0, 0); + wait .2; + self notify("menuresponse", game["menu_team"], team); + wait .1; + self notify("menuresponse", "changeclass", "class1"); + wait .1; + self.firstSpawn = false; + 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() +{ + self hide(); + self thread mod\streaks::setStreaks(); + self takeAllWeapons(); + self _clearPerks(); + self thread updateWeapon(); + self.maxhp = getDvarInt("global_health"); + self.maxhealth = self.maxhp; + self.health = self.maxhealth; + self.streaking = 0; + self.speed = false; + self.isJugger = false; + self.moveSpeedScaler = getDvarFloat("speed"); + self setMoveSpeedScale(getDvarFloat("speed")); + self maps\mp\perks\_perks::givePerk("specialty_fastreload"); // due to icys request :) + self maps\mp\perks\_perks::givePerk("specialty_falldamage"); // due to icys request :) + self maps\mp\perks\_perks::givePerk("specialty_quickdraw"); + + self thread takeInvalidWeapon(); + if(level.state == "prematch") + { + //self freezeControls(true); + self setMoveSpeedScale(0); + self disableWeapons(); + self visionSetNakedForPlayer("blacktest", 0); + waitFrame(); + if(level.state == "prematch") + 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(); + self.weaponhud setText("Weapon: " + self.current + "/" + (level.gungameList.size) + "/^3" + level.teamKills[enemyTeam + "_weapon"]); + } +} +getEnemyTeam() +{ + if(self.team == "allies") + return "axis"; + return "allies"; +} +updateWeapon() +{ + if(self.current > (level.gungameList.size - 1)) + { + self thread tryNuke(); + return; + } + //self iPrintlnBold(level.gungameList[self.current]); + variant = randomInt(9); + if(getDvar("gunmode") == "Fungame") + variant = 0; + if (isSubstr(level.gungameList[self.current], "_akimbo")) + self giveWeapon(level.gungameList[self.current], variant, true); + else + self giveWeapon(level.gungameList[self.current], variant, false); + self giveWeapon("onemanarmy_mp"); + self takeWeapon(self getCurrentWeapon()); + self giveMaxAmmo(level.gungameList[self.current]); + waitFrame(); + self switchtoweaponimmediate(level.gungameList[self.current]); + waitFrame(); + if(level.state == "prematch" || level.state == "ingame") + self show(); + if(self.isJugger) + self setMoveSpeedScale(.7); + else if(self.speed) + self setMoveSpeedScale(1.6); + if(level.state == "prematch") + { + self setMoveSpeedScale(0); + if(level.state == "prematch") + self setMoveSpeedScale(0); + } + if(self getCurrentWeapon() == "none" && !self isMantling() && !self isOnLadder()) // in rare case weapon does not exist + { + self updateWeapon(); + } +} +refillOnFire() +{ + self endon("disconnect"); + while(true) + { + self waittill("weapon_fired"); + weapon = self getCurrentWeapon(); + if(weapon == "at4_mp" || weapon == "rpg_mp" || weapon == "m79_mp") + { + self giveMaxAmmo(weapon); + } + } +} +onKilling() { + self endon("disconnect"); + level endon("nuke"); + self.multiplier = 0; + self.amount = 0; + //kills = self.pers["kills"]; + kills = 0; + refreshCounter = 0; + self.scoretext = self createText("hudbig", 1, "CENTER", "CENTER", 0, 0, .7,""); + self.scoretext_amount = self createText("hudbig", 1, "CENTER", "CENTER", -10, 20, .7,""); + self.multitext = []; + for(i=2;i<6;i++) + self.multitext[i] = self createText("hudbig", .6, "CENTER", "CENTER", 50, (i * 20), .7,""); + while(true) + { + wait .3; + if(kills > self.gungameKills) // not called on team gungame + { + self thread scorepopup(-100); + kills--; + refreshCounter++; + if(getDvar("gunmode") == "Fungame") + { + killsInGun = (self.gungameKills % 2); + self.weaponhud setText("Weapon: " + self.current + "/" + (level.gungameList.size-1) + " (" + killsInGun + "/2)"); + } + else + self.weaponhud setText("Weapon: " + self.current + "/" + (level.gungameList.size-1)); + self refreshCounter(refreshCounter); + self updateRatio(); + } + else if(kills < self.gungameKills) + { + kills++; + refreshCounter++; + self thread scorepopup(100); + self.streaking++; + if(getDvar("g_gametype") != "gungame_team") + { + if(getDvar("gunmode") == "Fungame") + { + if(self.gungameKills % 2 == 0) + { + self.current++; + self thread updateWeapon(); + } + killsInGun = (self.gungameKills % 2); + self.weaponhud setText("Weapon: " + self.current + "/" + (level.gungameList.size-1) + " (" + killsInGun + "/2)"); + } + else + { + self.current++; + self thread updateWeapon(); + self.weaponhud setText("Weapon: " + self.current + "/" + (level.gungameList.size-1)); + } + } + if(self.current >= (level.gungameList.size-5) && !isDefined(self.markerIcon)) + self thread initCreateMarkerIcon(); + self refreshCounter(refreshCounter); + self updateRatio(); + } + } +} +updateRatio() +{ + if(self.deaths != 0) + ratio = (self.kills/self.deaths); + else + ratio = self.kills; + self.ratiohud setValue(floatToString(ratio)); +} +refreshCounter(refreshCounter) +{ + if(refreshCounter == 10) + { + refreshCounter = 0; + self.weaponhud destroy(); + self createWeaponHud(); + } +} +warning(friendly) +{ + self notify("warning"); + if(friendly == 0) + warning = self createText("hudbig", .8, "CENTER", "CENTER", 0, 130, 1,"Enemy's powershield absorbed damage!"); + else if(friendly == 1) + warning = self createText("hudbig", .8, "CENTER", "CENTER", 0, 130, 1,"Powershield absorbed damage!"); + else if(friendly == 2) + warning = self createText("hudbig", .8, "CENTER", "CENTER", 0, 130, 1,"Enemy demoted you!"); + else + warning = self createText("hudbig", .8, "CENTER", "CENTER", 0, 130, 1,"You demoted yourself!"); + self thread clearWarning(warning); + warning.glowColor = (1,0,0); + warning fadeovertime(5); + warning.alpha = 0; + wait 5; + if(isDefined(warning)) + warning destroy(); + self notify("warning_end"); +} +clearWarning(hud) +{ + self endon("warning_end"); + self waittill("warning"); + if(isDefined(hud)) + hud destroy(); +} +createText(font,fontScale,align,relative,x,y,alpha,input,color,gcolor,galpha) +{ + text = self createFontString(font,fontScale,self); + text setPoint(align,relative,x,y); + text.sort = 999; + text.alpha = alpha; + if(isDefined(color)) + text.color = color; + if(isDefined(gcolor)) + text.glowcolor = gcolor; + if(isDefined(galpha)) + text.glowalpha = galpha; + else + text.glowalpha = 1; + text setText(input); + text.HideWhenInMenu = true; + return text; +} +scorepopup(amount) +{ + self endon("disconnect"); + self notify("scoring"); + self endon("scoring"); + self.multiplier++; + self.amount = self.amount + amount; + color = (0,0,0); + glowColor = (0,0,0); + switch(self.multiplier) + { + case 1: + color = (1,1,1); + glowColor = (0,1,0); + break; + case 2: + color = (1,1,0); + glowColor = (1,0,0); + break; + case 3: + color = (0,0,0); + glowColor = (1,0,0); + break; + default: + color = (0,0,0); + glowColor = (0,0,1); + break; + } + self.scoretext.alpha = 1; + self.scoretext_amount.alpha = 1; + self.scoretext.color = color; + self.scoretext.glowColor = glowColor; + self.scoretext SetPulseFX( 40, 2000, 600 ); + if(getDvar("gunmode") == "Kill Confirmed") + self.scoretext setText("Upgraded!^3"); + else + self.scoretext setText("Killed!^3"); + self.scoretext_amount.color = color; + self.scoretext_amount.glowColor = glowColor; + self.scoretext_amount SetPulseFX( 40, 2000, 600 ); + self.scoretext_amount setText("+" + self.amount); + if(self.multiplier > 1) + { + self.multitext[self.multiplier].alpha = 1; + self.multitext[self.multiplier] fadeOverTime(0.1); + self.multitext[self.multiplier].color = color; + self.multitext[self.multiplier].glowColor = glowColor; + } + if(self.multiplier == 2) + { + self thread lowerMultitext(self.multiplier); + self.multitext[self.multiplier] setText("Double Kill!"); + } + else if(self.multiplier == 3) + self.multitext[self.multiplier] setText("Triple Kill!"); + else if(self.multiplier == 4) + self.multitext[self.multiplier] setText("Multi Kill!"); + else if(self.multiplier > 4) + { + color = []; + for(i = 0;i < 13;i++) + color[i] = randomInt(9); + difference = self.multiplier - 4; + self.multitext[5] setText("^3x" + difference + " ^" + color[0] + "K^" + color[1] + "i^" + color[2] + "l^" + color[3] + "l^" + color[4] + "i^" + color[5] + "n^" + color[6] + "g ^" + color[7] + "S^" + color[8] + "p^" + color[9] + "r^" + color[10] + "e^" + color[11] + "e^" + color[12] + "!"); + } + self thread lowerMultiplier(); +} +lowerMultiplier() +{ + self endon("disconnect"); + self notify("lowering"); + self endon("lowering"); + wait 5; + self notify("start_lowering"); + self.multiplier = 0; + self.amount = 0; +} +lowerMultitext(multiplier) +{ + self waittill_any("start_lowering", "disconnect"); + for(i=2;i<6;i++) + { + self.multitext[i] fadeOverTime(3); + self.multitext[i].alpha = 0; + wait .75; + } + wait 4; +} +tryNuke() +{ + if(isDefined(level.startNuke)) + return; + level.state = "aftermatch"; + level notify("nuke"); + if(getDvar("g_gametype") != "gungame_team") + self.weaponhud setText("Weapon: " + (level.gungameList.size-1) + "/" + (level.gungameList.size-1)); + + //self thread mod\api::tryCallApi("increment"); + foreach(player in level.players) + player hide(); + self thread maps\mp\killstreaks\_nuke::tryUseNuke(); +} +createUI() +{ + self thread createWeaponHud(); + self thread Weaponnumber(); + self thread createRatioHud(); +} +createWeaponHud() +{ + self.weaponhud = self createFontString("hudsmall", 1); + self.weaponhud setPoint("LEFT", "CENTER", -410, -105); + self.weaponhud.glowalpha = .5; + self.weaponhud.color = (1,1,0); + self.weaponhud.hideWhenInMenu = true; + self.weaponhud.glowcolor = (1,0,0); +} +createRatioHud() +{ + self.ratiohud = self createFontString("hudsmall", 1); + self.ratiohud setPoint("LEFT", "CENTER", -410, -125); + self.ratiohud.color = (1,1,0); + self.ratiohud.glowalpha = .3; + self.ratiohud.glowcolor = (1,0,0); + self.ratiohud.label = &"Ratio: "; + self.ratiohud.alpha = 0; + self waittill_any("death", "killed_lethal"); + self.ratiohud fadeOverTime(2); + self.ratiohud.alpha = 1; +} +Weaponnumber() // deprecated +{ + self notify("weaponnumber"); + self endon("weaponnumber"); + self endon("disconnect"); + kills = 0; + oldkills = 0; + wait 1; + while(1) + { + kills++; + self.weaponhud setText("Weapon: " + self.current + "/" + (level.gungameList.size - 1)); + //self waittill("killed_enemy"); + self waittill("update_weaponNumber"); + //progress updateBar(self.current/level.weapon.size); + if(kills >= 10) + { + self.weaponhud destroy(); + self createWeaponHud(); + self thread Weaponnumber(); + } + if(oldkills != self.kills) + { + oldkills = self.kills; + if(self.deaths != 0) + ratio = (self.kills/self.deaths); + else + ratio = self.kills; + self.ratiohud setValue(floatToString(ratio)); + } + } +} +floatToString(float) +{ + string = "" + float; + if(string.size > 5) + string = getSubStr(string, 0, 5); + return StringToFloat(string); +} +takeInvalidWeapon() +{ + self endon("disconnect"); + self endon("death"); + level endon("nuke"); + counter = 0; + wait 3; + while(1) + { + waitFrame(); + if(!isAlive(self)) + continue; + if(self isMantling()) + continue; + weapon = self getCurrentWeapon(); + if(!self hasWeapon(level.gungameList[self.current])) + { + counter++; + if(counter == 2) + { + counter = 0; + level.gungameList[self.current] = mod\weapons::setWeapon("peacekeeper_mp"); + } + } + if(weapon != level.gungameList[self.current]) + { + self takeAllWeapons(); + self thread updateWeapon(); + wait 2.5; + } + } +} +takeInvalidWeapon2() +{ + self endon("disconnect"); + level endon("nuke"); + counter = 0; + wait 3; + while(1) + { + wait .25; + if(!isAlive(self)) + continue; + weapon = self getCurrentWeapon(); + if((weapon != level.gungameList[self.current] && weapon != "killstreak_uav_mp") || weapon == "none") + { + weaponArray = strTok(weapon, "_"); + //if(weapon == ("gl_" + weaponArray[1] + "_mp")) + // continue; + //if(weapon == "none" && self isMantling()) + // continue; + //self iPrintln("false"); + //iPrintlnBold(weapon); + self takeAllWeapons(); + //if(!self hasWeapon(level.gungameList[self.current]) || weapon == "none") + //{ + counter++; + if(counter == 40) // debug + { + self.gungameKills++; + counter = 0; + self.current++; + self thread updateWeapon(); + wait 1; + } + else + self updateWeapon(); + wait .2; + //} + //if(level.gungameList[self.current] == "throwingknife_mp") + // self thread ThrowingKnife(); + if(!self.speed) + { + speed = level.speed; + self setMoveSpeedScale(speed); + if(self.hardmode == 1) + { + speed = level.speed * 0.8; + self setMoveSpeedScale(speed); + } + self.moveSpeedScaler = speed; + } + } + else if(weapon == "usp_tactical_mp") + { + speed = level.speed * 1.2; + self setMoveSpeedScale(speed); + self setWeaponAmmoClip("usp_tactical_mp", 0); + self setWeaponAmmoStock("usp_tactical_mp", 0); + } + } +} +ThrowingKnife() +{ + self endon("disconnect"); + self notify("tk"); + self endon("tk"); + for(;;) + { + self waittill( "grenade_fire", lightstick, weapName ); + if(weapName == "throwingknife_mp") + { + self giveWeapon("throwingknife_mp"); + self giveMaxAmmo("throwingknife_mp"); + } + } +} +giveGun(weapon, variant) +{ + if (!isDefined(variant)) + variant = randomInt(9); + if (isSubstr(weapon, "_akimbo")) + self giveWeapon(weapon, variant, true); + else + self giveWeapon(weapon, variant, false); +} +initCreateMarkerIcon() +{ + rank = 1; + foreach(player in level.players) + { + if(isDefined(player.markerIcon)) + rank++; + } + self.markerIcon = rank; + self.markerIconsEnemies = []; + self thread createWarnHUD(); + if(self.isJugger) + self notify("isMarked"); + foreach(player in level.players) + { + if(player != self) + { + self thread createMarkerIcon(player); + } + } + self waittill("disconnect"); + foreach(icon in self.markerIconsEnemies) + { + if(isDefined(icon)) + icon destroy(); + } +} +createMarkerIcon(player) +{ + self.markerIconsEnemies[self.markerIconsEnemies.size] = NewClientHudElem(player); + self.markerIconsEnemies[self.markerIconsEnemies.size-1] SetShader(level.markerIcon, 10, 10 ); + self.markerIconsEnemies[self.markerIconsEnemies.size-1].width = 10; + self.markerIconsEnemies[self.markerIconsEnemies.size-1].height = 10; + self.markerIconsEnemies[self.markerIconsEnemies.size-1].color = getColor(self.markerIcon); + self.markerIconsEnemies[self.markerIconsEnemies.size-1].x = self.origin[ 0 ]; + self.markerIconsEnemies[self.markerIconsEnemies.size-1].y = self.origin[ 1 ]; + self.markerIconsEnemies[self.markerIconsEnemies.size-1].z = self.origin[ 2 ] + 55; + self.markerIconsEnemies[self.markerIconsEnemies.size-1] SetWayPoint( true, true ); + self.markerIconsEnemies[self.markerIconsEnemies.size-1] SetTargetEnt(self); +} +getColor(rank) +{ + if(rank == 1) + return (1, 215/255, 0); // gold + if(rank == 2) + return (155/255,0,0); // darkred + if(rank == 3) + return (0,0,155/255); // darkblue + return (191/255, 137/255, 112/255); // bronze +} +createWarnHUD() +{ + /* + warnHUD = self createFontString("hudsmall", 1.2); + warnHUD setPoint("CENTER", "CENTER", 0, -10); + warnHUD.glowalpha = .5; + warnHUD.color = (155/255,0,0); + warnHUD.hideWhenInMenu = true; + warnHUD.glowcolor = (0,0,0); + warnHUD setText("Final Game: You are marked for all enemies now!"); + wait 3; + warnHUD destroy(); + */ + self thread maps\mp\gametypes\_hud_message::hintMessage("Final Game: You are marked for all enemies now!"); +} +tryCreateMarkerIcons() +{ + foreach(player in level.players) + { + if(isDefined(player.markerIcon)) + { + player thread createMarkerIcon(self); + } + } +} +createRectangle(align, relative, x, y, width, height, color, shader, sort) +{ + hud = newClientHudElem(self); + hud.sTexType = "bar"; + hud.width = width; + hud.height = height; + hud.align = align; + hud.relative = relative; + hud.xOffset = 0; + hud.yOffset = 0; + hud.children = []; + hud.sort = sort; + hud.color = color; + hud setParent(level.uiParent); + hud setShader(shader,width,height); + hud.hidden = false; + hud.HideWhenInMenu = true; + hud setPoint(align,relative,x,y); + 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() +{ + self endon("disconnect"); + self notifyonplayercommand("FPS", "+actionslot 2"); + for(;;) + { + self waittill("FPS"); + self setClientDvar("r_fullbright", 1); + self waittill("FPS"); + 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() +{ + self endon("disconnect"); + self notifyOnPlayerCommand("open", "+scores"); + self notifyOnPlayerCommand("close", "-scores"); + while(true) + { + self waittill("open"); + self.versionText = createFontString("hudbig", .65, self); + self.versionText setPoint("CENTER", "BOTTOM", 0,-40); + self.versionText setText(getDvar("gunversion")); + self waittill("close"); + self.versionText destroy(); + } +} \ No newline at end of file diff --git a/gunfun/mod/streaks.gsc b/gunfun/mod/streaks.gsc new file mode 100755 index 0000000..46c3673 --- /dev/null +++ b/gunfun/mod/streaks.gsc @@ -0,0 +1,714 @@ +#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"); + + 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_level_up"; + 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 maps\mp\perks\_perks::givePerk("specialty_lightweight"); + self setMoveSpeedScale(1.6); + self.setMoveSpeedScale = 1.6; + //self thread spawnFireLoop(); + 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(); + case "Radioactive": + self thread Radioactive(); + break; + default: + self iPrintlnBold("^1ERROR: Unknown Streak!"); + break; + } +} +Radioactive() +{ + self endon("disconnect"); + self endon("death"); + level endon("nuke"); + playFxOnTag( level.spawnGlow["enemy"], self, "pelvis" ); + playFxOnTag( level.spawnGlow["friendly"], self, "j_head" ); + //self SetPlayerIgnoreRadiusDamage( true ); + while(1) + { + wait .1; + //self RadiusDamage(self.origin,120,50,40,self,"MOD_Explosive","nuke_mp"); + //RadiusDamage(self.origin, 50, 30, 20, self ); + foreach(player in level.players) + { + if(player == self) + continue; + if(getDvar("g_gametype") == "gungame_team") + { + if(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"); + self.fx = []; + self.fx[0] = loadfx ("smoke/smoke_trail_white_heli"); + self.fx[1] = loadfx( "misc/flares_cobra" ); + 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("veh_ac130_sonic_boom"); + //self playsound("veh_mig29_sonic_boom"); + self playsound("cobra_helicopter_dying_loop"); + self setstance("crouch"); + playfx(self.fx[0],self gettagorigin("j_spine4")); + playfx(self.fx[1],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) +{ + level waittill("fuckemp"); + 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() +{ + // cheat invert vision, marks near enemies + self endon("death"); + self endon("disconnect"); + self notifyOnPlayerCommand("3","+actionslot 3"); + hud = self createText("Press [{+actionslot 3}] to use recon vision", 1.5, "CENTER", "BOTTOM", 0,-80,"default"); + hud.glowcolor = (0,.7,0); + self thread destroyGhostHud(hud); + while(true) + { + self waittill("3"); + self visionSetNakedForplayer("cheat_invert", 2); + hud.label = &"Countdown: "; + self.recon = true; + self thread scanPlayer(); + for(i = 10;i > 0;i--) + { + hud setValue(i); + wait 1; + } + self visionSetNakedForplayer(getDvar("mapname"), 2); + self.recon = false; + hud fadeOverTime(1); + hud.alpha = 0; + wait 20; + hud.label = &""; + hud setText("Press [{+actionslot 3}] to use recon vision"); + hud fadeOverTime(1); + hud.alpha = 1; + } +} + +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; + self.maxhealth = 400; + self.health = self.maxhealth; + self setMoveSpeedScale(.7); + + 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() +{ + 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"); + } +} \ No newline at end of file diff --git a/gunfun/mod/vote.gsc b/gunfun/mod/vote.gsc new file mode 100755 index 0000000..2e9f62a --- /dev/null +++ b/gunfun/mod/vote.gsc @@ -0,0 +1,635 @@ +#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 = []; + + 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"; + level.maps[level.maps.size] = "mp_rundown"; + level.maps[level.maps.size] = "mp_brecourt"; + level.maps[level.maps.size] = "mp_boneyard"; + level.maps[level.maps.size] = "mp_quarry"; + level.maps[level.maps.size] = "mp_nightshift"; + level.maps[level.maps.size] = "mp_estate"; + level.maps[level.maps.size] = "mp_invasion"; + level.maps[level.maps.size] = "mp_checkpoint"; + 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"; + + + level.maps[level.maps.size] = "mp_complex"; + level.maps[level.maps.size] = "mp_crash"; + level.maps[level.maps.size] = "mp_overgrown"; + level.maps[level.maps.size] = "mp_compact"; + level.maps[level.maps.size] = "mp_storm"; + + level.maps[level.maps.size] = "mp_abandon"; + level.maps[level.maps.size] = "mp_fuel2"; + level.maps[level.maps.size] = "mp_strike"; + level.maps[level.maps.size] = "mp_trailerpark"; + level.maps[level.maps.size] = "mp_vacant"; + + level.maps[level.maps.size] = "mp_nuked"; + + 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 = []; + for(i = 0;i < level.maxOptions;i++) + { + 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_maprotation", ("map " + level.options[number].map)); + setDvar("g_hardcore", 0); + wait 0.5; + exitLevel(false); + level.currentNextMap = level.options[number].map; + level notify("endVote"); +} +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++) + 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.ratiohud)) + player.ratiohud destroy(); + if(isDefined(player.streakText)) + player.streakText destroy(); + foreach(icon in player.streakIcons) + { + if(isDefined(icon)) + icon destroy(); + } + player.line destroy(); + } +} + + + + + + + + + + + + + + + + diff --git a/gunfun/mod/weapons.gsc b/gunfun/mod/weapons.gsc new file mode 100755 index 0000000..0ad5673 --- /dev/null +++ b/gunfun/mod/weapons.gsc @@ -0,0 +1,579 @@ +#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] = "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 = 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) +{ + 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.gungameList = []; + level.gungameList[0] = "defaultweapon_mp"; + + // PISTOLS (1-20) + 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"); + + 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"); +} + +addFungameWeapon(weapon) +{ + level.gungameList[level.gungameList.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; +} \ No newline at end of file diff --git a/gunfun/scripts/load.gsc b/gunfun/scripts/load.gsc new file mode 100755 index 0000000..333ae9f --- /dev/null +++ b/gunfun/scripts/load.gsc @@ -0,0 +1,5 @@ + +Init() +{ + thread mod\main::Init(); +} \ No newline at end of file diff --git a/gunfun/z_svr_bots.iwd b/gunfun/z_svr_bots.iwd new file mode 100755 index 0000000..b792b12 Binary files /dev/null and b/gunfun/z_svr_bots.iwd differ