Русское сообщество по скриптингу

Управление ботом после смерти

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Управление ботом после смерти

Сообщение KekC » 15 апр 2017, 23:28

Искал плагин, чтобы после смерти можно было переключиться на управление ботом как в ксго, но не нашел.

Может кто-нибудь сможет написать такой плагин, чтобы после смерти можно было выбрать любого бота и заспавниться на его месте, с его же аммуницией.
Аватара пользователя
KekC
 
Сообщения: 12
Зарегистрирован: 15 апр 2017, 23:16
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Языки программирования: Pawn
SourcePawn
C++
Php
Ruby
Python
C#

Re: Управление ботом после смерти

Сообщение NEoMASTERR » 15 апр 2017, 23:48

А задумка неплоха. Побалуюсь, напишу сюда.
Есть еще вариант "про умер, а я нуб, помогите! /spawn_pro" и за тебя спавнится твой сокомандник с прямыми руками
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Управление ботом после смерти

Сообщение KOTOKU » 15 апр 2017, 23:50

Не особо прокатит такая тема, если только через velocity по aiming'у, но как не крути - оно того не стоит, без think'ов не обойтись
NEoMASTERR, юзай attach_view
Аватара пользователя
KOTOKU
 
Сообщения: 766
Зарегистрирован: 10 фев 2013, 00:53
Благодарил (а): 10 раз.
Поблагодарили: 117 раз.

Re: Управление ботом после смерти

Сообщение NEoMASTERR » 15 апр 2017, 23:52

Дак нет, тут лучше полноценный спавн. Скопировать хп, броню, оружие, прост суперсидить "килл" бота и начислять ему фраги.
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Управление ботом после смерти

Сообщение Lethargy » 15 апр 2017, 23:56

NEoMASTERR писал(а):Дак нет, тут лучше полноценный спавн. Скопировать хп, броню, оружие, прост суперсидить "килл" бота и начислять ему фраги.

И переносить туда, где стоял бот.
Lawful evil ]:->

Были бы в языке pawn объекты, было бы круто. Почему нет объектов в павне?
Аватара пользователя
Lethargy
 
Сообщения: 179
Зарегистрирован: 12 мар 2017, 17:25
Благодарил (а): 34 раз.
Поблагодарили: 15 раз.
Языки программирования: За 3-4 часа любой язык

Re: Управление ботом после смерти

Сообщение KOTOKU » 16 апр 2017, 00:02

Может кто-нибудь сможет написать такой плагин, чтобы после смерти можно было выбрать любого бота и заспавниться на его месте, с его же аммуницией.

В таком случае, ему нужно иметь ботов на сервере да и не просто тупых ботов, а те что играют не хуже хотя бы восьмиклассника, а так, смысла в этом нет вообще

Lethargy, а ты как пишешь, у тебя же статус "Забанен"
Аватара пользователя
KOTOKU
 
Сообщения: 766
Зарегистрирован: 10 фев 2013, 00:53
Благодарил (а): 10 раз.
Поблагодарили: 117 раз.

Re: Управление ботом после смерти

Сообщение KekC » 16 апр 2017, 10:29

Значит сложно очень и никто не сможет сделать такой плагин?
Аватара пользователя
KekC
 
Сообщения: 12
Зарегистрирован: 15 апр 2017, 23:16
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Языки программирования: Pawn
SourcePawn
C++
Php
Ruby
Python
C#

Re: Управление ботом после смерти

Сообщение NEoMASTERR » 16 апр 2017, 12:31

Ну я начал, но пока сыроват.
Минусы:
- проблемы с ником
- проблемы со счётом
- проблемы с моделями, вроде
- проблемы с гранатами, глючат
Плюсы:
- работает

Код: Выделить всё
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <message_stocks>
#include <cstrike>
#include <engine>

#define AUTHOR                     "NEoMASTERR"
#define PLUGIN                     "BotControl"
#define VERSION                 "0.1"

#define bit_set(%0,%1) (%1 |=  (1<<%0))
#define bit_zero(%0,%1) (%1 &= ~(1<<%0))
#define bit_valid(%0,%1) (%1  &  (1<<%0))

#define OFFSET_TEAM 114
#define XO_PLAYER 5
#define XO_WEAPON 4

new const const_name[] = "name"
new const m_rgpPlayerItems[6]    = {367, 368, ...}
new const m_rgAmmo[32] = {376, 377, ...}
    const m_pPlayer = 41
    const m_iId 
= 43
    const m_iClip 
= 51
    const m_iDefaultItems 
= 120
    const m_fHasBeenKilledLastRound 
= 113
new const CopyInfoCB
[] = {373, 374, 375}
new const CopyInfoINT[] = {112, 116}
new const SwapInfo[] = {115} /*m_iAccount*/

new g_CBaseNeedChange
new g_Control
[MAX_PLAYERS+1]
new g_MsgScoreInfo
new g_MsgClCorpse
new g_MsgDeathMsg
new g_MsgSayText

new g_BlockSoundToggle

public plugin_init
()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    RegisterHam
(Ham_Spawn, "player", "ham_spawn", 1)
    RegisterHam(Ham_Killed, "player", "ham_killed")
    
    register_forward
(FM_EmitSound, "fm_emitsound")
    register_clcmd("drop", "cmd_botcontrol")
    
    g_MsgScoreInfo 
= get_user_msgid("ScoreInfo")
    g_MsgClCorpse = get_user_msgid("ClCorpse")
    g_MsgDeathMsg = get_user_msgid("DeathMsg")
    g_MsgSayText = get_user_msgid("SayText")
}

public fm_emitsound(id, ch, s[])
{
    if (g_BlockSoundToggle) return FMRES_SUPERCEDE
    return FMRES_IGNORED
}

public ham_killed(id, pid, sh)
{
    static control_by; control_by = g_Control[pid]
    if (control_by) SetHamParamInteger(2, control_by)  // фраги приписываем боту а не управлянту)
    control_by = g_Control[id]
    if (control_by) SetHamParamInteger(1, control_by)  // и смерти

    bit_zero(id, g_CBaseNeedChange)
    set_task(1.0, "task_info_botcontrol", id, .flags = "b")
    return HAM_HANDLED
}

public task_info_botcontrol(id)
{
    static pid; pid = pev(id, pev_iuser2)
    if (is_user_alive(pid) && get_pdata_int(id, OFFSET_TEAM) == get_pdata_int(pid, OFFSET_TEAM) && is_user_bot(pid))
    {
        set_dhudmessage(255, 255, 255, .holdtime = 1.0)
        show_dhudmessage(id, "Нажмите G для управления ботом")
    }
}

public ham_spawn(id)
{
    remove_task(id)
    if (bit_valid(id, g_CBaseNeedChange))
    {
        static pid; pid = g_Control[id];
        static weapons; weapons = pev(pid, pev_weapons)
        static Float:armor; pev(pid, pev_armorvalue, armor)
        
        static i
, cb;        
        for 
(= 0; i < sizeof m_rgpPlayerItems; ++i)
        {
            cb = get_pdata_cbase(pid, m_rgpPlayerItems[i])
            
            set_pdata_cbase
(pid, m_rgpPlayerItems[i], -1, XO_PLAYER)
            if (pev_valid(cb))
            {
                set_pdata_cbase(cb, m_pPlayer, id, XO_WEAPON)
                set_pev(cb, pev_owner, id)
            }
            set_pdata_cbase(id, m_rgpPlayerItems[i], cb, XO_PLAYER)
        }
        
        for 
(= 0; i < sizeof CopyInfoINT; ++i)
        {
            cb = CopyInfoINT[i]
            set_pdata_int(id, cb, get_pdata_int(pid, cb, XO_PLAYER), XO_PLAYER)
        }
        
        for 
(= 0; i < sizeof CopyInfoCB; ++i)
        {
            cb = get_pdata_cbase(pid, CopyInfoCB[i], XO_PLAYER)
            
            set_pdata_cbase
(pid, CopyInfoCB[i], -1, XO_PLAYER)
            set_pdata_cbase(id, CopyInfoCB[i], cb, XO_PLAYER)
            if (!&& pev_valid(cb))
            {
                ExecuteHam(Ham_Item_Deploy, cb)
            }
        }        
        
        for 
(= 0; i < sizeof m_rgAmmo; ++i)
        {
            cb = m_rgAmmo[i]
            set_pdata_int(id, cb, get_pdata_int(pid, cb, XO_PLAYER), XO_PLAYER)
        }
        
        for 
(= 0; i < sizeof SwapInfo; ++i)
        {
            static s1, s2
            cb 
= SwapInfo[i]
            s1 = get_pdata_int(pid, cb, XO_PLAYER)
            s2 = get_pdata_int(id, cb, XO_PLAYER)
            set_pdata_int(pid, cb, s2, XO_PLAYER)
            set_pdata_int(id, cb, s1, XO_PLAYER)
        }
        
        swap_info
(id, pid)
        
        set_pev
(id, pev_armorvalue, armor)
        set_pev(id, pev_weapons, weapons)        
        
        if 
(is_user_alive(pid))
        {
            static Float:f[3]; pev(pid, pev_origin, f)
            g_BlockSoundToggle = 1
            
//user_silentkill(pid, 1)
            ham_silentkill(pid)
            ExecuteHamB(Ham_CS_RoundRespawn, pid)
            g_BlockSoundToggle = 0
            engfunc
(EngFunc_SetOrigin, pid, f)        //для задротов которые каждый спавн знают
        }
        bit_zero(id, g_CBaseNeedChange)
    }
}

public cmd_botcontrol(id)
{
    if (is_user_alive(id))
        return PLUGIN_CONTINUE
    
    static pid
; pid = pev(id, pev_iuser2)
    if (is_user_alive(pid) && get_pdata_int(id, OFFSET_TEAM) == get_pdata_int(pid, OFFSET_TEAM) && is_user_bot(pid))
    {
        static Float:f[3]; pev(pid, pev_origin, f)
        static Float:a[3]; pev(pid, pev_angles, a)
        static Float:v[3]; pev(pid, pev_velocity, v)
        static Float:hp; pev(pid, pev_health, hp)
        static weapons; weapons = pev(pid, pev_weapons)
        static flags; flags = pev(pid, pev_flags)
        static Float:armor; pev(pid, pev_armorvalue, armor)
        
        g_Control
[pid] = id
        
        g_BlockSoundToggle 
= 1
        ExecuteHam
(Ham_CS_RoundRespawn, id)
        g_BlockSoundToggle = 0
        
        
//set_pdata_int(id, m_iDefaultItems, 1, XO_PLAYER)
        //set_pdata_int(id, m_fHasBeenKilledLastRound, 0, XO_PLAYER)
        
        
        static i
, cb;
        
        for 
(= 0; i < sizeof m_rgpPlayerItems; ++i)
        {
            cb = get_pdata_cbase(pid, m_rgpPlayerItems[i])
            
            set_pdata_cbase
(pid, m_rgpPlayerItems[i], -1, XO_PLAYER)
            if (pev_valid(cb)) 
            
{
                set_pdata_cbase(cb, m_pPlayer, id, XO_WEAPON)
                set_pev(cb, pev_owner, id)
            }
            set_pdata_cbase(id, m_rgpPlayerItems[i], cb, XO_PLAYER)
        }
        
        for 
(= 0; i < sizeof CopyInfoINT; ++i)
        {
            cb = CopyInfoINT[i]
            set_pdata_int(id, cb, get_pdata_int(pid, cb, XO_PLAYER), XO_PLAYER)
        }
        
        for 
(= 0; i < sizeof CopyInfoCB; ++i)
        {
            cb = get_pdata_cbase(pid, CopyInfoCB[i], XO_PLAYER)
            
            set_pdata_cbase
(pid, CopyInfoCB[i], -1, XO_PLAYER)
            set_pdata_cbase(id, CopyInfoCB[i], cb, XO_PLAYER)
            if (!&& pev_valid(cb))
            {
                ExecuteHam(Ham_Item_Deploy, cb)
            }
        }
        
        for 
(= 0; i < sizeof m_rgAmmo; ++i)
        {
            set_pdata_int(id, m_rgAmmo[i], get_pdata_int(pid, m_rgAmmo[i], XO_PLAYER), XO_PLAYER)
        }
        
        for 
(= 0; i < sizeof SwapInfo; ++i)
        {
            static s1, s2
            cb 
= SwapInfo[i]
            s1 = get_pdata_int(pid, cb, XO_PLAYER)
            s2 = get_pdata_int(id, cb, XO_PLAYER)
            set_pdata_int(pid, cb, s2, XO_PLAYER)
            set_pdata_int(id, cb, s1, XO_PLAYER)
        }
        
        set_pev
(id, pev_health, hp)
        set_pev(id, pev_armorvalue, armor)
        set_pev(id, pev_angles, a)
        set_pev(id, pev_velocity, v)
        set_pev(id, pev_weapons, weapons)
        set_pev(id, pev_flags, flags)        
        
        swap_info
(id, pid)
        
        engfunc
(EngFunc_SetOrigin, pid, {8192.0, 8192.0, 8192.0} )
        g_BlockSoundToggle = 1;
        ham_silentkill(pid)
        //user_silentkill(pid, 1)
        g_BlockSoundToggle = 0;
        
        engfunc
(EngFunc_SetOrigin, id, f)
        bit_set(pid, g_CBaseNeedChange)
    }
    
    return PLUGIN_HANDLED
}

public ham_silentkill(id)
{
    static x; x = cs_get_user_deaths(id)
    static msgblock; msgblock = get_msg_block(g_MsgDeathMsg);
    static msgblock2; msgblock2 = get_msg_block(g_MsgClCorpse);
    set_msg_block(g_MsgClCorpse, BLOCK_ONCE)
    set_msg_block(g_MsgDeathMsg, BLOCK_ONCE);
    ExecuteHam(Ham_Killed, id, 0, 0)
    set_msg_block(g_MsgDeathMsg, msgblock);
    set_msg_block(g_MsgClCorpse, msgblock2);
    cs_set_user_deaths(id, x)
}

public swap_info(id, pid)
{
    swap_name(id, pid)
    swap_model(id, pid)
    swap_score(id, pid)
}

public swap_name(id, pid)
{
    static n1[65], n2[65]
    get_user_name(id, n1, charsmax(n1))
    get_user_name(pid, n2, charsmax(n2))
    
    
//set_msg_block(g_MsgSayText, BLOCK_ONCE)//////////////////////////////
    engfunc(EngFunc_SetClientKeyValue, id, engfunc(EngFunc_GetInfoKeyBuffer, id), const_name, "dummy_name")
    engfunc(EngFunc_SetClientKeyValue, pid, engfunc(EngFunc_GetInfoKeyBuffer, pid), const_name, n1)
    engfunc(EngFunc_SetClientKeyValue, id, engfunc(EngFunc_GetInfoKeyBuffer, id), const_name, n2)
}

public swap_model(id, pid)
{
    static m1[10], m2[10]
    cs_get_user_model(id, m1, charsmax(m1))
    cs_get_user_model(pid, m2, charsmax(m2))
    cs_set_user_model(id, m2)
    cs_set_user_model(pid, m1)
}

public swap_score(id, pid)
{
    static t; t = get_pdata_int(id, OFFSET_TEAM, XO_PLAYER)
    score_info(id, get_user_frags(pid), cs_get_user_deaths(pid), t)
    score_info(pid, get_user_frags(id), cs_get_user_deaths(id), t)
}

public score_info(id, frags, deaths, team)
{
    message_begin(MSG_ALL, g_MsgScoreInfo, .player = id)
    write_byte(id)
    write_short(frags)
    write_short(deaths)
    write_short(0)
    write_short(team)
    message_end()
}


Все константы отсюда Вы должны зарегистрироваться, чтобы видеть ссылки.
Не очень шарю, может есть еще, те которые я упустил.
Баловался ночью, сильно не ругать.
Аватара пользователя
NEoMASTERR
 
Сообщения: 832
Зарегистрирован: 05 янв 2015, 16:38
Благодарил (а): 43 раз.
Поблагодарили: 188 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

Re: Управление ботом после смерти

Сообщение StRiKeR.csF » 16 май 2017, 03:18

Тебе скорее Вы должны зарегистрироваться, чтобы видеть ссылки..
А так - тема интересная, может попробую.
Чего добился ты и бла, бла, бла
Тут, типа, посыл был, но админ его потёр :(

Skype: nestle.csf
-В чём сила, брат?
-Сила в Debug.log xD
Аватара пользователя
StRiKeR.csF
Скриптер
 
Сообщения: 771
Зарегистрирован: 03 июн 2011, 06:26
Откуда: Кубань
Благодарил (а): 126 раз.
Поблагодарили: 181 раз.
Опыт программирования: Больше трех лет
Языки программирования: C++
C#
JavaScript
PHP(+MySQL)
Assembler

Re: Управление ботом после смерти

Сообщение flymic24 » 16 май 2017, 20:03

KekC, Где то уже видел подобный
Аватара пользователя
flymic24
 
Сообщения: 209
Зарегистрирован: 05 окт 2012, 17:29
Откуда: Bryansk
Благодарил (а): 4 раз.
Поблагодарили: 76 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6

След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

cron