Перейти к контенту

Справочник по функциям и классам


Рекомендуемые сообщения

По крайней мере нет ни одного примера их использования.

Я имею в виду вызов этой функции не из скриптов, а из симуляции...

Поделиться этим сообщением


Ссылка на сообщение

У меня такой вопросик:

 

Как функция can_switch_online() работает для смартов? Проверяет наличие NPC из смарта в онлайне или вызывает для них такую же функцию? Или как-то ещё?

Поделиться этим сообщением


Ссылка на сообщение

Вызывается ли метод on_unregister() для людей и мутантов после вызова on_death()? Если нет, удаляются ли они движком из раздела "рейтинг" в PDA?

 

И ещё: почему при перегрузке метода on_before_register() его вызов из движка убрали? Т.е. cse_alife_human_stalker.on_before_register(npc) больше не вызывается. Можно ли его вернуть обратно без вылетов?

Изменено пользователем Полтергейст

Поделиться этим сообщением


Ссылка на сообщение

Делаем секцию [known_info] в customdata сталкера и в ней (то есть после этой строки) пишем имена выдаваемых инфопоршней. Делается это через all.spawn. Если NPC заспавнен через скрипт, тогда надо через net_packet'ы записывать ему customdata. Как именно - не знаю.

Поделиться этим сообщением


Ссылка на сообщение
Да кстати и убить в оффлайне ещё постараться надо, а движок сам ничем таким не занимается.

Я имел в виду АМК мод - там всё это реализовано, но обработку инфопоршней не видел.

В движке (классы 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

Поделиться этим сообщением


Ссылка на сообщение

Сегодня обнаружил, что класса CInfoDocument почему-то нет в lua_help, хотя в xr_game.dll он упоминается. Вот никак не пойму, есть он или нет.

То же самое с CAttachableItem, CMedkit, CAntirad, CFoodItem, CBottleItem, CExplosive, CPda и некоторыми другими.

Изменено пользователем Полтергейст

Поделиться этим сообщением


Ссылка на сообщение

И ещё такой вопрос: как определить, какой класс можно перегрузить, а какой нет? Вот, к примеру, есть такой сет: "CActor", "se_actor.se_actor", "O_ACTOR", "actor", но он (скрипт) не работает. А если я напишу так

 

"CActor", "se_actor.se_actor", "S_ACTOR", "actor_s"

это что-нибудь изменит? Или проблема не жёстко прописаном в движке конфиговом имени класса (O_ACTOR), а в самом классе cse_alife_creature_actor?

Поделиться этим сообщением


Ссылка на сообщение

Сегодня обнаружил, что для классов зверюшек и людей нельзя создавать переменную с именем m_smart_terrain_id.

Помнится, когда-то я писал про "потерю из вида" движком методов класса se_smart_terrain. Сегодня я снова столкнулся с этой проблемой, но на этот раз разобрался. Оказывается, в классе cse_alife_monster_base есть поле m_smart_terrain_id, но оно не экспортировано. И так получилось, что во время своих эксперементов я создал в классе se_stalker поле с таким же именем. После этого игра не загружалась - вылетала с руганью на отсутствие того или иного метода класса se_smart_terrain. Как только я поменял имя этой переменной на другое - эти вылеты сразу исчезли, всё заработало.

Поделиться этим сообщением


Ссылка на сообщение

Вчера обнаружил, что зависимость онлайн-статуса npc от этого статуса смарта прошита в движок.

Как обнаружил - в se_stalker убрал перегрузку функций can_switch_*, в смарте в этих же функций поставил проверку условий существования смарта (smart.gparams.cond). Короче говоря, как только это условие не выполняется, смарт переходит в оффлайн. Первый же удобный случай - смарт, в котором прописан раненый у вагончика на Кордоне - показал, что этот раненый после перехода смарта в оффлайн тоже переходит в оффлайн (при этом выходит из смарта).

Поделиться этим сообщением


Ссылка на сообщение

Однако ж. Оказывается, радиус переключения в онлайн не является одинаковым для всех объектов. К примеру, для смартов он намного больше, чем для неписей. Похоже, что именно поэтому и наблюдаются баги при попытке заставить смарт быть в оффлайне до перехода любого его NPC в онлайн.

 

И ещё, насчёт перегрузки клиентских классов. Похоже, это всё-таки возможно. Есть такой файлик - ce_switcher.script. Там наглядно показано, как это делается.

Поделиться этим сообщением


Ссылка на сообщение

Кто-нибудь знает. в каком порядке вызываются функции on_register() и on_spawn()?

Вроде бы первой вызывается on_before_register(), а дальше как?

Поделиться этим сообщением


Ссылка на сообщение

В дополнение к таблице соответствия серверных и клиентских классов (пост №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.

Изменено пользователем Полтергейст

Поделиться этим сообщением


Ссылка на сообщение

По поводу коллбеков:

1. Коллбеки типа callback.sound перехватывают звуки только от сталкеров, монстров, игрока и детекторов.

2. Есть кое-какие предположения насчет коллбеков action_animation, action_movement, action_object, action_particle, action_sound и action_watch. Если посмотреть в lua_help на описание функций set_action() из класса entity_action, то становится понятно, что они нужны для отслеживания действий монстров. Для остальных объектов они, скорее всего, работать не будут. Вот только нет примеров использования.

Поделиться этим сообщением


Ссылка на сообщение

Есть одна очень хорошая новость. Судя по тому, что я накопал, в lua_help добавлены не все экспортируемые функции и классы. Например, функция CALifeMonsterBrain.can_choose_alife_tasks(bool) экспортирована в скрипты не только в ЧН и ЗП, но и в ТЧ. Только что проверил - никаких вылетов при вызове этой функции нет. Вполне возможно, что есть и другие функции, которые можно использовать, но они не описаны в lua_help.

Поделиться этим сообщением


Ссылка на сообщение
А существует ли возможность определить, глядя на dll, какая функция была импортирована?

Обычно функции, которые выведены в скрипты, перечисляются в dll-ке открытым текстом примерно через одинаковое расстояние (по символам). Примерно так эта функция и была обнаружена - в dll её имя прописано рядом с именами других функций этого класса. Также имена некоторых функций и классов (в т.ч. и неэкспортированных) можно найти в сообщениях, предназначенных для вывода в лог при ошибке.

Поделиться этим сообщением


Ссылка на сообщение
Между прочим, это фактически единственный сохранившийся метод из родной системы оффлайновой боёвки

К слову об оффлайне. Оффлайновые обновления (те, что от планировщика) мне удалось заставить заработать. Для этого я всего лишь заменил вызов self:brain():update() на self:update() и перегрузил последнюю функцию, ничего не добавляя (осталось только cse_alife_*.update()). Не уверен, что последнее на что-то повлияло. После всех этих изменений игра вылетела, ругаясь на отсутствие некоторых параметров в m_person.ltx, проблему решил установкой параметра Scheduled = off. После этого оффлайн-обновления заработали.

Поделиться этим сообщением


Ссылка на сообщение
  • Недавно просматривали   0 пользователей

    • Ни один зарегистрированный пользователь не просматривает эту страницу.
  • Куратор(ы) темы:

×
×
  • Создать...