Skip to content

Rozdział 4.6: Pakowanie PBO ​


Wprowadzenie ​

PBO (Packed Bank of Objects) to format archiwum DayZ -- odpowiednik pliku .zip dla zawartości gry. Każdy mod ładowany przez grę jest dostarczany jako jeden lub więcej plików PBO. Gdy gracz subskrybuje moda w Steam Workshop, pobiera pliki PBO. Gdy serwer ładuje mody, odczytuje pliki PBO. PBO to końcowy produkt całego procesu moddingu.

Zrozumienie jak prawidłowo tworzyć PBO -- kiedy binaryzować, jak ustawiać prefiksy, jak strukturyzować dane wyjściowe i jak zautomatyzować proces -- to ostatni krok między plikami źródłowymi a działającym modem. Ten rozdział obejmuje wszystko od podstawowej koncepcji po zaawansowane zautomatyzowane przepływy budowania.


Spis treści ​


Czym jest PBO? ​

PBO to płaski plik archiwum zawierający drzewo katalogów z zasobami gry. Nie stosuje kompresji (w przeciwieństwie do ZIP) -- pliki wewnątrz są przechowywane w oryginalnym rozmiarze. „Pakowanie" jest czysto organizacyjne: wiele plików staje się jednym plikiem z wewnętrzną strukturą ścieżek.

Kluczowe cechy ​

  • Brak kompresji: Pliki są przechowywane bez zmian. Rozmiar PBO równa się sumie zawartości plus mały nagłówek.
  • Płaski nagłówek: Lista wpisów plików ze ścieżkami, rozmiarami i offsetami.
  • Metadane prefiksu: Każde PBO deklaruje wewnętrzny prefiks ścieżki, który mapuje jego zawartość do wirtualnego systemu plików silnika.
  • Tylko do odczytu w trakcie działania: Silnik odczytuje z PBO, ale nigdy do nich nie zapisuje.
  • Podpisywane dla trybu wieloosobowego: PBO mogą być podpisane parą kluczy w stylu Bohemia do weryfikacji sygnatur na serwerze.

Dlaczego PBO zamiast luźnych plików ​

  • Dystrybucja: Jeden plik na komponent moda jest prostszy niż tysiące luźnych plików.
  • Integralność: Podpisywanie kluczem zapewnia, że mod nie został zmodyfikowany.
  • Wydajność: Operacje I/O silnika są zoptymalizowane pod odczyt z PBO.
  • Organizacja: System prefiksów zapewnia brak kolizji ścieżek między modami.

Wewnętrzna struktura PBO ​

Gdy otworzysz PBO (używając narzędzia takiego jak PBO Manager lub MikeroTools), zobaczysz drzewo katalogów:

MyMod.pbo
  $PBOPREFIX$                    <-- Plik tekstowy zawierający ścieżkę prefiksu
  config.bin                      <-- Zbinaryzowany config.cpp (lub config.cpp jeśli -packonly)
  Scripts/
    3_Game/
      MyConstants.c
    4_World/
      MyManager.c
    5_Mission/
      MyUI.c
  data/
    models/
      my_item.p3d                 <-- Zbinaryzowany ODOL (lub MLOD jeśli -packonly)
    textures/
      my_item_co.paa
      my_item_nohq.paa
      my_item_smdi.paa
    materials/
      my_item.rvmat
  sound/
    gunshot_01.ogg
  GUI/
    layouts/
      my_panel.layout

$PBOPREFIX$ ​

Plik $PBOPREFIX$ to mały plik tekstowy w katalogu głównym PBO, który deklaruje prefiks ścieżki moda. Na przykład:

MyMod

Mówi to silnikowi: „Gdy coś odwołuje się do MyMod\data\textures\my_item_co.paa, szukaj wewnątrz tego PBO pod ścieżką data\textures\my_item_co.paa."

config.bin vs. config.cpp ​

  • config.bin: Zbinaryzowana (binarna) wersja config.cpp, utworzona przez Binarize. Szybsza do parsowania przy ładowaniu.
  • config.cpp: Oryginalna konfiguracja w formacie tekstowym. Działa w silniku, ale jest nieco wolniejsza do parsowania.

Gdy budujesz z binaryzacją, config.cpp staje się config.bin. Gdy używasz -packonly, config.cpp jest dołączany bez zmian.


AddonBuilder: Narzędzie do pakowania ​

AddonBuilder to oficjalne narzędzie Bohemia do pakowania PBO, dołączone do DayZ Tools. Może działać w trybie GUI lub wiersza poleceń.

Tryb GUI ​

  1. Uruchom AddonBuilder z DayZ Tools Launcher.
  2. Katalog źródłowy: Wskaż folder moda na dysku P: (np. P:\MyMod).
  3. Katalog wyjściowy: Wskaż folder wyjściowy (np. P:\output).
  4. Opcje:
    • Binarize: Zaznacz, aby uruchomić Binarize na zawartości (konwertuje P3D, tekstury, konfiguracje).
    • Sign: Zaznacz i wybierz klucz do podpisania PBO.
    • Prefix: Wprowadź prefiks moda (np. MyMod).
  5. Kliknij Pack.

Tryb wiersza poleceń ​

Tryb wiersza poleceń jest preferowany dla zautomatyzowanych budowań:

bash
AddonBuilder.exe [ścieżka_źródłowa] [ścieżka_wyjściowa] [opcje]

Pełny przykład:

bash
"P:\DayZ Tools\Bin\AddonBuilder\AddonBuilder.exe" ^
    "P:\MyMod" ^
    "P:\output" ^
    -prefix="MyMod" ^
    -sign="P:\keys\MyKey"

Opcje wiersza poleceń ​

FlagaOpis
-prefix=<ścieżka>Ustawia wewnętrzny prefiks PBO (krytyczny dla rozwiązywania ścieżek)
-packonlyPomija binaryzację, pakuje pliki bez zmian
-sign=<ścieżka_klucza>Podpisuje PBO określonym kluczem BI (ścieżka klucza prywatnego, bez rozszerzenia)
-include=<ścieżka>Lista plików do dołączenia -- pakuje tylko pliki pasujące do tego filtra
-exclude=<ścieżka>Lista plików do wykluczenia -- pomija pliki pasujące do tego filtra
-binarize=<ścieżka>Ścieżka do Binarize.exe (jeśli nie w domyślnej lokalizacji)
-temp=<ścieżka>Katalog tymczasowy dla wyjścia Binarize
-clearCzyści katalog wyjściowy przed pakowaniem
-project=<ścieżka>Ścieżka dysku projektu (zwykle P:\)

Flaga -packonly ​

Flaga -packonly to jedna z najważniejszych opcji w AddonBuilder. Nakazuje narzędziu pominięcie całej binaryzacji i pakowanie plików źródłowych dokładnie w takiej formie, w jakiej są.

Kiedy używać -packonly ​

Zawartość modaUżywać -packonly?Powód
Tylko skrypty (pliki .c)TakSkrypty nigdy nie są binaryzowane
Layouty UI (.layout)TakLayouty nigdy nie są binaryzowane
Tylko audio (.ogg)TakOGG jest już gotowy dla gry
Wstępnie skonwertowane tekstury (.paa)TakJuż w formacie końcowym
Config.cpp (bez CfgVehicles)TakProste konfiguracje działają bez binaryzacji
Config.cpp (z CfgVehicles)NieDefinicje przedmiotów wymagają zbinaryzowanej konfiguracji
Modele P3D (MLOD)NiePowinny być zbinaryzowane do ODOL dla wydajności
Tekstury TGA/PNG (wymagają konwersji)NieMuszą być skonwertowane do PAA

Praktyczne wskazówki ​

Dla moda zawierającego tylko skrypty (jak framework lub mod narzędziowy bez własnych przedmiotów):

bash
AddonBuilder.exe "P:\MyScriptMod" "P:\output" -prefix="MyScriptMod" -packonly

Dla moda z przedmiotami (bronie, ubrania, pojazdy z modelami i teksturami):

bash
AddonBuilder.exe "P:\MyItemMod" "P:\output" -prefix="MyItemMod" -sign="P:\keys\MyKey"

Wskazówka: Wiele modów dzieli się na wiele PBO właśnie w celu optymalizacji procesu budowania. PBO ze skryptami używają -packonly (szybkie), podczas gdy PBO z danymi zawierającymi modele i tekstury przechodzą pełną binaryzację (wolniejszą, ale konieczną).


Flaga -prefix ​

Flaga -prefix ustawia wewnętrzny prefiks ścieżki PBO, który jest zapisywany do pliku $PBOPREFIX$ wewnątrz PBO. Ten prefiks jest krytyczny -- określa, jak silnik rozwiązuje ścieżki do zawartości wewnątrz PBO.

Jak działa prefiks ​

Źródło: P:\MyMod\data\textures\item_co.paa
Prefiks: MyMod
Wewnętrzna ścieżka PBO: data\textures\item_co.paa

Rozwiązywanie przez silnik: MyMod\data\textures\item_co.paa
  --> Szuka w MyMod.pbo: data\textures\item_co.paa
  --> Znaleziono!

Prefiksy wielopoziomowe ​

Dla modów używających struktury podfolderów, prefiks może zawierać wiele poziomów:

bash
# Źródło na dysku P:
P:\MyMod\MyMod\Scripts\3_Game\MyClass.c

# Jeśli prefiks to "MyMod\MyMod\Scripts"
# Wewnątrz PBO: 3_Game\MyClass.c
# Ścieżka silnika: MyMod\MyMod\Scripts\3_Game\MyClass.c

Prefiks musi pasować do odwołań ​

Jeśli twój config.cpp odwołuje się do MyMod\data\texture_co.paa, to PBO zawierające tę teksturę musi mieć prefiks MyMod, a plik musi znajdować się pod ścieżką data\texture_co.paa wewnątrz PBO. Niezgodność powoduje, że silnik nie znajdzie pliku.

Typowe wzorce prefiksów ​

Struktura modaŚcieżka źródłowaPrefiksOdwołanie w konfiguracji
Prosty modP:\MyMod\MyModMyMod\data\item.p3d
Mod z przestrzenią nazwP:\MyWeapons\MyWeaponsMyWeapons\data\rifle.p3d
Podpakiet skryptowyP:\MyFramework\MyMod\Scripts\MyFramework\MyMod\Scripts(odwołanie przez config.cpp CfgMods)

Binaryzacja: Kiedy potrzebna, a kiedy nie ​

Binaryzacja to konwersja czytelnych dla człowieka formatów źródłowych na zoptymalizowane formaty binarne silnika. Jest to najbardziej czasochłonny krok w procesie budowania i najczęstsze źródło błędów kompilacji.

Co jest binaryzowane ​

Typ plikuBinaryzowany doWymagane?
config.cppconfig.binWymagane dla modów definiujących przedmioty (CfgVehicles, CfgWeapons)
.p3d (MLOD).p3d (ODOL)Zalecane -- ODOL ładuje się szybciej i jest mniejszy
.tga / .png.paaWymagane -- silnik potrzebuje PAA w trakcie działania
.edds.paaWymagane -- jak wyżej
.rvmat.rvmat (przetworzony)Ścieżki rozwiązane, drobna optymalizacja
.wrp.wrp (zoptymalizowany)Wymagane dla modów terenu/map

Co NIE jest binaryzowane ​

Typ plikuPowód
skrypty .cSkrypty są ładowane jako tekst przez silnik
audio .oggJuż w formacie gotowym dla gry
pliki .layoutJuż w formacie gotowym dla gry
tekstury .paaJuż w formacie końcowym (wstępnie skonwertowane)
dane .jsonOdczytywane jako tekst przez kod skryptowy

Szczegóły binaryzacji Config.cpp ​

Binaryzacja config.cpp to krok, na którym większość modderów napotyka problemy. Binaryzator parsuje tekst config.cpp, waliduje jego strukturę, rozwiązuje łańcuchy dziedziczenia i generuje binarny config.bin.

Kiedy binaryzacja jest wymagana dla config.cpp:

  • Konfiguracja definiuje wpisy CfgVehicles (przedmioty, bronie, pojazdy, budynki).
  • Konfiguracja definiuje wpisy CfgWeapons.
  • Konfiguracja definiuje wpisy odwołujące się do modeli lub tekstur.

Kiedy binaryzacja NIE jest wymagana:

  • Konfiguracja definiuje tylko CfgPatches i CfgMods (rejestracja moda).
  • Konfiguracja definiuje tylko konfiguracje dźwięku.
  • Mody zawierające tylko skrypty z minimalną konfiguracją.

Zasada ogólna: Jeśli twój config.cpp dodaje fizyczne przedmioty do świata gry, potrzebujesz binaryzacji. Jeśli tylko rejestruje skrypty i definiuje dane nie-przedmiotowe, -packonly działa prawidłowo.


Podpisywanie kluczem ​

PBO mogą być podpisane kryptograficzną parą kluczy. Serwery używają weryfikacji sygnatur, aby upewnić się, że wszyscy połączeni klienci mają te same (niezmodyfikowane) pliki modów.

Składniki pary kluczy ​

PlikRozszerzeniePrzeznaczenieKto go posiada
Klucz prywatny.biprivatekeyPodpisuje PBO podczas budowaniaTylko autor moda (ZACHOWAJ W TAJEMNICY)
Klucz publiczny.bikeyWeryfikuje sygnaturyAdministratorzy serwerów, dystrybuowany z modem

Generowanie kluczy ​

Użyj narzędzi DSSignFile lub DSCreateKey z DayZ Tools:

bash
# Generowanie pary kluczy
DSCreateKey.exe MyModKey

# Tworzy to:
#   MyModKey.biprivatekey   (zachowaj w tajemnicy, nie dystrybuuj)
#   MyModKey.bikey          (dystrybuuj administratorom serwerów)

Podpisywanie podczas budowania ​

bash
AddonBuilder.exe "P:\MyMod" "P:\output" ^
    -prefix="MyMod" ^
    -sign="P:\keys\MyModKey"

Tworzy to:

P:\output\
  MyMod.pbo
  MyMod.pbo.MyModKey.bisign    <-- Plik sygnatury

Instalacja klucza po stronie serwera ​

Administratorzy serwerów umieszczają klucz publiczny (.bikey) w katalogu keys/ serwera:

DayZServer/
  keys/
    MyModKey.bikey             <-- Pozwala klientom z tym modem na połączenie

Struktura folderu @mod ​

DayZ oczekuje, że mody będą zorganizowane w określonej strukturze katalogów z konwencją prefiksu @:

@MyMod/
  addons/
    MyMod.pbo                  <-- Spakowana zawartość moda
    MyMod.pbo.MyKey.bisign     <-- Sygnatura PBO (opcjonalna)
  keys/
    MyKey.bikey                <-- Klucz publiczny dla serwerów (opcjonalny)
  mod.cpp                      <-- Metadane moda

mod.cpp ​

Plik mod.cpp dostarcza metadane wyświetlane w launcherze DayZ:

cpp
name = "My Awesome Mod";
author = "ModAuthor";
version = "1.0.0";
url = "https://steamcommunity.com/sharedfiles/filedetails/?id=XXXXXXXXX";

Mody z wieloma PBO ​

Duże mody często dzielą się na wiele PBO w ramach jednego folderu @mod:

@MyFramework/
  addons/
    MyCore_Scripts.pbo        <-- Warstwa skryptowa
    MyCore_Data.pbo           <-- Tekstury, modele, materiały
    MyCore_GUI.pbo            <-- Pliki layoutów, zestawy obrazków
  keys/
    MyMod.bikey
  mod.cpp

Ładowanie modów ​

Mody są ładowane przez parametr -mod:

bash
# Pojedynczy mod
DayZDiag_x64.exe -mod="@MyMod"

# Wiele modów (rozdzielone średnikiem)
DayZDiag_x64.exe -mod="@MyFramework;@MyWeapons;@MyMissions"

Folder @ musi znajdować się w katalogu głównym gry lub należy podać ścieżkę bezwzględną.


Zautomatyzowane skrypty budowania ​

Ręczne pakowanie PBO przez GUI AddonBuilder jest akceptowalne dla małych, prostych modów. Dla większych projektów z wieloma PBO, zautomatyzowane skrypty budowania są niezbędne.

Wzorzec skryptu Batch ​

Typowy build_pbos.bat:

batch
@echo off
setlocal

set TOOLS="P:\DayZ Tools\Bin\AddonBuilder\AddonBuilder.exe"
set OUTPUT="P:\@MyMod\addons"
set KEY="P:\keys\MyKey"

echo === Budowanie PBO skryptów ===
%TOOLS% "P:\MyMod\Scripts" %OUTPUT% -prefix="MyMod\Scripts" -packonly -clear

echo === Budowanie PBO danych ===
%TOOLS% "P:\MyMod\Data" %OUTPUT% -prefix="MyMod\Data" -sign=%KEY% -clear

echo === Budowanie zakończone ===
pause

Wzorzec skryptu Python (dev.py) ​

Dla bardziej zaawansowanych budowań, skrypt Python zapewnia lepszą obsługę błędów, logowanie i logikę warunkową:

python
import subprocess
import os
import sys

ADDON_BUILDER = r"P:\DayZ Tools\Bin\AddonBuilder\AddonBuilder.exe"
OUTPUT_DIR = r"P:\@MyMod\addons"
KEY_PATH = r"P:\keys\MyKey"

PBOS = [
    {
        "name": "Scripts",
        "source": r"P:\MyMod\Scripts",
        "prefix": r"MyMod\Scripts",
        "packonly": True,
    },
    {
        "name": "Data",
        "source": r"P:\MyMod\Data",
        "prefix": r"MyMod\Data",
        "packonly": False,
    },
]

def build_pbo(pbo_config):
    """Buduje pojedyncze PBO."""
    cmd = [
        ADDON_BUILDER,
        pbo_config["source"],
        OUTPUT_DIR,
        f"-prefix={pbo_config['prefix']}",
    ]

    if pbo_config.get("packonly"):
        cmd.append("-packonly")
    else:
        cmd.append(f"-sign={KEY_PATH}")

    print(f"Budowanie {pbo_config['name']}...")
    result = subprocess.run(cmd, capture_output=True, text=True)

    if result.returncode != 0:
        print(f"BŁĄD budowania {pbo_config['name']}:")
        print(result.stderr)
        return False

    print(f"  {pbo_config['name']} zbudowane pomyślnie.")
    return True

def main():
    os.makedirs(OUTPUT_DIR, exist_ok=True)

    success = True
    for pbo in PBOS:
        if not build_pbo(pbo):
            success = False

    if success:
        print("\nWszystkie PBO zbudowane pomyślnie.")
    else:
        print("\nBudowanie zakończone z błędami.")
        sys.exit(1)

if __name__ == "__main__":
    main()

Integracja z dev.py ​

Projekt MyMod używa dev.py jako centralnego orkiestratora budowania:

bash
python dev.py build          # Buduje wszystkie PBO
python dev.py server         # Buduje + uruchamia serwer + monitoruje logi
python dev.py full           # Buduje + serwer + klient

Ten wzorzec jest zalecany dla każdego wielomodowego obszaru roboczego. Jedno polecenie buduje wszystko, uruchamia serwer i rozpoczyna monitorowanie -- eliminując ręczne kroki i zmniejszając ryzyko błędu ludzkiego.


Budowanie modów z wieloma PBO ​

Duże mody korzystają z podziału na wiele PBO. Ma to kilka zalet:

Dlaczego dzielić na wiele PBO ​

  1. Szybsza przebudowa. Jeśli zmieniasz tylko skrypt, przebuduj tylko PBO skryptów (z -packonly, co trwa sekundy). PBO danych (z binaryzacją) zajmuje minuty i nie wymaga przebudowy.
  2. Modułowe ładowanie. PBO przeznaczone tylko dla serwera mogą być wykluczone z pobierania przez klienta.
  3. Czystsza organizacja. Skrypty, dane i GUI są wyraźnie rozdzielone.
  4. Równoległe budowanie. Niezależne PBO mogą być budowane jednocześnie.

Typowy wzorzec podziału ​

@MyMod/
  addons/
    MyMod_Core.pbo           <-- config.cpp, CfgPatches (zbinaryzowany)
    MyMod_Scripts.pbo         <-- Wszystkie pliki skryptowe .c (-packonly)
    MyMod_Data.pbo            <-- Modele, tekstury, materiały (zbinaryzowane)
    MyMod_GUI.pbo             <-- Layouty, zestawy obrazków (-packonly)
    MyMod_Sounds.pbo          <-- Pliki audio OGG (-packonly)

Zależności między PBO ​

Gdy jedno PBO zależy od drugiego (np. skrypty odwołują się do przedmiotów zdefiniowanych w PBO konfiguracji), requiredAddons[] w CfgPatches zapewnia poprawną kolejność ładowania:

cpp
// W config.cpp MyMod_Scripts
class CfgPatches
{
    class MyMod_Scripts
    {
        requiredAddons[] = {"MyMod_Core"};   // Ładuj po PBO rdzenia
    };
};

Typowe błędy budowania i rozwiązania ​

Błąd: „Include file not found" ​

Przyczyna: Config.cpp odwołuje się do pliku (modelu, tekstury), który nie istnieje pod oczekiwaną ścieżką. Rozwiązanie: Sprawdź, czy plik istnieje na dysku P: pod dokładną ścieżką, do której się odwołujesz. Sprawdź pisownię i wielkość liter.

Błąd: „Binarize failed" bez szczegółów ​

Przyczyna: Binarize zawiesiło się na uszkodzonym lub nieprawidłowym pliku źródłowym. Rozwiązanie:

  1. Sprawdź, który plik Binarize przetwarzał (patrz na wyjście loga).
  2. Otwórz problematyczny plik w odpowiednim narzędziu (Object Builder dla P3D, TexView2 dla tekstur).
  3. Zwaliduj plik.
  4. Typowi winowajcy: tekstury o rozmiarach nie będących potęgą 2, uszkodzone pliki P3D, nieprawidłowa składnia config.cpp.

Błąd: „Addon requires addon X" ​

Przyczyna: requiredAddons[] w CfgPatches wymienia addon, który nie jest obecny. Rozwiązanie: Zainstaluj wymagany addon, dodaj go do budowania lub usuń wymaganie, jeśli faktycznie nie jest potrzebne.

Błąd: Błąd parsowania Config.cpp (linia X) ​

Przyczyna: Błąd składni w config.cpp. Rozwiązanie: Otwórz config.cpp w edytorze tekstu i sprawdź linię X. Typowe problemy:

  • Brakujące średniki po definicjach klas.
  • Niezamknięte nawiasy klamrowe {}.
  • Brakujące cudzysłowy wokół wartości tekstowych.
  • Ukośnik odwrotny na końcu linii (kontynuacja linii nie jest obsługiwana).

Błąd: Niezgodność prefiksu PBO ​

Przyczyna: Prefiks w PBO nie pasuje do ścieżek używanych w config.cpp lub materiałach. Rozwiązanie: Upewnij się, że -prefix pasuje do struktury ścieżek oczekiwanej przez wszystkie odwołania. Jeśli config.cpp odwołuje się do MyMod\data\item.p3d, prefiks PBO musi wynosić MyMod, a plik musi znajdować się pod ścieżką data\item.p3d wewnątrz PBO.

Błąd: „Signature check failed" na serwerze ​

Przyczyna: PBO klienta nie pasuje do oczekiwanej sygnatury serwera. Rozwiązanie:

  1. Upewnij się, że zarówno serwer, jak i klient mają tę samą wersję PBO.
  2. Podpisz PBO ponownie nowym kluczem, jeśli to konieczne.
  3. Zaktualizuj .bikey na serwerze.

Błąd: „Cannot open file" podczas Binarize ​

Przyczyna: Dysk P: nie jest zamontowany lub ścieżka pliku jest nieprawidłowa. Rozwiązanie: Zamontuj dysk P: i sprawdź, czy ścieżka źródłowa istnieje.


Testowanie: File Patching vs ładowanie PBO ​

Rozwój obejmuje dwa tryby testowania. Wybór odpowiedniego trybu w każdej sytuacji oszczędza znaczną ilość czasu.

File Patching (Rozwój) ​

AspektSzczegóły
SzybkośćNatychmiastowa -- edytuj plik, uruchom grę ponownie
KonfiguracjaZamontuj dysk P:, uruchom z flagą -filePatching
Plik wykonywalnyDayZDiag_x64.exe (wymagana wersja Diag)
PodpisywanieNie dotyczy (brak PBO do podpisania)
OgraniczeniaBrak zbinaryzowanych konfiguracji, tylko wersja Diag
Najlepsze dlaRozwój skryptów, iteracja UI, szybkie prototypowanie

Ładowanie PBO (Testowanie przed wydaniem) ​

AspektSzczegóły
SzybkośćWolniejsza -- wymaga przebudowy PBO przy każdej zmianie
KonfiguracjaZbuduj PBO, umieść w @mod/addons/
Plik wykonywalnyDayZDiag_x64.exe lub detaliczny DayZ_x64.exe
PodpisywanieObsługiwane (wymagane dla trybu wieloosobowego)
OgraniczeniaPrzebudowa wymagana przy każdej zmianie
Najlepsze dlaKońcowe testy, testy wieloosobowe, walidacja przed wydaniem

Zalecany przepływ pracy ​

  1. Rozwijaj z file patching: Pisz skrypty, dostosowuj layouty, iteruj nad teksturami. Uruchom grę ponownie, aby przetestować. Brak kroku budowania.
  2. Buduj PBO okresowo: Testuj zbinaryzowaną wersję, aby wychwycić problemy specyficzne dla binaryzacji (błędy parsowania konfiguracji, problemy z konwersją tekstur).
  3. Końcowy test tylko z PBO: Przed wydaniem testuj wyłącznie z PBO, aby upewnić się, że spakowany mod działa identycznie jak wersja z file patching.
  4. Podpisz i dystrybuuj PBO: Wygeneruj sygnatury dla kompatybilności w trybie wieloosobowym.

Dobre praktyki ​

  1. Używaj -packonly dla PBO skryptów. Skrypty nigdy nie są binaryzowane, więc -packonly jest zawsze poprawne i znacznie szybsze.

  2. Zawsze ustawiaj prefiks. Bez prefiksu silnik nie może rozwiązać ścieżek do zawartości moda. Każde PBO musi mieć poprawny -prefix.

  3. Automatyzuj budowanie. Utwórz skrypt budowania (batch lub Python) od pierwszego dnia. Ręczne pakowanie nie skaluje się i jest podatne na błędy.

  4. Oddzielaj źródła od wyjścia. Źródła na dysku P:, zbudowane PBO w osobnym katalogu wyjściowym lub @mod/addons/. Nigdy nie pakuj z katalogu wyjściowego.

  5. Podpisuj PBO do wszelkich testów wieloosobowych. Niepodpisane PBO są odrzucane przez serwery z włączoną weryfikacją sygnatur. Podpisuj podczas rozwoju, nawet jeśli wydaje się to zbędne -- zapobiega to problemom typu „u mnie działa", gdy inni testują.

  6. Wersjonuj klucze. Gdy wprowadzasz przełomowe zmiany, wygeneruj nową parę kluczy. Wymusza to jednoczesną aktualizację wszystkich klientów i serwerów.

  7. Testuj zarówno tryb file patching, jak i PBO. Niektóre błędy pojawiają się tylko w jednym trybie. Zbinaryzowane konfiguracje zachowują się inaczej niż konfiguracje tekstowe w skrajnych przypadkach.

  8. Regularnie czyść katalog wyjściowy. Stare PBO z poprzednich budowań mogą powodować mylące zachowanie. Używaj flagi -clear lub czyść ręcznie przed budowaniem.

  9. Dziel duże mody na wiele PBO. Czas zaoszczędzony na przyrostowych przebudowach zwraca się w ciągu pierwszego dnia rozwoju.

  10. Czytaj logi budowania. Binarize i AddonBuilder tworzą pliki logów. Gdy coś pójdzie nie tak, odpowiedź prawie zawsze znajduje się w logach. Sprawdź %TEMP%\AddonBuilder\ i %TEMP%\Binarize\ dla szczegółowego wyjścia.


Zaobserwowane w prawdziwych modach ​

WzorzecModSzczegóły
Ponad 20 PBO na mod z drobiazgowym podziałemExpansion (wszystkie moduły)Dzieli na osobne PBO dla Scripts, Data, GUI, Vehicles, Book, Market itd., umożliwiając niezależne przebudowy i opcjonalną separację klient/serwer
Potrójny podział Skrypty/Dane/GUIStarDZ (Core, Missions, AI)Każdy mod tworzy 2-3 PBO: _Scripts.pbo (packonly), _Data.pbo (zbinaryzowane modele/tekstury), _GUI.pbo (packonly layouty)
Pojedyncze monolityczne PBOProste mody reteksturująceMałe mody zawierające tylko config.cpp i kilka tekstur PAA pakują wszystko w jedno PBO z binaryzacją
Wersjonowanie kluczy na każde duże wydanieExpansionGeneruje nowe pary kluczy dla przełomowych aktualizacji, wymuszając jednoczesną aktualizację wszystkich klientów i serwerów

Kompatybilność i wpływ ​

  • Wiele modów: Kolizje prefiksów PBO powodują, że silnik ładuje pliki jednego moda zamiast drugiego. Każdy mod musi używać unikalnego prefiksu. Sprawdzaj $PBOPREFIX$ dokładnie podczas debugowania błędów „file not found" w środowiskach z wieloma modami.
  • Wydajność: Ładowanie PBO jest szybkie (sekwencyjne odczyty plików), ale mody z wieloma dużymi PBO wydłużają czas uruchamiania serwera. Zbinaryzowana zawartość ładuje się szybciej niż niezbinaryzowana. Używaj modeli ODOL i tekstur PAA w wersjach wydaniowych.
  • Wersja: Sam format PBO nie zmienił się. AddonBuilder otrzymuje okresowe poprawki przez aktualizacje DayZ Tools, ale flagi wiersza poleceń i zachowanie pakowania są stabilne od DayZ 1.0.

Nawigacja ​

PoprzedniW góręNastępny
4.5 Przepływ pracy DayZ ToolsCzęść 4: Formaty plików i DayZ ToolsNastępny: Przewodnik po Workbench

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