Учитывая, что заняться в данный момент нечем и поползав по форуму обнаружил, что нет статей по 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(PLUGIN, VERSION, AUTHOR)
register_touch(gClassname, "player", "EntityTouch") //Создаем событие прикосновение с entity
register_think(gClassname, "EntityThink") //Создаем событие действий entity
register_clcmd("say /entity", "StartCreate") //Команда для создание
}
public plugin_precache()
{
precache_model( gModel ) //Передаем в прекаш модель
g_Sprite[1] = precache_model( gSpriteExplode ) //Передаем в прекаш спрайт взрыва
g_Sprite[2] = precache_model( gSpriteSmoke ) //Передаем в прекаш спрайт дыма
}
Думаю здесь вам всё понятно. Приступаем к созданию функции StartCreate. Чтобы облегчить создание мы получим координаты относительно взгляда игрока( куда наведен прицел ) и на том месте создадим npc
- Код: Выделить всё
public StartCreate(id)
{
new iOrigin[3] //Создаем массив для хранение координат
get_user_origin(id, iOrigin, 3) //Получаем координаты куда смотрит игрок
new iEntity = create_entity("info_target") //Создаем объект info_target
if(!pev_valid(iEntity)) //Проверяем сущетсвует ли, если нет
return PLUGIN_HANDLED //Заканчиваем. Дальше нам делать нечего
new Float:fOrigin[3] //Создаем массив для float коодинат
IVecFVec(iOrigin, fOrigin) //Конвертируем координаты в дробные
set_pev(iEntity, pev_origin, fOrigin) //Присваиваем координаты
set_pev(iEntity, pev_classname, gClassname) //Присваиваем Classname
set_pev(iEntity, pev_solid, SOLID_BBOX) //Делаем его непроходимым
set_pev(iEntity, pev_movetype, MOVETYPE_NONE) //Не задаем тип движения, во всяком случаи пока
set_pev(iEntity, pev_sequence, 0) //Выставляем № анимации при создании
set_pev(iEntity, pev_framerate, 1.0) //Выставляем скорость анимации
set_pev(iEntity, pev_nextthink, get_gametime() + 1.0) //Создаем запуск think
engfunc(EngFunc_SetModel, iEntity, gModel) //Присваиваем модель
engfunc(EngFunc_SetSize, iEntity, Float:{-16.0, -16.0, -16.0}, Float:{16.0, 16.0, 16.0}) //Создаем бокс вокруг entity( для прикосновения и не только )
return PLUGIN_HANDLED
}
Ну что же - мы создали entity. Теперь требуется создать события для него. Чем мы сейчас и займемся. Для начала создадим событие прикосновение с entity(роботом). Так как этот урок создан для новичков, хоть и имеет немного расширенное создание я не буду придумывать каких-то мего гениальных идей, а мы просто сделаем взрыв entity, если игрок с ним соприкоснется.
- Код: Выделить всё
public EntityTouch(iEntity, id)
{
if(!pev_valid(iEntity)) //Проверяем сущетсвует ли, если нет
return FMRES_IGNORED
new Float:fOrigin[3] //Создаем массив для float координат
pev(iEntity, pev_origin, fOrigin) //Получаем координаты entity
message_begin(MSG_BROADCAST,SVC_TEMPENTITY) //Создаем сообщение
write_byte(TE_EXPLOSION) //Индекс сообщение(взрыва)
engfunc(EngFunc_WriteCoord, fOrigin[0]) //Координата x
engfunc(EngFunc_WriteCoord, fOrigin[1]) //Координата y
engfunc(EngFunc_WriteCoord, fOrigin[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_WriteCoord, fOrigin[0]) //Координата x
engfunc(EngFunc_WriteCoord, fOrigin[1]) //Координата y
engfunc(EngFunc_WriteCoord, fOrigin[2] + 50.0) //Координата x
write_short(g_Sprite[2]) //Индекс спрайта дыма
write_byte(100) //Размер спрайта
write_byte(15) //Скорость анимации
message_end() //Конец сообщение
set_pev(iEntity, pev_flags, FL_KILLME) //Уничтожаем entity
return FMRES_IGNORED
}
С эти закончили. Мы уже имеем код создание entity, его взрыв при прикосновении. Остался последний пункт данного урока - это атака игрока, который подошел к нему близко.
- Код: Выделить всё
public EntityThink(iEntity)
{
if(!pev_valid(iEntity)) //Проверяем сущетсвует ли, если нет
return PLUGIN_CONTINUE
new Float:fOriginE[3] //Создаем массив для float координат entity
pev(iEntity, pev_origin, fOriginE) //Получаем координаты entity
new iPlayers[32] //Создаем массив для хранение индексов игроков
new iPlayer, iNum //Для записи кол-во игроков и отдельный взятый индекс
get_players(iPlayers, iNum, "ach") //Получаем игроков, исключая мертвых, ботов и hltv
for(new i; i < iNum; i++) //Создаем цикл по всем игрокам
{
iPlayer = iPlayers[i] //Для удобства записываем отдельно
new Float:fOriginP[3] //Создаем массив для float координат игрока
pev(iPlayer, pev_origin, fOriginP) //Получаем координаты игрока
new Float:fDistance //Создаем массив для хранение дистанции
fDistance = get_distance_f(fOriginP, fOriginE) //Получаем дистанцию между игроком и 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/fX, radian) //Получаем радиус
fAngles[1] = fRadian * (180 / 3.14) //Приваиваем координаты взгляда
if(fOriginP[0] < fOriginE[0]) //Если координаты игрока меньше координат entity
{
fAngles[1] = fAngles[1] - 180.0 //Разворачиваем его на 180.0 градусов
}
set_pev(iEntity, pev_angles, fAngles) //Присваиваем координты взгляда
//Создаем некое подобие видимости траектории стрельбы( Требуется подгон координат под ствол entity )
message_begin(MSG_BROADCAST, SVC_TEMPENTITY) //Создаем сообщение
write_byte(TE_TRACER) //Индекс сообщение(траектория)
engfunc(EngFunc_WriteCoord, fOriginE[0]) //Координата x
engfunc(EngFunc_WriteCoord, fOriginE[1]) //Координата y
engfunc(EngFunc_WriteCoord, fOriginE[2] + 30.0)
engfunc(EngFunc_WriteCoord, fOriginP[0]) //Координата x
engfunc(EngFunc_WriteCoord, fOriginP[1]) //Координата y
engfunc(EngFunc_WriteCoord, fOriginP[2]) //Координата x
message_end() //Конец сообщение
//Здесь можно добавить урон по желанию. Ну это просто как пример
}
}
set_pev(iEntity, pev_nextthink, get_gametime() + 0.01) //Повторяем
return PLUGIN_CONTINUE
}
p.s Think показан в качестве примера и не притендует на медаль, поэтому для тех, кто захочет по умничать знайте - пишется для новичков хотя бы, чтобы было понятно
Разумеется я показал самый простой способ, но т.к расчитан исключительно на понимание - и так сойдет.
Собственно на этом хочу пока и закончить. Посмотрю по отзывам - если что продолжу более обширно.
Модель взята здесь Вы должны зарегистрироваться, чтобы видеть ссылки.
Всем удачи и спасибо за внимание