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

Способности Ботов  [Решено]

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

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

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

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

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

Способности Ботов

Сообщение MayroN » 29 мар 2019, 00:11

Подскажите на этом примере как заставить ZBot использовать способность класса Зомби?

Здесь при нажатии R выпускает огонь игрок

Я так понимаю,нужно что бы они при атаке использовали способность,а не просто когда им вздумаеться?

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

// Task offsets
enum (+= 100) {
    TASK_BURN
}

// IDs inside tasks
#define ID_BURN (taskid - TASK_BURN)

#define is_user_valid_alive(%1) (1 <= %1 <= g_maxplayers && is_user_alive(%1))

new const zclass_name[] = { "Zombie Husk" } 
new const zclass_info
[] = { "Throw a FireBall" } 
new const zclass_model
[] = { "Husk" } 
new const zclass_clawmodel
[] = { "v_husk_hands.mdl" }
const zclass_health = 1700
const zclass_speed 
= 200
const Float
:zclass_gravity = 0.7 
const Float
:zclass_knockback = 1.0 

new g_Husk
new g_trailSpr
new const fire_model
[] = "sprites/3dmflared.spr"

// Cooldown hook
new Float:g_iLastFire[33]

new cvar_firespeed, cvar_firecooldown, cvar_firedamage, cvar_fireduration, cvar_fireslowdown, cvar_fireradius, cvar_firesurvivor
new g_smokeSpr
, g_flameSpr, g_exploSpr
new g_burning_duration
[33] // burning task duration
new g_maxplayers
new attacker

public plugin_init
()
{
    register_plugin("[ZP] Zombie Class: Zombie Husk", "0.2", "DJHD!") 
    
    cvar_firespeed 
= register_cvar("zp_husk_fire_speed", "700")
    cvar_firecooldown = register_cvar("zp_husk_fire_cooldown", "15.0")
    cvar_firedamage = register_cvar("zp_husk_fire_damage", "2")
    cvar_fireduration = register_cvar("zp_husk_fire_duration", "5")
    cvar_fireslowdown = register_cvar("zp_husk_fire_slowdown", "0.5")
    cvar_fireradius = register_cvar("zp_husk_fire_radius", "220.0")
    cvar_firesurvivor = register_cvar("zp_husk_fire_survivor", "1")
    
    register_forward
(FM_Touch, "fw_Touch")
    register_forward(FM_PlayerPreThink, "fw_PlayerPreThink")
    
    
// HAM Forwards
    RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
    RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")
    
    g_maxplayers 
= get_maxplayers()
}
 

public plugin_precache
()
{
    g_Husk = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback) 
    
    engfunc
(EngFunc_PrecacheModel, fire_model)
    
    g_trailSpr 
= engfunc(EngFunc_PrecacheModel, "sprites/laserbeam.spr")
    g_smokeSpr = engfunc(EngFunc_PrecacheModel, "sprites/black_smoke3.spr")
    g_flameSpr = engfunc(EngFunc_PrecacheModel, "sprites/flame.spr")
    g_exploSpr = engfunc(EngFunc_PrecacheModel, "sprites/zerogxplode.spr")
    
    engfunc
(EngFunc_PrecacheSound, "zombie_plague/husk_pre_fire.wav")
    engfunc(EngFunc_PrecacheSound, "zombie_plague/husk_wind_down.wav")
    engfunc(EngFunc_PrecacheSound, "zombie_plague/husk_fireball_fire.wav")
    engfunc(EngFunc_PrecacheSound, "zombie_plague/husk_fireball_loop.wav")
    engfunc(EngFunc_PrecacheSound, "zombie_plague/husk_fireball_explode.wav")
}

public zp_user_infected_post(id, infector)
{
    if (zp_get_user_zombie_class(id) == g_Husk)
    {
        if(zp_get_user_nemesis(id))
            return
        
        g_iLastFire
[id] = 0.0
        
        print_chatColor
(id, "\g[ZP]\n To launch a \gFireBall\n press \g^"R^"\n.") 
    
}
}

public fw_PlayerPreThink(id)
{
    if(!is_user_alive(id))
        return;
    
    static iButton
; iButton = pev(id, pev_button)
    static iOldButton; iOldButton = pev(id, pev_oldbuttons)
    
    if
(zp_get_user_zombie(id) && (zp_get_user_zombie_class(id) == g_Husk) && !zp_get_user_nemesis(id))
    {
        if((iButton & IN_RELOAD) && !(iOldButton & IN_RELOAD))
        {            
            if
(get_gametime() - g_iLastFire[id] < get_pcvar_float(cvar_firecooldown))
            {
                print_chatColor(id, "\g[ZP]\n Wait \g%.1f\n seconds, to re-launch another \gFireBall\n", get_pcvar_float(cvar_firecooldown)-(get_gametime() - g_iLastFire[id]))
                return;
            }
            
            g_iLastFire
[id] = get_gametime()
            
            message_begin
(MSG_ONE, get_user_msgid("BarTime"), _, id)
            write_byte(1)
            write_byte(0)
            message_end()
            
            emit_sound
(id, CHAN_ITEM, "zombie_plague/husk_pre_fire.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
            
            set_task
(1.0, "MakeFire", id)
        }
        
        if
(iOldButton & IN_RELOAD && !(iButton & IN_RELOAD))
        {
            if(task_exists(id))
            {
                print_chatColor(id, "\g[ZP]\n To throw a \gFireBall\n you hold down the \g^"R^"\n.")
                g_iLastFire[id] = 0.0
                emit_sound
(id, CHAN_ITEM, "zombie_plague/husk_wind_down.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
            }
            
            message_begin
(MSG_ONE, get_user_msgid("BarTime"), _, id)
            write_byte(0)
            write_byte(0)
            message_end()
            
            remove_task
(id)
        }
    }
}

// Ham Player Spawn Post Forward
public fw_PlayerSpawn_Post(id)
{
    // Not alive or didn't join a team yet
    if (!is_user_alive(id) || !cs_get_user_team(id))
        return;
    
    
// Remove previous tasks
    remove_task(id+TASK_BURN)
}

// Ham Player Killed Forward
public fw_PlayerKilled(victim, attacker, shouldgib)
{
    
    
// Stop burning
    if (!zp_get_user_zombie(victim))
        remove_task(victim+TASK_BURN)
}

public client_disconnect(id)
    remove_task(id+TASK_BURN)

public MakeFire(id)
{
    new Float:Origin[3]
    new Float:vAngle[3]
    new Float:flVelocity[3]
    
    
// Get position from eyes
    get_user_eye_position(id, Origin)
    
    
// Get View Angles
    entity_get_vector(id, EV_VEC_v_angle, vAngle)
    
    new NewEnt 
= create_entity("info_target")
    
    entity_set_string
(NewEnt, EV_SZ_classname, "fireball")
    
    entity_set_model
(NewEnt, fire_model)
    
    entity_set_size
(NewEnt, Float:{ -1.5, -1.5, -1.5 }, Float:{ 1.5, 1.5, 1.5 })
    
    entity_set_origin
(NewEnt, Origin)
    
    
// Set Entity Angles (thanks to Arkshine)
    make_vector(vAngle)
    entity_set_vector(NewEnt, EV_VEC_angles, vAngle)
    
    entity_set_int
(NewEnt, EV_INT_solid, SOLID_BBOX)
    
    entity_set_float
(NewEnt, EV_FL_scale, 0.3)
    entity_set_int(NewEnt, EV_INT_spawnflags, SF_SPRITE_STARTON)
    entity_set_float(NewEnt, EV_FL_framerate, 25.0)
    set_rendering(NewEnt, kRenderFxNone, 0, 0, 0, kRenderTransAdd, 255)
    
    entity_set_int
(NewEnt, EV_INT_movetype, MOVETYPE_FLY)
    entity_set_edict(NewEnt, EV_ENT_owner, id)
    
    
// Set Entity Velocity
    velocity_by_aim(id, get_pcvar_num(cvar_firespeed), flVelocity)
    entity_set_vector(NewEnt, EV_VEC_velocity, flVelocity)
    
    message_begin
(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(TE_BEAMFOLLOW) // TE id
    write_short(NewEnt) // entity
    write_short(g_trailSpr) // sprite
    write_byte(5) // life
    write_byte(6) // width
    write_byte(255) // r
    write_byte(0) // g
    write_byte(0) // b
    write_byte(255) // brightness
    message_end()
    
    set_task
(0.2, "effect_fire", NewEnt, _, _, "b") 
    
    emit_sound
(id, CHAN_ITEM, "zombie_plague/husk_fireball_fire.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    emit_sound(NewEnt, CHAN_ITEM, "zombie_plague/husk_fireball_loop.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}

public effect_fire(entity)
{
    if (!pev_valid(entity))
    {
        remove_task(entity)
        return;
    }
    
    
// Get origin
    static Float:originF[3]
    pev(entity, pev_origin, originF)
    
    engfunc
(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
    write_byte(17)
    engfunc(EngFunc_WriteCoord, originF[0])         // x
    engfunc(EngFunc_WriteCoord, originF[1])         // y
    engfunc(EngFunc_WriteCoord, originF[2]+30)         // z
    write_short(g_flameSpr)
    write_byte(5)                         // byte (scale in 0.1's) 188 - era 65
    write_byte(200)                     // byte (framerate)
    message_end()
    
    
// Smoke
    engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
    write_byte(5)
    engfunc(EngFunc_WriteCoord, originF[0])     // x
    engfunc(EngFunc_WriteCoord, originF[1])     // y
    engfunc(EngFunc_WriteCoord, originF[2])     // z
    write_short(g_smokeSpr)                // short (sprite index)
    write_byte(13)                     // byte (scale in 0.1's)
    write_byte(15)                     // byte (framerate)
    message_end()    
    
    
// Colored Aura
    engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, originF, 0)
    write_byte(TE_DLIGHT)             // TE id
    engfunc(EngFunc_WriteCoord, originF[0])    // x
    engfunc(EngFunc_WriteCoord, originF[0])    // y
    engfunc(EngFunc_WriteCoord, originF[0])    // z
    write_byte(25)                 // radius
    write_byte(255)             // r
    write_byte(128)             // g
    write_byte(0)                 // b
    write_byte(2)                 // life
    write_byte(3)                 // decay rate
    message_end()
}

// Touch Forward
public fw_Touch(ent, id)
{
    if (!pev_valid(ent)) 
        return PLUGIN_HANDLED
    
    new class
[32]
    pev(ent, pev_classname, class, charsmax(class))
    
    if
(equal(class, "fireball"))
    {
        attacker = entity_get_edict(ent, EV_ENT_owner)
        husk_touch(ent)
        engfunc(EngFunc_RemoveEntity, ent)
        return PLUGIN_HANDLED
    
}
    return PLUGIN_HANDLED
}

public husk_touch(ent)
{
    if (!pev_valid(ent)) 
        return
;
    
    
// Get origin
    static Float:originF[3]
    pev(ent, pev_origin, originF)
    
    
// Explosion
    engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, originF, 0)
    write_byte(TE_EXPLOSION)
    engfunc(EngFunc_WriteCoord, originF[0]) // x
    engfunc(EngFunc_WriteCoord, originF[1]) // y
    engfunc(EngFunc_WriteCoord, originF[2]) // z
    write_short(g_exploSpr)
    write_byte(40)         // byte (scale in 0.1's) 188 - era 65
    write_byte(25)         // byte (framerate)
    write_byte(TE_EXPLFLAG_NOSOUND) // byte flags
    message_end()
    
    emit_sound
(ent, CHAN_ITEM, "zombie_plague/husk_fireball_explode.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
    
    
// Collisions
    static victim
    victim 
= -1
    
    while 
((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, get_pcvar_float(cvar_fireradius))) != 0)
    {
        // Only effect alive zombies
        if (!is_user_valid_alive(victim) || zp_get_user_zombie(victim) || !get_pcvar_num(cvar_firesurvivor) && zp_get_user_survivor(victim))
            continue;
        
        message_begin
(MSG_ONE_UNRELIABLE, get_user_msgid("Damage"), _, victim)
        write_byte(0) // damage save
        write_byte(0) // damage take
        write_long(DMG_BURN) // damage type
        write_coord(0) // x
        write_coord(0) // y
        write_coord(0) // z
        message_end()
        
        g_burning_duration
[victim] += get_pcvar_num(cvar_fireduration) * 5
        
        
// Set burning task on victim if not present
        if (!task_exists(victim+TASK_BURN))
            set_task(0.2, "burning_flame", victim+TASK_BURN, _, _, "b")
    }
}

// Burning Flames
public burning_flame(taskid)
{
    // Get player origin and flags
    static origin[3], flags
    get_user_origin
(ID_BURN, origin)
    flags = pev(ID_BURN, pev_flags)
    
    
// in water - burning stopped
    if (zp_get_user_zombie(ID_BURN) || (flags & FL_INWATER) || g_burning_duration[ID_BURN] < 1)
    {
        // Smoke sprite
        message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
        write_byte(TE_SMOKE) // TE id
        write_coord(origin[0]) // x
        write_coord(origin[1]) // y
        write_coord(origin[2]-50) // z
        write_short(g_smokeSpr) // sprite
        write_byte(random_num(15, 20)) // scale
        write_byte(random_num(10, 20)) // framerate
        message_end()
        
        
// Task not needed anymore
        remove_task(taskid);
        return;
    }
    
    if 
((pev(ID_BURN, pev_flags) & FL_ONGROUND) && get_pcvar_float(cvar_fireslowdown) > 0.0)
    {
        static Float:velocity[3]
        pev(ID_BURN, pev_velocity, velocity)
        xs_vec_mul_scalar(velocity, get_pcvar_float(cvar_fireslowdown), velocity)
        set_pev(ID_BURN, pev_velocity, velocity)
    }
    
    
// Get player's health
    static health
    health 
= pev(ID_BURN, pev_health)
    
    if 
(health > get_pcvar_float(cvar_firedamage))
        fm_set_user_health(ID_BURN, health - floatround(get_pcvar_float(cvar_firedamage)))
    else
        death_message
(attacker, ID_BURN, "fireball", 1)
    
    
// Flame sprite
    message_begin(MSG_PVS, SVC_TEMPENTITY, origin)
    write_byte(TE_SPRITE) // TE id
    write_coord(origin[0]+random_num(-5, 5)) // x
    write_coord(origin[1]+random_num(-5, 5)) // y
    write_coord(origin[2]+random_num(-10, 10)) // z
    write_short(g_flameSpr) // sprite
    write_byte(random_num(5, 10)) // scale
    write_byte(200) // brightness
    message_end()
    
    
// Decrease burning duration counter
    g_burning_duration[ID_BURN]--
}


// Death message
public death_message(Killer, Victim, const Weapon [], ScoreBoard)
{
    // Block death msg
    set_msg_block(get_user_msgid("DeathMsg"), BLOCK_SET)
    ExecuteHamB(Ham_Killed, Victim, Killer, 0)
    set_msg_block(get_user_msgid("DeathMsg"), BLOCK_NOT)
    
    
// Death
    make_deathmsg(Killer, Victim, 0, Weapon)
    
    
// Update score board
    if (ScoreBoard)
    {
        message_begin(MSG_BROADCAST, get_user_msgid("ScoreInfo"))
        write_byte(Killer) // id
        write_short(pev(Killer, pev_frags)) // frags
        write_short(cs_get_user_deaths(Killer)) // deaths
        write_short(0) // class?
        write_short(get_user_team(Killer)) // team
        message_end()
        
        message_begin
(MSG_BROADCAST, get_user_msgid("ScoreInfo"))
        write_byte(Victim) // id
        write_short(pev(Victim, pev_frags)) // frags
        write_short(cs_get_user_deaths(Victim)) // deaths
        write_short(0) // class?
        write_short(get_user_team(Victim)) // team
        message_end()
    }
}

/*================================================================================
[Stocks]
=================================================================================*/

// Color Chat
stock print_chatColor(const id,const input[], any:...)
{
    new msg[191], players[32], count = 1;
    vformat(msg,190,input,3);
    replace_all(msg,190,"\g","^4");// green
    replace_all(msg,190,"\n","^1");// normal
    replace_all(msg,190,"\t","^3");// team
    
    if 
(id) players[0] = id; else get_players(players,count,"ch");
    for (new i=0;i<count;i++)
        if (is_user_connected(players[i]))
    {
        message_begin(MSG_ONE_UNRELIABLE,get_user_msgid("SayText"),_,players[i]);
        write_byte(players[i]);
        write_string(msg);
        message_end();
    }
}

stock get_user_eye_position(id, Float:flOrigin[3])
{
    static Float:flViewOffs[3]
    entity_get_vector(id, EV_VEC_view_ofs, flViewOffs)
    entity_get_vector(id, EV_VEC_origin, flOrigin)
    xs_vec_add(flOrigin, flViewOffs, flOrigin)
}

stock make_vector(Float:flVec[3])
{
    flVec[0] -= 30.0
    engfunc
(EngFunc_MakeVectors, flVec)
    flVec[0] = -(flVec[0] + 30.0)
}

// Set player's health (from fakemeta_util)
stock fm_set_user_health(id, health)
{
    (health > 0) ? set_pev(id, pev_health, float(health)) : dllfunc(DLLFunc_ClientKill, id);
}
МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 673
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 149 раз.
Поблагодарили: 86 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...

Re: Способности Ботов

Сообщение hren_morjovui » 29 мар 2019, 15:03

В Ham_...
Код: Выделить всё
    RegisterHam    (Ham_Weapon_PrimaryAttack, "weapon_knife", "ham_weapon_primary_attack");
    RegisterHam    (Ham_Weapon_SecondaryAttack, "weapon_knife", "ham_weapon_secondary_attack"); 

отлавливать атаку бота и активаровать способность

Код: Выделить всё
MakeFire(id

:dntknw:
"В этом мире неизбежны три вещи: смерть, налоги и гравитация."
Аватара пользователя
hren_morjovui
 
Сообщения: 258
Зарегистрирован: 29 май 2018, 09:15
Благодарил (а): 88 раз.
Поблагодарили: 22 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn
PHP
jQuery

Re: Способности Ботов

Сообщение MayroN » 04 апр 2019, 23:34

Ничего больше непридумал,поставил,чтобы способность выполнялась в рандомном времени.

Вот только,нужная функция без (id)

Код: Выделить всё
  public smoker_reelin(parm[])  


Как правильно ее прописать вот сюда
Код: Выделить всё
  // bot use skill
public bot_use_skill(taskid)
{
   new 
id ID_BOT_USE_SKILL
   
if (!is_user_bot(id)) return;
 
        if (
zp_get_user_zombie_class(id) == g_zclass_smoker)
 
        
drag_start(id)
   if (
task_exists(taskid)) remove_task(taskid)
   
set_task(float(random_num(5,15)), "bot_use_skill"id+TASK_BOT_USE_SKILL)
}   


Полный код Smokera

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

#define PLUGIN "[ZP] Class Smoker"
#define VERSION "1.3"
#define AUTHOR "4eRT"

//Main Class, modelT & Sprite Beam
new g_zclass_smokerg_Line
//Sounds
new g_sndMiss[] = "zombie_plague/Smoker_TongueHit_miss.wav"
new g_sndDrag[] = "zombie_plague/Smoker_TongueHit_drag.wav"
//Some vars
new g_hooked[33], g_hooksLeft[33], g_unable2move[33], g_ovr_dmg[33]
new 
Float:g_lastHook[33]
new 
boolg_bind_use[33] = falseboolg_bind_or_not[33] = falseboolg_drag_i[33] = false
//Cvars
new cvar_maxdragscvar_dragspeedcvar_cooldowncvar_dmg2stopcvar_matescvar_extrahookcvar_unb2movecvar_nemesiscvar_survivor

enum 
(+= 100)
{
    
TASK_BOT_USE_SKILL,
}

#define ID_BOT_USE_SKILL (taskid - TASK_BOT_USE_SKILL)

//Smoker Atributes
new const zclass_name[] = { "Четырехлапый" }
new const 
zclass_info[] = { "Притягивание" }
new const 
zclass_model[] = { "U3Itzombie" }
new const 
zclass_clawmodel[] = { "v_baltazar_knife.mdl" }
const 
zclass_health 3000
const zclass_speed 240
const Float:zclass_gravity 3.0
const Float:zclass_knockback 0.7

public plugin_init()
{
    
cvar_dragspeed register_cvar("zp_smoker_dragspeed""280")
    
cvar_maxdrags register_cvar("zp_smoker_maxdrags""7")
    
cvar_cooldown register_cvar("zp_smoker_cooldown""20")
    
cvar_dmg2stop register_cvar("zp_smoker_dmg2stop""300")
    
cvar_mates register_cvar("zp_smoker_mates""0")
    
cvar_extrahook register_cvar("zp_smoker_extrahook""1")
    
cvar_unb2move register_cvar("zp_smoker_unable_move""1")
    
cvar_nemesis register_cvar("zp_smoker_nemesis""0")
    
cvar_survivor register_cvar("zp_smoker_survivor""1")
    
register_event("ResetHUD""newSpawn""b")
    
register_event("DeathMsg""smoker_death""a")
    
register_forward(FM_PlayerPreThink"fw_PlayerPreThink")
    
RegisterHam(Ham_TakeDamage"player""fw_TakeDamage")
    
register_logevent("logevent_round_start",2"1=Round_Start")

    
register_clcmd("-drag","drag_end")
}
public 
plugin_precache()
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
g_zclass_smoker zp_register_zombie_class(zclass_namezclass_infozclass_modelzclass_clawmodelzclass_healthzclass_speedzclass_gravityzclass_knockback)
    
precache_sound(g_sndDrag)
    
precache_sound(g_sndMiss)
    
g_Line precache_model("sprites/zbeam4.spr")
}

public 
logevent_round_start()
{
    for (new 
id=1id<33id++)
    {
        if (!
is_user_connected(id)) continue;
        if (
is_user_bot(id))
        {
            if (
task_exists(id+TASK_BOT_USE_SKILL)) remove_task(id+TASK_BOT_USE_SKILL)
            
set_task(float(random_num(5,15)), "bot_use_skill"id+TASK_BOT_USE_SKILL)
        }
    }
}

// bot use skill
public bot_use_skill(taskid)
{
    new 
id ID_BOT_USE_SKILL
    
if (!is_user_bot(id)) return;

        if (
zp_get_user_zombie_class(id) == g_zclass_smoker)

        
drag_start(id)
    if (
task_exists(taskid)) remove_task(taskid)
    
set_task(float(random_num(5,15)), "bot_use_skill"id+TASK_BOT_USE_SKILL)
}

public 
zp_user_infected_post(idinfector)
{
    if ((
zp_get_user_zombie_class(infector) == g_zclass_smoker) && (get_pcvar_num(cvar_extrahook) > 0))
    {
        
g_hooksLeft[infector] = g_hooksLeft[infector] + get_pcvar_num(cvar_extrahook)
        
set_hudmessage(20010000.750.9301.01.10.00.0, -1)
        
show_hudmessage(infector"+%d Притягивание%s !"get_pcvar_num(cvar_extrahook), (get_pcvar_num(cvar_extrahook) < 2) ? "" "s")
    }
    
    if (
zp_get_user_zombie_class(id) == g_zclass_smoker)
    {
        
print_chatColor(id"\g[ Зомби Чума ]\n \tКлавиша\n \gE\n - \tПритягивание Людей !\n")
        
g_hooksLeft[id] = get_pcvar_num(cvar_maxdrags)

    }
}

public 
newSpawn(id)
{
    if (
g_hooked[id])
        
drag_end(id)
}

public 
drag_start(id// starts drag, checks if player is Smoker, checks cvars
{        
    if (
zp_get_user_zombie(id) && (zp_get_user_zombie_class(id) == g_zclass_smoker) && !g_drag_i[id]) {
        
        static 
Float:cdown
        cdown 
get_pcvar_float(cvar_cooldown)

        if (!
is_user_alive(id)) {
            
print_chatColor(id"\g[ Зомби Чума ]\n \tВы не можете притягивать, если Вы мертвы !\n")
            return 
PLUGIN_HANDLED
        
}

        if (
g_hooksLeft[id] <= 0) {
            
print_chatColor(id"\g[ Зомби Чума ]\n \tВы не можете притягивать больше !\n")
            return 
PLUGIN_HANDLED
        
}

        if (
get_gametime() - g_lastHook[id] < cdown) {
            
print_chatColor(id"\g[ Зомби Чума ]\n \tПодождите\n \g%.1f секунд(ы)\n \tдля повторного Притягивания !\n"get_pcvar_float(cvar_cooldown) - (get_gametime() - g_lastHook[id]))
            return 
PLUGIN_HANDLED
        
}
        
        new 
hooktargetbody
        get_user_aiming
(idhooktargetbody)
        
        if (
zp_get_user_nemesis(id) && get_pcvar_num(cvar_nemesis) == 0) {
            
//print_chatColor(id, "\g[ Зомби Чума ]\n \tДьявол не может притягивать к себе Людей !\n")
            
return PLUGIN_HANDLED
        
}
        
        if (
is_user_alive(hooktarget)) {
            if (!
zp_get_user_zombie(hooktarget))
                {
                    if (
zp_get_user_survivor(hooktarget) && get_pcvar_num(cvar_survivor) == 0) {
                        
print_chatColor(id"\g[ Зомби Чума ]\n \tВы не можете притягивать Выжившего !\n")
                        return 
PLUGIN_HANDLED
                    
}
                    
                    
g_hooked[id] = hooktarget
                    emit_sound
(hooktargetCHAN_BODYg_sndDrag1.0ATTN_NORM0PITCH_HIGH)
                }
            else
                {
                    if (
get_pcvar_num(cvar_mates) == 1)
                    {
                        
g_hooked[id] = hooktarget
                        emit_sound
(hooktargetCHAN_BODYg_sndDrag1.0ATTN_NORM0PITCH_HIGH)
                    }
                    else
                    {
                        
print_chatColor(id"\g[ Зомби Чума ]\n \tВы не можете тянуть товарищей по команде !\n")
                        return 
PLUGIN_HANDLED
                    
}
                }

            if (
get_pcvar_float(cvar_dragspeed) <= 0.0)
                
cvar_dragspeed 1
            
            
new parm[2]
            
parm[0] = id
            parm
[1] = hooktarget
            
            set_task
(0.1"smoker_reelin"idparm2"b")
            
harpoon_target(parm)
            
            
g_hooksLeft[id]--
            
print_chatColor(id"\g[ Зомби Чума ]\n \tВ данный момент Вы не можете притягивать\n"g_hooksLeft[id], (g_hooksLeft[id] < 2) ? "" "s")
            
g_drag_i[id] = true
            
            
if(get_pcvar_num(cvar_unb2move) == 1)
                
g_unable2move[hooktarget] = true
                
            
if(get_pcvar_num(cvar_unb2move) == 2)
                
g_unable2move[id] = true
                
            
if(get_pcvar_num(cvar_unb2move) == 3)
            {
                
g_unable2move[hooktarget] = true
                g_unable2move
[id] = true
            
}
        } else {
            
g_hooked[id] = 33
            noTarget
(id)
            
emit_sound(hooktargetCHAN_BODYg_sndMiss1.0ATTN_NORM0PITCH_HIGH)
            
g_drag_i[id] = true
            g_hooksLeft
[id]--
            
print_chatColor(id"\g[ Зомби Чума ]\n \tВ данный момент Вы не можете притягивать\n"g_hooksLeft[id], (g_hooksLeft[id] < 2) ? "" "s")
        }
    }
    else
        return 
PLUGIN_HANDLED
    
    
return PLUGIN_CONTINUE
}

public 
smoker_reelin(parm[]) // dragging player to smoker
{
    new 
id parm[0]
    new 
victim parm[1]

    if (!
g_hooked[id] || !is_user_alive(victim))
    {
        
drag_end(id)
        return
    }

    new 
Float:fl_Velocity[3]
    new 
idOrigin[3], vicOrigin[3]

    
get_user_origin(victimvicOrigin)
    
get_user_origin(ididOrigin)

    new 
distance get_distance(idOriginvicOrigin)

    if (
distance 1) {
        new 
Float:fl_Time distance get_pcvar_float(cvar_dragspeed)

        
fl_Velocity[0] = (idOrigin[0] - vicOrigin[0]) / fl_Time
        fl_Velocity
[1] = (idOrigin[1] - vicOrigin[1]) / fl_Time
        fl_Velocity
[2] = (idOrigin[2] - vicOrigin[2]) / fl_Time
    
} else {
        
fl_Velocity[0] = 0.0
        fl_Velocity
[1] = 0.0
        fl_Velocity
[2] = 0.0
    
}

    
entity_set_vector(victimEV_VEC_velocityfl_Velocity//<- rewritten. now uses engine
}

public 
drag_end(id// drags end function
{
    
g_hooked[id] = 0
    beam_remove
(id)
    
remove_task(id)
    
    if (
g_drag_i[id])
        
g_lastHook[id] = get_gametime()
    
    
g_drag_i[id] = false
    g_unable2move
[id] = false
}

public 
smoker_death() // if smoker dies drag off
{
    new 
id read_data(2)
    
    
beam_remove(id)
    
    if (
g_hooked[id])
        
drag_end(id)
}

public 
fw_TakeDamage(victiminflictorattackerFloat:damage// if take damage drag off
{
    if (
is_user_alive(attacker) && (get_pcvar_num(cvar_dmg2stop) > 0))
    {
        
g_ovr_dmg[victim] = g_ovr_dmg[victim] + floatround(damage)
        if (
g_ovr_dmg[victim] >= get_pcvar_num(cvar_dmg2stop))
        {
            
g_ovr_dmg[victim] = 0
            drag_end
(victim)
            return 
HAM_IGNORED;
        }
    }

    return 
HAM_IGNORED;
}

public 
fw_PlayerPreThink(id)
{
    if (!
is_user_alive(id))
        return 
FMRES_IGNORED
    
    
new button get_user_button(id)
    new 
oldbutton get_user_oldbutton(id)
    
    if (
zp_get_user_zombie(id) && (zp_get_user_zombie_class(id) == g_zclass_smoker))
    {
        if ((
oldbutton IN_USE) && !(button IN_USE))
            
drag_start(id)
        
        if (!(
oldbutton IN_USE) && (button IN_USE))
            
drag_end(id)
    }
    
    if (!
g_drag_i[id]) {
        
g_unable2move[id] = false
    
}
        
    if (
g_unable2move[id] && get_pcvar_num(cvar_unb2move) > 0)
    {
        
set_pev(idpev_maxspeed1.0)
    }
    
    return 
PLUGIN_CONTINUE
}

public 
client_disconnect(id// if client disconnects drag off
{
    if (
id <= || id 32)
        return
    
    if (
g_hooked[id])
        
drag_end(id)
    
    if(
g_unable2move[id])
        
g_unable2move[id] = false
}

public 
harpoon_target(parm[]) // set beam (ex. tongue:) if target is player
{
    new 
id parm[0]
    new 
hooktarget parm[1]

    
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
    
write_byte(8)    // TE_BEAMENTS
    
write_short(id)
    
write_short(hooktarget)
    
write_short(g_Line)    // sprite index
    
write_byte(0)    // start frame
    
write_byte(0)    // framerate
    
write_byte(200)    // life
    
write_byte(8)    // width
    
write_byte(1)    // noise
    
write_byte(155)    // r, g, b
    
write_byte(155)    // r, g, b
    
write_byte(55)    // r, g, b
    
write_byte(90)    // brightness
    
write_byte(10)    // speed
    
message_end()
}

public 
bind_v_key(idkeys)
{
    
g_bind_or_not[id] = true
    
switch(keys)
    {
        case 
0:
            
client_cmd(id"bind v ^"+drag^"")
    
        case 
1:
            
g_bind_use[id] = true
            
        
default:
            
g_bind_or_not[id] = false
    
}
    
    return 
PLUGIN_HANDLED
}

public 
noTarget(id// set beam if target isn't player
{
    new 
endorigin[3]

    
get_user_origin(idendorigin3)

    
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
    
write_byteTE_BEAMENTPOINT ); // TE_BEAMENTPOINT
    
write_short(id)
    
write_coord(endorigin[0])
    
write_coord(endorigin[1])
    
write_coord(endorigin[2])
    
write_short(g_Line// sprite index
    
write_byte(0)    // start frame
    
write_byte(0)    // framerate
    
write_byte(200)    // life
    
write_byte(8)    // width
    
write_byte(1)    // noise
    
write_byte(155)    // r, g, b
    
write_byte(155)    // r, g, b
    
write_byte(55)    // r, g, b
    
write_byte(75)    // brightness
    
write_byte(0)    // speed
    
message_end()
}

public 
beam_remove(id// remove beam
{
    
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
    
write_byte(99)    //TE_KILLBEAM
    
write_short(id)    //entity
    
message_end()
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/

// Color Chat
stock print_chatColor(const id,const input[], any:...)
{
    new 
msg[191], players[32], count 1;
    
vformat(msg,190,input,3);
    
replace_all(msg,190,"\g","^4");// green
    
replace_all(msg,190,"\n","^1");// normal
    
replace_all(msg,190,"\t","^3");// team
    
    
if (idplayers[0] = id; else get_players(players,count,"ch");
    for (new 
i=0;i<count;i++)
        if (
is_user_connected(players[i]))
    {
        
message_begin(MSG_ONE_UNRELIABLE,get_user_msgid("SayText"),_,players[i]);
        
write_byte(players[i]);
        
write_string(msg);
        
message_end();
    }
}   
МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 673
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 149 раз.
Поблагодарили: 86 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...

Re: Способности Ботов  [Решено]

Сообщение артист666 » 05 апр 2019, 07:07

Что-то типа того:

Код: Выделить всё
if (zp_get_user_zombie_class(id) == g_zclass_smoker)
{
   new hooktarget, body
   get_user_aiming
(id, hooktarget, body)

    new parm[2]
    parm[0] = id
    parm
[1] = hooktarget
            
    set_task
(0.1, "smoker_reelin", id, parm, 2, "b") // или smoker_reelin(parm) только ниже harpoon_target
    harpoon_target(parm)
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Способности Ботов

Сообщение MayroN » 05 апр 2019, 21:48

артист666,
Спасибо,попробую.Будут новости - отпишусь
МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 673
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 149 раз.
Поблагодарили: 86 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...

Re: Способности Ботов

Сообщение MayroN » 23 апр 2019, 00:15

артист666
Попробовал и сразу ошибка функции.
Сделал так
Код: Выделить всё
  // bot use skill
public bot_use_skill(taskid)
{
   new id = ID_BOT_USE_SKILL
   if 
(!is_user_bot(id)) return;
 
if 
(zp_get_user_zombie_class(id) == g_zclass_smoker)
{
   new hooktarget, body
   get_user_aiming
(id, hooktarget, body)

    new parm[2]
    parm[0] = id
    parm
[1] = hooktarget
            
    set_task
(0.1, "smoker_reelin", id, parm, 2, "b") // или smoker_reelin(parm) только ниже harpoon_target
    harpoon_target(parm)
}
 
   if 
(task_exists(taskid)) remove_task(taskid)
   set_task(float(random_num(5,15)), "bot_use_skill", id+TASK_BOT_USE_SKILL)
}
МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 673
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 149 раз.
Поблагодарили: 86 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...

Re: Способности Ботов

Сообщение артист666 » 23 апр 2019, 17:48

Вставил не так, значит. )
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Способности Ботов

Сообщение xbass13 » 23 апр 2019, 19:37

MayroN писал(а):артист666
Попробовал и сразу ошибка функции.

400 сообщений почти, вам помощь нужна, есть желание помогать, но нет желания допрос устраивать. Поточнее можно? В каком месте ошибка? Не скомпилировалось? Сервер упал? На каком месте упал?

ЗЫ
get_user_aiming(id, hooktarget, body)
нет проверки на hooktarget, там может и не быть игрока
Аватара пользователя
xbass13
 
Сообщения: 96
Зарегистрирован: 13 июн 2012, 21:20
Благодарил (а): 36 раз.
Поблагодарили: 35 раз.
Опыт программирования: Больше трех лет
Языки программирования: pawn, c++, js, php

Re: Способности Ботов

Сообщение артист666 » 23 апр 2019, 23:04

Что кипиш поднял?
Всё у него работает, раз тема решена.
Посмотри в первом посте плагин, обрати внимание, что в функции smoker_reelin есть проверка.
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Способности Ботов

Сообщение xbass13 » 24 апр 2019, 08:28

В harpoon нет проверки.
Если бы она была решена, обсуждение прекратили бы давно. Пометка что "решена" тема поставлена ещё 5го-6го числа.
Зы
Ну решена, так решена
Аватара пользователя
xbass13
 
Сообщения: 96
Зарегистрирован: 13 июн 2012, 21:20
Благодарил (а): 36 раз.
Поблагодарили: 35 раз.
Опыт программирования: Больше трех лет
Языки программирования: pawn, c++, js, php


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

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 14