Skip to content

Commit ba7ebf8

Browse files
committed
Add vanilla PM support
1 parent 5c6fb02 commit ba7ebf8

File tree

3 files changed

+102
-10
lines changed

3 files changed

+102
-10
lines changed

PMUtils.php

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?php
2+
3+
namespace libproxy;
4+
5+
use Exception;
6+
use pocketmine\network\mcpe\convert\TypeConverter;
7+
use pocketmine\network\mcpe\EntityEventBroadcaster;
8+
use pocketmine\network\mcpe\PacketBroadcaster;
9+
use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext;
10+
use pocketmine\network\mcpe\raklib\RakLibInterface;
11+
use pocketmine\Server;
12+
use ReflectionClass;
13+
use function method_exists;
14+
15+
class PMUtils
16+
{
17+
public static function getPacketSerializerContext(Server $server): PacketSerializerContext
18+
{
19+
if (method_exists($server, 'getPacketSerializerContext')) {
20+
return $server->getPacketSerializerContext(TypeConverter::getInstance());
21+
}
22+
23+
$packetSerializerContext = self::getRaklibInterfacePropertyValue($server, 'packetSerializerContext');
24+
if ($packetSerializerContext instanceof PacketSerializerContext) {
25+
return $packetSerializerContext;
26+
}
27+
28+
throw new Exception("PacketSerializerContext isn't valid");
29+
}
30+
31+
public static function getPacketBroadcaster(Server $server): PacketBroadcaster
32+
{
33+
if (method_exists($server, 'getPacketBroadcaster')) {
34+
return $server->getPacketBroadcaster(self::getPacketSerializerContext($server));
35+
}
36+
37+
$packetBroadcaster = self::getRaklibInterfacePropertyValue($server, 'packetBroadcaster');
38+
if ($packetBroadcaster instanceof PacketBroadcaster) {
39+
return $packetBroadcaster;
40+
}
41+
42+
throw new Exception("PacketBroadcaster isn't valid");
43+
}
44+
45+
public static function getEntityEventBroadcaster(Server $server): EntityEventBroadcaster
46+
{
47+
if (method_exists($server, 'getEntityEventBroadcaster')) {
48+
return $server->getEntityEventBroadcaster(self::getPacketBroadcaster($server), TypeConverter::getInstance());
49+
}
50+
51+
$entityEventBroadcaster = self::getRaklibInterfacePropertyValue($server, 'entityEventBroadcaster');
52+
if ($entityEventBroadcaster instanceof EntityEventBroadcaster) {
53+
return $entityEventBroadcaster;
54+
}
55+
56+
throw new Exception("EntityEventBroadcaster isn't valid");
57+
}
58+
59+
private static function getRaklibInterfacePropertyValue(Server $server, string $propertyName): mixed
60+
{
61+
$interface = self::getRaklibInterface($server);
62+
$reflection = new ReflectionClass($interface);
63+
$property = $reflection->getProperty($propertyName);
64+
65+
return $property->getValue($interface);
66+
}
67+
68+
/**
69+
* @throws Exception
70+
*/
71+
private static function getRaklibInterface(Server $server): RakLibInterface
72+
{
73+
foreach ($server->getNetwork()->getInterfaces() as $interface) {
74+
if ($interface instanceof RakLibInterface) {
75+
return $interface;
76+
}
77+
}
78+
79+
throw new Exception("Raklib interface hasn't been registered");
80+
}
81+
}

ProxyListener.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,14 @@ public function onDataPacketReceive(DataPacketReceiveEvent $event): void
3939
break;
4040
case RequestNetworkSettingsPacket::NETWORK_ID:
4141
/** @var RequestNetworkSettingsPacket $packet USED TO SIMULATE VANILLA BEHAVIOUR, SINCE IT'S NOT USED BY US */
42-
if (!in_array($protocolVersion = $packet->getProtocolVersion(), ProtocolInfo::ACCEPTED_PROTOCOL, true)) {
42+
$multiProtocol = method_exists($origin, 'setProtocolId');
43+
44+
if (!in_array($protocolVersion = $packet->getProtocolVersion(), $multiProtocol ? ProtocolInfo::ACCEPTED_PROTOCOL : ProtocolInfo::CURRENT_PROTOCOL, true)) {
4345
$origin->disconnectIncompatibleProtocol($protocolVersion);
4446
return;
4547
}
4648

47-
if (method_exists($origin, 'setProtocolId')) {
49+
if ($multiProtocol) {
4850
$origin->setProtocolId($packet->getProtocolVersion());
4951
}
5052

ProxyNetworkInterface.php

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,11 @@
1818
use pmmp\thread\Thread as NativeThread;
1919
use pmmp\thread\ThreadSafeArray;
2020
use pocketmine\network\mcpe\convert\TypeConverter;
21+
use pocketmine\network\mcpe\EntityEventBroadcaster;
2122
use pocketmine\network\mcpe\NetworkSession;
23+
use pocketmine\network\mcpe\PacketBroadcaster;
2224
use pocketmine\network\mcpe\protocol\PacketPool;
25+
use pocketmine\network\mcpe\protocol\serializer\PacketSerializerContext;
2326
use pocketmine\network\mcpe\raklib\PthreadsChannelReader;
2427
use pocketmine\network\mcpe\raklib\PthreadsChannelWriter;
2528
use pocketmine\network\NetworkInterface;
@@ -67,6 +70,13 @@ final class ProxyNetworkInterface implements NetworkInterface
6770
/** @var PthreadsChannelReader */
6871
private PthreadsChannelReader $threadToMainReader;
6972

73+
/** @var PacketSerializerContext */
74+
private PacketSerializerContext $packetSerializerContext;
75+
/** @var PacketBroadcaster */
76+
private PacketBroadcaster $packetBroadcaster;
77+
/** @var EntityEventBroadcaster */
78+
private EntityEventBroadcaster $entityEventBroadcaster;
79+
7080
/** @var int */
7181
private int $receiveBytes = 0;
7282
/** @var int */
@@ -119,6 +129,10 @@ public function __construct(PluginBase $plugin, int $port, ?string $composerPath
119129
$this->mainToThreadWriter = new PthreadsChannelWriter($mainToThreadBuffer);
120130
$this->threadToMainReader = new PthreadsChannelReader($threadToMainBuffer);
121131

132+
$this->packetSerializerContext = PMUtils::getPacketSerializerContext($server);
133+
$this->packetBroadcaster = PMUtils::getPacketBroadcaster($server);
134+
$this->entityEventBroadcaster = PMUtils::getEntityEventBroadcaster($server);
135+
122136
PacketPool::getInstance()->registerPacket(new TickSyncPacket());
123137

124138
$bandwidthTracker = $plugin->getServer()->getNetwork()->getBandwidthTracker();
@@ -273,19 +287,14 @@ public function putPacket(int $socketId, ProxyPacket $pk): void
273287

274288
public function createSession(int $socketId, string $ip, int $port): NetworkSession
275289
{
276-
$typeConverter = TypeConverter::getInstance();
277-
$packetSerializerContext = $this->server->getPacketSerializerContext($typeConverter);
278-
$packetBroadcaster = $this->server->getPacketBroadcaster($packetSerializerContext);
279-
$entityEventBroadcaster = $this->server->getEntityEventBroadcaster($packetBroadcaster, $typeConverter);
280-
281290
$session = new NetworkSession(
282291
$this->server,
283292
$this->server->getNetwork()->getSessionManager(),
284293
PacketPool::getInstance(),
285-
$packetSerializerContext,
294+
$this->packetSerializerContext,
286295
new ProxyPacketSender($socketId, $this),
287-
$packetBroadcaster,
288-
$entityEventBroadcaster,
296+
$this->packetBroadcaster,
297+
$this->entityEventBroadcaster,
289298
MultiCompressor::getInstance(),
290299
TypeConverter::getInstance(),
291300
$ip,

0 commit comments

Comments
 (0)