Серверный открытый API
ServerOpenAPI — это серверный API LuxelSetManager для других модов.
Он нужен, чтобы сторонний серверный мод мог:
реагировать на события LuxelSetManager;
выдавать игрокам пресеты оружия, экипировки и точек спавна;
удалять доступ к пресетам;
уменьшать срок действия уже выданных пресетов.
Где находится API
Класс API находится в серверной части LuxelSetManager, доступен для вызова из модулей:
4_World5_Mission
Глобальный доступ к API:
ref LXSM_ServerOpenAPI LuxelSetManagerAPI = LXSM_GetServerOpenAPI();Пример простого вызова:
LXSM_GetServerOpenAPI().GiveWeapon("76561199190066861", "AKM", 7);Для каких модов это полезно
ServerOpenAPI удобно использовать в модах, где действия игрока должны превращаться в награды или ограничения.
Например:
система достижений;
BattlePass;
система уровней;
система репутации;
квестовый мод;
Deathmatch;
мод на фракции;
ивентовая система;
система ежедневных наград;
мод с профессиями или классами персонажей;
и т.п.
Важно!
Работайте со SteamID64 игрока.
Обычно его можно получить так:
string PlayerSteamID = Player.GetIdentity().GetPlainId();Функции API возвращают bool:
true— действие успешно выполнено;false— действие не выполнено.
Если действие не выполнено, LuxelSetManager запишет ошибку в свои серверные логи OpenAPI.
Сроки выдачи
Функции вида Give... используют параметр Days.
LXSM_GetServerOpenAPI().GiveWeapon(PlayerSteamID, "AKM", 7);Значения:
-1— выдать навсегда;1и больше — выдать на указанное количество дней.
Если у игрока уже есть этот пресет со временным сроком, новый срок будет добавлен к текущему сроку.
Если у игрока нет этого пресета, срок считается от текущего серверного времени.
Выдача на минуты
Для коротких наград есть функции вида Give...Minutes.
LXSM_GetServerOpenAPI().GiveSpawnPointMinutes(PlayerSteamID, "NorthWestAirfield", 30);Параметр Minutes должен быть больше 0.
Такие функции удобно использовать для временных ивентов, арен и тестовых наград.
События ServerOpenAPI
События можно переопределять через modded class LXSM_ServerOpenAPI.
OnPlayerRespawned
Вызывается после респавна игрока.
void OnPlayerRespawned(PlayerBase Player, string UsedSpawnPointPresetID, vector SpawnPosition, string UsedSurvivorClassname);Параметры:
Player— игрок после респавна;UsedSpawnPointPresetID— ID использованного пресета точки спавна;SpawnPosition— итоговая позиция игрока;UsedSurvivorClassname— класс созданного персонажа.
Пример:
#ifdef SERVER
modded class LXSM_ServerOpenAPI
{
override void OnPlayerRespawned(PlayerBase Player, string UsedSpawnPointPresetID, vector SpawnPosition, string UsedSurvivorClassname)
{
super.OnPlayerRespawned(Player, UsedSpawnPointPresetID, SpawnPosition, UsedSurvivorClassname);
if (!Player || !Player.GetIdentity())
{
return;
}
string PlayerSteamID = Player.GetIdentity().GetPlainId();
Print("[MY MOD] PLAYER RESPAWNED: " + PlayerSteamID + " | SPAWN POINT: " + UsedSpawnPointPresetID + " | POSITION: " + SpawnPosition.ToString());
}
}
#endifИспользуйте этот шаблон как основу и добавляйте свою логику после получения SteamID64 игрока.
OnPlayerEquipped
Вызывается после экипирования игрока выбранной экипировкой.
void OnPlayerEquipped(PlayerBase Player, string UsedEquipmentPresetID);Параметры:
Player— игрок;UsedEquipmentPresetID— ID использованного пресета экипировки.
Пример:
#ifdef SERVER
modded class LXSM_ServerOpenAPI
{
override void OnPlayerEquipped(PlayerBase Player, string UsedEquipmentPresetID)
{
super.OnPlayerEquipped(Player, UsedEquipmentPresetID);
if (!Player || !Player.GetIdentity())
{
return;
}
if (UsedEquipmentPresetID == "MedicBlue")
{
Print("[MY MOD] MEDIC EQUIPMENT WAS USED BY: " + Player.GetIdentity().GetPlainId());
}
}
}
#endifOnPlayerArmed
Вызывается после выдачи оружия игроку.
void OnPlayerArmed(PlayerBase Player, string UsedMainWeaponPresetID, string UsedSecondaryWeaponPresetID, string UsedPistolWeaponPresetID, string UsedKnifeWeaponPresetID);Параметры:
Player— игрок;UsedMainWeaponPresetID— ID основного оружия;UsedSecondaryWeaponPresetID— ID дополнительного оружия;UsedPistolWeaponPresetID— ID пистолета;UsedKnifeWeaponPresetID— ID холодного оружия.
Пример:
#ifdef SERVER
modded class LXSM_ServerOpenAPI
{
override void OnPlayerArmed(PlayerBase Player, string UsedMainWeaponPresetID, string UsedSecondaryWeaponPresetID, string UsedPistolWeaponPresetID, string UsedKnifeWeaponPresetID)
{
super.OnPlayerArmed(Player, UsedMainWeaponPresetID, UsedSecondaryWeaponPresetID, UsedPistolWeaponPresetID, UsedKnifeWeaponPresetID);
if (!Player || !Player.GetIdentity())
{
return;
}
Print("[MY MOD] PLAYER ARMED: " + Player.GetIdentity().GetPlainId() + " | MAIN: " + UsedMainWeaponPresetID);
}
}
#endifФункции выдачи пресетов
Оружие
bool GiveWeapon(string PlayerSteamID, string PresetID, int Days = -1);
bool GiveWeapons(string PlayerSteamID, array<string> PresetIDs, int Days = -1);
bool GiveWeaponMinutes(string PlayerSteamID, string PresetID, int Minutes);
bool GiveWeaponsMinutes(string PlayerSteamID, array<string> PresetIDs, int Minutes);Пример выдачи одного оружия на 7 дней:
bool Result = LXSM_GetServerOpenAPI().GiveWeapon(PlayerSteamID, "AKM", 7);Пример выдачи нескольких оружий навсегда:
array<string> WeaponPresetIDs = new array<string>;
WeaponPresetIDs.Insert("AKM");
WeaponPresetIDs.Insert("M4A1");
WeaponPresetIDs.Insert("LAR");
bool Result = LXSM_GetServerOpenAPI().GiveWeapons(PlayerSteamID, WeaponPresetIDs, -1);Или:
bool Result = LXSM_GetServerOpenAPI().GiveWeapons(PlayerSteamID, {"AKM", "M4A1", "LAR"}, -1);Экипировка
bool GiveEquipment(string PlayerSteamID, string PresetID, int Days = -1);
bool GiveEquipments(string PlayerSteamID, array<string> PresetIDs, int Days = -1);
bool GiveEquipmentMinutes(string PlayerSteamID, string PresetID, int Minutes);
bool GiveEquipmentsMinutes(string PlayerSteamID, array<string> PresetIDs, int Minutes);Пример выдачи экипировки на 14 дней:
bool Result = LXSM_GetServerOpenAPI().GiveEquipment(PlayerSteamID, "MilitaryTTSKO", 14);Точки спавна
bool GiveSpawnPoint(string PlayerSteamID, string PresetID, int Days = -1);
bool GiveSpawnPoints(string PlayerSteamID, array<string> PresetIDs, int Days = -1);
bool GiveSpawnPointMinutes(string PlayerSteamID, string PresetID, int Minutes);
bool GiveSpawnPointsMinutes(string PlayerSteamID, array<string> PresetIDs, int Minutes);Пример выдачи временной точки спавна на 120 минут (2 часа):
bool Result = LXSM_GetServerOpenAPI().GiveSpawnPointMinutes(PlayerSteamID, "NorthWestAirfield", 120);Функции удаления пресетов
Оружие
bool RemoveWeapon(string PlayerSteamID, string PresetID);
bool RemoveWeapons(string PlayerSteamID, array<string> PresetIDs);Экипировка
bool RemoveEquipment(string PlayerSteamID, string PresetID);
bool RemoveEquipments(string PlayerSteamID, array<string> PresetIDs);Точки спавна
bool RemoveSpawnPoint(string PlayerSteamID, string PresetID);
bool RemoveSpawnPoints(string PlayerSteamID, array<string> PresetIDs);Пример:
bool Result = LXSM_GetServerOpenAPI().RemoveEquipment(PlayerSteamID, "FactionBlueUniform");Функции уменьшения срока
Оружие
bool DecreaseWeapon(string PlayerSteamID, string PresetID, int Days);
bool DecreaseWeapons(string PlayerSteamID, array<string> PresetIDs, int Days);Экипировка
bool DecreaseEquipment(string PlayerSteamID, string PresetID, int Days);
bool DecreaseEquipments(string PlayerSteamID, array<string> PresetIDs, int Days);Точки спавна
bool DecreaseSpawnPoint(string PlayerSteamID, string PresetID, int Days);
bool DecreaseSpawnPoints(string PlayerSteamID, array<string> PresetIDs, int Days);Пример штрафа: уменьшить срок владения точкой спавна на 1 день.
bool Result = LXSM_GetServerOpenAPI().DecreaseSpawnPoint(PlayerSteamID, "NorthWestAirfield", 1);Если после уменьшения срок закончился, доступ к пресету будет удалён.
Если пресет был выдан навсегда, уменьшение срока удалит этот пресет у игрока.
Пример: награда за достижение
Допустим, Ваш мод достижений считает убийства игрока. Когда игрок достигает 100 убийств, можно выдать ему оружие на 7 дней.
#ifdef SERVER
class MyAchievementsHandler
{
void TryGiveKillsReward(PlayerBase Player, int KillsCount)
{
if (!Player || !Player.GetIdentity())
{
return;
}
if (KillsCount < 100)
{
return;
}
string PlayerSteamID = Player.GetIdentity().GetPlainId();
bool Result = LXSM_GetServerOpenAPI().GiveWeapon(PlayerSteamID, "AKM", 7);
if (Result)
{
Print("[MY ACHIEVEMENTS] REWARD GIVEN TO: " + PlayerSteamID);
}
}
}
#endifПример: награда BattlePass
На определённом уровне BattlePass можно выдать сразу несколько пресетов.
#ifdef SERVER
class MyBattlepassHandler
{
void GiveLevelReward(PlayerBase Player)
{
if (!Player || !Player.GetIdentity())
{
return;
}
string PlayerSteamID = Player.GetIdentity().GetPlainId();
array<string> EquipmentPresetIDs = new array<string>;
EquipmentPresetIDs.Insert("MilitaryTTSKO");
EquipmentPresetIDs.Insert("MilitaryGorkaWinter");
LXSM_GetServerOpenAPI().GiveEquipments(PlayerSteamID, EquipmentPresetIDs, 30);
LXSM_GetServerOpenAPI().GiveSpawnPoint(PlayerSteamID, "NorthWestAirfield", 30);
}
}
#endifПример: система фракций
Когда игрок вступает во фракцию, можно выдать ему форму и точку спавна. Когда выходит — удалить.
#ifdef SERVER
class MyFactionHandler
{
void OnPlayerJoinedFaction(PlayerBase Player)
{
if (!Player || !Player.GetIdentity())
{
return;
}
string PlayerSteamID = Player.GetIdentity().GetPlainId();
LXSM_GetServerOpenAPI().GiveEquipment(PlayerSteamID, "FactionBlueUniform", -1);
LXSM_GetServerOpenAPI().GiveSpawnPoint(PlayerSteamID, "FactionBlueBase", -1);
}
void OnPlayerLeftFaction(PlayerBase Player)
{
if (!Player || !Player.GetIdentity())
{
return;
}
string PlayerSteamID = Player.GetIdentity().GetPlainId();
LXSM_GetServerOpenAPI().RemoveEquipment(PlayerSteamID, "FactionBlueUniform");
LXSM_GetServerOpenAPI().RemoveSpawnPoint(PlayerSteamID, "FactionBlueBase");
}
}
#endifВыдача доступа ко всем пресетам
Через ServerOpenAPI можно выдать игроку доступ сразу ко всем предустановленным пресетам определённой категории.
Для этого используется специальный ID:
$ALL_PRESETS$$ALL_PRESETS$ работает отдельно для каждой категории:
GiveWeapon- все предустановленные пресеты оружия;GiveEquipment- все предустановленные пресеты экипировки;GiveSpawnPoint- все предустановленные точки спавна.
Пример выдачи всех предустановленных оружий навсегда:
string PlayerSteamID = Player.GetIdentity().GetPlainId();
LXSM_GetServerOpenAPI().GiveWeapon(PlayerSteamID, "$ALL_PRESETS$", -1);Пример выдачи всех предустановленных экипировок на 7 дней:
string PlayerSteamID = Player.GetIdentity().GetPlainId();
LXSM_GetServerOpenAPI().GiveEquipment(PlayerSteamID, "$ALL_PRESETS$", 7);Пример выдачи всех предустановленных точек спавна на 60 минут:
string PlayerSteamID = Player.GetIdentity().GetPlainId();
LXSM_GetServerOpenAPI().GiveSpawnPointMinutes(PlayerSteamID, "$ALL_PRESETS$", 60);