#include <amxmodx>
#include <hamsandwich>
#include <fun>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <xs>
#include <dhudmessage>
#define PLUGIN "Zombie: Rohanva"
#define VERSION "2.3"
#define AUTHOR "forditotta:BBHUNTERR"
#define COUNTDOWN_TIME 10
#define SPECIAL_ZOMBIE_ROUNDS 7
//#define KNOCKBACK_POWER_EXTRA 50.0
// Mind. 3. játékos 1 zombi
#define ZOMBIE_RATIO 3
new const Float:HUD_Y = 0.30
new const Float:HUD_X = -1.0
new g_iCountDown
new g_iSpecialRound
#define ZOMBIE_HEALTH 5000
#define HUMAN_HEALTH 100
#define ZOMBIE_OTHER_HEALTH 500000
const TASKID_SHOWHUD = 1857165
const TASKID_COUNTDOWN = 1515515
new const PREFIX[] = "!g[Zombie: Rohanva]"
new const INFO_SND[] = "zombie_ontherun/info_msg.wav"
new const ZOMBIE_MODEL[] = "zombie_new"
new const ZOMBIE_OTHER_MODEL[] = "zombie_boss3"
new zr_gamename
new const ROUND_END[] = "zombie_ontherun/round_end.wav"
new g_iAllowRespawn
new g_iZombieClass[33], g_hZombieClassesMenu
new g_iHumanClass[33], g_hHumanClassesMenu
#define DEFAULT_ZOMBIE_CLASS 0
#define DEFAULT_HUMAN_CLASS 0 // 0 sorban jelent első egyet
// A fegyverek Knockback Power értékei
// Feljegyzés: a negatív értékek knockbackhatalmat a fegyverhez fognak megbénítani
new Float:kb_weapon_power[] =
{
-1.0, // ---
2.4, // P228
-1.0, // ---
6.5, // SCOUT
-1.0, // ---
8.0, // XM1014
-1.0, // ---
2.3, // MAC10
5.0, // AUG
-1.0, // ---
2.4, // ELITE
2.0, // FIVESEVEN
2.4, // UMP45
5.3, // SG550
5.5, // GALIL
5.5, // FAMAS
2.2, // USP
2.0, // GLOCK18
10.0, // AWP
2.5, // MP5NAVY
5.2, // M249
8.0, // M3
5.0, // M4A1
2.4, // TMP
6.5, // G3SG1
-1.0, // ---
5.3, // DEAGLE
5.0, // SG552
6.0, // AK47
-1.0, // ---
2.0 // P90
}
new cvar_knockback_damage, cvar_knockback_power
new cvar_knockback_zvel, cvar_knockback_ducking, cvar_knockback_distance
new gMsgIdScreenShake
new g_iRounds
enum _:CLASS_STUFF
{
CLASS_NAME[35], CLASS_INFO[35], CLASS_MODEL[60], CLASS_HP, Float:CLASS_SPEED,
Float:CLASS_GRAVITY, Float:CLASS_KNOCKBACK
}
new const g_szZombieClassesStuff[][CLASS_STUFF] = {
{ "Klasszikus Zombie", "=Balanced=", "zombie_new", 1800, 250.0, 1.0, 1.0 },
{ "Anya Zombie", "+HP -Speed +Knockback", "motherzombie", 200, 250.0, 1.0, 0.52 },
{ "Fedezet Zombie", "-HP -Speed ++Hide", "halfzombie", 1500, 250.0, 1.0, 0.52 },
{ "Gyors Zombie", "-HP ++Speed +Knockback", "fastzombie", 1500, 270.0, 1.0, 0.52}
}
new const g_szHumanClassesStuff[][CLASS_STUFF] = {
{ "Normal Ember", "=Balanced=", "guerilla", 150, 190.0, 1.0, 1.0 },
{ "Bruce Lee", "+HP -Speed +Knockback", "arctic", 150, 150.0, 1.0, 0.52 },
{ "Zombie ölő", "-HP -Speed ++Hide", "gsg9", 150, 150.0, 1.0, 0.52 },
{ "James Bond", "-HP ++Speed +Knockback", "gign", 200, 200.0, 1.0, 0.52}
}
public plugin_precache()
{
server_cmd("mp_freezetime 0")
server_cmd("mp_roundtime 999")
server_cmd("mp_startmoney 16000")
server_cmd("mp_limitteams 0")
server_cmd("mp_autoteambalance 0")
server_cmd("mp_friendlyfire 0")
server_cmd("mp_buytime 9999")
server_cmd("mp_flashlight 1")
server_cmd("sv_skyname 3dm747")
server_cmd("humans_join_team CT")
precache_sound(INFO_SND)
precache_sound(ROUND_END)
precache_sound( "fvox/tiz.wav" )
precache_sound( "fvox/kilenc.wav" )
precache_sound( "fvox/nyolc.wav" )
precache_sound( "fvox/het.wav" )
precache_sound( "fvox/hat.wav" )
precache_sound( "fvox/ot.wav" )
precache_sound( "fvox/negy.wav" )
precache_sound( "fvox/harom.wav" )
precache_sound( "fvox/ketto.wav" )
precache_sound( "fvox/egy.wav" )
new szFile[60]
new szStuff[][] = { "bk" , "dn", "up", "lf", "rt", "ft" }
new szSkyName[] = "3dm747"
for(new i; i < sizeof(szStuff); i++)
{
formatex(szFile, charsmax(szFile), "gfx/env/%s%s.tga", szSkyName, szStuff[i])
precache_generic(szFile);
}
formatex(szFile, charsmax(szFile), "models/player/%s/%s.mdl", ZOMBIE_MODEL, ZOMBIE_MODEL);
precache_model(szFile);
formatex(szFile, charsmax(szFile), "models/player/%s/%s.mdl", ZOMBIE_OTHER_MODEL, ZOMBIE_OTHER_MODEL);
precache_model(szFile);
for(new i; i < sizeof(g_szHumanClassesStuff); i++)
{
formatex(szFile, charsmax(szFile), "models/player/%s/%s.mdl", g_szHumanClassesStuff[i][CLASS_MODEL], g_szHumanClassesStuff[i][CLASS_MODEL]);
precache_model(szFile);
}
for(new i; i < sizeof(g_szZombieClassesStuff); i++)
{
formatex(szFile, charsmax(szFile), "models/player/%s/%s.mdl", g_szZombieClassesStuff[i][CLASS_MODEL], g_szZombieClassesStuff[i][CLASS_MODEL]);
precache_model(szFile);
}
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("HLTV","Ujkör","a","1=0","2=0")
register_logevent("RoundStart",2,"1=Round_Start")
register_logevent("RoundEnd",2,"1=Round_End")
zr_gamename = register_cvar( "zr_gamename", "Zombie: Rohanva" );
register_forward( FM_GetGameDescription, "GameDesc" );
register_clcmd("say /zclass", "cmd_chooseclass");
register_clcmd("chooseteam","cmd_chooseteam")
register_event("TextMsg","ResetRounds","a","2=#Game_Commencing","2=#Game_will_restart_in")
register_impulse( 201,"cmd_impulse")
RegisterHam(Ham_TakeDamage, "player", "fw_Infect_On_TakeDamage", 0);
RegisterHam(Ham_Spawn, "player", "fw_Spawn", 1)
RegisterHam(Ham_Killed, "player", "fw_Megolt", 1);
register_touch("weaponbox", "player", "fw_WeaponPickUp");
register_touch("armoury_entity", "player", "fw_WeaponPickUp");
RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Post", 1)
cvar_knockback_damage = register_cvar("knockback_ka'r", "1")
cvar_knockback_power = register_cvar("knockback_hatalom", "1")
cvar_knockback_zvel = register_cvar("knockback_zvel", "0")
cvar_knockback_ducking = register_cvar("knockback_loko", "0.25")
cvar_knockback_distance = register_cvar("knockback_tavolsag", "500")
gMsgIdScreenShake = get_user_msgid("ScreenShake");
BuildMenus()
}
public cmd_chooseclass(id)
{
switch(cs_get_user_team(id))
{
case CS_TEAM_CT: menu_display(id, g_hHumanClassesMenu);
case CS_TEAM_T: menu_display(id, g_hZombieClassesMenu);
}
return PLUGIN_HANDLED;
}
public client_putinserver(id)
{
g_iZombieClass[id] = DEFAULT_ZOMBIE_CLASS;
g_iHumanClass[id] = DEFAULT_HUMAN_CLASS;
}
BuildMenus()
{
g_hZombieClassesMenu = menu_create("Válassz Zombit", "ZombieClassHandler");
new iZombieCallBack = menu_makecallback("ClassCallBack")
new szItemName[60], i
for(i = 0; i < sizeof(g_szZombieClassesStuff); i++)
{
formatex(szItemName, charsmax(szItemName), "%s \y(%s)", g_szZombieClassesStuff[i][CLASS_NAME], g_szZombieClassesStuff[i][CLASS_INFO])
menu_additem(g_hZombieClassesMenu, szItemName, .callback = iZombieCallBack)
}
g_hHumanClassesMenu = menu_create( "Válassz embert", "HumanClassHandler");
for(i = 0; i < sizeof(g_szHumanClassesStuff); i++)
{
formatex(szItemName, charsmax(szItemName), "%s \y(%s)", g_szHumanClassesStuff[i][CLASS_NAME], g_szHumanClassesStuff[i][CLASS_INFO])
menu_additem(g_hHumanClassesMenu, szItemName, .callback = iZombieCallBack)
}
}
public ClassCallBack(id, menu, item)
{
switch(cs_get_user_team(id))
{
case CS_TEAM_T:
{
if(g_iZombieClass[id] == item)
{
return ITEM_DISABLED;
}
}
case CS_TEAM_CT:
{
if(g_iHumanClass[id] == item)
{
return ITEM_DISABLED;
}
}
}
return ITEM_ENABLED;
}
public HumanClassHandler(id, menu, item)
{
if(item < 0)
{
return;
}
g_iHumanClass[id] = item;
print_color(id, "Te ezt választottad: %s", g_szHumanClassesStuff[item][CLASS_NAME]);
// print
}
public ZombieClassHandler(id, menu, item)
{
if(item < 0)
{
return;
}
g_iZombieClass[id] = item;
// print
print_color(id, "Te ezt választottad: %s", g_szZombieClassesStuff[item][CLASS_NAME]);
}
public NewRound()
{
set_task(1.0,"Message_Welcome",0)
g_iAllowRespawn = 1
}
public GameDesc( ) {
static gamename[32];
get_pcvar_string( zr_gamename, gamename, 31 );
forward_return( FMV_STRING, gamename );
return FMRES_SUPERCEDE;
}
public RoundStart()
{
g_iRounds++
server_print("Kör %d", g_iRounds);
if ( !(g_iRounds % SPECIAL_ZOMBIE_ROUNDS) )
{
g_iSpecialRound = 1
}
g_iCountDown = COUNTDOWN_TIME
//g_iCountDown = 0
DoCountDown()
set_task(1.0, "DoCountDown", TASKID_COUNTDOWN, _,_, "a", g_iCountDown + 1 )
}
public DoCountDown()
{
//set_dhudmessage( 0, 255, 0, 1.0, 0.30, 0, 6.0, 5.0 );
//show_dhudmessage( 0, "Fuss! Zombik mögötted!" );
//server_print("DEBUG: g_iCountDown = %d", g_iCountDown)
if (g_iCountDown == 0)
{
new iPlayers[32], iNum, iPlayer;
get_players(iPlayers, iNum, "ae", "CT");
if(!iNum)
{
return
}
if(g_iSpecialRound)
{
iPlayer = GetZombieId()
if(iPlayer)
{
//client_print(0, print_chat, "%s Zombi lettél", szName);
set_task(3.0, "SpawnZombieAgain", iPlayer);
}
}
else
{
new iNumZombies = floatround(float(iNum) / ZOMBIE_RATIO)
server_print("iNumZombies = %d ... iNum = %d", iNumZombies, iNum)
while(iNumZombies)
{
iPlayer = GetZombieId()
if(iPlayer)
{
//client_print(0, print_chat, "%s Zombi lettél", szName);
set_task(3.0, "SpawnZombieAgain", iPlayer);
}
--iNumZombies
}
}
client_cmd(0, "spk ^"%s^"", INFO_SND);
set_dhudmessage( 0, 255, 0, HUD_X, HUD_Y, 0, 6.0, 3.0, 0.1, 0.0)
show_dhudmessage(0, "Zombikat bocsátottak ki!");
}
else
{
if( 1 <= g_iCountDown <= 10)
{
static szSpk[ 10 ][ ] = { "fvox/egy.wav", "fvox/ketto.wav", "fvox/harom.wav", "fvox/negy.wav",
"fvox/ot.wav", "fvox/hat.wav", "fvox/het.wav", "fvox/nyolc.wav",
"fvox/kilenc.wav", "fvox/tiz.wav" }
emit_sound( 0, CHAN_VOICE, szSpk[ g_iCountDown - 1 ], 1.0, ATTN_NORM, 0, PITCH_NORM )
}
set_dhudmessage( 0, 255, 0, HUD_X, HUD_Y, 0, 6.0, 0.1 );
show_dhudmessage(0,"%i second%s Múlva zombi fertőzés", g_iCountDown, g_iCountDown > 1 ? "s" : "")
--g_iCountDown;
}
}
public RoundEnd()
{
if(g_iSpecialRound)
{
g_iSpecialRound = 0
}
g_iAllowRespawn = 0
new iPlayers[32], iNumber
get_players(iPlayers, iNumber, "e", "TERRORIST")
for(new i; i <iNumber; i++)
{
cs_set_user_team(iPlayers[i],CS_TEAM_CT)
cs_reset_user_model(iPlayers[i])
}
client_cmd(0, "spk ^"%s^"", ROUND_END)
}
public ResetRounds()
{
g_iRounds = 0;
RoundEnd();
}
// Előre támadó pozíciót nyomoz ki
public fw_TraceAttack_Post(victim, attacker, Float:damage, Float:direction[3], tracehandle, damage_type)
{
if(g_iSpecialRound)
{
return;
}
// Nem játékosi kár vagy önkár
if (victim == attacker || !is_user_alive(attacker))
{
return;
}
// Áldozat van nem zombi vagy támadó nem emberi
if (cs_get_user_team(victim) != CS_TEAM_T || cs_get_user_team(attacker) == CS_TEAM_T)
{
return;
}
// Nem golyókár
if (!(damage_type & DMG_BULLET))
{
return;
}
// Knockback csak ha a kár kész áldozat
if (damage <= 0.0 || GetHamReturnStatus() == HAM_SUPERCEDE || get_tr2(tracehandle, TR_pHit) != victim)
{
return;
}
// Az áldozat egy guggolásállamban van
new ducking = pev(victim, pev_flags) & (FL_DUCKING | FL_ONGROUND) == (FL_DUCKING | FL_ONGROUND)
// Zombi knockback mikor lökő mozgássérült
if (ducking && get_pcvar_float(cvar_knockback_ducking) == 0.0)
{
return;
}
// Távolságot a játékosok között kap
static origin1[3], origin2[3]
get_user_origin(victim, origin1)
get_user_origin(attacker, origin2)
// A Max távolság kiemelkedett
if (get_distance(origin1, origin2) > get_pcvar_num(cvar_knockback_distance))
{
return ;
}
// Az áldozat sebességet kap
static Float:velocity[3]
pev(victim, pev_velocity, velocity)
// Knockbackszámításon használ kárt
if (get_pcvar_num(cvar_knockback_damage))
xs_vec_mul_scalar(direction, damage, direction)
// A támadó kap fegyvert
new attacker_weapon = get_user_weapon(attacker)
// Knockback számításon használ fegyverhatalmat
if (get_pcvar_num(cvar_knockback_power) && kb_weapon_power[attacker_weapon] > 0.0)
xs_vec_mul_scalar(direction, kb_weapon_power[attacker_weapon], direction)
// muwahahahaha
//xs_vec_mul_scalar(direction, KNOCKBACK_POWER_EXTRA, direction);
// Lökő knockback multiplikátort alkalmaz
if (ducking)
xs_vec_mul_scalar(direction, get_pcvar_float(cvar_knockback_ducking), direction)
// Összaedja az új vektort
xs_vec_add(velocity, direction, direction)
// A knockback szintén függőleges sebességre hat
if (!get_pcvar_num(cvar_knockback_zvel))
direction[2] = velocity[2]
server_print("Set Stuff from %0.2f %0.2f %0.2f", velocity[0], velocity[1], velocity[2]);
server_print("Set Stuff to %0.2f %0.2f %0.2f", direction[0], direction[1], direction[2]);
// Beállította a knockback'd áldozat sebességét
set_pev(victim, pev_velocity, direction)
}
public fw_Killed(id)
{
if(!g_iAllowRespawn)
{
return;
}
if(cs_get_user_team(id) == CS_TEAM_T)
{
set_task(3.0, "ReSpawnZombie", id)
}
}
public ReSpawnZombie(id)
{
if(!g_iAllowRespawn)
{
return;
}
if(is_user_alive(id) || !is_user_connected(id))
{
return;
}
ExecuteHamB(Ham_CS_RoundRespawn, id);
}
public fw_Infect_On_TakeDamage(iVictim, iAttacker)
{
// Ha áldozat nem ember vagy támadó nem zombi
// 97 walla nseet is-user_connected
if(g_iSpecialRound)
{
return;
}
if(!is_user_connected(iAttacker))
{
return;
}
if(cs_get_user_team(iVictim) == CS_TEAM_T || cs_get_user_team(iAttacker) != CS_TEAM_T)
{
return;
}
new iPlayers[32], iNum
get_players(iPlayers, iNum, "ae", "CT");
if(iNum == 1)
{
return;
}
DoZombieStuffOnHim(iVictim, 1);
}
public SpawnZombieAgain(id)
{
if(!is_user_alive(id))
{
id = GetZombieId()
if(id)
{
cs_set_user_team(id, CS_TEAM_T);
ExecuteHamB(Ham_CS_RoundRespawn, id);
}
return;
}
cs_set_user_team(id, CS_TEAM_T);
ExecuteHamB(Ham_CS_RoundRespawn, id);
}
public fw_Spawn(id)
{
if(!is_user_alive(id))
{
return;
}
switch(cs_get_user_team(id))
{
case CS_TEAM_T: DoZombieStuffOnHim(id);
case CS_TEAM_CT: DoHumanStuff(id);
}
}
stock DoZombieStuffOnHim(id, iChangeTeam = 0)
{
server_print("Called")
if(iChangeTeam)
{
cs_set_user_team(id, CS_TEAM_T);
}
strip_user_weapons(id);
give_item(id, "weapon_knife");
UTIL_ScreenShake(id, 3.0, 255.0, 20.0);
if(g_iSpecialRound)
{
cs_set_user_model(id, ZOMBIE_OTHER_MODEL[ random( sizeof( ZOMBIE_OTHER_MODEL ) ) ] );
set_user_health(id, ZOMBIE_OTHER_HEALTH);
set_user_gravity(id, 0.8)
print_color(id, "!nMenj egyél embert!");
}
else
{
set_user_health(id, ZOMBIE_HEALTH + g_szZombieClassesStuff[g_iZombieClass[id]][CLASS_HP]);
set_user_gravity(id, g_szZombieClassesStuff[g_iZombieClass[id]][CLASS_GRAVITY]);
set_user_maxspeed(id, g_szZombieClassesStuff[g_iZombieClass[id]][CLASS_SPEED]);
cs_set_user_model(id, g_szZombieClassesStuff[g_iZombieClass[id]][CLASS_MODEL]);
print_color(id, "!gTe !nfertőzött vagy !gMenj add tovább azt sok másik játékost ahogy csak tudsz");
}
}
DoHumanStuff(id)
{
set_user_health(id, HUMAN_HEALTH + g_szHumanClassesStuff[g_iHumanClass[id]][CLASS_HP]);
set_user_gravity(id, g_szHumanClassesStuff[g_iHumanClass[id]][CLASS_GRAVITY]);
set_user_maxspeed(id, g_szHumanClassesStuff[g_iHumanClass[id]][CLASS_SPEED]);
cs_set_user_model(id, g_szHumanClassesStuff[g_iHumanClass[id]][CLASS_MODEL]);
}
public fw_WeaponPickUp(iTouched, iToucheter)
{
if(is_user_alive(iToucheter))
{
if(cs_get_user_team(iToucheter) == CS_TEAM_T)
{
return PLUGIN_HANDLED;
}
}
return PLUGIN_CONTINUE;
}
GetZombieId()
{
new iPlayers[32], iNum;
get_players(iPlayers, iNum, "ae", "CT");
return iPlayers[random(iNum)];
}
public Message_Welcome()
{
print_color(0,"!n*** !gZombie: Rohanva by. %s !n***", AUTHOR)
print_color(0,"!n*** !gNyomd meg az M-et a játékmenüért !n***")
}
public cmd_chooseteam(id)
{
chooseteammenu(id)
return PLUGIN_HANDLED
}
public chooseteammenu(id)
{
new menu = menu_create("Játék menü", "gameplaymenuhandler")
menu_additem(menu, "Játékleírás")
menu_additem(menu, "Segítség")
menu_additem(menu, "Hogyan játsszunk")
menu_display(id, menu, 0)
}
public gameplaymenuhandler(id, menu, item)
{
switch(item)
{
case 0:
{
show_motd(id, "jatekleiras.txt", "Játékleírás")
}
case 1:
{
show_motd(id, "segitseg.txt", "Segítség")
}
case 2:
{
show_motd(id, "jateksegitseg.txt", "Hogyan játsszunk")
}
}
menu_destroy(menu)
return PLUGIN_HANDLED
}
// M9roog
stock UTIL_ScreenShake(id, Float:flShakeDuration, Float:flShakeAmplitude, Float:flShakeFrequency)
{
static iShakeDuration, iShakeAmplitude, iShakeFrequency
iShakeDuration = __FixedUnsigned16(flShakeDuration, 1<<12)
iShakeAmplitude = __FixedUnsigned16(flShakeAmplitude, 1<<12)
iShakeFrequency = __FixedUnsigned16(flShakeFrequency, 1<<8)
message_begin(MSG_ONE, gMsgIdScreenShake, .player = id)
write_short(iShakeAmplitude)
write_short(iShakeDuration)
write_short(iShakeFrequency)
message_end()
}
stock __FixedUnsigned16(Float:flValue, iScale)
{
new iOutput;
iOutput = floatround(flValue * iScale)
if ( iOutput < 0 )
iOutput = 0
if ( iOutput > 0xFFFF )
iOutput = 0xFFFF
return iOutput
}
stock print_color(const id, const input[], any:...)
{
new count = 1, players[32]
static msg[191], len
len = formatex(msg, charsmax(msg), "%s ", PREFIX);
vformat(msg[len], 190 - len, input, 3)
replace_all(msg, 190, "!g", "^4") // Zöldszín
replace_all(msg, 190, "!n", "^1") // Alapszín
replace_all(msg, 190, "!t", "^3") // Csapatszín
if (id) players[0] = id; else get_players(players, count, "ch")
for (new i = 0; i < count; i++)
{
if (is_user_connected(players[i]))
{
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
write_byte(players[i]);
write_string(msg);
message_end();
}
}
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1053\\ f0\\ fs16 \n\\ par }
*/