vzbb_mod.inc

/*
---------------------------------------------------------
   #  #  #    #===    ###    ##    #
  #    ##     #===   #      #  #    #
   #   #      #===    ###    ##    #
---------------------------------------------------------
vzbb_mod.inc
Library by <VeCo>
Edited by WaLkZ for https://amxx-bg.info/api/

<VeCo>'s Zombie BaseBuilder Mod 4.3

If you modify the code, please DO NOT change the author!
---------------------------------------------------------
Contacts:
e-mail: [email protected]
skype: veco_kn
---------------------------------------------------------
Changes log:
 -> v 1.0 = First release!
 -> v 1.1 = Fixed double user_infect_pre. The second is
	    changed to user_infect_post.
 -> v 3.0 = Defines changed to enums.
	    Added itemteam parameter in register_shop_item
	    function and TEAM_* enum.
	    Added set_user_zombie_class native.
	    Added user_uninfect native.
	    Added grab/release block forwards.
 -> v 3.4 = Added is_user_frozen_cool native.
	    Added user_freeze_cool_* forwards.
	    Added user_freeze_cool and user_unfreeze_cool
	    natives.
 -> v 3.5 = Added get_block_fun_type and set_block_fun_type
	    natives and BLOCKS_* enum.
	    Added get_deal_discount and is_deal_offer natives.
 -> v 3.8 = Added set_user_was_zombie native.
	    Added access parameters in register_zombie_class
	    and register_shop_item natives.
	    Fixed a typo.
	    Added FORWARD_CONTINUE define for the forward
	    block ability.
	    Added set_user_can_build native.
	    Added hide_barrierent and reset_barrierent natives.
	    Added update_user_hud_data forward and set_hud_cache_*
	    natives for it.
	    Added force_user_hud_data and force_weapon_menu natives.
 -> v 3.9 = Added user_uninfect_pre and user_uninfect_post forwards.
	    Added battle_phase_begin_admin forward.
	    Added fun_block_touch_pre and fun_block_touch_post forwards.
 -> v 4.0 = Added ability to block shop_item_selected forward. (and changed
	    the way Item Buy System works)
	    Added maxbuys parameter in register_shop_item and NO_MAX_BUYS
	    define for it.
	    Added restore_user_rendering native.
---------------------------------------------------------
Don't forget to visit https://amxx-bg.info/ :)
---------------------------------------------------------
*/

#if defined _vzbb_mod_included
	#endinput
#endif

#define _vzbb_mod_included

#if AMXX_VERSION_NUM >= 175
	#pragma reqlib vzbb_mod
	#if !defined AMXMODX_NOAUTOLOAD
		#pragma loadlib vzbb_mod
	#endif
#else
	#pragma library vzbb_mod
#endif

/* return ... (блокира forward) */
#define FORWARD_CONTINUE 777

/* неограничен брой пъти купуване на итем */
#define NO_MAX_BUYS 0 // 

/* Кога може да се ползва итема? */
enum
{
	USE_BATTLE = 0,
	USE_BUILD,
	USE_BOTH
}

/* Кой може да ползва итема? */
enum
{
	TEAM_ZOMBIES = 1,
	TEAM_HUMANS,
	TEAM_BOTH
}

/* Как се движи блока? */
enum
{
	BLOCK_PULL = 1,
	BLOCK_PUSH
}

/* Какъв режим се игра този рунд? */
enum
{
	MODE_NORMAL = 0,
	MODE_INFECTION
}

/* Каква граната е хвърлена? */
enum
{
	NADE_HE = 1,
	NADE_SMOKE,
	NADE_FLASH
}

/* Какъв тип забавен блок е това? */
enum
{
	BLOCKS_NORMAL = 0,
	BLOCKS_YELLOW,	// бързодвижещ се блок
	BLOCKS_BLACK,	// недвижим блок
	BLOCKS_BLUE,	// забавящ блок
	BLOCKS_RED		// запалващ блок
}

/**
* Регистрира нов зомби клас
*
* @param classname	Името на зомби класа (пример: "Test Zombie")
* @param classinfo	Кратка информация относно зомби класа (пример: "g+ s-")
* @param classmdl	Модел на зомби класа (пример: "zombie" , трябва да се намира в models/player/име/име.mdl)
* @param classclawmdl	Модел на ръцете на зомби класа (пример: "claw" , трябва да се намира в models/име.mdl)
* @param health		Кръв на зомби класа (пример: 2000)
* @param gravity	Гравитация на зомби класа (пример: 0.5) (1.0 = 800 гравитаця , 0.5 = 400 гравитация ...)
* @param speed		Скорост на зомби класа (пример: 400.0) (0.0 = нормална скорост)
* @param access		Админ достъп нужен за избиране на класа (ADMIN_ALL - за всички)
* @return 			Връща индекса на класа. (int)
*/
native register_zombie_class(const classname[], const classinfo[], const classmdl[], const classclawmdl[], health, Float:gravity, Float:speed, access)

/**
* Регистрира нов итем в shop менюто
*
* @param itemname	Името на итема (пример: "Test Item")
* @param itemcost	Цена на итема (пример: 15)
* @param itemuse	Кога да може да се използва итема? (USE_BATTLE - в бойната фаза , USE_BUILD - в строителната фаза , USE_BOTH - и в двете фази)
* @param itemteam	Кой може да купува итема? (TEAM_ZOMBIES - зомбитата , TEAM_HUMANS - хората , TEAM_BOTH - всички)
* @param access		Админ достъп нужен за купуване на итема (ADMIN_ALL - за всички)
* @param maxbuys	Колко пъти да може да се купи итемът на рунд? (NO_MAX_BUYS - неограничен брой пъти)
* @return 			Връща индекса на итема. (int)
*/
native register_shop_item(const itemname[], itemcost, itemuse, itemteam, access, maxbuys)

/**
 * Връща индекса на зомби класа на играча. (int)
 *
 * @param id		Индекс на играча
 * @return		Връща индекса на зомби класа на играча (-1 ако е Classic Zombie)
 */

native get_user_zombie_class(id)

/**
 * Задава индекса на зомби класа на играча
 *
 * @param id		Индекс на играча
 * @param classid	Индекс на зомби класа (-1 - Classic Zombie)
 *
 * @noreturn
 */

native set_user_zombie_class(id, classid)

/**
 * Връща съответна стойност, ако играчът е зомби
 *
 * @param id		Индекс на играча
 * @return		Връща true ако е зомби и false - ако не е. (bool)
 */
native is_user_zombie(id)

/**
 * Връща съответна стойност, ако играчът е човек
 *
 * @param id		Индекс на играча
 * @return		Връща true ако е човек и false - ако не е. (bool)
 */
native is_user_human(id)

/**
 * Връща стойността на кредитите на играч
 *
 * @param id		Индекс на играча
 * @return		Връща кредитите на играч. (int)
 */
native get_user_credits(id)

/**
 * Задава стойността на кредитите на играч
 *
 * @param id		Индекс на играча
 * @param credits	Стойността на кредитите, които искаме да зададем (използвайте с get_user_credits ако искате да прибавите/премахнете кредити на играч)
 *
 * @noreturn
 */
native set_user_credits(id, credits)

/**
 * Връща общия брой зомби класове, заредени в момента
 *
 * @return		Връща общия брой зомби класове, заредени в момента. (int)
 */
native get_total_zombie_classes()

/**
 * Връща общия брой shop итеми, заредени в момента
 *
 * @return		Връща общия брой shop итеми, заредени в момента. (int)
 */
native get_total_shop_items()

/**
 * Връща съответна стойност, ако играчът може да строи в бойната фаза
 *
 * @param id		Индекс на играча
 * @return		Връща true ако играчът може да строи в бойната фаза и false - ако не може. (bool)
 */

native get_user_can_build_battle(id)

/**
 * Задава стойността на играч, за да може да мести блокове и в бойната фаза (действа до стартирането на следващата бойна фаза)
 *
 * @param id		Индекс на играча
 * @param set		true : за да може да строи и false : за да не може
 *
 * @noreturn
 */
native set_user_can_build_battle(id, set)

/**
 * Връща индекс на ентитито на блока, който играчът мести в момента
 *
 * @param id		Индекс на играча
 * @return		Връща индекс на ентитито на блока, който играчът мести в момента. (int)
 */
native get_user_block_ent(id)

/**
 * Задава индекс на ентитито на блока, който играчът мести в момента
 *
 * @param id		Индекс на играча
 * @param ent		Индекс на ентитито
 *
 * @noreturn
 */
native set_user_block_ent(id, ent)

/**
 * Връща съответна стойност, ако е freezetime в момента
 *
 * @param id		Индекс на играча
 * @return		Връща true ако е и false - ако не е. (bool)
 */
native is_freezetime()

/**
 * Връща оставащото време на строителната фаза
 *
 * @param id		Индекс на играча
 * @return		Връща оставащото време на строителната фаза в секунди. (int)
 */
native get_build_phase_remaining_time()

/**
 * Връща съответна стойност, ако играчите могат да строят (ако в момента е строителната фаза)
 *
 * @param id		Индекс на играча
 * @return		Връща true ако могат и false - ако не могат. (bool)
 */
native user_can_build()

/**
 * Задава дали играчите могат да строят (дали в момента е строителна фаза)
 *
 * @param build		true - ако могат, false - ако не могат
 *
 * @noreturn
 */
native set_user_can_build(build)

/**
 * Връща съответна стойност на режима на игра в момента
 *
 * @param id		Индекс на играча
 * @return		Връща съответна стойност на режима на игра в момента (MODE_NORMAL - нормален режим (с убийства) , MODE_INFECTION - режим с инфекции) . (int)
 */
native get_roundmode()

/**
 * Връща съответна стойност, ако играчът е бил зомби при раждането си
 *
 * @param id		Индекс на играча
 * @return		Връща true ако е бил зомби и false - ако не е бил. (bool)
 */
native was_user_zombie(id)

/**
 * Задава стойност дали играчът е бил зомби при раждането си (ако е бил накрая на рунда ще бъде човек, използва се при инфекции)
 *
 * @param id		Индекс на играча
 * @param true		Стойността - 1 ако е бил, 0 - ако не е
 *
 * @noreturn
 */
native set_user_was_zombie(id, true)

/**
 * Връща съответна стойност, ако играчът е баннат (местенето на блоковете)
 *
 * @param id		Индекс на играча
 * @return		Връща true ако е и false - ако не е. (bool)
 */
native is_user_banned(id)

/**
 * Връща стойността на оставащата кръв за взимане при горене
 *
 * @param id		Индекс на играча
 * @return		Връща стойността на оставащата кръв за взимане при горене. (int)
 */
native get_user_fire_duration(id)

/**
 * Задава стойността на oставащата кръв за взимане при горене
 *
 * @param id		Индекс на играча
 * @param duration		Стойността на oставащата кръв за взимане при горене, която искаме да зададем (1 - за да спрем горенето на играч).
 */
native set_user_fire_duration(id, duration)

/**
 * Връща съответна стойност, ако играчът е заледен
 *
 * @param id		Индекс на играча
 * @return		Връща true ако е и false - ако не е. (bool)
 */
native is_user_frozen(id)

/**
 * Връща съответна стойност, ако играчът е заледен (започва да се топи)
 *
 * @param id		Индекс на играча
 * @return		Връща true ако е и false - ако не е. (bool)
 */
native is_user_frozen_cool(id)

/**
 * Запалва играч
 *
 * @param attacker		Индекс на играча
 * @param victim		Индекс на играча жертва
 * @param duration		Максимална кръв за взимане при горене (0 - стойността ще се взима от CVAR-a vzbb_grenade_fire_duration)
 *
 * @noreturn
 */
native user_burn(attacker, victim, duration)

/**
 * Заледява играч
 *
 * @param id		Индекс на играча
 *
 * @noreturn
 */
native user_freeze(id)

/**
 * Заледява играч (играчът веднага започва да се топи)
 *
 * @param id		Индекс на играча
 *
 * @noreturn
 */
native user_freeze_cool(id)

/**
 * Премахва заледяването на играч
 *
 * @param id		Индекс на играча
 *
 * @noreturn
 */
native user_unfreeze(id)

/**
 * Премахва топенето на играч
 *
 * @param id		Индекс на играча
 *
 * @noreturn
 */
native user_unfreeze_cool(id)

/**
 * Инфектира играч
 *
 * @param victim	Индекс на жертвата
 * @param infector	Индекс на инфектиращия
 *
 * @noreturn
 */
native user_infect(victim, infector)

/**
 * Деинфектира играч
 *
 * @param id		Индекс на играча
 *
 * @noreturn
 */
native user_uninfect(id)

/**
 * Връща забавния тип на блок
 *
 * @param ent		Индекс на ентитито на блока
 * @return		Връща забавния тип на блока (int)
 */
native get_block_fun_type(ent)

/**
 * Задава забавен тип на блок
 *
 * @param ent		Индекс на ентитито на блока
 * @param funtype	Забавен тип на блока (BLOCKS_YELLOW - бързодвижещ се блок , BLOCKS_BLACK - недвижим блок , BLOCKS_BLUE - забавящ блок , BLOCKS_RED - запалващ блок)
 *
 * @noreturn
 */
native set_block_fun_type(ent, funtype)

/**
 * Премахва забавния тип на блок
 *
 * @param ent		Индекс на ентитито на блока
 *
 * @noreturn
 */
native reset_block_fun_type(ent)

/**
 * Връща стойността на намалението на "Round Deal" в съответния рунд
 *
 * @return		Връща стойността на намалението. (int)
 */
native get_deal_discount()

/**
 * Връща съответна стойност дали итемът е в офертите на "Round Deal" в съответния рунд
 *
 * @return		Връща true ако е и false - ако не е. (bool)
 */
native is_deal_offer(itemid)

/**
 * Премахва бариерата (ако има такава)
 *
 * @noreturn
 */
native hide_barrierent()

/**
 * Рестартира местоположението на бариерата (ако има такава)
 *
 * @noreturn
 */
native reset_barrierent()

/**
 * Задава текст за HUD-a на играчите, на мястото на HUD-a за режима (използвайте при update_user_hud_data forward-a)
 *
 * @param text	Tекстът (максимална дължина - 128 символа, стрингът трябва да е предварително форматиран)
 */
native set_hud_cache_text(text[])

/**
 * Задава цвят (в RGB формат) за HUD-a на играчите, на мястото на HUD-a за режима (използвайте при update_user_hud_data forward-a)
 *
 * @param r		Червен цвят
 * @param g		Зелен цвят
 * @param b		Син цвят
 *
 * @noreturn
 */
native set_hud_cache_colors(r, g, b)

/**
 * Задава условие за показване на HUD-a на играчите, на мястото на HUD-a за режима (използвайте при update_user_hud_data forward-a)
 *
 * @param condition		Използвайте true, за да се показва винаги при всички случаи
 *
 * @noreturn
 */
native set_hud_cache_condition(bool:condition)

/**
 * Извиква фунцкията за показване на HUD-a на играчите
 *
 * @noreturn
 */
native force_user_hud_data()

/**
 * Извиква функцията за менюто за оръжия
 *
 * @param id		Индекс на играча
 *
 * @noreturn
 */
native force_weapon_menu(id)

/**
 * Възвръща rendering-а на играча (полезно за премахване на glow и възвръщане на невидимостта на играча)
 *
 * @param id		Индекс на играча
 *
 * @noreturn
 */
native restore_user_rendering(id)

/**
 * Извиква се при избиране на зомби клас
 *
 * @param id		Индекс на играча
 * @param classid	Индекс на зомби класа
 */
forward zombie_class_selected(id, classid)

/**
 * Извиква се при избиране на итем от shop менюто
 *
 * @note Върнете стойност FORWARD_CONTINUE, за да блокирате купуването на даден итем.
 *
 * @param id		Индекс на играча
 * @param itemid	Индекс на итема
 */
forward shop_item_selected(id, itemid)

/**
 * Извиква се при теглене или бутане на блок
 *
 * @note Върнете стойност FORWARD_CONTINUE, за да спрете изпълнението на forward-a.
 *
 * @param id		Индекс на играча
 * @param pullpush_type	Тип на местенето на блока (1 - теглене , 2 - бутане)
 */
forward block_pull_push(id, pullpush_type)

/**
 * Извиква се след започването на бойната фаза
 */
forward battle_phase_begin()

/**
 * Извиква се след принудителното започване на бойната фаза от админ (с командата /start)
 *
 * @param id		Индекс на администраторът, написал командата
 */
forward battle_phase_begin_admin(id)

/**
 * Извиква се преди хвърляне на граната
 *
 * @note Върнете стойност FORWARD_CONTINUE, за да спрете изпълнението на forward-a.
 *
 * @param owner		Индекс на притежателя на гранатата
 * @param ent		Индекс на ентитито на гранатата
 * @param nade_type		Тип на гранатата (1 - HE grenade (FireNade) , 2 - Smoke grenade , 3 - Flashbang (FrostNade))
 */
forward nade_throw_pre(owner, ent, nade_type)

/**
 * Извиква се след хвърляне на граната
 *
 * @param owner		Индекс на притежателя на гранатата
 * @param ent		Индекс на ентитито на гранатата
 * @param nade_type		Тип на гранатата (1 - HE grenade (FireNade) , 2 - Smoke grenade , 3 - Flashbang (FrostNade))
 */
forward nade_throw_post(owner, ent, nade_type)

/**
 * Извиква се преди всяко взимане на кръв при запалване на играч
 *
 * @param id		Индекс на играча
 */
forward user_burn_pre(id)

/**
 * Извиква се след всяко взимане на кръв при запалване на играч
 *
 * @param id		Индекс на играча
 */
forward user_burn_post(id)

/**
 * Извиква се при премахването на горенето на играч
 *
 * @param id		Индекс на играча
 */
forward user_remove_burn(id)

/**
 * Извиква се преди замразяване на играч
 *
 * @param id		Индекс на играча
 */
forward user_freeze_pre(id)

/**
 * Извиква се след замразяване на играч
 *
 * @param id		Индекс на играча
 */
forward user_freeze_post(id)

/**
 * Извиква се преди премахването на замразяването на играч
 *
 * @param id		Индекс на играча
 */
forward user_unfreeze_pre(id)

/**
 * Извиква се след премахването на замразяването на играч
 *
 * @param id		Индекс на играча
 */
forward user_unfreeze_post(id)

/**
 * Извиква се преди играч да започне да се топи
 *
 * @param id		Индекс на играча
 */
forward user_freeze_cool_pre(id)

/**
 * Извиква се след като играч започне да се топи
 *
 * @param id		Индекс на играча
 */
forward user_freeze_cool_post(id)

/**
 * Извиква се преди играч да спре да се топи
 *
 * @param id		Индекс на играча
 */
forward user_unfreeze_cool_pre(id)

/**
 * Извиква се след като играч спре да се топи
 *
 * @param id		Индекс на играча
 */
forward user_unfreeze_cool_post(id)

/**
 * Извиква се преди инфектиране на играч
 *
 * @note Върнете стойност FORWARD_CONTINUE, за да спрете изпълнението на forward-a.
 *
 * @param victim	Индекс на жертвата
 * @param infector	Индекс на инфектиращия
 */
forward user_infect_pre(victim, infector)

/**
 * Извиква се след инфектиране на играч
 *
 * @param victim		Индекс на жертвата
 */
forward user_infect_post(victim)

/**
 * Извиква се преди деинфектиране на играч
 *
 * @note Върнете стойност FORWARD_CONTINUE, за да спрете изпълнението на forward-a.
 *
 * @param id		Индекс на играча
 */
forward user_uninfect_pre(id)

/**
 * Извиква се след деинфектиране на играч
 *
 * @param id		Индекс на играча
 */
forward user_uninfect_post(id)

/**
 * Извиква се преди взимане на блок
 *
 * @note Върнете стойност FORWARD_CONTINUE, за да спрете изпълнението на forward-a.
 *
 * @param id		Индекс на играча
 */
forward grab_block_pre(id)

/**
 * Извиква се след взимане на блок
 *
 * @note Върнете стойност FORWARD_CONTINUE, за да спрете изпълнението на forward-a.
 *
 * @param id		Индекс на играча
 */
forward grab_block_post(id)

/**
 * Извиква се преди пускането на блок
 *
 * @param id		Индекс на играча
 */
forward release_block_pre(id)

/**
 * Извиква се след пускането на блок
 *
 * @param id		Индекс на играча
 */
forward release_block_post(id)

/**
 * Извиква се при всяко обновяване на HUD-а на играчите
 *
 * @note Върнете стойност FORWARD_CONTINUE, за да оставите работещ само HUD-a без другите функции на играчите в бойната фаза.
 */
forward update_user_hud_data()

/**
 * Извиква се преди докосване на играч със забавен блок
 *
 * @note Върнете стойност FORWARD_CONTINUE, за да блокирате ефекта на забавния блок.
 *
 * @param id		Индекс на играча
 * @param id		Индекс на ентитито на блока
 * @param funtype	Забавен тип на блока (BLOCKS_YELLOW - бързодвижещ се блок , BLOCKS_BLACK - недвижим блок , BLOCKS_BLUE - забавящ блок , BLOCKS_RED - запалващ блок)
 */
forward fun_block_touch_pre(id, ent, funtype)

/**
 * Извиква се след докосване на играч със забавен блок
 *
 * @param id		Индекс на играча
 * @param id		Индекс на ентитито на блока
 * @param funtype	Забавен тип на блока (BLOCKS_YELLOW - бързодвижещ се блок , BLOCKS_BLACK - недвижим блок , BLOCKS_BLUE - забавящ блок , BLOCKS_RED - запалващ блок)
 */
forward fun_block_touch_post(id, ent, funtype)