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

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


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

--[[ ----------------------------------------------------------------------------------------------


File : bind_trader.script
Description: Trader binding (Sidorovich)
Copyright : 2012 © LA-team
Author : ...
Editors :
Last edit : 11.07.2013 [...]
--]] ----------------------------------------------------------------------------------------------

--/ -----------------------------------------------------------------
--/ VARIABLEs
--/ -----------------------------------------------------------------
local tDbgName = {}
local bDebug = false --/ false|true enabled\disabled debug mode
--/ --------------------------
local sModule = script_name()
--/ -----------------------------------------------------------------
local log = function(fmt, ...) _G.log(sModule..":"..tostring(fmt), ...) end
--/ -----------------------------------------------------------------
function InitDebug() --/#+#
if db.tDbgName then
tDbgName = db.tDbgName
bDebug = true
end
end
--/ -----------------------------------------------------------------
--/ Trader binding - registering of objects in binder
--/ -----------------------------------------------------------------
function bind(obj)
if obj:clsid() == clsid.script_trader then
obj:bind_object( trader_binder(obj) )
end
end
--/ -----------------------------------------------------------------------------------------------
class "trader_binder" (object_binder)
--/ -----------------------------------------------------------------------------------------------
function trader_binder:__init(obj) super(obj)
self.loaded = false
self.first_update = true
self.obj_id = obj:id() --/#+#
self.obj_cid = obj:clsid() --/#+#
self.log = bDebug and tDbgName[obj:name()] --/#+# for debug!
end

function trader_binder:reload(section)
object_binder.reload(self, section)
end

function trader_binder:reinit()
object_binder.reinit(self)
db.storage[self.obj_id] = {}
self.st = db.storage[self.obj_id]
db.add_obj(self.object,self.obj_id,self.obj_cid)
end

function trader_binder:net_spawn(server_object)
if not object_binder.net_spawn(self, server_object) then
return false --/>
end
local se_obj = alife():object(self.obj_id) --/ full server object
if not se_obj then
abort("%s:net_spawn:NPC=[%s/%s],server_object=NIL:<%s>", sModule, self.object:name(), self.obj_id, "Error!")
return true --/>
end
--if self.log then log("net_spawn:NPC=[%s/%s],ID=[%s],alive=(%s)", self.object:name(), Get_CharName(self.object), self.obj_id, self.object:alive(), "") end --/#~#
if self.object:alive() then
self:set_callbacks() --/< all CALLBACKs set here
xr_gulag.setup_gulag_and_logic_on_spawn(self.object, self.st, se_obj, modules.stype_trader, self.loaded)
end
event("npc_spawn"):trigger({obj=self.object,obj_id=self.obj_id,obj_cid=self.obj_cid,se_obj=se_obj,binder=self}) --/#+#>
return true --/>
end

function trader_binder:net_destroy()
if self.st then
event("npc_destroy"):trigger({obj=self.object,obj_id=self.obj_id,obj_cid=self.obj_cid}) --/#+#>
if self.st.active_scheme then
xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "net_destroy")
end
end
self:clear_callbacks()
db.del_obj(self.object,self.obj_id,self.obj_cid)

object_binder.net_destroy(self)
end

function trader_binder:update(delta)
object_binder.update(self, delta)

local oNPC = self.object
if self.first_update then
self.first_update = false
if not oNPC:alive() then
self:clear_callbacks()
end
end
event("mob_update_dbg"):trigger({binder=self}) --/#+#> for debug

if oNPC:alive() then
if oNPC:is_talk_enabled() then
oNPC:set_tip_text("character_use")
else
oNPC:set_tip_text("")
end
trade_manager.update(oNPC) --/ trading update

if self.st.active_section then
xr_logic.issue_event(oNPC, self.st[self.st.active_scheme], "update", delta)
end
else
oNPC:set_tip_text_default()
end
event("npc_update"):trigger({obj=self.object,obj_id=self.obj_id,delta=delta}) --/#+#>
end

function trader_binder:net_save_relevant()
return true
end

function trader_binder:save(packet)
event("npc_save"):trigger({obj=self.object,obj_id=self.obj_id}) --/#+#>
set_save_marker(packet, "save", false, sModule, self.object)
object_binder.save(self, packet)
xr_logic.save_obj(self.object, packet)
trade_manager.save(self.object, packet)
set_save_marker(packet, "save", true, sModule, self.object)
end

function trader_binder:load(reader)
self.loaded = true
set_save_marker(reader, "load", false, sModule, self.object)
object_binder.load(self, reader)
if reader:r_eof() then
abort("load:SAVE_FILE_IS_CORRUPT:Obj=[%s],ID=[%s]:<%s>", self.object:name(), self.object:id(), "Error!")
end
xr_logic.load_obj(self.object, reader)
trade_manager.load(self.object, reader)
set_save_marker(reader, "load", true, sModule, self.object)
event("npc_load"):trigger({obj=self.object,obj_id=self.obj_id}) --/#+#>
end

--/------------------------------------------------------------------
--/ CALLBACKs
--/------------------------------------------------------------------
function trader_binder:set_callbacks()
self.object:set_callback(callback.patrol_path_in_point, self.waypoint_callback, self) --/#?# do we need it?
end

function trader_binder:clear_callbacks()
self.object:set_callback(callback.patrol_path_in_point, nil)
end

function trader_binder:waypoint_callback(obj, action_type, index)
if self.st.active_section then
-- log("waypoint_callback:action_type=[%s/%s]:[%s]", action_type, index, ">") --/#~#
xr_logic.issue_event(self.object, self.st[self.st.active_scheme], "waypoint_callback", obj or self.object, action_type, index)
end
end
--/------------------------------------------------------------------------------------------------

 

Этого хватит, или всё перечисленное надо. Всё перечисленное не входит в одно сообщение :)

Если что надо, предоставим ;)

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

LA

http://rghost.ru/private/59682551/f8d6d58ea059f21bbbdc2b91d2df996b 

 

Кстати вот если бы кто убрал лишнею пачку пистолетных патронов выпадающею с трупов, было бы вообще здорово :)
Сюрпрайз от алпака :unsure: 
Пистолетные патроны всего навсего надо вписать в предметы запрещённые в выпадения с трупов.
Тогда бы выпадало сколько прописано.
Обычно в Сталкере это в death_manager.script пишут.
Ну это в Сталкере, а тут фиг его знает куда и как писать.

 

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

Существует ли такая функция - "Проверка, есть ли у ГГ определенный инфопоршень?"
 
db.actor:has_info( "определенный_инфопоршень" )
И, соответственно, db.actor:dont_has_info()

А также alife():has_info( 0, "определенный_инфопоршень" ) - даже когда самого актора нет. dc

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

Надо. Можно архивом куда-нибудь положить.

 

upd: Мда... Это надолго...

Причем где у них файл логики торговца - непонятно.

Тоже искал без толку :wacko: косякнул где то и Lost Alpha стала вылетать при загрузки самой игры

Удалил всю gamedata и установил ранее сохранённую. Новую игру начал и прошёл основные КВ на Кордоне без сохранений.

И о чудо!!! Всякий раз проходя границу полигона ассортимент у Сидора менялся. Проверял скупая бинты и делал скрины.

Получается что игрок прописывая сейв блокирует логику торговца?

Видимо Дэзик и Ко специально так сделали (или косяк)

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

Кто может подсказать, в чем дело.
Ставлю метку на рестриктор через нажатие кнопки в главном меню, все прекрасно работает, метка ставится.


function test()
   local obj = alife():object( "generators_mess_doc_2" )
   if obj then
        level.map_add_object_spot_ser(obj.id, "find_item_location", "Неизвестный КПК")
  end
end


 
Пытаюсь сделать то же самое, вызвав функцию в xr_effects из рестриктора:

function end_peleng()
 local obj = alife():object( "generators_mess_doc_2" )
 if obj then
   level.map_add_object_spot_ser(obj.id, "find_item_location", "Неизвестный КПК")
 end
 amk.g_start_timer("pel",0, 0, 3)
end


 
метка не ставится, хоть убей, хотя таймер прекрасно отрабатывает. Пробовал в функцию таймера совать сии строки - не работают. Все остальные - работают, а эти -нет. Кто подскажет, в чем дело?

Вывести в лог что-нибудь сразу после if obj then
dc

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

Сталкер - наше всё!

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

По вопросу об LA:

 

Ну, то есть, понятно, что либо config\scripts, либо config\scripts\escape, cordon_sidor.ltx, но вытаскивать конкретный вариант надо из allspawn.

 

сам конфиг торговли - скорее всего trade_trader.ltx - если выше я с логикой угадал. В файле вроде правильно все.

 

Скрипты они, конечно, тупо переписали "венгеркой", оставив все основные глюкобаги, но зато теперь кто попытается разобраться - конкретно затрахается. Добрые люди... А ведь могли и через обфускатор прогнать, чтоб невосстановимо было. И вообще db* банально триплдесом зашифровать, а в движке расшифровывать. Сеансовым ключом, получаемым по инету при запуске...

 

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

Изменено пользователем Dennis_Chikin
  • Нравится 1
Ссылка на комментарий

@stalk9r, для модов на основе АМК

function fghegdg()
  get_console():execute("demo_record 1") --// вкл
  amk.start_timer("demo_off",30) --// 30 сек
  get_console():execute("demo_record 0") --// выкл
  amk.remove_timer("demo_off")
end
Не проверял. Изменено пользователем Eugen81
  • Спасибо 1
  • Нравится 1
 

10.png

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

@Eugen81, увы, не работает.

запускает демо, а выключать не хочет

 

Вопрос по ОП-2

Как таймер установить?

amk.start_timer("test1", 120.0, "") - не работает

amk.start_timer("test1", 120, "") - не работает

amk.start_timer("test1", 120) - не работает

on_timer = 5000 - не работает

 

function teleport()
   news_manager.send_tip(db.actor, "timer", nil, "nano", 3000)
   on_timer = 5000
   news_manager.send_tip(db.actor, "timer 5000", nil, "nano", 3000)
end

 

 

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

Есть хабар - пойдёт базар :az1000106:

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

Ага. Как-то с кондачка я подошел к вопросу. Прошу прощения.

С таймером разобрался, в amk.script дописать ниже local func_by_string = {}

func_by_string["имя_таймера"] = function (params_string) скрипт.функция() end
а уже в скрипт.функция() писать что запускать таймером.

Только с демо_рекорд проблема - не выключить его никак.

Казалось бы- чего проще demo_record off, а такой команды нет.

  • Спасибо 1
 

10.png

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

Ребят, помогите плиз, знаю, что не та тема, но нигде не отзываются: мне нужно снять ограничение на распитие алкоголя и таскать много стволов в АМК, помогите пожалуйста!

Добавлено Dennis_Chikin,

Вот ЭТА тема была та, которая надо. Следовало лишь правильно задать вопрос.

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

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

amk_utils.script:

--Callback на взятия предмета в инвентарь гг из ящика
function actor_item_from_box(box, item)
	if item ~= nil then
		restriction_stock.restriction_of_stock(item)
	end
end
-- ограничение на количество предметов. Убрать if item ~= nil then restriction_stock.restriction_of_stock(item) end

 

аналогично - для function actor_item_take(obj)

 

amk_alcohol.script:

function alcohol_drink(game_time) ...

 

	--если превысили порог в макс. кол-во бутылок, то смерть
	if ap.a >= alc_max_drink_bottles_to_death then
		reset_dream()
		reset_sober()
		reset_lose_hp()
		ap.a = 0
		ap.b = 0
		ap.f0 = 1
		ap.f1 = game_time + 5 --minute
		amk.send_tip(game.translate_string("alc_too_much_die"),nil,nil,5)
	end

 

-- убрать.

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

amk_utils.script:

amk_alcohol.script:

у меня нет этих файлов  :(

 

Это AMK. Автор поста про него спрашивал. В оригинале ограничений вообще нет. dc

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

Может кто подскажет, что может означать вот эта строка

Cannot find saved game ~~~ on_spawn_group_-_empty_community_name_for_bratok

Перевод я делал. Вернее из-за чего она может появится. Группировки добавлял уже, такая вылазит первый раз. Вылета нет, просто неприятно.

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

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

Могу только телепатически...

Не news_main.script -ли, часом, чего-то хочет ?

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

Подскажите, кто знает, каким образом можно отловить момент обыска конкретного трупа? Если в биндере - то в какой функции?

xr_motivator/bind_monster: function motivator_binder:use_callback( obj, who )
dc

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

Сталкер - наше всё!

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

Может кто объяснит, что не так. Заспавнил стол на Свалке.

; cse_abstract properties
section_name = physic_object
name = gar_stol_potap
position = -75.8089981079102,1.79499995708466,8.79100036621094
direction = 0,0,0
version = 118
script_version = 6

; cse_alife_object properties
game_vertex_id = 329
distance = 0
level_vertex_id = 129048
object_flags = 0xffffff3a
custom_data = <<END
[collide]
ignore_static
END

; cse_visual properties
visual_name = physics\decor\stol_sher

; cse_ph_skeleton properties

; cse_alife_object_physic properties
physic_type = 0x3
mass = 100

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

  • Согласен 1

Intrel Core i5 9400F, msi gtx 1660 super ventus, RAM 16g-DDR4, HD 2000g, Win 10x64, SSD 256g, SSD m2 500g.

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

 

 

подходишь и толкаешь, он разваливается
Могу ошибаться, но чтоб объект в игре разваливался он должен быть на классе P_DSTRBL. А для "physic_object" прописан класс O_PHYS_S(у меня по крайней мере).

Визуала такого "physics\decor\stol_sher" у меня нет, не могу потестить. Возьми другой для пробы из physics\stol.

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

Всем привет, прошу помощи.

Почему работает такая логика переключателя:

[logic]


active = ph_button@active


[ph_button@active]
on_info = {+warlab_antenna_1_off} ph_idle@nil
anim = lab_primary_switcher_idle
tooltip = tips_warlab_press
on_press = ph_button@deactivate %=yan_gluk%

[ph_button@deactivate]
anim = lab_primary_switcher_off
on_timer = 500 | ph_idle@nil %+warlab_antenna_1_off =play_snd_from_obj(908:ambient\switch_1) %

[ph_idle@nil]

 

 

и не работает вот такая:

[logic]
active = ph_button@active

[ph_button@active]
on_info = {+generators_message_doctor_2} ph_button@activate

[ph_button@activate]
on_info = {+warlab_antenna_1_off} ph_idle@nil
anim = lab_primary_switcher_idle
tooltip = tips_warlab_press
on_press = ph_button@deactivate %=yan_gluk%
 

[ph_button@deactivate]
anim = lab_primary_switcher_off
on_timer = 500 | ph_idle@nil %+warlab_antenna_1_off =play_snd_from_obj(908:ambient\switch_1) %

[ph_idle@nil]

 

 

хотя поршень "generators_message_doctor_2" выдается совершенно точно? В чем тут дело?

 

PS: мне нужно, чтобы изначально переключатель был неактивен, а становился активным только после выдачи нужного поршня.


 

 

Могу ошибаться, но чтоб объект в игре разваливался он должен быть на классе P_DSTRBL. А для "physic_object" прописан класс O_PHYS_S(у меня по крайней мере). Визуала такого "physics\decor\stol_sher" у меня нет, не могу потестить. Возьми другой для пробы из physics\stol.

Такая же байда и у меня. Стол, стул, кровать разваливаются. Для всяких кружек, тарелок, ложек еще пишу строку "fixed_bones = link", но для стола, стула, кровати такой способ не катит - вылет с руганью на wrong fixed bones, видать, без костей модели.

Сталкер - наше всё!

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

А как именно не работает ? Переключатель не становится активным ? Или что там у тебя происходит ?

 

 

Стол, стул, кровать разваливаются
Ну вообще-то, если я не ошибаюсь, для того чтоб объект в игре мог развалиться, недостаточно ему класс P_DSTRBL прописать. Еще вроде должна быть дополн. папка типа "prt" в которой должны запчасти лежать от этого объекта - движку ведь надо знать что заспавнивать на место разрушенного объекта.

А с твоим столом все-же не понятно - если после разрушения на его месте появляются обломки явно подходяшие для него, значит он P_DSTRBL и папка "prt" имеется. Хотя может я не все правильно понимаю...

 

А на счет костей в объектах - так они вроде к разрушаемости\не разрушаемости отношения не имеют ?

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

Визуалы запчастей разрушаемого объекта пишутся в секцию [destroyed] в юзердате модели.

Кроме того в настройке кости имеется флажок breakable, чтобы указывать что она может отрываться от модели. Но это работает только лишь для объектов некоторых классов (P_DSTRBL, SCRPTCAR).

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

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

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

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

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

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

Войти

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

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

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