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

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

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

serega-gamer, что-то не нашел твоего вопроса в топике по CoP ... пока отвечу тут:

- если и нет схемы "use" в CoP, то ничего не мешает ее и портировать или просто самому нужным путем обрабатывать коллбэк 'use_callback';

- в CoP и CS вместо инфопоршней на открытие различных окошек (инфентаря/ящика/трупа/...) работают вызоывы из функции actor_menu_mode. Эта функция имеется в двух скриптах actor_menu.script и pda.script, и обе вызываются из движка. Т.о. отслеживая аргумент 'mode' по логике этой функции можно определять моменты от(за)крытия окошек и в частности при обыске трупа (mode==4).

 

Struck, как сделано в Симбионе там и смотри, не копипастить же кучку скриптов в этот топик ...

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

Раз не получается - значит "не так как тебе надо" делаешь, и или разбирайся самостоятельно или показывай как делаешь.

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

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

Может ли кто поделиться инфой об этих методах класса game_object

enum MovementManager::EPathType path_type()
void set_path_type(enum MovementManager::EPathType)
enum DetailPathManager::EDetailPathType detail_path_type()
void set_detail_path_type(enum DetailPathManager::EDetailPathType)
//
enum MonsterSpace::EMentalState mental_state()
enum MonsterSpace::EMentalState target_mental_state()
void set_mental_state(enum MonsterSpace::EMentalState);
//
enum MonsterSpace::EBodyState body_state()
enum MonsterSpace::EBodyState target_body_state()
void set_body_state(enum MonsterSpace::EBodyState);
//
enum MonsterSpace::EMovementType movement_type()
enum MonsterSpace::EMovementType target_movement_type()
void set_movement_type(enum MonsterSpace::EMovementType);
//movement
void movement_enabled(boolean); // enable_movement
bool movement_enabled();
//

 

Что они вообще делают, для каких объектов применимы, какие аргументы просят/возвращают (и что это вообще такое?).

Может быть кто то примером использования поделится...

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine / Мимокрокодил.

Я понял что моя старая подпись что-то нарушает. Удалил все ссылки.

Zander_driver, довольно странный вопрос, полностью подходящий для топика "Справочник по функциям и классам".

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

На вики давно имеется достаточно подробное описание и по этим методам Описание класса game object. Часть II.

В чем конкретно то проблема? Нужен обобщающий тутор по этим методам (тогда в справочник, плз) или какая-то конкретная загвоздка/непонятка - тогда и задавай конкретный вопрос по конкртеному методу.

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

Мужики, выручайте. Создал окно, в нём переключатель (InitCheck). вот скрипт:

function main()
super_dlg = ui_obmen_active.obmen_active()
level.start_stop_menu(super_dlg,true)
end

class "obmen_active" (CUIScriptWnd)

function obmen_active:__init(owner) super()
self.owner = owner
self:InitControls()
self:InitCallBacks()
end

function obmen_active:__finalize()

end

function obmen_active:InitControls()
self:Init(0,0,1000,750)
local xml = CScriptXmlInit()
xml:ParseFile("ui_obmen_active.xml")
xml:InitStatic("background", self)
self:Register(xml:Init3tButton("btn_cancel",self), "btn_cancel")
if db.actor:object("wpn_svu") then
xml:InitCheck("check_svu", self)
--xml:InitCheck("check_svu", self)
end
end


function obmen_active:InitCallBacks()
self:AddCallback("btn_cancel", ui_events.BUTTON_CLICKED, self.cancel, self)
self:AddCallback("check_svu", ui_events.CHECK_BUTTON_SET, self.check_svu, self)

end

function obmen_active:cancel()
self:GetHolder():start_stop_menu(self, true)
end

function obmen_active:check_svu()
news_manager.send_tip(db.actor, "Галочка ОК!!!", nil, nil, 300)
--self:GetHolder():start_stop_menu(self, true)
end

 

но функция check_svu не вызывается, при установки метки. Что не так?

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

У тебя просто инициализация этого чекера, а регистрировать на каллбеки кто будет?

Замени

xml:InitCheck("check_svu", self)

на

self:Register(xml:InitCheck("check_svu", self), "check_svu")

PS: разобрался бы сначала в оконных классах, чем просто копировать с примера.

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

ТЧ 1.0004. SAP и Trans mod

github

Заменил, но всё равно вызов не происходит. Пытался сделать как у ПЫСов в меню опций, но в скрипте ui_mm_opt_sound.script просто инициализация. Я из какого скрипта происходит отслежка установки влажка я не нашёл. потому и обатился на форум.

p.s. Desertit изучение паралельно с практикой.

ПЫСы их знают, какие каллбеки нужны. Сейчас порылся, для чекера в ui_mp_main.script стоит BUTTON_CLICKED, а не CHECK_BUTTON_SET. Используй поиск по файлам в Notepad++ например, лучший друг в изучении скриптов и конфигов.

ТЧ 1.0004. SAP и Trans mod

github

Всем доброго дня и здоровья.

В целях отработки навыков работы с модулем m_netpk, поставил себе учебно-тренировочную задачу заспавнить полупустую пачку патронов.

 

По событию спавню патроны и сохраняю в переменной их ID.

local sobj = sim:create(ammo, vector():set(temp.position.x,temp.position.y,temp.position.z), temp.lv, temp.gv)
if sobj then
SobjID2 = sobj.id -- сохраняем id
end

Из биндера вызывается процедура перевода объекта в оффлайн/онлайн и внесения изменений в количество патронов в пачке.

 

function update2()
if not SobjID2 then return end
if not State2 then State2=0 end
local sobj = alife():object(SobjID2) -- получаем серверный объект
if sobj then
local obj = level.object_by_id(sobj.id) -- получаем клиентский объект
-- ждем появления в онлайне
if State2==0 then
if obj then
State2=1
local sim = alife ()
if sim ~= nil then
 sim:set_switch_online (obj:id (), false)
 sim:set_switch_offline (obj:id (), true)
end
end
-- ждем появления в оффлайне
elseif State2==1 then
if not obj then
set_params2() --прописываем данные
State2=2
end
-- проверяем данные
elseif State2==2 then
local ver = ver_params2()
if ver then
State2=3 -- проверка успешна
else
State2=1 -- ошибка, перезапись
end
-- переводим в онлайн
elseif State2==3 then
local sim = alife ()
if sim ~= nil then
sim:set_switch_online (sobj.id, true)
sim:set_switch_offline (sobj.id, false)
end
-- удаляем переменные
SobjID2=nil
State2=nil
end
end
end

Процедура записи параметров.

-- установка параметров
function set_params2()
if not SobjID2 then return end
local sobj = alife():object(SobjID2)
if sobj then
pk = get_netpk(sobj)
if pk:isOk() then
-- читаем пакет
local data = pk:get()
-- устанавливаем данные
ammo_num=15
-- записываем данные
data.upd.ammo_left = ammo_num
data.ammo_left = ammo_num
-- записываем пакет
pk:set(data)
end
end
end

Процедура проверки не представляет особого интереса, обычное чтение и сравнение.

Вроде работает, пачка появляется, "исчезает" и появляется вновь с заданными параметрами. Но, эпизодически объект не возвращается в онлайн. Объект существует, на него можно установить метку, но онлайнового объекта нет.

 

 

Всем, кто может проконсультировать по данному вопросу заранее благодарен.

 

Дополнительная проверка показала, что грубейшая ошибка была допущена как раз в процедуре проверки факта установки желаемых значений количества патронов в пачке и перезапуска установки оных. Как обычно, то, что считаешь несущественным, оказывается главенствующим. Сейчас проблемка устранена, но остается открытым вопрос - почему не всегда данные, прописанные нет-пакетом, нормально применяются и приходится их перезадавать повторно? Где тут "собака порылась"? В неправильном использовании модуля? Некорректной подачи данных в него? Особенности Сталкера?

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

Информация: ТЧ 1.0004, объект спавнится в непосредственной близости от ГГ.

Такой вот вопрос.

 

Внес такие строки в код класса se_outfit (файл se_item.script):

function se_outfit:__init(section) super(section)
self.b_set = false -- это
end

function se_outfit:STATE_Write(packet)
--- и это
if not self.b_set then
local actor = db.actor
if actor and news_manager then
news_manager.send_tip(actor, "STATE_Write для:  "..tostring(self.id), nil, nil, 30000)
end
self.b_set = true
end
----

cse_alife_item_custom_outfit.STATE_Write(self, packet)
end

Ожидал, при спауне броника увидеть сообщение 1 раз - в __init переменную проинициализировали false, в первом вызове STATE_Write установили в true, все - больше сообщение появлятся не должно. Однако при спауне броника в игре, сообщение выдается 2 раза подряд. Почему ? Думал до этого так - при создании игрового объекта, создается объект класса se_outfit, представляющий серверную часть объекта, ну инициализируется там как положено и в дальнейшем существует до выхода из игры или загрузки сохранения. А тут получается что объект класса создается дважды ? Объясните, что к чему !

 

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

boryan67

 

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

Изменено пользователем _Призрак_

Freedom

_Призрак_, что-то не ясна суть твоей реплики ... получился набор слов. понятных наверное только тебе.

 

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

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

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

Напомню, что у серверных объектов существуют методы can_switch_offline и can_switch_online, и, если посмотреть в модах (АМК, SIMBION, ...), то в указанных методах для восстребованных классов объектов в их конструкторах добавлены строки кода, которые как раз и управляют флагами, точнее влияют на процессы перевода объекта в то или иное состояния, не давая сбиваться алгоритму.

Не буду тратить время на расписывание всего и вся - кому нужно, смотрите и думайте для чего в указанных модах добавлены if amk.convert_npc... или if db.is_switchings...

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

 

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

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

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

Привет всем! Вот в ЗП есть 4 хот-кея...Они являются слотами? Можно как-нибудь отследить, что в них находится (аптечка, антирад и т.д.)? Благодарю.

Такой вопрос по биндерам:

создали мы свой класс биндера для какого-нить предмета, прибиндили в ltx-файле, все работает.

В классе биндера объявим переменную (свойство):

 
class "new_binder" (object_binder)
function new_binder:__init(obj) super(obj)
self.b_var1 = false -- наша переменная (свойство)
end

 

Далее, можем получить этот объект класса:

 
local obj = npc:object("ля-ля-ля")
 if obj then
  local obj_bind = obj:binded_object()
  if obj_bind then
local text = "параметр: object:id() - "..tostring(obj_bind.object:id()) -- есть доступ к свойству класса
news_manager.send_tip(db.actor, text, nil, nil, 30000)
  end
 end

А вот как получить эту самую self.b_var1 ? Пробовал obj_bind.b_var1 - вылет.

 

AndreySol, инкапсуляция, скорее всего. Попробуй создать метод-геттер для этого свойства.

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

Scarabay, хоткеи и слоты - совершенно разные сущности.

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

Хоткеев в игре гораздо больше чем 4 (загляни в общее игровое меню), просто ты спрашиваешь про те, которые отвечают за выполнение действий с некими объектами (использовать аптечку, съесть консерву ...).

Т.о. невозможно отследить что находится в хоткеях, Да и собственно, интересующие тебя хоткеи просто напросто, при их активизации, определяют наличие у актора первого подходящего для них объекта и выполняют с ним соотв.действие. Все эти аптечки, антирады, бинты и еда ни в каких слотах не находятся, а (не)имеются у актора в рюкзаке (инвентаре). Требуется определить наличие предметов(?) - итерация по рюкзаку тебе поможет.

 

AndreySol, с чего ты взял, что нечто полученное методом obj:binded_object() является твоим исходным биндером ("new_binder") ? Требуется узнать свойство конкретного биндера - ну так и обращайся к нему, а не неизвестно к чему-то.

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

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

Struck, как сделано в Симбионе там и смотри, не копипастить же кучку скриптов в этот топик ...

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

Раз не получается - значит "не так как тебе надо" делаешь, и или разбирайся самостоятельно или показывай как делаешь.

 

Как делаю - думаю всем понятно, просто передаю (victim, who) в коллбек и все. Я долго рассматривал кучку скриптов и пытался делать по аналогии - не вышло(делал, относительно говоря, копипастом).

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

Хотелось бы как-нибудь наверняка знать...кодов я не прошу :ny_ph34r_1: (пока)

Привет всем! Вот в ЗП есть 4 хот-кея...Они являются слотами? Можно как-нибудь отследить, что в них находится (аптечка, антирад и т.д.)? Благодарю.

 

function item_in_fast_slot(slot_id)
local section = get_console():get_string("slot_"..slot_id)
if section then
return db.actor:object(section)
end
end

Проверяет есть ли в слоте быстрого использования предмет. В функцию передавать номер слота (1-4). На всякий случай добавил проверку наличия секции (вроде предмета в слоте может и не быть?).

 

З.Ы. если нужно конкретный итем проверять, то можно чуть переделать функцию.

Изменено пользователем Shadows
  • Нравится 1

Telegram-канал RayTwitty Space

Подскажите, как можно проверить оружие, нахоядщееся в слоте на наличие конкретного прицела, например wpn_addon_scope_night? Для ЗП.

 

С началом вроде все ясно:

 

if db.actor:item_in_slot(3) ~= nil and db.actor:item_in_slot(3):section() == "wpn_ak74" then
local wpn = db.actor:item_in_slot(3)

 

А вот дальше, как я понимаю стандартными функциями игры здесь не обойтись. Можно ли сделать желаемую проверку с помощью функции Get_Data_Weapon из sm_net_utils от Artos?

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

Stiingray, давайте не засорять топики повторяющимся вопросом (#4338, #4511, #4356) на который пока нет положительного ответа. Вот тут: #4528 мною дан некоторый 'ответ', и с тех пор пока новой информации нет ни от кого.

А некий упомянутый тобою sm_net_utils , мне, например, неизвестен, и если он сделан на базе устаревшего m_net_utils.script, то вообще советую его уже не использовать. Заменой ему идет m_netpk.script (инфу смотри в этом же топике), но и он не даст желаемого результата ... если только в его помощью в параметрах из 'abstract' поковыряться...

 

Struck, а если не копипастить бездумно а подумать? Ведь алгоритм довольно прост! Если имеется информация о "кто убил" (who), то, как уже писАл выше, ничего не мешает проверить "человек ли это" и наличие активного предмета у него в руках. Если таковой предмет имеется - он (предмет) и имеет твой искомый клсид.

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

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

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

Изменено пользователем ColR_iT
Жирным шрифтом писать абсолютно не за чем! Устное предупреждение.

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

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

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

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

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

Войти

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

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

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