karavan
туда надо писать тока те сиды, которые есть в этом файле, так как они уже прописаны в allspawn
например
500 = "bar_Barman" - это сид бармена
3 = "Escape_Trader" - сидора
32 = "esc_kuznetsov" - кузнецова
6 = "Escape_novice_lager_volk" - волка
и т.д.
можно конечно задать сид и для своего персонажа, но это надо именно в allspawn делать.
Но как - я точно не знаю, так как не делал.
function name_2()
local npc1
npc1 = level_object_by_sid(889)
if npc1 and npc1:alive() then
return
elseif not npc1:alive() and db.actor:dont_has_info("info") then
for i = 1, 10 do
alife():create("yan_zombied_respawn_1",vector():set(-34,-10,-71),244091,111)
end
end
db.actor:give_info_portion("info")
end
вместо db.actor:dont_has_info("info") можно также использовать запись
not has_alife_info("info")
отредактировал(а) erlik: 19-09-2009 00:03 GMT3 час. Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
karavan
Такие оперции над объектами, как проверка на жив\мертв обычно производятся через их sid - именно для этого разрабы и создали эту систему. Так как она очень удобна.
По другому тоже наверно можно - например через id , уникальный идентификатор объекта тоже в виде числа, который игра сама присваивает объекту при его спавне. Но как получать этот id я пока не разобрался.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
А кто нибудь знает как сделать чтобы доходя до точки происходил спавн НПС. Да и как вообще програмируется сама точка, дойдя до которой происходит событие.:-)
karavan
Создай рестриктор и в его логику поставь активацию функции спавна.
Рестриктор можно создать как через all.spawn, так и через скрипт.
вот пример скриптового рестриктора с динамическими ltx, который разработал singapur22
function spawn_restrictor()
local sid = nil
local pos = vector():set(-229.616,-20.199,-147.374) --\ координаты центра рестриктора
local lv = 25279
local gv = 47
local radius = nil
local x = 10 --\ размер по x - длина
local y = 10 --\размер по y - высота
local z = 10 --\размер по z ширина - в итоге имеем квадрат 10x10x10 метров
local ltx = "[logic]\n"..
"active = sr_idle\n"..
this.create_restr(sid, pos, lv, gv, ltx, radius, x, y, z)
end
На вход в рестриктор сработает функция spawn, в которой нужно прописать кто и сколько должен заспавниться. Функция сработает одноразово - так как ей прописано затем уйти в nil . После рестриктор перейдет в состояние sr_idle@1 , а когда ГГ покинет рестриктор - тот самоликвидируется.
все подробности читай в его журнале, там же нужно брать и основную функцию для создания рестриктора, так как этот пример - только функция с данными. Схема логики - готовый вариант, который можно использовать.
Все это пишется в один файл.
ссылка на журнал
http://www.stalker-portal.ru/plug.php?e=weblogs&m=page&id=7306
да, забыл добавить: функцию спавна надо обязательно положить в файл xr_effects - так как из логики активируются тока функции из этого файла.
Так, вариант с nil в строчке "on_actor_inside = sr_idle@1 %=spawn%\n" не прокатил.
Так что исправил. А в остальном все норм. - чувачки заспавнились как тока эктор пересек границу рестриктора, затем рестриктор самоуничтожился и солдатики больше не спавнились.
Рестриктор - для того, чтобы он заспавнился тоже надо активировать - либо через диалог, либо банально через функцию function actor_binder:on_item_drop (obj) в bind_stalker.
Но для того, чтобы он не заспавнился снова, нужно поставить условие в виде отсутствия инофопоршня, который затем - в конце функции выдать. Это все можно сделать в функции спавна рестриктора. Либо в отдельной функции.
вот пример функции для активации рестриктора
еe надо ставить ставить на апдейт в function actor_binder:update(delta) - типа так имя_файла.function activate()
саму функцию туда же где и рестриктор.
function activate()
if level.name() == "l01_escape" and --\ пишешь нужный уровень
db.actor:has_info("info_1") and db.actor:dont_has_info("info_2") then --\ нужно будет выдать поршень - через диалог или логику непися.
this.spawn_restrictor() --\ активируем рестриктор
--db.actor:disable_info_portion ("info_1") -- убираем поршень - строчка не обязательна
db.actor:give_info_portion ("info_2") -- выдаем поршень, чтобы рестриктор больше не активировался.
end
end
если убрать условие в виде db.actor:has_info("info_1") то рестриктор заспавнится сразу как будет загружен указанный уровень.
функция сработает один раз и все. После ликвидации рестриктора второй раз он не заспавнится.
отредактировал(а) erlik: 19-09-2009 14:11 GMT3 час. Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
В общем исправил пару ошибок - теперь ниче не вылетает, но новое меню так и не появилось. Обидно, однако...так что вопрос как привязать это меню к конкретному итемсу в инвентаре эктора остается в силе.
Для начала опиши, как ты его запускаешь?
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
--------------------------------------------------------------------------------------------------
--/ Интерфейс опций для починки брони и оружия (с ремонтным набором)
---------------------------------------------------------------------------------------------------
class "ui_repair" (CUIScriptWnd)
function ui_repair:__init() super()
self:InitControls()
self:InitCallBacks()
end
function ui_repair:__finalize() end
function ui_repair:InitControls()
local scr = {x = 0, y = 0, width = 1024, height = 768}
local win = {x = 0, y = 0, width = 260, height = 300}
win.x = (scr.width - win.width )/2 + 25
win.y = (scr.height - win.height)/2 + 50
self:Init(win.x, win.y, win.width, win.height) --/ координаты левого верхнего угла и ширина-высота
self:Enable(true)
local xml = CScriptXmlInit() --/ файл-описатель элементов
xml:ParseFile("ui_repair.xml")
xml:InitStatic("background", self) --/ рамка
--xml:InitStatic("back_video", self) --/ видео на заднем плане
self:Register(xml:Init3tButton("caption", self),"caption") --/ заголовок
--/ кнопки
self:Register(xml:Init3tButton("btn_1", self),"btn_1")
self:Register(xml:Init3tButton("btn_2", self),"btn_2")
self:Register(xml:Init3tButton("btn_3", self),"btn_3")
self:Register(xml:Init3tButton("btn_quit", self),"btn_quit") --/ кнопка выхода
end
function ui_repair:InitCallBacks()
--/ интерактивные элементы, при определенном действии выполняется заданная функция
self:AddCallback("btn_quit", ui_events.BUTTON_CLICKED, self.on_quit, self)
self:AddCallback("btn_1", ui_events.BUTTON_CLICKED, self.repair_1, self)
self:AddCallback("btn_2", ui_events.BUTTON_CLICKED, self.repair_2, self)
self:AddCallback("btn_3", ui_events.BUTTON_CLICKED, self.repair_3, self)
end
function ui_repair:on_quit()
self:GetHolder():start_stop_menu(self,true)
get_console():execute("main_menu off") --/ закрываем и родительское main_menu
end
function ui_repair:OnKeyboard(dik, keyboard_action)
CUIScriptWnd.OnKeyboard(self,dik,keyboard_action)
if keyboard_action == ui_events.WINDOW_KEY_PRESSED then
if dik == DIK_keys.DIK_ESCAPE then self:on_quit() --/ на выходе - Esc
elseif dik == DIK_keys.DIK_NUMPAD1 then self:repair_1()
elseif dik == DIK_keys.DIK_NUMPAD3 then self:repair_2()
elseif dik == DIK_keys.DIK_NUMPAD3 then self:repair_3()
end
end
end
function ui_repair:repair_1()
repair.repair_wpn_1()
self:on_quit()
end
function ui_repair:repair_2()
repair.repair_wpn_2()
self:on_quit()
end
function ui_repair:repair_3()
repair.repair_armor()
self:on_quit()
end
в файле рипейр все функции ремонта и это
function chek_repkit()
local actor = db.actor
if actor then
if actor:object("repair_kit") == nil then
return
end
elseif actor and actor:object("repair_kit") ~= nil then
local gui_win = ui_repair(get_hud()) --/ вызов меню рем.комплекта
level.start_stop_menu(gui_win, true)
end
end
стоит на апдейте
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
singapur22
так вот это мне и было непонятно. В функции меню спальника стоял именно такой запуск как у меня - и я не смог найти другого варианта.
значит задавать лок. переменную local gui_win = ui_repair(get_hud()) - вообще не надо
а просто написать
level.start_stop_menu(interfase.ui_repair(), true)
Ну наконец ты пришел - и все пояснил. Без тебя как то не очень тут на форуме :-) Спасибо.
добавлено спустя 6 минут
тогда еще вопрос.
есть логика дверей с кодом
типа такой
[logic]
active = ph_code@lock
я тут решил написать функцию динамически генерируемых кодов для таких дверей, а потом подумал: а как я буду передавать новый код в схему логики двери?
допустим у меня будет переменная local key которой будет динамически присваиваться новое значение - можно ли ее как то подставлять в логику двери(точнее замка) вместо цифр в строчке code ? например через динамический ltx....
отредактировал(а) erlik: 19-09-2009 16:34 GMT3 час. Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
singapur22
Ага, значит все таки можно - отлично:-)
слушай, я сейчас в файле интерфейса заменил ту строчку, но пока никак. Я вот все-таки не пойму как это все (новое меню) вешается на конкретный предмет? Вроде классы у них не меняют - и у спальника, и рем. набора в модах - классы обычные - антирадовские. Чего то еще не хватает в моей функции...или еще где... в hml все вроде прописано.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
erlik Извини, но я не смотрел, как у них там сделано. Я использую свой способ. Может быть и есь более простой, но в своём я по крайней мере уверен на все 100. Я както попробывал через множественное использование предмета. Но при этом оно не удаляется, и в дропе не отслеживается. Поэтому я использую разовое использование, отслеживая его удаление.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
мда...придется дальше ковырять симбион... у них кстати вещь при использовании удаляется и тут же спавнится обратно. Потому и вечная. А вот как они менюшку к этим итемсам привязали.... у меня тока стандартное использовать\выбросить появляется.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
erlik Так и привязывается. Если удаляется тот объект, то открыть меню и произвести спавн предмета. Правда меню будет открываться и при выбрасывании. Поэтому нужно ещё производить проверку, удаляется предмет или выбрасывается.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
так получается надо ставить проверку на вещь в функцию дроп? Или что?
то бишь изначально и должно быть "использовать" - нажимаем и появлется наше меню. Так?
А как тогда избавиться от появления менюшки при выбрасывании итемса?
Я вообще не знаю метода проверки на использование кроме дропа вещи в бинд-сталкер.
что то типа if db.actor:item_use("вещь") ??
добавлено спустя 4 минут
вот нашел вот это actor_item_use - как это использовать?
Эта локальная переменная больше нигде не упоминается кроме game.stats
отредактировал(а) erlik: 19-09-2009 17:52 GMT3 час. Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
erlik Вот, это отслеживание использования предмета, но не выбрасывания, и не продажи:
local note = nil
--отслеживание использования Ноутбука (постоянный апдейт)
function open_notebook()
if note and type(note) == 'number' then
if not level.object_by_id( note ) then
level.start_stop_menu(notebook.book(), true) --запускаем меню
alife():create('notebook', 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
--функция вызываемая из дропа
function drop_notebook(obj)
if obj:section() == 'notebook' then
note = obj --если Ноутбук, то запомнить его userdata
end
end
При этом, предмет должен иметь разовое использование.
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
На счет спавна НПС и ИИ сетки... Создать нового НПС дело плевое, но вот нормально заспавнить уже проблемы. Как мне уже говорили, при отсутствие ИИ сетки НПС идет на ее край... А как этого избежать я так и не понял... Если не сложно объясните пожалуйста.
Ребята подскажите каким конвертером перевести файлы из AVI в OGM.
Использовал River Past Video Cleaner но игра их воспринемать не хочет.
Если несложно залейте куда нибудь рабочий конвертер для файлов видео.
Спасибо.
singapur22
SUPER@2009. у меня есть он переводит только в ogg, а не в OGM и его переведенные файлы игра тоже не воспринемает. Я сюда и написал в надежде найти помощь.:-)
karavan Каким ещё простым? Есть два типа OGG формата (аудио и видео). Оба они предусмотрены в данной проге. Устанавливаешь конвертацию в видео-OGG, но никак не в аудио, ставишь фильтр vorbis, тип фильтра theora. Хотя они стоят по умолчанию. Отключаешь конвертацию аудиопотока (обязательно). Устанавливаешь битрейт порядка 1000, можно больше, но не более 33000, иначе будут сильные тормоза при воспроизведении. И запускаешь конвертировать. После конвертации у тебя появится видеофайл в формате OGG. Нажимашь переименовать, и меняешь OGG на OGM. Всё!!!
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.