Скриптование - Страница 593 - Скрипты / конфиги / движок - AMK Team
Перейти к контенту

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

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

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

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

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 есть. Так что проще добавить просто скриптовый метод, который меняет индивидуально отношение между монстрами.

День добрый. Подскажите пожалуйста: Как сделать проверку на состояние предметов в слотах (слот 1,слот 2, слот 6)?

Версия игры : SoC 1.0006

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

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

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

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

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

Войти

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

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

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