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

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

Я заспавнил мутанта с логикой спавнер:

[500056]

; cse_abstract properties

section_name = m_controller_normal

name = jup_kontrol

position = 43.827217102051,23.94677734375,-175.71482849121

direction = 0,0,0

 

; cse_alife_object properties

game_vertex_id = 3727

distance = 0

level_vertex_id = 789591

object_flags = 0xfffffffd

custom_data = <<END

[smart_terrains]

none = true

 

[logic]

active = mob_walker

on_death = mob_death

 

[spawner]

cond = {+controler_qvest}

 

[mob_walker]

path_look = defolt_look

path_walk = jup_kontra_walk

 

[mob_death]

on_info = %+kontroler_trup%

END

story_id = 500010

 

; cse_visual properties

visual_name = monsters\kontroler\kontroler

 

; cse_alife_creature_abstract properties

g_team = 0

g_squad = 1

g_group = 2

health = 1

dynamic_out_restrictions =

dynamic_in_restrictions =

 

upd:health = 1

upd:timestamp = 0

upd:creature_flags = 0

upd:position = 43.827217102051,23.94677734375,-175.71482849121

upd:o_model = 0

upd:o_torso = 0,0,0

upd:g_team = 0

upd:g_squad = 1

upd:g_group = 2

 

; cse_alife_monster_abstract properties

 

upd:next_game_vertex_id = 65535

upd:prev_game_vertex_id = 65535

upd:distance_from_point = 0

upd:distance_to_point = 0

 

; cse_ph_skeleton properties

 

; cse_alife_monster_base properties

 

; se_monster properties

 

 

 

Но при выдаче определенного инфопоршня мутант не спавнится? В чём дело?

Создаю глобальный мод с новыми локациямЭ

Ссылка на комментарий
Приглянись, например, к system_ini() иль ini_file(string)
Пригляделся. Да, есть основное для парсинга.

Жаль, не вижу в описании класса ini_file ничего, чтоб получить\перебрать все секции ini-файла. Могло-бы пригодится.

 

И еще - класс ini_file работает только с ltx-файлами или с xml то-же ?

Ссылка на комментарий
strelok200, дык он сразу в оффлайн уводится, скорее всего. Для того, чтобы монстр заспавнился по заданным координатам с помощью spawner, ему надо поставить флажок no_move_in_offline и отключить can_switch_offline. Или в СДК, или в object_flags. Изменено пользователем KD87
Ссылка на комментарий

AndreySol

А зачем искать все секции? в вышепрозвучавшем вопросе вроде бы этого не требовалось

 

для произвольного инвентарного объекта:

function get_icon_coord(obj) --- передавать клиентский объект *game_object
if obj == nil then return nil end
local section = obj:section()
local ltx = system_ini()
local x = ltx:r_float(section, "inv_grid_x")
local y = ltx:r_float(section, "inv_grid_y")
local xsize = ltx:r_float(section, "inv_grid_width")
local ysize = ltx:r_float(section, "inv_grid_height")
return {x, y, xsize, ysize}
end

 

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

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на 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.

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

KD87, наверное для пояснение для strelok200 требуется чуть попроще:

В секции спавна его объекта параметр object_flags = 0xfffffffd говорит о том, что сброшен флаг flSwitchOnline и наоборот взведен flSwitchOffline. Т.о. его объект будучи заспавненым имеет возможность быть уведенным в оффлайн и не имеет возможности появиться в онлайне.

 

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

 

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

Ну а то, что универсальность бывает и вредна (более ресурсоемка и медлительнее) - наверное не стОит упоминать ...

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

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

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

local weapons_ini = ini_file("weapons\\weapons.ltx")

на эту строку ругается так:

Expression : fatal error

Function : CInifile::r_section

File : E:\stalker\sources\trunk\xrCore\Xr_ini.cpp

Line : 342

Description : <no expression>

Arguments : Can't open section 'identity_immunities'

 

Что это означает ?

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

AndreySol

В файле weapons.ltx некоторые секции наследуют данные из секции [identity_immunities], которая находится в defines.ltx, но функцией

ini_file("weapons\\weapons.ltx") ты по сути "отделяешь" этот файл от остальных, вот и не может игра при парсинге этого файла найти нужной секции.

 

Для таких вещей используй system_ini()

Тоесть просто:

 

local weapons_ini = system_ini()

 

Он вернёт тебе инфу из всех файлов, подключённых через system.ltx, в том числе и из этого.

 

А ini_file() стоит использовать только когда ты работаешь с файлами, которые не подключены к оригинальной игре через sytem.ltx

 

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

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

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

AndreySol, это банально означает, что читая 'книгу' НЕ с начала, не стОит удивляться , что будут встречаться непрочитанные ранее куски информации ... Ну а если удивляет - поиск по указанному ненайденному куску (о чем говорит лог) должно подсказать где же написано непрочитанное.

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

 

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

*Shoker*: ini_file() стоит использовать только когда ты работаешь с файлами, которые не подключены к оригинальной игре через sytem.ltx

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

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

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

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

А кто нибудь пробовал глубоко работать с нет-пакетами игрока? Возможно ли с помощью них например заменить у игрока xml-профиль, чтобы у него сменилось имя и иконка? И какие здесь есть тонкости.

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

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

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

Подскажите пожалуйста, есть ли в LUA функция равносильная функции sleep(время) в С\С++? Или как сделать так, что бы какое-либо действие происходило через указанное время?

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

Ммм, в оригинале кажется нет, а может ещё осталось, пусть уточнит кто нить...

Была функция wait() (описана в _G.script), которая ставила указанный скрипт\функцию (?) на "паузу" на указанное время.

Но вроде бы последний раз когда я её пытался использовать - игра у меня вылетела.

 

Вообще же можешь использовать таймеры АМК, они сейчас есть почти в любом крупном моде, обычно в скрипте amk.script

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

Ищи по ключевым словам: __do_timer_action, has_g_timer, start_timer_g (?) ...

 

Таймеры также почти наверняка найдёшь в любом моде на спальный мешок.

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

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

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

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

Смотрел в AMK CoP в файле амк но ничего похожего не нашел.

использовал wait(5000), вылет:

Expression    : !m_error_code
Function      : raii_guard::~raii_guard
File          : D:\prog_repository\sources\trunk\xrServerEntities\script_storage.cpp
Line          : 748
Description   : attempt to yield across metamethod/C-call boundary

Как правильно использовать эту функцию в ЗП?

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

Amicron, так же как и везде в Lua - не в главном потоке, а в созданной тобой нити. Про работу с нитями в теме по Lua Gun12 писал

 

AndreySol, открываем справочник и смотрим как проинитить текстуру

Vita sine libertate, nihil

Vita sine litteris - mors est

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

Вот ещё что хотел уточнить: в экспортированных в LUA UI элементах можно создать "Список со вложенным списком"?

Тоесть как в ТЧшной энциклопедии. Есть ListBox, и там идёт название групп, при щёлканье на группу, список раскрывается, и там появляются новые элементы.

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

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

Ссылка на комментарий
*Shoker*: А кто нибудь пробовал глубоко работать с нет-пакетами игрока? Возможно ли с помощью них например заменить у игрока xml-профиль, чтобы у него сменилось имя и иконка? И какие здесь есть тонкости.

Не стОит делать из нет-пакетов некую панацею или искать глубину. Ну а тонкость тут конечно же есть. ;-)

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

Ну а так как собственно актор при его спавне в игру 'живет' именно в онлайне и именно с клиентстким объектом общается/управляет игрок - какой-либо подпитки от сервера актор не получает. Вся игра строится вокруг именно клиентского объекта актора и только в сэйвах используются сохранения. Ну а чтобы подменить некий параметр с сервера для клиентского актора - хотел бы я посмотреть как ты будешь уводить актора в оффлайн ... ;-)

 

И что-то не первый раз вижу как всплывает упоминание _g.wait() в контексте попыток его прямого использования.

Обе функции, которые имеются в _g.script: wait() и wait_game() - это куски конструктора, который может быть использован (см. выше упомянутые ссылки на coroutine), и не более. Т.е. без дополнительной 'обвязки' использование указанных функций и бессмывсленно и только фатальные ошибки вызывает.

Кому интересно как можно было бы использовать -> см. спойлер:[spoiler=использование 'wait' (один из упрощенных вариантов)]Задаем где-нибудь в своем скрипте переменную периода ожидания (ms) и объявляем/создаем свою подпрограмму-таймер ожидания на базе имеющейся _g.wait:

local iTimeToWait = 5000 --/ ms
local CoTimeWait = coroutine.create(wait)

Далее, в каком-либо апдейте (актора иль др.) вставляем код вызова своей функции таймера:

function MyTimer() --/ вызов из апдейера
  if iTimeToWait then
    if not CoTimeWait then --/ если нет сопрограммы (для повторных запусков)
      CoTimeWait = coroutine.create(wait) --/ создаем ее
    end
    local sStatus = coroutine.status(CoTimeWait) --/ статус сопрограммы
    if sStatus == 'suspended' then --/ (при)остановлена?
      local bFlg,Result = coroutine.resume(CoTimeWait, iTimeToWait) --/ (пере)запуск сопрограммы
      if not bFlg then --/ нештатное завершение?
        log("OnUpdate:%s:[%s]", tostring(Result), "Error!")
      end
    elseif sStatus == "dead" then --/ завершена?
      log("OnUpdate:Done!") --/> событие окончания тайм-аута!
      iTimeToWait = nil
      CoTimeWait = nil
    end
  end
end

Соответственно функция wait позволяет организовать таймер на базе реального времени, а wait_game - с учетом игрового времени (+timefactor)/

 

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

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

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

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

Artos

Ну, я расчитывал на обычный save\load. Изменить параметры игрока во время загрузки уровня, или же перед этим.

Да и игрок то наверно с сервером как то общается. Не зря же у GSC есть скрипт actor_proxy.script

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

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

Ссылка на комментарий
*Shoker*, а взглянув в упомянутый actor_proxy.script - не следует ли вывод, что он практически только для фактов создания и уничтожения объекта 'актор' и работы с инфопоршнями.

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

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

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

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

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

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

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

Войти

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

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

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