Skip to content

Шпаргалка по Enforce Script

Главная | Шпаргалка


Краткий справочник по Enforce Script для DayZ на одной странице. Добавьте в закладки.


Типы

ТипОписаниеЗначение по умолчаниюПример
int32-битное знаковое целое0int x = 42;
float32-битное с плавающей точкой0.0float f = 3.14;
boolЛогическийfalsebool b = true;
stringНеизменяемый тип-значение""string s = "hello";
vector3-компонентный float (x,y,z)"0 0 0"vector v = "1 2 3";
typenameСсылка на типnulltypename t = PlayerBase;
ClassКорень всех ссылочных типовnull---
voidНет возвращаемого значения------

Пределы: int.MAX = 2147483647, int.MIN = -2147483648, float.MAX, float.MIN


Методы Array (array<T>)

МетодВозвращаетПримечания
Insert(item)int (индекс)Добавить в конец
InsertAt(item, idx)voidВставить на позицию
Get(idx) / arr[idx]TДоступ по индексу
Set(idx, item)voidЗаменить по индексу
Find(item)intИндекс или -1
Count()intКоличество элементов
IsValidIndex(idx)boolПроверка границ
Remove(idx)voidНеупорядоченное (меняет с последним!)
RemoveOrdered(idx)voidСохраняет порядок
RemoveItem(item)voidНайти + удалить (упорядоченно)
Clear()voidУдалить все
Sort() / Sort(true)voidПо возрастанию / по убыванию
ShuffleArray()voidПеремешать
Invert()voidОбратить порядок
GetRandomElement()TСлучайный выбор
InsertAll(other)voidДобавить все из другого
Copy(other)voidЗаменить копией
Resize(n)voidИзменить размер (заполняет значениями по умолчанию)
Reserve(n)voidПредвыделить ёмкость

Псевдонимы типов: TStringArray, TIntArray, TFloatArray, TBoolArray, TVectorArray


Методы Map (map<K,V>)

МетодВозвращаетПримечания
Insert(key, val)boolДобавить новый
Set(key, val)voidВставить или обновить
Get(key)VВозвращает значение по умолчанию, если отсутствует
Find(key, out val)boolБезопасное получение
Contains(key)boolПроверка наличия
Remove(key)voidУдалить по ключу
Count()intКоличество записей
GetKey(idx)KКлюч по индексу (O(n))
GetElement(idx)VЗначение по индексу (O(n))
GetKeyArray()array<K>Все ключи
GetValueArray()array<V>Все значения
Clear()voidУдалить все

Методы Set (set<T>)

МетодВозвращает
Insert(item)int (индекс)
Find(item)int (индекс или -1)
Get(idx)T
Remove(idx)void
RemoveItem(item)void
Count()int
Clear()void

Синтаксис классов

c
class MyClass extends BaseClass
{
    protected int m_Value;                  // поле
    private ref array<string> m_List;       // владеющая ссылка

    void MyClass() { m_List = new array<string>; }  // конструктор
    void ~MyClass() { }                              // деструктор

    override void OnInit() { super.OnInit(); }       // переопределение
    static int GetCount() { return 0; }              // статический метод
};

Доступ: private | protected | (по умолчанию публичный) Модификаторы: static | override | ref | const | out | notnullМодификация: modded class MissionServer { override void OnInit() { super.OnInit(); } }


Управление потоком

c
// if / else if / else
if (a > 0) { } else if (a == 0) { } else { }

// for
for (int i = 0; i < count; i++) { }

// foreach (значение)
foreach (string item : myArray) { }

// foreach (индекс + значение)
foreach (int i, string item : myArray) { }

// foreach (map: ключ + значение)
foreach (string key, int val : myMap) { }

// while
while (condition) { }

// switch (НЕТ проваливания!)
switch (val) { case 0: Print("zero"); break; default: break; }

Методы строк

МетодВозвращаетПример
s.Length()int"hello".Length() = 5
s.Substring(start, len)string"hello".Substring(1,3) = "ell"
s.IndexOf(sub)int-1 если не найдено
s.LastIndexOf(sub)intПоиск с конца
s.Contains(sub)bool
s.Replace(old, new)intИзменяет на месте, возвращает количество
s.ToLower()voidНа месте!
s.ToUpper()voidНа месте!
s.TrimInPlace()voidНа месте!
s.Split(delim, out arr)voidРазделяет в TStringArray
s.Get(idx)stringОдин символ
s.Set(idx, ch)voidЗаменить символ
s.ToInt()intПарсинг целого
s.ToFloat()floatПарсинг дробного
s.ToVector()vectorПарсинг "1 2 3"
string.Format(fmt, ...)stringПодстановки %1..%9
string.Join(sep, arr)stringОбъединение элементов массива

Математические методы

МетодОписание
Math.RandomInt(min, max)[min, max) исключая max
Math.RandomIntInclusive(min, max)[min, max]
Math.RandomFloat01()[0, 1]
Math.RandomBool()Случайный true/false
Math.Round(f) / Floor(f) / Ceil(f)Округление
Math.AbsFloat(f) / AbsInt(i)Абсолютное значение
Math.Clamp(val, min, max)Ограничение диапазоном
Math.Min(a, b) / Max(a, b)Минимум/максимум
Math.Lerp(a, b, t)Линейная интерполяция
Math.InverseLerp(a, b, val)Обратная интерполяция
Math.Pow(base, exp) / Sqrt(f)Степень/корень
Math.Sin(r) / Cos(r) / Tan(r)Тригонометрия (радианы)
Math.Atan2(y, x)Угол из компонентов
Math.NormalizeAngle(deg)Приведение к 0-360
Math.SqrFloat(f) / SqrInt(i)Квадрат

Константы: Math.PI, Math.PI2, Math.PI_HALF, Math.DEG2RAD, Math.RAD2DEG

Вектор: vector.Distance(a,b), vector.DistanceSq(a,b), vector.Direction(a,b), vector.Dot(a,b), vector.Lerp(a,b,t), v.Length(), v.Normalized()


Распространённые паттерны

Безопасное приведение типа

c
PlayerBase player;
if (Class.CastTo(player, obj))
{
    player.DoSomething();
}

Инлайн-приведение

c
PlayerBase player = PlayerBase.Cast(obj);
if (player) player.DoSomething();

Проверка на null

c
if (!player) return;
if (!player.GetIdentity()) return;
string name = player.GetIdentity().GetName();

Проверка IsAlive (требуется EntityAI)

c
EntityAI eai;
if (Class.CastTo(eai, obj) && eai.IsAlive()) { }

Итерация по Map через foreach

c
foreach (string key, int value : myMap)
{
    Print(key + " = " + value.ToString());
}

Преобразование перечислений

c
string name = typename.EnumToString(EDamageState, state);
int val; typename.StringToEnum(EDamageState, "RUINED", val);

Битовые флаги

c
int flags = FLAG_A | FLAG_B;       // объединить
if (flags & FLAG_A) { }           // проверить
flags = flags & ~FLAG_B;          // удалить

Чего НЕ существует

Отсутствующая возможностьОбходной путь
Тернарный ? :if/else
do...whilewhile(true) { ... break; }
try/catchЗащитные проверки + ранний return
Множественное наследованиеОдиночное + композиция
Перегрузка операторовИменованные методы (кроме [] через Get/Set)
ЛямбдыИменованные методы
nullptrnull / NULL
\\ / \" в строкахИзбегать (CParser ломается)
#includeconfig.cpp files[]
Пространства имёнПрефиксы имён (MyMod_, VPP_)
Интерфейсы / абстрактныеПустые базовые методы
Проваливание в switchКаждый case независим
#define со значениямиИспользуйте const
Выражения в параметрах по умолчаниюТолько литералы/NULL
Вариадические параметрыstring.Format или массивы
Переобъявление переменных в else-ifУникальные имена в каждой ветке

Создание виджетов (программно)

c
// Получение рабочей области
WorkspaceWidget ws = GetGame().GetWorkspace();

// Создание из макета
Widget root = ws.CreateWidgets("MyMod/gui/layouts/MyPanel.layout");

// Поиск дочернего виджета
TextWidget title = TextWidget.Cast(root.FindAnyWidget("TitleText"));
if (title) title.SetText("Hello World");

// Показать/скрыть
root.Show(true);
root.Show(false);

Паттерн RPC

Регистрация (сервер):

c
// В инициализации 3_Game или 4_World:
GetGame().RPCSingleParam(null, MY_RPC_ID, null, true, identity);  // RPC движка

// Или через строковую маршрутизацию RPC (MyRPC / CF):
GetRPCManager().AddRPC("MyMod", "RPC_Handler", this, 2);  // CF
MyRPC.Register("MyMod", "MyRoute", this, MyRPCSide.SERVER);  // MyMod

Отправка (клиент серверу):

c
Param2<string, int> data = new Param2<string, int>("itemName", 5);
GetGame().RPCSingleParam(null, MY_RPC_ID, data, true);

Приём (обработчик на сервере):

c
void RPC_Handler(CallType type, ParamsReadContext ctx, PlayerIdentity sender, Object target)
{
    if (type != CallType.Server) return;
    if (!sender) return;

    Param2<string, int> data;
    if (!ctx.Read(data)) return;

    string itemName = data.param1;
    int quantity = data.param2;
    // Обработка...
}

Обработка ошибок

c
ErrorEx("message");                              // Серьёзность ERROR по умолчанию
ErrorEx("info", ErrorExSeverity.INFO);           // Информация
ErrorEx("warning", ErrorExSeverity.WARNING);     // Предупреждение
Print("debug output");                           // Лог скрипта
string stack = DumpStackString();                // Получить стек вызовов

Файловый ввод-вывод

c
// Пути: "$profile:", "$saves:", "$mission:", "$CurrentDir:"
bool exists = FileExist("$profile:MyMod/config.json");
MakeDirectory("$profile:MyMod");

// JSON
MyConfig cfg = new MyConfig();
JsonFileLoader<MyConfig>.JsonLoadFile(path, cfg);  // Возвращает VOID!
JsonFileLoader<MyConfig>.JsonSaveFile(path, cfg);

// Прямой файл
FileHandle fh = OpenFile(path, FileMode.WRITE);
if (fh != 0) { FPrintln(fh, "line"); CloseFile(fh); }

Создание объектов

c
// Базовое
Object obj = GetGame().CreateObject("AK101", pos, false, false, true);

// С флагами
Object obj = GetGame().CreateObjectEx("Barrel_Green", pos, ECE_PLACE_ON_SURFACE);

// В инвентаре игрока
player.GetInventory().CreateInInventory("BandageDressing");

// Как вложение
weapon.GetInventory().CreateAttachment("ACOGOptic");

// Удаление
GetGame().ObjectDelete(obj);

Ключевые глобальные функции

c
GetGame()                          // Экземпляр CGame
GetGame().GetPlayer()              // Локальный игрок (только КЛИЕНТ, null на сервере!)
GetGame().GetPlayers(out arr)      // Все игроки (сервер)
GetGame().GetWorld()               // Экземпляр мира
GetGame().GetTickTime()            // Серверное время (float)
GetGame().GetWorkspace()           // Рабочая область UI
GetGame().SurfaceY(x, z)          // Высота рельефа
GetGame().IsServer()               // true на сервере
GetGame().IsClient()               // true на клиенте
GetGame().IsMultiplayer()          // true в мультиплеере

Полная документация: Вики моддинга DayZ | Подводные камни | Обработка ошибок

Released under CC BY-SA 4.0 | Code examples under MIT License