- Available Hooks — Хуки FLHook
- Базовые системные функции плагина
- FLServer Hooks
- 1. Жизненный цикл сервера
- 2. Игрок: подключение, логин, выбор персонажа
- 3. Игрок: запуск, док, переходы, системы
- 4. Чат и пользовательские команды
- 5. Админ-команды и консоль
- 6. Бой, урон, оружие, уничтожение
- 7. Торговля, деньги, предметы, рынок
- 8. Торговля между игроками
- 9. Движение, управление кораблём, действия игрока
- 10. Навигация, миссии, интерфейс, система
- 11. Майнинг, астероиды, объекты
- 12. Трейдлейны, докинг, физика и ядро сервера
- FLHook Callbacks
- Практически самые полезные хуки
Если тебе не хватает какого-то хука для конкретной функции FLServer, исторически это предлагалось обсуждать на форуме FLHook Plugin Version board на the-starport.net.
Ниже приведён список доступных хуков текущей версии FLHook.
Note
Если для функции не указан calling convention, то по умолчанию используется:
__cdeclPLUGIN_RETURNCODE *Get_PluginReturnCode()Управляет тем, что FLHook должен делать после вызова твоего плагина.
Important
Эту функцию не нужно регистрировать как hook.
list<PLUGIN_INFO>* Get_PluginInfo()Возвращает информацию о плагине и заменяет старую регистрацию через .ini.
Important
Эту функцию не нужно регистрировать как hook.
void Plugin_Communication_CallBack(PLUGIN_MESSAGE msg, void* data)Callback для межплагинного взаимодействия.
Это хуки, привязанные к событиям и внутренним функциям самого FLServer.
void __stdcall HkIServerImpl::Shutdown(void)Вызывается при завершении работы FLServer.
bool __stdcall HkIServerImpl::Startup(struct SStartupInfo const &p1)Вызывается при запуске FLServer, до загрузки персонажей и игровых данных.
bool __stdcall HkIServerImpl::Startup_AFTER(struct SStartupInfo const &p1)Вызывается уже после полной загрузки данных.
int __stdcall HkIServerImpl::Update()Вызывается на каждом тике FLServer.
Идеальное место для:
- таймеров
- периодических проверок
- логики, работающей постоянно
void __stdcall HkIServerImpl::OnConnect(unsigned int)
void __stdcall HkIServerImpl::OnConnect_AFTER(unsigned int)Вызывается при подключении клиента к серверу.
void __stdcall HkIServerImpl::Login(struct SLoginInfo const &li, unsigned int iClientID)Important
Плагины вызываются после этой функции.
Если тебе нужно отрабатывать до логина, используй:
OnConnectДо Login многие player-related команды вроде HkKick ещё не работают.
void __stdcall HkIServerImpl::Login_AFTER(struct SLoginInfo const &li, unsigned int iClientID)Вызывается после LoadUserSettings, то есть настройки персонажа уже загружены.
void __stdcall HkIServerImpl::CharacterSelect(struct CHARACTER_ID const & cId, unsigned int iClientID)
void __stdcall HkIServerImpl::CharacterSelect_AFTER(struct CHARACTER_ID const & cId, unsigned int iClientID)Вызывается при выборе персонажа.
void __stdcall HkIServerImpl::CreateNewCharacter(struct SCreateCharacterInfo const & scci, unsigned int iClientID)
void __stdcall HkIServerImpl::CreateNewCharacter_AFTER(struct SCreateCharacterInfo const & scci, unsigned int iClientID)Создание нового персонажа.
void __stdcall HkIServerImpl::DestroyCharacter(struct CHARACTER_ID const &cId, unsigned int iClientID)
void __stdcall HkIServerImpl::DestroyCharacter_AFTER(struct CHARACTER_ID const &cId, unsigned int iClientID)Удаление персонажа.
void __stdcall HkIServerImpl::DisConnect(unsigned int iClientID, enum EFLConnection p2)
void __stdcall HkIServerImpl::DisConnect_AFTER(unsigned int iClientID, enum EFLConnection p2)Вызывается при отключении игрока.
void __stdcall HkIServerImpl::PlayerLaunch(unsigned int iShip, unsigned int iClientID)
void __stdcall HkIServerImpl::PlayerLaunch_AFTER(unsigned int iShip, unsigned int iClientID)Запуск игрока в космос / вылет с базы.
void __stdcall HkIServerImpl::LaunchComplete(unsigned int iBaseID, unsigned int iShip)
void __stdcall HkIServerImpl::LaunchComplete_AFTER(unsigned int iBaseID, unsigned int iShip)Вызывается после завершения запуска.
void __stdcall HkIServerImpl::BaseEnter(unsigned int iBaseID, unsigned int iClientID)
void __stdcall HkIServerImpl::BaseEnter_AFTER(unsigned int iBaseID, unsigned int iClientID)
void __stdcall HkIServerImpl::BaseExit(unsigned int iBaseID, unsigned int iClientID)
void __stdcall HkIServerImpl::BaseExit_AFTER(unsigned int iBaseID, unsigned int iClientID)Вход / выход с базы.
void __stdcall HkIServerImpl::JumpInComplete(unsigned int iSystemID, unsigned int iShip)
void __stdcall HkIServerImpl::JumpInComplete_AFTER(unsigned int iSystemID, unsigned int iShip)Завершение прыжка в систему.
void __stdcall HkIServerImpl::SystemSwitchOutComplete(unsigned int iShip, unsigned int iClientID)
void __stdcall HkIServerImpl::SystemSwitchOutComplete_AFTER(unsigned int iShip, unsigned int iClientID)Выход из системы.
bool __stdcall LaunchPosHook(uint iSpaceID, struct CEqObj &p1, Vector &p2, Matrix &p3, int iDock)Позволяет изменить позицию появления корабля при запуске.
Очень полезен для:
- mobile docking
- кастомного undock
- телепортации
- proxy base логики
void __stdcall HkIServerImpl::SubmitChat(CHAT_ID, unsigned long, void const *, CHAT_ID, int)
void __stdcall HkIServerImpl::SubmitChat_AFTER(CHAT_ID, unsigned long, void const *, CHAT_ID, int)Отправка сообщений в чат.
Подходит для:
- кастомных чат-команд
- логирования чата
- фильтрации сообщений
- антиспама
void __stdcall HkCb_SendChat(uint iClientID, uint iTo, uint iSize, void *pRDL)Хук на отправку чат-пакета.
bool UserCmd_Process(uint iClientID, const wstring &wscCmd)Позволяет вставлять свои пользовательские команды без ковыряния SubmitChat.
Если команда обработана, функция должна вернуть:
truevoid UserCmd_Help(uint iClientID, const wstring &wscParam)Вызывается при использовании команды помощи.
Используется для вывода собственных пользовательских команд через:
PrintUserCmdTextbool ExecuteCommandString_Callback(CCmds* classptr, const wstring &wscCmdStr)Добавление собственных админ-команд.
Если команда обработана, рекомендуется:
- вернуть
true - выставить appropriate returncode (
NOFUNCTIONCALL, если нужно)
void CmdHelp_Callback(CCmds* classptr)Вызывается при админской команде help.
Используется для отображения добавленных админ-команд.
void __stdcall HkIServerImpl::FireWeapon(unsigned int iClientID, struct XFireWeaponInfo const &wpn)
void __stdcall HkIServerImpl::FireWeapon_AFTER(unsigned int iClientID, struct XFireWeaponInfo const &wpn)Выстрел оружием.
void __stdcall ShipDestroyed(DamageList *_dmg, DWORD *exs, uint iKill)Уничтожение корабля.
Один из самых полезных боевых хуков.
bool AllowPlayerDamage(uint iClientID, uint iClientIDTarget)Позволяет контролировать урон между игроками без грязного вмешательства в damage hooks.
void __stdcall HkCb_AddDmgEntry(DamageList *dmgList, unsigned short p1, float p2, enum DamageEntry::SubObjFate p3)
void __stdcall HkCb_AddDmgEntry_AFTER(DamageList *dmgList, unsigned short p1, float p2, enum DamageEntry::SubObjFate p3)Работа с записью урона.
int __stdcall HkCB_MissileTorpHit(char *ECX, char *p1, DamageList *dmg)Хук на попадание ракет / торпед.
void __stdcall HkCb_GeneralDmg(char *szECX)Общая обработка урона.
void __stdcall HkIServerImpl::ReqChangeCash(int p1, unsigned int iClientID)
void __stdcall HkIServerImpl::ReqChangeCash_AFTER(int p1, unsigned int iClientID)
void __stdcall HkIServerImpl::ReqSetCash(int p1, unsigned int iClientID)
void __stdcall HkIServerImpl::ReqSetCash_AFTER(int p1, unsigned int iClientID)Работа с изменением денег.
void __stdcall HkIServerImpl::GFGoodBuy(struct SGFGoodBuyInfo const &gbi, unsigned int iClientID)
void __stdcall HkIServerImpl::GFGoodBuy_AFTER(struct SGFGoodBuyInfo const &gbi, unsigned int iClientID)
void __stdcall HkIServerImpl::GFGoodSell(struct SGFGoodSellInfo const &gsi, unsigned int iClientID)
void __stdcall HkIServerImpl::GFGoodSell_AFTER(struct SGFGoodSellInfo const &gsi, unsigned int iClientID)Покупка и продажа товаров.
void __stdcall HkIServerImpl::ReqAddItem(...)
void __stdcall HkIServerImpl::ReqModifyItem(...)
void __stdcall HkIServerImpl::ReqRemoveItem(...)Работа с инвентарём и предметами.
void __stdcall HkIServerImpl::ReqEquipment(class EquipDescList const &edl, unsigned int iClientID)
void __stdcall HkIServerImpl::ReqEquipment_AFTER(class EquipDescList const &edl, unsigned int iClientID)Изменение экипировки.
void __stdcall HkIServerImpl::JettisonCargo(...)
void __stdcall HkIServerImpl::TractorObjects(...)
void __stdcall HkIServerImpl::SPScanCargo(...)Работа с грузом и объектами в космосе.
void __stdcall HkIServerImpl::InitiateTrade(...)
void __stdcall HkIServerImpl::AcceptTrade(...)
void __stdcall HkIServerImpl::TerminateTrade(...)Все основные хуки торговли между игроками.
Полный контроль над логикой трейда.
void __stdcall HkIServerImpl::ActivateEquip(...)
void __stdcall HkIServerImpl::ActivateCruise(...)
void __stdcall HkIServerImpl::ActivateThrusters(...)Активация оборудования, круиза и форсажа.
void __stdcall HkIServerImpl::SetManeuver(...)
void __stdcall HkIServerImpl::SetTarget(...)
void __stdcall HkIServerImpl::SetWeaponGroup(...)Манёвры, цели, группы оружия.
void __stdcall HkIServerImpl::SPRequestUseItem(struct SSPUseItem const &p1, unsigned int iClientID)Использование предметов / оборудования.
Запросы клиента на навигацию, позиции группы, статистику и ранг.
Работа с UI и состоянием интерфейса.
Работа с миссиями, взаимодействием и данными по локациям.
void __stdcall HkIServerImpl::MineAsteroid(...)
void __stdcall HkIServerImpl::MineAsteroid_AFTER(...)Хук для контроля майнинга.
void __stdcall HkIServerImpl::SPMunitionCollision(...)
void __stdcall HkIServerImpl::SPObjCollision(...)
void __stdcall HkIServerImpl::SPObjUpdate(...)Коллизии, обновления объектов, столкновения.
void __stdcall HkIServerImpl::GoTradelane(...)
void __stdcall HkIServerImpl::StopTradelane(...)Контроль использования trade lane.
int __cdecl HkCb_Dock_Call(unsigned int const &uShipID, unsigned int const &uSpaceID, int p3, enum DOCK_HOST_RESPONSE p4)Один из самых мощных хуков.
Вызывается при любом docking-поведении:
- игроки
- NPC
- вход в очередь
- попытка стыковки
Идеален для:
- mobile docking
- custom docking logic
- ограничений стыковки
- проверки расстояния / условий
void __cdecl HkCb_Update_Time(double dInterval)
void __cdecl HkCb_Update_Time_AFTER(double dInterval)Хук на обновление глобального времени.
Оригинальная функция:
Timing::UpdateGlobalTime(dInterval)void __stdcall HkCb_Elapse_Time(float p1)
void __stdcall HkCb_Elapse_Time_AFTER(float p1)Главный рабочий цикл:
- NPC
- физика
- игровые процессы
Оригинальная функция:
Server.ElapseTime(p1)Это уже не прямые хуки FLServer, а callback-и самого FLHook.
void HkTimerCheckKick()Вызывается каждую секунду.
Идеален для:
- таймеров
- delayed actions
- проверок состояний
- cleanup
void SendDeathMsg(const wstring &wscMsg, uint iSystemID, uint iClientIDVictim, uint iClientIDKiller)Позволяет изменить механику отправки death messages.
void ClearClientInfo(uint iClientID)Вызывается при подключении нового игрока.
Сбрасывай здесь:
- player-specific state
- кэш
- временные структуры
- свои plugin-data по клиенту
void LoadSettings()Вызывается:
- при старте FLHook / FLServer
- при
rehash
Здесь нужно:
- загружать
.ini - обновлять конфиги
- пересчитывать ID / кэш / настройки
void BaseDestroyed(uint iObject, uint iClientIDBy)Вызывается при уничтожении докабельной базы.
iObject— SpaceID базыiClientIDBy— кто уничтожил
Если говорить честно, то 90% серверной логики обычно делается вот на этих хуках:
PlayerLaunchBaseEnterBaseExitCharacterSelectLoginDisConnect
UserCmd_ProcessExecuteCommandString_CallbackCmdHelp_Callback
ShipDestroyedAllowPlayerDamageFireWeaponHkCb_AddDmgEntry
GFGoodBuyGFGoodSellReqEquipmentReqChangeCashReqModifyItem
Dock_CallLaunchPosHookMineAsteroidHkTimerCheckKick