
В данной статье я расскажу вам как сделать интеграцию любого босса в мод ZP 4.3
Для начала открываем Исходник Мода ZP 4.3
Ищем такую функцию:
// Some constants
const HIDE_MONEY = (1<<5)
const UNIT_SECOND = (1<<12)
const DMG_HEGRENADE = (1<<24)
const IMPULSE_FLASHLIGHT = 100
const USE_USING = 2
const USE_STOPPED = 0
const STEPTIME_SILENT = 999
const BREAK_GLASS = 0x01
const FFADE_IN = 0x0000
const FFADE_STAYOUT = 0x0004
const PEV_SPEC_TARGET = pev_iuser2
// Max BP ammo for weapons
new const MAXBPAMMO[] = { -1, 52, -1, 90, 1, 32, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120,
30, 120, 200, 32, 90, 120, 90, 2, 35, 90, 90, -1, 100 }
Заменяем на эту функцию:
// Some constants
const HIDE_MONEY = (1<<5)
const UNIT_SECOND = (1<<12)
const DMG_HEGRENADE = (1<<24)
const IMPULSE_FLASHLIGHT = 100
const USE_USING = 2
const USE_STOPPED = 0
const STEPTIME_SILENT = 999
const BREAK_GLASS = 0x01
const FFADE_IN = 0x0000
const FFADE_STAYOUT = 0x0004
const PEV_SPEC_TARGET = pev_iuser2
/*-----BossManager(start)-----*/
static Map_Boss
/*-----BossManager(End)-----*/
// Max BP ammo for weapons
new const MAXBPAMMO[] = { -1, 52, -1, 90, 1, 32, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120,
30, 120, 200, 32, 90, 120, 90, 2, 35, 90, 90, -1, 100 }
Идем дальше и ищем:
// External additions natives
register_native("zp_register_extra_item", "native_register_extra_item", 1)
register_native("zp_register_zombie_class", "native_register_zombie_class", 1)
register_native("zp_get_extra_item_id", "native_get_extra_item_id", 1)
register_native("zp_get_zombie_class_id", "native_get_zombie_class_id", 1)
Ниже вставляем вот такую функцию:
/*-----BossManager(start)-----*/
// site-cs.ru Native
// Return type:
// 1 - OberonBoss
// 2 - AlienBoss
// 3 - AngraBoss
// 4 - RevenantBoss
// 5 - ApacheBoss
register_native("zl_boss_map", "native_zl_map_boss", 1)
register_native("zl_boss_valid", "native_zl_valid_boss", 1)
register_native("zl_player_alive", "native_zl_player_alive", 1)
register_native("zl_player_random", "native_zl_random_player", 1)
/*-----BossManager(End)-----*/
}
public plugin_precache()
{
// Register earlier to show up in plugins list properly after plugin disable/error at loading
register_plugin("Zombie Plague", PLUGIN_VERSION, "MeRcyLeZZ")
/*-----BossManager(start)-----*/
static MapName[64]
get_mapname(MapName, 63)
if (contain(MapName, "zl_boss_oberon" ) != -1) Map_Boss = 1
if (contain(MapName, "zl_boss_alien" ) != -1) Map_Boss = 2
if (contain(MapName, "zl_boss_angra" ) != -1) Map_Boss = 3
if (contain(MapName, "zl_boss_revenant" ) != -1) Map_Boss = 4
if (contain(MapName, "zl_boss_apache" ) != -1) Map_Boss = 5
/*-----BossManager(End)-----*/
Вот что получится в итоге:
// External additions natives
register_native("zp_register_extra_item", "native_register_extra_item", 1)
register_native("zp_register_zombie_class", "native_register_zombie_class", 1)
register_native("zp_get_extra_item_id", "native_get_extra_item_id", 1)
register_native("zp_get_zombie_class_id", "native_get_zombie_class_id", 1)
/*-----BossManager(start)-----*/
// site-cs.ru Native
// Return type:
// 1 - OberonBoss
// 2 - AlienBoss
// 3 - AngraBoss
// 4 - RevenantBoss
// 5 - ApacheBoss
register_native("zl_boss_map", "native_zl_map_boss", 1)
register_native("zl_boss_valid", "native_zl_valid_boss", 1)
register_native("zl_player_alive", "native_zl_player_alive", 1)
register_native("zl_player_random", "native_zl_random_player", 1)
/*-----BossManager(End)-----*/
}
public plugin_precache()
{
// Register earlier to show up in plugins list properly after plugin disable/error at loading
register_plugin("Zombie Plague", PLUGIN_VERSION, "MeRcyLeZZ")
/*-----BossManager(start)-----*/
static MapName[64]
get_mapname(MapName, 63)
if (contain(MapName, "zl_boss_oberon" ) != -1) Map_Boss = 1
if (contain(MapName, "zl_boss_alien" ) != -1) Map_Boss = 2
if (contain(MapName, "zl_boss_angra" ) != -1) Map_Boss = 3
if (contain(MapName, "zl_boss_revenant" ) != -1) Map_Boss = 4
if (contain(MapName, "zl_boss_apache" ) != -1) Map_Boss = 5
/*-----BossManager(End)-----*/
Дальше ищем:
// CS sounds (just in case)
engfunc(EngFunc_PrecacheSound, sound_flashlight)
engfunc(EngFunc_PrecacheSound, sound_buyammo)
engfunc(EngFunc_PrecacheSound, sound_armorhit)
new ent
Заменяем все как у меня что бы получилось вот так:
// CS sounds (just in case)
engfunc(EngFunc_PrecacheSound, sound_flashlight)
engfunc(EngFunc_PrecacheSound, sound_buyammo)
engfunc(EngFunc_PrecacheSound, sound_armorhit)
new ent
/*-----BossManager(start)-----*/
if (!Map_Boss) {
// Fake Hostage (to force round ending)
ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "hostage_entity"))
if (pev_valid(ent))
{
engfunc(EngFunc_SetOrigin, ent, Float:{8192.0,8192.0,8192.0})
dllfunc(DLLFunc_Spawn, ent)
}
}
/*-----BossManager(End)-----*/
// Weather/ambience effects
if (g_ambience_fog)
{
ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_fog"))
if (pev_valid(ent))
{
fm_set_kvd(ent, "density", g_fog_density, "env_fog")
fm_set_kvd(ent, "rendercolor", g_fog_color, "env_fog")
}
}
if (g_ambience_rain) engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_rain"))
if (g_ambience_snow) engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "env_snow"))
// Prevent some entities from spawning
g_fwSpawn = register_forward(FM_Spawn, "fw_Spawn")
// Prevent hostage sounds from being precached
g_fwPrecacheSound = register_forward(FM_PrecacheSound, "fw_PrecacheSound")
}
public plugin_init()
{
// Plugin disabled?
if (!g_pluginenabled) return;
// No zombie classes?
if (!g_zclass_i) set_fail_state("No zombie classes loaded!")
// Language files
register_dictionary("zombie_plague.txt")
if (Map_Boss) {
set_cvar_num("mp_autoteambalance", 0)
set_cvar_num("mp_limitteams", 0)
} else {
set_cvar_num("mp_autoteambalance", 1)
set_cvar_num("mp_limitteams", 1)
}
Дальше ищем:
// Collect random spawn points
load_spawns()
Заменяем и смотрим что получилось:
// Collect random spawn points
load_spawns()
// Set a random skybox?
/*-----BossManager(start)-----*/
if (g_sky_enable && !Map_Boss/*Block Sky*/)
/*-----BossManager(End)-----*/
{
new sky[32]
ArrayGetString(g_sky_names, random_num(0, ArraySize(g_sky_names) - 1), sky, charsmax(sky))
set_cvar_string("sv_skyname", sky)
}
Дальше ищем такую функцию:
// Respawn player if he dies because of a worldspawn kill?
И заменяем на это:
// Respawn player if he dies because of a worldspawn kill?
/*-----BossManager(start)-----*/
if (get_pcvar_num(cvar_respawnworldspawnkill) && !Map_Boss /*Fix SpawnKill*/)
/*-----BossManager(End)-----*/
set_task(2.0, "respawn_player_task", id+TASK_SPAWN)
Идем дальше и видим:
// Show custom buy menu?
if (get_pcvar_num(cvar_buycustom))
set_task(0.2, "show_menu_buy1", id+TASK_SPAWN)
Вставляем и получится так:
// Show custom buy menu?
if (get_pcvar_num(cvar_buycustom))
set_task(0.2, "show_menu_buy1", id+TASK_SPAWN)
// Set health and gravity
/*-----BossManager(start)-----*/
if (!Map_Boss) {
fm_set_user_health(id, get_pcvar_num(cvar_humanhp))
set_pev(id, pev_gravity, get_pcvar_float(cvar_humangravity))
}
/*-----BossManager(End)-----*/
Едем дальше:
// Get deathmatch mode status and whether the player killed himself
static selfkill
selfkill = (victim == attacker || !is_user_valid_connected(attacker)) ? true : false
Для ZP 4.3 Fix5a: // Determine whether the player killed himself
Вставляем функцию и смотрим что получилось:
// Get deathmatch mode status and whether the player killed himself
static selfkill
selfkill = (victim == attacker || !is_user_valid_connected(attacker)) ? true : false
// Respawn if deathmatch is enabled
/*-----BossManager(start)-----*/
if (get_pcvar_num(cvar_deathmatch) && !Map_Boss /*Block Respawn*/)
/*-----BossManager(End)-----*/
{
Дальше ищем вот такую функцию:
// Weapons bought
g_canbuy[id] = false
Вставляем вот это и смотрим что получилось:
// Weapons bought
g_canbuy[id] = false
/*-----BossManager(start)-----*/
// Give additional items
if(!Map_Boss) {
static i
for (i = 0; i < ArraySize(g_additional_items); i++)
{
ArrayGetString(g_additional_items, i, wname, charsmax(wname))
fm_give_item(id, wname)
}
}
/*-----BossManager(end)-----*/
}
Дальше делаем блок заражения, ищем:
// Get alive players count
static iPlayersnum
iPlayersnum = fnGetAlive()
Вставляем и смотрим что получится:
// Get alive players count
static iPlayersnum
iPlayersnum = fnGetAlive()
// Not enough players, come back later!
/*-----BossManager(start)-----*/
if (iPlayersnum < 1 || Map_Boss /*Block Infection*/)
/*-----BossManager(End)-----*/
{
set_task(2.0, "make_zombie_task", TASK_MAKEZOMBIE)
return;
}
Самая сложная функция (Основа) ищем:
// Check if this is the class to retrieve
if (equali(name, class_name))
return i;
}
return -1;
И сделаем как у меня ниже точно также:
// Check if this is the class to retrieve
if (equali(name, class_name))
return i;
}
return -1;
}
/*-----BossManager(start)-----*/
// Native: zl_boss_map()
public native_zl_map_boss() {
return Map_Boss
}
// Native: zl_boss_valid(index)
public native_zl_valid_boss(index) {
new ClassName[32]
pev(index, pev_classname, ClassName, charsmax(ClassName))
if (equal(ClassName, "OberonBoss")) return 1
if (equal(ClassName, "AlienBoss")) return 2
if (equal(ClassName, "AngraBoss")) return 3
if (equal(ClassName, "RevenantBoss")) return 4
if (equal(ClassName, "ApacheBoss")) return 5
return 0
}
//Native: zl_player_random()
public native_zl_random_player() {
new Index
Index = GetRandomAlive(random_num(1, native_zl_player_alive()))
return Index
}
//Native zl_player_alive()
public native_zl_player_alive() {
new iAlive
for (new id = 1; id <= get_maxplayers(); id++) if (is_user_alive(id) && !is_user_bot(id)) iAlive++
return iAlive
}
GetRandomAlive(target_index) {
new iAlive
for (new id = 1; id <= get_maxplayers(); id++) {
if (is_user_alive(id) && !is_user_bot(id)) iAlive++
if (iAlive == target_index) return id
}
return -1
}
/*-----BossManager(End)-----*/
Теперь ваш босс будет работать на ZP 4.3Возможно будут варнинги loose indentation - отсутствие табуляции, но не обращайте на них внимания.Готовые исходники с интеграцией:Для ZP 4.3
У вас нет доступа к скачиванию файлов с нашего сервера
Для ZP 4.3 Fix5a
У вас нет доступа к скачиванию файлов с нашего сервера
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим логином для скачивания файлов или комментирования новостей.