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

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

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

Есть функция которая выдает все тайники

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

function CTreasure:create_random_stash()
    for k,v in pairs(self.treasure_info) do
    self:give_treasure(k)
end
end

Помогите сделать что бы она выдавала 1 тайник.

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

@Colder Выдаст рандомный тайник -

Скрытый текст
function CTreasure:create_random_stash()
	local t = {}
	for k, v in pairs(self.treasure_info) do
		table.insert(t, k)
	end
	self:give_treasure(t[math.random(#t)])
end

 

 

Изменено пользователем Manool
  • Спасибо 1
Ссылка на комментарий

Здрасьте.

 

[ТЧ/ЧН] Изменение подсказки при взаимодействии с объектом через метод set_tip_text(string): при тесте на трупе мутанта подсказка меняется на один апдейт, после чего возвращается к исходному виду "Обыскать труп".

Как заставить игру сохранить изменение?

 

Spoiler
[scripts\bind_monster.script]
function generic_object_binder:use_callback(obj)
	if not obj:alive() then
		self.object:set_nonscript_usable(false)
		self.object:set_tip_text("test")
	end
end

 

 

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

Шпаргалка

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

Не хватает костного мозга в холодце, как добавить в исключения предмет на поясе по id, что бы размер этого предмета не учитывался в ограниченном объёме рюкзака? По типу такого:

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

    local OutfitSlot = db.actor:item_in_slot(6)
    if OutfitSlot ~= nil then IdOutfit = OutfitSlot:id() end

Всё, распихиваемое по слотам, места не занимает. С предметами на поясе же у меня постоянно вопросы, которые оставляю здесь...

Движок ОГСР.

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

Здесь могла быть ваша реклама.

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

@mole venomous 

Скрытый текст
local excluded_ids = {}
for i = 0, db.actor:belt_count() - 1 do	-- цикл всех предметов на поясе
	local item = db.actor:item_on_belt(i)
	if item then
		excluded_ids[item:id()] = true
	end
end
-- проверка на исключение:
if excluded_ids[id] then	-- id здесь предмета, который нужно проверить
end

 

 

  • Спасибо 1
  • Полезно 1
Ссылка на комментарий
6 hours ago, Norman Eisenherz said:

подсказка меняется на один апдейт

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

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

@Norman Eisenherz 

generic_object_binder:update(delta) там несколько упоминаний set_tip_text, соответственно, на апдейте постоянно корректируется подсказка. Об этом, кстати, dsh намекнул... Копай туда.

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

Привет всем!
Решил намутить рабочую гитару, чтобы после 43 секунд игры мелодии, она возвращалась обратно в инвентарь.
Забацал 2 файла, один dmb.script, второй dmb2.script. 

 


 
 

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

 

local tSound ={
dmb_pleer      = "interface\\inv_guitar",
}

function muzika() 
alife():create("dmb_pleer", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id())
end

function use_item(obj) 
    local obj = obj:section()
    if obj then  
        if obj == "dmb_pleer" then  
            dmb2.start_timer()
        end
    end
    
   if obj and tSound[obj:section()]  then 
      local snd = xr_sound.get_safe_sound_object(tSound[obj:section()])
      if snd then 
      snd:play_no_feedback(db.actor, sound_object.s2d, 0, vector(), 2.0)
      end
   end
end

 


А вот второй скрипт, куда я запихнул таймер

 

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

   function action_timer()
      alife():create("dmb_pleer", db.actor:position(), 1, db.actor:game_vertex_id(), db.actor:id())
   end
 
   function start_timer()
      local iTimer = time_global() + 43000
 
      local function check_timer()
         return time_global() > iTimer
      end
 
      level.add_call(check_timer, action_timer)
   end


И при попытке юзануть ту самую гитару, вылазит ЭТО:
[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: ....l.k.e.r. Тень Чернобыля\gamedata\scripts\dmb.script:22: attempt to call method 'section' (a nil value)

Помогите пожалуйста)
 

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

@Hind Путаница в типе и значениях переменных: сначала obj – объект, потом obj – секция, то есть строка, и для этой строки ты еще раз пытаешься прочитать секцию.

 

@AndreySol Получается решение вида "заново менять уже измененную подсказку каждый апдейт". Кроме проверки по таблице id уже обработанных мутантов, как можно добиться варианта "смерть, 1 апдейт и остановка + запоминание при перезагрузке"?

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

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

Шпаргалка

Ссылка на комментарий
25.08.2022 в 22:19, Norman Eisenherz сказал:

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

Ну так оно единственно верное. У тебя для монстров и нпс есть апдейт(generic_object_binder:update(delta)), в нем постоянно корректируется подсказка, в зависимости от состояния объекта. Вот тебе пример из модика(мод "Мясник" (CoP) от Singapur22), который меняет логику обыска трупов монстров, тебя интересует выделенный фрагмент:

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

    if self.object:alive() then
        if self.object:is_talk_enabled() then
            self.object:set_tip_text("character_use")
        else
            self.object:set_tip_text("")
        end
    else
        if self.used then
            self.object:set_tip_text("")
        else
            local character_use = read_if_exist("s",nil,self.object:section(),"character_use","dead_monster_use")
            self.object:set_tip_text(character_use)

        end
    end

Для дохлого монстра подсказка меняется сразу по факту его помирания, а в методе use_callback она возвращается в исходное значение.

Изменено пользователем AndreySol
  • Полезно 1
Ссылка на комментарий

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

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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

Поковырял движок. В общем, отношение между мутантами так легко не поменяешь, как прописано в monster_relations так оно и будет. Ну ладно, фиг с ним!

  • Полезно 4

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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

Могу посоветовать делать это через combat ignore, забыл, как колбек называется. Т.е. нужные мутанты изначально враги, а в колбеке возвращать, что они игнорируют друг друга до нужного момента.

 

Ещё можешь глянуть вот на этот скрипт

https://github.com/dsh2dsh/op2ogse/blob/master/gamedata/scripts/dsh/dsh_rats.script

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

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

@dsh у тебя там метод set_monster_relation в level есть. Так что проще добавить просто скриптовый метод, который меняет индивидуально отношение между монстрами.

...в конце концов, важен лишь, машинный код.

СТАЛКЕР только для ПК!

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

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

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

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

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

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

Войти

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

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

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