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

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

abramcumner

Вообще-то способ с прописыванием сида в on_before_register давно и успешно у меня работает

Если не секрет, как Вы прописываете story_id. Используете self.m_story_id ?

Ссылка на комментарий
Если не секрет, как Вы прописываете story_id. Используете self.m_story_id ?

m_story_id - свойство только для чтения. Прописываю также через нет-пакеты. Только делаю это в se_stalker:on_before_register

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

Столкнулся тут с непонятной проблемой.

Имеем - 4 свои таблицы, в которых хранятся id онлайн-объектов четырех типов. неписи, монстры, аномалии, артефакты. биндеры аномалий и артефактов у меня сделаны.

local dt_stalkers = {}
local dt_monsters = {}
local dt_anomalys = {}
local dt_artefacts = {}

function add_stalker_data(id)
    table.insert(dt_stalkers, id)
end

function del_stalker_data(id)
    local a = 1
    local b = nil
    while dt_stalkers[a] ~= nil do
    if dt_stalkers[a] == id then b = a end
    a = a + 1
    end
    if b then table.remove(dt_stalkers, b) 
    else log("hdetect.sript:message:Error_deletestalker"..tostring(id)) end
end

function add_monster_data(id)
    table.insert(dt_monsters, id)
end

function del_monster_data(id)
    local a = 1
    local b = nil
    while dt_monsters[a] ~= nil do
    if dt_monsters[a] == id then b = a end
    a = a + 1
    end
    if b then table.remove(dt_monsters, b) 
    else log("hdetect.sript:message:Error_deletemonster"..tostring(id)) end
end

function add_anomaly_data(id)
    table.insert(dt_anomalys, id)
end

function del_anomaly_data(id)
    local a = 1
    local b = nil
    while dt_anomalys[a] ~= nil do
    if dt_anomalys[a] == id then b = a end
    a = a + 1
    end
    if b then table.remove(dt_anomalys, b) 
    else log("hdetect.sript:message:Error_deleteAnomaly"..tostring(id)) end
end

function add_artefact_data(id)
    table.insert(dt_artefacts, id)
end

function del_artefact_data(id)
    local a = 1
    local b = nil
    while dt_artefacts[a] ~= nil do
    if dt_artefacts[a] == id then b = a end
    a = a + 1
    end
    if b then table.remove(dt_artefacts, b) 
    else log("hdetect.sript:message:Error_deleteartefact"..tostring(id)) end
end

 

 

функции add_XXX_data вызываются из net_spawn соответствующих объектов, функции del_XXX_data из net_destroy

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

И при завершении игры/уходе гг с уровня на другой, в лог пачками валятся сообщения Error_deletestalker, т.е. запросы на удаление из таблицы неписей, которые в таблице не числятся. Такая ситуация только с неписями, а вот с аномалиями, артами и монстрами ни разу таких странностей не было.

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

Перебором всех 65к объектов для их отлова заниматься не хочется...

 

игра ТЧ 1,0004, амк-скриптов в составе мода практически нет, для вывода в лог используется модуль от RvP

Изменено пользователем 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.

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

abramcumner

Прописываю также через нет-пакеты. Только делаю это в se_stalker:on_before_register

Каким образом ? Я пробовал нижеприведенный код - в on_register() он нормально работает (только надо офф\он-лайн или save\load), а в on_before_register нет, не проходит проверка "if ser_obj then".

function se_stalker:on_before_register()
    local ser_obj = alife():object(self.id)
    if ser_obj then
        local pk = m_netpk.get(ser_obj) -- запрос нет-пакета
        if pk and pk:isOk() then
            local data = pk:get() -- читаем данные из нет-пакета
            if data then
                if data.story_id ~= 93 then
                    data.story_id = 93
                    pk:set(data)
                end
            end
        end
    end

    self:fill_exclusives()
end

 

Получается в on_before_register серверный объект еще не зарегистрирован, а он нужен для получения нет-пакета. Модуль m_netpk - авторства Artos'а.

Подскажите, что не так ?

 

kratos888

зачем мне ставить отметку на непися через другие функции, когда она ставится во время задания?

Не зачем. Правильнее будет присвоить НПСу story_id, вот только как это сделать по-умнее я и сам пытаюсь узнать.

Изменено пользователем AndreySol
Ссылка на комментарий

AndreySol,

function se_stalker:on_before_register()
    local ser_obj = alife():object(self.id)

se_stalker -это же и есть тот серверный объект, который ты получаешь:) смело используй self вместо ser_obj.

Ну и как правильно заметил, в on_before_register объект еще не зарегистрирован.

 

Кстати такой код всем подряд будет писать сид 93. Лучше уж перед alife():create установи глобальный флажок в 93, в on_before_register проверь флажок на нил,установи сид и флажок в nil.

Изменено пользователем abramcumner
Ссылка на комментарий

abramcumner

Насчет self я чет и не подумал, а ведь так оно и есть.

Кстати такой код всем подряд будет писать сид 93

Это было просто для примера.

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

Здравствуйте комрады.

У меня дурной вопрос.

Кто-нить пробовал спавнить фантомов на апдейте гуи?

 

Вот на этом:

C++ class CUIScriptWnd : CUIDialogWnd,DLL_Pure {
CUIScriptWnd ();
function Update();

Все прекрасно работает без спавна.

Как только пытаюсь заспавнить фантома получаю вылет без лога.

 

 

 

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

Перечитал шапку и испугался :o

Решил что недурно будет добавить кусок кода.

 

local time1 = 0
local time2 = 1
function ra_phantoms:Update()
CUIScriptWnd.Update(self)
time2 = time_global()
if time2>time1 then
level.spawn_phantom(vector():set( 0,0,0))
time1 = time2+2000
end

 

 

Изменено пользователем Кактус_523
МЯСО!
Ссылка на комментарий

Помогите мне, пожалуйста, столкнулся со следующей проблемой, когда я создаю скриптовые окна, и кнопки на них, для замеров координат в текстурах пользуюсь программой paint.net.Записываю левый верхний угол, потом размер текстуры, но происходит следующая непонятная вещь:либо кнопка или текстура находится не в том месте, либо она обрезана.А при указании текстуры в конфиге

<ui_texture>

     <file_name>ui\notebook\password</file_name>

    
    <texture id="ui_button_okej_e" x="63" y="109" width="73" height="20" />
    <texture id="ui_button_okej_t" x="63" y="109" width="73" height="20" />
    <texture id="ui_button_okej_d" x="63" y="109" width="73" height="20" />
    <texture id="ui_button_okej_h" x="63" y="109" width="73" height="20" />
    <texture id="ui_button_chn_e" x="152" y="109" width="74" height="21" />
    <texture id="ui_button_chn_t" x="152" y="109" width="74" height="21" />
    <texture id="ui_button_chn_d" x="152" y="109" width="74" height="21" />
    <texture id="ui_button_chn_h" x="152" y="109" width="74" height="21" />
    <texture id="ui_button_cls_e" x="235" y="0" width="50" height="21" />
   <texture id="ui_button_cls_t" x="235" y="0" width="50" height="21" />
   <texture id="ui_button_cls_d" x="235" y="0" width="50" height="21" />
   <texture id="ui_button_cls_h" x="235" y="0" width="50" height="21" />
</ui_texture>

 

Отображается на кнопке, правильного размера, лишь растянутый кусочек самой текстуры, координаты все снимаю правильно, никто с подобным не стакивался?Как лечит?

self.btn_cancel = CUI3tButton()
    self.btn_cancel:Init(537,350,74,21)
    self.btn_cancel:SetText("Cancel")
      self.btn_cancel:SetTextColor(255,216,186,140)
    self.btn_cancel:SetTextAlign(CGameFont.alCenter)
    self.btn_cancel:InitTexture("ui_button_chn")
    self:Register(self.btn_cancel,"btn_cancel")
      self.back:AttachChild(self.btn_cancel)
    self:AddCallback("btn_cancel",ui_events.BUTTON_DOWN,self.ClickBtnCancel,self)

 

 

 

 

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

Хм.

Я вот так кнопки делаю:

 

LUA:

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

btn_viewscreen_cont = xml:InitButton("btn_viewscreen", self)
self:Register(btn_viewscreen_cont,"btn_viewscreen")
self:AddCallback("btn_viewscreen", ui_events.BUTTON_CLICKED, self.show_screenviewer, self)

 

XML:

<btn_EditItm x="695" y="585" width="150" height="29">
    <texture>ui_ra_button_150</texture>
    <text font="letterica18" a="255" r="215" g="187" b="139">ui_ra_changemap</text>
</btn_EditItm>

 

 

У меня немного другая кнопка.

Смени на свою если нужно.

 

P.S.: Код для ЧН, но скорей всего пойдет и для всего остального.

Изменено пользователем Кактус_523
МЯСО!
Ссылка на комментарий

Для ТЧ, делаю девайс, он уже работает, но хотелось бы добавить ключ, который позволит им пользоваться. (вызывать диалоговое окно). Подскажите ПЛЗ как, или хот намекните. СПС.

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

ins33

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

Что имеется в виду ?

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

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

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

AndreySol, Да вариант с ключем, как с предметом.

 

local key = db.actor:object("key") --проверка на ключ

if note and type(note) == "number" then

if not level.object_by_id(note) then

level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню

 

Ключа нет, а диалоговое окно открывается.

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

ins33, в твоём коде нет ни капли логики. Сперва ты присвоил переменной key объект с секцией "key", который находится у гг в инвентаре, если его нет, то присвоится nil. Потом проверяешь какую-то переменную note, которая возможно и описана у тебя выше по коду, но тут не понятно что в ней есть. В любом случае, у тебя сейчас никак не проверяется наличие ключа. Я думаю, что нужно сделать как-то так

local key = db.actor:object("key")
if key then --проверка на ключ
      level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню
end

 

 

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

Shredder, Прописал так:

 

if note and type(note) == "number" then

if not level.object_by_id(note) then

local key = db.actor:object("key")

if key then --проверка на ключ

level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню

alife():create("repair_kit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())

 

Вылет по бинду.

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

Ты покажи всю функцию, мне всё равно не понятно что такое note и что в ней содержится.

P.S. И вообще ты в курсе что каждый блок if ... then должен иметь закрывающий end?

Изменено пользователем Shredder
Ссылка на комментарий

 

Shredder,

local note = nil

 

function use_repkit()

 

if note and type(note) == "number" then

if not level.object_by_id(note) then

local key = db.actor:object("key")

if key then --проверка на ключ

level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню

alife():create("repair_kit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())

end

note = nil

end

if note and type(note) == "userdata" then

note = note:id()

else

note = nil

end

end

Изменено пользователем ins33
Ссылка на комментарий

ins33, ты вообще сам понимаешь, что ты пишешь? Сразу видно, что ты вообще ничего не смыслишь в программировании, так закаким ты туда полез?

function use_repkit()
   local key = db.actor:object("key")
   if key then --проверка на ключ
      level.start_stop_menu(interfase.ui_repair(), true) --запускаем меню
      alife():create("repair_kit", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
   end
end

 

 

Изменено пользователем Shredder
Ссылка на комментарий

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

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

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

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

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

Войти

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

Войти
×
×
  • Создать...