mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 08:44:19 -04:00
distributed: Change the message numbers to match Astron's
I imagine very few Panda3D users depend on the message numbers having particular values. The ones removed belonged to Disney's OTP system, which hasn't been used by anybody in over 4 years. At any rate, old code should continue to work, just at the cost of compatibility between clients and servers running different P3D versions.
This commit is contained in:
parent
97368ec321
commit
167c6dcafa
@ -946,9 +946,9 @@ ai_format_generate(PyObject *distobj, DOID_TYPE do_id,
|
||||
bool has_optional_fields = (PyObject_IsTrue(optional_fields) != 0);
|
||||
|
||||
if (has_optional_fields) {
|
||||
packer.raw_pack_uint16(STATESERVER_OBJECT_GENERATE_WITH_REQUIRED_OTHER);
|
||||
packer.raw_pack_uint16(STATESERVER_CREATE_OBJECT_WITH_REQUIRED_OTHER);
|
||||
} else {
|
||||
packer.raw_pack_uint16(STATESERVER_OBJECT_GENERATE_WITH_REQUIRED);
|
||||
packer.raw_pack_uint16(STATESERVER_CREATE_OBJECT_WITH_REQUIRED);
|
||||
}
|
||||
|
||||
// Parent is a bit overloaded; this parent is not about inheritance, this
|
||||
@ -1027,7 +1027,7 @@ ai_database_generate_context(
|
||||
packer.RAW_PACK_CHANNEL(database_server_id);
|
||||
packer.RAW_PACK_CHANNEL(from_channel_id);
|
||||
// packer.raw_pack_uint8('A');
|
||||
packer.raw_pack_uint16(STATESERVER_OBJECT_CREATE_WITH_REQUIRED_CONTEXT);
|
||||
packer.raw_pack_uint16(STATESERVER_OBJECT_ENTER_WITH_REQUIRED_CONTEXT);
|
||||
packer.raw_pack_uint32(parent_id);
|
||||
packer.raw_pack_uint32(zone_id);
|
||||
packer.RAW_PACK_CHANNEL(owner_channel);
|
||||
@ -1060,7 +1060,7 @@ ai_database_generate_context_old(
|
||||
packer.RAW_PACK_CHANNEL(database_server_id);
|
||||
packer.RAW_PACK_CHANNEL(from_channel_id);
|
||||
// packer.raw_pack_uint8('A');
|
||||
packer.raw_pack_uint16(STATESERVER_OBJECT_CREATE_WITH_REQUIRED_CONTEXT);
|
||||
packer.raw_pack_uint16(STATESERVER_OBJECT_ENTER_WITH_REQUIRED_CONTEXT);
|
||||
packer.raw_pack_uint32(parent_id);
|
||||
packer.raw_pack_uint32(zone_id);
|
||||
packer.raw_pack_uint16(_number); // DCD class ID
|
||||
|
@ -391,7 +391,7 @@ Datagram DCField::
|
||||
client_format_update(DOID_TYPE do_id, PyObject *args) const {
|
||||
DCPacker packer;
|
||||
|
||||
packer.raw_pack_uint16(CLIENT_OBJECT_UPDATE_FIELD);
|
||||
packer.raw_pack_uint16(CLIENT_OBJECT_SET_FIELD);
|
||||
packer.raw_pack_uint32(do_id);
|
||||
packer.raw_pack_uint16(_number);
|
||||
|
||||
@ -417,7 +417,7 @@ ai_format_update(DOID_TYPE do_id, CHANNEL_TYPE to_id, CHANNEL_TYPE from_id, PyOb
|
||||
packer.raw_pack_uint8(1);
|
||||
packer.RAW_PACK_CHANNEL(to_id);
|
||||
packer.RAW_PACK_CHANNEL(from_id);
|
||||
packer.raw_pack_uint16(STATESERVER_OBJECT_UPDATE_FIELD);
|
||||
packer.raw_pack_uint16(STATESERVER_OBJECT_SET_FIELD);
|
||||
packer.raw_pack_uint32(do_id);
|
||||
packer.raw_pack_uint16(_number);
|
||||
|
||||
|
@ -17,16 +17,13 @@
|
||||
// This file defines the server message types used within this module. It
|
||||
// duplicates some symbols defined in MsgTypes.py and AIMsgTypes.py.
|
||||
|
||||
#define CLIENT_OBJECT_UPDATE_FIELD 24
|
||||
#define CLIENT_CREATE_OBJECT_REQUIRED 34
|
||||
#define CLIENT_CREATE_OBJECT_REQUIRED_OTHER 35
|
||||
#define CLIENT_OBJECT_SET_FIELD 120
|
||||
#define CLIENT_ENTER_OBJECT_REQUIRED 142
|
||||
#define CLIENT_ENTER_OBJECT_REQUIRED_OTHER 143
|
||||
|
||||
#define STATESERVER_OBJECT_GENERATE_WITH_REQUIRED 2001
|
||||
#define STATESERVER_OBJECT_GENERATE_WITH_REQUIRED_OTHER 2003
|
||||
#define STATESERVER_OBJECT_UPDATE_FIELD 2004
|
||||
#define STATESERVER_OBJECT_CREATE_WITH_REQUIRED_CONTEXT 2050
|
||||
#define STATESERVER_OBJECT_CREATE_WITH_REQUIR_OTHER_CONTEXT 2051
|
||||
#define STATESERVER_BOUNCE_MESSAGE 2086
|
||||
#define STATESERVER_CREATE_OBJECT_WITH_REQUIRED 2000
|
||||
#define STATESERVER_CREATE_OBJECT_WITH_REQUIRED_OTHER 2001
|
||||
#define STATESERVER_OBJECT_SET_FIELD 2020
|
||||
|
||||
#define CLIENT_OBJECT_GENERATE_CMU 9002
|
||||
|
||||
|
@ -175,7 +175,7 @@ class ClientRepositoryBase(ConnectionRepository):
|
||||
"generate" messages when they are replayed().
|
||||
"""
|
||||
|
||||
if msgType == CLIENT_CREATE_OBJECT_REQUIRED_OTHER:
|
||||
if msgType == CLIENT_ENTER_OBJECT_REQUIRED_OTHER:
|
||||
# It's a generate message.
|
||||
doId = extra
|
||||
if doId in self.deferredDoIds:
|
||||
@ -381,7 +381,7 @@ class ClientRepositoryBase(ConnectionRepository):
|
||||
# The object had been deferred. Great; we don't even have
|
||||
# to generate it now.
|
||||
del self.deferredDoIds[doId]
|
||||
i = self.deferredGenerates.index((CLIENT_CREATE_OBJECT_REQUIRED_OTHER, doId))
|
||||
i = self.deferredGenerates.index((CLIENT_ENTER_OBJECT_REQUIRED_OTHER, doId))
|
||||
del self.deferredGenerates[i]
|
||||
if len(self.deferredGenerates) == 0:
|
||||
taskMgr.remove('deferredGenerate')
|
||||
|
@ -3,104 +3,140 @@
|
||||
from direct.showbase.PythonUtil import invertDictLossless
|
||||
|
||||
MsgName2Id = {
|
||||
# 2 new params: passwd, char bool 0/1 1 = new account
|
||||
# 2 new return values: 129 = not found, 12 = bad passwd,
|
||||
'CLIENT_LOGIN': 1,
|
||||
'CLIENT_LOGIN_RESP': 2,
|
||||
'CLIENT_GET_AVATARS': 3,
|
||||
'CLIENT_HELLO': 1,
|
||||
'CLIENT_HELLO_RESP': 2,
|
||||
|
||||
# Sent by the client when it's leaving.
|
||||
'CLIENT_DISCONNECT': 3,
|
||||
|
||||
# Sent by the server when it is dropping the connection deliberately.
|
||||
'CLIENT_GO_GET_LOST': 4,
|
||||
'CLIENT_GET_AVATARS_RESP': 5,
|
||||
'CLIENT_CREATE_AVATAR': 6,
|
||||
'CLIENT_CREATE_AVATAR_RESP': 7,
|
||||
'CLIENT_GET_FRIEND_LIST': 10,
|
||||
'CLIENT_GET_FRIEND_LIST_RESP': 11,
|
||||
'CLIENT_GET_AVATAR_DETAILS': 14,
|
||||
'CLIENT_GET_AVATAR_DETAILS_RESP': 15,
|
||||
'CLIENT_LOGIN_2': 16,
|
||||
'CLIENT_LOGIN_2_RESP': 17,
|
||||
'CLIENT_EJECT': 4,
|
||||
|
||||
'CLIENT_OBJECT_UPDATE_FIELD': 24,
|
||||
'CLIENT_OBJECT_UPDATE_FIELD_RESP': 24,
|
||||
'CLIENT_OBJECT_DISABLE': 25,
|
||||
'CLIENT_OBJECT_DISABLE_RESP': 25,
|
||||
'CLIENT_OBJECT_DISABLE_OWNER': 26,
|
||||
'CLIENT_OBJECT_DISABLE_OWNER_RESP': 26,
|
||||
'CLIENT_OBJECT_DELETE': 27,
|
||||
'CLIENT_OBJECT_DELETE_RESP': 27,
|
||||
'CLIENT_SET_ZONE_CMU': 29,
|
||||
'CLIENT_REMOVE_ZONE': 30,
|
||||
'CLIENT_SET_AVATAR': 32,
|
||||
'CLIENT_CREATE_OBJECT_REQUIRED': 34,
|
||||
'CLIENT_CREATE_OBJECT_REQUIRED_RESP': 34,
|
||||
'CLIENT_CREATE_OBJECT_REQUIRED_OTHER': 35,
|
||||
'CLIENT_CREATE_OBJECT_REQUIRED_OTHER_RESP': 35,
|
||||
'CLIENT_CREATE_OBJECT_REQUIRED_OTHER_OWNER': 36,
|
||||
'CLIENT_CREATE_OBJECT_REQUIRED_OTHER_OWNER_RESP':36,
|
||||
'CLIENT_HEARTBEAT': 5,
|
||||
|
||||
'CLIENT_REQUEST_GENERATES': 36,
|
||||
'CLIENT_OBJECT_SET_FIELD': 120,
|
||||
'CLIENT_OBJECT_SET_FIELDS': 121,
|
||||
'CLIENT_OBJECT_LEAVING': 132,
|
||||
'CLIENT_OBJECT_LEAVING_OWNER': 161,
|
||||
'CLIENT_ENTER_OBJECT_REQUIRED': 142,
|
||||
'CLIENT_ENTER_OBJECT_REQUIRED_OTHER': 143,
|
||||
'CLIENT_ENTER_OBJECT_REQUIRED_OWNER': 172,
|
||||
'CLIENT_ENTER_OBJECT_REQUIRED_OTHER_OWNER': 173,
|
||||
|
||||
'CLIENT_DISCONNECT': 37,
|
||||
'CLIENT_DONE_INTEREST_RESP': 204,
|
||||
|
||||
'CLIENT_GET_STATE_RESP': 47,
|
||||
'CLIENT_DONE_INTEREST_RESP': 48,
|
||||
|
||||
'CLIENT_DELETE_AVATAR': 49,
|
||||
|
||||
'CLIENT_DELETE_AVATAR_RESP': 5,
|
||||
|
||||
'CLIENT_HEARTBEAT': 52,
|
||||
'CLIENT_FRIEND_ONLINE': 53,
|
||||
'CLIENT_FRIEND_OFFLINE': 54,
|
||||
'CLIENT_REMOVE_FRIEND': 56,
|
||||
|
||||
'CLIENT_CHANGE_PASSWORD': 65,
|
||||
|
||||
'CLIENT_SET_NAME_PATTERN': 67,
|
||||
'CLIENT_SET_NAME_PATTERN_ANSWER': 68,
|
||||
|
||||
'CLIENT_SET_WISHNAME': 70,
|
||||
'CLIENT_SET_WISHNAME_RESP': 71,
|
||||
'CLIENT_SET_WISHNAME_CLEAR': 72,
|
||||
'CLIENT_SET_SECURITY': 73,
|
||||
|
||||
'CLIENT_SET_DOID_RANGE': 74,
|
||||
|
||||
'CLIENT_GET_AVATARS_RESP2': 75,
|
||||
'CLIENT_CREATE_AVATAR2': 76,
|
||||
'CLIENT_SYSTEM_MESSAGE': 78,
|
||||
'CLIENT_SET_AVTYPE': 80,
|
||||
|
||||
'CLIENT_GET_PET_DETAILS': 81,
|
||||
'CLIENT_GET_PET_DETAILS_RESP': 82,
|
||||
|
||||
'CLIENT_ADD_INTEREST': 97,
|
||||
'CLIENT_REMOVE_INTEREST': 99,
|
||||
'CLIENT_OBJECT_LOCATION': 102,
|
||||
|
||||
'CLIENT_LOGIN_3': 111,
|
||||
'CLIENT_LOGIN_3_RESP': 110,
|
||||
|
||||
'CLIENT_GET_FRIEND_LIST_EXTENDED': 115,
|
||||
'CLIENT_GET_FRIEND_LIST_EXTENDED_RESP': 116,
|
||||
|
||||
'CLIENT_SET_FIELD_SENDABLE': 120,
|
||||
|
||||
'CLIENT_SYSTEMMESSAGE_AKNOWLEDGE': 123,
|
||||
'CLIENT_CHANGE_GENERATE_ORDER': 124,
|
||||
|
||||
# new toontown specific login message, adds last logged in, and if child account has parent acount
|
||||
'CLIENT_LOGIN_TOONTOWN': 125,
|
||||
'CLIENT_LOGIN_TOONTOWN_RESP': 126,
|
||||
'CLIENT_ADD_INTEREST': 200,
|
||||
'CLIENT_ADD_INTEREST_MULTIPLE': 201,
|
||||
'CLIENT_REMOVE_INTEREST': 203,
|
||||
'CLIENT_OBJECT_LOCATION': 140,
|
||||
|
||||
|
||||
# These are sent internally inside the Astron cluster.
|
||||
|
||||
'STATESERVER_OBJECT_GENERATE_WITH_REQUIRED': 2001,
|
||||
'STATESERVER_OBJECT_GENERATE_WITH_REQUIRED_OTHER': 2003,
|
||||
'STATESERVER_OBJECT_UPDATE_FIELD': 2004,
|
||||
'STATESERVER_OBJECT_CREATE_WITH_REQUIRED_CONTEXT': 2050,
|
||||
'STATESERVER_OBJECT_CREATE_WITH_REQUIR_OTHER_CONTEXT': 2051,
|
||||
'STATESERVER_BOUNCE_MESSAGE': 2086,
|
||||
# Message Director control messages:
|
||||
'CONTROL_CHANNEL': 1,
|
||||
'CONTROL_ADD_CHANNEL': 9000,
|
||||
'CONTROL_REMOVE_CHANNEL': 9001,
|
||||
'CONTROL_ADD_RANGE': 9002,
|
||||
'CONTROL_REMOVE_RANGE': 9003,
|
||||
'CONTROL_ADD_POST_REMOVE': 9010,
|
||||
'CONTROL_CLEAR_POST_REMOVES': 9011,
|
||||
|
||||
# State Server control messages:
|
||||
'STATESERVER_CREATE_OBJECT_WITH_REQUIRED': 2000,
|
||||
'STATESERVER_CREATE_OBJECT_WITH_REQUIRED_OTHER': 2001,
|
||||
'STATESERVER_DELETE_AI_OBJECTS': 2009,
|
||||
'STATESERVER_OBJECT_GET_FIELD': 2010,
|
||||
'STATESERVER_OBJECT_GET_FIELD_RESP': 2011,
|
||||
'STATESERVER_OBJECT_GET_FIELDS': 2012,
|
||||
'STATESERVER_OBJECT_GET_FIELDS_RESP': 2013,
|
||||
'STATESERVER_OBJECT_GET_ALL': 2014,
|
||||
'STATESERVER_OBJECT_GET_ALL_RESP': 2015,
|
||||
'STATESERVER_OBJECT_SET_FIELD': 2020,
|
||||
'STATESERVER_OBJECT_SET_FIELDS': 2021,
|
||||
'STATESERVER_OBJECT_DELETE_FIELD_RAM': 2030,
|
||||
'STATESERVER_OBJECT_DELETE_FIELDS_RAM': 2031,
|
||||
'STATESERVER_OBJECT_DELETE_RAM': 2032,
|
||||
'STATESERVER_OBJECT_SET_LOCATION': 2040,
|
||||
'STATESERVER_OBJECT_CHANGING_LOCATION': 2041,
|
||||
'STATESERVER_OBJECT_ENTER_LOCATION_WITH_REQUIRED': 2042,
|
||||
'STATESERVER_OBJECT_ENTER_LOCATION_WITH_REQUIRED_OTHER': 2043,
|
||||
'STATESERVER_OBJECT_GET_LOCATION': 2044,
|
||||
'STATESERVER_OBJECT_GET_LOCATION_RESP': 2045,
|
||||
'STATESERVER_OBJECT_SET_AI': 2050,
|
||||
'STATESERVER_OBJECT_CHANGING_AI': 2051,
|
||||
'STATESERVER_OBJECT_ENTER_AI_WITH_REQUIRED': 2052,
|
||||
'STATESERVER_OBJECT_ENTER_AI_WITH_REQUIRED_OTHER': 2053,
|
||||
'STATESERVER_OBJECT_GET_AI': 2054,
|
||||
'STATESERVER_OBJECT_GET_AI_RESP': 2055,
|
||||
'STATESERVER_OBJECT_SET_OWNER': 2060,
|
||||
'STATESERVER_OBJECT_CHANGING_OWNER': 2061,
|
||||
'STATESERVER_OBJECT_ENTER_OWNER_WITH_REQUIRED': 2062,
|
||||
'STATESERVER_OBJECT_ENTER_OWNER_WITH_REQUIRED_OTHER': 2063,
|
||||
'STATESERVER_OBJECT_GET_OWNER': 2064,
|
||||
'STATESERVER_OBJECT_GET_OWNER_RESP': 2065,
|
||||
'STATESERVER_OBJECT_GET_ZONE_OBJECTS': 2100,
|
||||
'STATESERVER_OBJECT_GET_ZONES_OBJECTS': 2102,
|
||||
'STATESERVER_OBJECT_GET_CHILDREN': 2104,
|
||||
'STATESERVER_OBJECT_GET_ZONE_COUNT': 2110,
|
||||
'STATESERVER_OBJECT_GET_ZONE_COUNT_RESP': 2111,
|
||||
'STATESERVER_OBJECT_GET_ZONES_COUNT': 2112,
|
||||
'STATESERVER_OBJECT_GET_ZONES_COUNT_RESP': 2113,
|
||||
'STATESERVER_OBJECT_GET_CHILD_COUNT': 2114,
|
||||
'STATESERVER_OBJECT_GET_CHILD_COUNT_RESP': 2115,
|
||||
'STATESERVER_OBJECT_DELETE_ZONE': 2120,
|
||||
'STATESERVER_OBJECT_DELETE_ZONES': 2122,
|
||||
'STATESERVER_OBJECT_DELETE_CHILDREN': 2124,
|
||||
# DBSS-backed-object messages:
|
||||
'DBSS_OBJECT_ACTIVATE_WITH_DEFAULTS': 2200,
|
||||
'DBSS_OBJECT_ACTIVATE_WITH_DEFAULTS_OTHER': 2201,
|
||||
'DBSS_OBJECT_GET_ACTIVATED': 2207,
|
||||
'DBSS_OBJECT_GET_ACTIVATED_RESP': 2208,
|
||||
'DBSS_OBJECT_DELETE_FIELD_DISK': 2230,
|
||||
'DBSS_OBJECT_DELETE_FIELDS_DISK': 2231,
|
||||
'DBSS_OBJECT_DELETE_DISK': 2232,
|
||||
|
||||
# Database Server control messages:
|
||||
'DBSERVER_CREATE_OBJECT': 3000,
|
||||
'DBSERVER_CREATE_OBJECT_RESP': 3001,
|
||||
'DBSERVER_OBJECT_GET_FIELD': 3010,
|
||||
'DBSERVER_OBJECT_GET_FIELD_RESP': 3011,
|
||||
'DBSERVER_OBJECT_GET_FIELDS': 3012,
|
||||
'DBSERVER_OBJECT_GET_FIELDS_RESP': 3013,
|
||||
'DBSERVER_OBJECT_GET_ALL': 3014,
|
||||
'DBSERVER_OBJECT_GET_ALL_RESP': 3015,
|
||||
'DBSERVER_OBJECT_SET_FIELD': 3020,
|
||||
'DBSERVER_OBJECT_SET_FIELDS': 3021,
|
||||
'DBSERVER_OBJECT_SET_FIELD_IF_EQUALS': 3022,
|
||||
'DBSERVER_OBJECT_SET_FIELD_IF_EQUALS_RESP': 3023,
|
||||
'DBSERVER_OBJECT_SET_FIELDS_IF_EQUALS': 3024,
|
||||
'DBSERVER_OBJECT_SET_FIELDS_IF_EQUALS_RESP': 3025,
|
||||
'DBSERVER_OBJECT_SET_FIELD_IF_EMPTY': 3026,
|
||||
'DBSERVER_OBJECT_SET_FIELD_IF_EMPTY_RESP': 3027,
|
||||
'DBSERVER_OBJECT_DELETE_FIELD': 3030,
|
||||
'DBSERVER_OBJECT_DELETE_FIELDS': 3031,
|
||||
'DBSERVER_OBJECT_DELETE': 3032,
|
||||
|
||||
# Client Agent control messages:
|
||||
'CLIENTAGENT_SET_STATE': 1000,
|
||||
'CLIENTAGENT_SET_CLIENT_ID': 1001,
|
||||
'CLIENTAGENT_SEND_DATAGRAM': 1002,
|
||||
'CLIENTAGENT_EJECT': 1004,
|
||||
'CLIENTAGENT_DROP': 1005,
|
||||
'CLIENTAGENT_GET_NETWORK_ADDRESS': 1006,
|
||||
'CLIENTAGENT_GET_NETWORK_ADDRESS_RESP': 1007,
|
||||
'CLIENTAGENT_DECLARE_OBJECT': 1010,
|
||||
'CLIENTAGENT_UNDECLARE_OBJECT': 1011,
|
||||
'CLIENTAGENT_ADD_SESSION_OBJECT': 1012,
|
||||
'CLIENTAGENT_REMOVE_SESSION_OBJECT': 1013,
|
||||
'CLIENTAGENT_SET_FIELDS_SENDABLE': 1014,
|
||||
'CLIENTAGENT_OPEN_CHANNEL': 1100,
|
||||
'CLIENTAGENT_CLOSE_CHANNEL': 1101,
|
||||
'CLIENTAGENT_ADD_POST_REMOVE': 1110,
|
||||
'CLIENTAGENT_CLEAR_POST_REMOVES': 1111,
|
||||
'CLIENTAGENT_ADD_INTEREST': 1200,
|
||||
'CLIENTAGENT_ADD_INTEREST_MULTIPLE': 1201,
|
||||
'CLIENTAGENT_REMOVE_INTEREST': 1203,
|
||||
}
|
||||
|
||||
# create id->name table for debugging
|
||||
|
@ -19,7 +19,7 @@ MsgName2Id = {
|
||||
'CLIENT_HEARTBEAT_CMU' : 9011,
|
||||
'CLIENT_OBJECT_UPDATE_FIELD_TARGETED_CMU' : 9011,
|
||||
|
||||
'CLIENT_OBJECT_UPDATE_FIELD' : 24, # Matches MsgTypes.CLIENT_OBJECT_UPDATE_FIELD
|
||||
'CLIENT_OBJECT_UPDATE_FIELD' : 120, # Matches MsgTypes.CLIENT_OBJECT_SET_FIELD
|
||||
}
|
||||
|
||||
# create id->name table for debugging
|
||||
|
@ -1,208 +0,0 @@
|
||||
"""OldClientRepository module: contains the OldClientRepository class"""
|
||||
|
||||
from .ClientRepositoryBase import *
|
||||
|
||||
class OldClientRepository(ClientRepositoryBase):
|
||||
"""
|
||||
This is the open-source ClientRepository as provided by CMU. It
|
||||
communicates with the ServerRepository in this same directory.
|
||||
|
||||
If you are looking for the VR Studio's implementation of the
|
||||
client repository, look to OTPClientRepository (elsewhere).
|
||||
"""
|
||||
notify = DirectNotifyGlobal.directNotify.newCategory("ClientRepository")
|
||||
|
||||
def __init__(self, dcFileNames = None):
|
||||
ClientRepositoryBase.__init__(self, dcFileNames = dcFileNames)
|
||||
|
||||
# The DOID allocator. The CMU LAN server may choose to
|
||||
# send us a block of DOIDs. If it chooses to do so, then we
|
||||
# may create objects, using those DOIDs.
|
||||
self.DOIDbase = 0
|
||||
self.DOIDnext = 0
|
||||
self.DOIDlast = 0
|
||||
|
||||
def handleSetDOIDrange(self, di):
|
||||
self.DOIDbase = di.getUint32()
|
||||
self.DOIDlast = self.DOIDbase + di.getUint32()
|
||||
self.DOIDnext = self.DOIDbase
|
||||
|
||||
def handleRequestGenerates(self, di):
|
||||
# When new clients join the zone of an object, they need to hear
|
||||
# about it, so we send out all of our information about objects in
|
||||
# that particular zone.
|
||||
|
||||
assert self.DOIDnext < self.DOIDlast
|
||||
zone = di.getUint32()
|
||||
for obj in self.doId2do.values():
|
||||
if obj.zone == zone:
|
||||
id = obj.doId
|
||||
if (self.isLocalId(id)):
|
||||
self.send(obj.dclass.clientFormatGenerate(obj, id, zone, []))
|
||||
|
||||
def createWithRequired(self, className, zoneId = 0, optionalFields=None):
|
||||
if self.DOIDnext >= self.DOIDlast:
|
||||
self.notify.error(
|
||||
"Cannot allocate a distributed object ID: all IDs used up.")
|
||||
return None
|
||||
id = self.DOIDnext
|
||||
self.DOIDnext = self.DOIDnext + 1
|
||||
dclass = self.dclassesByName[className]
|
||||
classDef = dclass.getClassDef()
|
||||
if classDef == None:
|
||||
self.notify.error("Could not create an undefined %s object." % (
|
||||
dclass.getName()))
|
||||
obj = classDef(self)
|
||||
obj.dclass = dclass
|
||||
obj.zone = zoneId
|
||||
obj.doId = id
|
||||
self.doId2do[id] = obj
|
||||
obj.generateInit()
|
||||
obj._retrieveCachedData()
|
||||
obj.generate()
|
||||
obj.announceGenerate()
|
||||
datagram = dclass.clientFormatGenerate(obj, id, zoneId, optionalFields)
|
||||
self.send(datagram)
|
||||
return obj
|
||||
|
||||
def sendDisableMsg(self, doId):
|
||||
datagram = PyDatagram()
|
||||
datagram.addUint16(CLIENT_OBJECT_DISABLE)
|
||||
datagram.addUint32(doId)
|
||||
self.send(datagram)
|
||||
|
||||
def sendDeleteMsg(self, doId):
|
||||
datagram = PyDatagram()
|
||||
datagram.addUint16(CLIENT_OBJECT_DELETE)
|
||||
datagram.addUint32(doId)
|
||||
self.send(datagram)
|
||||
|
||||
def sendRemoveZoneMsg(self, zoneId, visibleZoneList=None):
|
||||
datagram = PyDatagram()
|
||||
datagram.addUint16(CLIENT_REMOVE_ZONE)
|
||||
datagram.addUint32(zoneId)
|
||||
|
||||
# if we have an explicit list of visible zones, add them
|
||||
if visibleZoneList is not None:
|
||||
vzl = list(visibleZoneList)
|
||||
vzl.sort()
|
||||
assert PythonUtil.uniqueElements(vzl)
|
||||
for zone in vzl:
|
||||
datagram.addUint32(zone)
|
||||
|
||||
# send the message
|
||||
self.send(datagram)
|
||||
|
||||
def sendUpdateZone(self, obj, zoneId):
|
||||
id = obj.doId
|
||||
assert self.isLocalId(id)
|
||||
self.sendDeleteMsg(id, 1)
|
||||
obj.zone = zoneId
|
||||
self.send(obj.dclass.clientFormatGenerate(obj, id, zoneId, []))
|
||||
|
||||
def sendSetZoneMsg(self, zoneId, visibleZoneList=None):
|
||||
datagram = PyDatagram()
|
||||
# Add message type
|
||||
datagram.addUint16(CLIENT_SET_ZONE_CMU)
|
||||
# Add zone id
|
||||
datagram.addUint32(zoneId)
|
||||
|
||||
# if we have an explicit list of visible zones, add them
|
||||
if visibleZoneList is not None:
|
||||
vzl = list(visibleZoneList)
|
||||
vzl.sort()
|
||||
assert PythonUtil.uniqueElements(vzl)
|
||||
for zone in vzl:
|
||||
datagram.addUint32(zone)
|
||||
|
||||
# send the message
|
||||
self.send(datagram)
|
||||
|
||||
def isLocalId(self, id):
|
||||
return ((id >= self.DOIDbase) and (id < self.DOIDlast))
|
||||
|
||||
def haveCreateAuthority(self):
|
||||
return (self.DOIDlast > self.DOIDnext)
|
||||
|
||||
def handleDatagram(self, di):
|
||||
if self.notify.getDebug():
|
||||
print("ClientRepository received datagram:")
|
||||
di.getDatagram().dumpHex(ostream)
|
||||
|
||||
msgType = self.getMsgType()
|
||||
|
||||
# These are the sort of messages we may expect from the public
|
||||
# Panda server.
|
||||
|
||||
if msgType == CLIENT_SET_DOID_RANGE:
|
||||
self.handleSetDOIDrange(di)
|
||||
elif msgType == CLIENT_CREATE_OBJECT_REQUIRED_RESP:
|
||||
self.handleGenerateWithRequired(di)
|
||||
elif msgType == CLIENT_CREATE_OBJECT_REQUIRED_OTHER_RESP:
|
||||
self.handleGenerateWithRequiredOther(di)
|
||||
elif msgType == CLIENT_OBJECT_UPDATE_FIELD_RESP:
|
||||
self.handleUpdateField(di)
|
||||
elif msgType == CLIENT_OBJECT_DELETE_RESP:
|
||||
self.handleDelete(di)
|
||||
elif msgType == CLIENT_OBJECT_DISABLE_RESP:
|
||||
self.handleDisable(di)
|
||||
elif msgType == CLIENT_REQUEST_GENERATES:
|
||||
self.handleRequestGenerates(di)
|
||||
else:
|
||||
self.handleMessageType(msgType, di)
|
||||
|
||||
# If we're processing a lot of datagrams within one frame, we
|
||||
# may forget to send heartbeats. Keep them coming!
|
||||
self.considerHeartbeat()
|
||||
|
||||
def handleGenerateWithRequired(self, di):
|
||||
# Get the class Id
|
||||
classId = di.getUint16()
|
||||
# Get the DO Id
|
||||
doId = di.getUint32()
|
||||
# Look up the dclass
|
||||
dclass = self.dclassesByNumber[classId]
|
||||
dclass.startGenerate()
|
||||
# Create a new distributed object, and put it in the dictionary
|
||||
distObj = self.generateWithRequiredFields(dclass, doId, di)
|
||||
dclass.stopGenerate()
|
||||
|
||||
def generateWithRequiredFields(self, dclass, doId, di):
|
||||
if doId in self.doId2do:
|
||||
# ...it is in our dictionary.
|
||||
# Just update it.
|
||||
distObj = self.doId2do[doId]
|
||||
assert distObj.dclass == dclass
|
||||
distObj.generate()
|
||||
distObj.updateRequiredFields(dclass, di)
|
||||
# updateRequiredFields calls announceGenerate
|
||||
elif self.cache.contains(doId):
|
||||
# ...it is in the cache.
|
||||
# Pull it out of the cache:
|
||||
distObj = self.cache.retrieve(doId)
|
||||
assert distObj.dclass == dclass
|
||||
# put it in the dictionary:
|
||||
self.doId2do[doId] = distObj
|
||||
# and update it.
|
||||
distObj.generate()
|
||||
distObj.updateRequiredFields(dclass, di)
|
||||
# updateRequiredFields calls announceGenerate
|
||||
else:
|
||||
# ...it is not in the dictionary or the cache.
|
||||
# Construct a new one
|
||||
classDef = dclass.getClassDef()
|
||||
if classDef == None:
|
||||
self.notify.error("Could not create an undefined %s object." % (
|
||||
dclass.getName()))
|
||||
distObj = classDef(self)
|
||||
distObj.dclass = dclass
|
||||
# Assign it an Id
|
||||
distObj.doId = doId
|
||||
# Put the new do in the dictionary
|
||||
self.doId2do[doId] = distObj
|
||||
# Update the required fields
|
||||
distObj.generateInit() # Only called when constructed
|
||||
distObj.generate()
|
||||
distObj.updateRequiredFields(dclass, di)
|
||||
# updateRequiredFields calls announceGenerate
|
||||
return distObj
|
@ -301,8 +301,8 @@ check_datagram() {
|
||||
|
||||
switch (_msg_type) {
|
||||
#ifdef HAVE_PYTHON
|
||||
case CLIENT_OBJECT_UPDATE_FIELD:
|
||||
case STATESERVER_OBJECT_UPDATE_FIELD:
|
||||
case CLIENT_OBJECT_SET_FIELD:
|
||||
case STATESERVER_OBJECT_SET_FIELD:
|
||||
if (_handle_c_updates) {
|
||||
if (_has_owner_view) {
|
||||
if (!handle_update_field_owner()) {
|
||||
@ -494,7 +494,7 @@ send_message_bundle(unsigned int channel, unsigned int sender_channel) {
|
||||
dg.add_int8(1);
|
||||
dg.add_uint64(channel);
|
||||
dg.add_uint64(sender_channel);
|
||||
dg.add_uint16(STATESERVER_BOUNCE_MESSAGE);
|
||||
//dg.add_uint16(STATESERVER_BOUNCE_MESSAGE);
|
||||
// add each bundled message
|
||||
BundledMsgVector::const_iterator bmi;
|
||||
for (bmi = _bundle_msgs.begin(); bmi != _bundle_msgs.end(); bmi++) {
|
||||
@ -899,11 +899,11 @@ describe_message(ostream &out, const string &prefix,
|
||||
|
||||
packer.RAW_UNPACK_CHANNEL(); // msg_sender
|
||||
msg_type = packer.raw_unpack_uint16();
|
||||
is_update = (msg_type == STATESERVER_OBJECT_UPDATE_FIELD);
|
||||
is_update = (msg_type == STATESERVER_OBJECT_SET_FIELD);
|
||||
|
||||
} else {
|
||||
msg_type = packer.raw_unpack_uint16();
|
||||
is_update = (msg_type == CLIENT_OBJECT_UPDATE_FIELD);
|
||||
is_update = (msg_type == CLIENT_OBJECT_SET_FIELD);
|
||||
}
|
||||
|
||||
if (!is_update) {
|
||||
|
@ -278,12 +278,12 @@ begin_send_update(DCPacker &packer, const string &field_name) {
|
||||
packer.RAW_PACK_CHANNEL(_do_id);
|
||||
packer.RAW_PACK_CHANNEL(_ai_id);
|
||||
// packer.raw_pack_uint8('A');
|
||||
packer.raw_pack_uint16(STATESERVER_OBJECT_UPDATE_FIELD);
|
||||
packer.raw_pack_uint16(STATESERVER_OBJECT_SET_FIELD);
|
||||
packer.raw_pack_uint32(_do_id);
|
||||
packer.raw_pack_uint16(field->get_number());
|
||||
|
||||
} else {
|
||||
packer.raw_pack_uint16(CLIENT_OBJECT_UPDATE_FIELD);
|
||||
packer.raw_pack_uint16(CLIENT_OBJECT_SET_FIELD);
|
||||
packer.raw_pack_uint32(_do_id);
|
||||
packer.raw_pack_uint16(field->get_number());
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user