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

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

Тема для обсуждения скриптов всего и всех в серии игр STALKER.


Задавая вопрос (!):
1. Внимательно изучите суть вопроса. Вопрос должен соответствовать выбранной Вами темы. Это поможет сохранить порядок и читабельность темы, а также облегчит поиск и понимание сего;
2. Изучите то, что уже есть в теме (пролистайте "руками", воспользуйтесь поиском на форуме);
3. Изучите информацию которая может вам помочь:

 
 

Stalkerin. Там есть много хороших статей касательно данной темы.
Уроки по модостроению. Есть рабочие примеры готовых скриптов различного назначения.

 

Справочное руководство по языку Lua 5.1
https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual/ru
Справочник по функциям и классам. Собрано много информации по функциям и классам, не всем, но по основные сведения предоставлены.

4. Дабы не превращать обсуждение в "кашу" разной информативной направленности, задавайте несколько вопросов по порядку (в разных постах) после того, как получите ответ на предыдущий вопрос;
5. "Спасибо" и тому подобное - будьте так любезны в ПМ. Если не любите писать в ПМ, в конце вопроса напишите фразу: "Заранее спасибо!" - или что-то в этом духе;
6. ПОЖАЛУЙСТА! Указывайте, для какой игры Вам необходима информация (ТЧ, ЧН, ЗП), если стоит мод - укажите название мода;
7. Если Вы что-то сделали и результат не такой, какой Вами задумывался, то, пожалуйста, приводите коды которые Вы изменяли/писали целиком! Это поможет другим правильно ответить на Ваш вопрос, а также оградит Вас от лишней писанины.
8. Оформляйте сообщение. Пользуйтесь тегами для того, чтобы отделить код от текста. Пишите грамотно - ПОЛЬЗУЙТЕСЬ ЗНАКАМИ ПРЕПИНАНИЯ.
9. И помните: «Правильно заданный вопрос – половина ответа».

 

Какие вопросы следует задавать, а какие нет...

 

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

 

Вопросы которые будут удалятся, следовательно их задавать не нужно:
-- Где находится та или иная функция?
Для ответа используем поиск по словам среди файлов оригинальной игры или мода, если объект поиска относится к нему, при помощью программы, которая Вам наиболее симпатизирует;
-- Как сделать что-то/то-то?
С подобными вопросами, либо в "ковырялки", где Вам вероятнее всего так же не ответят, либо выдвигаем мысли, подкреплённые теорией, практикой (идеальный вариант) и здравым рассудком;
-- Вопросы со смыслом: "сделайте", "совместите" и подобными глаголами повелительного наклонения.
-- К тому же удалению будут подвергаться вопросы, в которых масштабно не используются теги, для отделения кода и цитат от основного текста, а также не вписан в спойлер код размером превышающие семь строк.
Ответ на возможно возникший вопрос: В какую тему можно обратиться по поводу логики и спавна объектов?
В тему "ковырялок" соответствующей версии игры, для которой Вы задаёте вопрос.

И последнее: очень рекомендовано к прочтению Правила форума
 


  • Спасибо 1
  • Полезно 2
Ссылка на комментарий
https://www.amk-team.ru/forum/topic/6185-skriptovanie/

При попытке заменить чтение нет-пакета с состоянием актора(бег, шаг, прыжок и т.д.) "вручную":

    se_upk:w_begin(0)
    alife():actor():UPDATE_Write(se_upk)
    se_upk:r_seek(41)
    local state = se_upk:r_u16()


на чтение с помощью функционала m_netpk:

    local act = alife():actor()
    local se_upk = get_netpk(act, 2)
    local data = se_upk:get()
    local state = data.actor_state or 0


Стал получать следующий вылет:

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


[print_output()] SCRIPT RUNTIME ERROR:
attempt to call a nil value
stack traceback:
    [C]: at 0x7ff9775bf180
    [C]: in function 'get_netpk'


 


Не понимаю, в чем конкретно прокол

@Norman Eisenherz @Norman Eisenherz , а если так:
 

for id,_ in pairs(gobj.Object) do --вместо npc_info используем таблицу объектов в гулаге
   level.map_add_object_spot(id, "green_location")
end

 

57 минут назад, Ghilli сказал:

Не понимаю, в чем конкретно прокол

У меня пару лет назад также начались вылеты при юзании m_netpk, решил заменой строки

if stpk:r_elapsed()~=0 or uppk:r_elapsed()~=0 then

на 

if (stpk and stpk:r_elapsed()~=0) or (uppk and uppk:r_elapsed()~=0) then

Вдруг поможет?

  • Полезно 1

@phalcor Те же шарики.

 

Нашел: в ЧН сталкивался с остановкой скрипта без вылета при пустом тексте подсказки – видимо, это проблема всей трилогии, потому что при добавлении хотя бы текста "" выводятся все метки.

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

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

Шпаргалка

Поторопился я и обнадежился. Вопрос повторяю можно на ОГСР движке сохранять данные таблицы в хранилище и считывать их. В игре все работает при загрузке сейвов скрипт выполняется. Надо сохранять данные таблицы подобранных предметов в хранилище, но как?

Скрытый текст
local 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
		        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 
			    log1(list_items[i].section.."-"..rang.."-"..reputation)
			    break
		    end
		end
	end
	
end

 

 

@Stalkersof можно использовать SCRIPT_VARS_STORAGE

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

39 минут назад, Kirgudu сказал:

@Stalkersof можно использовать SCRIPT_VARS_STORAGE

Да мне бы пример нормальный. Как записать в таблицу и как считать и хранилища.

 

В вики написано, как с обычными таблицами.

Объявил таблицу так:

local xvars = get_stored_vars()
xvars.items_podobral = {}

Вылет. Дайте пример.

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

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

 

  • Полезно 1

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

Не знаю у меня не получается работать с хранилищем как с переменными. У меня эти функции в отдельном файле 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 сказал:

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

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

@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

 

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

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

Жить стало лучше, жить стало веселей. А когда веселей живётся, то работа скорится.

img.php?nick=Balavnik&sert=2&text=t6

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
6 часов назад, UriZzz сказал:

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

Если только m_timers от того же Артоса на OGSR переделать... Вот только зачем? 5 лет назад уже был предложен простой и действенный способ подменить хранилище se_stor Артоса на вариант из OGSR, при этом не меняя ни строчки кода в использующих хранилище скриптах. Внутри модуля таймеров вызываются глобальные GetVar и SetVar, которые можно подменить ровно таким же способом.

 

@Stalkersof ничего сложного в работе с таблицами в OGSR нет, информации достаточно даже той, что представлена в официальном Wiki.

Вот такой код выполнится без ошибок (проверил только что за 5 минут):

local xvars = get_stored_vars()
xvars.items_podobral = {}
xvars.items_podobral[1] = { section = "111", rang = 1 }
xvars.items_podobral[2] = { section = "222", rang = 2 }
xvars.items_podobral[3] = { section = "333", rang = 3 }

Но далее надо помнить, что любые таблицы в хранилище размещаются не как таблицы, а как значения с типом "userdata", даже сразу после первичного присвоения. То есть по сформированной выше таблице, например, не получится итерироваться:

for k,v in pairs(xvars.items_podobral) do
	-- do something
end

такой код вызовет ошибку вида «"userdata" не является таблицей». Не получится использовать table.insert и table.remove, не выйдет посчитать кол-во элементов #xvars.items_podobral и так далее, то есть совершить любое действие, которое доступно для стандартных таблиц.

Чтобы работать с таблицей, записанной в хранилище, необходимо её сначала конвертировать в понятный для lua вид:

local t = xvars.items_podobral() -- выполнить одноименный метод
-- после выполнения переменная t содержит в себе стандартную таблицу

Но вот если требуется переприсвоить какой-то элемент таблицы, это можно сделать посредством прямого доступа, без конвертирования:

xvars.items_podobral[2] = "новое строковое значение"

 

В общем, всё необходимое описано на оф. ресурсе. Сверх этого рассказать что-то сложно. Пробуй, экспериментируй.

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

Свои работы и совместные проекты: Инструмент, OGSM CS, Final Stroke, HARDWARMOD

Полезное: модули Артоса, XML парсер

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

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

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

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

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

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

Войти

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

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

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