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