НаноБот 742 Опубликовано 4 Октября 2014 В общем решил флешгранаты делать для ТЧ 1.0006 X-Ray extensions. Хорошо добавить такие функции, как is_exploded, взорван ли объект, возращает тру если граната или ракета взорвана или другой взрывной объект, или фальш если нет, для остальных объектов возращает нил. Так же если заставить нормально работать функцию getVisible то это функция будет не обязательна. Ещё бы не плохо устранить баг в ЧН, при получении объекта вертолёт(get_helicopter()) и машина(get_car()) игра вылетает, если таким объект не является (должно просто возращать нил), этот баг затрудняет поиск указаных объектов. ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 6 Октября 2014 (изменено) Константа clsid.helicopter_s в луахелпе отсутствует, а clsid.helicopter не работает, впрочем, в таблице db.heli есть все зарегистрированные вертушки. Проверка взорван ли объект, так же можно, проверить трассировкой от центра объекта в любую сторону, хотя лучше конечно движковой правкой, проверка нужной переменой, так быстрей, т.к. может использоваться почти каждый фастапдейт. ЗЫ Ещё хотел спросить, а трассировка выполняется CPU или GPU, по идей граф. процессор быстрей выполнит эту функцию. Изменено 6 Октября 2014 пользователем НаноБот ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 6 Октября 2014 (изменено) В общем изнутри трассировка не чего не даёт, с наружи мешают постороние объекты, это я про проверку взорван ли объект трассировкой. Проверять лучше так: local res = grn:get_wpn_int(nil, smes) или так:local res = grn:get_go_int16(smes) Остаётся узнать, какое смещение у flExploded. А теперь про то что в сингле сопротивление воздуха для всех пуль одинаковое, а для МП такое которое указано в секции патронов. if (GameID() == GAME_SINGLE) air_resistance.mul(-m_fAirResistanceK*delta_time_sec); else air_resistance.mul(-bullet->air_resistance*(bullet->speed)/(bullet->max_speed)*delta_time_sec); В общем надо найти имено проверку if (GameID() == GAME_SINGLE) чуть чуть по колдовать, опа опа америка-европа можно и в сингле настраивать как угодно боеприпасы, для всяких снайпер-модов в самый раз. ЗЫ Добавлю #pragma once enum EGameTypes { GAME_ANY = 0, GAME_SINGLE = 1, GAME_DEATHMATCH = 2, // GAME_CTF = 3, // GAME_ASSAULT = 4, // Team1 - assaulting, Team0 - Defending GAME_CS = 5, GAME_TEAMDEATHMATCH = 6, GAME_ARTEFACTHUNT = 7, //identifiers in range [100...254] are registered for script game type GAME_DUMMY = 255 // temporary game type }; В общем, достаточно заменить константу GAME_SINGLE = 1 на например 16, и при проверке всегда будет второй блок срабатывать. Ладно попробую сам поискать код, хотя это надо дизассемблировать, но я помню куртана (старая игрушка, давно это было) и без его модифицировал. Изменено 6 Октября 2014 пользователем НаноБот ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 6 Октября 2014 (изменено) В общем, смотрим файл XRay\xr_3da\xrGame\Level_Bullet_Manager.cpp air_resistance.mul(-bullet->air_resistance*(bullet->speed)/(bullet->max_speed)*delta_time_sec) bullet->air_resistance какое именно у этих патронов БК? air_resistance = cartridge.m_kAirRes; вот такое. В сингле надо точно установить что cartridge.m_kAirRes не нил. Смотрим в той же папки WeaponAmmo.cpp void CWeaponAmmo::Load(LPCSTR section) { inherited::Load (section); m_kDist = pSettings->r_float(section, "k_dist"); m_kDisp = pSettings->r_float(section, "k_disp"); m_kHit = pSettings->r_float(section, "k_hit"); m_kImpulse = pSettings->r_float(section, "k_impulse"); m_kPierce = pSettings->r_float(section, "k_pierce"); m_kAP = READ_IF_EXISTS(pSettings, r_float, section, "k_ap", 0.0f); m_u8ColorID = READ_IF_EXISTS(pSettings, r_u8, section, "tracer_color_ID", 0); if (pSettings->line_exist(section, "k_air_resistance")) m_kAirRes = pSettings->r_float(section, "k_air_resistance"); else m_kAirRes = pSettings->r_float(BULLET_MANAGER_SECTION, "air_resistance_k"); m_tracer = !!pSettings->r_bool(section, "tracer"); m_buckShot = pSettings->r_s32(section, "buck_shot"); m_impair = pSettings->r_float(section, "impair"); fWallmarkSize = pSettings->r_float(section,"wm_size"); R_ASSERT (fWallmarkSize>0); m_boxSize = (u16)pSettings->r_s32(section, "box_size"); m_boxCurr = m_boxSize; } Из кода я вижу если в секции нет параметра k_air_resistance для МП, то загрузить параметр air_resistance_k это для сингла. В общем достаточно найти адрес константы в этой функции, и изменить её так, что по любому второй блок срабатывал, достаточно такого значения, которое не встречающего в EGameTypes (например 16). Константа 4-х байтовая т.к. GameID() возвращает ансигнед дворд. u32 GameID(){return Game().Type();} В общем как то так, тут бы с компилировать код что бы знать какая сигнатура в этом месте, что бы найти место в файле xrGame.dll. Вот только у меня нет нужного софта для этого дела. Но я думаю вам это не трудно, дело то стоящее. ЗЫ Хотя я мог, не так понять как работают константы в С++, я знаю объжект паскаль, а С++ для меня полутёмный лес. В общем значение константы прямо в код вставляется. Типа так. Call [GameID] cmp eax, 01h jne m1 ... m1: Изменено 7 Октября 2014 пользователем НаноБот ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 7 Октября 2014 (изменено) Паскаль т.е. делфи 6 компилет похожую строку в типа такой код. Call [GameID]dec eaxjne m1...m1: В общем, делфи компилирует на сколько знаю, более хитрый код чем С++, наверно это связано с требованием компилировать более быстро, т.к. проекты как правила более громоздки для С++. Для модификации строчку Call [GameID] заменить на jmp m1, это заменить всего 5 байт-кода. Ещё идея добавить в секцию патронов параметр k_speed - коэффициент скорости. speed = speed * k_speed; И тогда баллистическая модель в сталкере будет почти идеальная. Но это уже по сложней будет. Ещё бы нормальные разрывные пули сделать, в точку попадания спавнить взрывной предмет и тут же подрывать. Такая фишка как Маади-Грифин 30 мм, будет работать как в реальной жизни, бронебойный урановый снаряд, и разрывной ОФС (Осколочно-Фугасный-Снаряд). Изменено 7 Октября 2014 пользователем НаноБот ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 13 Октября 2014 Проверять лучше так: local res = grn:get_wpn_int(nil, smes) или так: local res = grn:get_go_int16(smes) Остаётся узнать, какое смещение у flExploded. Кстати, с гранатами без чеки (объект explosive, missile) эти функции не работают, возвращают нуль или какую-то ерунду, пробовал со смещением до 50000. Хорошо бы дополнительную такую функцию сделать, что бы с любым типом объекта работало. ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 15 Октября 2014 (изменено) Не понял у как get_bone_name работает? obj:get_bone_name(void) просто название кости №0 передаёт, а как индекс задавать не понятно, в листингах указано через какую-то глобальную переменную, а какую не ясно. И ещё забыли указать, для функции трассировки: element = level.get_ray_pick_element() -- элемент объекта: номер кости для объекта, или номер треугольника для геометрии. Вот бы ещё функции; нормаль треугольника и тип материала треугольника определять. ЗЫ Разобрался, в общем так: set_int_arg0(element) bone = res_obj:get_bone_name() element - это индекс кости res_obj - это геймобъект bone - имя кости Изменено 15 Октября 2014 пользователем НаноБот ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 16 Октября 2014 (изменено) Вертексы треугольника: local vera = level.get_tri_vertex1(element) local verb = level.get_tri_vertex2(element) local verc = level.get_tri_vertex3(element) local normal = normal_triangle(vera, verb, verc) Нормаль треугольника: a, b, c - это вертексы треугольника function normal_triangle(a, b, c) -- нормаль треугольника local n = vector() n.x = -((b.y-a.y)*(c.z-a.z))-((b.z-a.z)*(c.y-a.y)) n.y = -((b.z-a.z)*(c.x-a.x))-((b.x-a.x)*(c.z-a.z)) n.z = -((b.x-a.x)*(c.y-a.y))-((b.y-a.y)*(c.x-a.x)) return n:normalize() end Но там уже хранится эта нормаль! Вектор отражения: local dirref = vector():set(0,0,0) dirref:reflect(dir, normal) Вроде должно работать, будем проверять. Для пуль так же надо знать свойство материала, хранится вроде там же, где и вертексы треугольника геометрии. PS Предлагаю имена функциям: get_tri_normal(element) -- нормаль треугольника get_tri_material(element) -- материал треугольника Изменено 16 Октября 2014 пользователем НаноБот ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 16 Октября 2014 (изменено) В общем малость ошибся, нормаль надо инвертировать. function normal_triangle(a, b, c) -- нормаль треугольника local n = vector() n.x = ((b.z-a.z)*(c.y-a.y))-((b.y-a.y)*(c.z-a.z)) n.y = ((b.x-a.x)*(c.z-a.z))-((b.z-a.z)*(c.x-a.x)) n.z = ((b.y-a.y)*(c.x-a.x))-((b.x-a.x)*(c.y-a.y)) return n:normalize() end Тогда функция dirref:reflect(dir, normal) нормально рикошет считает. ЗЫ А как материал определить? Изменено 16 Октября 2014 пользователем НаноБот ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 16 Октября 2014 Это понятно что из скриптов не чего толком не доступно, но из движка же доступно. //статический объект //получить треугольник и узнать его материал CDB::TRI* T = Level().ObjectSpace.GetStaticTris()+result.element; hit_material_idx = T->material; SGameMtl* mtl = GMLib.GetMaterialByIdx(hit_material_idx); if( fsimilar(mtl->fShootFactor,1.0f,EPS) )//Если материал полностью простреливаемый { pData->bStopTracing = false; }else Level().BulletManager().RegisterEvent(EVENT_HIT, FALSE,bullet, end_point, result, hit_material_idx); С компилировать функцию в асм и добавить в ваши библиотеки. А как остальное сделано? Или я что то не понимаю. ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 15 Ноября 2014 (изменено) Усем доброго времяни! Мои наработки, по проекту X-Ray extensions. Удалось найти функцию определения материала, в точности GetMtlfShootFactor Это значение флоат от 0 до 1, 0 - полностью не простреливаемый материал, 1 - полностью простреливаемый. Вот она. ; --------=====НаноБот=====--------- Level__GetMtlfShootFactor proc res = dword ptr 8 index = dword ptr 0Ch push ebp mov ebp, esp push ecx push edx push edi push esi ;------------------------------------------------- mov eax, [ebp + index] ;[g_int_argument_0] ; results.element ;PRINT_UINT "element = %d", eax mov ecx, ds:g_pGameLevel mov ecx, [ecx] mov esi, [ecx+0DCh] ; tri array shl eax, 4 ; eax = results.element * 8 mov cx, [eax+esi+0Ch] and cx, 3FFFh movzx edx, cx ; hit_material_idx mov eax, ds:dword_10560718 mov ecx, [eax+edx*4] ; ecx = mtl mov eax, [ebp+res] mov ecx, [ecx+28h] ; ecx = mtl->fShootFactor mov [eax], ecx ; -- временно, пока беремена! =) -- ;PRINT_FLOAT "MtlfShootFactor=%f", ecx ;fld dword ptr [ecx+28h] ;[eax] xor ecx, ecx mov [eax+4], ecx mov [eax+8], ecx ;---------------------- pop esi pop edi pop edx pop ecx mov esp, ebp pop ebp retn Level__GetMtlfShootFactor endp ; --------===============--------- Функция рабочая, но надо дополнительная функция ввода вывода, я использовал. PERFORM_EXPORT_LEVEL__VECTOR__INT А надо: PERFORM_EXPORT_LEVEL__FLOAT__INT В общем делаем эту функцию, и портируем в проект. Так же, надо функция проверки проходимости материала, для улучшенного ИИ НПС и других существ (дроны, живые мертвецы и т.д.). Есть возможность ставить блудмарки на геометрию и тела, если надо, могу найти код. Так же, если изучу получше С++ и ассемблер могу и присоединиться к проекту, хотя это пока рано. Изменено 15 Ноября 2014 пользователем НаноБот 1 1 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 23 Января 2015 Вот мои поделки в проекте. https://yadi.sk/d/IXDVG_nrdQtfV Пару функций по проверки геометрии. local shootfactor = level.get_tri_shootfactor(nil, element) -- первый параметр строка, не используется0.0 - не пробиваемый1.0 - полностью пробиваемый (пуля пролетает без задержки)иlocal flags = level.get_tri_flags(element)ИспользованияЭто в _G.script или начало скриптаlocal mtlFlags = {flBreakable = 1, -- 0 разрушаемый-- flShootable0 = 2, -- 1 простреливаемый, движком не используется (использовался наверно в старых билдах)flBounceable = 4, -- 2 Может ли пуля нерикошетить? (0 - рикошетит, 1 - нерикошетит)flSkidmark = 8, -- 3 Оставляет ли тормозной след?flBloodmark = 16, -- 4 оставляет ли кровь?flClimable = 32, -- 5 невидимая лестница-- flWalkOn = 64, -- 6 obsoletteflPassable = 128, -- 7 проходимый для физ. объектовflDynamic = 256, -- 8 динамический объектflLiquid = 512, -- 9 жидкость (вода)flSuppressShadows = 1024, -- 10 заглушает тениflSuppressWallmarks = 2048, -- 11 заглушает отметены от пульflActorObstacle = 4096, -- 12 препятствие (силовое поле) для актораflInjurious = 268435456, -- 28 flInjurious = fInjuriousSpeed > 0.f -- отбирает ли здоровье? (аномалия "тополиный пух")flShootable = 536870912, -- 29 непростреливаемыйflTransparent = 1073741824, -- 30 непрозрачныйflSlowDown = 2147483648 -- 31 flSlowDown = (fFlotationFactor<1.f) -- замедление движение} -- 0 - false (нет), 1 - true (да)Далее сама проверкаlocal flags = level.get_tri_flags(element)if bit_and(flags, mtlFlags.flBounceable) ~= 0 then -- пуля не рикошетитelse -- пуля рикошетитend Всё работает, проверил не раз. Не туда запостил, надо в X-Ray extensions 2 2 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 2 Февраля 2015 (изменено) НаноБот, если никаких изменений/дополнений по этим правкам не планируется, могу добавить в проект. В принципе правки полностью готовы к употреблению. Хорошо бы сделать функцию ввода-вывода PERFORM_EXPORT_LEVEL__FLOAT__INT. Но и так сойдёт. ЗЫ Ах да, возможно надо оснастить функцию защитой, если element == -1, а то скрипт как правило отваливается, правда скрипт сам за этим должен следить. Изменено 2 Февраля 2015 пользователем НаноБот ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 2 Февраля 2015 (изменено) Так! Доработал я правки, за одно и ваши функции доделал, проверка на element == -1, выдаёт вектор равен set(0,0,0). Так же, там есть спецприбор для теста этих функций и геометрией (папка gamedata), прибор можно практически в любом моде использовать, в котором проект X-Ray extensions используется. Настраивается так: в файл system.ltx, добавить строчку #include "misc\spezpribor.ltx", в файл bind_stalker.script добавить строчку bind_pribor.spawn_pribor() в функцию actor_binder:net_spawn(data) в конец перед return true, так же, эту строчку можно в любой другой скрипт добавить, который по инфопоршню срабатывает. Ссылка не изменилась. https://yadi.sk/d/IXDVG_nrdQtfV ЗЫ Теперь скрипт не отваливается, но это не значит что скриптер не должен это(element == -1) не проверять. Изменено 3 Февраля 2015 пользователем НаноБот 1 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 10 Февраля 2015 Кстати, когда мои правки добавите в проект? Скриптовые пули уже практически готовы. ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 13 Февраля 2015 , спасибо! Я в свою очередь, скриптовый пули почти доделал, сейчас пытаюсь оптимизировать по быстродействию. Теперь хорошо бы в вики эту инфу занести, особенно по функции get_tri_flags. Но этим @Malandrinus уже заведует. ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 31 Августа 2015 Усем плазменный привет! Я так понял проект начинает загибаться, планируется ли на новую платформу перейти? Я, например, сделал колбек на выстрел, на старт пули, на застревания пули, перезарядка патрона в CCarWeapon. Сейчас работаю над новым классом ScriptParticleLight это партикл с подсветкой, в отдельной секции задаём цвет и манера затухания света. Сейчас могу поставить любой колбек на любое событие для всех трёх сталкеров (по крайней мере для ТЧ и ЧН). В общем, как-то так. 2 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 31 Августа 2015 Какой смысл в бинарных патчах, когда все уже давно и во всю исходники правят и компилят свежие версии двигла ? У меня есть визуал си пляс пляс 2010 но я не умею им толком пользоваться, очень долгая компиляция, мне гораздо проще править в ассемблере и компиляция очень быстрая, вес проекта очень маленький, а сам си весит со всей приблудой 5 ГБ и ещё потом всякий мусор приходится качать, да ещё и не помогает не фига, компилируется с ошибками и т.п. ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 11 Сентября 2015 (изменено) Ура, ура, ура, удалось пофиксить вылет "смерть актора в машине". Ревизия 231 от НаноБота. https://yadi.sk/d/fASnPpVij2tTq Конечно это костыль, но пофик, актор ласты склеил, а далее уже не важно выпал ГГ из машины, или из турели, или нет. Ещё добавил колбек на выстрел для ЧН, есть конечно у меня и для ТЧ, но там я хочу сделать более глобально, целый комплекс колбеков не обходимый для скриптеров, для самого разного оружия (гравиганы, ракетницы, руки контролёра и чего угодно). ЗЫ Для проекта X-Ray extensions portable. А забыл сказать, колбек выстрела передаёт ещё секцию патрона и номер типа режима огня. Типа так. function autogun_binder:on_shoot(ammo_sect, m_iCurFireMode) --a, b, c, d) -- log1("callback:on_shoot() name_wpn-("..self.object:name()..") ammo_sect-("..str(ammo_sect)..") m_iCurFireMode-("..str(m_iCurFireMode)..")") end Изменено 11 Сентября 2015 пользователем НаноБот 2 6 2 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение
НаноБот 742 Опубликовано 25 Октября 2015 (изменено) Работал только с ЗП. https://yadi.sk/d/fSEEvzpgjzMxf Описание внутри архива. Много чего добавил, прежде всего пространство имён game_object. Так же, теперь можно из подствольного гранатомёта стрелять дробью. При смене типа боеприпаса меняется ракета, в оригинале стреляло прежней гранатой, это было не заметно, но в модах с разными боеприпасами, например кумулятивными, это существенно влияло на геймплей. Добавил функции трассировки геометрии и объектов. Изменил метод explode, теперь надо задавать объект инициатора, типа так bomb:explode(npc) где npc инициатор, если это актор то НПС на него обижаются. В классе CUIStatic добавил метод SetColor задать цвет текстуры, использовать так: stat:SetColor(Frect():set(A, R, G, Добавил возможность использования скриптов (биндеров) в мультиплейере. Добавил метода для мультиплейера: получить текущего актора и проверка: это сервер? Вроде всё. PSА забыл, для того что бы стрелять дробью, в секции патрона, параметр - fake_grenade_name должна быть пустая строка, типа так: fake_grenade_name = Изменено 25 Октября 2015 пользователем НаноБот 3 1 ...в конце концов, важен лишь, машинный код. СТАЛКЕР только для ПК! Поделиться этим сообщением Ссылка на сообщение