=VENOM= 50 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 (изменено) Вот модифицированный xr_attendant (схема follower), для использования в скриптовых сценках, а также для организации примитивных отрядов, возглавляемых игроком. Инструкция внутри. Я не знаком с этой схемой, но, в принципе, в любую схему можно добавить кучу самых разнообразных органичений, и настроить её соответственно ... Добавлено через 207 мин.: Внимание! В выложенном мной скрипте обнаружена ошибка, которая может приводить к "вылету" без лога при безусловном переключении на другую схему логики. В функцию action_follow:free () в самом начале нужно добавить строку: local section = self.object:section() Приношу извинения за причинённые неудобства ... Изменено 14 Марта 2011 пользователем Куфзук Ссылка на комментарий
Полтергейст 37 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 Люди, кому-нибудь удавалось реализовать squad'ы на ТЧ как в ЗП? Ссылка на комментарий
Капрал Хикс 531 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 Такой вопрос. Добавил тайники на все новые локации от Kostya V. При попытке обыска трупа, когда, по идее, выдаётся наводка на тайник - вылет вида: [error]Line : 73 [error]Description : <no expression> [error]Arguments : LUA error: ...t.a.l.k.e.r\gamedata\scripts\treasure_manager.script:402: attempt to compare number with nil Строка 402 у меня выглядит так: if tonumber(treasure_prob) >= 0 and Используется скрипт рандомных тайников из АМК. Я дополнил его по образцу новыми локациями и так понимаю, что или где-то с этим в скрипте накосячил, или глючит какой-то один тайник, или его описание. Как можно отследить причину вылета? Ссылка на комментарий
AKKK1 6 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 =VENOM= Извените за наглость но нельзя-ли что то подобное провернуть с схемой компаньоны (от Kamikadze). В обьщем можно нанять не любого сталкера а только того у кого в логике есть соответствуюшая возможность. Ну чтоб работало как основные схемы . Ссылка на комментарий
TRAMP14 1 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 При переборе неписей по ид получил вот такой вылет Expression : m_available_count Function : CID_Generator<unsigned int,unsigned char,unsigned short,unsigned char,unsigned short,0,65534,256,65535,0>::tfGetID File : e:\stalker\patch_1_0004\xr_3da\xrgame\id_generator.h Line : 92 Description : Not enough IDs Что он может означать? Ссылка на комментарий
TRAMP14 1 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 local npc = level.object_by_id(i) for i = 1, 65534 do if npc and IsStalker(npc) then Както так Ссылка на комментарий
_Призрак_ 11 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 Ты посмотри что у тебя получается: Ты сначала берешь объект по айди. Айди у тебя i. Но i у тебя в тот момент = нил. Поэтому сделай лучше сделать так: local npc for i = 1, 65534 do npc = level.object_by_id(i) if npc and IsStalker(npc) then Freedom Ссылка на комментарий
TRAMP14 1 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 А что есть разница как они поставлены? (раньше локальная или поже?) Ссылка на комментарий
_Призрак_ 11 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 Не понял. Смотри, если написать так: local npc = level.object_by_id(i) for i = 1, 65534 do То двигатель дойдет до первой строки и т.к. у тебя i в тот момент = 0, то последует вылет А если написать так: local npc for i = 1, 65534 do npc = level.object_by_id(i) То у тебя i будет уже равна числу от 1 до 65534 Freedom Ссылка на комментарий
Полтергейст 37 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 (изменено) Пустая трата времени. Есть же таблица db.creatures, её и перебирайте: for id, npc in pairs(db.creatures) do if IsStalker(npc) then ... end end Правда есть одно но! Данная таблица есть в АМК, но ее нет в чистом 1.004. Куфзук Изменено 14 Марта 2011 пользователем Куфзук Ссылка на комментарий
TRAMP14 1 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 Есть же таблица db.creatures, её и перебирайте: А я всё мозги ломаю - как составить такую А оказывается такая есть А она только сталкеров содержит? _Призрак_ понял спасибо! Ссылка на комментарий
Artos 99 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 (изменено) Полтергейст, не заблуждайся на счет панацеи в виде 'db.creatures' (как в прочем и 'родная' db.storage). Во-первых, эта таблица создается не мгновенно при старте игры, а динамически пополняется/чистится по мере появления объектов в он-лайне. Иначе, если тебе потребуется проверить наличие какого-либо непися в самом начале игры (до начала апдейтов актора), ты можешь получить пустой массив (или далеко не полный/недозаполненный). Во-вторых, в более сложных случаях можно нарваться и на момент, когда серверный объект уже удален из игры, а в таблице 'db.creatures' он еще не удален соответствующим биндером/скриптом. Т.о. какой выбирать способ итерации/по какой таблице зависит от конкретной ситуации, точнее от момента когда производится итерация. Добавлено через 14 мин.: TRAMP14, таблицы 'db.creatures' (как и db.storage) содержит почти(!) все объекты, которые обрабатываются биндерами, т.е. не только сталкеров, но и всех монстров, ящики, прожекторы, и пр. ... Но(!) только на текущей локации и только те, что уже в онлайне. Так что экономия по кол-ву перебираемых объектов (их идентификаторов) на пару порядков меньше, чем при полной итерации. Изменено 14 Марта 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Полтергейст 37 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 (изменено) Во-первых, эта таблица создается не мгновенно при старте игры, а динамически пополняется/чистится по мере появления объектов в он-лайне. В предлагаемом автором вопроса скрипте был перебор именно онлайновых объектов, так что именно это и нужно. Во-вторых, в более сложных случаях можно нарваться и на момент, когда серверный объект уже удален из игры, а в таблице 'db.creatures' он еще не удален В se_stalker и se_monster в функцию on_unregister добавить db.creatures[self.id] = nil должно помочь. На чистой игре, где нет этой таблицы (только сейчас об этом узнал O_o) нужно добавить в db вот это: creatures = {} --' Это в самом начале, перед всеми функциями function add_obj(obj) if obj then creatures[obj:id()] = obj end end function del_obj( obj ) if obj then storage [obj:id()] = nil creatures[obj:id()] = nil end end И в bind_monster и xr_motivator в функции net_spawn после вот этого if not object_binder.net_spawn(self, sobject) then return false end добавить такую строку: db.add_obj(self.object) В net_destroy в самом начале добавить db.del_obj(self.object) После этого перебор таблицы должен заработать. Изменено 14 Марта 2011 пользователем Полтергейст Ссылка на комментарий
Artos 99 Опубликовано 14 Марта 2011 Поделиться Опубликовано 14 Марта 2011 (изменено) Полтергейст, мой мост спровоцирован не текущим вопросом/ответом, а тем, что не первый раз вижу твое "восторженое" отношение к отказу от перебора массива игровых идентификаторов объектов в сторону именно db'шных таблиц. Дабы и другие не вводились в заблужление - и дал пояснение. Естественно истина - в использовании обоих вариантов. Повторю основное: Не стОит безоговорочно отказываться от одного варианта в пользу другого. Какой таблицей пользоваться зависит от ситуации/момента. Порой необходимо перебирать весь массив идентификаторов, а порой и стОит свою табличку заранее сделать, дабы с'экономить немало времени/ресурсов в дальнейшем. Да и собственно корячиться с 'db.creatures', как ты предлагаешь по прежнему, не имеет особого смысла. Уже в самом АМК (v1.4x) эта таблица по сути стала почти рудиментом, т.к. почти полностью повторяет таблицу 'db.storage'. А на 'сегодня' - подобное уже подустарело ... Лучше бы обратил внимание на то, как аналогичное сделано в Zenobian-Mod'е, в котором в отдельную таблицу селектируются только гуманоиды и монстры с установкой соотв.флага, дабы проще/быстрее было их различать. :-) P.S. Предлагаемый автором вопроса скрипт/кусок искал онлайновых неписей, но(!) ни намека в какое время это делает скрипт/автор скрипта. Поиск онлайновых объектов может потребоваться и на старте игры, когда 'твоя' таблица еще (полу)пуста. Изменено 14 Марта 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Полтергейст 37 Опубликовано 15 Марта 2011 Поделиться Опубликовано 15 Марта 2011 (изменено) Кто-нибудь знает, почему в se_stalker при таком составлении функций значение self.wounded всегда считывается как true? function se_stalker:STATE_Write (packet) cse_alife_human_stalker.STATE_Write (self, packet) if self.script_version >= 6 then local ddw=0 if self.death_droped then ddw=ddw+1 end if self.wounded then ddw=ddw+2 end packet:w_u8(ddw) end end function se_stalker:STATE_Read (packet, size) cse_alife_human_stalker.STATE_Read (self, packet, size) if self.script_version >= 6 then local ddw=packet:r_u8() self.death_droped=bit_and(ddw,1)==1 self.wounded=bit_and(ddw,2)==2 end end Даже если привести их к такому виду function se_stalker:STATE_Write (packet) cse_alife_human_stalker.STATE_Write (self, packet) packet:w_bool(self.death_droped) packet:w_bool(self.wounded) end function se_stalker:STATE_Read (packet, size) cse_alife_human_stalker.STATE_Read (self, packet, size) self.death_droped = packet:r_bool() self.wounded = packet:r_bool() end то всё равно получается то же самое. Что делать? Изменено 15 Марта 2011 пользователем Полтергейст Ссылка на комментарий
Artos 99 Опубликовано 16 Марта 2011 Поделиться Опубликовано 16 Марта 2011 (изменено) Полтергейст Твоя ошибка в том, что пытаешься использовать нет-пакеты не представляя их структуры. Подобный подход чреват в лучшем случае нерабочими вариантами кодов, в худшем - фатальными ошибками и битыми сэйвами. Строка: cse_alife_human_stalker.STATE_Write (self, packet) - считывает из пакета сталкера основные базовые байты, но(!) вслед за ними идет байт 'job_online' (u8) с флагом онлайновой работы , после которого могут присутствовать стринговые байты собственно 'job_online_condlist' (stringZ). Далее имеем байт 'was_in_smart_terrain' (bool). И уже за всем этим следует байт 'death_droped' (bool/u8), с которым ты намереваешься поэкспериментировать с целью сохранения бита 'раненый'. Как видно из выше изложенного (или можешь взглянуть на структуру нет-пакета сталкера в том де бардаковском ACDC) ты вместо заключительного байта 'death_droped' пытаешься перепрописывать 'job_online' ... К хорошему такие эксперименты не приведут. Т.о. ответ на вопрос: "Что делать?": - вариант а) Правильно использовать нет-пакеты с их структурой; - вариант б) Не изобретать велосипед и использовать из того же АМК все то (уже давно сделанное), что ты пытаешься с битом ранения (причем ... с теми же названиями переменных ;-) ). Изменено 16 Марта 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Полтергейст 37 Опубликовано 16 Марта 2011 Поделиться Опубликовано 16 Марта 2011 (изменено) Как видно из выше изложенного (или можешь взглянуть на структуру нет-пакета сталкера в том де бардаковском ACDC) ты вместо заключительного байта 'death_droped' пытаешься перепрописывать 'job_online' Вот это я не совсем понял. Я ведь удалил все эти поля (job_online*, was_in_smart_terrain), они не записываются (см. функцию STATE_write). Естественно, я начинаю новую игру, а не гружу сохранения. Переменные те же, потому что АМК мод. Изменено 16 Марта 2011 пользователем Полтергейст Ссылка на комментарий
Artos 99 Опубликовано 16 Марта 2011 Поделиться Опубликовано 16 Марта 2011 (изменено) Полтергейст, вот когда ты сам себе ответишь на вопросы: а) "Чем отличается класс 'se_stalker' от 'cse_alife_human_stalker'?" (с точки зрения нет-пакетов) и б) "А могу ли я изменять структуру нет-пакетов для уже имеющегося в игре класса?" - и если 'да' то 'что и как' конкретно? - тогда приступай к экспериментам. С твоей логикой выходит ... можно из нет-пакетов лепить что захотелось как из пластилина. Изначальная посылка верна, вот только поймет ли тебя движок, который оперует тем, что в него уже заложено. Или создавай свой класс объекта со своей структурой пакета или ... используй уже имеющиеся, но саму структуру ты можешь только пополнять своими байтами (движок их игнорирует, а ты сам скриптами читать/писать будешь), но не кастрируя структуру. Не путай, менять значения байтов и менять структуру этих байтов - далеко не одно и то же. Если первое приводит к удачам/ошибкам, то второе (про добавление к структуре не говорим) - просто невозможно (без вмешательства в движок). P.S. Твоя попытка усечь пакеты в классе 'se_stalker' бессмысленна, если ты конечно не делаешь что-то совершенно свое и на другом движке. Без байтов 'job_online' (и далее) сталкеры/монстры превращаются в предметы, т.к. основное их отличие - способность выполнять работу в гулагах, которой ты их лишаешь. P.P.S. Перепрочитал и понял в чем твое основное заблуждение: При старте новой игры объект(ы) создаются сервером в соответствии со своими классами и с применением параметров из all.spawn'а. И только после этого ты их их можешь читать с клиентской стороны и соответственно перезаписывать. Т.о. любая попытка удалить из уже заданной структуры нет-пакета объекта соответствующего класса или даже изменить разрядность базовых для класса байт - бессмысленна изначально. Сервер конечно примет с твоей стороны измененный нет-пакет, но вот применить его к объекту ...? Удачи в экспериментах! :-) Изменено 16 Марта 2011 пользователем Artos "Но иногда найдется вдруг чудак, этот чудак все сделает не так ..."© Машина времени Ссылка на комментарий
Dennis_Chikin 3 658 Опубликовано 16 Марта 2011 Поделиться Опубликовано 16 Марта 2011 Кстати, руки чешутся оторвать сохранение/загрузку текущих работ. По тому что в большинстве случаев работа всегда только одна, либо меняется в зависимости от времени суток / событий. Время суток вычисляется при каждом опросе, состояния - аналогично. Почему бы при запуске гулагов и сами работы не назначать бы заново ? Чем может быть чревато ? Солянка обезжиренная, диетическая, полезные советы по "солянке", текущий тестовый патч Ссылка на комментарий
eXiu 7 Опубликовано 16 Марта 2011 Поделиться Опубликовано 16 Марта 2011 (изменено) Всем привет. Может пишу не в тему. Сделал скрипт, чтобы при выстреле кочался икран. Так вот. Как можно сделать, что-бы при выстреле икран был в крови? Или для этого нужно делать новый скрипт? Или просто подправить конфиг? А скрипт где? Кузфук Изменено 16 Марта 2011 пользователем Куфзук Ссылка на комментарий
Рекомендуемые сообщения
Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий
Комментарии могут оставлять только зарегистрированные пользователи
Создать аккаунт
Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!
Зарегистрировать новый аккаунтВойти
Есть аккаунт? Войти.
Войти