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

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


Halford

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

(изменено)

@Девятки, ну я этот мод не ковырял, делал подобное сам, и следуя здравой логике, из этого скрипта(arc.script, они обычно бывают базовые) вызываются два коллбека в биндер монстров, а именно хит коллбек(когда мы в них стреляем, и ведем подсчет), и дез колбек(для, непосредственно, спавна). Т.о. найди два этих вызова и просто перенеси их в биндер монстров, и все, профит.

 

, гляди http://stalkerin.gameru.net/wiki/index.php?title=SoC._%D0%9F%D0%B5%D1%80%D0%B5%D1%85%D0%BE%D0%B4_NPC_%D0%B2_offline-online_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82

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

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


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

, тебе дана готовая конструкция, что еще надобно? Ясное дело она будет показывать ошибку, у тебя смекалки не хватило что-ли комментарий убрать? И, я не уверен, но вроде вместо switch_online(id) надо вызывать switch_offline_online(id), т.к. в ней проверяем нет ли объекта в онлайне и идентифицируем его айди.

 

Но(!) в любом случае работать у тебя она не будет, т.к. тут не известна функция get_se_object(id) (разумеется очевидно, что она делает, но все же). Не знаю на счет других частей, но в ТЧ она точно не глобальная. Так что жди Шредера.

 

P.S. Я в моддинге новичок, так что меня можно не слушать :)

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

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


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

@Fear94, ну чего ленивый то какой? Ведь страницу назад это обсуждали, http://www.amk-team.ru/forum/index.php?showtopic=5525&p=794823  <_<

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

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


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

@proper70,в оригинале нельзя, поставь x-ray extensions, там сделали коллбек отслежки того, кто хитовал ГГ, дальше дело техники. Без него нормально сделать никак не выйдет. Т.к. даже что-бы отследить тип хита нужен хит коллбек, ну а если он будет, то проще по клсиду, ну или еще как - дело вкуса. 

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


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

@Dniwe, что ты вкладываешь в понятие "динамические"? Формулируй вопрос яснее. Если тебе нужен диалог типа "Что интересного?", то тебе в dialog_manager.script, а если тебе нужна рандомная фраза, то нужно просто вызвать перед ветвлением функцию, которая рандомно выберет твои фразы, можешь поглядеть Megadeath Mod, там по моему это было.
 
Продублирую свой вопрос из соседнего топика, там мне отвечать не хотят.

 

Как получить стори айди собеседника?

Так не выходит:

function test(s1,s2)
if s1:id() == (db.actor or db.actor:id()) then
return s2:story_id()
end
return s1:story_id() --/> номер из game_story_ids
end

Пробовал и сразу вот так:

function test(s1,s2)
if s1:id() == (db.actor or db.actor:id()) then
return alife():story_object(s2:story_id())
end
return alife():story_object(s1:story_id()) --/> объект по sid
end

 

 

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


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

@Artos, действительно, поправил, по прежнему никакого результата.

 

ТЧ 1.0006
 

 

 

function sendtip(text) --/ текст
return news_manager.send_tip(db.actor, text, 0, "default", 10000)
end

function test_sid(s1,s2)
if s1:id() == db.actor:id() then
sendtip("S2 sid~~: "..tostring(s2:story_id()))
return s2:story_id()
end
return s1:story_id() --/> номер из game_story_ids
sendtip("S1 sid~~: "..tostring(s1:story_id()))
end
...           
            <phrase id="13">
                <text>carlan_mod_sidor_13</text>
                <action>my_mod.test_sid</action>
            </phrase>
...

 

 

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


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

@Artos, т.о. мы получаем именно непосредственно индентификатор(число)? И story_id() у нас возвращает число соответствующее строке из game_story_ids(типа "000" => 0). И для сидора функция возвращает нам 3(а не 003), а для бармена 500(как и в game_story_ids). Правильно-ли я все понял? Если правильно, тогда поясните на кой черт вообще сдался game_story_ids.ltx со story id(для квестов?)? И как тогда понимать ; Номер SID-а состоит из номера уровня + номер персонажа (2 цифры).?

 

 

P.S. в том случае у меня как раз таки никакого результата не было.

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

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


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

Возможно-ли как-то получить реальную текущую дату?(16.10.13) Через скрипты, разумеется.  

 

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

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


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

Спасибо, @Charsi.

 

Вот наваял функцию получения номера билда по формуле GSC, без введения циферок ручками. Теперь функция полностью автономна. 

--// by Карлан
function get_build_date()
    get_console():execute("mod loaded")
    local flist = getFS():file_list_open_ex("$logs$",FS.FS_ListFiles,"*.log")
    flist:Sort(FS.FS_sort_by_modif_down)
    local res = flist:GetAt(0):ModifDigitOnly()
    if not (res and res ~= "") then return 0 end
    local days = {0,31,59,90,120,151,181,212,243,273,303,334,365}
    local y = tonumber( res:sub(7,10) or 0 ) 
    local m = tonumber( res:sub(4,5) or 0 ) 
    local d = tonumber( res:sub(1,2) or 0 )
    local bd = (365*(y - 1999) - 31 + days[m] + d ) 
	return "(build: "..bd..")"
end

 

Вариант куда более лучший, от @Charsi

--// by Charsi

function get_build_date()
    get_console():execute("cfg_save")
    local f = getFS()
    local flist = f:file_list_open_ex("$app_data_root$",FS.FS_ListFiles,"user.ltx")
    local file = flist:GetAt(0)
    local res = file:ModifDigitOnly()
    local d,m,y = res:match("(%d+)%d+)%d+)")
    local days = {0,31,59,90,120,151,181,212,243,273,303,334,365}
    local bd = (365*(y - 1999) - 31 + days[tonumber(m)] + d ) 
return "(build: "..bd..")"   
end

 

 

 

Финальная версия:

 

--// -------------------------------------------------------------------------------------------
--// Версия мода в виде (build: 5369) [+171013], где первое - номер билда, второе - номер фикса
--// Работает полностью автономно, вызывать в меню, либо где угодно еще
--// -------------------------------------------------------------------------------------------
function get_build_date()
get_console():execute("cfg_save")
local flist = getFS():file_list_open_ex("$app_data_root$",FS.FS_ListFiles,"user.ltx")
local res = flist:GetAt(0):ModifDigitOnly()
local d,m,y = res:match("(%d+)%d+)%d+)")
local fix = tonumber(res:sub(9,10))
local days = {0,31,59,90,120,151,181,212,243,273,303,334,365}
local bd = (365*(tonumber(y) - 1999) - 31 + days[tonumber(m)] + tonumber(d) )
return "(build: "..bd..") [+"..tonumber(d..m..fix).."]"
end
Изменено пользователем Карлан

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


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

4. Довольно странные определения билда и фикса... Получается что, когда запустил игру - тогда и билд сделан с фиксом?! Все же 'build' и 'fix' - некие даты, когда были созданы коды или изменения к ним, а не "дата создания запущенной игры"...

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

 

3. В "финальном" варианте явно ошибочен патерн, вероятно должно быть: 

Форум проглотил патерн, было: 

"(%d+)%d+)%d+)"

 

Расскажите пожалуйста о том, как влияют различные параметры ГГ(репутация/ранг...) на коэффициенты торговли в оригинальном ТЧ? И вообще влияют-ли как-то? Я пока нигде информации о влиянии подобных параметров не нашел, возможно как-то это обрабатывается движком.

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

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


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

У меня теперь вопрос конкретно про репутацию встал. 

 

Сейчас начну формулировать, начал я с того, что вывел кастом статиком db.actor:character_reputation(), и она мне стала показывать репутацию ГГ. Ясно, что она в наградах за таски прописывается, и где то в диалогах о помощи и etc., а вот насчет смерти я например не нашел. Искал в xr_motivator.script что-либо что могло бы повлиять на репутацию, но не нашел. Нашел только непонятную функцию:

 

if(actor_stats.remove_from_ranking~=nil)then
local community = self.object:character_community()
if community == "zombied" or
  community == "monolith" or
  community == "arena_enemy"
then
return
end
actor_stats.remove_from_ranking(self.object:id())
end

Итак, собственно вопросы:

 

1 По каким критериям она изменяется?

2 Каков ее диапазон?

3 Как она влияет на отношения разных группировок/торговцев/монстров на ГГ? (н-р убили сталкера, репутация отнялась, как на это отреагируют бандиты?)

 

Еще добавлю подобный вопрос про функцию goodwill, чем отличается от general_goodwill? Как и от чего изменяется? Мне возвращает всегда 0, пострелял, выполнил пару заданий, и по прежнему было 0.

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

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


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

Можете мне рассказать что делает данная секция? Просто респавнит кабанов в точке? Или это все же гулаг? И кроме этого где-либо нужно указывать для него какие-то параметры? Или просто добавил, и готово?

 

 
; cse_abstract properties
section_name = respawn
name = esc_boar_respawn_mod
position = -48.3812408447266, -17.0997714996338, -169.678924560547
direction = 0, 0, -1.07722399889099e-007
id = 65535
version = 118
script_version = 6
spawn_id = 984


; cse_alife_object properties
game_vertex_id = 106
distance = 19.6
level_vertex_id = 231011
object_flags = 0xffffff3e
custom_data = <<END
[respawn]
respawn_section = boar_weak,10, boar_normal,7,boar_strong,4
;max_count = 8
;min_count = 1
max_spawn = 3
idle_spawn = medium
END


; cse_shape properties
shapes = 1
shape_0:type = sphere
shape_0:offset = 0,0,0
shape_0:radius = 1


; cse_alife_space_restrictor properties
restrictor_type = 0


; se_respawn properties
spawned_obj = 

 

 

 

Так же хотел бы узнать где прописывается радиус смарттеррейна-гулага, в ключе distance или shape_0:radius.

.

 

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

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


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

Объясните мне мою проблему, что-то бьюсь бьюсь и никак не пойму, то стек переполняется то вот такой вылет. Я просто решил добавить двух чуваков в гулаг новичкам, одного - рядового, второго - уникального. Рядовой добавляется и бегает, выполняя какую-либо работу, так же кто-то(может и новенький) выполняет добавленную мною работу...в общем все  хорошо, а как только сую уникального, захожу в игру и проходит несколько секунд и выкидывает меня вот с этим(подозреваю, что с логикой напортачил):

 

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: ...ing\s.t.a.l.k.e.r. 1.0006\gamedata\scripts\_g.script:20: bad argument #2 to 'format' (string expected, got no value)
Собственно мои добавления:
<specific_character id="esc_squash" team_default = "1">


<name>squash</name>
<icon>ui_npc_u_stalker_neytral_balon_1</icon>
<bio>sim_stalker_novice_bio</bio>


<class>esc_squash</class> 
<community>stalker</community> <terrain_sect>stalker_terrain</terrain_sect>
<money min="600" max="2000" infinitive="0"/>


<rank>550</rank>
<reputation>553</reputation>


<visual>actors\neytral\stalker_neytral_rukzak_5</visual> 
<snd_config>characters_voice\human_01\monolith\</snd_config>
<crouch_type>-1</crouch_type>
<panic_treshold>0</panic_treshold>
<supplies>
[spawn] \n
wpn_pm \n
ammo_9x18_fmj = 1 \n
wpn_ak74u \n
ammo_5.45x39_fmj \n
device_torch \n
hand_radio \n
</supplies>


#include "gameplay\character_criticals_3.xml"


<start_dialog>hello_dialog_dark_stalker</start_dialog>
<actor_dialog>dm_cool_info_dialog</actor_dialog>
<actor_dialog>dm_help_wounded_medkit_dialog</actor_dialog>
</specific_character>

 

<character id="esc_squash">
<class>esc_squash</class>
</character> 

 

 

[esc_squash]:stalker
$spawn  = "respawn\esc_squash"
character_profile = esc_squash
spec_rank = regular
community = stalker

 

 

 

[124]


; cse_abstract properties
section_name = stalker
name = esc_squash
position = -181.63005065918, -5.95726537704468, -30.6638507843018
direction = 0.0445535257458687, -0.000645029998850077, 0.0144814234226942
id = 65535
version = 118
script_version = 6
spawn_id = 99


; cse_alife_trader_abstract properties
money = 5000
character_profile = esc_squash


; cse_alife_object properties
distance = 3.5
game_vertex_id = 55
level_vertex_id = 79998
object_flags = 0xffffffbf
custom_data = <<END
[smart_terrains]
esc_lager = true
END


; cse_visual properties
visual_name = actors\novice\green_stalker_2


; cse_alife_creature_abstract properties
g_team = 0
g_squad = 1
g_group = 5
dynamic_out_restrictions = 
dynamic_in_restrictions = 


; cse_alife_monster_abstract properties
equipment_preferences = 2, 2, 0, 1, 0
main_weapon_preferences = 2, 1, 2, 1


; cse_ph_skeleton properties


; se_stalker properties
upd:health = 1
upd:timestamp = 0xef20e0ec
upd:creature_flags = 0xe5
upd:position = -173.606140136719, -20.0129489898682, -133.752899169922
upd:o_torso = -0.000645029998850077, 0.0445535257458687, 0
upd:g_squad = 1
upd:g_group = 5


; cse_alife_human_stalker properties
upd:start_dialog = 


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

 

 

[esc_lager_squash_camp]
points = p0
p0:name = wp00
p0:flags = 0x1
p0:position = -170.06298828125,-20.014019012451,-136.57836914063
p0:game_vertex_id = 55
p0:level_vertex_id = 79998




[esc_lager_squash_camp_look]
points = p0
p0:name = wp00
p1:position = -170.23962402344,-20.173686981201,-153.82247924805
p1:game_vertex_id = 45
p1:level_vertex_id = 79973

 

 

 

   t = { section = "logic@esc_lager_squash",


idle = 0,
prior = 16, state = {0,1},
            online = true,
in_rest = "", out_rest = "esc_lager_guard_kill_zone",
predicate = function(obj_info)
         return obj_info.profile_name == "esc_squash"
end


}
  table.insert(sj, t)

 

 

 

[logic@esc_lager_squash]
active = camper@esc_lager_squash


[camper@esc_lager_squash]
path_walk  = squash_camp
path_look  = squash_camp_look
meet = meet@lager

 

 

 

 

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


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

@AndreySol, а че так сильно западло соседний топик глянуть? http://www.amk-team.ru/forum/index.php?showtopic=7450&p=466444 

 

@sanjaaa, почитай про функций рандома, наверняка задаешь не так(одну цифру пишешь например), а убирать файлы очень глупо, бороться надо с причиной, а не со следствием.

 

 

Подскажите, а возможно-ли как-то сделать так, что бы метки рестрикторов не перекрывали собой метки предметов/персонажей, которые находятся в/рядом с рестриктором. Точнее мне нужно инверсное перекрытие, что бы метки которые стоят на персонажах/итемах перекрывали метку рестриктора.

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

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


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

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

if (count_by_level[k].min and count_by_level[k].max) then
local number = math.ceil(math.random(count_by_level[k].min, count_by_level[k].max)) --// значение ключа верно
else
local number = math.ceil(math.random(count_by_level[k].min) --// второе значение не указано, берем от первого
end

Или если тернарный нравится, то:

local number = (count_by_level[k].min and count_by_level[k].max) and (math.ceil(math.random(count_by_level[k].min, count_by_level[k].max))) or (math.ceil(math.random(count_by_level[k].min)) 

Оставлять так не советую, лучше исправь ошибки в конфиге...

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

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


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

@sanjaaa, :crazy:  мне че в третий раз тебе повторить? 

grenade_rgd5 = 0

должно быть вообще закомментировано(вырезано)!

ammo_5.56x45_ss190 = 2

Если ты хочешь что бы всегда было две пачки, то надо писать так, я это уже выше сказал два раза... 

ammo_5.56x45_ss190 = 2, 2

Короче все, больше я не отвечаю, если ты сейчас не сообразишь... то я не знаю как еще до тебя донести мысль. 

 

 

 


(одну цифру пишешь например)

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

 

 

-------------

Перенесу свой вопрос сюда:

Подскажите, а возможно-ли как-то сделать так, что бы метки рестрикторов не перекрывали собой метки предметов/персонажей, которые находятся в/рядом с рестриктором. Точнее мне нужно инверсное перекрытие, что бы метки которые стоят на персонажах/итемах перекрывали метку рестриктора.

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

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


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

@losiara, да ну начерта фигней-то страдать? Пишешь проверку по level.name() и все, а такая порнуха как у тебя использовалась в некоторых модах 2008 года... Не, ну на вкус и цвет конечно...Но все же. Очень трудно бывает отследить ход и логику действий при твоем подходе, ковырял один мод такой, где использована подобная конструкция... эх и намучался, думайте о тех, кто будет ковырять ваши моды в конце-то концов :)

  • Нравится 1

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


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

@AndreySol, так сложно в менеджер посмотреть? Вся награда и прибавки к репутации, рангу и etc. прописаны в task_manager.ltx и черпаются оттуда. При создании любого(!) квеста награда должна задаваться явно(!), как это уже говорилось выше, только в зависимости от типа квеста(т.н. однотипный, или же полностью свой) награда задается по разному, только и всего. Хотя если приколоться, то можно и свой аналог написать под свои нужды...ну тут уже воля фантазии.

 

Сегодня/завтра покопаюсь с goodwill'ами, потестирую и напишу как что работает. Пока в теории видно, что функционал методов установки отношений хорошо настраивается, а так же не используется весь функционал, который прописан... правда работает он, или нет, я пока не знаю. 

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

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


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

Особо не ковырялся, но вроде там все и так ясно, параметры пока не тестировал, внесу кое какие разъяснения. Коридор изменения коэффициента отношений относительно группировки -3000, 1000; относительно персонажа -1000; 1000, скоро посмотрю для гулагов этот диапазон. goodwill ничем не отличается от relation, просто relation завязан на константы ALife::ERelationType, эти константы можно менять в конфиге. goodwill(game_object*) и general_goodwill(game_object*) эквивалентные функции, по крайней мере я пока отличий не выявил. 

Для гулагов функции с goodwill применяются такие же, как к группировкам.

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

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


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

AMK-Team.ru

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