11
дек
2018

[ZP] Статья: Как сделать интеграцию босса в мод? [CS 1.6]

Категория: Counter-Strike 1.6 / Статьи, Автор: TalRasha, Просмотров: 395

В данной статье я расскажу вам как сделать интеграцию любого босса в мод 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)-----*/
    // cs-shopplugins.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)-----*/
    // cs-shopplugins.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
У вас нет доступа к скачиванию файлов с нашего сервера
+2
Вернуться Комментарии (2)
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим логином для скачивания файлов или комментирования новостей.

Возможно Вам так же будут интересны следующие новости:


[ZP] Зомби класс: JackFrost
Новый зомби класс для вашего сервера - JackFrost!

[ZP] Зомби класс: Outsider
Зомби класс Outsider может летать нажав на кнопку

[ZP] Зомби класс: Banshee/Witch/Ведьма + Hud
Зомби класс Banshee/Witch/Ведьма, которая притягивает игроков

[ZP] Зомби класс: Sting Finger + Hud
Зомби класс Sting Finger со способностью большого прыжка,

[ZP] Зомби класс: Heavy (Толстяк) + Hud
Зомби класс Heavy/толстяк, может поставить ловушку и ослепить

[ZP] Статья: Зомби не может атаковать во время заморозки
Как сделать чтобы зомби не мог атаковать во время заморозки?




Публикаций: 0
Комментариев: 1
Статус: Пользователь offline
0
Комментарий #1 | Добавлен: 18 января 2019 14:11
Спасибо большое за статью.



Публикаций: 0
Комментариев: 1
Статус: Пользователь offline
0
Комментарий #2 | Добавлен: 15 февраля 2019 17:05
еб какой большой код 
есть меньше намного 


Информация


Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.


Наши проекты: RAGE Multiplayer
Яндекс.Метрика
18+