Дополнить плагин плз

deniska21233

Пользователь
Регистрация
28 Июн 2017
Сообщения
100
Симпатии
3
Пол
Мужской
Код:
#include <amxmodx>
#include <engine>
#include <hamsandwich>
#include <fakemeta_util>
#include <dhudmessage>
#include <zombieplague>

// *** Настройки *** //
#define NAME "Вызвaть \rAвиaудaр" // Название в Extra items
#define COST 40 // Цена в Extra items
#define COUNT 2 // Сколько раз можно покупать за раунд
#define DAMAGE 600 // Урон одной бомбой
#define RELOADING 60 // Перезарядка (сек.)
#define TIMER 5 // Время ожидания (сек.)
#define DEATHMSG // Менять иконку при убийстве в верхнем правом углу? (Если нет - удалите эту строку)

#define CLASSNAME "air_rocket228"
#define ROCKET_MODEL "models/air_rocket.mdl"
#define LAUNCH_SOUND "launch_rockets.wav"
#define LAUNCH_BEEP "launch_beep.wav"

#define DMG_HEGRENADE (1<<24)
#define TASK_HUD 981623

new const Float:g_fOffsetCoord[9][2] =
{
    {0.0, 0.0},
    {-100.0, -100.0},
    {100.0, 100.0},
    {-100.0, 100.0},
    {100.0, -100.0},
    
    {0.0, 160.0},
    {0.0, -160.0},
    {160.0, 0.0},
    {-160.0, 0.0}
}

new g_iSprExp, g_iSprTrail, g_iSprShockWave
new g_iTimer, Float:g_fBlockBuy, g_iBlockBuyCount[33], Float:g_fCentreOrigin[3]
new g_iMaxPlayers, g_iItem

#if defined DEATHMSG
    new HamHook:g_iHamHookKilledPost
#endif

public plugin_init()
{
    register_plugin("[ZP] Air Strike", "1.0", "Dorus")
    register_event("HLTV", "NewRound", "a", "1=0", "2=0")
    
    register_touch(CLASSNAME, "*", "fw_RocketTouch")
    RegisterHam(Ham_Think, "info_target", "Ham_HookThink")
    
    #if defined DEATHMSG
        register_message(get_user_msgid("DeathMsg"), "Msg_DeathMsg")
        DisableHamForward((g_iHamHookKilledPost = RegisterHam(Ham_Killed, "player", "Ham_Killed_Post", 1)))
    #endif
    
    g_iItem = zp_register_extra_item(NAME, COST, ZP_TEAM_HUMAN)
    g_iMaxPlayers = get_maxplayers()
    g_fBlockBuy = get_gametime()
}

public plugin_precache()
{
    precache_sound(LAUNCH_SOUND)
    precache_sound(LAUNCH_BEEP)
    
    precache_model(ROCKET_MODEL)
    g_iSprExp = precache_model("sprites/zerogxplode.spr")
    g_iSprTrail = precache_model("sprites/xbeam3.spr")
    g_iSprShockWave = precache_model("sprites/shockwave.spr")
}

public client_putinserver(id)
{
    g_iBlockBuyCount[id] = COUNT
}

public zp_extra_item_selected(id, iItemid)
{
    if(iItemid == g_iItem)
    {
        if(!is_user_alive(id) || zp_get_user_zombie(id))
            return PLUGIN_HANDLED
        
        if(g_iBlockBuyCount[id] < 1)
        {
            ChatColor(id, "!y[!tАвиаудар!y] Можно покупать !g%d раз(а) !yза раунд", COUNT)
            client_print(id, print_center, "Можно покупать %d раз(а) за раунд", COUNT)
            return ZP_PLUGIN_HANDLED
        }
        
        if(g_fBlockBuy > get_gametime())
        {
            ChatColor(id, "!y[!tАвиаудар!y] Осталось !g%d сек. !yдо перезарядки", floatround(g_fBlockBuy - get_gametime()))
            client_print(id, print_center, "Осталось %d сек. до перезарядки", floatround(g_fBlockBuy - get_gametime()))
            return ZP_PLUGIN_HANDLED
        }
        
        fm_get_aim_origin(id, g_fCentreOrigin)
        g_iTimer = TIMER
        LaunchDHud(id+TASK_HUD)
        
        new szName[32]
        get_user_name(id, szName, charsmax(szName))
        ChatColor(id, "!y[!tАвиаудар!y] Игрок !g%s !yвызвал !gАвиаудар", szName)
        
        g_fBlockBuy = get_gametime() + float(RELOADING) + TIMER
        g_iBlockBuyCount[id]--
    }
    
    return PLUGIN_HANDLED
}

public NewRound()
{
    for(new id = 1; id <= g_iMaxPlayers; id++)
    {
        if(task_exists(id+TASK_HUD))
            remove_task(id+TASK_HUD)
    }
    
    static iEnt
    iEnt = -1
    while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", CLASSNAME)))
    {
        if(is_valid_ent(iEnt))
            engfunc(EngFunc_RemoveEntity, iEnt)
    }
    
    arrayset(g_iBlockBuyCount, COUNT, sizeof(g_iBlockBuyCount))
    
    g_fBlockBuy = get_gametime()
}

public LaunchDHud(iTask)
{
    static id
    id = iTask - TASK_HUD
    
    if(g_iTimer <= 0)
    {
        set_dhudmessage(255, 0, 0, -1.0, 0.40, 0, 1.0, 1.5, 0.1, 0.2)
        show_dhudmessage(0, "ВНИМАНИЕ!!!^nНачался Авиаудар")
        g_iTimer = TIMER
        LaunchRocket(id)
    }
    else
    {
        set_dhudmessage(255, 0, 0, -1.0, 0.40, 0, 1.0, 0.9, 0.1, 0.2)
        show_dhudmessage(0, "До начала Авиаудара:^n%d сек.", g_iTimer--)
        
        set_task(1.0, "LaunchDHud", id+TASK_HUD)
        
        emit_sound(0, CHAN_VOICE, LAUNCH_BEEP, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
        
        CreateBeamCylinder(g_fCentreOrigin, g_iSprShockWave, 200.0, 10, 10, 255, 0, 0, 100)
    }
}
    
public LaunchRocket(id)
{   
    static iEnt, Float:tmp_fVelocity[3] = {0.0, 0.0, 0.0}
    new Float:tmp_fNewOrigin[3], Float:fRoofOrigin[3]
    
    emit_sound(id, CHAN_VOICE, LAUNCH_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    
    for(new i = 0; i < 9; i++)
    {
        tmp_fNewOrigin[0] = g_fCentreOrigin[0] + g_fOffsetCoord[i][0]
        tmp_fNewOrigin[1] = g_fCentreOrigin[1] + g_fOffsetCoord[i][1]
        tmp_fNewOrigin[2] = g_fCentreOrigin[2]
        
        iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
        if(!pev_valid(iEnt))
            return
        
        fRoofOrigin = get_origin_to_roof(iEnt, tmp_fNewOrigin)
        fRoofOrigin[2] -= random_float(0.0, 50.0)
        
        engfunc(EngFunc_SetModel, iEnt, ROCKET_MODEL)
        set_pev(iEnt, pev_solid, SOLID_TRIGGER)
        set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
        set_pev(iEnt, pev_size, Float:{-1.0, -1.0, -1.0}, Float:{1.0, 1.0, 5.0})
        
        tmp_fVelocity[2] = random_float(-500.0, -450.0)
        set_pev(iEnt, pev_velocity, tmp_fVelocity)
        
        set_pev(iEnt, pev_classname, CLASSNAME)
        set_pev(iEnt, pev_origin, fRoofOrigin)
        set_pev(iEnt, pev_owner, id)
        
        set_pev(iEnt, pev_nextthink, get_gametime() + 0.5)
    }
}

public Ham_HookThink(iEnt)
{
    if(!pev_valid(iEnt))
        return HAM_IGNORED
        
    new szClassName[64]
    pev(iEnt, pev_classname, szClassName, charsmax(szClassName))
    
    if(!equal(szClassName, CLASSNAME))
        return HAM_IGNORED
    
    CreateBeamFollow(iEnt, g_iSprTrail, 10, 5, 255, 255, 255, 255)
    set_pev(iEnt, pev_nextthink, 0)
    
    return HAM_IGNORED
}

public fw_RocketTouch(iEnt, iTouch)
{
    if(!pev_valid(iEnt))
        return
        
    static Float:fOrigin[3], iOwner
    pev(iEnt, pev_origin, fOrigin)
    
    iOwner = pev(iEnt, pev_owner)
    
    CreateExplosion(fOrigin, g_iSprExp, 30, 30, 0)
    CreateBeamCylinder(fOrigin, g_iSprShockWave, 70.0, 6, 30, 248, 255, 175, 100)
    
    new iVictim = -1
    while((iVictim = find_ent_in_sphere(iVictim, fOrigin, 200.0)) != 0)
    {
        if(!is_user_alive(iVictim) || !zp_get_user_zombie(iVictim))
            continue
        
        ExecuteHamB(Ham_TakeDamage, iVictim, iEnt, iOwner, float(DAMAGE), DMG_HEGRENADE)
    }
    
    engfunc(EngFunc_RemoveEntity, iEnt)
}

#if defined DEATHMSG
public Msg_DeathMsg()
{
    new iAttacker = get_msg_arg_int(1)
    new szClassName[16], szName[32], szBuffer[64]

    get_msg_arg_string(4, szClassName, charsmax(szClassName))
    get_user_name(iAttacker, szName, charsmax(szName))
    
    if(equal(szClassName, CLASSNAME))
    {
        formatex(szBuffer, charsmax(szBuffer), "%s (Авиаудар)", szName)
        
        set_user_fake_name(iAttacker, szBuffer)
        EnableHamForward(g_iHamHookKilledPost)

        set_msg_arg_string(4, "teammate")
    }
}

public Ham_Killed_Post(iVictim, iAttacker, iGib)
{
    DisableHamForward(g_iHamHookKilledPost)
    reset_user_info(iAttacker)
    dllfunc(DLLFunc_ClientUserInfoChanged, iAttacker, engfunc(EngFunc_GetInfoKeyBuffer, iAttacker))
}

stock reset_user_info(iPlayer)
{
    new szUserInfo[256]
    copy_infokey_buffer(engfunc(EngFunc_GetInfoKeyBuffer, iPlayer), szUserInfo, charsmax(szUserInfo))

    message_begin(MSG_ALL, SVC_UPDATEUSERINFO)
    write_byte(iPlayer - 1)
    write_long(get_user_userid(iPlayer))
    write_string(szUserInfo)
    write_long(0)
    write_long(0)
    write_long(0)
    write_long(0)
    message_end()
}

stock set_user_fake_name(iPlayer, szName[])
{
    message_begin(MSG_ALL, SVC_UPDATEUSERINFO)
    write_byte(iPlayer - 1)
    write_long(get_user_userid(iPlayer))
    write_char('\')
    write_char('n')
    write_char('a')
    write_char('m')
    write_char('e')
    write_char('\')
    write_string(szName)
    for(new i; i < 16; i++) write_byte(0)
    message_end()
}
#endif

stock Float:get_origin_to_roof(iEnt, Float:fStart[])
{
    new Float:fDest[3] = {0.0, 0.0, 9999.0}
    xs_vec_add(fStart, fDest, fDest)
    
    engfunc(EngFunc_TraceLine, fStart, fDest, 0, iEnt, 0)
    new Float:fOrigin[3]   
    get_tr2(0, TR_vecEndPos, fOrigin)
    
    return fOrigin
}

stock CreateExplosion(Float:fOrigin[], iSprite, iScale, iFramerate, iFlags)
{
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(TE_EXPLOSION)
    engfunc(EngFunc_WriteCoord, fOrigin[0])
    engfunc(EngFunc_WriteCoord, fOrigin[1])
    engfunc(EngFunc_WriteCoord, fOrigin[2])
    write_short(iSprite)
    write_byte(iScale)
    write_byte(iFramerate)
    write_byte(iFlags)
    message_end()
}

stock CreateBeamFollow(iEnt, iSprite, iLife, iWidth, iRed, iGreen, iBlue, iBrightness)
{
    message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(TE_BEAMFOLLOW)
    write_short(iEnt)
    write_short(iSprite)
    write_byte(iLife)
    write_byte(iWidth)
    write_byte(iRed)
    write_byte(iGreen)
    write_byte(iBlue)
    write_byte(iBrightness)
    message_end()
}

stock CreateBeamCylinder(Float:fOrigin[3], iSprite, Float:fRadius, iLife, iWidth, iRed, iGreen, iBlue, iBrightness)
{
    engfunc(EngFunc_MessageBegin, MSG_BROADCAST, SVC_TEMPENTITY, fOrigin, 0)
    write_byte(TE_BEAMCYLINDER)
    engfunc(EngFunc_WriteCoord, fOrigin[0])
    engfunc(EngFunc_WriteCoord, fOrigin[1])
    engfunc(EngFunc_WriteCoord, fOrigin[2])
    engfunc(EngFunc_WriteCoord, fOrigin[0])
    engfunc(EngFunc_WriteCoord, fOrigin[1])
    engfunc(EngFunc_WriteCoord, fOrigin[2]+fRadius)
    write_short(iSprite)
    write_byte(0) // start framerate
    write_byte(0) // framerate
    write_byte(iLife)
    write_byte(iWidth)
    write_byte(0) // amplitude
    write_byte(iRed)
    write_byte(iGreen)
    write_byte(iBlue)
    write_byte(iBrightness)
    write_byte(0) // speed
    message_end()
}

stock ChatColor(const id, const szInput[], any:...)
{
    new iCount = 1, iPlayers[32]
    static szMsg[191]

    vformat(szMsg, 190, szInput, 3)

    replace_all(szMsg, 190, "!g", "^4") // Зелёный
    replace_all(szMsg, 190, "!y", "^1") // Стандартный
    replace_all(szMsg, 190, "!t", "^3") // Цвет команды

    if(id) iPlayers[0] = id; else get_players(iPlayers, iCount, "ch")
    {
        for(new i = 0; i < iCount; i++)
        {
            if(is_user_connected(iPlayers[i]))
            {
                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, iPlayers[i])
                write_byte(iPlayers[i]);
                write_string(szMsg);
                message_end();
            }
        }
    }
}

Здравствуйте , помогите пожалуйста сделать чтобы при покупке давалась граната типа смока который бы начинал дыметь и после происходил отчет до взрыва в указанном месте
И сделать чтобы в тунелях не работал
 

Flymic24

Пользователь
Регистрация
15 Июн 2017
Сообщения
85
Симпатии
43
Пол
Мужской
StockX, Полностью солидарен.
deniska21233, Тогда только подскажу, берите в сети кастомные гранаты и переносите нужные функции самостоятельно. За вас никто за "спасибо"/"призз" делать не будет
 

g52

Заблокированные
Пользователь
Регистрация
8 Июн 2018
Сообщения
367
Симпатии
57
Нужно больше золота
 

deniska21233

Пользователь
Регистрация
28 Июн 2017
Сообщения
100
Симпатии
3
Пол
Мужской
StockX, Полностью солидарен.
deniska21233, Тогда только подскажу, берите в сети кастомные гранаты и переносите нужные функции самостоятельно. За вас никто за "спасибо"/"призз" делать не будет
Так может ещё кто юзать будет[DOUBLEPOST=1555494598][/DOUBLEPOST]
StockX, Полностью солидарен.
deniska21233, Тогда только подскажу, берите в сети кастомные гранаты и переносите нужные функции самостоятельно. За вас никто за "спасибо"/"призз" делать не будет
Обидно то что студенческая жизнь в общаге не так шикарна чтобы шиковать на плагины )
 

perfectblood0

Команда форума
Администратор
Регистрация
29 Окт 2017
Сообщения
2.578
Симпатии
914
Пол
Женский
Так может ещё кто юзать будет[DOUBLEPOST=1555494598][/DOUBLEPOST]
Обидно то что студенческая жизнь в общаге не так шикарна чтобы шиковать на плагины )
Держать сервер cs 1.6 это уже определённые траты. 500-1000 рублей за раз, причём как вы сказали кто то будет этим пользоваться - это мелочь. Уж такие деньги можно найти, раз сервер держите.
 

deniska21233

Пользователь
Регистрация
28 Июн 2017
Сообщения
100
Симпатии
3
Пол
Мужской
Держать сервер cs 1.6 это уже определённые траты. 500-1000 рублей за раз, причём как вы сказали кто то будет этим пользоваться - это мелочь. Уж такие деньги можно найти, раз сервер держите.
На данный момент сервер бесплатно стоит
Да и такое чудо за денежки наверно с нуля надо писать
 

perfectblood0

Команда форума
Администратор
Регистрация
29 Окт 2017
Сообщения
2.578
Симпатии
914
Пол
Женский
Сверху Снизу