Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

2 страниц V   1 2

Цикл. Прозрачность рук.

Статус пользователя Nickk
сообщение 2.3.2013, 18:48
Сообщение #1
Стаж: 13 лет

Сообщений: 438
Благодарностей: 120
Полезность: 523

Здравствуйте, подскажите пожалуйста:
1) Как сделать нормальный цикл, где проверяем всех игроков, если для игрока bla = true, то отсылаем ему сообщение и сохраняем его в массив.
Если такого игрока нету, то логируем через log_amx
2) Как сделать прозрачность рук с оружием? ( Пример )

Заранее спасибо.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Andrei
сообщение 2.3.2013, 19:35
Сообщение #2


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

1)


new g_iPlayersData[ MAX_CLIENTS ]; // Массив с индексами полученных игроков.
new g_iPlayersFound; // колво найденных игроков - оффсет для массива который выше.

Я сделал функцию,где я прохожусь по всем живым игрокам,записываю их,как сказано выше,а так же,если это 26 игрок,я запишу его в булевую перменную,где потом,смогу его узнать где либо.

Код
#include < amxmodx >

const MAX_CLIENTS = 32;  

new    g_iPlayersData[ MAX_CLIENTS ],
    g_iPlayersFound,
    g_iMaxClients;

new bool: g_bsIsFounded[ MAX_CLIENTS +1 ];


public plugin_init( )
{
    g_iMaxClients = get_maxplayers( );
}

public UTIL_GetPlayersAlive( )
{
    g_iPlayersFound = 0; // Обнуляем найденных.

    new iCell;

    for ( iCell = 1; iCell <= g_iMaxClients; iCell++ )
    {
        if( !is_user_alive( iCell )  )
        {
            continue;
        }

        g_iPlayersData[ g_iPlayersFound++ ] = iCell;

        g_bsIsFounded[ iCell ] = iCell == 26 ? true : false;
    }
}


Вы можете использовать эту функцию где либо,что бы узнать индекс или кол-во живых игроков.

Просто в нужной функции вызвать UTIL_GetPlayersAlive( ),так же из g_iPlayersData вы можете получить индекс случайного игрока.




2) Это модель.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Nickk
сообщение 2.3.2013, 19:50
Сообщение #3
Стаж: 13 лет

Сообщений: 438
Благодарностей: 120
Полезность: 523

1) Большое спасибо.
Только мне нужно немного другое.
Игрок, для которого bla[id] = true один, т.е. мне не нужно узнавать кол-во.

Получается, код нужен примерно такой:

Код
#include < amxmodx >

const MAX_CLIENTS = 32;  

new    g_iPlayersData[ MAX_CLIENTS ],
    g_iMaxClients;

new bool:bla[33]

public plugin_init( )
{
    g_iMaxClients = get_maxplayers( );
}

public UTIL_GetPlayersAlive( )
{
    new iCell;

    for ( iCell = 1; iCell <= g_iMaxClients; iCell++ )
    {
        if(bla( [iCell] ) )
        {
                  тут нужно его куда то записать, чтобы потом можно было отправить худ
        }
        если его нету, то
         {
                  мой код
          }
    }
}


2)Это просто пример, как это выглядит, это как-то через плагин делается.
Вот хочу узнать, как.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 2.3.2013, 20:01
Сообщение #4
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

рендеринг моделей делается кажется через индекс энтити самой модели , точно не уверен
pev_renderamt
pev_rendermode
pev_renderfx

буду завтра-послезавтра этим заниматся.
а вообще обычный рендеринг энтити выглядит примерно так

Цитата
entity_set_int(item_ent, EV_INT_renderfx, kRenderFxGlowShell)

//entity_set_vector(item_ent, EV_VEC_origin, fOrigin)
//entity_set_vector(item_ent, EV_VEC_velocity, fVelocity)
entity_set_vector(item_ent, EV_VEC_rendercolor, fGlowColors)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Andrei
сообщение 2.3.2013, 20:01
Сообщение #5


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

Я вас понял.

Вам необходимо отловить момент,когда игрок достает оружие и установить модель. Сделать можно это помощью функции:

Код
RegisterHam( Ham_Item_Deploy, "weapon_usp", "CBaseWeapon_Deploy_Post", .Post = true );


false\true соотвественно pre\post (до\после). В вашем случае нам нужен post.

Функции передают ID оружия,не игрока,вам необходимо будет его получить:


Код
const OFFSET_LINUX_WEAPONS = 4;
const m_pPlayer = 41;
#define IsValidPrivateData(%0)  ( pev_valid( %0 ) == 2 )


Код
public CBaseWeapon_Deploy_Post( pEntity )
{
        if( !IsValidPrivateData( pEntity ) )
        {
                return HAM_HANDLED;
        }

        new pPlayer;

        pPlayer = get_pdata_cbase( pEntity , m_pPlayer , OFFSET_LINUX_WEAPONS );

        set_pev( pPlayer, pev_viewmodel2, WEAPON_V_MODEL );
        set_pev( pPlayer, pev_weaponmodel2, WEAPON_P_MODEL );


        return HAM_IGNORED;
}


Важно проверять валидность оффсетов get_pdata_cbase,принадлежит ли игрок или ентити оффсету,иначе возможны падения сервера,как опыт показывает,при смене карты.


Соответственно:

Код
public plugin_precache( )
{
    precache_model( WEAPON_V_MODEL );
    precache_model( WEAPON_P_MODEL );
}


Код
new const WEAPON_V_MODEL [ ] = "weapons/v_new.mdl";
new const WEAPON_P_MODEL [ ] = "weapons/p_new.mdl";
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Nickk
сообщение 2.3.2013, 20:06
Сообщение #6
Стаж: 13 лет

Сообщений: 438
Благодарностей: 120
Полезность: 523

Цитата
примертно так но если надо чисто для тех у кого true то можно for (iCell[your bool] ,

Error: Invalid subscript (not an array or too many subscripts): "iCell" on line 53

Andrei, большое спасибо, второе понял.
Можете с первым помочь?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Andrei
сообщение 2.3.2013, 20:12
Сообщение #7


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

if( g_bsIsFounded[ Index ] )

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

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

Отредактировал: Andrei, - 2.3.2013, 20:13
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Nickk
сообщение 2.3.2013, 20:14
Сообщение #8
Стаж: 13 лет

Сообщений: 438
Благодарностей: 120
Полезность: 523

По сравнению с вами, не бум-бум.
Ладно, спасибо.
Можно закрывать.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Andrei
сообщение 2.3.2013, 20:19
Сообщение #9


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

Цитата(Nickk @ 2.3.2013, 21:14) *
По сравнению с вами, не бум-бум.
Ладно, спасибо.
Можно закрывать.

Нет,я не пытаюсь оскорбить или унизить,я говорю как есть,не бойтесь спрашивать.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Nickk
сообщение 2.3.2013, 20:20
Сообщение #10
Стаж: 13 лет

Сообщений: 438
Благодарностей: 120
Полезность: 523

Я не обижаюсь) Я прекрасно знаю, что в павне очень мало знаю, ибо учусь.
Еще такой вопрос: как заставить ентитю следовать за ее создателем? ( спавн ентити через clcmd )
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Andrei
сообщение 2.3.2013, 20:24
Сообщение #11


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

Цитата(Nickk @ 2.3.2013, 20:20) *
Я не обижаюсь) Я прекрасно знаю, что в павне очень мало знаю, ибо учусь.
Еще такой вопрос: как заставить ентитю следовать за ее создателем? ( спавн ентити через clcmd )

Сейчас напишу базового npc, с кода,который я сам использую.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Andrei
сообщение 2.3.2013, 20:35
Сообщение #12


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

Скрытый текст
Код
#include <amxmodx>
#include <xs>
#include <fakemeta>
#include <engine>

#define g_szClassName        "Npc"
#define g_szOberonModel    "models/zombie.mdl"


#define NPC_HEALTH        1250000.0

new const Float:NPC_SPEED =        300.0;

new g_iNpcEnt
new g_pBossTarget
new g_iMaxPlayers

new Float:g_vOrigin[3];
new Float:g_vTarOrigin[33][3];
new Float:g_vAimVector[33][3];
new Float:g_fLenToAim[33];
new Float:g_fNpcSpeed

public plugin_init()
{
    register_think(g_szClassName, "Npc_Think");

    register_clcmd("say /create", "Oberon_Npc")
    register_clcmd("say /start", "Oberon_Npc")

    g_iMaxPlayers = get_maxplayers ( )
}

public plugin_precache()
{
    precache_model( g_szOberonModel )
}

public Npc_Spawn()
{
    g_iNpcEnt = create_entity( "info_target" );

    new Float:vOrigin[3]
    new Float:vAngle[3]
    
    if(!pev_valid(g_iNpcEnt))
        return;
    
    set_pev( g_iNpcEnt, pev_classname, g_szClassName );
    set_pev( g_iNpcEnt, pev_model, g_szOberonModel );
    
    set_pev( g_iNpcEnt, pev_solid, SOLID_BBOX);
    set_pev( g_iNpcEnt, pev_movetype, MOVETYPE_PUSHSTEP);


    vOrigin[0] = 39.8;
    vOrigin[1] = -86.7;
    vOrigin[2] = -611.9;
    

    vAngle[0] = 0.0;
    vAngle[1] = -89.9;
    vAngle[2] = 0.0;
    

    engfunc( EngFunc_SetModel, g_iNpcEnt, g_szOberonModel);
    engfunc( EngFunc_SetSize, g_iNpcEnt, Float:{ -32.0, -32.0, -36.0}, Float:{  32.0,  32.0,  96.0 });
    engfunc( EngFunc_SetOrigin, g_iNpcEnt, vOrigin);
        entity_set_vector(g_iNpcEnt, EV_VEC_angles, vAngle);
    
    set_pev( g_iNpcEnt, pev_sequence, 2);

    entity_set_float(g_iNpcEnt, EV_FL_animtime, halflife_time());
    entity_set_float(g_iNpcEnt, EV_FL_framerate, 1.0);
    entity_set_int(g_iNpcEnt, EV_INT_gamestate, 1)
    
    entity_set_float(g_iNpcEnt, EV_FL_gravity, 1.0);
    
    set_pev(g_iNpcEnt, pev_flags, FL_MONSTER);
    
    set_pev(g_iNpcEnt, pev_controller_0, 125);
    set_pev(g_iNpcEnt, pev_controller_1, 125);
    set_pev(g_iNpcEnt, pev_controller_2, 125);
    set_pev(g_iNpcEnt, pev_controller_3, 125);
}

public Npc_Start()
{
    if(!pev_valid(g_iNpcEnt))
        return;

    new Float:fHealth;fHealth = NPC_HEALTH
    
    set_pev( g_iNpcEnt, pev_solid, SOLID_BBOX);
    set_pev( g_iNpcEnt, pev_movetype, MOVETYPE_PUSHSTEP);

    set_pev(g_iNpcEnt, pev_sequence, 3);
    entity_set_float(g_iNpcEnt, EV_FL_animtime, halflife_time());
    entity_set_float(g_iNpcEnt, EV_FL_framerate, 1.0);
    
    set_pev(g_iNpcEnt, pev_takedamage, DAMAGE_YES);
    set_pev(g_iNpcEnt, pev_max_health, fHealth);
    set_pev(g_iNpcEnt, pev_health, fHealth);

    
    g_fNpcSpeed = NPC_SPEED
    g_pBossTarget = 0;
    
    entity_set_float(g_iNpcEnt, EV_FL_nextthink, get_gametime() + 0.1);
}

public Npc_Think ( Entity )
{
    static pTarget
    
    // PreThink
    pTarget = 0;
    
    
    VECTORS_Init();
    pTarget = Npc_FindTarget();
    
    // If not target
    if(pTarget == 0)
    {

        if(pev(Entity, pev_sequence) != 2)
        {
            play_anim(Entity, 2);
            
            set_pev(Entity, pev_velocity, Float:{0.0, 0.0, -0.1});
        }
        
        entity_set_float(g_iNpcEnt, EV_FL_nextthink, get_gametime() + 0.1);
        
        return;
    }

    
    // Check to walk anim
    static iSequence;
    iSequence = pev(Entity, pev_sequence);
    

    if(iSequence != 4)
    {
        play_anim(Entity, 4);
        set_pev(Entity, pev_framerate, 1.4)
    }

    static Float:vAimVector[3], Float:vVelocity[3];
    
    xs_vec_copy(g_vAimVector[pTarget], vAimVector);
    
    vAimVector[2] = 0.0;
    
    vector_to_angle(vAimVector, vVelocity);
    
    vVelocity[0] = 0.0;
    vVelocity[2] = 0.0;
    
    set_pev(Entity, pev_angles, vVelocity);
    set_pev(Entity, pev_punchangle, vVelocity);
    set_pev(Entity, pev_v_angle, vVelocity);
    set_pev(Entity, pev_fixangle, 1);
    
    xs_vec_normalize(vAimVector, vAimVector);
    xs_vec_mul_scalar(vAimVector, g_fNpcSpeed, vVelocity);
    
    set_pev(Entity, pev_velocity, vVelocity);

    
    entity_set_float(g_iNpcEnt, EV_FL_nextthink, get_gametime() + 0.1);
}

stock play_anim(Entity, sequence)
{
    entity_set_int(Entity, EV_INT_sequence, sequence);
    entity_set_float(Entity, EV_FL_animtime, halflife_time());
}

stock set_angles(ent, Float:vAngles[3])
{
    set_pev(ent, pev_angles, vAngles);
    set_pev(ent, pev_punchangle, vAngles);
    set_pev(ent, pev_v_angle, vAngles);
    set_pev(ent, pev_fixangle, 1);
}

VECTORS_Init()
{
    static id;
    entity_get_vector(g_iNpcEnt, EV_VEC_origin, g_vOrigin);

    for(id = 1; id <= g_iMaxPlayers; id++)
    {
        if(!is_user_alive(id)) continue;
        
        entity_get_vector(id, EV_VEC_origin, g_vTarOrigin[id]);
        xs_vec_sub(g_vTarOrigin[id], g_vOrigin, g_vAimVector[id]);
        g_fLenToAim[id] = xs_vec_len(g_vAimVector[id]);
    }
}

Npc_FindTarget()
{
    static iPlayers[32], iNum, id;
    
    for(id = 1, iNum = 0; id <= g_iMaxPlayers; id++)
        if(is_user_alive(id))
            iPlayers[iNum++] = id;
            
    if(iNum == 0)
    {
        g_pBossTarget = 0;
        return 0;
    }
    
    if(g_pBossTarget && is_user_alive(g_pBossTarget))
    {
        return g_pBossTarget;
    }
    
    return (g_pBossTarget = iPlayers[random_num(0, iNum-1)]);
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Nickk
сообщение 2.3.2013, 20:38
Сообщение #13
Стаж: 13 лет

Сообщений: 438
Благодарностей: 120
Полезность: 523

Оо, кусок из Оберона?)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Andrei
сообщение 2.3.2013, 20:48
Сообщение #14


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

Цитата(Nickk @ 2.3.2013, 21:38) *
Оо, кусок из Оберона?)

Типа того)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Nickk
сообщение 2.3.2013, 20:57
Сообщение #15
Стаж: 13 лет

Сообщений: 438
Благодарностей: 120
Полезность: 523

Но тут он, получается, просто ищет цель.
А как сделать, чтобы ентити шел за создателем?

p.s. А его заспавнить можно, с тем кодом, что вы дали?)
А то я тут с координатами спавна мудрю, хочу его заспавнить

Отредактировал: Nickk, - 2.3.2013, 20:59
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Andrei
сообщение 2.3.2013, 21:08
Сообщение #16


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

Пропускать в цикле всех,кроме жертвы или в VECTORS_Init() установить жертву твою.
Да.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
cs-portal
сообщение 3.3.2013, 10:31
Сообщение #17
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

MOVETYPE_FOLLOW
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 3.3.2013, 13:54
Сообщение #18
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

у меня есть stock подсчета количества видимых противников,
туда можно рендом вставить тоже и юзать
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Andrei
сообщение 3.3.2013, 14:05
Сообщение #19


Стаж: 15 лет

Сообщений: 1335
Благодарностей: 693
Полезность: 740

Цитата(cs-portal @ 3.3.2013, 14:54) *
у меня есть stock подсчета количества видимых противников,
туда можно рендом вставить тоже и юзать

Не только у тебя :p

Цитата(cs-portal @ 3.3.2013, 11:31) *
MOVETYPE_FOLLOW

?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
cs-portal
сообщение 3.3.2013, 19:56
Сообщение #20
Стаж: 16 лет

Сообщений: 8181
Благодарностей: 2709
Полезность: 0

set_pev(iEnt, pev_movetype, MOVETYPE_FOLLOW)
set_pev(iEnt, pev_aiment, id)

разве не это когда энтити двигается за ведомым
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
2 страниц V   1 2
 
Тема закрытаНачать новую тему
 
0 пользователей и 2 гостей читают эту тему: