22import requests
33from . import player as player_template
44from websockets .sync .client import connect as ws_conn
5+ from . import world
56
67def login_with_pass (email , password ):
8+ print ("Logging in..." )
79 player = player_template .player ()
810 r = requests .post ("https://api.pixelwalker.net/api/collections/users/auth-with-password" , json = {'identity' : email , 'password' : password })
911 data = r .json ()
1012 player .token = data ["token" ]
1113 record = data ["record" ]
1214 player .username = record ["username" ]
1315 player .id = record ["id" ]
16+ print ("Logged in" )
1417 return player
1518
16- def connect (world_id , user , on_chat = None , on_init = None , on_join = None , on_leave = None , commands = None , custom_init = False ):
19+ def connect (world_id , user , on_chat = None , on_init = None , on_join = None , on_leave = None , on_block = None , commands = None , custom_init = False ):
20+ print ("Getting world type..." )
1721 version = requests .get ("https://game.pixelwalker.net/listroomtypes" ).json ()[0 ]
22+ print ("Getting join key..." )
1823 headers = {"Authorization" : f"Bearer { user .token } " }
1924 r = requests .get (f"https://api.pixelwalker.net/api/joinkey/{ version } /{ world_id } " , headers = headers )
2025 join_key = r .json ()["token" ]
2126 player_list = {}
27+ print ("Gathering block info..." )
28+ block_list = requests .get ('https://game.pixelwalker.net/listblocks' ).json ()
2229
23- with ws_conn (f"wss://game.pixelwalker.net/ws?joinKey={ join_key } " ) as websocket :
30+ print ("Connecting..." )
31+ with ws_conn (f"wss://game.pixelwalker.net/ws?joinKey={ join_key } " , max_size = None ) as websocket :
32+ print ("Connected" )
2433 while True :
2534 message = websocket .recv ()
2635 packet = world_pb2 .WorldPacket ()
@@ -32,53 +41,101 @@ def connect(world_id, user, on_chat=None, on_init=None, on_join=None, on_leave=N
3241 send = world_pb2 .WorldPacket (player_init_received = world_pb2 .PlayerInitReceivedPacket ()).SerializeToString ()
3342 websocket .send (send )
3443
44+ world_data = world .decode (packet .player_init_packet .world_data , block_list , packet .player_init_packet .world_width , packet .player_init_packet .world_height )
45+
3546 if commands :
3647 for command in commands .keys ():
3748 cmd = world_pb2 .PlayerChatPacket ()
3849 cmd .message = f"/custom register { command } "
3950 send = world_pb2 .WorldPacket (player_chat_packet = cmd ).SerializeToString ()
4051 websocket .send (send )
4152 player_id = packet .player_init_packet .player_properties .player_id
42- _run_user_handle (on_init , websocket , world_pb2 , player_list , packet .player_init_packet )
53+ _run_user_handle (on_init , websocket , world_pb2 , player_list , packet .player_init_packet , world_data )
4354
4455 elif packet .HasField ("player_chat_packet" ):
4556 if not packet .player_chat_packet .player_id == player_id :
46- _run_user_handle (on_chat , websocket , world_pb2 , player_list , packet .player_chat_packet )
57+ _run_user_handle (on_chat , websocket , world_pb2 , player_list , packet .player_chat_packet , world_data )
4758
4859 elif packet .HasField ("ping" ):
4960 send = world_pb2 .WorldPacket (ping = world_pb2 .Ping ()).SerializeToString ()
5061 websocket .send (send )
5162
5263 elif packet .HasField ("player_joined_packet" ):
5364 player_list [packet .player_joined_packet .properties .player_id ] = packet .player_joined_packet .properties .username
54- _run_user_handle (on_join , websocket , world_pb2 , player_list , packet .player_joined_packet )
65+ _run_user_handle (on_join , websocket , world_pb2 , player_list , packet .player_joined_packet , world_data )
5566
5667 elif packet .HasField ("player_left_packet" ):
57- _run_user_handle (on_leave , websocket , world_pb2 , player_list , packet .player_left_packet )
68+ _run_user_handle (on_leave , websocket , world_pb2 , player_list , packet .player_left_packet , world_data )
5869 del player_list [packet .player_left_packet .player_id ]
70+
71+ elif packet .HasField ('world_block_placed_packet' ):
72+ id = packet .world_block_placed_packet .block_id
73+ if packet .world_block_placed_packet .layer == 0 :
74+ layer = 'bg'
75+ if packet .world_block_placed_packet .layer == 1 :
76+ layer = 'fg'
77+ if packet .world_block_placed_packet .layer == 2 :
78+ layer = 'ol'
79+ if packet .world_block_placed_packet .extra_fields :
80+ block_data = world .decode_block_placed_data (packet .world_block_placed_packet .extra_fields )
81+ else :
82+ block_data = []
83+
84+ for position in packet .world_block_placed_packet .positions :
85+ world_data [layer ][position .x ][position .y ]['id' ] = id
86+ world_data [layer ][position .x ][position .y ]['data' ] = block_data
87+
88+ _run_user_handle (on_block , websocket , world_pb2 , player_list , packet .world_block_placed_packet , world_data )
5989
6090 elif packet .HasField ("player_direct_message_packet" ):
6191 if commands :
6292 for command in commands .keys ():
6393 if f"//{ command } " == packet .player_direct_message_packet .message or f"{ packet .player_direct_message_packet .message } " .startswith (f"//{ command } " ):
64- _run_custom_cmd (commands [command ], websocket , world_pb2 , player_list , packet .player_direct_message_packet .from_player_id , packet .player_direct_message_packet .message )
94+ _run_custom_cmd (commands [command ], websocket , world_pb2 , player_list , packet .player_direct_message_packet .from_player_id , packet .player_direct_message_packet .message , world_data )
6595
6696class Connection :
67- def __init__ (self , websocket , world_pb2 , player_list ):
97+ def __init__ (self , websocket , world_pb2 , player_list , world_data ):
6898 self .websocket = websocket
6999 self .proto = world_pb2
70100 self .players = player_list
101+ self .world_data = world_data
71102
72103 def send_chat (self , message ):
73104 packet = self .proto .PlayerChatPacket ()
74105 packet .message = message
75106 send = self .proto .WorldPacket (player_chat_packet = packet ).SerializeToString ()
76107 self .websocket .send (send )
77108
78- def _run_user_handle (function , websocket , world_pb2 , player_list , packet ):
109+ def place_block (self , x , y , layer , id , data = None ):
110+ if layer == 0 :
111+ layer = 'bg'
112+ if layer == 1 :
113+ layer = 'fg'
114+ if layer == 2 :
115+ layer = 'ol'
116+ if not self .world_data [layer ][x ][y ]['id' ] == id or not self .world_data [layer ][x ][y ]['data' ] == data :
117+ if layer == 'bg' :
118+ layer = 0
119+ elif layer == 'fg' :
120+ layer = 1
121+ elif layer == 'ol' :
122+ layer = 2
123+
124+ data = world .encode_block_placed_data (id , self .world_data ['block_list' ], data )
125+
126+ packet = self .proto .WorldBlockPlacedPacket ()
127+ packet .block_id = id
128+ packet .layer = layer
129+ if data :
130+ packet .extra_fields = data
131+ packet .positions .append (self .proto .PointInteger (x = x ,y = y ))
132+ send = self .proto .WorldPacket (world_block_placed_packet = packet ).SerializeToString ()
133+ self .websocket .send (send )
134+
135+ def _run_user_handle (function , websocket , world_pb2 , player_list , packet , world_data ):
79136 if function :
80- function (Connection (websocket , world_pb2 , player_list ), packet )
137+ function (Connection (websocket , world_pb2 , player_list , world_data ), packet )
81138
82- def _run_custom_cmd (function , websocket , world_pb2 , player_list , player_id , message ):
139+ def _run_custom_cmd (function , websocket , world_pb2 , player_list , player_id , message , world_data ):
83140 args = message .split (' ' )[1 :]
84- function (Connection (websocket , world_pb2 , player_list ), args , player_id )
141+ function (Connection (websocket , world_pb2 , player_list , world_data ), args , player_id )
0 commit comments