Code:
// QCZM IW5 - TheApadayo & DidUknowiPwn 2012
// main mod module
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using InfinityScript;
namespace DUKIP
{
public class ZombieMod : BaseScript
{
private Random _rng = new Random();
private bool _isIntermission;
private bool _isGrace;
private HudElem info;
private HudElem countdown;
//private static int hudUpdateRate = 500;
public ZombieMod()
: base()
{
changeGametype("QCZM");
_isGrace = true;
Call("setdvar", "motd", "Welcome to ^0QCZM ^7by ^1TheApadayo^7 and ^5DidUknowiPwn^7! Scroll through the shop with " +
"^3[{+smoke}] ^7and ^3[{+actionslot 1}]^7. Report all glitches on the 4D1 forums to either ^1TheApadayo^7 or ^5DidUknowiPwn^7.");
createServerHud();
Utilities.SetDropItemEnabled(false);
_rng = new Random();
string env = getMapEnv(Call<string>("getdvar", "mapname"));
Call("setdvar", "env1", env);
Call("precachemodel", "mp_body_ally_ghillie_" + env + "_sniper");
// viewmodel is different from playermodel on outpost
if (Call<string>("getdvar", "mapname").Equals("mp_radar"))
env = "arctic";
Call("setdvar", "env2", env);
Call("precachemodel", "viewhands_iw5_ghillie_" + env);
// zombies won or all zombies left
OnInterval(5000, () =>
{
if (_isGrace || _isIntermission)
return true;
if (getTeamCount("allies") == 0 || getTeamCount("axis") == 0)
{
AfterDelay(3000, () =>
{
// check again because someone might have been respawning
if (getTeamCount("allies") == 0 || getTeamCount("axis") == 0)
{
CallOnPlayers(entity => doIntermission(entity));
doCredits();
AfterDelay(3000, () =>
{
doGrace(60);
});
}
});
}
return true;
});
PlayerConnected += new Action<Entity>(entity =>
{
// dvar shit
entity.SetField("connected", 1); // for getplayers func
Call("setdvar", "g_TeamName_Allies", "Humans");
Call("setdvar", "g_TeamIcon_Allies", "cardicon_comic_price"); //need to change
Call("setdvar", "g_TeamName_Axis", "Zombies");
Call("setdvar", "g_teamIcon_Axis", "cardicon_skull_black");
Call("precacheshader", "cardicon_skull_black");
Call("precacheshader", "cardicon_league_magnum");
Call("setdvar", "g_ScoresColor_Spectator", ".25 .25 .25");
Call("setdvar", "g_ScoresColor_Free", ".76 .78 .10");
Call("setdvar", "g_teamColor_MyTeam", ".6 .8 .6");
Call("setdvar", "g_teamColor_EnemyTeam", "1 .45 .5");
Call("setdvar", "g_teamTitleColor_MyTeam", ".6 .8 .6");
Call("setdvar", "g_teamTitleColor_EnemyTeam", "1 .45 .5");
Call("setdvar", "ui_allow_teamchange", "0");
Call(42, "lowAmmoWarningNoAmmoColor1", 0, 0, 0, 0);
Call(42, "lowAmmoWarningNoAmmoColor2", 0, 0, 0, 0);
Call(42, "lowAmmoWarningColor1", 0, 0, 0, 0);
Call(42, "lowAmmoWarningColor2", 0, 0, 0, 0);
Call(42, "lowAmmoWarningNoReloadColor1", 0, 0, 0, 0);
Call(42, "lowAmmoWarningNoReloadColor1", 0, 0, 0, 0);
// custom fields init
entity.SetField("lives", 0);
entity.SetField("maxhp", 100);
entity.SetField("maxhealth", 100);
entity.SetField("cash", 0);
entity.SetField("credits", 0);
entity.SetField("camo", 0);
entity.SetField("reticle", 0);
entity.SetField("round_zomkills", 0);
entity.SetField("round_playerkills", 0);
entity.SetField("round_deaths", 0);
entity.SetField("totalkills", 0);
entity.SetField("hasoverlay", 0);
entity.SetField("lethal", "frag_grenade_mp");
entity.SetField("zombie_alpha", 0);
entity.SetField("zombie_stalker", 0);
entity.SetField("zombie_quieter", 0);
entity.SetField("zombie_falldamage", 0);
entity.SetField("player_thething", 0);
entity.SetField("player_antialpha", 0);
entity.SetField("movespeed", 1f);
GameStore.createStoreHUD(entity);
createScorePopup(entity);
entity.SpawnedPlayer += new Action(() =>
{
// should fix the invincible player glitch
// caused by a sesionteam/team of ""
// also disables spectators... neat
if(entity.GetField<string>("sessionteam") != "axis" && entity.GetField<string>("sessionteam") != "allies")
{
setPlayerTeam(entity, "axis");
entity.Call("suicide");
return;
}
entity.TakeAllWeapons();
entity.Call("clearPerks");
string smg = WeaponUtils.getRandomSMG();
entity.AfterDelay(100, player =>
{
player.SwitchToWeaponImmediate(smg);
});
if (!entity.HasField("firstspawn"))
{
createPlayerHud(entity);
doPlayerStore(entity);
doZombieStore(entity);
doCreditStore(entity);
entity.SetField("firstspawn", 1);
}
if (entity.GetField<string>("sessionteam") == "axis")
{
if (_isGrace)
{
// switch all players from zombies team during grace
setPlayerTeam(entity, "allies");
entity.Call("suicide");
return;
}
else
{
spawnZombie(entity);
}
}
else if (entity.GetField<string>("sessionteam") == "allies")
{
if (!_isGrace)
{
if (entity.GetField<int>("lives") > 0 && entity.GetField<int>("zombie_alpha") != 1)
{
entity.SetField("lives", entity.GetField<int>("lives") - 1);
entity.Call("iprintlnbold", "Used Life!");
}
else
{
setPlayerTeam(entity, "axis");
entity.SetField("round_deaths", 0); // reset deaths on team change
entity.Call("suicide");
return;
}
}
spawnPlayer(entity);
}
});
// skip start menu
entity.OnNotify("joined_team", player =>
{
entity.Call("closePopupMenu");
entity.Call("closeIngameMenu");
entity.Notify("menuresponse", "changeclass", "class0");
// hide the default xp popup
// need a field id number
// entity.GetField<HudElem>("hud_xpPointsPopup").SetPoint("TOPLEFT", "TOPLEFT", -200);
});
// disable changeclass menu
entity.OnNotify("menuresponse", (player, menu, response) =>
{
if (men*****String().Equals("class") && response.ToString().Equals("changeclass_marines"))
{
AfterDelay(100, () =>
{
entity.Notify("menuresponse", "changeclass", "back");
});
}
});
entity.Notify("menuresponse", "team_marinesopfor", "allies");
// handle speed changes
OnInterval(100, () =>
{
entity.Call("setmovespeedscale", new Parameter(entity.GetField<float>("movespeed")));
return true;
});
});
OnNotify("prematch_done", () =>
{
doGrace(60);
});
}
public override void OnSay(Entity player, string name, string message)
{
if (!(Call<int>("getdvarint", "mapedit_allowcheats") == 1 && (player.GetField<string>("name") == "TheApadayo" || player.GetField<string>("name") == "DidUknowiPwn")))
return;
if (message.Equals("endround"))
{
CallOnPlayers(entity => doIntermission(entity));
doCredits();
AfterDelay(3000, () =>
{
doGrace(60);
});
}
}
private void spawnZombie(Entity entity)
{
if (entity.GetField<int>("zombie_alpha") == 1)
{
entity.SetField("cash", 50);
entity.SetField("maxhp", 150);
entity.SetField("zombie_alpha", 0);
}
if (entity.GetField<int>("zombie_quieter") == 1)
{
entity.SetPerk("specialty_quieter", true, false);
}
if (entity.GetField<int>("zombie_stalker") == 1)
{
entity.SetPerk("specialty_stalker", true, false);
}
if (entity.GetField<int>("zombie_falldamage") == 1)
{
entity.SetPerk("zombie_falldamage", true, false);
}
entity.Call("setmodel", "mp_body_ally_ghillie_" + Call<string>("getdvar", "env1") + "_sniper");
entity.Call("setviewmodel", "viewhands_iw5_ghillie_" + Call<string>("getdvar", "env2"));
entity.Call("closePopupMenu");
entity.Call("closeIngameMenu");
entity.TakeWeapon("frag_grenade_mp");
entity.Call("giveweapon", "iw5_usp45_mp_tactical");
entity.Call("setWeaponAmmoClip", "iw5_usp45_mp_tactical", "0");
entity.Call("setWeaponAmmoStock", "iw5_usp45_mp_tactical", "0");
entity.SetPerk("specialty_lightweight", true, true);
entity.SetPerk("specialty_longersprint", true, true);
entity.Call("visionsetnakedforplayer", "ac130_thermal_mp", 0);
entity.SetField("maxhealth", entity.GetField<int>("maxhp"));
entity.Health = entity.GetField<int>("maxhp");
entity.AfterDelay(1, player =>
{
player.SwitchToWeaponImmediate("iw5_usp45_mp_tactical");
});
if (entity.GetField<int>("hasoverlay") == 1)
{
entity.Call("ThermalVisionFOFOverlayOn"); // in case they bought it
}
entity.SetField("movespeed", 1.14f); //give them a slight speed increase
// custom scoring part 2
AfterDelay(1, () =>
{
int kills = entity.GetField<int>("round_zomkills");
entity.SetField("score", kills * 100);
entity.SetField("deaths", entity.GetField<int>("round_deaths"));
entity.SetField("kills", kills);
});
}
private void spawnPlayer(Entity entity)
{
entity.Call("closePopupMenu");
entity.Call("closeIngameMenu");
//entity.Notify("menuresponse", "changeclass", "class1"); <- Was fucking up the give weapon on spawn >_>
entity.TakeAllWeapons();
int camo = entity.GetField<int>("camo");
int reticle = entity.GetField<int>("reticle");
string smg = WeaponUtils.getRandomSMG(camo, reticle);
entity.Call("giveweapon", smg);
entity.Call("giveMaxAmmo", smg);
string shotgun = WeaponUtils.getRandomShotgun(camo, reticle);
entity.Call("giveweapon", shotgun);
entity.Call("giveMaxAmmo", shotgun);
string pistol = WeaponUtils.getRandomPistol(camo, reticle);
entity.Call("giveweapon", pistol);
entity.Call("giveMaxAmmo", pistol);
entity.Call("giveweapon", entity.GetField<string>("lethal"));
entity.SetField("fragcount", 5);
entity.Call("setweaponammoclip", entity.GetField<string>("lethal"), 0);
if (_isGrace) // if player respawned during game (with lives) dont reset their cash
entity.SetField("cash", 0);
//entity.Call("visionsetnaked", "cobra_sunset3", true);
entity.SetField("movespeed", 1f); // make sure they have normal speed
entity.AfterDelay(100, player =>
{
player.SwitchToWeaponImmediate(smg);
});
OnNotify("prematch_done", () =>
{
entity.SwitchToWeaponImmediate(smg);
});
entity.OnInterval(100, player =>
{
if (_isGrace) return true;
if (entity.Call<int>("getammocount", entity.GetField<string>("lethal")) == 0 && entity.GetField<int>("fragcount") > 0)
{
entity.Call("setweaponammoclip", entity.GetField<string>("lethal"), 1);
entity.SetField("fragcount", entity.GetField<int>("fragcount") - 1);
}
return true;
});
// custom scoring part 2
AfterDelay(1, () =>
{
int kills = entity.GetField<int>("round_playerkills");
entity.SetField("score", 0);
entity.SetField("deaths", entity.GetField<int>("round_deaths"));
entity.SetField("kills", kills);
});
}
public override void OnPlayerKilled(Entity player, Entity inflictor, Entity attacker, int damage, string mod, string weapon, Vector3 dir, string hitLoc)
{
string playerWeapon = player.CurrentWeapon;
// cleanup weapons
OnInterval(100, () =>
{
Entity ent = Call<Entity>("getent", "weapon_" + playerWeapon, "classname");
if (ent != null)
{
ent.Call("delete");
return false;
}
else
{
return true;
}
});
// custom score part 1
if (attacker != null)
{
if (attacker.IsPlayer && attacker.IsAlive)
{
if (attacker.GetField<string>("sessionteam") == "allies")
{
// do custom scoring
AfterDelay(1, () =>
{
int kills = attacker.GetField<int>("round_playerkills");
attacker.SetField("score", kills * 100);
attacker.SetField("deaths", 0);
attacker.SetField("kills", kills);
kills = player.GetField<int>("round_zomkills");
player.SetField("score", kills * 100);
player.SetField("deaths", player.GetField<int>("round_deaths"));
player.SetField("kills", kills);
});
}
else
{
AfterDelay(1, () =>
{
int kills = attacker.GetField<int>("round_zomkills");
attacker.SetField("score", kills * 100);
attacker.SetField("deaths", player.GetField<int>("round_deaths"));
attacker.SetField("kills", kills);
player.SetField("score", 0);
player.SetField("deaths", 0);
player.SetField("kills", 0);
});
}
}
}
// stuff after only happens when in game
if (_isIntermission || _isGrace) return;
// game called suicide... ignore these
if (player == inflictor && inflictor == attacker) return;
// award score
if (attacker != null)
{
if (attacker.IsPlayer && attacker.IsAlive)
{
if (attacker.GetField<string>("sessionteam") == "allies")
{
if (mod == "MOD_MELEE")
{
attacker.SetField("cash", attacker.GetField<int>("cash") + 200);
//attacker.Call("iprintlnbold", "Melee Kill! ^1+200");
doScorePopUp(attacker, "Melee Kill! ^1+{0}", 200);
attacker.SetField("round_playerkills", attacker.GetField<int>("round_playerkills") + 1);
}
else
{
attacker.SetField("cash", attacker.GetField<int>("cash") + 50);
//attacker.Call("iprintlnbold", "Killed Zombie. ^1+50");
doScorePopUp(attacker, "Killed Zombie. ^1+{0}", 50);
attacker.SetField("round_playerkills", attacker.GetField<int>("round_playerkills") + 1);
}
player.SetField("cash", player.GetField<int>("cash") + 50);
player.SetField("round_deaths", player.GetField<int>("round_deaths") + 1);
//player.Call("iprintlnbold", "Died! ^1+50");
doScorePopUp(player, "Died! ^1+{0}", 50);
}
else
{
attacker.SetField("cash", attacker.GetField<int>("cash") + 100);
//attacker.Call("iprintlnbold", "Killed Human! ^1+100");
doScorePopUp(attacker, "Killed Human! ^1+{0}", 100);
attacker.SetField("round_zomkills", attacker.GetField<int>("round_zomkills") + 1);
player.SetField("round_deaths", player.GetField<int>("round_deaths") + 1);
}
}
}
}
private void doIntermission(Entity entity)
{
_isIntermission = true;
entity.Call("freezecontrols", true);
Call("visionsetnaked", "blacktest", 2);
info.SetText("^1Round is over. ^7Prepare for the next round");
AfterDelay(1500, () =>
{
info.Call("destroy");
});
AfterDelay(3000, () =>
{
entity.Call("freezecontrols", false);
Call("visionsetnaked", Call<string>("getdvar", "mapname"));
entity.Call("ThermalVisionFOFOverlayOff"); // in case they bought it
entity.Call("suicide");
_isIntermission = false;
MapEdit.runOnUsable((center) =>
{
center.Call(33399, new Parameter(center.GetField<Vector3>("open")), 1); // moveto
center.SetField("state", "open");
center.SetField("hp", center.GetField<int>("maxhp"));
return true;
}, "door");
//doGrace(60);
});
}
private void doCredits()
{
List<Entity> players = getPlayers(false).ToList<Entity>();
List<Entity> zombies = new List<Entity>();
players.Sort(delegate(Entity e1, Entity e2)
{
return e1.GetField<int>("round_playerkills").CompareTo(e2.GetField<int>("round_playerkills"));
});
players.Reverse();
int playercount = (int)(players.Count * 0.3);
//print("top 30 percent is {0}", playercount);
int i = 0;
if (playercount > players.Count)
playercount = players.Count;
foreach (Entity p in players)
{
if (i < playercount)
{
p.Call("iprintlnbold", "You were rank ^3" + (i + 1) + "^7 as a human. You get " + (p.GetField<int>("round_playerkills") * 50) + " Credits!");
p.SetField("credits", p.GetField<int>("credits") + (p.GetField<int>("round_playerkills") * 50));
//print("Player {0} placed {1} with {2} kills", i, p.GetField<string>("name"), p.GetField<int>("round_playerkills"));
}
else
{
p.Call("iprintlnbold", "You did not place this round");
//print("Player {0} did not place {1} with {2} kills", i, p.GetField<string>("name"), p.GetField<int>("round_playerkills"));
zombies.Add(p);
}
p.SetField("round_playerkills", 0);
p.SetField("round_deaths", 0);
i++;
}
if (playercount > zombies.Count)
playercount = zombies.Count;
zombies.Sort(delegate(Entity e1, Entity e2)
{
return e1.GetField<int>("round_zomkills").CompareTo(e2.GetField<int>("round_zomkills"));
});
zombies.Reverse();
i = 0;
foreach (Entity p in zombies)
{
if (i < playercount)
{
p.Call("iprintlnbold", "You were rank ^1" + (i + 1) + "^7 as a zombie. You get " + (p.GetField<int>("round_zomkills") * 50) + " Credits!");
p.SetField("credits", p.GetField<int>("credits") + (p.GetField<int>("round_zomkills") * 200));
//print("Zombie {0} placed {1} with {2} kills", i, p.GetField<string>("name"), p.GetField<int>("round_zomkills"));
}
else
{
p.Call("iprintlnbold", "You did not place this round");
//print("Zombie {0} did not place {1} with {2} kills", i, p.GetField<string>("name"), p.GetField<int>("round_zomkills"));
}
p.SetField("round_zomkills", 0);
i++;
}
}
private void doGrace(int seconds)
{
//info.SetText("^2Prepare for ^1Alphas!");
print("began grace period for {0} seconds", seconds);
_isGrace = true;
int waited = seconds;
// reset perks
CallOnPlayers((ent) =>
{
ent.SetField("zombie_stalker", 0);
ent.SetField("zombie_quieter", 0);
//ent.SetField("zombie_falldamage", 0);
ent.SetField("hasoverlay", 0);
});
OnInterval(1000, () =>
{
if (waited == 0)
{
return false;
}
countdown.SetText("^3" + waited.ToString() + " seconds remaining until round begins.");
if (waited < 11)
{
// ticking
// ui_mp_suitcasebomb_timer
CallOnPlayers((ent) => ent.Call("playlocalsound", "ui_mp_nukebomb_timer"));
}
waited--;
return true;
});
AfterDelay(seconds * 1000, () =>
{
info.SetText("^2Alphas ^7Have Spawned!");
countdown.SetText("");
_isGrace = false;
doAlpha(); // call after _isGrace is false so when people die they respawn as zombies.
OnInterval(100, () => // fade out text
{
if (info.Alpha == 0)
{
info.SetText("");
info.Alpha = 1;
return false;
}
info.Alpha -= 0.02f; // should last 5 seconds
return true;
});
// shouldnt crash now as it checkes for lethal existing as well as
// player list not including those without conencted....
CallOnPlayers(entity =>
{
if (!entity.HasField("lethal")) return; // connecting
entity.Call("setweaponammoclip", entity.GetField<string>("lethal"), 1);
entity.Call("playlocalsound", "mp_war_objective_taken");
Call("visionsetnaked", "cobra_sunset3", true);
});
});
}
private void doAlpha()
{
List<Entity> players = getPlayers(false).ToList<Entity>();
for (int i = 0; i < players.Count; i++)
{
if (players.ElementAt(i).GetField<string>("sessionteam").Equals("spectator"))
{
players.RemoveAt(i);
i--;
}
}
AfterDelay(3000, () =>
{
info.Call("destroy");
});
// no one on server, just do grace period
if (players.Count == 0)
{
_isIntermission = true;
print("no players found in server, redoing grace period.");
doGrace(60);
return;
}
int alphas = 0;
int[] alphaindex = { -1, -1, -1 };
_rng = new Random();
if (players.Count < 5)
{
alphaindex[0] = _rng.Next(players.Count - 1);
alphas = 1;
}
else if (players.Count < 14)
{
alphaindex[0] = _rng.Next(players.Count - 1);
alphaindex[1] = _rng.Next(players.Count - 1);
while(alphaindex[0] == alphaindex[1])
alphaindex[1] = _rng.Next(players.Count - 1);
alphas = 2;
}
else
{
alphaindex[0] = _rng.Next(players.Count - 1);
alphaindex[1] = _rng.Next(players.Count - 1);
while (alphaindex[0] == alphaindex[1])
alphaindex[1] = _rng.Next(players.Count - 1);
alphaindex[2] = _rng.Next(players.Count - 1);
while (alphaindex[0] == alphaindex[2] || alphaindex[1] == alphaindex[2])
alphaindex[2] = _rng.Next(players.Count - 1);
alphas = 3;
}
print("there are {0} players in server... chosing {1} alphas", players.Count, alphas);
for (int i = 0; i < alphas; i++)
{
players[alphaindex[i]].Call("suicide");
players[alphaindex[i]].SetField("zombie_alpha", 1);
}
}
private void createServerHud()
{
info = HudElem.CreateServerFontString("hudbig", 1f);
info.SetPoint("CENTER", "CENTER", 0, -200);
info.HideWhenInMenu = true;
info.SetText("");
countdown = HudElem.CreateServerFontString("hudbig", 0.8f);
countdown.SetPoint("CENTER", "CENTER", 0, -180);
countdown.HideWhenInMenu = true;
countdown.SetText("");
HudElem motd = HudElem.CreateServerFontString("boldFont", 1f);
motd.SetPoint("CENTER", "BOTTOM", 0, -19);
motd.Foreground = true;
motd.HideWhenInMenu = true;
OnInterval(25000, () =>
{
motd.SetText(Call<string>("getdvar", "motd"));
motd.SetPoint("CENTER", "BOTTOM", 1100, -10);
motd.Call("moveovertime", 25);
motd.X = -700;
return true;
});
}
private void createPlayerHud(Entity player)
{
HudElem health = HudElem.CreateFontString(player, "hudbig", 0.9f);
health.SetPoint("TOP RIGHT", "TOP RIGHT", -10, 0);
health.HideWhenInMenu = true;
HudElem healthtext = HudElem.CreateFontString(player, "hudbig", 0.9f);
healthtext.SetPoint("TOP RIGHT", "TOP RIGHT", -50, 0);
healthtext.HideWhenInMenu = true;
HudElem money = HudElem.CreateFontString(player, "hudbig", 0.9f);
money.SetPoint("TOP RIGHT", "TOP RIGHT", -10, 15); //25 original
money.HideWhenInMenu = true;
HudElem moneytext = HudElem.CreateFontString(player, "hudbig", 0.9f);
moneytext.SetPoint("TOP RIGHT", "TOP RIGHT", -50, 15); //25 original
moneytext.HideWhenInMenu = true;
HudElem lives = HudElem.CreateFontString(player, "hudbig", 0.9f);
lives.SetPoint("TOP RIGHT", "TOP RIGHT", -10, 30); //50 original
lives.HideWhenInMenu = true;
HudElem livestext = HudElem.CreateFontString(player, "hudbig", 0.9f);
livestext.SetPoint("TOP RIGHT", "TOP RIGHT", -50, 30); //50 original
livestext.HideWhenInMenu = true;
OnInterval(100, () =>
{
health.Call("setvalue", player.Health);
healthtext.Call("settext", "^1Health: ^7");
if (!_isGrace)
{
moneytext.SetText("^2Cash: ^7");
money.Call("setvalue", player.GetField<int>("cash"));
}
else
{
moneytext.SetText("^2Credits: ^7");
money.Call("setvalue", player.GetField<int>("credits"));
}
livestext.SetText("^3Lives: ^7");
lives.Call("setvalue", player.GetField<int>("lives"));
return true;
});
}
private void doPlayerStore(Entity player)
{
GameStore store = new GameStore(player);
store.doStoreWhen(() =>
{
return (player.GetField<string>("sessionteam") == "allies" && !_isGrace);
});
GameStore.StoreEntry entry = new GameStore.StoreEntry();
entry.name = "Buy ammo for current weapon";
entry.price = 100;
entry.action = new Func<string>(() =>
{
if (player.CurrentWeapon.Equals("defaultweapon_mp")) return "Cannot buy ammo for the Door repair tool!";
player.Call("givemaxammo", player.CurrentWeapon);
// player.Call("iprintlnbold", "Bought Max Ammo");
// ScorePopUp(player, "Derpies");
return "";
});
entry.remainingbuys = -1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Upgrade Weapon";
entry.price = 150;
entry.action = new Func<string>(() =>
{
return upgradeWeapon(player);
});
entry.remainingbuys = 3;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Riotshield";
entry.price = 250;
entry.action = new Func<string>(() =>
{
player.GiveWeapon("riotshield_mp");
player.SwitchToWeaponImmediate("riotshield_mp");
player.Call("iprintlnbold", "Bought Riotshield");
return "";
});
entry.remainingbuys = 1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Upgrade to Akimbo";
entry.price = 150;
entry.action = new Func<string>(() =>
{
return giveAttachment(player, "akimbo");
});
entry.remainingbuys = -1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Upgrade to XMags";
entry.price = 150;
entry.action = new Func<string>(() =>
{
return giveAttachment(player, "xmags");
});
entry.remainingbuys = -1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Upgrade to Red Dot";
entry.price = 50;
entry.action = new Func<string>(() =>
{
return giveAttachment(player, "reflex");
});
entry.remainingbuys = -1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Sleight of Hand";
entry.price = 100;
entry.action = new Func<string>(() =>
{
/*if (player.Call<int>("hasperk", "specialty_fastreload") > 0)
{
player.SetPerk("specialty_quickswap", true, false);
player.Call("iprintlnbold", "Bought ^2Sleight of Hand Pro!");
return "";
}*/
player.SetPerk("specialty_fastreload", true, false);
player.Call("iprintlnbold", "Bought ^2Sleight of Hand!");
return "";
});
entry.remainingbuys = 1;
/*entry.formatName = new Func<string>(() =>
{
if (player.Call<int>("hasperk", "specialty_fastreload") > 0)
return entry.name + " Pro - " + entry.price;
else
return entry.name + " - " + entry.price;
});*/
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Sitrep";
entry.price = 100;
entry.action = new Func<string>(() =>
{
/*if (player.Call<int>("hasperk", "specialty_detectexplosive") > 0)
{
player.SetPerk("specialty_selectivehearing", true, false);
player.Call("iprintlnbold", "Bought ^2Sitrep Pro!");
return "";
}*/
player.SetPerk("specialty_detectexplosive", true, false);
player.Call("iprintlnbold", "Bought ^2Sitrep!");
return "";
});
entry.remainingbuys = 1;
/*entry.formatName = new Func<string>(() =>
{
if (player.Call<int>("hasperk", "specialty_detectexplosive") > 0)
return entry.name + " Pro - " + entry.price;
else
return entry.name + " - " + entry.price;
});*/
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Steady Aim";
entry.price = 100;
entry.action = new Func<string>(() =>
{
/*if (player.Call<int>("hasperk", "specialty_bulletaccuracy") > 0)
{
player.SetPerk("specialty_fastsprintrecovery", true, false);
player.Call("iprintlnbold", "Bought ^2Steady Aim Pro!");
return "";
}*/
player.SetPerk("specialty_bulletaccuracy", true, false);
player.Call("iprintlnbold", "Bought ^4Steady Aim!");
return "";
});
entry.remainingbuys = 1;
/*entry.formatName = new Func<string>(() =>
{
if (player.Call<int>("hasperk", "specialty_bulletaccuracy") > 0)
return entry.name + " Pro - " + entry.price;
else
return entry.name + " - " + entry.price;
});*/
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Scavenger";
entry.price = 100;
entry.action = new Func<string>(() =>
{
/*if (player.Call<int>("hasperk", "specialty_scavenger") > 0)
{
player.SetPerk("specialty_extraammo", true, false);
player.Call("iprintlnbold", "Bought ^2Scavenger Pro!");
return "";
}*/
player.SetPerk("specialty_scavenger", true, false);
player.Call("iprintlnbold", "Bought ^5Scavenger!");
return "";
});
entry.remainingbuys = 1;
/*entry.formatName = new Func<string>(() =>
{
if (player.Call<int>("hasperk", "specialty_scavenger") > 0)
return entry.name + " Pro - " + entry.price;
else
return entry.name + " - " + entry.price;
});*/
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Dead Silence";
entry.price = 100;
entry.action = new Func<string>(() =>
{
/*if (player.Call<int>("hasperk", "specialty_quieter") > 0)
{
player.SetPerk("specialty_falldamage", true, false);
player.Call("iprintlnbold", "Bought ^8Dead Silence Pro!");
return "";
}*/
player.SetPerk("specialty_quieter", true, false);
player.Call("iprintlnbold", "Bought ^8Dead Silence!");
return "";
});
entry.remainingbuys = 1;
/* entry.formatName = new Func<string>(() =>
{
if (player.Call<int>("hasperk", "specialty_quieter") > 0)
return entry.name + " Pro - " + entry.price;
else
return entry.name + " - " + entry.price;
});*/
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Stalker";
entry.price = 100;
entry.action = new Func<string>(() =>
{
/*if (player.Call<int>("hasperk", "specialty_stalker") > 0)
{
player.SetPerk("specialty_delaymine", true, false);
player.Call("iprintlnbold", "Bought ^6Stalker Pro!");
return "";
}*/
player.SetPerk("specialty_stalker", true, false);
player.Call("iprintlnbold", "Bought ^6Stalker!");
return "";
});
entry.remainingbuys = 1;
/*entry.formatName = new Func<string>(() =>
{
if (player.Call<int>("hasperk", "specialty_stalker") > 0)
return entry.name + " Pro - " + entry.price;
else
return entry.name + " - " + entry.price;
});*/
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Marksman";
entry.price = 100;
entry.action = new Func<string>(() =>
{
/*if (player.Call<int>("hasperk", "specialty_marksman") > 0)
{
player.SetPerk("specialty_holdbreath", true, false);
player.Call("iprintlnbold", "Bought ^7Marksman Pro!");
return "";
}*/
player.SetPerk("specialty_marksman", true, false);
player.Call("iprintlnbold", "Bought ^7Marksman!");
return "";
});
entry.remainingbuys = 1;
/*entry.formatName = new Func<string>(() =>
{
if (player.Call<int>("hasperk", "specialty_marksman") > 0)
return entry.name + " Pro - " + entry.price;
else
return entry.name + " - " + entry.price;
});*/
store.addEntry(entry);
// meh... actually fixed it
entry = new GameStore.StoreEntry();
entry.name = "Buy Door Repair Tool";
entry.price = 250;
entry.action = new Func<string>(() =>
{
player.GiveWeapon("defaultweapon_mp");
AfterDelay(100, () => player.SwitchToWeaponImmediate("defaultweapon_mp"));
player.SetField("repairsleft", 10);
player.Call("iprintlnbold", "Bought ^7Door Repair Tool!");
return "";
});
entry.remainingbuys = 1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy The Thing";
entry.price = 100;
entry.action = new Func<string>(() =>
{
if (player.GetField<int>("player_thething") != 1)
return "[Locked]";
player.Call("iprintlnbold", "Bought ^1The Thing!");
player.Call("giveweapon", "iw5_deserteagle_mp"); //iw5_m60jugg_mp
doCustomWeapon(player, "iw5_deserteagle", "ac130_25mm_mp");
player.AfterDelay(100, entity =>
{
player.SwitchToWeaponImmediate("iw5_deserteagle_mp"); //iw5_m60jugg_mp
});
/*OnInterval(100, () =>
{
if(player.CurrentWeapon.Equals("iw5_desertagle_mp"))
{
player.Call("recoilscaleon", 0f);
return true;
}
return false;
});*/ //Still being stupid I see.
return "";
});
entry.remainingbuys = 1;
entry.formatName = new Func<string>(() =>
{
if (player.GetField<int>("player_thething") != 1)
return "Locked";
return "Buy The Thing - 100";
});
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Suicide";
entry.price = 0;
entry.action = new Func<string>(() =>
{
player.Call("suicide");
return "";
});
entry.remainingbuys = -1;
entry.formatName = new Func<string>(() =>
{
return "Suicide";
});
store.addEntry(entry);
}
private void doZombieStore(Entity player)
{
GameStore store = new GameStore(player);
store.doStoreWhen(() =>
{
return (player.GetField<string>("sessionteam") == "axis" && !_isGrace);
});
GameStore.StoreEntry entry = new GameStore.StoreEntry();
entry.name = "Increase Max Health";
entry.price = 50;
entry.action = new Func<string>(() =>
{
if (player.GetField<int>("maxhp") == 1500)
{
return "Maximum health cannot be increased more!";
}
player.SetField("maxhp", player.GetField<int>("maxhp") + 50);
player.SetField("maxhealth", player.GetField<int>("maxhp"));
player.Health = player.GetField<int>("maxhp");
player.Call("iprintlnbold", "Increased Max Health");
return "";
});
entry.remainingbuys = -1;
store.addEntry(entry);
/*entry = new GameStore.StoreEntry();
entry.name = "View Health";
entry.price = 0;
entry.action = new Func<string>(() =>
{
player.Call("iprintlnbold", "Health is at: ^1" + player.Health + "^0/^1" + player.GetField<int>("maxhp"));
return "";
});
entry.remainingbuys = -1;
store.addEntry(entry);*/
entry = new GameStore.StoreEntry();
entry.name = "Buy Thermal Overlay";
entry.price = 200;
entry.action = new Func<string>(() =>
{
player.Call("ThermalVisionFOFOverlayOn");
player.SetField("hasoverlay", 1);
player.Call("iprintlnbold", "Bought Thermal Overlay");
return "";
});
entry.remainingbuys = 1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Throwing Knife";
entry.price = 300;
entry.action = new Func<string>(() =>
{
player.Call("SetOffhandPrimaryClass", "throwingknife");
player.GiveWeapon("throwingknife_mp");
player.Call("setweaponammoclip", "throwingknife_mp", 1);
player.Call("iprintlnbold", "Bought a Throwing Knife");
return "";
});
entry.remainingbuys = -1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Stalker";
entry.price = 200;
entry.action = new Func<string>(() =>
{
player.SetPerk("specialty_stalker", true, true);
player.SetField("zombie_stalker", 1);
player.Call("iprintlnbold", "Bought Stalker!");
return "";
});
entry.remainingbuys = 1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Buy Dead Silence";
entry.price = 200;
entry.action = new Func<string>(() =>
{
player.SetPerk("specialty_quieter", true, true);
player.SetField("zombie_quieter", 1);
player.Call("iprintlnbold", "Bought Dead Silence!");
return "";
});
entry.remainingbuys = 1;
store.addEntry(entry);
/* entry = new GameStore.StoreEntry();
entry.name = "Buy No Fall Damage";
entry.price = 300;
entry.action = new Func<string>(() =>
{
player.SetPerk("specialty_falldamage", true, true);
player.SetField("zombie_falldamage", 1);
player.Call("iprintlnbold", "Bought No Fall Damage!");
return "";
});
entry.remainingbuys = 1;
store.addEntry(entry);*/ //Not working for some reason.
entry = new GameStore.StoreEntry();
entry.name = "Buy Increased Speed";
entry.price = 300;
entry.action = new Func<string>(() =>
{
// if (player.GetField<int>("movespeed") == 1.5f)
// return "Already Bought!";
player.Call("iprintlnbold", "Bought Increased Speed!");
player.SetField("movespeed", 1.5f);
return "";
});
entry.remainingbuys = 1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Suicide";
entry.price = 0;
entry.action = new Func<string>(() =>
{
player.Call("suicide");
return "";
});
entry.remainingbuys = -1;
entry.formatName = new Func<string>(() =>
{
return "Suicide";
});
store.addEntry(entry);
}
private void doCreditStore(Entity player)
{
GameStore store = new GameStore(player);
store.doStoreWhen(() =>
{
return _isGrace;
});
store.setCurrencyField("credits");
GameStore.StoreEntry entry = new GameStore.StoreEntry();
entry.name = "Buy A Life";
entry.price = 250;
entry.action = new Func<string>(() =>
{
player.SetField("lives", player.GetField<int>("lives") + 1);
player.Call("iprintlnbold", "Bought a Life");
return "";
});
entry.remainingbuys = -1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "";
entry.formatName = new Func<string>(() =>
{
string upgradeto = "";
switch (player.GetField<string>("lethal"))
{
case "frag_grenade_mp":
upgradeto = "Semtex";
break;
case "semtex_mp":
upgradeto = "Claymore";
break;
case "claymore_mp":
upgradeto = "C4";
break;
case "c4_mp":
upgradeto = "Bouncing Betty";
break;
default:
return "Cannot Upgrade Equipment Further!";
}
return string.Format("Upgrade Equipment to {0} - 250", upgradeto);
});
entry.price = 250;
entry.action = new Func<string>(() =>
{
switch(player.GetField<string>("lethal"))
{
case "frag_grenade_mp":
player.SetField("lethal", "semtex_mp");
player.Call("iprintlnbold", "Upgraded to Semtex");
player.Call("giveweapon", player.GetField<string>("lethal"));
player.Call("setweaponammoclip", player.GetField<string>("lethal"), 0);
entry.name = "Upgrade to Claymore";
break;
case "semtex_mp":
player.SetField("lethal", "claymore_mp");
player.Call("iprintlnbold", "Upgraded to Claymore");
player.Call("giveweapon", player.GetField<string>("lethal"));
player.Call("setweaponammoclip", player.GetField<string>("lethal"), 0);
entry.name = "Upgrade to C4";
break;
case "claymore_mp":
player.SetField("lethal", "c4_mp");
player.Call("iprintlnbold", "Upgraded to C4");
player.Call("giveweapon", player.GetField<string>("lethal"));
player.Call("setweaponammoclip", player.GetField<string>("lethal"), 0);
entry.name = "Upgrade to Bouncing Betty";
break;
case "c4_mp":
player.SetField("lethal", "bouncingbetty_mp");
player.Call("iprintlnbold", "Upgraded to Bouncing Betty");
player.Call("giveweapon", player.GetField<string>("lethal"));
player.Call("setweaponammoclip", player.GetField<string>("lethal"), 0);
entry.name = "Cannot Upgrade Equipment!";
break;
default:
return "Cannot Upgrade Equipment Further!";
}
return "";
});
entry.remainingbuys = 1;
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Unlock The Thing";
entry.price = 750;
entry.action = new Func<string>(() =>
{
if (player.GetField<int>("player_thething") == 1)
return "Already Bought!";
player.SetField("player_thething", 1);
player.Call("iprintlnbold", "Unlocked The Thing!");
return "";
});
entry.remainingbuys = 1;
entry.formatName = new Func<string>(() =>
{
if (player.GetField<int>("player_thething") == 1)
return "Purchased!";
return "Unlock The Thing - 750";
});
store.addEntry(entry);
/*entry = new GameStore.StoreEntry();
entry.name = "Buy Anti-Alpha";
entry.price = 600;
entry.action = new Func<string>(() =>
{
if (player.GetField<int>("player_antialpha") == 1)
return "Already Bought!";
player.SetField("player_antialpha", 1);
player.Call("iprintlnbold", "Bought Anti-Alpha!");
return "";
});
entry.remainingbuys = 1;
entry.formatName = new Func<string>(() =>
{
if (player.GetField<int>("player_antialpha") == 1)
return "Bought!";
return "Buy Anti-Alpha - 600";
});
store.addEntry(entry);*/
entry = new GameStore.StoreEntry();
entry.name = "Change Camo";
entry.price = 0;
entry.action = new Func<string>(() =>
{
player.SetField("camo", player.GetField<int>("camo") + 1);
if (player.GetField<int>("camo") == 13)
{
player.SetField("camo", 0);
}
return "";
});
entry.remainingbuys = -1;
entry.formatName = new Func<string>(() =>
{
return string.Format("Change Camo [Cur: {0}]", WeaponUtils._camoList[player.GetField<int>("camo")]);
});
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Change Reticule";
entry.price = 0;
entry.action = new Func<string>(() =>
{
player.SetField("reticle", player.GetField<int>("reticle") + 1);
if (player.GetField<int>("reticle") == 6)
{
player.SetField("reticle", 0);
}
return "";
});
entry.remainingbuys = -1;
entry.formatName = new Func<string>(() =>
{
return string.Format("Change Reticle [Cur: {0}]", player.GetField<int>("reticle"));
});
store.addEntry(entry);
entry = new GameStore.StoreEntry();
entry.name = "Suicide";
entry.price = 0;
entry.action = new Func<string>(() =>
{
player.Call("suicide");
return "";
});
entry.remainingbuys = -1;
entry.formatName = new Func<string>(() =>
{
return "Suicide";
});
store.addEntry(entry);
}
public void doCustomWeapon(Entity player, string name, string bullet)
{
player.OnNotify("weapon_fired", (p, weaponName) =>
{
if (((string)weaponName).Contains(name))
{
Call("magicbullet", bullet, // bullet name
new Parameter(player.Call<Vector3>("getTagOrigin", "tag_weapon_left")), // start point
new Parameter(Call<Vector3>("anglestoforward", player.Call<Vector3>("getPlayerAngles")) * 1000000), // end point
new Parameter(player)); // ignore entity
}
});
}
private string upgradeWeapon(Entity player)
{
string weapon = player.CurrentWeapon;
string basenewweapon = "";
string basename = WeaponUtils.weapon_getBasename(weapon);
int camo = player.GetField<int>("camo");
int reticle = player.GetField<int>("reticle");
if (Array.IndexOf(WeaponUtils._smgList, basename) > 0)
{
player.TakeWeapon(weapon);
basenewweapon = WeaponUtils.getRandomAR(camo, reticle);
}
else if (Array.IndexOf(WeaponUtils._arList, basename) > 0)
{
player.TakeWeapon(weapon);
basenewweapon = WeaponUtils.getRandomLMG(camo, reticle);
}
else if (Array.IndexOf(WeaponUtils._pistolList, basename) > 0)
{
player.TakeWeapon(weapon);
basenewweapon = WeaponUtils.getRandomAutoPistol(camo, reticle);
}
else
{
return "You cannot upgrade this weapon!";
}
string[] newattach = WeaponUtils.weapon_getAttachments(weapon);
string newweapon = WeaponUtils.weapon_getWeaponName(basenewweapon, newattach, player.GetField<int>("camo"), player.GetField<int>("reticle"));
player.GiveWeapon(newweapon);
player.AfterDelay(100, entity =>
{
player.SwitchToWeaponImmediate(newweapon);
player.Call("iprintlnbold", "Upgraded Weapon!");
});
return "";
}
private string giveAttachment(Entity player, string attachment)
{
string oldweapon = player.CurrentWeapon;
string[] attach = WeaponUtils.weapon_getAttachments(oldweapon);
if (attach.Contains(attachment)) return "You already own this attachment!";
Array.Resize(ref attach, attach.Length + 1);
attach[attach.Length - 1] = attachment;
if (!WeaponUtils.checkAttachments(oldweapon, attachment)) return "You cannot upgrade this weapon with that attachment!";
string newweapon = WeaponUtils.weapon_getWeaponName(WeaponUtils.weapon_getBasename(oldweapon), attach, player.GetField<int>("camo"), player.GetField<int>("reticle"));
player.GiveWeapon(newweapon);
player.Call("setweaponammoclip", newweapon, player.GetWeaponAmmoClip(newweapon));
player.Call("setweaponammostock", newweapon, player.GetWeaponAmmoStock(newweapon));
player.TakeWeapon(oldweapon);
player.SwitchToWeaponImmediate(newweapon);
return "";
}
private Entity[] getPlayers(bool isalive=false)
{
List<Entity> players = new List<Entity>();
for (int i = 0; i < 17; i++)
{
Entity entity = Call<Entity>("getentbynum", i);
if (entity != null)
{
if (entity.IsPlayer)
{
if (!(isalive && !entity.IsAlive) && entity.HasField("connected"))
players.Add(entity);
}
}
}
return players.ToArray();
}
private void setPlayerTeam(Entity player, string team)
{
// need to be able to change max team count or player.pers["team"] to get this to work
player.Notify("menuresponse", "team_marinesopfor", team);
}
private int getTeamCount(string team)
{
Entity[] players = getPlayers(false);
int count = 0;
foreach (Entity p in players)
{
if (p.HasField("sessionteam"))
{
if (p.GetField<string>("sessionteam") == team)
count++;
}
}
return count;
}
private void CallOnPlayers(Action<Entity> action)
{
// dont know why I didnt update this when I wrote getPlayers
Entity[] ents = getPlayers(false);
foreach (Entity entity in ents)
{
action.Invoke(entity);
}
}
/*private void fadeInText(HudElem elem, int milliseconds)
{
OnInterval(100, () => // fade in text
{
if (elem.Alpha >= 1)
{
return false;
}
elem.Alpha += (float)0.1 / (milliseconds / 1000);
return true;
});
}
private void fadeOutText(HudElem elem, int milliseconds)
{
elem.Alpha = 1;
OnInterval(100, () => // fade in text
{
if (elem.Alpha <= 0)
{
return false;
}
elem.Alpha -= (float)0.1 / (milliseconds / 1000);
return true;
});
AfterDelay(milliseconds, () =>
{
elem.Alpha = 1;
elem.SetText("");
});
}*/
public string getMapEnv(string mapname)
{
switch (mapname)
{
case "mp_alpha":
case "mp_bootleg":
case "mp_exchange":
case "mp_hardhat":
case "mp_interchange":
case "mp_mogadishu":
case "mp_paris":
case "mp_plaza2":
case "mp_underground":
case "mp_cement":
case "mp_hillside_ss":
case "mp_overwatch":
case "mp_terminal_cls":
case "mp_aground_ss":
case "mp_courtyard_ss":
case "mp_meteora":
case "mp_morningwood":
case "mp_qadeem":
case "mp_crosswalk_ss":
case "mp_italy":
case "mp_boardwalk":
case "mp_roughneck":
case "mp_nola":
return "urban";
case "mp_dome":
case "mp_radar":
case "mp_restrepo_ss":
case "mp_burn_ss":
case "mp_seatown":
case "mp_shipbreaker":
case "mp_moab":
return "desert";
case "mp_bravo":
case "mp_carbon":
case "mp_park":
case "mp_six_ss":
case "mp_village":
case "mp_lambeth":
return "woodland";
}
return "";
}
/*private void protectDvar<T>(string dvar, T value)
{
OnInterval(100, () =>
{
if (!Call<T>("getdvar", dvar).Equals(value))
Call("setdvar", dvar, new Parameter(value));
return true;
});
}*/ //Not used
private static void print(string format, params object[] p)
{
Log.Write(LogLevel.All, format, p);
}
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr VirtualAlloc(IntPtr lpAddress, UIntPtr dwSize, uint flAllocationType, uint flProtect);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool VirtualFree(IntPtr lpAddress, UIntPtr dwSize, uint dwFreeType);
public IntPtr alloc(int size)
{
return VirtualAlloc(IntPtr.Zero, (UIntPtr)size, 0x3000, 0x40);
}
public bool unalloc(IntPtr address, int size)
{
return VirtualFree(address, (UIntPtr)size, 0x8000);
}
bool _changed = false;
IntPtr memory;
private unsafe void changeGametype(string gametype)
{
byte[] gametypestring;
if (_changed)
{
gametypestring = new System.Text.UTF8Encoding().GetBytes(gametype);
if (gametypestring.Length >= 64) gametypestring[64] = 0x0; // null terminate if too large
Marshal.Copy(gametypestring, 0, memory, gametype.Length > 64 ? 64 : gametype.Length);
return;
}
memory = alloc(64);
gametypestring = new System.Text.UTF8Encoding().GetBytes(gametype);
if (gametypestring.Length >= 64) gametypestring[64] = 0x0; // null terminate if too large
Marshal.Copy(gametypestring, 0, memory, gametype.Length > 64 ? 64 : gametype.Length);
*(byte*)0x4EB983 = 0x68; // mov eax, 575D928h -> push stringloc
*(int*)0x4EB984 = (int)memory;
*(byte*)0x4EB988 = 0x90; // mov ecx, [eax+0Ch] -> nop
*(byte*)0x4EB989 = 0x90;
*(byte*)0x4EB98A = 0x90;
*(byte*)0x4EB98B = 0x90; // push edx -> nop
_changed = true;
}
private void createScorePopup(Entity player)
{
HudElem PopUp = HudElem.CreateFontString(player, "hudsmall", 1f);
PopUp.SetPoint("center", "center", 100, 40);
PopUp.Alpha = 1f;
PopUp.SetText("");
player.SetField("hud_scorepopup", new Parameter(PopUp));
player.SetField("hud_scorepopup_ammount", 0);
}
private void doScorePopUp(Entity player, string text, int amount)
{
HudElem PopUp = player.GetField<HudElem>("hud_scorepopup");
int lastamt = player.GetField<int>("hud_scorepopup_ammount");
// fades over 3 seconds
PopUp.Alpha = 1f;
PopUp.SetText(String.Format(text, (amount + lastamt)));
player.SetField("hud_scorepopup_ammount", lastamt + amount);
PopUp.Call("fadeovertime", 3f);
PopUp.Alpha = 0;
AfterDelay(3000, () =>
{
PopUp.SetText("");
PopUp.Alpha = 1f;
lastamt = player.GetField<int>("hud_scorepopup_ammount");
if(lastamt - amount == 0)
player.SetField("hud_scorepopup_ammount", 0);
});
}
}
}
//TO-DO List:
//Add an expfogtest like from IW4
//Implement teleporting TK from QCZM v2 our version
//Mmm fix-shop up.
//Add setfields to all shop items so once it's bought we can disable it from a 2nd purchase.
//Something is broken with ScorePopUp, as in it won't c
made 2 file class library needed and added them there
Code:
// QCZM IW5 - TheApadayo & DidUknowiPwn 2012
// weapon utilities
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using InfinityScript;
namespace DUKIP
{
class WeaponUtils
{
private static Random _rng = new Random();
public static string weapon_getBasename(string weapon)
{
string[] split = weapon.Split('_');
if (split.Length < 2) return "";
return split[0] + "_" + split[1];
}
public static string[] weapon_getAttachments(string weapon)
{
string[] split = weapon.Split('_');
if (split.Length < 4) return new string[1];
string[] attachments = new string[5];
int attach = 0;
int i = 3;
while(split.Length > i && attach < 5)
{
if (!split[i].Contains("camo") && !split[i].Contains("ret") && !split[i].Contains("scope"))
{
attachments[attach] = split[i];
attachments[attach] = attachments[attach].Replace("smg", "");
attachments[attach] = attachments[attach].Replace("lmg", "");
attach++;
}
i++;
}
Array.Resize<string>(ref attachments, attach);
return attachments;
}
// neither of these really work
public static int weapon_getcamo(string weapon)
{
string[] split = weapon.Split('_');
for (int i = 0; i < split.Length; i++)
{
if (split[i].Contains("camo"))
{
return int.Parse(split[i].Split('0')[1]);
}
}
return 0;
}
public static int weapon_getReticle(string weapon)
{
string[] split = weapon.Split('_');
for (int i = 0; i < split.Length; i++)
{
if (split[i].Contains("ret"))
{
return int.Parse(split[i].Split('t')[1]);
}
}
return 0;
}
public static string[] GetDesiredAttachments()
{
var attachmentTypes = new[]
{
"none",
"sight",
"sight",
"sight",
"sight",
"sight",
"other",
"other",
"other",
"final"
};
switch (attachmentTypes[_rng.Next(0, attachmentTypes.Length)])
{
case "none":
return new string[0];
case "sight":
return new[]
{
"acog",
"reflex",
"hamrhybrid",
"hybrid",
"zoomscope",
"eotech",
"vzscope"
};
case "other":
return new[]
{
"silencer",
"silencer02",
"silencer03",
"grip",
"gl",
"gp25",
"m320",
"shotgun"
};
case "final":
return new[]
{
"thermal",
"heartbeat"
};
}
return new string[0];
}
public static string getRandomPistol(int camo=-1, int reticle=-1)
{
if (camo == -1) camo = _rng.Next(14);
if (reticle == -1) reticle = _rng.Next(7);
return Utilities.BuildWeaponName(_pistolList[_rng.Next(_pistolList.Length)], "", "none", camo, reticle);
}
public static string getRandomAutoPistol(int camo = -1, int reticle = -1)
{
if (camo == -1) camo = _rng.Next(14);
if (reticle == -1) reticle = _rng.Next(7);
return Utilities.BuildWeaponName(_autoPistolList[_rng.Next(_autoPistolList.Length)], "", "none", camo, reticle);
}
public static string getRandomSMG(int camo = -1, int reticle = -1)
{
if (camo == -1) camo = _rng.Next(14);
if (reticle == -1) reticle = _rng.Next(7);
return Utilities.BuildWeaponName(_smgList[_rng.Next(_smgList.Length)], "", "none", camo, reticle);
}
public static string getRandomAR(int camo = -1, int reticle = -1)
{
if (camo == -1) camo = _rng.Next(14);
if (reticle == -1) reticle = _rng.Next(7);
return Utilities.BuildWeaponName(_arList[_rng.Next(_arList.Length)], "", "none", camo, reticle);
}
public static string getRandomShotgun(int camo = -1, int reticle = -1)
{
if (camo == -1) camo = _rng.Next(14);
if (reticle == -1) reticle = _rng.Next(7);
return Utilities.BuildWeaponName(_shotgunList[_rng.Next(_shotgunList.Length)], "", "none", camo, reticle);
}
public static string getRandomSniper(int camo = -1, int reticle = -1)
{
if (camo == -1) camo = _rng.Next(14);
if (reticle == -1) reticle = _rng.Next(7);
return Utilities.BuildWeaponName(_sniperList[_rng.Next(_sniperList.Length)], "", "none", camo, reticle);
}
public static string getRandomLMG(int camo = -1, int reticle = -1)
{
if (camo == -1) camo = _rng.Next(14);
if (reticle == -1) reticle = _rng.Next(7);
return Utilities.BuildWeaponName(_lmgList[_rng.Next(_lmgList.Length)], "", "none", camo, reticle);
}
public static string getRandomLauncher(int camo = -1, int reticle = -1)
{
if (camo == -1) camo = _rng.Next(14);
if (reticle == -1) reticle = _rng.Next(7);
return Utilities.BuildWeaponName(_launcherList[_rng.Next(_launcherList.Length)], "", "none", camo, reticle);
}
public static string getRandomWeapon(int camo = -1, int reticle = -1)
{
switch(_rng.Next(7))
{
case 0:
return getRandomPistol(camo, reticle);
case 1:
return getRandomSMG(camo, reticle);
case 2:
return getRandomAR(camo, reticle);
case 3:
return getRandomShotgun(camo, reticle);
case 4:
return getRandomSniper(camo, reticle);
case 5:
return getRandomLMG(camo, reticle);
default:
return getRandomLauncher(camo, reticle);
}
}
private static void print(string format, params object[] p)
{
Log.Write(LogLevel.All, format, p);
}
public static string weapon_getWeaponName(string baseName, string []attachments, int camo, int reticle)
{
Function.SetEntRef(-1);
bool _usesRet = false;
for (int i = 0; i < attachments.Length; i++)
{
// why does this matter?
if (GetAttachmentType(attachments[i]) == "rail")
{
_usesRet = true;
}
// just map them... should get ignored if they arent scopes
if (GetAttachmentType(attachments[i]) == "rail")
{
attachments[i] = AttachmentMap(attachments[i], baseName);
}
}
if(_usesRet && reticle > 0)
{
reticle = 0;
}
var bareWeaponName = "";
var weaponName = "";
if (baseName.Contains("iw5_"))
{
weaponName = baseName + "_mp";
bareWeaponName = baseName.Substring(4);
}
else
{
weaponName = baseName;
}
bool _hasScope = false;
if (GetWeaponClass(baseName) == "weapon_sniper")
{
for(int i=0; i<attachments.Length;i++)
{
if (GetAttachmentType(attachments[i]) == "rail" && attachments[i] == "zoomscope")
{
_hasScope = true;
}
}
if(!_hasScope)
attachments[attachments.Length + 1] = bareWeaponName + "scope";
}
for(int i=0; i<attachments.Length; i++)
{
if (attachments[i] == "vzscope")
{
attachments[i] = bareWeaponName + "scopevz";
}
}
attachments = attachments.OrderBy(attachment => attachment ?? "zz").ToArray();
foreach (var attachment in attachments)
{
if (string.IsNullOrEmpty(attachment))
{
continue;
}
weaponName += "_" + attachment;
}
var weaponClass = GetWeaponClass(baseName);
if (weaponName.Contains("iw5_"))
{
if (weaponClass != "weapon_pistol" && weaponClass != "weapon_machine_pistol" && weaponClass != "weapon_projectile")
{
weaponName = BuildWeaponNameCamo(weaponName, camo);
}
weaponName = BuildWeaponNameReticle(weaponName, reticle);
return weaponName;
}
else
{
if (weaponClass != "weapon_pistol" && weaponClass != "weapon_machine_pistol" && weaponClass != "weapon_projectile")
{
weaponName = BuildWeaponNameCamo(weaponName, camo);
}
weaponName = BuildWeaponNameReticle(weaponName, reticle);
return weaponName + "_mp";
}
}
private static string BuildWeaponNameCamo(string weaponName, int camo)
{
if (camo <= 0)
{
return weaponName;
}
if (camo < 10)
{
weaponName += "_camo0";
}
else
{
weaponName += "_camo";
}
weaponName += camo.ToString();
return weaponName;
}
private static string BuildWeaponNameReticle(string weaponName, int reticle)
{
if (reticle <= 0)
{
return weaponName;
}
return weaponName + "_scope" + reticle.ToString();
}
public static string GetWeaponClass(string weapon)
{
Function.SetEntRef(-1);
var tokens = weapon.Split('_');
var weaponClass = "";
if (tokens[0] == "iw5")
{
var concatName = tokens[0] + "_" + tokens[1];
weaponClass = Function.Call<string>("tableLookup", "mp/statstable.csv", 4, concatName, 2);
}
else if (tokens[0] == "alt")
{
var concatName = tokens[1] + "_" + tokens[2];
weaponClass = Function.Call<string>("tableLookup", "mp/statstable.csv", 4, concatName, 2);
}
else
{
weaponClass = Function.Call<string>("tableLookup", "mp/statstable.csv", 4, tokens[0], 2);
}
if (weaponClass == "")
{
weapon = Regex.Replace(weapon, "_mp$", "");
weaponClass = Function.Call<string>("tableLookup", "mp/statstable.csv", 4, weapon, 2);
}
if (weapon == "none" || weaponClass == "")
{
weaponClass = "other";
}
return weaponClass;
}
public static string GetAttachmentType(string attachmentName)
{
Function.SetEntRef(-1);
return Function.Call<string>("tableLookup", "mp/attachmenttable.csv", 4, attachmentName, 2);
}
public static string AttachmentMap(string attachmentName, string weaponName)
{
Function.SetEntRef(-1);
var weaponClass = GetWeaponClass(weaponName);
switch (weaponClass)
{
case "weapon_smg":
if (attachmentName == "reflex")
return "reflexsmg";
else if (attachmentName == "eotech")
return "eotechsmg";
else if (attachmentName == "acog")
return "acogsmg";
else if (attachmentName == "thermal")
return "thermalsmg";
return attachmentName;
case "weapon_lmg":
if (attachmentName == "reflex")
return "reflexlmg";
else if (attachmentName == "eotech")
return "eotechlmg";
return attachmentName;
case "weapon_machine_pistol":
if (attachmentName == "reflex")
return "reflexsmg";
else if (attachmentName == "eotech")
return "eotechsmg";
return attachmentName;
default:
return attachmentName;
}
}
public static bool checkAttachments(string weapon, string attach)
{
string basename = weapon_getBasename(weapon);
if (attach == "akimbo")
{
if (GetWeaponClass(basename) != "weapon_machine_pistol" && GetWeaponClass(basename) != "weapon_pistol")
{
return false;
}
}
if (GetAttachmentType(attach) == "rail" && GetWeaponClass(basename) == "weapon_sniper")
{
return false;
}
return true;
}
public static string[] _pistolList = new[]
{
"iw5_44magnum",
"iw5_usp45",
"iw5_mp412",
"iw5_p99",
"iw5_fnfiveseven"
};
public static string[] _autoPistolList = new[]
{
"iw5_fmg9",
"iw5_skorpion",
"iw5_mp9",
"iw5_g18"
};
public static string[] _smgList = new[]
{
"iw5_mp5",
"iw5_m9",
"iw5_p90",
"iw5_pp90m1",
"iw5_ump45",
"iw5_mp7"
};
public static string[] _arList = new[]
{
"iw5_ak47",
"iw5_m16",
"iw5_m4",
"iw5_fad",
"iw5_acr",
"iw5_type95",
"iw5_mk14",
"iw5_scar",
"iw5_g36c",
"iw5_cm901"
};
public static string[] _launcherList = new[]
{
"rpg",
"iw5_smaw",
"xm25"
};
public static string[] _sniperList = new[]
{
"iw5_dragunov",
"iw5_msr",
"iw5_barrett",
"iw5_rsass",
"iw5_as50",
"iw5_l96a1",
"iw5_ksg"
};
public static string[] _shotgunList = new[]
{
"iw5_1887",
"iw5_striker",
"iw5_aa12",
"iw5_usas12",
"iw5_spas12"
};
public static string[] _lmgList = new[]
{
"iw5_m60",
"iw5_mk46",
"iw5_pecheneg",
"iw5_sa80",
"iw5_mg36",
};
public static string[] _camoList = new[]
{
"None",
"Classic",
"Snow",
"Multicam",
"Digital",
"Hex",
"Choco",
"Snake",
"Blue",
"Red",
"Autumn",
"Gold",
"Marine"
};
}
}
/*
* Weapons: iw5_usp45, iw5_mp412, iw5_44magnum, iw5_deserteagle, iw5_p99, iw5_fnfiveseven,
* iw5_acr, iw5_type95, iw5_m4, iw5_ak47, iw5_m16, iw5_mk14, iw5_g36c, iw5_scar, iw5_fad, iw5_cm901,
* iw5_mp5, iw5_m9, iw5_p90, iw5_pp90m1, iw5_ump45, iw5_mp7, iw5_fmg9, iw5_g18, iw5_mp9, iw5_skorpion,
* iw5_spas12, iw5_aa12, iw5_striker, iw5_1887, iw5_usas12, iw5_ksg, iw5_m60, iw5_mk46, iw5_pecheneg,
* iw5_sa80, iw5_mg36, iw5_barrett, iw5_msr, iw5_rsass, iw5_dragunov, iw5_as50, iw5_l96a1, rpg, javelin,
* stinger, iw5_smaw, m320, riotshield, xm25, iw5_m60jugg_mp
* Attachments:
* reflex, acog, grip, akimbo, thermal, shotgun, heartbeat, xmags, rof, eotech, tactical, vzscope, gl,
* gp25, m320, silencer, silencer02, silencer03, hamrhybrid, hybrid
* Red Dots: (referenced as numbers 0-5 and if none specefied default dot)
* Target Dot, Delta, U-Dot, Mil-Dot, Omega, Lambada
* Camos: (referenced as numbers 0-13)
* None, Classic, Snow, Multicam, Digital, Hex, Choco, Snake, Blue, Red, Autumn, Gold, Marine
* Tactical:
* flash_grenade_mp, concussion_grenade_mp, specialty_scrambler, emp_grenade_mp, smoke_grenade_mp,
* trophy_mp, specialty_tacticalinsertion, specialty_portable_radar
* Lethal:
* bouncingbetty_mp, frag_grenade_mp, semtex_mp, throwingknife_mp, claymore_mp, c4_mp
* Killstreaks:
* uav, airdrop_assault, ims, predator_missile, airdrop_sentry_minigun, precision_airstrike, helicopter,
* littlebird_flock, littlebird_support, remote_mortar, airdrop_remote_tank, ac130, helicopter_flares,
* airdrop_juggernaut, osprey_gunner
* uav_support, counter_uav, deployable_vest, sam_turret, remote_uav, airdrop_trap, triple_uav,
* remote_mg_turret, emp, stealth_airstrike, airdrop_juggernaut_recon, escort_airdrop
* specialty_longersprint_ks, specialty_fastreload_ks, specialty_scavenger_ks, specialty_blindeye_ks,
* specialty_paint_ks, specialty_hardline_ks, specialty_coldblooded_ks, specialty_quickdraw_ks,
* _specialty_blastshield_ks, specialty_detectexplosive_ks, specialty_autospot_ks,
* specialty_bulletaccuracy_ks, specialty_quieter_ks, specialty_stalker_ks
* Deathstreaks:
* specialty_juiced, specialty_revenge, specialty_finalstand, specialty_grenadepulldeath,
* specialty_c4death, specialty_stopping_power
* Perks:
* specialty_paint, specialty_fastreload, specialty_blindeye, specialty_longersprint, specialty_scavenger
* specialty_quickdraw, _specialty_blastshield, specialty_hardline, specialty_coldblooded,
* specialty_twoprimaries specialty_autospot, specialty_stalker, specialty_detectexplosive,
* specialty_bulletaccuracy, specialty_quieter
* Perks Pro:
* specialty_fastmantle *Extreme Conditoning Pro, specialty_quickswap *sleight of hand Pro*, specialty_extraammo *scavenger pro*, specialty_fasterlockon *Blind Eye Pro Part 1*, specialty_armorpiercing *Blind Eye Pro part 2*, specialty_paint_pro *Recon Pro*,
* specialty_rollover *Hardline Pro Part 1*, specialty_assists *Hardline Pro part 2*, specialty_spygame *Assassin Pro Part 1*, specialty_empimmune *Assassin Pro Part 2*, specialty_fastoffhand *Quickdraw Pro*, specialty_overkillpro *Overkill Pro duh*, specialty_stun_resistance *Blastshield Pro*
* specialty_holdbreath *Marksman pro*, specialty_selectivehearing *Sitrep Pro*, specialty_fastsprintrecovery *Steady Aim Pro*, specialty_falldamage *Dead Silence Pro*, specialty_delaymine *Stalker Pro*
* Proficiencies:
* specialty_marksman, specialty_bulletpenetration, specialty_bling, specialty_sharp_focus,
* specialty_holdbreathwhileads, specialty_reducedsway, specialty_longerrange, specialty_fastermelee,
* specialty_lightweight, specialty_moredamage
*/
How do I create this script?