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

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

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

Kirag, про погоду я и сам догадался ,но я её ни где не менял

у меня в папке геймдата только необходимый минимум для работы уровней(погода везде динамик_дефаулт) т.е погода везде стандартная . Если отключить скрипт аномалий на Затоне то уровень нормально грузится

 

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

 

Не подскажеш как проверку наваять...

 

 

Kirag,

Списибо, аномалии появляются везде, а также исчез вылет на затоне(видать изза аномалий глючило)

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

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

и Никто не подскажет как такой написать а то я в этом не бум-бум..

 

Не соответствует. N6260

Ссылка на комментарий
ZeeK, запускай таймер, при запуске инфопоршень забирай\выдавай, а при окончании таймера опять же выдавай\забирай поршень, ну и прекондишн на диалог повесь для этого инфопоршня
Ссылка на комментарий

function start_taimer() --при запуске этой функции запуститься таймер игровово времени с именем dialog,

amk.g_start_timer("dialog",0,0,1) --время 0 дней, 0 часов, 1 мин.

end

 

открываем amk.script ищем function __do_timer_action

в конец добавляем

 

if select_string=="dialog" then --имя таймера

db.actor:give_info_portion("info_dialog_taimer") --по истечению таимера выдаем поршен

new_kardon.shustryi_sms() --или сработает функция

end

 

 

В файле bind_stalker.script в функцию

function actor_binder:update(delta)

добавляем (перед последним end)

amk.actor_update(delta)

local timers={}

local g_timers={}

local timer_trigger=nil

 

function actor_update(delta)

if not timer_trigger then

timer_trigger=game.time()

end

if timer_trigger<=game.time() then

timer_trigger=game.time()+1000

check_timers()

end

end

 

function start_timer(name,delay,action)

if not delay then

return false

end

 

if not action then

action = ""

end

 

local time = game.time() --time in seconds since 1970

local a=1

while db.storage[db.actor:id()].pstor["xt"..a] do

a=a+1

if a>100 then

return false

end

end

save_variable("xt"..a, name)

save_variable("xd"..a, time+delay*1000*system_ini():r_float("alife","time_factor"))

save_variable("xp"..a, action)

 

return true

end

 

function g_start_timer(name,delay_d,delay_h,delay_m,action)

local time = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes() --time in game minutes

if delay_d==nil or delay_h==nil or delay_m==nil then

return false

end

 

if action==nil then

action = ""

end

 

local a=1

while db.storage[db.actor:id()].pstor["gt"..a] do

a=a+1

if a>100 then

return false

end

end

 

save_variable("gt"..a, name)

save_variable("gd"..a, time+delay_d*60*24+delay_h*60+delay_m)

save_variable("gp"..a, action)

 

return true

end

 

function check_timers()

local tmp

for a=1,100,1 do

tmp=load_variable("xt"..a,nil)

if tmp~=nil then

__timer_found(a)

end

end

 

for a=1,100,1 do

tmp=load_variable("gt"..a,nil)

if tmp~=nil then

__g_timer_found(a)

end

end

end

 

function __timer_found(idx)

local time = game.time() --time in seconds since 1970

local name,params

if load_variable("xd"..idx, nil)<=time then

name=load_variable("xt"..idx, nil)

params=load_variable("xp"..idx, nil)

del_variable("xt"..idx)

del_variable("xd"..idx)

del_variable("xp"..idx)

oau_reason=name.." "..params

__do_timer_action(name,params)

return true

end

return false

end

 

function __g_timer_found(idx)

local gtime = level.get_time_days()*60*24+level.get_time_hours()*60+level.get_time_minutes() --time in game minutes

local name,params

if load_variable("gd"..idx, nil)<=gtime then

name=load_variable("gt"..idx, nil)

params=load_variable("gp"..idx, nil)

del_variable("gt"..idx)

del_variable("gd"..idx)

del_variable("gp"..idx)

oau_reason=name.." "..params

__do_timer_action(name,params)

return true

end

return false

end

 

function __do_timer_action(select_string,params_string)

if select_string=="name_taimer" then --имя таймера

my_file.my_function() --функция которая сработает по истичению

end

end

 

function save_variable(variable_name, value)

if value==nil then

amk.mylog("saving nil into "..variable_name)

del_variable(variable_name)

else

xr_logic.pstor_store(db.actor, variable_name, value)

end

end

 

function load_variable(variable_name, value_if_not_found)

return xr_logic.pstor_retrieve(db.actor, variable_name, value_if_not_found)

end

 

function del_variable(variable_name)

if db.storage[db.actor:id()].pstor[variable_name] then

db.storage[db.actor:id()].pstor[variable_name] = nil

end

end

 

 

by max_max_08.

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

кровоSTALKER, бог с вами, тут то зачем такой таймер?(ну если конечно прям этот баг(с перезагрузкой) ненужен то да)

ZeeK,

local time = time_global()
local delay= 60000 -- в данном случае минута 
function blabla()
  if time_global()>time+delay and выдан\не выдан ваш поршень then  
выдать\забрать поршень
    time=time_global()
  end
end

 

ну и вызываете где вам надо, вот этого вполне хватит

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

Горчаков Антон

 

Например вот так:

 

local lvl = level.name()
if lvl == "l01_escape" then
    -- действия для Кордона
elseif lvl == "l02_garbage" then
    -- действия для Свалки
elseif lvl == "l03_agroprom" then
    -- и т.д. по всем уровням
end

 

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

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

Мои работы:

Ночные прицелы + смена ножевого слота

AI вертолетов + ПЗРК

Soul Cube

 

Работаю только с ТЧ. С ковырянием ЧН/ЗП не связываюсь ни в какой форме. Совсем.

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

Всем привет, у меня два вопроса:

Возможно такое(Если ГГ видит Долговца, то...)?:

if db.actor:see("dolg_regular") then

 

И возможна ли проверка попадения какого либо объекта в зону(аномалию, спейс рестриктор)?

Что то типа:

local obj = "wpn_pm"

local am = "zone_flame"

if obj попал в am then

Ссылка на комментарий
Возможно такое(Если ГГ видит Долговца, то...)?:

if db.actor:see("dolg_regular") then

ГГ никого не видит, то есть функция db.actor:see всегда возвращает false. Наоборот проверить можно

 

И возможна ли проверка попадения какого либо объекта в зону(аномалию, спейс рестриктор)?

Что то типа:

local obj = "wpn_pm"

local am = "zone_flame"

if obj попал в am then

проверка будет выглядеть так:

if am:inside(obj:position()) then

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

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

Строгое предупреждение от модератора n6260
Юзаем заглавные буквы.
Ссылка на комментарий
...
local actor = db.actor
local wpn_sec = actor:item_in_slot(slot):section()
...

 

function GC(wpn_sec)
    if wpn_sec == nil then
        return nil
    end
  return wpn_sec:clsid()
end

При обращении к ней вылетает с логом:

Expression    : fatal error
Function      : CScriptEngine::lua_error
File          : E:\stalker\patch_1_0004\xr_3da\xrGame\script_engine.cpp
Line          : 73
Description   : <no expression>
Arguments     : LUA error: c:\games\s.t.a.l.k.e.r\gamedata\scripts\_g.script:773: attempt to call method 'clsid' (a nil value)

Что тут не так? :huh:

 

Kolmogor,спасибо,работает :)

Изменено пользователем Влад
Не бойтесь совершенства. Вам его не достичь.
C. Дали
Ссылка на комментарий

Влад :)

local wpn_sec = actor:item_in_slot(slot):section()

Зря section() вызвал - у тебя wpn_sec присвоилась строка с названием секции оружия. У ней понятное дело никакого метода clsid() нет

Попробуй написать просто

local wpn_sec = actor:item_in_slot(slot)

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

Как выглядит проверка на количество репутации у ГГ к опр. группировке? Нужно для прекондишна в диалог.

 

Добавлено через 33 мин.:

И ещё, как прибавить актору радиацию по средствам скрипта?

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

Хм... Странно, не работает.

function add_radiation_from_vintorez()

if db.actor:active_item() == "wpn_vintorez_m2" then

db.actor.radiation = 0.1

end

end

 

 

Мне нужно если юзается этот итем ((мой винторез) тоесть если он в слоте под оружие) то прибовляется радиация.

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

кровоSTALKER, у тебя вылет или просто ничего не происходит?

Если ничего не происходит, значит увеличь параметр радиации. Или очень маленькое увеличение радиации, или увеличение радиации только при юзании

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

кровоSTALKER, вот как-то так:

local weapon = db.actor:item_in_slot(2)    
if db.actor:active_slot()==2 and weapon and weapon:section()=="wpn_vintorez_m2" then db.actor.radiation = 0.0001

Эту штуку суешь в апдейт актора (ф-ия actor_binder:update(delta) в файле bind_stalker.script) и после взятия твоего оружия в руки, радиация должна начать прибавляться (если оружие в слоте, но в руках его нет, то радиации не будет).

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

Люди помогите скрипт написать :wacko2: (для народной солянки).

Имеем: энное количество установленных GPS меток. Необходимо: найти метку с текстовым описанием, например "QWERTY" и определить ее координаты, level vertex, game vertex, и присвоить их какимлибо переменным (напр xx,yy,zz,lv,gv).

 

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

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

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

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

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

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

Войти

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

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

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