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

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

Переменные погодных конфигов не работают для саншафтов, как нужно их изменить чтобы они заработали?

Изменено пользователем Anonim
Ссылка на комментарий

Всем, хаюшки! Совсем недавно, а именно вчера решил попробывать поковырять движок. И уточнив что я нуб, излогаю собственно сам вопрос. Как мне сталкерский курсор состоящий из seq-спрайта, заменить на мелкософтовский анимированный .ani 

Заранее благодарен.

Изменено пользователем Samber13
Ссылка на комментарий

Yes. How to repair this?

Turn off the actor shadow in xrGame.dll.

 

Вопрос к разработчикам. Можно ли надеяться на появление в X-RAY extensions равноценных слотов под стволы, которые давно реализованы в 1.0007(RC1)? Вместе с кнопками быстрого доступа F1-F4? Очень хотелось бы)

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

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

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

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

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

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

Ссылка на комментарий

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

Проверки на класс (get_clsid(obj) == clsid.car_s и get_clsid(obj) == clsid.helicopter_s) разве не катят? Изменено пользователем Shadows
Ссылка на комментарий

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

ЗЫ

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

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

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

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

Ссылка на комментарий

Константа clsid.helicopter_s в луахелпе отсутствует

В луахелпе много чего нет, что на самом деле экспортировано. Взять хотя бы класс прогресс-бара... Так что стоит таки проверять все варианты.

 

Проверка взорван ли объект

Для объектов на классе CExplosive можно проверять флаг m_explosion_flags.test(flExploded). Изменено пользователем Shadows
Ссылка на комментарий

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

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

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:

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

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

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

Ссылка на комментарий

заменить константу GAME_SINGLE = 1 на например 16, и при проверке всегда будет второй блок срабатывать

Тогда много где будет какой-нибудь "другой" блок срабатывать. И что мешает переделать условие в том куске кода? Изменено пользователем Shadows
Ссылка на комментарий

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

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

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

Ссылка на комментарий

 

 

что бы найти место в файле xrGame.dll

 

 

if (pSettings->line_exist(section, "k_air_resistance"))

Надобно это найти? Тогда качать IDA и дальше поиск k_air_resistance и просмотр ссылок на эту строку...

Вот только зачем это, если у нас есть нормальные исходники :)

 

 

найти адрес константы в этой функции, и изменить её

jmp поставить, не?))

 

 

cmp eax, 01h

бывает ещё хитрее,

,,
mov eXX,01
cmp eax,eXX

Вот ещё что, смещения текущего Гейм ID для чит енжина :ph34r:

 

 

    <CheatEntry>
      <ID>1</ID>
      <Description>"GameType1"</Description>
      <Color>80000008</Color>
      <VariableType>4 Bytes</VariableType>
      <Address>"xrEngine.exe"+000931A8</Address>
      <Offsets>
        <Offset>414</Offset>
        <Offset>4</Offset>
      </Offsets>
    </CheatEntry>
    <CheatEntry>
      <ID>34</ID>
      <Description>"GameType2"</Description>
      <Color>80000008</Color>
      <VariableType>4 Bytes</VariableType>
      <Address>[[["xrGame.dll"+512BDC]]+486F8]+10</Address>
    </CheatEntry>

 

 

Ссылка на комментарий

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

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

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

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

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

speed = speed * k_speed;

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

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

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

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

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

Ссылка на комментарий

Welcome. How to make items such as backlight in LA , that is, as we have in the slot gun is when we have a window of sales he is green?

Добро пожаловать . Как сделать такие элементы, как подсветка в Лос-Анджелесе , который , как у нас в слот пистолет , когда у нас есть окно продаж он зеленый ?

  • Нравится 1
Ссылка на комментарий

How to make items such as backlight in LA , that is, as we have in the slot gun is when we have a window of sales he is green?

You should unlock this fixes:

; !!! кастомную заливку можно включать, когда имеем альтернативную скриптовую обвязку !!!
;0x103BF3C7 5 ; jmp CUITradeWnd__FillList_fix ; кастомная заливка предметов в окне торговли
;0x103CBF49 5 ; jmp CUICarBodyWnd__UpdateLists_fix ; кастомная заливка предметов в окне обыска ящиков

in correction_list file.

Ссылка на комментарий

 

 

Проверять лучше так: 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:

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

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

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

Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

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