/*
Stay on Feet Mod 1.63
DeRoiD
Steam: deroidocska
ChangeLog:
- 1.00
* Board Entitys
* Maps
- 1.10
* Shop
* Hud
* Survivors
* Cvars
- 1.21
* Plugin publication (hlmod.hu)
- 1.23
* Fix Bugs
* Fix Maps
- 1.41
* Revive fix
* Board colors
* Skybox
- 1.63
* Fix Bugs
* Rewriting (Hungarian -> English)
*/
#include <amxmodx>
#include <engine>
#include <fun>
#include <fakemeta>
#include <hamsandwich>
#include <dhudmessage>
#include <cstrike>
#define PLUGIN "Stay on Feet!"
#define VERSION "1.63"
#define AUTHOR "DeRoiD"
#define BoardID 20150307
#define MAX 200
#define MapFile "addons/amxmodx/configs/stayonfeet_maps.ini"
#pragma semicolon 1
new bool:Game, bool:Start, Second, Survivors[2];
new Alive[33], Joined[33], Dollar[33], Gravity[33], Speed[33];
new MaxBoards, PreviousBoard[MAX][32], RemovedBoards;
new Bot;
new Cvars[8], bool:On;
new MsgMoney, RestartCvar;
new const BoardsColors[][] =
{
"0 255 0", "0 0 255", "255 0 0", "255 255 0",
"255 0 255", "255 170 0", "0 127 255", "120 120 120",
"0 255 127", "0 0 0", "255 255 255", "165 128 89"
};
new const SkyBox[][] =
{
"neb1", "neb6", "neb7",
"xen8", "xen9", "xen10",
"space", "night", "doom1"
};
new const RemoveEffect[][] =
{
"stayonfeet/boing1.wav",
"stayonfeet/boing2.wav",
"stayonfeet/boing3.wav"
};
new const DeathEffect[][] =
{
"stayonfeet/death1.wav",
"stayonfeet/death2.wav"
};
public plugin_precache()
{
new PrecacheNum;
for(PrecacheNum = 0; PrecacheNum < sizeof RemoveEffect; PrecacheNum++)
{
precache_sound(RemoveEffect[PrecacheNum]);
}
for(PrecacheNum = 0; PrecacheNum < sizeof DeathEffect; PrecacheNum++)
{
precache_sound(DeathEffect[PrecacheNum]);
}
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_cvar("Stay on Feet!", VERSION, FCVAR_SERVER);
register_dictionary("stayonfeet.txt");
new MapName[32];
get_mapname(MapName, charsmax(MapName));
if(contain(MapName, "stayonfeet_") != -1)
{
On = true;
log_amx("||------------------------------||");
log_amx("||-Stay On Feet! Author: DeRoiD-||");
log_amx("||------Steam: deroidocska------||");
log_amx("||------------------------------||");
}
if(On)
{
register_logevent("RoundEnd", 2, "1=Round_End");
register_logevent("RoundStart", 2, "1=Round_Start");
register_logevent("RoundEnd", 2, "0=World triggered", "1&Restart_Round_");
register_logevent("RoundEnd", 2, "0=World triggered", "1=Game_Commencing");
register_event("Money", "Money", "b");
register_forward(FM_Touch, "Touch");
RegisterHam(Ham_Spawn, "player", "Respawn", 1);
RegisterHam(Ham_Item_PreFrame, "player", "CheckSpeed", 1);
register_message(get_user_msgid("ShowMenu"), "MenuBlock");
register_message(get_user_msgid("VGUIMenu"), "MenuBlock");
register_clcmd("jointeam", "JoinBlock");
register_clcmd("joinclass", "JoinBlock");
register_clcmd("say /bolt", "Shop");
register_clcmd("say_team /bolt", "Shop");
register_clcmd("say /shop", "Shop");
register_clcmd("say_team /shop", "Shop");
set_task(5.0, "CheckGame", BoardID+4, _, _, "b");
set_task(10.0, "Restart");
Cvars[0] = register_cvar("RemoveTime", "1.5");
Cvars[1] = register_cvar("Dollars", "3");
Cvars[2] = register_cvar("Gravity", "0.6");
Cvars[3] = register_cvar("Speed", "320.0");
Cvars[4] = register_cvar("NoclipTime", "5.0");
Cvars[5] = register_cvar("StartTime", "10");
Cvars[6] = register_cvar("Bot", "1");
Cvars[7] = register_cvar("BoardColor", "1");
MsgMoney = get_user_msgid("Money");
RestartCvar = get_cvar_pointer("sv_restart");
MapSettings();
if(get_pcvar_num(Cvars[6]) == 1)
{
CreateBot();
}
}
}
public CheckSpeed(id)
{
if(is_user_alive(id) && Speed[id] == 1)
{
set_user_maxspeed(id, get_pcvar_float(Cvars[3]));
}
}
public Shop(id)
{
new String[64];
formatex(String, charsmax(String), "%L", LANG_SERVER, "SHOPTITLE", Dollar[id]);
new menu = menu_create(String, "ShopMenu" );
formatex(String, charsmax(String), "%L", LANG_SERVER, "SHOP1");
menu_additem(menu, String, "1");
formatex(String, charsmax(String), "%L", LANG_SERVER, "SHOP2");
menu_additem(menu, String, "2");
formatex(String, charsmax(String), "%L", LANG_SERVER, "SHOP3");
menu_additem(menu, String, "3");
formatex(String, charsmax(String), "%L", LANG_SERVER, "SHOP4");
menu_setprop(menu, MPROP_EXITNAME, String);
menu_display(id, menu);
}
public ShopMenu(id, menu, Key)
{
Key++;
set_dhudmessage(0, 255, 255, -1.0, 0.70, 0, 6.0, 3.0);
if(Key == 1)
{
if(Dollar[id] >= 3)
{
Gravity[id] = 1;
set_user_gravity(id, Float:get_pcvar_float(Cvars[2]));
Dollar[id] -= 3;
cs_set_user_money(id, Dollar[id]);
show_dhudmessage(id, "%L", LANG_SERVER, "BUY");
}
else
{
show_dhudmessage(id, "%L", LANG_SERVER, "NOTENOUGHDOLLARS");
}
}
if(Key == 2)
{
if(Dollar[id] >= 3)
{
Speed[id] = 1;
set_user_maxspeed(id, get_pcvar_float(Cvars[3]));
Dollar[id] -= 3;
cs_set_user_money(id, Dollar[id]);
show_dhudmessage(id, "%L", LANG_SERVER, "BUY");
}
else
{
show_dhudmessage(id, "%L", LANG_SERVER, "NOTENOUGHDOLLARS");
}
}
if(Key == 3)
{
if(Dollar[id] >= 6)
{
remove_task(id);
set_task(get_pcvar_float(Cvars[4]), "NoClipOff", id);
set_user_noclip(id, 1);
Dollar[id] -= 6;
cs_set_user_money(id, Dollar[id]);
show_dhudmessage(id,"%L", LANG_SERVER, "BUY");
}
else
{
show_dhudmessage(id, "%L", LANG_SERVER, "NOTENOUGHDOLLARS");
}
}
}
public NoClipOff(id)
{
set_user_noclip(id, 0);
}
public Money(id)
{
set_pdata_int(id, 115, 0);
message_begin(MSG_ONE_UNRELIABLE, MsgMoney, _, id);
write_long(Dollar[id]);
write_byte(1);
message_end();
}
public MapSettings()
{
server_cmd("sv_skyname %s", SkyBox[random(sizeof(SkyBox))]);
if(!fopen(MapFile, "r"))
{
new Message[64];
formatex(Message, charsmax(Message),"Not found: %s", MapFile);
set_fail_state(Message);
return;
}
new File = fopen(MapFile, "rt");
new Line[256], Data[2][32], MapName[32];
while(!feof(File))
{
fgets(File, Line, 255);
if(Line[0] == ';' || strlen(Line) < 2)
continue;
parse(Line, Data[0], 31, Data[1], 31);
get_mapname(MapName, charsmax(MapName));
if(equal(Data[0], MapName))
{
MaxBoards = str_to_num(Data[1]);
break;
}
}
fclose(File);
LoadBoards();
}
public JoinBlock(id)
{
if(Joined[id] == 1 && On)
{
return PLUGIN_HANDLED;
}
return PLUGIN_HANDLED;
}
public MenuBlock()
{
return PLUGIN_HANDLED;
}
public CreateBot() {
Bot = engfunc(EngFunc_CreateFakeClient, "Stay On Feet!");
dllfunc(MetaFunc_CallGameEntity, "player", Bot);
set_pev(Bot, pev_flags, FL_CLIENT);
set_pev(Bot, pev_model, "");
set_pev(Bot, pev_viewmodel2, "");
set_pev(Bot, pev_modelindex, 0);
set_pev(Bot, pev_renderfx, kRenderFxNone);
set_pev(Bot, pev_rendermode, kRenderTransAlpha);
set_pev(Bot, pev_renderamt, 0.0);
cs_set_user_team(Bot, CS_TEAM_T);
}
public Restart()
{
RoundEnd();
set_pcvar_num(RestartCvar, 1);
new Jatekosok[32], JatekosSzam, id;
get_players(Jatekosok, JatekosSzam, "c");
for(new i; i < JatekosSzam; i++)
{
id = Jatekosok[i];
cs_set_user_money(id, Dollar[id]);
}
}
public CheckGame()
{
if(Survivors[1] > 1 && !Game && Start)
{
Restart();
}
}
public Hud()
{
new Players[32], PlayersNum, id;
get_players(Players, PlayersNum, "c");
for(new i; i < PlayersNum; i++)
{
id = Players[i];
set_hudmessage(255, 255, 255, -1.0, 0.05, 0, 1.0, 2.1);
show_hudmessage(id, "%L", LANG_SERVER, "HUD", Survivors[0], Survivors[1], MaxBoards-RemovedBoards);
}
}
public Respawn(id)
{
if(is_user_alive(id) && !is_user_bot(id) && On)
{
if(cs_get_user_team(id) == CS_TEAM_T)
cs_set_user_team(id, CS_TEAM_CT);
if(!Game)
{
Alive[id] = 1;
Survivors[0]++;
Survivors[1]++;
cs_set_user_money(id, Dollar[id]);
}
else
{
set_dhudmessage(255, 255, 255, 0.70, 0.80, 0, 6.0, 3.0);
show_dhudmessage(id, "%L", LANG_SERVER, "INGAME");
user_silentkill(id);
}
}
return PLUGIN_HANDLED;
}
public client_connect(id)
{
Alive[id] = 0;
}
public client_putinserver(id)
{
if(is_user_bot(id) || !On)
return PLUGIN_HANDLED;
Joined[id] = 0;
Dollar[id] = 25;
Gravity[id] = 0;
Speed[id] = 0;
set_task(0.1, "Join", id);
cs_set_user_money(id, Dollar[id]);
return PLUGIN_HANDLED;
}
public Join(id)
{
engclient_cmd(id, "jointeam", "2");
engclient_cmd(id, "joinclass", "5");
Joined[id] = 1;
}
public client_disconnect(id)
{
if(Alive[id] == 1)
{
Alive[id] = 0;
Survivors[0]--;
Survivors[1]--;
}
}
public LoadBoards()
{
new Num, ColorLine = -1;
for(new lNum; lNum < MaxBoards; lNum++)
{
Num++;
ColorLine++;
if(ColorLine >= sizeof(BoardsColors))
{
ColorLine = 0;
}
new BoardName[64], Board, Float:BoardColor[3], Colors[3][16];
parse(BoardsColors[ColorLine], Colors[0], 4, Colors[1], 4, Colors[2], 4);
if(get_pcvar_num(Cvars[7]) == 1)
{
BoardColor[0] = str_to_float(Colors[0]);
BoardColor[1] = str_to_float(Colors[1]);
BoardColor[2] = str_to_float(Colors[2]);
}
else
{
BoardColor[0] = random_float(1.0, 255.0);
BoardColor[1] = random_float(1.0, 255.0);
BoardColor[2] = random_float(1.0, 255.0);
}
formatex(BoardName, 63, "d%d", Num);
Board = find_ent_by_tname(-1, BoardName);
if(is_valid_ent(Board))
{
set_pev(Board, pev_solid, SOLID_BSP);
set_pev(Board, pev_rendermode, kRenderTransColor);
set_pev(Board, pev_rendercolor, Float: BoardColor[0], BoardColor[1], BoardColor[2]);
set_pev(Board, pev_renderamt, Float:{ 150.0 });
}
}
}
public Touch(Floor, id)
{
if(!is_user_alive(id))
return FMRES_IGNORED;
new FloorName[32];
pev(Floor, pev_classname, FloorName, 31);
if(equali(FloorName, "trigger_hurt"))
{
new Name[32];
get_user_name(id, Name, charsmax(Name));
set_dhudmessage(255, 255, 255, 0.70, 0.80, 0, 6.0, 3.0);
show_dhudmessage(0, "%L", LANG_SERVER, "FALLOUT", Name);
emit_sound(id, CHAN_WEAPON, DeathEffect[random(sizeof(DeathEffect))], 1.0, ATTN_NORM, 0, PITCH_NORM);
Survivors[0]--;
Alive[id] = 0;
cs_set_user_money(id, Dollar[id]);
}
return FMRES_IGNORED;
}
public BoardsReload()
{
new Num;
for(new lNum; lNum < MaxBoards; lNum++)
{
Num++;
new BoardName[64], Board;
formatex(BoardName, 63, "d%d", Num);
Board = find_ent_by_tname(-1, BoardName);
set_pev(Board, pev_solid, SOLID_BSP);
set_pev(Board, pev_rendermode, kRenderTransColor);
set_pev(Board, pev_renderamt, Float:{ 150.0 });
}
}
public RoundEnd()
{
remove_task(BoardID);
remove_task(BoardID+1);
remove_task(BoardID+2);
remove_task(BoardID+3);
Game = false;
Second = 0;
RemovedBoards = 0;
Survivors[0] = 0;
Survivors[1] = 0;
BoardsReload();
BoardsUnblock();
new Players[32], PlayersNum, id;
get_players(Players, PlayersNum, "c");
for(new i; i < PlayersNum; i++)
{
id = Players[i];
Gravity[id] = 0;
Speed[id] = 0;
cs_set_user_money(id, Dollar[id]);
}
}
public RoundStart()
{
Game = false;
Start = true;
Second = get_pcvar_num(Cvars[5]);
new Players[32], PlayersNum;
get_players(Players, PlayersNum, "c");
if(PlayersNum > 1)
{
Start = false;
Counter();
}
else
{
set_dhudmessage(0, 255, 0, -1.0, 0.20, 0, 6.0, 5.0);
show_dhudmessage(0, "%L", LANG_SERVER, "NOTENOUGHPLAYERS");
}
}
public Counter()
{
if(Second > 0)
{
Second--;
set_task(1.0, "Counter", BoardID+2);
client_print(0, print_center, "%L", LANG_SERVER, "COUNTER", Second);
}
else
{
Game = true;
remove_task(BoardID);
remove_task(BoardID+1);
remove_task(BoardID+2);
remove_task(BoardID+3);
set_task(0.1, "Removing", BoardID+3);
set_task(1.0, "Hud", BoardID+1, _, _, "b");
}
}
public BoardsUnblock()
{
new bNum;
for(new Num; Num < MaxBoards; Num++)
{
bNum++;
formatex(PreviousBoard[bNum], 31, "0");
}
}
public Removing()
{
new Num = random_num(1, MaxBoards);
if(!equal(PreviousBoard[Num], "1") && MaxBoards-1 > RemovedBoards && Game && !Start)
{
new BoardName[64], Board;
formatex(BoardName, 63, "d%d", Num);
Board = find_ent_by_tname(-1, BoardName);
set_pev(Board, pev_solid, SOLID_NOT);
set_pev(Board, pev_renderamt, Float:{ 0.0 });
formatex(PreviousBoard[Num], 31, "1");
set_task(get_pcvar_float(Cvars[0]), "Removing", BoardID+3);
emit_sound(Board, CHAN_WEAPON, RemoveEffect[random(sizeof(RemoveEffect))], 1.0, ATTN_NORM, 0, PITCH_NORM);
RemovedBoards++;
}
else if(MaxBoards-1 > RemovedBoards && !Start)
{
set_task(0.0, "Removing", BoardID+3);
}
else
{
Game = false;
new ShowSurvivors[256], SurvivorsNum;
new Players[32], PlayersNum, id;
get_players(Players, PlayersNum, "c");
for(new i; i < PlayersNum; i++)
{
id = Players[i];
if(!is_user_alive(id) || !is_user_connected(id))
continue;
SurvivorsNum++;
new Name[32];
get_user_name(id, Name, charsmax(Name));
formatex(Name, charsmax(Name), "%s ", Name);
add(ShowSurvivors, 255, Name);
user_silentkill(id);
set_user_frags(id, get_user_frags(id)+1);
cs_set_user_deaths(id, cs_get_user_deaths(id)-1);
Dollar[id] += get_pcvar_num(Cvars[1]);
cs_set_user_money(id, Dollar[id]);
}
set_dhudmessage(0, 255, 0, -1.0, 0.20, 0, 6.0, 6.0);
if(SurvivorsNum > 0)
{
show_dhudmessage(0, "%L", LANG_SERVER, "SURVIVORS", ShowSurvivors);
}
else
{
show_dhudmessage(0, "%L", LANG_SERVER, "NOSURVIVORS");
}
}
}