#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>
#define PLUGIN "Plugin"
#define VERSION "1.0"
#define AUTHOR "Author"
#define PEV_PDATA_SAFE 2
#define OFFSET_TEAM 114
#define OFFSET_DEFUSE_PLANT 193
#define HAS_DEFUSE_KIT (1<<16)
#define OFFSET_INTERNALMODEL 126
#define NEMESIS_MODEL "nemesisek"
// Cvar Pointers
new gCvarNemesisRounds, gCvarNemesisHealth, gCvarNemesisGravity, gCvarNemesisSpeed;
// Variables
new gNemesisIndex = 0; // ID Nemesisa
new gRoundsCounter = 1; // Licznik rund
new gMaxPlayers;
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
gCvarNemesisRounds = register_cvar("nemesis_runds", "5") ;
gCvarNemesisHealth = register_cvar("nemesis_health", "50000.0");
gCvarNemesisGravity = register_cvar("nemesis_gravity", "100.0");
gCvarNemesisSpeed = register_cvar("nemesis_speed", "400.0");
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0");
register_event("CurWeapon","Event_CurWeapon","be","1=1")
register_logevent("Logevent_RoundStart", 2, "1=Round_Start")
RegisterHam(Ham_TakeDamage, "player", "fwHamTakeDamage");
gMaxPlayers = get_maxplayers()
}
public plugin_cfg()
{
server_cmd("sv_maxspeed 500");
}
public plugin_precache()
{
new model[128];
format(model,sizeof model,"player/%s/%s.mdl",NEMESIS_MODEL,NEMESIS_MODEL)
precache_model(model);
precache_sound("muza_nemesisa/1.wav");
precache_sound("muza_nemesisa/2.wav");
}
public fwHamTakeDamage(victim, idinflictor, attacker, Float:damage, damagebits)
{
// Jezeli gracz to nie nemesis albo jego bron jest inna niz noz przerywa funkcje
if(!is_user_nemesis(attacker) || get_user_weapon(attacker) != CSW_KNIFE)
return;
SetHamParamFloat(4, 250.0)
}
public Event_NewRound()
{
gRoundsCounter++;
}
public Event_CurWeapon(id)
{
if(!is_user_nemesis(id))
return;
set_pev(id,pev_maxspeed,float(get_pcvar_num(gCvarNemesisSpeed)))
}
public Logevent_RoundStart()
{
if(gRoundsCounter % get_pcvar_num(gCvarNemesisRounds) // Jezeli reszta dzielenia liczby rund przez wartosc cvara jest
&& gRoundsCounter ) // inna niz 0 przestanie wykonywac funkcje np. 6/5 reszta z dzielenia
return; // daje 1 i event sie nie wykona bo to nie jest co 5 runda
new temp;
// Losuje gracza, jeżeli jest nieżywy/niepolączony robi to az do skutku
do
temp = random_num(1,gMaxPlayers);
while(!is_user_alive(temp));
// Jezeli wylosowany gracz jest w CT przenosi go do TT
if(get_user_team(temp) == 1)
fm_set_user_team(temp,2);
gNemesisIndex = temp;
cs_set_user_model(gNemesisIndex,NEMESIS_MODEL);
set_pev(gNemesisIndex,pev_maxspeed,get_pcvar_float(gCvarNemesisSpeed));
set_pev(gNemesisIndex,pev_gravity,(get_pcvar_float(gCvarNemesisGravity)/800));
set_pev(gNemesisIndex,pev_health,get_pcvar_float(gCvarNemesisHealth));
// Przenosi reszte TT do CT
for(new i=1;i<gMaxPlayers;i++)
{
if(!is_user_alive(i)
|| is_user_nemesis(i)
|| get_user_team(i) == 1)
continue;
fm_set_user_team(i,1);
}
}
// Zwraca true jezeli gracz to nemesis, jezeli nie to false
stock bool:is_user_nemesis(id)
{
if(gNemesisIndex == id)
return true;
return false;
}
stock fm_set_user_team(id, team)
{
if(!(1 <= id <= gMaxPlayers) || pev_valid(id) != PEV_PDATA_SAFE)
{
return 0
}
switch(team)
{
case 1:
{
new iDefuser = get_pdata_int(id, OFFSET_DEFUSE_PLANT)
if(iDefuser & HAS_DEFUSE_KIT)
{
iDefuser -= HAS_DEFUSE_KIT
set_pdata_int(id, OFFSET_DEFUSE_PLANT, iDefuser)
}
set_pdata_int(id, OFFSET_TEAM, 1)
}
case 2:
{
if(pev(id, pev_weapons) & (1<<CSW_C4))
{
engclient_cmd(id, "drop", "weapon_c4")
}
set_pdata_int(id, OFFSET_TEAM, 2)
}
}
dllfunc(DLLFunc_ClientUserInfoChanged, id, engfunc(EngFunc_GetInfoKeyBuffer, id))
return 1
}