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

Создание entity( для начинающих )

Статьи или фрагменты кода для новичков и уже опытных скриптеров по AMXX.

Модератор: Chuvi

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

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

Создание entity( для начинающих )

Сообщение BaJIeHoK » 07 апр 2014, 03:27

Приветствую пользователи amx-x
Учитывая, что заняться в данный момент нечем и поползав по форуму обнаружил, что нет статей по entity. Точнее я нашел одну, но она немного о другом и поэтому я решил подготовить мануал для начинающий.

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

В данном примере будет показан способ создание самого объекта, взаимодействие с ним, а так же какие-то действия с его стороны

Создание самого объекта
Для начала создадим новый файл и добавим туда данный код

Код: Выделить всё
#include <amxmodx>
#include <fakemeta> //Для создание entity
#include <engine> //Для действий с entity
 
#define PLUGIN  "Entity"
#define VERSION         "1.0"
#define AUTHOR  "BaJIeHoK"
 
new const gClassname[] = "Robot" //Classname нашего entity
 
new const gModel[] = "models/robot.mdl" //Модель
new const gSpriteExplode[] = "sprites/dexplo.spr" //Спрайт взрыва
new const gSpriteSmoke[] = "sprites/steam1.spr" //Спрайт дыма
 
new g_Sprite[3//Сюда запишем индексы спрайтов
 
public plugin_init()
{
        register_plugin(PLUGINVERSIONAUTHOR)
 
        register_touch
(gClassname"player""EntityTouch"//Создаем событие прикосновение с entity
        register_think(gClassname"EntityThink"//Создаем событие действий entity
 
        register_clcmd
("say /entity""StartCreate"//Команда для создание
}
 
public plugin_precache()
{
        precache_modelgModel //Передаем в прекаш модель
 
        g_Sprite
[1] = precache_modelgSpriteExplode //Передаем в прекаш спрайт взрыва
        g_Sprite[2] = precache_modelgSpriteSmoke //Передаем в прекаш спрайт дыма

Думаю здесь вам всё понятно. Приступаем к созданию функции StartCreate. Чтобы облегчить создание мы получим координаты относительно взгляда игрока( куда наведен прицел ) и на том месте создадим npc

Код: Выделить всё
public StartCreate(id)
{
        new iOrigin[3//Создаем массив для хранение координат
        get_user_origin(idiOrigin3//Получаем координаты куда смотрит игрок
 
        
new iEntity create_entity("info_target"//Создаем объект info_target
        
        
if(!pev_valid(iEntity)) //Проверяем сущетсвует ли, если нет
                return PLUGIN_HANDLED //Заканчиваем. Дальше нам делать нечего
        
        
new Float:fOrigin[3//Создаем массив для float коодинат
        IVecFVec(iOriginfOrigin//Конвертируем координаты в дробные
 
        set_pev
(iEntitypev_originfOrigin//Присваиваем координаты
        set_pev(iEntitypev_classnamegClassname//Присваиваем Classname
        set_pev(iEntitypev_solidSOLID_BBOX//Делаем его непроходимым
        set_pev(iEntitypev_movetypeMOVETYPE_NONE//Не задаем тип движения, во всяком случаи пока
        set_pev(iEntitypev_sequence0//Выставляем № анимации при создании
        set_pev(iEntitypev_framerate1.0//Выставляем скорость анимации
        set_pev(iEntitypev_nextthinkget_gametime() + 1.0//Создаем запуск think
 
        engfunc
(EngFunc_SetModeliEntitygModel//Присваиваем модель
        engfunc(EngFunc_SetSizeiEntityFloat:{-16.0, -16.0, -16.0}, Float:{16.016.016.0}) //Создаем бокс вокруг entity( для прикосновения и не только )
 
        
return PLUGIN_HANDLED

Ну что же - мы создали entity. Теперь требуется создать события для него. Чем мы сейчас и займемся. Для начала создадим событие прикосновение с entity(роботом). Так как этот урок создан для новичков, хоть и имеет немного расширенное создание я не буду придумывать каких-то мего гениальных идей, а мы просто сделаем взрыв entity, если игрок с ним соприкоснется.

Код: Выделить всё
public EntityTouch(iEntityid)
{
        if(!pev_valid(iEntity)) //Проверяем сущетсвует ли, если нет
                return FMRES_IGNORED
 
        
new Float:fOrigin[3//Создаем массив для float координат
        pev(iEntitypev_originfOrigin//Получаем координаты entity
        
        message_begin
(MSG_BROADCAST,SVC_TEMPENTITY//Создаем сообщение
        write_byte(TE_EXPLOSION//Индекс сообщение(взрыва)
        engfunc(EngFunc_WriteCoordfOrigin[0]) //Координата x
        engfunc(EngFunc_WriteCoordfOrigin[1]) //Координата y
        engfunc(EngFunc_WriteCoordfOrigin[2] + 30.0//Координата x
        write_short(g_Sprite[1]) //Индекс спрайта взрыва
        write_byte(30//Размер спрайта
        write_byte(15//Скорость анимации
        write_byte(0//Флаги
        message_end() //Конец сообщение
        
        message_begin
(MSG_BROADCAST,SVC_TEMPENTITY)//Создаем сообщение
        write_byte(TE_SMOKE//Индекс сообщение(дым)
        engfunc(EngFunc_WriteCoordfOrigin[0]) //Координата x
        engfunc(EngFunc_WriteCoordfOrigin[1]) //Координата y
        engfunc(EngFunc_WriteCoordfOrigin[2] + 50.0//Координата x
        write_short(g_Sprite[2]) //Индекс спрайта дыма
        write_byte(100//Размер спрайта
        write_byte(15//Скорость анимации
        message_end() //Конец сообщение
 
        set_pev
(iEntitypev_flagsFL_KILLME//Уничтожаем entity
 
        
return FMRES_IGNORED

С эти закончили. Мы уже имеем код создание entity, его взрыв при прикосновении. Остался последний пункт данного урока - это атака игрока, который подошел к нему близко.

Код: Выделить всё
public EntityThink(iEntity)
{
        if(!pev_valid(iEntity)) //Проверяем сущетсвует ли, если нет
                return PLUGIN_CONTINUE
 
        
new Float:fOriginE[3//Создаем массив для float координат entity
        pev(iEntitypev_originfOriginE//Получаем координаты entity
 
        
new iPlayers[32//Создаем массив для хранение индексов игроков
        new iPlayeriNum //Для записи кол-во игроков и отдельный взятый индекс
 
        get_players
(iPlayersiNum"ach"//Получаем игроков, исключая мертвых, ботов и hltv
 
        
for(new iiNumi++) //Создаем цикл по всем игрокам
        {
                iPlayer iPlayers[i//Для удобства записываем отдельно
 
                
new Float:fOriginP[3//Создаем массив для float координат игрока
                pev(iPlayerpev_originfOriginP//Получаем координаты игрока
 
                
new Float:fDistance //Создаем массив для хранение дистанции
                fDistance get_distance_f(fOriginPfOriginE//Получаем дистанцию между игроком и entity
        
                
if(fDistance 300.0//Если дистанция < 300.0
                {
                        new Float:fAngles[3//Создаем массив для float координат взгляда
 
                        
new Float:fX fOriginP[0] - fOriginE[0//Делаем расчет относительно координаты X
                        new Float:fY fOriginP[1] - fOriginE[1//Делаем расчет относительно координаты Y
 
                        
new Float:fRadian //Создаем массив для хранение радиуса
                        fRadian floatatan(fY/fXradian//Получаем радиус
 
                        fAngles
[1] = fRadian * (180 3.14//Приваиваем координаты взгляда
 
                        
if(fOriginP[0] < fOriginE[0]) //Если координаты игрока меньше координат entity
                        {
                                fAngles[1] = fAngles[1] - 180.0 //Разворачиваем его на 180.0 градусов
                        }
 
                        set_pev
(iEntitypev_anglesfAngles//Присваиваем координты взгляда
 
                        
//Создаем некое подобие видимости траектории стрельбы( Требуется подгон координат под ствол entity )
                        message_begin(MSG_BROADCASTSVC_TEMPENTITY//Создаем сообщение
                        write_byte(TE_TRACER//Индекс сообщение(траектория)
                        engfunc(EngFunc_WriteCoordfOriginE[0]) //Координата x
                        engfunc(EngFunc_WriteCoordfOriginE[1]) //Координата y
                        engfunc(EngFunc_WriteCoordfOriginE[2] + 30.0
                        engfunc(EngFunc_WriteCoordfOriginP[0]) //Координата x
                        engfunc(EngFunc_WriteCoordfOriginP[1]) //Координата y
                        engfunc(EngFunc_WriteCoordfOriginP[2]) //Координата x
                        message_end() //Конец сообщение
 
                        
//Здесь можно добавить урон по желанию. Ну это просто как пример
                }
        }
        set_pev(iEntitypev_nextthinkget_gametime() + 0.01//Повторяем
        return PLUGIN_CONTINUE

p.s Think показан в качестве примера и не притендует на медаль, поэтому для тех, кто захочет по умничать знайте - пишется для новичков хотя бы, чтобы было понятно

Разумеется я показал самый простой способ, но т.к расчитан исключительно на понимание - и так сойдет.
Собственно на этом хочу пока и закончить. Посмотрю по отзывам - если что продолжу более обширно.

Модель взята здесь Вы должны зарегистрироваться, чтобы видеть ссылки.
Всем удачи и спасибо за внимание
Аватара пользователя
BaJIeHoK
 
Сообщения: 80
Зарегистрирован: 03 апр 2014, 23:49
Откуда: Москва
Забанен
Благодарил (а): 12 раз.
Поблагодарили: 54 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: Создание entity( для начинающих )

Сообщение 9iky6 » 07 апр 2014, 04:23

Зачет, пиши ещё :thumbs_up Хоть я и не буду читать всё это, но с хорошими статьями для новичков у нас туго.
Аватара пользователя
9iky6
 
Сообщения: 2178
Зарегистрирован: 30 янв 2012, 19:07
Откуда: Россия
Благодарил (а): 375 раз.
Поблагодарили: 705 раз.

Re: Создание entity( для начинающих )

Сообщение Safety1st » 07 апр 2014, 04:26

Статья так себе, потому что вызывает больше вопросов, чем даёт ответов ;) Конкретнее: слабо раскрыты основы и множество мелких неточностей.

В StartCreate() ошибка, наверное, в комментарии:

Код: Выделить всё
get_user_origin(idiOrigin3//Получаем координаты куда смотрит игрок 

Хотя всё же лучше и правда создавать объект на дистанции по направлению взгляда, это всем 'новичкам' пригодится.

На мой взгляд это лишнее для простых случаев, поскольку необходимо только для моделей, имеющих sequences:

Код: Выделить всё
set_pev(iEntitypev_sequence0)
set_pev(iEntitypev_framerate1.0

Можно было такое дать в примере посложнее, объяснив, в чём отличие от 'простой' модели.

Функция EntityThink() никуда не годится: подходящие игроки обычно ищутся при помощи EngFunc_FindEntityInSphere/find_ent_in_sphere, а никакие переменные в цикле - не создаются.
Вот это мне ещё не нравится:

Код: Выделить всё
set_pev(iEntitypev_anglesfAngles//Присваиваем координты взгляда 

Комментарий неверный: устанавливаются углы модельки. Углы взгляда - pev_v_angle. Но самое главное - это работает норм, уверены?

В целом здорово, что вы взялись создать гайд по работе с entity 'для начинающих'. Хотя я против того, чтобы её 'занимались' начинающие в скриптинге: по факту просят всё готовое по каждому вопросу, сами нифига не понимают в любом случае, потому что базы нет.

У меня есть интересный примерчик, заюзайте в гайде. Там спавнится headcrab, падает на землю, потом прыгает в рандомном направлении. Он незаконченный: кажется, я хотел сделать, чтобы моделька смотрела чётко на меня и 'прыгала' точно в момент касания пола и точно на игрока. И ещё, чтобы при создании entity производилась проверка, не окажется ли она в стене.

entity_creation.sma
У вас нет необходимых прав для просмотра вложений в этом сообщении.
GoldSrc Gaming Community
Аватара пользователя
Safety1st
 
Сообщения: 1961
Зарегистрирован: 08 окт 2011, 05:41
Откуда: Moscow
Благодарил (а): 1690 раз.
Поблагодарили: 931 раз.
Опыт программирования: Около года
Языки программирования: Counter-Strike 1.6
Half-Life

Re: Создание entity( для начинающих )

Сообщение BaJIeHoK » 07 апр 2014, 07:12

Учту. Спасибо
Аватара пользователя
BaJIeHoK
 
Сообщения: 80
Зарегистрирован: 03 апр 2014, 23:49
Откуда: Москва
Забанен
Благодарил (а): 12 раз.
Поблагодарили: 54 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6

Re: Создание entity( для начинающих )

Сообщение Subb98 » 07 апр 2014, 11:21

BaJIeHoK писал(а):В нашем случаи мы создадим робота

Мне одному кажется, что речь идёт про Вы должны зарегистрироваться, чтобы видеть ссылки.?
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5395
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1315 раз.
Поблагодарили: 2320 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, PHP, Ruby

Re: Создание entity( для начинающих )

Сообщение Leonidddd » 09 апр 2014, 20:56

Код: Выделить всё
return PLUGIN_CONTINUE

В функции Ham-a?...
Аватара пользователя
Leonidddd
Модератор
 
Сообщения: 2169
Зарегистрирован: 08 апр 2012, 18:13
Откуда: г. Запорожье
Благодарил (а): 178 раз.
Поблагодарили: 602 раз.
Языки программирования: Counter-Strike 1.6

Re: Создание entity( для начинающих )

Сообщение SUMY » 16 янв 2017, 13:05

Как можно добавить урон ? К данному плагину :crazy:
Аватара пользователя
SUMY
 
Сообщения: 2
Зарегистрирован: 11 сен 2016, 17:31
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Языки программирования: Pawn
C++
Php
Ruby
Python

Re: Создание entity( для начинающих )

Сообщение sa1me » 16 янв 2017, 16:59

SUMY,
Код: Выделить всё
set_pev(index, pev_takedamage, DAMAGE_YES);
set_pev(index, pev_health, 100.0);

И, если я не ошибаюсь, то объект должен быть SOLID_BBOX.
Аватара пользователя
sa1me
 
Сообщения: 361
Зарегистрирован: 07 апр 2014, 20:51
Откуда: pfnAddToFullPack
Благодарил (а): 174 раз.
Поблагодарили: 175 раз.
Опыт программирования: Меньше недели

Re: Создание entity( для начинающих )

Сообщение Subb98 » 16 янв 2017, 17:08

Дополню, что ещё необходимо задавать размеры объекта (в статье это есть). Либо модель должна предусматривать хитбоксы.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5395
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1315 раз.
Поблагодарили: 2320 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn, PHP, Ruby

Re: Создание entity( для начинающих )

Сообщение SUMY » 17 янв 2017, 00:12

Урон от ловушки как добавить ?
Последний раз редактировалось SUMY 06 мар 2017, 14:27, всего редактировалось 3 раз(а).
Аватара пользователя
SUMY
 
Сообщения: 2
Зарегистрирован: 11 сен 2016, 17:31
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Языки программирования: Pawn
C++
Php
Ruby
Python

След.

Вернуться в Статьи / фрагменты кода

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

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