Skip to content

Commit

Permalink
midsave
Browse files Browse the repository at this point in the history
  • Loading branch information
SpazElectro committed Aug 26, 2023
1 parent 7eb7f3f commit 16ee3b1
Show file tree
Hide file tree
Showing 8 changed files with 156 additions and 0 deletions.
74 changes: 74 additions & 0 deletions experiments/hotreload/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
from packet import *
import socket, time

import hexdump

server_host = "127.0.0.1"
server_port = 10052
server_address = (server_host, server_port)
set_global_server_addr(server_address)

tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcp_client.connect(server_address)

udp_client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

class FileUpdateHandler(FileSystemEventHandler):
def reload(self, event):
if event.src_path.endswith("jazz2.log"):
return

print(event.src_path)
tcp_client.send(ChatMessage(1, "/r"))

def on_created(self, event):
self.reload(event)

def on_deleted(self, event):
self.reload(event)

def on_modified(self, event):
self.reload(event)

folder_path = "../../"

event_handler = FileUpdateHandler()
observer = Observer()
observer.schedule(event_handler, folder_path, recursive=True)
observer.start()

set_global_sockets(tcp_client, udp_client)
send_packet_array("login")

time.sleep(1)

tcp_client.send(ChatMessage(1, "/spectate on"))
tcp_client.send(ChatMessage(1, "/login botattack"))

time.sleep(1)

try:
while True:
msg = tcp_client.recv(1024)
# if addr != server_address:
# continue
print("PACKET_END" if not hexdump.hexdump(msg) else "UNDEFINED")
if len(msg) >= 2:
if msg[0] == 0x00 and msg[1] == 0x07:
# disconnect

disconnectMessage = msg[4]
print(f"Disconnected for {parse_disconnect_message(disconnectMessage)}")

raise KeyboardInterrupt()
if msg == b"":
raise KeyboardInterrupt()
# pingPacket = bytes(bytearray([0x03, 0x1, 0x00, 0x00, 0x00, 0x00, 0x32, 0x34, 0x20, 0x20]))
# udp_client.sendto(checksum(pingPacket) + pingPacket, server_address)
except KeyboardInterrupt:
observer.stop()

observer.join()
78 changes: 78 additions & 0 deletions experiments/hotreload/packet.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import socket, os, enum

# packetarraytype
PAT_TCP = 0
PAT_UDP = 1
PAT_DETERMINE = 2

global_server_addr = None
global_tcp_socket = None
global_udp_socket = None

def set_global_server_addr(new_global_server_addr):
global global_server_addr
global_server_addr = new_global_server_addr

def set_global_sockets(new_global_tcp, new_global_udp):
global global_tcp_socket, global_udp_socket
global_tcp_socket = new_global_tcp
global_udp_socket = new_global_udp

def Packet(packetLengthA=0x0, packetLengthB=0x0, packetIdA=0x0, packetIdB=0x0):
return bytes([packetLengthA, packetLengthB + 0x3, packetIdA, packetIdB])

def ChatMessage(sockId: int, msg: str):
pk = Packet(packetLengthB=len(msg), packetIdB=0x1B)
pk += (bytes([sockId, 0x00]) + msg.encode())
return pk

def determine_pat_type(file_name):
if file_name.startswith("tcp"):
return PAT_TCP
elif file_name.startswith("udp"):
return PAT_UDP
else:
raise ValueError("Unknown packet type")

def send_packet_array(name: str, pat_type=2):
files = os.listdir(f"./packetarrays/{name}")
sorted_files = sorted(files, key=lambda x: int(x.split(".")[0][3:]))

for item in sorted_files:
packet_type = determine_pat_type(item) if pat_type == 2 else pat_type
packet = open(f"./packetarrays/{name}/{item}", "rb").read()

if packet_type == PAT_TCP:
global_tcp_socket.sendall(packet) # type: ignore
elif packet_type == PAT_UDP:
global global_server_addr
global_udp_socket.sendto(packet, global_server_addr) # type: ignore

from construct import Byte

# https://github.com/bswck/jj2_old/blob/master/jj2/protocols/game.py#L477-L484
def checksum(serialized):
arr = bytes((79, 79)) + serialized
lsb = msb = 1
for i in range(2, len(arr)):
lsb += arr[i]
msb += lsb
return Byte.build(lsb % 251) + Byte.build(msb % 251)

disconnect_messages = {
0x01: "Server full",
0x02: "Version different",
0x03: "?",
0x04: "Error during handshaking",
0x05: "Feature not supported in shareware",
0x06: "Error downloading level",
0x07: "Connection lost",
0x08: "Winsock error",
0x09: "Connection timed out",
0x0A: "Server stopped",
0x0B: "Kicked off",
0x0C: "Banned"
}

def parse_disconnect_message(value):
return disconnect_messages.get(value, "Unknown error")
1 change: 1 addition & 0 deletions experiments/hotreload/packetarrays/login/tcp1
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
�24 
1 change: 1 addition & 0 deletions experiments/hotreload/packetarrays/login/tcp10
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
��0$
Binary file added experiments/hotreload/packetarrays/login/tcp3
Binary file not shown.
Binary file added experiments/hotreload/packetarrays/login/tcp6
Binary file not shown.
Binary file added experiments/hotreload/packetarrays/login/udp0
Binary file not shown.
2 changes: 2 additions & 0 deletions levels/tictactoe/STVtictactoe.j2as
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#pragma require "STVutil.asc"
#pragma require "stvtictactoe_o.png"
#pragma require "stvtictactoe_x.png"

#include "STVutil.asc"

Expand Down

0 comments on commit 16ee3b1

Please sign in to comment.