AMX MOD X
Среда, 07.01.2026, 22:09:45



Приветствую Вас Гость | RSS
[ Главная ] [ Модели и hitbox'es - AMX Mod X Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]

Вниманию участников! Данный форум теперь является архивом и вскором времени здесь нельзя будет создавать новых тем! Просьба всем для общения и создания новых тем перейти на наш новый форум: http://amxmodx.su/

  • Страница 1 из 1
  • 1
Модератор форума: slogic, AlMod  
Модели и hitbox'es
draftДата: Пятница, 14.03.2008, 20:56:44 | Сообщение # 1
Полковник
Группа: Пользователи
Сообщений: 225
Репутация: 3
Статус: Не в сети
Уважаемые гуру скриптинга, в общем, наболели следующие вопросы (официальный портал помочь не смог)

1) Пытаюсь создать объект (entity) и, когда ставлю ему модель, то зачастую сервер падает. Нормальная работа только с моделями с префиксом w_ и скинами игроков, а стандартные в папке models не ставятся - сервер делает shutdown. Собственно, мне нужно создать большую модель типа ящика или просто двумерная завеса, но, как издевательство, сервер падает и никак не могу это преодолеть.
И, что интересно, entity_set_size никакой погоды не делает, объект размеров не меняет (точнее сказать, сама визуальная модель) - видимо, меняется размер самого entity, а не его модели, что меня не устраивает, поэтому пытаюсь найти большую работающую модель (чтоб закрывала весь FOV игрока)

2) Как получить координаты hitbox'es (частей тела) модели игрока? Ясно, что есть get_user_origin, показывающий его координаты и можно получить координаты глаз. А как получить координаты головы, ног, рук и всего остального? Мне, собственно, нужно увидеть крайние точки модели, чтобы грамотно получать её видимость (потому что, по дефолту все entities проводят traceline от центра до центра, а меня это не устраивает - в реальности-то мы видеть можем голову или руку). Самое интересное, что подобные координаты существуют, иначе бы откуда бралась информация при traceline о том, в какую часть тела мы попадаем. Вопрос в том, где эти координаты можно взять?

Сообщение отредактировал draft - Пятница, 14.03.2008, 20:58:46
 
marikcoolДата: Пятница, 14.03.2008, 23:23:34 | Сообщение # 2
Подполковник
Группа: Пользователи
Сообщений: 139
Репутация: 1
Статус: Не в сети
по первому, визуальный скалинг модели такого не существует. и если модель отрисовывать возле глас игрока, то она будет видна у всех, нету возможности клиентской отрисовки произвольной модели.
мои идеи- можешь подменить клиенсткую модель рук(v_*.mdl) на свою, или можешь послать клиенту сообщение типо fadetoblack, у него будет черный экран.

по второму хз, наверно не стали искать область памяти где лежат эти координаты)) так что бери memhack и ищи))

 
DaTaДата: Суббота, 15.03.2008, 01:11:23 | Сообщение # 3
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
http://cs-mapper.by.ru/img/tutor/2/t2crates.jpg
Игрок за 64х64х64 ящиком ничего не увидет(разве что с помощью дактап), если хочешь, чтобы не было видно его холку - делай ящик размером 72х72х72
http://cs-mapping.com.ua/forum/forumdisplay.php?f=77

Как сделать ящик именно 72х72х72? Нужно сделать максимальное приближение, что бы было видно самую мелкую сетку(квадрат = 1х1 юнит) и примерно по нужным углам растянуть ящик(при компиляции модели углы станут в самые ближние пересечения координатной сетки). Тут есть два варианта исполнения:
1) Сделать центр ящика в центре координатной сетки
2) Сделать центр нижней грани в центре координатной сетки(более удобно, на мой взгляд)

Как воплотить ящик в жизнь(пример из плагина Bunnyhop Course Maker 2.0 by FatalisDK)?

Code
#include <amxmodx>
#include <fakemeta>

new const g_BoxModel[] = "models/papka/yawik.mdl"
new g_InfoTarget

public plugin_init()
{
  register_plugin("name", "version", "author")
  register_clcmd("amx_addbox", "create_box")
   
  g_InfoTarget = engfunc(EngFunc_AllocString, "info_target")
}

public plugin_precache()
  precache_model(g_BoxModel)

public create_box(id)
{
  static Float:origin[3], iorigin[3]

  get_user_origin(id, iorigin, 3)       //узнаем, куда целится игрок вызвавший команду
   
  IVecFVec(iorigin, origin)        //нам нужны координаты во Float
   
  static ent
  ent = engfunc(EngFunc_CreateNamedEntity, g_InfoTarget)    //создаем ентити
   
  if(!  pev_valid(ent)  )
   return PLUGIN_HANDLED
   
  set_pev(ent, pev_classname,    "fake_box")     //класс может быть любым
  set_pev(ent, pev_solid,  SOLID_BBOX)     //делаем его не пустотелым, что бы игрок не мог проходить сквозь него
  set_pev(ent, pev_movetype,    MOVETYPE_NONE)    //ящик стоит на месте все время
   
  engfunc(EngFunc_SetModel, ent, g_BoxModel)    //устанавливаем модель ящика
  engfunc(EngFunc_SetSize, ent, Float:{-36.0, -36.0, 0.0}, Float:{36.0, 36.0, 72.0})//это размеры ящика, нижняя грань которого в центе(второй способ)
  engfunc(EngFunc_SetOrigin, ent, origin)     //устанавливает ящик в заданные координаты
   
  return PLUGIN_HANDLED
}

Одно НО для пуль ящика не будет существовать. наверно...
 
VENДата: Суббота, 15.03.2008, 10:24:27 | Сообщение # 4
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
Quote
Как получить координаты частей тела модели игрока?
Пример для головы:
Quote
new Float:origin[3], Float:angles[3]
engfunc(EngFunc_GetBonePosition, id, PLAYERBONE_HEAD, origin, angles)

Список bone-констант (brought to us by Pavol "PM" Marko, если не ошибаюсь):

Code
#define PLAYERBONE_PELVIS 1
#define PLAYERBONE_SPINE 2
#define PLAYERBONE_SPINE1 3
#define PLAYERBONE_SPINE2 4
#define PLAYERBONE_SPINE3 5
#define PLAYERBONE_NECK 6
#define PLAYERBONE_HEAD 7
#define PLAYERBONE_L_CLAVICLE 9
#define PLAYERBONE_L_UPPERARM 10
#define PLAYERBONE_L_FOREARM 11
#define PLAYERBONE_L_HAND 12
#define PLAYERBONE_L_FINGER0 13
#define PLAYERBONE_L_FINGER01 14
#define PLAYERBONE_L_FINGER1 15
#define PLAYERBONE_L_FINGER11 16
#define PLAYERBONE_L_THIGH 40
#define PLAYERBONE_L_CALF 41
#define PLAYERBONE_L_FOOT 42
#define PLAYERBONE_R_CLAVICLE 23
#define PLAYERBONE_R_UPPERARM 24
#define PLAYERBONE_R_FOREARM 25
#define PLAYERBONE_R_HAND 26
#define PLAYERBONE_R_FINGER0 27
#define PLAYERBONE_R_FINGER01 28
#define PLAYERBONE_R_FINGER1 29
#define PLAYERBONE_R_FINGER11 30
#define PLAYERBONE_R_THIGH 46
#define PLAYERBONE_R_CALF 47
#define PLAYERBONE_R_FOOT 48

Quote
нету возможности клиентской отрисовки произвольной модели
Есть возможноть отображать конкретную(ые) модель(и)/entity(ies) только для конкретного(ых) игрока(ов).

Quote
для пуль ящика не будет существовать. наверно
Но можно заставить их считаться с желаемыми предметами.
 
DaTaДата: Суббота, 15.03.2008, 12:49:34 | Сообщение # 5
Генерал-полковник
Группа: Cупер-модеры
Сообщений: 1025
Репутация: 16
Статус: Не в сети
Quote (VEN)
Но можно заставить их считаться с желаемыми предметами.

Прошу прощения за оффтоп, но как? Ловить TraceLine?

Добавлено (2008-03-15, 12:49 Pm)
---------------------------------------------

Quote (VEN)
Есть возможноть отображать конкретную(ые) модель(и)/entity(ies) только для конкретного(ых) игрока(ов).

Можешь рассказать как?
Quote (VEN)
Список bone-констант

Можно где-то узнать их размеры?
 
VENДата: Суббота, 15.03.2008, 14:55:00 | Сообщение # 6
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
1. Да.
2. Хукнуть AddToFullPack и форсировать для всех клиентов, кто не должен видеть данную entity, флаг EF_NODRAW для члена Effects структуры EntityState.
3. ... декомпилировав модель, полагаю.
 
draftДата: Воскресенье, 16.03.2008, 14:09:42 | Сообщение # 7
Полковник
Группа: Пользователи
Сообщений: 225
Репутация: 3
Статус: Не в сети
Спасибо, НО:

1) Суть проблемы в том, что нету у меня работающей модели ящика. А когда ставлю entity_set_model (Надо понимать, что это тоже самое, что engfunc только через <engine.inc>), сервер делает shutdown (вырубается). Тут вопрос в следующем, имеет ли различие при установке модели, какие я ставлю остальные параметры или проблема с падением сервера связана с самой моделью? В общем, нужна сама работающая модель.
2) Когда мы ставим модель прямо на уровень глаз, получается, что при виде от первого лица текстура модели разрывается и мы видим её насквозь. Задача в том, чтобы её было видно ПЕРЕД глазами (т.е., получить следующую координату от начала traceline)
3) VEN, спасибо, за помощь (оказывается, я уже где-то это видел, просто подзабыл). Но вот какой вопрос, а каким образом наиболее грамотно получить крайние точки модели? И, кстати, можно ли применять
engfunc(EngFunc_SetBonePosition, id, PLAYERBONE_HEAD, origin, angles) =)

 
VENДата: Воскресенье, 16.03.2008, 16:12:03 | Сообщение # 8
AMXX-Скриптинг-Эксперт
Группа: Админы
Сообщений: 1892
Репутация: 45
Статус: Не в сети
SetBonePosition не существует, модель - не конструктор, поэтому переставлять ее части недопустимо, хотя, было бы забавно вложить голову в левую руку, например.

Получить крайние точки точным образом средствами AMX Mod X довольно сложно. Можно написать плагин-декомпилятор модели, который будет определять размеры частей модели.

Можно пользоваться координатами и углами, полученными после вызова GetBonePosition, уточняя крайние точки частей данными, полученными после декомпиляции модели, с учетом угла. Кстати, на практике угол, по крайней мере в CS, всегда нулевой.

 
draftДата: Воскресенье, 16.03.2008, 16:47:55 | Сообщение # 9
Полковник
Группа: Пользователи
Сообщений: 225
Репутация: 3
Статус: Не в сети
Идея просто в том, чтобы точно определять, видим ли мы противника или нет (это всё я для своего нового античита пытаюсь разузнать :) )
 
  • Страница 1 из 1
  • 1
Поиск:

AMX Mod X Russian Community © 2006-2026