diff --git a/metaverse/bot.py b/metaverse/bot.py index d68ebcb..1ba9b05 100644 --- a/metaverse/bot.py +++ b/metaverse/bot.py @@ -3,6 +3,7 @@ import struct import math import random import datetime +import uuid from .eventtarget import EventTarget from . import login from . import viewer as Viewer @@ -17,6 +18,7 @@ class SimpleBot(EventTarget): self.agent = Viewer.Agent() self.agent.on("Message", self.handleMessage) self.agent.on("Event", self.handleEvent) + self.lastAgentUpdate = None async def handleSystemMessages(self, simulator, message): # We only really care about the parent simulator here @@ -60,6 +62,15 @@ class SimpleBot(EventTarget): self.send(msg) self.agentUpdate() + self.updateAnimations({ + ANIM_AGENT_DO_NOT_DISTURB: False, + ANIM_AGENT_LAND: False, + ANIM_AGENT_STAND: True, + ANIM_AGENT_STAND_1: False, + ANIM_AGENT_STAND_2: False, + ANIM_AGENT_STAND_3: False, + ANIM_AGENT_STAND_4: False + }) elif message.name == "ImprovedInstantMessage": await self.fire("InstantMessage", @@ -72,7 +83,7 @@ class SimpleBot(EventTarget): message.MessageBlock.Dialog, datetime.datetime.fromtimestamp(message.MessageBlock.Timestamp) ) - + async def handleSystemEvent(self, sim, name, body): if name == "ChatterBoxInvitation": if "instantmessage" in body: @@ -119,7 +130,22 @@ class SimpleBot(EventTarget): await self.agent.login(loginHandle) async def run(self): - await self.agent.run() + bot_tasks = asyncio.create_task(self._bot_tasks()) + + try: + await self.agent.run() + finally: + bot_tasks.cancel() + try: + await bot_tasks + except asyncio.CancelledError: + pass + + async def _bot_tasks(self): + while True: + await asyncio.sleep(1) + if self.lastAgentUpdate: + self.send(self.lastAgentUpdate) def logout(self): self.agent.logout() @@ -160,6 +186,24 @@ class SimpleBot(EventTarget): msg.MessageBlock.BinaryBucket = binaryBucket or b"" self.send(msg) + def updateAnimations(self, animations, eventList = None): + msg = self.messageTemplate.getMessage("AgentAnimation") + msg.AgentData.AgentID = self.agent.agentId + msg.AgentData.SessionID = self.agent.sessionId + for i, (animation, state) in enumerate(animations.items()): + if type(animation) != uuid.UUID: + animation = uuid.UUID(animation) + + msg.AnimationList[i].AnimID = animation + msg.AnimationList[i].StartAnim = state + + if eventList == None: + eventList = [b""] + + for i, v in enumerate(eventList): + msg.PhysicalAvatarEventList[i].TypeData = v + + self.send(msg) def agentUpdate(self, controls = 0, forward = 0, state = 0, flags = 0): angle_rad = math.radians(forward) @@ -181,4 +225,5 @@ class SimpleBot(EventTarget): msg.AgentData.Far = math.inf msg.AgentData.ControlFlags = controls msg.AgentData.Flags = flags - self.send(msg) \ No newline at end of file + self.send(msg) + self.lastAgentUpdate = msg \ No newline at end of file diff --git a/metaverse/const.py b/metaverse/const.py index 76b301b..8bc97a5 100644 --- a/metaverse/const.py +++ b/metaverse/const.py @@ -1,3 +1,5 @@ +import uuid + # llui/llchat.h CHAT_TYPE_WHISPER = 0 CHAT_TYPE_NORMAL = 1 @@ -177,4 +179,151 @@ IM_FRIENDSHIP_ACCEPTED = 39 IM_FRIENDSHIP_DECLINED_DEPRECATED = 40 IM_TYPING_START = 41 -IM_TYPING_STOP = 42 \ No newline at end of file +IM_TYPING_STOP = 42 + +# llcharacter/llanimationstates.cpp +ANIM_AGENT_AFRAID = uuid.UUID("6b61c8e8-4747-0d75-12d7-e49ff207a4ca") +ANIM_AGENT_AIM_BAZOOKA_R = uuid.UUID("b5b4a67d-0aee-30d2-72cd-77b333e932ef") +ANIM_AGENT_AIM_BOW_L = uuid.UUID("46bb4359-de38-4ed8-6a22-f1f52fe8f506") +ANIM_AGENT_AIM_HANDGUN_R = uuid.UUID("3147d815-6338-b932-f011-16b56d9ac18b") +ANIM_AGENT_AIM_RIFLE_R = uuid.UUID("ea633413-8006-180a-c3ba-96dd1d756720") +ANIM_AGENT_ANGRY = uuid.UUID("5747a48e-073e-c331-f6f3-7c2149613d3e") +ANIM_AGENT_AWAY = uuid.UUID("fd037134-85d4-f241-72c6-4f42164fedee") +ANIM_AGENT_BACKFLIP = uuid.UUID("c4ca6188-9127-4f31-0158-23c4e2f93304") +ANIM_AGENT_BELLY_LAUGH = uuid.UUID("18b3a4b5-b463-bd48-e4b6-71eaac76c515") +ANIM_AGENT_BLOW_KISS = uuid.UUID("db84829b-462c-ee83-1e27-9bbee66bd624") +ANIM_AGENT_BORED = uuid.UUID("b906c4ba-703b-1940-32a3-0c7f7d791510") +ANIM_AGENT_BOW = uuid.UUID("82e99230-c906-1403-4d9c-3889dd98daba") +ANIM_AGENT_BRUSH = uuid.UUID("349a3801-54f9-bf2c-3bd0-1ac89772af01") +ANIM_AGENT_DO_NOT_DISTURB = uuid.UUID("efcf670c-2d18-8128-973a-034ebc806b67") +ANIM_AGENT_CLAP = uuid.UUID("9b0c1c4e-8ac7-7969-1494-28c874c4f668") +ANIM_AGENT_COURTBOW = uuid.UUID("9ba1c942-08be-e43a-fb29-16ad440efc50") +ANIM_AGENT_CROUCH = uuid.UUID("201f3fdf-cb1f-dbec-201f-7333e328ae7c") +ANIM_AGENT_CROUCHWALK = uuid.UUID("47f5f6fb-22e5-ae44-f871-73aaaf4a6022") +ANIM_AGENT_CRY = uuid.UUID("92624d3e-1068-f1aa-a5ec-8244585193ed") +ANIM_AGENT_CUSTOMIZE = uuid.UUID("038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53") +ANIM_AGENT_CUSTOMIZE_DONE = uuid.UUID("6883a61a-b27b-5914-a61e-dda118a9ee2c") +ANIM_AGENT_DANCE1 = uuid.UUID("b68a3d7c-de9e-fc87-eec8-543d787e5b0d") +ANIM_AGENT_DANCE2 = uuid.UUID("928cae18-e31d-76fd-9cc9-2f55160ff818") +ANIM_AGENT_DANCE3 = uuid.UUID("30047778-10ea-1af7-6881-4db7a3a5a114") +ANIM_AGENT_DANCE4 = uuid.UUID("951469f4-c7b2-c818-9dee-ad7eea8c30b7") +ANIM_AGENT_DANCE5 = uuid.UUID("4bd69a1d-1114-a0b4-625f-84e0a5237155") +ANIM_AGENT_DANCE6 = uuid.UUID("cd28b69b-9c95-bb78-3f94-8d605ff1bb12") +ANIM_AGENT_DANCE7 = uuid.UUID("a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6") +ANIM_AGENT_DANCE8 = uuid.UUID("b0dc417c-1f11-af36-2e80-7e7489fa7cdc") +ANIM_AGENT_DEAD = uuid.UUID("57abaae6-1d17-7b1b-5f98-6d11a6411276") +ANIM_AGENT_DRINK = uuid.UUID("0f86e355-dd31-a61c-fdb0-3a96b9aad05f") +ANIM_AGENT_EMBARRASSED = uuid.UUID("514af488-9051-044a-b3fc-d4dbf76377c6") +ANIM_AGENT_EXPRESS_AFRAID = uuid.UUID("aa2df84d-cf8f-7218-527b-424a52de766e") +ANIM_AGENT_EXPRESS_ANGER = uuid.UUID("1a03b575-9634-b62a-5767-3a679e81f4de") +ANIM_AGENT_EXPRESS_BORED = uuid.UUID("214aa6c1-ba6a-4578-f27c-ce7688f61d0d") +ANIM_AGENT_EXPRESS_CRY = uuid.UUID("d535471b-85bf-3b4d-a542-93bea4f59d33") +ANIM_AGENT_EXPRESS_DISDAIN = uuid.UUID("d4416ff1-09d3-300f-4183-1b68a19b9fc1") +ANIM_AGENT_EXPRESS_EMBARRASSED = uuid.UUID("0b8c8211-d78c-33e8-fa28-c51a9594e424") +ANIM_AGENT_EXPRESS_FROWN = uuid.UUID("fee3df48-fa3d-1015-1e26-a205810e3001") +ANIM_AGENT_EXPRESS_KISS = uuid.UUID("1e8d90cc-a84e-e135-884c-7c82c8b03a14") +ANIM_AGENT_EXPRESS_LAUGH = uuid.UUID("62570842-0950-96f8-341c-809e65110823") +ANIM_AGENT_EXPRESS_OPEN_MOUTH = uuid.UUID("d63bc1f9-fc81-9625-a0c6-007176d82eb7") +ANIM_AGENT_EXPRESS_REPULSED = uuid.UUID("f76cda94-41d4-a229-2872-e0296e58afe1") +ANIM_AGENT_EXPRESS_SAD = uuid.UUID("eb6ebfb2-a4b3-a19c-d388-4dd5c03823f7") +ANIM_AGENT_EXPRESS_SHRUG = uuid.UUID("a351b1bc-cc94-aac2-7bea-a7e6ebad15ef") +ANIM_AGENT_EXPRESS_SMILE = uuid.UUID("b7c7c833-e3d3-c4e3-9fc0-131237446312") +ANIM_AGENT_EXPRESS_SURPRISE = uuid.UUID("728646d9-cc79-08b2-32d6-937f0a835c24") +ANIM_AGENT_EXPRESS_TONGUE_OUT = uuid.UUID("835965c6-7f2f-bda2-5deb-2478737f91bf") +ANIM_AGENT_EXPRESS_TOOTHSMILE = uuid.UUID("b92ec1a5-e7ce-a76b-2b05-bcdb9311417e") +ANIM_AGENT_EXPRESS_WINK = uuid.UUID("da020525-4d94-59d6-23d7-81fdebf33148") +ANIM_AGENT_EXPRESS_WORRY = uuid.UUID("9c05e5c7-6f07-6ca4-ed5a-b230390c3950") +ANIM_AGENT_FALLDOWN = uuid.UUID("666307d9-a860-572d-6fd4-c3ab8865c094") +ANIM_AGENT_FEMALE_RUN_NEW = uuid.UUID("85995026-eade-5d78-d364-94a64512cb66") +ANIM_AGENT_FEMALE_WALK = uuid.UUID("f5fc7433-043d-e819-8298-f519a119b688") +ANIM_AGENT_FEMALE_WALK_NEW = uuid.UUID("d60c41d2-7c24-7074-d3fa-6101cea22a51") +ANIM_AGENT_FINGER_WAG = uuid.UUID("c1bc7f36-3ba0-d844-f93c-93be945d644f") +ANIM_AGENT_FIST_PUMP = uuid.UUID("7db00ccd-f380-f3ee-439d-61968ec69c8a") +ANIM_AGENT_FLY = uuid.UUID("aec4610c-757f-bc4e-c092-c6e9caf18daf") +ANIM_AGENT_FLYSLOW = uuid.UUID("2b5a38b2-5e00-3a97-a495-4c826bc443e6") +ANIM_AGENT_HELLO = uuid.UUID("9b29cd61-c45b-5689-ded2-91756b8d76a9") +ANIM_AGENT_HOLD_BAZOOKA_R = uuid.UUID("ef62d355-c815-4816-2474-b1acc21094a6") +ANIM_AGENT_HOLD_BOW_L = uuid.UUID("8b102617-bcba-037b-86c1-b76219f90c88") +ANIM_AGENT_HOLD_HANDGUN_R = uuid.UUID("efdc1727-8b8a-c800-4077-975fc27ee2f2") +ANIM_AGENT_HOLD_RIFLE_R = uuid.UUID("3d94bad0-c55b-7dcc-8763-033c59405d33") +ANIM_AGENT_HOLD_THROW_R = uuid.UUID("7570c7b5-1f22-56dd-56ef-a9168241bbb6") +ANIM_AGENT_HOVER = uuid.UUID("4ae8016b-31b9-03bb-c401-b1ea941db41d") +ANIM_AGENT_HOVER_DOWN = uuid.UUID("20f063ea-8306-2562-0b07-5c853b37b31e") +ANIM_AGENT_HOVER_UP = uuid.UUID("62c5de58-cb33-5743-3d07-9e4cd4352864") +ANIM_AGENT_IMPATIENT = uuid.UUID("5ea3991f-c293-392e-6860-91dfa01278a3") +ANIM_AGENT_JUMP = uuid.UUID("2305bd75-1ca9-b03b-1faa-b176b8a8c49e") +ANIM_AGENT_JUMP_FOR_JOY = uuid.UUID("709ea28e-1573-c023-8bf8-520c8bc637fa") +ANIM_AGENT_KISS_MY_BUTT = uuid.UUID("19999406-3a3a-d58c-a2ac-d72e555dcf51") +ANIM_AGENT_LAND = uuid.UUID("7a17b059-12b2-41b1-570a-186368b6aa6f") +ANIM_AGENT_LAUGH_SHORT = uuid.UUID("ca5b3f14-3194-7a2b-c894-aa699b718d1f") +ANIM_AGENT_MEDIUM_LAND = uuid.UUID("f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57") +ANIM_AGENT_MOTORCYCLE_SIT = uuid.UUID("08464f78-3a8e-2944-cba5-0c94aff3af29") +ANIM_AGENT_MUSCLE_BEACH = uuid.UUID("315c3a41-a5f3-0ba4-27da-f893f769e69b") +ANIM_AGENT_NO = uuid.UUID("5a977ed9-7f72-44e9-4c4c-6e913df8ae74") +ANIM_AGENT_NO_UNHAPPY = uuid.UUID("d83fa0e5-97ed-7eb2-e798-7bd006215cb4") +ANIM_AGENT_NYAH_NYAH = uuid.UUID("f061723d-0a18-754f-66ee-29a44795a32f") +ANIM_AGENT_ONETWO_PUNCH = uuid.UUID("eefc79be-daae-a239-8c04-890f5d23654a") +ANIM_AGENT_PEACE = uuid.UUID("b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9") +ANIM_AGENT_POINT_ME = uuid.UUID("17c024cc-eef2-f6a0-3527-9869876d7752") +ANIM_AGENT_POINT_YOU = uuid.UUID("ec952cca-61ef-aa3b-2789-4d1344f016de") +ANIM_AGENT_PRE_JUMP = uuid.UUID("7a4e87fe-de39-6fcb-6223-024b00893244") +ANIM_AGENT_PUNCH_LEFT = uuid.UUID("f3300ad9-3462-1d07-2044-0fef80062da0") +ANIM_AGENT_PUNCH_RIGHT = uuid.UUID("c8e42d32-7310-6906-c903-cab5d4a34656") +ANIM_AGENT_REPULSED = uuid.UUID("36f81a92-f076-5893-dc4b-7c3795e487cf") +ANIM_AGENT_ROUNDHOUSE_KICK = uuid.UUID("49aea43b-5ac3-8a44-b595-96100af0beda") +ANIM_AGENT_RPS_COUNTDOWN = uuid.UUID("35db4f7e-28c2-6679-cea9-3ee108f7fc7f") +ANIM_AGENT_RPS_PAPER = uuid.UUID("0836b67f-7f7b-f37b-c00a-460dc1521f5a") +ANIM_AGENT_RPS_ROCK = uuid.UUID("42dd95d5-0bc6-6392-f650-777304946c0f") +ANIM_AGENT_RPS_SCISSORS = uuid.UUID("16803a9f-5140-e042-4d7b-d28ba247c325") +ANIM_AGENT_RUN = uuid.UUID("05ddbff8-aaa9-92a1-2b74-8fe77a29b445") +ANIM_AGENT_RUN_NEW = uuid.UUID("1ab1b236-cd08-21e6-0cbc-0d923fc6eca2") +ANIM_AGENT_SAD = uuid.UUID("0eb702e2-cc5a-9a88-56a5-661a55c0676a") +ANIM_AGENT_SALUTE = uuid.UUID("cd7668a6-7011-d7e2-ead8-fc69eff1a104") +ANIM_AGENT_SHOOT_BOW_L = uuid.UUID("e04d450d-fdb5-0432-fd68-818aaf5935f8") +ANIM_AGENT_SHOUT = uuid.UUID("6bd01860-4ebd-127a-bb3d-d1427e8e0c42") +ANIM_AGENT_SHRUG = uuid.UUID("70ea714f-3a97-d742-1b01-590a8fcd1db5") +ANIM_AGENT_SIT = uuid.UUID("1a5fe8ac-a804-8a5d-7cbd-56bd83184568") +ANIM_AGENT_SIT_FEMALE = uuid.UUID("b1709c8d-ecd3-54a1-4f28-d55ac0840782") +ANIM_AGENT_SIT_GENERIC = uuid.UUID("245f3c54-f1c0-bf2e-811f-46d8eeb386e7") +ANIM_AGENT_SIT_GROUND = uuid.UUID("1c7600d6-661f-b87b-efe2-d7421eb93c86") +ANIM_AGENT_SIT_GROUND_CONSTRAINED = uuid.UUID("1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e") +ANIM_AGENT_SIT_TO_STAND = uuid.UUID("a8dee56f-2eae-9e7a-05a2-6fb92b97e21e") +ANIM_AGENT_SLEEP = uuid.UUID("f2bed5f9-9d44-39af-b0cd-257b2a17fe40") +ANIM_AGENT_SMOKE_IDLE = uuid.UUID("d2f2ee58-8ad1-06c9-d8d3-3827ba31567a") +ANIM_AGENT_SMOKE_INHALE = uuid.UUID("6802d553-49da-0778-9f85-1599a2266526") +ANIM_AGENT_SMOKE_THROW_DOWN = uuid.UUID("0a9fb970-8b44-9114-d3a9-bf69cfe804d6") +ANIM_AGENT_SNAPSHOT = uuid.UUID("eae8905b-271a-99e2-4c0e-31106afd100c") +ANIM_AGENT_STAND = uuid.UUID("2408fe9e-df1d-1d7d-f4ff-1384fa7b350f") +ANIM_AGENT_STANDUP = uuid.UUID("3da1d753-028a-5446-24f3-9c9b856d9422") +ANIM_AGENT_STAND_1 = uuid.UUID("15468e00-3400-bb66-cecc-646d7c14458e") +ANIM_AGENT_STAND_2 = uuid.UUID("370f3a20-6ca6-9971-848c-9a01bc42ae3c") +ANIM_AGENT_STAND_3 = uuid.UUID("42b46214-4b44-79ae-deb8-0df61424ff4b") +ANIM_AGENT_STAND_4 = uuid.UUID("f22fed8b-a5ed-2c93-64d5-bdd8b93c889f") +ANIM_AGENT_STRETCH = uuid.UUID("80700431-74ec-a008-14f8-77575e73693f") +ANIM_AGENT_STRIDE = uuid.UUID("1cb562b0-ba21-2202-efb3-30f82cdf9595") +ANIM_AGENT_SURF = uuid.UUID("41426836-7437-7e89-025d-0aa4d10f1d69") +ANIM_AGENT_SURPRISE = uuid.UUID("313b9881-4302-73c0-c7d0-0e7a36b6c224") +ANIM_AGENT_SWORD_STRIKE = uuid.UUID("85428680-6bf9-3e64-b489-6f81087c24bd") +ANIM_AGENT_TALK = uuid.UUID("5c682a95-6da4-a463-0bf6-0f5b7be129d1") +ANIM_AGENT_TANTRUM = uuid.UUID("11000694-3f41-adc2-606b-eee1d66f3724") +ANIM_AGENT_THROW_R = uuid.UUID("aa134404-7dac-7aca-2cba-435f9db875ca") +ANIM_AGENT_TRYON_SHIRT = uuid.UUID("83ff59fe-2346-f236-9009-4e3608af64c1") +ANIM_AGENT_TURNLEFT = uuid.UUID("56e0ba0d-4a9f-7f27-6117-32f2ebbf6135") +ANIM_AGENT_TURNRIGHT = uuid.UUID("2d6daa51-3192-6794-8e2e-a15f8338ec30") +ANIM_AGENT_TYPE = uuid.UUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9") +ANIM_AGENT_WALK = uuid.UUID("6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0") +ANIM_AGENT_WALK_NEW = uuid.UUID("33339176-7ddc-9397-94a4-bf3403cbc8f5") +ANIM_AGENT_WHISPER = uuid.UUID("7693f268-06c7-ea71-fa21-2b30d6533f8f") +ANIM_AGENT_WHISTLE = uuid.UUID("b1ed7982-c68e-a982-7561-52a88a5298c0") +ANIM_AGENT_WINK = uuid.UUID("869ecdad-a44b-671e-3266-56aef2e3ac2e") +ANIM_AGENT_WINK_HOLLYWOOD = uuid.UUID("c0c4030f-c02b-49de-24ba-2331f43fe41c") +ANIM_AGENT_WORRY = uuid.UUID("9f496bd2-589a-709f-16cc-69bf7df1d36c") +ANIM_AGENT_YES = uuid.UUID("15dd911d-be82-2856-26db-27659b142875") +ANIM_AGENT_YES_HAPPY = uuid.UUID("b8c8b2a3-9008-1771-3bfc-90924955ab2d") +ANIM_AGENT_YOGA_FLOAT = uuid.UUID("42ecd00b-9947-a97c-400a-bbc9174c7aeb") + +AGENT_WALK_ANIMS = (ANIM_AGENT_WALK, ANIM_AGENT_RUN, ANIM_AGENT_CROUCHWALK, ANIM_AGENT_TURNLEFT, ANIM_AGENT_TURNRIGHT) +AGENT_GUN_HOLD_ANIMS = (ANIM_AGENT_HOLD_RIFLE_R, ANIM_AGENT_HOLD_HANDGUN_R, ANIM_AGENT_HOLD_BAZOOKA_R, ANIM_AGENT_HOLD_BOW_L) +AGENT_GUN_AIM_ANIMS = (ANIM_AGENT_AIM_RIFLE_R, ANIM_AGENT_AIM_HANDGUN_R, ANIM_AGENT_AIM_BAZOOKA_R, ANIM_AGENT_AIM_BOW_L) +AGENT_NO_ROTATE_ANIMS = (ANIM_AGENT_SIT_GROUND, ANIM_AGENT_SIT_GROUND_CONSTRAINED, ANIM_AGENT_STANDUP) +AGENT_STAND_ANIMS = (ANIM_AGENT_STAND, ANIM_AGENT_STAND_1, ANIM_AGENT_STAND_2, ANIM_AGENT_STAND_3, ANIM_AGENT_STAND_4) \ No newline at end of file