OSC Script Control

this is the latest script i am using to control three running instances of vr chat. i want all three instances to respond to movement input and camera rotation input, with one window focused. the other two windows dont pick up the movement commands! how do i fix this? see attached video

from pynput import keyboard, mouse
from pythonosc.udp_client import SimpleUDPClient

OSC clients for leader and follower instances

osc_ports = [9000, 9002, 9004]
osc_clients = [SimpleUDPClient(“127.0.0.1”, port) for port in osc_ports]

Key mappings to OSC addresses

key_osc_map = {
‘w’: “/avatar/parameters/MoveForward”,
‘s’: “/avatar/parameters/MoveBackward”,
‘a’: “/avatar/parameters/MoveLeft”,
‘d’: “/avatar/parameters/MoveRight”,
‘space’: “/avatar/parameters/Jump”
}

Function to send OSC messages to all clients

def send_osc_to_all(address, value):
for client in osc_clients:
client.send_message(address, value)

Keyboard event handlers

def on_press(key):
try:
k = key.char.lower()
except AttributeError:
k = key.name
if k in key_osc_map:
print(f"Sending {key_osc_map[k]} {1}")
send_osc_to_all(key_osc_map[k], 1)

def on_release(key):
try:
k = key.char.lower()
except AttributeError:
k = key.name
if k in key_osc_map:
print(f"Sending {key_osc_map[k]} {0}")
send_osc_to_all(key_osc_map[k], 0)

Mouse movement handler

def on_move(x, y):

Normalize mouse movement to avoid large values

look_x = x % 1000 / 1000.0
look_y = y % 1000 / 1000.0
send_osc_to_all(“/avatar/parameters/LookX”, look_x)
send_osc_to_all(“/avatar/parameters/LookY”, look_y)

Start listeners

keyboard_listener = keyboard.Listener(on_press=on_press, on_release=on_release)
mouse_listener = mouse.Listener(on_move=on_move)

keyboard_listener.start()
mouse_listener.start()

print(“Listening for keyboard and mouse input…”)
keyboard_listener.join()
mouse_listener.join()

this is copilot’s working script. it is fixed now

from pynput import keyboard, mouse
from pythonosc.udp_client import SimpleUDPClient

OSC clients for follower instances

follower_ports = [9002, 9004]
follower_clients = [SimpleUDPClient(“127.0.0.1”, port) for port in follower_ports]

Key mappings to OSC addresses

key_osc_map = {
‘w’: “/input/MoveForward”,
‘s’: “/input/MoveBackward”,
‘a’: “/input/MoveLeft”,
‘d’: “/input/MoveRight”,
‘space’: “/input/Jump”
}

Function to send OSC messages to all followers

def send_osc_to_followers(address, value):
for client in follower_clients:
client.send_message(address, value)

Keyboard event handlers

def on_press(key):
try:
k = key.char.lower()
except AttributeError:
k = key.name
if k in key_osc_map:
print(f"Sending {key_osc_map[k]} 1")
send_osc_to_followers(key_osc_map[k], 1)

def on_release(key):
try:
k = key.char.lower()
except AttributeError:
k = key.name
if k in key_osc_map:
print(f"Sending {key_osc_map[k]} 0")
send_osc_to_followers(key_osc_map[k], 0)

Mouse movement handler

last_x = None
last_y = None

def on_move(x, y):
global last_x, last_y
if last_x is not None and last_y is not None:
dx = x - last_x
dy = y - last_y

    # Normalize and scale movement
    look_x = max(min(dx / 50.0, 1.0), -1.0)
    look_y = max(min(dy / 50.0, 1.0), -1.0)

    send_osc_to_followers("/input/LookHorizontal", look_x)
    send_osc_to_followers("/input/LookVertical", look_y)

last_x = x
last_y = y

Start listeners

keyboard_listener = keyboard.Listener(on_press=on_press, on_release=on_release)
mouse_listener = mouse.Listener(on_move=on_move)

keyboard_listener.start()
mouse_listener.start()

print(“Listening for keyboard and mouse input to send movement and camera rotation commands…”)
keyboard_listener.join()
mouse_listener.join()