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

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

Тема для обсуждения скриптов всего и всех в серии игр 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/

Доброго времени!

Сильно заинтересовал такой вопрос - в ТЧ есть масхалат, точнее маскировочный экзоскелет, в котором можно некоторое время шариться под самым носом у врагов и они только головами водят, но не трогают. Как реализовать такую маскировку в ЗП, если это реально?

@mdm64, вставлю 5 копеек и не более. Не утверждаю, т.к не скриптер. Но большинство кода можно перенести из платформы в платформу, что и делали первые модификации на ЗП — там тянули фишки из модов на ТЧ (Те же контейнеры для артов). Думаю, если у тебя есть скрипт этого экзоскелета, можно попробовать его адаптировать напрямую. Во всяком случае, я бы начал с этого, чем писать с нуля.

  • Согласен 3

@HellRatz, Согласен, идея более чем разумная. Мы тут с моей головой посовещались и я решил... высказать простое предположение по возможной реализации "невидимки" - по сути, если вспомнить реакцию враждебных НПС из той же Солянки, требуется при надевании такого масхалата прописать запрет на стрельбу со стороны врагов и всё. И будет тот же самый эффект. Я хорошо помню, что неписи даже какое-то время шли за мной с оружием, кричали "враг, враг!", но не стреляли. Но честно говоря, я сейчас не представляю, как эту возможность реализовать. Понятно, что требуется скрипт и инфопоршни, чтобы при одевании масхалата выдавался поршень и скрипт отрабатывал запрет ведения огня любыми неписями... Думается, так оно и реализовано, это по мне так самый простой вариант "Невидимки". Хотя, может быть и ошибаюсь...

Цитата

Как реализовать такую маскировку в ЗП, если это реально?

 

@mdm64, один из вариантов реализации маскхалата можно подсмотреть здесь.

  • Полезно 1

⠀

@Jurok, Этот параметр является штатным для движка ЗП - "npc_blindness_koeff" (видимость ГГ НПС, в метрах.)? или это только для правленого движка?

@Jurok, Если я правильно понимаю, в этом способе работают следующие файлы:

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

npc_blindness_koeff             = 19 ;видимость ГГ НПС, в метрах.

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

function ReadOutfitBlindnessKoeff(section)
   local ltx = system_ini()
   if ltx:line_exist(section,"npc_blindness_koeff") then
      return ltx:r_float(section,"npc_blindness_koeff")
   else
      return 80
   end
end


function transparent_gg()
    local  range1, id, obj_around, alife_obj, dist_act_npc
    local outfit_in_slot=db.actor:item_in_slot(7)
    if db.actor == nil then
        return nil
    end  
    if db.actor:item_in_slot(7) == nil then
        range1 = 80  
    elseif outfit_in_slot~=nil and ReadOutfitBlindnessKoeff(outfit_in_slot:section())>0.0 then
        range1 = ReadOutfitBlindnessKoeff(outfit_in_slot:section())
    else
        range1 = 80
    end  

    for id = 1, 65534 do
        obj_around = level.object_by_id(id)  
        if obj_around ~= nil and IsStalker(obj_around) then   
            alife_obj = alife():object(id)
            if alife_obj then  
                dist_act_npc = db.actor:position():distance_to(alife_obj.position)
            end
            if dist_act_npc <= 120 then  
                if obj_around then  
                    obj_around:set_range(range1)  
                end
            else
                if obj_around then  
                    obj_around:set_range(80)
                end
            end
        end
    end
end

function timer_trans()
    timer_transparent = timer_transparent + 1
    if timer_transparent >= 50 then
        timer_transparent = 0
        transparent_gg()
    end
end

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

    trans_outfit.timer_trans() -- уменьшение дистанции видимости при одевании соотв. броников
    
    -- јпдейт доступности дл¤ симул¤ции.
    simulation_objects.get_sim_obj_registry():update_avaliability(alife():actor())

    bind_stalker_ext.actor_on_update(self,delta)
    
    --alun_utils.debug_write("actor update END 2")
end

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

mus_vol = 0
amb_vol = 0
b_discard_settings_shown = false
timer_transparent = 0 --маскхалат

Я ничего не пропустил или всё-таки что-то не доглядел?

Изменено пользователем mdm64
2 hours ago, mdm64 said:

высказать простое предположение по возможной реализации "невидимки

Один из вариантов - это использовать enemy_callback. Т.е. если невидимка в слоте, то всем мобам этот коллбек отвечает, что актор невкусный и они его игнорируют.

  • Согласен 2
  • Полезно 3
2 часа назад, mdm64 сказал:

Думается, так оно и реализовано. Хотя, может быть и ошибаюсь...

Ошибаешься.

2 часа назад, HellRatz сказал:

большинство кода можно перенести из платформы в платформу

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

 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

3 часа назад, mdm64 сказал:

возможной реализации "невидимки"

Как уже сказал @dsh, самый простой вариант добавить новое условие в функцию "is_enemy()" в "xr_combat_ignore.script".

Если надет нужный броник, то функция возвращает false.

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

function is_enemy(obj, enemy, st, not_check_sim)

	...

	if st.enabled == false then
		return true
	end

	-- МаскХалат
	if enemy:id() == db.actor:id() then
		local bronik = db.actor:item_in_slot(7)
		if bronik and bronik:section() == "maskhalat" then
			return false
		end
	end

	...

end

 

 

  • Согласен 1
  • Полезно 3

S.T.A.L.K.E.R. CoP Objects  >200 шт  (upd 21.05.26) - Скачать  (Яндекс-диск)

11 минут назад, WinCap сказал:

самый простой вариант

Ну не всё так просто - это не реализация "невидимки", это всего лишь некий игнор, враг просто не будет атаковать, но по факту актора будут все видеть, и даже на него реагировать. И назвать такое "невидимкой" у меня лично язык не повернётся, ИМХО. А вот сделать полную реализацию невидимки, когда мобы актора не просто игнорят - а полностью не видят и не реагируют - вот это уже "невидимка".

  • Согласен 4
 

Мать: ASRock X470 Master SLI. Процессор: AMD Ryzen 9 3900X 12-Core(4200 MHz).
Память: Patriot Memory 3200 C16 Series. DDR4-3200(1600МГц), 16Гбх2(32Гб).
Видео: GeForce GTX 1060 6GB. Блок питания: CoolerMaster 750 Вт. Корпус: Zalman i3 Edge.

Химера конечно сильный хищник, а все держится дома. Чего же ты пришел к ней домой и пытаешься её убить? © Болотный Доктор

@Romann, Соглашусь полностью, но именно так была реализована "невидимка" в Солянке, просто другой реализации я не видел.

Я бы даже сказал так - это именно маскхалат, когда враги тебя ощущают, но не видят отчётливо настолько, чтобы стрелять.

А "невидимка" это да - когда сидят "три мартышки"...:biggrin: и четвёртая с КПК....:lol3:

Изменено пользователем mdm64
  • Согласен 1

@mdm64, вариант скрипта, с проверкой расстояния и времени суток:

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

	if enemy:id() == db.actor:id() then
		local bronik = db.actor:item_in_slot(7)
		if bronik and bronik:section() == "maskhalat" then
			local dist = 10		-- ночью
			if in_time_interval(10, 17) then 
				dist = 50		-- днем
			else if in_time_interval(6, 21) then
				dist = 35		-- утром/вечером
			end
			if obj:position():distance_to(enemy:position()) > dist then
				return false
			end
		end
	end

 

 

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

S.T.A.L.K.E.R. CoP Objects  >200 шт  (upd 21.05.26) - Скачать  (Яндекс-диск)

@WinCap, А ведь на этот скрипт можно "прикрутить" совершенно уникальные условия для выполнения тех или иных квестов!

И в частности, с фотографированием нужных объектов или НПС... Вот только нигде пока не нашёл аддона с фотиком, как в Фотографе...:biggrin:

  • Согласен 1

А возможно заспавнить физический объект? Например, деревянный ящик, такой, как рядом с Прапором? На котором магнитофон стоит.

Делаю, как ниже. Рюкзак спавнится, а какую секцию указать для ящика?

local a_pos  = db.actor:position()
local xpos=a_pos.x+2
local ypos=a_pos.y
local zpos=a_pos.z
local lv=db.actor:level_vertex_id()
local gv=db.actor:game_vertex_id()
local newOBJ=alife():create("inventory_box", xyz(xpos,ypos,zpos), lv,gv)

 

53 минуты назад, phalcor сказал:

а какую секцию указать для ящика?

Нужно создать предмет (естественно не подбираемый, хотя можно и ящики собирать если нужно) с визуалом ящика, потом спавнить как любой предмет. Но все же советую делать такие вещи через СДК, подобные костыли — уровень 2007 года.

  • Спасибо 1
  • Согласен 2

@HellRatz, получается, что самый обычный деревянный ящик скриптом я заспавнить не смогу без создания своего предмета?

2 минуты назад, phalcor сказал:

обычный деревянный ящик скриптом я заспавнить не смогу 

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

  • Спасибо 1

Получилось!

1. Создаём свой предмет в  items.ltx:

[phalcor_woodbox]:O_PHYS_S
visual = dynamics\box\big_box.ogf    ;Большой деревянный зелёный ящик
remove_time = 9999

 

2.Спавним предмет с секцией "phalcor_woodbox"

 

3. всё.

Изменено пользователем phalcor
  • Согласен 1

Нужна помощь - при попытке выполнить такой код:
 

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



function dots:dots1()
	edit_box		= self:GetEditBox("edit_box")
	edit_box2		= self:GetEditBox("edit_box2")

clan = tostring(edit_box:GetText())
amount = tonumber(edit_box2:GetText())

--get_console():execute(clan)
--get_console():execute(amount)

--get_console():execute("Started")

if db.actor then
-- self:on_quit()
-- get_console():execute("main_menu off")
get_console():execute("Phase1")
if clan==nil then clan="stalker" end
if amount==nil then amount=1 end
--current=relation_registry:community_goodwill(clan, 0)
get_console():execute("Phase2")
relation_registry:set_community_goodwill(clan, 0, math.min(5000, amount))
get_console():execute("Phase3")
end
end

вылетает на стол с такой вот ошибкой:


[02.10.20 16:23:52.569] ********************************************************************************
[02.10.20 16:23:52.576] *********************************************************************************
[02.10.20 16:23:52.576] [print_output([CScriptEngine::lua_pcall_failed])] SCRIPT RUNTIME ERROR:
[luabind::detail::free_functions::function_dispatcher] Caught unhandled exception!
stack traceback:
	[C]: at 0x07fed88bf770
	[C]: in function 'set_community_goodwill'
	g:\stalker_shoc_na7\gamedata\scripts\ui_prestige.script:72: in function <g:\stalker_shoc_na7\gamedata\scripts\ui_prestige.script:52>
[02.10.20 16:23:52.576] *********************************************************************************
[02.10.20 16:23:52.576] 
FATAL ERROR

[error]Expression    : FATAL ERROR
[error]Function      : CScriptEngine::lua_pcall_failed
[error]File          : d:\_work\forks\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!

[02.10.20 16:23:52.576] ***************************[ScriptCrashHandler]**********************************
[02.10.20 16:23:52.576] stack traceback:
	[C]: at 0x07fed88bf770
	[C]: in function 'set_community_goodwill'
	g:\stalker_shoc_na7\gamedata\scripts\ui_prestige.script:72: in function <g:\stalker_shoc_na7\gamedata\scripts\ui_prestige.script:52>
[02.10.20 16:23:52.576] 	Locals: 
[02.10.20 16:23:52.576] 	 string (*temporary) : [luabind::detail::free_functions::function_dispatcher] Caught unhandled exception!
[02.10.20 16:23:52.576] 	End
[02.10.20 16:23:52.576] 	Locals: 
[02.10.20 16:23:52.576] 	 Table: (*temporary)
[02.10.20 16:23:52.576] 			 function (*temporary).set_community_goodwill : [[function]]
[02.10.20 16:23:52.576] 			 function (*temporary).clear_personal_relations : [[function]]
[02.10.20 16:23:52.576] 			 function (*temporary).community_goodwill : [[function]]
[02.10.20 16:23:52.576] 			 function (*temporary).change_community_goodwill : [[function]]
[02.10.20 16:23:52.576] 			 function (*temporary).set_personal_goodwill : [[function]]
[02.10.20 16:23:52.576] 			 function (*temporary).clear_personal_goodwill : [[function]]
[02.10.20 16:23:52.576] 			 function (*temporary).get_personal_goodwill : [[function]]
[02.10.20 16:23:52.576] 			 function (*temporary).change_personal_goodwill : [[function]]
[02.10.20 16:23:52.576] 	 string (*temporary) : stalker
[02.10.20 16:23:52.576] 	 number (*temporary) : 0.000000
[02.10.20 16:23:52.576] 	 number (*temporary) : 2000.000000
[02.10.20 16:23:52.576] 	End
[02.10.20 16:23:52.576] 	Locals: 
[02.10.20 16:23:52.576] 	 Userdata: self
[02.10.20 16:23:52.576] 			 userdata self.dialog : (CUIStatic): 00000000170B2A80
[02.10.20 16:23:52.576] 			 Userdata: self.owner
[02.10.20 16:23:52.576] 					 userdata self.owner.message_box : (CUIMessageBoxEx): 0000000040B32920
[02.10.20 16:23:52.576] 					 number self.owner.mbox_mode : 0.000000
[02.10.20 16:23:52.576] 					 userdata self.owner.shniaga : (CUIMMShniaga): 0000000040781180
[02.10.20 16:23:52.576] 	End
[02.10.20 16:23:52.576] *********************************************************************************
[02.10.20 16:23:52.576] ********************************************************************************


 

Вот чего ОГСРу неймётся, кто-нить может объяснить? Какое исключение и где именно?

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

AMD Ryzen 5 3600, 32GB DDR4-3200, AFOX GeForce GTX1050Ti и нормально сталкерим в НА5.1, НА7, OGSE-0693, OGSR, НС2016, OLR, OFFLIFE, CoC, LADC, CoP Gunslinger, CoP SGM Gunslinger, ShoC GA, Legend Return, Anomaly, CS OGSM, ОП-2.2 ZC!

Мозг состоит на 80 процентов из жидкости, и мало того, что она тормозная, так многим еще конкретно не долили...@Denikius136
Black_Raven.gif
 

28 minutes ago, Black_Raven_03 said:

relation_registry:set_community_goodwill

Скорее всего вот в этом. Разве relation_registry - это класс и у него есть метод set_community_goodwill?

  • Согласен 1

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

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

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

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

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

Войти

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

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

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