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

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

 

 

спавн происходит в метре от актора, и сам объект появляется на земле.

Надо сразу после создания объекта и до выхода его в онлайн обнулить флаг серверного объекта use_ai_location.

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

Спавню НПЦ вот так

 

 

local obj=alife():create("gar_nano",db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id())
local params=netpack_write.read_stalker_params(obj)
params.custom="[logic]\ncfg = scripts\\ep\\gar\\gar_nano.ltx"
params.sid=30198
netpack_write.write_stalker_params(params,obj)

 

 

Потом пытаюсь удалить(через диалог с другим НПЦ)

 

function del()
local sim = alife()
local se_obj = sim:story_object(30198)
if se_obj then
sim:release(se_obj, true)
end
end

 

 

Но ничего не происходит... Где я ошибаюсь?

 

P.S Выводил при спавне SID - через новости на ПДА - всё хорошо. При удалении поставил брейкпойнтый вот так

 

local sim = alife()
local se_obj = alife():story_object(30198)
news_manager.send_tip(db.actor, "stage 1", 0, "default", 10000)
if se_obj then
news_manager.send_tip(db.actor, "stage 2", 0, "default", 10000)
sim:release(se_obj, true)
end

 

 

Доходит лишь до первого...

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

Не соответствует правилам.

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

 

 

обнулить флаг серверного объекта use_ai_location

Вот так пробовал на ТЧ:

s_obj= alife():create("energy_drink", pos, db.actor:level_vertex_id(), db.actor:game_vertex_id())

s_obj:use_ai_locations(false) 
 
Не получается. Вылетает.
Ссылка на комментарий

@CRAZY_STALKER666,

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

 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

 

 

В XE для прописывания SIDа была специальная функция, которая одновременно с назначением и регистрировала SID в реестре

 

XE - что это такое?

И как мне тогда быть? М.б как всегда есть готовые решения? В том те TT2 использовался тот же функционал, что и у меня и не было таких проблем...

Не соответствует правилам.

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

 

 

Вот так пробовал на ТЧ:

На ТЧ нет функции use_ai_locations для установки, только для получения значения. Надо использовать нетпакеты.


XE - что это такое?

X-Ray extensions

  • Спасибо 1
 

Плагины Total Commander для работы с игровыми архивами:

Архиваторный плагин (для работы с одиночным архивом): link1 link2

Системный плагин (для распаковки установленной игры): link1 link2

 

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

@CRAZY_STALKER666
В крайнем случае, если стоит расширение lua, можно и самому организовать свой динамический аналог game_story_ids.
И там хранить типа sid-ов объектов.
Я так делал когда-то.Если интересно.

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

@Nazgool, нет времени изобретать велосипед...

Может кому интересно будет, как я разобрался с проблемой, мало ли... Решил так - просто для этого НПЦ спавн идет через all.spawn, там прописал story_id и тогда всё удаляется прекрасно прекрасно... 

Не соответствует правилам.

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

Этот вариант я тоже тогда рассматривал.
Но если ты будешь спавнить что-то через секцию alife():create("any_section", vector():set(... и т.д. и нужно будет это позже удалять.
Снова for i=1,65534 ?

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

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

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

@CRAZY_STALKER666

Если ты будешь спавнить все объекты, которым необходимо назначать sid через all.spawn, то тогда я ни о чем.

 

Я о том что будет, если будешь спавнить что-то по имени секции динамически, т.е. (например) 

alife():create("stalker", vector():set ... bla-bla

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

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

@Nazgool, Всё, понял. Более не пригодиться задавать sid через скрипт, разве что для рестрикторов, но там проблем таких нету...

Добавлено Dennis_Chikin,

Вот именно для рестрикторов sid вообще не нужен.

Не соответствует правилам.

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

Всем привет. Такую штуку заметил, напрягать стало: когда ГГ в присяде обыскивает труп, тайник или начинает диалог с НПС, он сам поднимается. Вот на видео видно: 

 

. Можно как-то это отключить? А то есть ситуации, где эта фишка очень мешает(например спрятался за что-то, хп на 0, в приседе идешь к трупу, обыскиваешь - а ГГ в этот момент сам встает и открывается для противника получая маслину).

Ссылка на комментарий
Более не пригодиться задавать sid через скрипт
Вот это и плохо.
Ты сам себя ограничиваешь в тех возможностях, которые люди придумали спустя много лет использования box-версии.
 
Вот смотри. Что такое назначение sid-а в исходном варианте?
В all.spawn-е ты создаешь секцию и прописываешь в ней story_id.
Кроме этого тебе нужно  зарегистрировать этот sid в game_story_ids.ltx.
 
А что такое этот game_story_ids? Это жестко фиксированное хранилище, основываясь на котором возможен поиск по alife():story_object(sid), и без которого все твои назначенные sid-ы будут до лампочки.
 
Не знаю как это выглядит, но подозреваю что достаточно запутанно и не очень удобно.
 
До настоящего времени люди старались, делали, и как сказал Чебурашка - "строили, строили и наконец построили".
Построили так, что можно и обойтись без всего того, что ты делаешь по "старой технологии".
 
Что же есть нового, чтобы больше не смотреть на all.spawn, как на спасательный круг в твоём случае? Как можно назначить sid "не отходя от кассы"?
1. В расширение X-Ray extensions есть метод alife():assign_story_id.
2. Есть универсальные хранилища. By Malandrinus например.
2а. Если всё то что сказано выше сложно, то есть самый простой вариант - расширение lua by RvP, о чем я и хотел тебе сказать несколько постов назад.
 
Так вот о самом простом, последнем варианте ( и втором тоже).
Есть стандартное фиксированное хранилище (game_story_ids), а есть возможность сделать такое же, но динамическое хранилище.
 
Теперь подробнее.
Например создаем сталкера:
local sobj = alife():create("stalker", vector():set ... bla-bla 
Пока этот сталкер существует, для него остаются неизменными name и id
sobj:name()
sobj.id
Поэтому можно "запоминать" его либо по name, либо по id.

Имя для динамически заспавненных объектов составляется из имени секции и его id

(Для данного варианта)

sobj:name() == 'stalker' .. sobj.id
Зачем такая сложность, проще запомнить его id, оно же и так уникально.
 
И вот теперь сама фишка того, что люди и придумали.
Ты можешь сохранять id так :
 
1 (приоритетно) . Используя хранилище Malandrinus
local sobj = alife():create("stalker", vector():set ... bla-bla
ogse_unist.set_value('my_sid_kakoj_to_stalker', sobj.id , "number")
2. Используя только расширение by RvP писать эти id в свой файл посредством библиотеки io.

Пишу налету, без всяких там разборок, криво, косо, на эмоциях, но это всё равно должно работать, и для наглядности хватит.
В папке gamedata\config создать файл "my_sid.ini" (например)
В _g.script добавить
my_sid = {}
my_sid_path = getFS():update_path("$game_config$", "my_sid.ini")

function load_my_sid() 
    local sim = alife()
    for line in io.lines(my_sid_path) do
        local k,v = line:match('([%w_]+)=([%w_]+)')
        v = tonumber(v)
        if sim:object(v) then -- для очиски от несуществующих на всяк
            my_sid[k] = v
        end
    end
end

function save_my_sid()
    local sim = alife()
    local f = io.open(my_sid_path, 'w')
    for k, v in pairs(my_sid) do
        if sim:object(v) then -- для очиски от несуществующих на всяк
            f:write(k..'='..v..'\n')
        end
    end
    f:flush()
    f:close()
end
Для запуска пока достаточно и в bind_stalker.script после
function actor_binder:net_spawn(data)
пишешь
load_my_sid()
и после
function actor_binder:net_destroy()
добавляешь
save_my_sid()
 
И наконец само использование где-то в скриптах :
local sobj = alife():create("stalker", vector():set ... bla-bla
my_sid.my_sid_kakoj_to_stalker = sobj.id

Теперь в любой момент, ты можешь не перебирая for i=1,65534 которое может не лагать только на мощных системах, определить id своего объекта сталкера
 
Либо по первому варианту
local id_my_stalker = ogse_unist.get_value('my_sid_kakoj_to_stalker'  , 0  , "number")

Либо по второму

local id_my_stalker = my_sid.my_sid_kakoj_to_stalker
И найти сам объект
local obj = alife():object(id_my_stalker) -- по прочтённому id
А теперь удаляй или что ты с ним хочешь сделать.
Изменено пользователем Nazgool
  • Спасибо 1
  • Полезно 3
Ссылка на комментарий

@Nazgool,

Фууух. Насилу собрала массив

То что зачистили одно поле ещё не значит что буду валить всё то, что так тяжело строила.

Ты сам как думаешь, такое поведение - нормально? :)

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

Мракобесие короче. Создавалось чтобы поощрить лень программиста, а я почитав это, дико затосковал по языкам где надо обязательно заранее объявить каждую переменную и указать ее тип...

И не дай бог ты указал тип integer и стал туда записывать результат деления - будешь обруган компилятором самыми последними программистскими словами. Настоящее программирование - оно там :) а Луа это пардон, детский сад, в моем представлении.

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

На самом деле всё не так уж и плохо.
Оператор '#' прекрасно работает с "правильными" массивами.
Осталось только нам научиться работать с массивами также правильно :)
table.insert и table.remove сделаны специально для этого и должны помочь.
 
А поведение оператора '#' и его будущее в других случаях до сих пор не так однозначно.
В PiL3 об этом написано в разделе 3.5. Оператор длины
Особенно мне "нравиться" фраза самого автора:
"поэтому большую часть времени оператор длины безопасен для использования"
Как тебе такое? :):(
Изменено пользователем Nazgool
Ссылка на комментарий

Да, в 5.1 не хватает этого метода.

Впрочем можно написать функцию типа :

function table.len(t)
	local n = 0
	for _ in ipairs(t) do
		n = n + 1
	end
	return n
end

А заодно не хватает __pairs и __ipairs. Да и goto, при аккуратном использовании, помогает крепко сокращать код  :)

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

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

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

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

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

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

Войти

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

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

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