singapur22
Именно так, вначале дроп и позже тэйк.
После записи в сэйв стораджей объектов перед разрушением локации все объекты и (актор тоже) дропят все зависимые от них объекты (рушатся связи).
После старта - в 'голенького' актора и во всех оствльных непимей засовываются все имевшиеся у них предметы. А т.к. эти предметы должны быть считаны из сэйва и появиться в он-лайне - процесс идет даже после начала апдейтов.
Тэйк по п.2 обязан быть, т.к. не 'голенький' же у тебя актор.
Вывод о том, что объект-актор не удаляется, ИМХО не верен. Биндер актора точно переинициализируется, но более важно - переинициализируется 'actor_proxy'! что собственно и говорит о восстановлении/замене объекта-актор из сэйва при (пере)запуске.
P.S. Сорри, но ... попробую сам перепроверить отсутствие тэйка у актора по п.2.
ПО моим наблюдениям это событие идет на первых 'precache_frame' (примерно 28...25)
P.P.S. Не очень понятно что ты называешь кол-вом прошлой локации и кол-вом нового сюжета? Если у актора быто 10 аптечек перед сохранением или при переходе - то столько же и должно быть при (пере)запуске на новой локации. Если конечно не работает некая 'чистка' при старте. Не могут исчезнуть предметы, которые были сохранены в сэйв. И их 'parent_id' обязаны засунуть эти предметы (тэйкнуть) к своим владельцам.
singapur22
Если ты выводишь инфу через get_console, то нужно будет пролистать лог во время игры чуть повыше, ибо тейк всё-таки есть в п.2.Ну или если через сенд_тип, то главно не забыть проверить "историю" в пда, т.к. сообщения со стандартным "временем жизни" (5 сек.) любят исчезать ещё до старта игры :-), смотря где вызвал.
отредактировал(а) Darien Fx: 11-08-2010 19:19 GMT3 час.
Опа. Соврал. С сейва "all" не пробывал. А здесь take вызывается. Но почему с других сейвов молчит? Ладно разберёмся.
Ещё один вопрос. Имеется метод определения номера активного слота: db.actor:active_slot()
Пока какото слот активен, всё вроде нормально. Но если не один слот не активен, он выдаёт число: 4294967296 Не многовато ли?
Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Любой предмет (серверный объект), не имеющий стори_ид (m_story_id) выдает это число (4294967296) в качестве отсутствия. Ну а то, что многовато - то r_s32 или w_s32 это не 'u16' (65535) и хранят знак, т.е. старший бит исчезает.
Вероятно разрабы перестарались и отвели не 'u16' для хранения номера активного слота, а 's32', а т.к. 0 - это тоже возможный номер активного слота (ножны), а не отсутствие, то ... вероятно сохранение -255 и выходит в 4294967296.
P.S. Я уже давно не ищу у разрабов обязательность наличия какого-либо смысла в их кодах. Рудиментов столько, что ... еще не на одно 'поколение' модмейкеров хватит разгребать 'мусор' и ломать головы предполагалками.
Могу только предположить, что предполагали кол-во слотов превысит 16 (слоты+пояс+...). Пояс помнится в оригинате 6-8 ячеек ... Вот и не уложились в 'u16'. 'u24' - практически не используется. 'u32' - глюкавит. Вот и остановились на 's32'.
Darien Fx Действительно. Молодца. Спасибо за подсказку, друг. Я чёта тэйк на консоль не поставил. Упустил. Спасибо всем. Теперь действительно всё в ажуре. :-)
добавлено спустя 2 минут
Artos А смысл было реганить Int32 для слотов?
добавлено спустя 7 минут
Artos Всё может быть. Собсно фиг с ним. Надо внести себе в справку данную особенность. Дабы не пойматься при создании сохранок.
отредактировал(а) singapur22: 11-08-2010 19:07 GMT3 час. Проект "Mobile Manager" закрыт, в связи со стечениями неблагоприятных обстоятельств, и последующей потерей всех файлов и справок текущего проекта.
singapur22
Ты был прав насчет каллбека на изъятие - я его видимо вчера не тем местом проверял &P
А Artos скорей прав насчет числа установленных фасткаллов на один объект,
так что фасткалл в моем случае пока отменяется - тем паче что глючит - хотя и редко.
---------------------------------------------------------------------------------------------
Серьезная у вас тут темка вышла - даже как то неловко влезать с вопросом: по каким причинам может не сработать метод hit()
Вот например хитуется объект мина - сообщение о взрыве приходит всегда - однако сам взрыв(собственно партиклы, звуки - все по дефолту - без скриптов) в некоторых случаях не наличествуют. То есть как бы объект хиту подвергся - но не взорвался - хотя сила хита приличная.
h.power = 20
h.type = hit.fire_wound
if boom~= nil then
boom:hit(h) -- \взрываем мину
news_manager.send_tip(db.actor, "Тайник взорван", 0, nil, 5000)
start_timer_2(1)
else
news_manager.send_tip(db.actor, "Объект бомбы не существует", 0, nil, 5000)
end
Или вот метод или explode() - прекрасно работает у меня в одной разработке, однако здесь не хочет производить нужного действия.
У меня при взрыве нычки хабар как бы выкидывается(переспавнивается) из инвентаря ящика на землю и затем физикой (через полсекунды) пинается - но при этом идет проверка - если объект можно взорвать
if get_clsid(obj)==clsid.obj_explosive then
то мы ему вместо пинка сделаем obj:explode() -- и тишина почему то - ни один объект не взорвался.
Странно... Паузы в полсекунды вполне достаточно чтобы серверный свезаспавненный объект стал клиентским - тем боле что пинаются они все нормально(а пинать можно только клиентские) - а вот взрываться не хотят.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
singapur22
ИМХО, простейшее: 'if ative_slot_num >= 0 or ative_slot_num <=10 then ative_slot_num = -1 end' (иль аналогичное) - избавляет и от вероятности 'нарваться' и дает возможность использовать 'u16' вместо 's32' для запоминания любого ative_slot_num. erlik
А если все же указать вроде как предусмотренный разрабами параметр для метода: explode(0)?
Или может ты пинаешь объекты (класс не взрывчатки) не поддерживающие этот метод и твоя же проверка отсекает? Гранаты/артефакты (мины вроде на классе артов делают обычно) этим методом не подрываются.
Исходная информация:
При выполнении задания/квеста в статистику игроку записывается информация о выполненном квесте (некое название) и кол-во баллов (можно посмотреть в КПК).
Собственно sTask - стринг, который может быть подцвечен в зависимости от чего-то, типа: sTask = "%c[255,160,160,160]"..sTask"
Есть также метод получения общего кол-ва баллов по типам/разделам статистики: actor_stats.get_points(string)
Вопрос:
Есть ли возможность удалить/стереть/заменить некорректныю/'глючную' запись конкретного уже выполненного квеста в статистике игрока?
Или хотя бы: где хранятся эти записи?
Требуется для совместимости с имеющимися сэйвами.
Darien Fx
Мне требуется именно по квестам и именно стринг (название) квеста, а не суммарные очки.
Хотя ... если хоть по какой иной (киллсталкер/киллмонстер/...) статистике что-то есть - то можно поискать по аналогии для квестов.
По рангам не подходит, это понижение/изменение очков ранга игроку, меняется цифра. А остальное - добавлялки/смотрелка.
Собственно потребность возникла из-за корявости парсина строк движком и подцвеченая(ые) строка(и) попала(и) в статистику, приводя к вылету при просмотре статистики. Требуется именно строку(и) заменить/затереть/исправить.
Если нет прямых методов, то ... должна же где-то храниться/сохраняться в сэйвы статистика и все эти строки!?
Artos
Аргумент в методе explode() ни на что не влияет. Помню проверял - думал что либо сила взрыва будет разная либо это задержка перед взрывом - ничего подобного - разницы никакой. Каждый объект подрывается также как обычно.
А гранаты кстати подрываются этим методом - у меня же в гравипушке они тоже спавнятся и пинаются - и прекрасно подрываются опосля. Арты конечно нет. И подствольные гранаты и заряд для РПГ.
Но у меня в тайнике именно ручные гранаты.
Мина у меня на классе II_EXPLO конфиг от динамита вроде.(не помню уже - но в общем таж самая что и моей разработке бомба с дистанционным подрывом). Она всегда подрывалась.
Та что загадка выходит...
добавлено спустя 26 минут
Artos
в классе CGameTask() есть метод get_id() для получения строки с именем квеста
вот описание маландринуса :
даёт строку-идентификатор задачи. Это атрибут id из тега game_task в XML
-- если не был выполнен метод load или не была добавлена хоть одна подзадача, то вернёт nil
-- если вручную добавили подзадачу, то вернёт "user_task"
отредактировал(а) erlik: 11-08-2010 21:18 GMT3 час. Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
erlik
Ну тогда тогда или сам попробуй в лог вывести поэтапности и выяснить причину 'не взрыва' или нужны коды, чтобы детально анализировать иль пробовать 'метод тыка'.
А по таску - исходно все имеется, и идентификаторы и строки и все прочее. Нужен доступ к изменению/стиранию наименования/идентификатора задачи, уже попавшей в статистику, а не выданной игроку иль еще что ...
Artos
Такой вариант на ночь глядя в голову пришел - может бред , но вдруг на мысль наведет.
Судя по скриптам в task_manager инфа по рандомным таскам пишется в таблицу
task_info = {} затем она сохраняется в нет-пакет и соответственно при загрузке игры заново подгружается в методе CRandomTask:load(p)
Так вот - может просто в этой таблице данные переписать?
Загрузить ее, изменить нужные значения ключей и заново сохранить.
Хотя чувствую что тебе все таки нужен доступ в класс actor_stats
метод занесения инфы то есть - actor_stats.add_points("quests", task_desc.name, 1, task_desc.reward_rank)
а вот как ее считать и можно ли перезаписать - непонятно.
Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
erlik
Сам понимаю вопрос 'на засыпку'. Ну и собственно не столь уж и важен. Выход из тупика порой - только отсупление назад (ну и фиг с ними с сэйвами ...). :-)
Все, что в таск менеджере - это еще не выданные или активные (выданные) задания. То, что выполнено - это уже в статистике, и в таск-менеджере только отались 'флаги' о том, что уже выполнено/не выдавать ... Нет-пакетами в таск-менеджере сохраняется только активная часть заданий (выданы и не сданы), а все остальное реинициализируется при старте игры заново из конфигов.
А вот доступ к массиву статистики по квестам - получается фигушки, кроме как уже упомянутых двух методов. Это собственно и немного понятно, дай волю - игрок будет себе накручивать очки ... :-).
Но ... где-то это ж хранится(!) ...
Artos
Попробовал вызвать метод actor_stats.get_points("quests") с аргументом который приметил в add_points() - метод вернул число 0 . Вызывал его как вначале игры ,так и после выполнения задания принести флешку Шустрого.
Я то думал, что вернет таблицу - однако получил фиг знает что :-)
-----------------------------
PS:- вот блин - невнимательно прочитал твой пост - там же написано что метод возвращает.
Получается что действительно нет доступа к тому массиву статистики по квестам.
отредактировал(а) erlik: 11-08-2010 23:40 GMT3 час. Разработки: "Тотализатор","Kill-zone", "Mega-bomba", Mega_gravi",
"Рандомные тайники(а также декодер, мины+диалоговый аддон"), "Выбрасываемый рюкзак", "Аналоговые часики на худ"
O, erlik, и все же спасибо, за последний пост!
Упоминание тобою об аргументах ... заставило их опять проанализировать и ...
add_points("quests", sTask, 1, tTask.reward_rank)
arg1 - quests - стринг, наименование категории статистики;
arg2 - sTask - стринг, строка-название выполненного задания;
arg3 - 1/-1 - флаги добавить/убавить очков (аналоги add/del);
arg4 - очки (вес квеста) в общем кол-ве квестовых очков
Мелькнула глупая мысль, а если в ту же категорию (квесты) в ту же строку (прежнее значение sTask) не добавить(1), а убавить(-1) очков ... иль даже 'nil'? Если там не аналог 'table.insert(...)', а прямая запись по ключу ... то может что-то и выйдет?! Бум пробовать ... надежда мала, но все же ... xxx5
Например: stalkerin.gameru.net/wiki/
Товарищи!
Подскажите пожалуйста как получить Айди предмета при выбрасывании?
Вот что мне нужно. :-)
Есть в руках у ГГ Калаш при нажатии на кнопку на клавиатуре "выбросить" автомат соответственно исчезает из инвентаря и слота, и падает на землю. Как получить Айди?
karavan
Используй коллбэк актора на дроп: function actor_binder:on_item_drop(obj)
- где obj собственно выброшенный предмет (точнее лишившийся владельца - актора). Ну и его идентификатор - obj:id()
Перепроверив (что не обязательно), что это нужный тебе калаш - действуй далее ...
Проверив активность слота (6-го) ... и предмет/объект в нем ... и его секцию/класс на тождестов с болтом ... и запомнив идентификатор этого болта ... Мож что и выйдет с уже упомянутым выше дропом?!
(не уверен в успехе, но вроде как ... должно прокатить)
karavan
Ну уже не плохо, хотя болт в 6-м слоте, а не 1-ом.
(Неплохо бы научиться наконец форматировать коды в постах)
Ну а теперь если вместо сенда (сообщения в экран) сделать запоминалку идентификатора во внешнюю к функции переменную ... добавив ветку обнИления этой переменной при неактивности 6-го слота или НЕ болта в нем то ... Проверяя калбек дропа на 'выкинутый' предмет ... остается удостовериться тождество идентификатора выкинутого предмета и запомненного болта, то ...
А ты не заметил, что задача определения выкинутого калаша иль болта - идентичны по сути? &P И скорее всего тебе будет достаточно коллбека на болт.
karavan
Не прибедняйся, с коллбеками работают также как и с тем же 'биндером' (actor_binder:update()), только в **50016ea8aab1bb10eeba**--/ выброшен болт?
get_my_func(obj:id()) --/ вызов 'своей' функции с передачей ей ID-болта
end
end[/code]
Ну а для форматирования - всего лишь требуется вставлять нужное кол-во пробелов при использовании тегов 'cоde', если их у тебя не хватает в исходном коде.
Artos
А ты не заметил, что задача определения выкинутого калаша иль болта - идентичны по сути?
А разве? Калаш выкидывается из слота на землю, а болт бросается. Насколько я понимаю разница есть. Хотя в плане получения Айди обьекта я не уверен. И в том и другом случае ведь на землю скидывается ОГФ модель. :-)
---------------------
А создавать таблицу для obj разве ненадо?
karavan
Не проецируй свое воображение о реальности на реалии игры. Коды не знают что такое 'земля'. Событие дропа - это всего лишь 'потеря' одного объекта-актора другого объекта-предмета. А улетел он в небо, съеден иль упал на землю - это уже иные цифирьки и анимация, воспринимаемая тобою как 'близко к реальности'.
Тебе нужен ID выброшенного болта - ты его получил. А упадет болт на землю иль в болото иль еще куда и как - в данном контексте не имеет значения.
Ну а про некую 'таблицу для obj' - если еще хочется поупражняться - ну посоздавай парочку иль сколько не жалко ... ;-) Вот только при создании задумайся - а зачем это нать?
А в чем разница между 'выкидывается' и 'бросается'? В замахе? &P
Artos Если я получаю айди предмета то мне он для чего-то нужет. Я вот и не пойму откуда мне считывать этот Айди? Точнее как?
Просто стандартным способом?
...
for k,v in pairs(ids) do
local obj = alife():object(v)
if obj then
...
Artos Если нету разницы в дропе и метании болта, то можно избавиться от блока на поднятие кинутого болта? Там ведь название то отмечается, как у канистр и прочего у чего в ручную заблокировано поднятие. Где у него блок на поднятие стоит? В классе?
Журнал
- модель M79
- модель HK SL-8
- модель Milkor m32 WIP
Эта тема закрыта, публикация новых сообщений недоступна.
Продолжая пользоваться сайтом, вы соглашаетесь с использованием файлов cookie. Страницы сайта могут содержать информацию, запрещенную для просмотра посетителям младше 18 лет. Авторское право на серию игр «S.T.A.L.K.E.R» и используемые в ней материалы принадлежит GSC Game World.