diff --git a/pyogp/lib/base/examples/sample_object_create_permissions.py b/pyogp/lib/base/examples/sample_object_create_permissions.py index e6751e9..01870c4 100644 --- a/pyogp/lib/base/examples/sample_object_create_permissions.py +++ b/pyogp/lib/base/examples/sample_object_create_permissions.py @@ -35,7 +35,7 @@ from pyogp.lib.base.settings import Settings # pyogp utilites from pyogp.lib.base.utilities.helpers import Wait -object_names = ['A','B','C','D','E','F'] +object_names = ['Alpha','Bravo','Charlie','Delta','Echo','Foxtrot'] def login(): """ login an to a login endpoint """ @@ -75,7 +75,7 @@ def login(): # let's disable inventory handling for this example settings = Settings() - settings.ENABLE_INVENTORY_MANAGEMENT = False + settings.ENABLE_INVENTORY_MANAGEMENT = True settings.ENABLE_EQ_LOGGING = False settings.ENABLE_CAPS_LOGGING = False @@ -110,6 +110,9 @@ def login(): waiter = Wait(15) + for item in objects_nearby: + item.deselect(client) + my_objects = client.region.objects.my_objects() print 'Hey! Will try to set object names' @@ -120,21 +123,24 @@ def login(): fixed_name = object_names[i] print ' for LocalID %s : %s ' % (item.LocalID, fixed_name) item.set_object_name(client,fixed_name) - if fixed_name == 'A': + if fixed_name == 'Alpha': item.set_object_transfer_only_permissions(client) - elif fixed_name == 'B': + elif fixed_name == 'Bravo': item.set_object_copy_transfer_permissions(client) - elif fixed_name == 'C': + elif fixed_name == 'Charlie': item.set_object_mod_transfer_permissions(client) - elif fixed_name == 'D': + elif fixed_name == 'Delta': item.set_object_full_permissions(client) - elif fixed_name == 'E': + elif fixed_name == 'Echo': item.set_object_copy_only_permissions(client) - elif fixed_name == 'F': + elif fixed_name == 'Foxtrot': item.set_object_copy_mod_permissions(client) else: print "Name Does Not Match!" i = i + 1 + waiter = Wait(2) + item.take(client) + waiter = Wait(30) diff --git a/pyogp/lib/base/groups.py b/pyogp/lib/base/groups.py index 2d43f46..593f992 100644 --- a/pyogp/lib/base/groups.py +++ b/pyogp/lib/base/groups.py @@ -372,8 +372,8 @@ class MockChatInterface(object): api.sleep() except: termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.old_settings) - finally: - termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.old_settings) + #finally: + # termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.old_settings) if self.agent.running: self.start() diff --git a/pyogp/lib/base/message/data_packer.py b/pyogp/lib/base/message/data_packer.py index 93d8da9..374e709 100644 --- a/pyogp/lib/base/message/data_packer.py +++ b/pyogp/lib/base/message/data_packer.py @@ -84,4 +84,5 @@ class DataPacker(object): return uuid.bytes def __pack_string(self, endian, pack_string): - return pack_string + return pack_string + "\x00" + diff --git a/pyogp/lib/base/message/data_unpacker.py b/pyogp/lib/base/message/data_unpacker.py index 5bb6d16..596332c 100644 --- a/pyogp/lib/base/message/data_unpacker.py +++ b/pyogp/lib/base/message/data_unpacker.py @@ -105,7 +105,7 @@ class DataUnpacker(object): return UUID(bytes=uuid_data, offset = 0) def __unpack_string(self, endian, pack_string, var_size): - return pack_string + return pack_string.rstrip() # strip trailing null def __unpack_fixed(self, endian, data, var_size): #LDE 23oct2008 handler for MVT_FIXED return data diff --git a/pyogp/lib/base/message/udpserializer.py b/pyogp/lib/base/message/udpserializer.py index efd79aa..1d50ebf 100644 --- a/pyogp/lib/base/message/udpserializer.py +++ b/pyogp/lib/base/message/udpserializer.py @@ -154,27 +154,3 @@ class UDPPacketSerializer(object): return block_buffer, bytes - """this is currently done in the parser - def build_message_ids(self): - packer = DataPacker() - for template in self.template_list.message_templates.values(): - frequency = template.frequency - if frequency == MsgFrequency.FIXED_FREQUENCY_MESSAGE: - #have to do this because Fixed messages are stored as a long in the template - template.msg_num_hex = '\xff\xff\xff' + \ - packer.pack_data(template.msg_num, \ - MsgType.MVT_U8) - elif frequency == MsgFrequency.LOW_FREQUENCY_MESSAGE: - template.msg_num_hex = '\xff\xff' + \ - packer.pack_data(template.msg_num, \ - MsgType.MVT_U16, \ - EndianType.BIG) - elif frequency == MsgFrequency.MEDIUM_FREQUENCY_MESSAGE: - template.msg_num_hex = '\xff' + \ - packer.pack_data(template.msg_num, \ - MsgType.MVT_U8, \ - EndianType.BIG) - elif frequency == MsgFrequency.HIGH_FREQUENCY_MESSAGE: - template.msg_num_hex = packer.pack_data(template.msg_num, \ - MsgType.MVT_U8, \ - EndianType.BIG)""" diff --git a/pyogp/lib/base/objects.py b/pyogp/lib/base/objects.py index 99a5e88..ca897a4 100644 --- a/pyogp/lib/base/objects.py +++ b/pyogp/lib/base/objects.py @@ -101,6 +101,12 @@ class Objects(object): onKillObject_received= self.packet_handler._register('KillObject') onKillObject_received.subscribe(onKillObject, self) + # uncomment these to view packets sent back to simulator + # onObjectName_sent = self.packet_handler._register('ObjectName') + # onObjectName_sent.subscribe(self.helpers.log_packet, self) + + # onDeRezObject_sent = self.packet_handler._register('DeRezObject') + # onDeRezObject_sent.subscribe(self.helpers.log_packet, self) if self.settings.LOG_VERBOSE: log(INFO, "Initializing object storage") @@ -240,12 +246,12 @@ class Objects(object): victim = self.get_avatar_from_store(LocalID = ID) # this is an avatar - if _victim.PCode == 47: + if victim.PCode == 47: self.kill_stored_avatar(ID) # this is a Primitive - elif _victim.PCode == 9: + elif victim.PCode == 9: self.kill_stored_object(ID) @@ -255,7 +261,7 @@ class Objects(object): def kill_stored_avatar(self, ID): - index = [self.avatar_store.index(_avatar_) for _avatar_ in self.avatar_store if _avatar_.ID == ID] + index = [self.avatar_store.index(_avatar_) for _avatar_ in self.avatar_store if _avatar_.LocalID == ID] if index != []: del self.avatar_store[index[0]] @@ -263,7 +269,7 @@ class Objects(object): def kill_stored_object(self, ID): - index = [self.object_store.index(_avatar_) for _object_ in self.object_store if _object_.ID == ID] + index = [self.object_store.index(_object_) for _object_ in self.object_store if _object_.LocalID == ID] if index != []: del self.object_store[index[0]] @@ -327,8 +333,8 @@ class Objects(object): """ packet = RequestMultipleObjectsPacket() - packet.AgentData['AgentID'] = uuid.UUID(self.agent.agent_id) - packet.AgentData['SessionID'] = uuid.UUID(self.agent.session_id) + packet.AgentData['AgentID'] = uuid.UUID(str(self.agent.agent_id)) + packet.AgentData['SessionID'] = uuid.UUID(str(self.agent.session_id)) if ID != None: @@ -635,6 +641,52 @@ class Object(object): agent.region.enqueue_message(packet()) + def derez(self, agent, destination, destinationID, transactionID, GroupID): + """ derez an object, specifying the destination """ + + packet = DeRezObjectPacket() + + # build the AgentData block + packet.AgentData['AgentID'] = uuid.UUID(str(agent.agent_id)) + packet.AgentData['SessionID'] = uuid.UUID(str(agent.session_id)) + + packet.AgentBlock['GroupID'] = uuid.UUID(str(GroupID)) + packet.AgentBlock['Destination'] = destination + packet.AgentBlock['DestinationID'] = uuid.UUID(str(destinationID)) + packet.AgentBlock['TransactionID'] = uuid.UUID(str(transactionID)) + + # fix me: faking these values + packet.AgentBlock['PacketCount'] = 1 + packet.AgentBlock['PacketNumber'] = 0 + + ObjectData = {} + ObjectData['ObjectLocalID'] = self.LocalID + + packet.ObjectDataBlocks.append(ObjectData) + + agent.region.enqueue_message(packet()) + + def take(self, agent): + """ take object into inventory """ + + parent_folder = self.FolderID + + # Check if we have inventory turned on + if not(parent_folder and agent.settings.ENABLE_INVENTORY_MANAGEMENT): + log(WARNING,"Inventory not available, please enable settings.ENABLE_INVENTORY_MANAGEMENT") + return + + if not(parent_folder): + # locate Object folder + objects_folder = [ folder for folder in agent.inventory.folders if folder.Name == 'Objects' ] + if objects_folder: + parent_folder = objects_folder[0].FolderID + else: + log(ERROR,"Unable to locate top-level Objects folder to take item into inventory.") + return + + self.derez(agent, 4, parent_folder, uuid.uuid4(), agent.ActiveGroupID) + def select(self, agent): """ select an object