Форумы на Наша-Life
Home user CP  
Календарь событий Найти других пользователей Часто задаваемые Вопросы Поиск  
Автор
Тема
Создать Новую Тему    Ответить
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #873760
жесть Оо Оказывается все понятнее и проще, спасибо.
===================================

Ппц, ну тут я уже просто хз. Компилятору все нравится, но в игре когда я нажимаю кнопку.... БАЦ.... и нихрена не происходит ВСЕ ДОЛЖНО РАБОТАТЬ, ПРОВЕРИЛ 1000 РАЗ!
Причем в стандартно используемых ситуациях и функциях все это робит Оо

Вот моя процедура:
code:
// ======== FORCE_PULL ========
void CC_Force_pull( void )
{
CBasePlayer *pPlayer = UTIL_PlayerByIndex(1); // Инициализируем игрока, без этой строки pPlayer не робит Оо
PLAYER_ANIM playeranim = PLAYER_ATTACK1; // ставим любую анимку
Vector vstart = pPlayer->Weapon_ShootPosition(); // Начало линии трассировки
Vector vend; // конец линии трассировки

QAngle ang = pPlayer->EyeAngles(); // получаем углы зрения
AngleVectors (ang, &vend); // Конец линии трассировки (угол в вектор)

trace_t tr; // переменная для трассировки

UTIL_TraceLine( vstart, vend, MASK_SHOT, NULL , COLLISION_GROUP_NONE, &tr);
// трассируем из start в end, по маске выстрела, ничо не игноря, без коллизий, записываем в переменную tr
Vector vforce; // вектор направления силы (по идее он дублирует vend, но для прикола пусть будет
pPlayer->EyeVectors( &vforce ); // заполняем переменную вектором, полученным из углов зрения игрока
if (tr.m_pEnt && tr.m_pEnt->VPhysicsGetObject() ) // проверяем: если трассировка была И если ентря - физ. обьект
{ // то...
tr.m_pEnt->VPhysicsGetObject()->ApplyForceCenter( vforce * 1000.0f ); // применяем к этому обьекту центросилу в векторе vforce умноженом на 1000
}
return;
}
static ConCommand Force_Pull ("Force_pull", CC_Force_pull, "Force pull jedi ability"); // сама команда, единственная строчка, которая РАБОТАЕТ! Оо


Ну тут ВСЕ проверено и правильно, как так????


===========================
попробовал заменить ApplyForceCenter( vforce * 1000.0f ); на ApplyForceCenter( tr.endpos * 1000.0f );

Получается аналогичная фигня - ничего не робит Оо
Не существует границ, есть лишь препятствия

Поправил Breever 19-06-2009 в 18:22

Old Post 19-06-2009 14:22
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #874715
Ураа, все получилось, есть правда мелкие недочеты, но с ними самостоятельно разберусь. И правильно говорит KLIMaka, исходники - лучший учебник
Не существует границ, есть лишь препятствия
Old Post 22-06-2009 05:14
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
manJak
(маппер-теоретик)

Зарегистрирован: Feb 2006
Проживает: Mother Russia/Moscow
Написал: 2953 сообщений

Оценка: 66 Votes 66 чел.

Developer Старожил 
Сообщение #874876
А не работало потому, что UTIL_TraceLine принимает на направление трейса, а конечную точку. ^_^
Old Post 22-06-2009 13:57
manJak отсутствует Посмотреть данные 'manJak' Отправить Приватное Сообщение для 'manJak' Найти другие сообщения 'manJak' Добавить manJak в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #874934
ну да, все верно. Просто второй аргумент функции задается как A + B * дистанцию, я это в исходниках как раз и нашел.
Только там еще одна фишка, нужно использовать не ApplyForceCenter, а ApplyForceOffset, чтобы предметы летели не к центру карты, а от игрока.
Кстати долго мучился как это сделать, потом додумался использовать в качестве 1 аргумента плоскость обьекта, получаемую в результате трассировки, т.е. tr.plane.normal.
Сейчас закончу со звуками и выложу уже рабочую функцию, может кому-нибудь понадобится
Не существует границ, есть лишь препятствия
Old Post 22-06-2009 16:21
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
manJak
(маппер-теоретик)

Зарегистрирован: Feb 2006
Проживает: Mother Russia/Moscow
Написал: 2953 сообщений

Оценка: 66 Votes 66 чел.

Developer Старожил 
Сообщение #874988
> нужно использовать не ApplyForceCenter, а ApplyForceOffset, чтобы предметы летели не к центру карты
Странно. По всей логике ApplyForceCenter применяет силу к центру масс объекта в указанном направлении. о_О (А ApplyForceOffset - из указанной точки в указанном направлении. Вроде.)
Old Post 22-06-2009 18:18
manJak отсутствует Посмотреть данные 'manJak' Отправить Приватное Сообщение для 'manJak' Найти другие сообщения 'manJak' Добавить manJak в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #875134
Ну может, просто тогда я наверное еще не нормалью пользовался, и все обьекты летели в одну и ту же сторону. Кстати ApplyForceOffset дает неплохой вращательный момент, поэтому наверное правда надо попробовать переделать на ApplyForceCenter.
Не существует границ, есть лишь препятствия
Old Post 23-06-2009 03:59
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
 
manJak
(маппер-теоретик)

Зарегистрирован: Feb 2006
Проживает: Mother Russia/Moscow
Написал: 2953 сообщений

Оценка: 66 Votes 66 чел.

Developer Старожил 
Сообщение #875447
> ApplyForceOffset дает неплохой вращательный момент
Ну да, он для того и предназначен, чтобы пихать объект в произвольную его точку)
Old Post 23-06-2009 15:17
manJak отсутствует Посмотреть данные 'manJak' Отправить Приватное Сообщение для 'manJak' Найти другие сообщения 'manJak' Добавить manJak в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #875527
Ну вообщем-то все получилось, обьект летит идеально вперед, как от гравипушки. Сейчас только разберусь с анимками и поставлю задежку на применение способности, тогда выложу полностью готовую функцию. Ну и потом надо будет добавить возможность пихать НПС.
Кстати приступил уже к созданию следующей способности - молния. Уже сделал всю базу, осталось написать только функциональность самой молнии.

Кстати, подскажите идеи для реализации следующей способности, вот как она должна выглядеть:

Игрок наводит прицел на физ. обьект, нажимает кнопку и удерживает ее. Пока он держит кнопку, сам персонаж замораживается (это уже не проблема сделать, временное отключение кнопок научился делать, просмотрев код приближения (ZOOM) ), однако может двигать этот обьект в любон направлении (W/S - по оси X, A/D - ось Y, SPACE/CTRL - ось Z) также при нажатии на кнопку мыши обьект пуляется вперед, как на моей Force_pull-функции.

В принципе, все, кроме перемещения обьекта в пространстве я могу сделать. Подскажите пожалуйста идеи, я вообще планировал поизучать код гравипушки, но там только отдаленно нужное мне.
Не существует границ, есть лишь препятствия
Old Post 23-06-2009 17:37
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
KLIMaka
(Президент Мира - Броука!)

Зарегистрирован: Dec 2007
Проживает: Украина/Запорожье
Написал: 456 сообщений

Оценка: 28 Votes 28 чел.

Сообщение #875533
Ну как вариант можно присваивать объекто MOVE_TYPE_FLY ( что-то типо этого, точно не помню) Что заставит двигатся объект без воздействия гравитационных сил. А потом пожно тем же ApplyForceCenter с небольшим значением сиилы заставлять объект двигатся в необходимом направлении. Както так ))
Old Post 23-06-2009 17:59
KLIMaka отсутствует Посмотреть данные 'KLIMaka' Отправить Приватное Сообщение для 'KLIMaka' Найти другие сообщения 'KLIMaka' Добавить KLIMaka в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #875548
ууу, точно, спасибо, пример этому найду в ноуклипе у плеера.

И еще один интересующий вопрос, и займусь ближайшее время реализацией этого всего сразу
Как "воскресить" НПС из рагдолла. По-моему стандартные рагдольные функции убивают его (по-моему, потому что я пока не со всеми аргументами разобрался). Даже поблендить нпс я сам найду как, но вот как поднять не понимаю

Ну меня вот заинтересовала одна из них:
BecomeRagdollBoogie( CBaseEntity *pKiller, const Vector &forceVector, float duration, int flags )
А конкретно понравился параметр duration. Это ли не время, на которое цель превращается в рагдолл?
Если так, то очень даже отлично, тогда появляется следующий, более легкий вопрос: как определить, что рагдол уже спокойно лежит на земле, его никто не трогает (и следовательно уже пора вставать )
Если я не прав, и это продолжительность чего-то еще, то как все-таки реализовать возвращение из рагдола в НПС?
Не существует границ, есть лишь препятствия
Old Post 23-06-2009 18:26
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
KLIMaka
(Президент Мира - Броука!)

Зарегистрирован: Dec 2007
Проживает: Украина/Запорожье
Написал: 456 сообщений

Оценка: 28 Votes 28 чел.

Сообщение #875666
Ну насколько я помню, третий аргумент в BecomeRagdollBoogie( CBaseEntity *pKiller, const Vector &forceVector, float duration, int flags ) задает время конвульсий )) Ибо ф-я то создает дергающийся рагдолл (от этого и название Boogie )
Old Post 23-06-2009 22:46
KLIMaka отсутствует Посмотреть данные 'KLIMaka' Отправить Приватное Сообщение для 'KLIMaka' Найти другие сообщения 'KLIMaka' Добавить KLIMaka в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #875695
А, да, не зря такая маленькая продолжительность стоит у целей, убитых катающейся миной

Так все-таки, какую тогда функцию использовать, если это возможно - вернуть цель к жизни. Если нет, то прокатит ли такой алгоритм:

1) Цель хватает толчек, ее текущие жизни записываются в переменную. От них отнимается где-то 10 хп.
2) Запустить рагдолл с силой
3) Если цель не сдохла от этих -10 хп, то подождать, пока ее рагдолл успокоится. (как это узнать? )
4) Убрать рагдолл, породить НПС в спящем состоянии (чтобы не кинулся ни на кого ) и с записаным здоровьем в точке, где лежал рагдолл
5) Присвоить нпс анимку лежащего на земле.
6) Проиграть анимку подьема, разбудить нпс.

Вообщем, если такой алгоритм, то остается только 2 вопроса - как узнать, что рагдолл уже лежит и как сделать тупо паузу в функции? (я наверное запущу цикл: пока рагдолл не будет лежать, ждать 1 сек, иначе пошли дальше пункты 4,5,6)
Но лучше бы конечно, если какая-нибудь рагдольная функция работала, не убивая )
Не существует границ, есть лишь препятствия

Поправил Breever 24-06-2009 в 04:47

Old Post 24-06-2009 04:37
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
manJak
(маппер-теоретик)

Зарегистрирован: Feb 2006
Проживает: Mother Russia/Moscow
Написал: 2953 сообщений

Оценка: 66 Votes 66 чел.

Developer Старожил 
Сообщение #875770
> одождать, пока ее рагдолл успокоится. (как это узнать?)
Точно не скажу, но мне кажетца должна сработать проверка IsAsleep() у каждого лимба регдолла.

Что касается паузы в функции, то не всё так просто.. Я бы, наверное, написал класс-манагер (от CAutcs-sourceSystemPerFrame или типа него) для "менеджемента" полудохлых неписей, в котором хранил бы список структурок со всей необходимой инфой для воскрешения каждого нпц. Там же и своего рода таймеры можно хранить, проверяя их состояние в функции FrameUpdatePostEntityThink.
Короче не для новичка в ц++ задачка.
А алгоитм в общем верный. Не хватает только плавного бленда регдольных костей в начальную позицию анимации, но это опять же явно не тривиальная задача и лучше про неё пока забыть)

manJak добавил 24-06-2009 в 09:45:01:
OMGWTF?? Форум заменил "оGаmе" на "cs-source". Голактеко опасносте!
Old Post 24-06-2009 09:43
manJak отсутствует Посмотреть данные 'manJak' Отправить Приватное Сообщение для 'manJak' Найти другие сообщения 'manJak' Добавить manJak в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Breever
(Добываю фероподы из мирмидонта)

Зарегистрирован: Jun 2009
Проживает: Россия/Красноярск
Написал: 95 сообщений

Оценка: 3 Votes 3 чел.

Сообщение #875815
Хм, как так, ведь в том же Delhpi и C++ есть функция Sleep (cardinal msec), неужели в движке нет чего-нибудь аналогичного Оо
Ну когда рагдолл успокоится можно узнать по флагам, есть такой интересный флаг, как ON_GROUND (как-то так). Просто после него поставить маленькую паузу (чтобы удостоверится, что он уж точно спокойно лежит) и продолжить алгоритм.
Ну вообще, переодическую проверку можно сделать, как это есть в hl2_player.cpp выполняется проверки на зум и т.п. Но как-то проще было бы с обычным циклом и паузой Мож KLIMaka увидит и посоветует что-нить Вообще, можно и без паузы, просто будет цикл выполняться, пока НПС не ляжет, но это же будет грузить систему Оо
Да и для следующего всего мне понадобится пауза

======================================
P.S. Нашел функцую SetWait(), попробую применить ее к рагдоллу. Вообще, эта функция член класса CAI_BaseNPC, но поидее должно получится, потому что сначала мы делаем нпс, рагдоллом, а потом ему же говорим жди, пока не будут определенные флаги.
Не существует границ, есть лишь препятствия

Поправил Breever 24-06-2009 в 13:23

Old Post 24-06-2009 11:13
Breever отсутствует Посмотреть данные 'Breever' Отправить Приватное Сообщение для 'Breever' Посетить домашнюю страничку Breever Найти другие сообщения 'Breever' Добавить Breever в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
KLIMaka
(Президент Мира - Броука!)

Зарегистрирован: Dec 2007
Проживает: Украина/Запорожье
Написал: 456 сообщений

Оценка: 28 Votes 28 чел.

Сообщение #875862
Забудь обо всех этих циклах и Слипах! Это асинхронное приложение и ты должен постоянно отдавать управление на все остальные блоки.

Для того, чтобы оставлять объект на время самому себе есть Think ф-ии. Установив для некой энтити NextThink( time ) ты укажешь на то, что управление к этой ентити вернется через time секунд. Т.е. через time секунд вызовется метод Think для данного объекта.
Old Post 24-06-2009 12:57
KLIMaka отсутствует Посмотреть данные 'KLIMaka' Отправить Приватное Сообщение для 'KLIMaka' Найти другие сообщения 'KLIMaka' Добавить KLIMaka в Список Друзей
Править/Удалить Сообщение Ответить с Цитированием
Все время в GMT . Сейчас 22:12.
Создать Новую Тему    Ответить

Быстрый ответ
Ваше Имя:
Хотите Зарегистрироваться?
Ваш Пароль:
Забыли свой Пароль?
Вы можете оставлять свои комментарии анонимно, просто введя свои имя и оставив пустым поле пароля.
Ваш ответ:

[проверить размер]
[транслит в win] | [?]
[русская клавиатура]

Дополнительно: Подтверждение по E-Mail


Быстрый переход:
 
Оцените эту Тему:
 

Правила форума:
Создание Тем не разрешено
Создание Сообщений разрешено
Создавать Вложения не разрешено
Редактирование Сообщений не разрешено
Коды HTML запрещены
Коды форума разрешены
Смайлики разрешены
Коды [IMG] запрещены