Перейти к контенту

X-Ray extensions


Malandrinus

Рекомендуемые сообщения

В общем решил флешгранаты делать для ТЧ 1.0006 X-Ray extensions.

Хорошо добавить такие функции, как is_exploded, взорван ли объект, возращает тру если граната или ракета взорвана или другой взрывной объект, или фальш если нет, для остальных объектов возращает нил. Так же если заставить нормально работать функцию getVisible то это функция будет не обязательна.

Ещё  бы не плохо устранить баг в ЧН, при получении объекта вертолёт(get_helicopter()) и машина(get_car()) игра вылетает, если таким объект не является (должно просто возращать нил), этот баг затрудняет поиск указаных объектов.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Константа clsid.helicopter_s в луахелпе отсутствует, а clsid.helicopter не работает, впрочем, в таблице db.heli есть все зарегистрированные вертушки. Проверка взорван ли объект, так же можно, проверить трассировкой от центра объекта в любую сторону, хотя лучше конечно движковой правкой, проверка нужной переменой, так быстрей, т.к. может использоваться почти каждый фастапдейт.

ЗЫ

Ещё хотел спросить, а трассировка выполняется CPU или GPU, по идей граф. процессор быстрей выполнит эту функцию.

Изменено пользователем НаноБот

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

В общем изнутри трассировка не чего не даёт, с наружи мешают постороние объекты, это я про проверку взорван ли объект трассировкой.

Проверять лучше так:

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) чуть чуть по колдовать, опа опа америка-европа можно и в сингле настраивать как угодно боеприпасы, для всяких снайпер-модов в самый раз. :hunter:  :crazy:

ЗЫ

Добавлю

#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, и при проверке всегда будет второй блок срабатывать. Ладно попробую сам поискать код, хотя это надо дизассемблировать, но я помню куртана (старая игрушка, давно это было) и без его модифицировал. :wacko:

Изменено пользователем НаноБот

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

В общем, смотрим файл 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:
Изменено пользователем НаноБот

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Паскаль т.е. делфи 6 компилет похожую строку в типа такой код.

Call [GameID]
dec eax
jne m1
...
m1:

В общем, делфи компилирует на сколько знаю, более хитрый код чем С++, наверно это связано с требованием компилировать более быстро, т.к. проекты как правила более громоздки для С++.

Для модификации строчку Call [GameID]  заменить на jmp m1, это заменить всего 5 байт-кода.

Ещё идея добавить в секцию патронов параметр k_speed - коэффициент скорости.

speed = speed * k_speed;

И тогда баллистическая модель в сталкере будет почти идеальная. Но это уже по сложней будет.

Ещё бы нормальные разрывные пули сделать, в точку попадания спавнить взрывной предмет и тут же подрывать. Такая фишка как Маади-Грифин 30 мм, будет работать как в реальной жизни, бронебойный урановый снаряд, и разрывной ОФС (Осколочно-Фугасный-Снаряд).

Изменено пользователем НаноБот

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение

 

 

Проверять лучше так: local res = grn:get_wpn_int(nil, smes) или так: local res = grn:get_go_int16(smes) Остаётся узнать, какое смещение у flExploded.

Кстати, с гранатами без чеки (объект explosive, missile) эти функции не работают, возвращают нуль или какую-то ерунду, пробовал со смещением до 50000. Хорошо бы дополнительную такую функцию сделать, что бы с любым типом объекта работало.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Не понял у как 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 - имя кости

Изменено пользователем НаноБот

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Вертексы треугольника:

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) --  материал треугольника

:rolleyes:

Изменено пользователем НаноБот

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

В общем малость ошибся, нормаль надо инвертировать.

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) нормально рикошет считает.

ЗЫ

А как материал определить?

Изменено пользователем НаноБот

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение

Это понятно что из скриптов не чего толком не доступно, но из движка же доступно.

 

//статический объект
//получить треугольник и узнать его материал
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);

 

 

С компилировать функцию в асм и добавить в ваши библиотеки. А как остальное сделано? Или я что то не понимаю. 

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Усем доброго времяни!

Мои наработки, по проекту 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

В общем делаем эту функцию, и портируем в проект.

Так же, надо функция проверки проходимости материала, для улучшенного ИИ НПС и других существ (дроны, живые мертвецы и т.д.).

Есть возможность ставить блудмарки на геометрию и тела, если надо, могу найти код.

Так же, если изучу получше С++ и ассемблер могу и присоединиться к проекту, хотя это пока рано.

Изменено пользователем НаноБот
  • Спасибо 1
  • Нравится 1

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение

Вот мои поделки в проекте.

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 obsolette
flPassable = 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

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)
НаноБот, если никаких изменений/дополнений по этим правкам не планируется, могу добавить в проект.

 

В принципе правки полностью готовы к употреблению. Хорошо бы сделать функцию ввода-вывода PERFORM_EXPORT_LEVEL__FLOAT__INT. Но и так сойдёт.

 

ЗЫ

Ах да, возможно надо оснастить функцию защитой, если element == -1, а то скрипт как правило отваливается, правда скрипт сам за этим должен следить.

Изменено пользователем НаноБот

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Так!

Доработал я правки, за одно и ваши функции доделал, проверка на 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) не проверять.

Изменено пользователем НаноБот
  • Полезно 1

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение

Кстати, когда мои правки добавите в проект? Скриптовые пули уже практически готовы.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение

, спасибо!

Я в свою очередь, скриптовый пули почти доделал, сейчас пытаюсь оптимизировать по быстродействию.

Теперь хорошо бы в вики эту инфу занести, особенно по функции get_tri_flags. Но этим @Malandrinus уже заведует.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение

Усем плазменный привет!

Я так понял проект начинает загибаться, планируется ли на новую платформу перейти?

Я, например, сделал колбек на выстрел, на старт пули, на застревания пули, перезарядка патрона в CCarWeapon. Сейчас работаю над новым классом ScriptParticleLight это партикл с подсветкой, в отдельной секции задаём цвет и манера затухания света. Сейчас могу поставить любой колбек на любое событие для всех трёх сталкеров (по крайней мере для ТЧ и ЧН). В общем, как-то так. :unsure:

  • Нравится 2

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение

 

 

Какой смысл в бинарных патчах, когда все уже давно и во всю исходники правят и компилят свежие версии двигла ?

У меня есть визуал си пляс пляс 2010 но я не умею им толком пользоваться, очень долгая компиляция, мне гораздо проще править в ассемблере и компиляция очень быстрая, вес проекта очень маленький, а сам си весит со всей приблудой 5 ГБ и ещё потом всякий мусор приходится качать, да ещё и не помогает не фига, компилируется с ошибками и т.п.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
(изменено)

Работал только с ЗП.

https://yadi.sk/d/fSEEvzpgjzMxf

Описание внутри архива.

Много чего добавил, прежде всего пространство имён game_object.

Так же, теперь можно из подствольного гранатомёта стрелять дробью.

При смене типа боеприпаса меняется ракета, в оригинале стреляло прежней гранатой, это было не заметно, но в модах с разными боеприпасами, например кумулятивными, это существенно влияло на геймплей.

Добавил функции трассировки геометрии и объектов.

Изменил метод explode, теперь надо задавать объект инициатора, типа так bomb:explode(npc) где npc инициатор, если это актор то НПС на него обижаются.

В классе CUIStatic добавил метод SetColor задать цвет текстуры, использовать так: stat:SetColor(Frect():set(A, R, G, B)

Добавил возможность использования скриптов (биндеров) в мультиплейере.

Добавил метода для мультиплейера: получить текущего актора и проверка: это сервер?

Вроде всё.

PS
А забыл, для того что бы стрелять дробью, в секции патрона, параметр - fake_grenade_name должна быть пустая строка, типа так:  fake_grenade_name =

Изменено пользователем НаноБот
  • Нравится 3
  • Полезно 1

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...