mvclient (empty) → 0.1
raw patch · 9 files changed
+9766/−0 lines, 9 filesdep +Cryptodep +HTTPdep +basebuild-type:Customsetup-changed
Dependencies added: Crypto, HTTP, base, binary, bytestring, containers, control-event, data-binary-ieee754, haxr, maccatcher, mtl, network, network-bytestring, random, time
Files
- LICENSE +30/−0
- Setup.hs +10/−0
- mvclient.cabal +33/−0
- src/Network/Metaverse.hs +124/−0
- src/Network/Metaverse/Circuit.hs +307/−0
- src/Network/Metaverse/Login.hs +111/−0
- src/Network/Metaverse/PacketTypes.msg +8936/−0
- src/Network/Metaverse/Packets.hs +112/−0
- src/Network/Metaverse/Utils.hs +103/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Chris Smith 2010++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Chris Smith nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,10 @@+#!/usr/bin/env runhaskell++import Distribution.Simple+import Distribution.Simple.PreProcess+import BuildTools.Template2Hs++main = defaultMainWithHooks myHooks+ where myHooks = simpleUserHooks { hookedPreProcessors = [("msg", ppMsgTemplate)]}+ ppMsgTemplate _ _ = PreProcessor { platformIndependent = True,+ runPreProcessor = mkSimplePreProcessor template2hs }
+ mvclient.cabal view
@@ -0,0 +1,33 @@+Name: mvclient+Version: 0.1+Synopsis: Client library for metaverse systems like Second Life+Description: This implements the client side of connections to virtual world environments+ like Linden Labs' Second Life or OpenSim (http://opesimulator.org), sometimes+ known as the "metaverse".+ .+ Because of the lack of SSL implementations for Haskell, you currently need+ to set up stunnel for initial login step for worlds (like Second Life) that+ use secure login pages.++License: BSD3+License-file: LICENSE++Author: Chris Smith+Maintainer: cdsmith@gmail.com++Stability: Experimental+Category: Network+Build-type: Custom++Cabal-version: >=1.2++Library+ Hs-source-dirs: src+ Exposed-modules: Network.Metaverse, Network.Metaverse.Utils,+ Network.Metaverse.Circuit, Network.Metaverse.Packets,+ Network.Metaverse.PacketTypes, Network.Metaverse.Login+ Build-depends: base >=4 && <5, network -any, bytestring -any, random -any,+ Crypto -any, HTTP -any, maccatcher -any, haxr -any,+ binary -any, network-bytestring -any, mtl -any,+ data-binary-ieee754 -any, containers -any, time -any,+ control-event >=1.1.0.4 && <1.2
+ src/Network/Metaverse.hs view
@@ -0,0 +1,124 @@+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE ScopedTypeVariables #-}++module Network.Metaverse where++import Control.Monad+import Control.Concurrent++import Data.Char+import Data.Word+import Data.Int+import Data.Bits+import Data.List++import Data.Binary+import Data.Binary.Put+import Data.Binary.IEEE754++import Data.Time.Clock++import Network.Metaverse.Utils+import Network.Metaverse.Packets+import Network.Metaverse.PacketTypes+import Network.Metaverse.Circuit+import Network.Metaverse.Login++import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as L++{-+ Convenience function to put it all together.+-}+login :: String -> String -> String -> IO Circuit+login firstName lastName password = do+ token <- loginXml firstName lastName password+ circ <- connectToSim token++ source <- circuitSource circ+ forkIO $ regionHandshaker circ source++ circuitSend circ True $ CompleteAgentMovement $ CompleteAgentMovement_AgentData+ (tokenAgentID token) (tokenSessionID token) (tokenCircuitCode token)+ return circ++regionHandshaker :: Circuit -> IO PacketBody -> IO ()+regionHandshaker circ source = do+ p <- source+ case p of+ RegionHandshake _ _ _ -> do+ circuitSend circ True $ RegionHandshakeReply+ (RegionHandshakeReply_AgentData (circuitAgentID circ) (circuitSessionID circ))+ (RegionHandshakeReply_RegionInfo 0)+ _ -> regionHandshaker circ source++sendAgentUpdate :: Circuit -> IO ()+sendAgentUpdate circ =+ circuitSend circ True $ AgentUpdate $ AgentUpdate_AgentData+ (circuitAgentID circ) (circuitSessionID circ)+ (0,0,0,1) (0,0,0,1) 0 (128,128,20) (1,0,0) (0,1,0) (0,0,1) 128.0 0 0++sendAgentThrottle :: Circuit ->+ Float -> Float -> Float -> Float -> Float -> Float -> Float+ -> IO ()+sendAgentThrottle circ resend land wind cloud task texture asset = do+ let putter = do putFloat32le resend+ putFloat32le land+ putFloat32le wind+ putFloat32le cloud+ putFloat32le task+ putFloat32le texture+ putFloat32le asset+ let bin = B.concat (L.toChunks (runPut putter))+ circuitSend circ True $ AgentThrottle+ (AgentThrottle_AgentData (circuitAgentID circ) (circuitSessionID circ) (circuitCode circ))+ (AgentThrottle_Throttle 0 bin)++sendSimpleIM :: Circuit -> UUID -> String -> IO Bool+sendSimpleIM circ toAgentID msg =+ circuitSendSync circ $ ImprovedInstantMessage+ (ImprovedInstantMessage_AgentData (circuitAgentID circ) (circuitSessionID circ))+ (ImprovedInstantMessage_MessageBlock+ False toAgentID 0 zeroUUID (0,0,0) 0 0 zeroUUID 0 (B.pack [0])+ (B.pack (map (fromIntegral . ord) msg ++ [0])) B.empty)++data ChatMethod = Whisper | Say | Shout deriving (Eq, Enum)++sendChat :: Circuit -> Int -> ChatMethod -> String -> IO Bool+sendChat circ channel method msg =+ circuitSendSync circ $ ChatFromViewer+ (ChatFromViewer_AgentData (circuitAgentID circ) (circuitSessionID circ))+ (ChatFromViewer_ChatData+ (B.pack (map (fromIntegral . ord) msg ++ [0]))+ (fromIntegral $ fromEnum method) (fromIntegral channel))++whisper :: Circuit -> String -> IO Bool+whisper circ msg = sendChat circ 0 Whisper msg++say :: Circuit -> String -> IO Bool+say circ msg = sendChat circ 0 Say msg++shout :: Circuit -> String -> IO Bool+shout circ msg = sendChat circ 0 Shout msg++commPrinter :: IO PacketBody -> IO ()+commPrinter source = do+ msg <- source+ case msg of+ ImprovedInstantMessage+ (ImprovedInstantMessage_AgentData _ _)+ (ImprovedInstantMessage_MessageBlock _ _ _ _ _ _ dtype _ _ from text l)+ -> do+ let speaker = takeWhile (not . (== '\0')) $ map (chr . fromIntegral) $ B.unpack from+ let msg = takeWhile (not . (== '\0')) $ map (chr . fromIntegral) $ B.unpack text+ when (dtype `elem` [ 0, 1, 3, 4, 5, 6, 12, 17, 19, 31, 38 ]) $ do+ putStrLn $ "IM: " ++ speaker ++ " -> " ++ msg+ ChatFromSimulator+ (ChatFromSimulator_ChatData from _ _ _ ctype aud _ text)+ -> do+ let speaker = takeWhile (not . (== '\0')) $ map (chr . fromIntegral) $ B.unpack from+ let msg = takeWhile (not . (== '\0')) $ map (chr . fromIntegral) $ B.unpack text+ when (aud /= 0 && ctype `elem` [ 0, 1, 2, 3, 6, 8 ]) $ do+ putStrLn $ speaker ++ " -> " ++ msg+ _ -> return ()+ commPrinter source
+ src/Network/Metaverse/Circuit.hs view
@@ -0,0 +1,307 @@+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE ScopedTypeVariables #-}++module Network.Metaverse.Circuit (+ Circuit,+ circuitAgentID,+ circuitSessionID,+ circuitCode,+ circuitSend,+ circuitSendSync,+ circuitSource,+ connectToSim+ )+ where++import Control.Concurrent++import Control.Arrow (first)++import Control.Monad+import Control.Monad.Trans+import Control.Monad.State hiding (get, put)+import qualified Control.Monad.State as S++import Data.Char+import Data.Digest.MD5+import Data.Word+import Data.Int+import Data.Bits+import Data.List++import qualified Data.Map as M+import Data.Map (Map)++import Data.Binary+import Data.Binary.Put+import Data.Binary.Get+import Data.Binary.IEEE754++import Data.Time.Clock++import Network.XmlRpc.Client+import Network.XmlRpc.Internals++import Network.Socket hiding (send, sendTo, recv, recvFrom)+import Network.Socket.ByteString++import Network.Metaverse.Login+import Network.Metaverse.Utils+import Network.Metaverse.PacketTypes+import Network.Metaverse.Packets++import System.Random+import System.Info.MAC++import System.IO.Unsafe -- for logging++import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as L++------------------------------------------------------------------------++data Circuit = Circuit {+ -- Some information that's nice to have access to when connected to a+ -- circuit. This needs to be accessible to the next layer up, because+ -- this information is embedded into various message fields.+ circuitAgentID :: UUID,+ circuitSessionID :: UUID,+ circuitCode :: Word32,++ circuitSocket :: Socket,+ circuitAddr :: SockAddr,++ circuitIncoming :: Chan PacketBody,+ circuitAccounting :: MVar Accounting+ }++{-+ Packet accounting. This layer of the communication system handles+ sequencing packets, tracking and resending dropped packets, acknowledging+ packets from the server, and pruning duplicate packets due to lost acks.+-}++data Accounting = Accounting {+ acctClosed :: Bool,++ acctSequence :: SequenceNum,+ acctRecentPackets :: [SequenceNum],+ acctPendingAcks :: [(UTCTime, SequenceNum)],+ acctReliableQueue :: TaskQueue SequenceNum,+ acctConfirmations :: Map SequenceNum (MVar Bool),++ acctPendingPings :: [Word8]+ }++{-+ Convenient for composing actions that need to atomically modify the+ connection accounting information.+-}+runWithMVar :: MVar a -> StateT a IO b -> IO b+runWithMVar v m = modifyMVar v (fmap (fmap swap) (runStateT m))+ where swap (a,b) = (b,a)++{-+ Generates the next sequence number in line.+-}+nextSequence :: StateT Accounting IO SequenceNum+nextSequence = do+ seq <- fmap acctSequence S.get+ modify $ \s -> s { acctSequence = seq + 1 }+ return seq++sendRaw :: Socket -> SockAddr -> Packet -> IO ()+sendRaw sock addr packet = sendAllTo sock (serialize packet) addr++getAcks :: Int -> StateT Accounting IO [SequenceNum]+getAcks size = do+ let nacks = size `div` 4+ pending <- fmap acctPendingAcks S.get+ let (sending, leftovers) = splitAt (min 255 nacks) pending+ modify (\s -> s { acctPendingAcks = leftovers })+ return (map snd sending)++sendWithAcks :: Socket -> SockAddr -> Packet -> StateT Accounting IO ()+sendWithAcks sock addr packet = do+ acks <- getAcks $ 10000 - 7 - packetLength (packetBody packet)+ liftIO $ sendRaw sock addr packet { packetAcks = acks }++data Reliability = Unreliable+ | Reliable (Maybe (MVar Bool))++isReliable :: Reliability -> Bool+isReliable Unreliable = False+isReliable (Reliable _) = True++circuitSendImpl :: Circuit+ -> Reliability -- ^ MVar to notify when packet is acked+ -> PacketBody -- ^ The payload to send along+ -> StateT Accounting IO ()+circuitSendImpl circ rel body = do+ let sock = circuitSocket circ+ let addr = circuitAddr circ+ seq <- nextSequence+ let packet = Packet+ (shouldZerocode body) (isReliable rel) False seq B.empty body []+ sendWithAcks sock addr packet+ reliableAccounting rel circ packet++reliableAccounting :: Reliability+ -> Circuit+ -> Packet+ -> StateT Accounting IO ()+reliableAccounting Unreliable _ _ = return ()+reliableAccounting (Reliable mv) circ packet = do+ flip (maybe $ return ()) mv $ \ v -> do+ con <- fmap acctConfirmations S.get+ modify $ \s -> s { acctConfirmations = M.insert seq v con }+ queue <- fmap acctReliableQueue S.get+ liftIO $ schedule queue seq retryTime (retry retryCount)+ where+ retryTime = 1500000 -- TODO: Find the right value+ retryCount = 3+ sock = circuitSocket circ+ addr = circuitAddr circ+ seq = packetSequence packet+ retried = packet { packetRetransmit = True }+ retry 0 = flip (maybe $ return ()) mv $ \ v -> do+ putMVar v False+ runWithMVar (circuitAccounting circ) $ do+ con <- fmap acctConfirmations S.get+ modify $ \s -> s { acctConfirmations = M.delete seq con }+ retry n = runWithMVar (circuitAccounting circ) $ do+ sendWithAcks sock addr retried+ queue <- fmap acctReliableQueue S.get+ liftIO $ schedule queue seq retryTime (retry (n-1))++circuitSend :: Circuit -> Bool -> PacketBody -> IO ()+circuitSend circ reliable msg = runWithMVar (circuitAccounting circ) $ do+ circuitSendImpl circ+ (if reliable then Reliable Nothing else Unreliable) msg++circuitSendSync :: Circuit -> PacketBody -> IO Bool+circuitSendSync circ msg = do+ v <- newEmptyMVar+ runWithMVar (circuitAccounting circ) $+ circuitSendImpl circ (Reliable (Just v)) msg+ takeMVar v++{-+ A process that occasionally sends PacketAck messages for any+ outstanding acks. This ensures that if there's no communication+ for any reason, there's still acks going out.+-}+ackSender :: Circuit -> IO ()+ackSender circ = do+ cont <- runWithMVar (circuitAccounting circ) $ do+ acks <- fmap acctPendingAcks S.get+ t <- liftIO $ getCurrentTime+ let ackThreshold = 0.75 -- TODO: Find the right values+ when (not (null acks)+ && t `diffUTCTime` fst (head acks) > ackThreshold) $ do+ acks <- getAcks (10000 - 7)+ circuitSendImpl circ Unreliable (PacketAck (map PacketAck_Packets acks))+ return True+ when cont $ do+ threadDelay 500000 -- TODO: Find the right frequency+ ackSender circ++confirmPacket :: SequenceNum -> StateT Accounting IO ()+confirmPacket seq = do+ q <- fmap acctReliableQueue S.get+ m <- fmap acctConfirmations S.get+ liftIO $ cancel q seq+ case M.lookup seq m of+ Nothing -> return ()+ Just mv -> do+ liftIO $ putMVar mv True+ modify $ \s -> s { acctConfirmations = M.delete seq m }++recvRaw :: Socket -> IO (Packet, SockAddr)+recvRaw sock = fmap (first deserialize) (recvFrom sock 10000)++packetReceiver :: Circuit -> IO ()+packetReceiver circ = do+ let sock = circuitSocket circ+ let addr = circuitAddr circ+ (packet, addr') <- recvRaw sock+ when (addr == addr') $ runWithMVar (circuitAccounting circ) $ do+ mapM_ confirmPacket (packetAcks packet)++ when (packetReliable packet) $ do+ t <- liftIO $ getCurrentTime+ modify $ \s -> s {+ acctPendingAcks = acctPendingAcks s ++ [ (t, packetSequence packet) ]+ }++ recent <- fmap acctRecentPackets S.get+ when (packetReliable packet) $ modify $ \s ->+ s { acctRecentPackets = take 100 (packetSequence packet : acctRecentPackets s) }++ {-+ Handle some built-in packets.+ -}+ case packetBody packet of+ PacketAck acks -> do+ mapM_ confirmPacket (map packetAck_Packets_ID acks)+ StartPingCheck (StartPingCheck_PingID x y) -> do+ circuitSendImpl circ Unreliable $ CompletePingCheck+ (CompletePingCheck_PingID x)+ _ -> do+ when (not (packetRetransmit packet)+ || not (packetSequence packet `elem` recent)) $ do+ liftIO $ writeChan (circuitIncoming circ) (packetBody packet)++ packetReceiver circ++circuitSource :: Circuit -> IO (IO PacketBody)+circuitSource circ = do chan <- dupChan (circuitIncoming circ)+ return $ readChan chan++{-+pingSender :: Circuit -> Word8 -> IO ()+pingSender conn n = do+ threadDelay 5000000+ runWithMVar () conn $ sendPacket False (StartPingCheck (StartPingCheck_PingID n 0))+ pingSender conn (n+1)+-}++connectToSim :: MVToken -> IO Circuit+connectToSim token = do+ sock <- socket AF_INET Datagram defaultProtocol+ host <- inet_addr (tokenSimIP token)+ let port = fromIntegral (tokenSimPort token)++ acct <- newEmptyMVar+ inc <- newChan++ let circ = Circuit {+ circuitAgentID = tokenAgentID token,+ circuitSessionID = tokenSessionID token,+ circuitCode = tokenCircuitCode token,+ circuitSocket = sock,+ circuitAddr = SockAddrInet port host,+ circuitIncoming = inc,+ circuitAccounting = acct+ }++ queue <- newTaskQueue++ forkIO (ackSender circ)+ forkIO (packetReceiver circ)+-- forkIO (pingSender conn 0)++ putMVar acct $ Accounting {+ acctClosed = False,+ acctSequence = 1,+ acctRecentPackets = [],+ acctPendingAcks = [],+ acctReliableQueue = queue,+ acctConfirmations = M.empty,+ acctPendingPings = []+ }++ circuitSendSync circ $ UseCircuitCode $ UseCircuitCode_CircuitCode+ (circuitCode circ) (circuitSessionID circ) (circuitAgentID circ)++ return circ
+ src/Network/Metaverse/Login.hs view
@@ -0,0 +1,111 @@+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE ScopedTypeVariables #-}++module Network.Metaverse.Login where++import Control.Concurrent++import Control.Monad+import Control.Monad.Trans++import Data.Char+import Data.Digest.MD5+import Data.Word+import Data.Int+import Data.Bits+import Data.List++import Data.Binary+import Data.Binary.Put+import Data.Binary.Get+import Data.Binary.IEEE754++import Data.Time.Clock++import Network.XmlRpc.Client+import Network.XmlRpc.Internals++import Network.Socket hiding (send, sendTo, recv, recvFrom)+import Network.Socket.ByteString++import Network.Metaverse.Utils+import Network.Metaverse.Packets++import System.Random+import System.Info.MAC++import System.IO.Unsafe -- for logging++import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as L++{-+ Login implementation. This implements the pure XML-RPC login sequence+ for Second Life (but not the avatar presence piece, which is left until+ later.)+-}++hashPassword :: String -> String+hashPassword = ("$1$" ++) . toHexString . hash . map (fromIntegral . ord)++loginPacket :: String -> String -> String -> String -> Value+loginPacket firstName lastName password ethmac = ValueStruct [+ ("first", ValueString firstName),+ ("last", ValueString lastName),+ ("passwd", ValueString (hashPassword password)),+ ("start", ValueString "last"),+ ("channel", ValueString "WillowdaleBot"),+ ("version", ValueString "0.9"),+ ("platform", ValueString "Lin"),+ ("mac", ValueString ethmac),+ ("agree_to_tos", ValueBool True),+ ("read_critical", ValueBool True),+ ("id0", ValueString ethmac),+ ("last_exec_event", ValueInt 0),+ ("options", ValueArray [+ ValueString "inventory-root",+ ValueString "adult_compliant"+ ])+ ]++data MVToken = MVToken {+ tokenAgentID :: UUID,+ tokenSimIP :: String,+ tokenSimPort :: Word16,+ tokenSessionID :: UUID,+ tokenCircuitCode :: Word32,+ tokenInvHost :: String,+ tokenInvRoot :: UUID+ }+ deriving Show++loginXml :: String -> String -> String -> IO MVToken+loginXml firstName lastName password = do+ maybemac <- mac+ case maybemac of+ Nothing -> error "Unable to fetch Ethernet MAC"+ Just ethmac -> do+ let msg = loginPacket firstName lastName password (show ethmac)+ ValueStruct rsp <- handleError error+ (call loginURL loginMethod [ msg ])+ let Just (ValueString loginAns) = lookup "login" rsp+ when (loginAns /= "true") $ error $ "Login did not succeed: " ++ loginAns+ let Just (ValueString agentID) = lookup "agent_id" rsp+ let Just (ValueString simIP) = lookup "sim_ip" rsp+ let Just (ValueInt simPort) = lookup "sim_port" rsp+ let Just (ValueString sessionID) = lookup "session_id" rsp+ let Just (ValueInt circuitCode) = lookup "circuit_code" rsp+ let Just (ValueString invHost) = lookup "inventory_host" rsp+ let Just (ValueArray [ ValueStruct [ (_, ValueString invRoot) ] ])+ = lookup "inventory-root" rsp+ return $ MVToken { tokenAgentID = read (agentID),+ tokenSimIP = simIP,+ tokenSimPort = fromIntegral simPort,+ tokenSessionID = read (sessionID),+ tokenCircuitCode = fromIntegral circuitCode,+ tokenInvHost = invHost,+ tokenInvRoot = read (invRoot)+ }++ where loginURL = "http://localhost:8001/cgi-bin/login.cgi" -- stunnel endpoint+ loginMethod = "login_to_simulator"
+ src/Network/Metaverse/PacketTypes.msg view
@@ -0,0 +1,8936 @@+// Linden Lab development message templates++version 2.0++// The Version 2.0 template requires preservation of message+// numbers. Each message must be numbered relative to the+// other messages of that type. The current highest number +// for each type is listed below:+// Low: 423+// Medium: 18+// High: 29+// PLEASE UPDATE THIS WHEN YOU ADD A NEW MESSAGE!+++// *************************************************************************+// Test Message+// *************************************************************************++// Test Message++{+ TestMessage Low 1 NotTrusted Zerocoded+ {+ TestBlock1 Single+ { Test1 U32 }+ }+ {+ NeighborBlock Multiple 4+ { Test0 U32 }+ { Test1 U32 }+ { Test2 U32 }+ }+}++// *************************************************************************+// Messaging Internal Data Management Message+// *************************************************************************++// *************************+// List fixed messages first+// *************************+++// Packet Ack - Ack a list of packets sent reliable+{+ PacketAck Fixed 0xFFFFFFFB NotTrusted Unencoded+ {+ Packets Variable + { ID U32 }+ }+}+++// OpenCircuit - Tells the recipient's messaging system to open the descibed circuit+{+ OpenCircuit Fixed 0xFFFFFFFC NotTrusted Unencoded+ {+ CircuitInfo Single+ { IP IPADDR }+ { Port IPPORT }+ }+}+++// CloseCircuit - Tells the recipient's messaging system to close the descibed circuit+{+ CloseCircuit Fixed 0xFFFFFFFD NotTrusted Unencoded+}+++// ******************+// End fixed messages+// ******************++// StartPingCheck - used to measure circuit ping times+// PingID is used to determine how backlogged the ping was that was+// returned (or how hosed the other side is)+{+ StartPingCheck High 1 NotTrusted Unencoded+ {+ PingID Single+ { PingID U8 }+ { OldestUnacked U32 } // Current oldest "unacked" packet on the sender side+ }+}++// CompletePingCheck - used to measure circuit ping times++{+ CompletePingCheck High 2 NotTrusted Unencoded+ {+ PingID Single+ { PingID U8 }+ }+}++// space->sim+// sim->sim+// AddCircuitCode - Tells the recipient's messaging system that this code+// is for a legal circuit+{+ AddCircuitCode Low 2 Trusted Unencoded+ {+ CircuitCode Single+ { Code U32 }+ { SessionID LLUUID }+ { AgentID LLUUID } // WARNING - may be null in valid message+ }+}++// viewer->sim+// UseCircuitCode - Attempts to provide the recipient with IP and Port+// info. In the case of viewers, the id is the session id. For other+// machines it may be null. The session id will always be the session+// id of the process, which every server will generate on startup and+// the viewer will be handed after login.+{+ UseCircuitCode Low 3 NotTrusted Unencoded+ {+ CircuitCode Single+ { Code U32 }+ { SessionID LLUUID }+ { ID LLUUID } // agent id+ }+}+++// *************************************************************************+// SpaceServer to Simulator Messages+// ************************************************************************++// Neighbor List - Passed anytime neighbors change+{+ NeighborList High 3 Trusted Unencoded+ {+ NeighborBlock Multiple 4+ { IP IPADDR }+ { Port IPPORT }+ { PublicIP IPADDR }+ { PublicPort IPPORT }+ { RegionID LLUUID }+ { Name Variable 1 } // string+ { SimAccess U8 }+ }+}+++// AvatarTextureUpdate+// simulator -> dataserver+// reliable+{+ AvatarTextureUpdate Low 4 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { TexturesChanged BOOL }+ }+ {+ WearableData Variable+ { CacheID LLUUID }+ { TextureIndex U8 }+ { HostName Variable 1 }+ }+ {+ TextureData Variable+ { TextureID LLUUID }+ }+}+++// SimulatorMapUpdate+// simulator -> dataserver+// reliable+{+ SimulatorMapUpdate Low 5 Trusted Unencoded+ {+ MapData Single+ { Flags U32 }+ }+}++// SimulatorSetMap+// simulator -> dataserver+// reliable+// Used to upload a map image into the database (currently used only for Land For Sale)+{+ SimulatorSetMap Low 6 Trusted Unencoded+ {+ MapData Single+ { RegionHandle U64 }+ { Type S32 }+ { MapImage LLUUID }+ }+}++// SubscribeLoad+// spaceserver -> simulator+// reliable+{+ SubscribeLoad Low 7 Trusted Unencoded+}++// UnsubscribeLoad+// spaceserver -> simulator+// reliable+{+ UnsubscribeLoad Low 8 Trusted Unencoded+}+++// ************************************************************************+// Simulator to SpaceServer Messages+// ************************************************************************++// SimulatorReady - indicates the sim has finished loading its state+// and is ready to receive updates from others+{+ SimulatorReady Low 9 Trusted Zerocoded+ {+ SimulatorBlock Single+ { SimName Variable 1 }+ { SimAccess U8 }+ { RegionFlags U32 }+ { RegionID LLUUID }+ { EstateID U32 }+ { ParentEstateID U32 }+ }+ {+ TelehubBlock Single+ { HasTelehub BOOL }+ { TelehubPos LLVector3 }+ }+}++// TelehubInfo - fill in the UI for telehub creation floater.+// sim -> viewer+// reliable+{+ TelehubInfo Low 10 Trusted Unencoded+ {+ TelehubBlock Single+ { ObjectID LLUUID } // null if no telehub+ { ObjectName Variable 1 } // string+ { TelehubPos LLVector3 } // fallback if viewer can't find object+ { TelehubRot LLQuaternion }+ }+ {+ SpawnPointBlock Variable+ { SpawnPointPos LLVector3 } // relative to telehub position+ }+}++// SimulatorPresentAtLocation - indicates that the sim is present at a grid+// location and passes what it believes its neighbors are+{+ SimulatorPresentAtLocation Low 11 Trusted Unencoded+ {+ SimulatorPublicHostBlock Single+ { Port IPPORT }+ { SimulatorIP IPADDR }+ { GridX U32 }+ { GridY U32 }+ }+ {+ NeighborBlock Multiple 4+ { IP IPADDR }+ { Port IPPORT }+ }+ {+ SimulatorBlock Single+ { SimName Variable 1 }+ { SimAccess U8 }+ { RegionFlags U32 }+ { RegionID LLUUID }+ { EstateID U32 }+ { ParentEstateID U32 }+ }+ {+ TelehubBlock Variable+ { HasTelehub BOOL }+ { TelehubPos LLVector3 }+ }+}++// SimulatorLoad+// simulator -> spaceserver+// reliable+{+ SimulatorLoad Low 12 Trusted Unencoded+ {+ SimulatorLoad Single+ { TimeDilation F32 }+ { AgentCount S32 }+ { CanAcceptAgents BOOL }+ }+ {+ AgentList Variable+ { CircuitCode U32 }+ { X U8 }+ { Y U8 }+ }+}++// Simulator Shutdown Request - Tells spaceserver that a simulator is trying to shutdown+{+ SimulatorShutdownRequest Low 13 Trusted Unencoded+}++// ****************************************************************************+// Presense messages+// ****************************************************************************++// sim -> dataserver+{+ RegionPresenceRequestByRegionID Low 14 Trusted Unencoded+ {+ RegionData Variable+ { RegionID LLUUID }+ }+}++// sim -> dataserver+{+ RegionPresenceRequestByHandle Low 15 Trusted Unencoded+ {+ RegionData Variable+ { RegionHandle U64 }+ }+}++// dataserver -> sim+{+ RegionPresenceResponse Low 16 Trusted Zerocoded+ {+ RegionData Variable+ { RegionID LLUUID }+ { RegionHandle U64 }+ { InternalRegionIP IPADDR }+ { ExternalRegionIP IPADDR }+ { RegionPort IPPORT }+ { ValidUntil F64 }+ { Message Variable 1 }+ }+}+ ++// ****************************************************************************+// Simulator to dataserver messages+// ****************************************************************************++// Updates SimName, EstateID and SimAccess using RegionID as a key+{+ UpdateSimulator Low 17 Trusted Unencoded+ {+ SimulatorInfo Single+ { RegionID LLUUID }+ { SimName Variable 1 }+ { EstateID U32 }+ { SimAccess U8 }+ }+}+++// record dwell time.+{+ LogDwellTime Low 18 Trusted Unencoded+ {+ DwellInfo Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Duration F32 }+ { SimName Variable 1 }+ { RegionX U32 }+ { RegionY U32 }+ { AvgAgentsInView U8 }+ { AvgViewerFPS U8 }+ }+}++// Disabled feature response message+{+ FeatureDisabled Low 19 Trusted Unencoded+ {+ FailureInfo Single+ { ErrorMessage Variable 1 }+ { AgentID LLUUID }+ { TransactionID LLUUID }+ }+}+++// record lost money transactions. This message could be generated+// from either the simulator or the dataserver, depending on how+// the transaction failed.+{+ LogFailedMoneyTransaction Low 20 Trusted Unencoded+ {+ TransactionData Single+ { TransactionID LLUUID }+ { TransactionTime U32 } // utc seconds since epoch+ { TransactionType S32 } // see lltransactiontypes.h+ { SourceID LLUUID }+ { DestID LLUUID } // destination of the transfer+ { Flags U8 }+ { Amount S32 }+ { SimulatorIP IPADDR } // U32 encoded IP+ { GridX U32 }+ { GridY U32 }+ { FailureType U8 }+ }+}++// complaint/bug-report - sim -> dataserver. see UserReport for details.+// reliable+{+ UserReportInternal Low 21 Trusted Zerocoded+ {+ ReportData Single+ { ReportType U8 }+ { Category U8 }+ { ReporterID LLUUID }+ { ViewerPosition LLVector3 }+ { AgentPosition LLVector3 }+ { ScreenshotID LLUUID }+ { ObjectID LLUUID }+ { OwnerID LLUUID }+ { LastOwnerID LLUUID }+ { CreatorID LLUUID }+ { RegionID LLUUID }+ { AbuserID LLUUID }+ { AbuseRegionName Variable 1 }+ { AbuseRegionID LLUUID }+ { Summary Variable 1 }+ { Details Variable 2 }+ { VersionString Variable 1 }+ }+}++// SetSimStatusInDatabase+// alters the "simulator" table in the database+// sim -> dataserver+// reliable+{+ SetSimStatusInDatabase Low 22 Trusted Unencoded+ {+ Data Single+ { RegionID LLUUID }+ { HostName Variable 1 }+ { X S32 }+ { Y S32 }+ { PID S32 }+ { AgentCount S32 }+ { TimeToLive S32 } // in seconds+ { Status Variable 1 }+ }+}++// SetSimPresenceInDatabase+// updates the "presence" table in the database to ensure+// that a given simulator is present and valid for a set amount of+// time+{+ SetSimPresenceInDatabase Low 23 Trusted Unencoded+ {+ SimData Single+ { RegionID LLUUID }+ { HostName Variable 1 }+ { GridX U32 }+ { GridY U32 }+ { PID S32 }+ { AgentCount S32 }+ { TimeToLive S32 } // in seconds+ { Status Variable 1 }+ }+}++// ***************************************************************************+// Economy messages+// ***************************************************************************++// once we use local stats, this will include a region handle+{+ EconomyDataRequest Low 24 NotTrusted Unencoded+}++// dataserver to sim, response w/ econ data+{+ EconomyData Low 25 Trusted Zerocoded+ {+ Info Single+ { ObjectCapacity S32 }+ { ObjectCount S32 }+ { PriceEnergyUnit S32 }+ { PriceObjectClaim S32 }+ { PricePublicObjectDecay S32 }+ { PricePublicObjectDelete S32 }+ { PriceParcelClaim S32 }+ { PriceParcelClaimFactor F32 }+ { PriceUpload S32 }+ { PriceRentLight S32 }+ { TeleportMinPrice S32 }+ { TeleportPriceExponent F32 }+ { EnergyEfficiency F32 }+ { PriceObjectRent F32 }+ { PriceObjectScaleFactor F32 }+ { PriceParcelRent S32 }+ { PriceGroupCreate S32 }+ }+}++// ***************************************************************************+// Search messages+// ***************************************************************************++// AvatarPickerRequest+// Get a list of names to select a person+// viewer -> sim -> data+// reliable+{+ AvatarPickerRequest Low 26 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { QueryID LLUUID }+ }+ {+ Data Single+ { Name Variable 1 }+ }+}++// backend implementation which tracks if the user is a god.+{+ AvatarPickerRequestBackend Low 27 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { QueryID LLUUID }+ { GodLevel U8 }+ }+ {+ Data Single+ { Name Variable 1 }+ }+}++// AvatarPickerReply+// List of names to select a person+// reliable+{+ AvatarPickerReply Low 28 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { QueryID LLUUID }+ }+ {+ Data Variable+ { AvatarID LLUUID }+ { FirstName Variable 1 }+ { LastName Variable 1 }+ }+}++// PlacesQuery+// Used for getting a list of places for the group land panel+// and the user land holdings panel. NOT for the directory.+{+ PlacesQuery Low 29 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { QueryID LLUUID }+ }+ {+ TransactionData Single+ { TransactionID LLUUID }+ }+ {+ QueryData Single+ { QueryText Variable 1 }+ { QueryFlags U32 }+ { Category S8 }+ { SimName Variable 1 }+ }+}++// PlacesReply+// dataserver -> simulator -> viewer+// If the user has specified a location, use that to compute+// global x,y,z. Otherwise, use center of the AABB.+// reliable+{+ PlacesReply Low 30 Trusted Zerocoded UDPDeprecated+ {+ AgentData Single+ { AgentID LLUUID }+ { QueryID LLUUID }+ }+ {+ TransactionData Single+ { TransactionID LLUUID }+ }+ {+ QueryData Variable+ { OwnerID LLUUID }+ { Name Variable 1 }+ { Desc Variable 1 }+ { ActualArea S32 }+ { BillableArea S32 }+ { Flags U8 }+ { GlobalX F32 } // meters+ { GlobalY F32 } // meters+ { GlobalZ F32 } // meters+ { SimName Variable 1 }+ { SnapshotID LLUUID }+ { Dwell F32 }+ { Price S32 }+ //{ ProductSKU Variable 1 }+ }+}++// DirFindQuery viewer->sim+// Message to start asking questions for the directory +{+ DirFindQuery Low 31 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryText Variable 1 }+ { QueryFlags U32 }+ { QueryStart S32 } // prev/next page support+ }+}++// DirFindQueryBackend sim->data+// Trusted message generated by receipt of DirFindQuery to sim.+{+ DirFindQueryBackend Low 32 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryText Variable 1 }+ { QueryFlags U32 }+ { QueryStart S32 } // prev/next page support+ { EstateID U32 }+ { Godlike BOOL }+ }+}+++// DirPlacesQuery viewer->sim+// Used for the Find directory of places+{+ DirPlacesQuery Low 33 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryText Variable 1 }+ { QueryFlags U32 }+ { Category S8 }+ { SimName Variable 1 }+ { QueryStart S32 }+ }+}++// DirPlacesQueryBackend sim->dataserver+// Used for the Find directory of places.+{+ DirPlacesQueryBackend Low 34 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryText Variable 1 }+ { QueryFlags U32 }+ { Category S8 }+ { SimName Variable 1 }+ { EstateID U32 }+ { Godlike BOOL }+ { QueryStart S32 }+ }+}++// DirPlacesReply dataserver->sim->viewer+// If the user has specified a location, use that to compute+// global x,y,z. Otherwise, use center of the AABB.+// reliable+{+ DirPlacesReply Low 35 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Variable+ { QueryID LLUUID }+ }+ {+ QueryReplies Variable+ { ParcelID LLUUID }+ { Name Variable 1 }+ { ForSale BOOL }+ { Auction BOOL }+ { Dwell F32 }+ }+ {+ StatusData Variable+ { Status U32 }+ }+}++// DirPeopleReply+{+ DirPeopleReply Low 36 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ }+ {+ QueryReplies Variable+ { AgentID LLUUID }+ { FirstName Variable 1 }+ { LastName Variable 1 }+ { Group Variable 1 }+ { Online BOOL }+ { Reputation S32 }+ }+}++// DirEventsReply+{+ DirEventsReply Low 37 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ }+ {+ QueryReplies Variable+ { OwnerID LLUUID }+ { Name Variable 1 }+ { EventID U32 }+ { Date Variable 1 }+ { UnixTime U32 }+ { EventFlags U32 }+ }+ {+ StatusData Variable+ { Status U32 }+ }+}++// DirGroupsReply+// dataserver -> userserver -> viewer+// reliable+{+ DirGroupsReply Low 38 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ }+ {+ QueryReplies Variable+ { GroupID LLUUID }+ { GroupName Variable 1 } // string+ { Members S32 }+ { SearchOrder F32 }+ }+}+++// DirClassifiedQuery viewer->sim+// reliable+{+ DirClassifiedQuery Low 39 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryText Variable 1 }+ { QueryFlags U32 }+ { Category U32 }+ { QueryStart S32 }+ }+}++// DirClassifiedQueryBackend sim->dataserver+// reliable+{+ DirClassifiedQueryBackend Low 40 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryText Variable 1 }+ { QueryFlags U32 }+ { Category U32 }+ { EstateID U32 }+ { Godlike BOOL }+ { QueryStart S32 }+ }+}++// DirClassifiedReply dataserver->sim->viewer+// reliable+{+ DirClassifiedReply Low 41 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ }+ {+ QueryReplies Variable+ { ClassifiedID LLUUID }+ { Name Variable 1 }+ { ClassifiedFlags U8 }+ { CreationDate U32 }+ { ExpirationDate U32 }+ { PriceForListing S32 }+ }+ {+ StatusData Variable+ { Status U32 }+ }+}+++// AvatarClassifiedReply+// dataserver -> simulator -> viewer+// Send the header information for this avatar's classifieds+// This fills in the tabs of the Classifieds panel.+// reliable+{+ AvatarClassifiedReply Low 42 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { TargetID LLUUID }+ }+ {+ Data Variable+ { ClassifiedID LLUUID }+ { Name Variable 1 }+ }+}+++// ClassifiedInfoRequest+// viewer -> simulator+// simulator -> dataserver+// reliable+{+ ClassifiedInfoRequest Low 43 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { ClassifiedID LLUUID }+ }+}+++// ClassifiedInfoReply+// dataserver -> simulator+// simulator -> viewer+// reliable+{+ ClassifiedInfoReply Low 44 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ Data Single+ { ClassifiedID LLUUID }+ { CreatorID LLUUID }+ { CreationDate U32 }+ { ExpirationDate U32 }+ { Category U32 }+ { Name Variable 1 }+ { Desc Variable 2 }+ { ParcelID LLUUID }+ { ParentEstate U32 }+ { SnapshotID LLUUID }+ { SimName Variable 1 }+ { PosGlobal LLVector3d }+ { ParcelName Variable 1 }+ { ClassifiedFlags U8 }+ { PriceForListing S32 }+ }+}+++// ClassifiedInfoUpdate+// Update a classified. ParcelID and EstateID are set+// on the simulator as the message passes through.+// viewer -> simulator -> dataserver+// reliable+{+ ClassifiedInfoUpdate Low 45 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { ClassifiedID LLUUID }+ { Category U32 }+ { Name Variable 1 }+ { Desc Variable 2 }+ { ParcelID LLUUID }+ { ParentEstate U32 }+ { SnapshotID LLUUID }+ { PosGlobal LLVector3d }+ { ClassifiedFlags U8 }+ { PriceForListing S32 }+ }+}+++// ClassifiedDelete+// Delete a classified from the database.+// viewer -> simulator -> dataserver+// reliable+{+ ClassifiedDelete Low 46 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { ClassifiedID LLUUID }+ }+}++// ClassifiedGodDelete+// Delete a classified from the database.+// QueryID is needed so database can send a repeat list of +// classified.+// viewer -> simulator -> dataserver+// reliable+{+ ClassifiedGodDelete Low 47 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { ClassifiedID LLUUID }+ { QueryID LLUUID }+ }+}+++// DirLandQuery viewer->sim+// Special query for the land for sale/auction panel.+// reliable+{+ DirLandQuery Low 48 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryFlags U32 }+ { SearchType U32 }+ { Price S32 }+ { Area S32 }+ { QueryStart S32 }+ }+}++// DirLandQueryBackend sim->dataserver+// Special query for the land for sale/auction panel.+{+ DirLandQueryBackend Low 49 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryFlags U32 }+ { SearchType U32 }+ { Price S32 }+ { Area S32 }+ { QueryStart S32 }+ { EstateID U32 }+ { Godlike BOOL }+ }+}++// DirLandReply+// dataserver -> simulator -> viewer+// reliable+{+ DirLandReply Low 50 Trusted Zerocoded UDPDeprecated+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ }+ {+ QueryReplies Variable+ { ParcelID LLUUID }+ { Name Variable 1 }+ { Auction BOOL }+ { ForSale BOOL }+ { SalePrice S32 }+ { ActualArea S32 }+ //{ ProductSKU Variable 1 }+ }+}++// DirPopularQuery viewer->sim+// Special query for the land for sale/auction panel.+// reliable+{+ DirPopularQuery Low 51 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryFlags U32 }+ }+}++// DirPopularQueryBackend sim->dataserver+// Special query for the land for sale/auction panel.+// reliable+{+ DirPopularQueryBackend Low 52 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryFlags U32 }+ { EstateID U32 }+ { Godlike BOOL }+ }+}++// DirPopularReply+// dataserver -> simulator -> viewer+// reliable+{+ DirPopularReply Low 53 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ }+ {+ QueryReplies Variable+ { ParcelID LLUUID }+ { Name Variable 1 }+ { Dwell F32 }+ }+}++// ParcelInfoRequest+// viewer -> simulator -> dataserver+// reliable+{+ ParcelInfoRequest Low 54 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { ParcelID LLUUID }+ }+}++// ParcelInfoReply+// dataserver -> simulator -> viewer+// reliable+{+ ParcelInfoReply Low 55 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ Data Single+ { ParcelID LLUUID }+ { OwnerID LLUUID }+ { Name Variable 1 }+ { Desc Variable 1 }+ { ActualArea S32 }+ { BillableArea S32 }+ { Flags U8 }+ { GlobalX F32 } // meters+ { GlobalY F32 } // meters+ { GlobalZ F32 } // meters+ { SimName Variable 1 }+ { SnapshotID LLUUID }+ { Dwell F32 }+ { SalePrice S32 }+ { AuctionID S32 }+ }+}+++// ParcelObjectOwnersRequest+// viewer -> simulator+// reliable+{+ ParcelObjectOwnersRequest Low 56 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { LocalID S32 }+ }+}+++// ParcelObjectOwnersReply+// simulator -> viewer+// reliable+{+ ParcelObjectOwnersReply Low 57 Trusted Zerocoded UDPDeprecated+ {+ Data Variable+ { OwnerID LLUUID }+ { IsGroupOwned BOOL }+ { Count S32 }+ { OnlineStatus BOOL }+ }+}++// GroupNoticeListRequest+// viewer -> simulator -> dataserver+// reliable+{+ GroupNoticesListRequest Low 58 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { GroupID LLUUID }+ }+}++// GroupNoticesListReply+// dataserver -> simulator -> viewer+// reliable+{+ GroupNoticesListReply Low 59 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { GroupID LLUUID }+ }+ {+ Data Variable+ { NoticeID LLUUID }+ { Timestamp U32 }+ { FromName Variable 2 }+ { Subject Variable 2 }+ { HasAttachment BOOL }+ { AssetType U8 }+ }+}++// GroupNoticeRequest+// viewer -> simulator+// simulator -> dataserver+// reliable+{+ GroupNoticeRequest Low 60 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { GroupNoticeID LLUUID }+ }+}++// GroupNoticeAdd+// Add a group notice. +// simulator -> dataserver+// reliable+{+ GroupNoticeAdd Low 61 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ MessageBlock Single+ { ToGroupID LLUUID }+ { ID LLUUID }+ { Dialog U8 }+ { FromAgentName Variable 1 }+ { Message Variable 2 }+ { BinaryBucket Variable 2 }+ }+}+++// ****************************************************************************+// Teleport messages+//+// The teleport messages are numerous, so I have attempted to give them a +// consistent naming convention. Since there is a bit of glob pattern+// aliasing, the rules are applied in order.+//+// Teleport* - viewer->sim or sim->viewer message which announces a +// teleportation request, progrees, start, or end.+// Data* - sim->data or data->sim trusted message.+// Space* - sim->space or space->sim trusted messaging+// *Lure - A lure message to pass around information.+//+// All actual viewer teleports will begin with a Teleport* message and+// end in a TeleportStart, TeleportLocal or TeleportFailed message. The TeleportFailed+// message may be returned by any process and must be routed through the+// teleporting agent's simulator and back to the viewer.+// ****************************************************************************++// TeleportRequest+// viewer -> sim specifying exact teleport destination+{+ TeleportRequest Low 62 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Info Single+ { RegionID LLUUID }+ { Position LLVector3 }+ { LookAt LLVector3 }+ }+}++// TeleportLocationRequest+// viewer -> sim specifying exact teleport destination+{+ TeleportLocationRequest Low 63 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Info Single+ { RegionHandle U64 }+ { Position LLVector3 }+ { LookAt LLVector3 }+ }+}++// TeleportLocal+// sim -> viewer reply telling the viewer that we've successfully TP'd+// to somewhere else within the sim+{+ TeleportLocal Low 64 Trusted Unencoded+ {+ Info Single+ { AgentID LLUUID }+ { LocationID U32 }+ { Position LLVector3 } // region+ { LookAt LLVector3 }+ { TeleportFlags U32 }+ }+}++// TeleportLandmarkRequest viewer->sim+// teleport to landmark asset ID destination. use LLUUD::null for home.+{+ TeleportLandmarkRequest Low 65 NotTrusted Zerocoded+ {+ Info Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { LandmarkID LLUUID }+ }+}++// TeleportProgress sim->viewer+// Tell the agent how the teleport is going.+{+ TeleportProgress Low 66 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ Info Single+ { TeleportFlags U32 }+ { Message Variable 1 } // string+ }+}++// DataHomeLocationRequest sim->data+// Request +{+ DataHomeLocationRequest Low 67 Trusted Zerocoded+ {+ Info Single+ { AgentID LLUUID }+ { KickedFromEstateID U32 }+ }+}++// DataHomeLocationReply data->sim+// response is the location of agent home.+{+ DataHomeLocationReply Low 68 Trusted Unencoded+ {+ Info Single+ { AgentID LLUUID }+ { RegionHandle U64 }+ { Position LLVector3 } // region coords+ { LookAt LLVector3 }+ }+}+++// TeleportFinish sim->viewer+// called when all of the information has been collected and readied for +// the agent.+{+ TeleportFinish Low 69 Trusted Unencoded UDPBlackListed+ {+ Info Single+ { AgentID LLUUID }+ { LocationID U32 }+ { SimIP IPADDR }+ { SimPort IPPORT }+ { RegionHandle U64 }+ { SeedCapability Variable 2 } // URL+ { SimAccess U8 }+ { TeleportFlags U32 }+ }+}++// StartLure viewer->sim+// Sent from viewer to the local simulator to lure target id to near +// agent id. This will generate an instant message that will be routed +// through the space server and out to the userserver. When that IM +// goes through the userserver and the TargetID is online, the +// userserver will send an InitializeLure to the spaceserver. When that+// packet is acked, the original instant message is finally forwarded to +// TargetID.+{+ StartLure Low 70 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Info Single+ { LureType U8 }+ { Message Variable 1 }+ }+ {+ TargetData Variable+ { TargetID LLUUID }+ }+}++// TeleportLureRequest viewer->sim+// Message from target of lure to begin the teleport process on the +// local simulator.+{+ TeleportLureRequest Low 71 NotTrusted Unencoded+ {+ Info Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { LureID LLUUID }+ { TeleportFlags U32 }+ }+}++// TeleportCancel viewer->sim+// reliable+{+ TeleportCancel Low 72 NotTrusted Unencoded+ {+ Info Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}+++// TeleportStart sim->viewer+// announce a successful teleport request to the viewer.+{+ TeleportStart Low 73 Trusted Unencoded+ {+ Info Single+ { TeleportFlags U32 }+ }+}++// TeleportFailed somewhere->sim->viewer+// announce failure of teleport request+{+ TeleportFailed Low 74 Trusted Unencoded+ {+ Info Single+ { AgentID LLUUID }+ { Reason Variable 1 } // string+ }+ {+ AlertInfo Variable+ { Message Variable 1 } // string id+ { ExtraParams Variable 1 } // llsd extra parameters+ }+}+++// ***************************************************************************+// Viewer to Simulator Messages+// ***************************************************************************++// Undo+{+ Undo Low 75 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectID LLUUID }+ }+}+++// Redo+{+ Redo Low 76 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectID LLUUID }+ }+}++// UndoLand+{+ UndoLand Low 77 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}+++// AgentPause - viewer occasionally will block, inform simulator of this fact+{+ AgentPause Low 78 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { SerialNum U32 } // U32, used by both pause and resume. Non-increasing numbers are ignored.+ }+}++// AgentResume - unblock the agent+{+ AgentResume Low 79 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { SerialNum U32 } // U32, used by both pause and resume. Non-increasing numbers are ignored.+ }+}+++// AgentUpdate - Camera info sent from viewer to simulator+// or, more simply, two axes and compute cross product+// State data is temporary, indicates current behavior state:+// 0 = walking+// 1 = mouselook+// 2 = typing +// +// Center is region local (JNC 8.16.2001)+// Camera center is region local (JNC 8.29.2001)+{+ AgentUpdate High 4 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { BodyRotation LLQuaternion }+ { HeadRotation LLQuaternion }+ { State U8 }+ { CameraCenter LLVector3 }+ { CameraAtAxis LLVector3 }+ { CameraLeftAxis LLVector3 }+ { CameraUpAxis LLVector3 }+ { Far F32 }+ { ControlFlags U32 }+ { Flags U8 }+ }+}++// ChatFromViewer+// Specifies the text to be said and the "type", +// normal speech, shout, whisper.+// with the specified radius+{+ ChatFromViewer Low 80 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ChatData Single+ { Message Variable 2 }+ { Type U8 }+ { Channel S32 }+ }+}+++// AgentThrottle+{+ AgentThrottle Low 81 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { CircuitCode U32 }+ }+ {+ Throttle Single+ { GenCounter U32 }+ { Throttles Variable 1 }+ }+}+++// AgentFOV - Update to agent's field of view, angle is vertical, single F32 float in radians+{+ AgentFOV Low 82 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { CircuitCode U32 }+ }+ {+ FOVBlock Single+ { GenCounter U32 }+ { VerticalAngle F32 }+ }+}+++// AgentHeightWidth - Update to height and aspect, sent as height/width to save space+// Usually sent when window resized or created+{+ AgentHeightWidth Low 83 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { CircuitCode U32 }+ }+ {+ HeightWidthBlock Single+ { GenCounter U32 }+ { Height U16 }+ { Width U16 }+ }+}+++// AgentSetAppearance - Update to agent appearance+{+ AgentSetAppearance Low 84 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { SerialNum U32 } // U32, Increases every time the appearance changes. A value of 0 resets.+ { Size LLVector3 }+ }+ {+ WearableData Variable+ { CacheID LLUUID }+ { TextureIndex U8 }+ }+ {+ ObjectData Single+ { TextureEntry Variable 2 }+ }+ {+ VisualParam Variable+ { ParamValue U8 }+ }+}++// AgentAnimation - Update animation state+// viewer --> simulator+{+ AgentAnimation High 5 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ AnimationList Variable+ { AnimID LLUUID }+ { StartAnim BOOL }+ }+ {+ PhysicalAvatarEventList Variable+ { TypeData Variable 1 }+ }+}++// AgentRequestSit - Try to sit on an object+{+ AgentRequestSit High 6 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ TargetObject Single+ { TargetID LLUUID }+ { Offset LLVector3 }+ }+}++// AgentSit - Actually sit on object+{+ AgentSit High 7 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}+++// quit message sent between simulators+{+ AgentQuitCopy Low 85 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ FuseBlock Single+ { ViewerCircuitCode U32 }+ }+}+++// Request Image - Sent by the viewer to request a specified image at a specified resolution++{+ RequestImage High 8 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ RequestImage Variable+ { Image LLUUID }+ { DiscardLevel S8 }+ { DownloadPriority F32 }+ { Packet U32 }+ { Type U8 }+ }+}++// ImageNotInDatabase+// Simulator informs viewer that a requsted image definitely does not exist in the asset database+{+ ImageNotInDatabase Low 86 Trusted Unencoded+ {+ ImageID Single+ { ID LLUUID }+ }+}++// RebakeAvatarTextures+// simulator -> viewer request when a temporary baked avatar texture is not found+{+ RebakeAvatarTextures Low 87 Trusted Unencoded+ {+ TextureData Single+ { TextureID LLUUID }+ }+}+++// SetAlwaysRun+// Lets the viewer choose between running and walking+{+ SetAlwaysRun Low 88 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { AlwaysRun BOOL }+ }+}++// ObjectAdd - create new object in the world+// Simulator will assign ID and send message back to signal+// object actually created.+//+// AddFlags (see also ObjectUpdate)+// 0x01 - use physics+// 0x02 - create selected+//+// If only one ImageID is sent for an object type that has more than+// one face, the same image is repeated on each subsequent face.+// +// Data field is opaque type-specific data for this object+{+ ObjectAdd Medium 1 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ ObjectData Single+ { PCode U8 }+ { Material U8 }+ { AddFlags U32 } // see object_flags.h++ { PathCurve U8 }+ { ProfileCurve U8 }+ { PathBegin U16 } // 0 to 1, quanta = 0.01+ { PathEnd U16 } // 0 to 1, quanta = 0.01+ { PathScaleX U8 } // 0 to 1, quanta = 0.01+ { PathScaleY U8 } // 0 to 1, quanta = 0.01+ { PathShearX U8 } // -.5 to .5, quanta = 0.01+ { PathShearY U8 } // -.5 to .5, quanta = 0.01+ { PathTwist S8 } // -1 to 1, quanta = 0.01+ { PathTwistBegin S8 } // -1 to 1, quanta = 0.01+ { PathRadiusOffset S8 } // -1 to 1, quanta = 0.01+ { PathTaperX S8 } // -1 to 1, quanta = 0.01+ { PathTaperY S8 } // -1 to 1, quanta = 0.01+ { PathRevolutions U8 } // 0 to 3, quanta = 0.015+ { PathSkew S8 } // -1 to 1, quanta = 0.01+ { ProfileBegin U16 } // 0 to 1, quanta = 0.01+ { ProfileEnd U16 } // 0 to 1, quanta = 0.01+ { ProfileHollow U16 } // 0 to 1, quanta = 0.01++ { BypassRaycast U8 }+ { RayStart LLVector3 }+ { RayEnd LLVector3 }+ { RayTargetID LLUUID }+ { RayEndIsIntersection U8 }++ { Scale LLVector3 }+ { Rotation LLQuaternion }++ { State U8 }+ }+}+++// ObjectDelete+// viewer -> simulator+{+ ObjectDelete Low 89 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Force BOOL } // BOOL, god trying to force delete+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }+}+++// ObjectDuplicate+// viewer -> simulator+// Makes a copy of a set of objects, offset by a given amount+{+ ObjectDuplicate Low 90 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ SharedData Single+ { Offset LLVector3 }+ { DuplicateFlags U32 } // see object_flags.h+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }+}+++// ObjectDuplicateOnRay+// viewer -> simulator+// Makes a copy of an object, using the add object raycast+// code to abut it to other objects.+{+ ObjectDuplicateOnRay Low 91 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ { RayStart LLVector3 } // region local+ { RayEnd LLVector3 } // region local+ { BypassRaycast BOOL }+ { RayEndIsIntersection BOOL }+ { CopyCenters BOOL }+ { CopyRotates BOOL }+ { RayTargetID LLUUID }+ { DuplicateFlags U32 } // see object_flags.h+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }+}+++// MultipleObjectUpdate+// viewer -> simulator+// updates position, rotation and scale in one message+// positions sent as region-local floats+{+ MultipleObjectUpdate Medium 2 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable + { ObjectLocalID U32 }+ { Type U8 }+ { Data Variable 1 } // custom type+ }+}++// RequestMultipleObjects+// viewer -> simulator+// reliable+//+// When the viewer gets a local_id/crc for an object that+// it either doesn't have, or doesn't have the current version+// of, it sends this upstream get get an update.+//+// CacheMissType 0 => full object (viewer doesn't have it)+// CacheMissType 1 => CRC mismatch only+{+ RequestMultipleObjects Medium 3 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable + { CacheMissType U8 }+ { ID U32 }+ }+}+++// DEPRECATED: ObjectPosition+// == Old Behavior ==+// Set the position on objects+//+// == Reason for deprecation ==+// Unused code path was removed in the move to Havok4+// Object position, scale and rotation messages were already unified+// to MultipleObjectUpdate and this message was unused cruft.+//+// == New Location ==+// MultipleObjectUpdate can be used instead.+{+ ObjectPosition Medium 4 NotTrusted Zerocoded Deprecated+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { Position LLVector3 } // region+ }+}+++// DEPRECATED: ObjectScale+// == Old Behavior ==+// Set the scale on objects+//+// == Reason for deprecation ==+// Unused code path was removed in the move to Havok4+// Object position, scale and rotation messages were already unified+// to MultipleObjectUpdate and this message was unused cruft.+//+// == New Location ==+// MultipleObjectUpdate can be used instead.+{+ ObjectScale Low 92 NotTrusted Zerocoded Deprecated+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { Scale LLVector3 }+ }+}+++// ObjectRotation+// viewer -> simulator+{+ ObjectRotation Low 93 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { Rotation LLQuaternion }+ }+}+++// ObjectFlagUpdate+// viewer -> simulator+{+ ObjectFlagUpdate Low 94 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { ObjectLocalID U32 }+ { UsePhysics BOOL }+ { IsTemporary BOOL }+ { IsPhantom BOOL }+ { CastsShadows BOOL }+ }+}+++// ObjectClickAction+// viewer -> simulator+{+ ObjectClickAction Low 95 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { ClickAction U8 }+ }+}+++// ObjectImage+// viewer -> simulator+{+ ObjectImage Low 96 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { MediaURL Variable 1 }+ { TextureEntry Variable 2 }+ }+}+++{+ ObjectMaterial Low 97 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { Material U8 }+ }+}+++{+ ObjectShape Low 98 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { PathCurve U8 }+ { ProfileCurve U8 }+ { PathBegin U16 } // 0 to 1, quanta = 0.01+ { PathEnd U16 } // 0 to 1, quanta = 0.01+ { PathScaleX U8 } // 0 to 1, quanta = 0.01+ { PathScaleY U8 } // 0 to 1, quanta = 0.01+ { PathShearX U8 } // -.5 to .5, quanta = 0.01+ { PathShearY U8 } // -.5 to .5, quanta = 0.01+ { PathTwist S8 } // -1 to 1, quanta = 0.01+ { PathTwistBegin S8 } // -1 to 1, quanta = 0.01+ { PathRadiusOffset S8 } // -1 to 1, quanta = 0.01+ { PathTaperX S8 } // -1 to 1, quanta = 0.01+ { PathTaperY S8 } // -1 to 1, quanta = 0.01+ { PathRevolutions U8 } // 0 to 3, quanta = 0.015+ { PathSkew S8 } // -1 to 1, quanta = 0.01+ { ProfileBegin U16 } // 0 to 1, quanta = 0.01+ { ProfileEnd U16 } // 0 to 1, quanta = 0.01+ { ProfileHollow U16 } // 0 to 1, quanta = 0.01+ }+}++{+ ObjectExtraParams Low 99 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { ParamType U16 }+ { ParamInUse BOOL }+ { ParamSize U32 }+ { ParamData Variable 1 }+ }+}+++// ObjectOwner+// To make public, set OwnerID to LLUUID::null.+// TODO: Eliminate god-bit. Maybe not. God-bit is ok, because it's+// known on the server.+{+ ObjectOwner Low 100 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ HeaderData Single+ { Override BOOL } // BOOL, God-bit.+ { OwnerID LLUUID }+ { GroupID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }+}++// ObjectGroup+// To make the object part of no group, set GroupID = LLUUID::null.+// This call only works if objectid.ownerid == agentid.+{+ ObjectGroup Low 101 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }+}++// Attempt to buy an object. This will only pack root objects.+{+ ObjectBuy Low 102 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ { CategoryID LLUUID } // folder where it goes (if derezed)+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { SaleType U8 } // U8 -> EForSale+ { SalePrice S32 }+ }+}++// viewer -> simulator++// buy object inventory. If the transaction succeeds, it will add+// inventory to the agent, and potentially remove the original.+{+ BuyObjectInventory Low 103 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { ObjectID LLUUID }+ { ItemID LLUUID }+ { FolderID LLUUID }+ }+}++// sim -> viewer+// Used to propperly handle buying asset containers+{+ DerezContainer Low 104 Trusted Zerocoded+ {+ Data Single+ { ObjectID LLUUID }+ { Delete BOOL } // BOOL+ }+}++// ObjectPermissions+// Field - see llpermissionsflags.h+// If Set is true, tries to turn on bits in mask.+// If set is false, tries to turn off bits in mask.+// BUG: This just forces the permissions field.+{+ ObjectPermissions Low 105 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ HeaderData Single+ { Override BOOL } // BOOL, God-bit.+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { Field U8 }+ { Set U8 }+ { Mask U32 }+ }+}++// set object sale information+{+ ObjectSaleInfo Low 106 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { LocalID U32 }+ { SaleType U8 } // U8 -> EForSale+ { SalePrice S32 }+ }+}+++// set object names+{+ ObjectName Low 107 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { LocalID U32 }+ { Name Variable 1 }+ }+}++// set object descriptions+{+ ObjectDescription Low 108 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { LocalID U32 }+ { Description Variable 1 }+ }+}++// set object category+{+ ObjectCategory Low 109 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { LocalID U32 }+ { Category U32 }+ }+}++// ObjectSelect+// Variable object data because rectangular selection can+// generate a large list very quickly.+{+ ObjectSelect Low 110 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }++}+++// ObjectDeselect+{+ ObjectDeselect Low 111 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }++}++// ObjectAttach+{+ ObjectAttach Low 112 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { AttachmentPoint U8 }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { Rotation LLQuaternion }+ }+}++// ObjectDetach -- derezzes an attachment, marking its item in your inventory as not "(worn)"+{+ ObjectDetach Low 113 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }+}+++// ObjectDrop -- drops an attachment from your avatar onto the ground+{+ ObjectDrop Low 114 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }+}+++// ObjectLink+{+ ObjectLink Low 115 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }+}++// ObjectDelink+{+ ObjectDelink Low 116 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ }+}+++// ObjectGrab+{+ ObjectGrab Low 117 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Single+ { LocalID U32 }+ { GrabOffset LLVector3 }+ }+ {+ SurfaceInfo Variable+ { UVCoord LLVector3 }+ { STCoord LLVector3 }+ { FaceIndex S32 }+ { Position LLVector3 }+ { Normal LLVector3 }+ { Binormal LLVector3 }+ }+}+++// ObjectGrabUpdate+// TODO: Quantize this data, reduce message size.+// TimeSinceLast could go to 1 byte, since capped+// at 100 on sim.+{+ ObjectGrabUpdate Low 118 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Single+ { ObjectID LLUUID }+ { GrabOffsetInitial LLVector3 } // LLVector3+ { GrabPosition LLVector3 } // LLVector3, region local+ { TimeSinceLast U32 }+ }+ {+ SurfaceInfo Variable+ { UVCoord LLVector3 }+ { STCoord LLVector3 }+ { FaceIndex S32 }+ { Position LLVector3 }+ { Normal LLVector3 }+ { Binormal LLVector3 }+ }++}+++// ObjectDeGrab +{+ ObjectDeGrab Low 119 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Single+ { LocalID U32 }+ }+ {+ SurfaceInfo Variable+ { UVCoord LLVector3 }+ { STCoord LLVector3 }+ { FaceIndex S32 }+ { Position LLVector3 }+ { Normal LLVector3 }+ { Binormal LLVector3 }+ }+}+++// ObjectSpinStart+{+ ObjectSpinStart Low 120 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Single+ { ObjectID LLUUID }+ }+}+++// ObjectSpinUpdate+{+ ObjectSpinUpdate Low 121 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Single+ { ObjectID LLUUID }+ { Rotation LLQuaternion }+ }+}+++// ObjectSpinStop+{+ ObjectSpinStop Low 122 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Single+ { ObjectID LLUUID }+ }+}++// Export selected objects+// viewer->sim+{+ ObjectExportSelected Low 123 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { RequestID LLUUID }+ { VolumeDetail S16 }+ }+ {+ ObjectData Variable+ { ObjectID LLUUID }+ }+}+++// ModifyLand - sent to modify a piece of land on a simulator.+// viewer -> sim+{+ ModifyLand Low 124 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ModifyBlock Single+ { Action U8 }+ { BrushSize U8 }+ { Seconds F32 }+ { Height F32 }+ }+ {+ ParcelData Variable+ { LocalID S32 }+ { West F32 }+ { South F32 }+ { East F32 }+ { North F32 }+ }+ {+ ModifyBlockExtended Variable+ { BrushSize F32 }+ }+}+++// VelocityInterpolateOn+// viewer->sim+// requires administrative access+{+ VelocityInterpolateOn Low 125 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}+++// VelocityInterpolateOff+// viewer->sim+// requires administrative access+{+ VelocityInterpolateOff Low 126 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}++// Save State+// viewer->sim+// requires administrative access+{+ StateSave Low 127 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ DataBlock Single+ { Filename Variable 1 }+ }+}++// ReportAutosaveCrash+// sim->launcher+{+ ReportAutosaveCrash Low 128 NotTrusted Unencoded+ {+ AutosaveData Single+ { PID S32 }+ { Status S32 }+ }+}++// SimWideDeletes+{+ SimWideDeletes Low 129 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ DataBlock Single+ { TargetID LLUUID }+ { Flags U32 }+ }+}++// RequestObjectPropertiesFamily+// Ask for extended information, such as creator, permissions, resources, etc.+// Medium frequency because it is driven by mouse hovering over objects, which+// occurs at high rates.+{+ RequestObjectPropertiesFamily Medium 5 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Single+ { RequestFlags U32 }+ { ObjectID LLUUID }+ }+}+++// Track agent - this information is used when sending out the+// coarse location update so that we know who you are tracking. +// To stop tracking - send a null uuid as the prey.+{+ TrackAgent Low 130 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ TargetData Single+ { PreyID LLUUID }+ }+}++// end viewer to simulator section++{+ ViewerStats Low 131 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { IP IPADDR }+ { StartTime U32 }+ { RunTime F32 } // F32+ { SimFPS F32 } // F32+ { FPS F32 } // F32+ { AgentsInView U8 } //+ { Ping F32 } // F32+ { MetersTraveled F64 }+ { RegionsVisited S32 }+ { SysRAM U32 }+ { SysOS Variable 1 } // String+ { SysCPU Variable 1 } // String+ { SysGPU Variable 1 } // String+ }++ {+ DownloadTotals Single+ { World U32 }+ { Objects U32 }+ { Textures U32 }+ }++ {+ NetStats Multiple 2+ { Bytes U32 }+ { Packets U32 }+ { Compressed U32 }+ { Savings U32 }+ }++ { + FailStats Single+ { SendPacket U32 }+ { Dropped U32 }+ { Resent U32 }+ { FailedResends U32 }+ { OffCircuit U32 }+ { Invalid U32 }+ }++ {+ MiscStats Variable+ { Type U32 }+ { Value F64 }+ }+}+ +// ScriptAnswerYes+// reliable+{+ ScriptAnswerYes Low 132 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ } + {+ Data Single+ { TaskID LLUUID }+ { ItemID LLUUID }+ { Questions S32 }+ }+}+++// complaint/bug-report+// reliable+{+ UserReport Low 133 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ReportData Single+ { ReportType U8 } // BUG=1, COMPLAINT=2+ { Category U8 } // see sequence.user_report_category+ { Position LLVector3 } // screenshot position, region-local+ { CheckFlags U8 } // checkboxflags+ { ScreenshotID LLUUID }+ { ObjectID LLUUID }+ { AbuserID LLUUID }+ { AbuseRegionName Variable 1 }+ { AbuseRegionID LLUUID }+ { Summary Variable 1 }+ { Details Variable 2 }+ { VersionString Variable 1 }+ }+}+++// ***************************************************************************+// Simulator to Viewer Messages+// ***************************************************************************++// AlertMessage+// Specifies the text to be posted in an alert dialog+{+ AlertMessage Low 134 Trusted Unencoded+ {+ AlertData Single+ { Message Variable 1 }+ }+ {+ AlertInfo Variable+ { Message Variable 1 }+ { ExtraParams Variable 1 }+ }+}++// Send an AlertMessage to the named agent.+// usually dataserver->simulator+{+ AgentAlertMessage Low 135 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ AlertData Single+ { Modal BOOL }+ { Message Variable 1 }+ }+}+++// MeanCollisionAlert+// Specifies the text to be posted in an alert dialog+{+ MeanCollisionAlert Low 136 Trusted Zerocoded+ {+ MeanCollision Variable+ { Victim LLUUID }+ { Perp LLUUID }+ { Time U32 }+ { Mag F32 }+ { Type U8 }+ }+}++// ViewerFrozenMessage+// Specifies the text to be posted in an alert dialog+{+ ViewerFrozenMessage Low 137 Trusted Unencoded+ {+ FrozenData Single+ { Data BOOL }+ }+}++// Health Message+// Tells viewer what agent health is+{+ HealthMessage Low 138 Trusted Zerocoded+ {+ HealthData Single+ { Health F32 }+ }+}++// ChatFromSimulator+// Chat text to appear on a user's screen+// Position is region local.+// Viewer can optionally use position to animate+// If audible is CHAT_NOT_AUDIBLE, message will not be valid+{+ ChatFromSimulator Low 139 Trusted Unencoded+ {+ ChatData Single+ { FromName Variable 1 }+ { SourceID LLUUID } // agent id or object id+ { OwnerID LLUUID } // object's owner+ { SourceType U8 }+ { ChatType U8 }+ { Audible U8 }+ { Position LLVector3 }+ { Message Variable 2 } // UTF-8 text+ }+}+++// Simulator statistics packet (goes out to viewer and dataserver/spaceserver)+{+ SimStats Low 140 Trusted Unencoded+ {+ Region Single+ { RegionX U32 }+ { RegionY U32 }+ { RegionFlags U32 }+ { ObjectCapacity U32 }+ }+ {+ Stat Variable+ { StatID U32 }+ { StatValue F32 }+ }+ {+ PidStat Single+ { PID S32 }+ }+}++// viewer -> sim+// reliable+{+ RequestRegionInfo Low 141 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}++// RegionInfo+// Used to populate UI for both region/estate floater+// and god tools floater+// sim -> viewer+// reliable+{+ RegionInfo Low 142 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ RegionInfo Single+ { SimName Variable 1 } // string+ { EstateID U32 }+ { ParentEstateID U32 }+ { RegionFlags U32 }+ { SimAccess U8 }+ { MaxAgents U8 }+ { BillableFactor F32 }+ { ObjectBonusFactor F32 }+ { WaterHeight F32 }+ { TerrainRaiseLimit F32 }+ { TerrainLowerLimit F32 }+ { PricePerMeter S32 }+ { RedirectGridX S32 }+ { RedirectGridY S32 }+ { UseEstateSun BOOL }+ { SunHour F32 } // last value set by estate or region controls JC+ }+ {+ RegionInfo2 Single+ { ProductSKU Variable 1 } // string+ { ProductName Variable 1 } // string+ { MaxAgents32 U32 } // Identical to RegionInfo.MaxAgents but allows greater range+ { HardMaxAgents U32 }+ { HardMaxObjects U32 }+ }+}++// GodUpdateRegionInfo+// Sent from viewer to sim after a god has changed some+// of the parameters in the god tools floater+// viewer -> sim+// reliable+{+ GodUpdateRegionInfo Low 143 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ RegionInfo Single+ { SimName Variable 1 } // string+ { EstateID U32 }+ { ParentEstateID U32 }+ { RegionFlags U32 }+ { BillableFactor F32 }+ { PricePerMeter S32 }+ { RedirectGridX S32 }+ { RedirectGridY S32 }+ }+}++//NearestLandingRegionRequest+//sim->dataserver+//Sent from the region to the data server+//to request the most up to date region for the requesting+//region to redirect teleports to+{+ NearestLandingRegionRequest Low 144 Trusted Unencoded+ {+ RequestingRegionData Single+ { RegionHandle U64 }+ }+}++//NearestLandingPointReply+//dataserver->sim+//Sent from the data server to a region in reply+//to the redirectregion request stating which region+//the requesting region should redirect teleports to if necessary+{+ NearestLandingRegionReply Low 145 Trusted Unencoded+ {+ LandingRegionData Single+ { RegionHandle U64 }+ }+}++//NearestLandingPointUpdated+//sim->dataserver+//Sent from a region to the data server+//to have the dataserver note/clear in the db+//that the region has updated it's nearest landing point+{+ NearestLandingRegionUpdated Low 146 Trusted Unencoded+ {+ RegionData Single+ { RegionHandle U64 }+ }+}+++//TeleportLandingStatusChanged+//sim->dataserver+//Sent from the region to the data server+//to note that the region's teleportation landing status has changed+{+ TeleportLandingStatusChanged Low 147 Trusted Unencoded+ {+ RegionData Single+ { RegionHandle U64 }+ }+}++// RegionHandshake+// Sent by region to viewer after it has received UseCircuitCode+// from that viewer.+// sim -> viewer+// reliable+{+ RegionHandshake Low 148 Trusted Zerocoded+ {+ RegionInfo Single+ { RegionFlags U32 }+ { SimAccess U8 }+ { SimName Variable 1 } // string+ { SimOwner LLUUID }+ { IsEstateManager BOOL } // this agent, for this sim+ { WaterHeight F32 }+ { BillableFactor F32 }+ { CacheID LLUUID }+ { TerrainBase0 LLUUID }+ { TerrainBase1 LLUUID }+ { TerrainBase2 LLUUID }+ { TerrainBase3 LLUUID }+ { TerrainDetail0 LLUUID }+ { TerrainDetail1 LLUUID }+ { TerrainDetail2 LLUUID }+ { TerrainDetail3 LLUUID }+ { TerrainStartHeight00 F32 }+ { TerrainStartHeight01 F32 }+ { TerrainStartHeight10 F32 }+ { TerrainStartHeight11 F32 }+ { TerrainHeightRange00 F32 }+ { TerrainHeightRange01 F32 }+ { TerrainHeightRange10 F32 }+ { TerrainHeightRange11 F32 }+ }+ {+ RegionInfo2 Single+ { RegionID LLUUID }+ }+ {+ RegionInfo3 Single+ { CPUClassID S32 }+ { CPURatio S32 }+ { ColoName Variable 1 } // string+ { ProductSKU Variable 1 } // string+ { ProductName Variable 1 } // string+ }+}++// RegionHandshakeReply+// viewer -> sim+// reliable+// Sent after viewer has initialized the (pre-existing)+// LLViewerRegion with the name, access level, etc. and+// has loaded the cache for the region.+// After the simulator receives this, it will start sending+// data about objects.+{+ RegionHandshakeReply Low 149 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ RegionInfo Single+ { Flags U32 }+ }+}++// The CoarseLocationUpdate message is sent to notify the viewer of +// the location of mappable objects in the region. 1 meter resolution is+// sufficient for this. The index block is used to show where you are, +// and where someone you are tracking is located. They are -1 if not+// applicable.+{+ CoarseLocationUpdate Medium 6 Trusted Unencoded+ {+ Location Variable+ { X U8 }+ { Y U8 }+ { Z U8 } // Z in meters / 4+ }+ {+ Index Single+ { You S16 }+ { Prey S16 }+ }+ {+ AgentData Variable+ { AgentID LLUUID }+ }+}++// ImageData - sent to viewer to transmit information about an image +{+ ImageData High 9 Trusted Unencoded+ {+ ImageID Single+ { ID LLUUID }+ { Codec U8 }+ { Size U32 }+ { Packets U16 }+ }+ {+ ImageData Single+ { Data Variable 2 }+ }+}++// ImagePacket - follow on image data for images having > 1 packet of data +{+ ImagePacket High 10 Trusted Unencoded+ {+ ImageID Single+ { ID LLUUID }+ { Packet U16 }+ }+ {+ ImageData Single+ { Data Variable 2 }+ }+}++// LayerData - Sent to viewer - encodes layer data++{+ LayerData High 11 Trusted Unencoded+ {+ LayerID Single+ { Type U8 }++ }+ {+ LayerData Single+ { Data Variable 2 }+ }+}++// ObjectUpdate - Sent by objects from the simulator to the viewer+//+// If only one ImageID is sent for an object type that has more than+// one face, the same image is repeated on each subsequent face.+// +// NameValue is a list of name-value strings, separated by \n characters,+// terminated by \0+//+// Data is type-specific opaque data for this object+{+ ObjectUpdate High 12 Trusted Zerocoded+ {+ RegionData Single+ { RegionHandle U64 }+ { TimeDilation U16 }+ }+ {+ ObjectData Variable+ { ID U32 }+ { State U8 }++ { FullID LLUUID }+ { CRC U32 } // TEMPORARY HACK FOR JAMES+ { PCode U8 }+ { Material U8 }+ { ClickAction U8 }+ { Scale LLVector3 }+ { ObjectData Variable 1 }++ { ParentID U32 }+ { UpdateFlags U32 } // U32, see object_flags.h++ { PathCurve U8 }+ { ProfileCurve U8 }+ { PathBegin U16 } // 0 to 1, quanta = 0.01+ { PathEnd U16 } // 0 to 1, quanta = 0.01+ { PathScaleX U8 } // 0 to 1, quanta = 0.01+ { PathScaleY U8 } // 0 to 1, quanta = 0.01+ { PathShearX U8 } // -.5 to .5, quanta = 0.01+ { PathShearY U8 } // -.5 to .5, quanta = 0.01+ { PathTwist S8 } // -1 to 1, quanta = 0.01+ { PathTwistBegin S8 } // -1 to 1, quanta = 0.01+ { PathRadiusOffset S8 } // -1 to 1, quanta = 0.01+ { PathTaperX S8 } // -1 to 1, quanta = 0.01+ { PathTaperY S8 } // -1 to 1, quanta = 0.01+ { PathRevolutions U8 } // 0 to 3, quanta = 0.015+ { PathSkew S8 } // -1 to 1, quanta = 0.01+ { ProfileBegin U16 } // 0 to 1, quanta = 0.01+ { ProfileEnd U16 } // 0 to 1, quanta = 0.01+ { ProfileHollow U16 } // 0 to 1, quanta = 0.01++ { TextureEntry Variable 2 }+ { TextureAnim Variable 1 }++ { NameValue Variable 2 }+ { Data Variable 2 }+ { Text Variable 1 } // llSetText() hovering text+ { TextColor Fixed 4 } // actually, a LLColor4U+ { MediaURL Variable 1 } // URL for web page, movie, etc.++ // Info for particle systems+ { PSBlock Variable 1 }+ + // Extra parameters+ { ExtraParams Variable 1 }+ + // info for looped attached sounds+ // because these are almost always all zero+ // the hit after zero-coding is only 2 bytes+ // not the 42 you see here+ { Sound LLUUID }+ { OwnerID LLUUID } // HACK object's owner id, only set if non-null sound, for muting+ { Gain F32 }+ { Flags U8 }+ { Radius F32 } // cutoff radius++ // joint info -- is sent in the update of each joint-child-root+ { JointType U8 }+ { JointPivot LLVector3 }+ { JointAxisOrAnchor LLVector3 }+ }+}+++// ObjectUpdateCompressed+{+ ObjectUpdateCompressed High 13 Trusted Unencoded+ {+ RegionData Single+ { RegionHandle U64 }+ { TimeDilation U16 }+ }+ {+ ObjectData Variable+ { UpdateFlags U32 }+ { Data Variable 2 }+ }+}++// ObjectUpdateCached+// reliable+{+ ObjectUpdateCached High 14 Trusted Unencoded+ {+ RegionData Single+ { RegionHandle U64 }+ { TimeDilation U16 }+ }+ {+ ObjectData Variable+ { ID U32 }+ { CRC U32 }+ { UpdateFlags U32 }+ }+}++// packed terse object update format+{+ ImprovedTerseObjectUpdate High 15 Trusted Unencoded+ {+ RegionData Single+ { RegionHandle U64 }+ { TimeDilation U16 }+ }+ {+ ObjectData Variable+ { Data Variable 1 }+ { TextureEntry Variable 2 }+ }+}++// KillObject - Sent by objects to the viewer to tell them to kill themselves++{+ KillObject High 16 Trusted Unencoded+ {+ ObjectData Variable+ { ID U32 }+ }+}+++// CrossedRegion - new way to tell a viewer it has gone across a region +// boundary+{+ CrossedRegion Medium 7 Trusted Unencoded UDPBlackListed+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ RegionData Single+ { SimIP IPADDR }+ { SimPort IPPORT }+ { RegionHandle U64 }+ { SeedCapability Variable 2 } // URL+ }+ {+ Info Single+ { Position LLVector3 }+ { LookAt LLVector3 }+ }+}++// SimulatorViewerTimeMessage - Allows viewer to resynch to world time++{+ SimulatorViewerTimeMessage Low 150 Trusted Unencoded+ {+ TimeInfo Single+ { UsecSinceStart U64 }+ { SecPerDay U32 }+ { SecPerYear U32 }+ { SunDirection LLVector3 }+ { SunPhase F32 }+ { SunAngVelocity LLVector3 }+ }+}++// EnableSimulator - Preps a viewer to receive data from a simulator++{+ EnableSimulator Low 151 Trusted Unencoded UDPBlackListed+ {+ SimulatorInfo Single+ { Handle U64 }+ { IP IPADDR }+ { Port IPPORT }+ }+}++// DisableThisSimulator - Tells a viewer not to expect data from this simulator anymore++{+ DisableSimulator Low 152 Trusted Unencoded+}++// ConfirmEnableSimulator - A confirmation message sent from simulator to neighbors that the simulator+// has successfully been enabled by the viewer++{+ ConfirmEnableSimulator Medium 8 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}++//-----------------------------------------------------------------------------+// New Transfer system+//-----------------------------------------------------------------------------++// Request a new transfer (target->source)+{+ TransferRequest Low 153 NotTrusted Zerocoded+ {+ TransferInfo Single+ { TransferID LLUUID }+ { ChannelType S32 }+ { SourceType S32 }+ { Priority F32 }+ { Params Variable 2 }+ }+}++// Return info about a transfer/initiate transfer (source->target)+// Possibly should have a Params field like above+{+ TransferInfo Low 154 NotTrusted Zerocoded+ {+ TransferInfo Single+ { TransferID LLUUID }+ { ChannelType S32 }+ { TargetType S32 }+ { Status S32 }+ { Size S32 }+ { Params Variable 2 }+ }+}++{+ TransferPacket High 17 NotTrusted Unencoded+ {+ TransferData Single+ { TransferID LLUUID }+ { ChannelType S32 }+ { Packet S32 }+ { Status S32 }+ { Data Variable 2 }+ }+}++// Abort a transfer in progress (either from target->source or source->target)+{+ TransferAbort Low 155 NotTrusted Zerocoded+ {+ TransferInfo Single+ { TransferID LLUUID }+ { ChannelType S32 }+ }+}+++//-----------------------------------------------------------------------------+// General file transfer+//-----------------------------------------------------------------------------++// RequestXfer - request an arbitrary xfer+{+ RequestXfer Low 156 NotTrusted Zerocoded+ {+ XferID Single+ { ID U64 }+ { Filename Variable 1 }+ { FilePath U8 } // ELLPath+ { DeleteOnCompletion BOOL } // BOOL+ { UseBigPackets BOOL } // BOOL+ { VFileID LLUUID }+ { VFileType S16 }+ }+}++// SendXferPacket - send an additional packet of an arbitrary xfer from sim -> viewer +{+ SendXferPacket High 18 NotTrusted Unencoded+ {+ XferID Single+ { ID U64 }+ { Packet U32 }+ }+ {+ DataPacket Single+ { Data Variable 2 }+ }+}++// ConfirmXferPacket+{+ ConfirmXferPacket High 19 NotTrusted Unencoded+ {+ XferID Single+ { ID U64 }+ { Packet U32 }+ }+}++// AbortXfer+{+ AbortXfer Low 157 NotTrusted Unencoded+ {+ XferID Single+ { ID U64 }+ { Result S32 }+ }+}++//-----------------------------------------------------------------------------+// Avatar information+//-----------------------------------------------------------------------------+++// AvatarAnimation - Update animation state+// simulator --> viewer +{+ AvatarAnimation High 20 Trusted Unencoded+ {+ Sender Single+ { ID LLUUID }+ }+ {+ AnimationList Variable+ { AnimID LLUUID }+ { AnimSequenceID S32 }+ }+ {+ AnimationSourceList Variable+ { ObjectID LLUUID }+ }+ {+ PhysicalAvatarEventList Variable+ { TypeData Variable 1 }+ }++}++// AvatarAppearance - Update visual params+{+ AvatarAppearance Low 158 Trusted Zerocoded+ {+ Sender Single+ { ID LLUUID }+ { IsTrial BOOL }+ }+ { + ObjectData Single+ { TextureEntry Variable 2 }+ }+ {+ VisualParam Variable+ { ParamValue U8 }+ }+}++// AvatarSitResponse - response to a request to sit on an object+{+ AvatarSitResponse High 21 Trusted Zerocoded+ {+ SitObject Single+ { ID LLUUID }+ }+ {+ SitTransform Single+ { AutoPilot BOOL }+ { SitPosition LLVector3 }+ { SitRotation LLQuaternion }+ { CameraEyeOffset LLVector3 }+ { CameraAtOffset LLVector3 }+ { ForceMouselook BOOL }+ }+}++// SetFollowCamProperties+{ + SetFollowCamProperties Low 159 Trusted Unencoded+ {+ ObjectData Single+ { ObjectID LLUUID }+ }+ {+ CameraProperty Variable+ { Type S32 }+ { Value F32 }+ }+}++// ClearFollowCamProperties+{+ ClearFollowCamProperties Low 160 Trusted Unencoded+ {+ ObjectData Single+ { ObjectID LLUUID }+ }+}++// CameraConstraint - new camera distance limit (based on collision with objects)+{+ CameraConstraint High 22 Trusted Zerocoded+ {+ CameraCollidePlane Single+ { Plane LLVector4 }+ }+}++// ObjectProperties+// Extended information such as creator, permissions, etc.+// Medium because potentially driven by mouse hover events.+{+ ObjectProperties Medium 9 Trusted Zerocoded+ {+ ObjectData Variable+ { ObjectID LLUUID }+ { CreatorID LLUUID }+ { OwnerID LLUUID }+ { GroupID LLUUID }+ { CreationDate U64 }+ { BaseMask U32 }+ { OwnerMask U32 }+ { GroupMask U32 }+ { EveryoneMask U32 }+ { NextOwnerMask U32 }+ { OwnershipCost S32 }+// { TaxRate F32 } // F32+ { SaleType U8 } // U8 -> EForSale+ { SalePrice S32 }+ { AggregatePerms U8 }+ { AggregatePermTextures U8 }+ { AggregatePermTexturesOwner U8 }+ { Category U32 } // LLCategory+ { InventorySerial S16 } // S16+ { ItemID LLUUID }+ { FolderID LLUUID }+ { FromTaskID LLUUID }+ { LastOwnerID LLUUID }+ { Name Variable 1 }+ { Description Variable 1 }+ { TouchName Variable 1 }+ { SitName Variable 1 }+ { TextureID Variable 1 }+ }+}++// ObjectPropertiesFamily+// Medium because potentially driven by mouse hover events.+{+ ObjectPropertiesFamily Medium 10 Trusted Zerocoded+ {+ ObjectData Single+ { RequestFlags U32 }+ { ObjectID LLUUID }+ { OwnerID LLUUID }+ { GroupID LLUUID }+ { BaseMask U32 }+ { OwnerMask U32 }+ { GroupMask U32 }+ { EveryoneMask U32 }+ { NextOwnerMask U32 }+ { OwnershipCost S32 }+ { SaleType U8 } // U8 -> EForSale+ { SalePrice S32 }+ { Category U32 } // LLCategory+ { LastOwnerID LLUUID }+ { Name Variable 1 }+ { Description Variable 1 }+ }+}++// RequestPayPrice+// viewer -> sim+{+ RequestPayPrice Low 161 NotTrusted Unencoded+ {+ ObjectData Single+ { ObjectID LLUUID }+ }+}++// PayPriceReply+// sim -> viewer+{+ PayPriceReply Low 162 Trusted Unencoded+ {+ ObjectData Single+ { ObjectID LLUUID }+ { DefaultPayPrice S32 }+ }+ {+ ButtonData Variable+ + { PayButton S32 }+ }+}++// KickUser+// *FIXME*+// Kick off a logged-in user, such as when two people log in with the+// same account name.+// ROUTED dataserver -> userserver -> spaceserver -> simulator -> viewer+// reliable, but that may not matter if a system component is quitting+{+ KickUser Low 163 Trusted Unencoded+ {+ TargetBlock Single+ { TargetIP IPADDR } // U32 encoded IP+ { TargetPort IPPORT }+ }+ {+ UserInfo Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Reason Variable 2 } // string+ }+}++// ack sent from the simulator up to the main database so that login+// can continue.+{+ KickUserAck Low 164 Trusted Unencoded+ {+ UserInfo Single+ { SessionID LLUUID }+ { Flags U32 }+ }+}++// GodKickUser+// When a god wants someone kicked+// viewer -> sim+// reliable+{+ GodKickUser Low 165 NotTrusted Unencoded+ {+ UserInfo Single+ { GodID LLUUID }+ { GodSessionID LLUUID }+ { AgentID LLUUID }+ { KickFlags U32 }+ { Reason Variable 2 } // string+ }+}++// SystemKickUser+// user->space, reliable+{+ SystemKickUser Low 166 Trusted Unencoded+ {+ AgentInfo Variable+ { AgentID LLUUID }+ }+}++// EjectUser+// viewer -> sim+// reliable+{+ EjectUser Low 167 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { TargetID LLUUID }+ { Flags U32 }+ }+}++// FreezeUser+// Freeze someone who is on my land.+// viewer -> sim+// reliable+{+ FreezeUser Low 168 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { TargetID LLUUID }+ { Flags U32 }+ }+}+++// AvatarPropertiesRequest+// viewer -> simulator+// reliable+{+ AvatarPropertiesRequest Low 169 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { AvatarID LLUUID }+ }+}++// AvatarPropertiesRequestBackend+// simulator -> dataserver+// reliable+{+ AvatarPropertiesRequestBackend Low 170 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { AvatarID LLUUID }+ { GodLevel U8 }+ { WebProfilesDisabled BOOL }+ }+}+// AvatarPropertiesReply+// dataserver -> simulator+// simulator -> viewer+// reliable+{+ AvatarPropertiesReply Low 171 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID } // your id+ { AvatarID LLUUID } // avatar you're asking about+ }+ {+ PropertiesData Single+ { ImageID LLUUID }+ { FLImageID LLUUID }+ { PartnerID LLUUID }+ { AboutText Variable 2 } // string, up to 512+ { FLAboutText Variable 1 } // string+ { BornOn Variable 1 } // string+ { ProfileURL Variable 1 } // string+ { CharterMember Variable 1 } // special - usually U8+ { Flags U32 }+ }+}++{+ AvatarInterestsReply Low 172 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID } // your id+ { AvatarID LLUUID } // avatar you're asking about+ }+ {+ PropertiesData Single+ { WantToMask U32 }+ { WantToText Variable 1 } // string+ { SkillsMask U32 }+ { SkillsText Variable 1 } // string+ { LanguagesText Variable 1 } // string+ }+}++// AvatarGroupsReply+// dataserver -> simulator+// simulator -> viewer+// reliable+{+ AvatarGroupsReply Low 173 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID } // your id+ { AvatarID LLUUID } // avatar you're asking about+ }+ {+ GroupData Variable+ { GroupPowers U64 }+ { AcceptNotices BOOL }+ { GroupTitle Variable 1 }+ { GroupID LLUUID }+ { GroupName Variable 1 }+ { GroupInsigniaID LLUUID }+ }+ {+ NewGroupData Single+ { ListInProfile BOOL } // whether group displays in profile+ }+}+++// AvatarPropertiesUpdate+// viewer -> simulator+// reliable+{+ AvatarPropertiesUpdate Low 174 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ PropertiesData Single+ { ImageID LLUUID }+ { FLImageID LLUUID }+ { AboutText Variable 2 } // string, up to 512+ { FLAboutText Variable 1 }+ { AllowPublish BOOL } // whether profile is externally visible or not+ { MaturePublish BOOL } // profile is "mature"+ { ProfileURL Variable 1 } // string+ }+}++// AvatarInterestsUpdate+// viewer -> simulator+// reliable+{+ AvatarInterestsUpdate Low 175 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ PropertiesData Single+ { WantToMask U32 }+ { WantToText Variable 1 } // string+ { SkillsMask U32 }+ { SkillsText Variable 1 } // string+ { LanguagesText Variable 1 } // string + }+}++++// AvatarNotesReply+// dataserver -> simulator+// simulator -> viewer+// reliable+{+ AvatarNotesReply Low 176 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ Data Single+ { TargetID LLUUID }+ { Notes Variable 2 } // string+ }+}+++// AvatarNotesUpdate+// viewer -> simulator -> dataserver+// reliable+{+ AvatarNotesUpdate Low 177 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { TargetID LLUUID }+ { Notes Variable 2 } // string+ }+}+++// AvatarPicksReply+// dataserver -> simulator -> viewer+// Send the header information for this avatar's picks+// This fills in the tabs of the Picks panel.+// reliable+{+ AvatarPicksReply Low 178 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { TargetID LLUUID }+ }+ {+ Data Variable+ { PickID LLUUID }+ { PickName Variable 1 } // string+ }+}+++// EventInfoRequest+// viewer -> simulator+// simulator -> dataserver+// reliable+{+ EventInfoRequest Low 179 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ EventData Single+ { EventID U32 }+ }+}+++// EventInfoReply+// dataserver -> simulator+// simulator -> viewer+// reliable+{+ EventInfoReply Low 180 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ EventData Single+ { EventID U32 }+ { Creator Variable 1 }+ { Name Variable 1 }+ { Category Variable 1 }+ { Desc Variable 2 }+ { Date Variable 1 }+ { DateUTC U32 }+ { Duration U32 }+ { Cover U32 }+ { Amount U32 }+ { SimName Variable 1 }+ { GlobalPos LLVector3d }+ { EventFlags U32 }+ }+}+++// EventNotificationAddRequest+// viewer -> simulator+// simulator -> dataserver+// reliable+{+ EventNotificationAddRequest Low 181 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ EventData Single+ { EventID U32 }+ }+}+++// EventNotificationRemoveRequest+// viewer -> simulator+// simulator -> dataserver+// reliable+{+ EventNotificationRemoveRequest Low 182 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ EventData Single+ { EventID U32 }+ }+}++// EventGodDelete+// viewer -> simulator+// simulator -> dataserver+// QueryData is used to resend a search result after the deletion+// reliable+{+ EventGodDelete Low 183 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ EventData Single+ { EventID U32 }+ }+ {+ QueryData Single+ { QueryID LLUUID }+ { QueryText Variable 1 }+ { QueryFlags U32 }+ { QueryStart S32 } // prev/next page support+ }+}+++// PickInfoReply+// dataserver -> simulator+// simulator -> viewer+// reliable+{+ PickInfoReply Low 184 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ Data Single+ { PickID LLUUID }+ { CreatorID LLUUID }+ { TopPick BOOL }+ { ParcelID LLUUID }+ { Name Variable 1 }+ { Desc Variable 2 }+ { SnapshotID LLUUID }+ { User Variable 1 }+ { OriginalName Variable 1 }+ { SimName Variable 1 }+ { PosGlobal LLVector3d }+ { SortOrder S32 }+ { Enabled BOOL }+ }+}+++// PickInfoUpdate+// Update a pick. ParcelID is set on the simulator as the message+// passes through.+// If TopPick is TRUE, the simulator will only pass on the message+// if the agent_id is a god.+// viewer -> simulator -> dataserver+// reliable+{+ PickInfoUpdate Low 185 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { PickID LLUUID }+ { CreatorID LLUUID }+ { TopPick BOOL }+ { ParcelID LLUUID }+ { Name Variable 1 }+ { Desc Variable 2 }+ { SnapshotID LLUUID }+ { PosGlobal LLVector3d }+ { SortOrder S32 }+ { Enabled BOOL }+ }+}+++// PickDelete+// Delete a non-top pick from the database.+// viewer -> simulator -> dataserver+// reliable+{+ PickDelete Low 186 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { PickID LLUUID }+ }+}++// PickGodDelete+// Delete a pick from the database.+// QueryID is needed so database can send a repeat list of +// picks.+// viewer -> simulator -> dataserver+// reliable+{+ PickGodDelete Low 187 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { PickID LLUUID }+ { QueryID LLUUID }+ }+}+++// ScriptQuestion+// reliable+{+ ScriptQuestion Low 188 Trusted Unencoded+ {+ Data Single+ { TaskID LLUUID }+ { ItemID LLUUID }+ { ObjectName Variable 1 }+ { ObjectOwner Variable 1 }+ { Questions S32 }+ }+}++// ScriptControlChange+// reliable+{+ ScriptControlChange Low 189 Trusted Unencoded+ {+ Data Variable+ { TakeControls BOOL }+ { Controls U32 }+ { PassToAgent BOOL }+ }+}++// ScriptDialog+// sim -> viewer+// reliable+{+ ScriptDialog Low 190 Trusted Zerocoded+ {+ Data Single+ { ObjectID LLUUID }+ { FirstName Variable 1 }+ { LastName Variable 1 }+ { ObjectName Variable 1 }+ { Message Variable 2 }+ { ChatChannel S32 }+ { ImageID LLUUID }+ }+ {+ Buttons Variable+ { ButtonLabel Variable 1 }+ }+}+++// ScriptDialogReply+// viewer -> sim+// reliable+{+ ScriptDialogReply Low 191 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { ObjectID LLUUID }+ { ChatChannel S32 }+ { ButtonIndex S32 }+ { ButtonLabel Variable 1 }+ }+}+++// ForceScriptControlRelease+// reliable+{+ ForceScriptControlRelease Low 192 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}++// RevokePermissions+// reliable+{+ RevokePermissions Low 193 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { ObjectID LLUUID }+ { ObjectPermissions U32 }+ }+}++// LoadURL+// sim -> viewer+// Ask the user if they would like to load a URL+// reliable+{+ LoadURL Low 194 Trusted Unencoded+ {+ Data Single+ { ObjectName Variable 1 }+ { ObjectID LLUUID }+ { OwnerID LLUUID }+ { OwnerIsGroup BOOL }+ { Message Variable 1 }+ { URL Variable 1 }+ }+}++// ScriptTeleportRequest+// reliable+{+ ScriptTeleportRequest Low 195 Trusted Unencoded+ {+ Data Single+ { ObjectName Variable 1 }+ { SimName Variable 1 }+ { SimPosition LLVector3 }+ { LookAt LLVector3 }+ }+}+++++// ***************************************************************************+// Land Parcel system+// ***************************************************************************++// ParcelOverlay+// We send N packets per region to the viewer.+// N = 4, currently. At 256x256 meter regions, 4x4 meter parcel grid,+// there are 4096 parcel units per region. At N = 4, that's 1024 units+// per packet, allowing 8 bit bytes.+// sim -> viewer+// reliable+{+ ParcelOverlay Low 196 Trusted Zerocoded+ {+ ParcelData Single+ { SequenceID S32 } // 0...3, which piece of region+ { Data Variable 2 } // packed bit-field, (grids*grids)/N+ }+}+++// ParcelPropertiesRequest+// SequenceID should be -1 or -2, and is echoed back in the+// parcel properties message.+// viewer -> sim+// reliable+{+ ParcelPropertiesRequest Medium 11 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { SequenceID S32 }+ { West F32 }+ { South F32 }+ { East F32 }+ { North F32 }+ { SnapSelection BOOL }+ }+}++// ParcelPropertiesRequestByID+// viewer -> sim+// reliable+{+ ParcelPropertiesRequestByID Low 197 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { SequenceID S32 }+ { LocalID S32 }+ }+}++// ParcelProperties+// sequence id = -1 for parcels that you explicitly selected+// For agents, sequence id increments every time the agent transits into+// a new parcel. It is used to detect out-of-order agent parcel info updates.+// Bitmap = packed bit field, one bit per parcel grid, on if that grid is+// part of the selected parcel.+// sim -> viewer+// WARNING: This packet is potentially large. With max length name,+// description, music URL and media URL, it is 1526 + sizeof ( LLUUID ) bytes.+{+ ParcelProperties High 23 Trusted Zerocoded+ {+ ParcelData Single+ { RequestResult S32 }+ { SequenceID S32 }+ { SnapSelection BOOL }+ { SelfCount S32 }+ { OtherCount S32 }+ { PublicCount S32 }+ { LocalID S32 }+ { OwnerID LLUUID }+ { IsGroupOwned BOOL }+ { AuctionID U32 }+ { ClaimDate S32 } // time_t+ { ClaimPrice S32 }+ { RentPrice S32 }+ { AABBMin LLVector3 }+ { AABBMax LLVector3 }+ { Bitmap Variable 2 } // packed bit-field+ { Area S32 }+ { Status U8 } // owned vs. pending+ { SimWideMaxPrims S32 }+ { SimWideTotalPrims S32 }+ { MaxPrims S32 }+ { TotalPrims S32 }+ { OwnerPrims S32 }+ { GroupPrims S32 }+ { OtherPrims S32 }+ { SelectedPrims S32 }+ { ParcelPrimBonus F32 }++ { OtherCleanTime S32 }++ { ParcelFlags U32 }+ { SalePrice S32 }+ { Name Variable 1 } // string+ { Desc Variable 1 } // string+ { MusicURL Variable 1 } // string+ { MediaURL Variable 1 } // string+ { MediaID LLUUID }+ { MediaAutoScale U8 }+ { GroupID LLUUID }+ { PassPrice S32 }+ { PassHours F32 }+ { Category U8 }+ { AuthBuyerID LLUUID }+ { SnapshotID LLUUID }+ { UserLocation LLVector3 }+ { UserLookAt LLVector3 }+ { LandingType U8 }+ { RegionPushOverride BOOL }+ { RegionDenyAnonymous BOOL }+ { RegionDenyIdentified BOOL }+ { RegionDenyTransacted BOOL }+ }+ {+ AgeVerificationBlock Single+ { RegionDenyAgeUnverified BOOL }+ }+}++// ParcelPropertiesUpdate+// viewer -> sim+// reliable+{+ ParcelPropertiesUpdate Low 198 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { LocalID S32 }+ { Flags U32 }++ { ParcelFlags U32 }+ { SalePrice S32 }+ { Name Variable 1 } // string+ { Desc Variable 1 } // string+ { MusicURL Variable 1 } // string+ { MediaURL Variable 1 } // string+ { MediaID LLUUID }+ { MediaAutoScale U8 }+ { GroupID LLUUID }+ { PassPrice S32 }+ { PassHours F32 }+ { Category U8 }+ { AuthBuyerID LLUUID }+ { SnapshotID LLUUID }+ { UserLocation LLVector3 }+ { UserLookAt LLVector3 }+ { LandingType U8 }+ }+}++// ParcelReturnObjects+// viewer -> sim+// reliable+{+ ParcelReturnObjects Low 199 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { LocalID S32 }+ { ReturnType U32 }+ }+ {+ TaskIDs Variable+ { TaskID LLUUID }+ }+ {+ OwnerIDs Variable+ { OwnerID LLUUID }+ }+}++// ParcelSetOtherCleanTime+// viewer -> sim+// reliable+{+ ParcelSetOtherCleanTime Low 200 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { LocalID S32 }+ { OtherCleanTime S32 }+ }+}+++// Disable makes objects nonphysical and turns off their scripts.+// ParcelDisableObjects+// viewer -> sim+// reliable+{+ ParcelDisableObjects Low 201 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { LocalID S32 }+ { ReturnType U32 }+ }+ {+ TaskIDs Variable+ { TaskID LLUUID }+ }+ {+ OwnerIDs Variable+ { OwnerID LLUUID }+ }+}+++// ParcelSelectObjects+// viewer -> sim+// reliable+{+ ParcelSelectObjects Low 202 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { LocalID S32 }+ { ReturnType U32 }+ }+ {+ ReturnIDs Variable+ { ReturnID LLUUID }+ }+}+++// EstateCovenantRequest+// viewer -> sim+// reliable+{+ EstateCovenantRequest Low 203 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}++// EstateCovenantReply+// sim -> viewer+// reliable+{+ EstateCovenantReply Low 204 Trusted Unencoded+ {+ Data Single+ { CovenantID LLUUID }+ { CovenantTimestamp U32 }+ { EstateName Variable 1 } // string+ { EstateOwnerID LLUUID }+ }+}+++// ForceObjectSelect+// sim -> viewer+// reliable+{+ ForceObjectSelect Low 205 Trusted Unencoded+ {+ Header Single+ { ResetList BOOL }+ }+ {+ Data Variable+ { LocalID U32 }+ }+}+++// ParcelBuyPass - purchase a temporary access pass+// viewer -> sim+// reliable+{+ ParcelBuyPass Low 206 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { LocalID S32 }+ }+}++// ParcelDeedToGroup - deed a patch of land to a group+// viewer -> sim+// reliable+{+ ParcelDeedToGroup Low 207 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { GroupID LLUUID }+ { LocalID S32 } // parcel id+ }+}++// reserved for when island owners force re-claim parcel+{+ ParcelReclaim Low 208 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { LocalID S32 } // parcel id+ }+}++// ParcelClaim - change the owner of a patch of land+// viewer -> sim+// reliable+{+ ParcelClaim Low 209 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { GroupID LLUUID }+ { IsGroupOwned BOOL }+ { Final BOOL } // true if buyer is in tier+ }+ {+ ParcelData Variable+ { West F32 }+ { South F32 }+ { East F32 }+ { North F32 }+ }+}++// ParcelJoin - Take all parcels which are owned by agent and inside+// rectangle, and make them 1 parcel if they all are leased.+// viewer -> sim+// reliable+{+ ParcelJoin Low 210 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { West F32 }+ { South F32 }+ { East F32 }+ { North F32 }+ }+}++// ParcelDivide+// If the selection is a subsection of exactly one parcel,+// chop out that section and make a new parcel of it.+// viewer -> sim+// reliable+{+ ParcelDivide Low 211 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { West F32 }+ { South F32 }+ { East F32 }+ { North F32 }+ }+}++// ParcelRelease+// Release a parcel to public+// viewer -> sim+// reliable+{+ ParcelRelease Low 212 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { LocalID S32 } // parcel ID+ }+}++// ParcelBuy - change the owner of a patch of land.+// viewer -> sim+// reliable+{+ ParcelBuy Low 213 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { GroupID LLUUID }+ { IsGroupOwned BOOL }+ { RemoveContribution BOOL }+ { LocalID S32 }+ { Final BOOL } // true if buyer is in tier+ }+ {+ ParcelData Single+ { Price S32 }+ { Area S32 }+ }+}+++// ParcelGodForceOwner Unencoded+{+ ParcelGodForceOwner Low 214 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { OwnerID LLUUID }+ { LocalID S32 } // parcel ID+ }+}+++// viewer -> sim+// ParcelAccessListRequest+{+ ParcelAccessListRequest Low 215 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { SequenceID S32 }+ { Flags U32 }+ { LocalID S32 }+ }+}+++// sim -> viewer+// ParcelAccessListReply+{+ ParcelAccessListReply Low 216 Trusted Zerocoded+ {+ Data Single+ { AgentID LLUUID }+ { SequenceID S32 }+ { Flags U32 }+ { LocalID S32 }+ }+ {+ List Variable+ { ID LLUUID }+ { Time S32 } // time_t+ { Flags U32 }+ }+}++// viewer -> sim+// ParcelAccessListUpdate+{+ ParcelAccessListUpdate Low 217 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { Flags U32 }+ { LocalID S32 }+ { TransactionID LLUUID }+ { SequenceID S32 }+ { Sections S32 }+ }+ {+ List Variable+ { ID LLUUID }+ { Time S32 } // time_t+ { Flags U32 }+ }+}+++// viewer -> sim -> dataserver+// reliable+{+ ParcelDwellRequest Low 218 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { LocalID S32 }+ { ParcelID LLUUID } // filled in on sim+ }+}+++// dataserver -> sim -> viewer+// reliable+{+ ParcelDwellReply Low 219 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ Data Single+ { LocalID S32 }+ { ParcelID LLUUID }+ { Dwell F32 }+ }+}++// sim -> dataserver+// This message is used to check if a user can buy a parcel. If+// successful, the transaction is approved through a money balance reply+// with the same transaction id. +{+ RequestParcelTransfer Low 220 Trusted Zerocoded+ {+ Data Single+ { TransactionID LLUUID }+ { TransactionTime U32 } // utc seconds since epoch+ { SourceID LLUUID }+ { DestID LLUUID }+ { OwnerID LLUUID }+ { Flags U8 } // see lltransactiontypes.h+ { TransactionType S32 } // see lltransactiontypes.h+ { Amount S32 }+ { BillableArea S32 }+ { ActualArea S32 }+ { Final BOOL } // true if buyer should be in tier+ }+}++// sim ->dataserver+// This message is used to send up complete parcel properties for+// persistance in the database.+// If you add something here, you should probably also change the+// simulator's database update query on startup.+{+ UpdateParcel Low 221 Trusted Zerocoded+ {+ ParcelData Single+ { ParcelID LLUUID }+ { RegionHandle U64 }+ { OwnerID LLUUID }+ { GroupOwned BOOL }+ { Status U8 }+ { Name Variable 1 }+ { Description Variable 1 }+ { MusicURL Variable 1 }+ { RegionX F32 }+ { RegionY F32 }+ { ActualArea S32 }+ { BillableArea S32 }+ { ShowDir BOOL }+ { IsForSale BOOL }+ { Category U8 }+ { SnapshotID LLUUID }+ { UserLocation LLVector3 }+ { SalePrice S32 }+ { AuthorizedBuyerID LLUUID }+ { AllowPublish BOOL }+ { MaturePublish BOOL }+ }+}++// sim -> dataserver or space ->sim+// This message is used to tell the dataserver that a parcel has been+// removed.+{+ RemoveParcel Low 222 Trusted Unencoded+ {+ ParcelData Variable+ { ParcelID LLUUID }+ }+}++// sim -> dataserver+// Merges some of the database information for parcels (dwell).+{+ MergeParcel Low 223 Trusted Unencoded+ {+ MasterParcelData Single+ { MasterID LLUUID }+ }+ {+ SlaveParcelData Variable+ { SlaveID LLUUID }+ }+}++// sim -> dataserver+{+ LogParcelChanges Low 224 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ RegionData Single+ { RegionHandle U64 }+ }+ {+ ParcelData Variable+ { ParcelID LLUUID }+ { OwnerID LLUUID }+ { IsOwnerGroup BOOL }+ { ActualArea S32 }+ { Action S8 }+ { TransactionID LLUUID }+ }+}++// sim -> dataserver+{+ CheckParcelSales Low 225 Trusted Unencoded+ {+ RegionData Variable+ { RegionHandle U64 }+ }+}++// dataserver -> simulator+// tell a particular simulator to finish parcel sale.+{+ ParcelSales Low 226 Trusted Unencoded+ {+ ParcelData Variable+ { ParcelID LLUUID }+ { BuyerID LLUUID }+ }+}++// viewer -> sim+// mark parcel and double secret agent content on parcel as owned by+// governor/maint and adjusts permissions approriately. Godlike request.+{+ ParcelGodMarkAsContent Low 227 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { LocalID S32 }+ }+}+++// viewer -> sim+// start an auction. viewer fills in the appropriate date, simulator+// validates and fills in the rest of the information to start an auction+// on a parcel. Processing currently requires that AgentID is a god.+{+ ViewerStartAuction Low 228 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ParcelData Single+ { LocalID S32 }+ { SnapshotID LLUUID }+ }+}++// sim -> dataserver+// Once all of the data has been gathered, +{+ StartAuction Low 229 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ ParcelData Single+ { ParcelID LLUUID }+ { SnapshotID LLUUID }+ { Name Variable 1 } // string+ }+}++// dataserver -> sim+{+ ConfirmAuctionStart Low 230 Trusted Unencoded+ {+ AuctionData Single+ { ParcelID LLUUID }+ { AuctionID U32 }+ }+}++// sim -> dataserver+// Tell the dataserver that an auction has completed.+{+ CompleteAuction Low 231 Trusted Unencoded+ {+ ParcelData Variable+ { ParcelID LLUUID }+ }+}++// Tell the dataserver that an auction has been canceled.+{+ CancelAuction Low 232 Trusted Unencoded+ {+ ParcelData Variable+ { ParcelID LLUUID }+ }+}++// sim -> dataserver+{+ CheckParcelAuctions Low 233 Trusted Unencoded+ {+ RegionData Variable+ { RegionHandle U64 }+ }+}++// dataserver -> sim+// tell a particular simulator to finish parcel sale.+{+ ParcelAuctions Low 234 Trusted Unencoded+ {+ ParcelData Variable+ { ParcelID LLUUID }+ { WinnerID LLUUID }+ }+}++// ***************************************************************************+// UUID to name lookup+// ***************************************************************************++// UUIDNameRequest+// Translate a UUID into first and last names+{+ UUIDNameRequest Low 235 NotTrusted Unencoded+ {+ UUIDNameBlock Variable+ { ID LLUUID }+ }+}++// UUIDNameReply+// Translate a UUID into first and last names+{+ UUIDNameReply Low 236 Trusted Unencoded+ {+ UUIDNameBlock Variable+ { ID LLUUID }+ { FirstName Variable 1 }+ { LastName Variable 1 }+ }+}++// UUIDGroupNameRequest+// Translate a UUID into a group name+{+ UUIDGroupNameRequest Low 237 NotTrusted Unencoded+ {+ UUIDNameBlock Variable+ { ID LLUUID }+ }+}++// UUIDGroupNameReply+// Translate a UUID into a group name+{+ UUIDGroupNameReply Low 238 Trusted Unencoded+ { + UUIDNameBlock Variable+ { ID LLUUID }+ { GroupName Variable 1 }+ }+}++// end uuid to name lookup++// ***************************************************************************+// Simulator to Simulator Messages+// ***************************************************************************++// ChatPass+// Chat message transmission to neighbors+// Chat is region local to receiving simulator.+// Type is one of CHAT_TYPE_NORMAL, _WHISPER, _SHOUT+{+ ChatPass Low 239 Trusted Zerocoded+ {+ ChatData Single+ { Channel S32 }+ { Position LLVector3 }+ { ID LLUUID }+ { OwnerID LLUUID }+ { Name Variable 1 }+ { SourceType U8 }+ { Type U8 }+ { Radius F32 }+ { SimAccess U8 }+ { Message Variable 2 }+ }+}++// Edge data - compressed edge data++{+ EdgeDataPacket High 24 Trusted Zerocoded+ {+ EdgeData Single+ { LayerType U8 }+ { Direction U8 }+ { LayerData Variable 2 }+ }+}++// Sim status, condition of this sim+// sent reliably, when dirty+{+ SimStatus Medium 12 Trusted Unencoded+ {+ SimStatus Single+ { CanAcceptAgents BOOL }+ { CanAcceptTasks BOOL }+ }+}++// Child Agent Update - agents send child agents to neighboring simulators.+// This will create a child camera if there isn't one at the target already+// Can't send viewer IP and port between simulators -- the port may get remapped+// if the viewer is behind a Network Address Translation (NAT) box.+//+// Note: some of the fields of this message really only need to be sent when an +// agent crosses a region boundary and changes from a child to a main agent+// (such as Head/BodyRotation, ControlFlags, Animations etc)+// simulator -> simulator+// reliable+{+ ChildAgentUpdate High 25 Trusted Zerocoded+ {+ AgentData Single+ + { RegionHandle U64 }+ { ViewerCircuitCode U32 }+ { AgentID LLUUID }+ { SessionID LLUUID }+ + { AgentPos LLVector3 }+ { AgentVel LLVector3 }+ { Center LLVector3 }+ { Size LLVector3 }+ { AtAxis LLVector3 }+ { LeftAxis LLVector3 }+ { UpAxis LLVector3 }+ { ChangedGrid BOOL } // BOOL+ + { Far F32 }+ { Aspect F32 }+ { Throttles Variable 1 }+ { LocomotionState U32 }+ { HeadRotation LLQuaternion }+ { BodyRotation LLQuaternion }+ { ControlFlags U32 }+ { EnergyLevel F32 }+ { GodLevel U8 } // Changed from BOOL to U8, and renamed GodLevel (from Godlike)+ { AlwaysRun BOOL }+ { PreyAgent LLUUID }+ { AgentAccess U8 }+ { AgentTextures Variable 2 }+ { ActiveGroupID LLUUID } + }+ {+ GroupData Variable+ { GroupID LLUUID }+ { GroupPowers U64 }+ { AcceptNotices BOOL }+ }+ { + AnimationData Variable+ { Animation LLUUID }+ { ObjectID LLUUID }+ }+ {+ GranterBlock Variable+ { GranterID LLUUID }+ }+ {+ NVPairData Variable+ { NVPairs Variable 2 }+ }+ {+ VisualParam Variable+ { ParamValue U8 }+ }+}++// ChildAgentAlive+// sent to child agents just to keep them alive+{+ ChildAgentAlive High 26 Trusted Unencoded+ {+ AgentData Single+ { RegionHandle U64 }+ { ViewerCircuitCode U32 }+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}++// ChildAgentPositionUpdate+// sent to child agents just to keep them alive+{+ ChildAgentPositionUpdate High 27 Trusted Unencoded+ {+ AgentData Single++ { RegionHandle U64 }+ { ViewerCircuitCode U32 }+ { AgentID LLUUID }+ { SessionID LLUUID }++ { AgentPos LLVector3 }+ { AgentVel LLVector3 }+ { Center LLVector3 }+ { Size LLVector3 }+ { AtAxis LLVector3 }+ { LeftAxis LLVector3 }+ { UpAxis LLVector3 }+ { ChangedGrid BOOL }+ }+}+++// Obituary for child agents - make sure the parent know the child is dead+// This way, children can be reliably restarted+{+ ChildAgentDying Low 240 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}+++// This is sent if a full child agent hasn't been accepted yet+{+ ChildAgentUnknown Low 241 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}+++// This message is sent how objects get passed between regions.+{+ AtomicPassObject High 28 Trusted Unencoded+ {+ TaskData Single+ { TaskID LLUUID }+ { AttachmentNeedsSave BOOL } // true iff is attachment and needs asset saved+ }+}+++// KillChildAgents - A new agent has connected to the simulator . . . make sure that any old child cameras are blitzed+{+ KillChildAgents Low 242 Trusted Unencoded+ {+ IDBlock Single+ { AgentID LLUUID }+ }+}+++// GetScriptRunning - asks if a script is running or not. the simulator+// responds with ScriptRunningReply+{+ GetScriptRunning Low 243 NotTrusted Unencoded+ {+ Script Single+ { ObjectID LLUUID }+ { ItemID LLUUID }+ }+}++// ScriptRunningReply - response from simulator to message above+{+ ScriptRunningReply Low 244 NotTrusted Unencoded UDPDeprecated+ {+ Script Single+ { ObjectID LLUUID }+ { ItemID LLUUID }+ { Running BOOL }+// { Mono BOOL } Added to LLSD message+ }+}+++// SetScriptRunning - makes a script active or inactive (Enable may be+// true or false)+{+ SetScriptRunning Low 245 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Script Single+ { ObjectID LLUUID }+ { ItemID LLUUID }+ { Running BOOL }+ }+}++// ScriptReset - causes a script to reset+{+ ScriptReset Low 246 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Script Single+ { ObjectID LLUUID }+ { ItemID LLUUID }+ }+}++// ScriptSensorRequest - causes the receiving sim to run a script sensor and return the results+{+ ScriptSensorRequest Low 247 Trusted Zerocoded+ {+ Requester Single+ { SourceID LLUUID }+ { RequestID LLUUID }+ { SearchID LLUUID }+ { SearchPos LLVector3 }+ { SearchDir LLQuaternion }+ { SearchName Variable 1 }+ { Type S32 }+ { Range F32 }+ { Arc F32 }+ { RegionHandle U64 }+ { SearchRegions U8 }+ }+}++// ScriptSensorReply - returns the request script search information back to the requester+{+ ScriptSensorReply Low 248 Trusted Zerocoded+ {+ Requester Single+ { SourceID LLUUID }+ }+ {+ SensedData Variable+ { ObjectID LLUUID }+ { OwnerID LLUUID }+ { GroupID LLUUID }+ { Position LLVector3 }+ { Velocity LLVector3 }+ { Rotation LLQuaternion }+ { Name Variable 1 }+ { Type S32 }+ { Range F32 }+ }+}++//-----------------------------------------------------------------------------+// Login and Agent Motion+//-----------------------------------------------------------------------------++// viewer -> sim+// agent is coming into the region. The region should be expecting the+// agent.+{+ CompleteAgentMovement Low 249 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { CircuitCode U32 }+ }+}++// sim -> viewer+{+ AgentMovementComplete Low 250 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { Position LLVector3 }+ { LookAt LLVector3 }+ { RegionHandle U64 }+ { Timestamp U32 }+ }+ {+ SimData Single+ { ChannelVersion Variable 2 }+ }+}+++//-----------------------------------------------------------------------------+// Logout+//-----------------------------------------------------------------------------++// userserver -> dataserver+{+ DataServerLogout Low 251 Trusted Unencoded+ {+ UserData Single+ { AgentID LLUUID }+ { ViewerIP IPADDR }+ { Disconnect BOOL }+ { SessionID LLUUID }+ }+}++// LogoutRequest+// viewer -> sim+// reliable+{+ LogoutRequest Low 252 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}+++// LogoutReply+// it's ok for the viewer to quit.+// sim -> viewer+// reliable+// Includes inventory items to update with new asset ids+{+ LogoutReply Low 253 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ InventoryData Variable+ { ItemID LLUUID } // null if list is actually empty (but has one entry 'cause it can't have none)+ }+}+++//-----------------------------------------------------------------------------+// Instant Message+//-----------------------------------------------------------------------------++// ImprovedInstantMessage+// This message can potentially route all over the place+// ParentEstateID: parent estate id of the source estate+// RegionID: region id of the source of the IM.+// Position: position of the sender in region local coordinates+// Dialog see llinstantmessage.h for values+// ID May be used by dialog. Interpretation depends on context.+// BinaryBucket May be used by some dialog types+// reliable+{+ ImprovedInstantMessage Low 254 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ MessageBlock Single+ { FromGroup BOOL }+ { ToAgentID LLUUID }+ { ParentEstateID U32 }+ { RegionID LLUUID }+ { Position LLVector3 }+ { Offline U8 }+ { Dialog U8 } // U8 - IM type+ { ID LLUUID }+ { Timestamp U32 }+ { FromAgentName Variable 1 }+ { Message Variable 2 }+ { BinaryBucket Variable 2 }+ }+}++// RetrieveInstantMessages - used to get instant messages that+// were persisted out to the database while the user was offline+{+ RetrieveInstantMessages Low 255 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}++// FindAgent - used to find an agent's global position. I used a+// variable sized LocationBlock so that the message can be recycled with+// minimum new messages and handlers.+{+ FindAgent Low 256 NotTrusted Unencoded+ {+ AgentBlock Single+ { Hunter LLUUID }+ { Prey LLUUID }+ { SpaceIP IPADDR }+ }+ {+ LocationBlock Variable+ { GlobalX F64 }+ { GlobalY F64 }+ }+}++// Set godlike to 1 if you want to become godlike.+// Set godlike to 0 if you want to relinquish god powers.+// viewer -> simulator -> dataserver+// reliable+{+ RequestGodlikePowers Low 257 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ RequestBlock Single+ { Godlike BOOL }+ { Token LLUUID } // viewer packs a null, sim packs token+ }+}++// At the simulator, turn the godlike bit on.+// At the viewer, show the god menu.+// dataserver -> simulator -> viewer+// reliable+{+ GrantGodlikePowers Low 258 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GrantData Single+ { GodLevel U8 }+ { Token LLUUID } // checked on sim, ignored on viewer+ }+}++// GodlikeMessage - generalized construct for Gods to send messages+// around the system. Each Request has it's own internal protocol.+{+ GodlikeMessage Low 259 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { TransactionID LLUUID }+ }+ {+ MethodData Single+ { Method Variable 1 }+ { Invoice LLUUID }+ }+ {+ ParamList Variable+ { Parameter Variable 1 }+ }+}++// EstateOwnerMessage+// format must be identical to above+{+ EstateOwnerMessage Low 260 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { TransactionID LLUUID }+ }+ {+ MethodData Single+ { Method Variable 1 }+ { Invoice LLUUID }+ }+ {+ ParamList Variable+ { Parameter Variable 1 }+ }+}++// GenericMessage+// format must be identical to above+// As above, but don't have to be god or estate owner to send.+{+ GenericMessage Low 261 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { TransactionID LLUUID }+ }+ {+ MethodData Single+ { Method Variable 1 }+ { Invoice LLUUID }+ }+ {+ ParamList Variable+ { Parameter Variable 1 }+ }+}++// ***************************************************************************+// Requests for possessions, acquisition, money, etc+// ***************************************************************************++// request for mute list+{+ MuteListRequest Low 262 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ MuteData Single+ { MuteCRC U32 }+ }+}++// update/add someone in the mute list+{+ UpdateMuteListEntry Low 263 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ MuteData Single+ { MuteID LLUUID }+ { MuteName Variable 1 }+ { MuteType S32 }+ { MuteFlags U32 }+ }+}++// Remove a mute list entry.+{+ RemoveMuteListEntry Low 264 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ MuteData Single+ { MuteID LLUUID }+ { MuteName Variable 1 }+ }+}+++// +// Inventory update messages +// UDP DEPRECATED - Now a viewer capability.++{+ CopyInventoryFromNotecard Low 265 NotTrusted Zerocoded UDPDeprecated+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ NotecardData Single+ { NotecardItemID LLUUID }+ { ObjectID LLUUID }+ }+ {+ InventoryData Variable+ { ItemID LLUUID }+ { FolderID LLUUID }+ }+}++//+// This is used bi-directionally between sim, dataserver, and viewer.+// THIS MESSAGE CAN NOT CREATE NEW INVENTORY ITEMS.+//+{+ UpdateInventoryItem Low 266 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { TransactionID LLUUID }+ }+ {+ InventoryData Variable+ { ItemID LLUUID }+ { FolderID LLUUID }+ { CallbackID U32 } // Async Response+ + { CreatorID LLUUID } // permissions+ { OwnerID LLUUID } // permissions+ { GroupID LLUUID } // permissions+ { BaseMask U32 } // permissions+ { OwnerMask U32 } // permissions+ { GroupMask U32 } // permissions+ { EveryoneMask U32 } // permissions+ { NextOwnerMask U32 } // permissions+ { GroupOwned BOOL } // permissions++ { TransactionID LLUUID } // TransactionID: new assets only+ { Type S8 }+ { InvType S8 }+ { Flags U32 }+ { SaleType U8 }+ { SalePrice S32 }+ { Name Variable 1 }+ { Description Variable 1 }+ { CreationDate S32 }+ { CRC U32 }+ }+}++//+// For sim to request update/create.+// DO NOT ALLOW THIS FROM THE VIEWER.+//+{+ UpdateCreateInventoryItem Low 267 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SimApproved BOOL }+ { TransactionID LLUUID }+ }+ {+ InventoryData Variable+ { ItemID LLUUID }+ { FolderID LLUUID }+ { CallbackID U32 } // Async Response++ { CreatorID LLUUID } // permissions+ { OwnerID LLUUID } // permissions+ { GroupID LLUUID } // permissions+ { BaseMask U32 } // permissions+ { OwnerMask U32 } // permissions+ { GroupMask U32 } // permissions+ { EveryoneMask U32 } // permissions+ { NextOwnerMask U32 } // permissions+ { GroupOwned BOOL } // permissions++ { AssetID LLUUID }+ { Type S8 }+ { InvType S8 }+ { Flags U32 }+ { SaleType U8 }+ { SalePrice S32 }+ { Name Variable 1 }+ { Description Variable 1 }+ { CreationDate S32 }+ { CRC U32 }+ }+}++{+ MoveInventoryItem Low 268 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Stamp BOOL } // should the server re-timestamp?+ }+ {+ InventoryData Variable+ { ItemID LLUUID }+ { FolderID LLUUID }+ { NewName Variable 1 }+ }+}++// copy inventory item by item id to specified destination folder, +// send out bulk inventory update when done.+//+// Inventory items are only unique for {agent, inv_id} pairs;+// the OldItemID needs to be paired with the OldAgentID to+// produce a unique inventory item.+{+ CopyInventoryItem Low 269 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ InventoryData Variable+ { CallbackID U32 } // Async response+ { OldAgentID LLUUID }+ { OldItemID LLUUID }+ { NewFolderID LLUUID }+ { NewName Variable 1 }+ }+}++{+ RemoveInventoryItem Low 270 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ InventoryData Variable+ { ItemID LLUUID }+ }+}++{+ ChangeInventoryItemFlags Low 271 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ InventoryData Variable+ { ItemID LLUUID }+ { Flags U32 }+ }+}++//+// Sim outgoing only (to dataserver, to viewer)+// NOT viewer to sim, sim should not have handler, ever+// This message is currently only uses objects, so the viewer ignores+// the asset id.+{+ SaveAssetIntoInventory Low 272 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ InventoryData Single+ { ItemID LLUUID }+ { NewAssetID LLUUID }+ }+}++{+ CreateInventoryFolder Low 273 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ FolderData Single+ { FolderID LLUUID }+ { ParentID LLUUID }+ { Type S8 }+ { Name Variable 1 }+ }+}++{+ UpdateInventoryFolder Low 274 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ FolderData Variable+ { FolderID LLUUID }+ { ParentID LLUUID }+ { Type S8 }+ { Name Variable 1 }+ }+}++{+ MoveInventoryFolder Low 275 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Stamp BOOL } // should the server re-timestamp children+ }+ {+ InventoryData Variable+ { FolderID LLUUID }+ { ParentID LLUUID }+ }+}++{+ RemoveInventoryFolder Low 276 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ FolderData Variable+ { FolderID LLUUID }+ }+}++// Get inventory segment.+{+ FetchInventoryDescendents Low 277 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ InventoryData Single+ { FolderID LLUUID }+ { OwnerID LLUUID }+ { SortOrder S32 } // 0 = name, 1 = time+ { FetchFolders BOOL } // false will omit folders in query+ { FetchItems BOOL } // false will omit items in query+ }+}++// return inventory segment. +// *NOTE: This could be compressed more since we already know the+// parent_id for folders and the folder_id for items, but this is+// reasonable until we heve server side inventory.+{+ InventoryDescendents Low 278 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { FolderID LLUUID }+ { OwnerID LLUUID } // owner of the folders creatd.+ { Version S32 } // version of the folder for caching+ { Descendents S32 } // count to help with caching+ }+ {+ FolderData Variable+ { FolderID LLUUID }+ { ParentID LLUUID }+ { Type S8 }+ { Name Variable 1 }+ }+ {+ ItemData Variable+ { ItemID LLUUID }+ { FolderID LLUUID }+ { CreatorID LLUUID } // permissions+ { OwnerID LLUUID } // permissions+ { GroupID LLUUID } // permissions+ { BaseMask U32 } // permissions+ { OwnerMask U32 } // permissions+ { GroupMask U32 } // permissions+ { EveryoneMask U32 } // permissions+ { NextOwnerMask U32 } // permissions+ { GroupOwned BOOL } // permissions+ { AssetID LLUUID }+ { Type S8 }+ { InvType S8 }+ { Flags U32 }+ { SaleType U8 }+ { SalePrice S32 }+ { Name Variable 1 }+ { Description Variable 1 }+ { CreationDate S32 }+ { CRC U32 }+ }+}++// Get inventory item(s) - response comes through FetchInventoryReply+{+ FetchInventory Low 279 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ InventoryData Variable+ { OwnerID LLUUID }+ { ItemID LLUUID }+ }+}++// response to fetch inventory+{+ FetchInventoryReply Low 280 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ InventoryData Variable+ { ItemID LLUUID }+ { FolderID LLUUID }++ { CreatorID LLUUID } // permissions+ { OwnerID LLUUID } // permissions+ { GroupID LLUUID } // permissions+ { BaseMask U32 } // permissions+ { OwnerMask U32 } // permissions+ { GroupMask U32 } // permissions+ { EveryoneMask U32 } // permissions+ { NextOwnerMask U32 } // permissions+ { GroupOwned BOOL } // permissions++ { AssetID LLUUID }+ { Type S8 }+ { InvType S8 }+ { Flags U32 }+ { SaleType U8 }+ { SalePrice S32 }+ { Name Variable 1 }+ { Description Variable 1 }+ { CreationDate S32 }+ { CRC U32 }+ }+}++// Can only fit around 7 items per packet - that's the way it goes. At+// least many bulk updates can be packed.+// Only from dataserver->sim->viewer+{+ BulkUpdateInventory Low 281 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { TransactionID LLUUID }+ }+ {+ FolderData Variable+ { FolderID LLUUID }+ { ParentID LLUUID }+ { Type S8 }+ { Name Variable 1 }+ }+ {+ ItemData Variable+ { ItemID LLUUID }+ { CallbackID U32 } // Async Response+ { FolderID LLUUID }+ { CreatorID LLUUID } // permissions+ { OwnerID LLUUID } // permissions+ { GroupID LLUUID } // permissions+ { BaseMask U32 } // permissions+ { OwnerMask U32 } // permissions+ { GroupMask U32 } // permissions+ { EveryoneMask U32 } // permissions+ { NextOwnerMask U32 } // permissions+ { GroupOwned BOOL } // permissions+ { AssetID LLUUID }+ { Type S8 }+ { InvType S8 }+ { Flags U32 }+ { SaleType U8 }+ { SalePrice S32 }+ { Name Variable 1 }+ { Description Variable 1 }+ { CreationDate S32 }+ { CRC U32 }+ }+}++++// request permissions for agent id to get the asset for owner_id's+// item_id.+{+ RequestInventoryAsset Low 282 Trusted Unencoded+ {+ QueryData Single+ { QueryID LLUUID }+ { AgentID LLUUID }+ { OwnerID LLUUID }+ { ItemID LLUUID }+ }+}++// response to RequestInventoryAsset+// lluuid will be null if agentid in the request above cannot read asset+{+ InventoryAssetResponse Low 283 Trusted Unencoded+ {+ QueryData Single+ { QueryID LLUUID }+ { AssetID LLUUID }+ { IsReadable BOOL }+ }+}++// This is the new improved way to remove inventory items. It is+// currently only supported in viewer->userserver->dataserver+// messages typically initiated by an empty trash method.+{+ RemoveInventoryObjects Low 284 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ FolderData Variable+ { FolderID LLUUID }+ }+ {+ ItemData Variable+ { ItemID LLUUID }+ }+}++// This is how you remove inventory when you're not even sure what it+// is - only it's parenting.+{+ PurgeInventoryDescendents Low 285 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ InventoryData Single+ { FolderID LLUUID }+ }+}++// These messages are viewer->simulator requests to update a task's+// inventory.+// if Key == 0, itemid is the key. if Key == 1, assetid is the key.+{+ UpdateTaskInventory Low 286 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ UpdateData Single+ { LocalID U32 }+ { Key U8 }+ }+ {+ InventoryData Single+ { ItemID LLUUID }+ { FolderID LLUUID }+ { CreatorID LLUUID } // permissions+ { OwnerID LLUUID } // permissions+ { GroupID LLUUID } // permissions+ { BaseMask U32 } // permissions+ { OwnerMask U32 } // permissions+ { GroupMask U32 } // permissions+ { EveryoneMask U32 } // permissions+ { NextOwnerMask U32 } // permissions+ { GroupOwned BOOL } // permissions+ { TransactionID LLUUID }+ { Type S8 }+ { InvType S8 }+ { Flags U32 }+ { SaleType U8 }+ { SalePrice S32 }+ { Name Variable 1 }+ { Description Variable 1 }+ { CreationDate S32 }+ { CRC U32 }+ }+}++{+ RemoveTaskInventory Low 287 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ InventoryData Single+ { LocalID U32 }+ { ItemID LLUUID }+ }+}++{+ MoveTaskInventory Low 288 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { FolderID LLUUID }+ }+ {+ InventoryData Single+ { LocalID U32 }+ { ItemID LLUUID }+ }+}++{+ RequestTaskInventory Low 289 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ InventoryData Single+ { LocalID U32 }+ }+}++{+ ReplyTaskInventory Low 290 Trusted Zerocoded+ {+ InventoryData Single+ { TaskID LLUUID }+ { Serial S16 } // S16+ { Filename Variable 1 }+ }+}++// These messages are viewer->simulator requests regarding objects+// which are currently being simulated. The viewer will get an +// UpdateInventoryItem response if a DeRez succeeds, and the object+// will appear if a RezObject succeeds.+// The Destination field tells where the derez should wind up, and the+// meaning of DestinationID depends on it. For example, if the +// destination is a category, then the destination is the category id. If+// the destination is a task inventory, then the destination id is the+// task id.+// The transaction id is generated by the viewer on derez, and then+// the packets are counted and numbered. The rest of the information is+// just duplicated (it's not that much, and derezzes that span multiple+// packets will be rare.)+{+ DeRezObject Low 291 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ AgentBlock Single+ { GroupID LLUUID }+ { Destination U8 }+ { DestinationID LLUUID } // see above+ { TransactionID LLUUID }+ { PacketCount U8 }+ { PacketNumber U8 }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 } // object id in world + }+}++// This message is sent when a derez succeeds, but there's no way to+// know, since no inventory is created on the viewer. For example, when+// saving into task inventory.+{+ DeRezAck Low 292 Trusted Unencoded+ {+ TransactionData Single+ { TransactionID LLUUID }+ { Success BOOL }+ }+}++// This message is sent from viewer -> simulator when the viewer wants+// to rez an object out of inventory.+{+ RezObject Low 293 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ RezData Single+ { FromTaskID LLUUID }+ { BypassRaycast U8 }+ { RayStart LLVector3 }+ { RayEnd LLVector3 }+ { RayTargetID LLUUID }+ { RayEndIsIntersection BOOL }+ { RezSelected BOOL }+ { RemoveItem BOOL }+ { ItemFlags U32 }+ { GroupMask U32 }+ { EveryoneMask U32 }+ { NextOwnerMask U32 }+ }+ {+ InventoryData Single+ { ItemID LLUUID }+ { FolderID LLUUID }+ { CreatorID LLUUID } // permissions+ { OwnerID LLUUID } // permissions+ { GroupID LLUUID } // permissions+ { BaseMask U32 } // permissions+ { OwnerMask U32 } // permissions+ { GroupMask U32 } // permissions+ { EveryoneMask U32 } // permissions+ { NextOwnerMask U32 } // permissions+ { GroupOwned BOOL } // permissions+ { TransactionID LLUUID }+ { Type S8 }+ { InvType S8 }+ { Flags U32 }+ { SaleType U8 }+ { SalePrice S32 }+ { Name Variable 1 }+ { Description Variable 1 }+ { CreationDate S32 }+ { CRC U32 }+ }+}++// This message is sent from viewer -> simulator when the viewer wants+// to rez an object from a notecard.+{+ RezObjectFromNotecard Low 294 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ RezData Single+ { FromTaskID LLUUID }+ { BypassRaycast U8 }+ { RayStart LLVector3 }+ { RayEnd LLVector3 }+ { RayTargetID LLUUID }+ { RayEndIsIntersection BOOL }+ { RezSelected BOOL }+ { RemoveItem BOOL }+ { ItemFlags U32 }+ { GroupMask U32 }+ { EveryoneMask U32 }+ { NextOwnerMask U32 }+ }+ {+ NotecardData Single+ { NotecardItemID LLUUID }+ { ObjectID LLUUID }+ }+ {+ InventoryData Variable+ { ItemID LLUUID }+ }+}+++// sim -> dataserver+// sent during agent to agent inventory transfers+{+ TransferInventory Low 295 Trusted Zerocoded+ {+ InfoBlock Single+ { SourceID LLUUID }+ { DestID LLUUID }+ { TransactionID LLUUID }+ }+ {+ InventoryBlock Variable+ { InventoryID LLUUID }+ { Type S8 }+ }+}++// dataserver -> sim+// InventoryID is the id of the inventory object that the end user+// should discard if they deny the transfer.+{+ TransferInventoryAck Low 296 Trusted Zerocoded+ {+ InfoBlock Single+ { TransactionID LLUUID }+ { InventoryID LLUUID }+ }+}+++{+ AcceptFriendship Low 297 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ TransactionBlock Single+ { TransactionID LLUUID }+ }+ {+ FolderData Variable+ { FolderID LLUUID } // place to put calling card.+ }+}++{+ DeclineFriendship Low 298 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ TransactionBlock Single+ { TransactionID LLUUID }+ }+}++{+ FormFriendship Low 299 Trusted Unencoded+ {+ AgentBlock Single+ { SourceID LLUUID }+ { DestID LLUUID }+ }+}++// Cancels user relationship+// Updates inventory for both users.+// Stops agent tracking in userserver.+// viewer -> userserver -> dataserver+// reliable+{+ TerminateFriendship Low 300 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ExBlock Single+ { OtherID LLUUID }+ }+}++// used to give someone a calling card.+{+ OfferCallingCard Low 301 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ AgentBlock Single+ { DestID LLUUID }+ { TransactionID LLUUID }+ }+}++{+ AcceptCallingCard Low 302 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ TransactionBlock Single+ { TransactionID LLUUID }+ }+ {+ FolderData Variable+ { FolderID LLUUID } // place to put calling card.+ }+}++{+ DeclineCallingCard Low 303 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ TransactionBlock Single+ { TransactionID LLUUID }+ }+}+++// Rez a script onto an object+{+ RezScript Low 304 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ UpdateBlock Single+ { ObjectLocalID U32 } // object id in world + { Enabled BOOL } // is script rezzed in enabled?+ }+ {+ InventoryBlock Single+ { ItemID LLUUID }+ { FolderID LLUUID }+ { CreatorID LLUUID } // permissions+ { OwnerID LLUUID } // permissions+ { GroupID LLUUID } // permissions+ { BaseMask U32 } // permissions+ { OwnerMask U32 } // permissions+ { GroupMask U32 } // permissions+ { EveryoneMask U32 } // permissions+ { NextOwnerMask U32 } // permissions+ { GroupOwned BOOL } // permissions+ { TransactionID LLUUID }+ { Type S8 }+ { InvType S8 }+ { Flags U32 }+ { SaleType U8 }+ { SalePrice S32 }+ { Name Variable 1 }+ { Description Variable 1 }+ { CreationDate S32 }+ { CRC U32 }+ }+}++// Create inventory+{+ CreateInventoryItem Low 305 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ { + InventoryBlock Single+ { CallbackID U32 } // Async Response+ { FolderID LLUUID }+ { TransactionID LLUUID } // Going to become TransactionID+ { NextOwnerMask U32 }+ { Type S8 }+ { InvType S8 }+ { WearableType U8 }+ { Name Variable 1 }+ { Description Variable 1 }+ }+}++// give agent a landmark for an event.+{+ CreateLandmarkForEvent Low 306 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ EventData Single+ { EventID U32 }+ }+ { + InventoryBlock Single+ { FolderID LLUUID }+ { Name Variable 1 }+ }+}++{+ EventLocationRequest Low 307 Trusted Zerocoded+ {+ QueryData Single+ { QueryID LLUUID }+ }+ {+ EventData Single+ { EventID U32 }+ }+}++{+ EventLocationReply Low 308 Trusted Zerocoded+ {+ QueryData Single+ { QueryID LLUUID }+ }+ {+ EventData Single+ { Success BOOL }+ { RegionID LLUUID }+ { RegionPos LLVector3 }+ }+}++// get information about landmarks. Used by viewers for determining+// the location of a landmark, and by simulators for teleport+{+ RegionHandleRequest Low 309 NotTrusted Unencoded+ {+ RequestBlock Single+ { RegionID LLUUID }+ }+}++{+ RegionIDAndHandleReply Low 310 Trusted Unencoded+ {+ ReplyBlock Single+ { RegionID LLUUID }+ { RegionHandle U64 }+ }+}++// Move money from one agent to another. Validation will happen at the+// simulator, the dataserver will actually do the work. Dataserver+// generates a MoneyBalance message in reply. The simulator+// will generate a MoneyTransferBackend in response to this.+// viewer -> simulator -> dataserver +{+ MoneyTransferRequest Low 311 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ MoneyData Single+ { SourceID LLUUID }+ { DestID LLUUID } // destination of the transfer+ { Flags U8 }+ { Amount S32 }+ { AggregatePermNextOwner U8 }+ { AggregatePermInventory U8 }+ { TransactionType S32 } // see lltransactiontypes.h+ { Description Variable 1 } // string, name of item for purchases+ }+}++// And, the money transfer+{+ MoneyTransferBackend Low 312 Trusted Zerocoded+ {+ MoneyData Single+ { TransactionID LLUUID }+ { TransactionTime U32 } // utc seconds since epoch+ { SourceID LLUUID }+ { DestID LLUUID } // destination of the transfer+ { Flags U8 }+ { Amount S32 }+ { AggregatePermNextOwner U8 }+ { AggregatePermInventory U8 }+ { TransactionType S32 } // see lltransactiontypes.h+ { RegionID LLUUID } // region sending the request, for logging+ { GridX U32 } // *HACK: database doesn't have region_id in schema+ { GridY U32 } // *HACK: database doesn't have region_id in schema+ { Description Variable 1 } // string, name of item for purchases+ }+}+++// viewer -> userserver -> dataserver+// Reliable+{+ MoneyBalanceRequest Low 313 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ MoneyData Single+ { TransactionID LLUUID }+ }+}+++// dataserver -> simulator -> viewer+{+ MoneyBalanceReply Low 314 Trusted Zerocoded+ {+ MoneyData Single+ { AgentID LLUUID }+ { TransactionID LLUUID }+ { TransactionSuccess BOOL } // BOOL+ { MoneyBalance S32 }+ { SquareMetersCredit S32 }+ { SquareMetersCommitted S32 }+ { Description Variable 1 } // string+ }+}+++// RoutedMoneyBalanceReply+// This message is used when a dataserver needs to send updated+// money balance information to a simulator other than the one it+// is connected to. It uses the standard TransferBlock format.+// dataserver -> simulator -> spaceserver -> simulator -> viewer+// reliable+{+ RoutedMoneyBalanceReply Low 315 Trusted Zerocoded+ {+ TargetBlock Single+ { TargetIP IPADDR } // U32 encoded IP+ { TargetPort IPPORT }+ }+ {+ MoneyData Single+ { AgentID LLUUID }+ { TransactionID LLUUID }+ { TransactionSuccess BOOL } // BOOL+ { MoneyBalance S32 }+ { SquareMetersCredit S32 }+ { SquareMetersCommitted S32 }+ { Description Variable 1 } // string+ }+}++++//---------------------------------------------------------------------------+// Gesture saves/loads+//---------------------------------------------------------------------------+++// Tell the database that some gestures are now active+// viewer -> sim -> data+{+ ActivateGestures Low 316 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Flags U32 }+ }+ {+ Data Variable+ { ItemID LLUUID }+ { AssetID LLUUID }+ { GestureFlags U32 }+ }+}++// Tell the database some gestures are no longer active+// viewer -> sim -> data+{+ DeactivateGestures Low 317 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Flags U32 }+ }+ {+ Data Variable+ { ItemID LLUUID }+ { GestureFlags U32 }+ }+}++//---------------------------------------------------------------------------+//+//---------------------------------------------------------------------------++// userserver -> viewer, up-to-date inventory is here+// could be sent as a result of spam+// as well as in response to InventoryRequest+//{+// InventoryUpdate Low Trusted Unencoded+// {+// AgentData Single+// { AgentID LLUUID }+// }+// {+// InventoryData Single+// { IsComplete U8 }+// { Filename Variable 1 }+// }+//}++// dataserver-> userserver -> viewer to move around the mute list+{+ MuteListUpdate Low 318 Trusted Unencoded+ {+ MuteData Single+ { AgentID LLUUID }+ { Filename Variable 1 }+ }+}++// tell viewer to use the local mute cache+{+ UseCachedMuteList Low 319 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+}++// Sent from viewer to simulator to set user rights. This message will be+// relayed up to the dataserver through a PUT. If that+// succeeds, an UpdateUserRights will be relayed to the originating+// viewer, and a presence lookup will be performed to find+// agent-related and the same PUT will be issued to the sim host if+// they are online.+{+ GrantUserRights Low 320 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Rights Variable+ { AgentRelated LLUUID }+ { RelatedRights S32 }+ }+}++// This message is sent from the simulator to the viewer to indicate a+// targets granted rights. This is only sent to the originator of the+// request and the target agent if it is a modify or map+// right. Adding/removing online status rights will show up as an+// online/offline notification.+{+ ChangeUserRights Low 321 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ Rights Variable+ { AgentRelated LLUUID }+ { RelatedRights S32 }+ }+}++// notification for login and logout. +// source_sim -> dest_viewer+{+ OnlineNotification Low 322 Trusted Unencoded+ {+ AgentBlock Variable+ { AgentID LLUUID }+ }+}+{+ OfflineNotification Low 323 Trusted Unencoded+ {+ AgentBlock Variable+ { AgentID LLUUID }+ }+}+++// SetStartLocationRequest+// viewer -> sim +// failure checked at sim and triggers ImprovedInstantMessage +// success triggers SetStartLocation +{+ SetStartLocationRequest Low 324 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ StartLocationData Single+ { SimName Variable 1 } // string+ { LocationID U32 }+ { LocationPos LLVector3 } // region coords+ { LocationLookAt LLVector3 }+ }+}++// SetStartLocation+// sim -> dataserver+{+ SetStartLocation Low 325 Trusted Zerocoded+ {+ StartLocationData Single+ { AgentID LLUUID }+ { RegionID LLUUID }+ { LocationID U32 }+ { RegionHandle U64 }+ { LocationPos LLVector3 } // region coords+ { LocationLookAt LLVector3 }+ }+}+++// ***************************************************************************+// Launcher messages+// ***************************************************************************+++// NetTest - This goes back and forth to the space server because of+// problems determining the port+{+ NetTest Low 326 NotTrusted Unencoded+ {+ NetBlock Single+ { Port IPPORT }+ }+}++// SetChildCount - Sent to launcher to adjust nominal child count+// Simulator sends this increase the sim/cpu ratio on startup+{+ SetCPURatio Low 327 NotTrusted Unencoded+ {+ Data Single+ { Ratio U8 }+ }+}++++// SimCrashed - Sent to dataserver when the sim goes down.+// Maybe we should notify the spaceserver as well?+{+ SimCrashed Low 328 NotTrusted Unencoded+ {+ Data Single+ { RegionX U32 }+ { RegionY U32 }+ }+ {+ Users Variable+ { AgentID LLUUID }+ }+}++// ***************************************************************************+// Name Value Pair messages+// ***************************************************************************++// NameValuePair - if the specific task exists on simulator, add or replace this name value pair+{+ NameValuePair Low 329 Trusted Unencoded+ {+ TaskData Single+ { ID LLUUID }+ }+ {+ NameValueData Variable+ { NVPair Variable 2 }+ }+}++// NameValuePair - if the specific task exists on simulator or dataserver, remove the name value pair (value is ignored)+{+ RemoveNameValuePair Low 330 Trusted Unencoded+ {+ TaskData Single+ { ID LLUUID }+ }+ {+ NameValueData Variable+ { NVPair Variable 2 }+ }+}+++// ***************************************************************************+// Add/Remove Attachment messages+// ***************************************************************************++//+// Simulator informs Dataserver of new attachment or attachment asset update +// DO NOT ALLOW THIS FROM THE VIEWER+//+{+ UpdateAttachment Low 331 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ AttachmentBlock Single+ { AttachmentPoint U8 }+ }+ {+ OperationData Single+ { AddItem BOOL }+ { UseExistingAsset BOOL }+ }+ {+ InventoryData Single // Standard inventory item block+ { ItemID LLUUID }+ { FolderID LLUUID }++ { CreatorID LLUUID } // permissions+ { OwnerID LLUUID } // permissions+ { GroupID LLUUID } // permissions+ { BaseMask U32 } // permissions+ { OwnerMask U32 } // permissions+ { GroupMask U32 } // permissions+ { EveryoneMask U32 } // permissions+ { NextOwnerMask U32 } // permissions+ { GroupOwned BOOL } // permissions++ { AssetID LLUUID }+ { Type S8 }+ { InvType S8 }+ { Flags U32 }+ { SaleType U8 }+ { SalePrice S32 }+ { Name Variable 1 }+ { Description Variable 1 }+ { CreationDate S32 }+ { CRC U32 }+ }+}++// Simulator informs Dataserver that attachment has been taken off+{+ RemoveAttachment Low 332 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ AttachmentBlock Single+ { AttachmentPoint U8 }+ { ItemID LLUUID }+ }+}+++// ***************************************************************************+// GUIDed Sound messages+// ***************************************************************************++// SoundTrigger - Sent by simulator to viewer to trigger sound outside current region+{+ SoundTrigger High 29 NotTrusted Unencoded+ {+ SoundData Single+ { SoundID LLUUID }+ { OwnerID LLUUID }+ { ObjectID LLUUID }+ { ParentID LLUUID } // null if this object is the parent+ { Handle U64 } // region handle+ { Position LLVector3 } // region local+ { Gain F32 }+ }+}++// AttachedSound - Sent by simulator to viewer to play sound attached with an object+{+ AttachedSound Medium 13 Trusted Unencoded+ {+ DataBlock Single+ { SoundID LLUUID }+ { ObjectID LLUUID }+ { OwnerID LLUUID }+ { Gain F32 }+ { Flags U8 }+ }+}++// AttachedSoundGainChange - Sent by simulator to viewer to change an attached sounds' volume++{+ AttachedSoundGainChange Medium 14 Trusted Unencoded+ {+ DataBlock Single+ { ObjectID LLUUID }+ { Gain F32 }+ }+}+++// PreloadSound - Sent by simulator to viewer to preload sound for an object++{+ PreloadSound Medium 15 Trusted Unencoded+ {+ DataBlock Variable+ { ObjectID LLUUID }+ { OwnerID LLUUID }+ { SoundID LLUUID }+ }+}+++// *************************************************************************+// Asset storage messages+// *************************************************************************++// current assumes an existing UUID, need to enhance for new assets+{+ AssetUploadRequest Low 333 NotTrusted Unencoded+ {+ AssetBlock Single+ { TransactionID LLUUID }+ { Type S8 }+ { Tempfile BOOL }+ { StoreLocal BOOL }+ { AssetData Variable 2 } // Optional: the actual asset data if the whole thing will fit it this packet+ }+}++{+ AssetUploadComplete Low 334 NotTrusted Unencoded+ {+ AssetBlock Single+ { UUID LLUUID }+ { Type S8 }+ { Success BOOL }+ }+}+++// Script on simulator asks dataserver if there are any email messages+// waiting.+{+ EmailMessageRequest Low 335 Trusted Unencoded+ {+ DataBlock Single+ { ObjectID LLUUID }+ { FromAddress Variable 1 }+ { Subject Variable 1 }+ }+}++// Dataserver gives simulator the oldest email message in the queue, along with+// how many messages are left in the queue. And passes back the filter used to request emails.+{+ EmailMessageReply Low 336 Trusted Unencoded+ {+ DataBlock Single+ { ObjectID LLUUID }+ { More U32 } //U32+ { Time U32 } //U32+ { FromAddress Variable 1 }+ { Subject Variable 1 }+ { Data Variable 2 }+ { MailFilter Variable 1 }+ }+}++// Script on simulator sends mail to another script+{+ InternalScriptMail Medium 16 Trusted Unencoded+ {+ DataBlock Single+ { From Variable 1 }+ { To LLUUID }+ { Subject Variable 1 }+ { Body Variable 2 }+ }+}++// Script on simulator asks dataserver for information +{+ ScriptDataRequest Low 337 Trusted Unencoded+ {+ DataBlock Variable+ { Hash U64 }+ { RequestType S8 }+ { Request Variable 2 }+ }+}++// Data server responds with data+{+ ScriptDataReply Low 338 Trusted Unencoded+ {+ DataBlock Variable+ { Hash U64 } + { Reply Variable 2 }+ }+}+++//-----------------------------------------------------------------------------+// Group messages+//-----------------------------------------------------------------------------++// CreateGroupRequest+// viewer -> simulator+// simulator -> dataserver+// reliable+{+ CreateGroupRequest Low 339 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { Name Variable 1 } // string+ { Charter Variable 2 } // string+ { ShowInList BOOL }+ { InsigniaID LLUUID }+ { MembershipFee S32 } // S32 + { OpenEnrollment BOOL } // BOOL (U8)+ { AllowPublish BOOL } // whether profile is externally visible or not+ { MaturePublish BOOL } // profile is "mature"+ }+}++// CreateGroupReply+// dataserver -> simulator+// simulator -> viewer+// reliable+{+ CreateGroupReply Low 340 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ ReplyData Single+ { GroupID LLUUID }+ { Success BOOL }+ { Message Variable 1 } // string+ }+}++// UpdateGroupInfo+// viewer -> simulator+// simulator -> dataserver+// reliable+{+ UpdateGroupInfo Low 341 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ { Charter Variable 2 } // string+ { ShowInList BOOL }+ { InsigniaID LLUUID }+ { MembershipFee S32 }+ { OpenEnrollment BOOL }+ { AllowPublish BOOL }+ { MaturePublish BOOL }+ }+}++// GroupRoleChanges+// viewer -> simulator -> dataserver+// reliable+{+ GroupRoleChanges Low 342 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ RoleChange Variable+ { RoleID LLUUID }+ { MemberID LLUUID }+ { Change U32 }+ }+}++// JoinGroupRequest+// viewer -> simulator -> dataserver+// reliable+{+ JoinGroupRequest Low 343 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ }+}++// JoinGroupReply+// dataserver -> simulator -> viewer+{+ JoinGroupReply Low 344 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ { Success BOOL }+ }+}+++// EjectGroupMemberRequest+// viewer -> simulator -> dataserver+// reliable+{+ EjectGroupMemberRequest Low 345 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ }+ {+ EjectData Variable+ { EjecteeID LLUUID }+ }+}++// EjectGroupMemberReply+// dataserver -> simulator -> viewer+// reliable+{+ EjectGroupMemberReply Low 346 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ }+ {+ EjectData Single+ { Success BOOL }+ }+}++// LeaveGroupRequest+// viewer -> simulator -> dataserver+// reliable+{+ LeaveGroupRequest Low 347 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ }+}++// LeaveGroupReply+// dataserver -> simulator -> viewer+{+ LeaveGroupReply Low 348 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ { Success BOOL }+ }+}++// InviteGroupRequest+// viewer -> simulator -> dataserver+// reliable+{+ InviteGroupRequest Low 349 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID } // UUID of inviting agent+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ }+ {+ InviteData Variable+ { InviteeID LLUUID }+ { RoleID LLUUID }+ }+}++// InviteGroupResponse+// simulator -> dataserver+// reliable+{+ InviteGroupResponse Low 350 Trusted Unencoded+ {+ InviteData Single+ { AgentID LLUUID }+ { InviteeID LLUUID }+ { GroupID LLUUID }+ { RoleID LLUUID }+ { MembershipFee S32 }+ }+}++// GroupProfileRequest+// viewer-> simulator -> dataserver+// reliable+{+ GroupProfileRequest Low 351 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ }+}++// GroupProfileReply+// dataserver -> simulator -> viewer+// reliable+{+ GroupProfileReply Low 352 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ { Name Variable 1 } // string+ { Charter Variable 2 } // string+ { ShowInList BOOL }+ { MemberTitle Variable 1 } // string+ { PowersMask U64 } // U32 mask+ { InsigniaID LLUUID }+ { FounderID LLUUID }+ { MembershipFee S32 }+ { OpenEnrollment BOOL } // BOOL (U8)+ { Money S32 }+ { GroupMembershipCount S32 }+ { GroupRolesCount S32 }+ { AllowPublish BOOL }+ { MaturePublish BOOL }+ { OwnerRole LLUUID }+ }+}++// CurrentInterval = 0 => this period (week, day, etc.)+// CurrentInterval = 1 => last period+// viewer -> simulator -> dataserver+// reliable+{+ GroupAccountSummaryRequest Low 353 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ MoneyData Single+ { RequestID LLUUID }+ { IntervalDays S32 }+ { CurrentInterval S32 }+ }+}+++// dataserver -> simulator -> viewer+// Reliable+{+ GroupAccountSummaryReply Low 354 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { GroupID LLUUID }+ }+ {+ MoneyData Single+ { RequestID LLUUID }+ { IntervalDays S32 }+ { CurrentInterval S32 }+ { StartDate Variable 1 } // string+ { Balance S32 }+ { TotalCredits S32 }+ { TotalDebits S32 }+ { ObjectTaxCurrent S32 }+ { LightTaxCurrent S32 }+ { LandTaxCurrent S32 }+ { GroupTaxCurrent S32 }+ { ParcelDirFeeCurrent S32 }+ { ObjectTaxEstimate S32 }+ { LightTaxEstimate S32 }+ { LandTaxEstimate S32 }+ { GroupTaxEstimate S32 }+ { ParcelDirFeeEstimate S32 }+ { NonExemptMembers S32 }+ { LastTaxDate Variable 1 } // string+ { TaxDate Variable 1 } // string+ }+}+++// Reliable+{+ GroupAccountDetailsRequest Low 355 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ MoneyData Single+ { RequestID LLUUID }+ { IntervalDays S32 }+ { CurrentInterval S32 }+ }+}++// Reliable+{+ GroupAccountDetailsReply Low 356 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { GroupID LLUUID }+ }+ {+ MoneyData Single+ { RequestID LLUUID }+ { IntervalDays S32 }+ { CurrentInterval S32 }+ { StartDate Variable 1 } // string+ }+ {+ HistoryData Variable+ { Description Variable 1 } // string+ { Amount S32 }+ }+}+++// Reliable+{+ GroupAccountTransactionsRequest Low 357 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ MoneyData Single+ { RequestID LLUUID }+ { IntervalDays S32 }+ { CurrentInterval S32 }+ }+}++// Reliable+{+ GroupAccountTransactionsReply Low 358 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { GroupID LLUUID }+ }+ {+ MoneyData Single+ { RequestID LLUUID }+ { IntervalDays S32 }+ { CurrentInterval S32 }+ { StartDate Variable 1 } // string+ }+ {+ HistoryData Variable+ { Time Variable 1 } // string+ { User Variable 1 } // string+ { Type S32 }+ { Item Variable 1 } // string+ { Amount S32 }+ }+}++// GroupActiveProposalsRequest+// viewer -> simulator -> dataserver+//reliable+{+ GroupActiveProposalsRequest Low 359 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ }+ {+ TransactionData Single+ { TransactionID LLUUID }+ }+}++// GroupActiveProposalItemReply+// dataserver -> simulator -> viewer+// reliable+{+ GroupActiveProposalItemReply Low 360 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { GroupID LLUUID }+ }+ {+ TransactionData Single+ { TransactionID LLUUID }+ { TotalNumItems U32 }+ }+ {+ ProposalData Variable+ { VoteID LLUUID }+ { VoteInitiator LLUUID }+ { TerseDateID Variable 1 } // string+ { StartDateTime Variable 1 } // string+ { EndDateTime Variable 1 } // string+ { AlreadyVoted BOOL }+ { VoteCast Variable 1 } // string+ { Majority F32 }+ { Quorum S32 }+ { ProposalText Variable 1 } // string+ }+}++// GroupVoteHistoryRequest+// viewer -> simulator -> dataserver+//reliable+{+ GroupVoteHistoryRequest Low 361 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ }+ {+ TransactionData Single+ { TransactionID LLUUID }+ }+}++// GroupVoteHistoryItemReply+// dataserver -> simulator -> viewer+// reliable+{+ GroupVoteHistoryItemReply Low 362 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { GroupID LLUUID }+ }+ {+ TransactionData Single+ { TransactionID LLUUID }+ { TotalNumItems U32 }+ }+ {+ HistoryItemData Single+ { VoteID LLUUID }+ { TerseDateID Variable 1 } // string+ { StartDateTime Variable 1 } // string+ { EndDateTime Variable 1 } // string+ { VoteInitiator LLUUID }+ { VoteType Variable 1 } // string+ { VoteResult Variable 1 } // string+ { Majority F32 }+ { Quorum S32 }+ { ProposalText Variable 2 } // string+ }+ {+ VoteItem Variable+ { CandidateID LLUUID }+ { VoteCast Variable 1 } // string+ { NumVotes S32 }+ }+}++// StartGroupProposal+// viewer -> simulator -> dataserver+// reliable+{+ StartGroupProposal Low 363 NotTrusted Zerocoded UDPDeprecated+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ProposalData Single+ { GroupID LLUUID }+ { Quorum S32 }+ { Majority F32 } // F32+ { Duration S32 } // S32, seconds+ { ProposalText Variable 1 } // string+ }+}++// GroupProposalBallot+// viewer -> simulator -> dataserver+// reliable+{+ GroupProposalBallot Low 364 NotTrusted Unencoded UDPDeprecated+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ProposalData Single+ { ProposalID LLUUID }+ { GroupID LLUUID }+ { VoteCast Variable 1 } // string+ }+}++// TallyVotes userserver -> dataserver+// reliable+{+ TallyVotes Low 365 Trusted Unencoded+}++++// GroupMembersRequest+// get the group members+// simulator -> dataserver+// reliable+{+ GroupMembersRequest Low 366 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ { RequestID LLUUID }+ }+}++// GroupMembersReply+// list of uuids for the group members+// dataserver -> simulator+// reliable+{+ GroupMembersReply Low 367 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ { RequestID LLUUID }+ { MemberCount S32 }+ }+ {+ MemberData Variable+ { AgentID LLUUID }+ { Contribution S32 }+ { OnlineStatus Variable 1 } // string+ { AgentPowers U64 }+ { Title Variable 1 } // string+ { IsOwner BOOL }+ }+}++// used to switch an agent's currently active group.+// viewer -> simulator -> dataserver -> AgentDataUpdate...+{+ ActivateGroup Low 368 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+}++// viewer -> simulator -> dataserver+{+ SetGroupContribution Low 369 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { GroupID LLUUID }+ { Contribution S32 }+ }+}++// viewer -> simulator -> dataserver+{+ SetGroupAcceptNotices Low 370 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Data Single+ { GroupID LLUUID }+ { AcceptNotices BOOL }+ }+ {+ NewData Single+ { ListInProfile BOOL }+ }+}++// GroupRoleDataRequest+// viewer -> simulator -> dataserver+{+ GroupRoleDataRequest Low 371 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ { RequestID LLUUID }+ }+}+++// GroupRoleDataReply+// All role data for this group+// dataserver -> simulator -> agent+{+ GroupRoleDataReply Low 372 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ { RequestID LLUUID }+ { RoleCount S32 }+ }+ {+ RoleData Variable+ { RoleID LLUUID }+ { Name Variable 1 }+ { Title Variable 1 }+ { Description Variable 1 }+ { Powers U64 }+ { Members U32 }+ }+}++// GroupRoleMembersRequest+// viewer -> simulator -> dataserver+{+ GroupRoleMembersRequest Low 373 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ GroupData Single+ { GroupID LLUUID }+ { RequestID LLUUID }+ }+}++// GroupRoleMembersReply+// All role::member pairs for this group.+// dataserver -> simulator -> agent+{+ GroupRoleMembersReply Low 374 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { GroupID LLUUID }+ { RequestID LLUUID }+ { TotalPairs U32 }+ }+ {+ MemberData Variable+ { RoleID LLUUID }+ { MemberID LLUUID }+ }+}++// GroupTitlesRequest+// viewer -> simulator -> dataserver+{+ GroupTitlesRequest Low 375 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ { RequestID LLUUID }+ }+}+++// GroupTitlesReply+// dataserver -> simulator -> viewer+{+ GroupTitlesReply Low 376 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { GroupID LLUUID }+ { RequestID LLUUID }+ }+ {+ GroupData Variable+ { Title Variable 1 } // string+ { RoleID LLUUID }+ { Selected BOOL }+ }+}++// GroupTitleUpdate+// viewer -> simulator -> dataserver+{+ GroupTitleUpdate Low 377 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ { TitleRoleID LLUUID }+ }+}++// GroupRoleUpdate+// viewer -> simulator -> dataserver+{+ GroupRoleUpdate Low 378 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { GroupID LLUUID }+ }+ {+ RoleData Variable+ { RoleID LLUUID }+ { Name Variable 1 }+ { Description Variable 1 }+ { Title Variable 1 }+ { Powers U64 }+ { UpdateType U8 }+ }+}+ +++// Request the members of the live help group needed for requesting agent.+// userserver -> dataserver+{+ LiveHelpGroupRequest Low 379 Trusted Unencoded+ {+ RequestData Single+ { RequestID LLUUID }+ { AgentID LLUUID }+ }+}++// Send down the group+// dataserver -> userserver+{+ LiveHelpGroupReply Low 380 Trusted Unencoded+ {+ ReplyData Single+ { RequestID LLUUID }+ { GroupID LLUUID }+ { Selection Variable 1 } // selection criteria all or active+ }+}++//-----------------------------------------------------------------------------+// Wearable messages+//-----------------------------------------------------------------------------++// AgentWearablesRequest+// (a.k.a. "Tell me what the avatar is wearing.")+// viewer -> simulator -> dataserver+// reliable+{+ AgentWearablesRequest Low 381 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}++// AgentWearablesUpdate+// (a.k.a. "Here's what your avatar should be wearing now.")+// dataserver -> userserver -> viewer+// reliable+// NEVER from viewer to sim+{+ AgentWearablesUpdate Low 382 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { SerialNum U32 } // U32, Increases every time the wearables change for a given agent. Used to avoid processing out of order packets.+ }+ {+ WearableData Variable+ { ItemID LLUUID }+ { AssetID LLUUID }+ { WearableType U8 } // U8, LLWearable::EWearType+ }+}++//+// AgentIsNowWearing+// (a.k.a. "Here's what I'm wearing now.")+// viewer->sim->dataserver+// reliable+{+ AgentIsNowWearing Low 383 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ WearableData Variable+ { ItemID LLUUID }+ { WearableType U8 }+ }+}+ ++// AgentCachedTexture+// viewer queries for cached textures on dataserver (via simulator)+// viewer -> simulator -> dataserver+// reliable+{+ AgentCachedTexture Low 384 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { SerialNum S32 }+ }+ {+ WearableData Variable+ { ID LLUUID }+ { TextureIndex U8 }+ }+}++// AgentCachedTextureResponse+// response to viewer queries for cached textures on dataserver (via simulator)+// dataserver -> simulator -> viewer+// reliable+{+ AgentCachedTextureResponse Low 385 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { SerialNum S32 }+ }+ {+ WearableData Variable+ { TextureID LLUUID }+ { TextureIndex U8 }+ { HostName Variable 1 }+ }+}++// Request an AgentDataUpdate without changing any agent data.+{+ AgentDataUpdateRequest Low 386 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}++// AgentDataUpdate+// Updates a viewer or simulator's impression of agent-specific information.+// Used, for example, when an agent's group changes.+// dataserver -> simulator -> viewer+// reliable+{+ AgentDataUpdate Low 387 Trusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { FirstName Variable 1 } // string+ { LastName Variable 1 } // string+ { GroupTitle Variable 1 } // string+ { ActiveGroupID LLUUID } // active group+ { GroupPowers U64 }+ { GroupName Variable 1 } // string+ }+}+++// GroupDataUpdate+// This is a bunch of group data that needs to be appropriatly routed based on presence info.+// dataserver -> simulator+{+ GroupDataUpdate Low 388 Trusted Zerocoded+ {+ AgentGroupData Variable+ { AgentID LLUUID }+ { GroupID LLUUID }+ { AgentPowers U64 }+ { GroupTitle Variable 1 }+ }+}++// AgentGroupDataUpdate+// Updates a viewer or simulator's impression of the groups an agent is in. +// dataserver -> simulator -> viewer+// reliable+{+ AgentGroupDataUpdate Low 389 Trusted Zerocoded UDPDeprecated+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ GroupData Variable+ { GroupID LLUUID }+ { GroupPowers U64 } + { AcceptNotices BOOL }+ { GroupInsigniaID LLUUID }+ { Contribution S32 }+ { GroupName Variable 1 } // string+ }+}++// AgentDropGroup+// Updates the viewer / simulator that an agent is no longer part of a group+// dataserver -> simulator -> viewer+// dataserver -> userserver+// reliable+{+ AgentDropGroup Low 390 Trusted Zerocoded UDPDeprecated+ {+ AgentData Single+ { AgentID LLUUID }+ { GroupID LLUUID }+ }+}++// LogTextMessage+// Asks the dataserver to log the contents of this message in the+// chat and IM log table.+// Sent from userserver (IM logging) and simulator (chat logging).+{+ LogTextMessage Low 391 Trusted Zerocoded+ {+ DataBlock Variable+ { FromAgentId LLUUID }+ { ToAgentId LLUUID }+ { GlobalX F64 }+ { GlobalY F64 }+ { Time U32 } // utc seconds since epoch+ { Message Variable 2 } // string+ }+}++// ViewerEffect+// Viewer side effect that's sent from one viewer, and broadcast to other agents nearby+// viewer-->sim (single effect created by viewer)+// sim-->viewer (multiple effects that can be seen by viewer)+// the AgentData block used for authentication for viewer-->sim messages+{+ ViewerEffect Medium 17 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ Effect Variable+ { ID LLUUID } // unique UUID of the effect+ { AgentID LLUUID } // yes, pack AgentID again (note this block is variable)+ { Type U8 } // Type of the effect+ { Duration F32 } // F32 time (seconds)+ { Color Fixed 4 } // Color4U+ { TypeData Variable 1 } // Type specific data+ }+}+++// CreateTrustedCircuit+// Sent to establish a trust relationship between two components.+// Only sent in response to a DenyTrustedCircuit message.+{+ CreateTrustedCircuit Low 392 NotTrusted Unencoded+ {+ DataBlock Single+ { EndPointID LLUUID }+ { Digest Fixed 32 } // 32 hex digits == 1 MD5 Digest+ }+}++// DenyTrustedCircuit+// Sent :+// - in response to failed CreateTrustedCircuit+// - to force the remote end-point to try to establish a trusted circuit+// - the reception of a trusted message on a non-trusted circuit+// This allows us to re-auth a circuit if it gets closed due to timeouts or network failures.+{+ DenyTrustedCircuit Low 393 NotTrusted Unencoded+ {+ DataBlock Single+ { EndPointID LLUUID }+ }+}++// RequestTrustedCircuit+// If the destination does not trust the sender, a Deny is sent back.+{+ RequestTrustedCircuit Low 394 Trusted Unencoded+}+++{+ RezSingleAttachmentFromInv Low 395 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Single+ { ItemID LLUUID }+ { OwnerID LLUUID }+ { AttachmentPt U8 } // 0 for default+ { ItemFlags U32 }+ { GroupMask U32 }+ { EveryoneMask U32 }+ { NextOwnerMask U32 }+ { Name Variable 1 }+ { Description Variable 1 }+ }+}++{+ RezMultipleAttachmentsFromInv Low 396 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ } + {+ HeaderData Single+ { CompoundMsgID LLUUID } // All messages a single "compound msg" must have the same id+ { TotalObjects U8 }+ { FirstDetachAll BOOL }+ }+ {+ ObjectData Variable // 1 to 4 of these per packet+ { ItemID LLUUID }+ { OwnerID LLUUID }+ { AttachmentPt U8 } // 0 for default+ { ItemFlags U32 }+ { GroupMask U32 }+ { EveryoneMask U32 }+ { NextOwnerMask U32 }+ { Name Variable 1 }+ { Description Variable 1 }+ }+}+++{+ DetachAttachmentIntoInv Low 397 NotTrusted Unencoded+ {+ ObjectData Single+ { AgentID LLUUID }+ { ItemID LLUUID }+ }+}+++// Viewer -> Sim+// Used in "Make New Outfit"+{+ CreateNewOutfitAttachments Low 398 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ HeaderData Single+ { NewFolderID LLUUID }+ }+ {+ ObjectData Variable+ { OldItemID LLUUID }+ { OldFolderID LLUUID }+ }+}++//-----------------------------------------------------------------------------+// Personal information messages+//-----------------------------------------------------------------------------++{+ UserInfoRequest Low 399 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+}++{+ UserInfoReply Low 400 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ UserData Single+ { IMViaEMail BOOL }+ { DirectoryVisibility Variable 1 }+ { EMail Variable 2 }+ }+}++{+ UpdateUserInfo Low 401 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ UserData Single+ { IMViaEMail BOOL }+ { DirectoryVisibility Variable 1 }+ }+}+++//-----------------------------------------------------------------------------+// System operations and maintenance+//-----------------------------------------------------------------------------+++// spaceserver -> sim+// tell a particular simulator to rename a parcel+{+ ParcelRename Low 402 Trusted Unencoded+ {+ ParcelData Variable+ { ParcelID LLUUID }+ { NewName Variable 1 } // string+ }+}+++// sim -> viewer+// initiate upload. primarily used for uploading raw files.+{+ InitiateDownload Low 403 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ }+ {+ FileData Single+ { SimFilename Variable 1 } // string+ { ViewerFilename Variable 1 } // string+ }+}++// Generalized system message. Each Requst has its own protocol for+// the StringData block format and contents.+{+ SystemMessage Low 404 Trusted Zerocoded+ {+ MethodData Single+ { Method Variable 1 }+ { Invoice LLUUID }+ { Digest Fixed 32 } // 32 hex digits == 1 MD5 Digest+ }+ {+ ParamList Variable+ { Parameter Variable 1 }+ }+}+++//-----------------------------------------------------------------------------+// map messages+//-----------------------------------------------------------------------------++// viewer -> sim+// reliable+// This message is sent up from the viewer to (eventually) get a list+// of all map layers and NULL-layer sims.+// Returns: MapLayerReply and MapBlockReply+{+ MapLayerRequest Low 405 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Flags U32 }+ { EstateID U32 } // filled in on sim+ { Godlike BOOL } // filled in on sim+ }+}++// sim -> viewer+{+ MapLayerReply Low 406 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { Flags U32 }+ }+ {+ LayerData Variable+ { Left U32 }+ { Right U32 }+ { Top U32 }+ { Bottom U32 }+ { ImageID LLUUID }+ }+}++// viewer -> sim+// This message is sent up from the viewer to get a list+// of the sims in a specified region.+// Returns: MapBlockReply+{+ MapBlockRequest Low 407 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Flags U32 }+ { EstateID U32 } // filled in on sim+ { Godlike BOOL } // filled in on sim+ }+ {+ PositionData Single+ { MinX U16 } // in region-widths+ { MaxX U16 } // in region-widths+ { MinY U16 } // in region-widths+ { MaxY U16 } // in region-widths+ }+}++// viewer -> sim+// This message is sent up from the viewer to get a list+// of the sims with a given name.+// Returns: MapBlockReply+{+ MapNameRequest Low 408 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Flags U32 }+ { EstateID U32 } // filled in on sim+ { Godlike BOOL } // filled in on sim+ }+ {+ NameData Single+ { Name Variable 1 } // string+ }+}++// sim -> viewer+{+ MapBlockReply Low 409 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { Flags U32 }+ }+ { + Data Variable+ { X U16 } // in region-widths+ { Y U16 } // in region-widths+ { Name Variable 1 } // string+ { Access U8 } // PG, mature, etc.+ { RegionFlags U32 }+ { WaterHeight U8 } // meters+ { Agents U8 }+ { MapImageID LLUUID }+ }+}++// viewer -> sim+// This message is sent up from the viewer to get a list+// of the items of a particular type on the map.+// Used for Telehubs, Agents, Events, Popular Places, etc.+// Returns: MapBlockReply+{+ MapItemRequest Low 410 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { Flags U32 }+ { EstateID U32 } // filled in on sim+ { Godlike BOOL } // filled in on sim+ }+ {+ RequestData Single+ { ItemType U32 }+ { RegionHandle U64 } // filled in on sim+ }+}++// sim -> viewer+{+ MapItemReply Low 411 Trusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { Flags U32 }+ }+ {+ RequestData Single+ { ItemType U32 }+ }+ { + Data Variable+ { X U32 } // global position+ { Y U32 } // global position+ { ID LLUUID } // identifier id+ { Extra S32 } // extra information+ { Extra2 S32 } // extra information+ { Name Variable 1 } // identifier string+ }+}++//-----------------------------------------------------------------------------+// Postcard messages+//-----------------------------------------------------------------------------+// reliable+{+ SendPostcard Low 412 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ { AssetID LLUUID }+ { PosGlobal LLVector3d } // Where snapshot was taken+ { To Variable 1 } // dest email address(es)+ { From Variable 1 } // src email address(es)+ { Name Variable 1 } // src name+ { Subject Variable 1 } // mail subject+ { Msg Variable 2 } // message text+ { AllowPublish BOOL } // Allow publishing on the web.+ { MaturePublish BOOL } // profile is "mature"+ }+}++// RPC messages+// Script on simulator requests rpc channel from rpcserver+// simulator -> dataserver -> MySQL+{+ RpcChannelRequest Low 413 Trusted Unencoded+ {+ DataBlock Single+ { GridX U32 }+ { GridY U32 }+ { TaskID LLUUID }+ { ItemID LLUUID }+ }+}++// RpcServer allocated a session for the script+// ChannelID will be the NULL UUID if unable to register+// dataserver -> simulator+{+ RpcChannelReply Low 414 Trusted Unencoded+ {+ DataBlock Single+ { TaskID LLUUID }+ { ItemID LLUUID }+ { ChannelID LLUUID }+ }+}++// Inbound RPC requests follow this path:+// RpcScriptRequestInbound: rpcserver -> spaceserver+// RpcScriptRequestInboundForward: spaceserver -> simulator+// reply: simulator -> rpcserver+{+ RpcScriptRequestInbound Low 415 NotTrusted Unencoded+ {+ TargetBlock Single+ { GridX U32 }+ { GridY U32 }+ }+ {+ DataBlock Single+ { TaskID LLUUID }+ { ItemID LLUUID }+ { ChannelID LLUUID }+ { IntValue U32 }+ { StringValue Variable 2 } // string+ }+}++// spaceserver -> simulator+{+ RpcScriptRequestInboundForward Low 416 Trusted Unencoded UDPDeprecated+ {+ DataBlock Single+ { RPCServerIP IPADDR }+ { RPCServerPort IPPORT }+ { TaskID LLUUID }+ { ItemID LLUUID }+ { ChannelID LLUUID }+ { IntValue U32 }+ { StringValue Variable 2 } // string+ } +}++// simulator -> rpcserver+// Not trusted because trust establishment doesn't work here.+{+ RpcScriptReplyInbound Low 417 NotTrusted Unencoded+ {+ DataBlock Single+ { TaskID LLUUID }+ { ItemID LLUUID }+ { ChannelID LLUUID }+ { IntValue U32 }+ { StringValue Variable 2 } // string+ }+}+++// ScriptMailRegistration+// Simulator -> dataserver+{+ ScriptMailRegistration Low 418 Trusted Unencoded+ {+ DataBlock Single+ { TargetIP Variable 1 } // String IP+ { TargetPort IPPORT }+ { TaskID LLUUID }+ { Flags U32 }+ }+}++// ParcelMediaCommandMessage+// Sends a parcel media command+{+ ParcelMediaCommandMessage Low 419 Trusted Unencoded+ {+ CommandBlock Single+ { Flags U32 }+ { Command U32 }+ { Time F32 }+ }+}++// ParcelMediaUpdate+// Sends a parcel media update to a single user+// For global updates use the parcel manager.+{+ ParcelMediaUpdate Low 420 Trusted Unencoded+ {+ DataBlock Single+ { MediaURL Variable 1 } // string+ { MediaID LLUUID }+ { MediaAutoScale U8 }+ }+ {+ DataBlockExtended Single+ { MediaType Variable 1 }+ { MediaDesc Variable 1 }+ { MediaWidth S32 }+ { MediaHeight S32 }+ { MediaLoop U8 }+ }+}++// LandStatRequest+// Sent by the viewer to request collider/script information for a parcel+{+ LandStatRequest Low 421 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ RequestData Single+ { ReportType U32 }+ { RequestFlags U32 }+ { Filter Variable 1 }+ { ParcelLocalID S32 }+ }+}++// LandStatReply+// Sent by the simulator in response to LandStatRequest+{+ LandStatReply Low 422 Trusted Unencoded UDPDeprecated+ {+ RequestData Single+ { ReportType U32 }+ { RequestFlags U32 }+ { TotalObjectCount U32 }+ }+ { + ReportData Variable+ { TaskLocalID U32 }+ { TaskID LLUUID }+ { LocationX F32 }+ { LocationY F32 }+ { LocationZ F32 }+ { Score F32 }+ { TaskName Variable 1 }+ { OwnerName Variable 1 }+ }+}++// Generic Error -- this is used for sending an error message+// to a UDP recipient. The lowest common denominator is to at least+// log the message. More sophisticated receivers can do something+// smarter, for example, a money transaction failure can put up a +// more user visible UI widget.+{+ Error Low 423 NotTrusted Zerocoded+ {+ AgentData Single+ { AgentID LLUUID } // will forward to agentid if coming from trusted circuit+ }+ {+ Data Single+ { Code S32 } // matches http status codes+ { Token Variable 1 } // some specific short string based message+ { ID LLUUID } // the transactionid/uniqueid/sessionid whatever.+ { System Variable 1 } // The hierarchical path to the system, eg, "message/handler"+ { Message Variable 2 } // Human readable message+ { Data Variable 2 } // Binary serialized LLSD for extra info.+ }+}++// ObjectIncludeInSearch+// viewer -> simulator+{+ ObjectIncludeInSearch Low 424 NotTrusted Unencoded+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ ObjectData Variable+ { ObjectLocalID U32 }+ { IncludeInSearch BOOL }+ }+}+++// This message is sent from viewer -> simulator when the viewer wants+// to rez an object out of inventory back to its position before it+// last moved into the inventory+{+ RezRestoreToWorld Low 425 NotTrusted Unencoded UDPDeprecated+ {+ AgentData Single+ { AgentID LLUUID }+ { SessionID LLUUID }+ }+ {+ InventoryData Single+ { ItemID LLUUID }+ { FolderID LLUUID }+ { CreatorID LLUUID } // permissions+ { OwnerID LLUUID } // permissions+ { GroupID LLUUID } // permissions+ { BaseMask U32 } // permissions+ { OwnerMask U32 } // permissions+ { GroupMask U32 } // permissions+ { EveryoneMask U32 } // permissions+ { NextOwnerMask U32 } // permissions+ { GroupOwned BOOL } // permissions+ { TransactionID LLUUID }+ { Type S8 }+ { InvType S8 }+ { Flags U32 }+ { SaleType U8 }+ { SalePrice S32 }+ { Name Variable 1 }+ { Description Variable 1 }+ { CreationDate S32 }+ { CRC U32 }+ }+}
+ src/Network/Metaverse/Packets.hs view
@@ -0,0 +1,112 @@+module Network.Metaverse.Packets where++import Control.Monad++import Data.Word+import Data.Bits++import Data.Binary+import Data.Binary.Put+import Data.Binary.Get++import Network.Metaverse.PacketTypes+import Network.Metaverse.Utils++import qualified Data.ByteString as B+import qualified Data.ByteString.Lazy as L++type SequenceNum = Word32++data Packet = Packet {+ packetZerocoded :: Bool,+ packetReliable :: Bool,+ packetRetransmit :: Bool,+ packetSequence :: SequenceNum,+ packetExtra :: B.ByteString,+ packetBody :: PacketBody,+ packetAcks :: [SequenceNum]+ }+ deriving Show++serialize :: Packet -> B.ByteString+serialize (Packet zcode reliable retrans seq extra body acks) =+ let putter = do+ let mask i b = if b then bit i else 0+ let nacks = length acks+ let flags = mask 4 (nacks > 0)+ .|. mask 5 retrans+ .|. mask 6 reliable+ .|. mask 7 zcode+ putWord8 flags+ putWord32be seq+ putWord8 (fromIntegral (B.length extra))+ putByteString extra++ if zcode+ then putLazyByteString (zeroencode (encode body))+ else put body++ mapM_ putWord32be acks+ when (nacks > 0) (putWord8 (fromIntegral nacks))++ in B.concat $ L.toChunks $ runPut putter++deserialize :: B.ByteString -> Packet+deserialize fullMsg = + -- Unfortunately, the encoding of the packets makes it impossible to+ -- just use Data.Binary. We need to preprocess the header using+ -- something that lets us read from both sides.++ let -- First, read the flags from the first byte of the header.+ flags = B.head fullMsg+ hasAcks = testBit flags 4+ retrans = testBit flags 5+ reliable = testBit flags 6+ zcode = testBit flags 7++ -- Next, if there are appended acks, peel them off and read them.+ (withoutAcks, acks) = if hasAcks+ then let msg1 = B.init fullMsg+ nacks = B.last fullMsg+ (result, appended) = B.splitAt (B.length msg1 - 4 * fromIntegral nacks) msg1+ ackGetter = replicateM (fromIntegral nacks) getWord32be+ acks = runGet ackGetter (L.fromChunks [ appended ])+ in (result, acks)+ else (fullMsg, [])++ -- Now take off the header, so we're left with only the body (which+ -- may or may not be zerocoded.+ headerGetter = do _ <- getWord8 -- Header flags (already seen)+ seq <- getWord32be+ extralen <- getWord8+ extra <- getBytes (fromIntegral extralen)+ body <- getRemainingLazyByteString+ return (seq, extra, body)+ (seq, extra, encodedBody) = runGet headerGetter (L.fromChunks [ withoutAcks ])++ -- Un-zerocode the body if needed. Zerocoding is indicated by a flag+ -- in the message headers.+ decodedBody = if zcode then zerodecode encodedBody else encodedBody++ -- Parse the body into a PacketBody. The "decode" here means something+ -- different, hence the funny-sounding code.+ body = decode (decodedBody)++ in Packet zcode reliable retrans seq extra body acks++zerodecode :: L.ByteString -> L.ByteString+zerodecode r | L.length r <= 1 = r+ | x == 0 = let Just (n, r') = L.uncons xs+ in L.append (L.replicate (fromIntegral n) 0) (zerodecode r')+ | otherwise = L.cons x (zerodecode xs)+ where Just (x, xs) = L.uncons r++zeroencode :: L.ByteString -> L.ByteString+zeroencode r | L.null r = r+ | L.null pfx = L.cons x (zeroencode xs)+ | otherwise = L.append (zeros (L.length pfx)) (zeroencode rest)+ where (pfx, rest) = L.span (== 0) r+ Just (x, xs) = L.uncons r+ zeros n | n > 255 = L.append (L.pack [0, 255]) (zeros (n - 255))+ | n > 0 = L.pack [0, fromIntegral n]+ | otherwise = L.empty
+ src/Network/Metaverse/Utils.hs view
@@ -0,0 +1,103 @@+{-# LANGUAGE ScopedTypeVariables #-}++module Network.Metaverse.Utils where++import Control.Concurrent+import Control.Monad++import Control.Event.Relative++import Data.Word+import Data.Char+import Data.List++import qualified Data.Map as M++import System.Random++------------------------------------------------------------------------++{-+ Random utilities useful for purpose or another.+-}++lookupIndex :: Eq a => a -> [(a,b)] -> Maybe Int+lookupIndex a xs = go 0 a xs+ where go n a [] = Nothing+ go n a ((x,y):zs) | a == x = Just n+ | otherwise = go (n+1) a zs++dropAt _ [] = []+dropAt 0 (x:xs) = xs+dropAt n (x:xs) = x : dropAt (n-1) xs++toHexString :: [Word8] -> String+toHexString = concatMap toHex+ where toHex n = [ hexDigit (n `div` 16), hexDigit (n `mod` 16) ]+ hexDigit d | d < 10 = chr (ord '0' + fromIntegral d)+ | otherwise = chr (ord 'a' + fromIntegral d - 10)++------------------------------------------------------------------------++{-+ UUID Stuff. UUIDs are used throughout SL, so this code provides a+ simple way to interact with them.+-}++newtype UUID = UUID [Word8] deriving (Eq, Ord)++randomUUID :: IO UUID+randomUUID = fmap UUID $ replicateM 16 $ fmap fromIntegral+ $ randomRIO (0 :: Int, 255 :: Int)++zeroUUID :: UUID+zeroUUID = UUID (replicate 16 0)++instance Show UUID where+ show (UUID xs) = let (a,xs1) = splitAt 4 xs+ (b,xs2) = splitAt 2 xs1+ (c,xs3) = splitAt 2 xs2+ (d,e ) = splitAt 2 xs3+ in intercalate "-" $ map toHexString [a,b,c,d,e]++instance Read UUID where+ readsPrec _ s = let (p,r) = splitAt 36 s+ in [ (UUID $ toBytes $ filter (/= '-') p, r) ]+ where toBytes [] = []+ toBytes (a:b:ss) = (16 * digit a + digit b) : toBytes ss+ digit '0' = 0 ; digit '1' = 1+ digit '2' = 2 ; digit '3' = 3+ digit '4' = 4 ; digit '5' = 5+ digit '6' = 6 ; digit '7' = 7+ digit '8' = 8 ; digit '9' = 9+ digit 'a' = 10 ; digit 'b' = 11+ digit 'c' = 12 ; digit 'd' = 13+ digit 'e' = 14 ; digit 'f' = 15++------------------------------------------------------------------------++{-+ A wrapper for Control.Event.Relative, except that instead of returning+ an EventId when scheduling an event, the user supplies the event+ identifier as an ordered type of their own choosing.+-}+data TaskQueue k = TaskQueue {+ taskVar :: MVar (M.Map k EventId)+ }++newTaskQueue :: Ord k => IO (TaskQueue k)+newTaskQueue = fmap TaskQueue (newMVar M.empty)++schedule :: Ord k => TaskQueue k -> k -> Int -> IO () -> IO ()+schedule (TaskQueue v) k t a = do+ id <- addEvent t $ modifyMVar_ v (return . M.delete k) >> a+ modifyMVar_ v (return . M.insert k id)++cancel :: Ord k => TaskQueue k -> k -> IO Bool+cancel (TaskQueue v) k = do+ m <- takeMVar v+ case M.lookup k m of Nothing -> putMVar v m >> return False+ Just id -> putMVar v (M.delete k m) >> delEvent id >> return True++------------------------------------------------------------------------+