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

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

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

Что-то не пойму, реально ли перенести вещи в ящик который находится далеко от ГГ? Более 150 м.

Делаю так:

 

 

function RelocActInvInBox(oBoxSId)
local oBox = get_story_object(oBoxSId)
if oBox then
  local function TransferItems(oItem)
   if oItem:section()~="wpn_binoc" and oItem:section()~="wpn_knife" and oItem:section()~="device_torch" then
    db.actor:transfer_item(oItem,oBox)
   end
  end
  db.actor:inventory_for_each(TransferItems)
end
end

 


В онлайне работает, в оффлайне - нет, оно и понятно. Но как быть?

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

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

BoBaH_671, реально. Надо ящик просто в онлайн перевести. У себя делал так (код заточен под конкретную игровую сцену(одну) и далеко не идеален). Если кто из более опытных предложит чего по оптимитизации/правке буду только рад.

 

 

--Ограбление на Янтаре.
function yan_grab_func_1()
 level.disable_input()
 level.hide_indicators()
 timefactor = level.get_time_factor()
 level.set_time_factor(1000)
 local dir=device().cam_dir
 db.actor:set_actor_direction(dir.x,dir.y,0) --выравниваем направление взгляда, чтобы было падение более реалистичным
 level.add_cam_effector("camera_effects\\surge_02.anm", 2532, false, "")
 level.add_pp_effector("surge_fade.ppe", 2011, false)
 local snd_obj = xr_sound.get_safe_sound_object([[actor\hit_5]])
 snd_obj:play_no_feedback(actor, sound_object.s2d, 0, vector(), 15.0)
 sim = alife()
 soBox = sim:story_object(62333)
 switch_online(soBox.id)
 start_quick_timer(3, "gz_tasks.yan_grab_func_2") --Здесь таймеры Артоса. Можно использовать любые другие. По идее надо чуть подождать вроде чтобы тайник вышел в онлайн. Ну у меня как раз в данном случае все совпало как надо: пока потемнение в глазах пусть и пара таймеров сработает, мне не мешают.
end

function yan_grab_func_2()
 level.add_pp_effector("peace_fade.ppe", 1973, true)
 gz_utils.spawn_item_in_inv("item_hud_medkit", 3)
 gz_utils.spawn_item_in_inv("military_outfit")
 gz_utils.spawn_item_in_inv("wpn_ak74")
 gz_utils.spawn_item_in_inv("ammo_5.45x39_fmj", 2)
 gz_utils.spawn_item_in_inv("item_hud_voda", 3)
 start_quick_timer(4, "gz_tasks.yan_grab_func_3")
end

local function transfer_object_item(item)
    out_object:transfer_item(item, in_object)
end

function yan_grab_func_3()
 box_with_loot = level_object_by_sid(62333)
 out_object = db.actor
 in_object = box_with_loot
 db.actor:inventory_for_each(transfer_object_item)
 level.set_time_factor(timefactor)
 level.remove_pp_effector(1973)
 level.enable_input()
 level.show_indicators()
 --switch_offline(soBox.id)
end

 


Вам в принципе важно вот это:
 

 sim = alife()
 soBox = sim:story_object(62333)
 switch_online(soBox.id)
Изменено пользователем Kondr48
Ссылка на комментарий

@BoBaH_671, очевидно оперировать серверными объектами, так как дистанция работы клиентских методов равна радиусу онлайна, и немного не понятно зачем их применять за этими рамками. На xp-dev есть метод teleport_object, но у меня не было повода проверить как он работает, судя по коду работает корректно (говорю основываясь на подобных методах, которые пишу сам).

 

@Kondr48, предложенный тобою метод является усложнением простого, к тому же он в любом случае не позволит передавать объекты межлокационно.

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

Карлан, а какой поможет межлокационно? Речь идет о том, чтобы передать вещи актора в тайник который находится где-то там. Как поможет teleport_object? Телепортировать тайник в зону где он станет онлайн и потом обратно? Или функция работает шире, чем я думаю? Хотелось бы каких-то более подробных что ли пояснений.

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

@Kondr48, не знаю, можно ли это сделать скриптами - reject итема который хочешь перенести, далее attach_child или как оно там к ящику в который хочешь сохранить предмет. Это лишь теория)

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

 

 

Но как быть?

Для начала - показать содержимое ф-ции get_story_object(...). Ну или судя по всему, сразу, самому изменить в ней получение объекта ящика с "клиентской" ф-ции на "серверную"...

Ссылка на комментарий
Для начала - показать содержимое ф-ции get_story_object

Это функция оригинала ЗП, на этой платформе я и работаю.

function get_story_object(story_obj_id)
local obj_id = story_objects.get_story_objects_registry():get(story_obj_id)
if obj_id == nil then return nil end
return (db.storage[obj_id] and db.storage[obj_id].object) or (level ~= nil and level.object_by_id(obj_id))
end
самому изменить в ней получение объекта ящика с "клиентской" ф-ции на "серверную"...

Помогите в этом, будьте добры. ;)

Уже разобрался, отбой. 

В сдк в параметрах объекта убрал галку can_switch_offline.

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

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

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

 

 

В сдк в параметрах объекта убрал галку can_switch_offline.

Костыль сделал...

Если ящик будет на локации, отличной от той, где сейчас ГГ(актер) то опять не сработает. А переделка ф-ции(а еще лучше написание собственной) состоит в использовании уже подсказанного выше:

local sim = alife()
soBox = sim:story_object(62333)

Этот код вернет серверный объект ящика, который существует всегда, не зависимо от того на какой локации относительно загруженной находится и попал ли в он-лайн радиус.

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

А как в функцию добавить паузу? Чтобы следующее например отключение инфопоршня произошло через секунду после его получения?

give_info("zamer_dozimetr")
????????????????????????????		
disable_info("zamer_dozimetr")
Добавлено Kirgudu,

Перенёс из «общих вопросов программирования»

Ничто не вечно под луной.

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

Таймеры использовать. Например отсюда:
http://www.amk-team.ru/forum/topic/13216-sborochnyj-tcekh/?p=971137

Вообще есть что-то штатное через level.add_call если не ошибаюсь, но я не помню как это использовать.

P.S. но я вообще не понимаю, зачем давать поршень и забирать его через секунду.

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

@KitkaT.Net,

local toggle_time = 0
function test_pause()
  give_info("zamer_dozimetr")
  toggle_time = time_global() + 1000
  level.add_call(
    function() return time_global() > toggle_time end, -- условие срабатывания
    function() disable_info("zamer_dozimetr") end -- выполняется, если условие равно true
  )
end
  • Спасибо 1
  • Нравится 1
  • Согласен 1
  • Полезно 1
Ссылка на комментарий

@Kondr48, пытаюсь запилить миссию в которой нужно некоторое время простоять в рестрикторе для замера радиации. Начало замера производится при помощи использования предмета в инвентаре.

  • Нравится 1

Ничто не вечно под луной.

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

@KitkaT.Net, я же тебе приводил пример, когда при юзании предмета выдается поршень. То есть сделай такую логику:

[logic]
active = sr_idle

[sr_idle]
on_info = {+check_your_info =actor_in_zone(имя_рестриктора)} sr_idle@timer ;-- check_your_info - это тот самый поршень, который ты выдаешь при юзе предмета и проверяем нахождение актора в нужной зоне.

[sr_idle@timer]
on_timer = 30000 | sr_idle@nil %+your_timer_complete%
on_info = {!actor_in_zone(имя_рестриктора)} sr_idle ;-- а тут если актор вышел из зоны до истечения времени, логика возвращается в первую секцию. Это если тебе нужно.

То есть мы проверяем наличие поршня после использования и наличие актора в нужной зоне. Можно использовать схему sr_timer, в ней на худ будет выводится время. 

Изменено пользователем BoBaH_671
  • Спасибо 1

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

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

Как повторить подряд n раз ф-цию? Нужно заспавнить n трупов. Устраивает, просто забыл поставить end для for :unsure:

function spawn_dead_mil_esc()
	local obj=alife():create("mil_spetsnaz",vector():set(341.901,15.535,-16.927),585673,2)
	obj:on_death()
end

Подскажите функцию, которая выполняется при подборе одного из предметов в списке.

Изменено пользователем dPlayer
Добавлено Kirgudu,

for i=1,n do func() end чем-то не устраивает?

Самый некомпетентный на форуме.

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

Добрый день. Сделал меню:

class "gui_ryukzak" (CUIScriptWnd)

function gui_ryukzak:__init() super()
	self:InitControls()
	self:InitCallBacks()
end

function gui_ryukzak:__finalize()
end

function gui_ryukzak:InitControls()
	local xml = CScriptXmlInit()
	self:Init(0,0,1024,768)
	xml:ParseFile("ui_gui_ryukzak.xml")
	self.fon = xml:InitStatic("fon", self)
	self:Register(xml:Init3tButton("fon:button_add", self.fon), "button_add")
	self:Register(xml:Init3tButton("fon:button_exit", self.fon), "button_exit")
	self:Register(xml:Init3tButton("fon:button_open", self.fon), "button_open")
	self.Text_1 = xml:InitStatic("fon:Text_1", self.fon)
	self.Text_2 = xml:InitStatic("fon:Text_2", self.fon)
	self.Text_3 = xml:InitStatic("fon:Text_3", self.fon)
	self.global_text = xml:InitStatic("fon:global_text", self.fon)

end

function gui_ryukzak:InitCallBacks()
	self:AddCallback("button_add", ui_events.BUTTON_CLICKED, self.button_add_button_clicked, self)
	self:AddCallback("button_exit", ui_events.BUTTON_CLICKED, self.button_exit_button_clicked, self)
	self:AddCallback("button_open", ui_events.BUTTON_CLICKED, self.button_open_button_clicked, self)
end 

Как мне открыть это меню? Знаю что как-то так:

		if dik == DIK_keys.DIK_Q then
			self:...()

Так же, как мне его закрыть?

Изменено пользователем Kober(BRUC)
Ссылка на комментарий

@Kober(BRUC), в ТЧ открыть:

level.start_stop_menu(gui_ryukzak(), true)

Закрыть внутри класса:

self:GetHolder():start_stop_menu(self, true)

В ЗП: открыть:

gui_ryukzak():ShowDialog()

закрыть внутри класса:

self:HideDialog()

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

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

 

 

Как заспавнить тайник скриптом? Причем чтобы все данные о нём в этом же скрипте и указать (визуал и наполнение)

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

 

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

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

Есть поле в которое можно ввести текст:

function start_game:name_GetText()
	return self.name:GetText()
end

Как это работает? Как мне вывести эту информацию(которая была вписана в это текстовое поле игроком) в, например, локальную переменную txt_set:

local txt_set = ""

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

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

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

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

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

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

Войти

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

Войти
×
×
  • Создать...