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

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

@Stalkersof вылет может быть и не связан с приведённым кодом, по крайней мере я в нём ошибки не вижу.
А пример уже давали ранее, целый набор функций для работы с этим хранилищем: 

 

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

Не знаю у меня не получается работать с хранилищем как с переменными. У меня эти функции в отдельном файле ogsr_vars.

Вот так сделал вылет.

Скрытый текст
local xvars = get_stored_vars()
xvars.items_podobral = {}
--items_podobral = {}
function item_take(obj)
	local sect = obj:section()
	local reputation
	local rang

	for i=1,#list_items do
		if sect == list_items[i].section then
		    --if items_podobral[ sect ] then
			log1( ogsr_vars.get_value_safe("items_podobral"))
			 if not ogsr_vars.get_value_safe( "items_podobral" ) then
		        reputation = list_items[i].reputation
			    rang = list_items[i].rang
			    db.actor:change_character_reputation(reputation)
			    db.actor:set_character_rank(db.actor:character_rank() + rang)
			
			    local text = "%c[255,160,160,160]".."Уникальный предмет".."\\n".."%c[default]".."Ранг+ "..rang.."  ".."Репутация+ "..reputation
			    local hud = get_hud()
	            hud:AddCustomStatic("main_task", true)
	            hud:GetCustomStatic("main_task"):wnd():SetTextST(text)
	            hud:GetCustomStatic("main_task").m_endTime = time_global()/300 + 5
			
			    --items_podobral[sect] = list_items[i].section 
				ogsr_vars.set_value( "items_podobral", list_items[i].section)
			    log1(list_items[i].section.."-"..rang.."-"..reputation)
			    break
		    end
		end
	end
	
end

Ну блин подскажите как работать с таблицами в хранилище.

 

Ссылка на комментарий
17 минут назад, Stalkersof сказал:

Вот так сделал вылет
...
Ну блин подскажите как работать с таблицами в хранилище.

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

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

@Kirgudu ещё бы таймеры на SCRIPT_VARS_STORAGE, было бы замечательно. А пока пользуюсь модулями от Артоса и прочих причастных.

 Моя нычкаНычка в арендованном у Опричника холодильнике  

Мы хорошие ребята, жаль патронов маловато:):ukostra:

UriZzz.gif

Ссылка на комментарий
44 минуты назад, Kirgudu сказал:

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

Вылет был по строке log1 по первой строке в коде.

Скрытый текст
local xvars = get_stored_vars()
xvars.items_podobral = {}
--items_podobral = {}
function item_take(obj)
	local sect = obj:section()
	local reputation
	local rang

	for i=1,#list_items do
		if sect == list_items[i].section then
		    --if not items_podobral[ sect ] then
			 if not ogsr_vars.get_value_safe( "items_podobral" ) then
		        reputation = list_items[i].reputation
			    rang = list_items[i].rang
			    db.actor:change_character_reputation(reputation)
			    db.actor:set_character_rank(db.actor:character_rank() + rang)
			
			    local text = "%c[255,160,160,160]".."Уникальный предмет".."\\n".."%c[default]".."Ранг+ "..rang.."  ".."Репутация+ "..reputation
			    local hud = get_hud()
	            hud:AddCustomStatic("main_task", true)
	            hud:GetCustomStatic("main_task"):wnd():SetTextST(text)
	            hud:GetCustomStatic("main_task").m_endTime = time_global()/300 + 5
			
			    --items_podobral[sect] = list_items[i].section 
				ogsr_vars.set_value( "items_podobral", list_items[i].section)
			    log1(list_items[i].section.."-"..rang.."-"..reputation)
			    break
		    end
		end
	end
	
end

 

Такой код и не вылетает и не работает.

Ссылка на комментарий
1 час назад, Balavnik сказал:

@Stalkersof Так а ошибка-то какая?  

Скрытый текст

[C]: in function 'log1'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\nagrada.script:101: in function 'fun'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ogse_signals.script:382: in function 'process_call'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ogse_signals.script:320: in function 'call'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\bind_stalker.script:210: in function <d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\bind_stalker.script:207>
[11.11.24 18:15:12.169] *********************************************************************************
[11.11.24 18:15:12.169] 
FATAL ERROR

[error]Expression    : FATAL ERROR
[error]Function      : CScriptEngine::lua_pcall_failed
[error]File          : D:\a\OGSR-Engine\OGSR-Engine\ogsr_engine\COMMON_AI\script_engine.cpp
[error]Line          : 52
[error]Description   : [CScriptEngine::lua_pcall_failed]: [luabind::detail::free_functions::function_dispatcher] Caught unhandled exception!

[11.11.24 18:15:12.169] ***************************[ScriptCrashHandler]**********************************
[11.11.24 18:15:12.169] stack traceback:
    [C]: at 0x7ff804e87af4
    [C]: in function 'log1'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\nagrada.script:101: in function 'fun'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ogse_signals.script:382: in function 'process_call'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\ogse_signals.script:320: in function 'call'
    d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\bind_stalker.script:210: in function <d:\Мод fgm\fgm_v_1_7_4\gamedata\scripts\bind_stalker.script:207>

ПС Вроде сделал на поршнях как Хикс советовал. 78 поршней. С таблицей конечно проще но как?

Изменено пользователем Stalkersof
  • Спасибо 1
Ссылка на комментарий
05.11.2024 в 12:35, rost2000 сказал:

Написал скрипт на проверку нахождения в спейс рестрикторе  НПС, чтобы ГГ зачистил указанную зону, кроме НПС с группировкой "stalker". Вылетает с таким логом. Как я понимаю, методы применяются ко всем объектам, а нужно, чтобы только к НПС. Искал проверку, что объект является НПС, но не нашел.

 

function storyline_complex_clear()
	local sim = alife()
	if sim then
		local zone = sim:story_object(904)
		for id = 1, 65534 do
			sobj = sim:object(id)
			return sobj and zone and zone:inside(sobj:position()) and not sobj:community() == "stalker" 
		end
	end
end
  Показать

FATAL ERROR
 
[error]Expression    : fatal error
[error]Function      : CScriptEngine::lua_error
[error]File          : E:\stalker\sources\trunk\xr_3da\xrGame\script_engine.cpp
[error]Line          : 73
[error]Description   : <no expression>
[error]Arguments     : LUA error: No such operator defined
 

stack trace:

Продолжение по этому скрипту, который отказывается работать (проверка всегда возвращает false). Решил проверить, работает ли проверка на присутствие объекта в рестрикторе. Вызвал такую функцию: 

 

function sander_test()
	local sim = alife()
	local obj
	if sim then
		local zone = sim:story_object(904)
		for id = 1, 65534 do
			obj = sim:object(id)
			if zone and zone:inside(obj:position()) then
				news_manager.send_tip(db.actor, "NEW_INFO = " .. tostring(obj:name()), nil, "trader", 5000, 92)
			end
		end
	end
end

 

Что привело к вылету:

Скрытый текст

[13.11.24 12:14:13.051] [2912] [print_output([CScriptEngine::lua_pcall_failed])] SCRIPT RUNTIME ERROR:
! No such operator [__call] defined in class [___VECTOR]
stack traceback:
    [C]: at 0x7ff6a879ff50
    [C]: in function 'position'
    d:\games\s.t.a.l.k.e.r\gamedata\scripts\ui_main_menu.script:222: in function 'sander_test'
    d:\games\s.t.a.l.k.e.r\gamedata\scripts\ui_main_menu.script:189: in function <d:\games\s.t.a.l.k.e.r\gamedata\scripts\ui_main_menu.script:164>
[13.11.24 12:14:13.051] [2912] *********************************************************************************
[13.11.24 12:14:13.051] [2912] 
FATAL ERROR

[error]Expression    : FATAL ERROR
[error]Function      : CScriptEngine::lua_pcall_failed
[error]File          : F:\Repos\OGSR-Engine\ogsr_engine\COMMON_AI\script_engine.cpp
[error]Line          : 60
[error]Description   : [CScriptEngine::lua_pcall_failed]: ! No such operator [__call] defined in class [___VECTOR]

 

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

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

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

@Капрал Хикс Это то?
 

Скрытый текст

function check_armor()
local armor = db.actor:item_in_slot(6)  
local weapon = db.actor:item_in_slot(2)  
if db.actor:active_slot()==2 and weapon then  
local tmp = armor and armor:section() or ""
if not string.find(tmp, "exo") and (weapon:section()=="wpn_pkm") then
db.actor:drop_item(weapon)            
local tmpw =  alife():create(weapon:section(), db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())        
db.actor:transfer_item(weapon,db.actor)
alife():release(tmpw)
news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000)
end
end
end

function actor_binder:update(delta)
my_script.check_armor()

 

  • Нравится 1
  • Полезно 1

Pir%40t%40s.gif

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

В принципе, под "местные условия" (X-Ray Extensions) можно несколько проще сделать: тынц (в качестве ориентира). Вообще, много где было: Cолянки, ОП-ы, OGSE/OGSR.

И вот это: 

function actor_binder:update(delta)
my_script.check_armor()

страшно, конечно. Там, по идее, по дельте времени ~ 1раза в секунду более, чем достаточно.

  • Нравится 1
  • Полезно 1
Ссылка на комментарий
10 часов назад, rost2000 сказал:
obj = sim:object(id)
if zone and zone:inside(obj:position()) then

 

У серверного объекта position является свойством, а не методом (функцией). Выполнение будет приводить к ошибке, как у тебя, тогда как правильное написание будет таким:

if zone and zone:inside(obj.position) then

 

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

@rost2000, а ещё, в добавлении к предыдущему посту:

Наличие "зоны" лучше проверить перед циклом, один раз.

А внутри цикла нужно убедиться в наличии объекта:

if obj and zone:inside(obj.position) then
  • Нравится 2

S.T.A.L.K.E.R. CoP Objects (upd 15.11.24)

Ссылка на комментарий
21 час назад, Купер сказал:

страшно, конечно. Там, по идее, по дельте времени ~ 1раза в секунду более, чем достаточно.

В x-ray extensions вроде есть коллбэк на перемещение в слот. Хм, как бы его правильно использовать, пример нужен.

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

@Капрал Хикс  ну вот это вот всё c пробросом "костыльным" для оригинала:

Скрытый текст
function check_armor()
    -- предмет в 6 в слоте (БЗК)
    local armor = db.actor:item_in_slot(6)
    -- предмет в слоте (оружейка)
    local weapon = db.actor:item_in_slot(2)
     -- если предмет в слоте активен (оружейка) и он там есть
    if db.actor:active_slot()==2 and weapon then
    -- проверяем наличие и наименовнаие и наличие БЗК
        local tmp = armor and armor:section() or ""
        -- если с названии брони есть "exo" (outfit_exo, например) и ствол это 'wpn_pkm', которому экза нужна
        if not string.find(tmp, "exo") and (weapon:section()=="wpn_pkm") then
            -- то начали костылить для оригинала
            -- выбросили оружие
            db.actor:drop_item(weapon)
            -- создали фейк-оружие по позиции ГГ
            local tmpw =  alife():create(weapon:section(), db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
            -- передали оружие ГГ
            db.actor:transfer_item(weapon,db.actor)
            -- удалили фейк-оружие
            alife():release(tmpw)
            -- выдали ньюс по этому поводу
            news_manager.send_tip(db.actor,"Невозможно взять пулемёт в руки без экзы",nil,nil,10000)
        end
    end
end

function actor_binder:update(delta)
my_script.check_armor()

Заменить на использование move_to_ruck.

 

Пример из OGSR:

Скрытый текст
-- колбеки, на которые вешаем вызовы: on_item_to_slot, on_item_to_ruck, etc
function attach(sm)
    sm:subscribe({ signal = "on_item_to_slot",    fun = this.remove_m134 }) --Перенос М134 в слот.
    sm:subscribe({ signal = "on_item_to_ruck",    fun = this.remove_m134 }) --Ситуация, когда снимаем надетый костюм в инвентарь, при находящемся м134 во втором слоте.
    sm:subscribe({ signal = "on_drop",            fun = this.remove_m134 }) --Ситуация, когда выбрасываем надетый костюм прямо из слота, при находящемся м134 во втором слоте.
end

 

Сама наша "молотилка"

local counter = 0
function remove_m134() --Чтобы М134 можно было использовать только при надетом экзоскелете.
    if device().precache_frame > 1 then return end
    for slot = 1, 2 do -- для OGSR слоты равнозначны, поэтому циклом
    local m134 = db.actor:item_in_slot(slot) -- предмет в слоте
    if m134 and ( m134:section() == "wpn_m_134" or m134:section() == "wpn_dshkm" ) then -- проверяем секцию оружия
        local outfit = db.actor:get_current_outfit()
        if not outfit or not string.find( outfit:section(), "_exo" ) then -- проверяем секцию БЗК
            db.actor:move_to_ruck(m134) -- кидаем оружие в инвентарь ГГ
            update_inventory_window()
            if counter == 0 then
                news_text = game.translate_string("dinhud_gatling_text") -- выдаем ньюс по поводу этого
                db.actor:give_game_news(news_text, "ui\\ui_iconsTotal", Frect():set(0,188,83,47), 0, 3000)
                counter = counter + 1
            end
        end
    end
    end
end

 

 

  • Полезно 1
  • Сочувствую 1
Ссылка на комментарий

Приветствую, подскажите ковыряю напарников, имеет ли смысл вообще данные строки:
 

Скрытый текст

...

local real_enemy = db.storage[npc:id()].enemy
...
    if not real_enemy or (real_enemy and not real_enemy:alive()) then
            db.storage[npc:id()].enemy = who
    end

Потому что иногда ловлю вылет по методу alive, я так понимаю у переменной real_enemy вообще нельзя проверить жив он или нет?

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

Не вижу такого метода в оригинале… Может быть, он возвращает серверный объект вместо клиентского, из-за чего и вылетает проверка alive?

Мини-моды: ТЧ ЧН ЗП

Шпаргалка

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

Тоже думал насчет серверного объекта, я просто не особо понимаю для чего вообще нужна эта проверка, типа если врага нет или враг не живой то db.storage[npc:id()].enemy = who, но вот для чего это нужно?
(все это в функции we_are_hit в xr_companion)

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

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

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

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

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

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

Войти

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

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

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