Полтергейст 37 Опубликовано 12 Января 2011 Подскажите насчёт серверных объектов... Что вызывается чаще - cse_alife_*:update() или cse_alife_*:can_switch_*() ? Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 13 Января 2011 По крайней мере нет ни одного примера их использования. Я имею в виду вызов этой функции не из скриптов, а из симуляции... Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 15 Января 2011 online_offline_group Разве этот класс вообще используется в ТЧ? Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 22 Января 2011 У меня такой вопросик: Как функция can_switch_online() работает для смартов? Проверяет наличие NPC из смарта в онлайне или вызывает для них такую же функцию? Или как-то ещё? Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 13 Февраля 2011 (изменено) Вызывается ли метод on_unregister() для людей и мутантов после вызова on_death()? Если нет, удаляются ли они движком из раздела "рейтинг" в PDA? И ещё: почему при перегрузке метода on_before_register() его вызов из движка убрали? Т.е. cse_alife_human_stalker.on_before_register(npc) больше не вызывается. Можно ли его вернуть обратно без вылетов? Изменено 13 Февраля 2011 пользователем Полтергейст Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 1 Марта 2011 Делаем секцию [known_info] в customdata сталкера и в ней (то есть после этой строки) пишем имена выдаваемых инфопоршней. Делается это через all.spawn. Если NPC заспавнен через скрипт, тогда надо через net_packet'ы записывать ему customdata. Как именно - не знаю. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 2 Марта 2011 Почитай статью про game_object. Там есть функция для этого. А если его в оффлайне замочат или съедят? Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 2 Марта 2011 Да кстати и убить в оффлайне ещё постараться надо, а движок сам ничем таким не занимается. Я имел в виду АМК мод - там всё это реализовано, но обработку инфопоршней не видел. В движке (классы cse_alife_human_stalker, cse_alife_monster_*) есть функция on_death, которая вызывается, если существо (сталкер или зверюшка) сыграло в ящик. Можно было бы сделать что-нибудь вот такое: local infotable = {} --' Формат: infotable[npc:name()] = "info_portion" function on_death(killer) cse_alife_human_stalker.on_death(self, killer) if db.actor ~= nil and infotable[self:name()] ~= nil then db.actor:give_info_portion(infotable[self:name()]) end --' Тут можно вставить вызов других функций, например news_main.on_offline_death(self, killer) ... end Короче говоря, сопоставить имени (или другому критерию) объекта инфопоршень и выдавать его когда надо. То же самое можно сделать для on_spawn() - выдавать инфопоршень при появлении объекта. P.S. кстати, пробовал для этих классов перегружать функции health() и alive() - ругается на pure virtual call Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 3 Марта 2011 (изменено) Сегодня обнаружил, что класса CInfoDocument почему-то нет в lua_help, хотя в xr_game.dll он упоминается. Вот никак не пойму, есть он или нет. То же самое с CAttachableItem, CMedkit, CAntirad, CFoodItem, CBottleItem, CExplosive, CPda и некоторыми другими. Изменено 3 Марта 2011 пользователем Полтергейст Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 3 Марта 2011 И ещё такой вопрос: как определить, какой класс можно перегрузить, а какой нет? Вот, к примеру, есть такой сет: "CActor", "se_actor.se_actor", "O_ACTOR", "actor", но он (скрипт) не работает. А если я напишу так "CActor", "se_actor.se_actor", "S_ACTOR", "actor_s" это что-нибудь изменит? Или проблема не жёстко прописаном в движке конфиговом имени класса (O_ACTOR), а в самом классе cse_alife_creature_actor? Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 19 Марта 2011 Сегодня обнаружил, что для классов зверюшек и людей нельзя создавать переменную с именем m_smart_terrain_id. Помнится, когда-то я писал про "потерю из вида" движком методов класса se_smart_terrain. Сегодня я снова столкнулся с этой проблемой, но на этот раз разобрался. Оказывается, в классе cse_alife_monster_base есть поле m_smart_terrain_id, но оно не экспортировано. И так получилось, что во время своих эксперементов я создал в классе se_stalker поле с таким же именем. После этого игра не загружалась - вылетала с руганью на отсутствие того или иного метода класса se_smart_terrain. Как только я поменял имя этой переменной на другое - эти вылеты сразу исчезли, всё заработало. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 25 Марта 2011 Вчера обнаружил, что зависимость онлайн-статуса npc от этого статуса смарта прошита в движок. Как обнаружил - в se_stalker убрал перегрузку функций can_switch_*, в смарте в этих же функций поставил проверку условий существования смарта (smart.gparams.cond). Короче говоря, как только это условие не выполняется, смарт переходит в оффлайн. Первый же удобный случай - смарт, в котором прописан раненый у вагончика на Кордоне - показал, что этот раненый после перехода смарта в оффлайн тоже переходит в оффлайн (при этом выходит из смарта). Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 20 Апреля 2011 Однако ж. Оказывается, радиус переключения в онлайн не является одинаковым для всех объектов. К примеру, для смартов он намного больше, чем для неписей. Похоже, что именно поэтому и наблюдаются баги при попытке заставить смарт быть в оффлайне до перехода любого его NPC в онлайн. И ещё, насчёт перегрузки клиентских классов. Похоже, это всё-таки возможно. Есть такой файлик - ce_switcher.script. Там наглядно показано, как это делается. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 25 Мая 2011 Кто-нибудь может объяснить, почему не работает callback.zone_enter? Или его надо на объект ставить, а не на restrictor? Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 15 Июня 2011 Кто-нибудь знает. в каком порядке вызываются функции on_register() и on_spawn()? Вроде бы первой вызывается on_before_register(), а дальше как? Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 6 Декабря 2011 (изменено) В дополнение к таблице соответствия серверных и клиентских классов (пост №29): в файле xr_game.dll ближе к концу есть упоминания соответствий серверных и клиентских классов (причём внутри движка имена этих классов могут отличаться от тех, что экспортированы в LUA). Кроме этого, классы делятся на парные и непарные. Непарные остаются без соответстия, т.е. они "чисто серверные" или "чисто клиентские". Если я правильно понял, непарные классы наследованы от неэкспортируемого класса CObjectItemSingle, парные - от CObjectItemClientServer. Вырезка из файла xr_game.dll (убраны нечитаемые символы) под спойлером. CObjectItemClientServerSingleMp<class CActor,class CActorMP,class CSE_ALifeCreatureActor,class CSE_ActorMP>::server_object CObjectItemSingle<class CLevel,1>::server_object CObjectItemSingle<class CGamePersistent,1>::server_object CObjectItemSingle<class CHUDManager,1>::server_object CObjectItemSingle<class game_sv_Single,1>::server_object CObjectItemSingle<class game_sv_Deathmatch,1>::server_object CObjectItemSingle<class game_sv_TeamDeathmatch,1>::server_object CObjectItemSingle<class game_sv_ArtefactHunt,1>::server_object CObjectItemSingle<class game_cl_Single,1>::server_object CObjectItemSingle<class game_cl_Deathmatch,1>::server_object CObjectItemSingle<class game_cl_TeamDeathmatch,1>::server_object CObjectItemSingle<class game_cl_ArtefactHunt,1>::server_object CObjectItemSingle<class CUIGameSP,1>::server_object CObjectItemSingle<class CUIGameDM,1>::server_object CObjectItemSingle<class CUIGameTDM,1>::server_object CObjectItemSingle<class CUIGameAHunt,1>::server_object CObjectItemSingle<class CSE_ALifeGroupTemplate<class CSE_ALifeMonsterBase>,0>::client_object CObjectItemSingle<class CSE_ALifeGraphPoint,0>::client_object CObjectItemSingle<class CSE_ALifeOnlineOfflineGroup,0>::client_object CObjectItemClientServer<class CSpectator,class CSE_Spectator>::server_object CObjectItemClientServer<class CAI_Flesh,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CChimera,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CAI_Dog,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CAI_Stalker,class CSE_ALifeHumanStalker>::server_object CObjectItemClientServer<class CAI_Bloodsucker,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CAI_Boar,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CAI_PseudoDog,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CPsyDog,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CPsyDogPhantom,class CSE_ALifePsyDogPhantom>::server_object CObjectItemClientServer<class CBurer,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CPseudoGigant,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CController,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CPoltergeist,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CZombie,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CFracture,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CSnork,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CCat,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CTushkano,class CSE_ALifeMonsterBase>::server_object CObjectItemClientServer<class CPhantom,class CSE_ALifeCreaturePhantom>::server_object CObjectItemClientServer<class CAI_Trader,class CSE_ALifeTrader>::server_object CObjectItemClientServer<class CAI_Crow,class CSE_ALifeCreatureCrow>::server_object CObjectItemClientServer<class CCar,class CSE_ALifeCar>::server_object CObjectItemClientServer<class CHelicopter,class CSE_ALifeHelicopter>::server_object CObjectItemClientServer<class CMercuryBall,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CBlackDrops,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CBlackGraviArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CBastArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CDummyArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CZudaArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CThornArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CFadedBall,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CElectricBall,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CRustyHairArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CGalantineArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CGraviArtefact,class CSE_ALifeItemArtefact>::server_object CObjectItemClientServer<class CWeaponMagazined,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponMagazinedWGrenade,class CSE_ALifeItemWeaponMagazinedWGL>::server_object CObjectItemClientServer<class CWeaponFN2000,class CSE_ALifeItemWeaponMagazinedWGL>::server_object CObjectItemClientServer<class CWeaponAK74,class CSE_ALifeItemWeaponMagazinedWGL>::server_object CObjectItemClientServer<class CWeaponLR300,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponHPSA,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponPM,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponFORT,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponBinoculars,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponShotgun,class CSE_ALifeItemWeaponShotGun>::server_object CObjectItemClientServer<class CWeaponSVD,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponSVU,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponRPG7,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponVal,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponVintorez,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponWalther,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponUSP45,class CSE_ALifeItemWeaponMagazined>::server_object CObjectItemClientServer<class CWeaponGroza,class CSE_ALifeItemWeaponMagazinedWGL>::server_object CObjectItemClientServer<class CWeaponKnife,class CSE_ALifeItemWeapon>::server_object CObjectItemClientServer<class CWeaponBM16,class CSE_ALifeItemWeaponShotGun>::server_object CObjectItemClientServer<class CWeaponRG6,class CSE_ALifeItemWeaponShotGun>::server_object CObjectItemClientServer<class CWeaponAmmo,class CSE_ALifeItemAmmo>::server_object CObjectItemClientServer<class CScope,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CSilencer,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CGrenadeLauncher,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CBolt,class CSE_ALifeItemBolt>::server_object CObjectItemClientServer<class CMedkit,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CAntirad,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CFoodItem,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CBottleItem,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CExplosiveItem,class CSE_ALifeItemExplosive>::server_object CObjectItemClientServer<class CInfoDocument,class CSE_ALifeItemDocument>::server_object CObjectItemClientServer<class CInventoryItemObject,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CScientificOutfit,class CSE_ALifeItemCustomOutfit>::server_object CObjectItemClientServer<class CStalkerOutfit,class CSE_ALifeItemCustomOutfit>::server_object CObjectItemClientServer<class CMilitaryOutfit,class CSE_ALifeItemCustomOutfit>::server_object CObjectItemClientServer<class CExoOutfit,class CSE_ALifeItemCustomOutfit>::server_object CObjectItemClientServer<class CF1,class CSE_ALifeItemGrenade>::server_object CObjectItemClientServer<class CRGD5,class CSE_ALifeItemGrenade>::server_object CObjectItemClientServer<class CExplosiveRocket,class CSE_Temporary>::server_object CObjectItemClientServer<class CMPPlayersBag,class CSE_ALifeItem>::server_object CObjectItemClientServer<class CCustomZone,class CSE_ALifeCustomZone>::server_object CObjectItemClientServer<class CMosquitoBald,class CSE_ALifeAnomalousZone>::server_object CObjectItemClientServer<class CMincer,class CSE_ALifeAnomalousZone>::server_object CObjectItemClientServer<class CRadioactiveZone,class CSE_ALifeAnomalousZone>::server_object CObjectItemClientServer<class CHairsZone,class CSE_ALifeZoneVisual>::server_object CObjectItemClientServer<class CLevelChanger,class CSE_ALifeLevelChanger>::server_object CObjectItemClientServer<class CScriptZone,class CSE_ALifeSpaceRestrictor>::server_object CObjectItemClientServer<class CSmartZone,class CSE_ALifeSmartZone>::server_object CObjectItemClientServer<class CTeamBaseZone,class CSE_ALifeTeamBaseZone>::server_object CObjectItemClientServer<class CTorridZone,class CSE_ALifeTorridZone>::server_object CObjectItemClientServer<class CSpaceRestrictor,class CSE_ALifeSpaceRestrictor>::server_object CObjectItemClientServer<class CAmebaZone,class CSE_ALifeZoneVisual>::server_object CObjectItemClientServer<class CNoGravityZone,class CSE_ALifeAnomalousZone>::server_object CObjectItemClientServer<class CSimpleDetector,class CSE_ALifeItemDetector>::server_object CObjectItemClientServer<class CTorch,class CSE_ALifeItemTorch>::server_object CObjectItemClientServer<class CPda,class CSE_ALifeItemPDA>::server_object CObjectItemClientServer<class CProjector,class CSE_ALifeObjectProjector>::server_object CObjectItemClientServer<class CWeaponMounted,class CSE_ALifeMountedWeapon>::server_object CObjectItemClientServer<class CWeaponStatMgun,class CSE_ALifeStationaryMgun>::server_object CObjectItemClientServer<class CHangingLamp,class CSE_ALifeObjectHangingLamp>::server_object CObjectItemClientServer<class CPhysicObject,class CSE_ALifeObjectPhysic>::server_object CObjectItemClientServer<class CScriptObject,class CSE_ALifeDynamicObjectVisual>::server_object CObjectItemClientServer<class CBreakableObject,class CSE_ALifeObjectBreakable>::server_object CObjectItemClientServer<class CClimableObject,class CSE_ALifeObjectClimable>::server_object CObjectItemClientServer<class CPhysicsSkeletonObject,class CSE_ALifePHSkeletonObject>::server_object CObjectItemClientServer<class CDestroyablePhysicsObject,class CSE_ALifeObjectPhysic>::server_object CObjectItemClientServer<class CInventoryBox,class CSE_InventoryBox>::server_object Как видно, клиентскому классу CZombie соответствует серверный CSE_ALifeMonsterBase. Изменено 6 Декабря 2011 пользователем Полтергейст Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 23 Декабря 2011 По поводу коллбеков: 1. Коллбеки типа callback.sound перехватывают звуки только от сталкеров, монстров, игрока и детекторов. 2. Есть кое-какие предположения насчет коллбеков action_animation, action_movement, action_object, action_particle, action_sound и action_watch. Если посмотреть в lua_help на описание функций set_action() из класса entity_action, то становится понятно, что они нужны для отслеживания действий монстров. Для остальных объектов они, скорее всего, работать не будут. Вот только нет примеров использования. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 27 Декабря 2011 Есть одна очень хорошая новость. Судя по тому, что я накопал, в lua_help добавлены не все экспортируемые функции и классы. Например, функция CALifeMonsterBrain.can_choose_alife_tasks(bool) экспортирована в скрипты не только в ЧН и ЗП, но и в ТЧ. Только что проверил - никаких вылетов при вызове этой функции нет. Вполне возможно, что есть и другие функции, которые можно использовать, но они не описаны в lua_help. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 30 Декабря 2011 А существует ли возможность определить, глядя на dll, какая функция была импортирована? Обычно функции, которые выведены в скрипты, перечисляются в dll-ке открытым текстом примерно через одинаковое расстояние (по символам). Примерно так эта функция и была обнаружена - в dll её имя прописано рядом с именами других функций этого класса. Также имена некоторых функций и классов (в т.ч. и неэкспортированных) можно найти в сообщениях, предназначенных для вывода в лог при ошибке. Поделиться этим сообщением Ссылка на сообщение
Полтергейст 37 Опубликовано 12 Февраля 2012 Между прочим, это фактически единственный сохранившийся метод из родной системы оффлайновой боёвки К слову об оффлайне. Оффлайновые обновления (те, что от планировщика) мне удалось заставить заработать. Для этого я всего лишь заменил вызов self:brain():update() на self:update() и перегрузил последнюю функцию, ничего не добавляя (осталось только cse_alife_*.update()). Не уверен, что последнее на что-то повлияло. После всех этих изменений игра вылетела, ругаясь на отсутствие некоторых параметров в m_person.ltx, проблему решил установкой параметра Scheduled = off. После этого оффлайн-обновления заработали. Поделиться этим сообщением Ссылка на сообщение