You are not logged in.
Не подскажите как определить угол наклона или кватернинон текущей плоскости относительно заданных координат?
Т.е. на сколько наклонена поверхность в определенной точки.
Смысл проблемы - расположение (установка) объектов ровно по поверхности, к которой прикасается сам объект.
Как вариант, это вычислить по координатам точек путей, но не лучший способ. К тому же будет работать только на дорогах =/
Last edited by Goldfish (19-10-2016 20:23)
Offline
Можно плоскость представить в виде четырех точек. Ну а дальше - найти углы наклона этой плоскости.
Вспоминается старенький мод IVLM Pickups.
Один человек подсказал, что можно найти те точки на пересечении колизии линией. Наверно есть такая функция , которой можно получить такие точки?
Мм.. вспомнил про опкод, который опускает Z координату в заданых X Y, наверно с помощью нее проще определить эти четыри точки??
Offline
69 страница
хд
Last edited by Goldfish (28-10-2016 16:26)
Offline
Пара вопросов:
1. Как проверить, что актёру установлен иммунитет к выстрелам?
2. Можно ли проверить, что никакие кнопки не нажимались в течение определённого времени, к примеру, одной минуты?Заранее спасибо.
1) думаю, вот это может помочь (из GTA Modding):
CPed +0x42 = [byte] Is the BP/EP/FP/DP (special flags) status of the player as follows: Bit 1 = makes ped soft (ie. can move through walls and everything) (noclip in other words) Bit 2 = freezes ped (ie. ped cannot walk) Bit 3 = bullet-proof Bit 4 = flame-proof Bit 5 = collision-proof Bit 6 = MP-proof (MP) Bit 7 = ? Bit 8 = explosion-proof
Тут понадобятся структура актёра (0A96) + указанное смещение, считывание из памяти (0A8D) и работа с битами переменной (08B7), поскольку именно в них записаны иммунитеты;
2) если речь об обычных игровых клавишах, то можно сделать так:
- обнулить таймер 32@
- создать флаг (не)нажатия //если есть решение получше, можно и без него, например, сделать условный gosub с циклом
- в цикле for проверять, нажата ли одна из клавиш (номер клавиши = счётчик цикла), если да, делаем провал условия.
Offline
Драсте, у меня тут вопрос есть такой, связанный со вторым оружием в левой руке, т.е флаг TWIN_PISTOLS если так понятнее.
Короче говоря вот - у меня есть оружие,специально подстроенное только под правую руку, f мне требуется его отображать в обеих.
Когда я активирую этот флаг,то происходит то,что на картинке.
Вопрос заключается в чём собсна... как отзеркалить оружие для того,чтобы оно нормально отображалось во второй руке?
Спасибо заранее
Last edited by Zin_869731 (18-01-2017 20:01)
Offline
2) если речь об обычных игровых клавишах, то можно сделать так:
- обнулить таймер 32@
- создать флаг (не)нажатия //если есть решение получше, можно и без него, например, сделать условный gosub с циклом
- в цикле for проверять, нажата ли одна из клавиш (номер клавиши = счётчик цикла), если да, делаем провал условия.
Хорошо, но может, есть какая-то специальная проверка, что игрок ничего не делает в течение определённого времени? В оригинальной СА ведь такое есть - если не нажимать ничего в течение одной минуты, камера отправляется в свободное плавание. Я вот сейчас работаю с мэйном, убрал оттуда оригинальные потоки, и теперь это не происходит. Значит, там был скрипт, в котором это было прописано.
Offline
Vital wrote:2) если речь об обычных игровых клавишах, то можно сделать так:
- обнулить таймер 32@
- создать флаг (не)нажатия //если есть решение получше, можно и без него, например, сделать условный gosub с циклом
- в цикле for проверять, нажата ли одна из клавиш (номер клавиши = счётчик цикла), если да, делаем провал условия.Хорошо, но может, есть какая-то специальная проверка, что игрок ничего не делает в течение определённого времени? В оригинальной СА ведь такое есть - если не нажимать ничего в течение одной минуты, камера отправляется в свободное плавание. Я вот сейчас работаю с мэйном, убрал оттуда оригинальные потоки, и теперь это не происходит. Значит, там был скрипт, в котором это было прописано.
Нет, такого опкода нету. Это реализовывается несколькими строчками опкодов, например как предложил Vital.
Last edited by Goldfish (19-01-2017 20:41)
Offline
Offline
Драсте, у меня тут вопрос есть такой, связанный со вторым оружием в левой руке, т.е флаг TWIN_PISTOLS если так понятнее.
Короче говоря вот - у меня есть оружие,специально подстроенное только под правую руку, f мне требуется его отображать в обеих.
Когда я активирую этот флаг,то происходит то,что на картинке.
Вопрос заключается в чём собсна... как отзеркалить оружие для того,чтобы оно нормально отображалось во второй руке?
Спасибо заранее
Нужно отразить модель по одной из оси и подровнять смещение.
Вариант реализации с plugin-sdk.
#include "plugin.h" #include "game_sa\CModelInfo.h" using namespace plugin; const unsigned int MY_WEAPON_MODEL_ID = MODEL_BRASSKNUCKLE; const RwV3d MY_WEAPON_OFFSET = { 0.0f, 0.0f, 0.0f }; class MyTwinWeapon { public: MyTwinWeapon() { static CdeclEvent< AddressList<0x733119, H_CALL>, PRIORITY_BEFORE, ArgPickN<RpClump*, 0>, RpClump*(RpClump*)> onRenderSecondWeaponClump; onRenderSecondWeaponClump += [](RpClump *clump) { CWeaponModelInfo *weapModel = CallAndReturn<CWeaponModelInfo *, 0x732AC0>(clump); if (weapModel && CModelInfo::ms_modelInfoPtrs[MY_WEAPON_MODEL_ID] == weapModel) { // Если нужная модель RwFrame *frame = reinterpret_cast<RwFrame *>(clump->object.parent); RwV3d scale = { 1.0f, -1.0f, 1.0f }; RwMatrixScale(&frame->modelling, &scale, rwCOMBINEPRECONCAT); // Масштабируем RwMatrixTranslate(&frame->modelling, &MY_WEAPON_OFFSET, rwCOMBINEPRECONCAT); // Смещаем } }; } } myTwinWeap;
Тест
#include "plugin.h" #include "game_sa\common.h" #include "game_sa\CStreaming.h" using namespace plugin; class MyTwinWeaponTest { public: MyTwinWeaponTest() { patch::Nop(0x7330B9, 2); // Рендерим два оружия независимо от флага в weapon.dat Events::gameProcessEvent += [] { CPed *playa = FindPlayerPed(); if(playa && KeyPressed('T')) { CStreaming::RequestModel(MODEL_BRASSKNUCKLE, GAME_REQUIRED); CStreaming::LoadAllRequestedModels(false); playa->GiveWeapon(WEAPON_BRASSKNUCKLE, 0, true); // Даём игроку оружие CStreaming::SetModelIsDeletable(MODEL_BRASSKNUCKLE); } }; } } myTest;
Ещё вопрос. Я отключил читы
0A8C: write_memory 0x0053BFB8 size 4 value 0x90909090 virtual_protect 1 0A8C: write_memory 0x0053BFBC size 1 value 0x90 virtual_protect 1и после этого 0ADC: тоже перестал действовать. Можно это исправить?
Попробуй так.
0A8C: write_memory 0x4384F6 size 2 value 0xE990 virtual_protect 1
Хорошо, но может, есть какая-то специальная проверка, что игрок ничего не делает в течение определённого времени? В оригинальной СА ведь такое есть - если не нажимать ничего в течение одной минуты, камера отправляется в свободное плавание. Я вот сейчас работаю с мэйном, убрал оттуда оригинальные потоки, и теперь это не происходит. Значит, там был скрипт, в котором это было прописано.
0A8D: 0@ = read_memory 0xB73578 size 4 virtual_protect 0 0A8D: 1@ = read_memory 0xB7CB84 size 4 virtual_protect 0 0062: 1@ -= 0@ // if (CTimer::m_snTimeInMilliseconds - Pads[0].LastTimeTouched > 2000) if 1@ > 2000 then 0AD1: show_formatted_text_highpriority "You didn't touch the pad for %d ms" time 100 1@ end // Пока игрался с этим кодом - обнаружил, что SB не умеет правильно обрабатывать комбинации //{ //}.
В виде опкода (plugin-sdk + CLEO SDK)
#include "CLEO.h" #include "game_sa\CTimer.h" #include "game_sa\CPad.h" class TimeNotTouchingPadOpcode { public: static OpcodeResult WINAPI OpcodeFunc(CScriptThread* thread) { int playerId = CLEO_GetIntOpcodeParam(thread); CLEO_SetIntOpcodeParam(thread, CTimer::m_snTimeInMilliseconds - CPad::GetPad(playerId)->LastTimeTouched); return OR_CONTINUE; } TimeNotTouchingPadOpcode() { CLEO_RegisterOpcode(0x1A00, OpcodeFunc); // 1A00=2,%2d% = get_player %1d% time_not_touching_pad } } opcodePlg;
Last edited by DK22Pac (21-01-2017 11:47)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Нужно отразить модель по одной из оси и подровнять смещение.
Вариант реализации с plugin-sdk.#include "plugin.h" #include "game_sa\CModelInfo.h" using namespace plugin; const unsigned int MY_WEAPON_MODEL_ID = MODEL_BRASSKNUCKLE; const RwV3d MY_WEAPON_OFFSET = { 0.0f, 0.0f, 0.0f }; class MyTwinWeapon { public: MyTwinWeapon() { static CdeclEvent< AddressList<0x733119, H_CALL>, PRIORITY_BEFORE, ArgPickN<RpClump*, 0>, RpClump*(RpClump*)> onRenderSecondWeaponClump; onRenderSecondWeaponClump += [](RpClump *clump) { CWeaponModelInfo *weapModel = CallAndReturn<CWeaponModelInfo *, 0x732AC0>(clump); if (weapModel && CModelInfo::ms_modelInfoPtrs[MY_WEAPON_MODEL_ID] == weapModel) { // Если нужная модель RwFrame *frame = reinterpret_cast<RwFrame *>(clump->object.parent); RwV3d scale = { 1.0f, -1.0f, 1.0f }; RwMatrixScale(&frame->modelling, &scale, rwCOMBINEPRECONCAT); // Масштабируем RwMatrixTranslate(&frame->modelling, &MY_WEAPON_OFFSET, rwCOMBINEPRECONCAT); // Смещаем } }; } } myTwinWeap;Тест
#include "plugin.h" #include "game_sa\common.h" #include "game_sa\CStreaming.h" using namespace plugin; class MyTwinWeaponTest { public: MyTwinWeaponTest() { patch::Nop(0x7330B9, 2); // Рендерим два оружия независимо от флага в weapon.dat Events::gameProcessEvent += [] { CPed *playa = FindPlayerPed(); if(playa && KeyPressed('T')) { CStreaming::RequestModel(MODEL_BRASSKNUCKLE, GAME_REQUIRED); CStreaming::LoadAllRequestedModels(false); playa->GiveWeapon(WEAPON_BRASSKNUCKLE, 0, true); // Даём игроку оружие CStreaming::SetModelIsDeletable(MODEL_BRASSKNUCKLE); } }; } } myTest;
Спасибо за возможный вариант решения. Конечно прости за некоторую наглость, но не мог бы ты скинуть скомпилированные asi c вышеописанными кодами?
Просто я с VS ваще ни разу не знаком, да и ошибок на ровном месте тоже хватает, например такая вот:
VS 2015,пакет C++ тоже стоит.
Я вообще понятия не имею как её решить и соответственно продвинуться далее..
Offline
Zin_869731, это Visual Studio Express?
Нужна полноценная студия.
Вот всё как сказал сделал,галочки поставил,даже переустановил ещё раз. Результат такой же - не хочет совершенно работать с VC++ :с
Offline
А пока я не знаю что делать с моей VS у меня зародилось ещё 2 вопроса.
Первый - DK выпускал CLEO скрипт на изменение цветов статических моделей. Есть ли способ таким образом красить совершенно любую модель? Будь то оружие какое нибудь, али человек... да что угодно)
И второй - Как изменить направление вектора вылетающей пули у оружия? Например шоб не прямо, а вбок, иль назад...
Спасибо заранее)
Offline
Почему-то стал менее предсказуемо себя вести скриптовый движок игры после переезда на новое железо. Был старенький пенёк, сейчас новый быстрый i5. Теперь при отладке выявляется куча новых проблем, которых на старом железе не было. Я ещё могу понять, когда у меня циклы с длительностью, завязанной на фреймтайме (wait 0, wait 30 делаются определённое кол-во раз), выполняются быстрее - логично. Их я просто связал с внутриигровым счётчиком времени. Но вот, например, совершенно для меня неясная проблема.
015D: set_gamespeed 0.2 (...) if 00E1: player 0 pressed_key 16 then fade 0 50 wait 50 015D: set_gamespeed 1.0
Ставлю скорость игры на 0.2, потом вспышка и вновь 1.0. Но экран после засветления и не думает проясняться, т.е. просто вся картинка залита белым цветом, а код дальше не выполняется, скорость по-прежнему 0.2. При этом игра работает и позволяет заходить в паузу, сворачивать и разворачивать себя совершенно нормально, лог-файл scrlog'а не показывает в потоке ни одного опкода, словно выполняется бесконечный wait. Исправил костылём, но сама проблема не исчезла, и это меня настораживает.
Также стал дольше выполняться скриптовый ролик с фиксированной длительностью текстов, камер и анимации (на весь ролик у актёра одна большая анимация, как в катсцене). Раньше ролик заканчивался тютелька в тютельку с окончанием анимации, а теперь текст и камеры вдруг стали отставать от анимации. В итоге смотрю на рассинхрон текста с происходящими на экране действиями, а в конце ролика 1-2 секунды наблюдаю актёра, застывшего в последнем кадре анимации, хотя раньше, повторюсь, всё было идеально.
С чем такое может быть связано, и есть ли способ это исправить, или придётся всё настраивать заново каким-нибудь универсальным способом?
Добавлю, что проблем гораздо больше, но они все разные и, на мой взгляд, ничего общего не имеют (кроме, вероятно, причины), поэтому не вижу смысла перечислять.
Last edited by Mr.Secret (14-02-2017 15:32)
Offline
Хз.. мб попробовать в разных режимах совместимости запустить...
мб от либов vc старых или наоборот новых..
Винда то какая?
Offline
Почему-то стал менее предсказуемо себя вести скриптовый движок игры после переезда на новое железо. Был старенький пенёк, сейчас новый быстрый i5.
возможно это связано с тем, как игра измеряет интервалы времени
цитата отсюда
R* used two ways of updating GT value:
1) using QueryPerformanceCounter() if the current system supports it
2) using timeGetTime() for other systems.
возможно, что с обновлением железа игра стала использовать первый метод и это каким-то образом повлияло на игровой таймер. Кстати, замечено, что при очень большой продолжительности игры, таймер начинает глючить. При начале новой игры такой проблемы нет. почитай мой пост по ссылке, может как-то поможет.
Offline
Спасибо за ответы. Запуск в режиме совместимости с ХР SP3 (которая у меня и была и на которой всё писалось), к сожалению, не помогает. Сейчас у меня 7 Максимальная х64.
Seemann, а способ измерения зависит именно от железа или от оси? Если от оси, то я могу просто подкорректировать задержки. Но сдаётся мне, что всё немного сложнее, поскольку такой проблемы с fade'ами больше ни у кого на такой системе нет. Кстати, заметил, что при малой длительности fadeout'а глюка не возникает. Такая зависимость движка от железа вообще вводит меня в ступор по поводу оптимизации - оптимизирую я код под свою систему, а у других всё поломается.
Offline
Zin_869731, проверь, можешь ли ты создавать проекты в своей студии.
File -> New -> Project... ->
Templates : Visual C++ : General : Empty Project
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
проверь, можешь ли ты создавать проекты в своей студии.
File -> New -> Project... ->
Templates : Visual C++ : General : Empty Project
В той студии даже шаблонов проектов не было, но не суть
За всё это время я ставил кучу VS и все они устанавливались с какими либо ошибками, я думаю что я скорее смогу поставить винду 10 и попробовать установить на неё, чем найти хоть одну исправно работающую у меня студию.
Не думаю, что у меня есть какие либо ещё выходы кроме установки windows 10.
Если интересно, вот сохранившийся лог с ошибками после установки 2017 RC
Offline
Zin_869731, как варианты - нету нужных прав (администраторских) для внесения изменений, какие-то проблемы с интернет-соединением (часть пакетов докачивается уже при установке), не хватает места на диске.
Ещё тут можно посмотреть
https://support.microsoft.com/ru-ru/hel … 2015-setup
VS2017 я сам ещё не пробовал. Может попробуешь VS2015?
Last edited by DK22Pac (27-02-2017 17:37)
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
Помогите плез:
Проблема: все float(дробные числа) компилируются в короткий float(2 байта), а то есть значения не точные и нельзя выставить значение выше 2048.0
Решение: использовать хекс код 0x3F800000(1.0)
Проблема №2: при использовании хекс кода после декомпиляции переводит в Dword(4 байта целые числа). А если дело касается минусовых, то вообще не вообще не восстановить(ctrl+H).
Вопрос: как все это исправить? Как восстановить минусовые float и как сделать так чтобы 3000.0 компилировался в нормальный float(453B8000)
Речь о gta3.
Offline
все float(дробные числа) компилируются в короткий float(2 байта), а то есть значения не точные и нельзя выставить значение выше 2048.0
Это лимит скриптового движка игры, а не SannyBuilder'а.
после декомпиляции переводит в Dword(4 байта целые числа). А если дело касается минусовых, то вообще не вообще не восстановить(ctrl+H).
Вопрос: как все это исправить?
Разобраться, что такое исходный файл и не декомпилировать свои скрипты.
как сделать так чтобы 3000.0 компилировался в нормальный float(453B8000)
Внести изменения в скриптовый движок игры. Добавить новый тип параметра - 4-байтный float, его чтение и запись.
Написать программу, которая бы в скомпилировааном скрипте заменяла все 2-байтные float на этот новый тип.
Plugin-SDK https://github.com/DK22Pac/plugin-sdk
Discord-сервер по plugin-sdk и программированию в GTA
RU https://discord.gg/QEesDGb
ENG https://discord.gg/zaVqFQv
Offline
DK22Pac wrote:Это лимит скриптового движка игры, а не SannyBuilder'а.
При чем тут движок игры? Тут нужно в прогу вносить улучшения.
0055: put_player $PLAYER 3000.0 -100.0 10.0 < игрок оказывается в координатах ~101.5 -100.0 10.0
0055: put_player $PLAYER 0x453B8000 -100.0 10.0 < игрок оказывается в координатах 3000.0 -100.0 10.0
0x453B8000 < 4 байт float движок отлично понимает.
При использовании переменных та же фигня. Пару значений перевести не проблема, а когда их много это геморно.Еще хорошо было бы если ввели констаты в опкоды(SCM.ini) или отдельный файл как CustomVariables.ini. К примеру так:
SCM.ini
[OPCODES]
02a8=5,%5d% = create_marker %4b:RadarSprites% at %1d% %2d% %3d%constants.ini
[RadarSprites]
RADAR_SPRITE_NONE=0
RADAR_SPRITE_ASUKA=1
RADAR_SPRITE_BOMB=2
RADAR_SPRITE_CAT=3
RADAR_SPRITE_DON=6в проге:
02A8: $VAR = иконка на радаре RADAR_SPRITE_CAT $X $Y $Z
При использовании keywords
ADD_SPRITE_BLIP_FOR_COORD $VAR RADAR_SPRITE_CAT $X $Y $Z
и при нажатии ctrl+пробел выводился список констатов для данного опкода. И ведь есть исходники констатов для гта3 и вайса.
От себя добавлю, что тоже жду решения проблемы с float: в свое время в паре скриптов долго искал причину бага, которой оказалась эта проблема.
Last edited by Shag (04-03-2017 14:57)
Offline
Тут нет ни чего агрессивного. Движок позволяет и 2 и 4 байта, но неудобство в проге. Я думал что есть решение неудобства как это происходит с текстом.
К примеру 'ABC' - максимум 7 символов. "ABC" - не ограничено. Но тут уже да лимит движка.
Спасибо за внимание. Надеюсь Seemann примет во внимание идеи по улучшению.Странное общение получается из-за невозможности регистрации.
Ах да: про то, что у DimZet13 проблемы с регистрацией здесь, я как-то забыл упомянуть изначально, сорян
P.S. В соответствующую тему написал.
Last edited by Shag (04-03-2017 19:49)
Offline