MRN$
Вариантов ошибки три:
а) Ты передаешь на вход НЕ клиентский объект. Попытка применить к нему методы для клиентского объекта приводит к 'No such operator defined'.
b) Ошибка идет из другой функции. Возможно из вызывающей, где некорректно обрабатывается возвраженный аргумент(ы) ...
в) Неизвестный нам фактор ... может ты вообще в другую игру скрипт пихнул?
P.S. По инвентарным боксам: Моя оценка: менее 25%.
Darien Fx , SkyLoader
Если бы клиентский объект НЕ был бы в онлайне иль еще где-то не зарегистрировался бы, то НЕ прошла бы проверка 'if obj then', т.к. нечего было бы передавать на вход ...
Гадаем поманеньку?!
SkyLoader
Ты опять в дебри полез, забыв дома азбуку?!
Позиция камеры(device().cam_pos) и позиция актора (db.actor:position()) - разные вещи, хотя и взаимосвязанные. Не стОт их путать.
Сам вспомни, что есть еще в игре вид от 2-го и 3-го лица, где камера отделена от актора.
Сообщение было успешно отредактировано Artos (14-09-2010 05:07 GMT3 часа, назад)
function create(item, fpos_x, fpos_y, fpos_z, flvid, fgvid)
test_obj = alife():create("item",vector():set(fpos_x, fpos_y, fpos_z), flvid, fgvid)
end
function get()
local fpos_x, fpos_y, fpos_z, flvid, fgvid, fdir_x, fdir_y, fdir_z = get_object_param(test_obj)
end
function get_object_param(obj)
if obj then
local pos = obj:position()
local dir = obj:direction()
local lvid = obj:level_vertex_id()
local gvid = obj:game_vertex_id()
return pos.x, pos.y, pos.z, lvid, gvid, dir.x, dir.y, dir.z
else
return false
end
end
MRN$
Ну тогда возможно Darien Fx и SkyLoader частично правы!
Любой вызов твоей функции 'get()' при отсутствии объекта приводит к тому, что второй (fpos_y) и всем последующим (fpos_z, ..., fdir_z) функция 'get_object_param(nil)' ничего не возвращает. Даже nil'ов! Она возвращает 1 (один!) параметр, а ты просишь 8!
Можно игнорировать лишние возвращаемые параметры, но НЕ требовать(!) несуществующие -> 'No such operator defined'.
Если сделать так: return false, nil,nil,nil,nil,nil,nil,nil,nil - то должно сработать, но это уже 'плохой' почерк кодера-программера.
P.S. Собственно вероятную причину ошибки тебе подсказал. Как вариант можно делать так, дабы избежать ошибки с несуществующими операторами:
Код:
function get()
local fpos_x, fpos_y, fpos_z, flvid, fgvid, fdir_x, fdir_y, fdir_z
local arg = get_object_param(test_obj)
if arg[1] and #arg == 8 then
fpos_x, fpos_y, fpos_z, flvid, fgvid, fdir_x, fdir_y, fdir_z = arg
end
--/ ну и далее...
end
этот код как-бы "в принципе" - реально он несколько другой... в общем - лопачу код на предмет казусов.
Artos, спасибо, буду разбираться...
=========================================
PS
А не может быть такого, что у предметов вообще нет методов direction и vertex-ов? Пробовал у O_INVBOX или аптечки получить дирекцию и вертексы - ничего, только id и position-ы.
Нужен предмет у которого можно получить текущую дирекцию и вертексы.
Сообщение было успешно отредактировано MRN$ (14-09-2010 07:48 GMT3 часа, назад)
MRN$
У объектов O_INVBOX, так же как и прочих и дирекция и вертексы (они то уж никак отсутствовать не могут) имеются.
вот так я получал данные для своих схронов:
Код:
function InventoryBox:net_spawn(data)
taynik_rnd.SpawnVisibleTreasure(self.object)
local dir = self.object:direction()
local pos = self.object:position()
Console("InventoryBox:net_spawn: Переход в онлайн")
Console(string.format("Direction = %.1f, %.1f, %.1f, Position: x= %.1f, y=%.1f, z=%.1f Lvid = %d Gvid = %d Id = %d",
dir.x, dir.y, dir.z,
pos.x, pos.y, pos.z,
self.object:level_vertex_id(),
self.object:game_vertex_id(),
self.object:id()))
return object_binder.net_spawn(self, data)
end
вот результат: дирекция есть и у всех походу одна и таже
Код:
! Cannot find saved game ~ direction = -0.0, 0.0, 1.0, position: x= 203.0, y=8.9, z=158.9 lvid = 499116 gvid = 149 id = 43520
! Cannot find saved game ~ direction = -0.0, 0.0, 1.0, position: x= 121.1, y=8.0, z=242.9 lvid = 424715 gvid = 240 id = 50432
! Cannot find saved game ~ direction = -0.0, 0.0, 1.0, position: x= 82.6, y=-11.7, z=250.6 lvid = 377462 gvid = 189 id = 50445
! Cannot find saved game ~ direction = -0.0, 0.0, 1.0, position: x= 76.3, y=1.8, z=345.1 lvid = 369409 gvid = 192 id = 51456
-------------------------------------------------------------------- VITOSSSSS
Есть такой файлик в папке config\misc - items.ltx называется.
а еще есть unique_items.ltx и quest_items.ltx
Сообщение было успешно отредактировано erlik (14-09-2010 15:39 GMT3 часа, назад)
Artos, да, но насколько я знаю device().cam_pos не изменяется, как же изменить позицию камеры? Имею ввиду, чтобы координаты вписал, и камера переместилась.
Сообщение было успешно отредактировано SkyLoader (14-09-2010 19:39 GMT3 часа, назад)
TheDoktor, вроде, какой-то из этих параметров zoom_rotate_x и zoom_rotate_y, ещё, может быть, zoom_offset. Это всё в конфиге оружия в секции настройки hud'а. В данном случае, скорее всего, нужно менять zoom_rotate_y.
Подскажите, как подобные квесты выдавать несколько раз, тоесть просле прохождения этого квеста можно было его еще раз взять и пройти?Удаление инфопоршней не помогает.Или квесты в игре одноразовы?
Дайте пример функции, которая срабатывает при использовании предмета, т.е. из дропа так сказать. Просто забыл как это делается.
Нужно что бы при использовании предмета (например Хлеба) выводилось сообщение.
Я скaчaл рaпaковaный all.spawn и отрeдaктировaл тaм всe что мнe нaдо, включaю новую игру и мои измeнeния нe происходят. Можeт нaдо спaковaть aлл.спaвн? Или что то другоe?
VITOSSSSS А гугл для чего? Впиши в поиск all.spawn ТЧ или полностью сталкер тени...
Там и статью может найдешь...а вообще в архиве все есть как запак. и как разпак...
------------- karavan
эту строчку надо вписать в любой скрипт который вызывается при загрузке игры. В bind_stalker например в метод reinit или reload или load или net_spawn.
а это функция которая будет вызываться на юзание ГГ любого предмета
Код:
function OnUseObject(obj, who)
if obj then
-- делаем проверку на использование нужного предмета
if obj:section() =="communicator" then
alife():create("communicator", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавним его обратно
level.start_stop_menu(this.my_message(), true) --запускаем меню
end
end
end
ЦитатаЕсли бы клиентский объект НЕ был бы в онлайне иль еще где-то не зарегистрировался бы, то НЕ прошла бы проверка 'if obj then', т.к. нечего было бы передавать на вход ...
Прошла бы, ведь серверный объект то (уже) есть! И в данном случае 'if obj then' сработает и для оффлайн аптечки с последующим приминением 'онлайн-методов' к ней и вылетом.
P.S. Гаданиями не занимаюсь, ибо проверено это .
Кстати нашел в справочнике malandrinusa один замечательный каллбек, который никто не использует хотя он очень удобен в некоторых ситуациях. Наверно многие (как впрочем и я) его просто проглядели.
Например мы спавним объект и нам тут же надо что-нить с этим объектом сотворить - убить, пнуть, зафиксировать, получить дирекцию или еще чего.
Так как практически все нужные нам методы работают только с клиентскими объектами приходится ждать пока объект перейдет в онлайн - то есть ставить таймер на 0.5-1 cек или же лезть в его биндер и отлавливать наш объект там на выходе в онлайн.
Но все можно сделать гораздо проще, так как существует каллбек на выход в онлайн.
Пример: спавним объект
Код:
function Spawn()
local pos = db.actor:position()
local lvid = db.actor:level_vertex_id()
local gvid= db.actor:game_vertex_id()
local obj = alife():create("объектi", pos, lvid, gvid)
--вызываем метод add класса client_spawn_manager() которому передаем айди нашего объекта
level.client_spawn_manager():add(obj.id, 0, spawn_callback, "дополнительный аргумент")
end
аргументы метода: obj.id -- это айди объекта на который ставим каллбек 0 -- это айди эктора - нафиг не нужно, но нужно spawn_callback -- имя функции которая вызовется при переходе объекта в онлайн "дополнительный аргумент" -- дополнительный аргумент для функции spawn_callback - что хотим то и передаем, если оно конечно надо, либо вообще ничего не пишем.
-- сюда ставим вызов нужного нам действия при переходе объекта в онлайн
Код:
function spawn_callback(arg, iId, gObj)
news_manager.send_tip(db.actor, "Каллбек на переход в онлайн вызван", 0, "trader", 10000)
-- снимаем каллбек, чтобы он не вызывался каждый раз когда объект снова окажется в онлайне
level.client_spawn_manager():remove(iId, 0)
end
принимаемые параметры: arg - тот самый дополнительный аргумент iId - айди объекта на который поставлен каллбек gObj -- клиентская юзердата объекта на который поставлен каллбек
как видно один параметр явно лишний - вполне хватило бы одной юзердаты. Но раз разрабы так сделали, значит им зачем то это надо было.
Сообщение было успешно отредактировано erlik (14-09-2010 22:26 GMT3 часа, назад)
Это я так понимаю создается некое окошко и задаются его размеры. Но проблема в том что vector2 в ТЧ не сушествует в отличии от ЧН и ЗП. Как по другому задать размеры окошка?
Ma$ter
В ТЧ координаты и размер окон задаются через метод Init(number, number, number, number), или Init(Frect*) или SetWndRect(Frect) или SetWndRect(number, number, number, number);
Если только размеры - то есть метод SetWndSize(number, number). Но не помню работает ли он как надо - помню, что пробовал его использовать, в одном меню, но потом заменил.
Примеры смотри в геймдате или модах.
Хотя не думаю, что тебе это поможет засунуть меню из ЧН в ТЧ - так как чувствую там не одну строчку переписывать придется. Тем более, что раз параметр self.desc_item_fn_sz требует именно векторный массив из двух цифр, то замена vector2() методом из ТЧ вряд ли будет возможна.
По прежнему, не могу получить с объекта вертексы и дирекцию... ни время, ни перевод онлайн-офлайн - не влияет... в общем, всё что знал - перепробовал. Тут какая-то тонкость, может даже элементарная, но моей компетенции, что-бы разобраться - не хватает. Здесь - всё как есть: файл scop.script, строки 138 и 153 - функция get_object_param() - не работает ни в каких вариантах: position - есть, а оба вертекса - всегда nil
Если у кого есть возможность - прошу помочь сделать эту функцию рабочей.
как проверять:
0. предмет в слоте 2.
1. активировать слот, ввести дистанцию, кнопка "тест", спавниться предмет, выход.
2. погулять вокруг предмета, сколько угодно - не влияет.
3. активировать слот, ввести имя, кнопка "сохранить тест", будет "новость" с параметрами где вертексы == nil
:(
MRN$
Посмотрел скрипт - у тебя там было две ошибки:
1) В функции get_object_param() ты пытался получить данные с серверной юзердаты заспавненного объекта не получив ее клиентскую копию.
2) в функции вывода данных экран была ошибка - свойства m_level_vertex_id и m_game_vertex_id были неверно указаны - без буквы m_ - потому и nil получал вместо вертексов.
В общем я там переписал две функции - под клиентскую юзердату. Посмотри - как будешь в итоге выводить и форматировать - тут уж сам выбирай.
ссыль
_http://narod.ru/disk/24909268000/scop.rar.html
Fantom2323
Ты не прав.
То, что написано ... не всегда работает!
Параметр 'health_restore_speed' и прочие 'ххх_restore_speed' на брониках НЕ работаею.
Они только для класса артефактов.
Для броников требуется писать скриптовую схему, которая и будет обрабатывать этот (эти) парамерт(ы), типа как в Zenobian-mod'е.
MRN$
Хотя erlik уже тебе подсказал ошибки, но все же глянь и этот вариант. И подправлено и подоптимизировано: <скрипт>
Сообщение было успешно отредактировано Artos (15-09-2010 18:12 GMT3 часа, назад)
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.