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

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

@Simonov50, метод работает именно так - set(x, y, x+width, y+height).

Т.е. если сначала ширина активной области окна была 420-0 = 420, то потом стала 420-200 = 220. И всё, что уехало правее 420 - уже не активно.

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

@naxac

Прости засранца, я был сильно неправ (задолбали собственные ошибки).

Сергей. :blush:


 

 

метод работает именно так - set(x, y, x+width, y+height).

 

Спасибо ! Понял всё. У меня минимум 3 ошибки:
1. Неверно выбрал метод для сдвига.
2. В моём "поминальнике" ошибка (width, height вместо x2, y2)
3. Не перепроверив незаслуженно обидел человека.

 

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

(непонятки прономерованы в спойлере)

 


class "lbx_kv" (CUIListItemEx)  -- Скриптовой лист-бокс, + к основному
function lbx_kv:__init() super()
self.text = CUIStatic()   -- имя только .text (фишка, игра слов)
self:AttachChild(self.text)  -- дополняем класс
-- класс "висит в воздухе", не связан с экраном (и с XML)
end

class "kovir" (CUIScriptWnd)
-- bla_bla --

self.lb_kv = xml:InitList("lbx_wnd_kv:list",self) -- основной лист-бокс
self:Register(self.lb_kv, "lbox_kv")   -- для калбака
-----

function add_string(name) записываем строку
local _itm = lbx_kv()   -- указатель на скрипт.класс
_itm.text:SetText(name)   -- пишем name в доп.статик !!!

1)Как это через статик добраться до класса (с другими методами !) ???

self.lb_kv:AddItem(_itm)  -- пишем в основной лист kovir.lb_kv

2) ??? что пишем ???  в основной лист (ему нужен тип "string")
end

-- Читаем строку, именно здесь важно имя  .text  (фишка, игра слов)
--  индекс берём с основного листа, а текст из дополнительного статика

name = self.lb_kv:GetItem(index).text:GetText() ????

3) ???  здесь self== kovir:    но!!!  .text из другого класса!!! == lbx_kv:

И это всё работает, но как совершенно не понятно.
Это текст уже из моего скрипта, принцип прямо заимствован из скриптов
для Спавен мода Повелитель Зоны. Нужен был работающий лист-бокс.

 

 

Ссылка на комментарий
@Simonov50, доступ к экземпляру другого класса ты получаешь через self.lb_kv:GetItem(item_index). Точнее, этим методом ты и получаешь экземпляр класса lbx_kv, и далее можешь делать с ним всё, что угодно его методами.

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

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

Но может есть другие варианты?

По хорошему, на бы в самом движке перед созданием биндера проверять, а существует ли такой файл\функция вообще. Но если движок не вариант, значит на выходе в онлайн читаем секцию у объекта, в этой секции читаем параметр script_binding, разбиваем строку на [файл].[функция], далее известными способами проверяем наличие и вылетам если чего-то не хватает.

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

Изменено пользователем Shadows
  • Согласен 1
Ссылка на комментарий

 

 

значит на выходе в онлайн читаем секцию у объекта, в этой секции читаем параметр script_binding, разбиваем строку на [файл].[функция], далее известными способами проверяем наличие и вылетам если чего-то не хватает.

Ну тогда наверное проще будет:

local obj_bind = obj:binded_object()
if obj_bind then ....
Если биндер смогли получить - значит все ок с файлом\ф-цией ?
Ссылка на комментарий
@UnLoaded, не у всех объектов, выходящих в онлайн, должен быть биндер. Без чтения конфига не обойтись.
  • Полезно 1
Ссылка на комментарий

 

 

значит на выходе в онлайн читаем секцию у объекта

А как мы поймаем выход в онлайн, если у объекта не работает биндер?

binder:net_spawn() в таком случае не вызывается тоже.

 

Вообще конечно да. по идее такие вещи должны в движке проверяться, и тот факт что этого нет, это очередной косяк его разрабов.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

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

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

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

@Zander_driver, с помощью level.client_spawn_manager():add( object_id, 0, spawn_callback ). Колбек на выход в онлайн вызывается после возможного binder:net_spawn(), поэтому на момент вызова уже будет известно, забинден ли объект.

Проверка в движке всё же есть, но без обрушения игры.

 

 

	luabind::functor<void>	lua_function;
	if (!ai().script_engine().functor(pSettings->r_string(section,"script_binding"),lua_function)) {
		ai().script_engine().script_log	(ScriptStorage::eLuaMessageTypeError,"function %s is not loaded!",pSettings->r_string(section,"script_binding"));
		return;
	} 

 

 

 

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

Ещё такой вариант - перебрать вообще все секции и посмотреть у них параметры биндинга, ну и потом проверить наличие всего необходимого.

 

Другими словами, отладка ещё до выхода объектов в онлайн.

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

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

 

 

 

Проверка в движке всё же есть, но без обрушения игры.

Это какая версия движка? Я что-то не видел у себя никаких сообщений в лог, когда у меня в bind_physic_object.script синтаксическая ошибка оказалась. А на него ведь сотни и тысячи объектов на любой локации вешаются.

 

 

level.client_spawn_manager():add( object_id, 0, spawn_callback ).

Чтобы так проверить все объекты игры, тоже вообще-то перебор надо устраивать.

тогда уж проще так

while a < 65535 do
    local obj = alife():object(a) -- перебираем все объекты
    if obj then
        local section = obj:section_name() -- берем их секцию
        if ltx:line_exist(section, "script_binding") then -- смотрим нужен ли ему вообще биндер
            local binder_x = ltx:r_string(section, "script_binding") -- читаем что он хочет
            --- далее разбираем на файл.функция и проверяем что все нужное существует.
        end
    end
end
Изменено пользователем Zander_driver

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

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

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

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

Ну про перебор уже говорилось ранее.

Ранее говорилось про перебор объектов, я же написал про перебор _секций_. Секций всегда будет меньше, следовательно меньше нагрузка + их нельзя изменять\добавлять без перезагрузки игры.

 

Чтобы так проверить все объекты игры, тоже вообще-то перебор надо устраивать. тогда уж проще так

Ну проверишь в начале уровня, дальше что? Если какой-нибудь новый объект в игре появится, снова проверка? На апдейте будешь делать?)) Изменено пользователем Shadows
Ссылка на комментарий

 

 

Ранее говорилось про перебор объектов, я же написал про перебор _секций_

Кстати а как получить список всех существующих секций? Чтобы перебирать.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

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

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

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

Подскажите скрипт динамической выдачи предметов? Платформа ТЧ!

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

Есть скрипт:

 

 

function main ()
local r, r2 = math.random(0,4), math.random(0,2)
if r == 0 then
alife():create("wpn_bm16",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
for a=1,3 do alife():create("ammo_12x70_buck",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end
elseif r == 1 then
alife():create("wpn_mp5",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
for a=1,2 do alife():create("ammo_9x19_fmj",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end
elseif r == 2 then
alife():create("wpn_colt1911",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
for a=1,3 do alife():create("ammo_11.43x23_fmj",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end
elseif r == 3 then
alife():create("wpn_pm",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
for a=1,2 do alife():create("ammo_9x18_fmj",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end
elseif r == 4 then
alife():create("wpn_pb",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
for a=1,3 do alife():create("ammo_9x18_fmj",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end
end
if r2 == 0 then
alife():create("antirad",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
for a=1,3 do alife():create("medkit",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end
elseif r2 == 1 then
alife():create("kolbasa",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
for a=1,3 do alife():create("bandage",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end
elseif r2 == 2 then
alife():create("bread",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
for a=1,3 do alife():create("conserva",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) end
end
alife():create("wpn_knife",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
alife():create("grenade_rgd5",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
end

 

 

Но это совсем не то что я хочу.

Изменено пользователем NL-Vincenz

NL-Vincenz.gif

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

@NL-Vincenz, Это не скрипт, это ужас...

 

Почему бы не использовать что-нибудь вроде такого?

function mmm()
    local items = {
        --- список итемов которые могут быть заспавнены
        kolbasa = {30, 5},    --- первое число - вероятность в процентах
        wpn_pm = {50, 1},    --- второе - максимально возможное количество
        bandage = {80, 10}
    }
    local pos = db.actor:position()
    local lv = db.actor:level_vertex_id()
    local gv = db.actor:game_vertex_id()
    for k, v in pairs(items) do
        if math.random(0, 100) < v[1] then
            local count = 1
            if v[2] > 1 then count = math.random(1, v[2]) end
            local spawned = 0
            while spawned < count do
                alife():create(k, pos, lv, gv, 0)
            spawned = spawned + 1
            end
        end
    end
end

 

 

  • Спасибо 1
  • Согласен 1

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

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

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

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

Кстати а как получить список всех существующих секций? Чтобы перебирать.

Так просто наверно не получить.

 

Я думаю, надо пропарсить system.ltx и все его вложения, найти все строки, которые обозначают секцию (по заданному шаблону), после чего, найденную секцию на всякий случай проверить при помощи section_exist, ну и добавить её в табличку. Далее, пройтись по этой табличке и посмотреть наличие нужного параметра в секциях.

 

Правда, для чтения файла наверно понадобятся расширения RvP (io namespace).

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

Подскажите пожалуйста, как отловить в кого стреляет\выстрелил ГГ? 

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

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

Если надо именно попадание - то можно вообще обойтись хит-колбеком неписей, мутантов, и тех кто тебе еще понадобится (если понадобится). Просто проверить кто нанес хит, и все.

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

local cone_cmax = 0.8 * 0.999
local string_find, string_sub, string_match = string.find, string.sub, string.match
local table_insert, table_remove = table.insert, table.remove
local math_floor, math_random = math.floor, math.random
local lobj_by_id = level.object_by_id
local sim, gg = alife(), game_graph()
local dev = device()
local items_by_id, items_t, items_n = {}, {}, 0    -- найденые "бросаемые" предметы

function validate_capture_obj(tartgergt)
    if IsStalker(tartgergt) and not tartgergt:alive() then return true
    elseif IsMonster(tartgergt) and not tartgergt:alive() then return true
    elseif get_clsid(tartgergt) == clsid.inventory_box then return true
    else return false end
end

function capture( cone, dist )    -- (cos угла захвата, дистанция)
    if dist then dist = dist + 0.5    --  смещение конуса захвата за спину актора
    else dist = 3.5
    end
    local dist_min = 1.2 * dist
    local cone_max
    if cone then cone_max = 0.8 * cone
    else cone, cone_max = 0.999, cone_cmax
    end

    local id, v, rvec, r, cos_a, item
    local n
--    scan_n = scan_n + 800

    --if scan_n >= 65535 then scan_n, n = 1, 800 end    -- перебор
    --for i = n, scan_n do    -- плавный апдейт (поиск новых предметов)
    local i = 1
    while i < 65535 do
        --- а у меня не плавный, т.к. это не пушка а гуи интерфейс. Если игрок полез всякие окошки открывать, значит бегать-прыгать он не собирается.
        --- и лучше хоть подвесить игру, но найти объект сразу
        v = lobj_by_id( i )
        if v and (not items_by_id[i]) and events.validate_capture_obj(v) then
            table_insert( items_t, i )
            items_n = items_n + 1    -- предмет подходит
            items_by_id[i] = true    -- добавляем
    end    --end
    i = i + 1 end
    n = 1
    dist = dist * 1.1
    local cam_v = dev.cam_pos:mad( dev.cam_dir, -2.0 )
    while items_n >= n do
        id = items_t[n]
    
            v = lobj_by_id( id )
            if v --[[and v:get_physics_shell() ]]then    -- проверяем, что предмет ни куда не делся
                n = n + 1    -- следующий элемент
                rvec = v:center():sub( cam_v )
                r = rvec:magnitude()
                if r < dist and r >= 3 then -- в радиусе захвата, но перед актором
                    cos_a = rvec:dotproduct( dev.cam_dir ) / r
                    if cone < cos_a then -- попадает в конус прицеливания
                        if ( cos_a >= cone_max ) and ( r < dist_min ) then
                            -- если предмет хотя бы не дальше от оси прицеливания,
                            -- но ближе по расстоянию, чем уже выбранный
                            dist_min, cone_max = r, cos_a
                            item, target = v, id
                end    end    end
            else    -- убирать из таблицы
                items_by_id[id] = nil
                table_remove( items_t, n )
                items_n = items_n - 1
    end    end
    return item
end

 

 

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


 

 

Так просто наверно не получить.

Вдвоем с Дезертиром как-то раз пробовали подсчитать, сколько времени займет поиск существующих секций, если просто прогнать все возможные комбинации символов с длинной строки до 30, через ltx:section exist. Не помню уже точно что там получилось, но что-то близкое к годам.

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

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

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

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

@Zander_driver, а причем тут

 

прогнать все возможные комбинации символов с длинной строки до 30, через ltx:section exist

?

 

Я построчное чтение файла предлагал вообще-то.

 

поиск объектов на линии прицеливания или около нее

Проще поставить xray-ex и заюзать трассировку лучей RayPick. Изменено пользователем Shadows
Ссылка на комментарий

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

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

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

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

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

Войти

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

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

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

AMK-Team.ru

×
×
  • Создать...