1+ <?php
2+
3+ declare (strict_types=1 );
4+
5+ namespace TheWindows \spectron ;
6+
7+ use TheWindows \spectron \listener \spectronListener ;
8+ use TheWindows \spectron \network \spectronNetworkSession ;
9+ use TheWindows \spectron \network \listener \ClosurespectronPacketListener ;
10+ use pocketmine \network \mcpe \NetworkSession ;
11+ use pocketmine \network \mcpe \protocol \ChangeDimensionPacket ;
12+ use pocketmine \network \mcpe \protocol \ClientboundPacket ;
13+ use pocketmine \network \mcpe \protocol \PlayerActionPacket ;
14+ use pocketmine \network \mcpe \protocol \PlayStatusPacket ;
15+ use pocketmine \network \mcpe \protocol \RespawnPacket ;
16+ use pocketmine \network \mcpe \protocol \serializer \PacketSerializer ;
17+ use pocketmine \network \mcpe \protocol \SetLocalPlayerAsInitializedPacket ;
18+ use pocketmine \network \mcpe \protocol \types \BlockPosition ;
19+ use pocketmine \network \mcpe \protocol \types \PlayerAction ;
20+ use pocketmine \player \Player ;
21+ use pocketmine \scheduler \ClosureTask ;
22+ use pocketmine \network \mcpe \protocol \ProtocolInfo ;
23+
24+ final class DefaultspectronListener implements spectronListener{
25+
26+ public function __construct (
27+ private Loader $ plugin
28+ ){}
29+
30+ public function onPlayerAdd (Player $ player ) : void {
31+ $ session = $ player ->getNetworkSession ();
32+ assert ($ session instanceof spectronNetworkSession);
33+
34+ $ entity_runtime_id = $ player ->getId ();
35+ $ session ->registerSpecificPacketListener (PlayStatusPacket::class, new ClosurespectronPacketListener (function (ClientboundPacket $ packet , NetworkSession $ session ) use ($ entity_runtime_id ) : void {
36+ assert ($ packet instanceof PlayStatusPacket);
37+ if ($ packet ->status === PlayStatusPacket::PLAYER_SPAWN ){
38+ $ this ->plugin ->getScheduler ()->scheduleDelayedTask (new ClosureTask (static function () use ($ session , $ entity_runtime_id ) : void {
39+ if ($ session ->isConnected ()){
40+ $ packet = SetLocalPlayerAsInitializedPacket::create ($ entity_runtime_id );
41+ $ serializer = PacketSerializer::encoder (ProtocolInfo::CURRENT_PROTOCOL );
42+ $ packet ->encode ($ serializer );
43+ $ session ->handleDataPacket ($ packet , $ serializer ->getBuffer ());
44+ }
45+ }), 40 );
46+ }
47+ }));
48+
49+ $ session ->registerSpecificPacketListener (RespawnPacket::class, new ClosurespectronPacketListener (function (ClientboundPacket $ packet , NetworkSession $ session ) : void {
50+ $ this ->plugin ->getScheduler ()->scheduleDelayedTask (new ClosureTask (function () use ($ session ) : void {
51+ if ($ session ->isConnected ()){
52+ /** @var Player $player */
53+ $ player = $ session ->getPlayer ();
54+ $ player ->respawn ();
55+ $ fake_player = $ this ->plugin ->getspectron ($ player );
56+ foreach ($ fake_player ->getBehaviours () as $ behaviour ){
57+ $ behaviour ->onRespawn ($ fake_player );
58+ }
59+ }
60+ }), 40 );
61+ }));
62+
63+ $ session ->registerSpecificPacketListener (ChangeDimensionPacket::class, new ClosurespectronPacketListener (function (ClientboundPacket $ packet , NetworkSession $ session ) : void {
64+ $ this ->plugin ->getScheduler ()->scheduleDelayedTask (new ClosureTask (function () use ($ session ) : void {
65+ if ($ session ->isConnected ()){
66+ $ player = $ session ->getPlayer ();
67+ if ($ player !== null ){
68+ $ packet = PlayerActionPacket::create (
69+ $ player ->getId (),
70+ PlayerAction::DIMENSION_CHANGE_ACK ,
71+ BlockPosition::fromVector3 ($ player ->getPosition ()->floor ()),
72+ BlockPosition::fromVector3 ($ player ->getPosition ()->floor ()),
73+ 0
74+ );
75+
76+ $ serializer = PacketSerializer::encoder (ProtocolInfo::CURRENT_PROTOCOL );
77+ $ packet ->encode ($ serializer );
78+ $ session ->handleDataPacket ($ packet , $ serializer ->getBuffer ());
79+ }
80+ }
81+ }), 40 );
82+ }));
83+ }
84+
85+ public function onPlayerRemove (Player $ player ) : void {
86+ }
87+ }
0 commit comments