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

[SoC] Ковыряемся в файлах


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

@Fagot.

[zhabon2_walk_2]
points = p0,p1
p0:name = name00|a=sprint|sig=wolfenemy
p0:position = -208.77569580078, -19.800821304321, -135.66622924805
p0:game_vertex_id = 61
p0:level_vertex_id = 44630
p0:links = p1(1)

p1:name = wp01|a=sprint|sig=delzhabon
p1:position = -37.370750427246, -14.731424331665, -155.85919189453
p1:game_vertex_id = 108
p1:level_vertex_id = 240893

Зачем показывать? Ты бы лучше сразу сказал, как надо. :)

Ранее был известен под ником BoBaH_671.

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

@BoBaH_671, я не у компьютера, а на память всего и не упомнишь...

Вроде, верно всё у тебя. Попробуй сигнал с анимацией местами поменять, или сингнал вообще убрать (на время, для теста).

Вообще, движок иногда как-то не правильно понимает некоторые анимации. Например, на Свалке, когда освобождаешь Юрика,он бывает вразвалочку бежит к Бесу, а бывает бежит в спринте...

 

И на всякий случай - если начал писАть

name00, то так и пиши во всех точках (у тебя следующая wp01).

Изменено пользователем Fagot.
  • Спасибо 1
Ссылка на комментарий

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

Искал много...

Нарыл вот только скрипт из Oblivion Lost Remake

 

 

--Oblivion Lost Remake (2014)
--© proger_Dencheek
--Раскачка оружия

local weapon_classes = {
[clsid.wpn_vintorez_s] = true,
[clsid.wpn_ak74_s] = true,
[clsid.wpn_ak74] = true,
[clsid.wpn_binocular] = true,
[clsid.wpn_binocular_s] = true,
[clsid.wpn_lr300_s] = true,
[clsid.wpn_hpsa_s] = true,
[clsid.wpn_pm_s] = true,
[clsid.wpn_shotgun_s] = true,
[clsid.wpn_bm16_s] = true,
[clsid.wpn_bm16] = true,
[clsid.wpn_svd_s] = true,
[clsid.wpn_rpg7_s] = true,
[clsid.wpn_groza_s] = true,
[clsid.wpn_knife_s] = true,
[clsid.wpn_grenade_launcher] = true,
[clsid.wpn_grenade_f1] = true,
[clsid.wpn_grenade_rpg7] = true,
[clsid.wpn_grenade_rgd5] = true,
[clsid.wpn_grenade_fake] = true,
[clsid.wpn_fort] = true,
[clsid.wpn_fn2000] = true,
[clsid.wpn_groza] = true,
[clsid.wpn_hpsa] = true,
[clsid.wpn_knife] = true,
[clsid.wpn_lr300] = true,
[clsid.wpn_mounted] = true,
[clsid.wpn_pm] = true,
[clsid.obj_bolt] = true,
[clsid.wpn_rg6] = true,
[clsid.wpn_rg6_s] = true,
[clsid.wpn_rpg7] = true,
[clsid.wpn_shotgun] = true,
[clsid.wpn_stat_mgun] = true,
[clsid.wpn_svd] = true,
[clsid.wpn_svd_s] = true,
[clsid.wpn_svu] = true,
[clsid.wpn_svu_s] = true,
[clsid.wpn_usp45] = true,
[clsid.wpn_usp45_s] = true,
[clsid.wpn_val] = true,
[clsid.wpn_val_s] = true,
[clsid.wpn_vintorez] = true,
[clsid.wpn_walther] = true,
[clsid.wpn_walther_s] = true,
[clsid.wpn_wmagaz] = true,
[clsid.wpn_wmaggl] = true
}

local table_DIK_keys = {
DIK_0 = 11;
DIK_1 = 2;
DIK_2 = 3;
DIK_3 = 4;
DIK_4 = 5;
DIK_5 = 6;
DIK_6 = 7;
DIK_7 = 8;
DIK_8 = 9;
DIK_9 = 10;
DIK_A = 30;
DIK_ADD = 78;
DIK_APOSTROPHE = 40;
DIK_APPS = 221;
DIK_AT = 145;
DIK_AX = 150;
DIK_B = 48;
DIK_BACK = 14;
DIK_BACKSLASH = 43;
DIK_C = 46;
DIK_CAPITAL = 58;
DIK_CIRCUMFLEX = 144;
DIK_COLON = 146;
DIK_COMMA = 51;
DIK_CONVERT = 121;
DIK_D = 32;
DIK_DECIMAL = 83;
DIK_DELETE = 211;
DIK_DIVIDE = 181;
DIK_DOWN = 208;
DIK_E = 18;
DIK_END = 207;
DIK_EQUALS = 13;
DIK_ESCAPE = 1;
DIK_F = 33;
DIK_F1 = 59;
DIK_F10 = 68;
DIK_F11 = 87;
DIK_F12 = 88;
DIK_F13 = 100;
DIK_F14 = 101;
DIK_F15 = 102;
DIK_F2 = 60;
DIK_F3 = 61;
DIK_F4 = 62;
DIK_F5 = 63;
DIK_F6 = 64;
DIK_F7 = 65;
DIK_F8 = 66;
DIK_F9 = 67;
DIK_G = 34;
DIK_GRAVE = 41;
DIK_H = 35;
DIK_HOME = 199;
DIK_I = 23;
DIK_INSERT = 210;
DIK_J = 36;
DIK_K = 37;
DIK_KANA = 112;
DIK_KANJI = 148;
DIK_L = 38;
DIK_LBRACKET = 26;
DIK_LCONTROL = 29;
DIK_LEFT = 203;
DIK_LMENU = 56;
DIK_LSHIFT = 42;
DIK_LWIN = 219;
DIK_M = 50;
DIK_MINUS = 12;
DIK_MULTIPLY = 55;
DIK_N = 49;
DIK_NEXT = 209;
DIK_NOCONVERT = 123;
DIK_NUMLOCK = 69;
DIK_NUMPAD0 = 82;
DIK_NUMPAD1 = 79;
DIK_NUMPAD2 = 80;
DIK_NUMPAD3 = 81;
DIK_NUMPAD4 = 75;
DIK_NUMPAD5 = 76;
DIK_NUMPAD6 = 77;
DIK_NUMPAD7 = 71;
DIK_NUMPAD8 = 72;
DIK_NUMPAD9 = 73;
DIK_NUMPADCOMMA = 179;
DIK_NUMPADENTER = 156;
DIK_NUMPADEQUALS = 141;
DIK_O = 24;
DIK_P = 25;
DIK_PAUSE = 197;
DIK_PERIOD = 52;
DIK_PRIOR = 201;
DIK_Q = 16;
DIK_R = 19;
DIK_RBRACKET = 27;
DIK_RCONTROL = 157;
DIK_RETURN = 28;
DIK_RIGHT = 205;
DIK_RMENU = 184;
DIK_RSHIFT = 54;
DIK_RWIN = 220;
DIK_S = 31;
DIK_SCROLL = 70;
DIK_SEMICOLON = 39;
DIK_SLASH = 53;
DIK_SPACE = 57;
DIK_STOP = 149;
DIK_SUBTRACT = 74;
DIK_SYSRQ = 183;
DIK_T = 20;
DIK_TAB = 15;
DIK_U = 22;
DIK_UNDERLINE = 147;
DIK_UNLABELED = 151;
DIK_UP = 200;
DIK_V = 47;
DIK_W = 17;
DIK_X = 45;
DIK_Y = 21;
DIK_YEN = 125;
DIK_Z = 44;
MOUSE_1 = 256;
MOUSE_2 = 512;
MOUSE_3 = 1024
}

local walk_states = {
[1] = true,
[17] = true,
[33] = true,
[4] = true,
[8] = true,
[20] = true,
[24] = true,
[49] = true,
[52] = true,
[56] = true,
[5] = true,
[9] = true,
[2] = true,
[18] = true,
[50] = true,
[10] = true,
[6] = true,
[21] = true,
[25] = true,
[26] = true,
[22] = true,
[57] = true,
[58] = true,
[53] = true,
[37] = true,
[41] = true,
[34] = true,
[38] = true,
[42] = true,
[54] = true
}

local walk_shift_states = {
[33] = true,
[37] = true,
[41] = true,
[34] = true,
[38] = true,
[42] = true,
[49] = true,
[53] = true,
[57] = true,
[50] = true,
[54] = true,
[58] = true
}

local sprint_states = {
[4225] = true,
[4097] = true,
[4353] = true,
[4608] = true,
[4609] = true
}

local hud_grenade_states = {
[2] = true,
[3] = true,
[6] = true,
[7] = true
}

local ini = system_ini()

local sprint_state = false
local sprint_state_shift = false
local sprint_state_accuracy = false
local is_sprint = false
local bolt_sprint_state = false

local reload_key = -1

local lai = -1

local sobj = nil
local data = {}

local function IsNoneAnimsForWpn(obj)
if obj:clsid() == clsid.obj_bolt or
obj:clsid() == clsid.wpn_grenade_f1 or
obj:clsid() == clsid.wpn_grenade_rgd5 then
return obj:get_hud_item_state() == 2
else
return obj:get_hud_item_state() == 0
end
end

local function play_anim_idle(obj, data)
if obj:get_hud_item_state() == 3 then
return nil
end

if sprint_states[db.actor:actor_body_state()] == true then
return nil
end

if ini ~= nil and (
(not ini:line_exist(obj:section(), "grenade_launcher_status")) or
(ini:line_exist(obj:section(), "grenade_launcher_status") and
ini:r_float(obj:section(), "grenade_launcher_status") == 1)
) then
obj:play_hud_animation("idle", true)
elseif data == nil then
obj:play_hud_animation("idle", true)
elseif hud_grenade_states[data.addon_flags] ~= true then
obj:play_hud_animation("idle", true)
elseif data.grenade_mode == 1 then
obj:play_hud_animation("idle_g", true)
else
obj:play_hud_animation("idle_w_gl", true)
end
end

local function play_anim_raskachka(obj, state, s1, s2)
if s1 == nil then
s1 = ""
end
if s2 == nil then
s2 = s1
end

if walk_shift_states[state] ~= true and not (db.actor:accuracy()*1000 < 1) then
obj:play_hud_animation(("raskachka%s"):format(s1), true)
if sprint_state_shift == true then
sprint_state_shift = false
end
else
obj:play_hud_animation(("raskachka_walk%s"):format(s2), true)
sprint_state_shift = true
end
end

function Update()
local active_item = db.actor:active_item()

if active_item ~= nil and weapon_classes[active_item:clsid()] == true then
local state = db.actor:actor_body_state()
local is_accuracy = db.actor:accuracy()*1000 < 1
--den.cout(state)
if active_item:id() ~= lai then
lai = active_item:id()
sprint_state = false
sobj = alife():object(lai)
end

if walk_shift_states[state] == true or is_accuracy == true then
if sprint_state == true and sprint_state_shift == false then
sprint_state = false
end
elseif sprint_state_shift == true then
sprint_state_shift = false
sprint_state = false
play_anim_idle(active_item, data)
end

if is_accuracy == true and sprint_state_accuracy == false then
sprint_state_accuracy = true
sprint_state = false
elseif is_accuracy == false and sprint_state_accuracy == true then
sprint_state_accuracy = false
sprint_state = false
end

if sobj ~= nil then
data = m_net_utils.get_weapon_w_gl_full_data(sobj)
end

if active_item:clsid() == clsid.obj_bolt or
active_item:clsid() == clsid.wpn_knife or
active_item:clsid() == clsid.wpn_binocular or
active_item:clsid() == clsid.wpn_binocular_s or
active_item:clsid() == clsid.wpn_grenade_f1 or
active_item:clsid() == clsid.wpn_grenade_rgd5 or
active_item:clsid() == clsid.wpn_knife_s then
if IsNoneAnimsForWpn(active_item) and state == 4097 then
if bolt_sprint_state == false then
bolt_sprint_state = true
active_item:play_hud_animation("idle_sprint", true)
end
elseif bolt_sprint_state == true then
bolt_sprint_state = false
play_anim_idle(active_item, data)
end
elseif bolt_sprint_state == true then
bolt_sprint_state = false
end

--if is_accuracy == true and sprint_state == true then
-- --den.cout("2active_item:play_hud_animation(idle, true)")
-- play_anim_idle(active_item, data)
-- sprint_state = false
-- return nil
--end

if sprint_states[state] == true or (
(not IsNoneAnimsForWpn(active_item)) and
sprint_state == true
) then
sprint_state = false
if active_item:clsid() == clsid.wpn_grenade_f1 or
active_item:clsid() == clsid.wpn_grenade_rpg7 or
active_item:clsid() == clsid.wpn_grenade_rgd5 or
active_item:clsid() == clsid.wpn_knife_s then
play_anim_idle(active_item, data)
end
return nil
elseif walk_states[state] == true then
if sprint_state == false and (
IsNoneAnimsForWpn(active_item)
) then
sprint_state = true
local ini = system_ini()
if ini ~= nil and (
(not ini:line_exist(active_item:section(), "grenade_launcher_status")) or (
ini:line_exist(active_item:section(), "grenade_launcher_status") and
ini:r_float(active_item:section(), "grenade_launcher_status") == 1
)
) then
play_anim_raskachka(active_item, state)
elseif data == nil then
play_anim_raskachka(active_item, state)
elseif hud_grenade_states[data.addon_flags] ~= true then
play_anim_raskachka(active_item, state)
elseif data.updgrenade_mode == 1 then
play_anim_raskachka(active_item, state, "_g")
else
play_anim_raskachka(active_item, state, "_w_gl", "_g")
end
end
elseif sprint_state == true then
sprint_state = false
play_anim_idle(active_item, data)
end
elseif sprint_state == true then
sprint_state = false
end
end

function OnInitMainMenu()
end

 

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

 

BoBaH_671, сделай в state_lib.script дубликат секции sprint (пр.: sprint_fast), и в получившейся измени - mental = anim.danger → anim.panic .

 

  • Спасибо 2
  • Полезно 1
Ссылка на комментарий

Привет всем.
Опишу ситуацию: в папке scripts есть 20 подобных файлов task_**.ltx, где ** - число от 1 до 20. Насколько я понял, в этих файлах содержаться инфопоршни. Единственная разница между этими файлами - большее кол-во поршней, т.е. в каждом последующем файле добавляются несколько новых строчек.
Вопрос: какой из этих файлов используется игрой и используется ли он вообще, поскольку ни в одном руководстве по созданию квестов эти файлы не упоминаются (или я плохо смотрел)?

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

@Vadyanchikus, они вызываются в двух коллбеках, и каждый раз все вот эти коды накидываются, решить можно только написанием какого-нибудь менеджера квестов который будет выключать/отключать все нужное для текущих квестов, а которые были или уже нет отключать.

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

@Карлан, не очень понял. Я не программист, поэтому все эти коллбеки и прочее для меня непонятны.
Вообще, я спрашивал про назначение этих файлов. Зачем они нужны (только попроще) и читает ли их движок вообще?

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

@Vadyanchikus, попроще - они нужны для поддержки квестов, и да, они задействованы. Как и всякие *_dialogs.script. А вообще в папке scripts ltx файлов быть не должно ;).

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

 

 

Вопрос: какой из этих файлов используется игрой и используется ли он вообще

Ну если внимательно глянуть содержимое этих файлов: таблица, в которую заносится список большинства инфо-порций, используемых в игре. Далее парсинг этой таблицы и выдача всех занесенных в нее и-п актеру(ГГ). Личное мое мнение - рудимент, оставшийся от тестирования игры ПЫСами. Если я не ошибаюсь, то соответственно ценность этих файлов - сами понимаете какая...

 

Теперь о своем:

Как-то давненько, попадалось мне пояснение о том, как рассчитывается цена покупки\продажи шмота всякими торговцами главгерою. И там вроде учитывается благосклонность(goodwill), причем и личная(торгаш->ГГ) и группировки торгаша(группировка торгаша->ГГ(или группировка ГГ?)). Собственно два вопроса:
 - напомните эту формулу, кто помнит\знает\имеет описание;
 - все виды благосклонности - от чего еще изменяются, кроме прямого изменения из скриптов с помощью движковых ф-ций ?
Ссылка на комментарий

@Vadyanchikus@UnLoaded, возможно я не так понял, и имелись ввиду скрипты task_1.script и иже с ним, если так, то это чистый мусор который можно весь удалить, что я давно и сделал у себя. Мне подумалось что речь идет о level_tasks.script и его хвостах.

 

 - напомните эту формулу, кто помнит\знает\имеет описание;

Формулу чего? Расчета цены предмета? Расчета коэффициента благосклонности? Расчет самой благосклонности? Точнее говори. Если говорить о торговле, то там совсем все странно... и забавно :).

 

 - все виды благосклонности - от чего еще изменяются, кроме прямого изменения из скриптов с помощью движковых ф-ций ?

В движке же русским по белому. Словами довольно долго объяснять, а там сразу четко видно как и что расчитывается. Поверь, ты угоришь когда поймешь что есмь конфиг game_relations, как он заюзан, и какой на самом деле его потенциал. В ТЧ с конфигами вообще лютые артефакты выплывают за какой не возьмись. Довольно во многих забавная фигня творится которую надо править, например я правлю. По отношениям оно забавно осознавать зачем эти самые нужны движку, ну и опять... :). В общем вывод если особо не хочешь в это лезть, то не задумывайся как это работает, в общем такого чего-то супер-пупер тут и близко нет.

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

@Карлан, да, я имел в виду task_1.script и ему подобные.
Кстати, поможешь с одним делом? Уже 2-ой день голову ломаю.
В общем, ситуация: я ввёл в игру флешку, а на ней инфа. Так вот, я хочу сделать так, что при взятии этой флешки в КПК ГГ появляется соответствующая инфа. Я прописал в скрипте инфопоршень, зарегал сам инфопоршень, прописал его текст, а инфа всё равно не выдаётся. Никаких ошибок и вылетов, я просто получаю флешку и на этом всё.
Вот скрипт:

 

function borov_flash()
if (actor:object("borov_flash") and not has_alife_info("borov_flash_found")) then
db.actor:give_info_potrion("borov_flash_found")
end
end


Вот зареганный инфопоршень:

 

 

<info_portion id="borov_flash_found">
<article>borov_flash</article>
</info_portion>

 


Вот зареганный article:

 

 

<article id="borov_flash" name="Borov flash" article_type="Journal" group="Found_PDA">
<text>borov_flash</text>
</article>

 


Уже не знаю, чего не хватает.

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

@Vadyanchikus, для твоей цели у тебя некорректная функция, примерно надо вот так (и то можно в тернарный завернуть, но я чтоб понятнее):

function borov_flash(obj)
if obj and obj:section() == 'borov_flash' and not has_alife_info("borov_flash_found") then --// подобран объект с секцией borov_flash?
db.actor:give_info_potrion("borov_flash_found") --// даем инфо
end
end

Вызов этой функции нужно вписать в тейк коллбек, открой bind_stalker.script, найди функцию actor_binder:on_item_take (obj), и после этой строки впиши:

имя_твоего_скрипта.borov_flash(obj)

И не пользоваться бб-кодами при публикации своего кода на этой площадке - моветон ;).

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

@Карлан, а этот скрипт точно будет работать? Просто свой я брал на основе имеющихся, например, та же флешка Стрелка или доки из Х18. Всё бы ничего, но на Win 7 игра долго грузится, а я порядком утомился ждать из-за каждой мелкой правки, ибо пока только учусь  :)
И, вот, немного непонятен твой комментарий:

 

 

подобран объект с секцией borov_flash?

borov_flash - это название предмета. Если что, то он квестовый.

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

@Vadyanchikus, это секция предмета, названием можно обозвать имя. Функция работать будет, можно еще заюзать function_complete, по моему так называется, это прямо в самом подзадании проставлять надо (если это финальное подзадание то и в голове таска тоже), можешь в оригинале примеры посмотреть. 

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

 

 

скрипт не работает.

Ну так выкладывай - что и где ты добавлял\изменял, чтоб можно было понять, от чего он у тебя не работает.

 

 

 

В движке же русским по белому...

Откуда вывод, что у всех исходники движка, и все их читают аки азбуку ? Ну нет у меня их...

Ну хочется мне знать: кроме прямых изменений благосклонности с помощью движковых ф-ций, она меняется еще как-то(ну кроме прямого убийства НПСов) ?

К примеру - от кол-ва купленного\проданного торгашам шмота меняется ? Если да, то какова формула ? 

 

 

 

Если говорить о торговле, то там совсем все странно... и забавно

Именно о ней. Как в чистом ТЧ считаются цены продажи\покупки у торгашей ?

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

Откуда вывод, что у всех исходники движка, и все их читают аки азбуку ? Ну нет у меня их...

Скачай. Я не вижу проблемы.

 

Ну хочется мне знать: кроме прямых изменений благосклонности с помощью движковых ф-ций, она меняется еще как-то(ну кроме прямого убийства НПСов) ?

Вопрос вообще некорректный. Управляется все одним файлом - делай раз, там русским по белому написаны нормальные комменты - делай два.

 

К примеру - от кол-ва купленного\проданного торгашам шмота меняется ?

Нет.

 

Именно о ней. Как в чистом ТЧ считаются цены продажи\покупки у торгашей ?

Высчитываются базовая цена*кондиция(я сказал "пфе" когда увидел код и комментарий)*конфиг(сюда включается полный комплект отношений для двух агентов, но как на деле - смотрим сами ;))*фактор дефицита(разрабы его почему-то нормально не доделали, но задумка имеет право на жизнь, если бы не кривые руки скриптеров которые писали торговлю :)).

Но самая главная магия она там, немного ниже, разгадка тайны этого монолита стоила мне нескольких часов. Узрейте и вы.

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

@UnLoaded, а чего его выкладывать? Он есть, только чуток выше в сообщениях:

function borov_flash(obj)
if obj and obj:section() == 'borov_flash' and not has_alife_info("borov_flash_found") then --// подобран объект с секцией borov_flash?
db.actor:give_info_potrion("borov_flash_found") --// даем инфо
end
end

Кстати говоря, в скрипте ошибка: give_info_potrion. Но самое интересное не это, а то, что игра не ругалась на эту ошибку при запуске. Как это понимать?

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

Секция 

[known_info]
поршень

работает только на трупах или в тайниках тоже можно юзать? Если нет, то как можно при обыске тайника вызвать функцию/толкнуть поршень?

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

Ранее был известен под ником BoBaH_671.

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

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

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

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

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

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

Войти

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

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

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