work in progress

This commit is contained in:
Dave Schuyler 2005-03-02 04:17:23 +00:00
parent d237a46aec
commit c336528cb5

View File

@ -0,0 +1,77 @@
from cPickle import dumps, loads
from direct.showbase.Messenger import Messenger
class NetMessenger(Messenger):
"""
This works very much like the Messenger class except that messages
are sent over the network and (possibly) handled (accepted) on a
remote machine (server).
"""
def __init__(self, air, channels=(4602, 4603, 4604)):
self.air=air
self.channels=channels
Messenger.__init__(self)
for i in channels:
self.air.registerForChannel(i)
def clear(self):
for i in self.channels:
self.air.unRegisterChannel(i)
del self.air
del self.channels
Messenger.clear(self)
def send(self, message, sentArgs=[]):
"""
Send message to All AI and Uber Dog servers.
"""
self.sendChannel(4602, message, sentArgs)
def sendUD(self, message, sentArgs=[]):
"""
Send message to the uber dog.
"""
self.sendChannel(4603, message, sentArgs)
def sendAI(self, message, sentArgs=[]):
"""
Send message to the game AI servers (non-uber dog).
"""
self.sendChannel(4604, message, sentArgs)
def sendChannel(self, channel, message, sentArgs=[]):
"""
Send message to a particular channel.
"""
datagram = PyDatagram()
# To:
datagram.addChannel(channel)
# From:
datagram.addChannel(self.air.ourChannel)
if 1: # We send this just because the air expects it:
# Add an 'A' for AI
datagram.addUint8(ord('A'))
# Add the message type
datagram.addUint16(0)
datagram.addString(str(dumps((message, sentArgs))))
self.air.send(datagram)
def check(self, channel):
"""
returns true if this instance wants this channel data.
"""
return channel in self.channels:
def handle(self, pickleData):
"""
Send pickleData from the net on the local netMessenger.
The internal data in pickleData should have a tuple of
(messageString, sendArgsList).
"""
(message, sentArgs) = loads(pickleData)
Messenger.send(self, message, sentArgs=sentArgs)