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

Скриптование


Svoboда

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

Конечно, дико извиняюсь, но, вроде как, бесхозная вещь это s_obj.parent_id = 65535

Поделиться этим сообщением


Ссылка на сообщение

Возможно целесообразно сделать drop_item, дальше запустить level.add_call и как только parent_id ==  65355, то  удалит его.

У меня кстати в таком случае проблем не было.

Хотя, мне не понятна до конца проблема "рождения" глючных объектов и в чём их "глюк".

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

Да, координаты совпадают

@macron, а что мешает при спавне объекта проверить координаты спавна и если они в зоне левел-ченджера, то сдвинуть спавн за пределы зоны перехода вглубь локации?

Поделиться этим сообщением


Ссылка на сообщение

@macron, вот такой скрипт попробуй

 


local parent_id = {}
local remove_sobj = {}
local i = 1
-- Пробегаем по объектам и айдишники всех level_changer помещаем в талицу
while i < 65535 do 
local sobj = alife():object( i )
if sobj and sobj:clsid() == clsid.level_changer then
parent_id[ sobj.id ] = sobj.id
end
i = i + 1
end
-- Пробегаем по объектам и все child level_changer помещаем в талицу
for n = 1, 65534 do
local sobj = alife():object( n )
if sobj then
for k,v in pairs( parent_id ) do
if sobj.parent_id == v then
remove_sobj[ sobj.id ] = sobj
end
end
end
end
--Удаляем child level_changer
for _k,_v in pairs( remove_sobj ) do
alife():release( _v, true )
end

Изменено пользователем makdm
  • Спасибо 1

Поделиться этим сообщением


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

 

@Zander_driver,  вот, честное слово, не понял тут ахтунга.

Всё работает, как часы. Можешь сам проверить.

 

Хотя можешь и не проверять, а открыть файл bind_smart_terrain.script и в методе net_spawn увидишь

 

db.add_smart_terrain( self.se_smart_terrain )

 

Затем открой файл db.script.  Дальше, надеюсь всё и так ясно.

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

Поделиться этим сообщением


Ссылка на сообщение

@MrGROX,  удаляешь на локации убытия и проспавниваешь на локации прибытия.

Именно так делали разрабы Сталкера в ЗП все переходы сквадов с локации на локацию.

Поделиться этим сообщением


Ссылка на сообщение

Всем привет!

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

 

 

Проблема такая. Установлен билд мода на ЗП.

Есть скрипт  - gamedata\scripts\ui_mod_elements.script

Апдейт происходит в биндере ГГ.

В один прекрасный момент ( после нахождение игрока в зоне 28 дней, когда сыграно больше половины игры ) после сейв/лоад практически на "ровном месте" получаем вылет

 

attempt to index global 'ui_mod_elements' (a nil value) 

 

Причём никакие правки в мод не вносились.

 

Начинаю проверять в методе апдейт в биндере актора:

 

if _G["ui_mod_elements"] then

ui_mod_elements.allspawn_editor_update()

else

--вывод на экран, что нет такого файла

end

 

Результат: Двигало в упор не видит файл ui_mod_elements.script в папке gamedata\scripts

 

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

У меня есть даже "прикольная" сохранка. Загрузился - движок обрабатывает файл ui_mod_elements.script

Даже лишних движений на клавиатуре не делал, а только сейв\лоад. И всё -  нет такого файла для движка.

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

 

 

Изменено пользователем makdm
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение
Проблема с жестким диском ?

Не у меня одного. Ещё у тестера такая же проблема. Движок просто не видит файл в папке scripts

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

Поделиться этим сообщением


Ссылка на сообщение

Раскопал я этот "парадокс".

Вообщем дело было так:

При сохранении игры происходит спавн объекта и в его STATE часть нет-пакета сохраняются данные.

При загрузке, данные считываются из STATE части нет-пакета объекта, а сам объект удаляется.

Это я так думал. Но удаление объекта не происходило, т.к. я пытался сделать вот такой финт ушами:

 

function se_store_obj:STATE_Read(packet, size)
cse_alife_dynamic_object.STATE_Read(self, packet, size)
 
-- Вынесено в объект из пакета ГГ
    release_body_manager.get_release_body_manager():load(packet)
    sr_psy_antenna.load(packet)
    sim_board.load(packet)
    xr_sound.actor_load(packet)
    xr_statistic.load(packet)
 
    alife():release( self, true )
 
end
Т.е. пытался удалить сам объект прямо внутри метода STATE_Read
 
Таким образом в игре накопилось 62 объекта, в которые записывались данные при сохранении и считывались 62 раза при загрузке.
При 63-м сейв\лоад движок начал терять файл в папке scripts
Я удалил вот это безобразие alife():release( self, true ) и всё пошло как по маслу ( за исключением того, что при загрузке и сохранке движок писал/считывал 63 раза одно и то же в пакеты разных объектов )
Ладно это поправимо. Вынес айдишники объектов в таблицу и затем удалил.
 
Но почему движок делал 62 попытки удалить объекты и это "проскакивало", а на 63 объекте "стал запинаться" и терять файл в папке scripts, вот это пока для меня осталось непонятным.
  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

В том, что нет-пакет ГГ не вмещает в себя все сохраняемые таблицы переменных, используемых в моде.

А в чём тут извращение? Есть другой способ?

Тогда зачем разрабы Сталкера всё это проделывают в методах save и load в биндере актора?


@UnLoaded,  если ты про то, что зачем нужен спавн и удаление, то это привычка защиты "от дурака".

Вдруг, кому-то ( например мне ), где-то в середине игры придёт в голову добавить скрипт и пройтись по всем объектам и отделить нужное от мусора, а сам мусор отправить "в топку".

Вот чтобы объект не оказался в "мусорке" я , таким образом его и защитил. Хотя, можно в начале игры добавить объект и работать с ним постоянно.

Возможно перестраховка, но мне так спится лучше. :D

Поделиться этим сообщением


Ссылка на сообщение

Спасибо за ответы! По-ржал от души! 

Знаете, чем отличаются американские форумы от русских?

На американском форуме задаёшь вопрос - все пытаются тебе помочь.

На русском  - при ответе на вопрос, все начинаются мериться своими .... познаниями.

 

Вообще-то вопросы  были не про хранение переменных, а немного о другом:

1.Почему при обработке 62 объектов игра идёт стабильно без вылетов и всё в игре работает так, как задумано разработчиком?

2.Почему при спавне 63-го объекта - движок "не видит" отдельный файл в папке Scripts???

  • Нравится 1
  • Не нравится 2

Поделиться этим сообщением


Ссылка на сообщение

@Mododel15, так попробуй:

 

snd = sound_object([[interface\inv_food]])
function use_bread_oz( obj )
    if obj == nil then return end
if obj:section() ~= "bread" then return end
local s_obj = alife():create( "baton_b", vector(), 0, 0, db.actor:id() )
snd:play_at_pos(db.actor, vector():set(0,0,0), 0, sound_object.s2d)
local Timer_zrems = time_global() + 3000
local effect_start = function()
if s_obj.online and Timer_zrems < time_global() then
return true
end
end
local effect_stop = function()
if snd:playing () then
snd:stop ()
end
alife():release( s_obj, true )
end
level.add_call( effect_start, effect_stop )
end

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

Поделиться этим сообщением


Ссылка на сообщение

 

 

Но функция удаления не работает

У меня всё работает. Ищите ошибку у себя.

  • Согласен 1

Поделиться этим сообщением


Ссылка на сообщение
Очень просто

Мне всегда нравились такие ответы на вопрос.

Код ничего не возвращает.

Изменено пользователем makdm
  • Нравится 1

Поделиться этим сообщением


Ссылка на сообщение

ID того, кто "шлёпнул" НПС хранится в его же нет-пакете. Всегда можно прочитать пакет НПС-трупа и получить ID киллера.

Единственное неудобство - это нужно заранее позаботиться о получении серверного класса объекта НПС-трупа удобным для скриптёра способом.

Как-то так.

  • Полезно 1

Поделиться этим сообщением


Ссылка на сообщение

Так попробуй:

 

function check_barret()

local rifle_in_slot=db.actor:item_in_slot(2)
if rifle_in_slot and rifle_in_slot:section() == "wpn_vintorez"  then
db.actor:give_info_portion("barret_on")
news_manager.send_tip(db.actor, "%c[25,240,25,25]wpn_vintorez ON", nil, nil, 20000)
else
db.actor:disable_info_portion("barret_on")
news_manager.send_tip(db.actor, "%c[25,240,25,25]wpn_vintorez OFF", nil, nil, 20000)
end
end

  • Спасибо 1

Поделиться этим сообщением


Ссылка на сообщение

 

 

Доброго времени суток, народ подскажите как скриптом заспавнить машину/бтр ?

Бтр поддерживает spawner

Что мешает через SDK или acdc поставить БТР на локации, прописать ему логику, и в нужный момент игры по условию перевести его в он-лайн?

Поделиться этим сообщением


Ссылка на сообщение

 

 

Неужели бываю NPC без community, или он в offline'е коньки отбросил?

Биндер в файле xr_motivator.script обрабатывает только онлайновые объекты.

При смерти НПС, который находится оффлайн, метод death_callback не вызывается и соответственно не вызывается метод create_release_item класса drop_manager.

Соответственно применить метод character_community() к серверному классу объекта просто не получится ( так как его смерть не обрабатывается скриптом ). По идее NIL не должен быть никогда, если только вы сами не передали nil, как аргумент в функцию.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

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