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

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

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) На базе модифицированного движка OGSR Engine.

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

AMD Ryzen 9 7950X (16 ядер, 32 потока, 5.75 ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

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

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
Ссылка на комментарий

Подскажите, как можно проверить оружие, нахоядщееся в слоте на наличие конкретного прицела, например 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 пользователей

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