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

Зомби класс Revenant ice  [Решено]

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

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

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

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

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

Зомби класс Revenant ice  [Решено]

Сообщение MrBest » 25 сен 2019, 16:30

Привет , ребят помогите пж с плагином на ZP
Все же знают зм класс Revenant ice в плагине есть функция попадания по игроку при которой выводится в чат (хз что) какие то цифры, могу предположить что части тела.
то есть при игре выводится сообщение типо
touch 1 ; touch 7

public touchPlayer(ball, player) {
client_print(0,print_chat,"touch %d",player)
remove_task(player)
paralize(player)
set_task(get_pcvar_float(cvar_paralizeballparalizetime),"unparalize_player",player)

return PLUGIN_HANDLED
}

Хотелось бы исправить на такое
Вы попали в name
где name будет имя игрока !

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

new const ball_name[] = "paralize_ball"
new const ball_model[] = "models/zombie/w_hiddentail2.mdl"

new const ball_soundtouch[] = { "warcraft3/frostnova.wav" }
new const zclass_name[] = { "Ревенант Ice" } // name
new const zclass_info[] = { "\r[\yАдмин\r]" } // description
new const zclass_model[] = { "zm_revenant_ice" } // model
new const zclass_clawmodel[] = { "v_revenant_ice.mdl" } // claw model
const zclass_health = 12500 // health
const zclass_speed = 245 // speed
const Float:zclass_gravity = 0.7 // gravity
const Float:zclass_knockback = 1.0 // knockback

#define OFFSET_MODELINDEX 491
#define OFFSET_LINUX 5 

new index, defaultindex

new g_zclassparalize
new cvar_paralizedelay 
, cvar_paralizevelocity  , cvar_paralizeballhealth , cvar_paralizeballparalizetime
new sTrail 
, g_touchs[512] , g_can[33] , g_paralizen[33]

public plugin_init()
{
    register_plugin("[ZM-Podrostki] Ice", "1.0", "[ZM-Podrostki]")

    cvar_paralizedelay = register_cvar("zp_classparalize_delay","15")
    cvar_paralizevelocity = register_cvar("zp_classparalizeball_velocity","1300")
    cvar_paralizeballhealth = register_cvar("zp_classparalizeball_health","5")
    cvar_paralizeballparalizetime = register_cvar ( "zp_classparalizeball_paralizetime", "7.0" )

    register_touch(ball_name, "worldspawn",        "touchWorld")
    register_touch(ball_name, "func_wall",            "touchWorld")
    register_touch(ball_name, "func_door",            "touchWorld")
    register_touch(ball_name, "func_door_rotating", "touchWorld")
    register_touch(ball_name, "func_wall_toggle",    "touchWorld")
    register_touch(ball_name, "func_breakable",    "touchWorld")
    register_touch(ball_name, "player",            "touchPlayer")
    register_think(ball_name,"ball_think")

    register_clcmd("drop","paralize_cmd")
    register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
    register_forward(FM_PlayerPreThink, "fw_PreThink")

    RegisterHam(Ham_Killed, "player", "fw_PlayerKilled")

    RegisterHam(Ham_Player_Duck, "player", "Player_Duck", 1)
}

public plugin_precache()
{
    precache_model(ball_model)
    sTrail = precache_model("sprites/zombie/laserbeam.spr")

    g_zclassparalize = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)    

    index 
= precache_model("models/player/zm_revenant_ice/zm_revenant_ice.mdl")
        defaultindex = precache_model("models/player.mdl")
}

public paralize_cmd( id )
{
    if( !is_user_alive(id) || !zp_get_user_zombie(id) || zp_get_user_zombie_class(id) != g_zclassparalize || zp_get_user_nemesis(id) )
        return PLUGIN_CONTINUE;

    if(g_can[id]) 
    
{
        client_print(id,print_center,"Ждите еще %d секунд",g_can[id])
        return PLUGIN_HANDLED;
    }

    static Float:origin[3], Float:angles[3], Float:v_forward[3], Float:v_right[3], Float:v_up[3], Float:gun_position[3], Float:player_origin[3], Float:player_view_offset[3];
    static Float:OriginX[3]
    pev(id, pev_v_angle, angles);
    pev(id, pev_origin, OriginX);
    engfunc(EngFunc_MakeVectors, angles);

    global_get(glb_v_forward, v_forward);
    global_get(glb_v_right, v_right);
    global_get(glb_v_up, v_up);

    //m_pPlayer->GetGunPosition( ) = pev->origin + pev->view_ofs
    pev(id, pev_origin, player_origin);
    pev(id, pev_view_ofs, player_view_offset);
    xs_vec_add(player_origin, player_view_offset, gun_position);

    xs_vec_mul_scalar(v_forward, 13.0, v_forward);
    xs_vec_mul_scalar(v_right, 0.0, v_right);
    xs_vec_mul_scalar(v_up, 5.0, v_up);

    xs_vec_add(gun_position, v_forward, origin);
    xs_vec_add(origin, v_right, origin);
    xs_vec_add(origin, v_up, origin);

    new Float:StartOrigin[3]
            
    StartOrigin
[0] = origin[0];
    StartOrigin[1] = origin[1];
    StartOrigin[2] = origin[2];


    new Float:fVelocity[3] , Float:flOrigin[3] , Float:flAngle[3]
    pev(id,pev_origin,flOrigin)
    pev(id,pev_angles,flAngle)

    new ball = create_entity("info_target")
    
    if 
(!ball) return PLUGIN_HANDLED

    g_touchs
[ball] = 0

    entity_set_string
(ball, EV_SZ_classname, ball_name)
    
    entity_set_model
(ball, ball_model)
    
    entity_set_origin
(ball, StartOrigin)
    
    entity_set_vector
(ball, EV_VEC_angles, flAngle)
    
    new Float
:MinBox[3] = {-1.0, -1.0, -1.0}
    new Float:MaxBox[3] = {1.0, 1.0, 1.0}
    entity_set_vector(ball, EV_VEC_mins, MinBox)
    entity_set_vector(ball, EV_VEC_maxs, MaxBox)
    
    entity_set_int
(ball, EV_INT_solid, SOLID_SLIDEBOX)
    
    entity_set_int
(ball, EV_INT_movetype, MOVETYPE_BOUNCEMISSILE)
    
    entity_set_edict
(ball, EV_ENT_owner, id)
    
    entity_set_int
(ball, EV_INT_effects, EF_BRIGHTLIGHT)
    
    VelocityByAim
(id, get_pcvar_num(cvar_paralizevelocity ), fVelocity)
    entity_set_vector(ball , EV_VEC_velocity, fVelocity)

    fm_set_rendering(ball, kRenderFxGlowShell,255, 255, 255, kRenderNormal, 16)
    
    message_begin
(MSG_BROADCAST, SVC_TEMPENTITY)
    write_byte(TE_BEAMFOLLOW) // Temporary entity ID
    write_short(ball) // Entity
    write_short(sTrail) // Sprite index
    write_byte(10) // Life
    write_byte(3) // Line width
    write_byte(100) // Red
    write_byte(255) // Green
    write_byte(255) // Blue
    write_byte(255) // Alpha
    message_end() 

    UTIL_PlayPlayerAnimation
(id,10)
    UTIL_PlayWeaponAnimation(id,8)

    g_can[id] = get_pcvar_num(cvar_paralizedelay)
    set_task(1.0,"ability_zero",id)

    entity_set_float(ball, EV_FL_health , get_pcvar_float(cvar_paralizeballhealth))

    entity_set_float(ball, EV_FL_nextthink, get_gametime() + 0.1) 
    
    return PLUGIN_HANDLED
;
}

public touchWorld(ball, world) {

    emit_sound(ball, CHAN_WEAPON, ball_soundtouch, 1.0, ATTN_NORM, 0, PITCH_NORM)
    g_touchs[ball] += 1
    if
(g_touchs[ball] == get_pcvar_num(cvar_paralizeballhealth)) remove_entity(ball)
    
    return PLUGIN_HANDLED
}

public touchPlayer(ball, player) {
    client_print(0,print_chat,"touch %d",player)
    remove_task(player)
    paralize(player)
    set_task(get_pcvar_float(cvar_paralizeballparalizetime),"unparalize_player",player)
    
    return PLUGIN_HANDLED
}

public event_round_start()
{
    new iEnt = FM_NULLENT;
    while( (iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", ball_name)) > 0 )
    {
        engfunc(EngFunc_RemoveEntity,iEnt)
    }    

    for
(new i;i<=32;i++)
    {
        if(g_paralizen[i]) fm_set_rendering(i)
        g_can[i] = 0
        g_paralizen
[i] = 0
        remove_task
(i)
    }
}

public ball_think(ball)
{
    if(!is_valid_ent(ball))
        return;

    new Float:oldangles[3],Float:angles[3]
    pev(ball,pev_angles,oldangles)
    angles[0] = oldangles[0] + random_float(20.0,100.0)
    angles[1] = oldangles[1] + random_float(10.0,80.0)
    angles[2] = oldangles[2] + random_float(10.0,80.0)
    set_pev(ball,pev_angles,angles)

    new Float:Velocity[3]
    pev(ball,pev_velocity,Velocity)

    if(Velocity[0] < 1.0 && Velocity[2] < 1.0 && Velocity[1] < 1.0) remove_entity(ball)

    entity_set_float(ball, EV_FL_nextthink, get_gametime() + 0.1) 

}

public paralize(id)
{
    if(!is_user_alive(id) || zp_get_user_zombie(id))
        return;

    g_paralizen[id] = 1
    fm_set_rendering
(id, kRenderFxGlowShell,100, 255, 255, kRenderNormal, 16)
    set_task(get_pcvar_float(cvar_paralizeballparalizetime),"unparalize_player",id)
}

public unparalize_player(id)
{
    if(!is_user_alive(id) || zp_get_user_zombie(id))
        return;

    g_paralizen[id] = 0
    fm_set_rendering
(id)
}

public remove_values(id)
{
    remove_task(id)
    g_can[id] = 0
}

public ability_zero(id) 
{
    g_can[id] -= 1
    if
(!g_can[id]) client_print(id,print_center,"Скилл готов нажми G")
    if(g_can[id]) set_task(1.0,"ability_zero",id)
}

public fw_PreThink(id)
{
    if( !is_user_alive(id) || zp_get_user_zombie(id) || !g_paralizen[id])
        return PLUGIN_CONTINUE;

    set_pev( id, pev_button, pev(id,pev_button) & ~IN_ATTACK );

    set_pev(id, pev_maxspeed, 0.0)        

    new Float
:vel[3]
    set_pev(id,pev_velocity,vel)

    return PLUGIN_HANDLED
}

public zp_user_humanized_post(id)
{
    fm_set_user_model_index(id, defaultindex)

     remove_values(id)
}
public fw_PlayerKilled(id, attacker, shouldgib) remove_values(id)
public client_connect(id)  remove_values(id)

public zp_user_infected_post(id) 
{
    if((zp_get_user_zombie_class(id) == g_zclassparalize) && (zp_get_user_zombie(id)))
    {
        fm_set_user_model_index(id, index)
    }
    remove_values(id)
}

public zp_user_infected_pre(id) 
{ 
        if
(!(get_user_flags(id) & ADMIN_LEVEL_B)) 
    
{ 
            if
(zp_get_user_next_class(id) == g_zclassparalize) 
        
{ 
                    zp_set_user_zombie_class
(id, 0) 
            ChatColor
(id, "!g[«Зомби-Подростки®»] !yкласс только для !tВип")
            }     
        
}     
} 

stock fm_set_rendering
(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
{
    static Float:color[3]
    color[0] = float(r)
    color[1] = float(g)
    color[2] = float(b)
    
    set_pev
(entity, pev_renderfx, fx)
    set_pev(entity, pev_rendercolor, color)
    set_pev(entity, pev_rendermode, render)
    set_pev(entity, pev_renderamt, float(amount))
}

stock UTIL_PlayWeaponAnimation(const Player, const Sequence)
{
    set_pev(Player, pev_weaponanim, Sequence)
    
    message_begin
(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = Player)
    write_byte(Sequence)
    write_byte(pev(Player, pev_body))
    message_end()
}

stock UTIL_PlayPlayerAnimation(const id, const Sequence , Float:frame = 1.0 , Float:framerate = 1.0)
{
    entity_set_int(id, EV_INT_sequence, Sequence)
    entity_set_int(id, EV_INT_gaitsequence, 1)
    entity_set_float(id, EV_FL_frame, frame)
    entity_set_float(id, EV_FL_framerate, framerate)
}

stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
    new_velocity[0] = origin2[0] - origin1[0]
    new_velocity[1] = origin2[1] - origin1[1]
    new_velocity[2] = origin2[2] - origin1[2]
    new Float:num = floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
    new_velocity[0] *= num
    new_velocity
[1] *= num
    new_velocity
[2] *= num
       
    return 1
} 

stock fm_cs_set_user_deaths
(id, value)
{
    set_pdata_int(id, 444, value, 5)
}

stock fm_cs_get_user_team(id)
{
    return get_pdata_int(id, 114, 5);
}

public Player_Duck(id)
{
    if(zp_get_user_zombie_class(id) == g_zclassparalize && zp_get_user_zombie(id))
    {
           static button, ducking
           button 
= pev(id, pev_button)
        ducking = pev(id, pev_flags) & (FL_DUCKING | FL_ONGROUND) == (FL_DUCKING | FL_ONGROUND)

           if(button & IN_DUCK || ducking)
        {
            set_pev(id, pev_view_ofs, {0.0, 0.0, 20.0})   
           
}
    }
}

stock fm_set_user_model_index(id, value)
{
    set_pdata_int(id, OFFSET_MODELINDEX, value, OFFSET_LINUX)
}
  

stock ChatColor
(const id, const input[], any:...)
{
    new count = 1, players[32]
    static msg[191]
    vformat(msg, 190, input, 3)

    replace_all(msg, 190, "!g", "^4")
    replace_all(msg, 190, "!y", "^1")
    replace_all(msg, 190, "!t", "^3")

    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();
            }
        }
    }
}
Последний раз редактировалось MrBest 28 сен 2019, 01:33, всего редактировалось 2 раз(а).
Аватара пользователя
MrBest
 
Сообщения: 29
Зарегистрирован: 25 сен 2019, 16:17
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Pawn , плагины zombie mod

Re: Зомби класс Revenant ice

Сообщение Leonidddd » 26 сен 2019, 01:51

MrBest, с вас 100 руб на новое колёсико мыши из-за долгой прокрутки вниз(шутка). Расположите код в специальный тег для кода/исходника, т.к. сейчас код вообще не читабелен.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2259
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 182 раз.
Поблагодарили: 632 раз.

Re: Зомби класс Revenant ice

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

Ну удали строку:
Код: Выделить всё
client_print(0,print_chat,"touch %d",player
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2698
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 283 раз.
Поблагодарили: 635 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Зомби класс Revenant ice

Сообщение MrBest » 28 сен 2019, 01:37

Leonidddd писал(а):MrBest, с вас 100 руб на новое колёсико мыши из-за долгой прокрутки вниз(шутка). Расположите код в специальный тег для кода/исходника, т.к. сейчас код вообще не читабелен.



Извините, первый раз публикую. Догадывался о такой функции, но чет протупил и не воспользовался

Добавлено спустя 1 минуту 37 секунд:
артист666 писал(а):Ну удали строку:
Код: Выделить всё
client_print(0,print_chat,"touch %d",player)


если закомментировать строку то вообще ничего не будет
А нужен вывод в чат о попадании по игроку !

Добавлено спустя 7 минут 8 секунд:
Leonidddd писал(а):MrBest, с вас 100 руб на новое колёсико мыши из-за долгой прокрутки вниз(шутка). Расположите код в специальный тег для кода/исходника, т.к. сейчас код вообще не читабелен.


Усе , поместил в тег для "кода/исходника" . Надеюсь поможете ибо я старался целый код копировал потом в тег кода/исходника вставлял
Так что надеюсь на вашу помощь )
Аватара пользователя
MrBest
 
Сообщения: 29
Зарегистрирован: 25 сен 2019, 16:17
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Pawn , плагины zombie mod

Re: Зомби класс Revenant ice

Сообщение Leonidddd » 28 сен 2019, 01:42

MrBest, по EV_ENT_owner сразу получайте индекс игрока, чей этот шар, в моменте touchPlayer у индекса шара, потом просто через Вы должны зарегистрироваться, чтобы видеть ссылки. получаете ник владельца шара, потом ник игрока, которого коснулись и уже можете вывести в чат, примерно так:

client_print(0,print_chat,"Игрок %s попал шаром в игрока %s",szNameOwner, szNamePlayer);

Естественно, проверки на коннект и на валидность стара стоит добавить.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2259
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 182 раз.
Поблагодарили: 632 раз.

Re: Зомби класс Revenant ice

Сообщение MrBest » 28 сен 2019, 01:53

Leonidddd писал(а):MrBest, по EV_ENT_owner сразу получайте индекс игрока, чей этот шар, в моменте touchPlayer у индекса шара, потом просто через Вы должны зарегистрироваться, чтобы видеть ссылки. получаете ник владельца шара, потом ник игрока, которого коснулись и уже можете вывести в чат, примерно так:

client_print(0,print_chat,"Игрок %s попал шаром в игрока %s",szNameOwner, szNamePlayer);

Естественно, проверки на коннект и на валидность стара стоит добавить.


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

Добавлено спустя 7 минут 14 секунд:
client_print(0,print_chat,"Игрок %s попал шаром в игрока %s",szNameOwner, szNamePlayer);
Это понятно, остальное не особо
Аватара пользователя
MrBest
 
Сообщения: 29
Зарегистрирован: 25 сен 2019, 16:17
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Pawn , плагины zombie mod

Re: Зомби класс Revenant ice

Сообщение Leonidddd » 28 сен 2019, 01:54

MrBest, тут гением и не нужно быть, просто азы знать и достаточно. В
Код: Выделить всё
public touchPlayer(ball, player)


1) Получить индекс владельца :
Код: Выделить всё
new pId = entity_get_edict(ball, EV_ENT_owner);


Потом получать их имена

Код: Выделить всё
    new szNameOwner[33], szNamePlayer[33];
    get_user_name(pId, szNameOwner, charsmax(szNameOwner));
    get_user_name(player, szNamePlayer, charsmax(szNamePlayer));

и выводить как я уже писал выше. Можно добавить проверку на коннект индекса владельца, ибо он может вылететь/ливнуть,пока шар летит до цели и может быть флуд в консоль о том, что индекс не верен, не критично, но не приятно видеть такие логи.
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2259
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 182 раз.
Поблагодарили: 632 раз.

Re: Зомби класс Revenant ice

Сообщение MrBest » 28 сен 2019, 01:57

Leonidddd писал(а):MrBest, тут гением и не нужно быть, просто азы знать и достаточно. В
Код: Выделить всё
public touchPlayer(ball, player


1) Получить индекс владельца :
Код: Выделить всё
new pId = entity_get_edict(ball, EV_ENT_owner); 


Потом получать их имена

Код: Выделить всё
    new szNameOwner[33], szNamePlayer[33];
    get_user_name(pId, szNameOwner, charsmax(szNameOwner));
    get_user_name(player, szNamePlayer, charsmax(szNamePlayer));
 

и выводить как я уже писал выше. Можно добавить проверку на коннект индекса владельца, ибо он может вылететь/ливнуть,пока шар летит до цели и может быть флуд в консоль о том, что индекс не верен, не критично, но не приятно видеть такие логи.


готов 200 рублей на колесико мышки выделить)
Спасибо огромное)
Аватара пользователя
MrBest
 
Сообщения: 29
Зарегистрирован: 25 сен 2019, 16:17
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Pawn , плагины zombie mod

Re: Зомби класс Revenant ice

Сообщение Leonidddd » 28 сен 2019, 01:58

MrBest, не стоит) полагаю, уже явно всё понятно расписал .
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2259
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 182 раз.
Поблагодарили: 632 раз.

Re: Зомби класс Revenant ice

Сообщение MrBest » 28 сен 2019, 01:59

Leonidddd писал(а):MrBest, не стоит) полагаю, уже явно всё понятно расписал .

Ясней не куда)
Спасибо огромное)))
Аватара пользователя
MrBest
 
Сообщения: 29
Зарегистрирован: 25 сен 2019, 16:17
Благодарил (а): 5 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев
Языки программирования: Pawn , плагины zombie mod


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

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

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

cron