Скриптование - Страница 207 - Скрипты / конфиги / движок - 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/

panzyuza

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

 

Например, твоя попытка использовать (self.timer_atacks or 0) < time вполне бы сгодилась, но тогда нет смысла задавать self.timer_atacks при инициализации класса.

А вот подавление "дребезга" при входе-выходе из зоны стОит может быть усложнить, чтобы эффект все же сразу включался.

 

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

 

В общем пиши код по мере потребностей в конкретном контексте, а не копипасть не задумавшись даже сам у себя. ;-)

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Если детектор удалить\выбросить из инвентаря актора(ГГ), а затем получить его(подобрать или взять из нычки\купить\получить в награду за квест) - он автоматом "запрыгнет" в свой родной слот. Вопрос - можно-ли как-то задисэйблить слот, т.е. сделать так, что-бы он не принимал детектор при появлении его в инвентаре актора ?

AndreySol, конечно можно - используй детектор-заглушку...

всё легко

7.9

Об этом я конечно подумал, но хотел все-же уточнить насчет других, более "прямых" (на мой взгляд) вариантов.

 

Во-первых, не нужно цитировать предыдущие посты, достаточно вписать ник-нейм.

Во-вторых, что значит "прямых", да ещё и на твой взгляд, вариантов?

ColR_iT

 

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

ColR_iT

Ну к примеру какая-то функция движка, позволяющая блокировать слот, или предмет от попадания в прописанный ему слот ?

Изменено пользователем ColR_iT
Artos, в твоем случае эффект не удалялься.И даже если актор не внутри зоны, все равно каждые 18 секунд появлялись фантомы и звуки.Просто в схеме установлен радиус действия 10.Тогда нет смысла проверять актора внутри зоны.Даже если шейп рестриктора выставить 50,все равно по схеме он равен 10.Поэтому я немного подретушировал код и все теперь работает,как надо.Это из поста 4142.

panzyuza

Ну раз исправил и получил желаемое - это ж хорошо!

Не имеет смысла говорить о кодах, которые только у тебя ... Для других это бесполезная информация.

А в моем примере была ошибка (писал "на коленке" и не проверял), строка:

if self.actor_inside = self.object:inside(db.actor:position()) then --/ актор в зоне?

должна быть такой:

if self.object:inside(db.actor:position()) then --/ актор в зоне?

Если же у тебя рестриктор не отрабатывает вхождение в зону - то конечно же бессмысленно применять проверки на вхождение.

 

Однако, постоянно проверять позицию актора на каждом апдейте достаточно расточительно, т.к. у тебя вероятно схема активна постоянно если твой рестриктор на локации ... СтОит подумать о вводе доп.таймера периода, зависимого от дистанции до рестриктора. Т.е. если актор далеко - проверять дистанцию пореже ... Или же манипулировать секциями логики рестриктора, активируя нужную в нужное время, а не по дефолту.

Для одиночной правки подобная заморочка может и не нужна, но если в моде немало подобного - эконимия ресурсов никогда не вредна.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Artos, хотя для новичков, вроде меня, подобные бесполезные коды могут научить правильно писать скрипты.И по вопросу.Можно конечно переключать логику рестриктора примерно так Изменено пользователем panzyuza

panzyuza, под "бесполезностью" в данном контесте подразумеваю именно то, что многие (в основном новички) говоря о каких-то кодах и даже порою выкладывая кусочки из них не задумываются, что без связки всех относящихся к вопосу кодов - часто именно бессмысленно гадать или давать какие-либо ответы/советы.

"Правильность" - понятие относительно и то, что "правильно" в какой-то ситуации/случае, запросто может быть ошибочным в другой, дажеесли это "другое" очень схоже с первым.

(но это уже пошел оффтопик ... заканчиваем)

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Добрый вечер! Подскажите пожалуйста как исправить данную ошибку?

FATAL ERROR

[error]Expression    : assertion failed
[error]Function      : CUIXmlInit::InitText
[error]File          : D:\prog_repository\sources\trunk\xrGame\ui\UIXmlInit.cpp
[error]Line          : 315
[error]Description   : pTmpFont


stack trace:

 

class "selection_of_groups_ui" (CUIScriptWnd)

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

function selection_of_groups_ui:__finalize() 
end

function selection_of_groups_ui:InitControls()
    self:SetWndRect(Frect():set(50,50,1024,768))

    local xml = CScriptXmlInit()
    xml:ParseFile("selection_of_groups_ui.xml")

    self:Register(xml:Init3tButton("caption", self),"caption")
    self:Register(xml:Init3tButton("btn_1", self),"btn_1")
    self:Register(xml:Init3tButton("btn_2", self),"btn_2") 
    self:Register(xml:Init3tButton("btn_3", self),"btn_3")
    self:Register(xml:Init3tButton("btn_4", self),"btn_4")
end

function selection_of_groups_ui:InitCallBacks()
    self:AddCallback("btn_1", ui_events.BUTTON_CLICKED, self.function_ui_1, self)
    self:AddCallback("btn_2", ui_events.BUTTON_CLICKED, self.function_ui_2, self)
    self:AddCallback("btn_3", ui_events.BUTTON_CLICKED, self.function_ui_3, self)
    self:AddCallback("btn_4", ui_events.BUTTON_CLICKED, self.function_ui_4, self)
end

function selection_of_groups_ui:function_ui_1()
     if db.actor:character_community() ~= "(stalker)" then
db.actor:set_character_community("stalker", 0, 0)
end
end

function selection_of_groups_ui:function_ui_2()
       if db.actor:character_community() ~= "(bandit)" then
db.actor:set_character_community("bandit", 0, 0)
end
end

function selection_of_groups_ui:function_ui_3()
      if db.actor:character_community() ~= "(dolg)" then
db.actor:set_character_community("dolg", 0, 0)
end
end

function selection_of_groups_ui:function_ui_4()
       if db.actor:character_community() ~= "(freedom)" then
db.actor:set_character_community("freedom", 0, 0)
end
end

 

Без указания версии игры и используемого шаблона selection_of_groups_ui.xml гадай самостоятельно или на пару с кашнировским. --/Artos

[x]

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

такая вот проблема возникла...когда попытался вывести окно после использования предмета. Делал на моде Lost World Trops of Doom 2.4

в bind_stalker создаю два колбека

self.object:set_callback(callback.host, nil)

и

self.object:set_callback(callback.host, self.use_mps_big, self)

 

потом пишу функцию

function actor_binder:on_item_drop (obj)
    level_tasks.proceed(self.object)
    terrorizm.li(obj)        
    lwc_inventory.ItemDrop(obj)
end
-----МОЯ_ФУНКЦИЯ-----
function actor_binder:use_mps_big(obj)
  main_map_use.main_map_use_2(obj)
end

 

в main_map_use вот это

function main_map_use_2(obj)
   if obj ~= nil then
      if obj:section() == "map_big" then
       local hud = map_big_ui(get_hud())
         level.start_stop_menu(hud, true)
    end
    end
end
class "map_big_ui" (CUIScriptWnd)
function map_big_ui:__init(owner) super()
    self.owner = owner
    self:InitControls()
    self:InitCallBacks()
end
function map_big_ui:InitControls()
    self:Init(50,50,550,450)
    local xml = CScriptXmlInit()
    xml:ParseFile("ui_map_self.xml")
    xml:InitStatic("background", self)
    self:Register(xml:Init3tButton("caption", self),"caption")
    self:Register(xml:Init3tButton("btn_quit", self),"btn_quit") 
end
functionmap_big_ui:InitCallBacks()
    self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.on_quit, self)
end
functionmap_big_ui:OnKeyboard(dik, keyboard_action)
    CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
    if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
    end
    return true
end
function map_big_ui:check_game() -- проверка запущена ли игра
    local check = false
    if level.present() and (db.actor ~= nil) and db.actor:alive() then
        check = true
    end
    return check
end
function map_big_ui:on_quit()
    self:GetHolder():start_stop_menu(self, true)
    alife():create("sleep_bag", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
end

 

после запуска игры, начинаю новую игру и на "клиент синхронизация" получаю безлоговый вылет....пробовал вешать функцию на другой колбек-всё работает, а вот именно на моём нет.

подскажите что я сделал не так....

заранее благодарен!

 

Используй тэг спойлера для портянок кодов. --/Artos

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

Сталкер в душе - сталкер по жизни!

temakonkin, а с чего ты взял, что движек игры поймет придуманный тобою callback.host ?

Все коллбэки, который понимает движек игры упомянуты в lua_help.script в классе коллбэка (class callback).

Для использования (юзания) предметов предусмотрен коллбэк callback.use_object.

Как подключить и использовать такой коллбэк (use_object) - смотри хоть в кодах ЗП, хоть в модах, хоть в статьях на вики-сайтах.

 

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

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Artos благодарю за быстрый ответ!!!

 

я только учусь, так что спасибо на счёт того что имена колбеков зарезервированы(так я понимаю?) я не знал! Если не знаешь - читай статьи и ФАКи! --/Artos

полетел дальше эксперементировать...

 

[x]

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

Сталкер в душе - сталкер по жизни!

selection_of_groups_ui.XML

<?xml version="1.0" encoding="windows-1251" ?>

<main>
    <background x="0" y="0" width="400" height="340" stretch="1">
        <texture x="0" y="0" width="350" height="460">ui\ui_actor_sleep_screen</texture>
    </background>

    <caption x="175" y="30" width="50" height="35">
        <text>Выберете группировку:</text>
    </caption>

    <btn_1 x="72" y="80" width="256" height="35">
    <texture_e>ui\ui_btn_mm_e</texture_e>
    <texture_t>ui\ui_btn_mm_t</texture_t>
    <texture_h>ui\ui_btn_mm_h</texture_h>
        <text>"Нейтралы"</text>
    </btn_1>

    <btn_2 x="72" y="130" width="256" height="35">
    <texture_e>ui\ui_btn_mm_e</texture_e>
    <texture_t>ui\ui_btn_mm_t</texture_t>
    <texture_h>ui\ui_btn_mm_h</texture_h>
        <text>"Бандиты"</text>
    </btn_2>

    <btn_3 x="72" y="180" width="256" height="35">
    <texture_e>ui\ui_btn_mm_e</texture_e>
    <texture_t>ui\ui_btn_mm_t</texture_t>
    <texture_h>ui\ui_btn_mm_h</texture_h>
        <text>"Долг"</text>
    </btn_3>

    <btn_4 x="72" y="230" width="256" height="35">
    <texture_e>ui\ui_btn_mm_e</texture_e>
    <texture_t>ui\ui_btn_mm_t</texture_t>
    <texture_h>ui\ui_btn_mm_h</texture_h>
        <text>"Свобода"</text>
    </btn_4>
    
</main>

selection_of_groups_ui_mod.sctipt

class "selection_of_groups_ui" (CUIScriptWnd)

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

function selection_of_groups_ui:__finalize() 
end

function selection_of_groups_ui:InitControls()
    self:SetWndRect(Frect():set(50,50,1024,768))

    local xml = CScriptXmlInit()
    xml:ParseFile("selection_of_groups_ui.xml")

    xml:InitStatic("background", self) -- рамка сзади

    self:Register(xml:Init3tButton("caption", self),"caption")
    self:Register(xml:Init3tButton("btn_1", self),"btn_1")
    self:Register(xml:Init3tButton("btn_2", self),"btn_2")
    self:Register(xml:Init3tButton("btn_3", self),"btn_3")
    self:Register(xml:Init3tButton("btn_4", self),"btn_4")
end

function selection_of_groups_ui:InitCallBacks()
    self:AddCallback("btn_1", ui_events.BUTTON_CLICKED, self.function_ui_1, self)
    self:AddCallback("btn_2", ui_events.BUTTON_CLICKED, self.function_ui_2, self)
    self:AddCallback("btn_3", ui_events.BUTTON_CLICKED, self.function_ui_3, self)
    self:AddCallback("btn_4", ui_events.BUTTON_CLICKED, self.function_ui_4, self)
end

function selection_of_groups_ui:function_ui_1()
     if db.actor:character_community() ~= "(stalker)" then
db.actor:set_character_community("stalker", 0, 0)
end
end

function selection_of_groups_ui:function_ui_2()
       if db.actor:character_community() ~= "(bandit)" then
db.actor:set_character_community("bandit", 0, 0)
end
end

function selection_of_groups_ui:function_ui_3()
      if db.actor:character_community() ~= "(dolg)" then
db.actor:set_character_community("dolg", 0, 0)
end
end

function selection_of_groups_ui:function_ui_4()
       if db.actor:character_community() ~= "(freedom)" then
db.actor:set_character_community("freedom", 0, 0)
end
end

FATAL ERROR

[error]Expression    : assertion failed
[error]Function      : CUIXmlInit::InitText
[error]File          : D:\prog_repository\sources\trunk\xrGame\ui\UIXmlInit.cpp
[error]Line          : 315
[error]Description   : pTmpFont


stack trace:

 

Версия игры ЗП 1.6.00.

Изменено пользователем ColR_iT
Пишем покомпактнее, пожалуйста.

Вопрос о фиксации объектов после спауна: скриптово создаю объект, ящик с динамитом, с размещением его на земле (локация Кордон) прям перед входом к Сидоровичу (для тестирования). После создания пытаюсь его фиксировать (пример кода взял здесь-же, на форуме):

if object then
    local pshell = object:get_physics_shell()
    if  pshell then 
        local element = pshell:get_element_by_order(0)
        if element then 
            element:fix()
local text = "попытка фиксации"
news_manager.send_tip(db.actor, text, nil, nil, 30000)
        end
    end
end

сообщение появляется, значит ф-ция element:fix() вроде как отрабатывает.

Но если после создания предмета сохраниться, а затем загрузиться - предмет исчезает, точнее становится невидимым. Если подойти затем к нему и посмотреть на него (зная точно место, где он должен быть), он "проявляется", т.е. визуально появляется на месте спауна. Что надо исправить, чтоб предмет спаунился нормально ?

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

Здравия желаю. Подскажите пожалуйста как при входе в рестриктор поменять погоду? Пытался сделать функцией level.set_weather("indoor"), но в логе пишет:

!Invalid weather name "indoor".

 

Пытался поменять вот так:

Логика:

[logic]
active = sr_idle@in

[sr_idle@in]
on_actor_in_zone = agr_sr_weather_indoor | sr_idle@out %=change_weather()%

[sr_idle@out]
on_actor_not_in_zone = agr_sr_weather_indoor | sr_idle@in

 

Функция:

function change_weather()
level.set_weather("indoor")
end

 

Но следует выше описанный лог. Подскажите, как можно всё-таки изменить погоду при входе в скрипт?

Заранее спасибо.

P.S.: платформа - ЗП.

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

zoidberg123456789, ну тут по логу же всё ясно. Погоды с названием indoor нету.

В ЗП название погоды соотв. названию .ltx файла с ней.

Тоесть в конфигах открой папку с погодой (только учти, их там две. Одна старая от ТЧ и не используется (для СДК видимо))

"gamedata\configs\environment\weathers\"

И глянь правильное название погоды.

___

Глянул сам, в ЗП вроде есть такая погода (indoor.ltx), но лог ругается именно на её отсутствие. Лучше перепроверь у себя файлы. Я смотрел по файлам из ЗП СДК.

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

Можно просто Shoker, форум АМК съел моё старое имя и не хочет отдавать о_О

Мастер аномалий на свою заднюю точку.

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

Смотрим в xr_effects.script:

--'-----------------------------------------------------------------------------------
--' Функции для работы с погодными эффектами
--'-----------------------------------------------------------------------------------

-- Принудительная установка погодных условий
-- =set_weather(<секция погоды>:true) - установка погоды сразу, false - через некоторое время
-- Будет использоваться на старте игры Зов Припяти и в сцене jup_b15 - утро после пьянки с Зулусом
function set_weather(actor, npc, p)
  if(p[1]) then
    if(p[2]=="true") then
      level.set_weather(p[1],true)
    else
      level.set_weather(p[1],false)
    end
  end
end

В данном случае выставляются все необходимые аргументы для вызова функции смены погоды (чего ты у себя не делаешь!).

Если у тебя погода не меняется - проверяй свой 'погодный' файл конфига.

 

И ... подбирайте все же соответствующий вопросу топик, место такому вопросу в топике по ковыряниям именно CoP.

 

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

AndreySol, вероятно следует покопаться с параметром object_flags заспавненного объекта ... раз используешь на базе инвентарного ящика.

 

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

Tris, твой простенький код и конфиг к нему полностью рабочие, а вот ошибка вероятно возникает из-за неправильного вызова окна (вызова твоего оконного класса) о чем мы можем только гадать.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Artos

Вызывал так:

function actor_binder:net_spawn(data)
selection_of_groups_ui_mod.get_hud_mod()

selection_of_groups_ui_mod:

function get_hud_mod()
if db.actor:alive() then 
groups_ui = this.selection_of_groups_ui()
groups_ui:ShowDialog(true)
end
end

 

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

Tris, мда-а-а ... вам бы матчасть почитать и не бездумно чего то писать в скрипты, а хотя бы понимать то, чято пишется.

 

ну и что означает(?) ваше:

function actor_binder:net_spawn(data)
  selection_of_groups_ui_mod.get_hud_mod()

На кой ... впустую создавать объект класса? И нафига это вообще при спавне актора? :shok:

 

Ну а this.selection_of_groups_ui() - говорит о том, что вы не понимаете пока разницы между классом и метатаблицей скрипта/функции.

Делайте хотя бы так, как в оригинальных кодах игры ... и посмотрите как вызываются методы из классов и что такое 'this' и когда применяется.

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

"Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени

Artos

object_flags - нашел это только в Вашем модуле нет-пакетов. Подскажите как этот параметр влияет на объект. И как его правильно использовать.

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

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

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

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

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

Войти

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

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

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