allejo/bzflag-networking.php

用于解包 BZFlag 网络数据包的库

v1.1.2 2022-04-17 23:35 UTC

README

Packagist Code coverage License

A PHP 7.1+ library for reading and handling BZFlag network packets.

BZFlag 回放文件只是简单地将原始数据包存储在文件中,因此此库可以让您读取回放文件并将它们解包成可以序列化为 JSON 的 PHP 类。

安装

此项目可通过 Composer 获取。

composer require allejo/bzflag-networking.php

相关库

使用方法

此库拥有解包 BZFlag 网络数据包和世界数据包的所有工具。然而,此库中可用的便捷方法仅限于从回放文件中读取这些数据包。

分析回放数据包

此库的推荐使用方法是使用 getPacketsIterable() 方法在代码中“流”回放,该方法一次读取并生成一个数据包。这允许您一次性遍历回放文件,而无需在处理时将整个回放存储在内存中。

use allejo\bzflag\replays\Replay;

$replay = new Replay(__DIR__ . '/my-bz-replay.rec');

foreach ($replay->getPacketsIterable() as $packet) {
    // do something with $packet
}

如果您想将回放文件的所有数据包作为数组获取,请使用 getPacketsAsArray() 方法。请注意,这将导致高内存使用,因为整个回放将以展开的格式存储在内存中。此外,将读取所有数据包,如果您的代码需要执行任何类型的分析,您将需要再次遍历 所有 数据包。

use allejo\bzflag\networking\Packets\GamePacket;

/** @var GamePacket[] $packets */
$packets = $replay->getPacketsAsArray();

回放中的嵌入式世界

从版本 1.1+ 开始,此库支持从回放文件中提取嵌入的世界数据。BZFlag 世界数据库不是容易导航的对象,它包含许多具有纹理、障碍物、世界武器等清单的“管理器”。

请参阅 allejo/bzflag-rendering.php 库的示例用法,了解如何导航世界数据库。

use allejo\bzflag\replays\Replay;
use allejo\bzflag\world\WorldDatabase;

$replay = new Replay(__DIR__ . '/my-bz-replay.rec');

/** @var WorldDatabase $worldDB */
$worldDB = $replay->getHeader()->getWorldDatabase();

// or an convenience method exists too
$worldDB = $replay->getWorldDatabase();

导出到 JSON

⚠️ 高内存使用

PHP 内置的 json_encode 函数无法处理从回放写入大型 JSON 文件。在此阶段,您需要使用类似 streaming-json-encoder 的东西来流式传输您的 JSON。请参阅 rrlog 的 PHP 端口 以获取示例用法。

use allejo\bzflag\replays\Replay;

$replay = new Replay(__DIR__ . '/my-bz-replay.rec');

$json = json_encode($replay, JSON_PRETTY_PRINT);
file_put_contents(__DIR__ . '/my-bz-replay.rec.json', $json);

其他语言

此库最初在几种其他语言中编写了几次,但功能较少。然而,那些其他项目现在已经结束,此项目已经取代了它们。

许可证

MIT